From e60734f3e71b052d51181fdaede72e10864f544a Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Thu, 12 Feb 2026 20:04:38 +0000 Subject: [PATCH 01/20] ci: add migration integrity gate for migration-relevant changes --- .github/workflows/ci.yml | 30 ++++++++++++++++++++++++++++++ Makefile | 22 ++++++++++++++++++++++ docs/03-development.md | 22 +++++++++++++++++++++- 3 files changed, 73 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f17053e0..4dcf4890 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,6 +62,36 @@ jobs: nextjs-${{ runner.os }}-node-${{ steps.setup-node.outputs.node-version }}- + + - name: Run migration integrity gate + run: | + set -euo pipefail + + if [ "${{ github.event_name }}" = "pull_request" ]; then + BASE_SHA="${{ github.event.pull_request.base.sha }}" + HEAD_SHA="${{ github.sha }}" + git fetch --no-tags --depth=1 origin "$BASE_SHA" + else + BASE_SHA="${{ github.event.before }}" + HEAD_SHA="${{ github.sha }}" + fi + + CHANGED_FILES=$(git diff --name-only "$BASE_SHA" "$HEAD_SHA") + echo "Changed files:" + echo "$CHANGED_FILES" + + if ! echo "$CHANGED_FILES" | grep -Eq '^backend/(app/models|db|migrations|alembic\.ini)'; then + echo "No migration-relevant backend changes detected; skipping migration gate." + exit 0 + fi + + if echo "$CHANGED_FILES" | grep -Eq '^backend/app/models/' && ! echo "$CHANGED_FILES" | grep -Eq '^backend/migrations/versions/'; then + echo "Model changes detected without a migration under backend/migrations/versions/." + exit 1 + fi + + make backend-migration-check + - name: Run backend checks env: # Keep CI builds deterministic. diff --git a/Makefile b/Makefile index b64228ff..4ecffdc3 100644 --- a/Makefile +++ b/Makefile @@ -104,6 +104,28 @@ frontend-test: frontend-tooling ## Frontend tests (vitest) backend-migrate: ## Apply backend DB migrations (uses backend/migrations) cd $(BACKEND_DIR) && uv run alembic upgrade head +.PHONY: backend-migration-check +backend-migration-check: ## Validate Alembic migrations on clean Postgres (upgrade head + single-head sanity) + @set -euo pipefail; \ + CONTAINER_NAME="mc-migration-check-$$RANDOM"; \ + docker run -d --rm --name $$CONTAINER_NAME -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=migration_ci -p 55432:5432 postgres:16 >/dev/null; \ + cleanup() { docker rm -f $$CONTAINER_NAME >/dev/null 2>&1 || true; }; \ + trap cleanup EXIT; \ + for i in $$(seq 1 30); do \ + if docker exec $$CONTAINER_NAME pg_isready -U postgres -d migration_ci >/dev/null 2>&1; then break; fi; \ + sleep 1; \ + if [ $$i -eq 30 ]; then echo "Postgres did not become ready"; exit 1; fi; \ + done; \ + cd $(BACKEND_DIR) && \ + AUTH_MODE=local \ + LOCAL_AUTH_TOKEN=ci-local-token-ci-local-token-ci-local-token-ci-local-token \ + DATABASE_URL=postgresql+psycopg://postgres:postgres@localhost:55432/migration_ci \ + uv run alembic upgrade head && \ + AUTH_MODE=local \ + LOCAL_AUTH_TOKEN=ci-local-token-ci-local-token-ci-local-token-ci-local-token \ + DATABASE_URL=postgresql+psycopg://postgres:postgres@localhost:55432/migration_ci \ + uv run alembic heads | grep -q "(head)" + .PHONY: build build: frontend-build ## Build artifacts diff --git a/docs/03-development.md b/docs/03-development.md index 4949c0c3..b3e1417c 100644 --- a/docs/03-development.md +++ b/docs/03-development.md @@ -1,3 +1,23 @@ # Development workflow -Placeholder: see root `README.md` for current setup steps. +## Migration integrity gate (CI) + +CI enforces a migration integrity gate to prevent merge-time schema breakages. + +### What it validates + +- Alembic migrations can apply from a clean Postgres database (`upgrade head`) +- Alembic revision graph resolves to a head revision after migration apply +- On migration-relevant PRs, CI also checks that model changes are accompanied by migration updates + +If any of these checks fails, CI fails and the PR is blocked. + +### Local reproduction + +From repo root: + +```bash +make backend-migration-check +``` + +This command starts a temporary Postgres container, runs migration checks, and cleans up the container. From 426326e2af2580b008ea9ab075fd3740ebae8167 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Fri, 13 Feb 2026 09:05:21 +0000 Subject: [PATCH 02/20] ci(migrations): enforce graph + reversible cycle checks; fix FK downgrade naming --- Makefile | 9 ++- ...76359_sync_agent_gateway_linkage_schema.py | 4 +- backend/scripts/check_migration_graph.py | 77 +++++++++++++++++++ 3 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 backend/scripts/check_migration_graph.py diff --git a/Makefile b/Makefile index 4ecffdc3..b126da29 100644 --- a/Makefile +++ b/Makefile @@ -105,8 +105,9 @@ backend-migrate: ## Apply backend DB migrations (uses backend/migrations) cd $(BACKEND_DIR) && uv run alembic upgrade head .PHONY: backend-migration-check -backend-migration-check: ## Validate Alembic migrations on clean Postgres (upgrade head + single-head sanity) +backend-migration-check: ## Validate migration graph + reversible path on clean Postgres @set -euo pipefail; \ + (cd $(BACKEND_DIR) && uv run python scripts/check_migration_graph.py); \ CONTAINER_NAME="mc-migration-check-$$RANDOM"; \ docker run -d --rm --name $$CONTAINER_NAME -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=migration_ci -p 55432:5432 postgres:16 >/dev/null; \ cleanup() { docker rm -f $$CONTAINER_NAME >/dev/null 2>&1 || true; }; \ @@ -124,7 +125,11 @@ backend-migration-check: ## Validate Alembic migrations on clean Postgres (upgra AUTH_MODE=local \ LOCAL_AUTH_TOKEN=ci-local-token-ci-local-token-ci-local-token-ci-local-token \ DATABASE_URL=postgresql+psycopg://postgres:postgres@localhost:55432/migration_ci \ - uv run alembic heads | grep -q "(head)" + uv run alembic downgrade base && \ + AUTH_MODE=local \ + LOCAL_AUTH_TOKEN=ci-local-token-ci-local-token-ci-local-token-ci-local-token \ + DATABASE_URL=postgresql+psycopg://postgres:postgres@localhost:55432/migration_ci \ + uv run alembic upgrade head .PHONY: build build: frontend-build ## Build artifacts diff --git a/backend/migrations/versions/b308f2876359_sync_agent_gateway_linkage_schema.py b/backend/migrations/versions/b308f2876359_sync_agent_gateway_linkage_schema.py index 3863b4d8..3d1a07a4 100644 --- a/backend/migrations/versions/b308f2876359_sync_agent_gateway_linkage_schema.py +++ b/backend/migrations/versions/b308f2876359_sync_agent_gateway_linkage_schema.py @@ -22,7 +22,7 @@ def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### op.add_column('agents', sa.Column('gateway_id', sa.Uuid(), nullable=False)) op.create_index(op.f('ix_agents_gateway_id'), 'agents', ['gateway_id'], unique=False) - op.create_foreign_key(None, 'agents', 'gateways', ['gateway_id'], ['id']) + op.create_foreign_key('fk_agents_gateway_id_gateways', 'agents', 'gateways', ['gateway_id'], ['id']) op.drop_column('gateways', 'main_session_key') # ### end Alembic commands ### @@ -30,7 +30,7 @@ def upgrade() -> None: def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### op.add_column('gateways', sa.Column('main_session_key', sa.VARCHAR(), autoincrement=False, nullable=False)) - op.drop_constraint(None, 'agents', type_='foreignkey') + op.drop_constraint('fk_agents_gateway_id_gateways', 'agents', type_='foreignkey') op.drop_index(op.f('ix_agents_gateway_id'), table_name='agents') op.drop_column('agents', 'gateway_id') # ### end Alembic commands ### diff --git a/backend/scripts/check_migration_graph.py b/backend/scripts/check_migration_graph.py new file mode 100644 index 00000000..444583f3 --- /dev/null +++ b/backend/scripts/check_migration_graph.py @@ -0,0 +1,77 @@ +"""Migration graph integrity checks for CI. + +Checks: +- alembic script graph can be loaded (detects broken/missing links) +- single head by default (unless ALLOW_MULTIPLE_HEADS=true) +- no orphan revisions (all revisions reachable from heads) +""" + +from __future__ import annotations + +import os +import sys +from pathlib import Path + +from alembic.config import Config +from alembic.script import ScriptDirectory + + +def _truthy(value: str | None) -> bool: + return (value or "").strip().lower() in {"1", "true", "yes", "on"} + + +def main() -> int: + root = Path(__file__).resolve().parents[1] + alembic_ini = root / "alembic.ini" + cfg = Config(str(alembic_ini)) + cfg.attributes["configure_logger"] = False + + try: + script = ScriptDirectory.from_config(cfg) + except Exception as exc: # pragma: no cover - CI path + print(f"ERROR: unable to load Alembic script directory: {exc}") + return 1 + + try: + heads = list(script.get_heads()) + except Exception as exc: # pragma: no cover - CI path + print(f"ERROR: unable to resolve Alembic heads: {exc}") + return 1 + + allow_multiple_heads = _truthy(os.getenv("ALLOW_MULTIPLE_HEADS")) + if not heads: + print("ERROR: no Alembic heads found") + return 1 + + if len(heads) > 1 and not allow_multiple_heads: + print("ERROR: multiple Alembic heads detected (set ALLOW_MULTIPLE_HEADS=true only for intentional merge windows)") + for h in heads: + print(f" - {h}") + return 1 + + try: + reachable = {rev.revision for rev in script.walk_revisions(base="base", head="heads") if rev.revision} + except Exception as exc: # pragma: no cover - CI path + print(f"ERROR: failed while walking Alembic revision graph: {exc}") + return 1 + + all_revisions = { + rev.revision + for rev in script.revision_map._revision_map.values() # type: ignore[attr-defined] + if getattr(rev, "revision", None) + } + orphans = sorted(all_revisions - reachable) + if orphans: + print("ERROR: orphan Alembic revisions detected (not reachable from heads):") + for rev in orphans: + print(f" - {rev}") + return 1 + + print("OK: migration graph integrity passed") + print(f"Heads: {', '.join(heads)}") + print(f"Reachable revisions: {len(reachable)}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From bfd7d5b992653364d709a22f775b30f3793eb496 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Fri, 13 Feb 2026 15:18:56 +0530 Subject: [PATCH 03/20] feat: add status_requested field to task updates and implement related logic in task approval process --- backend/app/api/tasks.py | 9 +++- .../tests/test_tasks_done_approval_gate.py | 47 +++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/backend/app/api/tasks.py b/backend/app/api/tasks.py index bcb0aada..83f68d18 100644 --- a/backend/app/api/tasks.py +++ b/backend/app/api/tasks.py @@ -1054,12 +1054,16 @@ async def update_task( updates.pop("comment", None) updates.pop("depends_on_task_ids", None) updates.pop("tag_ids", None) + requested_status = payload.status if "status" in payload.model_fields_set else None update = _TaskUpdateInput( task=task, actor=actor, board_id=board_id, previous_status=previous_status, previous_assigned=previous_assigned, + status_requested=( + requested_status is not None and requested_status != previous_status + ), updates=updates, comment=comment, depends_on_task_ids=depends_on_task_ids, @@ -1299,6 +1303,7 @@ class _TaskUpdateInput: board_id: UUID previous_status: str previous_assigned: UUID | None + status_requested: bool updates: dict[str, object] comment: str | None depends_on_task_ids: list[UUID] | None @@ -1597,7 +1602,7 @@ async def _apply_lead_task_update( task_id=update.task.id, previous_status=update.previous_status, target_status=update.task.status, - status_requested="status" in update.updates, + status_requested=update.status_requested, ) await _require_review_before_done_when_enabled( session, @@ -1878,7 +1883,7 @@ async def _finalize_updated_task( task_id=update.task.id, previous_status=update.previous_status, target_status=update.task.status, - status_requested="status" in update.updates, + status_requested=update.status_requested, ) await _require_review_before_done_when_enabled( session, diff --git a/backend/tests/test_tasks_done_approval_gate.py b/backend/tests/test_tasks_done_approval_gate.py index a3d6deea..308ac97e 100644 --- a/backend/tests/test_tasks_done_approval_gate.py +++ b/backend/tests/test_tasks_done_approval_gate.py @@ -356,6 +356,53 @@ async def test_update_task_allows_status_change_with_pending_approval_when_toggl await engine.dispose() +@pytest.mark.asyncio +async def test_update_task_allows_dependency_change_with_pending_approval() -> None: + engine = await _make_engine() + try: + async with await _make_session(engine) as session: + board, task, _agent = await _seed_board_task_and_agent( + session, + task_status="review", + require_approval_for_done=False, + block_status_changes_with_pending_approval=True, + ) + dependency = Task( + id=uuid4(), + board_id=board.id, + title="Dependency", + status="inbox", + ) + session.add(dependency) + session.add( + Approval( + id=uuid4(), + board_id=board.id, + task_id=task.id, + action_type="task.execute", + confidence=70, + status="pending", + ), + ) + await session.commit() + + updated = await tasks_api.update_task( + payload=TaskUpdate( + status="review", + depends_on_task_ids=[dependency.id], + ), + task=task, + session=session, + actor=ActorContext(actor_type="user"), + ) + + assert updated.depends_on_task_ids == [dependency.id] + assert updated.status == "inbox" + assert updated.blocked_by_task_ids == [dependency.id] + finally: + await engine.dispose() + + @pytest.mark.asyncio async def test_update_task_rejects_status_change_for_pending_multi_task_link_when_toggle_enabled() -> ( None From c84d79e08484f31e38f957d28017f636593f2159 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Fri, 13 Feb 2026 09:49:42 +0000 Subject: [PATCH 04/20] fix(ci): remove unused import in migration graph checker --- backend/scripts/check_migration_graph.py | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/scripts/check_migration_graph.py b/backend/scripts/check_migration_graph.py index 444583f3..30dc9f67 100644 --- a/backend/scripts/check_migration_graph.py +++ b/backend/scripts/check_migration_graph.py @@ -9,7 +9,6 @@ Checks: from __future__ import annotations import os -import sys from pathlib import Path from alembic.config import Config From efa3587e770dfaa599ed1c6cf47e70759102f732 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Fri, 13 Feb 2026 15:35:21 +0530 Subject: [PATCH 05/20] feat: add DependencyBanner component and refactor dependency display logic in task view --- frontend/src/app/boards/[boardId]/page.tsx | 93 +++++++------------ .../components/molecules/DependencyBanner.tsx | 92 ++++++++++++++++++ 2 files changed, 128 insertions(+), 57 deletions(-) create mode 100644 frontend/src/components/molecules/DependencyBanner.tsx diff --git a/frontend/src/app/boards/[boardId]/page.tsx b/frontend/src/app/boards/[boardId]/page.tsx index 6449ea63..266ce164 100644 --- a/frontend/src/app/boards/[boardId]/page.tsx +++ b/frontend/src/app/boards/[boardId]/page.tsx @@ -24,6 +24,10 @@ import { Markdown } from "@/components/atoms/Markdown"; import { StatusDot } from "@/components/atoms/StatusDot"; import { DashboardSidebar } from "@/components/organisms/DashboardSidebar"; import { TaskBoard } from "@/components/organisms/TaskBoard"; +import { + DependencyBanner, + type DependencyBannerDependency, +} from "@/components/molecules/DependencyBanner"; import { DashboardShell } from "@/components/templates/DashboardShell"; import { BoardChatComposer } from "@/components/BoardChatComposer"; import { Button } from "@/components/ui/button"; @@ -2211,6 +2215,30 @@ export default function BoardDetailPage() { [loadComments], ); + const selectedTaskDependencies = useMemo(() => { + if (!selectedTask) return []; + const blockedDependencyIds = new Set(selectedTask.blocked_by_task_ids ?? []); + return (selectedTask.depends_on_task_ids ?? []).map((dependencyId) => { + const dependencyTask = taskById.get(dependencyId); + const statusLabel = dependencyTask?.status + ? dependencyTask.status.replace(/_/g, " ") + : "unknown"; + return { + id: dependencyId, + title: dependencyTask?.title ?? dependencyId, + statusLabel, + isBlocking: blockedDependencyIds.has(dependencyId), + isDone: dependencyTask?.status === "done", + disabled: !dependencyTask, + onClick: dependencyTask + ? () => { + openComments({ id: dependencyId }); + } + : undefined, + }; + }); + }, [openComments, selectedTask, taskById]); + useEffect(() => { if (!taskIdFromUrl) return; if (openedTaskIdFromUrlRef.current === taskIdFromUrl) return; @@ -3382,63 +3410,14 @@ export default function BoardDetailPage() {

Dependencies

- {selectedTask?.depends_on_task_ids?.length ? ( -
- {selectedTask.depends_on_task_ids.map((depId) => { - const depTask = taskById.get(depId); - const title = depTask?.title ?? depId; - const statusLabel = depTask?.status - ? depTask.status.replace(/_/g, " ") - : "unknown"; - const isDone = depTask?.status === "done"; - const isBlocking = ( - selectedTask.blocked_by_task_ids ?? [] - ).includes(depId); - return ( - - ); - })} -
- ) : ( -

No dependencies.

- )} - {selectedTask?.is_blocked ? ( -
- Blocked by incomplete dependencies. -
- ) : null} + + {selectedTask?.is_blocked + ? "Blocked by incomplete dependencies." + : null} +
diff --git a/frontend/src/components/molecules/DependencyBanner.tsx b/frontend/src/components/molecules/DependencyBanner.tsx new file mode 100644 index 00000000..aad178d2 --- /dev/null +++ b/frontend/src/components/molecules/DependencyBanner.tsx @@ -0,0 +1,92 @@ +import { type ReactNode } from "react"; + +import { cn } from "@/lib/utils"; + +export interface DependencyBannerDependency { + id: string; + title: string; + statusLabel: string; + isBlocking?: boolean; + isDone?: boolean; + onClick?: () => void; + disabled?: boolean; +} + +interface DependencyBannerProps { + variant?: DependencyBannerVariant; + dependencies?: DependencyBannerDependency[]; + children?: ReactNode; + className?: string; + emptyMessage?: string; +} + +const toneClassByVariant: Record = { + blocked: "border-rose-200 bg-rose-50 text-rose-700", + resolved: "border-blue-200 bg-blue-50 text-blue-700", +}; + +export function DependencyBanner({ + variant = "blocked", + dependencies = [], + children, + className, + emptyMessage = "No dependencies.", +}: DependencyBannerProps) { + return ( +
+ {dependencies.length > 0 ? ( + dependencies.map((dependency) => { + const isBlocking = dependency.isBlocking === true; + const isDone = dependency.isDone === true; + return ( + + ); + }) + ) : ( +

{emptyMessage}

+ )} + {children ? ( +
+ {children} +
+ ) : null} +
+ ); +} From 99da4681249a415c0a9d77e5b1bdaaeeb2f5cf54 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Fri, 13 Feb 2026 10:06:24 +0000 Subject: [PATCH 06/20] fix(ci): make migration graph checker mypy-clean --- backend/scripts/check_migration_graph.py | 25 ++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/backend/scripts/check_migration_graph.py b/backend/scripts/check_migration_graph.py index 30dc9f67..1d159c86 100644 --- a/backend/scripts/check_migration_graph.py +++ b/backend/scripts/check_migration_graph.py @@ -49,21 +49,30 @@ def main() -> int: return 1 try: - reachable = {rev.revision for rev in script.walk_revisions(base="base", head="heads") if rev.revision} + reachable: set[str] = set() + for walk_rev in script.walk_revisions(base="base", head="heads"): + if walk_rev is None: + continue + if walk_rev.revision: + reachable.add(walk_rev.revision) except Exception as exc: # pragma: no cover - CI path print(f"ERROR: failed while walking Alembic revision graph: {exc}") return 1 - all_revisions = { - rev.revision - for rev in script.revision_map._revision_map.values() # type: ignore[attr-defined] - if getattr(rev, "revision", None) - } + all_revisions: set[str] = set() + # Alembic's revision_map is dynamically typed; guard None values. + for map_rev in script.revision_map._revision_map.values(): + if map_rev is None: + continue + revision = getattr(map_rev, "revision", None) + if revision: + all_revisions.add(revision) + orphans = sorted(all_revisions - reachable) if orphans: print("ERROR: orphan Alembic revisions detected (not reachable from heads):") - for rev in orphans: - print(f" - {rev}") + for orphan_rev in orphans: + print(f" - {orphan_rev}") return 1 print("OK: migration graph integrity passed") From 92c079410e9493d55542ad428c359c8db81afde4 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Fri, 13 Feb 2026 15:57:27 +0530 Subject: [PATCH 07/20] feat: enhance DependencyBanner to support resolved dependencies and update display logic --- frontend/src/app/boards/[boardId]/page.tsx | 69 ++++++++++++++++--- .../components/molecules/DependencyBanner.tsx | 2 + 2 files changed, 62 insertions(+), 9 deletions(-) diff --git a/frontend/src/app/boards/[boardId]/page.tsx b/frontend/src/app/boards/[boardId]/page.tsx index 266ce164..ce07ba22 100644 --- a/frontend/src/app/boards/[boardId]/page.tsx +++ b/frontend/src/app/boards/[boardId]/page.tsx @@ -2239,6 +2239,28 @@ export default function BoardDetailPage() { }); }, [openComments, selectedTask, taskById]); + const selectedTaskResolvedDependencies = useMemo< + DependencyBannerDependency[] + >(() => { + if (!selectedTask) return []; + return tasks + .filter((task) => task.depends_on_task_ids?.includes(selectedTask.id)) + .map((task) => { + const statusLabel = task.status ? task.status.replace(/_/g, " ") : "unknown"; + return { + id: task.id, + title: task.title, + statusLabel, + isBlocking: false, + isDone: task.status === "done", + onClick: () => { + openComments({ id: task.id }); + }, + disabled: false, + }; + }); + }, [openComments, selectedTask, tasks]); + useEffect(() => { if (!taskIdFromUrl) return; if (openedTaskIdFromUrlRef.current === taskIdFromUrl) return; @@ -3410,15 +3432,44 @@ export default function BoardDetailPage() {

Dependencies

- - {selectedTask?.is_blocked - ? "Blocked by incomplete dependencies." - : null} - -
+ {(() => { + const hasDependencies = + (selectedTask?.depends_on_task_ids?.length ?? 0) > 0; + const hasResolvedDependencies = + selectedTaskResolvedDependencies.length > 0; + const isDependencyModeBlocked = hasDependencies + ? selectedTask?.is_blocked === true + : false; + const bannerVariant = + hasDependencies || hasResolvedDependencies + ? isDependencyModeBlocked + ? "blocked" + : "resolved" + : "blocked"; + const displayedDependencies = + hasDependencies && selectedTask + ? selectedTaskDependencies + : selectedTaskResolvedDependencies; + const childrenMessage = + hasDependencies && selectedTask?.is_blocked + ? "Blocked by incomplete dependencies." + : hasDependencies + ? "Dependencies resolved." + : hasResolvedDependencies + ? "This task resolves these tasks." + : null; + + return ( + + {childrenMessage} + + ); + })()} +

diff --git a/frontend/src/components/molecules/DependencyBanner.tsx b/frontend/src/components/molecules/DependencyBanner.tsx index aad178d2..01bbea38 100644 --- a/frontend/src/components/molecules/DependencyBanner.tsx +++ b/frontend/src/components/molecules/DependencyBanner.tsx @@ -20,6 +20,8 @@ interface DependencyBannerProps { emptyMessage?: string; } +type DependencyBannerVariant = "blocked" | "resolved"; + const toneClassByVariant: Record = { blocked: "border-rose-200 bg-rose-50 text-rose-700", resolved: "border-blue-200 bg-blue-50 text-blue-700", From 59bdf03d050faab30302f67aa768d9586387f4d9 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Fri, 13 Feb 2026 16:05:04 +0530 Subject: [PATCH 08/20] refactor: improve code formatting and readability in page.tsx --- frontend/src/app/boards/[boardId]/page.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/boards/[boardId]/page.tsx b/frontend/src/app/boards/[boardId]/page.tsx index ce07ba22..f47975c9 100644 --- a/frontend/src/app/boards/[boardId]/page.tsx +++ b/frontend/src/app/boards/[boardId]/page.tsx @@ -2217,7 +2217,9 @@ export default function BoardDetailPage() { const selectedTaskDependencies = useMemo(() => { if (!selectedTask) return []; - const blockedDependencyIds = new Set(selectedTask.blocked_by_task_ids ?? []); + const blockedDependencyIds = new Set( + selectedTask.blocked_by_task_ids ?? [], + ); return (selectedTask.depends_on_task_ids ?? []).map((dependencyId) => { const dependencyTask = taskById.get(dependencyId); const statusLabel = dependencyTask?.status @@ -2246,7 +2248,9 @@ export default function BoardDetailPage() { return tasks .filter((task) => task.depends_on_task_ids?.includes(selectedTask.id)) .map((task) => { - const statusLabel = task.status ? task.status.replace(/_/g, " ") : "unknown"; + const statusLabel = task.status + ? task.status.replace(/_/g, " ") + : "unknown"; return { id: task.id, title: task.title, @@ -3469,7 +3473,7 @@ export default function BoardDetailPage() { ); })()} -

+

From ebb9c659d291e4ec980915310dcc169fa5870965 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Fri, 13 Feb 2026 16:21:54 +0530 Subject: [PATCH 09/20] feat: add lead-only status change rule for boards and update related logic --- backend/app/api/tasks.py | 16 +++- backend/app/models/boards.py | 1 + backend/app/schemas/boards.py | 2 + ..._add_board_lead_only_status_change_rule.py | 43 ++++++++++ backend/templates/AGENTS.md | 2 +- backend/templates/HEARTBEAT_AGENT.md | 1 - backend/tests/test_board_schema.py | 3 + .../tests/test_tasks_done_approval_gate.py | 86 ++++++++++++++++++- .../src/app/boards/[boardId]/edit/page.tsx | 42 +++++++++ 9 files changed, 187 insertions(+), 9 deletions(-) create mode 100644 backend/migrations/versions/1a7b2c3d4e5f_add_board_lead_only_status_change_rule.py diff --git a/backend/app/api/tasks.py b/backend/app/api/tasks.py index 83f68d18..56951672 100644 --- a/backend/app/api/tasks.py +++ b/backend/app/api/tasks.py @@ -1061,9 +1061,7 @@ async def update_task( board_id=board_id, previous_status=previous_status, previous_assigned=previous_assigned, - status_requested=( - requested_status is not None and requested_status != previous_status - ), + status_requested=(requested_status is not None and requested_status != previous_status), updates=updates, comment=comment, depends_on_task_ids=depends_on_task_ids, @@ -1678,6 +1676,18 @@ async def _apply_non_lead_agent_task_rules( ): raise HTTPException(status_code=status.HTTP_403_FORBIDDEN) if "status" in update.updates: + only_lead_can_change_status = ( + await session.exec( + select(col(Board.only_lead_can_change_status)).where( + col(Board.id) == update.board_id, + ), + ) + ).first() + if only_lead_can_change_status: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="Only board leads can change task status.", + ) status_value = _required_status_value(update.updates["status"]) if status_value != "inbox": dep_ids = await _task_dep_ids( diff --git a/backend/app/models/boards.py b/backend/app/models/boards.py index 286252c5..f478bb34 100644 --- a/backend/app/models/boards.py +++ b/backend/app/models/boards.py @@ -42,5 +42,6 @@ class Board(TenantScoped, table=True): require_approval_for_done: bool = Field(default=True) require_review_before_done: bool = Field(default=False) block_status_changes_with_pending_approval: bool = Field(default=False) + only_lead_can_change_status: bool = Field(default=False) created_at: datetime = Field(default_factory=utcnow) updated_at: datetime = Field(default_factory=utcnow) diff --git a/backend/app/schemas/boards.py b/backend/app/schemas/boards.py index 584523b3..cd9fbd40 100644 --- a/backend/app/schemas/boards.py +++ b/backend/app/schemas/boards.py @@ -32,6 +32,7 @@ class BoardBase(SQLModel): require_approval_for_done: bool = True require_review_before_done: bool = False block_status_changes_with_pending_approval: bool = False + only_lead_can_change_status: bool = False class BoardCreate(BoardBase): @@ -74,6 +75,7 @@ class BoardUpdate(SQLModel): require_approval_for_done: bool | None = None require_review_before_done: bool | None = None block_status_changes_with_pending_approval: bool | None = None + only_lead_can_change_status: bool | None = None @model_validator(mode="after") def validate_gateway_id(self) -> Self: diff --git a/backend/migrations/versions/1a7b2c3d4e5f_add_board_lead_only_status_change_rule.py b/backend/migrations/versions/1a7b2c3d4e5f_add_board_lead_only_status_change_rule.py new file mode 100644 index 00000000..8f1c5b81 --- /dev/null +++ b/backend/migrations/versions/1a7b2c3d4e5f_add_board_lead_only_status_change_rule.py @@ -0,0 +1,43 @@ +"""add lead-only status change board rule + +Revision ID: 1a7b2c3d4e5f +Revises: c2e9f1a6d4b8 +Create Date: 2026-02-13 00:00:00.000000 + +""" + +from __future__ import annotations + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "1a7b2c3d4e5f" +down_revision = "fa6e83f8d9a1" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + bind = op.get_bind() + inspector = sa.inspect(bind) + board_columns = {column["name"] for column in inspector.get_columns("boards")} + if "only_lead_can_change_status" not in board_columns: + op.add_column( + "boards", + sa.Column( + "only_lead_can_change_status", + sa.Boolean(), + nullable=False, + server_default=sa.false(), + ), + ) + + +def downgrade() -> None: + bind = op.get_bind() + inspector = sa.inspect(bind) + board_columns = {column["name"] for column in inspector.get_columns("boards")} + if "only_lead_can_change_status" in board_columns: + op.drop_column("boards", "only_lead_can_change_status") diff --git a/backend/templates/AGENTS.md b/backend/templates/AGENTS.md index 73e8d0d7..f537b970 100644 --- a/backend/templates/AGENTS.md +++ b/backend/templates/AGENTS.md @@ -87,7 +87,7 @@ If you create cron jobs, track them in memory and delete them when no longer nee ## Collaboration (mandatory) - You are one of multiple agents on a board. Act like a team, not a silo. -- The assigned agent is the DRI for a task. Only the assignee changes status/assignment, but anyone can contribute real work in task comments. +- The assigned agent is the DRI for a task. Anyone can contribute real work in task comments. - Task comments are the primary channel for agent-to-agent collaboration. - Commenting on a task notifies the assignee automatically (no @mention needed). - Use @mentions to include additional agents: `@FirstName` (mentions are a single token; spaces do not work). diff --git a/backend/templates/HEARTBEAT_AGENT.md b/backend/templates/HEARTBEAT_AGENT.md index 3bd332c0..d27895b9 100644 --- a/backend/templates/HEARTBEAT_AGENT.md +++ b/backend/templates/HEARTBEAT_AGENT.md @@ -66,7 +66,6 @@ jq -r ' ## Task mentions - If you receive TASK MENTION or are @mentioned in a task, reply in that task. -- If you are not assigned, do not change task status or assignment. - If a non-lead peer posts a task update and you are not mentioned, only reply when you add net-new value. ## Board chat messages diff --git a/backend/tests/test_board_schema.py b/backend/tests/test_board_schema.py index 35e60ed4..109921bb 100644 --- a/backend/tests/test_board_schema.py +++ b/backend/tests/test_board_schema.py @@ -87,15 +87,18 @@ def test_board_rule_toggles_have_expected_defaults() -> None: assert created.require_approval_for_done is True assert created.require_review_before_done is False assert created.block_status_changes_with_pending_approval is False + assert created.only_lead_can_change_status is False updated = BoardUpdate( require_approval_for_done=False, require_review_before_done=True, block_status_changes_with_pending_approval=True, + only_lead_can_change_status=True, ) assert updated.require_approval_for_done is False assert updated.require_review_before_done is True assert updated.block_status_changes_with_pending_approval is True + assert updated.only_lead_can_change_status is True def test_onboarding_confirm_requires_goal_fields() -> None: diff --git a/backend/tests/test_tasks_done_approval_gate.py b/backend/tests/test_tasks_done_approval_gate.py index 308ac97e..d9b9c4f1 100644 --- a/backend/tests/test_tasks_done_approval_gate.py +++ b/backend/tests/test_tasks_done_approval_gate.py @@ -18,7 +18,7 @@ from app.models.boards import Board from app.models.gateways import Gateway from app.models.organizations import Organization from app.models.tasks import Task -from app.schemas.tasks import TaskUpdate +from app.schemas.tasks import TaskRead, TaskUpdate async def _make_engine() -> AsyncEngine: @@ -39,6 +39,8 @@ async def _seed_board_task_and_agent( require_approval_for_done: bool = True, require_review_before_done: bool = False, block_status_changes_with_pending_approval: bool = False, + only_lead_can_change_status: bool = False, + agent_is_board_lead: bool = False, ) -> tuple[Board, Task, Agent]: organization_id = uuid4() gateway = Gateway( @@ -57,6 +59,7 @@ async def _seed_board_task_and_agent( require_approval_for_done=require_approval_for_done, require_review_before_done=require_review_before_done, block_status_changes_with_pending_approval=block_status_changes_with_pending_approval, + only_lead_can_change_status=only_lead_can_change_status, ) task = Task(id=uuid4(), board_id=board.id, title="Task", status=task_status) agent = Agent( @@ -65,7 +68,7 @@ async def _seed_board_task_and_agent( gateway_id=gateway.id, name="agent", status="online", - is_board_lead=False, + is_board_lead=agent_is_board_lead, ) session.add(Organization(id=organization_id, name=f"org-{organization_id}")) @@ -97,8 +100,8 @@ async def _update_task_status( task: Task, agent: Agent, status: Literal["inbox", "in_progress", "review", "done"], -) -> None: - await tasks_api.update_task( +) -> TaskRead: + return await tasks_api.update_task( payload=TaskUpdate(status=status), task=task, session=session, @@ -356,6 +359,81 @@ async def test_update_task_allows_status_change_with_pending_approval_when_toggl await engine.dispose() +@pytest.mark.asyncio +async def test_update_task_rejects_non_lead_status_change_when_only_lead_rule_enabled() -> None: + engine = await _make_engine() + try: + async with await _make_session(engine) as session: + _board, task, agent = await _seed_board_task_and_agent( + session, + task_status="inbox", + require_approval_for_done=False, + only_lead_can_change_status=True, + ) + + with pytest.raises(HTTPException) as exc: + await _update_task_status( + session, + task=task, + agent=agent, + status="in_progress", + ) + + assert exc.value.status_code == 403 + finally: + await engine.dispose() + + +@pytest.mark.asyncio +async def test_update_task_allows_non_lead_status_change_when_only_lead_rule_disabled() -> None: + engine = await _make_engine() + try: + async with await _make_session(engine) as session: + _board, task, agent = await _seed_board_task_and_agent( + session, + task_status="inbox", + require_approval_for_done=False, + only_lead_can_change_status=False, + ) + + updated = await _update_task_status( + session, + task=task, + agent=agent, + status="in_progress", + ) + + assert updated.status == "in_progress" + finally: + await engine.dispose() + + +@pytest.mark.asyncio +async def test_update_task_lead_can_still_change_status_when_only_lead_rule_enabled() -> None: + engine = await _make_engine() + try: + async with await _make_session(engine) as session: + _board, task, lead_agent = await _seed_board_task_and_agent( + session, + task_status="review", + require_approval_for_done=False, + require_review_before_done=False, + only_lead_can_change_status=True, + agent_is_board_lead=True, + ) + + updated = await tasks_api.update_task( + payload=TaskUpdate(status="inbox"), + task=task, + session=session, + actor=ActorContext(actor_type="agent", agent=lead_agent), + ) + + assert updated.status == "inbox" + finally: + await engine.dispose() + + @pytest.mark.asyncio async def test_update_task_allows_dependency_change_with_pending_approval() -> None: engine = await _make_engine() diff --git a/frontend/src/app/boards/[boardId]/edit/page.tsx b/frontend/src/app/boards/[boardId]/edit/page.tsx index 97112cb3..74f9daf5 100644 --- a/frontend/src/app/boards/[boardId]/edit/page.tsx +++ b/frontend/src/app/boards/[boardId]/edit/page.tsx @@ -231,6 +231,9 @@ export default function EditBoardPage() { blockStatusChangesWithPendingApproval, setBlockStatusChangesWithPendingApproval, ] = useState(undefined); + const [onlyLeadCanChangeStatus, setOnlyLeadCanChangeStatus] = useState< + boolean | undefined + >(undefined); const [successMetrics, setSuccessMetrics] = useState( undefined, ); @@ -425,6 +428,8 @@ export default function EditBoardPage() { blockStatusChangesWithPendingApproval ?? baseBoard?.block_status_changes_with_pending_approval ?? false; + const resolvedOnlyLeadCanChangeStatus = + onlyLeadCanChangeStatus ?? baseBoard?.only_lead_can_change_status ?? false; const resolvedSuccessMetrics = successMetrics ?? (baseBoard?.success_metrics @@ -498,6 +503,7 @@ export default function EditBoardPage() { setBlockStatusChangesWithPendingApproval( updated.block_status_changes_with_pending_approval ?? false, ); + setOnlyLeadCanChangeStatus(updated.only_lead_can_change_status ?? false); setSuccessMetrics( updated.success_metrics ? JSON.stringify(updated.success_metrics, null, 2) @@ -559,6 +565,7 @@ export default function EditBoardPage() { require_review_before_done: resolvedRequireReviewBeforeDone, block_status_changes_with_pending_approval: resolvedBlockStatusChangesWithPendingApproval, + only_lead_can_change_status: resolvedOnlyLeadCanChangeStatus, success_metrics: resolvedBoardType === "general" ? null : parsedMetrics, target_date: resolvedBoardType === "general" @@ -924,6 +931,41 @@ export default function EditBoardPage() {

+
+ + + + Only lead can change status + + + Restrict status changes to the board lead. + + +
{gateways.length === 0 ? ( From 9a5964a31cebe76cd3a1ba2c3d60b72e42e47448 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Fri, 13 Feb 2026 16:22:00 +0530 Subject: [PATCH 10/20] refactor: reorganize import statements and improve code formatting across multiple files --- backend/app/api/agent.py | 3 +-- backend/app/api/board_group_memory.py | 5 ++--- backend/app/api/boards.py | 3 +-- backend/app/services/board_lifecycle.py | 4 +++- backend/app/services/openclaw/provisioning.py | 4 +++- backend/tests/test_boards_delete.py | 2 +- backend/tests/test_template_size_budget.py | 6 +++--- frontend/src/api/generated/model/boardRead.ts | 1 + frontend/src/api/generated/model/boardUpdate.ts | 1 + 9 files changed, 16 insertions(+), 13 deletions(-) diff --git a/backend/app/api/agent.py b/backend/app/api/agent.py index 9081a8e2..ab40e43f 100644 --- a/backend/app/api/agent.py +++ b/backend/app/api/agent.py @@ -3,8 +3,7 @@ from __future__ import annotations from enum import Enum -from typing import TYPE_CHECKING, Any -from typing import cast +from typing import TYPE_CHECKING, Any, cast from uuid import UUID from fastapi import APIRouter, Depends, HTTPException, Query, status diff --git a/backend/app/api/board_group_memory.py b/backend/app/api/board_group_memory.py index 330f38ad..82abf44a 100644 --- a/backend/app/api/board_group_memory.py +++ b/backend/app/api/board_group_memory.py @@ -4,11 +4,10 @@ from __future__ import annotations import asyncio import json -from enum import Enum from dataclasses import dataclass from datetime import UTC, datetime -from typing import TYPE_CHECKING -from typing import cast +from enum import Enum +from typing import TYPE_CHECKING, cast from uuid import UUID from fastapi import APIRouter, Depends, HTTPException, Query, Request, status diff --git a/backend/app/api/boards.py b/backend/app/api/boards.py index d24e7213..4c33ddf9 100644 --- a/backend/app/api/boards.py +++ b/backend/app/api/boards.py @@ -3,8 +3,7 @@ from __future__ import annotations from enum import Enum -from typing import TYPE_CHECKING, Literal -from typing import cast +from typing import TYPE_CHECKING, Literal, cast from uuid import UUID from fastapi import APIRouter, Depends, HTTPException, Query, status diff --git a/backend/app/services/board_lifecycle.py b/backend/app/services/board_lifecycle.py index 879c0b25..f70a4840 100644 --- a/backend/app/services/board_lifecycle.py +++ b/backend/app/services/board_lifecycle.py @@ -41,7 +41,9 @@ def _is_missing_gateway_agent_error(exc: OpenClawGatewayError) -> bool: message = str(exc).lower() if not message: return False - if any(marker in message for marker in ("unknown agent", "no such agent", "agent does not exist")): + if any( + marker in message for marker in ("unknown agent", "no such agent", "agent does not exist") + ): return True return "agent" in message and "not found" in message diff --git a/backend/app/services/openclaw/provisioning.py b/backend/app/services/openclaw/provisioning.py index 2c9bc963..3e1b0bc9 100644 --- a/backend/app/services/openclaw/provisioning.py +++ b/backend/app/services/openclaw/provisioning.py @@ -77,7 +77,9 @@ def _is_missing_agent_error(exc: OpenClawGatewayError) -> bool: message = str(exc).lower() if not message: return False - if any(marker in message for marker in ("unknown agent", "no such agent", "agent does not exist")): + if any( + marker in message for marker in ("unknown agent", "no such agent", "agent does not exist") + ): return True return "agent" in message and "not found" in message diff --git a/backend/tests/test_boards_delete.py b/backend/tests/test_boards_delete.py index 77b22ea3..bd5809fd 100644 --- a/backend/tests/test_boards_delete.py +++ b/backend/tests/test_boards_delete.py @@ -10,8 +10,8 @@ from uuid import uuid4 import pytest -from app.api import boards import app.services.board_lifecycle as board_lifecycle +from app.api import boards from app.models.boards import Board from app.services.openclaw.gateway_rpc import OpenClawGatewayError diff --git a/backend/tests/test_template_size_budget.py b/backend/tests/test_template_size_budget.py index 4259d0d3..5f58bc4d 100644 --- a/backend/tests/test_template_size_budget.py +++ b/backend/tests/test_template_size_budget.py @@ -18,6 +18,6 @@ def test_heartbeat_templates_fit_in_injected_context_limit() -> None: ) for name in targets: size = (TEMPLATES_DIR / name).stat().st_size - assert size <= HEARTBEAT_CONTEXT_LIMIT, ( - f"{name} is {size} chars (limit {HEARTBEAT_CONTEXT_LIMIT})" - ) + assert ( + size <= HEARTBEAT_CONTEXT_LIMIT + ), f"{name} is {size} chars (limit {HEARTBEAT_CONTEXT_LIMIT})" diff --git a/frontend/src/api/generated/model/boardRead.ts b/frontend/src/api/generated/model/boardRead.ts index 2bd5231a..c77118c7 100644 --- a/frontend/src/api/generated/model/boardRead.ts +++ b/frontend/src/api/generated/model/boardRead.ts @@ -24,6 +24,7 @@ export interface BoardRead { require_approval_for_done?: boolean; require_review_before_done?: boolean; block_status_changes_with_pending_approval?: boolean; + only_lead_can_change_status?: boolean; id: string; organization_id: string; created_at: string; diff --git a/frontend/src/api/generated/model/boardUpdate.ts b/frontend/src/api/generated/model/boardUpdate.ts index b70f8bac..837e747f 100644 --- a/frontend/src/api/generated/model/boardUpdate.ts +++ b/frontend/src/api/generated/model/boardUpdate.ts @@ -24,4 +24,5 @@ export interface BoardUpdate { require_approval_for_done?: boolean | null; require_review_before_done?: boolean | null; block_status_changes_with_pending_approval?: boolean | null; + only_lead_can_change_status?: boolean | null; } From b032e94ca1ac2d889a7c451f416781fcf53d4f95 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Fri, 13 Feb 2026 17:14:55 +0530 Subject: [PATCH 11/20] feat: integrate Markdown component for rendering webhook description --- frontend/src/app/boards/[boardId]/edit/page.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/boards/[boardId]/edit/page.tsx b/frontend/src/app/boards/[boardId]/edit/page.tsx index 74f9daf5..7d232a77 100644 --- a/frontend/src/app/boards/[boardId]/edit/page.tsx +++ b/frontend/src/app/boards/[boardId]/edit/page.tsx @@ -53,6 +53,7 @@ import { import SearchableSelect from "@/components/ui/searchable-select"; import { Textarea } from "@/components/ui/textarea"; import { localDateInputToUtcIso, toLocalDateInput } from "@/lib/datetime"; +import { Markdown } from "@/components/atoms/Markdown"; const slugify = (value: string) => value @@ -188,7 +189,12 @@ function WebhookCard({ disabled={isBusy} /> ) : ( -

{webhook.description}

+
+ +
)}
From 277bfcb33afc3b02f3f38bb70f53a4d8e62fa6e5 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Fri, 13 Feb 2026 21:24:36 +0530 Subject: [PATCH 12/20] feat: add custom-fields --- backend/app/api/agent.py | 13 +- backend/app/api/task_custom_fields.py | 343 ++ backend/app/api/tasks.py | 397 +- backend/app/main.py | 2 + backend/app/models/__init__.py | 8 + backend/app/models/task_custom_fields.py | 92 + backend/app/schemas/task_custom_fields.py | 366 ++ backend/app/schemas/tasks.py | 4 + ...f4c7d9e1a2_add_task_custom_field_tables.py | 141 + backend/scripts/check_migration_graph.py | 4 +- frontend/src/api/generated/agent/agent.ts | 5321 +++++++++-------- frontend/src/api/generated/agents/agents.ts | 490 +- .../board-group-memory/board-group-memory.ts | 11 +- .../generated/board-groups/board-groups.ts | 483 +- .../board-onboarding/board-onboarding.ts | 584 +- frontend/src/api/generated/boards/boards.ts | 714 +-- .../src/api/generated/gateways/gateways.ts | 910 +-- .../api/generated/model/activityEventRead.ts | 8 +- .../model/activityTaskCommentFeedItemRead.ts | 10 +- .../src/api/generated/model/agentCreate.ts | 6 +- .../generated/model/agentHeartbeatCreate.ts | 4 +- frontend/src/api/generated/model/agentRead.ts | 16 +- .../src/api/generated/model/agentUpdate.ts | 6 +- .../src/api/generated/model/approvalCreate.ts | 8 +- .../src/api/generated/model/approvalRead.ts | 16 +- .../api/generated/model/blockedTaskDetail.ts | 2 +- .../src/api/generated/model/boardCreate.ts | 17 +- .../api/generated/model/boardGroupCreate.ts | 2 +- .../model/boardGroupHeartbeatApply.ts | 2 +- .../model/boardGroupHeartbeatApplyResult.ts | 2 +- .../generated/model/boardGroupMemoryCreate.ts | 2 +- .../generated/model/boardGroupMemoryRead.ts | 8 +- .../src/api/generated/model/boardGroupRead.ts | 6 +- .../api/generated/model/boardGroupSnapshot.ts | 2 +- .../generated/model/boardGroupTaskSummary.ts | 18 +- .../api/generated/model/boardGroupUpdate.ts | 2 +- .../api/generated/model/boardMemoryCreate.ts | 2 +- .../api/generated/model/boardMemoryRead.ts | 8 +- .../model/boardOnboardingAgentComplete.ts | 4 +- .../model/boardOnboardingAgentQuestion.ts | 4 +- .../model/boardOnboardingLeadAgentDraft.ts | 8 +- .../generated/model/boardOnboardingRead.ts | 8 +- .../model/boardOnboardingUserProfile.ts | 4 +- frontend/src/api/generated/model/boardRead.ts | 24 +- .../src/api/generated/model/boardSnapshot.ts | 4 +- .../src/api/generated/model/boardUpdate.ts | 18 +- .../src/api/generated/model/dashboardKpis.ts | 2 +- .../api/generated/model/dashboardMetrics.ts | 8 +- .../generated/model/dashboardRangeSeries.ts | 2 +- .../api/generated/model/dashboardSeriesSet.ts | 2 +- .../api/generated/model/dashboardWipPoint.ts | 8 +- .../model/dashboardWipRangeSeries.ts | 2 +- .../generated/model/dashboardWipSeriesSet.ts | 2 +- .../model/gatewayCommandsResponse.ts | 4 +- .../src/api/generated/model/gatewayCreate.ts | 2 +- .../model/gatewayLeadBroadcastBoardResult.ts | 2 +- .../model/gatewayLeadBroadcastRequest.ts | 8 +- .../model/gatewayLeadBroadcastResponse.ts | 4 +- .../model/gatewayLeadMessageRequest.ts | 6 +- .../model/gatewayLeadMessageResponse.ts | 2 +- .../model/gatewayMainAskUserRequest.ts | 4 +- .../model/gatewayMainAskUserResponse.ts | 2 +- .../src/api/generated/model/gatewayRead.ts | 8 +- .../model/gatewaySessionsResponse.ts | 2 +- .../model/gatewayTemplatesSyncResult.ts | 8 +- .../src/api/generated/model/gatewayUpdate.ts | 2 +- .../generated/model/gatewaysStatusResponse.ts | 6 +- frontend/src/api/generated/model/index.ts | 11 + ...tPageTypeVarCustomizedActivityEventRead.ts | 4 +- ...stomizedActivityTaskCommentFeedItemRead.ts | 4 +- ...mitOffsetPageTypeVarCustomizedAgentRead.ts | 4 +- ...OffsetPageTypeVarCustomizedApprovalRead.ts | 4 +- ...geTypeVarCustomizedBoardGroupMemoryRead.ts | 4 +- ...fsetPageTypeVarCustomizedBoardGroupRead.ts | 4 +- ...setPageTypeVarCustomizedBoardMemoryRead.ts | 4 +- ...mitOffsetPageTypeVarCustomizedBoardRead.ts | 4 +- ...tOffsetPageTypeVarCustomizedGatewayRead.ts | 4 +- ...TypeVarCustomizedOrganizationInviteRead.ts | 4 +- ...TypeVarCustomizedOrganizationMemberRead.ts | 4 +- ...limitOffsetPageTypeVarCustomizedTagRead.ts | 4 +- ...setPageTypeVarCustomizedTaskCommentRead.ts | 4 +- ...imitOffsetPageTypeVarCustomizedTaskRead.ts | 4 +- .../model/organizationBoardAccessRead.ts | 2 +- .../model/organizationInviteCreate.ts | 4 +- .../generated/model/organizationInviteRead.ts | 16 +- .../generated/model/organizationListItem.ts | 2 +- .../generated/model/organizationMemberRead.ts | 10 +- .../api/generated/model/organizationRead.ts | 2 +- .../generated/model/organizationUserRead.ts | 2 +- .../api/generated/model/soulUpdateRequest.ts | 2 +- .../model/soulsDirectoryMarkdownResponse.ts | 2 +- .../generated/model/soulsDirectorySoulRef.ts | 2 +- frontend/src/api/generated/model/tagCreate.ts | 4 +- frontend/src/api/generated/model/tagRead.ts | 6 +- frontend/src/api/generated/model/tagRef.ts | 2 +- frontend/src/api/generated/model/tagUpdate.ts | 4 +- .../src/api/generated/model/taskCardRead.ts | 38 +- .../model/taskCardReadCustomFieldValues.ts | 10 + .../api/generated/model/taskCommentRead.ts | 4 +- .../src/api/generated/model/taskCreate.ts | 16 +- .../model/taskCreateCustomFieldValues.ts | 8 + .../model/taskCustomFieldDefinitionCreate.ts | 25 + ...askCustomFieldDefinitionCreateFieldType.ts | 21 + ...CustomFieldDefinitionCreateUiVisibility.ts | 15 + .../model/taskCustomFieldDefinitionRead.ts | 27 + .../taskCustomFieldDefinitionReadFieldType.ts | 21 + ...skCustomFieldDefinitionReadUiVisibility.ts | 15 + .../model/taskCustomFieldDefinitionUpdate.ts | 30 + frontend/src/api/generated/model/taskRead.ts | 28 +- .../model/taskReadCustomFieldValues.ts | 10 + .../src/api/generated/model/taskUpdate.ts | 16 +- .../model/taskUpdateCustomFieldValues.ts | 10 + frontend/src/api/generated/model/userRead.ts | 8 +- .../src/api/generated/model/userUpdate.ts | 4 +- .../api/generated/model/validationError.ts | 4 +- .../org-custom-fields/org-custom-fields.ts | 751 +++ .../generated/organizations/organizations.ts | 3024 +++++----- frontend/src/api/generated/tags/tags.ts | 232 +- frontend/src/api/generated/tasks/tasks.ts | 758 +-- frontend/src/api/generated/users/users.ts | 204 +- .../src/app/boards/[boardId]/edit/page.tsx | 9 +- frontend/src/app/boards/[boardId]/page.tsx | 801 ++- .../app/custom-fields/[fieldId]/edit/page.tsx | 638 ++ frontend/src/app/custom-fields/new/page.tsx | 520 ++ frontend/src/app/custom-fields/page.tsx | 164 + .../custom-fields/CustomFieldsTable.tsx | 205 + .../components/organisms/DashboardSidebar.tsx | 15 + 127 files changed, 11305 insertions(+), 6643 deletions(-) create mode 100644 backend/app/api/task_custom_fields.py create mode 100644 backend/app/models/task_custom_fields.py create mode 100644 backend/app/schemas/task_custom_fields.py create mode 100644 backend/migrations/versions/b6f4c7d9e1a2_add_task_custom_field_tables.py create mode 100644 frontend/src/api/generated/model/taskCardReadCustomFieldValues.ts create mode 100644 frontend/src/api/generated/model/taskCreateCustomFieldValues.ts create mode 100644 frontend/src/api/generated/model/taskCustomFieldDefinitionCreate.ts create mode 100644 frontend/src/api/generated/model/taskCustomFieldDefinitionCreateFieldType.ts create mode 100644 frontend/src/api/generated/model/taskCustomFieldDefinitionCreateUiVisibility.ts create mode 100644 frontend/src/api/generated/model/taskCustomFieldDefinitionRead.ts create mode 100644 frontend/src/api/generated/model/taskCustomFieldDefinitionReadFieldType.ts create mode 100644 frontend/src/api/generated/model/taskCustomFieldDefinitionReadUiVisibility.ts create mode 100644 frontend/src/api/generated/model/taskCustomFieldDefinitionUpdate.ts create mode 100644 frontend/src/api/generated/model/taskReadCustomFieldValues.ts create mode 100644 frontend/src/api/generated/model/taskUpdateCustomFieldValues.ts create mode 100644 frontend/src/api/generated/org-custom-fields/org-custom-fields.ts create mode 100644 frontend/src/app/custom-fields/[fieldId]/edit/page.tsx create mode 100644 frontend/src/app/custom-fields/new/page.tsx create mode 100644 frontend/src/app/custom-fields/page.tsx create mode 100644 frontend/src/components/custom-fields/CustomFieldsTable.tsx diff --git a/backend/app/api/agent.py b/backend/app/api/agent.py index ab40e43f..9a6d5c7f 100644 --- a/backend/app/api/agent.py +++ b/backend/app/api/agent.py @@ -287,13 +287,16 @@ async def create_task( """Create a task as the board lead. Lead-only endpoint. Supports dependency-aware creation via - `depends_on_task_ids` and optional `tag_ids`. + `depends_on_task_ids`, optional `tag_ids`, and `custom_field_values`. """ _guard_board_access(agent_ctx, board) _require_board_lead(agent_ctx) - data = payload.model_dump(exclude={"depends_on_task_ids", "tag_ids"}) + data = payload.model_dump( + exclude={"depends_on_task_ids", "tag_ids", "custom_field_values"}, + ) depends_on_task_ids = list(payload.depends_on_task_ids) tag_ids = list(payload.tag_ids) + custom_field_values = dict(payload.custom_field_values) task = Task.model_validate(data) task.board_id = board.id @@ -343,6 +346,12 @@ async def create_task( session.add(task) # Ensure the task exists in the DB before inserting dependency rows. await session.flush() + await tasks_api._set_task_custom_field_values_for_create( + session, + board_id=board.id, + task_id=task.id, + custom_field_values=custom_field_values, + ) for dep_id in normalized_deps: session.add( TaskDependency( diff --git a/backend/app/api/task_custom_fields.py b/backend/app/api/task_custom_fields.py new file mode 100644 index 00000000..c974e767 --- /dev/null +++ b/backend/app/api/task_custom_fields.py @@ -0,0 +1,343 @@ +"""Organization-level task custom field definition management.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING +from uuid import UUID + +from fastapi import APIRouter, Depends, HTTPException, status +from sqlalchemy import func +from sqlalchemy.exc import IntegrityError +from sqlmodel import col, select + +from app.api.deps import require_org_admin, require_org_member +from app.core.time import utcnow +from app.db.session import get_session +from app.models.boards import Board +from app.models.task_custom_fields import ( + BoardTaskCustomField, + TaskCustomFieldDefinition, + TaskCustomFieldValue, +) +from app.schemas.common import OkResponse +from app.schemas.task_custom_fields import ( + TaskCustomFieldDefinitionCreate, + TaskCustomFieldDefinitionRead, + TaskCustomFieldDefinitionUpdate, + validate_custom_field_definition, +) +from app.services.organizations import OrganizationContext + +if TYPE_CHECKING: + from sqlmodel.ext.asyncio.session import AsyncSession + + +router = APIRouter(prefix="/organizations/me/custom-fields", tags=["org-custom-fields"]) +SESSION_DEP = Depends(get_session) +ORG_MEMBER_DEP = Depends(require_org_member) +ORG_ADMIN_DEP = Depends(require_org_admin) + + +def _to_definition_read_payload( + *, + definition: TaskCustomFieldDefinition, + board_ids: list[UUID], +) -> TaskCustomFieldDefinitionRead: + payload = TaskCustomFieldDefinitionRead.model_validate(definition, from_attributes=True) + payload.board_ids = board_ids + return payload + + +async def _board_ids_by_definition_id( + *, + session: AsyncSession, + definition_ids: list[UUID], +) -> dict[UUID, list[UUID]]: + if not definition_ids: + return {} + rows = ( + await session.exec( + select( + col(BoardTaskCustomField.task_custom_field_definition_id), + col(BoardTaskCustomField.board_id), + ).where( + col(BoardTaskCustomField.task_custom_field_definition_id).in_(definition_ids), + ), + ) + ).all() + board_ids_by_definition_id: dict[UUID, list[UUID]] = { + definition_id: [] for definition_id in definition_ids + } + for definition_id, board_id in rows: + board_ids_by_definition_id.setdefault(definition_id, []).append(board_id) + for definition_id in board_ids_by_definition_id: + board_ids_by_definition_id[definition_id].sort(key=str) + return board_ids_by_definition_id + + +async def _validated_board_ids_for_org( + *, + session: AsyncSession, + ctx: OrganizationContext, + board_ids: list[UUID], +) -> list[UUID]: + normalized_board_ids = list(dict.fromkeys(board_ids)) + if not normalized_board_ids: + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail="At least one board must be selected.", + ) + valid_board_ids = set( + ( + await session.exec( + select(col(Board.id)).where( + col(Board.organization_id) == ctx.organization.id, + col(Board.id).in_(normalized_board_ids), + ), + ) + ).all(), + ) + missing_board_ids = sorted( + {board_id for board_id in normalized_board_ids if board_id not in valid_board_ids}, + key=str, + ) + if missing_board_ids: + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail={ + "message": "Some selected boards are invalid for this organization.", + "invalid_board_ids": [str(value) for value in missing_board_ids], + }, + ) + return normalized_board_ids + + +async def _get_org_definition( + *, + session: AsyncSession, + ctx: OrganizationContext, + definition_id: UUID, +) -> TaskCustomFieldDefinition: + definition = ( + await session.exec( + select(TaskCustomFieldDefinition).where( + col(TaskCustomFieldDefinition.id) == definition_id, + col(TaskCustomFieldDefinition.organization_id) == ctx.organization.id, + ), + ) + ).first() + if definition is None: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) + return definition + + +@router.get("", response_model=list[TaskCustomFieldDefinitionRead]) +async def list_org_custom_fields( + ctx: OrganizationContext = ORG_MEMBER_DEP, + session: AsyncSession = SESSION_DEP, +) -> list[TaskCustomFieldDefinitionRead]: + """List task custom field definitions for the authenticated organization.""" + definitions = list( + await session.exec( + select(TaskCustomFieldDefinition) + .where(col(TaskCustomFieldDefinition.organization_id) == ctx.organization.id) + .order_by(func.lower(col(TaskCustomFieldDefinition.label)).asc()), + ), + ) + board_ids_by_definition_id = await _board_ids_by_definition_id( + session=session, + definition_ids=[definition.id for definition in definitions], + ) + return [ + _to_definition_read_payload( + definition=definition, + board_ids=board_ids_by_definition_id.get(definition.id, []), + ) + for definition in definitions + ] + + +@router.post("", response_model=TaskCustomFieldDefinitionRead) +async def create_org_custom_field( + payload: TaskCustomFieldDefinitionCreate, + ctx: OrganizationContext = ORG_ADMIN_DEP, + session: AsyncSession = SESSION_DEP, +) -> TaskCustomFieldDefinitionRead: + """Create an organization-level task custom field definition.""" + board_ids = await _validated_board_ids_for_org( + session=session, + ctx=ctx, + board_ids=payload.board_ids, + ) + try: + validate_custom_field_definition( + field_type=payload.field_type, + validation_regex=payload.validation_regex, + default_value=payload.default_value, + ) + except ValueError as err: + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=str(err), + ) from err + definition = TaskCustomFieldDefinition( + organization_id=ctx.organization.id, + field_key=payload.field_key, + label=payload.label or payload.field_key, + field_type=payload.field_type, + ui_visibility=payload.ui_visibility, + validation_regex=payload.validation_regex, + description=payload.description, + required=payload.required, + default_value=payload.default_value, + ) + session.add(definition) + await session.flush() + for board_id in board_ids: + session.add( + BoardTaskCustomField( + board_id=board_id, + task_custom_field_definition_id=definition.id, + ), + ) + try: + await session.commit() + except IntegrityError as err: + await session.rollback() + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, + detail="Field key already exists in this organization.", + ) from err + + await session.refresh(definition) + return _to_definition_read_payload(definition=definition, board_ids=board_ids) + + +@router.patch("/{task_custom_field_definition_id}", response_model=TaskCustomFieldDefinitionRead) +async def update_org_custom_field( + task_custom_field_definition_id: UUID, + payload: TaskCustomFieldDefinitionUpdate, + ctx: OrganizationContext = ORG_ADMIN_DEP, + session: AsyncSession = SESSION_DEP, +) -> TaskCustomFieldDefinitionRead: + """Update an organization-level task custom field definition.""" + definition = await _get_org_definition( + session=session, + ctx=ctx, + definition_id=task_custom_field_definition_id, + ) + updates = payload.model_dump(exclude_unset=True) + board_ids = updates.pop("board_ids", None) + validated_board_ids: list[UUID] | None = None + if board_ids is not None: + validated_board_ids = await _validated_board_ids_for_org( + session=session, + ctx=ctx, + board_ids=board_ids, + ) + next_field_type = updates.get("field_type", definition.field_type) + next_validation_regex = ( + updates["validation_regex"] + if "validation_regex" in updates + else definition.validation_regex + ) + next_default_value = ( + updates["default_value"] if "default_value" in updates else definition.default_value + ) + try: + validate_custom_field_definition( + field_type=next_field_type, + validation_regex=next_validation_regex, + default_value=next_default_value, + ) + except ValueError as err: + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=str(err), + ) from err + for key, value in updates.items(): + setattr(definition, key, value) + if validated_board_ids is not None: + bindings = list( + await session.exec( + select(BoardTaskCustomField).where( + col(BoardTaskCustomField.task_custom_field_definition_id) == definition.id, + ), + ), + ) + current_board_ids = {binding.board_id for binding in bindings} + target_board_ids = set(validated_board_ids) + for binding in bindings: + if binding.board_id not in target_board_ids: + await session.delete(binding) + for board_id in validated_board_ids: + if board_id in current_board_ids: + continue + session.add( + BoardTaskCustomField( + board_id=board_id, + task_custom_field_definition_id=definition.id, + ), + ) + definition.updated_at = utcnow() + session.add(definition) + + try: + await session.commit() + except IntegrityError as err: + await session.rollback() + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, + detail="Field key already exists in this organization.", + ) from err + + await session.refresh(definition) + if validated_board_ids is None: + board_ids = ( + await _board_ids_by_definition_id( + session=session, + definition_ids=[definition.id], + ) + ).get(definition.id, []) + else: + board_ids = validated_board_ids + return _to_definition_read_payload(definition=definition, board_ids=board_ids) + + +@router.delete("/{task_custom_field_definition_id}", response_model=OkResponse) +async def delete_org_custom_field( + task_custom_field_definition_id: UUID, + ctx: OrganizationContext = ORG_ADMIN_DEP, + session: AsyncSession = SESSION_DEP, +) -> OkResponse: + """Delete an org-level definition when it has no persisted task values.""" + definition = await _get_org_definition( + session=session, + ctx=ctx, + definition_id=task_custom_field_definition_id, + ) + value_ids = ( + await session.exec( + select(col(TaskCustomFieldValue.id)).where( + col(TaskCustomFieldValue.task_custom_field_definition_id) == definition.id, + ), + ) + ).all() + if value_ids: + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, + detail="Cannot delete a custom field definition while task values exist.", + ) + + bindings = list( + await session.exec( + select(BoardTaskCustomField).where( + col(BoardTaskCustomField.task_custom_field_definition_id) == definition.id, + ), + ), + ) + for binding in bindings: + await session.delete(binding) + await session.delete(definition) + await session.commit() + return OkResponse() diff --git a/backend/app/api/tasks.py b/backend/app/api/tasks.py index 56951672..9c3a70fd 100644 --- a/backend/app/api/tasks.py +++ b/backend/app/api/tasks.py @@ -7,7 +7,7 @@ import json from collections import deque from dataclasses import dataclass from datetime import UTC, datetime -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, cast from uuid import UUID from fastapi import APIRouter, Depends, HTTPException, Query, Request, status @@ -33,6 +33,11 @@ from app.models.approval_task_links import ApprovalTaskLink from app.models.approvals import Approval from app.models.boards import Board from app.models.tag_assignments import TagAssignment +from app.models.task_custom_fields import ( + BoardTaskCustomField, + TaskCustomFieldDefinition, + TaskCustomFieldValue, +) from app.models.task_dependencies import TaskDependency from app.models.task_fingerprints import TaskFingerprint from app.models.tasks import Task @@ -40,6 +45,11 @@ from app.schemas.activity_events import ActivityEventRead from app.schemas.common import OkResponse from app.schemas.errors import BlockedTaskError from app.schemas.pagination import DefaultLimitOffsetPage +from app.schemas.task_custom_fields import ( + TaskCustomFieldType, + TaskCustomFieldValues, + validate_custom_field_value, +) from app.schemas.tasks import TaskCommentCreate, TaskCommentRead, TaskCreate, TaskRead, TaskUpdate from app.services.activity_log import record_activity from app.services.approval_task_links import ( @@ -99,6 +109,16 @@ ADMIN_AUTH_DEP = Depends(require_admin_auth) TASK_DEP = Depends(get_task_or_404) +@dataclass(frozen=True, slots=True) +class _BoardCustomFieldDefinition: + id: UUID + field_key: str + field_type: TaskCustomFieldType + validation_regex: str | None + required: bool + default_value: object | None + + def _comment_validation_error() -> HTTPException: return HTTPException( status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, @@ -697,6 +717,281 @@ def _status_values(status_filter: str | None) -> list[str]: return values +async def _organization_custom_field_definitions_for_board( + session: AsyncSession, + *, + board_id: UUID, +) -> dict[str, _BoardCustomFieldDefinition]: + organization_id = ( + await session.exec( + select(Board.organization_id).where(col(Board.id) == board_id), + ) + ).first() + if organization_id is None: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) + definitions = list( + await session.exec( + select(TaskCustomFieldDefinition) + .join( + BoardTaskCustomField, + col(BoardTaskCustomField.task_custom_field_definition_id) + == col(TaskCustomFieldDefinition.id), + ) + .where( + col(BoardTaskCustomField.board_id) == board_id, + col(TaskCustomFieldDefinition.organization_id) == organization_id, + ), + ), + ) + return { + definition.field_key: _BoardCustomFieldDefinition( + id=definition.id, + field_key=definition.field_key, + field_type=cast(TaskCustomFieldType, definition.field_type), + validation_regex=definition.validation_regex, + required=definition.required, + default_value=definition.default_value, + ) + for definition in definitions + } + + +def _reject_unknown_custom_field_keys( + *, + custom_field_values: TaskCustomFieldValues, + definitions_by_key: dict[str, _BoardCustomFieldDefinition], +) -> None: + unknown_field_keys = sorted(set(custom_field_values) - set(definitions_by_key)) + if not unknown_field_keys: + return + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail={ + "message": "Unknown custom field keys for this board.", + "unknown_field_keys": unknown_field_keys, + }, + ) + + +def _reject_missing_required_custom_field_keys( + *, + effective_values: TaskCustomFieldValues, + definitions_by_key: dict[str, _BoardCustomFieldDefinition], +) -> None: + missing_field_keys = [ + definition.field_key + for definition in definitions_by_key.values() + if definition.required and effective_values.get(definition.field_key) is None + ] + if not missing_field_keys: + return + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail={ + "message": "Required custom fields must have values.", + "missing_field_keys": sorted(missing_field_keys), + }, + ) + + +def _reject_invalid_custom_field_values( + *, + custom_field_values: TaskCustomFieldValues, + definitions_by_key: dict[str, _BoardCustomFieldDefinition], +) -> None: + for field_key, value in custom_field_values.items(): + definition = definitions_by_key[field_key] + try: + validate_custom_field_value( + field_type=definition.field_type, + value=value, + validation_regex=definition.validation_regex, + ) + except ValueError as err: + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail={ + "message": "Invalid custom field value.", + "field_key": field_key, + "field_type": definition.field_type, + "reason": str(err), + }, + ) from err + + +async def _task_custom_field_rows_by_definition_id( + session: AsyncSession, + *, + task_id: UUID, + definition_ids: list[UUID], +) -> dict[UUID, TaskCustomFieldValue]: + if not definition_ids: + return {} + rows = list( + await session.exec( + select(TaskCustomFieldValue).where( + col(TaskCustomFieldValue.task_id) == task_id, + col(TaskCustomFieldValue.task_custom_field_definition_id).in_(definition_ids), + ), + ), + ) + return {row.task_custom_field_definition_id: row for row in rows} + + +async def _set_task_custom_field_values_for_create( + session: AsyncSession, + *, + board_id: UUID, + task_id: UUID, + custom_field_values: TaskCustomFieldValues, +) -> None: + definitions_by_key = await _organization_custom_field_definitions_for_board( + session, + board_id=board_id, + ) + _reject_unknown_custom_field_keys( + custom_field_values=custom_field_values, + definitions_by_key=definitions_by_key, + ) + _reject_invalid_custom_field_values( + custom_field_values=custom_field_values, + definitions_by_key=definitions_by_key, + ) + + effective_values: TaskCustomFieldValues = {} + for field_key, definition in definitions_by_key.items(): + if field_key in custom_field_values: + effective_values[field_key] = custom_field_values[field_key] + else: + effective_values[field_key] = definition.default_value + + _reject_missing_required_custom_field_keys( + effective_values=effective_values, + definitions_by_key=definitions_by_key, + ) + + for field_key, definition in definitions_by_key.items(): + value = effective_values.get(field_key) + if value is None: + continue + session.add( + TaskCustomFieldValue( + task_id=task_id, + task_custom_field_definition_id=definition.id, + value=value, + ), + ) + + +async def _set_task_custom_field_values_for_update( + session: AsyncSession, + *, + board_id: UUID, + task_id: UUID, + custom_field_values: TaskCustomFieldValues, +) -> None: + definitions_by_key = await _organization_custom_field_definitions_for_board( + session, + board_id=board_id, + ) + _reject_unknown_custom_field_keys( + custom_field_values=custom_field_values, + definitions_by_key=definitions_by_key, + ) + _reject_invalid_custom_field_values( + custom_field_values=custom_field_values, + definitions_by_key=definitions_by_key, + ) + definitions_by_id = {definition.id: definition for definition in definitions_by_key.values()} + rows_by_definition_id = await _task_custom_field_rows_by_definition_id( + session, + task_id=task_id, + definition_ids=list(definitions_by_id), + ) + + effective_values: TaskCustomFieldValues = {} + for field_key, definition in definitions_by_key.items(): + current_row = rows_by_definition_id.get(definition.id) + if field_key in custom_field_values: + effective_values[field_key] = custom_field_values[field_key] + elif current_row is not None: + effective_values[field_key] = current_row.value + else: + effective_values[field_key] = definition.default_value + + _reject_missing_required_custom_field_keys( + effective_values=effective_values, + definitions_by_key=definitions_by_key, + ) + + for field_key, value in custom_field_values.items(): + definition = definitions_by_key[field_key] + row = rows_by_definition_id.get(definition.id) + if value is None: + if row is not None: + await session.delete(row) + continue + if row is None: + session.add( + TaskCustomFieldValue( + task_id=task_id, + task_custom_field_definition_id=definition.id, + value=value, + ), + ) + continue + row.value = value + row.updated_at = utcnow() + session.add(row) + + +async def _task_custom_field_values_by_task_id( + session: AsyncSession, + *, + board_id: UUID, + task_ids: Sequence[UUID], +) -> dict[UUID, TaskCustomFieldValues]: + unique_task_ids = list({*task_ids}) + if not unique_task_ids: + return {} + + definitions_by_key = await _organization_custom_field_definitions_for_board( + session, + board_id=board_id, + ) + if not definitions_by_key: + return {task_id: {} for task_id in unique_task_ids} + + definitions_by_id = {definition.id: definition for definition in definitions_by_key.values()} + default_values = { + field_key: definition.default_value for field_key, definition in definitions_by_key.items() + } + values_by_task_id: dict[UUID, TaskCustomFieldValues] = { + task_id: dict(default_values) for task_id in unique_task_ids + } + + rows = ( + await session.exec( + select( + col(TaskCustomFieldValue.task_id), + col(TaskCustomFieldValue.task_custom_field_definition_id), + col(TaskCustomFieldValue.value), + ).where( + col(TaskCustomFieldValue.task_id).in_(unique_task_ids), + col(TaskCustomFieldValue.task_custom_field_definition_id).in_( + list(definitions_by_id), + ), + ), + ) + ).all() + for task_id, definition_id, value in rows: + definition = definitions_by_id.get(definition_id) + if definition is None: + continue + values_by_task_id[task_id][definition.field_key] = value + return values_by_task_id + + def _task_list_statement( *, board_id: UUID, @@ -742,6 +1037,11 @@ async def _task_read_page( board_id=board_id, dependency_ids=list({*dep_ids}), ) + custom_field_values_by_task_id = await _task_custom_field_values_by_task_id( + session, + board_id=board_id, + task_ids=task_ids, + ) output: list[TaskRead] = [] for task in tasks: @@ -761,6 +1061,7 @@ async def _task_read_page( "tags": tag_state.tags, "blocked_by_task_ids": blocked_by, "is_blocked": bool(blocked_by), + "custom_field_values": custom_field_values_by_task_id.get(task.id, {}), }, ), ) @@ -772,12 +1073,17 @@ async def _stream_task_state( *, board_id: UUID, rows: list[tuple[ActivityEvent, Task | None]], -) -> tuple[dict[UUID, list[UUID]], dict[UUID, str], dict[UUID, TagState]]: +) -> tuple[ + dict[UUID, list[UUID]], + dict[UUID, str], + dict[UUID, TagState], + dict[UUID, TaskCustomFieldValues], +]: task_ids = [ task.id for event, task in rows if task is not None and event.event_type != "task.comment" ] if not task_ids: - return {}, {}, {} + return {}, {}, {}, {} tag_state_by_task_id = await load_tag_state( session, @@ -791,15 +1097,20 @@ async def _stream_task_state( dep_ids: list[UUID] = [] for value in deps_map.values(): dep_ids.extend(value) + custom_field_values_by_task_id = await _task_custom_field_values_by_task_id( + session, + board_id=board_id, + task_ids=list({*task_ids}), + ) if not dep_ids: - return deps_map, {}, tag_state_by_task_id + return deps_map, {}, tag_state_by_task_id, custom_field_values_by_task_id dep_status = await dependency_status_by_id( session, board_id=board_id, dependency_ids=list({*dep_ids}), ) - return deps_map, dep_status, tag_state_by_task_id + return deps_map, dep_status, tag_state_by_task_id, custom_field_values_by_task_id def _task_event_payload( @@ -809,7 +1120,9 @@ def _task_event_payload( deps_map: dict[UUID, list[UUID]], dep_status: dict[UUID, str], tag_state_by_task_id: dict[UUID, TagState], + custom_field_values_by_task_id: dict[UUID, TaskCustomFieldValues] | None = None, ) -> dict[str, object]: + resolved_custom_field_values_by_task_id = custom_field_values_by_task_id or {} payload: dict[str, object] = { "type": event.event_type, "activity": ActivityEventRead.model_validate(event).model_dump(mode="json"), @@ -838,6 +1151,10 @@ def _task_event_payload( "tags": tag_state.tags, "blocked_by_task_ids": blocked_by, "is_blocked": bool(blocked_by), + "custom_field_values": resolved_custom_field_values_by_task_id.get( + task.id, + {}, + ), }, ) .model_dump(mode="json") @@ -861,10 +1178,12 @@ async def _task_event_generator( async with async_session_maker() as session: rows = await _fetch_task_events(session, board_id, last_seen) - deps_map, dep_status, tag_state_by_task_id = await _stream_task_state( - session, - board_id=board_id, - rows=rows, + deps_map, dep_status, tag_state_by_task_id, custom_field_values_by_task_id = ( + await _stream_task_state( + session, + board_id=board_id, + rows=rows, + ) ) for event, task in rows: @@ -883,6 +1202,7 @@ async def _task_event_generator( deps_map=deps_map, dep_status=dep_status, tag_state_by_task_id=tag_state_by_task_id, + custom_field_values_by_task_id=custom_field_values_by_task_id, ) yield {"event": "task", "data": json.dumps(payload)} await asyncio.sleep(2) @@ -943,9 +1263,10 @@ async def create_task( auth: AuthContext = ADMIN_AUTH_DEP, ) -> TaskRead: """Create a task and initialize dependency rows.""" - data = payload.model_dump(exclude={"depends_on_task_ids", "tag_ids"}) + data = payload.model_dump(exclude={"depends_on_task_ids", "tag_ids", "custom_field_values"}) depends_on_task_ids = list(payload.depends_on_task_ids) tag_ids = list(payload.tag_ids) + custom_field_values = dict(payload.custom_field_values) task = Task.model_validate(data) task.board_id = board.id @@ -977,6 +1298,12 @@ async def create_task( session.add(task) # Ensure the task exists in the DB before inserting dependency rows. await session.flush() + await _set_task_custom_field_values_for_create( + session, + board_id=board.id, + task_id=task.id, + custom_field_values=custom_field_values, + ) for dep_id in normalized_deps: session.add( TaskDependency( @@ -1051,9 +1378,14 @@ async def update_task( payload.depends_on_task_ids if "depends_on_task_ids" in payload.model_fields_set else None ) tag_ids = payload.tag_ids if "tag_ids" in payload.model_fields_set else None + custom_field_values = ( + payload.custom_field_values if "custom_field_values" in payload.model_fields_set else None + ) + custom_field_values_set = "custom_field_values" in payload.model_fields_set updates.pop("comment", None) updates.pop("depends_on_task_ids", None) updates.pop("tag_ids", None) + updates.pop("custom_field_values", None) requested_status = payload.status if "status" in payload.model_fields_set else None update = _TaskUpdateInput( task=task, @@ -1066,6 +1398,8 @@ async def update_task( comment=comment, depends_on_task_ids=depends_on_task_ids, tag_ids=tag_ids, + custom_field_values=custom_field_values or {}, + custom_field_values_set=custom_field_values_set, ) if actor.actor_type == "agent" and actor.agent and actor.agent.is_board_lead: return await _apply_lead_task_update(session, update=update) @@ -1142,6 +1476,12 @@ async def delete_task( col(TagAssignment.task_id) == task.id, commit=False, ) + await crud.delete_where( + session, + TaskCustomFieldValue, + col(TaskCustomFieldValue.task_id) == task.id, + commit=False, + ) await session.delete(task) await session.commit() return OkResponse() @@ -1306,6 +1646,8 @@ class _TaskUpdateInput: comment: str | None depends_on_task_ids: list[UUID] | None tag_ids: list[UUID] | None + custom_field_values: TaskCustomFieldValues + custom_field_values_set: bool normalized_tag_ids: list[UUID] | None = None @@ -1385,6 +1727,11 @@ async def _task_read_response( board_id=board_id, dep_ids=dep_ids, ) + custom_field_values_by_task_id = await _task_custom_field_values_by_task_id( + session, + board_id=board_id, + task_ids=[task.id], + ) if task.status == "done": blocked_ids = [] return TaskRead.model_validate(task, from_attributes=True).model_copy( @@ -1394,6 +1741,7 @@ async def _task_read_response( "tags": tag_state.tags, "blocked_by_task_ids": blocked_ids, "is_blocked": bool(blocked_ids), + "custom_field_values": custom_field_values_by_task_id.get(task.id, {}), }, ) @@ -1420,18 +1768,26 @@ def _lead_requested_fields(update: _TaskUpdateInput) -> set[str]: requested_fields.add("depends_on_task_ids") if update.tag_ids is not None: requested_fields.add("tag_ids") + if update.custom_field_values_set: + requested_fields.add("custom_field_values") return requested_fields def _validate_lead_update_request(update: _TaskUpdateInput) -> None: - allowed_fields = {"assigned_agent_id", "status", "depends_on_task_ids", "tag_ids"} + allowed_fields = { + "assigned_agent_id", + "status", + "depends_on_task_ids", + "tag_ids", + "custom_field_values", + } requested_fields = _lead_requested_fields(update) if update.comment is not None or not requested_fields.issubset(allowed_fields): raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail=( "Board leads can only assign/unassign tasks, update " - "dependencies, or resolve review tasks." + "dependencies/custom fields, or resolve review tasks." ), ) @@ -1622,6 +1978,13 @@ async def _apply_lead_task_update( task_id=update.task.id, tag_ids=normalized_tag_ids, ) + if update.custom_field_values_set: + await _set_task_custom_field_values_for_update( + session, + board_id=update.board_id, + task_id=update.task.id, + custom_field_values=update.custom_field_values, + ) update.task.updated_at = utcnow() session.add(update.task) @@ -1666,7 +2029,7 @@ async def _apply_non_lead_agent_task_rules( raise HTTPException(status_code=status.HTTP_403_FORBIDDEN) # Agents are limited to status/comment updates, and non-inbox status moves # must pass dependency checks before they can proceed. - allowed_fields = {"status", "comment"} + allowed_fields = {"status", "comment", "custom_field_values"} if ( update.depends_on_task_ids is not None or update.tag_ids is not None @@ -1938,6 +2301,14 @@ async def _finalize_updated_task( tag_ids=normalized or [], ) + if update.custom_field_values_set: + await _set_task_custom_field_values_for_update( + session, + board_id=update.board_id, + task_id=update.task.id, + custom_field_values=update.custom_field_values, + ) + session.add(update.task) await session.commit() await session.refresh(update.task) diff --git a/backend/app/main.py b/backend/app/main.py index cdd0ed73..c5fb3461 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -26,6 +26,7 @@ from app.api.metrics import router as metrics_router from app.api.organizations import router as organizations_router from app.api.souls_directory import router as souls_directory_router from app.api.tags import router as tags_router +from app.api.task_custom_fields import router as task_custom_fields_router from app.api.tasks import router as tasks_router from app.api.users import router as users_router from app.core.config import settings @@ -145,6 +146,7 @@ api_v1.include_router(board_webhooks_router) api_v1.include_router(board_onboarding_router) api_v1.include_router(approvals_router) api_v1.include_router(tasks_router) +api_v1.include_router(task_custom_fields_router) api_v1.include_router(tags_router) api_v1.include_router(users_router) app.include_router(api_v1) diff --git a/backend/app/models/__init__.py b/backend/app/models/__init__.py index 0b90e249..1f5c29c0 100644 --- a/backend/app/models/__init__.py +++ b/backend/app/models/__init__.py @@ -19,6 +19,11 @@ from app.models.organization_members import OrganizationMember from app.models.organizations import Organization from app.models.tag_assignments import TagAssignment from app.models.tags import Tag +from app.models.task_custom_fields import ( + BoardTaskCustomField, + TaskCustomFieldDefinition, + TaskCustomFieldValue, +) from app.models.task_dependencies import TaskDependency from app.models.task_fingerprints import TaskFingerprint from app.models.tasks import Task @@ -38,6 +43,9 @@ __all__ = [ "Board", "Gateway", "Organization", + "BoardTaskCustomField", + "TaskCustomFieldDefinition", + "TaskCustomFieldValue", "OrganizationMember", "OrganizationBoardAccess", "OrganizationInvite", diff --git a/backend/app/models/task_custom_fields.py b/backend/app/models/task_custom_fields.py new file mode 100644 index 00000000..f6e2e067 --- /dev/null +++ b/backend/app/models/task_custom_fields.py @@ -0,0 +1,92 @@ +"""Task custom field models and board binding helpers.""" + +from __future__ import annotations + +from datetime import datetime +from uuid import UUID, uuid4 + +from sqlalchemy import JSON, CheckConstraint, Column, UniqueConstraint +from sqlmodel import Field + +from app.core.time import utcnow +from app.models.tenancy import TenantScoped + +RUNTIME_ANNOTATION_TYPES = (datetime,) + + +class TaskCustomFieldDefinition(TenantScoped, table=True): + """Reusable custom field definition for task metadata.""" + + __tablename__ = "task_custom_field_definitions" # pyright: ignore[reportAssignmentType] + __table_args__ = ( + UniqueConstraint( + "organization_id", + "field_key", + name="uq_task_custom_field_definitions_org_id_field_key", + ), + CheckConstraint( + "field_type IN ('text','text_long','integer','decimal','boolean','date','date_time','url','json')", + name="ck_tcf_def_field_type", + ), + CheckConstraint( + "ui_visibility IN ('always','if_set','hidden')", + name="ck_tcf_def_ui_visibility", + ), + ) + + id: UUID = Field(default_factory=uuid4, primary_key=True) + organization_id: UUID = Field(foreign_key="organizations.id", index=True) + field_key: str = Field(index=True) + label: str + field_type: str = Field(default="text") + ui_visibility: str = Field(default="always") + validation_regex: str | None = None + description: str | None = None + required: bool = Field(default=False) + default_value: object | None = Field(default=None, sa_column=Column(JSON)) + created_at: datetime = Field(default_factory=utcnow) + updated_at: datetime = Field(default_factory=utcnow) + + +class BoardTaskCustomField(TenantScoped, table=True): + """Board-level binding of a custom field definition.""" + + __tablename__ = "board_task_custom_fields" # pyright: ignore[reportAssignmentType] + __table_args__ = ( + UniqueConstraint( + "board_id", + "task_custom_field_definition_id", + name="uq_board_task_custom_fields_board_id_task_custom_field_definition_id", + ), + ) + + id: UUID = Field(default_factory=uuid4, primary_key=True) + board_id: UUID = Field(foreign_key="boards.id", index=True) + task_custom_field_definition_id: UUID = Field( + foreign_key="task_custom_field_definitions.id", + index=True, + ) + created_at: datetime = Field(default_factory=utcnow) + + +class TaskCustomFieldValue(TenantScoped, table=True): + """Stored task-level values for bound custom fields.""" + + __tablename__ = "task_custom_field_values" # pyright: ignore[reportAssignmentType] + __table_args__ = ( + UniqueConstraint( + "task_id", + "task_custom_field_definition_id", + name="uq_task_custom_field_values_task_id_task_custom_field_definition_id", + ), + ) + + id: UUID = Field(default_factory=uuid4, primary_key=True) + task_id: UUID = Field(foreign_key="tasks.id", index=True) + task_custom_field_definition_id: UUID = Field( + foreign_key="task_custom_field_definitions.id", + index=True, + ) + value: object | None = Field(default=None, sa_column=Column(JSON)) + created_at: datetime = Field(default_factory=utcnow) + updated_at: datetime = Field(default_factory=utcnow) diff --git a/backend/app/schemas/task_custom_fields.py b/backend/app/schemas/task_custom_fields.py new file mode 100644 index 00000000..ba2e4232 --- /dev/null +++ b/backend/app/schemas/task_custom_fields.py @@ -0,0 +1,366 @@ +"""Schemas for task custom field metadata, board bindings, and payloads.""" + +from __future__ import annotations + +import re +from datetime import date, datetime +from typing import Literal, Self +from urllib.parse import urlparse +from uuid import UUID + +from pydantic import Field, field_validator, model_validator +from sqlmodel import SQLModel + +from app.schemas.common import NonEmptyStr + +RUNTIME_ANNOTATION_TYPES = (datetime, UUID, date) + +TaskCustomFieldType = Literal[ + "text", + "text_long", + "integer", + "decimal", + "boolean", + "date", + "date_time", + "url", + "json", +] +TaskCustomFieldUiVisibility = Literal["always", "if_set", "hidden"] +STRING_FIELD_TYPES: set[str] = {"text", "text_long", "date", "date_time", "url"} +TASK_CUSTOM_FIELD_TYPE_ALIASES: dict[str, TaskCustomFieldType] = { + "text": "text", + "text_long": "text_long", + "text (long)": "text_long", + "long_text": "text_long", + "integer": "integer", + "decimal": "decimal", + "boolean": "boolean", + "true/false": "boolean", + "date": "date", + "date_time": "date_time", + "date & time": "date_time", + "datetime": "date_time", + "url": "url", + "json": "json", +} +TASK_CUSTOM_FIELD_UI_VISIBILITY_ALIASES: dict[str, TaskCustomFieldUiVisibility] = { + "always": "always", + "if_set": "if_set", + "if set": "if_set", + "hidden": "hidden", +} + +# Reusable alias for task payload payloads containing custom-field values. +TaskCustomFieldValues = dict[str, object | None] + + +class TaskCustomFieldDefinitionBase(SQLModel): + """Shared custom field definition properties.""" + + field_key: str + label: str | None = None + field_type: TaskCustomFieldType = "text" + ui_visibility: TaskCustomFieldUiVisibility = "always" + validation_regex: str | None = None + description: str | None = None + required: bool = False + default_value: object | None = None + + @field_validator("field_key", mode="before") + @classmethod + def normalize_field_key(cls, value: object) -> object: + """Normalize field keys to a stable lowercase representation.""" + if not isinstance(value, str): + raise ValueError("field_key must be a string") + normalized = value.strip() + if not normalized: + raise ValueError("field_key is required") + return normalized + + @field_validator("label", mode="before") + @classmethod + def normalize_label(cls, value: object) -> object: + """Normalize labels to a trimmed representation when provided.""" + if value is None: + return None + if not isinstance(value, str): + raise ValueError("label must be a string") + normalized = value.strip() + if not normalized: + raise ValueError("label is required") + return normalized + + @field_validator("field_type", mode="before") + @classmethod + def normalize_field_type(cls, value: object) -> object: + """Normalize field type aliases.""" + if not isinstance(value, str): + raise ValueError("field_type must be a string") + normalized = value.strip().lower() + resolved = TASK_CUSTOM_FIELD_TYPE_ALIASES.get(normalized) + if resolved is None: + raise ValueError( + "field_type must be one of: text, text_long, integer, decimal, " + "boolean, date, date_time, url, json", + ) + return resolved + + @field_validator("validation_regex", mode="before") + @classmethod + def normalize_validation_regex(cls, value: object) -> object: + """Normalize and validate regex pattern syntax.""" + if value is None: + return None + if not isinstance(value, str): + raise ValueError("validation_regex must be a string") + normalized = value.strip() + if not normalized: + return None + try: + re.compile(normalized) + except re.error as exc: + raise ValueError(f"validation_regex is invalid: {exc}") from exc + return normalized + + @field_validator("ui_visibility", mode="before") + @classmethod + def normalize_ui_visibility(cls, value: object) -> object: + """Normalize UI visibility aliases.""" + if not isinstance(value, str): + raise ValueError("ui_visibility must be a string") + normalized = value.strip().lower() + resolved = TASK_CUSTOM_FIELD_UI_VISIBILITY_ALIASES.get(normalized) + if resolved is None: + raise ValueError("ui_visibility must be one of: always, if_set, hidden") + return resolved + + +class TaskCustomFieldDefinitionCreate(TaskCustomFieldDefinitionBase): + """Payload for creating a task custom field definition.""" + + field_key: NonEmptyStr + label: NonEmptyStr | None = None + board_ids: list[UUID] = Field(min_length=1) + + @field_validator("board_ids") + @classmethod + def normalize_board_ids(cls, value: list[UUID]) -> list[UUID]: + """Remove duplicates while preserving user-supplied order.""" + deduped = list(dict.fromkeys(value)) + if not deduped: + raise ValueError("board_ids must include at least one board") + return deduped + + @model_validator(mode="after") + def default_label_to_field_key(self) -> Self: + """Default labels to field_key when omitted by older clients.""" + if self.label is None: + self.label = self.field_key + return self + + @model_validator(mode="after") + def validate_regex_field_type_combo(self) -> Self: + """Restrict regex validation to string-compatible field types.""" + if self.validation_regex is not None and self.field_type not in STRING_FIELD_TYPES: + raise ValueError( + "validation_regex is only supported for string field types.", + ) + return self + + +class TaskCustomFieldDefinitionUpdate(SQLModel): + """Payload for editing an existing task custom field definition.""" + + label: NonEmptyStr | None = None + field_type: TaskCustomFieldType | None = None + ui_visibility: TaskCustomFieldUiVisibility | None = None + validation_regex: str | None = None + description: str | None = None + required: bool | None = None + default_value: object | None = None + board_ids: list[UUID] | None = None + + @field_validator("board_ids") + @classmethod + def normalize_board_ids(cls, value: list[UUID] | None) -> list[UUID] | None: + """Normalize board bindings when provided in updates.""" + if value is None: + return None + deduped = list(dict.fromkeys(value)) + if not deduped: + raise ValueError("board_ids must include at least one board") + return deduped + + @field_validator("field_type", mode="before") + @classmethod + def normalize_optional_field_type(cls, value: object) -> object: + """Normalize optional field type aliases.""" + if value is None: + return None + return TaskCustomFieldDefinitionBase.normalize_field_type(value) + + @field_validator("validation_regex", mode="before") + @classmethod + def normalize_optional_validation_regex(cls, value: object) -> object: + """Normalize and validate optional regex pattern syntax.""" + if value is None: + return None + return TaskCustomFieldDefinitionBase.normalize_validation_regex(value) + + @field_validator("ui_visibility", mode="before") + @classmethod + def normalize_optional_ui_visibility(cls, value: object) -> object: + """Normalize optional UI visibility aliases.""" + if value is None: + return None + return TaskCustomFieldDefinitionBase.normalize_ui_visibility(value) + + @model_validator(mode="before") + @classmethod + def reject_field_key_update(cls, value: object) -> object: + """Disallow field_key updates after definition creation.""" + if isinstance(value, dict) and "field_key" in value: + raise ValueError("field_key cannot be changed after creation.") + return value + + @model_validator(mode="after") + def reject_null_for_non_nullable_fields(self) -> Self: + """Reject explicit null for non-nullable update fields.""" + non_nullable_fields = ("label", "field_type", "ui_visibility", "required") + invalid = [ + field_name + for field_name in non_nullable_fields + if field_name in self.model_fields_set and getattr(self, field_name) is None + ] + if invalid: + raise ValueError( + f"{', '.join(invalid)} cannot be null; omit the field to leave it unchanged", + ) + return self + + @model_validator(mode="after") + def require_some_update(self) -> Self: + """Reject empty updates to avoid no-op requests.""" + if not self.model_fields_set: + raise ValueError("At least one field is required") + return self + + +class TaskCustomFieldDefinitionRead(TaskCustomFieldDefinitionBase): + """Payload returned for custom field definitions.""" + + id: UUID + organization_id: UUID + label: str + field_type: TaskCustomFieldType + ui_visibility: TaskCustomFieldUiVisibility + validation_regex: str | None = None + board_ids: list[UUID] = Field(default_factory=list) + created_at: datetime + updated_at: datetime + + +class BoardTaskCustomFieldCreate(SQLModel): + """Payload for binding a definition to a board.""" + + task_custom_field_definition_id: UUID + + +class BoardTaskCustomFieldRead(SQLModel): + """Payload returned when listing board-bound custom fields.""" + + id: UUID + board_id: UUID + task_custom_field_definition_id: UUID + field_key: str + label: str + field_type: TaskCustomFieldType + ui_visibility: TaskCustomFieldUiVisibility + validation_regex: str | None + description: str | None + required: bool + default_value: object | None + created_at: datetime + + +class TaskCustomFieldValuesPayload(SQLModel): + """Payload for setting all custom-field values at once.""" + + custom_field_values: TaskCustomFieldValues = Field(default_factory=dict) + + +def _parse_iso_datetime(value: str) -> datetime: + normalized = value.strip() + if normalized.endswith("Z"): + normalized = f"{normalized[:-1]}+00:00" + return datetime.fromisoformat(normalized) + + +def validate_custom_field_value( + *, + field_type: TaskCustomFieldType, + value: object | None, + validation_regex: str | None = None, +) -> None: + """Validate a custom field value against field type and optional regex.""" + if value is None: + return + + if field_type in {"text", "text_long"}: + if not isinstance(value, str): + raise ValueError("must be a string") + elif field_type == "integer": + if not isinstance(value, int) or isinstance(value, bool): + raise ValueError("must be an integer") + elif field_type == "decimal": + if (not isinstance(value, (int, float))) or isinstance(value, bool): + raise ValueError("must be a decimal number") + elif field_type == "boolean": + if not isinstance(value, bool): + raise ValueError("must be true or false") + elif field_type == "date": + if not isinstance(value, str): + raise ValueError("must be an ISO date string (YYYY-MM-DD)") + try: + date.fromisoformat(value) + except ValueError as exc: + raise ValueError("must be an ISO date string (YYYY-MM-DD)") from exc + elif field_type == "date_time": + if not isinstance(value, str): + raise ValueError("must be an ISO datetime string") + try: + _parse_iso_datetime(value) + except ValueError as exc: + raise ValueError("must be an ISO datetime string") from exc + elif field_type == "url": + if not isinstance(value, str): + raise ValueError("must be a URL string") + parsed = urlparse(value) + if parsed.scheme not in {"http", "https"} or not parsed.netloc: + raise ValueError("must be a valid http/https URL") + elif field_type == "json": + if not isinstance(value, (dict, list)): + raise ValueError("must be a JSON object or array") + + if validation_regex is not None and field_type in STRING_FIELD_TYPES: + if not isinstance(value, str): + raise ValueError("must be a string for regex validation") + if re.fullmatch(validation_regex, value) is None: + raise ValueError("does not match validation_regex") + + +def validate_custom_field_definition( + *, + field_type: TaskCustomFieldType, + validation_regex: str | None, + default_value: object | None, +) -> None: + """Validate field definition constraints and default-value compatibility.""" + if validation_regex is not None and field_type not in STRING_FIELD_TYPES: + raise ValueError("validation_regex is only supported for string field types.") + validate_custom_field_value( + field_type=field_type, + value=default_value, + validation_regex=validation_regex, + ) diff --git a/backend/app/schemas/tasks.py b/backend/app/schemas/tasks.py index 6117aa88..aa187cd6 100644 --- a/backend/app/schemas/tasks.py +++ b/backend/app/schemas/tasks.py @@ -11,6 +11,7 @@ from sqlmodel import Field, SQLModel from app.schemas.common import NonEmptyStr from app.schemas.tags import TagRef +from app.schemas.task_custom_fields import TaskCustomFieldValues TaskStatus = Literal["inbox", "in_progress", "review", "done"] STATUS_REQUIRED_ERROR = "status is required" @@ -36,6 +37,7 @@ class TaskCreate(TaskBase): """Payload for creating a task.""" created_by_user_id: UUID | None = None + custom_field_values: TaskCustomFieldValues = Field(default_factory=dict) class TaskUpdate(SQLModel): @@ -49,6 +51,7 @@ class TaskUpdate(SQLModel): assigned_agent_id: UUID | None = None depends_on_task_ids: list[UUID] | None = None tag_ids: list[UUID] | None = None + custom_field_values: TaskCustomFieldValues | None = None comment: NonEmptyStr | None = None @field_validator("comment", mode="before") @@ -81,6 +84,7 @@ class TaskRead(TaskBase): blocked_by_task_ids: list[UUID] = Field(default_factory=list) is_blocked: bool = False tags: list[TagRef] = Field(default_factory=list) + custom_field_values: TaskCustomFieldValues | None = None class TaskCommentCreate(SQLModel): diff --git a/backend/migrations/versions/b6f4c7d9e1a2_add_task_custom_field_tables.py b/backend/migrations/versions/b6f4c7d9e1a2_add_task_custom_field_tables.py new file mode 100644 index 00000000..3f73aaad --- /dev/null +++ b/backend/migrations/versions/b6f4c7d9e1a2_add_task_custom_field_tables.py @@ -0,0 +1,141 @@ +"""Add task custom field tables. + +Revision ID: b6f4c7d9e1a2 +Revises: 1a7b2c3d4e5f +Create Date: 2026-02-13 00:20:00.000000 + +""" + +from __future__ import annotations + +import sqlalchemy as sa +from alembic import op + + +# revision identifiers, used by Alembic. +revision = "b6f4c7d9e1a2" +down_revision = "1a7b2c3d4e5f" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + """Create task custom-field definition, binding, and value tables.""" + op.create_table( + "task_custom_field_definitions", + sa.Column("id", sa.Uuid(), nullable=False), + sa.Column("organization_id", sa.Uuid(), nullable=False), + sa.Column("field_key", sa.String(), nullable=False), + sa.Column("label", sa.String(), nullable=False), + sa.Column( + "field_type", + sa.String(), + nullable=False, + server_default=sa.text("'text'"), + ), + sa.Column( + "ui_visibility", + sa.String(), + nullable=False, + server_default=sa.text("'always'"), + ), + sa.Column("validation_regex", sa.String(), nullable=True), + sa.Column("description", sa.String(), nullable=True), + sa.Column("required", sa.Boolean(), nullable=False), + sa.Column("default_value", sa.JSON(), nullable=True), + sa.Column("created_at", sa.DateTime(), nullable=False), + sa.Column("updated_at", sa.DateTime(), nullable=False), + sa.ForeignKeyConstraint(["organization_id"], ["organizations.id"]), + sa.PrimaryKeyConstraint("id"), + sa.UniqueConstraint( + "organization_id", + "field_key", + name="uq_tcf_def_org_key", + ), + sa.CheckConstraint( + "field_type IN " + "('text','text_long','integer','decimal','boolean','date','date_time','url','json')", + name="ck_tcf_def_field_type", + ), + sa.CheckConstraint( + "ui_visibility IN ('always','if_set','hidden')", + name="ck_tcf_def_ui_visibility", + ), + ) + op.create_index( + "ix_task_custom_field_definitions_organization_id", + "task_custom_field_definitions", + ["organization_id"], + ) + op.create_index( + "ix_task_custom_field_definitions_field_key", + "task_custom_field_definitions", + ["field_key"], + ) + + op.create_table( + "board_task_custom_fields", + sa.Column("id", sa.Uuid(), nullable=False), + sa.Column("board_id", sa.Uuid(), nullable=False), + sa.Column("task_custom_field_definition_id", sa.Uuid(), nullable=False), + sa.Column("created_at", sa.DateTime(), nullable=False), + sa.ForeignKeyConstraint(["board_id"], ["boards.id"]), + sa.ForeignKeyConstraint( + ["task_custom_field_definition_id"], + ["task_custom_field_definitions.id"], + ), + sa.PrimaryKeyConstraint("id"), + sa.UniqueConstraint( + "board_id", + "task_custom_field_definition_id", + name="uq_board_tcf_binding", + ), + ) + op.create_index( + "ix_board_task_custom_fields_board_id", + "board_task_custom_fields", + ["board_id"], + ) + op.create_index( + "ix_board_task_custom_fields_task_custom_field_definition_id", + "board_task_custom_fields", + ["task_custom_field_definition_id"], + ) + + op.create_table( + "task_custom_field_values", + sa.Column("id", sa.Uuid(), nullable=False), + sa.Column("task_id", sa.Uuid(), nullable=False), + sa.Column("task_custom_field_definition_id", sa.Uuid(), nullable=False), + sa.Column("value", sa.JSON(), nullable=True), + sa.Column("created_at", sa.DateTime(), nullable=False), + sa.Column("updated_at", sa.DateTime(), nullable=False), + sa.ForeignKeyConstraint(["task_id"], ["tasks.id"]), + sa.ForeignKeyConstraint( + ["task_custom_field_definition_id"], + ["task_custom_field_definitions.id"], + ), + sa.PrimaryKeyConstraint("id"), + sa.UniqueConstraint( + "task_id", + "task_custom_field_definition_id", + name="uq_tcf_values_task_def", + ), + ) + op.create_index( + "ix_task_custom_field_values_task_id", + "task_custom_field_values", + ["task_id"], + ) + op.create_index( + "ix_task_custom_field_values_task_custom_field_definition_id", + "task_custom_field_values", + ["task_custom_field_definition_id"], + ) + + +def downgrade() -> None: + """Drop task custom field tables.""" + op.drop_table("task_custom_field_values") + op.drop_table("board_task_custom_fields") + op.drop_table("task_custom_field_definitions") diff --git a/backend/scripts/check_migration_graph.py b/backend/scripts/check_migration_graph.py index 1d159c86..13382613 100644 --- a/backend/scripts/check_migration_graph.py +++ b/backend/scripts/check_migration_graph.py @@ -43,7 +43,9 @@ def main() -> int: return 1 if len(heads) > 1 and not allow_multiple_heads: - print("ERROR: multiple Alembic heads detected (set ALLOW_MULTIPLE_HEADS=true only for intentional merge windows)") + print( + "ERROR: multiple Alembic heads detected (set ALLOW_MULTIPLE_HEADS=true only for intentional merge windows)" + ) for h in heads: print(f" - {h}") return 1 diff --git a/frontend/src/api/generated/agent/agent.ts b/frontend/src/api/generated/agent/agent.ts index b08057dc..904aa3f3 100644 --- a/frontend/src/api/generated/agent/agent.ts +++ b/frontend/src/api/generated/agent/agent.ts @@ -67,421 +67,9 @@ import { customFetch } from "../../mutator"; type SecondParameter unknown> = Parameters[1]; /** - * List boards visible to the authenticated agent. - * @summary List Boards - */ -export type listBoardsApiV1AgentBoardsGetResponse200 = { - data: LimitOffsetPageTypeVarCustomizedBoardRead; - status: 200; -}; + * List agents visible to the caller, optionally filtered by board. -export type listBoardsApiV1AgentBoardsGetResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type listBoardsApiV1AgentBoardsGetResponseSuccess = - listBoardsApiV1AgentBoardsGetResponse200 & { - headers: Headers; - }; -export type listBoardsApiV1AgentBoardsGetResponseError = - listBoardsApiV1AgentBoardsGetResponse422 & { - headers: Headers; - }; - -export type listBoardsApiV1AgentBoardsGetResponse = - | listBoardsApiV1AgentBoardsGetResponseSuccess - | listBoardsApiV1AgentBoardsGetResponseError; - -export const getListBoardsApiV1AgentBoardsGetUrl = ( - params?: ListBoardsApiV1AgentBoardsGetParams, -) => { - const normalizedParams = new URLSearchParams(); - - Object.entries(params || {}).forEach(([key, value]) => { - if (value !== undefined) { - normalizedParams.append(key, value === null ? "null" : value.toString()); - } - }); - - const stringifiedParams = normalizedParams.toString(); - - return stringifiedParams.length > 0 - ? `/api/v1/agent/boards?${stringifiedParams}` - : `/api/v1/agent/boards`; -}; - -export const listBoardsApiV1AgentBoardsGet = async ( - params?: ListBoardsApiV1AgentBoardsGetParams, - options?: RequestInit, -): Promise => { - return customFetch( - getListBoardsApiV1AgentBoardsGetUrl(params), - { - ...options, - method: "GET", - }, - ); -}; - -export const getListBoardsApiV1AgentBoardsGetQueryKey = ( - params?: ListBoardsApiV1AgentBoardsGetParams, -) => { - return [`/api/v1/agent/boards`, ...(params ? [params] : [])] as const; -}; - -export const getListBoardsApiV1AgentBoardsGetQueryOptions = < - TData = Awaited>, - TError = HTTPValidationError, ->( - params?: ListBoardsApiV1AgentBoardsGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - >; - request?: SecondParameter; - }, -) => { - const { query: queryOptions, request: requestOptions } = options ?? {}; - - const queryKey = - queryOptions?.queryKey ?? getListBoardsApiV1AgentBoardsGetQueryKey(params); - - const queryFn: QueryFunction< - Awaited> - > = ({ signal }) => - listBoardsApiV1AgentBoardsGet(params, { signal, ...requestOptions }); - - return { queryKey, queryFn, ...queryOptions } as UseQueryOptions< - Awaited>, - TError, - TData - > & { queryKey: DataTag }; -}; - -export type ListBoardsApiV1AgentBoardsGetQueryResult = NonNullable< - Awaited> ->; -export type ListBoardsApiV1AgentBoardsGetQueryError = HTTPValidationError; - -export function useListBoardsApiV1AgentBoardsGet< - TData = Awaited>, - TError = HTTPValidationError, ->( - params: undefined | ListBoardsApiV1AgentBoardsGetParams, - options: { - query: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - > & - Pick< - DefinedInitialDataOptions< - Awaited>, - TError, - Awaited> - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): DefinedUseQueryResult & { - queryKey: DataTag; -}; -export function useListBoardsApiV1AgentBoardsGet< - TData = Awaited>, - TError = HTTPValidationError, ->( - params?: ListBoardsApiV1AgentBoardsGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - > & - Pick< - UndefinedInitialDataOptions< - Awaited>, - TError, - Awaited> - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -export function useListBoardsApiV1AgentBoardsGet< - TData = Awaited>, - TError = HTTPValidationError, ->( - params?: ListBoardsApiV1AgentBoardsGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -/** - * @summary List Boards - */ - -export function useListBoardsApiV1AgentBoardsGet< - TData = Awaited>, - TError = HTTPValidationError, ->( - params?: ListBoardsApiV1AgentBoardsGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -} { - const queryOptions = getListBoardsApiV1AgentBoardsGetQueryOptions( - params, - options, - ); - - const query = useQuery(queryOptions, queryClient) as UseQueryResult< - TData, - TError - > & { queryKey: DataTag }; - - return { ...query, queryKey: queryOptions.queryKey }; -} - -/** - * Return a board if the authenticated agent can access it. - * @summary Get Board - */ -export type getBoardApiV1AgentBoardsBoardIdGetResponse200 = { - data: BoardRead; - status: 200; -}; - -export type getBoardApiV1AgentBoardsBoardIdGetResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type getBoardApiV1AgentBoardsBoardIdGetResponseSuccess = - getBoardApiV1AgentBoardsBoardIdGetResponse200 & { - headers: Headers; - }; -export type getBoardApiV1AgentBoardsBoardIdGetResponseError = - getBoardApiV1AgentBoardsBoardIdGetResponse422 & { - headers: Headers; - }; - -export type getBoardApiV1AgentBoardsBoardIdGetResponse = - | getBoardApiV1AgentBoardsBoardIdGetResponseSuccess - | getBoardApiV1AgentBoardsBoardIdGetResponseError; - -export const getGetBoardApiV1AgentBoardsBoardIdGetUrl = (boardId: string) => { - return `/api/v1/agent/boards/${boardId}`; -}; - -export const getBoardApiV1AgentBoardsBoardIdGet = async ( - boardId: string, - options?: RequestInit, -): Promise => { - return customFetch( - getGetBoardApiV1AgentBoardsBoardIdGetUrl(boardId), - { - ...options, - method: "GET", - }, - ); -}; - -export const getGetBoardApiV1AgentBoardsBoardIdGetQueryKey = ( - boardId: string, -) => { - return [`/api/v1/agent/boards/${boardId}`] as const; -}; - -export const getGetBoardApiV1AgentBoardsBoardIdGetQueryOptions = < - TData = Awaited>, - TError = HTTPValidationError, ->( - boardId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - >; - request?: SecondParameter; - }, -) => { - const { query: queryOptions, request: requestOptions } = options ?? {}; - - const queryKey = - queryOptions?.queryKey ?? - getGetBoardApiV1AgentBoardsBoardIdGetQueryKey(boardId); - - const queryFn: QueryFunction< - Awaited> - > = ({ signal }) => - getBoardApiV1AgentBoardsBoardIdGet(boardId, { signal, ...requestOptions }); - - return { - queryKey, - queryFn, - enabled: !!boardId, - ...queryOptions, - } as UseQueryOptions< - Awaited>, - TError, - TData - > & { queryKey: DataTag }; -}; - -export type GetBoardApiV1AgentBoardsBoardIdGetQueryResult = NonNullable< - Awaited> ->; -export type GetBoardApiV1AgentBoardsBoardIdGetQueryError = HTTPValidationError; - -export function useGetBoardApiV1AgentBoardsBoardIdGet< - TData = Awaited>, - TError = HTTPValidationError, ->( - boardId: string, - options: { - query: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - > & - Pick< - DefinedInitialDataOptions< - Awaited>, - TError, - Awaited> - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): DefinedUseQueryResult & { - queryKey: DataTag; -}; -export function useGetBoardApiV1AgentBoardsBoardIdGet< - TData = Awaited>, - TError = HTTPValidationError, ->( - boardId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - > & - Pick< - UndefinedInitialDataOptions< - Awaited>, - TError, - Awaited> - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -export function useGetBoardApiV1AgentBoardsBoardIdGet< - TData = Awaited>, - TError = HTTPValidationError, ->( - boardId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -/** - * @summary Get Board - */ - -export function useGetBoardApiV1AgentBoardsBoardIdGet< - TData = Awaited>, - TError = HTTPValidationError, ->( - boardId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -} { - const queryOptions = getGetBoardApiV1AgentBoardsBoardIdGetQueryOptions( - boardId, - options, - ); - - const query = useQuery(queryOptions, queryClient) as UseQueryResult< - TData, - TError - > & { queryKey: DataTag }; - - return { ...query, queryKey: queryOptions.queryKey }; -} - -/** - * List agents, optionally filtered to a board. +Useful for lead delegation and workload balancing. * @summary List Agents */ export type listAgentsApiV1AgentAgentsGetResponse200 = { @@ -692,7 +280,9 @@ export function useListAgentsApiV1AgentAgentsGet< } /** - * Create an agent on the caller's board. + * Create a new board agent as lead. + +The new agent is always forced onto the caller's board (`board_id` override). * @summary Create Agent */ export type createAgentApiV1AgentAgentsPostResponse200 = { @@ -810,7 +400,2549 @@ export const useCreateAgentApiV1AgentAgentsPost = < ); }; /** - * List tasks on a board with optional status and assignment filters. + * List boards visible to the authenticated agent. + +Board-scoped agents typically see only their assigned board. +Main agents may see multiple boards when permitted by auth scope. + * @summary List Boards + */ +export type listBoardsApiV1AgentBoardsGetResponse200 = { + data: LimitOffsetPageTypeVarCustomizedBoardRead; + status: 200; +}; + +export type listBoardsApiV1AgentBoardsGetResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type listBoardsApiV1AgentBoardsGetResponseSuccess = + listBoardsApiV1AgentBoardsGetResponse200 & { + headers: Headers; + }; +export type listBoardsApiV1AgentBoardsGetResponseError = + listBoardsApiV1AgentBoardsGetResponse422 & { + headers: Headers; + }; + +export type listBoardsApiV1AgentBoardsGetResponse = + | listBoardsApiV1AgentBoardsGetResponseSuccess + | listBoardsApiV1AgentBoardsGetResponseError; + +export const getListBoardsApiV1AgentBoardsGetUrl = ( + params?: ListBoardsApiV1AgentBoardsGetParams, +) => { + const normalizedParams = new URLSearchParams(); + + Object.entries(params || {}).forEach(([key, value]) => { + if (value !== undefined) { + normalizedParams.append(key, value === null ? "null" : value.toString()); + } + }); + + const stringifiedParams = normalizedParams.toString(); + + return stringifiedParams.length > 0 + ? `/api/v1/agent/boards?${stringifiedParams}` + : `/api/v1/agent/boards`; +}; + +export const listBoardsApiV1AgentBoardsGet = async ( + params?: ListBoardsApiV1AgentBoardsGetParams, + options?: RequestInit, +): Promise => { + return customFetch( + getListBoardsApiV1AgentBoardsGetUrl(params), + { + ...options, + method: "GET", + }, + ); +}; + +export const getListBoardsApiV1AgentBoardsGetQueryKey = ( + params?: ListBoardsApiV1AgentBoardsGetParams, +) => { + return [`/api/v1/agent/boards`, ...(params ? [params] : [])] as const; +}; + +export const getListBoardsApiV1AgentBoardsGetQueryOptions = < + TData = Awaited>, + TError = HTTPValidationError, +>( + params?: ListBoardsApiV1AgentBoardsGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + >; + request?: SecondParameter; + }, +) => { + const { query: queryOptions, request: requestOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? getListBoardsApiV1AgentBoardsGetQueryKey(params); + + const queryFn: QueryFunction< + Awaited> + > = ({ signal }) => + listBoardsApiV1AgentBoardsGet(params, { signal, ...requestOptions }); + + return { queryKey, queryFn, ...queryOptions } as UseQueryOptions< + Awaited>, + TError, + TData + > & { queryKey: DataTag }; +}; + +export type ListBoardsApiV1AgentBoardsGetQueryResult = NonNullable< + Awaited> +>; +export type ListBoardsApiV1AgentBoardsGetQueryError = HTTPValidationError; + +export function useListBoardsApiV1AgentBoardsGet< + TData = Awaited>, + TError = HTTPValidationError, +>( + params: undefined | ListBoardsApiV1AgentBoardsGetParams, + options: { + query: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + > & + Pick< + DefinedInitialDataOptions< + Awaited>, + TError, + Awaited> + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): DefinedUseQueryResult & { + queryKey: DataTag; +}; +export function useListBoardsApiV1AgentBoardsGet< + TData = Awaited>, + TError = HTTPValidationError, +>( + params?: ListBoardsApiV1AgentBoardsGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + > & + Pick< + UndefinedInitialDataOptions< + Awaited>, + TError, + Awaited> + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +export function useListBoardsApiV1AgentBoardsGet< + TData = Awaited>, + TError = HTTPValidationError, +>( + params?: ListBoardsApiV1AgentBoardsGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +/** + * @summary List Boards + */ + +export function useListBoardsApiV1AgentBoardsGet< + TData = Awaited>, + TError = HTTPValidationError, +>( + params?: ListBoardsApiV1AgentBoardsGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +} { + const queryOptions = getListBoardsApiV1AgentBoardsGetQueryOptions( + params, + options, + ); + + const query = useQuery(queryOptions, queryClient) as UseQueryResult< + TData, + TError + > & { queryKey: DataTag }; + + return { ...query, queryKey: queryOptions.queryKey }; +} + +/** + * Return one board if the authenticated agent can access it. + +Use this when an agent needs board metadata (objective, status, target date) +before planning or posting updates. + * @summary Get Board + */ +export type getBoardApiV1AgentBoardsBoardIdGetResponse200 = { + data: BoardRead; + status: 200; +}; + +export type getBoardApiV1AgentBoardsBoardIdGetResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type getBoardApiV1AgentBoardsBoardIdGetResponseSuccess = + getBoardApiV1AgentBoardsBoardIdGetResponse200 & { + headers: Headers; + }; +export type getBoardApiV1AgentBoardsBoardIdGetResponseError = + getBoardApiV1AgentBoardsBoardIdGetResponse422 & { + headers: Headers; + }; + +export type getBoardApiV1AgentBoardsBoardIdGetResponse = + | getBoardApiV1AgentBoardsBoardIdGetResponseSuccess + | getBoardApiV1AgentBoardsBoardIdGetResponseError; + +export const getGetBoardApiV1AgentBoardsBoardIdGetUrl = (boardId: string) => { + return `/api/v1/agent/boards/${boardId}`; +}; + +export const getBoardApiV1AgentBoardsBoardIdGet = async ( + boardId: string, + options?: RequestInit, +): Promise => { + return customFetch( + getGetBoardApiV1AgentBoardsBoardIdGetUrl(boardId), + { + ...options, + method: "GET", + }, + ); +}; + +export const getGetBoardApiV1AgentBoardsBoardIdGetQueryKey = ( + boardId: string, +) => { + return [`/api/v1/agent/boards/${boardId}`] as const; +}; + +export const getGetBoardApiV1AgentBoardsBoardIdGetQueryOptions = < + TData = Awaited>, + TError = HTTPValidationError, +>( + boardId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + >; + request?: SecondParameter; + }, +) => { + const { query: queryOptions, request: requestOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? + getGetBoardApiV1AgentBoardsBoardIdGetQueryKey(boardId); + + const queryFn: QueryFunction< + Awaited> + > = ({ signal }) => + getBoardApiV1AgentBoardsBoardIdGet(boardId, { signal, ...requestOptions }); + + return { + queryKey, + queryFn, + enabled: !!boardId, + ...queryOptions, + } as UseQueryOptions< + Awaited>, + TError, + TData + > & { queryKey: DataTag }; +}; + +export type GetBoardApiV1AgentBoardsBoardIdGetQueryResult = NonNullable< + Awaited> +>; +export type GetBoardApiV1AgentBoardsBoardIdGetQueryError = HTTPValidationError; + +export function useGetBoardApiV1AgentBoardsBoardIdGet< + TData = Awaited>, + TError = HTTPValidationError, +>( + boardId: string, + options: { + query: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + > & + Pick< + DefinedInitialDataOptions< + Awaited>, + TError, + Awaited> + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): DefinedUseQueryResult & { + queryKey: DataTag; +}; +export function useGetBoardApiV1AgentBoardsBoardIdGet< + TData = Awaited>, + TError = HTTPValidationError, +>( + boardId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + > & + Pick< + UndefinedInitialDataOptions< + Awaited>, + TError, + Awaited> + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +export function useGetBoardApiV1AgentBoardsBoardIdGet< + TData = Awaited>, + TError = HTTPValidationError, +>( + boardId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +/** + * @summary Get Board + */ + +export function useGetBoardApiV1AgentBoardsBoardIdGet< + TData = Awaited>, + TError = HTTPValidationError, +>( + boardId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +} { + const queryOptions = getGetBoardApiV1AgentBoardsBoardIdGetQueryOptions( + boardId, + options, + ); + + const query = useQuery(queryOptions, queryClient) as UseQueryResult< + TData, + TError + > & { queryKey: DataTag }; + + return { ...query, queryKey: queryOptions.queryKey }; +} + +/** + * Delete a board agent as board lead. + +Cleans up runtime/session state through lifecycle services. + * @summary Delete Board Agent + */ +export type deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteResponse200 = + { + data: OkResponse; + status: 200; + }; + +export type deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteResponse422 = + { + data: HTTPValidationError; + status: 422; + }; + +export type deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteResponseSuccess = + deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteResponse200 & { + headers: Headers; + }; +export type deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteResponseError = + deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteResponse422 & { + headers: Headers; + }; + +export type deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteResponse = + | deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteResponseSuccess + | deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteResponseError; + +export const getDeleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteUrl = + (boardId: string, agentId: string) => { + return `/api/v1/agent/boards/${boardId}/agents/${agentId}`; + }; + +export const deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete = + async ( + boardId: string, + agentId: string, + options?: RequestInit, + ): Promise => { + return customFetch( + getDeleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteUrl( + boardId, + agentId, + ), + { + ...options, + method: "DELETE", + }, + ); + }; + +export const getDeleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteMutationOptions = + (options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete + > + >, + TError, + { boardId: string; agentId: string }, + TContext + >; + request?: SecondParameter; + }): UseMutationOptions< + Awaited< + ReturnType< + typeof deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete + > + >, + TError, + { boardId: string; agentId: string }, + TContext + > => { + const mutationKey = [ + "deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete", + ]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited< + ReturnType< + typeof deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete + > + >, + { boardId: string; agentId: string } + > = (props) => { + const { boardId, agentId } = props ?? {}; + + return deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete( + boardId, + agentId, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; + }; + +export type DeleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteMutationResult = + NonNullable< + Awaited< + ReturnType< + typeof deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete + > + > + >; + +export type DeleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteMutationError = + HTTPValidationError; + +/** + * @summary Delete Board Agent + */ +export const useDeleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete = < + TError = HTTPValidationError, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete + > + >, + TError, + { boardId: string; agentId: string }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited< + ReturnType< + typeof deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete + > + >, + TError, + { boardId: string; agentId: string }, + TContext +> => { + return useMutation( + getDeleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteMutationOptions( + options, + ), + queryClient, + ); +}; +/** + * Send a direct nudge to one board agent. + +Lead-only endpoint for stale or blocked in-progress work. + * @summary Nudge Agent + */ +export type nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostResponse200 = + { + data: OkResponse; + status: 200; + }; + +export type nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostResponse422 = + { + data: HTTPValidationError; + status: 422; + }; + +export type nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostResponseSuccess = + nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostResponse200 & { + headers: Headers; + }; +export type nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostResponseError = + nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostResponse422 & { + headers: Headers; + }; + +export type nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostResponse = + | nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostResponseSuccess + | nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostResponseError; + +export const getNudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostUrl = ( + boardId: string, + agentId: string, +) => { + return `/api/v1/agent/boards/${boardId}/agents/${agentId}/nudge`; +}; + +export const nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePost = async ( + boardId: string, + agentId: string, + agentNudge: AgentNudge, + options?: RequestInit, +): Promise => { + return customFetch( + getNudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostUrl( + boardId, + agentId, + ), + { + ...options, + method: "POST", + headers: { "Content-Type": "application/json", ...options?.headers }, + body: JSON.stringify(agentNudge), + }, + ); +}; + +export const getNudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostMutationOptions = + (options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePost + > + >, + TError, + { boardId: string; agentId: string; data: AgentNudge }, + TContext + >; + request?: SecondParameter; + }): UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { boardId: string; agentId: string; data: AgentNudge }, + TContext + > => { + const mutationKey = [ + "nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePost", + ]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited< + ReturnType< + typeof nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePost + > + >, + { boardId: string; agentId: string; data: AgentNudge } + > = (props) => { + const { boardId, agentId, data } = props ?? {}; + + return nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePost( + boardId, + agentId, + data, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; + }; + +export type NudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostMutationResult = + NonNullable< + Awaited< + ReturnType + > + >; +export type NudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostMutationBody = + AgentNudge; +export type NudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostMutationError = + HTTPValidationError; + +/** + * @summary Nudge Agent + */ +export const useNudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePost = < + TError = HTTPValidationError, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePost + > + >, + TError, + { boardId: string; agentId: string; data: AgentNudge }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited< + ReturnType + >, + TError, + { boardId: string; agentId: string; data: AgentNudge }, + TContext +> => { + return useMutation( + getNudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostMutationOptions( + options, + ), + queryClient, + ); +}; +/** + * Fetch an agent's SOUL.md content. + +Allowed for board lead, or for an agent reading its own SOUL. + * @summary Get Agent Soul + */ +export type getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetResponse200 = + { + data: string; + status: 200; + }; + +export type getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetResponse422 = + { + data: HTTPValidationError; + status: 422; + }; + +export type getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetResponseSuccess = + getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetResponse200 & { + headers: Headers; + }; +export type getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetResponseError = + getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetResponse422 & { + headers: Headers; + }; + +export type getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetResponse = + | getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetResponseSuccess + | getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetResponseError; + +export const getGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetUrl = ( + boardId: string, + agentId: string, +) => { + return `/api/v1/agent/boards/${boardId}/agents/${agentId}/soul`; +}; + +export const getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet = async ( + boardId: string, + agentId: string, + options?: RequestInit, +): Promise => { + return customFetch( + getGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetUrl( + boardId, + agentId, + ), + { + ...options, + method: "GET", + }, + ); +}; + +export const getGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetQueryKey = + (boardId: string, agentId: string) => { + return [`/api/v1/agent/boards/${boardId}/agents/${agentId}/soul`] as const; + }; + +export const getGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetQueryOptions = + < + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, + >( + boardId: string, + agentId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType< + typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet + > + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + ) => { + const { query: queryOptions, request: requestOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? + getGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetQueryKey( + boardId, + agentId, + ); + + const queryFn: QueryFunction< + Awaited< + ReturnType< + typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet + > + > + > = ({ signal }) => + getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet( + boardId, + agentId, + { signal, ...requestOptions }, + ); + + return { + queryKey, + queryFn, + enabled: !!(boardId && agentId), + ...queryOptions, + } as UseQueryOptions< + Awaited< + ReturnType< + typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet + > + >, + TError, + TData + > & { queryKey: DataTag }; + }; + +export type GetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetQueryResult = + NonNullable< + Awaited< + ReturnType + > + >; +export type GetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetQueryError = + HTTPValidationError; + +export function useGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + agentId: string, + options: { + query: Partial< + UseQueryOptions< + Awaited< + ReturnType< + typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet + > + >, + TError, + TData + > + > & + Pick< + DefinedInitialDataOptions< + Awaited< + ReturnType< + typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet + > + >, + TError, + Awaited< + ReturnType< + typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet + > + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): DefinedUseQueryResult & { + queryKey: DataTag; +}; +export function useGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + agentId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType< + typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet + > + >, + TError, + TData + > + > & + Pick< + UndefinedInitialDataOptions< + Awaited< + ReturnType< + typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet + > + >, + TError, + Awaited< + ReturnType< + typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet + > + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +export function useGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + agentId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType< + typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet + > + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +/** + * @summary Get Agent Soul + */ + +export function useGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + agentId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType< + typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet + > + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +} { + const queryOptions = + getGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetQueryOptions( + boardId, + agentId, + options, + ); + + const query = useQuery(queryOptions, queryClient) as UseQueryResult< + TData, + TError + > & { queryKey: DataTag }; + + return { ...query, queryKey: queryOptions.queryKey }; +} + +/** + * Update an agent's SOUL.md template in DB and gateway. + +Lead-only endpoint. Persists as `soul_template` for future reprovisioning. + * @summary Update Agent Soul + */ +export type updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutResponse200 = + { + data: OkResponse; + status: 200; + }; + +export type updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutResponse422 = + { + data: HTTPValidationError; + status: 422; + }; + +export type updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutResponseSuccess = + updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutResponse200 & { + headers: Headers; + }; +export type updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutResponseError = + updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutResponse422 & { + headers: Headers; + }; + +export type updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutResponse = + | updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutResponseSuccess + | updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutResponseError; + +export const getUpdateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutUrl = + (boardId: string, agentId: string) => { + return `/api/v1/agent/boards/${boardId}/agents/${agentId}/soul`; + }; + +export const updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut = + async ( + boardId: string, + agentId: string, + soulUpdateRequest: SoulUpdateRequest, + options?: RequestInit, + ): Promise => { + return customFetch( + getUpdateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutUrl( + boardId, + agentId, + ), + { + ...options, + method: "PUT", + headers: { "Content-Type": "application/json", ...options?.headers }, + body: JSON.stringify(soulUpdateRequest), + }, + ); + }; + +export const getUpdateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutMutationOptions = + (options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut + > + >, + TError, + { boardId: string; agentId: string; data: SoulUpdateRequest }, + TContext + >; + request?: SecondParameter; + }): UseMutationOptions< + Awaited< + ReturnType< + typeof updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut + > + >, + TError, + { boardId: string; agentId: string; data: SoulUpdateRequest }, + TContext + > => { + const mutationKey = [ + "updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut", + ]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited< + ReturnType< + typeof updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut + > + >, + { boardId: string; agentId: string; data: SoulUpdateRequest } + > = (props) => { + const { boardId, agentId, data } = props ?? {}; + + return updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut( + boardId, + agentId, + data, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; + }; + +export type UpdateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutMutationResult = + NonNullable< + Awaited< + ReturnType< + typeof updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut + > + > + >; +export type UpdateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutMutationBody = + SoulUpdateRequest; +export type UpdateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutMutationError = + HTTPValidationError; + +/** + * @summary Update Agent Soul + */ +export const useUpdateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut = < + TError = HTTPValidationError, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut + > + >, + TError, + { boardId: string; agentId: string; data: SoulUpdateRequest }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited< + ReturnType< + typeof updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut + > + >, + TError, + { boardId: string; agentId: string; data: SoulUpdateRequest }, + TContext +> => { + return useMutation( + getUpdateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutMutationOptions( + options, + ), + queryClient, + ); +}; +/** + * List approvals for a board. + +Use status filtering to process pending approvals efficiently. + * @summary List Approvals + */ +export type listApprovalsApiV1AgentBoardsBoardIdApprovalsGetResponse200 = { + data: LimitOffsetPageTypeVarCustomizedApprovalRead; + status: 200; +}; + +export type listApprovalsApiV1AgentBoardsBoardIdApprovalsGetResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type listApprovalsApiV1AgentBoardsBoardIdApprovalsGetResponseSuccess = + listApprovalsApiV1AgentBoardsBoardIdApprovalsGetResponse200 & { + headers: Headers; + }; +export type listApprovalsApiV1AgentBoardsBoardIdApprovalsGetResponseError = + listApprovalsApiV1AgentBoardsBoardIdApprovalsGetResponse422 & { + headers: Headers; + }; + +export type listApprovalsApiV1AgentBoardsBoardIdApprovalsGetResponse = + | listApprovalsApiV1AgentBoardsBoardIdApprovalsGetResponseSuccess + | listApprovalsApiV1AgentBoardsBoardIdApprovalsGetResponseError; + +export const getListApprovalsApiV1AgentBoardsBoardIdApprovalsGetUrl = ( + boardId: string, + params?: ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetParams, +) => { + const normalizedParams = new URLSearchParams(); + + Object.entries(params || {}).forEach(([key, value]) => { + if (value !== undefined) { + normalizedParams.append(key, value === null ? "null" : value.toString()); + } + }); + + const stringifiedParams = normalizedParams.toString(); + + return stringifiedParams.length > 0 + ? `/api/v1/agent/boards/${boardId}/approvals?${stringifiedParams}` + : `/api/v1/agent/boards/${boardId}/approvals`; +}; + +export const listApprovalsApiV1AgentBoardsBoardIdApprovalsGet = async ( + boardId: string, + params?: ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetParams, + options?: RequestInit, +): Promise => { + return customFetch( + getListApprovalsApiV1AgentBoardsBoardIdApprovalsGetUrl(boardId, params), + { + ...options, + method: "GET", + }, + ); +}; + +export const getListApprovalsApiV1AgentBoardsBoardIdApprovalsGetQueryKey = ( + boardId: string, + params?: ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetParams, +) => { + return [ + `/api/v1/agent/boards/${boardId}/approvals`, + ...(params ? [params] : []), + ] as const; +}; + +export const getListApprovalsApiV1AgentBoardsBoardIdApprovalsGetQueryOptions = < + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + params?: ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; + }, +) => { + const { query: queryOptions, request: requestOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? + getListApprovalsApiV1AgentBoardsBoardIdApprovalsGetQueryKey( + boardId, + params, + ); + + const queryFn: QueryFunction< + Awaited> + > = ({ signal }) => + listApprovalsApiV1AgentBoardsBoardIdApprovalsGet(boardId, params, { + signal, + ...requestOptions, + }); + + return { + queryKey, + queryFn, + enabled: !!boardId, + ...queryOptions, + } as UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > & { queryKey: DataTag }; +}; + +export type ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetQueryResult = + NonNullable< + Awaited> + >; +export type ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetQueryError = + HTTPValidationError; + +export function useListApprovalsApiV1AgentBoardsBoardIdApprovalsGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + params: undefined | ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetParams, + options: { + query: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + > & + Pick< + DefinedInitialDataOptions< + Awaited< + ReturnType + >, + TError, + Awaited< + ReturnType + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): DefinedUseQueryResult & { + queryKey: DataTag; +}; +export function useListApprovalsApiV1AgentBoardsBoardIdApprovalsGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + params?: ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + > & + Pick< + UndefinedInitialDataOptions< + Awaited< + ReturnType + >, + TError, + Awaited< + ReturnType + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +export function useListApprovalsApiV1AgentBoardsBoardIdApprovalsGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + params?: ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +/** + * @summary List Approvals + */ + +export function useListApprovalsApiV1AgentBoardsBoardIdApprovalsGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + params?: ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +} { + const queryOptions = + getListApprovalsApiV1AgentBoardsBoardIdApprovalsGetQueryOptions( + boardId, + params, + options, + ); + + const query = useQuery(queryOptions, queryClient) as UseQueryResult< + TData, + TError + > & { queryKey: DataTag }; + + return { ...query, queryKey: queryOptions.queryKey }; +} + +/** + * Create an approval request for risky or low-confidence actions. + +Include `task_id` or `task_ids` to scope the decision precisely. + * @summary Create Approval + */ +export type createApprovalApiV1AgentBoardsBoardIdApprovalsPostResponse200 = { + data: ApprovalRead; + status: 200; +}; + +export type createApprovalApiV1AgentBoardsBoardIdApprovalsPostResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type createApprovalApiV1AgentBoardsBoardIdApprovalsPostResponseSuccess = + createApprovalApiV1AgentBoardsBoardIdApprovalsPostResponse200 & { + headers: Headers; + }; +export type createApprovalApiV1AgentBoardsBoardIdApprovalsPostResponseError = + createApprovalApiV1AgentBoardsBoardIdApprovalsPostResponse422 & { + headers: Headers; + }; + +export type createApprovalApiV1AgentBoardsBoardIdApprovalsPostResponse = + | createApprovalApiV1AgentBoardsBoardIdApprovalsPostResponseSuccess + | createApprovalApiV1AgentBoardsBoardIdApprovalsPostResponseError; + +export const getCreateApprovalApiV1AgentBoardsBoardIdApprovalsPostUrl = ( + boardId: string, +) => { + return `/api/v1/agent/boards/${boardId}/approvals`; +}; + +export const createApprovalApiV1AgentBoardsBoardIdApprovalsPost = async ( + boardId: string, + approvalCreate: ApprovalCreate, + options?: RequestInit, +): Promise => { + return customFetch( + getCreateApprovalApiV1AgentBoardsBoardIdApprovalsPostUrl(boardId), + { + ...options, + method: "POST", + headers: { "Content-Type": "application/json", ...options?.headers }, + body: JSON.stringify(approvalCreate), + }, + ); +}; + +export const getCreateApprovalApiV1AgentBoardsBoardIdApprovalsPostMutationOptions = + (options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { boardId: string; data: ApprovalCreate }, + TContext + >; + request?: SecondParameter; + }): UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { boardId: string; data: ApprovalCreate }, + TContext + > => { + const mutationKey = ["createApprovalApiV1AgentBoardsBoardIdApprovalsPost"]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited< + ReturnType + >, + { boardId: string; data: ApprovalCreate } + > = (props) => { + const { boardId, data } = props ?? {}; + + return createApprovalApiV1AgentBoardsBoardIdApprovalsPost( + boardId, + data, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; + }; + +export type CreateApprovalApiV1AgentBoardsBoardIdApprovalsPostMutationResult = + NonNullable< + Awaited< + ReturnType + > + >; +export type CreateApprovalApiV1AgentBoardsBoardIdApprovalsPostMutationBody = + ApprovalCreate; +export type CreateApprovalApiV1AgentBoardsBoardIdApprovalsPostMutationError = + HTTPValidationError; + +/** + * @summary Create Approval + */ +export const useCreateApprovalApiV1AgentBoardsBoardIdApprovalsPost = < + TError = HTTPValidationError, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { boardId: string; data: ApprovalCreate }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited< + ReturnType + >, + TError, + { boardId: string; data: ApprovalCreate }, + TContext +> => { + return useMutation( + getCreateApprovalApiV1AgentBoardsBoardIdApprovalsPostMutationOptions( + options, + ), + queryClient, + ); +}; +/** + * Ask the human via gateway-main external channels. + +Lead-only endpoint for situations where board chat is not responsive. + * @summary Ask User Via Gateway Main + */ +export type askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostResponse200 = + { + data: GatewayMainAskUserResponse; + status: 200; + }; + +export type askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostResponse422 = + { + data: HTTPValidationError; + status: 422; + }; + +export type askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostResponseSuccess = + askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostResponse200 & { + headers: Headers; + }; +export type askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostResponseError = + askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostResponse422 & { + headers: Headers; + }; + +export type askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostResponse = + + | askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostResponseSuccess + | askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostResponseError; + +export const getAskUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostUrl = + (boardId: string) => { + return `/api/v1/agent/boards/${boardId}/gateway/main/ask-user`; + }; + +export const askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost = + async ( + boardId: string, + gatewayMainAskUserRequest: GatewayMainAskUserRequest, + options?: RequestInit, + ): Promise => { + return customFetch( + getAskUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostUrl( + boardId, + ), + { + ...options, + method: "POST", + headers: { "Content-Type": "application/json", ...options?.headers }, + body: JSON.stringify(gatewayMainAskUserRequest), + }, + ); + }; + +export const getAskUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostMutationOptions = + (options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost + > + >, + TError, + { boardId: string; data: GatewayMainAskUserRequest }, + TContext + >; + request?: SecondParameter; + }): UseMutationOptions< + Awaited< + ReturnType< + typeof askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost + > + >, + TError, + { boardId: string; data: GatewayMainAskUserRequest }, + TContext + > => { + const mutationKey = [ + "askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost", + ]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited< + ReturnType< + typeof askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost + > + >, + { boardId: string; data: GatewayMainAskUserRequest } + > = (props) => { + const { boardId, data } = props ?? {}; + + return askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost( + boardId, + data, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; + }; + +export type AskUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostMutationResult = + NonNullable< + Awaited< + ReturnType< + typeof askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost + > + > + >; +export type AskUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostMutationBody = + GatewayMainAskUserRequest; +export type AskUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostMutationError = + HTTPValidationError; + +/** + * @summary Ask User Via Gateway Main + */ +export const useAskUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost = + ( + options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost + > + >, + TError, + { boardId: string; data: GatewayMainAskUserRequest }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, + ): UseMutationResult< + Awaited< + ReturnType< + typeof askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost + > + >, + TError, + { boardId: string; data: GatewayMainAskUserRequest }, + TContext + > => { + return useMutation( + getAskUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostMutationOptions( + options, + ), + queryClient, + ); + }; +/** + * List board memory with optional chat filtering. + +Use `is_chat=false` for durable context and `is_chat=true` for board chat. + * @summary List Board Memory + */ +export type listBoardMemoryApiV1AgentBoardsBoardIdMemoryGetResponse200 = { + data: LimitOffsetPageTypeVarCustomizedBoardMemoryRead; + status: 200; +}; + +export type listBoardMemoryApiV1AgentBoardsBoardIdMemoryGetResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type listBoardMemoryApiV1AgentBoardsBoardIdMemoryGetResponseSuccess = + listBoardMemoryApiV1AgentBoardsBoardIdMemoryGetResponse200 & { + headers: Headers; + }; +export type listBoardMemoryApiV1AgentBoardsBoardIdMemoryGetResponseError = + listBoardMemoryApiV1AgentBoardsBoardIdMemoryGetResponse422 & { + headers: Headers; + }; + +export type listBoardMemoryApiV1AgentBoardsBoardIdMemoryGetResponse = + | listBoardMemoryApiV1AgentBoardsBoardIdMemoryGetResponseSuccess + | listBoardMemoryApiV1AgentBoardsBoardIdMemoryGetResponseError; + +export const getListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetUrl = ( + boardId: string, + params?: ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetParams, +) => { + const normalizedParams = new URLSearchParams(); + + Object.entries(params || {}).forEach(([key, value]) => { + if (value !== undefined) { + normalizedParams.append(key, value === null ? "null" : value.toString()); + } + }); + + const stringifiedParams = normalizedParams.toString(); + + return stringifiedParams.length > 0 + ? `/api/v1/agent/boards/${boardId}/memory?${stringifiedParams}` + : `/api/v1/agent/boards/${boardId}/memory`; +}; + +export const listBoardMemoryApiV1AgentBoardsBoardIdMemoryGet = async ( + boardId: string, + params?: ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetParams, + options?: RequestInit, +): Promise => { + return customFetch( + getListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetUrl(boardId, params), + { + ...options, + method: "GET", + }, + ); +}; + +export const getListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetQueryKey = ( + boardId: string, + params?: ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetParams, +) => { + return [ + `/api/v1/agent/boards/${boardId}/memory`, + ...(params ? [params] : []), + ] as const; +}; + +export const getListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetQueryOptions = < + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + params?: ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; + }, +) => { + const { query: queryOptions, request: requestOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? + getListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetQueryKey(boardId, params); + + const queryFn: QueryFunction< + Awaited> + > = ({ signal }) => + listBoardMemoryApiV1AgentBoardsBoardIdMemoryGet(boardId, params, { + signal, + ...requestOptions, + }); + + return { + queryKey, + queryFn, + enabled: !!boardId, + ...queryOptions, + } as UseQueryOptions< + Awaited>, + TError, + TData + > & { queryKey: DataTag }; +}; + +export type ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetQueryResult = + NonNullable< + Awaited> + >; +export type ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetQueryError = + HTTPValidationError; + +export function useListBoardMemoryApiV1AgentBoardsBoardIdMemoryGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + params: undefined | ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetParams, + options: { + query: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + > & + Pick< + DefinedInitialDataOptions< + Awaited< + ReturnType + >, + TError, + Awaited< + ReturnType + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): DefinedUseQueryResult & { + queryKey: DataTag; +}; +export function useListBoardMemoryApiV1AgentBoardsBoardIdMemoryGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + params?: ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + > & + Pick< + UndefinedInitialDataOptions< + Awaited< + ReturnType + >, + TError, + Awaited< + ReturnType + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +export function useListBoardMemoryApiV1AgentBoardsBoardIdMemoryGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + params?: ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +/** + * @summary List Board Memory + */ + +export function useListBoardMemoryApiV1AgentBoardsBoardIdMemoryGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + params?: ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +} { + const queryOptions = + getListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetQueryOptions( + boardId, + params, + options, + ); + + const query = useQuery(queryOptions, queryClient) as UseQueryResult< + TData, + TError + > & { queryKey: DataTag }; + + return { ...query, queryKey: queryOptions.queryKey }; +} + +/** + * Create a board memory entry. + +Use tags to indicate purpose (e.g. `chat`, `decision`, `plan`, `handoff`). + * @summary Create Board Memory + */ +export type createBoardMemoryApiV1AgentBoardsBoardIdMemoryPostResponse200 = { + data: BoardMemoryRead; + status: 200; +}; + +export type createBoardMemoryApiV1AgentBoardsBoardIdMemoryPostResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type createBoardMemoryApiV1AgentBoardsBoardIdMemoryPostResponseSuccess = + createBoardMemoryApiV1AgentBoardsBoardIdMemoryPostResponse200 & { + headers: Headers; + }; +export type createBoardMemoryApiV1AgentBoardsBoardIdMemoryPostResponseError = + createBoardMemoryApiV1AgentBoardsBoardIdMemoryPostResponse422 & { + headers: Headers; + }; + +export type createBoardMemoryApiV1AgentBoardsBoardIdMemoryPostResponse = + | createBoardMemoryApiV1AgentBoardsBoardIdMemoryPostResponseSuccess + | createBoardMemoryApiV1AgentBoardsBoardIdMemoryPostResponseError; + +export const getCreateBoardMemoryApiV1AgentBoardsBoardIdMemoryPostUrl = ( + boardId: string, +) => { + return `/api/v1/agent/boards/${boardId}/memory`; +}; + +export const createBoardMemoryApiV1AgentBoardsBoardIdMemoryPost = async ( + boardId: string, + boardMemoryCreate: BoardMemoryCreate, + options?: RequestInit, +): Promise => { + return customFetch( + getCreateBoardMemoryApiV1AgentBoardsBoardIdMemoryPostUrl(boardId), + { + ...options, + method: "POST", + headers: { "Content-Type": "application/json", ...options?.headers }, + body: JSON.stringify(boardMemoryCreate), + }, + ); +}; + +export const getCreateBoardMemoryApiV1AgentBoardsBoardIdMemoryPostMutationOptions = + (options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { boardId: string; data: BoardMemoryCreate }, + TContext + >; + request?: SecondParameter; + }): UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { boardId: string; data: BoardMemoryCreate }, + TContext + > => { + const mutationKey = ["createBoardMemoryApiV1AgentBoardsBoardIdMemoryPost"]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited< + ReturnType + >, + { boardId: string; data: BoardMemoryCreate } + > = (props) => { + const { boardId, data } = props ?? {}; + + return createBoardMemoryApiV1AgentBoardsBoardIdMemoryPost( + boardId, + data, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; + }; + +export type CreateBoardMemoryApiV1AgentBoardsBoardIdMemoryPostMutationResult = + NonNullable< + Awaited< + ReturnType + > + >; +export type CreateBoardMemoryApiV1AgentBoardsBoardIdMemoryPostMutationBody = + BoardMemoryCreate; +export type CreateBoardMemoryApiV1AgentBoardsBoardIdMemoryPostMutationError = + HTTPValidationError; + +/** + * @summary Create Board Memory + */ +export const useCreateBoardMemoryApiV1AgentBoardsBoardIdMemoryPost = < + TError = HTTPValidationError, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { boardId: string; data: BoardMemoryCreate }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited< + ReturnType + >, + TError, + { boardId: string; data: BoardMemoryCreate }, + TContext +> => { + return useMutation( + getCreateBoardMemoryApiV1AgentBoardsBoardIdMemoryPostMutationOptions( + options, + ), + queryClient, + ); +}; +/** + * Apply board onboarding updates from an agent workflow. + +Used during structured objective/success-metric intake loops. + * @summary Update Onboarding + */ +export type updateOnboardingApiV1AgentBoardsBoardIdOnboardingPostResponse200 = { + data: BoardOnboardingRead; + status: 200; +}; + +export type updateOnboardingApiV1AgentBoardsBoardIdOnboardingPostResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type updateOnboardingApiV1AgentBoardsBoardIdOnboardingPostResponseSuccess = + updateOnboardingApiV1AgentBoardsBoardIdOnboardingPostResponse200 & { + headers: Headers; + }; +export type updateOnboardingApiV1AgentBoardsBoardIdOnboardingPostResponseError = + updateOnboardingApiV1AgentBoardsBoardIdOnboardingPostResponse422 & { + headers: Headers; + }; + +export type updateOnboardingApiV1AgentBoardsBoardIdOnboardingPostResponse = + | updateOnboardingApiV1AgentBoardsBoardIdOnboardingPostResponseSuccess + | updateOnboardingApiV1AgentBoardsBoardIdOnboardingPostResponseError; + +export const getUpdateOnboardingApiV1AgentBoardsBoardIdOnboardingPostUrl = ( + boardId: string, +) => { + return `/api/v1/agent/boards/${boardId}/onboarding`; +}; + +export const updateOnboardingApiV1AgentBoardsBoardIdOnboardingPost = async ( + boardId: string, + boardOnboardingAgentCompleteBoardOnboardingAgentQuestion: + | BoardOnboardingAgentComplete + | BoardOnboardingAgentQuestion, + options?: RequestInit, +): Promise => { + return customFetch( + getUpdateOnboardingApiV1AgentBoardsBoardIdOnboardingPostUrl(boardId), + { + ...options, + method: "POST", + headers: { "Content-Type": "application/json", ...options?.headers }, + body: JSON.stringify( + boardOnboardingAgentCompleteBoardOnboardingAgentQuestion, + ), + }, + ); +}; + +export const getUpdateOnboardingApiV1AgentBoardsBoardIdOnboardingPostMutationOptions = + (options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { + boardId: string; + data: BoardOnboardingAgentComplete | BoardOnboardingAgentQuestion; + }, + TContext + >; + request?: SecondParameter; + }): UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { + boardId: string; + data: BoardOnboardingAgentComplete | BoardOnboardingAgentQuestion; + }, + TContext + > => { + const mutationKey = [ + "updateOnboardingApiV1AgentBoardsBoardIdOnboardingPost", + ]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited< + ReturnType + >, + { + boardId: string; + data: BoardOnboardingAgentComplete | BoardOnboardingAgentQuestion; + } + > = (props) => { + const { boardId, data } = props ?? {}; + + return updateOnboardingApiV1AgentBoardsBoardIdOnboardingPost( + boardId, + data, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; + }; + +export type UpdateOnboardingApiV1AgentBoardsBoardIdOnboardingPostMutationResult = + NonNullable< + Awaited< + ReturnType + > + >; +export type UpdateOnboardingApiV1AgentBoardsBoardIdOnboardingPostMutationBody = + | BoardOnboardingAgentComplete + | BoardOnboardingAgentQuestion; +export type UpdateOnboardingApiV1AgentBoardsBoardIdOnboardingPostMutationError = + HTTPValidationError; + +/** + * @summary Update Onboarding + */ +export const useUpdateOnboardingApiV1AgentBoardsBoardIdOnboardingPost = < + TError = HTTPValidationError, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { + boardId: string; + data: BoardOnboardingAgentComplete | BoardOnboardingAgentQuestion; + }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited< + ReturnType + >, + TError, + { + boardId: string; + data: BoardOnboardingAgentComplete | BoardOnboardingAgentQuestion; + }, + TContext +> => { + return useMutation( + getUpdateOnboardingApiV1AgentBoardsBoardIdOnboardingPostMutationOptions( + options, + ), + queryClient, + ); +}; +/** + * List available tags for the board's organization. + +Use returned ids in task create/update payloads (`tag_ids`). + * @summary List Tags + */ +export type listTagsApiV1AgentBoardsBoardIdTagsGetResponse200 = { + data: TagRef[]; + status: 200; +}; + +export type listTagsApiV1AgentBoardsBoardIdTagsGetResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type listTagsApiV1AgentBoardsBoardIdTagsGetResponseSuccess = + listTagsApiV1AgentBoardsBoardIdTagsGetResponse200 & { + headers: Headers; + }; +export type listTagsApiV1AgentBoardsBoardIdTagsGetResponseError = + listTagsApiV1AgentBoardsBoardIdTagsGetResponse422 & { + headers: Headers; + }; + +export type listTagsApiV1AgentBoardsBoardIdTagsGetResponse = + | listTagsApiV1AgentBoardsBoardIdTagsGetResponseSuccess + | listTagsApiV1AgentBoardsBoardIdTagsGetResponseError; + +export const getListTagsApiV1AgentBoardsBoardIdTagsGetUrl = ( + boardId: string, +) => { + return `/api/v1/agent/boards/${boardId}/tags`; +}; + +export const listTagsApiV1AgentBoardsBoardIdTagsGet = async ( + boardId: string, + options?: RequestInit, +): Promise => { + return customFetch( + getListTagsApiV1AgentBoardsBoardIdTagsGetUrl(boardId), + { + ...options, + method: "GET", + }, + ); +}; + +export const getListTagsApiV1AgentBoardsBoardIdTagsGetQueryKey = ( + boardId: string, +) => { + return [`/api/v1/agent/boards/${boardId}/tags`] as const; +}; + +export const getListTagsApiV1AgentBoardsBoardIdTagsGetQueryOptions = < + TData = Awaited>, + TError = HTTPValidationError, +>( + boardId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + >; + request?: SecondParameter; + }, +) => { + const { query: queryOptions, request: requestOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? + getListTagsApiV1AgentBoardsBoardIdTagsGetQueryKey(boardId); + + const queryFn: QueryFunction< + Awaited> + > = ({ signal }) => + listTagsApiV1AgentBoardsBoardIdTagsGet(boardId, { + signal, + ...requestOptions, + }); + + return { + queryKey, + queryFn, + enabled: !!boardId, + ...queryOptions, + } as UseQueryOptions< + Awaited>, + TError, + TData + > & { queryKey: DataTag }; +}; + +export type ListTagsApiV1AgentBoardsBoardIdTagsGetQueryResult = NonNullable< + Awaited> +>; +export type ListTagsApiV1AgentBoardsBoardIdTagsGetQueryError = + HTTPValidationError; + +export function useListTagsApiV1AgentBoardsBoardIdTagsGet< + TData = Awaited>, + TError = HTTPValidationError, +>( + boardId: string, + options: { + query: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + > & + Pick< + DefinedInitialDataOptions< + Awaited>, + TError, + Awaited> + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): DefinedUseQueryResult & { + queryKey: DataTag; +}; +export function useListTagsApiV1AgentBoardsBoardIdTagsGet< + TData = Awaited>, + TError = HTTPValidationError, +>( + boardId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + > & + Pick< + UndefinedInitialDataOptions< + Awaited>, + TError, + Awaited> + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +export function useListTagsApiV1AgentBoardsBoardIdTagsGet< + TData = Awaited>, + TError = HTTPValidationError, +>( + boardId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +/** + * @summary List Tags + */ + +export function useListTagsApiV1AgentBoardsBoardIdTagsGet< + TData = Awaited>, + TError = HTTPValidationError, +>( + boardId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +} { + const queryOptions = getListTagsApiV1AgentBoardsBoardIdTagsGetQueryOptions( + boardId, + options, + ); + + const query = useQuery(queryOptions, queryClient) as UseQueryResult< + TData, + TError + > & { queryKey: DataTag }; + + return { ...query, queryKey: queryOptions.queryKey }; +} + +/** + * List tasks on a board with status/assignment filters. + +Common patterns: +- worker: fetch assigned inbox/in-progress tasks +- lead: fetch unassigned inbox tasks for delegation * @summary List Tasks */ export type listTasksApiV1AgentBoardsBoardIdTasksGetResponse200 = { @@ -1043,7 +3175,10 @@ export function useListTasksApiV1AgentBoardsBoardIdTasksGet< } /** - * Create a task on the board as the lead agent. + * Create a task as the board lead. + +Lead-only endpoint. Supports dependency-aware creation via +`depends_on_task_ids`, optional `tag_ids`, and `custom_field_values`. * @summary Create Task */ export type createTaskApiV1AgentBoardsBoardIdTasksPostResponse200 = { @@ -1170,216 +3305,9 @@ export const useCreateTaskApiV1AgentBoardsBoardIdTasksPost = < ); }; /** - * List tags available to the board's organization. - * @summary List Tags - */ -export type listTagsApiV1AgentBoardsBoardIdTagsGetResponse200 = { - data: TagRef[]; - status: 200; -}; + * Update a task after board-level authorization checks. -export type listTagsApiV1AgentBoardsBoardIdTagsGetResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type listTagsApiV1AgentBoardsBoardIdTagsGetResponseSuccess = - listTagsApiV1AgentBoardsBoardIdTagsGetResponse200 & { - headers: Headers; - }; -export type listTagsApiV1AgentBoardsBoardIdTagsGetResponseError = - listTagsApiV1AgentBoardsBoardIdTagsGetResponse422 & { - headers: Headers; - }; - -export type listTagsApiV1AgentBoardsBoardIdTagsGetResponse = - | listTagsApiV1AgentBoardsBoardIdTagsGetResponseSuccess - | listTagsApiV1AgentBoardsBoardIdTagsGetResponseError; - -export const getListTagsApiV1AgentBoardsBoardIdTagsGetUrl = ( - boardId: string, -) => { - return `/api/v1/agent/boards/${boardId}/tags`; -}; - -export const listTagsApiV1AgentBoardsBoardIdTagsGet = async ( - boardId: string, - options?: RequestInit, -): Promise => { - return customFetch( - getListTagsApiV1AgentBoardsBoardIdTagsGetUrl(boardId), - { - ...options, - method: "GET", - }, - ); -}; - -export const getListTagsApiV1AgentBoardsBoardIdTagsGetQueryKey = ( - boardId: string, -) => { - return [`/api/v1/agent/boards/${boardId}/tags`] as const; -}; - -export const getListTagsApiV1AgentBoardsBoardIdTagsGetQueryOptions = < - TData = Awaited>, - TError = HTTPValidationError, ->( - boardId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - >; - request?: SecondParameter; - }, -) => { - const { query: queryOptions, request: requestOptions } = options ?? {}; - - const queryKey = - queryOptions?.queryKey ?? - getListTagsApiV1AgentBoardsBoardIdTagsGetQueryKey(boardId); - - const queryFn: QueryFunction< - Awaited> - > = ({ signal }) => - listTagsApiV1AgentBoardsBoardIdTagsGet(boardId, { - signal, - ...requestOptions, - }); - - return { - queryKey, - queryFn, - enabled: !!boardId, - ...queryOptions, - } as UseQueryOptions< - Awaited>, - TError, - TData - > & { queryKey: DataTag }; -}; - -export type ListTagsApiV1AgentBoardsBoardIdTagsGetQueryResult = NonNullable< - Awaited> ->; -export type ListTagsApiV1AgentBoardsBoardIdTagsGetQueryError = - HTTPValidationError; - -export function useListTagsApiV1AgentBoardsBoardIdTagsGet< - TData = Awaited>, - TError = HTTPValidationError, ->( - boardId: string, - options: { - query: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - > & - Pick< - DefinedInitialDataOptions< - Awaited>, - TError, - Awaited> - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): DefinedUseQueryResult & { - queryKey: DataTag; -}; -export function useListTagsApiV1AgentBoardsBoardIdTagsGet< - TData = Awaited>, - TError = HTTPValidationError, ->( - boardId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - > & - Pick< - UndefinedInitialDataOptions< - Awaited>, - TError, - Awaited> - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -export function useListTagsApiV1AgentBoardsBoardIdTagsGet< - TData = Awaited>, - TError = HTTPValidationError, ->( - boardId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -/** - * @summary List Tags - */ - -export function useListTagsApiV1AgentBoardsBoardIdTagsGet< - TData = Awaited>, - TError = HTTPValidationError, ->( - boardId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -} { - const queryOptions = getListTagsApiV1AgentBoardsBoardIdTagsGetQueryOptions( - boardId, - options, - ); - - const query = useQuery(queryOptions, queryClient) as UseQueryResult< - TData, - TError - > & { queryKey: DataTag }; - - return { ...query, queryKey: queryOptions.queryKey }; -} - -/** - * Update a task after board-level access checks. +Supports status, assignment, dependencies, and optional inline comment. * @summary Update Task */ export type updateTaskApiV1AgentBoardsBoardIdTasksTaskIdPatchResponse200 = { @@ -1520,7 +3448,9 @@ export const useUpdateTaskApiV1AgentBoardsBoardIdTasksTaskIdPatch = < ); }; /** - * List comments for a task visible to the authenticated agent. + * List task comments visible to the authenticated agent. + +Read this before posting updates to avoid duplicate or low-value comments. * @summary List Task Comments */ export type listTaskCommentsApiV1AgentBoardsBoardIdTasksTaskIdCommentsGetResponse200 = @@ -1854,7 +3784,9 @@ export function useListTaskCommentsApiV1AgentBoardsBoardIdTasksTaskIdCommentsGet } /** - * Create a task comment on behalf of the authenticated agent. + * Create a task comment as the authenticated agent. + +This is the primary collaboration/log surface for task progress. * @summary Create Task Comment */ export type createTaskCommentApiV1AgentBoardsBoardIdTasksTaskIdCommentsPostResponse200 = @@ -2014,2014 +3946,7 @@ export const useCreateTaskCommentApiV1AgentBoardsBoardIdTasksTaskIdCommentsPost ); }; /** - * List board memory entries with optional chat filtering. - * @summary List Board Memory - */ -export type listBoardMemoryApiV1AgentBoardsBoardIdMemoryGetResponse200 = { - data: LimitOffsetPageTypeVarCustomizedBoardMemoryRead; - status: 200; -}; - -export type listBoardMemoryApiV1AgentBoardsBoardIdMemoryGetResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type listBoardMemoryApiV1AgentBoardsBoardIdMemoryGetResponseSuccess = - listBoardMemoryApiV1AgentBoardsBoardIdMemoryGetResponse200 & { - headers: Headers; - }; -export type listBoardMemoryApiV1AgentBoardsBoardIdMemoryGetResponseError = - listBoardMemoryApiV1AgentBoardsBoardIdMemoryGetResponse422 & { - headers: Headers; - }; - -export type listBoardMemoryApiV1AgentBoardsBoardIdMemoryGetResponse = - | listBoardMemoryApiV1AgentBoardsBoardIdMemoryGetResponseSuccess - | listBoardMemoryApiV1AgentBoardsBoardIdMemoryGetResponseError; - -export const getListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetUrl = ( - boardId: string, - params?: ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetParams, -) => { - const normalizedParams = new URLSearchParams(); - - Object.entries(params || {}).forEach(([key, value]) => { - if (value !== undefined) { - normalizedParams.append(key, value === null ? "null" : value.toString()); - } - }); - - const stringifiedParams = normalizedParams.toString(); - - return stringifiedParams.length > 0 - ? `/api/v1/agent/boards/${boardId}/memory?${stringifiedParams}` - : `/api/v1/agent/boards/${boardId}/memory`; -}; - -export const listBoardMemoryApiV1AgentBoardsBoardIdMemoryGet = async ( - boardId: string, - params?: ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetParams, - options?: RequestInit, -): Promise => { - return customFetch( - getListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetUrl(boardId, params), - { - ...options, - method: "GET", - }, - ); -}; - -export const getListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetQueryKey = ( - boardId: string, - params?: ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetParams, -) => { - return [ - `/api/v1/agent/boards/${boardId}/memory`, - ...(params ? [params] : []), - ] as const; -}; - -export const getListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetQueryOptions = < - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - params?: ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; - }, -) => { - const { query: queryOptions, request: requestOptions } = options ?? {}; - - const queryKey = - queryOptions?.queryKey ?? - getListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetQueryKey(boardId, params); - - const queryFn: QueryFunction< - Awaited> - > = ({ signal }) => - listBoardMemoryApiV1AgentBoardsBoardIdMemoryGet(boardId, params, { - signal, - ...requestOptions, - }); - - return { - queryKey, - queryFn, - enabled: !!boardId, - ...queryOptions, - } as UseQueryOptions< - Awaited>, - TError, - TData - > & { queryKey: DataTag }; -}; - -export type ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetQueryResult = - NonNullable< - Awaited> - >; -export type ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetQueryError = - HTTPValidationError; - -export function useListBoardMemoryApiV1AgentBoardsBoardIdMemoryGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - params: undefined | ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetParams, - options: { - query: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - > & - Pick< - DefinedInitialDataOptions< - Awaited< - ReturnType - >, - TError, - Awaited< - ReturnType - > - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): DefinedUseQueryResult & { - queryKey: DataTag; -}; -export function useListBoardMemoryApiV1AgentBoardsBoardIdMemoryGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - params?: ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - > & - Pick< - UndefinedInitialDataOptions< - Awaited< - ReturnType - >, - TError, - Awaited< - ReturnType - > - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -export function useListBoardMemoryApiV1AgentBoardsBoardIdMemoryGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - params?: ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -/** - * @summary List Board Memory - */ - -export function useListBoardMemoryApiV1AgentBoardsBoardIdMemoryGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - params?: ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -} { - const queryOptions = - getListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetQueryOptions( - boardId, - params, - options, - ); - - const query = useQuery(queryOptions, queryClient) as UseQueryResult< - TData, - TError - > & { queryKey: DataTag }; - - return { ...query, queryKey: queryOptions.queryKey }; -} - -/** - * Create a board memory entry. - * @summary Create Board Memory - */ -export type createBoardMemoryApiV1AgentBoardsBoardIdMemoryPostResponse200 = { - data: BoardMemoryRead; - status: 200; -}; - -export type createBoardMemoryApiV1AgentBoardsBoardIdMemoryPostResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type createBoardMemoryApiV1AgentBoardsBoardIdMemoryPostResponseSuccess = - createBoardMemoryApiV1AgentBoardsBoardIdMemoryPostResponse200 & { - headers: Headers; - }; -export type createBoardMemoryApiV1AgentBoardsBoardIdMemoryPostResponseError = - createBoardMemoryApiV1AgentBoardsBoardIdMemoryPostResponse422 & { - headers: Headers; - }; - -export type createBoardMemoryApiV1AgentBoardsBoardIdMemoryPostResponse = - | createBoardMemoryApiV1AgentBoardsBoardIdMemoryPostResponseSuccess - | createBoardMemoryApiV1AgentBoardsBoardIdMemoryPostResponseError; - -export const getCreateBoardMemoryApiV1AgentBoardsBoardIdMemoryPostUrl = ( - boardId: string, -) => { - return `/api/v1/agent/boards/${boardId}/memory`; -}; - -export const createBoardMemoryApiV1AgentBoardsBoardIdMemoryPost = async ( - boardId: string, - boardMemoryCreate: BoardMemoryCreate, - options?: RequestInit, -): Promise => { - return customFetch( - getCreateBoardMemoryApiV1AgentBoardsBoardIdMemoryPostUrl(boardId), - { - ...options, - method: "POST", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(boardMemoryCreate), - }, - ); -}; - -export const getCreateBoardMemoryApiV1AgentBoardsBoardIdMemoryPostMutationOptions = - (options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType - >, - TError, - { boardId: string; data: BoardMemoryCreate }, - TContext - >; - request?: SecondParameter; - }): UseMutationOptions< - Awaited< - ReturnType - >, - TError, - { boardId: string; data: BoardMemoryCreate }, - TContext - > => { - const mutationKey = ["createBoardMemoryApiV1AgentBoardsBoardIdMemoryPost"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited< - ReturnType - >, - { boardId: string; data: BoardMemoryCreate } - > = (props) => { - const { boardId, data } = props ?? {}; - - return createBoardMemoryApiV1AgentBoardsBoardIdMemoryPost( - boardId, - data, - requestOptions, - ); - }; - - return { mutationFn, ...mutationOptions }; - }; - -export type CreateBoardMemoryApiV1AgentBoardsBoardIdMemoryPostMutationResult = - NonNullable< - Awaited< - ReturnType - > - >; -export type CreateBoardMemoryApiV1AgentBoardsBoardIdMemoryPostMutationBody = - BoardMemoryCreate; -export type CreateBoardMemoryApiV1AgentBoardsBoardIdMemoryPostMutationError = - HTTPValidationError; - -/** - * @summary Create Board Memory - */ -export const useCreateBoardMemoryApiV1AgentBoardsBoardIdMemoryPost = < - TError = HTTPValidationError, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType - >, - TError, - { boardId: string; data: BoardMemoryCreate }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited< - ReturnType - >, - TError, - { boardId: string; data: BoardMemoryCreate }, - TContext -> => { - return useMutation( - getCreateBoardMemoryApiV1AgentBoardsBoardIdMemoryPostMutationOptions( - options, - ), - queryClient, - ); -}; -/** - * List approvals for a board. - * @summary List Approvals - */ -export type listApprovalsApiV1AgentBoardsBoardIdApprovalsGetResponse200 = { - data: LimitOffsetPageTypeVarCustomizedApprovalRead; - status: 200; -}; - -export type listApprovalsApiV1AgentBoardsBoardIdApprovalsGetResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type listApprovalsApiV1AgentBoardsBoardIdApprovalsGetResponseSuccess = - listApprovalsApiV1AgentBoardsBoardIdApprovalsGetResponse200 & { - headers: Headers; - }; -export type listApprovalsApiV1AgentBoardsBoardIdApprovalsGetResponseError = - listApprovalsApiV1AgentBoardsBoardIdApprovalsGetResponse422 & { - headers: Headers; - }; - -export type listApprovalsApiV1AgentBoardsBoardIdApprovalsGetResponse = - | listApprovalsApiV1AgentBoardsBoardIdApprovalsGetResponseSuccess - | listApprovalsApiV1AgentBoardsBoardIdApprovalsGetResponseError; - -export const getListApprovalsApiV1AgentBoardsBoardIdApprovalsGetUrl = ( - boardId: string, - params?: ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetParams, -) => { - const normalizedParams = new URLSearchParams(); - - Object.entries(params || {}).forEach(([key, value]) => { - if (value !== undefined) { - normalizedParams.append(key, value === null ? "null" : value.toString()); - } - }); - - const stringifiedParams = normalizedParams.toString(); - - return stringifiedParams.length > 0 - ? `/api/v1/agent/boards/${boardId}/approvals?${stringifiedParams}` - : `/api/v1/agent/boards/${boardId}/approvals`; -}; - -export const listApprovalsApiV1AgentBoardsBoardIdApprovalsGet = async ( - boardId: string, - params?: ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetParams, - options?: RequestInit, -): Promise => { - return customFetch( - getListApprovalsApiV1AgentBoardsBoardIdApprovalsGetUrl(boardId, params), - { - ...options, - method: "GET", - }, - ); -}; - -export const getListApprovalsApiV1AgentBoardsBoardIdApprovalsGetQueryKey = ( - boardId: string, - params?: ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetParams, -) => { - return [ - `/api/v1/agent/boards/${boardId}/approvals`, - ...(params ? [params] : []), - ] as const; -}; - -export const getListApprovalsApiV1AgentBoardsBoardIdApprovalsGetQueryOptions = < - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - params?: ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; - }, -) => { - const { query: queryOptions, request: requestOptions } = options ?? {}; - - const queryKey = - queryOptions?.queryKey ?? - getListApprovalsApiV1AgentBoardsBoardIdApprovalsGetQueryKey( - boardId, - params, - ); - - const queryFn: QueryFunction< - Awaited> - > = ({ signal }) => - listApprovalsApiV1AgentBoardsBoardIdApprovalsGet(boardId, params, { - signal, - ...requestOptions, - }); - - return { - queryKey, - queryFn, - enabled: !!boardId, - ...queryOptions, - } as UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > & { queryKey: DataTag }; -}; - -export type ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetQueryResult = - NonNullable< - Awaited> - >; -export type ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetQueryError = - HTTPValidationError; - -export function useListApprovalsApiV1AgentBoardsBoardIdApprovalsGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - params: undefined | ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetParams, - options: { - query: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - > & - Pick< - DefinedInitialDataOptions< - Awaited< - ReturnType - >, - TError, - Awaited< - ReturnType - > - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): DefinedUseQueryResult & { - queryKey: DataTag; -}; -export function useListApprovalsApiV1AgentBoardsBoardIdApprovalsGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - params?: ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - > & - Pick< - UndefinedInitialDataOptions< - Awaited< - ReturnType - >, - TError, - Awaited< - ReturnType - > - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -export function useListApprovalsApiV1AgentBoardsBoardIdApprovalsGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - params?: ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -/** - * @summary List Approvals - */ - -export function useListApprovalsApiV1AgentBoardsBoardIdApprovalsGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - params?: ListApprovalsApiV1AgentBoardsBoardIdApprovalsGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -} { - const queryOptions = - getListApprovalsApiV1AgentBoardsBoardIdApprovalsGetQueryOptions( - boardId, - params, - options, - ); - - const query = useQuery(queryOptions, queryClient) as UseQueryResult< - TData, - TError - > & { queryKey: DataTag }; - - return { ...query, queryKey: queryOptions.queryKey }; -} - -/** - * Create a board approval request. - * @summary Create Approval - */ -export type createApprovalApiV1AgentBoardsBoardIdApprovalsPostResponse200 = { - data: ApprovalRead; - status: 200; -}; - -export type createApprovalApiV1AgentBoardsBoardIdApprovalsPostResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type createApprovalApiV1AgentBoardsBoardIdApprovalsPostResponseSuccess = - createApprovalApiV1AgentBoardsBoardIdApprovalsPostResponse200 & { - headers: Headers; - }; -export type createApprovalApiV1AgentBoardsBoardIdApprovalsPostResponseError = - createApprovalApiV1AgentBoardsBoardIdApprovalsPostResponse422 & { - headers: Headers; - }; - -export type createApprovalApiV1AgentBoardsBoardIdApprovalsPostResponse = - | createApprovalApiV1AgentBoardsBoardIdApprovalsPostResponseSuccess - | createApprovalApiV1AgentBoardsBoardIdApprovalsPostResponseError; - -export const getCreateApprovalApiV1AgentBoardsBoardIdApprovalsPostUrl = ( - boardId: string, -) => { - return `/api/v1/agent/boards/${boardId}/approvals`; -}; - -export const createApprovalApiV1AgentBoardsBoardIdApprovalsPost = async ( - boardId: string, - approvalCreate: ApprovalCreate, - options?: RequestInit, -): Promise => { - return customFetch( - getCreateApprovalApiV1AgentBoardsBoardIdApprovalsPostUrl(boardId), - { - ...options, - method: "POST", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(approvalCreate), - }, - ); -}; - -export const getCreateApprovalApiV1AgentBoardsBoardIdApprovalsPostMutationOptions = - (options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType - >, - TError, - { boardId: string; data: ApprovalCreate }, - TContext - >; - request?: SecondParameter; - }): UseMutationOptions< - Awaited< - ReturnType - >, - TError, - { boardId: string; data: ApprovalCreate }, - TContext - > => { - const mutationKey = ["createApprovalApiV1AgentBoardsBoardIdApprovalsPost"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited< - ReturnType - >, - { boardId: string; data: ApprovalCreate } - > = (props) => { - const { boardId, data } = props ?? {}; - - return createApprovalApiV1AgentBoardsBoardIdApprovalsPost( - boardId, - data, - requestOptions, - ); - }; - - return { mutationFn, ...mutationOptions }; - }; - -export type CreateApprovalApiV1AgentBoardsBoardIdApprovalsPostMutationResult = - NonNullable< - Awaited< - ReturnType - > - >; -export type CreateApprovalApiV1AgentBoardsBoardIdApprovalsPostMutationBody = - ApprovalCreate; -export type CreateApprovalApiV1AgentBoardsBoardIdApprovalsPostMutationError = - HTTPValidationError; - -/** - * @summary Create Approval - */ -export const useCreateApprovalApiV1AgentBoardsBoardIdApprovalsPost = < - TError = HTTPValidationError, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType - >, - TError, - { boardId: string; data: ApprovalCreate }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited< - ReturnType - >, - TError, - { boardId: string; data: ApprovalCreate }, - TContext -> => { - return useMutation( - getCreateApprovalApiV1AgentBoardsBoardIdApprovalsPostMutationOptions( - options, - ), - queryClient, - ); -}; -/** - * Apply onboarding updates for a board. - * @summary Update Onboarding - */ -export type updateOnboardingApiV1AgentBoardsBoardIdOnboardingPostResponse200 = { - data: BoardOnboardingRead; - status: 200; -}; - -export type updateOnboardingApiV1AgentBoardsBoardIdOnboardingPostResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type updateOnboardingApiV1AgentBoardsBoardIdOnboardingPostResponseSuccess = - updateOnboardingApiV1AgentBoardsBoardIdOnboardingPostResponse200 & { - headers: Headers; - }; -export type updateOnboardingApiV1AgentBoardsBoardIdOnboardingPostResponseError = - updateOnboardingApiV1AgentBoardsBoardIdOnboardingPostResponse422 & { - headers: Headers; - }; - -export type updateOnboardingApiV1AgentBoardsBoardIdOnboardingPostResponse = - | updateOnboardingApiV1AgentBoardsBoardIdOnboardingPostResponseSuccess - | updateOnboardingApiV1AgentBoardsBoardIdOnboardingPostResponseError; - -export const getUpdateOnboardingApiV1AgentBoardsBoardIdOnboardingPostUrl = ( - boardId: string, -) => { - return `/api/v1/agent/boards/${boardId}/onboarding`; -}; - -export const updateOnboardingApiV1AgentBoardsBoardIdOnboardingPost = async ( - boardId: string, - boardOnboardingAgentCompleteBoardOnboardingAgentQuestion: - | BoardOnboardingAgentComplete - | BoardOnboardingAgentQuestion, - options?: RequestInit, -): Promise => { - return customFetch( - getUpdateOnboardingApiV1AgentBoardsBoardIdOnboardingPostUrl(boardId), - { - ...options, - method: "POST", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify( - boardOnboardingAgentCompleteBoardOnboardingAgentQuestion, - ), - }, - ); -}; - -export const getUpdateOnboardingApiV1AgentBoardsBoardIdOnboardingPostMutationOptions = - (options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType - >, - TError, - { - boardId: string; - data: BoardOnboardingAgentComplete | BoardOnboardingAgentQuestion; - }, - TContext - >; - request?: SecondParameter; - }): UseMutationOptions< - Awaited< - ReturnType - >, - TError, - { - boardId: string; - data: BoardOnboardingAgentComplete | BoardOnboardingAgentQuestion; - }, - TContext - > => { - const mutationKey = [ - "updateOnboardingApiV1AgentBoardsBoardIdOnboardingPost", - ]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited< - ReturnType - >, - { - boardId: string; - data: BoardOnboardingAgentComplete | BoardOnboardingAgentQuestion; - } - > = (props) => { - const { boardId, data } = props ?? {}; - - return updateOnboardingApiV1AgentBoardsBoardIdOnboardingPost( - boardId, - data, - requestOptions, - ); - }; - - return { mutationFn, ...mutationOptions }; - }; - -export type UpdateOnboardingApiV1AgentBoardsBoardIdOnboardingPostMutationResult = - NonNullable< - Awaited< - ReturnType - > - >; -export type UpdateOnboardingApiV1AgentBoardsBoardIdOnboardingPostMutationBody = - | BoardOnboardingAgentComplete - | BoardOnboardingAgentQuestion; -export type UpdateOnboardingApiV1AgentBoardsBoardIdOnboardingPostMutationError = - HTTPValidationError; - -/** - * @summary Update Onboarding - */ -export const useUpdateOnboardingApiV1AgentBoardsBoardIdOnboardingPost = < - TError = HTTPValidationError, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType - >, - TError, - { - boardId: string; - data: BoardOnboardingAgentComplete | BoardOnboardingAgentQuestion; - }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited< - ReturnType - >, - TError, - { - boardId: string; - data: BoardOnboardingAgentComplete | BoardOnboardingAgentQuestion; - }, - TContext -> => { - return useMutation( - getUpdateOnboardingApiV1AgentBoardsBoardIdOnboardingPostMutationOptions( - options, - ), - queryClient, - ); -}; -/** - * Send a direct nudge message to a board agent. - * @summary Nudge Agent - */ -export type nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostResponse200 = - { - data: OkResponse; - status: 200; - }; - -export type nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostResponse422 = - { - data: HTTPValidationError; - status: 422; - }; - -export type nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostResponseSuccess = - nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostResponse200 & { - headers: Headers; - }; -export type nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostResponseError = - nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostResponse422 & { - headers: Headers; - }; - -export type nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostResponse = - | nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostResponseSuccess - | nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostResponseError; - -export const getNudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostUrl = ( - boardId: string, - agentId: string, -) => { - return `/api/v1/agent/boards/${boardId}/agents/${agentId}/nudge`; -}; - -export const nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePost = async ( - boardId: string, - agentId: string, - agentNudge: AgentNudge, - options?: RequestInit, -): Promise => { - return customFetch( - getNudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostUrl( - boardId, - agentId, - ), - { - ...options, - method: "POST", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(agentNudge), - }, - ); -}; - -export const getNudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostMutationOptions = - (options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType< - typeof nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePost - > - >, - TError, - { boardId: string; agentId: string; data: AgentNudge }, - TContext - >; - request?: SecondParameter; - }): UseMutationOptions< - Awaited< - ReturnType - >, - TError, - { boardId: string; agentId: string; data: AgentNudge }, - TContext - > => { - const mutationKey = [ - "nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePost", - ]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited< - ReturnType< - typeof nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePost - > - >, - { boardId: string; agentId: string; data: AgentNudge } - > = (props) => { - const { boardId, agentId, data } = props ?? {}; - - return nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePost( - boardId, - agentId, - data, - requestOptions, - ); - }; - - return { mutationFn, ...mutationOptions }; - }; - -export type NudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostMutationResult = - NonNullable< - Awaited< - ReturnType - > - >; -export type NudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostMutationBody = - AgentNudge; -export type NudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostMutationError = - HTTPValidationError; - -/** - * @summary Nudge Agent - */ -export const useNudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePost = < - TError = HTTPValidationError, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType< - typeof nudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePost - > - >, - TError, - { boardId: string; agentId: string; data: AgentNudge }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited< - ReturnType - >, - TError, - { boardId: string; agentId: string; data: AgentNudge }, - TContext -> => { - return useMutation( - getNudgeAgentApiV1AgentBoardsBoardIdAgentsAgentIdNudgePostMutationOptions( - options, - ), - queryClient, - ); -}; -/** - * Record heartbeat status for the authenticated agent. - * @summary Agent Heartbeat - */ -export type agentHeartbeatApiV1AgentHeartbeatPostResponse200 = { - data: AgentRead; - status: 200; -}; - -export type agentHeartbeatApiV1AgentHeartbeatPostResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type agentHeartbeatApiV1AgentHeartbeatPostResponseSuccess = - agentHeartbeatApiV1AgentHeartbeatPostResponse200 & { - headers: Headers; - }; -export type agentHeartbeatApiV1AgentHeartbeatPostResponseError = - agentHeartbeatApiV1AgentHeartbeatPostResponse422 & { - headers: Headers; - }; - -export type agentHeartbeatApiV1AgentHeartbeatPostResponse = - | agentHeartbeatApiV1AgentHeartbeatPostResponseSuccess - | agentHeartbeatApiV1AgentHeartbeatPostResponseError; - -export const getAgentHeartbeatApiV1AgentHeartbeatPostUrl = () => { - return `/api/v1/agent/heartbeat`; -}; - -export const agentHeartbeatApiV1AgentHeartbeatPost = async ( - agentHeartbeatCreate: AgentHeartbeatCreate, - options?: RequestInit, -): Promise => { - return customFetch( - getAgentHeartbeatApiV1AgentHeartbeatPostUrl(), - { - ...options, - method: "POST", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(agentHeartbeatCreate), - }, - ); -}; - -export const getAgentHeartbeatApiV1AgentHeartbeatPostMutationOptions = < - TError = HTTPValidationError, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { data: AgentHeartbeatCreate }, - TContext - >; - request?: SecondParameter; -}): UseMutationOptions< - Awaited>, - TError, - { data: AgentHeartbeatCreate }, - TContext -> => { - const mutationKey = ["agentHeartbeatApiV1AgentHeartbeatPost"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited>, - { data: AgentHeartbeatCreate } - > = (props) => { - const { data } = props ?? {}; - - return agentHeartbeatApiV1AgentHeartbeatPost(data, requestOptions); - }; - - return { mutationFn, ...mutationOptions }; -}; - -export type AgentHeartbeatApiV1AgentHeartbeatPostMutationResult = NonNullable< - Awaited> ->; -export type AgentHeartbeatApiV1AgentHeartbeatPostMutationBody = - AgentHeartbeatCreate; -export type AgentHeartbeatApiV1AgentHeartbeatPostMutationError = - HTTPValidationError; - -/** - * @summary Agent Heartbeat - */ -export const useAgentHeartbeatApiV1AgentHeartbeatPost = < - TError = HTTPValidationError, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { data: AgentHeartbeatCreate }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited>, - TError, - { data: AgentHeartbeatCreate }, - TContext -> => { - return useMutation( - getAgentHeartbeatApiV1AgentHeartbeatPostMutationOptions(options), - queryClient, - ); -}; -/** - * Fetch the target agent's SOUL.md content from the gateway. - * @summary Get Agent Soul - */ -export type getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetResponse200 = - { - data: string; - status: 200; - }; - -export type getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetResponse422 = - { - data: HTTPValidationError; - status: 422; - }; - -export type getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetResponseSuccess = - getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetResponse200 & { - headers: Headers; - }; -export type getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetResponseError = - getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetResponse422 & { - headers: Headers; - }; - -export type getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetResponse = - | getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetResponseSuccess - | getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetResponseError; - -export const getGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetUrl = ( - boardId: string, - agentId: string, -) => { - return `/api/v1/agent/boards/${boardId}/agents/${agentId}/soul`; -}; - -export const getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet = async ( - boardId: string, - agentId: string, - options?: RequestInit, -): Promise => { - return customFetch( - getGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetUrl( - boardId, - agentId, - ), - { - ...options, - method: "GET", - }, - ); -}; - -export const getGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetQueryKey = - (boardId: string, agentId: string) => { - return [`/api/v1/agent/boards/${boardId}/agents/${agentId}/soul`] as const; - }; - -export const getGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetQueryOptions = - < - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, - >( - boardId: string, - agentId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType< - typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet - > - >, - TError, - TData - > - >; - request?: SecondParameter; - }, - ) => { - const { query: queryOptions, request: requestOptions } = options ?? {}; - - const queryKey = - queryOptions?.queryKey ?? - getGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetQueryKey( - boardId, - agentId, - ); - - const queryFn: QueryFunction< - Awaited< - ReturnType< - typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet - > - > - > = ({ signal }) => - getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet( - boardId, - agentId, - { signal, ...requestOptions }, - ); - - return { - queryKey, - queryFn, - enabled: !!(boardId && agentId), - ...queryOptions, - } as UseQueryOptions< - Awaited< - ReturnType< - typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet - > - >, - TError, - TData - > & { queryKey: DataTag }; - }; - -export type GetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetQueryResult = - NonNullable< - Awaited< - ReturnType - > - >; -export type GetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetQueryError = - HTTPValidationError; - -export function useGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - agentId: string, - options: { - query: Partial< - UseQueryOptions< - Awaited< - ReturnType< - typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet - > - >, - TError, - TData - > - > & - Pick< - DefinedInitialDataOptions< - Awaited< - ReturnType< - typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet - > - >, - TError, - Awaited< - ReturnType< - typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet - > - > - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): DefinedUseQueryResult & { - queryKey: DataTag; -}; -export function useGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - agentId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType< - typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet - > - >, - TError, - TData - > - > & - Pick< - UndefinedInitialDataOptions< - Awaited< - ReturnType< - typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet - > - >, - TError, - Awaited< - ReturnType< - typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet - > - > - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -export function useGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - agentId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType< - typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet - > - >, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -/** - * @summary Get Agent Soul - */ - -export function useGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - agentId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType< - typeof getAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGet - > - >, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -} { - const queryOptions = - getGetAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulGetQueryOptions( - boardId, - agentId, - options, - ); - - const query = useQuery(queryOptions, queryClient) as UseQueryResult< - TData, - TError - > & { queryKey: DataTag }; - - return { ...query, queryKey: queryOptions.queryKey }; -} - -/** - * Update an agent's SOUL.md content in DB and gateway. - * @summary Update Agent Soul - */ -export type updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutResponse200 = - { - data: OkResponse; - status: 200; - }; - -export type updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutResponse422 = - { - data: HTTPValidationError; - status: 422; - }; - -export type updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutResponseSuccess = - updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutResponse200 & { - headers: Headers; - }; -export type updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutResponseError = - updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutResponse422 & { - headers: Headers; - }; - -export type updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutResponse = - | updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutResponseSuccess - | updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutResponseError; - -export const getUpdateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutUrl = - (boardId: string, agentId: string) => { - return `/api/v1/agent/boards/${boardId}/agents/${agentId}/soul`; - }; - -export const updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut = - async ( - boardId: string, - agentId: string, - soulUpdateRequest: SoulUpdateRequest, - options?: RequestInit, - ): Promise => { - return customFetch( - getUpdateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutUrl( - boardId, - agentId, - ), - { - ...options, - method: "PUT", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(soulUpdateRequest), - }, - ); - }; - -export const getUpdateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutMutationOptions = - (options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType< - typeof updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut - > - >, - TError, - { boardId: string; agentId: string; data: SoulUpdateRequest }, - TContext - >; - request?: SecondParameter; - }): UseMutationOptions< - Awaited< - ReturnType< - typeof updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut - > - >, - TError, - { boardId: string; agentId: string; data: SoulUpdateRequest }, - TContext - > => { - const mutationKey = [ - "updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut", - ]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited< - ReturnType< - typeof updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut - > - >, - { boardId: string; agentId: string; data: SoulUpdateRequest } - > = (props) => { - const { boardId, agentId, data } = props ?? {}; - - return updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut( - boardId, - agentId, - data, - requestOptions, - ); - }; - - return { mutationFn, ...mutationOptions }; - }; - -export type UpdateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutMutationResult = - NonNullable< - Awaited< - ReturnType< - typeof updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut - > - > - >; -export type UpdateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutMutationBody = - SoulUpdateRequest; -export type UpdateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutMutationError = - HTTPValidationError; - -/** - * @summary Update Agent Soul - */ -export const useUpdateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut = < - TError = HTTPValidationError, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType< - typeof updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut - > - >, - TError, - { boardId: string; agentId: string; data: SoulUpdateRequest }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited< - ReturnType< - typeof updateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPut - > - >, - TError, - { boardId: string; agentId: string; data: SoulUpdateRequest }, - TContext -> => { - return useMutation( - getUpdateAgentSoulApiV1AgentBoardsBoardIdAgentsAgentIdSoulPutMutationOptions( - options, - ), - queryClient, - ); -}; -/** - * Delete a board agent as the board lead. - * @summary Delete Board Agent - */ -export type deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteResponse200 = - { - data: OkResponse; - status: 200; - }; - -export type deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteResponse422 = - { - data: HTTPValidationError; - status: 422; - }; - -export type deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteResponseSuccess = - deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteResponse200 & { - headers: Headers; - }; -export type deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteResponseError = - deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteResponse422 & { - headers: Headers; - }; - -export type deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteResponse = - | deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteResponseSuccess - | deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteResponseError; - -export const getDeleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteUrl = - (boardId: string, agentId: string) => { - return `/api/v1/agent/boards/${boardId}/agents/${agentId}`; - }; - -export const deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete = - async ( - boardId: string, - agentId: string, - options?: RequestInit, - ): Promise => { - return customFetch( - getDeleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteUrl( - boardId, - agentId, - ), - { - ...options, - method: "DELETE", - }, - ); - }; - -export const getDeleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteMutationOptions = - (options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType< - typeof deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete - > - >, - TError, - { boardId: string; agentId: string }, - TContext - >; - request?: SecondParameter; - }): UseMutationOptions< - Awaited< - ReturnType< - typeof deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete - > - >, - TError, - { boardId: string; agentId: string }, - TContext - > => { - const mutationKey = [ - "deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete", - ]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited< - ReturnType< - typeof deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete - > - >, - { boardId: string; agentId: string } - > = (props) => { - const { boardId, agentId } = props ?? {}; - - return deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete( - boardId, - agentId, - requestOptions, - ); - }; - - return { mutationFn, ...mutationOptions }; - }; - -export type DeleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteMutationResult = - NonNullable< - Awaited< - ReturnType< - typeof deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete - > - > - >; - -export type DeleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteMutationError = - HTTPValidationError; - -/** - * @summary Delete Board Agent - */ -export const useDeleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete = < - TError = HTTPValidationError, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType< - typeof deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete - > - >, - TError, - { boardId: string; agentId: string }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited< - ReturnType< - typeof deleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDelete - > - >, - TError, - { boardId: string; agentId: string }, - TContext -> => { - return useMutation( - getDeleteBoardAgentApiV1AgentBoardsBoardIdAgentsAgentIdDeleteMutationOptions( - options, - ), - queryClient, - ); -}; -/** - * Route a lead's ask-user request through the dedicated gateway agent. - * @summary Ask User Via Gateway Main - */ -export type askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostResponse200 = - { - data: GatewayMainAskUserResponse; - status: 200; - }; - -export type askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostResponse422 = - { - data: HTTPValidationError; - status: 422; - }; - -export type askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostResponseSuccess = - askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostResponse200 & { - headers: Headers; - }; -export type askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostResponseError = - askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostResponse422 & { - headers: Headers; - }; - -export type askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostResponse = - - | askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostResponseSuccess - | askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostResponseError; - -export const getAskUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostUrl = - (boardId: string) => { - return `/api/v1/agent/boards/${boardId}/gateway/main/ask-user`; - }; - -export const askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost = - async ( - boardId: string, - gatewayMainAskUserRequest: GatewayMainAskUserRequest, - options?: RequestInit, - ): Promise => { - return customFetch( - getAskUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostUrl( - boardId, - ), - { - ...options, - method: "POST", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(gatewayMainAskUserRequest), - }, - ); - }; - -export const getAskUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostMutationOptions = - (options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType< - typeof askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost - > - >, - TError, - { boardId: string; data: GatewayMainAskUserRequest }, - TContext - >; - request?: SecondParameter; - }): UseMutationOptions< - Awaited< - ReturnType< - typeof askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost - > - >, - TError, - { boardId: string; data: GatewayMainAskUserRequest }, - TContext - > => { - const mutationKey = [ - "askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost", - ]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited< - ReturnType< - typeof askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost - > - >, - { boardId: string; data: GatewayMainAskUserRequest } - > = (props) => { - const { boardId, data } = props ?? {}; - - return askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost( - boardId, - data, - requestOptions, - ); - }; - - return { mutationFn, ...mutationOptions }; - }; - -export type AskUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostMutationResult = - NonNullable< - Awaited< - ReturnType< - typeof askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost - > - > - >; -export type AskUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostMutationBody = - GatewayMainAskUserRequest; -export type AskUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostMutationError = - HTTPValidationError; - -/** - * @summary Ask User Via Gateway Main - */ -export const useAskUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost = - ( - options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType< - typeof askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost - > - >, - TError, - { boardId: string; data: GatewayMainAskUserRequest }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, - ): UseMutationResult< - Awaited< - ReturnType< - typeof askUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPost - > - >, - TError, - { boardId: string; data: GatewayMainAskUserRequest }, - TContext - > => { - return useMutation( - getAskUserViaGatewayMainApiV1AgentBoardsBoardIdGatewayMainAskUserPostMutationOptions( - options, - ), - queryClient, - ); - }; -/** - * Send a gateway-main message to a single board lead agent. + * Send a gateway-main control message to one board lead. * @summary Message Gateway Board Lead */ export type messageGatewayBoardLeadApiV1AgentGatewayBoardsBoardIdLeadMessagePostResponse200 = @@ -4178,7 +4103,7 @@ export const useMessageGatewayBoardLeadApiV1AgentGatewayBoardsBoardIdLeadMessage ); }; /** - * Broadcast a gateway-main message to multiple board leads. + * Broadcast a gateway-main control message to multiple board leads. * @summary Broadcast Gateway Lead Message */ export type broadcastGatewayLeadMessageApiV1AgentGatewayLeadsBroadcastPostResponse200 = @@ -4330,3 +4255,125 @@ export const useBroadcastGatewayLeadMessageApiV1AgentGatewayLeadsBroadcastPost = queryClient, ); }; +/** + * Record heartbeat status for the authenticated agent. + +Heartbeats are identity-bound to the token's agent id. + * @summary Agent Heartbeat + */ +export type agentHeartbeatApiV1AgentHeartbeatPostResponse200 = { + data: AgentRead; + status: 200; +}; + +export type agentHeartbeatApiV1AgentHeartbeatPostResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type agentHeartbeatApiV1AgentHeartbeatPostResponseSuccess = + agentHeartbeatApiV1AgentHeartbeatPostResponse200 & { + headers: Headers; + }; +export type agentHeartbeatApiV1AgentHeartbeatPostResponseError = + agentHeartbeatApiV1AgentHeartbeatPostResponse422 & { + headers: Headers; + }; + +export type agentHeartbeatApiV1AgentHeartbeatPostResponse = + | agentHeartbeatApiV1AgentHeartbeatPostResponseSuccess + | agentHeartbeatApiV1AgentHeartbeatPostResponseError; + +export const getAgentHeartbeatApiV1AgentHeartbeatPostUrl = () => { + return `/api/v1/agent/heartbeat`; +}; + +export const agentHeartbeatApiV1AgentHeartbeatPost = async ( + agentHeartbeatCreate: AgentHeartbeatCreate, + options?: RequestInit, +): Promise => { + return customFetch( + getAgentHeartbeatApiV1AgentHeartbeatPostUrl(), + { + ...options, + method: "POST", + headers: { "Content-Type": "application/json", ...options?.headers }, + body: JSON.stringify(agentHeartbeatCreate), + }, + ); +}; + +export const getAgentHeartbeatApiV1AgentHeartbeatPostMutationOptions = < + TError = HTTPValidationError, + TContext = unknown, +>(options?: { + mutation?: UseMutationOptions< + Awaited>, + TError, + { data: AgentHeartbeatCreate }, + TContext + >; + request?: SecondParameter; +}): UseMutationOptions< + Awaited>, + TError, + { data: AgentHeartbeatCreate }, + TContext +> => { + const mutationKey = ["agentHeartbeatApiV1AgentHeartbeatPost"]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited>, + { data: AgentHeartbeatCreate } + > = (props) => { + const { data } = props ?? {}; + + return agentHeartbeatApiV1AgentHeartbeatPost(data, requestOptions); + }; + + return { mutationFn, ...mutationOptions }; +}; + +export type AgentHeartbeatApiV1AgentHeartbeatPostMutationResult = NonNullable< + Awaited> +>; +export type AgentHeartbeatApiV1AgentHeartbeatPostMutationBody = + AgentHeartbeatCreate; +export type AgentHeartbeatApiV1AgentHeartbeatPostMutationError = + HTTPValidationError; + +/** + * @summary Agent Heartbeat + */ +export const useAgentHeartbeatApiV1AgentHeartbeatPost = < + TError = HTTPValidationError, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited>, + TError, + { data: AgentHeartbeatCreate }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited>, + TError, + { data: AgentHeartbeatCreate }, + TContext +> => { + return useMutation( + getAgentHeartbeatApiV1AgentHeartbeatPostMutationOptions(options), + queryClient, + ); +}; diff --git a/frontend/src/api/generated/agents/agents.ts b/frontend/src/api/generated/agents/agents.ts index ede3ec2f..81822c55 100644 --- a/frontend/src/api/generated/agents/agents.ts +++ b/frontend/src/api/generated/agents/agents.ts @@ -364,6 +364,134 @@ export const useCreateAgentApiV1AgentsPost = < queryClient, ); }; +/** + * Heartbeat an existing agent or create/provision one if needed. + * @summary Heartbeat Or Create Agent + */ +export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse200 = { + data: AgentRead; + status: 200; +}; + +export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponseSuccess = + heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse200 & { + headers: Headers; + }; +export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponseError = + heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse422 & { + headers: Headers; + }; + +export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse = + | heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponseSuccess + | heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponseError; + +export const getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostUrl = () => { + return `/api/v1/agents/heartbeat`; +}; + +export const heartbeatOrCreateAgentApiV1AgentsHeartbeatPost = async ( + agentHeartbeatCreate: AgentHeartbeatCreate, + options?: RequestInit, +): Promise => { + return customFetch( + getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostUrl(), + { + ...options, + method: "POST", + headers: { "Content-Type": "application/json", ...options?.headers }, + body: JSON.stringify(agentHeartbeatCreate), + }, + ); +}; + +export const getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationOptions = + (options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { data: AgentHeartbeatCreate }, + TContext + >; + request?: SecondParameter; + }): UseMutationOptions< + Awaited>, + TError, + { data: AgentHeartbeatCreate }, + TContext + > => { + const mutationKey = ["heartbeatOrCreateAgentApiV1AgentsHeartbeatPost"]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited< + ReturnType + >, + { data: AgentHeartbeatCreate } + > = (props) => { + const { data } = props ?? {}; + + return heartbeatOrCreateAgentApiV1AgentsHeartbeatPost( + data, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; + }; + +export type HeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationResult = + NonNullable< + Awaited> + >; +export type HeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationBody = + AgentHeartbeatCreate; +export type HeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationError = + HTTPValidationError; + +/** + * @summary Heartbeat Or Create Agent + */ +export const useHeartbeatOrCreateAgentApiV1AgentsHeartbeatPost = < + TError = HTTPValidationError, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { data: AgentHeartbeatCreate }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited>, + TError, + { data: AgentHeartbeatCreate }, + TContext +> => { + return useMutation( + getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationOptions(options), + queryClient, + ); +}; /** * Stream agent updates as SSE events. * @summary Stream Agents @@ -576,6 +704,123 @@ export function useStreamAgentsApiV1AgentsStreamGet< return { ...query, queryKey: queryOptions.queryKey }; } +/** + * Delete an agent and clean related task state. + * @summary Delete Agent + */ +export type deleteAgentApiV1AgentsAgentIdDeleteResponse200 = { + data: OkResponse; + status: 200; +}; + +export type deleteAgentApiV1AgentsAgentIdDeleteResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type deleteAgentApiV1AgentsAgentIdDeleteResponseSuccess = + deleteAgentApiV1AgentsAgentIdDeleteResponse200 & { + headers: Headers; + }; +export type deleteAgentApiV1AgentsAgentIdDeleteResponseError = + deleteAgentApiV1AgentsAgentIdDeleteResponse422 & { + headers: Headers; + }; + +export type deleteAgentApiV1AgentsAgentIdDeleteResponse = + | deleteAgentApiV1AgentsAgentIdDeleteResponseSuccess + | deleteAgentApiV1AgentsAgentIdDeleteResponseError; + +export const getDeleteAgentApiV1AgentsAgentIdDeleteUrl = (agentId: string) => { + return `/api/v1/agents/${agentId}`; +}; + +export const deleteAgentApiV1AgentsAgentIdDelete = async ( + agentId: string, + options?: RequestInit, +): Promise => { + return customFetch( + getDeleteAgentApiV1AgentsAgentIdDeleteUrl(agentId), + { + ...options, + method: "DELETE", + }, + ); +}; + +export const getDeleteAgentApiV1AgentsAgentIdDeleteMutationOptions = < + TError = HTTPValidationError, + TContext = unknown, +>(options?: { + mutation?: UseMutationOptions< + Awaited>, + TError, + { agentId: string }, + TContext + >; + request?: SecondParameter; +}): UseMutationOptions< + Awaited>, + TError, + { agentId: string }, + TContext +> => { + const mutationKey = ["deleteAgentApiV1AgentsAgentIdDelete"]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited>, + { agentId: string } + > = (props) => { + const { agentId } = props ?? {}; + + return deleteAgentApiV1AgentsAgentIdDelete(agentId, requestOptions); + }; + + return { mutationFn, ...mutationOptions }; +}; + +export type DeleteAgentApiV1AgentsAgentIdDeleteMutationResult = NonNullable< + Awaited> +>; + +export type DeleteAgentApiV1AgentsAgentIdDeleteMutationError = + HTTPValidationError; + +/** + * @summary Delete Agent + */ +export const useDeleteAgentApiV1AgentsAgentIdDelete = < + TError = HTTPValidationError, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited>, + TError, + { agentId: string }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited>, + TError, + { agentId: string }, + TContext +> => { + return useMutation( + getDeleteAgentApiV1AgentsAgentIdDeleteMutationOptions(options), + queryClient, + ); +}; /** * Get a single agent by id. * @summary Get Agent @@ -937,123 +1182,6 @@ export const useUpdateAgentApiV1AgentsAgentIdPatch = < queryClient, ); }; -/** - * Delete an agent and clean related task state. - * @summary Delete Agent - */ -export type deleteAgentApiV1AgentsAgentIdDeleteResponse200 = { - data: OkResponse; - status: 200; -}; - -export type deleteAgentApiV1AgentsAgentIdDeleteResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type deleteAgentApiV1AgentsAgentIdDeleteResponseSuccess = - deleteAgentApiV1AgentsAgentIdDeleteResponse200 & { - headers: Headers; - }; -export type deleteAgentApiV1AgentsAgentIdDeleteResponseError = - deleteAgentApiV1AgentsAgentIdDeleteResponse422 & { - headers: Headers; - }; - -export type deleteAgentApiV1AgentsAgentIdDeleteResponse = - | deleteAgentApiV1AgentsAgentIdDeleteResponseSuccess - | deleteAgentApiV1AgentsAgentIdDeleteResponseError; - -export const getDeleteAgentApiV1AgentsAgentIdDeleteUrl = (agentId: string) => { - return `/api/v1/agents/${agentId}`; -}; - -export const deleteAgentApiV1AgentsAgentIdDelete = async ( - agentId: string, - options?: RequestInit, -): Promise => { - return customFetch( - getDeleteAgentApiV1AgentsAgentIdDeleteUrl(agentId), - { - ...options, - method: "DELETE", - }, - ); -}; - -export const getDeleteAgentApiV1AgentsAgentIdDeleteMutationOptions = < - TError = HTTPValidationError, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { agentId: string }, - TContext - >; - request?: SecondParameter; -}): UseMutationOptions< - Awaited>, - TError, - { agentId: string }, - TContext -> => { - const mutationKey = ["deleteAgentApiV1AgentsAgentIdDelete"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited>, - { agentId: string } - > = (props) => { - const { agentId } = props ?? {}; - - return deleteAgentApiV1AgentsAgentIdDelete(agentId, requestOptions); - }; - - return { mutationFn, ...mutationOptions }; -}; - -export type DeleteAgentApiV1AgentsAgentIdDeleteMutationResult = NonNullable< - Awaited> ->; - -export type DeleteAgentApiV1AgentsAgentIdDeleteMutationError = - HTTPValidationError; - -/** - * @summary Delete Agent - */ -export const useDeleteAgentApiV1AgentsAgentIdDelete = < - TError = HTTPValidationError, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { agentId: string }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited>, - TError, - { agentId: string }, - TContext -> => { - return useMutation( - getDeleteAgentApiV1AgentsAgentIdDeleteMutationOptions(options), - queryClient, - ); -}; /** * Record a heartbeat for a specific agent. * @summary Heartbeat Agent @@ -1182,131 +1310,3 @@ export const useHeartbeatAgentApiV1AgentsAgentIdHeartbeatPost = < queryClient, ); }; -/** - * Heartbeat an existing agent or create/provision one if needed. - * @summary Heartbeat Or Create Agent - */ -export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse200 = { - data: AgentRead; - status: 200; -}; - -export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponseSuccess = - heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse200 & { - headers: Headers; - }; -export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponseError = - heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse422 & { - headers: Headers; - }; - -export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse = - | heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponseSuccess - | heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponseError; - -export const getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostUrl = () => { - return `/api/v1/agents/heartbeat`; -}; - -export const heartbeatOrCreateAgentApiV1AgentsHeartbeatPost = async ( - agentHeartbeatCreate: AgentHeartbeatCreate, - options?: RequestInit, -): Promise => { - return customFetch( - getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostUrl(), - { - ...options, - method: "POST", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(agentHeartbeatCreate), - }, - ); -}; - -export const getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationOptions = - (options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType - >, - TError, - { data: AgentHeartbeatCreate }, - TContext - >; - request?: SecondParameter; - }): UseMutationOptions< - Awaited>, - TError, - { data: AgentHeartbeatCreate }, - TContext - > => { - const mutationKey = ["heartbeatOrCreateAgentApiV1AgentsHeartbeatPost"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited< - ReturnType - >, - { data: AgentHeartbeatCreate } - > = (props) => { - const { data } = props ?? {}; - - return heartbeatOrCreateAgentApiV1AgentsHeartbeatPost( - data, - requestOptions, - ); - }; - - return { mutationFn, ...mutationOptions }; - }; - -export type HeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationResult = - NonNullable< - Awaited> - >; -export type HeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationBody = - AgentHeartbeatCreate; -export type HeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationError = - HTTPValidationError; - -/** - * @summary Heartbeat Or Create Agent - */ -export const useHeartbeatOrCreateAgentApiV1AgentsHeartbeatPost = < - TError = HTTPValidationError, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType - >, - TError, - { data: AgentHeartbeatCreate }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited>, - TError, - { data: AgentHeartbeatCreate }, - TContext -> => { - return useMutation( - getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationOptions(options), - queryClient, - ); -}; diff --git a/frontend/src/api/generated/board-group-memory/board-group-memory.ts b/frontend/src/api/generated/board-group-memory/board-group-memory.ts index 9d41f506..852841d2 100644 --- a/frontend/src/api/generated/board-group-memory/board-group-memory.ts +++ b/frontend/src/api/generated/board-group-memory/board-group-memory.ts @@ -801,7 +801,9 @@ export function useStreamBoardGroupMemoryApiV1BoardGroupsGroupIdMemoryStreamGet< } /** - * List memory entries for the board's linked group. + * List shared memory for the board's linked group. + +Use this for cross-board context and coordination signals. * @summary List Board Group Memory For Board */ export type listBoardGroupMemoryForBoardApiV1BoardsBoardIdGroupMemoryGetResponse200 = @@ -1123,7 +1125,10 @@ export function useListBoardGroupMemoryForBoardApiV1BoardsBoardIdGroupMemoryGet< } /** - * Create a group memory entry from a board context and notify recipients. + * Create shared group memory from a board context. + +When tags/mentions indicate chat or broadcast intent, eligible agents in the +linked group are notified. * @summary Create Board Group Memory For Board */ export type createBoardGroupMemoryForBoardApiV1BoardsBoardIdGroupMemoryPostResponse200 = @@ -1280,7 +1285,7 @@ export const useCreateBoardGroupMemoryForBoardApiV1BoardsBoardIdGroupMemoryPost ); }; /** - * Stream memory entries for the board's linked group. + * Stream linked-group memory via SSE for near-real-time coordination. * @summary Stream Board Group Memory For Board */ export type streamBoardGroupMemoryForBoardApiV1BoardsBoardIdGroupMemoryStreamGetResponse200 = diff --git a/frontend/src/api/generated/board-groups/board-groups.ts b/frontend/src/api/generated/board-groups/board-groups.ts index 78fbaf2f..ceb6c86c 100644 --- a/frontend/src/api/generated/board-groups/board-groups.ts +++ b/frontend/src/api/generated/board-groups/board-groups.ts @@ -369,6 +369,129 @@ export const useCreateBoardGroupApiV1BoardGroupsPost = < queryClient, ); }; +/** + * Delete a board group. + * @summary Delete Board Group + */ +export type deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse200 = { + data: OkResponse; + status: 200; +}; + +export type deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponseSuccess = + deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse200 & { + headers: Headers; + }; +export type deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponseError = + deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse422 & { + headers: Headers; + }; + +export type deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse = + | deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponseSuccess + | deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponseError; + +export const getDeleteBoardGroupApiV1BoardGroupsGroupIdDeleteUrl = ( + groupId: string, +) => { + return `/api/v1/board-groups/${groupId}`; +}; + +export const deleteBoardGroupApiV1BoardGroupsGroupIdDelete = async ( + groupId: string, + options?: RequestInit, +): Promise => { + return customFetch( + getDeleteBoardGroupApiV1BoardGroupsGroupIdDeleteUrl(groupId), + { + ...options, + method: "DELETE", + }, + ); +}; + +export const getDeleteBoardGroupApiV1BoardGroupsGroupIdDeleteMutationOptions = < + TError = HTTPValidationError, + TContext = unknown, +>(options?: { + mutation?: UseMutationOptions< + Awaited>, + TError, + { groupId: string }, + TContext + >; + request?: SecondParameter; +}): UseMutationOptions< + Awaited>, + TError, + { groupId: string }, + TContext +> => { + const mutationKey = ["deleteBoardGroupApiV1BoardGroupsGroupIdDelete"]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited>, + { groupId: string } + > = (props) => { + const { groupId } = props ?? {}; + + return deleteBoardGroupApiV1BoardGroupsGroupIdDelete( + groupId, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; +}; + +export type DeleteBoardGroupApiV1BoardGroupsGroupIdDeleteMutationResult = + NonNullable< + Awaited> + >; + +export type DeleteBoardGroupApiV1BoardGroupsGroupIdDeleteMutationError = + HTTPValidationError; + +/** + * @summary Delete Board Group + */ +export const useDeleteBoardGroupApiV1BoardGroupsGroupIdDelete = < + TError = HTTPValidationError, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited>, + TError, + { groupId: string }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited>, + TError, + { groupId: string }, + TContext +> => { + return useMutation( + getDeleteBoardGroupApiV1BoardGroupsGroupIdDeleteMutationOptions(options), + queryClient, + ); +}; /** * Get a board group by id. * @summary Get Board Group @@ -707,125 +830,161 @@ export const useUpdateBoardGroupApiV1BoardGroupsGroupIdPatch = < ); }; /** - * Delete a board group. - * @summary Delete Board Group + * Apply heartbeat settings to agents in a board group. + * @summary Apply Board Group Heartbeat */ -export type deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse200 = { - data: OkResponse; - status: 200; -}; +export type applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse200 = + { + data: BoardGroupHeartbeatApplyResult; + status: 200; + }; -export type deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse422 = { - data: HTTPValidationError; - status: 422; -}; +export type applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse422 = + { + data: HTTPValidationError; + status: 422; + }; -export type deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponseSuccess = - deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse200 & { +export type applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponseSuccess = + applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse200 & { headers: Headers; }; -export type deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponseError = - deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse422 & { +export type applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponseError = + applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse422 & { headers: Headers; }; -export type deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse = - | deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponseSuccess - | deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponseError; +export type applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse = -export const getDeleteBoardGroupApiV1BoardGroupsGroupIdDeleteUrl = ( - groupId: string, -) => { - return `/api/v1/board-groups/${groupId}`; -}; + | applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponseSuccess + | applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponseError; -export const deleteBoardGroupApiV1BoardGroupsGroupIdDelete = async ( - groupId: string, - options?: RequestInit, -): Promise => { - return customFetch( - getDeleteBoardGroupApiV1BoardGroupsGroupIdDeleteUrl(groupId), - { - ...options, - method: "DELETE", - }, - ); -}; +export const getApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostUrl = + (groupId: string) => { + return `/api/v1/board-groups/${groupId}/heartbeat`; + }; -export const getDeleteBoardGroupApiV1BoardGroupsGroupIdDeleteMutationOptions = < - TError = HTTPValidationError, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { groupId: string }, - TContext - >; - request?: SecondParameter; -}): UseMutationOptions< - Awaited>, - TError, - { groupId: string }, - TContext -> => { - const mutationKey = ["deleteBoardGroupApiV1BoardGroupsGroupIdDelete"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited>, - { groupId: string } - > = (props) => { - const { groupId } = props ?? {}; - - return deleteBoardGroupApiV1BoardGroupsGroupIdDelete( - groupId, - requestOptions, +export const applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost = + async ( + groupId: string, + boardGroupHeartbeatApply: BoardGroupHeartbeatApply, + options?: RequestInit, + ): Promise => { + return customFetch( + getApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostUrl( + groupId, + ), + { + ...options, + method: "POST", + headers: { "Content-Type": "application/json", ...options?.headers }, + body: JSON.stringify(boardGroupHeartbeatApply), + }, ); }; - return { mutationFn, ...mutationOptions }; -}; +export const getApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostMutationOptions = + (options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost + > + >, + TError, + { groupId: string; data: BoardGroupHeartbeatApply }, + TContext + >; + request?: SecondParameter; + }): UseMutationOptions< + Awaited< + ReturnType< + typeof applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost + > + >, + TError, + { groupId: string; data: BoardGroupHeartbeatApply }, + TContext + > => { + const mutationKey = [ + "applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost", + ]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; -export type DeleteBoardGroupApiV1BoardGroupsGroupIdDeleteMutationResult = + const mutationFn: MutationFunction< + Awaited< + ReturnType< + typeof applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost + > + >, + { groupId: string; data: BoardGroupHeartbeatApply } + > = (props) => { + const { groupId, data } = props ?? {}; + + return applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost( + groupId, + data, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; + }; + +export type ApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostMutationResult = NonNullable< - Awaited> + Awaited< + ReturnType< + typeof applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost + > + > >; - -export type DeleteBoardGroupApiV1BoardGroupsGroupIdDeleteMutationError = +export type ApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostMutationBody = + BoardGroupHeartbeatApply; +export type ApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostMutationError = HTTPValidationError; /** - * @summary Delete Board Group + * @summary Apply Board Group Heartbeat */ -export const useDeleteBoardGroupApiV1BoardGroupsGroupIdDelete = < +export const useApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost = < TError = HTTPValidationError, TContext = unknown, >( options?: { mutation?: UseMutationOptions< - Awaited>, + Awaited< + ReturnType< + typeof applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost + > + >, TError, - { groupId: string }, + { groupId: string; data: BoardGroupHeartbeatApply }, TContext >; request?: SecondParameter; }, queryClient?: QueryClient, ): UseMutationResult< - Awaited>, + Awaited< + ReturnType< + typeof applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost + > + >, TError, - { groupId: string }, + { groupId: string; data: BoardGroupHeartbeatApply }, TContext > => { return useMutation( - getDeleteBoardGroupApiV1BoardGroupsGroupIdDeleteMutationOptions(options), + getApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostMutationOptions( + options, + ), queryClient, ); }; @@ -1131,163 +1290,3 @@ export function useGetBoardGroupSnapshotApiV1BoardGroupsGroupIdSnapshotGet< return { ...query, queryKey: queryOptions.queryKey }; } - -/** - * Apply heartbeat settings to agents in a board group. - * @summary Apply Board Group Heartbeat - */ -export type applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse200 = - { - data: BoardGroupHeartbeatApplyResult; - status: 200; - }; - -export type applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse422 = - { - data: HTTPValidationError; - status: 422; - }; - -export type applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponseSuccess = - applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse200 & { - headers: Headers; - }; -export type applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponseError = - applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse422 & { - headers: Headers; - }; - -export type applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse = - - | applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponseSuccess - | applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponseError; - -export const getApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostUrl = - (groupId: string) => { - return `/api/v1/board-groups/${groupId}/heartbeat`; - }; - -export const applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost = - async ( - groupId: string, - boardGroupHeartbeatApply: BoardGroupHeartbeatApply, - options?: RequestInit, - ): Promise => { - return customFetch( - getApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostUrl( - groupId, - ), - { - ...options, - method: "POST", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(boardGroupHeartbeatApply), - }, - ); - }; - -export const getApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostMutationOptions = - (options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType< - typeof applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost - > - >, - TError, - { groupId: string; data: BoardGroupHeartbeatApply }, - TContext - >; - request?: SecondParameter; - }): UseMutationOptions< - Awaited< - ReturnType< - typeof applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost - > - >, - TError, - { groupId: string; data: BoardGroupHeartbeatApply }, - TContext - > => { - const mutationKey = [ - "applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost", - ]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited< - ReturnType< - typeof applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost - > - >, - { groupId: string; data: BoardGroupHeartbeatApply } - > = (props) => { - const { groupId, data } = props ?? {}; - - return applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost( - groupId, - data, - requestOptions, - ); - }; - - return { mutationFn, ...mutationOptions }; - }; - -export type ApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostMutationResult = - NonNullable< - Awaited< - ReturnType< - typeof applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost - > - > - >; -export type ApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostMutationBody = - BoardGroupHeartbeatApply; -export type ApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostMutationError = - HTTPValidationError; - -/** - * @summary Apply Board Group Heartbeat - */ -export const useApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost = < - TError = HTTPValidationError, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType< - typeof applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost - > - >, - TError, - { groupId: string; data: BoardGroupHeartbeatApply }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited< - ReturnType< - typeof applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost - > - >, - TError, - { groupId: string; data: BoardGroupHeartbeatApply }, - TContext -> => { - return useMutation( - getApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostMutationOptions( - options, - ), - queryClient, - ); -}; diff --git a/frontend/src/api/generated/board-onboarding/board-onboarding.ts b/frontend/src/api/generated/board-onboarding/board-onboarding.ts index 8efcb6ff..479bfd9a 100644 --- a/frontend/src/api/generated/board-onboarding/board-onboarding.ts +++ b/frontend/src/api/generated/board-onboarding/board-onboarding.ts @@ -274,298 +274,6 @@ export function useGetOnboardingApiV1BoardsBoardIdOnboardingGet< return { ...query, queryKey: queryOptions.queryKey }; } -/** - * Start onboarding and send instructions to the gateway agent. - * @summary Start Onboarding - */ -export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse200 = { - data: BoardOnboardingRead; - status: 200; -}; - -export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponseSuccess = - startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse200 & { - headers: Headers; - }; -export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponseError = - startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse422 & { - headers: Headers; - }; - -export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse = - | startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponseSuccess - | startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponseError; - -export const getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostUrl = ( - boardId: string, -) => { - return `/api/v1/boards/${boardId}/onboarding/start`; -}; - -export const startOnboardingApiV1BoardsBoardIdOnboardingStartPost = async ( - boardId: string, - boardOnboardingStart: BoardOnboardingStart, - options?: RequestInit, -): Promise => { - return customFetch( - getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostUrl(boardId), - { - ...options, - method: "POST", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(boardOnboardingStart), - }, - ); -}; - -export const getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationOptions = - (options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType - >, - TError, - { boardId: string; data: BoardOnboardingStart }, - TContext - >; - request?: SecondParameter; - }): UseMutationOptions< - Awaited< - ReturnType - >, - TError, - { boardId: string; data: BoardOnboardingStart }, - TContext - > => { - const mutationKey = [ - "startOnboardingApiV1BoardsBoardIdOnboardingStartPost", - ]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited< - ReturnType - >, - { boardId: string; data: BoardOnboardingStart } - > = (props) => { - const { boardId, data } = props ?? {}; - - return startOnboardingApiV1BoardsBoardIdOnboardingStartPost( - boardId, - data, - requestOptions, - ); - }; - - return { mutationFn, ...mutationOptions }; - }; - -export type StartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationResult = - NonNullable< - Awaited< - ReturnType - > - >; -export type StartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationBody = - BoardOnboardingStart; -export type StartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationError = - HTTPValidationError; - -/** - * @summary Start Onboarding - */ -export const useStartOnboardingApiV1BoardsBoardIdOnboardingStartPost = < - TError = HTTPValidationError, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType - >, - TError, - { boardId: string; data: BoardOnboardingStart }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited< - ReturnType - >, - TError, - { boardId: string; data: BoardOnboardingStart }, - TContext -> => { - return useMutation( - getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationOptions( - options, - ), - queryClient, - ); -}; -/** - * Send a user onboarding answer to the gateway agent. - * @summary Answer Onboarding - */ -export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse200 = - { - data: BoardOnboardingRead; - status: 200; - }; - -export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse422 = - { - data: HTTPValidationError; - status: 422; - }; - -export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponseSuccess = - answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse200 & { - headers: Headers; - }; -export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponseError = - answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse422 & { - headers: Headers; - }; - -export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse = - | answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponseSuccess - | answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponseError; - -export const getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostUrl = ( - boardId: string, -) => { - return `/api/v1/boards/${boardId}/onboarding/answer`; -}; - -export const answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost = async ( - boardId: string, - boardOnboardingAnswer: BoardOnboardingAnswer, - options?: RequestInit, -): Promise => { - return customFetch( - getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostUrl(boardId), - { - ...options, - method: "POST", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(boardOnboardingAnswer), - }, - ); -}; - -export const getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationOptions = - (options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType< - typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost - > - >, - TError, - { boardId: string; data: BoardOnboardingAnswer }, - TContext - >; - request?: SecondParameter; - }): UseMutationOptions< - Awaited< - ReturnType - >, - TError, - { boardId: string; data: BoardOnboardingAnswer }, - TContext - > => { - const mutationKey = [ - "answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost", - ]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited< - ReturnType< - typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost - > - >, - { boardId: string; data: BoardOnboardingAnswer } - > = (props) => { - const { boardId, data } = props ?? {}; - - return answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost( - boardId, - data, - requestOptions, - ); - }; - - return { mutationFn, ...mutationOptions }; - }; - -export type AnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationResult = - NonNullable< - Awaited< - ReturnType - > - >; -export type AnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationBody = - BoardOnboardingAnswer; -export type AnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationError = - HTTPValidationError; - -/** - * @summary Answer Onboarding - */ -export const useAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost = < - TError = HTTPValidationError, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType< - typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost - > - >, - TError, - { boardId: string; data: BoardOnboardingAnswer }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited< - ReturnType - >, - TError, - { boardId: string; data: BoardOnboardingAnswer }, - TContext -> => { - return useMutation( - getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationOptions( - options, - ), - queryClient, - ); -}; /** * Store onboarding updates submitted by the gateway agent. * @summary Agent Onboarding Update @@ -741,6 +449,156 @@ export const useAgentOnboardingUpdateApiV1BoardsBoardIdOnboardingAgentPost = < queryClient, ); }; +/** + * Send a user onboarding answer to the gateway agent. + * @summary Answer Onboarding + */ +export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse200 = + { + data: BoardOnboardingRead; + status: 200; + }; + +export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse422 = + { + data: HTTPValidationError; + status: 422; + }; + +export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponseSuccess = + answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse200 & { + headers: Headers; + }; +export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponseError = + answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse422 & { + headers: Headers; + }; + +export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse = + | answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponseSuccess + | answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponseError; + +export const getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostUrl = ( + boardId: string, +) => { + return `/api/v1/boards/${boardId}/onboarding/answer`; +}; + +export const answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost = async ( + boardId: string, + boardOnboardingAnswer: BoardOnboardingAnswer, + options?: RequestInit, +): Promise => { + return customFetch( + getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostUrl(boardId), + { + ...options, + method: "POST", + headers: { "Content-Type": "application/json", ...options?.headers }, + body: JSON.stringify(boardOnboardingAnswer), + }, + ); +}; + +export const getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationOptions = + (options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost + > + >, + TError, + { boardId: string; data: BoardOnboardingAnswer }, + TContext + >; + request?: SecondParameter; + }): UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { boardId: string; data: BoardOnboardingAnswer }, + TContext + > => { + const mutationKey = [ + "answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost", + ]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited< + ReturnType< + typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost + > + >, + { boardId: string; data: BoardOnboardingAnswer } + > = (props) => { + const { boardId, data } = props ?? {}; + + return answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost( + boardId, + data, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; + }; + +export type AnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationResult = + NonNullable< + Awaited< + ReturnType + > + >; +export type AnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationBody = + BoardOnboardingAnswer; +export type AnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationError = + HTTPValidationError; + +/** + * @summary Answer Onboarding + */ +export const useAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost = < + TError = HTTPValidationError, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost + > + >, + TError, + { boardId: string; data: BoardOnboardingAnswer }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited< + ReturnType + >, + TError, + { boardId: string; data: BoardOnboardingAnswer }, + TContext +> => { + return useMutation( + getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationOptions( + options, + ), + queryClient, + ); +}; /** * Confirm onboarding results and provision the board lead agent. * @summary Confirm Onboarding @@ -895,3 +753,145 @@ export const useConfirmOnboardingApiV1BoardsBoardIdOnboardingConfirmPost = < queryClient, ); }; +/** + * Start onboarding and send instructions to the gateway agent. + * @summary Start Onboarding + */ +export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse200 = { + data: BoardOnboardingRead; + status: 200; +}; + +export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponseSuccess = + startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse200 & { + headers: Headers; + }; +export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponseError = + startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse422 & { + headers: Headers; + }; + +export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse = + | startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponseSuccess + | startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponseError; + +export const getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostUrl = ( + boardId: string, +) => { + return `/api/v1/boards/${boardId}/onboarding/start`; +}; + +export const startOnboardingApiV1BoardsBoardIdOnboardingStartPost = async ( + boardId: string, + boardOnboardingStart: BoardOnboardingStart, + options?: RequestInit, +): Promise => { + return customFetch( + getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostUrl(boardId), + { + ...options, + method: "POST", + headers: { "Content-Type": "application/json", ...options?.headers }, + body: JSON.stringify(boardOnboardingStart), + }, + ); +}; + +export const getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationOptions = + (options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { boardId: string; data: BoardOnboardingStart }, + TContext + >; + request?: SecondParameter; + }): UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { boardId: string; data: BoardOnboardingStart }, + TContext + > => { + const mutationKey = [ + "startOnboardingApiV1BoardsBoardIdOnboardingStartPost", + ]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited< + ReturnType + >, + { boardId: string; data: BoardOnboardingStart } + > = (props) => { + const { boardId, data } = props ?? {}; + + return startOnboardingApiV1BoardsBoardIdOnboardingStartPost( + boardId, + data, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; + }; + +export type StartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationResult = + NonNullable< + Awaited< + ReturnType + > + >; +export type StartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationBody = + BoardOnboardingStart; +export type StartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationError = + HTTPValidationError; + +/** + * @summary Start Onboarding + */ +export const useStartOnboardingApiV1BoardsBoardIdOnboardingStartPost = < + TError = HTTPValidationError, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { boardId: string; data: BoardOnboardingStart }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited< + ReturnType + >, + TError, + { boardId: string; data: BoardOnboardingStart }, + TContext +> => { + return useMutation( + getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationOptions( + options, + ), + queryClient, + ); +}; diff --git a/frontend/src/api/generated/boards/boards.ts b/frontend/src/api/generated/boards/boards.ts index 8287dbdc..920d51d3 100644 --- a/frontend/src/api/generated/boards/boards.ts +++ b/frontend/src/api/generated/boards/boards.ts @@ -363,6 +363,123 @@ export const useCreateBoardApiV1BoardsPost = < queryClient, ); }; +/** + * Delete a board and all dependent records. + * @summary Delete Board + */ +export type deleteBoardApiV1BoardsBoardIdDeleteResponse200 = { + data: OkResponse; + status: 200; +}; + +export type deleteBoardApiV1BoardsBoardIdDeleteResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type deleteBoardApiV1BoardsBoardIdDeleteResponseSuccess = + deleteBoardApiV1BoardsBoardIdDeleteResponse200 & { + headers: Headers; + }; +export type deleteBoardApiV1BoardsBoardIdDeleteResponseError = + deleteBoardApiV1BoardsBoardIdDeleteResponse422 & { + headers: Headers; + }; + +export type deleteBoardApiV1BoardsBoardIdDeleteResponse = + | deleteBoardApiV1BoardsBoardIdDeleteResponseSuccess + | deleteBoardApiV1BoardsBoardIdDeleteResponseError; + +export const getDeleteBoardApiV1BoardsBoardIdDeleteUrl = (boardId: string) => { + return `/api/v1/boards/${boardId}`; +}; + +export const deleteBoardApiV1BoardsBoardIdDelete = async ( + boardId: string, + options?: RequestInit, +): Promise => { + return customFetch( + getDeleteBoardApiV1BoardsBoardIdDeleteUrl(boardId), + { + ...options, + method: "DELETE", + }, + ); +}; + +export const getDeleteBoardApiV1BoardsBoardIdDeleteMutationOptions = < + TError = HTTPValidationError, + TContext = unknown, +>(options?: { + mutation?: UseMutationOptions< + Awaited>, + TError, + { boardId: string }, + TContext + >; + request?: SecondParameter; +}): UseMutationOptions< + Awaited>, + TError, + { boardId: string }, + TContext +> => { + const mutationKey = ["deleteBoardApiV1BoardsBoardIdDelete"]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited>, + { boardId: string } + > = (props) => { + const { boardId } = props ?? {}; + + return deleteBoardApiV1BoardsBoardIdDelete(boardId, requestOptions); + }; + + return { mutationFn, ...mutationOptions }; +}; + +export type DeleteBoardApiV1BoardsBoardIdDeleteMutationResult = NonNullable< + Awaited> +>; + +export type DeleteBoardApiV1BoardsBoardIdDeleteMutationError = + HTTPValidationError; + +/** + * @summary Delete Board + */ +export const useDeleteBoardApiV1BoardsBoardIdDelete = < + TError = HTTPValidationError, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited>, + TError, + { boardId: string }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited>, + TError, + { boardId: string }, + TContext +> => { + return useMutation( + getDeleteBoardApiV1BoardsBoardIdDeleteMutationOptions(options), + queryClient, + ); +}; /** * Get a board by id. * @summary Get Board @@ -683,364 +800,10 @@ export const useUpdateBoardApiV1BoardsBoardIdPatch = < queryClient, ); }; -/** - * Delete a board and all dependent records. - * @summary Delete Board - */ -export type deleteBoardApiV1BoardsBoardIdDeleteResponse200 = { - data: OkResponse; - status: 200; -}; - -export type deleteBoardApiV1BoardsBoardIdDeleteResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type deleteBoardApiV1BoardsBoardIdDeleteResponseSuccess = - deleteBoardApiV1BoardsBoardIdDeleteResponse200 & { - headers: Headers; - }; -export type deleteBoardApiV1BoardsBoardIdDeleteResponseError = - deleteBoardApiV1BoardsBoardIdDeleteResponse422 & { - headers: Headers; - }; - -export type deleteBoardApiV1BoardsBoardIdDeleteResponse = - | deleteBoardApiV1BoardsBoardIdDeleteResponseSuccess - | deleteBoardApiV1BoardsBoardIdDeleteResponseError; - -export const getDeleteBoardApiV1BoardsBoardIdDeleteUrl = (boardId: string) => { - return `/api/v1/boards/${boardId}`; -}; - -export const deleteBoardApiV1BoardsBoardIdDelete = async ( - boardId: string, - options?: RequestInit, -): Promise => { - return customFetch( - getDeleteBoardApiV1BoardsBoardIdDeleteUrl(boardId), - { - ...options, - method: "DELETE", - }, - ); -}; - -export const getDeleteBoardApiV1BoardsBoardIdDeleteMutationOptions = < - TError = HTTPValidationError, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { boardId: string }, - TContext - >; - request?: SecondParameter; -}): UseMutationOptions< - Awaited>, - TError, - { boardId: string }, - TContext -> => { - const mutationKey = ["deleteBoardApiV1BoardsBoardIdDelete"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited>, - { boardId: string } - > = (props) => { - const { boardId } = props ?? {}; - - return deleteBoardApiV1BoardsBoardIdDelete(boardId, requestOptions); - }; - - return { mutationFn, ...mutationOptions }; -}; - -export type DeleteBoardApiV1BoardsBoardIdDeleteMutationResult = NonNullable< - Awaited> ->; - -export type DeleteBoardApiV1BoardsBoardIdDeleteMutationError = - HTTPValidationError; - -/** - * @summary Delete Board - */ -export const useDeleteBoardApiV1BoardsBoardIdDelete = < - TError = HTTPValidationError, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { boardId: string }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited>, - TError, - { boardId: string }, - TContext -> => { - return useMutation( - getDeleteBoardApiV1BoardsBoardIdDeleteMutationOptions(options), - queryClient, - ); -}; -/** - * Get a board snapshot view model. - * @summary Get Board Snapshot - */ -export type getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponse200 = { - data: BoardSnapshot; - status: 200; -}; - -export type getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponseSuccess = - getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponse200 & { - headers: Headers; - }; -export type getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponseError = - getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponse422 & { - headers: Headers; - }; - -export type getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponse = - | getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponseSuccess - | getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponseError; - -export const getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetUrl = ( - boardId: string, -) => { - return `/api/v1/boards/${boardId}/snapshot`; -}; - -export const getBoardSnapshotApiV1BoardsBoardIdSnapshotGet = async ( - boardId: string, - options?: RequestInit, -): Promise => { - return customFetch( - getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetUrl(boardId), - { - ...options, - method: "GET", - }, - ); -}; - -export const getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryKey = ( - boardId: string, -) => { - return [`/api/v1/boards/${boardId}/snapshot`] as const; -}; - -export const getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryOptions = < - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; - }, -) => { - const { query: queryOptions, request: requestOptions } = options ?? {}; - - const queryKey = - queryOptions?.queryKey ?? - getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryKey(boardId); - - const queryFn: QueryFunction< - Awaited> - > = ({ signal }) => - getBoardSnapshotApiV1BoardsBoardIdSnapshotGet(boardId, { - signal, - ...requestOptions, - }); - - return { - queryKey, - queryFn, - enabled: !!boardId, - ...queryOptions, - } as UseQueryOptions< - Awaited>, - TError, - TData - > & { queryKey: DataTag }; -}; - -export type GetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryResult = - NonNullable< - Awaited> - >; -export type GetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryError = - HTTPValidationError; - -export function useGetBoardSnapshotApiV1BoardsBoardIdSnapshotGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - options: { - query: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - > & - Pick< - DefinedInitialDataOptions< - Awaited< - ReturnType - >, - TError, - Awaited< - ReturnType - > - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): DefinedUseQueryResult & { - queryKey: DataTag; -}; -export function useGetBoardSnapshotApiV1BoardsBoardIdSnapshotGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - > & - Pick< - UndefinedInitialDataOptions< - Awaited< - ReturnType - >, - TError, - Awaited< - ReturnType - > - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -export function useGetBoardSnapshotApiV1BoardsBoardIdSnapshotGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -/** - * @summary Get Board Snapshot - */ - -export function useGetBoardSnapshotApiV1BoardsBoardIdSnapshotGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -} { - const queryOptions = - getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryOptions( - boardId, - options, - ); - - const query = useQuery(queryOptions, queryClient) as UseQueryResult< - TData, - TError - > & { queryKey: DataTag }; - - return { ...query, queryKey: queryOptions.queryKey }; -} - /** * Get a grouped snapshot across related boards. + +Returns high-signal cross-board status for dependency and overlap checks. * @summary Get Board Group Snapshot */ export type getBoardGroupSnapshotApiV1BoardsBoardIdGroupSnapshotGetResponse200 = @@ -1341,3 +1104,242 @@ export function useGetBoardGroupSnapshotApiV1BoardsBoardIdGroupSnapshotGet< return { ...query, queryKey: queryOptions.queryKey }; } + +/** + * Get a board snapshot view model. + * @summary Get Board Snapshot + */ +export type getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponse200 = { + data: BoardSnapshot; + status: 200; +}; + +export type getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponseSuccess = + getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponse200 & { + headers: Headers; + }; +export type getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponseError = + getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponse422 & { + headers: Headers; + }; + +export type getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponse = + | getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponseSuccess + | getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponseError; + +export const getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetUrl = ( + boardId: string, +) => { + return `/api/v1/boards/${boardId}/snapshot`; +}; + +export const getBoardSnapshotApiV1BoardsBoardIdSnapshotGet = async ( + boardId: string, + options?: RequestInit, +): Promise => { + return customFetch( + getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetUrl(boardId), + { + ...options, + method: "GET", + }, + ); +}; + +export const getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryKey = ( + boardId: string, +) => { + return [`/api/v1/boards/${boardId}/snapshot`] as const; +}; + +export const getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryOptions = < + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; + }, +) => { + const { query: queryOptions, request: requestOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? + getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryKey(boardId); + + const queryFn: QueryFunction< + Awaited> + > = ({ signal }) => + getBoardSnapshotApiV1BoardsBoardIdSnapshotGet(boardId, { + signal, + ...requestOptions, + }); + + return { + queryKey, + queryFn, + enabled: !!boardId, + ...queryOptions, + } as UseQueryOptions< + Awaited>, + TError, + TData + > & { queryKey: DataTag }; +}; + +export type GetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryResult = + NonNullable< + Awaited> + >; +export type GetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryError = + HTTPValidationError; + +export function useGetBoardSnapshotApiV1BoardsBoardIdSnapshotGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + options: { + query: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + > & + Pick< + DefinedInitialDataOptions< + Awaited< + ReturnType + >, + TError, + Awaited< + ReturnType + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): DefinedUseQueryResult & { + queryKey: DataTag; +}; +export function useGetBoardSnapshotApiV1BoardsBoardIdSnapshotGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + > & + Pick< + UndefinedInitialDataOptions< + Awaited< + ReturnType + >, + TError, + Awaited< + ReturnType + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +export function useGetBoardSnapshotApiV1BoardsBoardIdSnapshotGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +/** + * @summary Get Board Snapshot + */ + +export function useGetBoardSnapshotApiV1BoardsBoardIdSnapshotGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +} { + const queryOptions = + getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryOptions( + boardId, + options, + ); + + const query = useQuery(queryOptions, queryClient) as UseQueryResult< + TData, + TError + > & { queryKey: DataTag }; + + return { ...query, queryKey: queryOptions.queryKey }; +} diff --git a/frontend/src/api/generated/gateways/gateways.ts b/frontend/src/api/generated/gateways/gateways.ts index a19963bc..63e1f9b1 100644 --- a/frontend/src/api/generated/gateways/gateways.ts +++ b/frontend/src/api/generated/gateways/gateways.ts @@ -48,34 +48,34 @@ import { customFetch } from "../../mutator"; type SecondParameter unknown> = Parameters[1]; /** - * Return gateway connectivity and session status. - * @summary Gateways Status + * List gateways for the caller's organization. + * @summary List Gateways */ -export type gatewaysStatusApiV1GatewaysStatusGetResponse200 = { - data: GatewaysStatusResponse; +export type listGatewaysApiV1GatewaysGetResponse200 = { + data: LimitOffsetPageTypeVarCustomizedGatewayRead; status: 200; }; -export type gatewaysStatusApiV1GatewaysStatusGetResponse422 = { +export type listGatewaysApiV1GatewaysGetResponse422 = { data: HTTPValidationError; status: 422; }; -export type gatewaysStatusApiV1GatewaysStatusGetResponseSuccess = - gatewaysStatusApiV1GatewaysStatusGetResponse200 & { +export type listGatewaysApiV1GatewaysGetResponseSuccess = + listGatewaysApiV1GatewaysGetResponse200 & { headers: Headers; }; -export type gatewaysStatusApiV1GatewaysStatusGetResponseError = - gatewaysStatusApiV1GatewaysStatusGetResponse422 & { +export type listGatewaysApiV1GatewaysGetResponseError = + listGatewaysApiV1GatewaysGetResponse422 & { headers: Headers; }; -export type gatewaysStatusApiV1GatewaysStatusGetResponse = - | gatewaysStatusApiV1GatewaysStatusGetResponseSuccess - | gatewaysStatusApiV1GatewaysStatusGetResponseError; +export type listGatewaysApiV1GatewaysGetResponse = + | listGatewaysApiV1GatewaysGetResponseSuccess + | listGatewaysApiV1GatewaysGetResponseError; -export const getGatewaysStatusApiV1GatewaysStatusGetUrl = ( - params?: GatewaysStatusApiV1GatewaysStatusGetParams, +export const getListGatewaysApiV1GatewaysGetUrl = ( + params?: ListGatewaysApiV1GatewaysGetParams, ) => { const normalizedParams = new URLSearchParams(); @@ -88,16 +88,16 @@ export const getGatewaysStatusApiV1GatewaysStatusGetUrl = ( const stringifiedParams = normalizedParams.toString(); return stringifiedParams.length > 0 - ? `/api/v1/gateways/status?${stringifiedParams}` - : `/api/v1/gateways/status`; + ? `/api/v1/gateways?${stringifiedParams}` + : `/api/v1/gateways`; }; -export const gatewaysStatusApiV1GatewaysStatusGet = async ( - params?: GatewaysStatusApiV1GatewaysStatusGetParams, +export const listGatewaysApiV1GatewaysGet = async ( + params?: ListGatewaysApiV1GatewaysGetParams, options?: RequestInit, -): Promise => { - return customFetch( - getGatewaysStatusApiV1GatewaysStatusGetUrl(params), +): Promise => { + return customFetch( + getListGatewaysApiV1GatewaysGetUrl(params), { ...options, method: "GET", @@ -105,21 +105,21 @@ export const gatewaysStatusApiV1GatewaysStatusGet = async ( ); }; -export const getGatewaysStatusApiV1GatewaysStatusGetQueryKey = ( - params?: GatewaysStatusApiV1GatewaysStatusGetParams, +export const getListGatewaysApiV1GatewaysGetQueryKey = ( + params?: ListGatewaysApiV1GatewaysGetParams, ) => { - return [`/api/v1/gateways/status`, ...(params ? [params] : [])] as const; + return [`/api/v1/gateways`, ...(params ? [params] : [])] as const; }; -export const getGatewaysStatusApiV1GatewaysStatusGetQueryOptions = < - TData = Awaited>, +export const getListGatewaysApiV1GatewaysGetQueryOptions = < + TData = Awaited>, TError = HTTPValidationError, >( - params?: GatewaysStatusApiV1GatewaysStatusGetParams, + params?: ListGatewaysApiV1GatewaysGetParams, options?: { query?: Partial< UseQueryOptions< - Awaited>, + Awaited>, TError, TData > @@ -130,45 +130,43 @@ export const getGatewaysStatusApiV1GatewaysStatusGetQueryOptions = < const { query: queryOptions, request: requestOptions } = options ?? {}; const queryKey = - queryOptions?.queryKey ?? - getGatewaysStatusApiV1GatewaysStatusGetQueryKey(params); + queryOptions?.queryKey ?? getListGatewaysApiV1GatewaysGetQueryKey(params); const queryFn: QueryFunction< - Awaited> + Awaited> > = ({ signal }) => - gatewaysStatusApiV1GatewaysStatusGet(params, { signal, ...requestOptions }); + listGatewaysApiV1GatewaysGet(params, { signal, ...requestOptions }); return { queryKey, queryFn, ...queryOptions } as UseQueryOptions< - Awaited>, + Awaited>, TError, TData > & { queryKey: DataTag }; }; -export type GatewaysStatusApiV1GatewaysStatusGetQueryResult = NonNullable< - Awaited> +export type ListGatewaysApiV1GatewaysGetQueryResult = NonNullable< + Awaited> >; -export type GatewaysStatusApiV1GatewaysStatusGetQueryError = - HTTPValidationError; +export type ListGatewaysApiV1GatewaysGetQueryError = HTTPValidationError; -export function useGatewaysStatusApiV1GatewaysStatusGet< - TData = Awaited>, +export function useListGatewaysApiV1GatewaysGet< + TData = Awaited>, TError = HTTPValidationError, >( - params: undefined | GatewaysStatusApiV1GatewaysStatusGetParams, + params: undefined | ListGatewaysApiV1GatewaysGetParams, options: { query: Partial< UseQueryOptions< - Awaited>, + Awaited>, TError, TData > > & Pick< DefinedInitialDataOptions< - Awaited>, + Awaited>, TError, - Awaited> + Awaited> >, "initialData" >; @@ -178,24 +176,24 @@ export function useGatewaysStatusApiV1GatewaysStatusGet< ): DefinedUseQueryResult & { queryKey: DataTag; }; -export function useGatewaysStatusApiV1GatewaysStatusGet< - TData = Awaited>, +export function useListGatewaysApiV1GatewaysGet< + TData = Awaited>, TError = HTTPValidationError, >( - params?: GatewaysStatusApiV1GatewaysStatusGetParams, + params?: ListGatewaysApiV1GatewaysGetParams, options?: { query?: Partial< UseQueryOptions< - Awaited>, + Awaited>, TError, TData > > & Pick< UndefinedInitialDataOptions< - Awaited>, + Awaited>, TError, - Awaited> + Awaited> >, "initialData" >; @@ -205,15 +203,15 @@ export function useGatewaysStatusApiV1GatewaysStatusGet< ): UseQueryResult & { queryKey: DataTag; }; -export function useGatewaysStatusApiV1GatewaysStatusGet< - TData = Awaited>, +export function useListGatewaysApiV1GatewaysGet< + TData = Awaited>, TError = HTTPValidationError, >( - params?: GatewaysStatusApiV1GatewaysStatusGetParams, + params?: ListGatewaysApiV1GatewaysGetParams, options?: { query?: Partial< UseQueryOptions< - Awaited>, + Awaited>, TError, TData > @@ -225,18 +223,18 @@ export function useGatewaysStatusApiV1GatewaysStatusGet< queryKey: DataTag; }; /** - * @summary Gateways Status + * @summary List Gateways */ -export function useGatewaysStatusApiV1GatewaysStatusGet< - TData = Awaited>, +export function useListGatewaysApiV1GatewaysGet< + TData = Awaited>, TError = HTTPValidationError, >( - params?: GatewaysStatusApiV1GatewaysStatusGetParams, + params?: ListGatewaysApiV1GatewaysGetParams, options?: { query?: Partial< UseQueryOptions< - Awaited>, + Awaited>, TError, TData > @@ -247,7 +245,7 @@ export function useGatewaysStatusApiV1GatewaysStatusGet< ): UseQueryResult & { queryKey: DataTag; } { - const queryOptions = getGatewaysStatusApiV1GatewaysStatusGetQueryOptions( + const queryOptions = getListGatewaysApiV1GatewaysGetQueryOptions( params, options, ); @@ -260,6 +258,299 @@ export function useGatewaysStatusApiV1GatewaysStatusGet< return { ...query, queryKey: queryOptions.queryKey }; } +/** + * Create a gateway and provision or refresh its main agent. + * @summary Create Gateway + */ +export type createGatewayApiV1GatewaysPostResponse200 = { + data: GatewayRead; + status: 200; +}; + +export type createGatewayApiV1GatewaysPostResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type createGatewayApiV1GatewaysPostResponseSuccess = + createGatewayApiV1GatewaysPostResponse200 & { + headers: Headers; + }; +export type createGatewayApiV1GatewaysPostResponseError = + createGatewayApiV1GatewaysPostResponse422 & { + headers: Headers; + }; + +export type createGatewayApiV1GatewaysPostResponse = + | createGatewayApiV1GatewaysPostResponseSuccess + | createGatewayApiV1GatewaysPostResponseError; + +export const getCreateGatewayApiV1GatewaysPostUrl = () => { + return `/api/v1/gateways`; +}; + +export const createGatewayApiV1GatewaysPost = async ( + gatewayCreate: GatewayCreate, + options?: RequestInit, +): Promise => { + return customFetch( + getCreateGatewayApiV1GatewaysPostUrl(), + { + ...options, + method: "POST", + headers: { "Content-Type": "application/json", ...options?.headers }, + body: JSON.stringify(gatewayCreate), + }, + ); +}; + +export const getCreateGatewayApiV1GatewaysPostMutationOptions = < + TError = HTTPValidationError, + TContext = unknown, +>(options?: { + mutation?: UseMutationOptions< + Awaited>, + TError, + { data: GatewayCreate }, + TContext + >; + request?: SecondParameter; +}): UseMutationOptions< + Awaited>, + TError, + { data: GatewayCreate }, + TContext +> => { + const mutationKey = ["createGatewayApiV1GatewaysPost"]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited>, + { data: GatewayCreate } + > = (props) => { + const { data } = props ?? {}; + + return createGatewayApiV1GatewaysPost(data, requestOptions); + }; + + return { mutationFn, ...mutationOptions }; +}; + +export type CreateGatewayApiV1GatewaysPostMutationResult = NonNullable< + Awaited> +>; +export type CreateGatewayApiV1GatewaysPostMutationBody = GatewayCreate; +export type CreateGatewayApiV1GatewaysPostMutationError = HTTPValidationError; + +/** + * @summary Create Gateway + */ +export const useCreateGatewayApiV1GatewaysPost = < + TError = HTTPValidationError, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited>, + TError, + { data: GatewayCreate }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited>, + TError, + { data: GatewayCreate }, + TContext +> => { + return useMutation( + getCreateGatewayApiV1GatewaysPostMutationOptions(options), + queryClient, + ); +}; +/** + * Return supported gateway protocol methods and events. + * @summary Gateway Commands + */ +export type gatewayCommandsApiV1GatewaysCommandsGetResponse200 = { + data: GatewayCommandsResponse; + status: 200; +}; + +export type gatewayCommandsApiV1GatewaysCommandsGetResponseSuccess = + gatewayCommandsApiV1GatewaysCommandsGetResponse200 & { + headers: Headers; + }; +export type gatewayCommandsApiV1GatewaysCommandsGetResponse = + gatewayCommandsApiV1GatewaysCommandsGetResponseSuccess; + +export const getGatewayCommandsApiV1GatewaysCommandsGetUrl = () => { + return `/api/v1/gateways/commands`; +}; + +export const gatewayCommandsApiV1GatewaysCommandsGet = async ( + options?: RequestInit, +): Promise => { + return customFetch( + getGatewayCommandsApiV1GatewaysCommandsGetUrl(), + { + ...options, + method: "GET", + }, + ); +}; + +export const getGatewayCommandsApiV1GatewaysCommandsGetQueryKey = () => { + return [`/api/v1/gateways/commands`] as const; +}; + +export const getGatewayCommandsApiV1GatewaysCommandsGetQueryOptions = < + TData = Awaited>, + TError = unknown, +>(options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + >; + request?: SecondParameter; +}) => { + const { query: queryOptions, request: requestOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? + getGatewayCommandsApiV1GatewaysCommandsGetQueryKey(); + + const queryFn: QueryFunction< + Awaited> + > = ({ signal }) => + gatewayCommandsApiV1GatewaysCommandsGet({ signal, ...requestOptions }); + + return { queryKey, queryFn, ...queryOptions } as UseQueryOptions< + Awaited>, + TError, + TData + > & { queryKey: DataTag }; +}; + +export type GatewayCommandsApiV1GatewaysCommandsGetQueryResult = NonNullable< + Awaited> +>; +export type GatewayCommandsApiV1GatewaysCommandsGetQueryError = unknown; + +export function useGatewayCommandsApiV1GatewaysCommandsGet< + TData = Awaited>, + TError = unknown, +>( + options: { + query: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + > & + Pick< + DefinedInitialDataOptions< + Awaited>, + TError, + Awaited> + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): DefinedUseQueryResult & { + queryKey: DataTag; +}; +export function useGatewayCommandsApiV1GatewaysCommandsGet< + TData = Awaited>, + TError = unknown, +>( + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + > & + Pick< + UndefinedInitialDataOptions< + Awaited>, + TError, + Awaited> + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +export function useGatewayCommandsApiV1GatewaysCommandsGet< + TData = Awaited>, + TError = unknown, +>( + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +/** + * @summary Gateway Commands + */ + +export function useGatewayCommandsApiV1GatewaysCommandsGet< + TData = Awaited>, + TError = unknown, +>( + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +} { + const queryOptions = + getGatewayCommandsApiV1GatewaysCommandsGetQueryOptions(options); + + const query = useQuery(queryOptions, queryClient) as UseQueryResult< + TData, + TError + > & { queryKey: DataTag }; + + return { ...query, queryKey: queryOptions.queryKey }; +} + /** * List sessions for a gateway associated with a board. * @summary List Gateway Sessions @@ -1283,209 +1574,34 @@ export const useSendGatewaySessionMessageApiV1GatewaysSessionsSessionIdMessagePo ); }; /** - * Return supported gateway protocol methods and events. - * @summary Gateway Commands + * Return gateway connectivity and session status. + * @summary Gateways Status */ -export type gatewayCommandsApiV1GatewaysCommandsGetResponse200 = { - data: GatewayCommandsResponse; +export type gatewaysStatusApiV1GatewaysStatusGetResponse200 = { + data: GatewaysStatusResponse; status: 200; }; -export type gatewayCommandsApiV1GatewaysCommandsGetResponseSuccess = - gatewayCommandsApiV1GatewaysCommandsGetResponse200 & { - headers: Headers; - }; -export type gatewayCommandsApiV1GatewaysCommandsGetResponse = - gatewayCommandsApiV1GatewaysCommandsGetResponseSuccess; - -export const getGatewayCommandsApiV1GatewaysCommandsGetUrl = () => { - return `/api/v1/gateways/commands`; -}; - -export const gatewayCommandsApiV1GatewaysCommandsGet = async ( - options?: RequestInit, -): Promise => { - return customFetch( - getGatewayCommandsApiV1GatewaysCommandsGetUrl(), - { - ...options, - method: "GET", - }, - ); -}; - -export const getGatewayCommandsApiV1GatewaysCommandsGetQueryKey = () => { - return [`/api/v1/gateways/commands`] as const; -}; - -export const getGatewayCommandsApiV1GatewaysCommandsGetQueryOptions = < - TData = Awaited>, - TError = unknown, ->(options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - >; - request?: SecondParameter; -}) => { - const { query: queryOptions, request: requestOptions } = options ?? {}; - - const queryKey = - queryOptions?.queryKey ?? - getGatewayCommandsApiV1GatewaysCommandsGetQueryKey(); - - const queryFn: QueryFunction< - Awaited> - > = ({ signal }) => - gatewayCommandsApiV1GatewaysCommandsGet({ signal, ...requestOptions }); - - return { queryKey, queryFn, ...queryOptions } as UseQueryOptions< - Awaited>, - TError, - TData - > & { queryKey: DataTag }; -}; - -export type GatewayCommandsApiV1GatewaysCommandsGetQueryResult = NonNullable< - Awaited> ->; -export type GatewayCommandsApiV1GatewaysCommandsGetQueryError = unknown; - -export function useGatewayCommandsApiV1GatewaysCommandsGet< - TData = Awaited>, - TError = unknown, ->( - options: { - query: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - > & - Pick< - DefinedInitialDataOptions< - Awaited>, - TError, - Awaited> - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): DefinedUseQueryResult & { - queryKey: DataTag; -}; -export function useGatewayCommandsApiV1GatewaysCommandsGet< - TData = Awaited>, - TError = unknown, ->( - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - > & - Pick< - UndefinedInitialDataOptions< - Awaited>, - TError, - Awaited> - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -export function useGatewayCommandsApiV1GatewaysCommandsGet< - TData = Awaited>, - TError = unknown, ->( - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -/** - * @summary Gateway Commands - */ - -export function useGatewayCommandsApiV1GatewaysCommandsGet< - TData = Awaited>, - TError = unknown, ->( - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -} { - const queryOptions = - getGatewayCommandsApiV1GatewaysCommandsGetQueryOptions(options); - - const query = useQuery(queryOptions, queryClient) as UseQueryResult< - TData, - TError - > & { queryKey: DataTag }; - - return { ...query, queryKey: queryOptions.queryKey }; -} - -/** - * List gateways for the caller's organization. - * @summary List Gateways - */ -export type listGatewaysApiV1GatewaysGetResponse200 = { - data: LimitOffsetPageTypeVarCustomizedGatewayRead; - status: 200; -}; - -export type listGatewaysApiV1GatewaysGetResponse422 = { +export type gatewaysStatusApiV1GatewaysStatusGetResponse422 = { data: HTTPValidationError; status: 422; }; -export type listGatewaysApiV1GatewaysGetResponseSuccess = - listGatewaysApiV1GatewaysGetResponse200 & { +export type gatewaysStatusApiV1GatewaysStatusGetResponseSuccess = + gatewaysStatusApiV1GatewaysStatusGetResponse200 & { headers: Headers; }; -export type listGatewaysApiV1GatewaysGetResponseError = - listGatewaysApiV1GatewaysGetResponse422 & { +export type gatewaysStatusApiV1GatewaysStatusGetResponseError = + gatewaysStatusApiV1GatewaysStatusGetResponse422 & { headers: Headers; }; -export type listGatewaysApiV1GatewaysGetResponse = - | listGatewaysApiV1GatewaysGetResponseSuccess - | listGatewaysApiV1GatewaysGetResponseError; +export type gatewaysStatusApiV1GatewaysStatusGetResponse = + | gatewaysStatusApiV1GatewaysStatusGetResponseSuccess + | gatewaysStatusApiV1GatewaysStatusGetResponseError; -export const getListGatewaysApiV1GatewaysGetUrl = ( - params?: ListGatewaysApiV1GatewaysGetParams, +export const getGatewaysStatusApiV1GatewaysStatusGetUrl = ( + params?: GatewaysStatusApiV1GatewaysStatusGetParams, ) => { const normalizedParams = new URLSearchParams(); @@ -1498,16 +1614,16 @@ export const getListGatewaysApiV1GatewaysGetUrl = ( const stringifiedParams = normalizedParams.toString(); return stringifiedParams.length > 0 - ? `/api/v1/gateways?${stringifiedParams}` - : `/api/v1/gateways`; + ? `/api/v1/gateways/status?${stringifiedParams}` + : `/api/v1/gateways/status`; }; -export const listGatewaysApiV1GatewaysGet = async ( - params?: ListGatewaysApiV1GatewaysGetParams, +export const gatewaysStatusApiV1GatewaysStatusGet = async ( + params?: GatewaysStatusApiV1GatewaysStatusGetParams, options?: RequestInit, -): Promise => { - return customFetch( - getListGatewaysApiV1GatewaysGetUrl(params), +): Promise => { + return customFetch( + getGatewaysStatusApiV1GatewaysStatusGetUrl(params), { ...options, method: "GET", @@ -1515,21 +1631,21 @@ export const listGatewaysApiV1GatewaysGet = async ( ); }; -export const getListGatewaysApiV1GatewaysGetQueryKey = ( - params?: ListGatewaysApiV1GatewaysGetParams, +export const getGatewaysStatusApiV1GatewaysStatusGetQueryKey = ( + params?: GatewaysStatusApiV1GatewaysStatusGetParams, ) => { - return [`/api/v1/gateways`, ...(params ? [params] : [])] as const; + return [`/api/v1/gateways/status`, ...(params ? [params] : [])] as const; }; -export const getListGatewaysApiV1GatewaysGetQueryOptions = < - TData = Awaited>, +export const getGatewaysStatusApiV1GatewaysStatusGetQueryOptions = < + TData = Awaited>, TError = HTTPValidationError, >( - params?: ListGatewaysApiV1GatewaysGetParams, + params?: GatewaysStatusApiV1GatewaysStatusGetParams, options?: { query?: Partial< UseQueryOptions< - Awaited>, + Awaited>, TError, TData > @@ -1540,43 +1656,45 @@ export const getListGatewaysApiV1GatewaysGetQueryOptions = < const { query: queryOptions, request: requestOptions } = options ?? {}; const queryKey = - queryOptions?.queryKey ?? getListGatewaysApiV1GatewaysGetQueryKey(params); + queryOptions?.queryKey ?? + getGatewaysStatusApiV1GatewaysStatusGetQueryKey(params); const queryFn: QueryFunction< - Awaited> + Awaited> > = ({ signal }) => - listGatewaysApiV1GatewaysGet(params, { signal, ...requestOptions }); + gatewaysStatusApiV1GatewaysStatusGet(params, { signal, ...requestOptions }); return { queryKey, queryFn, ...queryOptions } as UseQueryOptions< - Awaited>, + Awaited>, TError, TData > & { queryKey: DataTag }; }; -export type ListGatewaysApiV1GatewaysGetQueryResult = NonNullable< - Awaited> +export type GatewaysStatusApiV1GatewaysStatusGetQueryResult = NonNullable< + Awaited> >; -export type ListGatewaysApiV1GatewaysGetQueryError = HTTPValidationError; +export type GatewaysStatusApiV1GatewaysStatusGetQueryError = + HTTPValidationError; -export function useListGatewaysApiV1GatewaysGet< - TData = Awaited>, +export function useGatewaysStatusApiV1GatewaysStatusGet< + TData = Awaited>, TError = HTTPValidationError, >( - params: undefined | ListGatewaysApiV1GatewaysGetParams, + params: undefined | GatewaysStatusApiV1GatewaysStatusGetParams, options: { query: Partial< UseQueryOptions< - Awaited>, + Awaited>, TError, TData > > & Pick< DefinedInitialDataOptions< - Awaited>, + Awaited>, TError, - Awaited> + Awaited> >, "initialData" >; @@ -1586,24 +1704,24 @@ export function useListGatewaysApiV1GatewaysGet< ): DefinedUseQueryResult & { queryKey: DataTag; }; -export function useListGatewaysApiV1GatewaysGet< - TData = Awaited>, +export function useGatewaysStatusApiV1GatewaysStatusGet< + TData = Awaited>, TError = HTTPValidationError, >( - params?: ListGatewaysApiV1GatewaysGetParams, + params?: GatewaysStatusApiV1GatewaysStatusGetParams, options?: { query?: Partial< UseQueryOptions< - Awaited>, + Awaited>, TError, TData > > & Pick< UndefinedInitialDataOptions< - Awaited>, + Awaited>, TError, - Awaited> + Awaited> >, "initialData" >; @@ -1613,15 +1731,15 @@ export function useListGatewaysApiV1GatewaysGet< ): UseQueryResult & { queryKey: DataTag; }; -export function useListGatewaysApiV1GatewaysGet< - TData = Awaited>, +export function useGatewaysStatusApiV1GatewaysStatusGet< + TData = Awaited>, TError = HTTPValidationError, >( - params?: ListGatewaysApiV1GatewaysGetParams, + params?: GatewaysStatusApiV1GatewaysStatusGetParams, options?: { query?: Partial< UseQueryOptions< - Awaited>, + Awaited>, TError, TData > @@ -1633,18 +1751,18 @@ export function useListGatewaysApiV1GatewaysGet< queryKey: DataTag; }; /** - * @summary List Gateways + * @summary Gateways Status */ -export function useListGatewaysApiV1GatewaysGet< - TData = Awaited>, +export function useGatewaysStatusApiV1GatewaysStatusGet< + TData = Awaited>, TError = HTTPValidationError, >( - params?: ListGatewaysApiV1GatewaysGetParams, + params?: GatewaysStatusApiV1GatewaysStatusGetParams, options?: { query?: Partial< UseQueryOptions< - Awaited>, + Awaited>, TError, TData > @@ -1655,7 +1773,7 @@ export function useListGatewaysApiV1GatewaysGet< ): UseQueryResult & { queryKey: DataTag; } { - const queryOptions = getListGatewaysApiV1GatewaysGetQueryOptions( + const queryOptions = getGatewaysStatusApiV1GatewaysStatusGetQueryOptions( params, options, ); @@ -1669,69 +1787,69 @@ export function useListGatewaysApiV1GatewaysGet< } /** - * Create a gateway and provision or refresh its main agent. - * @summary Create Gateway + * Delete a gateway in the caller's organization. + * @summary Delete Gateway */ -export type createGatewayApiV1GatewaysPostResponse200 = { - data: GatewayRead; +export type deleteGatewayApiV1GatewaysGatewayIdDeleteResponse200 = { + data: OkResponse; status: 200; }; -export type createGatewayApiV1GatewaysPostResponse422 = { +export type deleteGatewayApiV1GatewaysGatewayIdDeleteResponse422 = { data: HTTPValidationError; status: 422; }; -export type createGatewayApiV1GatewaysPostResponseSuccess = - createGatewayApiV1GatewaysPostResponse200 & { +export type deleteGatewayApiV1GatewaysGatewayIdDeleteResponseSuccess = + deleteGatewayApiV1GatewaysGatewayIdDeleteResponse200 & { headers: Headers; }; -export type createGatewayApiV1GatewaysPostResponseError = - createGatewayApiV1GatewaysPostResponse422 & { +export type deleteGatewayApiV1GatewaysGatewayIdDeleteResponseError = + deleteGatewayApiV1GatewaysGatewayIdDeleteResponse422 & { headers: Headers; }; -export type createGatewayApiV1GatewaysPostResponse = - | createGatewayApiV1GatewaysPostResponseSuccess - | createGatewayApiV1GatewaysPostResponseError; +export type deleteGatewayApiV1GatewaysGatewayIdDeleteResponse = + | deleteGatewayApiV1GatewaysGatewayIdDeleteResponseSuccess + | deleteGatewayApiV1GatewaysGatewayIdDeleteResponseError; -export const getCreateGatewayApiV1GatewaysPostUrl = () => { - return `/api/v1/gateways`; +export const getDeleteGatewayApiV1GatewaysGatewayIdDeleteUrl = ( + gatewayId: string, +) => { + return `/api/v1/gateways/${gatewayId}`; }; -export const createGatewayApiV1GatewaysPost = async ( - gatewayCreate: GatewayCreate, +export const deleteGatewayApiV1GatewaysGatewayIdDelete = async ( + gatewayId: string, options?: RequestInit, -): Promise => { - return customFetch( - getCreateGatewayApiV1GatewaysPostUrl(), +): Promise => { + return customFetch( + getDeleteGatewayApiV1GatewaysGatewayIdDeleteUrl(gatewayId), { ...options, - method: "POST", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(gatewayCreate), + method: "DELETE", }, ); }; -export const getCreateGatewayApiV1GatewaysPostMutationOptions = < +export const getDeleteGatewayApiV1GatewaysGatewayIdDeleteMutationOptions = < TError = HTTPValidationError, TContext = unknown, >(options?: { mutation?: UseMutationOptions< - Awaited>, + Awaited>, TError, - { data: GatewayCreate }, + { gatewayId: string }, TContext >; request?: SecondParameter; }): UseMutationOptions< - Awaited>, + Awaited>, TError, - { data: GatewayCreate }, + { gatewayId: string }, TContext > => { - const mutationKey = ["createGatewayApiV1GatewaysPost"]; + const mutationKey = ["deleteGatewayApiV1GatewaysGatewayIdDelete"]; const { mutation: mutationOptions, request: requestOptions } = options ? options.mutation && "mutationKey" in options.mutation && @@ -1741,48 +1859,50 @@ export const getCreateGatewayApiV1GatewaysPostMutationOptions = < : { mutation: { mutationKey }, request: undefined }; const mutationFn: MutationFunction< - Awaited>, - { data: GatewayCreate } + Awaited>, + { gatewayId: string } > = (props) => { - const { data } = props ?? {}; + const { gatewayId } = props ?? {}; - return createGatewayApiV1GatewaysPost(data, requestOptions); + return deleteGatewayApiV1GatewaysGatewayIdDelete(gatewayId, requestOptions); }; return { mutationFn, ...mutationOptions }; }; -export type CreateGatewayApiV1GatewaysPostMutationResult = NonNullable< - Awaited> ->; -export type CreateGatewayApiV1GatewaysPostMutationBody = GatewayCreate; -export type CreateGatewayApiV1GatewaysPostMutationError = HTTPValidationError; +export type DeleteGatewayApiV1GatewaysGatewayIdDeleteMutationResult = + NonNullable< + Awaited> + >; + +export type DeleteGatewayApiV1GatewaysGatewayIdDeleteMutationError = + HTTPValidationError; /** - * @summary Create Gateway + * @summary Delete Gateway */ -export const useCreateGatewayApiV1GatewaysPost = < +export const useDeleteGatewayApiV1GatewaysGatewayIdDelete = < TError = HTTPValidationError, TContext = unknown, >( options?: { mutation?: UseMutationOptions< - Awaited>, + Awaited>, TError, - { data: GatewayCreate }, + { gatewayId: string }, TContext >; request?: SecondParameter; }, queryClient?: QueryClient, ): UseMutationResult< - Awaited>, + Awaited>, TError, - { data: GatewayCreate }, + { gatewayId: string }, TContext > => { return useMutation( - getCreateGatewayApiV1GatewaysPostMutationOptions(options), + getDeleteGatewayApiV1GatewaysGatewayIdDeleteMutationOptions(options), queryClient, ); }; @@ -2122,126 +2242,6 @@ export const useUpdateGatewayApiV1GatewaysGatewayIdPatch = < queryClient, ); }; -/** - * Delete a gateway in the caller's organization. - * @summary Delete Gateway - */ -export type deleteGatewayApiV1GatewaysGatewayIdDeleteResponse200 = { - data: OkResponse; - status: 200; -}; - -export type deleteGatewayApiV1GatewaysGatewayIdDeleteResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type deleteGatewayApiV1GatewaysGatewayIdDeleteResponseSuccess = - deleteGatewayApiV1GatewaysGatewayIdDeleteResponse200 & { - headers: Headers; - }; -export type deleteGatewayApiV1GatewaysGatewayIdDeleteResponseError = - deleteGatewayApiV1GatewaysGatewayIdDeleteResponse422 & { - headers: Headers; - }; - -export type deleteGatewayApiV1GatewaysGatewayIdDeleteResponse = - | deleteGatewayApiV1GatewaysGatewayIdDeleteResponseSuccess - | deleteGatewayApiV1GatewaysGatewayIdDeleteResponseError; - -export const getDeleteGatewayApiV1GatewaysGatewayIdDeleteUrl = ( - gatewayId: string, -) => { - return `/api/v1/gateways/${gatewayId}`; -}; - -export const deleteGatewayApiV1GatewaysGatewayIdDelete = async ( - gatewayId: string, - options?: RequestInit, -): Promise => { - return customFetch( - getDeleteGatewayApiV1GatewaysGatewayIdDeleteUrl(gatewayId), - { - ...options, - method: "DELETE", - }, - ); -}; - -export const getDeleteGatewayApiV1GatewaysGatewayIdDeleteMutationOptions = < - TError = HTTPValidationError, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { gatewayId: string }, - TContext - >; - request?: SecondParameter; -}): UseMutationOptions< - Awaited>, - TError, - { gatewayId: string }, - TContext -> => { - const mutationKey = ["deleteGatewayApiV1GatewaysGatewayIdDelete"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited>, - { gatewayId: string } - > = (props) => { - const { gatewayId } = props ?? {}; - - return deleteGatewayApiV1GatewaysGatewayIdDelete(gatewayId, requestOptions); - }; - - return { mutationFn, ...mutationOptions }; -}; - -export type DeleteGatewayApiV1GatewaysGatewayIdDeleteMutationResult = - NonNullable< - Awaited> - >; - -export type DeleteGatewayApiV1GatewaysGatewayIdDeleteMutationError = - HTTPValidationError; - -/** - * @summary Delete Gateway - */ -export const useDeleteGatewayApiV1GatewaysGatewayIdDelete = < - TError = HTTPValidationError, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { gatewayId: string }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited>, - TError, - { gatewayId: string }, - TContext -> => { - return useMutation( - getDeleteGatewayApiV1GatewaysGatewayIdDeleteMutationOptions(options), - queryClient, - ); -}; /** * Sync templates for a gateway and optionally rotate runtime settings. * @summary Sync Gateway Templates diff --git a/frontend/src/api/generated/model/activityEventRead.ts b/frontend/src/api/generated/model/activityEventRead.ts index ca2b7c29..19130403 100644 --- a/frontend/src/api/generated/model/activityEventRead.ts +++ b/frontend/src/api/generated/model/activityEventRead.ts @@ -9,10 +9,10 @@ * Serialized activity event payload returned by activity endpoints. */ export interface ActivityEventRead { - id: string; - event_type: string; - message: string | null; agent_id: string | null; - task_id: string | null; created_at: string; + event_type: string; + id: string; + message: string | null; + task_id: string | null; } diff --git a/frontend/src/api/generated/model/activityTaskCommentFeedItemRead.ts b/frontend/src/api/generated/model/activityTaskCommentFeedItemRead.ts index 9f46a58b..df534a51 100644 --- a/frontend/src/api/generated/model/activityTaskCommentFeedItemRead.ts +++ b/frontend/src/api/generated/model/activityTaskCommentFeedItemRead.ts @@ -9,14 +9,14 @@ * Denormalized task-comment feed item enriched with task and board fields. */ export interface ActivityTaskCommentFeedItemRead { - id: string; - created_at: string; - message: string | null; agent_id: string | null; agent_name?: string | null; agent_role?: string | null; - task_id: string; - task_title: string; board_id: string; board_name: string; + created_at: string; + id: string; + message: string | null; + task_id: string; + task_title: string; } diff --git a/frontend/src/api/generated/model/agentCreate.ts b/frontend/src/api/generated/model/agentCreate.ts index c53dbef2..e40ddd3c 100644 --- a/frontend/src/api/generated/model/agentCreate.ts +++ b/frontend/src/api/generated/model/agentCreate.ts @@ -12,11 +12,11 @@ import type { AgentCreateIdentityProfile } from "./agentCreateIdentityProfile"; */ export interface AgentCreate { board_id?: string | null; - /** @minLength 1 */ - name: string; - status?: string; heartbeat_config?: AgentCreateHeartbeatConfig; identity_profile?: AgentCreateIdentityProfile; identity_template?: string | null; + /** @minLength 1 */ + name: string; soul_template?: string | null; + status?: string; } diff --git a/frontend/src/api/generated/model/agentHeartbeatCreate.ts b/frontend/src/api/generated/model/agentHeartbeatCreate.ts index b9f7f86f..c4b09c8b 100644 --- a/frontend/src/api/generated/model/agentHeartbeatCreate.ts +++ b/frontend/src/api/generated/model/agentHeartbeatCreate.ts @@ -9,8 +9,8 @@ * Heartbeat payload used to create an agent lazily. */ export interface AgentHeartbeatCreate { - status?: string | null; + board_id?: string | null; /** @minLength 1 */ name: string; - board_id?: string | null; + status?: string | null; } diff --git a/frontend/src/api/generated/model/agentRead.ts b/frontend/src/api/generated/model/agentRead.ts index 01096858..90c34e14 100644 --- a/frontend/src/api/generated/model/agentRead.ts +++ b/frontend/src/api/generated/model/agentRead.ts @@ -12,19 +12,19 @@ import type { AgentReadIdentityProfile } from "./agentReadIdentityProfile"; */ export interface AgentRead { board_id?: string | null; - /** @minLength 1 */ - name: string; - status?: string; + created_at: string; + gateway_id: string; heartbeat_config?: AgentReadHeartbeatConfig; + id: string; identity_profile?: AgentReadIdentityProfile; identity_template?: string | null; - soul_template?: string | null; - id: string; - gateway_id: string; is_board_lead?: boolean; is_gateway_main?: boolean; - openclaw_session_id?: string | null; last_seen_at: string | null; - created_at: string; + /** @minLength 1 */ + name: string; + openclaw_session_id?: string | null; + soul_template?: string | null; + status?: string; updated_at: string; } diff --git a/frontend/src/api/generated/model/agentUpdate.ts b/frontend/src/api/generated/model/agentUpdate.ts index bd286f9e..2915b9d7 100644 --- a/frontend/src/api/generated/model/agentUpdate.ts +++ b/frontend/src/api/generated/model/agentUpdate.ts @@ -12,11 +12,11 @@ import type { AgentUpdateIdentityProfile } from "./agentUpdateIdentityProfile"; */ export interface AgentUpdate { board_id?: string | null; - is_gateway_main?: boolean | null; - name?: string | null; - status?: string | null; heartbeat_config?: AgentUpdateHeartbeatConfig; identity_profile?: AgentUpdateIdentityProfile; identity_template?: string | null; + is_gateway_main?: boolean | null; + name?: string | null; soul_template?: string | null; + status?: string | null; } diff --git a/frontend/src/api/generated/model/approvalCreate.ts b/frontend/src/api/generated/model/approvalCreate.ts index 8d885162..0f2a963c 100644 --- a/frontend/src/api/generated/model/approvalCreate.ts +++ b/frontend/src/api/generated/model/approvalCreate.ts @@ -13,15 +13,15 @@ import type { ApprovalCreateStatus } from "./approvalCreateStatus"; */ export interface ApprovalCreate { action_type: string; - task_id?: string | null; - task_ids?: string[]; - payload?: ApprovalCreatePayload; + agent_id?: string | null; /** * @minimum 0 * @maximum 100 */ confidence: number; + payload?: ApprovalCreatePayload; rubric_scores?: ApprovalCreateRubricScores; status?: ApprovalCreateStatus; - agent_id?: string | null; + task_id?: string | null; + task_ids?: string[]; } diff --git a/frontend/src/api/generated/model/approvalRead.ts b/frontend/src/api/generated/model/approvalRead.ts index 48a9c348..97158858 100644 --- a/frontend/src/api/generated/model/approvalRead.ts +++ b/frontend/src/api/generated/model/approvalRead.ts @@ -13,20 +13,20 @@ import type { ApprovalReadStatus } from "./approvalReadStatus"; */ export interface ApprovalRead { action_type: string; - task_id?: string | null; - task_ids?: string[]; - payload?: ApprovalReadPayload; + agent_id?: string | null; + board_id: string; /** * @minimum 0 * @maximum 100 */ confidence: number; + created_at: string; + id: string; + payload?: ApprovalReadPayload; + resolved_at?: string | null; rubric_scores?: ApprovalReadRubricScores; status?: ApprovalReadStatus; - id: string; - board_id: string; + task_id?: string | null; + task_ids?: string[]; task_titles?: string[]; - agent_id?: string | null; - created_at: string; - resolved_at?: string | null; } diff --git a/frontend/src/api/generated/model/blockedTaskDetail.ts b/frontend/src/api/generated/model/blockedTaskDetail.ts index beac973b..d9e71124 100644 --- a/frontend/src/api/generated/model/blockedTaskDetail.ts +++ b/frontend/src/api/generated/model/blockedTaskDetail.ts @@ -9,6 +9,6 @@ * Error detail payload listing blocking dependency task identifiers. */ export interface BlockedTaskDetail { - message: string; blocked_by_task_ids?: string[]; + message: string; } diff --git a/frontend/src/api/generated/model/boardCreate.ts b/frontend/src/api/generated/model/boardCreate.ts index 8850b1d2..ce400620 100644 --- a/frontend/src/api/generated/model/boardCreate.ts +++ b/frontend/src/api/generated/model/boardCreate.ts @@ -10,18 +10,19 @@ import type { BoardCreateSuccessMetrics } from "./boardCreateSuccessMetrics"; * Payload for creating a board. */ export interface BoardCreate { - name: string; - slug: string; - description: string; - gateway_id?: string | null; + block_status_changes_with_pending_approval?: boolean; board_group_id?: string | null; board_type?: string; - objective?: string | null; - success_metrics?: BoardCreateSuccessMetrics; - target_date?: string | null; + description: string; + gateway_id?: string | null; goal_confirmed?: boolean; goal_source?: string | null; + name: string; + objective?: string | null; + only_lead_can_change_status?: boolean; require_approval_for_done?: boolean; require_review_before_done?: boolean; - block_status_changes_with_pending_approval?: boolean; + slug: string; + success_metrics?: BoardCreateSuccessMetrics; + target_date?: string | null; } diff --git a/frontend/src/api/generated/model/boardGroupCreate.ts b/frontend/src/api/generated/model/boardGroupCreate.ts index 96ac5a33..bd7da983 100644 --- a/frontend/src/api/generated/model/boardGroupCreate.ts +++ b/frontend/src/api/generated/model/boardGroupCreate.ts @@ -9,7 +9,7 @@ * Payload for creating a board group. */ export interface BoardGroupCreate { + description?: string | null; name: string; slug: string; - description?: string | null; } diff --git a/frontend/src/api/generated/model/boardGroupHeartbeatApply.ts b/frontend/src/api/generated/model/boardGroupHeartbeatApply.ts index 7843e181..b7bd18ca 100644 --- a/frontend/src/api/generated/model/boardGroupHeartbeatApply.ts +++ b/frontend/src/api/generated/model/boardGroupHeartbeatApply.ts @@ -10,6 +10,6 @@ */ export interface BoardGroupHeartbeatApply { every: string; - target?: string | null; include_board_leads?: boolean; + target?: string | null; } diff --git a/frontend/src/api/generated/model/boardGroupHeartbeatApplyResult.ts b/frontend/src/api/generated/model/boardGroupHeartbeatApplyResult.ts index 298eb90e..d5bb950a 100644 --- a/frontend/src/api/generated/model/boardGroupHeartbeatApplyResult.ts +++ b/frontend/src/api/generated/model/boardGroupHeartbeatApplyResult.ts @@ -11,7 +11,7 @@ import type { BoardGroupHeartbeatApplyResultRequested } from "./boardGroupHeartb */ export interface BoardGroupHeartbeatApplyResult { board_group_id: string; + failed_agent_ids: string[]; requested: BoardGroupHeartbeatApplyResultRequested; updated_agent_ids: string[]; - failed_agent_ids: string[]; } diff --git a/frontend/src/api/generated/model/boardGroupMemoryCreate.ts b/frontend/src/api/generated/model/boardGroupMemoryCreate.ts index 547af52a..92bac015 100644 --- a/frontend/src/api/generated/model/boardGroupMemoryCreate.ts +++ b/frontend/src/api/generated/model/boardGroupMemoryCreate.ts @@ -11,6 +11,6 @@ export interface BoardGroupMemoryCreate { /** @minLength 1 */ content: string; - tags?: string[] | null; source?: string | null; + tags?: string[] | null; } diff --git a/frontend/src/api/generated/model/boardGroupMemoryRead.ts b/frontend/src/api/generated/model/boardGroupMemoryRead.ts index ba2d1a14..364d468d 100644 --- a/frontend/src/api/generated/model/boardGroupMemoryRead.ts +++ b/frontend/src/api/generated/model/boardGroupMemoryRead.ts @@ -9,11 +9,11 @@ * Serialized board-group memory entry returned from read endpoints. */ export interface BoardGroupMemoryRead { - id: string; board_group_id: string; content: string; - tags?: string[] | null; - source?: string | null; - is_chat?: boolean; created_at: string; + id: string; + is_chat?: boolean; + source?: string | null; + tags?: string[] | null; } diff --git a/frontend/src/api/generated/model/boardGroupRead.ts b/frontend/src/api/generated/model/boardGroupRead.ts index 91e0a584..174c3cc7 100644 --- a/frontend/src/api/generated/model/boardGroupRead.ts +++ b/frontend/src/api/generated/model/boardGroupRead.ts @@ -9,11 +9,11 @@ * Board-group payload returned from read endpoints. */ export interface BoardGroupRead { - name: string; - slug: string; + created_at: string; description?: string | null; id: string; + name: string; organization_id: string; - created_at: string; + slug: string; updated_at: string; } diff --git a/frontend/src/api/generated/model/boardGroupSnapshot.ts b/frontend/src/api/generated/model/boardGroupSnapshot.ts index fc668108..7f6143d4 100644 --- a/frontend/src/api/generated/model/boardGroupSnapshot.ts +++ b/frontend/src/api/generated/model/boardGroupSnapshot.ts @@ -11,6 +11,6 @@ import type { BoardGroupRead } from "./boardGroupRead"; * Top-level board-group snapshot response payload. */ export interface BoardGroupSnapshot { - group?: BoardGroupRead | null; boards?: BoardGroupBoardSnapshot[]; + group?: BoardGroupRead | null; } diff --git a/frontend/src/api/generated/model/boardGroupTaskSummary.ts b/frontend/src/api/generated/model/boardGroupTaskSummary.ts index 28b76f12..f71cb04f 100644 --- a/frontend/src/api/generated/model/boardGroupTaskSummary.ts +++ b/frontend/src/api/generated/model/boardGroupTaskSummary.ts @@ -10,17 +10,17 @@ import type { TagRef } from "./tagRef"; * Task summary row used inside board-group snapshot responses. */ export interface BoardGroupTaskSummary { - id: string; - board_id: string; - board_name: string; - title: string; - status: string; - priority: string; assigned_agent_id?: string | null; assignee?: string | null; - due_at?: string | null; - in_progress_at?: string | null; - tags?: TagRef[]; + board_id: string; + board_name: string; created_at: string; + due_at?: string | null; + id: string; + in_progress_at?: string | null; + priority: string; + status: string; + tags?: TagRef[]; + title: string; updated_at: string; } diff --git a/frontend/src/api/generated/model/boardGroupUpdate.ts b/frontend/src/api/generated/model/boardGroupUpdate.ts index b7a6e7a4..b8318905 100644 --- a/frontend/src/api/generated/model/boardGroupUpdate.ts +++ b/frontend/src/api/generated/model/boardGroupUpdate.ts @@ -9,7 +9,7 @@ * Payload for partial board-group updates. */ export interface BoardGroupUpdate { + description?: string | null; name?: string | null; slug?: string | null; - description?: string | null; } diff --git a/frontend/src/api/generated/model/boardMemoryCreate.ts b/frontend/src/api/generated/model/boardMemoryCreate.ts index 30900a0c..f2b1afbc 100644 --- a/frontend/src/api/generated/model/boardMemoryCreate.ts +++ b/frontend/src/api/generated/model/boardMemoryCreate.ts @@ -11,6 +11,6 @@ export interface BoardMemoryCreate { /** @minLength 1 */ content: string; - tags?: string[] | null; source?: string | null; + tags?: string[] | null; } diff --git a/frontend/src/api/generated/model/boardMemoryRead.ts b/frontend/src/api/generated/model/boardMemoryRead.ts index f8b1adcc..805c493b 100644 --- a/frontend/src/api/generated/model/boardMemoryRead.ts +++ b/frontend/src/api/generated/model/boardMemoryRead.ts @@ -9,11 +9,11 @@ * Serialized board memory entry returned from read endpoints. */ export interface BoardMemoryRead { - id: string; board_id: string; content: string; - tags?: string[] | null; - source?: string | null; - is_chat?: boolean; created_at: string; + id: string; + is_chat?: boolean; + source?: string | null; + tags?: string[] | null; } diff --git a/frontend/src/api/generated/model/boardOnboardingAgentComplete.ts b/frontend/src/api/generated/model/boardOnboardingAgentComplete.ts index 351f258c..a2be93e4 100644 --- a/frontend/src/api/generated/model/boardOnboardingAgentComplete.ts +++ b/frontend/src/api/generated/model/boardOnboardingAgentComplete.ts @@ -13,10 +13,10 @@ import type { BoardOnboardingUserProfile } from "./boardOnboardingUserProfile"; */ export interface BoardOnboardingAgentComplete { board_type: string; + lead_agent?: BoardOnboardingLeadAgentDraft | null; objective?: string | null; + status: "complete"; success_metrics?: BoardOnboardingAgentCompleteSuccessMetrics; target_date?: string | null; - status: "complete"; user_profile?: BoardOnboardingUserProfile | null; - lead_agent?: BoardOnboardingLeadAgentDraft | null; } diff --git a/frontend/src/api/generated/model/boardOnboardingAgentQuestion.ts b/frontend/src/api/generated/model/boardOnboardingAgentQuestion.ts index cef146c2..2ca429e9 100644 --- a/frontend/src/api/generated/model/boardOnboardingAgentQuestion.ts +++ b/frontend/src/api/generated/model/boardOnboardingAgentQuestion.ts @@ -10,8 +10,8 @@ import type { BoardOnboardingQuestionOption } from "./boardOnboardingQuestionOpt * Question payload emitted by the onboarding assistant. */ export interface BoardOnboardingAgentQuestion { - /** @minLength 1 */ - question: string; /** @minItems 1 */ options: BoardOnboardingQuestionOption[]; + /** @minLength 1 */ + question: string; } diff --git a/frontend/src/api/generated/model/boardOnboardingLeadAgentDraft.ts b/frontend/src/api/generated/model/boardOnboardingLeadAgentDraft.ts index 5778dcdb..a1bf356d 100644 --- a/frontend/src/api/generated/model/boardOnboardingLeadAgentDraft.ts +++ b/frontend/src/api/generated/model/boardOnboardingLeadAgentDraft.ts @@ -10,11 +10,11 @@ import type { BoardOnboardingLeadAgentDraftIdentityProfile } from "./boardOnboar * Editable lead-agent draft configuration. */ export interface BoardOnboardingLeadAgentDraft { - name?: string | null; - identity_profile?: BoardOnboardingLeadAgentDraftIdentityProfile; autonomy_level?: "ask_first" | "balanced" | "autonomous" | null; - verbosity?: "concise" | "balanced" | "detailed" | null; + custom_instructions?: string | null; + identity_profile?: BoardOnboardingLeadAgentDraftIdentityProfile; + name?: string | null; output_format?: "bullets" | "mixed" | "narrative" | null; update_cadence?: "asap" | "hourly" | "daily" | "weekly" | null; - custom_instructions?: string | null; + verbosity?: "concise" | "balanced" | "detailed" | null; } diff --git a/frontend/src/api/generated/model/boardOnboardingRead.ts b/frontend/src/api/generated/model/boardOnboardingRead.ts index 61135086..e93ae067 100644 --- a/frontend/src/api/generated/model/boardOnboardingRead.ts +++ b/frontend/src/api/generated/model/boardOnboardingRead.ts @@ -11,12 +11,12 @@ import type { BoardOnboardingReadMessages } from "./boardOnboardingReadMessages" * Stored onboarding session state returned by API endpoints. */ export interface BoardOnboardingRead { - id: string; board_id: string; + created_at: string; + draft_goal?: BoardOnboardingAgentComplete | null; + id: string; + messages?: BoardOnboardingReadMessages; session_key: string; status: string; - messages?: BoardOnboardingReadMessages; - draft_goal?: BoardOnboardingAgentComplete | null; - created_at: string; updated_at: string; } diff --git a/frontend/src/api/generated/model/boardOnboardingUserProfile.ts b/frontend/src/api/generated/model/boardOnboardingUserProfile.ts index 10d2599a..8c933ac7 100644 --- a/frontend/src/api/generated/model/boardOnboardingUserProfile.ts +++ b/frontend/src/api/generated/model/boardOnboardingUserProfile.ts @@ -9,9 +9,9 @@ * User-profile preferences gathered during onboarding. */ export interface BoardOnboardingUserProfile { + context?: string | null; + notes?: string | null; preferred_name?: string | null; pronouns?: string | null; timezone?: string | null; - notes?: string | null; - context?: string | null; } diff --git a/frontend/src/api/generated/model/boardRead.ts b/frontend/src/api/generated/model/boardRead.ts index c77118c7..c5512de3 100644 --- a/frontend/src/api/generated/model/boardRead.ts +++ b/frontend/src/api/generated/model/boardRead.ts @@ -10,23 +10,23 @@ import type { BoardReadSuccessMetrics } from "./boardReadSuccessMetrics"; * Board payload returned from read endpoints. */ export interface BoardRead { - name: string; - slug: string; - description: string; - gateway_id?: string | null; + block_status_changes_with_pending_approval?: boolean; board_group_id?: string | null; board_type?: string; - objective?: string | null; - success_metrics?: BoardReadSuccessMetrics; - target_date?: string | null; + created_at: string; + description: string; + gateway_id?: string | null; goal_confirmed?: boolean; goal_source?: string | null; + id: string; + name: string; + objective?: string | null; + only_lead_can_change_status?: boolean; + organization_id: string; require_approval_for_done?: boolean; require_review_before_done?: boolean; - block_status_changes_with_pending_approval?: boolean; - only_lead_can_change_status?: boolean; - id: string; - organization_id: string; - created_at: string; + slug: string; + success_metrics?: BoardReadSuccessMetrics; + target_date?: string | null; updated_at: string; } diff --git a/frontend/src/api/generated/model/boardSnapshot.ts b/frontend/src/api/generated/model/boardSnapshot.ts index 10bee2fd..a7528218 100644 --- a/frontend/src/api/generated/model/boardSnapshot.ts +++ b/frontend/src/api/generated/model/boardSnapshot.ts @@ -14,10 +14,10 @@ import type { TaskCardRead } from "./taskCardRead"; * Aggregated board payload used by board snapshot endpoints. */ export interface BoardSnapshot { - board: BoardRead; - tasks: TaskCardRead[]; agents: AgentRead[]; approvals: ApprovalRead[]; + board: BoardRead; chat_messages: BoardMemoryRead[]; pending_approvals_count?: number; + tasks: TaskCardRead[]; } diff --git a/frontend/src/api/generated/model/boardUpdate.ts b/frontend/src/api/generated/model/boardUpdate.ts index 837e747f..d322dcdf 100644 --- a/frontend/src/api/generated/model/boardUpdate.ts +++ b/frontend/src/api/generated/model/boardUpdate.ts @@ -10,19 +10,19 @@ import type { BoardUpdateSuccessMetrics } from "./boardUpdateSuccessMetrics"; * Payload for partial board updates. */ export interface BoardUpdate { - name?: string | null; - slug?: string | null; - description?: string | null; - gateway_id?: string | null; + block_status_changes_with_pending_approval?: boolean | null; board_group_id?: string | null; board_type?: string | null; - objective?: string | null; - success_metrics?: BoardUpdateSuccessMetrics; - target_date?: string | null; + description?: string | null; + gateway_id?: string | null; goal_confirmed?: boolean | null; goal_source?: string | null; + name?: string | null; + objective?: string | null; + only_lead_can_change_status?: boolean | null; require_approval_for_done?: boolean | null; require_review_before_done?: boolean | null; - block_status_changes_with_pending_approval?: boolean | null; - only_lead_can_change_status?: boolean | null; + slug?: string | null; + success_metrics?: BoardUpdateSuccessMetrics; + target_date?: string | null; } diff --git a/frontend/src/api/generated/model/dashboardKpis.ts b/frontend/src/api/generated/model/dashboardKpis.ts index f35f615f..e021dcda 100644 --- a/frontend/src/api/generated/model/dashboardKpis.ts +++ b/frontend/src/api/generated/model/dashboardKpis.ts @@ -10,7 +10,7 @@ */ export interface DashboardKpis { active_agents: number; - tasks_in_progress: number; error_rate_pct: number; median_cycle_time_hours_7d: number | null; + tasks_in_progress: number; } diff --git a/frontend/src/api/generated/model/dashboardMetrics.ts b/frontend/src/api/generated/model/dashboardMetrics.ts index 478a3d97..8995820a 100644 --- a/frontend/src/api/generated/model/dashboardMetrics.ts +++ b/frontend/src/api/generated/model/dashboardMetrics.ts @@ -13,11 +13,11 @@ import type { DashboardWipSeriesSet } from "./dashboardWipSeriesSet"; * Complete dashboard metrics response payload. */ export interface DashboardMetrics { - range: DashboardMetricsRange; - generated_at: string; - kpis: DashboardKpis; - throughput: DashboardSeriesSet; cycle_time: DashboardSeriesSet; error_rate: DashboardSeriesSet; + generated_at: string; + kpis: DashboardKpis; + range: DashboardMetricsRange; + throughput: DashboardSeriesSet; wip: DashboardWipSeriesSet; } diff --git a/frontend/src/api/generated/model/dashboardRangeSeries.ts b/frontend/src/api/generated/model/dashboardRangeSeries.ts index 9e3fd7ae..f996bcfa 100644 --- a/frontend/src/api/generated/model/dashboardRangeSeries.ts +++ b/frontend/src/api/generated/model/dashboardRangeSeries.ts @@ -12,7 +12,7 @@ import type { DashboardSeriesPoint } from "./dashboardSeriesPoint"; * Series payload for a single range/bucket combination. */ export interface DashboardRangeSeries { - range: DashboardRangeSeriesRange; bucket: DashboardRangeSeriesBucket; points: DashboardSeriesPoint[]; + range: DashboardRangeSeriesRange; } diff --git a/frontend/src/api/generated/model/dashboardSeriesSet.ts b/frontend/src/api/generated/model/dashboardSeriesSet.ts index c7742a2b..086f4159 100644 --- a/frontend/src/api/generated/model/dashboardSeriesSet.ts +++ b/frontend/src/api/generated/model/dashboardSeriesSet.ts @@ -10,6 +10,6 @@ import type { DashboardRangeSeries } from "./dashboardRangeSeries"; * Primary vs comparison pair for generic series metrics. */ export interface DashboardSeriesSet { - primary: DashboardRangeSeries; comparison: DashboardRangeSeries; + primary: DashboardRangeSeries; } diff --git a/frontend/src/api/generated/model/dashboardWipPoint.ts b/frontend/src/api/generated/model/dashboardWipPoint.ts index b36c941b..7390dee8 100644 --- a/frontend/src/api/generated/model/dashboardWipPoint.ts +++ b/frontend/src/api/generated/model/dashboardWipPoint.ts @@ -9,9 +9,9 @@ * Work-in-progress point split by task status buckets. */ export interface DashboardWipPoint { - period: string; - inbox: number; - in_progress: number; - review: number; done: number; + in_progress: number; + inbox: number; + period: string; + review: number; } diff --git a/frontend/src/api/generated/model/dashboardWipRangeSeries.ts b/frontend/src/api/generated/model/dashboardWipRangeSeries.ts index 26545332..e439b044 100644 --- a/frontend/src/api/generated/model/dashboardWipRangeSeries.ts +++ b/frontend/src/api/generated/model/dashboardWipRangeSeries.ts @@ -12,7 +12,7 @@ import type { DashboardWipRangeSeriesRange } from "./dashboardWipRangeSeriesRang * WIP series payload for a single range/bucket combination. */ export interface DashboardWipRangeSeries { - range: DashboardWipRangeSeriesRange; bucket: DashboardWipRangeSeriesBucket; points: DashboardWipPoint[]; + range: DashboardWipRangeSeriesRange; } diff --git a/frontend/src/api/generated/model/dashboardWipSeriesSet.ts b/frontend/src/api/generated/model/dashboardWipSeriesSet.ts index ff4c59b2..f2f9e9c6 100644 --- a/frontend/src/api/generated/model/dashboardWipSeriesSet.ts +++ b/frontend/src/api/generated/model/dashboardWipSeriesSet.ts @@ -10,6 +10,6 @@ import type { DashboardWipRangeSeries } from "./dashboardWipRangeSeries"; * Primary vs comparison pair for WIP status series metrics. */ export interface DashboardWipSeriesSet { - primary: DashboardWipRangeSeries; comparison: DashboardWipRangeSeries; + primary: DashboardWipRangeSeries; } diff --git a/frontend/src/api/generated/model/gatewayCommandsResponse.ts b/frontend/src/api/generated/model/gatewayCommandsResponse.ts index 592df7e7..d763c033 100644 --- a/frontend/src/api/generated/model/gatewayCommandsResponse.ts +++ b/frontend/src/api/generated/model/gatewayCommandsResponse.ts @@ -9,7 +9,7 @@ * Gateway command catalog and protocol metadata. */ export interface GatewayCommandsResponse { - protocol_version: number; - methods: string[]; events: string[]; + methods: string[]; + protocol_version: number; } diff --git a/frontend/src/api/generated/model/gatewayCreate.ts b/frontend/src/api/generated/model/gatewayCreate.ts index 0fff7e4a..9d468e99 100644 --- a/frontend/src/api/generated/model/gatewayCreate.ts +++ b/frontend/src/api/generated/model/gatewayCreate.ts @@ -10,7 +10,7 @@ */ export interface GatewayCreate { name: string; + token?: string | null; url: string; workspace_root: string; - token?: string | null; } diff --git a/frontend/src/api/generated/model/gatewayLeadBroadcastBoardResult.ts b/frontend/src/api/generated/model/gatewayLeadBroadcastBoardResult.ts index 964d1906..6125a147 100644 --- a/frontend/src/api/generated/model/gatewayLeadBroadcastBoardResult.ts +++ b/frontend/src/api/generated/model/gatewayLeadBroadcastBoardResult.ts @@ -10,8 +10,8 @@ */ export interface GatewayLeadBroadcastBoardResult { board_id: string; + error?: string | null; lead_agent_id?: string | null; lead_agent_name?: string | null; ok?: boolean; - error?: string | null; } diff --git a/frontend/src/api/generated/model/gatewayLeadBroadcastRequest.ts b/frontend/src/api/generated/model/gatewayLeadBroadcastRequest.ts index 525ee514..672fa182 100644 --- a/frontend/src/api/generated/model/gatewayLeadBroadcastRequest.ts +++ b/frontend/src/api/generated/model/gatewayLeadBroadcastRequest.ts @@ -10,11 +10,11 @@ import type { GatewayLeadBroadcastRequestKind } from "./gatewayLeadBroadcastRequ * Request payload for broadcasting a message to multiple board leads. */ export interface GatewayLeadBroadcastRequest { - kind?: GatewayLeadBroadcastRequestKind; - correlation_id?: string | null; + board_ids?: string[] | null; /** @minLength 1 */ content: string; - board_ids?: string[] | null; - reply_tags?: string[]; + correlation_id?: string | null; + kind?: GatewayLeadBroadcastRequestKind; reply_source?: string | null; + reply_tags?: string[]; } diff --git a/frontend/src/api/generated/model/gatewayLeadBroadcastResponse.ts b/frontend/src/api/generated/model/gatewayLeadBroadcastResponse.ts index fa1a6815..ac326a0e 100644 --- a/frontend/src/api/generated/model/gatewayLeadBroadcastResponse.ts +++ b/frontend/src/api/generated/model/gatewayLeadBroadcastResponse.ts @@ -10,8 +10,8 @@ import type { GatewayLeadBroadcastBoardResult } from "./gatewayLeadBroadcastBoar * Aggregate response for a lead broadcast operation. */ export interface GatewayLeadBroadcastResponse { - ok?: boolean; - sent?: number; failed?: number; + ok?: boolean; results?: GatewayLeadBroadcastBoardResult[]; + sent?: number; } diff --git a/frontend/src/api/generated/model/gatewayLeadMessageRequest.ts b/frontend/src/api/generated/model/gatewayLeadMessageRequest.ts index 0cb7d007..694b6857 100644 --- a/frontend/src/api/generated/model/gatewayLeadMessageRequest.ts +++ b/frontend/src/api/generated/model/gatewayLeadMessageRequest.ts @@ -10,10 +10,10 @@ import type { GatewayLeadMessageRequestKind } from "./gatewayLeadMessageRequestK * Request payload for sending a message to a board lead agent. */ export interface GatewayLeadMessageRequest { - kind?: GatewayLeadMessageRequestKind; - correlation_id?: string | null; /** @minLength 1 */ content: string; - reply_tags?: string[]; + correlation_id?: string | null; + kind?: GatewayLeadMessageRequestKind; reply_source?: string | null; + reply_tags?: string[]; } diff --git a/frontend/src/api/generated/model/gatewayLeadMessageResponse.ts b/frontend/src/api/generated/model/gatewayLeadMessageResponse.ts index 42f97f2b..00604cc5 100644 --- a/frontend/src/api/generated/model/gatewayLeadMessageResponse.ts +++ b/frontend/src/api/generated/model/gatewayLeadMessageResponse.ts @@ -9,9 +9,9 @@ * Response payload for a lead-message dispatch attempt. */ export interface GatewayLeadMessageResponse { - ok?: boolean; board_id: string; lead_agent_id?: string | null; lead_agent_name?: string | null; lead_created?: boolean; + ok?: boolean; } diff --git a/frontend/src/api/generated/model/gatewayMainAskUserRequest.ts b/frontend/src/api/generated/model/gatewayMainAskUserRequest.ts index 2a1289bd..9f410503 100644 --- a/frontend/src/api/generated/model/gatewayMainAskUserRequest.ts +++ b/frontend/src/api/generated/model/gatewayMainAskUserRequest.ts @@ -9,10 +9,10 @@ * Request payload for asking the end user via a main gateway agent. */ export interface GatewayMainAskUserRequest { - correlation_id?: string | null; /** @minLength 1 */ content: string; + correlation_id?: string | null; preferred_channel?: string | null; - reply_tags?: string[]; reply_source?: string | null; + reply_tags?: string[]; } diff --git a/frontend/src/api/generated/model/gatewayMainAskUserResponse.ts b/frontend/src/api/generated/model/gatewayMainAskUserResponse.ts index 37b4915b..544807bb 100644 --- a/frontend/src/api/generated/model/gatewayMainAskUserResponse.ts +++ b/frontend/src/api/generated/model/gatewayMainAskUserResponse.ts @@ -9,8 +9,8 @@ * Response payload for user-question dispatch via gateway main agent. */ export interface GatewayMainAskUserResponse { - ok?: boolean; board_id: string; main_agent_id?: string | null; main_agent_name?: string | null; + ok?: boolean; } diff --git a/frontend/src/api/generated/model/gatewayRead.ts b/frontend/src/api/generated/model/gatewayRead.ts index 03dcc40c..50404490 100644 --- a/frontend/src/api/generated/model/gatewayRead.ts +++ b/frontend/src/api/generated/model/gatewayRead.ts @@ -9,12 +9,12 @@ * Gateway payload returned from read endpoints. */ export interface GatewayRead { - name: string; - url: string; - workspace_root: string; + created_at: string; id: string; + name: string; organization_id: string; token?: string | null; - created_at: string; updated_at: string; + url: string; + workspace_root: string; } diff --git a/frontend/src/api/generated/model/gatewaySessionsResponse.ts b/frontend/src/api/generated/model/gatewaySessionsResponse.ts index fba71fc7..8cf60e10 100644 --- a/frontend/src/api/generated/model/gatewaySessionsResponse.ts +++ b/frontend/src/api/generated/model/gatewaySessionsResponse.ts @@ -9,6 +9,6 @@ * Gateway sessions list response payload. */ export interface GatewaySessionsResponse { - sessions: unknown[]; main_session?: unknown | null; + sessions: unknown[]; } diff --git a/frontend/src/api/generated/model/gatewayTemplatesSyncResult.ts b/frontend/src/api/generated/model/gatewayTemplatesSyncResult.ts index 2eb14d87..f6e19d8c 100644 --- a/frontend/src/api/generated/model/gatewayTemplatesSyncResult.ts +++ b/frontend/src/api/generated/model/gatewayTemplatesSyncResult.ts @@ -10,11 +10,11 @@ import type { GatewayTemplatesSyncError } from "./gatewayTemplatesSyncError"; * Summary payload returned by gateway template sync endpoints. */ export interface GatewayTemplatesSyncResult { + agents_skipped: number; + agents_updated: number; + errors?: GatewayTemplatesSyncError[]; gateway_id: string; include_main: boolean; - reset_sessions: boolean; - agents_updated: number; - agents_skipped: number; main_updated: boolean; - errors?: GatewayTemplatesSyncError[]; + reset_sessions: boolean; } diff --git a/frontend/src/api/generated/model/gatewayUpdate.ts b/frontend/src/api/generated/model/gatewayUpdate.ts index e5f237ef..512955f8 100644 --- a/frontend/src/api/generated/model/gatewayUpdate.ts +++ b/frontend/src/api/generated/model/gatewayUpdate.ts @@ -10,7 +10,7 @@ */ export interface GatewayUpdate { name?: string | null; - url?: string | null; token?: string | null; + url?: string | null; workspace_root?: string | null; } diff --git a/frontend/src/api/generated/model/gatewaysStatusResponse.ts b/frontend/src/api/generated/model/gatewaysStatusResponse.ts index 0c591e17..cea5a7a7 100644 --- a/frontend/src/api/generated/model/gatewaysStatusResponse.ts +++ b/frontend/src/api/generated/model/gatewaysStatusResponse.ts @@ -10,10 +10,10 @@ */ export interface GatewaysStatusResponse { connected: boolean; + error?: string | null; gateway_url: string; - sessions_count?: number | null; - sessions?: unknown[] | null; main_session?: unknown | null; main_session_error?: string | null; - error?: string | null; + sessions?: unknown[] | null; + sessions_count?: number | null; } diff --git a/frontend/src/api/generated/model/index.ts b/frontend/src/api/generated/model/index.ts index 2ec29e20..da94c881 100644 --- a/frontend/src/api/generated/model/index.ts +++ b/frontend/src/api/generated/model/index.ts @@ -188,14 +188,25 @@ export * from "./tagRead"; export * from "./tagRef"; export * from "./tagUpdate"; export * from "./taskCardRead"; +export * from "./taskCardReadCustomFieldValues"; export * from "./taskCardReadStatus"; export * from "./taskCommentCreate"; export * from "./taskCommentRead"; export * from "./taskCreate"; +export * from "./taskCreateCustomFieldValues"; export * from "./taskCreateStatus"; +export * from "./taskCustomFieldDefinitionCreate"; +export * from "./taskCustomFieldDefinitionCreateFieldType"; +export * from "./taskCustomFieldDefinitionCreateUiVisibility"; +export * from "./taskCustomFieldDefinitionRead"; +export * from "./taskCustomFieldDefinitionReadFieldType"; +export * from "./taskCustomFieldDefinitionReadUiVisibility"; +export * from "./taskCustomFieldDefinitionUpdate"; export * from "./taskRead"; +export * from "./taskReadCustomFieldValues"; export * from "./taskReadStatus"; export * from "./taskUpdate"; +export * from "./taskUpdateCustomFieldValues"; export * from "./updateAgentApiV1AgentsAgentIdPatchParams"; export * from "./userRead"; export * from "./userUpdate"; diff --git a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedActivityEventRead.ts b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedActivityEventRead.ts index 2cb816c0..78b90866 100644 --- a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedActivityEventRead.ts +++ b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedActivityEventRead.ts @@ -8,10 +8,10 @@ import type { ActivityEventRead } from "./activityEventRead"; export interface LimitOffsetPageTypeVarCustomizedActivityEventRead { items: ActivityEventRead[]; - /** @minimum 0 */ - total: number; /** @minimum 1 */ limit: number; /** @minimum 0 */ offset: number; + /** @minimum 0 */ + total: number; } diff --git a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedActivityTaskCommentFeedItemRead.ts b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedActivityTaskCommentFeedItemRead.ts index bf550703..f39d782b 100644 --- a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedActivityTaskCommentFeedItemRead.ts +++ b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedActivityTaskCommentFeedItemRead.ts @@ -8,10 +8,10 @@ import type { ActivityTaskCommentFeedItemRead } from "./activityTaskCommentFeedI export interface LimitOffsetPageTypeVarCustomizedActivityTaskCommentFeedItemRead { items: ActivityTaskCommentFeedItemRead[]; - /** @minimum 0 */ - total: number; /** @minimum 1 */ limit: number; /** @minimum 0 */ offset: number; + /** @minimum 0 */ + total: number; } diff --git a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedAgentRead.ts b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedAgentRead.ts index 64dba628..7c254542 100644 --- a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedAgentRead.ts +++ b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedAgentRead.ts @@ -8,10 +8,10 @@ import type { AgentRead } from "./agentRead"; export interface LimitOffsetPageTypeVarCustomizedAgentRead { items: AgentRead[]; - /** @minimum 0 */ - total: number; /** @minimum 1 */ limit: number; /** @minimum 0 */ offset: number; + /** @minimum 0 */ + total: number; } diff --git a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedApprovalRead.ts b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedApprovalRead.ts index 7b912d65..0d66176c 100644 --- a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedApprovalRead.ts +++ b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedApprovalRead.ts @@ -8,10 +8,10 @@ import type { ApprovalRead } from "./approvalRead"; export interface LimitOffsetPageTypeVarCustomizedApprovalRead { items: ApprovalRead[]; - /** @minimum 0 */ - total: number; /** @minimum 1 */ limit: number; /** @minimum 0 */ offset: number; + /** @minimum 0 */ + total: number; } diff --git a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedBoardGroupMemoryRead.ts b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedBoardGroupMemoryRead.ts index 94e07678..5588cd95 100644 --- a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedBoardGroupMemoryRead.ts +++ b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedBoardGroupMemoryRead.ts @@ -8,10 +8,10 @@ import type { BoardGroupMemoryRead } from "./boardGroupMemoryRead"; export interface LimitOffsetPageTypeVarCustomizedBoardGroupMemoryRead { items: BoardGroupMemoryRead[]; - /** @minimum 0 */ - total: number; /** @minimum 1 */ limit: number; /** @minimum 0 */ offset: number; + /** @minimum 0 */ + total: number; } diff --git a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedBoardGroupRead.ts b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedBoardGroupRead.ts index 95689ab5..ea0633d8 100644 --- a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedBoardGroupRead.ts +++ b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedBoardGroupRead.ts @@ -8,10 +8,10 @@ import type { BoardGroupRead } from "./boardGroupRead"; export interface LimitOffsetPageTypeVarCustomizedBoardGroupRead { items: BoardGroupRead[]; - /** @minimum 0 */ - total: number; /** @minimum 1 */ limit: number; /** @minimum 0 */ offset: number; + /** @minimum 0 */ + total: number; } diff --git a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedBoardMemoryRead.ts b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedBoardMemoryRead.ts index 5af7a346..fdf4acda 100644 --- a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedBoardMemoryRead.ts +++ b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedBoardMemoryRead.ts @@ -8,10 +8,10 @@ import type { BoardMemoryRead } from "./boardMemoryRead"; export interface LimitOffsetPageTypeVarCustomizedBoardMemoryRead { items: BoardMemoryRead[]; - /** @minimum 0 */ - total: number; /** @minimum 1 */ limit: number; /** @minimum 0 */ offset: number; + /** @minimum 0 */ + total: number; } diff --git a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedBoardRead.ts b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedBoardRead.ts index dffce1a2..d182bde6 100644 --- a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedBoardRead.ts +++ b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedBoardRead.ts @@ -8,10 +8,10 @@ import type { BoardRead } from "./boardRead"; export interface LimitOffsetPageTypeVarCustomizedBoardRead { items: BoardRead[]; - /** @minimum 0 */ - total: number; /** @minimum 1 */ limit: number; /** @minimum 0 */ offset: number; + /** @minimum 0 */ + total: number; } diff --git a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedGatewayRead.ts b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedGatewayRead.ts index 26228745..3bae8a3d 100644 --- a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedGatewayRead.ts +++ b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedGatewayRead.ts @@ -8,10 +8,10 @@ import type { GatewayRead } from "./gatewayRead"; export interface LimitOffsetPageTypeVarCustomizedGatewayRead { items: GatewayRead[]; - /** @minimum 0 */ - total: number; /** @minimum 1 */ limit: number; /** @minimum 0 */ offset: number; + /** @minimum 0 */ + total: number; } diff --git a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedOrganizationInviteRead.ts b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedOrganizationInviteRead.ts index 0640e516..cb770aa4 100644 --- a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedOrganizationInviteRead.ts +++ b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedOrganizationInviteRead.ts @@ -8,10 +8,10 @@ import type { OrganizationInviteRead } from "./organizationInviteRead"; export interface LimitOffsetPageTypeVarCustomizedOrganizationInviteRead { items: OrganizationInviteRead[]; - /** @minimum 0 */ - total: number; /** @minimum 1 */ limit: number; /** @minimum 0 */ offset: number; + /** @minimum 0 */ + total: number; } diff --git a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedOrganizationMemberRead.ts b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedOrganizationMemberRead.ts index 733e3cb6..f616673f 100644 --- a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedOrganizationMemberRead.ts +++ b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedOrganizationMemberRead.ts @@ -8,10 +8,10 @@ import type { OrganizationMemberRead } from "./organizationMemberRead"; export interface LimitOffsetPageTypeVarCustomizedOrganizationMemberRead { items: OrganizationMemberRead[]; - /** @minimum 0 */ - total: number; /** @minimum 1 */ limit: number; /** @minimum 0 */ offset: number; + /** @minimum 0 */ + total: number; } diff --git a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedTagRead.ts b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedTagRead.ts index d1e4e40f..521dff88 100644 --- a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedTagRead.ts +++ b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedTagRead.ts @@ -8,10 +8,10 @@ import type { TagRead } from "./tagRead"; export interface LimitOffsetPageTypeVarCustomizedTagRead { items: TagRead[]; - /** @minimum 0 */ - total: number; /** @minimum 1 */ limit: number; /** @minimum 0 */ offset: number; + /** @minimum 0 */ + total: number; } diff --git a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedTaskCommentRead.ts b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedTaskCommentRead.ts index 9fcfca2c..dcb134f1 100644 --- a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedTaskCommentRead.ts +++ b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedTaskCommentRead.ts @@ -8,10 +8,10 @@ import type { TaskCommentRead } from "./taskCommentRead"; export interface LimitOffsetPageTypeVarCustomizedTaskCommentRead { items: TaskCommentRead[]; - /** @minimum 0 */ - total: number; /** @minimum 1 */ limit: number; /** @minimum 0 */ offset: number; + /** @minimum 0 */ + total: number; } diff --git a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedTaskRead.ts b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedTaskRead.ts index a22715a0..789f482b 100644 --- a/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedTaskRead.ts +++ b/frontend/src/api/generated/model/limitOffsetPageTypeVarCustomizedTaskRead.ts @@ -8,10 +8,10 @@ import type { TaskRead } from "./taskRead"; export interface LimitOffsetPageTypeVarCustomizedTaskRead { items: TaskRead[]; - /** @minimum 0 */ - total: number; /** @minimum 1 */ limit: number; /** @minimum 0 */ offset: number; + /** @minimum 0 */ + total: number; } diff --git a/frontend/src/api/generated/model/organizationBoardAccessRead.ts b/frontend/src/api/generated/model/organizationBoardAccessRead.ts index 927cc9b0..19b75f29 100644 --- a/frontend/src/api/generated/model/organizationBoardAccessRead.ts +++ b/frontend/src/api/generated/model/organizationBoardAccessRead.ts @@ -9,10 +9,10 @@ * Board access payload returned from read endpoints. */ export interface OrganizationBoardAccessRead { - id: string; board_id: string; can_read: boolean; can_write: boolean; created_at: string; + id: string; updated_at: string; } diff --git a/frontend/src/api/generated/model/organizationInviteCreate.ts b/frontend/src/api/generated/model/organizationInviteCreate.ts index 6cd653f0..ef8e9074 100644 --- a/frontend/src/api/generated/model/organizationInviteCreate.ts +++ b/frontend/src/api/generated/model/organizationInviteCreate.ts @@ -10,9 +10,9 @@ import type { OrganizationBoardAccessSpec } from "./organizationBoardAccessSpec" * Payload for creating an organization invite. */ export interface OrganizationInviteCreate { - invited_email: string; - role?: string; all_boards_read?: boolean; all_boards_write?: boolean; board_access?: OrganizationBoardAccessSpec[]; + invited_email: string; + role?: string; } diff --git a/frontend/src/api/generated/model/organizationInviteRead.ts b/frontend/src/api/generated/model/organizationInviteRead.ts index 643a2691..5cba137c 100644 --- a/frontend/src/api/generated/model/organizationInviteRead.ts +++ b/frontend/src/api/generated/model/organizationInviteRead.ts @@ -9,16 +9,16 @@ * Organization invite payload returned from read endpoints. */ export interface OrganizationInviteRead { - id: string; - organization_id: string; - invited_email: string; - role: string; + accepted_at?: string | null; + accepted_by_user_id?: string | null; all_boards_read: boolean; all_boards_write: boolean; - token: string; - created_by_user_id?: string | null; - accepted_by_user_id?: string | null; - accepted_at?: string | null; created_at: string; + created_by_user_id?: string | null; + id: string; + invited_email: string; + organization_id: string; + role: string; + token: string; updated_at: string; } diff --git a/frontend/src/api/generated/model/organizationListItem.ts b/frontend/src/api/generated/model/organizationListItem.ts index 2283299c..4c3cc08f 100644 --- a/frontend/src/api/generated/model/organizationListItem.ts +++ b/frontend/src/api/generated/model/organizationListItem.ts @@ -10,7 +10,7 @@ */ export interface OrganizationListItem { id: string; + is_active: boolean; name: string; role: string; - is_active: boolean; } diff --git a/frontend/src/api/generated/model/organizationMemberRead.ts b/frontend/src/api/generated/model/organizationMemberRead.ts index 9516d4ed..5e91c9a9 100644 --- a/frontend/src/api/generated/model/organizationMemberRead.ts +++ b/frontend/src/api/generated/model/organizationMemberRead.ts @@ -11,14 +11,14 @@ import type { OrganizationUserRead } from "./organizationUserRead"; * Organization member payload including board-level access overrides. */ export interface OrganizationMemberRead { - id: string; - organization_id: string; - user_id: string; - role: string; all_boards_read: boolean; all_boards_write: boolean; + board_access?: OrganizationBoardAccessRead[]; created_at: string; + id: string; + organization_id: string; + role: string; updated_at: string; user?: OrganizationUserRead | null; - board_access?: OrganizationBoardAccessRead[]; + user_id: string; } diff --git a/frontend/src/api/generated/model/organizationRead.ts b/frontend/src/api/generated/model/organizationRead.ts index 7c161e21..8e45126d 100644 --- a/frontend/src/api/generated/model/organizationRead.ts +++ b/frontend/src/api/generated/model/organizationRead.ts @@ -9,8 +9,8 @@ * Organization payload returned by read endpoints. */ export interface OrganizationRead { + created_at: string; id: string; name: string; - created_at: string; updated_at: string; } diff --git a/frontend/src/api/generated/model/organizationUserRead.ts b/frontend/src/api/generated/model/organizationUserRead.ts index 592145dc..490973d0 100644 --- a/frontend/src/api/generated/model/organizationUserRead.ts +++ b/frontend/src/api/generated/model/organizationUserRead.ts @@ -9,8 +9,8 @@ * Embedded user fields included in organization member payloads. */ export interface OrganizationUserRead { - id: string; email?: string | null; + id: string; name?: string | null; preferred_name?: string | null; } diff --git a/frontend/src/api/generated/model/soulUpdateRequest.ts b/frontend/src/api/generated/model/soulUpdateRequest.ts index 7d7865a8..4e0e840f 100644 --- a/frontend/src/api/generated/model/soulUpdateRequest.ts +++ b/frontend/src/api/generated/model/soulUpdateRequest.ts @@ -10,6 +10,6 @@ */ export interface SoulUpdateRequest { content: string; - source_url?: string | null; reason?: string | null; + source_url?: string | null; } diff --git a/frontend/src/api/generated/model/soulsDirectoryMarkdownResponse.ts b/frontend/src/api/generated/model/soulsDirectoryMarkdownResponse.ts index e10e4545..a7af0d70 100644 --- a/frontend/src/api/generated/model/soulsDirectoryMarkdownResponse.ts +++ b/frontend/src/api/generated/model/soulsDirectoryMarkdownResponse.ts @@ -9,7 +9,7 @@ * Response payload containing rendered markdown for a soul. */ export interface SoulsDirectoryMarkdownResponse { + content: string; handle: string; slug: string; - content: string; } diff --git a/frontend/src/api/generated/model/soulsDirectorySoulRef.ts b/frontend/src/api/generated/model/soulsDirectorySoulRef.ts index 01bdf80a..6c1bb0a4 100644 --- a/frontend/src/api/generated/model/soulsDirectorySoulRef.ts +++ b/frontend/src/api/generated/model/soulsDirectorySoulRef.ts @@ -10,7 +10,7 @@ */ export interface SoulsDirectorySoulRef { handle: string; - slug: string; page_url: string; raw_md_url: string; + slug: string; } diff --git a/frontend/src/api/generated/model/tagCreate.ts b/frontend/src/api/generated/model/tagCreate.ts index 5c5575c6..9c754724 100644 --- a/frontend/src/api/generated/model/tagCreate.ts +++ b/frontend/src/api/generated/model/tagCreate.ts @@ -9,9 +9,9 @@ * Payload for creating a tag. */ export interface TagCreate { + color?: string; + description?: string | null; /** @minLength 1 */ name: string; slug?: string | null; - color?: string; - description?: string | null; } diff --git a/frontend/src/api/generated/model/tagRead.ts b/frontend/src/api/generated/model/tagRead.ts index 49590325..af1d3bd3 100644 --- a/frontend/src/api/generated/model/tagRead.ts +++ b/frontend/src/api/generated/model/tagRead.ts @@ -9,13 +9,13 @@ * Tag payload returned from API endpoints. */ export interface TagRead { - name: string; - slug: string; color?: string; + created_at: string; description?: string | null; id: string; + name: string; organization_id: string; + slug: string; task_count?: number; - created_at: string; updated_at: string; } diff --git a/frontend/src/api/generated/model/tagRef.ts b/frontend/src/api/generated/model/tagRef.ts index 2493c4fd..9b7d745b 100644 --- a/frontend/src/api/generated/model/tagRef.ts +++ b/frontend/src/api/generated/model/tagRef.ts @@ -9,8 +9,8 @@ * Compact tag representation embedded in task payloads. */ export interface TagRef { + color: string; id: string; name: string; slug: string; - color: string; } diff --git a/frontend/src/api/generated/model/tagUpdate.ts b/frontend/src/api/generated/model/tagUpdate.ts index 7877bcb8..4a18b9df 100644 --- a/frontend/src/api/generated/model/tagUpdate.ts +++ b/frontend/src/api/generated/model/tagUpdate.ts @@ -9,8 +9,8 @@ * Payload for partial tag updates. */ export interface TagUpdate { - name?: string | null; - slug?: string | null; color?: string | null; description?: string | null; + name?: string | null; + slug?: string | null; } diff --git a/frontend/src/api/generated/model/taskCardRead.ts b/frontend/src/api/generated/model/taskCardRead.ts index fc2a40fc..02025221 100644 --- a/frontend/src/api/generated/model/taskCardRead.ts +++ b/frontend/src/api/generated/model/taskCardRead.ts @@ -5,30 +5,32 @@ * OpenAPI spec version: 0.1.0 */ import type { TagRef } from "./tagRef"; +import type { TaskCardReadCustomFieldValues } from "./taskCardReadCustomFieldValues"; import type { TaskCardReadStatus } from "./taskCardReadStatus"; /** * Task read model enriched with assignee and approval counters. */ export interface TaskCardRead { - title: string; - description?: string | null; - status?: TaskCardReadStatus; - priority?: string; - due_at?: string | null; - assigned_agent_id?: string | null; - depends_on_task_ids?: string[]; - tag_ids?: string[]; - id: string; - board_id: string | null; - created_by_user_id: string | null; - in_progress_at: string | null; - created_at: string; - updated_at: string; - blocked_by_task_ids?: string[]; - is_blocked?: boolean; - tags?: TagRef[]; - assignee?: string | null; approvals_count?: number; approvals_pending_count?: number; + assigned_agent_id?: string | null; + assignee?: string | null; + blocked_by_task_ids?: string[]; + board_id: string | null; + created_at: string; + created_by_user_id: string | null; + custom_field_values?: TaskCardReadCustomFieldValues; + depends_on_task_ids?: string[]; + description?: string | null; + due_at?: string | null; + id: string; + in_progress_at: string | null; + is_blocked?: boolean; + priority?: string; + status?: TaskCardReadStatus; + tag_ids?: string[]; + tags?: TagRef[]; + title: string; + updated_at: string; } diff --git a/frontend/src/api/generated/model/taskCardReadCustomFieldValues.ts b/frontend/src/api/generated/model/taskCardReadCustomFieldValues.ts new file mode 100644 index 00000000..0eee1a71 --- /dev/null +++ b/frontend/src/api/generated/model/taskCardReadCustomFieldValues.ts @@ -0,0 +1,10 @@ +/** + * Generated by orval v8.3.0 🍺 + * Do not edit manually. + * Mission Control API + * OpenAPI spec version: 0.1.0 + */ + +export type TaskCardReadCustomFieldValues = { + [key: string]: unknown | null; +} | null; diff --git a/frontend/src/api/generated/model/taskCommentRead.ts b/frontend/src/api/generated/model/taskCommentRead.ts index 689f082c..faec4310 100644 --- a/frontend/src/api/generated/model/taskCommentRead.ts +++ b/frontend/src/api/generated/model/taskCommentRead.ts @@ -9,9 +9,9 @@ * Task comment payload returned from read endpoints. */ export interface TaskCommentRead { + agent_id: string | null; + created_at: string; id: string; message: string | null; - agent_id: string | null; task_id: string | null; - created_at: string; } diff --git a/frontend/src/api/generated/model/taskCreate.ts b/frontend/src/api/generated/model/taskCreate.ts index 5301d69a..a8572c23 100644 --- a/frontend/src/api/generated/model/taskCreate.ts +++ b/frontend/src/api/generated/model/taskCreate.ts @@ -4,19 +4,21 @@ * Mission Control API * OpenAPI spec version: 0.1.0 */ +import type { TaskCreateCustomFieldValues } from "./taskCreateCustomFieldValues"; import type { TaskCreateStatus } from "./taskCreateStatus"; /** * Payload for creating a task. */ export interface TaskCreate { - title: string; - description?: string | null; - status?: TaskCreateStatus; - priority?: string; - due_at?: string | null; assigned_agent_id?: string | null; - depends_on_task_ids?: string[]; - tag_ids?: string[]; created_by_user_id?: string | null; + custom_field_values?: TaskCreateCustomFieldValues; + depends_on_task_ids?: string[]; + description?: string | null; + due_at?: string | null; + priority?: string; + status?: TaskCreateStatus; + tag_ids?: string[]; + title: string; } diff --git a/frontend/src/api/generated/model/taskCreateCustomFieldValues.ts b/frontend/src/api/generated/model/taskCreateCustomFieldValues.ts new file mode 100644 index 00000000..7bf9de09 --- /dev/null +++ b/frontend/src/api/generated/model/taskCreateCustomFieldValues.ts @@ -0,0 +1,8 @@ +/** + * Generated by orval v8.3.0 🍺 + * Do not edit manually. + * Mission Control API + * OpenAPI spec version: 0.1.0 + */ + +export type TaskCreateCustomFieldValues = { [key: string]: unknown | null }; diff --git a/frontend/src/api/generated/model/taskCustomFieldDefinitionCreate.ts b/frontend/src/api/generated/model/taskCustomFieldDefinitionCreate.ts new file mode 100644 index 00000000..b3486163 --- /dev/null +++ b/frontend/src/api/generated/model/taskCustomFieldDefinitionCreate.ts @@ -0,0 +1,25 @@ +/** + * Generated by orval v8.3.0 🍺 + * Do not edit manually. + * Mission Control API + * OpenAPI spec version: 0.1.0 + */ +import type { TaskCustomFieldDefinitionCreateFieldType } from "./taskCustomFieldDefinitionCreateFieldType"; +import type { TaskCustomFieldDefinitionCreateUiVisibility } from "./taskCustomFieldDefinitionCreateUiVisibility"; + +/** + * Payload for creating a task custom field definition. + */ +export interface TaskCustomFieldDefinitionCreate { + /** @minItems 1 */ + board_ids: string[]; + default_value?: unknown | null; + description?: string | null; + /** @minLength 1 */ + field_key: string; + field_type?: TaskCustomFieldDefinitionCreateFieldType; + label?: string | null; + required?: boolean; + ui_visibility?: TaskCustomFieldDefinitionCreateUiVisibility; + validation_regex?: string | null; +} diff --git a/frontend/src/api/generated/model/taskCustomFieldDefinitionCreateFieldType.ts b/frontend/src/api/generated/model/taskCustomFieldDefinitionCreateFieldType.ts new file mode 100644 index 00000000..82b9474c --- /dev/null +++ b/frontend/src/api/generated/model/taskCustomFieldDefinitionCreateFieldType.ts @@ -0,0 +1,21 @@ +/** + * Generated by orval v8.3.0 🍺 + * Do not edit manually. + * Mission Control API + * OpenAPI spec version: 0.1.0 + */ + +export type TaskCustomFieldDefinitionCreateFieldType = + (typeof TaskCustomFieldDefinitionCreateFieldType)[keyof typeof TaskCustomFieldDefinitionCreateFieldType]; + +export const TaskCustomFieldDefinitionCreateFieldType = { + text: "text", + text_long: "text_long", + integer: "integer", + decimal: "decimal", + boolean: "boolean", + date: "date", + date_time: "date_time", + url: "url", + json: "json", +} as const; diff --git a/frontend/src/api/generated/model/taskCustomFieldDefinitionCreateUiVisibility.ts b/frontend/src/api/generated/model/taskCustomFieldDefinitionCreateUiVisibility.ts new file mode 100644 index 00000000..9ad2cb22 --- /dev/null +++ b/frontend/src/api/generated/model/taskCustomFieldDefinitionCreateUiVisibility.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v8.3.0 🍺 + * Do not edit manually. + * Mission Control API + * OpenAPI spec version: 0.1.0 + */ + +export type TaskCustomFieldDefinitionCreateUiVisibility = + (typeof TaskCustomFieldDefinitionCreateUiVisibility)[keyof typeof TaskCustomFieldDefinitionCreateUiVisibility]; + +export const TaskCustomFieldDefinitionCreateUiVisibility = { + always: "always", + if_set: "if_set", + hidden: "hidden", +} as const; diff --git a/frontend/src/api/generated/model/taskCustomFieldDefinitionRead.ts b/frontend/src/api/generated/model/taskCustomFieldDefinitionRead.ts new file mode 100644 index 00000000..52c80665 --- /dev/null +++ b/frontend/src/api/generated/model/taskCustomFieldDefinitionRead.ts @@ -0,0 +1,27 @@ +/** + * Generated by orval v8.3.0 🍺 + * Do not edit manually. + * Mission Control API + * OpenAPI spec version: 0.1.0 + */ +import type { TaskCustomFieldDefinitionReadFieldType } from "./taskCustomFieldDefinitionReadFieldType"; +import type { TaskCustomFieldDefinitionReadUiVisibility } from "./taskCustomFieldDefinitionReadUiVisibility"; + +/** + * Payload returned for custom field definitions. + */ +export interface TaskCustomFieldDefinitionRead { + board_ids?: string[]; + created_at: string; + default_value?: unknown | null; + description?: string | null; + field_key: string; + field_type: TaskCustomFieldDefinitionReadFieldType; + id: string; + label: string; + organization_id: string; + required?: boolean; + ui_visibility: TaskCustomFieldDefinitionReadUiVisibility; + updated_at: string; + validation_regex?: string | null; +} diff --git a/frontend/src/api/generated/model/taskCustomFieldDefinitionReadFieldType.ts b/frontend/src/api/generated/model/taskCustomFieldDefinitionReadFieldType.ts new file mode 100644 index 00000000..ac067c79 --- /dev/null +++ b/frontend/src/api/generated/model/taskCustomFieldDefinitionReadFieldType.ts @@ -0,0 +1,21 @@ +/** + * Generated by orval v8.3.0 🍺 + * Do not edit manually. + * Mission Control API + * OpenAPI spec version: 0.1.0 + */ + +export type TaskCustomFieldDefinitionReadFieldType = + (typeof TaskCustomFieldDefinitionReadFieldType)[keyof typeof TaskCustomFieldDefinitionReadFieldType]; + +export const TaskCustomFieldDefinitionReadFieldType = { + text: "text", + text_long: "text_long", + integer: "integer", + decimal: "decimal", + boolean: "boolean", + date: "date", + date_time: "date_time", + url: "url", + json: "json", +} as const; diff --git a/frontend/src/api/generated/model/taskCustomFieldDefinitionReadUiVisibility.ts b/frontend/src/api/generated/model/taskCustomFieldDefinitionReadUiVisibility.ts new file mode 100644 index 00000000..6719c08d --- /dev/null +++ b/frontend/src/api/generated/model/taskCustomFieldDefinitionReadUiVisibility.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v8.3.0 🍺 + * Do not edit manually. + * Mission Control API + * OpenAPI spec version: 0.1.0 + */ + +export type TaskCustomFieldDefinitionReadUiVisibility = + (typeof TaskCustomFieldDefinitionReadUiVisibility)[keyof typeof TaskCustomFieldDefinitionReadUiVisibility]; + +export const TaskCustomFieldDefinitionReadUiVisibility = { + always: "always", + if_set: "if_set", + hidden: "hidden", +} as const; diff --git a/frontend/src/api/generated/model/taskCustomFieldDefinitionUpdate.ts b/frontend/src/api/generated/model/taskCustomFieldDefinitionUpdate.ts new file mode 100644 index 00000000..7beeb437 --- /dev/null +++ b/frontend/src/api/generated/model/taskCustomFieldDefinitionUpdate.ts @@ -0,0 +1,30 @@ +/** + * Generated by orval v8.3.0 🍺 + * Do not edit manually. + * Mission Control API + * OpenAPI spec version: 0.1.0 + */ + +/** + * Payload for editing an existing task custom field definition. + */ +export interface TaskCustomFieldDefinitionUpdate { + board_ids?: string[] | null; + default_value?: unknown | null; + description?: string | null; + field_type?: + | "text" + | "text_long" + | "integer" + | "decimal" + | "boolean" + | "date" + | "date_time" + | "url" + | "json" + | null; + label?: string | null; + required?: boolean | null; + ui_visibility?: "always" | "if_set" | "hidden" | null; + validation_regex?: string | null; +} diff --git a/frontend/src/api/generated/model/taskRead.ts b/frontend/src/api/generated/model/taskRead.ts index 04379690..5d874413 100644 --- a/frontend/src/api/generated/model/taskRead.ts +++ b/frontend/src/api/generated/model/taskRead.ts @@ -5,27 +5,29 @@ * OpenAPI spec version: 0.1.0 */ import type { TagRef } from "./tagRef"; +import type { TaskReadCustomFieldValues } from "./taskReadCustomFieldValues"; import type { TaskReadStatus } from "./taskReadStatus"; /** * Task payload returned from read endpoints. */ export interface TaskRead { - title: string; - description?: string | null; - status?: TaskReadStatus; - priority?: string; - due_at?: string | null; assigned_agent_id?: string | null; - depends_on_task_ids?: string[]; - tag_ids?: string[]; - id: string; - board_id: string | null; - created_by_user_id: string | null; - in_progress_at: string | null; - created_at: string; - updated_at: string; blocked_by_task_ids?: string[]; + board_id: string | null; + created_at: string; + created_by_user_id: string | null; + custom_field_values?: TaskReadCustomFieldValues; + depends_on_task_ids?: string[]; + description?: string | null; + due_at?: string | null; + id: string; + in_progress_at: string | null; is_blocked?: boolean; + priority?: string; + status?: TaskReadStatus; + tag_ids?: string[]; tags?: TagRef[]; + title: string; + updated_at: string; } diff --git a/frontend/src/api/generated/model/taskReadCustomFieldValues.ts b/frontend/src/api/generated/model/taskReadCustomFieldValues.ts new file mode 100644 index 00000000..c7aa6fbc --- /dev/null +++ b/frontend/src/api/generated/model/taskReadCustomFieldValues.ts @@ -0,0 +1,10 @@ +/** + * Generated by orval v8.3.0 🍺 + * Do not edit manually. + * Mission Control API + * OpenAPI spec version: 0.1.0 + */ + +export type TaskReadCustomFieldValues = { + [key: string]: unknown | null; +} | null; diff --git a/frontend/src/api/generated/model/taskUpdate.ts b/frontend/src/api/generated/model/taskUpdate.ts index 43118546..ddaa9936 100644 --- a/frontend/src/api/generated/model/taskUpdate.ts +++ b/frontend/src/api/generated/model/taskUpdate.ts @@ -4,18 +4,20 @@ * Mission Control API * OpenAPI spec version: 0.1.0 */ +import type { TaskUpdateCustomFieldValues } from "./taskUpdateCustomFieldValues"; /** * Payload for partial task updates. */ export interface TaskUpdate { - title?: string | null; - description?: string | null; - status?: "inbox" | "in_progress" | "review" | "done" | null; - priority?: string | null; - due_at?: string | null; assigned_agent_id?: string | null; - depends_on_task_ids?: string[] | null; - tag_ids?: string[] | null; comment?: string | null; + custom_field_values?: TaskUpdateCustomFieldValues; + depends_on_task_ids?: string[] | null; + description?: string | null; + due_at?: string | null; + priority?: string | null; + status?: "inbox" | "in_progress" | "review" | "done" | null; + tag_ids?: string[] | null; + title?: string | null; } diff --git a/frontend/src/api/generated/model/taskUpdateCustomFieldValues.ts b/frontend/src/api/generated/model/taskUpdateCustomFieldValues.ts new file mode 100644 index 00000000..d1dfaa0a --- /dev/null +++ b/frontend/src/api/generated/model/taskUpdateCustomFieldValues.ts @@ -0,0 +1,10 @@ +/** + * Generated by orval v8.3.0 🍺 + * Do not edit manually. + * Mission Control API + * OpenAPI spec version: 0.1.0 + */ + +export type TaskUpdateCustomFieldValues = { + [key: string]: unknown | null; +} | null; diff --git a/frontend/src/api/generated/model/userRead.ts b/frontend/src/api/generated/model/userRead.ts index 2b61ff85..6c345868 100644 --- a/frontend/src/api/generated/model/userRead.ts +++ b/frontend/src/api/generated/model/userRead.ts @@ -10,13 +10,13 @@ */ export interface UserRead { clerk_user_id: string; + context?: string | null; email?: string | null; + id: string; + is_super_admin: boolean; name?: string | null; + notes?: string | null; preferred_name?: string | null; pronouns?: string | null; timezone?: string | null; - notes?: string | null; - context?: string | null; - id: string; - is_super_admin: boolean; } diff --git a/frontend/src/api/generated/model/userUpdate.ts b/frontend/src/api/generated/model/userUpdate.ts index 7e196385..cc9ab997 100644 --- a/frontend/src/api/generated/model/userUpdate.ts +++ b/frontend/src/api/generated/model/userUpdate.ts @@ -9,10 +9,10 @@ * Payload for partial user profile updates. */ export interface UserUpdate { + context?: string | null; name?: string | null; + notes?: string | null; preferred_name?: string | null; pronouns?: string | null; timezone?: string | null; - notes?: string | null; - context?: string | null; } diff --git a/frontend/src/api/generated/model/validationError.ts b/frontend/src/api/generated/model/validationError.ts index 1308b621..b40de80c 100644 --- a/frontend/src/api/generated/model/validationError.ts +++ b/frontend/src/api/generated/model/validationError.ts @@ -7,9 +7,9 @@ import type { ValidationErrorCtx } from "./validationErrorCtx"; export interface ValidationError { + ctx?: ValidationErrorCtx; + input?: unknown; loc: (string | number)[]; msg: string; type: string; - input?: unknown; - ctx?: ValidationErrorCtx; } diff --git a/frontend/src/api/generated/org-custom-fields/org-custom-fields.ts b/frontend/src/api/generated/org-custom-fields/org-custom-fields.ts new file mode 100644 index 00000000..2f5e1c91 --- /dev/null +++ b/frontend/src/api/generated/org-custom-fields/org-custom-fields.ts @@ -0,0 +1,751 @@ +/** + * Generated by orval v8.3.0 🍺 + * Do not edit manually. + * Mission Control API + * OpenAPI spec version: 0.1.0 + */ +import { useMutation, useQuery } from "@tanstack/react-query"; +import type { + DataTag, + DefinedInitialDataOptions, + DefinedUseQueryResult, + MutationFunction, + QueryClient, + QueryFunction, + QueryKey, + UndefinedInitialDataOptions, + UseMutationOptions, + UseMutationResult, + UseQueryOptions, + UseQueryResult, +} from "@tanstack/react-query"; + +import type { + HTTPValidationError, + OkResponse, + TaskCustomFieldDefinitionCreate, + TaskCustomFieldDefinitionRead, + TaskCustomFieldDefinitionUpdate, +} from ".././model"; + +import { customFetch } from "../../mutator"; + +type SecondParameter unknown> = Parameters[1]; + +/** + * List task custom field definitions for the authenticated organization. + * @summary List Org Custom Fields + */ +export type listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGetResponse200 = + { + data: TaskCustomFieldDefinitionRead[]; + status: 200; + }; + +export type listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGetResponseSuccess = + listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGetResponse200 & { + headers: Headers; + }; +export type listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGetResponse = + listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGetResponseSuccess; + +export const getListOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGetUrl = + () => { + return `/api/v1/organizations/me/custom-fields`; + }; + +export const listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet = async ( + options?: RequestInit, +): Promise => { + return customFetch( + getListOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGetUrl(), + { + ...options, + method: "GET", + }, + ); +}; + +export const getListOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGetQueryKey = + () => { + return [`/api/v1/organizations/me/custom-fields`] as const; + }; + +export const getListOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGetQueryOptions = + < + TData = Awaited< + ReturnType + >, + TError = unknown, + >(options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType< + typeof listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet + > + >, + TError, + TData + > + >; + request?: SecondParameter; + }) => { + const { query: queryOptions, request: requestOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? + getListOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGetQueryKey(); + + const queryFn: QueryFunction< + Awaited< + ReturnType< + typeof listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet + > + > + > = ({ signal }) => + listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet({ + signal, + ...requestOptions, + }); + + return { queryKey, queryFn, ...queryOptions } as UseQueryOptions< + Awaited< + ReturnType< + typeof listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet + > + >, + TError, + TData + > & { queryKey: DataTag }; + }; + +export type ListOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGetQueryResult = + NonNullable< + Awaited< + ReturnType + > + >; +export type ListOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGetQueryError = + unknown; + +export function useListOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet< + TData = Awaited< + ReturnType + >, + TError = unknown, +>( + options: { + query: Partial< + UseQueryOptions< + Awaited< + ReturnType< + typeof listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet + > + >, + TError, + TData + > + > & + Pick< + DefinedInitialDataOptions< + Awaited< + ReturnType< + typeof listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet + > + >, + TError, + Awaited< + ReturnType< + typeof listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet + > + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): DefinedUseQueryResult & { + queryKey: DataTag; +}; +export function useListOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet< + TData = Awaited< + ReturnType + >, + TError = unknown, +>( + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType< + typeof listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet + > + >, + TError, + TData + > + > & + Pick< + UndefinedInitialDataOptions< + Awaited< + ReturnType< + typeof listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet + > + >, + TError, + Awaited< + ReturnType< + typeof listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet + > + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +export function useListOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet< + TData = Awaited< + ReturnType + >, + TError = unknown, +>( + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType< + typeof listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet + > + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +/** + * @summary List Org Custom Fields + */ + +export function useListOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet< + TData = Awaited< + ReturnType + >, + TError = unknown, +>( + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType< + typeof listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet + > + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +} { + const queryOptions = + getListOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGetQueryOptions( + options, + ); + + const query = useQuery(queryOptions, queryClient) as UseQueryResult< + TData, + TError + > & { queryKey: DataTag }; + + return { ...query, queryKey: queryOptions.queryKey }; +} + +/** + * Create an organization-level task custom field definition. + * @summary Create Org Custom Field + */ +export type createOrgCustomFieldApiV1OrganizationsMeCustomFieldsPostResponse200 = + { + data: TaskCustomFieldDefinitionRead; + status: 200; + }; + +export type createOrgCustomFieldApiV1OrganizationsMeCustomFieldsPostResponse422 = + { + data: HTTPValidationError; + status: 422; + }; + +export type createOrgCustomFieldApiV1OrganizationsMeCustomFieldsPostResponseSuccess = + createOrgCustomFieldApiV1OrganizationsMeCustomFieldsPostResponse200 & { + headers: Headers; + }; +export type createOrgCustomFieldApiV1OrganizationsMeCustomFieldsPostResponseError = + createOrgCustomFieldApiV1OrganizationsMeCustomFieldsPostResponse422 & { + headers: Headers; + }; + +export type createOrgCustomFieldApiV1OrganizationsMeCustomFieldsPostResponse = + | createOrgCustomFieldApiV1OrganizationsMeCustomFieldsPostResponseSuccess + | createOrgCustomFieldApiV1OrganizationsMeCustomFieldsPostResponseError; + +export const getCreateOrgCustomFieldApiV1OrganizationsMeCustomFieldsPostUrl = + () => { + return `/api/v1/organizations/me/custom-fields`; + }; + +export const createOrgCustomFieldApiV1OrganizationsMeCustomFieldsPost = async ( + taskCustomFieldDefinitionCreate: TaskCustomFieldDefinitionCreate, + options?: RequestInit, +): Promise => { + return customFetch( + getCreateOrgCustomFieldApiV1OrganizationsMeCustomFieldsPostUrl(), + { + ...options, + method: "POST", + headers: { "Content-Type": "application/json", ...options?.headers }, + body: JSON.stringify(taskCustomFieldDefinitionCreate), + }, + ); +}; + +export const getCreateOrgCustomFieldApiV1OrganizationsMeCustomFieldsPostMutationOptions = + (options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof createOrgCustomFieldApiV1OrganizationsMeCustomFieldsPost + > + >, + TError, + { data: TaskCustomFieldDefinitionCreate }, + TContext + >; + request?: SecondParameter; + }): UseMutationOptions< + Awaited< + ReturnType< + typeof createOrgCustomFieldApiV1OrganizationsMeCustomFieldsPost + > + >, + TError, + { data: TaskCustomFieldDefinitionCreate }, + TContext + > => { + const mutationKey = [ + "createOrgCustomFieldApiV1OrganizationsMeCustomFieldsPost", + ]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited< + ReturnType< + typeof createOrgCustomFieldApiV1OrganizationsMeCustomFieldsPost + > + >, + { data: TaskCustomFieldDefinitionCreate } + > = (props) => { + const { data } = props ?? {}; + + return createOrgCustomFieldApiV1OrganizationsMeCustomFieldsPost( + data, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; + }; + +export type CreateOrgCustomFieldApiV1OrganizationsMeCustomFieldsPostMutationResult = + NonNullable< + Awaited< + ReturnType< + typeof createOrgCustomFieldApiV1OrganizationsMeCustomFieldsPost + > + > + >; +export type CreateOrgCustomFieldApiV1OrganizationsMeCustomFieldsPostMutationBody = + TaskCustomFieldDefinitionCreate; +export type CreateOrgCustomFieldApiV1OrganizationsMeCustomFieldsPostMutationError = + HTTPValidationError; + +/** + * @summary Create Org Custom Field + */ +export const useCreateOrgCustomFieldApiV1OrganizationsMeCustomFieldsPost = < + TError = HTTPValidationError, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof createOrgCustomFieldApiV1OrganizationsMeCustomFieldsPost + > + >, + TError, + { data: TaskCustomFieldDefinitionCreate }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited< + ReturnType + >, + TError, + { data: TaskCustomFieldDefinitionCreate }, + TContext +> => { + return useMutation( + getCreateOrgCustomFieldApiV1OrganizationsMeCustomFieldsPostMutationOptions( + options, + ), + queryClient, + ); +}; +/** + * Delete an org-level definition when it has no persisted task values. + * @summary Delete Org Custom Field + */ +export type deleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDeleteResponse200 = + { + data: OkResponse; + status: 200; + }; + +export type deleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDeleteResponse422 = + { + data: HTTPValidationError; + status: 422; + }; + +export type deleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDeleteResponseSuccess = + deleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDeleteResponse200 & { + headers: Headers; + }; +export type deleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDeleteResponseError = + deleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDeleteResponse422 & { + headers: Headers; + }; + +export type deleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDeleteResponse = + + | deleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDeleteResponseSuccess + | deleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDeleteResponseError; + +export const getDeleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDeleteUrl = + (taskCustomFieldDefinitionId: string) => { + return `/api/v1/organizations/me/custom-fields/${taskCustomFieldDefinitionId}`; + }; + +export const deleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDelete = + async ( + taskCustomFieldDefinitionId: string, + options?: RequestInit, + ): Promise => { + return customFetch( + getDeleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDeleteUrl( + taskCustomFieldDefinitionId, + ), + { + ...options, + method: "DELETE", + }, + ); + }; + +export const getDeleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDeleteMutationOptions = + (options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof deleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDelete + > + >, + TError, + { taskCustomFieldDefinitionId: string }, + TContext + >; + request?: SecondParameter; + }): UseMutationOptions< + Awaited< + ReturnType< + typeof deleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDelete + > + >, + TError, + { taskCustomFieldDefinitionId: string }, + TContext + > => { + const mutationKey = [ + "deleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDelete", + ]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited< + ReturnType< + typeof deleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDelete + > + >, + { taskCustomFieldDefinitionId: string } + > = (props) => { + const { taskCustomFieldDefinitionId } = props ?? {}; + + return deleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDelete( + taskCustomFieldDefinitionId, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; + }; + +export type DeleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDeleteMutationResult = + NonNullable< + Awaited< + ReturnType< + typeof deleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDelete + > + > + >; + +export type DeleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDeleteMutationError = + HTTPValidationError; + +/** + * @summary Delete Org Custom Field + */ +export const useDeleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDelete = + ( + options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof deleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDelete + > + >, + TError, + { taskCustomFieldDefinitionId: string }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, + ): UseMutationResult< + Awaited< + ReturnType< + typeof deleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDelete + > + >, + TError, + { taskCustomFieldDefinitionId: string }, + TContext + > => { + return useMutation( + getDeleteOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdDeleteMutationOptions( + options, + ), + queryClient, + ); + }; +/** + * Update an organization-level task custom field definition. + * @summary Update Org Custom Field + */ +export type updateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatchResponse200 = + { + data: TaskCustomFieldDefinitionRead; + status: 200; + }; + +export type updateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatchResponse422 = + { + data: HTTPValidationError; + status: 422; + }; + +export type updateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatchResponseSuccess = + updateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatchResponse200 & { + headers: Headers; + }; +export type updateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatchResponseError = + updateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatchResponse422 & { + headers: Headers; + }; + +export type updateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatchResponse = + + | updateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatchResponseSuccess + | updateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatchResponseError; + +export const getUpdateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatchUrl = + (taskCustomFieldDefinitionId: string) => { + return `/api/v1/organizations/me/custom-fields/${taskCustomFieldDefinitionId}`; + }; + +export const updateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatch = + async ( + taskCustomFieldDefinitionId: string, + taskCustomFieldDefinitionUpdate: TaskCustomFieldDefinitionUpdate, + options?: RequestInit, + ): Promise => { + return customFetch( + getUpdateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatchUrl( + taskCustomFieldDefinitionId, + ), + { + ...options, + method: "PATCH", + headers: { "Content-Type": "application/json", ...options?.headers }, + body: JSON.stringify(taskCustomFieldDefinitionUpdate), + }, + ); + }; + +export const getUpdateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatchMutationOptions = + (options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof updateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatch + > + >, + TError, + { + taskCustomFieldDefinitionId: string; + data: TaskCustomFieldDefinitionUpdate; + }, + TContext + >; + request?: SecondParameter; + }): UseMutationOptions< + Awaited< + ReturnType< + typeof updateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatch + > + >, + TError, + { + taskCustomFieldDefinitionId: string; + data: TaskCustomFieldDefinitionUpdate; + }, + TContext + > => { + const mutationKey = [ + "updateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatch", + ]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited< + ReturnType< + typeof updateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatch + > + >, + { + taskCustomFieldDefinitionId: string; + data: TaskCustomFieldDefinitionUpdate; + } + > = (props) => { + const { taskCustomFieldDefinitionId, data } = props ?? {}; + + return updateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatch( + taskCustomFieldDefinitionId, + data, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; + }; + +export type UpdateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatchMutationResult = + NonNullable< + Awaited< + ReturnType< + typeof updateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatch + > + > + >; +export type UpdateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatchMutationBody = + TaskCustomFieldDefinitionUpdate; +export type UpdateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatchMutationError = + HTTPValidationError; + +/** + * @summary Update Org Custom Field + */ +export const useUpdateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatch = + ( + options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof updateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatch + > + >, + TError, + { + taskCustomFieldDefinitionId: string; + data: TaskCustomFieldDefinitionUpdate; + }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, + ): UseMutationResult< + Awaited< + ReturnType< + typeof updateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatch + > + >, + TError, + { + taskCustomFieldDefinitionId: string; + data: TaskCustomFieldDefinitionUpdate; + }, + TContext + > => { + return useMutation( + getUpdateOrgCustomFieldApiV1OrganizationsMeCustomFieldsTaskCustomFieldDefinitionIdPatchMutationOptions( + options, + ), + queryClient, + ); + }; diff --git a/frontend/src/api/generated/organizations/organizations.ts b/frontend/src/api/generated/organizations/organizations.ts index f330f1c4..cb756331 100644 --- a/frontend/src/api/generated/organizations/organizations.ts +++ b/frontend/src/api/generated/organizations/organizations.ts @@ -165,276 +165,191 @@ export const useCreateOrganizationApiV1OrganizationsPost = < ); }; /** - * List organizations where the current user is a member. - * @summary List My Organizations + * Accept an invite and return resulting membership. + * @summary Accept Org Invite */ -export type listMyOrganizationsApiV1OrganizationsMeListGetResponse200 = { - data: OrganizationListItem[]; +export type acceptOrgInviteApiV1OrganizationsInvitesAcceptPostResponse200 = { + data: OrganizationMemberRead; status: 200; }; -export type listMyOrganizationsApiV1OrganizationsMeListGetResponseSuccess = - listMyOrganizationsApiV1OrganizationsMeListGetResponse200 & { - headers: Headers; - }; -export type listMyOrganizationsApiV1OrganizationsMeListGetResponse = - listMyOrganizationsApiV1OrganizationsMeListGetResponseSuccess; - -export const getListMyOrganizationsApiV1OrganizationsMeListGetUrl = () => { - return `/api/v1/organizations/me/list`; -}; - -export const listMyOrganizationsApiV1OrganizationsMeListGet = async ( - options?: RequestInit, -): Promise => { - return customFetch( - getListMyOrganizationsApiV1OrganizationsMeListGetUrl(), - { - ...options, - method: "GET", - }, - ); -}; - -export const getListMyOrganizationsApiV1OrganizationsMeListGetQueryKey = () => { - return [`/api/v1/organizations/me/list`] as const; -}; - -export const getListMyOrganizationsApiV1OrganizationsMeListGetQueryOptions = < - TData = Awaited< - ReturnType - >, - TError = unknown, ->(options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; -}) => { - const { query: queryOptions, request: requestOptions } = options ?? {}; - - const queryKey = - queryOptions?.queryKey ?? - getListMyOrganizationsApiV1OrganizationsMeListGetQueryKey(); - - const queryFn: QueryFunction< - Awaited> - > = ({ signal }) => - listMyOrganizationsApiV1OrganizationsMeListGet({ - signal, - ...requestOptions, - }); - - return { queryKey, queryFn, ...queryOptions } as UseQueryOptions< - Awaited>, - TError, - TData - > & { queryKey: DataTag }; -}; - -export type ListMyOrganizationsApiV1OrganizationsMeListGetQueryResult = - NonNullable< - Awaited> - >; -export type ListMyOrganizationsApiV1OrganizationsMeListGetQueryError = unknown; - -export function useListMyOrganizationsApiV1OrganizationsMeListGet< - TData = Awaited< - ReturnType - >, - TError = unknown, ->( - options: { - query: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - > & - Pick< - DefinedInitialDataOptions< - Awaited< - ReturnType - >, - TError, - Awaited< - ReturnType - > - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): DefinedUseQueryResult & { - queryKey: DataTag; -}; -export function useListMyOrganizationsApiV1OrganizationsMeListGet< - TData = Awaited< - ReturnType - >, - TError = unknown, ->( - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - > & - Pick< - UndefinedInitialDataOptions< - Awaited< - ReturnType - >, - TError, - Awaited< - ReturnType - > - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -export function useListMyOrganizationsApiV1OrganizationsMeListGet< - TData = Awaited< - ReturnType - >, - TError = unknown, ->( - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -/** - * @summary List My Organizations - */ - -export function useListMyOrganizationsApiV1OrganizationsMeListGet< - TData = Awaited< - ReturnType - >, - TError = unknown, ->( - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -} { - const queryOptions = - getListMyOrganizationsApiV1OrganizationsMeListGetQueryOptions(options); - - const query = useQuery(queryOptions, queryClient) as UseQueryResult< - TData, - TError - > & { queryKey: DataTag }; - - return { ...query, queryKey: queryOptions.queryKey }; -} - -/** - * Set the caller's active organization. - * @summary Set Active Org - */ -export type setActiveOrgApiV1OrganizationsMeActivePatchResponse200 = { - data: OrganizationRead; - status: 200; -}; - -export type setActiveOrgApiV1OrganizationsMeActivePatchResponse422 = { +export type acceptOrgInviteApiV1OrganizationsInvitesAcceptPostResponse422 = { data: HTTPValidationError; status: 422; }; -export type setActiveOrgApiV1OrganizationsMeActivePatchResponseSuccess = - setActiveOrgApiV1OrganizationsMeActivePatchResponse200 & { +export type acceptOrgInviteApiV1OrganizationsInvitesAcceptPostResponseSuccess = + acceptOrgInviteApiV1OrganizationsInvitesAcceptPostResponse200 & { headers: Headers; }; -export type setActiveOrgApiV1OrganizationsMeActivePatchResponseError = - setActiveOrgApiV1OrganizationsMeActivePatchResponse422 & { +export type acceptOrgInviteApiV1OrganizationsInvitesAcceptPostResponseError = + acceptOrgInviteApiV1OrganizationsInvitesAcceptPostResponse422 & { headers: Headers; }; -export type setActiveOrgApiV1OrganizationsMeActivePatchResponse = - | setActiveOrgApiV1OrganizationsMeActivePatchResponseSuccess - | setActiveOrgApiV1OrganizationsMeActivePatchResponseError; +export type acceptOrgInviteApiV1OrganizationsInvitesAcceptPostResponse = + | acceptOrgInviteApiV1OrganizationsInvitesAcceptPostResponseSuccess + | acceptOrgInviteApiV1OrganizationsInvitesAcceptPostResponseError; -export const getSetActiveOrgApiV1OrganizationsMeActivePatchUrl = () => { - return `/api/v1/organizations/me/active`; +export const getAcceptOrgInviteApiV1OrganizationsInvitesAcceptPostUrl = () => { + return `/api/v1/organizations/invites/accept`; }; -export const setActiveOrgApiV1OrganizationsMeActivePatch = async ( - organizationActiveUpdate: OrganizationActiveUpdate, +export const acceptOrgInviteApiV1OrganizationsInvitesAcceptPost = async ( + organizationInviteAccept: OrganizationInviteAccept, options?: RequestInit, -): Promise => { - return customFetch( - getSetActiveOrgApiV1OrganizationsMeActivePatchUrl(), +): Promise => { + return customFetch( + getAcceptOrgInviteApiV1OrganizationsInvitesAcceptPostUrl(), { ...options, - method: "PATCH", + method: "POST", headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(organizationActiveUpdate), + body: JSON.stringify(organizationInviteAccept), }, ); }; -export const getSetActiveOrgApiV1OrganizationsMeActivePatchMutationOptions = < +export const getAcceptOrgInviteApiV1OrganizationsInvitesAcceptPostMutationOptions = + (options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { data: OrganizationInviteAccept }, + TContext + >; + request?: SecondParameter; + }): UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { data: OrganizationInviteAccept }, + TContext + > => { + const mutationKey = ["acceptOrgInviteApiV1OrganizationsInvitesAcceptPost"]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited< + ReturnType + >, + { data: OrganizationInviteAccept } + > = (props) => { + const { data } = props ?? {}; + + return acceptOrgInviteApiV1OrganizationsInvitesAcceptPost( + data, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; + }; + +export type AcceptOrgInviteApiV1OrganizationsInvitesAcceptPostMutationResult = + NonNullable< + Awaited< + ReturnType + > + >; +export type AcceptOrgInviteApiV1OrganizationsInvitesAcceptPostMutationBody = + OrganizationInviteAccept; +export type AcceptOrgInviteApiV1OrganizationsInvitesAcceptPostMutationError = + HTTPValidationError; + +/** + * @summary Accept Org Invite + */ +export const useAcceptOrgInviteApiV1OrganizationsInvitesAcceptPost = < TError = HTTPValidationError, TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { data: OrganizationInviteAccept }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited< + ReturnType + >, + TError, + { data: OrganizationInviteAccept }, + TContext +> => { + return useMutation( + getAcceptOrgInviteApiV1OrganizationsInvitesAcceptPostMutationOptions( + options, + ), + queryClient, + ); +}; +/** + * Delete the active organization and related entities. + * @summary Delete My Org + */ +export type deleteMyOrgApiV1OrganizationsMeDeleteResponse200 = { + data: OkResponse; + status: 200; +}; + +export type deleteMyOrgApiV1OrganizationsMeDeleteResponseSuccess = + deleteMyOrgApiV1OrganizationsMeDeleteResponse200 & { + headers: Headers; + }; +export type deleteMyOrgApiV1OrganizationsMeDeleteResponse = + deleteMyOrgApiV1OrganizationsMeDeleteResponseSuccess; + +export const getDeleteMyOrgApiV1OrganizationsMeDeleteUrl = () => { + return `/api/v1/organizations/me`; +}; + +export const deleteMyOrgApiV1OrganizationsMeDelete = async ( + options?: RequestInit, +): Promise => { + return customFetch( + getDeleteMyOrgApiV1OrganizationsMeDeleteUrl(), + { + ...options, + method: "DELETE", + }, + ); +}; + +export const getDeleteMyOrgApiV1OrganizationsMeDeleteMutationOptions = < + TError = unknown, + TContext = unknown, >(options?: { mutation?: UseMutationOptions< - Awaited>, + Awaited>, TError, - { data: OrganizationActiveUpdate }, + void, TContext >; request?: SecondParameter; }): UseMutationOptions< - Awaited>, + Awaited>, TError, - { data: OrganizationActiveUpdate }, + void, TContext > => { - const mutationKey = ["setActiveOrgApiV1OrganizationsMeActivePatch"]; + const mutationKey = ["deleteMyOrgApiV1OrganizationsMeDelete"]; const { mutation: mutationOptions, request: requestOptions } = options ? options.mutation && "mutationKey" in options.mutation && @@ -444,51 +359,46 @@ export const getSetActiveOrgApiV1OrganizationsMeActivePatchMutationOptions = < : { mutation: { mutationKey }, request: undefined }; const mutationFn: MutationFunction< - Awaited>, - { data: OrganizationActiveUpdate } - > = (props) => { - const { data } = props ?? {}; - - return setActiveOrgApiV1OrganizationsMeActivePatch(data, requestOptions); + Awaited>, + void + > = () => { + return deleteMyOrgApiV1OrganizationsMeDelete(requestOptions); }; return { mutationFn, ...mutationOptions }; }; -export type SetActiveOrgApiV1OrganizationsMeActivePatchMutationResult = - NonNullable< - Awaited> - >; -export type SetActiveOrgApiV1OrganizationsMeActivePatchMutationBody = - OrganizationActiveUpdate; -export type SetActiveOrgApiV1OrganizationsMeActivePatchMutationError = - HTTPValidationError; +export type DeleteMyOrgApiV1OrganizationsMeDeleteMutationResult = NonNullable< + Awaited> +>; + +export type DeleteMyOrgApiV1OrganizationsMeDeleteMutationError = unknown; /** - * @summary Set Active Org + * @summary Delete My Org */ -export const useSetActiveOrgApiV1OrganizationsMeActivePatch = < - TError = HTTPValidationError, +export const useDeleteMyOrgApiV1OrganizationsMeDelete = < + TError = unknown, TContext = unknown, >( options?: { mutation?: UseMutationOptions< - Awaited>, + Awaited>, TError, - { data: OrganizationActiveUpdate }, + void, TContext >; request?: SecondParameter; }, queryClient?: QueryClient, ): UseMutationResult< - Awaited>, + Awaited>, TError, - { data: OrganizationActiveUpdate }, + void, TContext > => { return useMutation( - getSetActiveOrgApiV1OrganizationsMeActivePatchMutationOptions(options), + getDeleteMyOrgApiV1OrganizationsMeDeleteMutationOptions(options), queryClient, ); }; @@ -666,55 +576,69 @@ export function useGetMyOrgApiV1OrganizationsMeGet< } /** - * Delete the active organization and related entities. - * @summary Delete My Org + * Set the caller's active organization. + * @summary Set Active Org */ -export type deleteMyOrgApiV1OrganizationsMeDeleteResponse200 = { - data: OkResponse; +export type setActiveOrgApiV1OrganizationsMeActivePatchResponse200 = { + data: OrganizationRead; status: 200; }; -export type deleteMyOrgApiV1OrganizationsMeDeleteResponseSuccess = - deleteMyOrgApiV1OrganizationsMeDeleteResponse200 & { - headers: Headers; - }; -export type deleteMyOrgApiV1OrganizationsMeDeleteResponse = - deleteMyOrgApiV1OrganizationsMeDeleteResponseSuccess; - -export const getDeleteMyOrgApiV1OrganizationsMeDeleteUrl = () => { - return `/api/v1/organizations/me`; +export type setActiveOrgApiV1OrganizationsMeActivePatchResponse422 = { + data: HTTPValidationError; + status: 422; }; -export const deleteMyOrgApiV1OrganizationsMeDelete = async ( +export type setActiveOrgApiV1OrganizationsMeActivePatchResponseSuccess = + setActiveOrgApiV1OrganizationsMeActivePatchResponse200 & { + headers: Headers; + }; +export type setActiveOrgApiV1OrganizationsMeActivePatchResponseError = + setActiveOrgApiV1OrganizationsMeActivePatchResponse422 & { + headers: Headers; + }; + +export type setActiveOrgApiV1OrganizationsMeActivePatchResponse = + | setActiveOrgApiV1OrganizationsMeActivePatchResponseSuccess + | setActiveOrgApiV1OrganizationsMeActivePatchResponseError; + +export const getSetActiveOrgApiV1OrganizationsMeActivePatchUrl = () => { + return `/api/v1/organizations/me/active`; +}; + +export const setActiveOrgApiV1OrganizationsMeActivePatch = async ( + organizationActiveUpdate: OrganizationActiveUpdate, options?: RequestInit, -): Promise => { - return customFetch( - getDeleteMyOrgApiV1OrganizationsMeDeleteUrl(), +): Promise => { + return customFetch( + getSetActiveOrgApiV1OrganizationsMeActivePatchUrl(), { ...options, - method: "DELETE", + method: "PATCH", + headers: { "Content-Type": "application/json", ...options?.headers }, + body: JSON.stringify(organizationActiveUpdate), }, ); }; -export const getDeleteMyOrgApiV1OrganizationsMeDeleteMutationOptions = < - TError = unknown, +export const getSetActiveOrgApiV1OrganizationsMeActivePatchMutationOptions = < + TError = HTTPValidationError, TContext = unknown, >(options?: { mutation?: UseMutationOptions< - Awaited>, + Awaited>, TError, - void, + { data: OrganizationActiveUpdate }, TContext >; request?: SecondParameter; }): UseMutationOptions< - Awaited>, + Awaited>, TError, - void, + { data: OrganizationActiveUpdate }, TContext > => { - const mutationKey = ["deleteMyOrgApiV1OrganizationsMeDelete"]; + const mutationKey = ["setActiveOrgApiV1OrganizationsMeActivePatch"]; const { mutation: mutationOptions, request: requestOptions } = options ? options.mutation && "mutationKey" in options.mutation && @@ -724,1212 +648,54 @@ export const getDeleteMyOrgApiV1OrganizationsMeDeleteMutationOptions = < : { mutation: { mutationKey }, request: undefined }; const mutationFn: MutationFunction< - Awaited>, - void - > = () => { - return deleteMyOrgApiV1OrganizationsMeDelete(requestOptions); + Awaited>, + { data: OrganizationActiveUpdate } + > = (props) => { + const { data } = props ?? {}; + + return setActiveOrgApiV1OrganizationsMeActivePatch(data, requestOptions); }; return { mutationFn, ...mutationOptions }; }; -export type DeleteMyOrgApiV1OrganizationsMeDeleteMutationResult = NonNullable< - Awaited> ->; - -export type DeleteMyOrgApiV1OrganizationsMeDeleteMutationError = unknown; +export type SetActiveOrgApiV1OrganizationsMeActivePatchMutationResult = + NonNullable< + Awaited> + >; +export type SetActiveOrgApiV1OrganizationsMeActivePatchMutationBody = + OrganizationActiveUpdate; +export type SetActiveOrgApiV1OrganizationsMeActivePatchMutationError = + HTTPValidationError; /** - * @summary Delete My Org + * @summary Set Active Org */ -export const useDeleteMyOrgApiV1OrganizationsMeDelete = < - TError = unknown, +export const useSetActiveOrgApiV1OrganizationsMeActivePatch = < + TError = HTTPValidationError, TContext = unknown, >( options?: { mutation?: UseMutationOptions< - Awaited>, + Awaited>, TError, - void, + { data: OrganizationActiveUpdate }, TContext >; request?: SecondParameter; }, queryClient?: QueryClient, ): UseMutationResult< - Awaited>, + Awaited>, TError, - void, + { data: OrganizationActiveUpdate }, TContext > => { return useMutation( - getDeleteMyOrgApiV1OrganizationsMeDeleteMutationOptions(options), + getSetActiveOrgApiV1OrganizationsMeActivePatchMutationOptions(options), queryClient, ); }; -/** - * Get the caller's membership record in the active organization. - * @summary Get My Membership - */ -export type getMyMembershipApiV1OrganizationsMeMemberGetResponse200 = { - data: OrganizationMemberRead; - status: 200; -}; - -export type getMyMembershipApiV1OrganizationsMeMemberGetResponseSuccess = - getMyMembershipApiV1OrganizationsMeMemberGetResponse200 & { - headers: Headers; - }; -export type getMyMembershipApiV1OrganizationsMeMemberGetResponse = - getMyMembershipApiV1OrganizationsMeMemberGetResponseSuccess; - -export const getGetMyMembershipApiV1OrganizationsMeMemberGetUrl = () => { - return `/api/v1/organizations/me/member`; -}; - -export const getMyMembershipApiV1OrganizationsMeMemberGet = async ( - options?: RequestInit, -): Promise => { - return customFetch( - getGetMyMembershipApiV1OrganizationsMeMemberGetUrl(), - { - ...options, - method: "GET", - }, - ); -}; - -export const getGetMyMembershipApiV1OrganizationsMeMemberGetQueryKey = () => { - return [`/api/v1/organizations/me/member`] as const; -}; - -export const getGetMyMembershipApiV1OrganizationsMeMemberGetQueryOptions = < - TData = Awaited< - ReturnType - >, - TError = unknown, ->(options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - >; - request?: SecondParameter; -}) => { - const { query: queryOptions, request: requestOptions } = options ?? {}; - - const queryKey = - queryOptions?.queryKey ?? - getGetMyMembershipApiV1OrganizationsMeMemberGetQueryKey(); - - const queryFn: QueryFunction< - Awaited> - > = ({ signal }) => - getMyMembershipApiV1OrganizationsMeMemberGet({ signal, ...requestOptions }); - - return { queryKey, queryFn, ...queryOptions } as UseQueryOptions< - Awaited>, - TError, - TData - > & { queryKey: DataTag }; -}; - -export type GetMyMembershipApiV1OrganizationsMeMemberGetQueryResult = - NonNullable< - Awaited> - >; -export type GetMyMembershipApiV1OrganizationsMeMemberGetQueryError = unknown; - -export function useGetMyMembershipApiV1OrganizationsMeMemberGet< - TData = Awaited< - ReturnType - >, - TError = unknown, ->( - options: { - query: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - > & - Pick< - DefinedInitialDataOptions< - Awaited< - ReturnType - >, - TError, - Awaited< - ReturnType - > - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): DefinedUseQueryResult & { - queryKey: DataTag; -}; -export function useGetMyMembershipApiV1OrganizationsMeMemberGet< - TData = Awaited< - ReturnType - >, - TError = unknown, ->( - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - > & - Pick< - UndefinedInitialDataOptions< - Awaited< - ReturnType - >, - TError, - Awaited< - ReturnType - > - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -export function useGetMyMembershipApiV1OrganizationsMeMemberGet< - TData = Awaited< - ReturnType - >, - TError = unknown, ->( - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -/** - * @summary Get My Membership - */ - -export function useGetMyMembershipApiV1OrganizationsMeMemberGet< - TData = Awaited< - ReturnType - >, - TError = unknown, ->( - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -} { - const queryOptions = - getGetMyMembershipApiV1OrganizationsMeMemberGetQueryOptions(options); - - const query = useQuery(queryOptions, queryClient) as UseQueryResult< - TData, - TError - > & { queryKey: DataTag }; - - return { ...query, queryKey: queryOptions.queryKey }; -} - -/** - * List members for the active organization. - * @summary List Org Members - */ -export type listOrgMembersApiV1OrganizationsMeMembersGetResponse200 = { - data: LimitOffsetPageTypeVarCustomizedOrganizationMemberRead; - status: 200; -}; - -export type listOrgMembersApiV1OrganizationsMeMembersGetResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type listOrgMembersApiV1OrganizationsMeMembersGetResponseSuccess = - listOrgMembersApiV1OrganizationsMeMembersGetResponse200 & { - headers: Headers; - }; -export type listOrgMembersApiV1OrganizationsMeMembersGetResponseError = - listOrgMembersApiV1OrganizationsMeMembersGetResponse422 & { - headers: Headers; - }; - -export type listOrgMembersApiV1OrganizationsMeMembersGetResponse = - | listOrgMembersApiV1OrganizationsMeMembersGetResponseSuccess - | listOrgMembersApiV1OrganizationsMeMembersGetResponseError; - -export const getListOrgMembersApiV1OrganizationsMeMembersGetUrl = ( - params?: ListOrgMembersApiV1OrganizationsMeMembersGetParams, -) => { - const normalizedParams = new URLSearchParams(); - - Object.entries(params || {}).forEach(([key, value]) => { - if (value !== undefined) { - normalizedParams.append(key, value === null ? "null" : value.toString()); - } - }); - - const stringifiedParams = normalizedParams.toString(); - - return stringifiedParams.length > 0 - ? `/api/v1/organizations/me/members?${stringifiedParams}` - : `/api/v1/organizations/me/members`; -}; - -export const listOrgMembersApiV1OrganizationsMeMembersGet = async ( - params?: ListOrgMembersApiV1OrganizationsMeMembersGetParams, - options?: RequestInit, -): Promise => { - return customFetch( - getListOrgMembersApiV1OrganizationsMeMembersGetUrl(params), - { - ...options, - method: "GET", - }, - ); -}; - -export const getListOrgMembersApiV1OrganizationsMeMembersGetQueryKey = ( - params?: ListOrgMembersApiV1OrganizationsMeMembersGetParams, -) => { - return [ - `/api/v1/organizations/me/members`, - ...(params ? [params] : []), - ] as const; -}; - -export const getListOrgMembersApiV1OrganizationsMeMembersGetQueryOptions = < - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - params?: ListOrgMembersApiV1OrganizationsMeMembersGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; - }, -) => { - const { query: queryOptions, request: requestOptions } = options ?? {}; - - const queryKey = - queryOptions?.queryKey ?? - getListOrgMembersApiV1OrganizationsMeMembersGetQueryKey(params); - - const queryFn: QueryFunction< - Awaited> - > = ({ signal }) => - listOrgMembersApiV1OrganizationsMeMembersGet(params, { - signal, - ...requestOptions, - }); - - return { queryKey, queryFn, ...queryOptions } as UseQueryOptions< - Awaited>, - TError, - TData - > & { queryKey: DataTag }; -}; - -export type ListOrgMembersApiV1OrganizationsMeMembersGetQueryResult = - NonNullable< - Awaited> - >; -export type ListOrgMembersApiV1OrganizationsMeMembersGetQueryError = - HTTPValidationError; - -export function useListOrgMembersApiV1OrganizationsMeMembersGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - params: undefined | ListOrgMembersApiV1OrganizationsMeMembersGetParams, - options: { - query: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - > & - Pick< - DefinedInitialDataOptions< - Awaited< - ReturnType - >, - TError, - Awaited< - ReturnType - > - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): DefinedUseQueryResult & { - queryKey: DataTag; -}; -export function useListOrgMembersApiV1OrganizationsMeMembersGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - params?: ListOrgMembersApiV1OrganizationsMeMembersGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - > & - Pick< - UndefinedInitialDataOptions< - Awaited< - ReturnType - >, - TError, - Awaited< - ReturnType - > - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -export function useListOrgMembersApiV1OrganizationsMeMembersGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - params?: ListOrgMembersApiV1OrganizationsMeMembersGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -/** - * @summary List Org Members - */ - -export function useListOrgMembersApiV1OrganizationsMeMembersGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - params?: ListOrgMembersApiV1OrganizationsMeMembersGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -} { - const queryOptions = - getListOrgMembersApiV1OrganizationsMeMembersGetQueryOptions( - params, - options, - ); - - const query = useQuery(queryOptions, queryClient) as UseQueryResult< - TData, - TError - > & { queryKey: DataTag }; - - return { ...query, queryKey: queryOptions.queryKey }; -} - -/** - * Get a specific organization member by id. - * @summary Get Org Member - */ -export type getOrgMemberApiV1OrganizationsMeMembersMemberIdGetResponse200 = { - data: OrganizationMemberRead; - status: 200; -}; - -export type getOrgMemberApiV1OrganizationsMeMembersMemberIdGetResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type getOrgMemberApiV1OrganizationsMeMembersMemberIdGetResponseSuccess = - getOrgMemberApiV1OrganizationsMeMembersMemberIdGetResponse200 & { - headers: Headers; - }; -export type getOrgMemberApiV1OrganizationsMeMembersMemberIdGetResponseError = - getOrgMemberApiV1OrganizationsMeMembersMemberIdGetResponse422 & { - headers: Headers; - }; - -export type getOrgMemberApiV1OrganizationsMeMembersMemberIdGetResponse = - | getOrgMemberApiV1OrganizationsMeMembersMemberIdGetResponseSuccess - | getOrgMemberApiV1OrganizationsMeMembersMemberIdGetResponseError; - -export const getGetOrgMemberApiV1OrganizationsMeMembersMemberIdGetUrl = ( - memberId: string, -) => { - return `/api/v1/organizations/me/members/${memberId}`; -}; - -export const getOrgMemberApiV1OrganizationsMeMembersMemberIdGet = async ( - memberId: string, - options?: RequestInit, -): Promise => { - return customFetch( - getGetOrgMemberApiV1OrganizationsMeMembersMemberIdGetUrl(memberId), - { - ...options, - method: "GET", - }, - ); -}; - -export const getGetOrgMemberApiV1OrganizationsMeMembersMemberIdGetQueryKey = ( - memberId: string, -) => { - return [`/api/v1/organizations/me/members/${memberId}`] as const; -}; - -export const getGetOrgMemberApiV1OrganizationsMeMembersMemberIdGetQueryOptions = - < - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, - >( - memberId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType< - typeof getOrgMemberApiV1OrganizationsMeMembersMemberIdGet - > - >, - TError, - TData - > - >; - request?: SecondParameter; - }, - ) => { - const { query: queryOptions, request: requestOptions } = options ?? {}; - - const queryKey = - queryOptions?.queryKey ?? - getGetOrgMemberApiV1OrganizationsMeMembersMemberIdGetQueryKey(memberId); - - const queryFn: QueryFunction< - Awaited< - ReturnType - > - > = ({ signal }) => - getOrgMemberApiV1OrganizationsMeMembersMemberIdGet(memberId, { - signal, - ...requestOptions, - }); - - return { - queryKey, - queryFn, - enabled: !!memberId, - ...queryOptions, - } as UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > & { queryKey: DataTag }; - }; - -export type GetOrgMemberApiV1OrganizationsMeMembersMemberIdGetQueryResult = - NonNullable< - Awaited< - ReturnType - > - >; -export type GetOrgMemberApiV1OrganizationsMeMembersMemberIdGetQueryError = - HTTPValidationError; - -export function useGetOrgMemberApiV1OrganizationsMeMembersMemberIdGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - memberId: string, - options: { - query: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - > & - Pick< - DefinedInitialDataOptions< - Awaited< - ReturnType< - typeof getOrgMemberApiV1OrganizationsMeMembersMemberIdGet - > - >, - TError, - Awaited< - ReturnType< - typeof getOrgMemberApiV1OrganizationsMeMembersMemberIdGet - > - > - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): DefinedUseQueryResult & { - queryKey: DataTag; -}; -export function useGetOrgMemberApiV1OrganizationsMeMembersMemberIdGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - memberId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - > & - Pick< - UndefinedInitialDataOptions< - Awaited< - ReturnType< - typeof getOrgMemberApiV1OrganizationsMeMembersMemberIdGet - > - >, - TError, - Awaited< - ReturnType< - typeof getOrgMemberApiV1OrganizationsMeMembersMemberIdGet - > - > - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -export function useGetOrgMemberApiV1OrganizationsMeMembersMemberIdGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - memberId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -/** - * @summary Get Org Member - */ - -export function useGetOrgMemberApiV1OrganizationsMeMembersMemberIdGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - memberId: string, - options?: { - query?: Partial< - UseQueryOptions< - Awaited< - ReturnType - >, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -} { - const queryOptions = - getGetOrgMemberApiV1OrganizationsMeMembersMemberIdGetQueryOptions( - memberId, - options, - ); - - const query = useQuery(queryOptions, queryClient) as UseQueryResult< - TData, - TError - > & { queryKey: DataTag }; - - return { ...query, queryKey: queryOptions.queryKey }; -} - -/** - * Update a member's role in the organization. - * @summary Update Org Member - */ -export type updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchResponse200 = - { - data: OrganizationMemberRead; - status: 200; - }; - -export type updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchResponse422 = - { - data: HTTPValidationError; - status: 422; - }; - -export type updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchResponseSuccess = - updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchResponse200 & { - headers: Headers; - }; -export type updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchResponseError = - updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchResponse422 & { - headers: Headers; - }; - -export type updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchResponse = - | updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchResponseSuccess - | updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchResponseError; - -export const getUpdateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchUrl = ( - memberId: string, -) => { - return `/api/v1/organizations/me/members/${memberId}`; -}; - -export const updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatch = async ( - memberId: string, - organizationMemberUpdate: OrganizationMemberUpdate, - options?: RequestInit, -): Promise => { - return customFetch( - getUpdateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchUrl(memberId), - { - ...options, - method: "PATCH", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(organizationMemberUpdate), - }, - ); -}; - -export const getUpdateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchMutationOptions = - (options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType< - typeof updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatch - > - >, - TError, - { memberId: string; data: OrganizationMemberUpdate }, - TContext - >; - request?: SecondParameter; - }): UseMutationOptions< - Awaited< - ReturnType - >, - TError, - { memberId: string; data: OrganizationMemberUpdate }, - TContext - > => { - const mutationKey = [ - "updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatch", - ]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited< - ReturnType< - typeof updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatch - > - >, - { memberId: string; data: OrganizationMemberUpdate } - > = (props) => { - const { memberId, data } = props ?? {}; - - return updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatch( - memberId, - data, - requestOptions, - ); - }; - - return { mutationFn, ...mutationOptions }; - }; - -export type UpdateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchMutationResult = - NonNullable< - Awaited< - ReturnType - > - >; -export type UpdateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchMutationBody = - OrganizationMemberUpdate; -export type UpdateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchMutationError = - HTTPValidationError; - -/** - * @summary Update Org Member - */ -export const useUpdateOrgMemberApiV1OrganizationsMeMembersMemberIdPatch = < - TError = HTTPValidationError, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType< - typeof updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatch - > - >, - TError, - { memberId: string; data: OrganizationMemberUpdate }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited< - ReturnType - >, - TError, - { memberId: string; data: OrganizationMemberUpdate }, - TContext -> => { - return useMutation( - getUpdateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchMutationOptions( - options, - ), - queryClient, - ); -}; -/** - * Remove a member from the active organization. - * @summary Remove Org Member - */ -export type removeOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteResponse200 = - { - data: OkResponse; - status: 200; - }; - -export type removeOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteResponse422 = - { - data: HTTPValidationError; - status: 422; - }; - -export type removeOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteResponseSuccess = - removeOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteResponse200 & { - headers: Headers; - }; -export type removeOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteResponseError = - removeOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteResponse422 & { - headers: Headers; - }; - -export type removeOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteResponse = - | removeOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteResponseSuccess - | removeOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteResponseError; - -export const getRemoveOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteUrl = ( - memberId: string, -) => { - return `/api/v1/organizations/me/members/${memberId}`; -}; - -export const removeOrgMemberApiV1OrganizationsMeMembersMemberIdDelete = async ( - memberId: string, - options?: RequestInit, -): Promise => { - return customFetch( - getRemoveOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteUrl(memberId), - { - ...options, - method: "DELETE", - }, - ); -}; - -export const getRemoveOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteMutationOptions = - (options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType< - typeof removeOrgMemberApiV1OrganizationsMeMembersMemberIdDelete - > - >, - TError, - { memberId: string }, - TContext - >; - request?: SecondParameter; - }): UseMutationOptions< - Awaited< - ReturnType< - typeof removeOrgMemberApiV1OrganizationsMeMembersMemberIdDelete - > - >, - TError, - { memberId: string }, - TContext - > => { - const mutationKey = [ - "removeOrgMemberApiV1OrganizationsMeMembersMemberIdDelete", - ]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited< - ReturnType< - typeof removeOrgMemberApiV1OrganizationsMeMembersMemberIdDelete - > - >, - { memberId: string } - > = (props) => { - const { memberId } = props ?? {}; - - return removeOrgMemberApiV1OrganizationsMeMembersMemberIdDelete( - memberId, - requestOptions, - ); - }; - - return { mutationFn, ...mutationOptions }; - }; - -export type RemoveOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteMutationResult = - NonNullable< - Awaited< - ReturnType< - typeof removeOrgMemberApiV1OrganizationsMeMembersMemberIdDelete - > - > - >; - -export type RemoveOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteMutationError = - HTTPValidationError; - -/** - * @summary Remove Org Member - */ -export const useRemoveOrgMemberApiV1OrganizationsMeMembersMemberIdDelete = < - TError = HTTPValidationError, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType< - typeof removeOrgMemberApiV1OrganizationsMeMembersMemberIdDelete - > - >, - TError, - { memberId: string }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited< - ReturnType - >, - TError, - { memberId: string }, - TContext -> => { - return useMutation( - getRemoveOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteMutationOptions( - options, - ), - queryClient, - ); -}; -/** - * Update board-level access settings for a member. - * @summary Update Member Access - */ -export type updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutResponse200 = - { - data: OrganizationMemberRead; - status: 200; - }; - -export type updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutResponse422 = - { - data: HTTPValidationError; - status: 422; - }; - -export type updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutResponseSuccess = - updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutResponse200 & { - headers: Headers; - }; -export type updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutResponseError = - updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutResponse422 & { - headers: Headers; - }; - -export type updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutResponse = - - | updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutResponseSuccess - | updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutResponseError; - -export const getUpdateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutUrl = - (memberId: string) => { - return `/api/v1/organizations/me/members/${memberId}/access`; - }; - -export const updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut = - async ( - memberId: string, - organizationMemberAccessUpdate: OrganizationMemberAccessUpdate, - options?: RequestInit, - ): Promise => { - return customFetch( - getUpdateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutUrl( - memberId, - ), - { - ...options, - method: "PUT", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(organizationMemberAccessUpdate), - }, - ); - }; - -export const getUpdateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutMutationOptions = - (options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType< - typeof updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut - > - >, - TError, - { memberId: string; data: OrganizationMemberAccessUpdate }, - TContext - >; - request?: SecondParameter; - }): UseMutationOptions< - Awaited< - ReturnType< - typeof updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut - > - >, - TError, - { memberId: string; data: OrganizationMemberAccessUpdate }, - TContext - > => { - const mutationKey = [ - "updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut", - ]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited< - ReturnType< - typeof updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut - > - >, - { memberId: string; data: OrganizationMemberAccessUpdate } - > = (props) => { - const { memberId, data } = props ?? {}; - - return updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut( - memberId, - data, - requestOptions, - ); - }; - - return { mutationFn, ...mutationOptions }; - }; - -export type UpdateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutMutationResult = - NonNullable< - Awaited< - ReturnType< - typeof updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut - > - > - >; -export type UpdateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutMutationBody = - OrganizationMemberAccessUpdate; -export type UpdateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutMutationError = - HTTPValidationError; - -/** - * @summary Update Member Access - */ -export const useUpdateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut = - ( - options?: { - mutation?: UseMutationOptions< - Awaited< - ReturnType< - typeof updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut - > - >, - TError, - { memberId: string; data: OrganizationMemberAccessUpdate }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, - ): UseMutationResult< - Awaited< - ReturnType< - typeof updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut - > - >, - TError, - { memberId: string; data: OrganizationMemberAccessUpdate }, - TContext - > => { - return useMutation( - getUpdateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutMutationOptions( - options, - ), - queryClient, - ); - }; /** * List pending invites for the active organization. * @summary List Org Invites @@ -2457,71 +1223,737 @@ export const useRevokeOrgInviteApiV1OrganizationsMeInvitesInviteIdDelete = < ); }; /** - * Accept an invite and return resulting membership. - * @summary Accept Org Invite + * List organizations where the current user is a member. + * @summary List My Organizations */ -export type acceptOrgInviteApiV1OrganizationsInvitesAcceptPostResponse200 = { - data: OrganizationMemberRead; +export type listMyOrganizationsApiV1OrganizationsMeListGetResponse200 = { + data: OrganizationListItem[]; status: 200; }; -export type acceptOrgInviteApiV1OrganizationsInvitesAcceptPostResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type acceptOrgInviteApiV1OrganizationsInvitesAcceptPostResponseSuccess = - acceptOrgInviteApiV1OrganizationsInvitesAcceptPostResponse200 & { - headers: Headers; - }; -export type acceptOrgInviteApiV1OrganizationsInvitesAcceptPostResponseError = - acceptOrgInviteApiV1OrganizationsInvitesAcceptPostResponse422 & { +export type listMyOrganizationsApiV1OrganizationsMeListGetResponseSuccess = + listMyOrganizationsApiV1OrganizationsMeListGetResponse200 & { headers: Headers; }; +export type listMyOrganizationsApiV1OrganizationsMeListGetResponse = + listMyOrganizationsApiV1OrganizationsMeListGetResponseSuccess; -export type acceptOrgInviteApiV1OrganizationsInvitesAcceptPostResponse = - | acceptOrgInviteApiV1OrganizationsInvitesAcceptPostResponseSuccess - | acceptOrgInviteApiV1OrganizationsInvitesAcceptPostResponseError; - -export const getAcceptOrgInviteApiV1OrganizationsInvitesAcceptPostUrl = () => { - return `/api/v1/organizations/invites/accept`; +export const getListMyOrganizationsApiV1OrganizationsMeListGetUrl = () => { + return `/api/v1/organizations/me/list`; }; -export const acceptOrgInviteApiV1OrganizationsInvitesAcceptPost = async ( - organizationInviteAccept: OrganizationInviteAccept, +export const listMyOrganizationsApiV1OrganizationsMeListGet = async ( options?: RequestInit, -): Promise => { - return customFetch( - getAcceptOrgInviteApiV1OrganizationsInvitesAcceptPostUrl(), +): Promise => { + return customFetch( + getListMyOrganizationsApiV1OrganizationsMeListGetUrl(), { ...options, - method: "POST", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(organizationInviteAccept), + method: "GET", }, ); }; -export const getAcceptOrgInviteApiV1OrganizationsInvitesAcceptPostMutationOptions = +export const getListMyOrganizationsApiV1OrganizationsMeListGetQueryKey = () => { + return [`/api/v1/organizations/me/list`] as const; +}; + +export const getListMyOrganizationsApiV1OrganizationsMeListGetQueryOptions = < + TData = Awaited< + ReturnType + >, + TError = unknown, +>(options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; +}) => { + const { query: queryOptions, request: requestOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? + getListMyOrganizationsApiV1OrganizationsMeListGetQueryKey(); + + const queryFn: QueryFunction< + Awaited> + > = ({ signal }) => + listMyOrganizationsApiV1OrganizationsMeListGet({ + signal, + ...requestOptions, + }); + + return { queryKey, queryFn, ...queryOptions } as UseQueryOptions< + Awaited>, + TError, + TData + > & { queryKey: DataTag }; +}; + +export type ListMyOrganizationsApiV1OrganizationsMeListGetQueryResult = + NonNullable< + Awaited> + >; +export type ListMyOrganizationsApiV1OrganizationsMeListGetQueryError = unknown; + +export function useListMyOrganizationsApiV1OrganizationsMeListGet< + TData = Awaited< + ReturnType + >, + TError = unknown, +>( + options: { + query: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + > & + Pick< + DefinedInitialDataOptions< + Awaited< + ReturnType + >, + TError, + Awaited< + ReturnType + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): DefinedUseQueryResult & { + queryKey: DataTag; +}; +export function useListMyOrganizationsApiV1OrganizationsMeListGet< + TData = Awaited< + ReturnType + >, + TError = unknown, +>( + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + > & + Pick< + UndefinedInitialDataOptions< + Awaited< + ReturnType + >, + TError, + Awaited< + ReturnType + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +export function useListMyOrganizationsApiV1OrganizationsMeListGet< + TData = Awaited< + ReturnType + >, + TError = unknown, +>( + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +/** + * @summary List My Organizations + */ + +export function useListMyOrganizationsApiV1OrganizationsMeListGet< + TData = Awaited< + ReturnType + >, + TError = unknown, +>( + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +} { + const queryOptions = + getListMyOrganizationsApiV1OrganizationsMeListGetQueryOptions(options); + + const query = useQuery(queryOptions, queryClient) as UseQueryResult< + TData, + TError + > & { queryKey: DataTag }; + + return { ...query, queryKey: queryOptions.queryKey }; +} + +/** + * Get the caller's membership record in the active organization. + * @summary Get My Membership + */ +export type getMyMembershipApiV1OrganizationsMeMemberGetResponse200 = { + data: OrganizationMemberRead; + status: 200; +}; + +export type getMyMembershipApiV1OrganizationsMeMemberGetResponseSuccess = + getMyMembershipApiV1OrganizationsMeMemberGetResponse200 & { + headers: Headers; + }; +export type getMyMembershipApiV1OrganizationsMeMemberGetResponse = + getMyMembershipApiV1OrganizationsMeMemberGetResponseSuccess; + +export const getGetMyMembershipApiV1OrganizationsMeMemberGetUrl = () => { + return `/api/v1/organizations/me/member`; +}; + +export const getMyMembershipApiV1OrganizationsMeMemberGet = async ( + options?: RequestInit, +): Promise => { + return customFetch( + getGetMyMembershipApiV1OrganizationsMeMemberGetUrl(), + { + ...options, + method: "GET", + }, + ); +}; + +export const getGetMyMembershipApiV1OrganizationsMeMemberGetQueryKey = () => { + return [`/api/v1/organizations/me/member`] as const; +}; + +export const getGetMyMembershipApiV1OrganizationsMeMemberGetQueryOptions = < + TData = Awaited< + ReturnType + >, + TError = unknown, +>(options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + >; + request?: SecondParameter; +}) => { + const { query: queryOptions, request: requestOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? + getGetMyMembershipApiV1OrganizationsMeMemberGetQueryKey(); + + const queryFn: QueryFunction< + Awaited> + > = ({ signal }) => + getMyMembershipApiV1OrganizationsMeMemberGet({ signal, ...requestOptions }); + + return { queryKey, queryFn, ...queryOptions } as UseQueryOptions< + Awaited>, + TError, + TData + > & { queryKey: DataTag }; +}; + +export type GetMyMembershipApiV1OrganizationsMeMemberGetQueryResult = + NonNullable< + Awaited> + >; +export type GetMyMembershipApiV1OrganizationsMeMemberGetQueryError = unknown; + +export function useGetMyMembershipApiV1OrganizationsMeMemberGet< + TData = Awaited< + ReturnType + >, + TError = unknown, +>( + options: { + query: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + > & + Pick< + DefinedInitialDataOptions< + Awaited< + ReturnType + >, + TError, + Awaited< + ReturnType + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): DefinedUseQueryResult & { + queryKey: DataTag; +}; +export function useGetMyMembershipApiV1OrganizationsMeMemberGet< + TData = Awaited< + ReturnType + >, + TError = unknown, +>( + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + > & + Pick< + UndefinedInitialDataOptions< + Awaited< + ReturnType + >, + TError, + Awaited< + ReturnType + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +export function useGetMyMembershipApiV1OrganizationsMeMemberGet< + TData = Awaited< + ReturnType + >, + TError = unknown, +>( + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +/** + * @summary Get My Membership + */ + +export function useGetMyMembershipApiV1OrganizationsMeMemberGet< + TData = Awaited< + ReturnType + >, + TError = unknown, +>( + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +} { + const queryOptions = + getGetMyMembershipApiV1OrganizationsMeMemberGetQueryOptions(options); + + const query = useQuery(queryOptions, queryClient) as UseQueryResult< + TData, + TError + > & { queryKey: DataTag }; + + return { ...query, queryKey: queryOptions.queryKey }; +} + +/** + * List members for the active organization. + * @summary List Org Members + */ +export type listOrgMembersApiV1OrganizationsMeMembersGetResponse200 = { + data: LimitOffsetPageTypeVarCustomizedOrganizationMemberRead; + status: 200; +}; + +export type listOrgMembersApiV1OrganizationsMeMembersGetResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type listOrgMembersApiV1OrganizationsMeMembersGetResponseSuccess = + listOrgMembersApiV1OrganizationsMeMembersGetResponse200 & { + headers: Headers; + }; +export type listOrgMembersApiV1OrganizationsMeMembersGetResponseError = + listOrgMembersApiV1OrganizationsMeMembersGetResponse422 & { + headers: Headers; + }; + +export type listOrgMembersApiV1OrganizationsMeMembersGetResponse = + | listOrgMembersApiV1OrganizationsMeMembersGetResponseSuccess + | listOrgMembersApiV1OrganizationsMeMembersGetResponseError; + +export const getListOrgMembersApiV1OrganizationsMeMembersGetUrl = ( + params?: ListOrgMembersApiV1OrganizationsMeMembersGetParams, +) => { + const normalizedParams = new URLSearchParams(); + + Object.entries(params || {}).forEach(([key, value]) => { + if (value !== undefined) { + normalizedParams.append(key, value === null ? "null" : value.toString()); + } + }); + + const stringifiedParams = normalizedParams.toString(); + + return stringifiedParams.length > 0 + ? `/api/v1/organizations/me/members?${stringifiedParams}` + : `/api/v1/organizations/me/members`; +}; + +export const listOrgMembersApiV1OrganizationsMeMembersGet = async ( + params?: ListOrgMembersApiV1OrganizationsMeMembersGetParams, + options?: RequestInit, +): Promise => { + return customFetch( + getListOrgMembersApiV1OrganizationsMeMembersGetUrl(params), + { + ...options, + method: "GET", + }, + ); +}; + +export const getListOrgMembersApiV1OrganizationsMeMembersGetQueryKey = ( + params?: ListOrgMembersApiV1OrganizationsMeMembersGetParams, +) => { + return [ + `/api/v1/organizations/me/members`, + ...(params ? [params] : []), + ] as const; +}; + +export const getListOrgMembersApiV1OrganizationsMeMembersGetQueryOptions = < + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + params?: ListOrgMembersApiV1OrganizationsMeMembersGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; + }, +) => { + const { query: queryOptions, request: requestOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? + getListOrgMembersApiV1OrganizationsMeMembersGetQueryKey(params); + + const queryFn: QueryFunction< + Awaited> + > = ({ signal }) => + listOrgMembersApiV1OrganizationsMeMembersGet(params, { + signal, + ...requestOptions, + }); + + return { queryKey, queryFn, ...queryOptions } as UseQueryOptions< + Awaited>, + TError, + TData + > & { queryKey: DataTag }; +}; + +export type ListOrgMembersApiV1OrganizationsMeMembersGetQueryResult = + NonNullable< + Awaited> + >; +export type ListOrgMembersApiV1OrganizationsMeMembersGetQueryError = + HTTPValidationError; + +export function useListOrgMembersApiV1OrganizationsMeMembersGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + params: undefined | ListOrgMembersApiV1OrganizationsMeMembersGetParams, + options: { + query: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + > & + Pick< + DefinedInitialDataOptions< + Awaited< + ReturnType + >, + TError, + Awaited< + ReturnType + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): DefinedUseQueryResult & { + queryKey: DataTag; +}; +export function useListOrgMembersApiV1OrganizationsMeMembersGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + params?: ListOrgMembersApiV1OrganizationsMeMembersGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + > & + Pick< + UndefinedInitialDataOptions< + Awaited< + ReturnType + >, + TError, + Awaited< + ReturnType + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +export function useListOrgMembersApiV1OrganizationsMeMembersGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + params?: ListOrgMembersApiV1OrganizationsMeMembersGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +/** + * @summary List Org Members + */ + +export function useListOrgMembersApiV1OrganizationsMeMembersGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + params?: ListOrgMembersApiV1OrganizationsMeMembersGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +} { + const queryOptions = + getListOrgMembersApiV1OrganizationsMeMembersGetQueryOptions( + params, + options, + ); + + const query = useQuery(queryOptions, queryClient) as UseQueryResult< + TData, + TError + > & { queryKey: DataTag }; + + return { ...query, queryKey: queryOptions.queryKey }; +} + +/** + * Remove a member from the active organization. + * @summary Remove Org Member + */ +export type removeOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteResponse200 = + { + data: OkResponse; + status: 200; + }; + +export type removeOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteResponse422 = + { + data: HTTPValidationError; + status: 422; + }; + +export type removeOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteResponseSuccess = + removeOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteResponse200 & { + headers: Headers; + }; +export type removeOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteResponseError = + removeOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteResponse422 & { + headers: Headers; + }; + +export type removeOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteResponse = + | removeOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteResponseSuccess + | removeOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteResponseError; + +export const getRemoveOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteUrl = ( + memberId: string, +) => { + return `/api/v1/organizations/me/members/${memberId}`; +}; + +export const removeOrgMemberApiV1OrganizationsMeMembersMemberIdDelete = async ( + memberId: string, + options?: RequestInit, +): Promise => { + return customFetch( + getRemoveOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteUrl(memberId), + { + ...options, + method: "DELETE", + }, + ); +}; + +export const getRemoveOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteMutationOptions = (options?: { mutation?: UseMutationOptions< Awaited< - ReturnType + ReturnType< + typeof removeOrgMemberApiV1OrganizationsMeMembersMemberIdDelete + > >, TError, - { data: OrganizationInviteAccept }, + { memberId: string }, TContext >; request?: SecondParameter; }): UseMutationOptions< Awaited< - ReturnType + ReturnType< + typeof removeOrgMemberApiV1OrganizationsMeMembersMemberIdDelete + > >, TError, - { data: OrganizationInviteAccept }, + { memberId: string }, TContext > => { - const mutationKey = ["acceptOrgInviteApiV1OrganizationsInvitesAcceptPost"]; + const mutationKey = [ + "removeOrgMemberApiV1OrganizationsMeMembersMemberIdDelete", + ]; const { mutation: mutationOptions, request: requestOptions } = options ? options.mutation && "mutationKey" in options.mutation && @@ -2532,13 +1964,422 @@ export const getAcceptOrgInviteApiV1OrganizationsInvitesAcceptPostMutationOption const mutationFn: MutationFunction< Awaited< - ReturnType + ReturnType< + typeof removeOrgMemberApiV1OrganizationsMeMembersMemberIdDelete + > >, - { data: OrganizationInviteAccept } + { memberId: string } > = (props) => { - const { data } = props ?? {}; + const { memberId } = props ?? {}; - return acceptOrgInviteApiV1OrganizationsInvitesAcceptPost( + return removeOrgMemberApiV1OrganizationsMeMembersMemberIdDelete( + memberId, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; + }; + +export type RemoveOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteMutationResult = + NonNullable< + Awaited< + ReturnType< + typeof removeOrgMemberApiV1OrganizationsMeMembersMemberIdDelete + > + > + >; + +export type RemoveOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteMutationError = + HTTPValidationError; + +/** + * @summary Remove Org Member + */ +export const useRemoveOrgMemberApiV1OrganizationsMeMembersMemberIdDelete = < + TError = HTTPValidationError, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof removeOrgMemberApiV1OrganizationsMeMembersMemberIdDelete + > + >, + TError, + { memberId: string }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited< + ReturnType + >, + TError, + { memberId: string }, + TContext +> => { + return useMutation( + getRemoveOrgMemberApiV1OrganizationsMeMembersMemberIdDeleteMutationOptions( + options, + ), + queryClient, + ); +}; +/** + * Get a specific organization member by id. + * @summary Get Org Member + */ +export type getOrgMemberApiV1OrganizationsMeMembersMemberIdGetResponse200 = { + data: OrganizationMemberRead; + status: 200; +}; + +export type getOrgMemberApiV1OrganizationsMeMembersMemberIdGetResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type getOrgMemberApiV1OrganizationsMeMembersMemberIdGetResponseSuccess = + getOrgMemberApiV1OrganizationsMeMembersMemberIdGetResponse200 & { + headers: Headers; + }; +export type getOrgMemberApiV1OrganizationsMeMembersMemberIdGetResponseError = + getOrgMemberApiV1OrganizationsMeMembersMemberIdGetResponse422 & { + headers: Headers; + }; + +export type getOrgMemberApiV1OrganizationsMeMembersMemberIdGetResponse = + | getOrgMemberApiV1OrganizationsMeMembersMemberIdGetResponseSuccess + | getOrgMemberApiV1OrganizationsMeMembersMemberIdGetResponseError; + +export const getGetOrgMemberApiV1OrganizationsMeMembersMemberIdGetUrl = ( + memberId: string, +) => { + return `/api/v1/organizations/me/members/${memberId}`; +}; + +export const getOrgMemberApiV1OrganizationsMeMembersMemberIdGet = async ( + memberId: string, + options?: RequestInit, +): Promise => { + return customFetch( + getGetOrgMemberApiV1OrganizationsMeMembersMemberIdGetUrl(memberId), + { + ...options, + method: "GET", + }, + ); +}; + +export const getGetOrgMemberApiV1OrganizationsMeMembersMemberIdGetQueryKey = ( + memberId: string, +) => { + return [`/api/v1/organizations/me/members/${memberId}`] as const; +}; + +export const getGetOrgMemberApiV1OrganizationsMeMembersMemberIdGetQueryOptions = + < + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, + >( + memberId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType< + typeof getOrgMemberApiV1OrganizationsMeMembersMemberIdGet + > + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + ) => { + const { query: queryOptions, request: requestOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? + getGetOrgMemberApiV1OrganizationsMeMembersMemberIdGetQueryKey(memberId); + + const queryFn: QueryFunction< + Awaited< + ReturnType + > + > = ({ signal }) => + getOrgMemberApiV1OrganizationsMeMembersMemberIdGet(memberId, { + signal, + ...requestOptions, + }); + + return { + queryKey, + queryFn, + enabled: !!memberId, + ...queryOptions, + } as UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > & { queryKey: DataTag }; + }; + +export type GetOrgMemberApiV1OrganizationsMeMembersMemberIdGetQueryResult = + NonNullable< + Awaited< + ReturnType + > + >; +export type GetOrgMemberApiV1OrganizationsMeMembersMemberIdGetQueryError = + HTTPValidationError; + +export function useGetOrgMemberApiV1OrganizationsMeMembersMemberIdGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + memberId: string, + options: { + query: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + > & + Pick< + DefinedInitialDataOptions< + Awaited< + ReturnType< + typeof getOrgMemberApiV1OrganizationsMeMembersMemberIdGet + > + >, + TError, + Awaited< + ReturnType< + typeof getOrgMemberApiV1OrganizationsMeMembersMemberIdGet + > + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): DefinedUseQueryResult & { + queryKey: DataTag; +}; +export function useGetOrgMemberApiV1OrganizationsMeMembersMemberIdGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + memberId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + > & + Pick< + UndefinedInitialDataOptions< + Awaited< + ReturnType< + typeof getOrgMemberApiV1OrganizationsMeMembersMemberIdGet + > + >, + TError, + Awaited< + ReturnType< + typeof getOrgMemberApiV1OrganizationsMeMembersMemberIdGet + > + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +export function useGetOrgMemberApiV1OrganizationsMeMembersMemberIdGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + memberId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +/** + * @summary Get Org Member + */ + +export function useGetOrgMemberApiV1OrganizationsMeMembersMemberIdGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + memberId: string, + options?: { + query?: Partial< + UseQueryOptions< + Awaited< + ReturnType + >, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +} { + const queryOptions = + getGetOrgMemberApiV1OrganizationsMeMembersMemberIdGetQueryOptions( + memberId, + options, + ); + + const query = useQuery(queryOptions, queryClient) as UseQueryResult< + TData, + TError + > & { queryKey: DataTag }; + + return { ...query, queryKey: queryOptions.queryKey }; +} + +/** + * Update a member's role in the organization. + * @summary Update Org Member + */ +export type updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchResponse200 = + { + data: OrganizationMemberRead; + status: 200; + }; + +export type updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchResponse422 = + { + data: HTTPValidationError; + status: 422; + }; + +export type updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchResponseSuccess = + updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchResponse200 & { + headers: Headers; + }; +export type updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchResponseError = + updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchResponse422 & { + headers: Headers; + }; + +export type updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchResponse = + | updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchResponseSuccess + | updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchResponseError; + +export const getUpdateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchUrl = ( + memberId: string, +) => { + return `/api/v1/organizations/me/members/${memberId}`; +}; + +export const updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatch = async ( + memberId: string, + organizationMemberUpdate: OrganizationMemberUpdate, + options?: RequestInit, +): Promise => { + return customFetch( + getUpdateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchUrl(memberId), + { + ...options, + method: "PATCH", + headers: { "Content-Type": "application/json", ...options?.headers }, + body: JSON.stringify(organizationMemberUpdate), + }, + ); +}; + +export const getUpdateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchMutationOptions = + (options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatch + > + >, + TError, + { memberId: string; data: OrganizationMemberUpdate }, + TContext + >; + request?: SecondParameter; + }): UseMutationOptions< + Awaited< + ReturnType + >, + TError, + { memberId: string; data: OrganizationMemberUpdate }, + TContext + > => { + const mutationKey = [ + "updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatch", + ]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited< + ReturnType< + typeof updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatch + > + >, + { memberId: string; data: OrganizationMemberUpdate } + > = (props) => { + const { memberId, data } = props ?? {}; + + return updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatch( + memberId, data, requestOptions, ); @@ -2547,31 +2388,33 @@ export const getAcceptOrgInviteApiV1OrganizationsInvitesAcceptPostMutationOption return { mutationFn, ...mutationOptions }; }; -export type AcceptOrgInviteApiV1OrganizationsInvitesAcceptPostMutationResult = +export type UpdateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchMutationResult = NonNullable< Awaited< - ReturnType + ReturnType > >; -export type AcceptOrgInviteApiV1OrganizationsInvitesAcceptPostMutationBody = - OrganizationInviteAccept; -export type AcceptOrgInviteApiV1OrganizationsInvitesAcceptPostMutationError = +export type UpdateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchMutationBody = + OrganizationMemberUpdate; +export type UpdateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchMutationError = HTTPValidationError; /** - * @summary Accept Org Invite + * @summary Update Org Member */ -export const useAcceptOrgInviteApiV1OrganizationsInvitesAcceptPost = < +export const useUpdateOrgMemberApiV1OrganizationsMeMembersMemberIdPatch = < TError = HTTPValidationError, TContext = unknown, >( options?: { mutation?: UseMutationOptions< Awaited< - ReturnType + ReturnType< + typeof updateOrgMemberApiV1OrganizationsMeMembersMemberIdPatch + > >, TError, - { data: OrganizationInviteAccept }, + { memberId: string; data: OrganizationMemberUpdate }, TContext >; request?: SecondParameter; @@ -2579,16 +2422,173 @@ export const useAcceptOrgInviteApiV1OrganizationsInvitesAcceptPost = < queryClient?: QueryClient, ): UseMutationResult< Awaited< - ReturnType + ReturnType >, TError, - { data: OrganizationInviteAccept }, + { memberId: string; data: OrganizationMemberUpdate }, TContext > => { return useMutation( - getAcceptOrgInviteApiV1OrganizationsInvitesAcceptPostMutationOptions( + getUpdateOrgMemberApiV1OrganizationsMeMembersMemberIdPatchMutationOptions( options, ), queryClient, ); }; +/** + * Update board-level access settings for a member. + * @summary Update Member Access + */ +export type updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutResponse200 = + { + data: OrganizationMemberRead; + status: 200; + }; + +export type updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutResponse422 = + { + data: HTTPValidationError; + status: 422; + }; + +export type updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutResponseSuccess = + updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutResponse200 & { + headers: Headers; + }; +export type updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutResponseError = + updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutResponse422 & { + headers: Headers; + }; + +export type updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutResponse = + + | updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutResponseSuccess + | updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutResponseError; + +export const getUpdateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutUrl = + (memberId: string) => { + return `/api/v1/organizations/me/members/${memberId}/access`; + }; + +export const updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut = + async ( + memberId: string, + organizationMemberAccessUpdate: OrganizationMemberAccessUpdate, + options?: RequestInit, + ): Promise => { + return customFetch( + getUpdateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutUrl( + memberId, + ), + { + ...options, + method: "PUT", + headers: { "Content-Type": "application/json", ...options?.headers }, + body: JSON.stringify(organizationMemberAccessUpdate), + }, + ); + }; + +export const getUpdateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutMutationOptions = + (options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut + > + >, + TError, + { memberId: string; data: OrganizationMemberAccessUpdate }, + TContext + >; + request?: SecondParameter; + }): UseMutationOptions< + Awaited< + ReturnType< + typeof updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut + > + >, + TError, + { memberId: string; data: OrganizationMemberAccessUpdate }, + TContext + > => { + const mutationKey = [ + "updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut", + ]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited< + ReturnType< + typeof updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut + > + >, + { memberId: string; data: OrganizationMemberAccessUpdate } + > = (props) => { + const { memberId, data } = props ?? {}; + + return updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut( + memberId, + data, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; + }; + +export type UpdateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutMutationResult = + NonNullable< + Awaited< + ReturnType< + typeof updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut + > + > + >; +export type UpdateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutMutationBody = + OrganizationMemberAccessUpdate; +export type UpdateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutMutationError = + HTTPValidationError; + +/** + * @summary Update Member Access + */ +export const useUpdateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut = + ( + options?: { + mutation?: UseMutationOptions< + Awaited< + ReturnType< + typeof updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut + > + >, + TError, + { memberId: string; data: OrganizationMemberAccessUpdate }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, + ): UseMutationResult< + Awaited< + ReturnType< + typeof updateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPut + > + >, + TError, + { memberId: string; data: OrganizationMemberAccessUpdate }, + TContext + > => { + return useMutation( + getUpdateMemberAccessApiV1OrganizationsMeMembersMemberIdAccessPutMutationOptions( + options, + ), + queryClient, + ); + }; diff --git a/frontend/src/api/generated/tags/tags.ts b/frontend/src/api/generated/tags/tags.ts index 4f2e2a8c..36278bd7 100644 --- a/frontend/src/api/generated/tags/tags.ts +++ b/frontend/src/api/generated/tags/tags.ts @@ -360,6 +360,122 @@ export const useCreateTagApiV1TagsPost = < queryClient, ); }; +/** + * Delete a tag and remove all associated tag links. + * @summary Delete Tag + */ +export type deleteTagApiV1TagsTagIdDeleteResponse200 = { + data: OkResponse; + status: 200; +}; + +export type deleteTagApiV1TagsTagIdDeleteResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type deleteTagApiV1TagsTagIdDeleteResponseSuccess = + deleteTagApiV1TagsTagIdDeleteResponse200 & { + headers: Headers; + }; +export type deleteTagApiV1TagsTagIdDeleteResponseError = + deleteTagApiV1TagsTagIdDeleteResponse422 & { + headers: Headers; + }; + +export type deleteTagApiV1TagsTagIdDeleteResponse = + | deleteTagApiV1TagsTagIdDeleteResponseSuccess + | deleteTagApiV1TagsTagIdDeleteResponseError; + +export const getDeleteTagApiV1TagsTagIdDeleteUrl = (tagId: string) => { + return `/api/v1/tags/${tagId}`; +}; + +export const deleteTagApiV1TagsTagIdDelete = async ( + tagId: string, + options?: RequestInit, +): Promise => { + return customFetch( + getDeleteTagApiV1TagsTagIdDeleteUrl(tagId), + { + ...options, + method: "DELETE", + }, + ); +}; + +export const getDeleteTagApiV1TagsTagIdDeleteMutationOptions = < + TError = HTTPValidationError, + TContext = unknown, +>(options?: { + mutation?: UseMutationOptions< + Awaited>, + TError, + { tagId: string }, + TContext + >; + request?: SecondParameter; +}): UseMutationOptions< + Awaited>, + TError, + { tagId: string }, + TContext +> => { + const mutationKey = ["deleteTagApiV1TagsTagIdDelete"]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited>, + { tagId: string } + > = (props) => { + const { tagId } = props ?? {}; + + return deleteTagApiV1TagsTagIdDelete(tagId, requestOptions); + }; + + return { mutationFn, ...mutationOptions }; +}; + +export type DeleteTagApiV1TagsTagIdDeleteMutationResult = NonNullable< + Awaited> +>; + +export type DeleteTagApiV1TagsTagIdDeleteMutationError = HTTPValidationError; + +/** + * @summary Delete Tag + */ +export const useDeleteTagApiV1TagsTagIdDelete = < + TError = HTTPValidationError, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited>, + TError, + { tagId: string }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited>, + TError, + { tagId: string }, + TContext +> => { + return useMutation( + getDeleteTagApiV1TagsTagIdDeleteMutationOptions(options), + queryClient, + ); +}; /** * Get a single tag in the active organization. * @summary Get Tag @@ -676,119 +792,3 @@ export const useUpdateTagApiV1TagsTagIdPatch = < queryClient, ); }; -/** - * Delete a tag and remove all associated tag links. - * @summary Delete Tag - */ -export type deleteTagApiV1TagsTagIdDeleteResponse200 = { - data: OkResponse; - status: 200; -}; - -export type deleteTagApiV1TagsTagIdDeleteResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type deleteTagApiV1TagsTagIdDeleteResponseSuccess = - deleteTagApiV1TagsTagIdDeleteResponse200 & { - headers: Headers; - }; -export type deleteTagApiV1TagsTagIdDeleteResponseError = - deleteTagApiV1TagsTagIdDeleteResponse422 & { - headers: Headers; - }; - -export type deleteTagApiV1TagsTagIdDeleteResponse = - | deleteTagApiV1TagsTagIdDeleteResponseSuccess - | deleteTagApiV1TagsTagIdDeleteResponseError; - -export const getDeleteTagApiV1TagsTagIdDeleteUrl = (tagId: string) => { - return `/api/v1/tags/${tagId}`; -}; - -export const deleteTagApiV1TagsTagIdDelete = async ( - tagId: string, - options?: RequestInit, -): Promise => { - return customFetch( - getDeleteTagApiV1TagsTagIdDeleteUrl(tagId), - { - ...options, - method: "DELETE", - }, - ); -}; - -export const getDeleteTagApiV1TagsTagIdDeleteMutationOptions = < - TError = HTTPValidationError, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { tagId: string }, - TContext - >; - request?: SecondParameter; -}): UseMutationOptions< - Awaited>, - TError, - { tagId: string }, - TContext -> => { - const mutationKey = ["deleteTagApiV1TagsTagIdDelete"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited>, - { tagId: string } - > = (props) => { - const { tagId } = props ?? {}; - - return deleteTagApiV1TagsTagIdDelete(tagId, requestOptions); - }; - - return { mutationFn, ...mutationOptions }; -}; - -export type DeleteTagApiV1TagsTagIdDeleteMutationResult = NonNullable< - Awaited> ->; - -export type DeleteTagApiV1TagsTagIdDeleteMutationError = HTTPValidationError; - -/** - * @summary Delete Tag - */ -export const useDeleteTagApiV1TagsTagIdDelete = < - TError = HTTPValidationError, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { tagId: string }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited>, - TError, - { tagId: string }, - TContext -> => { - return useMutation( - getDeleteTagApiV1TagsTagIdDeleteMutationOptions(options), - queryClient, - ); -}; diff --git a/frontend/src/api/generated/tasks/tasks.ts b/frontend/src/api/generated/tasks/tasks.ts index 1c246410..cf1f6ac2 100644 --- a/frontend/src/api/generated/tasks/tasks.ts +++ b/frontend/src/api/generated/tasks/tasks.ts @@ -40,259 +40,6 @@ import { customFetch } from "../../mutator"; type SecondParameter unknown> = Parameters[1]; -/** - * Stream task and task-comment events as SSE payloads. - * @summary Stream Tasks - */ -export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponse200 = { - data: unknown; - status: 200; -}; - -export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponseSuccess = - streamTasksApiV1BoardsBoardIdTasksStreamGetResponse200 & { - headers: Headers; - }; -export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponseError = - streamTasksApiV1BoardsBoardIdTasksStreamGetResponse422 & { - headers: Headers; - }; - -export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponse = - | streamTasksApiV1BoardsBoardIdTasksStreamGetResponseSuccess - | streamTasksApiV1BoardsBoardIdTasksStreamGetResponseError; - -export const getStreamTasksApiV1BoardsBoardIdTasksStreamGetUrl = ( - boardId: string, - params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams, -) => { - const normalizedParams = new URLSearchParams(); - - Object.entries(params || {}).forEach(([key, value]) => { - if (value !== undefined) { - normalizedParams.append(key, value === null ? "null" : value.toString()); - } - }); - - const stringifiedParams = normalizedParams.toString(); - - return stringifiedParams.length > 0 - ? `/api/v1/boards/${boardId}/tasks/stream?${stringifiedParams}` - : `/api/v1/boards/${boardId}/tasks/stream`; -}; - -export const streamTasksApiV1BoardsBoardIdTasksStreamGet = async ( - boardId: string, - params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams, - options?: RequestInit, -): Promise => { - return customFetch( - getStreamTasksApiV1BoardsBoardIdTasksStreamGetUrl(boardId, params), - { - ...options, - method: "GET", - }, - ); -}; - -export const getStreamTasksApiV1BoardsBoardIdTasksStreamGetQueryKey = ( - boardId: string, - params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams, -) => { - return [ - `/api/v1/boards/${boardId}/tasks/stream`, - ...(params ? [params] : []), - ] as const; -}; - -export const getStreamTasksApiV1BoardsBoardIdTasksStreamGetQueryOptions = < - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - >; - request?: SecondParameter; - }, -) => { - const { query: queryOptions, request: requestOptions } = options ?? {}; - - const queryKey = - queryOptions?.queryKey ?? - getStreamTasksApiV1BoardsBoardIdTasksStreamGetQueryKey(boardId, params); - - const queryFn: QueryFunction< - Awaited> - > = ({ signal }) => - streamTasksApiV1BoardsBoardIdTasksStreamGet(boardId, params, { - signal, - ...requestOptions, - }); - - return { - queryKey, - queryFn, - enabled: !!boardId, - ...queryOptions, - } as UseQueryOptions< - Awaited>, - TError, - TData - > & { queryKey: DataTag }; -}; - -export type StreamTasksApiV1BoardsBoardIdTasksStreamGetQueryResult = - NonNullable< - Awaited> - >; -export type StreamTasksApiV1BoardsBoardIdTasksStreamGetQueryError = - HTTPValidationError; - -export function useStreamTasksApiV1BoardsBoardIdTasksStreamGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - params: undefined | StreamTasksApiV1BoardsBoardIdTasksStreamGetParams, - options: { - query: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - > & - Pick< - DefinedInitialDataOptions< - Awaited< - ReturnType - >, - TError, - Awaited< - ReturnType - > - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): DefinedUseQueryResult & { - queryKey: DataTag; -}; -export function useStreamTasksApiV1BoardsBoardIdTasksStreamGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - > & - Pick< - UndefinedInitialDataOptions< - Awaited< - ReturnType - >, - TError, - Awaited< - ReturnType - > - >, - "initialData" - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -export function useStreamTasksApiV1BoardsBoardIdTasksStreamGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -}; -/** - * @summary Stream Tasks - */ - -export function useStreamTasksApiV1BoardsBoardIdTasksStreamGet< - TData = Awaited< - ReturnType - >, - TError = HTTPValidationError, ->( - boardId: string, - params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams, - options?: { - query?: Partial< - UseQueryOptions< - Awaited>, - TError, - TData - > - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseQueryResult & { - queryKey: DataTag; -} { - const queryOptions = - getStreamTasksApiV1BoardsBoardIdTasksStreamGetQueryOptions( - boardId, - params, - options, - ); - - const query = useQuery(queryOptions, queryClient) as UseQueryResult< - TData, - TError - > & { queryKey: DataTag }; - - return { ...query, queryKey: queryOptions.queryKey }; -} - /** * List board tasks with optional status and assignment filters. * @summary List Tasks @@ -655,6 +402,385 @@ export const useCreateTaskApiV1BoardsBoardIdTasksPost = < queryClient, ); }; +/** + * Stream task and task-comment events as SSE payloads. + * @summary Stream Tasks + */ +export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponse200 = { + data: unknown; + status: 200; +}; + +export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponseSuccess = + streamTasksApiV1BoardsBoardIdTasksStreamGetResponse200 & { + headers: Headers; + }; +export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponseError = + streamTasksApiV1BoardsBoardIdTasksStreamGetResponse422 & { + headers: Headers; + }; + +export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponse = + | streamTasksApiV1BoardsBoardIdTasksStreamGetResponseSuccess + | streamTasksApiV1BoardsBoardIdTasksStreamGetResponseError; + +export const getStreamTasksApiV1BoardsBoardIdTasksStreamGetUrl = ( + boardId: string, + params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams, +) => { + const normalizedParams = new URLSearchParams(); + + Object.entries(params || {}).forEach(([key, value]) => { + if (value !== undefined) { + normalizedParams.append(key, value === null ? "null" : value.toString()); + } + }); + + const stringifiedParams = normalizedParams.toString(); + + return stringifiedParams.length > 0 + ? `/api/v1/boards/${boardId}/tasks/stream?${stringifiedParams}` + : `/api/v1/boards/${boardId}/tasks/stream`; +}; + +export const streamTasksApiV1BoardsBoardIdTasksStreamGet = async ( + boardId: string, + params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams, + options?: RequestInit, +): Promise => { + return customFetch( + getStreamTasksApiV1BoardsBoardIdTasksStreamGetUrl(boardId, params), + { + ...options, + method: "GET", + }, + ); +}; + +export const getStreamTasksApiV1BoardsBoardIdTasksStreamGetQueryKey = ( + boardId: string, + params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams, +) => { + return [ + `/api/v1/boards/${boardId}/tasks/stream`, + ...(params ? [params] : []), + ] as const; +}; + +export const getStreamTasksApiV1BoardsBoardIdTasksStreamGetQueryOptions = < + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + >; + request?: SecondParameter; + }, +) => { + const { query: queryOptions, request: requestOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? + getStreamTasksApiV1BoardsBoardIdTasksStreamGetQueryKey(boardId, params); + + const queryFn: QueryFunction< + Awaited> + > = ({ signal }) => + streamTasksApiV1BoardsBoardIdTasksStreamGet(boardId, params, { + signal, + ...requestOptions, + }); + + return { + queryKey, + queryFn, + enabled: !!boardId, + ...queryOptions, + } as UseQueryOptions< + Awaited>, + TError, + TData + > & { queryKey: DataTag }; +}; + +export type StreamTasksApiV1BoardsBoardIdTasksStreamGetQueryResult = + NonNullable< + Awaited> + >; +export type StreamTasksApiV1BoardsBoardIdTasksStreamGetQueryError = + HTTPValidationError; + +export function useStreamTasksApiV1BoardsBoardIdTasksStreamGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + params: undefined | StreamTasksApiV1BoardsBoardIdTasksStreamGetParams, + options: { + query: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + > & + Pick< + DefinedInitialDataOptions< + Awaited< + ReturnType + >, + TError, + Awaited< + ReturnType + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): DefinedUseQueryResult & { + queryKey: DataTag; +}; +export function useStreamTasksApiV1BoardsBoardIdTasksStreamGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + > & + Pick< + UndefinedInitialDataOptions< + Awaited< + ReturnType + >, + TError, + Awaited< + ReturnType + > + >, + "initialData" + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +export function useStreamTasksApiV1BoardsBoardIdTasksStreamGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +}; +/** + * @summary Stream Tasks + */ + +export function useStreamTasksApiV1BoardsBoardIdTasksStreamGet< + TData = Awaited< + ReturnType + >, + TError = HTTPValidationError, +>( + boardId: string, + params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams, + options?: { + query?: Partial< + UseQueryOptions< + Awaited>, + TError, + TData + > + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseQueryResult & { + queryKey: DataTag; +} { + const queryOptions = + getStreamTasksApiV1BoardsBoardIdTasksStreamGetQueryOptions( + boardId, + params, + options, + ); + + const query = useQuery(queryOptions, queryClient) as UseQueryResult< + TData, + TError + > & { queryKey: DataTag }; + + return { ...query, queryKey: queryOptions.queryKey }; +} + +/** + * Delete a task and related records. + * @summary Delete Task + */ +export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse200 = { + data: OkResponse; + status: 200; +}; + +export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse422 = { + data: HTTPValidationError; + status: 422; +}; + +export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponseSuccess = + deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse200 & { + headers: Headers; + }; +export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponseError = + deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse422 & { + headers: Headers; + }; + +export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse = + | deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponseSuccess + | deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponseError; + +export const getDeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteUrl = ( + boardId: string, + taskId: string, +) => { + return `/api/v1/boards/${boardId}/tasks/${taskId}`; +}; + +export const deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete = async ( + boardId: string, + taskId: string, + options?: RequestInit, +): Promise => { + return customFetch( + getDeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteUrl(boardId, taskId), + { + ...options, + method: "DELETE", + }, + ); +}; + +export const getDeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteMutationOptions = < + TError = HTTPValidationError, + TContext = unknown, +>(options?: { + mutation?: UseMutationOptions< + Awaited>, + TError, + { boardId: string; taskId: string }, + TContext + >; + request?: SecondParameter; +}): UseMutationOptions< + Awaited>, + TError, + { boardId: string; taskId: string }, + TContext +> => { + const mutationKey = ["deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete"]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited>, + { boardId: string; taskId: string } + > = (props) => { + const { boardId, taskId } = props ?? {}; + + return deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete( + boardId, + taskId, + requestOptions, + ); + }; + + return { mutationFn, ...mutationOptions }; +}; + +export type DeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteMutationResult = + NonNullable< + Awaited> + >; + +export type DeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteMutationError = + HTTPValidationError; + +/** + * @summary Delete Task + */ +export const useDeleteTaskApiV1BoardsBoardIdTasksTaskIdDelete = < + TError = HTTPValidationError, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited>, + TError, + { boardId: string; taskId: string }, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited>, + TError, + { boardId: string; taskId: string }, + TContext +> => { + return useMutation( + getDeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteMutationOptions(options), + queryClient, + ); +}; /** * Update task status, assignment, comment, and dependency state. * @summary Update Task @@ -794,132 +920,6 @@ export const useUpdateTaskApiV1BoardsBoardIdTasksTaskIdPatch = < queryClient, ); }; -/** - * Delete a task and related records. - * @summary Delete Task - */ -export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse200 = { - data: OkResponse; - status: 200; -}; - -export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse422 = { - data: HTTPValidationError; - status: 422; -}; - -export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponseSuccess = - deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse200 & { - headers: Headers; - }; -export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponseError = - deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse422 & { - headers: Headers; - }; - -export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse = - | deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponseSuccess - | deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponseError; - -export const getDeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteUrl = ( - boardId: string, - taskId: string, -) => { - return `/api/v1/boards/${boardId}/tasks/${taskId}`; -}; - -export const deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete = async ( - boardId: string, - taskId: string, - options?: RequestInit, -): Promise => { - return customFetch( - getDeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteUrl(boardId, taskId), - { - ...options, - method: "DELETE", - }, - ); -}; - -export const getDeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteMutationOptions = < - TError = HTTPValidationError, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { boardId: string; taskId: string }, - TContext - >; - request?: SecondParameter; -}): UseMutationOptions< - Awaited>, - TError, - { boardId: string; taskId: string }, - TContext -> => { - const mutationKey = ["deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited>, - { boardId: string; taskId: string } - > = (props) => { - const { boardId, taskId } = props ?? {}; - - return deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete( - boardId, - taskId, - requestOptions, - ); - }; - - return { mutationFn, ...mutationOptions }; -}; - -export type DeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteMutationResult = - NonNullable< - Awaited> - >; - -export type DeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteMutationError = - HTTPValidationError; - -/** - * @summary Delete Task - */ -export const useDeleteTaskApiV1BoardsBoardIdTasksTaskIdDelete = < - TError = HTTPValidationError, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { boardId: string; taskId: string }, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited>, - TError, - { boardId: string; taskId: string }, - TContext -> => { - return useMutation( - getDeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteMutationOptions(options), - queryClient, - ); -}; /** * List comments for a task in chronological order. * @summary List Task Comments diff --git a/frontend/src/api/generated/users/users.ts b/frontend/src/api/generated/users/users.ts index 825fc351..31c86e07 100644 --- a/frontend/src/api/generated/users/users.ts +++ b/frontend/src/api/generated/users/users.ts @@ -31,6 +31,108 @@ import { customFetch } from "../../mutator"; type SecondParameter unknown> = Parameters[1]; +/** + * Delete the authenticated account and any personal-only organizations. + * @summary Delete Me + */ +export type deleteMeApiV1UsersMeDeleteResponse200 = { + data: OkResponse; + status: 200; +}; + +export type deleteMeApiV1UsersMeDeleteResponseSuccess = + deleteMeApiV1UsersMeDeleteResponse200 & { + headers: Headers; + }; +export type deleteMeApiV1UsersMeDeleteResponse = + deleteMeApiV1UsersMeDeleteResponseSuccess; + +export const getDeleteMeApiV1UsersMeDeleteUrl = () => { + return `/api/v1/users/me`; +}; + +export const deleteMeApiV1UsersMeDelete = async ( + options?: RequestInit, +): Promise => { + return customFetch( + getDeleteMeApiV1UsersMeDeleteUrl(), + { + ...options, + method: "DELETE", + }, + ); +}; + +export const getDeleteMeApiV1UsersMeDeleteMutationOptions = < + TError = unknown, + TContext = unknown, +>(options?: { + mutation?: UseMutationOptions< + Awaited>, + TError, + void, + TContext + >; + request?: SecondParameter; +}): UseMutationOptions< + Awaited>, + TError, + void, + TContext +> => { + const mutationKey = ["deleteMeApiV1UsersMeDelete"]; + const { mutation: mutationOptions, request: requestOptions } = options + ? options.mutation && + "mutationKey" in options.mutation && + options.mutation.mutationKey + ? options + : { ...options, mutation: { ...options.mutation, mutationKey } } + : { mutation: { mutationKey }, request: undefined }; + + const mutationFn: MutationFunction< + Awaited>, + void + > = () => { + return deleteMeApiV1UsersMeDelete(requestOptions); + }; + + return { mutationFn, ...mutationOptions }; +}; + +export type DeleteMeApiV1UsersMeDeleteMutationResult = NonNullable< + Awaited> +>; + +export type DeleteMeApiV1UsersMeDeleteMutationError = unknown; + +/** + * @summary Delete Me + */ +export const useDeleteMeApiV1UsersMeDelete = < + TError = unknown, + TContext = unknown, +>( + options?: { + mutation?: UseMutationOptions< + Awaited>, + TError, + void, + TContext + >; + request?: SecondParameter; + }, + queryClient?: QueryClient, +): UseMutationResult< + Awaited>, + TError, + void, + TContext +> => { + return useMutation( + getDeleteMeApiV1UsersMeDeleteMutationOptions(options), + queryClient, + ); +}; /** * Return the authenticated user's current profile payload. * @summary Get Me @@ -201,108 +303,6 @@ export function useGetMeApiV1UsersMeGet< return { ...query, queryKey: queryOptions.queryKey }; } -/** - * Delete the authenticated account and any personal-only organizations. - * @summary Delete Me - */ -export type deleteMeApiV1UsersMeDeleteResponse200 = { - data: OkResponse; - status: 200; -}; - -export type deleteMeApiV1UsersMeDeleteResponseSuccess = - deleteMeApiV1UsersMeDeleteResponse200 & { - headers: Headers; - }; -export type deleteMeApiV1UsersMeDeleteResponse = - deleteMeApiV1UsersMeDeleteResponseSuccess; - -export const getDeleteMeApiV1UsersMeDeleteUrl = () => { - return `/api/v1/users/me`; -}; - -export const deleteMeApiV1UsersMeDelete = async ( - options?: RequestInit, -): Promise => { - return customFetch( - getDeleteMeApiV1UsersMeDeleteUrl(), - { - ...options, - method: "DELETE", - }, - ); -}; - -export const getDeleteMeApiV1UsersMeDeleteMutationOptions = < - TError = unknown, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - void, - TContext - >; - request?: SecondParameter; -}): UseMutationOptions< - Awaited>, - TError, - void, - TContext -> => { - const mutationKey = ["deleteMeApiV1UsersMeDelete"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited>, - void - > = () => { - return deleteMeApiV1UsersMeDelete(requestOptions); - }; - - return { mutationFn, ...mutationOptions }; -}; - -export type DeleteMeApiV1UsersMeDeleteMutationResult = NonNullable< - Awaited> ->; - -export type DeleteMeApiV1UsersMeDeleteMutationError = unknown; - -/** - * @summary Delete Me - */ -export const useDeleteMeApiV1UsersMeDelete = < - TError = unknown, - TContext = unknown, ->( - options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - void, - TContext - >; - request?: SecondParameter; - }, - queryClient?: QueryClient, -): UseMutationResult< - Awaited>, - TError, - void, - TContext -> => { - return useMutation( - getDeleteMeApiV1UsersMeDeleteMutationOptions(options), - queryClient, - ); -}; /** * Apply partial profile updates for the authenticated user. * @summary Update Me diff --git a/frontend/src/app/boards/[boardId]/edit/page.tsx b/frontend/src/app/boards/[boardId]/edit/page.tsx index 7d232a77..a243b043 100644 --- a/frontend/src/app/boards/[boardId]/edit/page.tsx +++ b/frontend/src/app/boards/[boardId]/edit/page.tsx @@ -190,10 +190,7 @@ function WebhookCard({ /> ) : (
- +
)}
@@ -944,9 +941,7 @@ export default function EditBoardPage() { aria-checked={resolvedOnlyLeadCanChangeStatus} aria-label="Only lead can change status" onClick={() => - setOnlyLeadCanChangeStatus( - !resolvedOnlyLeadCanChangeStatus, - ) + setOnlyLeadCanChangeStatus(!resolvedOnlyLeadCanChangeStatus) } disabled={isLoading} className={`mt-0.5 inline-flex h-6 w-11 shrink-0 items-center rounded-full border transition ${ diff --git a/frontend/src/app/boards/[boardId]/page.tsx b/frontend/src/app/boards/[boardId]/page.tsx index f47975c9..84bd785d 100644 --- a/frontend/src/app/boards/[boardId]/page.tsx +++ b/frontend/src/app/boards/[boardId]/page.tsx @@ -2,7 +2,15 @@ export const dynamic = "force-dynamic"; -import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { + memo, + type ReactNode, + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from "react"; import { useParams, useRouter, useSearchParams } from "next/navigation"; import { SignInButton, SignedIn, SignedOut, useAuth } from "@/auth/clerk"; @@ -82,6 +90,10 @@ import { type listTagsApiV1TagsGetResponse, useListTagsApiV1TagsGet, } from "@/api/generated/tags/tags"; +import { + type listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGetResponse, + useListOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet, +} from "@/api/generated/org-custom-fields/org-custom-fields"; import type { AgentRead, ApprovalRead, @@ -92,6 +104,7 @@ import type { OrganizationMemberRead, TaskCardRead, TaskCommentRead, + TaskCustomFieldDefinitionRead, TagRead, TaskRead, } from "@/api/generated/model"; @@ -108,6 +121,11 @@ import { usePageActive } from "@/hooks/usePageActive"; type Board = BoardRead; type TaskStatus = Exclude; +type TaskCustomFieldValues = Record; + +type TaskCustomFieldPayload = { + custom_field_values?: TaskCustomFieldValues; +}; type Task = Omit< TaskCardRead, @@ -117,6 +135,7 @@ type Task = Omit< priority: string; approvals_count: number; approvals_pending_count: number; + custom_field_values?: TaskCustomFieldValues | null; }; type Agent = AgentRead & { status: string }; @@ -174,6 +193,15 @@ const LIVE_FEED_EVENT_TYPES = new Set([ const isLiveFeedEventType = (value: string): value is LiveFeedEventType => LIVE_FEED_EVENT_TYPES.has(value as LiveFeedEventType); +type BoardTaskCreatePayload = Parameters< + typeof createTaskApiV1BoardsBoardIdTasksPost +>[1] & + TaskCustomFieldPayload; +type BoardTaskUpdatePayload = Parameters< + typeof updateTaskApiV1BoardsBoardIdTasksTaskIdPatch +>[2] & + TaskCustomFieldPayload; + const toLiveFeedFromActivity = ( event: ActivityEventRead, ): LiveFeedItem | null => { @@ -424,6 +452,322 @@ const normalizeTask = (task: TaskCardRead): Task => ({ approvals_pending_count: task.approvals_pending_count ?? 0, }); +const isRecordObject = (value: unknown): value is Record => + !!value && typeof value === "object" && !Array.isArray(value); + +const normalizeCustomFieldValues = (value: unknown): TaskCustomFieldValues => { + if (!isRecordObject(value)) return {}; + const entries = Object.entries(value); + if (entries.length === 0) return {}; + return entries + .sort(([left], [right]) => left.localeCompare(right)) + .reduce((acc, [key, rawValue]) => { + if (isRecordObject(rawValue)) { + acc[key] = normalizeCustomFieldValues(rawValue); + return acc; + } + if (Array.isArray(rawValue)) { + acc[key] = rawValue.map((item) => + isRecordObject(item) ? normalizeCustomFieldValues(item) : item, + ); + return acc; + } + acc[key] = rawValue; + return acc; + }, {} as TaskCustomFieldValues); +}; + +const canonicalizeCustomFieldValues = (value: unknown): string => + JSON.stringify(normalizeCustomFieldValues(value)); + +const customFieldInputText = (value: unknown): string => { + if (value === null || value === undefined) return ""; + if (typeof value === "string") return value; + try { + return JSON.stringify(value); + } catch { + return String(value); + } +}; + +const formatDateOnlyValue = (value: string): string => { + const trimmed = value.trim(); + const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(trimmed); + if (match) { + const year = Number.parseInt(match[1], 10); + const month = Number.parseInt(match[2], 10); + const day = Number.parseInt(match[3], 10); + const parsed = new Date(year, month - 1, day); + if ( + parsed.getFullYear() === year && + parsed.getMonth() === month - 1 && + parsed.getDate() === day + ) { + return parsed.toLocaleDateString(undefined, { + year: "numeric", + month: "short", + day: "numeric", + }); + } + } + const parsed = new Date(trimmed); + if (Number.isNaN(parsed.getTime())) return trimmed; + return parsed.toLocaleDateString(undefined, { + year: "numeric", + month: "short", + day: "numeric", + }); +}; + +const formatDateTimeValue = (value: string): string => { + const parsed = parseApiDatetime(value) ?? new Date(value); + if (Number.isNaN(parsed.getTime())) return value; + return parsed.toLocaleString(undefined, { + year: "numeric", + month: "short", + day: "numeric", + hour: "2-digit", + minute: "2-digit", + }); +}; + +const formatCustomFieldDetailValue = ( + definition: TaskCustomFieldDefinitionRead, + value: unknown, +): ReactNode => { + if (value === null || value === undefined) return "—"; + + const fieldType = definition.field_type ?? "text"; + if (fieldType === "boolean") { + if (value === true) return "True"; + if (value === false) return "False"; + if (typeof value === "string") { + const normalized = value.trim().toLowerCase(); + if (normalized === "true") return "True"; + if (normalized === "false") return "False"; + } + return customFieldInputText(value) || "—"; + } + + if (fieldType === "integer" || fieldType === "decimal") { + if (typeof value === "number" && Number.isFinite(value)) { + return value.toLocaleString(); + } + if (typeof value === "string") { + const trimmed = value.trim(); + if (!trimmed) return "—"; + const parsed = Number(trimmed); + if (Number.isFinite(parsed)) return parsed.toLocaleString(); + return trimmed; + } + return customFieldInputText(value) || "—"; + } + + if (fieldType === "date") { + if (typeof value !== "string") return customFieldInputText(value) || "—"; + if (!value.trim()) return "—"; + return formatDateOnlyValue(value); + } + + if (fieldType === "date_time") { + if (typeof value !== "string") return customFieldInputText(value) || "—"; + if (!value.trim()) return "—"; + return formatDateTimeValue(value); + } + + if (fieldType === "url") { + if (typeof value !== "string") return customFieldInputText(value) || "—"; + const trimmed = value.trim(); + if (!trimmed) return "—"; + try { + // Validate URL before rendering as a link. + // eslint-disable-next-line no-new + new URL(trimmed); + return ( + + {trimmed} + + + ); + } catch { + return trimmed; + } + } + + if (fieldType === "json") { + try { + const normalized = + typeof value === "string" ? JSON.parse(value) : value; + return ( +
+          {JSON.stringify(normalized, null, 2)}
+        
+ ); + } catch { + return customFieldInputText(value) || "—"; + } + } + + if (fieldType === "text_long") { + const text = customFieldInputText(value); + return text ? {text} : "—"; + } + + return customFieldInputText(value) || "—"; +}; + +const isCustomFieldValueSet = (value: unknown): boolean => { + if (value === null || value === undefined) return false; + if (typeof value === "string") return value.trim().length > 0; + if (Array.isArray(value)) return value.length > 0; + if (isRecordObject(value)) return Object.keys(value).length > 0; + return true; +}; + +const isCustomFieldVisible = ( + definition: TaskCustomFieldDefinitionRead, + value: unknown, +): boolean => { + if (definition.ui_visibility === "hidden") return false; + if (definition.ui_visibility === "if_set") return isCustomFieldValueSet(value); + return true; +}; + +const parseCustomFieldInputValue = ( + definition: TaskCustomFieldDefinitionRead, + text: string, +): unknown | null => { + const trimmed = text.trim(); + if (!trimmed) return null; + if (definition.field_type === "text" || definition.field_type === "text_long") { + return trimmed; + } + if (definition.field_type === "integer") { + if (!/^-?\d+$/.test(trimmed)) return trimmed; + return Number.parseInt(trimmed, 10); + } + if (definition.field_type === "decimal") { + if (!/^-?\d+(\.\d+)?$/.test(trimmed)) return trimmed; + return Number.parseFloat(trimmed); + } + if (definition.field_type === "boolean") { + if (trimmed.toLowerCase() === "true") return true; + if (trimmed.toLowerCase() === "false") return false; + return trimmed; + } + if ( + definition.field_type === "date" || + definition.field_type === "date_time" || + definition.field_type === "url" + ) { + return trimmed; + } + if (definition.field_type === "json") { + try { + const parsed = JSON.parse(trimmed); + if ( + parsed === null || + typeof parsed !== "object" || + (!Array.isArray(parsed) && typeof parsed !== "object") + ) { + return trimmed; + } + return parsed; + } catch { + return trimmed; + } + } + try { + return JSON.parse(trimmed); + } catch { + return trimmed; + } +}; + +const boardCustomFieldValues = ( + definitions: TaskCustomFieldDefinitionRead[], + value: unknown, +): TaskCustomFieldValues => { + const source = normalizeCustomFieldValues(value); + return definitions.reduce((acc, definition) => { + const key = definition.field_key; + if (Object.prototype.hasOwnProperty.call(source, key)) { + acc[key] = source[key]; + return acc; + } + acc[key] = definition.default_value ?? null; + return acc; + }, {} as TaskCustomFieldValues); +}; + +const customFieldPayload = ( + definitions: TaskCustomFieldDefinitionRead[], + values: TaskCustomFieldValues, +): TaskCustomFieldValues => + definitions.reduce((acc, definition) => { + const key = definition.field_key; + acc[key] = + Object.prototype.hasOwnProperty.call(values, key) && + values[key] !== undefined + ? values[key] + : null; + return acc; + }, {} as TaskCustomFieldValues); + +const canonicalizeCustomFieldValue = (value: unknown): string => { + if (value === undefined) return "__undefined__"; + if (value === null) return "__null__"; + if (isRecordObject(value)) { + return JSON.stringify(normalizeCustomFieldValues(value)); + } + try { + return JSON.stringify(value); + } catch { + return String(value); + } +}; + +const customFieldPatchPayload = ( + definitions: TaskCustomFieldDefinitionRead[], + currentValues: TaskCustomFieldValues, + nextValues: TaskCustomFieldValues, +): TaskCustomFieldValues => + definitions.reduce((acc, definition) => { + const key = definition.field_key; + const currentValue = Object.prototype.hasOwnProperty.call(currentValues, key) + ? currentValues[key] + : null; + const nextValue = Object.prototype.hasOwnProperty.call(nextValues, key) + ? nextValues[key] + : null; + if ( + canonicalizeCustomFieldValue(currentValue) === + canonicalizeCustomFieldValue(nextValue) + ) { + return acc; + } + acc[key] = nextValue ?? null; + return acc; + }, {} as TaskCustomFieldValues); + +const firstMissingRequiredCustomField = ( + definitions: TaskCustomFieldDefinitionRead[], + values: TaskCustomFieldValues, +): string | null => { + for (const definition of definitions) { + if (definition.required !== true) continue; + const value = values[definition.field_key]; + if (value !== null && value !== undefined) continue; + return definition.label || definition.field_key; + } + return null; +}; + const normalizeAgent = (agent: AgentRead): Agent => ({ ...agent, status: agent.status ?? "offline", @@ -702,6 +1046,29 @@ export default function BoardDetailPage() { tagsQuery.data?.status === 200 ? (tagsQuery.data.data.items ?? []) : [], [tagsQuery.data], ); + const customFieldDefinitionsQuery = + useListOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGet< + listOrgCustomFieldsApiV1OrganizationsMeCustomFieldsGetResponse, + ApiError + >({ + query: { + enabled: Boolean(isSignedIn), + refetchOnMount: "always", + retry: false, + }, + }); + const boardCustomFieldDefinitions = useMemo(() => { + if (!boardId || customFieldDefinitionsQuery.data?.status !== 200) { + return [] as TaskCustomFieldDefinitionRead[]; + } + return (customFieldDefinitionsQuery.data.data ?? []) + .filter((definition) => (definition.board_ids ?? []).includes(boardId)) + .sort((left, right) => + (left.label || left.field_key).localeCompare( + right.label || right.field_key, + ), + ); + }, [boardId, customFieldDefinitionsQuery.data]); const boardAccess = useMemo( () => @@ -1010,6 +1377,8 @@ export default function BoardDetailPage() { const [priority, setPriority] = useState("medium"); const [createDueDate, setCreateDueDate] = useState(""); const [createTagIds, setCreateTagIds] = useState([]); + const [createCustomFieldValues, setCreateCustomFieldValues] = + useState({}); const [createError, setCreateError] = useState(null); const [isCreating, setIsCreating] = useState(false); @@ -1023,10 +1392,30 @@ export default function BoardDetailPage() { const [editDependsOnTaskIds, setEditDependsOnTaskIds] = useState( [], ); + const [editCustomFieldValues, setEditCustomFieldValues] = + useState({}); const [isSavingTask, setIsSavingTask] = useState(false); const [saveTaskError, setSaveTaskError] = useState(null); const isSidePanelOpen = isDetailOpen || isChatOpen || isLiveFeedOpen; + const defaultCreateCustomFieldValues = useMemo( + () => boardCustomFieldValues(boardCustomFieldDefinitions, {}), + [boardCustomFieldDefinitions], + ); + const selectedTaskCustomFieldValues = useMemo( + () => + boardCustomFieldValues( + boardCustomFieldDefinitions, + selectedTask?.custom_field_values, + ), + [boardCustomFieldDefinitions, selectedTask?.custom_field_values], + ); + + useEffect(() => { + setCreateCustomFieldValues((prev) => + boardCustomFieldValues(boardCustomFieldDefinitions, prev), + ); + }, [boardCustomFieldDefinitions]); const titleLabel = useMemo( () => (board ? `${board.name} board` : "Board"), @@ -1497,6 +1886,9 @@ export default function BoardDetailPage() { setEditAssigneeId(""); setEditTagIds([]); setEditDependsOnTaskIds([]); + setEditCustomFieldValues( + boardCustomFieldValues(boardCustomFieldDefinitions, {}), + ); setSaveTaskError(null); return; } @@ -1508,8 +1900,14 @@ export default function BoardDetailPage() { setEditAssigneeId(selectedTask.assigned_agent_id ?? ""); setEditTagIds(selectedTask.tag_ids ?? []); setEditDependsOnTaskIds(selectedTask.depends_on_task_ids ?? []); + setEditCustomFieldValues( + boardCustomFieldValues( + boardCustomFieldDefinitions, + selectedTask.custom_field_values, + ), + ); setSaveTaskError(null); - }, [selectedTask]); + }, [boardCustomFieldDefinitions, selectedTask]); useEffect(() => { if (!isPageActive) return; @@ -1620,19 +2018,20 @@ export default function BoardDetailPage() { return next; }); } else if (payload.task) { + const incomingTask = payload.task; setTasks((prev) => { const index = prev.findIndex( - (item) => item.id === payload.task?.id, + (item) => item.id === incomingTask.id, ); if (index === -1) { - const assignee = payload.task?.assigned_agent_id + const assignee = incomingTask.assigned_agent_id ? (agentsRef.current.find( (agent) => - agent.id === payload.task?.assigned_agent_id, + agent.id === incomingTask.assigned_agent_id, )?.name ?? null) : null; const created = normalizeTask({ - ...payload.task, + ...incomingTask, assignee, approvals_count: 0, approvals_pending_count: 0, @@ -1641,15 +2040,15 @@ export default function BoardDetailPage() { } const next = [...prev]; const existing = next[index]; - const assignee = payload.task?.assigned_agent_id + const assignee = incomingTask.assigned_agent_id ? (agentsRef.current.find( (agent) => - agent.id === payload.task?.assigned_agent_id, + agent.id === incomingTask.assigned_agent_id, )?.name ?? null) : null; const updated = normalizeTask({ ...existing, - ...payload.task, + ...incomingTask, assignee, approvals_count: existing.approvals_count, approvals_pending_count: existing.approvals_pending_count, @@ -1657,6 +2056,21 @@ export default function BoardDetailPage() { next[index] = { ...existing, ...updated }; return next; }); + if (selectedTaskIdRef.current === incomingTask.id) { + setSelectedTask((prev) => { + if (!prev || prev.id !== incomingTask.id) { + return prev; + } + return { + ...prev, + ...incomingTask, + custom_field_values: + incomingTask.custom_field_values !== undefined + ? incomingTask.custom_field_values + : prev.custom_field_values, + }; + }); + } } } catch { // Ignore malformed payloads. @@ -1815,6 +2229,7 @@ export default function BoardDetailPage() { setPriority("medium"); setCreateDueDate(""); setCreateTagIds([]); + setCreateCustomFieldValues(defaultCreateCustomFieldValues); setCreateError(null); }; @@ -1825,17 +2240,36 @@ export default function BoardDetailPage() { setCreateError("Add a task title to continue."); return; } + const createCustomFieldPayload = customFieldPayload( + boardCustomFieldDefinitions, + createCustomFieldValues, + ); + const missingRequiredCustomField = firstMissingRequiredCustomField( + boardCustomFieldDefinitions, + createCustomFieldPayload, + ); + if (missingRequiredCustomField) { + setCreateError( + `Custom field "${missingRequiredCustomField}" is required.`, + ); + return; + } setIsCreating(true); setCreateError(null); try { - const result = await createTaskApiV1BoardsBoardIdTasksPost(boardId, { + const payload: BoardTaskCreatePayload = { title: trimmed, description: description.trim() || null, status: "inbox", priority, due_at: localDateInputToUtcIso(createDueDate), tag_ids: createTagIds, - }); + custom_field_values: createCustomFieldPayload, + }; + const result = await createTaskApiV1BoardsBoardIdTasksPost( + boardId, + payload, + ); if (result.status !== 200) throw new Error("Unable to create task."); const created = normalizeTask({ @@ -2075,6 +2509,15 @@ export default function BoardDetailPage() { .sort() .join("|"); const nextDeps = [...editDependsOnTaskIds].sort().join("|"); + const currentCustomFieldValues = canonicalizeCustomFieldValues( + boardCustomFieldValues( + boardCustomFieldDefinitions, + selectedTask.custom_field_values, + ), + ); + const nextCustomFieldValues = canonicalizeCustomFieldValues( + customFieldPayload(boardCustomFieldDefinitions, editCustomFieldValues), + ); return ( normalizedTitle !== selectedTask.title || normalizedDescription !== currentDescription || @@ -2083,7 +2526,8 @@ export default function BoardDetailPage() { editDueDate !== currentDueDate || editAssigneeId !== currentAssignee || currentTags !== nextTags || - currentDeps !== nextDeps + currentDeps !== nextDeps || + currentCustomFieldValues !== nextCustomFieldValues ); }, [ editAssigneeId, @@ -2094,6 +2538,8 @@ export default function BoardDetailPage() { editPriority, editStatus, editTitle, + editCustomFieldValues, + boardCustomFieldDefinitions, selectedTask, ]); @@ -2348,6 +2794,34 @@ export default function BoardDetailPage() { setSaveTaskError("Title is required."); return; } + const currentTaskCustomFieldValues = boardCustomFieldValues( + boardCustomFieldDefinitions, + selectedTask.custom_field_values, + ); + const editCustomFieldPayload = customFieldPayload( + boardCustomFieldDefinitions, + editCustomFieldValues, + ); + const editCustomFieldPatch = customFieldPatchPayload( + boardCustomFieldDefinitions, + currentTaskCustomFieldValues, + editCustomFieldPayload, + ); + const missingRequiredCustomField = firstMissingRequiredCustomField( + boardCustomFieldDefinitions.filter((definition) => + Object.prototype.hasOwnProperty.call( + editCustomFieldPatch, + definition.field_key, + ), + ), + editCustomFieldPatch, + ); + if (missingRequiredCustomField) { + setSaveTaskError( + `Custom field "${missingRequiredCustomField}" is required.`, + ); + return; + } setIsSavingTask(true); setSaveTaskError(null); try { @@ -2361,10 +2835,10 @@ export default function BoardDetailPage() { const tagsChanged = currentTags !== nextTags; const currentDueDate = toLocalDateInput(selectedTask.due_at); const dueDateChanged = editDueDate !== currentDueDate; + const customFieldValuesChanged = + Object.keys(editCustomFieldPatch).length > 0; - const updatePayload: Parameters< - typeof updateTaskApiV1BoardsBoardIdTasksTaskIdPatch - >[2] = { + const updatePayload: BoardTaskUpdatePayload = { title: trimmedTitle, description: editDescription.trim() || null, status: editStatus, @@ -2381,6 +2855,9 @@ export default function BoardDetailPage() { if (dueDateChanged) { updatePayload.due_at = localDateInputToUtcIso(editDueDate); } + if (customFieldValuesChanged && Object.keys(editCustomFieldPatch).length > 0) { + updatePayload.custom_field_values = editCustomFieldPatch; + } const result = await updateTaskApiV1BoardsBoardIdTasksTaskIdPatch( boardId, @@ -2445,6 +2922,12 @@ export default function BoardDetailPage() { setEditAssigneeId(selectedTask.assigned_agent_id ?? ""); setEditTagIds(selectedTask.tag_ids ?? []); setEditDependsOnTaskIds(selectedTask.depends_on_task_ids ?? []); + setEditCustomFieldValues( + boardCustomFieldValues( + boardCustomFieldDefinitions, + selectedTask.custom_field_values, + ), + ); setSaveTaskError(null); }; @@ -2897,6 +3380,17 @@ export default function BoardDetailPage() { > + {isOrgAdmin ? ( + + ) : null} {isOrgAdmin ? (
+
+

+ Custom fields +

+ {customFieldDefinitionsQuery.isLoading ? ( +

Loading custom fields…

+ ) : boardCustomFieldDefinitions.length > 0 ? ( +
+
+ {boardCustomFieldDefinitions.map((definition) => { + const value = + selectedTaskCustomFieldValues[definition.field_key]; + if (!isCustomFieldVisible(definition, value)) { + return null; + } + return ( +
+
+ {definition.label || definition.field_key} + {definition.required === true ? ( + * + ) : null} +
+
+ {formatCustomFieldDetailValue(definition, value)} +
+
+ ); + })} +
+
+ ) : ( +

No custom fields.

+ )} +

Tags @@ -3798,6 +4330,125 @@ export default function BoardDetailPage() { disabled={!selectedTask || isSavingTask || !canWrite} />

+
+ + {customFieldDefinitionsQuery.isLoading ? ( +

Loading custom fields…

+ ) : boardCustomFieldDefinitions.length === 0 ? ( +

+ No custom fields configured for this board. +

+ ) : ( +
+ {boardCustomFieldDefinitions.map((definition) => { + const fieldValue = editCustomFieldValues[definition.field_key]; + if (!isCustomFieldVisible(definition, fieldValue)) { + return null; + } + return ( +
+ + {definition.field_type === "boolean" ? ( + + ) : definition.field_type === "text_long" || + definition.field_type === "json" ? ( +