feat(tags): add tag management interfaces and update related schemas

This commit is contained in:
Abhimanyu Saharan
2026-02-12 18:35:48 +05:30
parent 2ebdead95b
commit 8d7d9da4e9
146 changed files with 6956 additions and 8645 deletions

View File

@@ -20,8 +20,8 @@ from app.db.pagination import paginate
from app.db.session import get_session from app.db.session import get_session
from app.models.agents import Agent from app.models.agents import Agent
from app.models.boards import Board from app.models.boards import Board
from app.models.tags import Tag
from app.models.task_dependencies import TaskDependency from app.models.task_dependencies import TaskDependency
from app.models.task_tags import TaskTag
from app.models.tasks import Task from app.models.tasks import Task
from app.schemas.agents import ( from app.schemas.agents import (
AgentCreate, AgentCreate,
@@ -44,18 +44,18 @@ from app.schemas.gateway_coordination import (
GatewayMainAskUserResponse, GatewayMainAskUserResponse,
) )
from app.schemas.pagination import DefaultLimitOffsetPage from app.schemas.pagination import DefaultLimitOffsetPage
from app.schemas.task_tags import TaskTagRef from app.schemas.tags import TagRef
from app.schemas.tasks import TaskCommentCreate, TaskCommentRead, TaskCreate, TaskRead, TaskUpdate from app.schemas.tasks import TaskCommentCreate, TaskCommentRead, TaskCreate, TaskRead, TaskUpdate
from app.services.activity_log import record_activity from app.services.activity_log import record_activity
from app.services.openclaw.coordination_service import GatewayCoordinationService from app.services.openclaw.coordination_service import GatewayCoordinationService
from app.services.openclaw.policies import OpenClawAuthorizationPolicy from app.services.openclaw.policies import OpenClawAuthorizationPolicy
from app.services.openclaw.provisioning_db import AgentLifecycleService from app.services.openclaw.provisioning_db import AgentLifecycleService
from app.services.tags import replace_tags, validate_tag_ids
from app.services.task_dependencies import ( from app.services.task_dependencies import (
blocked_by_dependency_ids, blocked_by_dependency_ids,
dependency_status_by_id, dependency_status_by_id,
validate_dependency_update, validate_dependency_update,
) )
from app.services.task_tags import replace_task_tags, validate_task_tag_ids
if TYPE_CHECKING: if TYPE_CHECKING:
from collections.abc import Sequence from collections.abc import Sequence
@@ -214,23 +214,23 @@ async def list_tasks(
) )
@router.get("/boards/{board_id}/tags", response_model=list[TaskTagRef]) @router.get("/boards/{board_id}/tags", response_model=list[TagRef])
async def list_task_tags( async def list_tags(
board: Board = BOARD_DEP, board: Board = BOARD_DEP,
session: AsyncSession = SESSION_DEP, session: AsyncSession = SESSION_DEP,
agent_ctx: AgentAuthContext = AGENT_CTX_DEP, agent_ctx: AgentAuthContext = AGENT_CTX_DEP,
) -> list[TaskTagRef]: ) -> list[TagRef]:
"""List task tags available to the board's organization.""" """List tags available to the board's organization."""
_guard_board_access(agent_ctx, board) _guard_board_access(agent_ctx, board)
tags = ( tags = (
await session.exec( await session.exec(
select(TaskTag) select(Tag)
.where(col(TaskTag.organization_id) == board.organization_id) .where(col(Tag.organization_id) == board.organization_id)
.order_by(func.lower(col(TaskTag.name)).asc(), col(TaskTag.created_at).asc()), .order_by(func.lower(col(Tag.name)).asc(), col(Tag.created_at).asc()),
) )
).all() ).all()
return [ return [
TaskTagRef( TagRef(
id=tag.id, id=tag.id,
name=tag.name, name=tag.name,
slug=tag.slug, slug=tag.slug,
@@ -265,7 +265,7 @@ async def create_task(
task_id=task.id, task_id=task.id,
depends_on_task_ids=depends_on_task_ids, depends_on_task_ids=depends_on_task_ids,
) )
normalized_tag_ids = await validate_task_tag_ids( normalized_tag_ids = await validate_tag_ids(
session, session,
organization_id=board.organization_id, organization_id=board.organization_id,
tag_ids=tag_ids, tag_ids=tag_ids,
@@ -310,7 +310,7 @@ async def create_task(
depends_on_task_id=dep_id, depends_on_task_id=dep_id,
), ),
) )
await replace_task_tags( await replace_tags(
session, session,
task_id=task.id, task_id=task.id,
tag_ids=normalized_tag_ids, tag_ids=normalized_tag_ids,

View File

@@ -1,4 +1,4 @@
"""Task-tag CRUD endpoints for organization-scoped task categorization.""" """Tag CRUD endpoints for organization-scoped task categorization."""
from __future__ import annotations from __future__ import annotations
@@ -14,13 +14,13 @@ from app.core.time import utcnow
from app.db import crud from app.db import crud
from app.db.pagination import paginate from app.db.pagination import paginate
from app.db.session import get_session from app.db.session import get_session
from app.models.task_tag_assignments import TaskTagAssignment from app.models.tag_assignments import TagAssignment
from app.models.task_tags import TaskTag from app.models.tags import Tag
from app.schemas.common import OkResponse from app.schemas.common import OkResponse
from app.schemas.pagination import DefaultLimitOffsetPage from app.schemas.pagination import DefaultLimitOffsetPage
from app.schemas.task_tags import TaskTagCreate, TaskTagRead, TaskTagUpdate from app.schemas.tags import TagCreate, TagRead, TagUpdate
from app.services.organizations import OrganizationContext from app.services.organizations import OrganizationContext
from app.services.task_tags import slugify_task_tag, task_counts_for_tags from app.services.tags import slugify_tag, task_counts_for_tags
if TYPE_CHECKING: if TYPE_CHECKING:
from collections.abc import Sequence from collections.abc import Sequence
@@ -36,16 +36,16 @@ ORG_ADMIN_DEP = Depends(require_org_admin)
def _normalize_slug(slug: str | None, *, fallback_name: str) -> str: def _normalize_slug(slug: str | None, *, fallback_name: str) -> str:
source = (slug or "").strip() or fallback_name source = (slug or "").strip() or fallback_name
return slugify_task_tag(source) return slugify_tag(source)
async def _require_org_task_tag( async def _require_org_tag(
session: AsyncSession, session: AsyncSession,
*, *,
tag_id: UUID, tag_id: UUID,
ctx: OrganizationContext, ctx: OrganizationContext,
) -> TaskTag: ) -> Tag:
tag = await TaskTag.objects.by_id(tag_id).first(session) tag = await Tag.objects.by_id(tag_id).first(session)
if tag is None: if tag is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
if tag.organization_id != ctx.organization.id: if tag.organization_id != ctx.organization.id:
@@ -60,7 +60,7 @@ async def _ensure_slug_available(
slug: str, slug: str,
exclude_tag_id: UUID | None = None, exclude_tag_id: UUID | None = None,
) -> None: ) -> None:
existing = await TaskTag.objects.filter_by(organization_id=organization_id, slug=slug).first( existing = await Tag.objects.filter_by(organization_id=organization_id, slug=slug).first(
session session
) )
if existing is None: if existing is None:
@@ -69,15 +69,15 @@ async def _ensure_slug_available(
return return
raise HTTPException( raise HTTPException(
status_code=status.HTTP_409_CONFLICT, status_code=status.HTTP_409_CONFLICT,
detail="Task tag slug already exists in this organization.", detail="Tag slug already exists in this organization.",
) )
async def _tag_read_page( async def _tag_read_page(
*, *,
session: AsyncSession, session: AsyncSession,
items: Sequence[TaskTag], items: Sequence[Tag],
) -> list[TaskTagRead]: ) -> list[TagRead]:
if not items: if not items:
return [] return []
counts = await task_counts_for_tags( counts = await task_counts_for_tags(
@@ -85,30 +85,30 @@ async def _tag_read_page(
tag_ids=[item.id for item in items], tag_ids=[item.id for item in items],
) )
return [ return [
TaskTagRead.model_validate(item, from_attributes=True).model_copy( TagRead.model_validate(item, from_attributes=True).model_copy(
update={"task_count": counts.get(item.id, 0)}, update={"task_count": counts.get(item.id, 0)},
) )
for item in items for item in items
] ]
@router.get("", response_model=DefaultLimitOffsetPage[TaskTagRead]) @router.get("", response_model=DefaultLimitOffsetPage[TagRead])
async def list_task_tags( async def list_tags(
session: AsyncSession = SESSION_DEP, session: AsyncSession = SESSION_DEP,
ctx: OrganizationContext = ORG_MEMBER_DEP, ctx: OrganizationContext = ORG_MEMBER_DEP,
) -> LimitOffsetPage[TaskTagRead]: ) -> LimitOffsetPage[TagRead]:
"""List task tags for the active organization.""" """List tags for the active organization."""
statement = ( statement = (
select(TaskTag) select(Tag)
.where(col(TaskTag.organization_id) == ctx.organization.id) .where(col(Tag.organization_id) == ctx.organization.id)
.order_by(func.lower(col(TaskTag.name)).asc(), col(TaskTag.created_at).asc()) .order_by(func.lower(col(Tag.name)).asc(), col(Tag.created_at).asc())
) )
async def _transform(items: Sequence[object]) -> Sequence[object]: async def _transform(items: Sequence[object]) -> Sequence[object]:
tags: list[TaskTag] = [] tags: list[Tag] = []
for item in items: for item in items:
if not isinstance(item, TaskTag): if not isinstance(item, Tag):
msg = "Expected TaskTag items from paginated query" msg = "Expected Tag items from paginated query"
raise TypeError(msg) raise TypeError(msg)
tags.append(item) tags.append(item)
return await _tag_read_page(session=session, items=tags) return await _tag_read_page(session=session, items=tags)
@@ -116,13 +116,13 @@ async def list_task_tags(
return await paginate(session, statement, transformer=_transform) return await paginate(session, statement, transformer=_transform)
@router.post("", response_model=TaskTagRead) @router.post("", response_model=TagRead)
async def create_task_tag( async def create_tag(
payload: TaskTagCreate, payload: TagCreate,
session: AsyncSession = SESSION_DEP, session: AsyncSession = SESSION_DEP,
ctx: OrganizationContext = ORG_ADMIN_DEP, ctx: OrganizationContext = ORG_ADMIN_DEP,
) -> TaskTagRead: ) -> TagRead:
"""Create a task tag within the active organization.""" """Create a tag within the active organization."""
slug = _normalize_slug(payload.slug, fallback_name=payload.name) slug = _normalize_slug(payload.slug, fallback_name=payload.name)
await _ensure_slug_available( await _ensure_slug_available(
session, session,
@@ -131,49 +131,49 @@ async def create_task_tag(
) )
tag = await crud.create( tag = await crud.create(
session, session,
TaskTag, Tag,
organization_id=ctx.organization.id, organization_id=ctx.organization.id,
name=payload.name, name=payload.name,
slug=slug, slug=slug,
color=payload.color, color=payload.color,
description=payload.description, description=payload.description,
) )
return TaskTagRead.model_validate(tag, from_attributes=True) return TagRead.model_validate(tag, from_attributes=True)
@router.get("/{tag_id}", response_model=TaskTagRead) @router.get("/{tag_id}", response_model=TagRead)
async def get_task_tag( async def get_tag(
tag_id: UUID, tag_id: UUID,
session: AsyncSession = SESSION_DEP, session: AsyncSession = SESSION_DEP,
ctx: OrganizationContext = ORG_MEMBER_DEP, ctx: OrganizationContext = ORG_MEMBER_DEP,
) -> TaskTagRead: ) -> TagRead:
"""Get a single task tag in the active organization.""" """Get a single tag in the active organization."""
tag = await _require_org_task_tag( tag = await _require_org_tag(
session, session,
tag_id=tag_id, tag_id=tag_id,
ctx=ctx, ctx=ctx,
) )
count = ( count = (
await session.exec( await session.exec(
select(func.count(col(TaskTagAssignment.task_id))).where( select(func.count(col(TagAssignment.task_id))).where(
col(TaskTagAssignment.tag_id) == tag.id, col(TagAssignment.tag_id) == tag.id,
), ),
) )
).one() ).one()
return TaskTagRead.model_validate(tag, from_attributes=True).model_copy( return TagRead.model_validate(tag, from_attributes=True).model_copy(
update={"task_count": int(count or 0)}, update={"task_count": int(count or 0)},
) )
@router.patch("/{tag_id}", response_model=TaskTagRead) @router.patch("/{tag_id}", response_model=TagRead)
async def update_task_tag( async def update_tag(
tag_id: UUID, tag_id: UUID,
payload: TaskTagUpdate, payload: TagUpdate,
session: AsyncSession = SESSION_DEP, session: AsyncSession = SESSION_DEP,
ctx: OrganizationContext = ORG_ADMIN_DEP, ctx: OrganizationContext = ORG_ADMIN_DEP,
) -> TaskTagRead: ) -> TagRead:
"""Update a task tag in the active organization.""" """Update a tag in the active organization."""
tag = await _require_org_task_tag( tag = await _require_org_tag(
session, session,
tag_id=tag_id, tag_id=tag_id,
ctx=ctx, ctx=ctx,
@@ -194,25 +194,25 @@ async def update_task_tag(
) )
updates["updated_at"] = utcnow() updates["updated_at"] = utcnow()
updated = await crud.patch(session, tag, updates) updated = await crud.patch(session, tag, updates)
return TaskTagRead.model_validate(updated, from_attributes=True) return TagRead.model_validate(updated, from_attributes=True)
@router.delete("/{tag_id}", response_model=OkResponse) @router.delete("/{tag_id}", response_model=OkResponse)
async def delete_task_tag( async def delete_tag(
tag_id: UUID, tag_id: UUID,
session: AsyncSession = SESSION_DEP, session: AsyncSession = SESSION_DEP,
ctx: OrganizationContext = ORG_ADMIN_DEP, ctx: OrganizationContext = ORG_ADMIN_DEP,
) -> OkResponse: ) -> OkResponse:
"""Delete a task tag and remove all associated task-tag links.""" """Delete a tag and remove all associated tag links."""
tag = await _require_org_task_tag( tag = await _require_org_tag(
session, session,
tag_id=tag_id, tag_id=tag_id,
ctx=ctx, ctx=ctx,
) )
await crud.delete_where( await crud.delete_where(
session, session,
TaskTagAssignment, TagAssignment,
col(TaskTagAssignment.tag_id) == tag.id, col(TagAssignment.tag_id) == tag.id,
commit=False, commit=False,
) )
await session.delete(tag) await session.delete(tag)

View File

@@ -32,9 +32,9 @@ from app.models.agents import Agent
from app.models.approval_task_links import ApprovalTaskLink from app.models.approval_task_links import ApprovalTaskLink
from app.models.approvals import Approval from app.models.approvals import Approval
from app.models.boards import Board from app.models.boards import Board
from app.models.tag_assignments import TagAssignment
from app.models.task_dependencies import TaskDependency from app.models.task_dependencies import TaskDependency
from app.models.task_fingerprints import TaskFingerprint from app.models.task_fingerprints import TaskFingerprint
from app.models.task_tag_assignments import TaskTagAssignment
from app.models.tasks import Task from app.models.tasks import Task
from app.schemas.activity_events import ActivityEventRead from app.schemas.activity_events import ActivityEventRead
from app.schemas.common import OkResponse from app.schemas.common import OkResponse
@@ -48,6 +48,12 @@ from app.services.openclaw.gateway_dispatch import GatewayDispatchService
from app.services.openclaw.gateway_rpc import GatewayConfig as GatewayClientConfig from app.services.openclaw.gateway_rpc import GatewayConfig as GatewayClientConfig
from app.services.openclaw.gateway_rpc import OpenClawGatewayError from app.services.openclaw.gateway_rpc import OpenClawGatewayError
from app.services.organizations import require_board_access from app.services.organizations import require_board_access
from app.services.tags import (
TagState,
load_tag_state,
replace_tags,
validate_tag_ids,
)
from app.services.task_dependencies import ( from app.services.task_dependencies import (
blocked_by_dependency_ids, blocked_by_dependency_ids,
dependency_ids_by_task_id, dependency_ids_by_task_id,
@@ -56,12 +62,6 @@ from app.services.task_dependencies import (
replace_task_dependencies, replace_task_dependencies,
validate_dependency_update, validate_dependency_update,
) )
from app.services.task_tags import (
TaskTagState,
load_task_tag_state,
replace_task_tags,
validate_task_tag_ids,
)
if TYPE_CHECKING: if TYPE_CHECKING:
from collections.abc import AsyncIterator, Sequence from collections.abc import AsyncIterator, Sequence
@@ -583,7 +583,7 @@ async def _task_read_page(
return [] return []
task_ids = [task.id for task in tasks] task_ids = [task.id for task in tasks]
tag_state_by_task_id = await load_task_tag_state( tag_state_by_task_id = await load_tag_state(
session, session,
task_ids=task_ids, task_ids=task_ids,
) )
@@ -603,7 +603,7 @@ async def _task_read_page(
output: list[TaskRead] = [] output: list[TaskRead] = []
for task in tasks: for task in tasks:
tag_state = tag_state_by_task_id.get(task.id, TaskTagState()) tag_state = tag_state_by_task_id.get(task.id, TagState())
dep_list = deps_map.get(task.id, []) dep_list = deps_map.get(task.id, [])
blocked_by = blocked_by_dependency_ids( blocked_by = blocked_by_dependency_ids(
dependency_ids=dep_list, dependency_ids=dep_list,
@@ -630,14 +630,14 @@ async def _stream_task_state(
*, *,
board_id: UUID, board_id: UUID,
rows: list[tuple[ActivityEvent, Task | None]], rows: list[tuple[ActivityEvent, Task | None]],
) -> tuple[dict[UUID, list[UUID]], dict[UUID, str], dict[UUID, TaskTagState]]: ) -> tuple[dict[UUID, list[UUID]], dict[UUID, str], dict[UUID, TagState]]:
task_ids = [ task_ids = [
task.id for event, task in rows if task is not None and event.event_type != "task.comment" task.id for event, task in rows if task is not None and event.event_type != "task.comment"
] ]
if not task_ids: if not task_ids:
return {}, {}, {} return {}, {}, {}
tag_state_by_task_id = await load_task_tag_state( tag_state_by_task_id = await load_tag_state(
session, session,
task_ids=list({*task_ids}), task_ids=list({*task_ids}),
) )
@@ -666,7 +666,7 @@ def _task_event_payload(
*, *,
deps_map: dict[UUID, list[UUID]], deps_map: dict[UUID, list[UUID]],
dep_status: dict[UUID, str], dep_status: dict[UUID, str],
tag_state_by_task_id: dict[UUID, TaskTagState], tag_state_by_task_id: dict[UUID, TagState],
) -> dict[str, object]: ) -> dict[str, object]:
payload: dict[str, object] = { payload: dict[str, object] = {
"type": event.event_type, "type": event.event_type,
@@ -679,7 +679,7 @@ def _task_event_payload(
payload["task"] = None payload["task"] = None
return payload return payload
tag_state = tag_state_by_task_id.get(task.id, TaskTagState()) tag_state = tag_state_by_task_id.get(task.id, TagState())
dep_list = deps_map.get(task.id, []) dep_list = deps_map.get(task.id, [])
blocked_by = blocked_by_dependency_ids( blocked_by = blocked_by_dependency_ids(
dependency_ids=dep_list, dependency_ids=dep_list,
@@ -816,7 +816,7 @@ async def create_task(
task_id=task.id, task_id=task.id,
depends_on_task_ids=depends_on_task_ids, depends_on_task_ids=depends_on_task_ids,
) )
normalized_tag_ids = await validate_task_tag_ids( normalized_tag_ids = await validate_tag_ids(
session, session,
organization_id=board.organization_id, organization_id=board.organization_id,
tag_ids=tag_ids, tag_ids=tag_ids,
@@ -843,7 +843,7 @@ async def create_task(
depends_on_task_id=dep_id, depends_on_task_id=dep_id,
), ),
) )
await replace_task_tags( await replace_tags(
session, session,
task_id=task.id, task_id=task.id,
tag_ids=normalized_tag_ids, tag_ids=normalized_tag_ids,
@@ -994,8 +994,8 @@ async def delete_task(
) )
await crud.delete_where( await crud.delete_where(
session, session,
TaskTagAssignment, TagAssignment,
col(TaskTagAssignment.task_id) == task.id, col(TagAssignment.task_id) == task.id,
commit=False, commit=False,
) )
await session.delete(task) await session.delete(task)
@@ -1231,9 +1231,9 @@ async def _task_read_response(
board_id: UUID, board_id: UUID,
) -> TaskRead: ) -> TaskRead:
dep_ids = await _task_dep_ids(session, board_id=board_id, task_id=task.id) dep_ids = await _task_dep_ids(session, board_id=board_id, task_id=task.id)
tag_state = (await load_task_tag_state(session, task_ids=[task.id])).get( tag_state = (await load_tag_state(session, task_ids=[task.id])).get(
task.id, task.id,
TaskTagState(), TagState(),
) )
blocked_ids = await _task_blocked_ids( blocked_ids = await _task_blocked_ids(
session, session,
@@ -1337,7 +1337,7 @@ async def _normalized_update_tag_ids(
session, session,
board_id=update.board_id, board_id=update.board_id,
) )
return await validate_task_tag_ids( return await validate_tag_ids(
session, session,
organization_id=organization_id, organization_id=organization_id,
tag_ids=update.tag_ids, tag_ids=update.tag_ids,
@@ -1449,7 +1449,7 @@ async def _apply_lead_task_update(
_lead_apply_status(update) _lead_apply_status(update)
if normalized_tag_ids is not None: if normalized_tag_ids is not None:
await replace_task_tags( await replace_tags(
session, session,
task_id=update.task.id, task_id=update.task.id,
tag_ids=normalized_tag_ids, tag_ids=normalized_tag_ids,
@@ -1723,7 +1723,7 @@ async def _finalize_updated_task(
update=update, update=update,
) )
) )
await replace_task_tags( await replace_tags(
session, session,
task_id=update.task.id, task_id=update.task.id,
tag_ids=normalized or [], tag_ids=normalized or [],

View File

@@ -24,7 +24,7 @@ from app.api.gateways import router as gateways_router
from app.api.metrics import router as metrics_router from app.api.metrics import router as metrics_router
from app.api.organizations import router as organizations_router from app.api.organizations import router as organizations_router
from app.api.souls_directory import router as souls_directory_router from app.api.souls_directory import router as souls_directory_router
from app.api.task_tags import router as task_tags_router from app.api.tags import router as tags_router
from app.api.tasks import router as tasks_router from app.api.tasks import router as tasks_router
from app.api.users import router as users_router from app.api.users import router as users_router
from app.core.config import settings from app.core.config import settings
@@ -108,7 +108,7 @@ api_v1.include_router(board_memory_router)
api_v1.include_router(board_onboarding_router) api_v1.include_router(board_onboarding_router)
api_v1.include_router(approvals_router) api_v1.include_router(approvals_router)
api_v1.include_router(tasks_router) api_v1.include_router(tasks_router)
api_v1.include_router(task_tags_router) api_v1.include_router(tags_router)
api_v1.include_router(users_router) api_v1.include_router(users_router)
app.include_router(api_v1) app.include_router(api_v1)

View File

@@ -15,10 +15,10 @@ from app.models.organization_invite_board_access import OrganizationInviteBoardA
from app.models.organization_invites import OrganizationInvite from app.models.organization_invites import OrganizationInvite
from app.models.organization_members import OrganizationMember from app.models.organization_members import OrganizationMember
from app.models.organizations import Organization from app.models.organizations import Organization
from app.models.tag_assignments import TagAssignment
from app.models.tags import Tag
from app.models.task_dependencies import TaskDependency from app.models.task_dependencies import TaskDependency
from app.models.task_fingerprints import TaskFingerprint from app.models.task_fingerprints import TaskFingerprint
from app.models.task_tag_assignments import TaskTagAssignment
from app.models.task_tags import TaskTag
from app.models.tasks import Task from app.models.tasks import Task
from app.models.users import User from app.models.users import User
@@ -41,7 +41,7 @@ __all__ = [
"TaskDependency", "TaskDependency",
"Task", "Task",
"TaskFingerprint", "TaskFingerprint",
"TaskTag", "Tag",
"TaskTagAssignment", "TagAssignment",
"User", "User",
] ]

View File

@@ -14,19 +14,19 @@ from app.models.base import QueryModel
RUNTIME_ANNOTATION_TYPES = (datetime,) RUNTIME_ANNOTATION_TYPES = (datetime,)
class TaskTagAssignment(QueryModel, table=True): class TagAssignment(QueryModel, table=True):
"""Association row mapping one task to one tag.""" """Association row mapping one task to one tag."""
__tablename__ = "task_tag_assignments" # pyright: ignore[reportAssignmentType] __tablename__ = "tag_assignments" # pyright: ignore[reportAssignmentType]
__table_args__ = ( __table_args__ = (
UniqueConstraint( UniqueConstraint(
"task_id", "task_id",
"tag_id", "tag_id",
name="uq_task_tag_assignments_task_id_tag_id", name="uq_tag_assignments_task_id_tag_id",
), ),
) )
id: UUID = Field(default_factory=uuid4, primary_key=True) id: UUID = Field(default_factory=uuid4, primary_key=True)
task_id: UUID = Field(foreign_key="tasks.id", index=True) task_id: UUID = Field(foreign_key="tasks.id", index=True)
tag_id: UUID = Field(foreign_key="task_tags.id", index=True) tag_id: UUID = Field(foreign_key="tags.id", index=True)
created_at: datetime = Field(default_factory=utcnow) created_at: datetime = Field(default_factory=utcnow)

View File

@@ -1,4 +1,4 @@
"""Task tag model for organization-scoped task categorization.""" """Tag model for organization-scoped task categorization."""
from __future__ import annotations from __future__ import annotations
@@ -14,15 +14,15 @@ from app.models.tenancy import TenantScoped
RUNTIME_ANNOTATION_TYPES = (datetime,) RUNTIME_ANNOTATION_TYPES = (datetime,)
class TaskTag(TenantScoped, table=True): class Tag(TenantScoped, table=True):
"""Organization-scoped task tag used to classify and group tasks.""" """Organization-scoped tag used to classify and group tasks."""
__tablename__ = "task_tags" # pyright: ignore[reportAssignmentType] __tablename__ = "tags" # pyright: ignore[reportAssignmentType]
__table_args__ = ( __table_args__ = (
UniqueConstraint( UniqueConstraint(
"organization_id", "organization_id",
"slug", "slug",
name="uq_task_tags_organization_id_slug", name="uq_tags_organization_id_slug",
), ),
) )

View File

@@ -31,7 +31,7 @@ from app.schemas.souls_directory import (
SoulsDirectorySearchResponse, SoulsDirectorySearchResponse,
SoulsDirectorySoulRef, SoulsDirectorySoulRef,
) )
from app.schemas.task_tags import TaskTagCreate, TaskTagRead, TaskTagRef, TaskTagUpdate from app.schemas.tags import TagCreate, TagRead, TagRef, TagUpdate
from app.schemas.tasks import TaskCreate, TaskRead, TaskUpdate from app.schemas.tasks import TaskCreate, TaskRead, TaskUpdate
from app.schemas.users import UserCreate, UserRead, UserUpdate from app.schemas.users import UserCreate, UserRead, UserUpdate
@@ -71,10 +71,10 @@ __all__ = [
"SoulsDirectoryMarkdownResponse", "SoulsDirectoryMarkdownResponse",
"SoulsDirectorySearchResponse", "SoulsDirectorySearchResponse",
"SoulsDirectorySoulRef", "SoulsDirectorySoulRef",
"TaskTagCreate", "TagCreate",
"TaskTagRead", "TagRead",
"TaskTagRef", "TagRef",
"TaskTagUpdate", "TagUpdate",
"TaskCreate", "TaskCreate",
"TaskRead", "TaskRead",
"TaskUpdate", "TaskUpdate",

View File

@@ -1,4 +1,4 @@
"""Schemas for task-tag CRUD payloads.""" """Schemas for tag CRUD payloads."""
from __future__ import annotations from __future__ import annotations
@@ -27,8 +27,8 @@ def _normalize_color(value: str | None) -> str | None:
return cleaned return cleaned
class TaskTagBase(SQLModel): class TagBase(SQLModel):
"""Shared task-tag fields for create/read payloads.""" """Shared tag fields for create/read payloads."""
name: str name: str
slug: str slug: str
@@ -36,8 +36,8 @@ class TaskTagBase(SQLModel):
description: str | None = None description: str | None = None
class TaskTagRef(SQLModel): class TagRef(SQLModel):
"""Compact task-tag representation embedded in task payloads.""" """Compact tag representation embedded in task payloads."""
id: UUID id: UUID
name: str name: str
@@ -45,8 +45,8 @@ class TaskTagRef(SQLModel):
color: str color: str
class TaskTagCreate(SQLModel): class TagCreate(SQLModel):
"""Payload for creating a task tag.""" """Payload for creating a tag."""
name: NonEmptyStr name: NonEmptyStr
slug: str | None = None slug: str | None = None
@@ -76,8 +76,8 @@ class TaskTagCreate(SQLModel):
return value return value
class TaskTagUpdate(SQLModel): class TagUpdate(SQLModel):
"""Payload for partial task-tag updates.""" """Payload for partial tag updates."""
name: NonEmptyStr | None = None name: NonEmptyStr | None = None
slug: str | None = None slug: str | None = None
@@ -116,8 +116,8 @@ class TaskTagUpdate(SQLModel):
return self return self
class TaskTagRead(TaskTagBase): class TagRead(TagBase):
"""Task-tag payload returned from API endpoints.""" """Tag payload returned from API endpoints."""
id: UUID id: UUID
organization_id: UUID organization_id: UUID

View File

@@ -10,13 +10,13 @@ from pydantic import field_validator, model_validator
from sqlmodel import Field, SQLModel from sqlmodel import Field, SQLModel
from app.schemas.common import NonEmptyStr from app.schemas.common import NonEmptyStr
from app.schemas.task_tags import TaskTagRef from app.schemas.tags import TagRef
TaskStatus = Literal["inbox", "in_progress", "review", "done"] TaskStatus = Literal["inbox", "in_progress", "review", "done"]
STATUS_REQUIRED_ERROR = "status is required" STATUS_REQUIRED_ERROR = "status is required"
# Keep these symbols as runtime globals so Pydantic can resolve # Keep these symbols as runtime globals so Pydantic can resolve
# deferred annotations reliably. # deferred annotations reliably.
RUNTIME_ANNOTATION_TYPES = (datetime, UUID, NonEmptyStr, TaskTagRef) RUNTIME_ANNOTATION_TYPES = (datetime, UUID, NonEmptyStr, TagRef)
class TaskBase(SQLModel): class TaskBase(SQLModel):
@@ -80,7 +80,7 @@ class TaskRead(TaskBase):
updated_at: datetime updated_at: datetime
blocked_by_task_ids: list[UUID] = Field(default_factory=list) blocked_by_task_ids: list[UUID] = Field(default_factory=list)
is_blocked: bool = False is_blocked: bool = False
tags: list[TaskTagRef] = Field(default_factory=list) tags: list[TagRef] = Field(default_factory=list)
class TaskCommentCreate(SQLModel): class TaskCommentCreate(SQLModel):

View File

@@ -12,7 +12,7 @@ from app.schemas.approvals import ApprovalRead
from app.schemas.board_groups import BoardGroupRead from app.schemas.board_groups import BoardGroupRead
from app.schemas.board_memory import BoardMemoryRead from app.schemas.board_memory import BoardMemoryRead
from app.schemas.boards import BoardRead from app.schemas.boards import BoardRead
from app.schemas.task_tags import TaskTagRef from app.schemas.tags import TagRef
from app.schemas.tasks import TaskRead from app.schemas.tasks import TaskRead
RUNTIME_ANNOTATION_TYPES = ( RUNTIME_ANNOTATION_TYPES = (
@@ -23,7 +23,7 @@ RUNTIME_ANNOTATION_TYPES = (
BoardGroupRead, BoardGroupRead,
BoardMemoryRead, BoardMemoryRead,
BoardRead, BoardRead,
TaskTagRef, TagRef,
) )
@@ -59,7 +59,7 @@ class BoardGroupTaskSummary(SQLModel):
assignee: str | None = None assignee: str | None = None
due_at: datetime | None = None due_at: datetime | None = None
in_progress_at: datetime | None = None in_progress_at: datetime | None = None
tags: list[TaskTagRef] = Field(default_factory=list) tags: list[TagRef] = Field(default_factory=list)
created_at: datetime created_at: datetime
updated_at: datetime updated_at: datetime

View File

@@ -21,7 +21,7 @@ from app.schemas.view_models import (
BoardGroupSnapshot, BoardGroupSnapshot,
BoardGroupTaskSummary, BoardGroupTaskSummary,
) )
from app.services.task_tags import TaskTagState, load_task_tag_state from app.services.tags import TagState, load_tag_state
if TYPE_CHECKING: if TYPE_CHECKING:
from sqlalchemy.sql.elements import ColumnElement from sqlalchemy.sql.elements import ColumnElement
@@ -123,7 +123,7 @@ def _task_summaries_by_board(
boards_by_id: dict[UUID, Board], boards_by_id: dict[UUID, Board],
tasks: list[Task], tasks: list[Task],
agent_name_by_id: dict[UUID, str], agent_name_by_id: dict[UUID, str],
tag_state_by_task_id: dict[UUID, TaskTagState], tag_state_by_task_id: dict[UUID, TagState],
per_board_task_limit: int, per_board_task_limit: int,
) -> dict[UUID, list[BoardGroupTaskSummary]]: ) -> dict[UUID, list[BoardGroupTaskSummary]]:
"""Build limited per-board task summary lists.""" """Build limited per-board task summary lists."""
@@ -156,7 +156,7 @@ def _task_summaries_by_board(
), ),
due_at=task.due_at, due_at=task.due_at,
in_progress_at=task.in_progress_at, in_progress_at=task.in_progress_at,
tags=tag_state_by_task_id.get(task.id, TaskTagState()).tags, tags=tag_state_by_task_id.get(task.id, TagState()).tags,
created_at=task.created_at, created_at=task.created_at,
updated_at=task.updated_at, updated_at=task.updated_at,
), ),
@@ -191,7 +191,7 @@ async def build_group_snapshot(
include_done=include_done, include_done=include_done,
) )
agent_name_by_id = await _agent_names(session, tasks) agent_name_by_id = await _agent_names(session, tasks)
tag_state_by_task_id = await load_task_tag_state( tag_state_by_task_id = await load_tag_state(
session, session,
task_ids=[task.id for task in tasks], task_ids=[task.id for task in tasks],
) )

View File

@@ -17,12 +17,12 @@ from app.schemas.boards import BoardRead
from app.schemas.view_models import BoardSnapshot, TaskCardRead from app.schemas.view_models import BoardSnapshot, TaskCardRead
from app.services.approval_task_links import load_task_ids_by_approval, task_counts_for_board from app.services.approval_task_links import load_task_ids_by_approval, task_counts_for_board
from app.services.openclaw.provisioning_db import AgentLifecycleService from app.services.openclaw.provisioning_db import AgentLifecycleService
from app.services.tags import TagState, load_tag_state
from app.services.task_dependencies import ( from app.services.task_dependencies import (
blocked_by_dependency_ids, blocked_by_dependency_ids,
dependency_ids_by_task_id, dependency_ids_by_task_id,
dependency_status_by_id, dependency_status_by_id,
) )
from app.services.task_tags import TaskTagState, load_task_tag_state
if TYPE_CHECKING: if TYPE_CHECKING:
from uuid import UUID from uuid import UUID
@@ -49,13 +49,13 @@ def _task_to_card(
counts_by_task_id: dict[UUID, tuple[int, int]], counts_by_task_id: dict[UUID, tuple[int, int]],
deps_by_task_id: dict[UUID, list[UUID]], deps_by_task_id: dict[UUID, list[UUID]],
dependency_status_by_id_map: dict[UUID, str], dependency_status_by_id_map: dict[UUID, str],
tag_state_by_task_id: dict[UUID, TaskTagState], tag_state_by_task_id: dict[UUID, TagState],
) -> TaskCardRead: ) -> TaskCardRead:
card = TaskCardRead.model_validate(task, from_attributes=True) card = TaskCardRead.model_validate(task, from_attributes=True)
approvals_count, approvals_pending_count = counts_by_task_id.get(task.id, (0, 0)) approvals_count, approvals_pending_count = counts_by_task_id.get(task.id, (0, 0))
assignee = agent_name_by_id.get(task.assigned_agent_id) if task.assigned_agent_id else None assignee = agent_name_by_id.get(task.assigned_agent_id) if task.assigned_agent_id else None
depends_on_task_ids = deps_by_task_id.get(task.id, []) depends_on_task_ids = deps_by_task_id.get(task.id, [])
tag_state = tag_state_by_task_id.get(task.id, TaskTagState()) tag_state = tag_state_by_task_id.get(task.id, TagState())
blocked_by_task_ids = blocked_by_dependency_ids( blocked_by_task_ids = blocked_by_dependency_ids(
dependency_ids=depends_on_task_ids, dependency_ids=depends_on_task_ids,
status_by_id=dependency_status_by_id_map, status_by_id=dependency_status_by_id_map,
@@ -86,7 +86,7 @@ async def build_board_snapshot(session: AsyncSession, board: Board) -> BoardSnap
.all(session), .all(session),
) )
task_ids = [task.id for task in tasks] task_ids = [task.id for task in tasks]
tag_state_by_task_id = await load_task_tag_state( tag_state_by_task_id = await load_tag_state(
session, session,
task_ids=task_ids, task_ids=task_ids,
) )

View File

@@ -1,4 +1,4 @@
"""Helpers for validating and loading task tags and task-tag mappings.""" """Helpers for validating and loading tags and tag mappings."""
from __future__ import annotations from __future__ import annotations
@@ -13,9 +13,9 @@ from fastapi import HTTPException, status
from sqlalchemy import delete, func from sqlalchemy import delete, func
from sqlmodel import col, select from sqlmodel import col, select
from app.models.task_tag_assignments import TaskTagAssignment from app.models.tag_assignments import TagAssignment
from app.models.task_tags import TaskTag from app.models.tags import Tag
from app.schemas.task_tags import TaskTagRef from app.schemas.tags import TagRef
if TYPE_CHECKING: if TYPE_CHECKING:
from sqlmodel.ext.asyncio.session import AsyncSession from sqlmodel.ext.asyncio.session import AsyncSession
@@ -23,7 +23,7 @@ if TYPE_CHECKING:
SLUG_RE = re.compile(r"[^a-z0-9]+") SLUG_RE = re.compile(r"[^a-z0-9]+")
def slugify_task_tag(value: str) -> str: def slugify_tag(value: str) -> str:
"""Build a slug from arbitrary text using lowercase alphanumeric groups.""" """Build a slug from arbitrary text using lowercase alphanumeric groups."""
slug = SLUG_RE.sub("-", value.lower()).strip("-") slug = SLUG_RE.sub("-", value.lower()).strip("-")
return slug or "tag" return slug or "tag"
@@ -40,22 +40,22 @@ def _dedupe_uuid_list(values: Sequence[UUID]) -> list[UUID]:
return deduped return deduped
async def validate_task_tag_ids( async def validate_tag_ids(
session: AsyncSession, session: AsyncSession,
*, *,
organization_id: UUID, organization_id: UUID,
tag_ids: Sequence[UUID], tag_ids: Sequence[UUID],
) -> list[UUID]: ) -> list[UUID]:
"""Validate task-tag IDs within an organization and return deduped IDs.""" """Validate tag IDs within an organization and return deduped IDs."""
normalized = _dedupe_uuid_list(tag_ids) normalized = _dedupe_uuid_list(tag_ids)
if not normalized: if not normalized:
return [] return []
existing_ids = set( existing_ids = set(
await session.exec( await session.exec(
select(TaskTag.id) select(Tag.id)
.where(col(TaskTag.organization_id) == organization_id) .where(col(Tag.organization_id) == organization_id)
.where(col(TaskTag.id).in_(normalized)), .where(col(Tag.id).in_(normalized)),
), ),
) )
missing = [tag_id for tag_id in normalized if tag_id not in existing_ids] missing = [tag_id for tag_id in normalized if tag_id not in existing_ids]
@@ -63,7 +63,7 @@ async def validate_task_tag_ids(
raise HTTPException( raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, status_code=status.HTTP_404_NOT_FOUND,
detail={ detail={
"message": "One or more task tags do not exist in this organization.", "message": "One or more tags do not exist in this organization.",
"missing_tag_ids": [str(tag_id) for tag_id in missing], "missing_tag_ids": [str(tag_id) for tag_id in missing],
}, },
) )
@@ -71,18 +71,18 @@ async def validate_task_tag_ids(
@dataclass(slots=True) @dataclass(slots=True)
class TaskTagState: class TagState:
"""Ordered task-tag state for a task payload.""" """Ordered tag state for a task payload."""
tag_ids: list[UUID] = field(default_factory=list) tag_ids: list[UUID] = field(default_factory=list)
tags: list[TaskTagRef] = field(default_factory=list) tags: list[TagRef] = field(default_factory=list)
async def load_task_tag_state( async def load_tag_state(
session: AsyncSession, session: AsyncSession,
*, *,
task_ids: Sequence[UUID], task_ids: Sequence[UUID],
) -> dict[UUID, TaskTagState]: ) -> dict[UUID, TagState]:
"""Return ordered tag IDs and refs for each task id.""" """Return ordered tag IDs and refs for each task id."""
normalized_task_ids = _dedupe_uuid_list(task_ids) normalized_task_ids = _dedupe_uuid_list(task_ids)
if not normalized_task_ids: if not normalized_task_ids:
@@ -91,25 +91,25 @@ async def load_task_tag_state(
rows = list( rows = list(
await session.exec( await session.exec(
select( select(
col(TaskTagAssignment.task_id), col(TagAssignment.task_id),
TaskTag, Tag,
) )
.join(TaskTag, col(TaskTag.id) == col(TaskTagAssignment.tag_id)) .join(Tag, col(Tag.id) == col(TagAssignment.tag_id))
.where(col(TaskTagAssignment.task_id).in_(normalized_task_ids)) .where(col(TagAssignment.task_id).in_(normalized_task_ids))
.order_by( .order_by(
col(TaskTagAssignment.task_id).asc(), col(TagAssignment.task_id).asc(),
col(TaskTagAssignment.created_at).asc(), col(TagAssignment.created_at).asc(),
), ),
), ),
) )
state_by_task_id: dict[UUID, TaskTagState] = defaultdict(TaskTagState) state_by_task_id: dict[UUID, TagState] = defaultdict(TagState)
for task_id, tag in rows: for task_id, tag in rows:
if task_id is None: if task_id is None:
continue continue
state = state_by_task_id[task_id] state = state_by_task_id[task_id]
state.tag_ids.append(tag.id) state.tag_ids.append(tag.id)
state.tags.append( state.tags.append(
TaskTagRef( TagRef(
id=tag.id, id=tag.id,
name=tag.name, name=tag.name,
slug=tag.slug, slug=tag.slug,
@@ -119,7 +119,7 @@ async def load_task_tag_state(
return dict(state_by_task_id) return dict(state_by_task_id)
async def replace_task_tags( async def replace_tags(
session: AsyncSession, session: AsyncSession,
*, *,
task_id: UUID, task_id: UUID,
@@ -128,12 +128,12 @@ async def replace_task_tags(
"""Replace all tag-assignment rows for a task.""" """Replace all tag-assignment rows for a task."""
normalized = _dedupe_uuid_list(tag_ids) normalized = _dedupe_uuid_list(tag_ids)
await session.exec( await session.exec(
delete(TaskTagAssignment).where( delete(TagAssignment).where(
col(TaskTagAssignment.task_id) == task_id, col(TagAssignment.task_id) == task_id,
), ),
) )
for tag_id in normalized: for tag_id in normalized:
session.add(TaskTagAssignment(task_id=task_id, tag_id=tag_id)) session.add(TagAssignment(task_id=task_id, tag_id=tag_id))
async def task_counts_for_tags( async def task_counts_for_tags(
@@ -148,11 +148,11 @@ async def task_counts_for_tags(
rows = list( rows = list(
await session.exec( await session.exec(
select( select(
col(TaskTagAssignment.tag_id), col(TagAssignment.tag_id),
func.count(col(TaskTagAssignment.task_id)), func.count(col(TagAssignment.task_id)),
) )
.where(col(TaskTagAssignment.tag_id).in_(normalized)) .where(col(TagAssignment.tag_id).in_(normalized))
.group_by(col(TaskTagAssignment.tag_id)), .group_by(col(TagAssignment.tag_id)),
), ),
) )
return {tag_id: int(count or 0) for tag_id, count in rows} return {tag_id: int(count or 0) for tag_id, count in rows}

View File

@@ -1,4 +1,4 @@
"""add task tags and task-tag assignments """add tags and tag assignments
Revision ID: d8c1e5a4f7b2 Revision ID: d8c1e5a4f7b2
Revises: 99cd6df95f85, b4338be78eec Revises: 99cd6df95f85, b4338be78eec
@@ -38,28 +38,28 @@ def upgrade() -> None:
sa.UniqueConstraint( sa.UniqueConstraint(
"organization_id", "organization_id",
"slug", "slug",
name="uq_task_tags_organization_id_slug", name="uq_tags_organization_id_slug",
), ),
) )
task_tag_indexes = {item.get("name") for item in inspector.get_indexes("tags")} tag_indexes = {item.get("name") for item in inspector.get_indexes("tags")}
if op.f("ix_task_tags_organization_id") not in task_tag_indexes: if op.f("ix_tags_organization_id") not in tag_indexes:
op.create_index( op.create_index(
op.f("ix_task_tags_organization_id"), op.f("ix_tags_organization_id"),
"tags", "tags",
["organization_id"], ["organization_id"],
unique=False, unique=False,
) )
if op.f("ix_task_tags_slug") not in task_tag_indexes: if op.f("ix_tags_slug") not in tag_indexes:
op.create_index( op.create_index(
op.f("ix_task_tags_slug"), op.f("ix_tags_slug"),
"tags", "tags",
["slug"], ["slug"],
unique=False, unique=False,
) )
if not inspector.has_table("task_tag_assignments"): if not inspector.has_table("tag_assignments"):
op.create_table( op.create_table(
"task_tag_assignments", "tag_assignments",
sa.Column("id", sa.Uuid(), nullable=False), sa.Column("id", sa.Uuid(), nullable=False),
sa.Column("task_id", sa.Uuid(), nullable=False), sa.Column("task_id", sa.Uuid(), nullable=False),
sa.Column("tag_id", sa.Uuid(), nullable=False), sa.Column("tag_id", sa.Uuid(), nullable=False),
@@ -70,32 +70,32 @@ def upgrade() -> None:
sa.UniqueConstraint( sa.UniqueConstraint(
"task_id", "task_id",
"tag_id", "tag_id",
name="uq_task_tag_assignments_task_id_tag_id", name="uq_tag_assignments_task_id_tag_id",
), ),
) )
assignment_indexes = { assignment_indexes = {
item.get("name") for item in inspector.get_indexes("task_tag_assignments") item.get("name") for item in inspector.get_indexes("tag_assignments")
} }
if op.f("ix_task_tag_assignments_task_id") not in assignment_indexes: if op.f("ix_tag_assignments_task_id") not in assignment_indexes:
op.create_index( op.create_index(
op.f("ix_task_tag_assignments_task_id"), op.f("ix_tag_assignments_task_id"),
"task_tag_assignments", "tag_assignments",
["task_id"], ["task_id"],
unique=False, unique=False,
) )
if op.f("ix_task_tag_assignments_tag_id") not in assignment_indexes: if op.f("ix_tag_assignments_tag_id") not in assignment_indexes:
op.create_index( op.create_index(
op.f("ix_task_tag_assignments_tag_id"), op.f("ix_tag_assignments_tag_id"),
"task_tag_assignments", "tag_assignments",
["tag_id"], ["tag_id"],
unique=False, unique=False,
) )
def downgrade() -> None: def downgrade() -> None:
op.drop_index(op.f("ix_task_tag_assignments_tag_id"), table_name="task_tag_assignments") op.drop_index(op.f("ix_tag_assignments_tag_id"), table_name="tag_assignments")
op.drop_index(op.f("ix_task_tag_assignments_task_id"), table_name="task_tag_assignments") op.drop_index(op.f("ix_tag_assignments_task_id"), table_name="tag_assignments")
op.drop_table("task_tag_assignments") op.drop_table("tag_assignments")
op.drop_index(op.f("ix_task_tags_slug"), table_name="tags") op.drop_index(op.f("ix_tags_slug"), table_name="tags")
op.drop_index(op.f("ix_task_tags_organization_id"), table_name="tags") op.drop_index(op.f("ix_tags_organization_id"), table_name="tags")
op.drop_table("tags") op.drop_table("tags")

View File

@@ -275,7 +275,7 @@ Body: {"depends_on_task_ids":["DEP_TASK_ID_1","DEP_TASK_ID_2"]}
7) Creating new tasks: 7) Creating new tasks:
- Before creating any task or approval, run the de-duplication pass (step 2a). If a similar task already exists, merge/split scope there instead of creating a duplicate. - Before creating any task or approval, run the de-duplication pass (step 2a). If a similar task already exists, merge/split scope there instead of creating a duplicate.
- Leads **can** create tasks directly when confidence >= 70 and the action is not risky/external. - Leads **can** create tasks directly when confidence >= 70 and the action is not risky/external.
- If task tags are configured (`GET /api/v1/agent/boards/$BOARD_ID/tags` returns items), choose the most relevant tags and include their ids in `tag_ids`. - If tags are configured (`GET /api/v1/agent/boards/$BOARD_ID/tags` returns items), choose the most relevant tags and include their ids in `tag_ids`.
- Build and keep a local map: `slug/name -> tag_id`. - Build and keep a local map: `slug/name -> tag_id`.
- Prefer 1-3 tags per task; avoid over-tagging. - Prefer 1-3 tags per task; avoid over-tagging.
- If no existing tag fits, set `tag_ids: []` and leave a short note in your plan/comment so admins can add a missing tag later. - If no existing tag fits, set `tag_ids: []` and leave a short note in your plan/comment so admins can add a missing tag later.

View File

@@ -10,20 +10,20 @@ from app.api import agent as agent_api
from app.core.agent_auth import AgentAuthContext from app.core.agent_auth import AgentAuthContext
from app.models.agents import Agent from app.models.agents import Agent
from app.models.boards import Board from app.models.boards import Board
from app.models.task_tags import TaskTag from app.models.tags import Tag
@dataclass @dataclass
class _FakeExecResult: class _FakeExecResult:
tags: list[TaskTag] tags: list[Tag]
def all(self) -> list[TaskTag]: def all(self) -> list[Tag]:
return self.tags return self.tags
@dataclass @dataclass
class _FakeSession: class _FakeSession:
tags: list[TaskTag] tags: list[Tag]
async def exec(self, _query: object) -> _FakeExecResult: async def exec(self, _query: object) -> _FakeExecResult:
return _FakeExecResult(self.tags) return _FakeExecResult(self.tags)
@@ -52,18 +52,18 @@ def _agent_ctx(*, board_id: UUID | None) -> AgentAuthContext:
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_list_task_tags_returns_task_tag_refs() -> None: async def test_list_tags_returns_tag_refs() -> None:
board = _board() board = _board()
session = _FakeSession( session = _FakeSession(
tags=[ tags=[
TaskTag( Tag(
id=uuid4(), id=uuid4(),
organization_id=board.organization_id, organization_id=board.organization_id,
name="Backend", name="Backend",
slug="backend", slug="backend",
color="0f172a", color="0f172a",
), ),
TaskTag( Tag(
id=uuid4(), id=uuid4(),
organization_id=board.organization_id, organization_id=board.organization_id,
name="Urgent", name="Urgent",
@@ -73,7 +73,7 @@ async def test_list_task_tags_returns_task_tag_refs() -> None:
], ],
) )
response = await agent_api.list_task_tags( response = await agent_api.list_tags(
board=board, board=board,
session=session, # type: ignore[arg-type] session=session, # type: ignore[arg-type]
agent_ctx=_agent_ctx(board_id=board.id), agent_ctx=_agent_ctx(board_id=board.id),
@@ -85,12 +85,12 @@ async def test_list_task_tags_returns_task_tag_refs() -> None:
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_list_task_tags_rejects_cross_board_agent() -> None: async def test_list_tags_rejects_cross_board_agent() -> None:
board = _board() board = _board()
session = _FakeSession(tags=[]) session = _FakeSession(tags=[])
with pytest.raises(HTTPException) as exc: with pytest.raises(HTTPException) as exc:
await agent_api.list_task_tags( await agent_api.list_tags(
board=board, board=board,
session=session, # type: ignore[arg-type] session=session, # type: ignore[arg-type]
agent_ctx=_agent_ctx(board_id=uuid4()), agent_ctx=_agent_ctx(board_id=uuid4()),

View File

@@ -7,8 +7,8 @@ from uuid import uuid4
import pytest import pytest
from app.models.task_tags import TaskTag from app.models.tags import Tag
from app.services import task_tags from app.services import tags
@dataclass @dataclass
@@ -27,18 +27,18 @@ class _FakeSession:
self.added.append(value) self.added.append(value)
def test_slugify_task_tag_normalizes_text(): def test_slugify_tag_normalizes_text():
assert task_tags.slugify_task_tag("Release / QA") == "release-qa" assert tags.slugify_tag("Release / QA") == "release-qa"
assert task_tags.slugify_task_tag(" ### ") == "tag" assert tags.slugify_tag(" ### ") == "tag"
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_validate_task_tag_ids_dedupes_and_preserves_order(): async def test_validate_tag_ids_dedupes_and_preserves_order():
org_id = uuid4() org_id = uuid4()
tag_a = uuid4() tag_a = uuid4()
tag_b = uuid4() tag_b = uuid4()
session = _FakeSession(exec_results=[{tag_a, tag_b}]) session = _FakeSession(exec_results=[{tag_a, tag_b}])
result = await task_tags.validate_task_tag_ids( result = await tags.validate_tag_ids(
session, session,
organization_id=org_id, organization_id=org_id,
tag_ids=[tag_a, tag_b, tag_a], tag_ids=[tag_a, tag_b, tag_a],
@@ -47,13 +47,13 @@ async def test_validate_task_tag_ids_dedupes_and_preserves_order():
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_validate_task_tag_ids_rejects_missing_tags(): async def test_validate_tag_ids_rejects_missing_tags():
org_id = uuid4() org_id = uuid4()
tag_a = uuid4() tag_a = uuid4()
missing = uuid4() missing = uuid4()
session = _FakeSession(exec_results=[{tag_a}]) session = _FakeSession(exec_results=[{tag_a}])
with pytest.raises(task_tags.HTTPException) as exc: with pytest.raises(tags.HTTPException) as exc:
await task_tags.validate_task_tag_ids( await tags.validate_tag_ids(
session, session,
organization_id=org_id, organization_id=org_id,
tag_ids=[tag_a, missing], tag_ids=[tag_a, missing],
@@ -63,7 +63,7 @@ async def test_validate_task_tag_ids_rejects_missing_tags():
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_load_task_tag_state_groups_rows_by_task_id(): async def test_load_tag_state_groups_rows_by_task_id():
task_a = uuid4() task_a = uuid4()
task_b = uuid4() task_b = uuid4()
tag_a = uuid4() tag_a = uuid4()
@@ -73,7 +73,7 @@ async def test_load_task_tag_state_groups_rows_by_task_id():
[ [
( (
task_a, task_a,
TaskTag( Tag(
id=tag_a, id=tag_a,
organization_id=uuid4(), organization_id=uuid4(),
name="Backend", name="Backend",
@@ -83,7 +83,7 @@ async def test_load_task_tag_state_groups_rows_by_task_id():
), ),
( (
task_a, task_a,
TaskTag( Tag(
id=tag_b, id=tag_b,
organization_id=uuid4(), organization_id=uuid4(),
name="Urgent", name="Urgent",
@@ -93,7 +93,7 @@ async def test_load_task_tag_state_groups_rows_by_task_id():
), ),
( (
task_b, task_b,
TaskTag( Tag(
id=tag_b, id=tag_b,
organization_id=uuid4(), organization_id=uuid4(),
name="Urgent", name="Urgent",
@@ -104,7 +104,7 @@ async def test_load_task_tag_state_groups_rows_by_task_id():
], ],
], ],
) )
state = await task_tags.load_task_tag_state( state = await tags.load_tag_state(
session, session,
task_ids=[task_a, task_b], task_ids=[task_a, task_b],
) )
@@ -114,12 +114,12 @@ async def test_load_task_tag_state_groups_rows_by_task_id():
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_replace_task_tags_replaces_existing_links(): async def test_replace_tags_replaces_existing_links():
task_id = uuid4() task_id = uuid4()
tag_a = uuid4() tag_a = uuid4()
tag_b = uuid4() tag_b = uuid4()
session = _FakeSession(exec_results=[None]) session = _FakeSession(exec_results=[None])
await task_tags.replace_task_tags( await tags.replace_tags(
session, session,
task_id=task_id, task_id=task_id,
tag_ids=[tag_a, tag_b, tag_a], tag_ids=[tag_a, tag_b, tag_a],

File diff suppressed because it is too large Load Diff

View File

@@ -364,134 +364,6 @@ export const useCreateAgentApiV1AgentsPost = <
queryClient, 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<heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse> => {
return customFetch<heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse>(
getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostUrl(),
{
...options,
method: "POST",
headers: { "Content-Type": "application/json", ...options?.headers },
body: JSON.stringify(agentHeartbeatCreate),
},
);
};
export const getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationOptions =
<TError = HTTPValidationError, TContext = unknown>(options?: {
mutation?: UseMutationOptions<
Awaited<
ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>
>,
TError,
{ data: AgentHeartbeatCreate },
TContext
>;
request?: SecondParameter<typeof customFetch>;
}): UseMutationOptions<
Awaited<ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>>,
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<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>
>,
{ data: AgentHeartbeatCreate }
> = (props) => {
const { data } = props ?? {};
return heartbeatOrCreateAgentApiV1AgentsHeartbeatPost(
data,
requestOptions,
);
};
return { mutationFn, ...mutationOptions };
};
export type HeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationResult =
NonNullable<
Awaited<ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>>
>;
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<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>
>,
TError,
{ data: AgentHeartbeatCreate },
TContext
>;
request?: SecondParameter<typeof customFetch>;
},
queryClient?: QueryClient,
): UseMutationResult<
Awaited<ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>>,
TError,
{ data: AgentHeartbeatCreate },
TContext
> => {
return useMutation(
getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationOptions(options),
queryClient,
);
};
/** /**
* Stream agent updates as SSE events. * Stream agent updates as SSE events.
* @summary Stream Agents * @summary Stream Agents
@@ -704,123 +576,6 @@ export function useStreamAgentsApiV1AgentsStreamGet<
return { ...query, queryKey: queryOptions.queryKey }; 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<deleteAgentApiV1AgentsAgentIdDeleteResponse> => {
return customFetch<deleteAgentApiV1AgentsAgentIdDeleteResponse>(
getDeleteAgentApiV1AgentsAgentIdDeleteUrl(agentId),
{
...options,
method: "DELETE",
},
);
};
export const getDeleteAgentApiV1AgentsAgentIdDeleteMutationOptions = <
TError = HTTPValidationError,
TContext = unknown,
>(options?: {
mutation?: UseMutationOptions<
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
TError,
{ agentId: string },
TContext
>;
request?: SecondParameter<typeof customFetch>;
}): UseMutationOptions<
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
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<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
{ agentId: string }
> = (props) => {
const { agentId } = props ?? {};
return deleteAgentApiV1AgentsAgentIdDelete(agentId, requestOptions);
};
return { mutationFn, ...mutationOptions };
};
export type DeleteAgentApiV1AgentsAgentIdDeleteMutationResult = NonNullable<
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>
>;
export type DeleteAgentApiV1AgentsAgentIdDeleteMutationError =
HTTPValidationError;
/**
* @summary Delete Agent
*/
export const useDeleteAgentApiV1AgentsAgentIdDelete = <
TError = HTTPValidationError,
TContext = unknown,
>(
options?: {
mutation?: UseMutationOptions<
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
TError,
{ agentId: string },
TContext
>;
request?: SecondParameter<typeof customFetch>;
},
queryClient?: QueryClient,
): UseMutationResult<
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
TError,
{ agentId: string },
TContext
> => {
return useMutation(
getDeleteAgentApiV1AgentsAgentIdDeleteMutationOptions(options),
queryClient,
);
};
/** /**
* Get a single agent by id. * Get a single agent by id.
* @summary Get Agent * @summary Get Agent
@@ -1182,6 +937,123 @@ export const useUpdateAgentApiV1AgentsAgentIdPatch = <
queryClient, 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<deleteAgentApiV1AgentsAgentIdDeleteResponse> => {
return customFetch<deleteAgentApiV1AgentsAgentIdDeleteResponse>(
getDeleteAgentApiV1AgentsAgentIdDeleteUrl(agentId),
{
...options,
method: "DELETE",
},
);
};
export const getDeleteAgentApiV1AgentsAgentIdDeleteMutationOptions = <
TError = HTTPValidationError,
TContext = unknown,
>(options?: {
mutation?: UseMutationOptions<
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
TError,
{ agentId: string },
TContext
>;
request?: SecondParameter<typeof customFetch>;
}): UseMutationOptions<
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
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<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
{ agentId: string }
> = (props) => {
const { agentId } = props ?? {};
return deleteAgentApiV1AgentsAgentIdDelete(agentId, requestOptions);
};
return { mutationFn, ...mutationOptions };
};
export type DeleteAgentApiV1AgentsAgentIdDeleteMutationResult = NonNullable<
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>
>;
export type DeleteAgentApiV1AgentsAgentIdDeleteMutationError =
HTTPValidationError;
/**
* @summary Delete Agent
*/
export const useDeleteAgentApiV1AgentsAgentIdDelete = <
TError = HTTPValidationError,
TContext = unknown,
>(
options?: {
mutation?: UseMutationOptions<
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
TError,
{ agentId: string },
TContext
>;
request?: SecondParameter<typeof customFetch>;
},
queryClient?: QueryClient,
): UseMutationResult<
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
TError,
{ agentId: string },
TContext
> => {
return useMutation(
getDeleteAgentApiV1AgentsAgentIdDeleteMutationOptions(options),
queryClient,
);
};
/** /**
* Record a heartbeat for a specific agent. * Record a heartbeat for a specific agent.
* @summary Heartbeat Agent * @summary Heartbeat Agent
@@ -1310,3 +1182,131 @@ export const useHeartbeatAgentApiV1AgentsAgentIdHeartbeatPost = <
queryClient, 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<heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse> => {
return customFetch<heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse>(
getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostUrl(),
{
...options,
method: "POST",
headers: { "Content-Type": "application/json", ...options?.headers },
body: JSON.stringify(agentHeartbeatCreate),
},
);
};
export const getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationOptions =
<TError = HTTPValidationError, TContext = unknown>(options?: {
mutation?: UseMutationOptions<
Awaited<
ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>
>,
TError,
{ data: AgentHeartbeatCreate },
TContext
>;
request?: SecondParameter<typeof customFetch>;
}): UseMutationOptions<
Awaited<ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>>,
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<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>
>,
{ data: AgentHeartbeatCreate }
> = (props) => {
const { data } = props ?? {};
return heartbeatOrCreateAgentApiV1AgentsHeartbeatPost(
data,
requestOptions,
);
};
return { mutationFn, ...mutationOptions };
};
export type HeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationResult =
NonNullable<
Awaited<ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>>
>;
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<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>
>,
TError,
{ data: AgentHeartbeatCreate },
TContext
>;
request?: SecondParameter<typeof customFetch>;
},
queryClient?: QueryClient,
): UseMutationResult<
Awaited<ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>>,
TError,
{ data: AgentHeartbeatCreate },
TContext
> => {
return useMutation(
getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationOptions(options),
queryClient,
);
};

View File

@@ -369,129 +369,6 @@ export const useCreateBoardGroupApiV1BoardGroupsPost = <
queryClient, 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<deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse> => {
return customFetch<deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse>(
getDeleteBoardGroupApiV1BoardGroupsGroupIdDeleteUrl(groupId),
{
...options,
method: "DELETE",
},
);
};
export const getDeleteBoardGroupApiV1BoardGroupsGroupIdDeleteMutationOptions = <
TError = HTTPValidationError,
TContext = unknown,
>(options?: {
mutation?: UseMutationOptions<
Awaited<ReturnType<typeof deleteBoardGroupApiV1BoardGroupsGroupIdDelete>>,
TError,
{ groupId: string },
TContext
>;
request?: SecondParameter<typeof customFetch>;
}): UseMutationOptions<
Awaited<ReturnType<typeof deleteBoardGroupApiV1BoardGroupsGroupIdDelete>>,
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<ReturnType<typeof deleteBoardGroupApiV1BoardGroupsGroupIdDelete>>,
{ groupId: string }
> = (props) => {
const { groupId } = props ?? {};
return deleteBoardGroupApiV1BoardGroupsGroupIdDelete(
groupId,
requestOptions,
);
};
return { mutationFn, ...mutationOptions };
};
export type DeleteBoardGroupApiV1BoardGroupsGroupIdDeleteMutationResult =
NonNullable<
Awaited<ReturnType<typeof deleteBoardGroupApiV1BoardGroupsGroupIdDelete>>
>;
export type DeleteBoardGroupApiV1BoardGroupsGroupIdDeleteMutationError =
HTTPValidationError;
/**
* @summary Delete Board Group
*/
export const useDeleteBoardGroupApiV1BoardGroupsGroupIdDelete = <
TError = HTTPValidationError,
TContext = unknown,
>(
options?: {
mutation?: UseMutationOptions<
Awaited<ReturnType<typeof deleteBoardGroupApiV1BoardGroupsGroupIdDelete>>,
TError,
{ groupId: string },
TContext
>;
request?: SecondParameter<typeof customFetch>;
},
queryClient?: QueryClient,
): UseMutationResult<
Awaited<ReturnType<typeof deleteBoardGroupApiV1BoardGroupsGroupIdDelete>>,
TError,
{ groupId: string },
TContext
> => {
return useMutation(
getDeleteBoardGroupApiV1BoardGroupsGroupIdDeleteMutationOptions(options),
queryClient,
);
};
/** /**
* Get a board group by id. * Get a board group by id.
* @summary Get Board Group * @summary Get Board Group
@@ -830,161 +707,125 @@ export const useUpdateBoardGroupApiV1BoardGroupsGroupIdPatch = <
); );
}; };
/** /**
* Apply heartbeat settings to agents in a board group. * Delete a board group.
* @summary Apply Board Group Heartbeat * @summary Delete Board Group
*/ */
export type applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse200 = export type deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse200 = {
{ data: OkResponse;
data: BoardGroupHeartbeatApplyResult; status: 200;
status: 200; };
};
export type applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse422 = export type deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse422 = {
{ data: HTTPValidationError;
data: HTTPValidationError; status: 422;
status: 422; };
};
export type applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponseSuccess = export type deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponseSuccess =
applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse200 & { deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse200 & {
headers: Headers; headers: Headers;
}; };
export type applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponseError = export type deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponseError =
applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse422 & { deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse422 & {
headers: Headers; headers: Headers;
}; };
export type applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse = export type deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse =
| deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponseSuccess
| deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponseError;
| applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponseSuccess export const getDeleteBoardGroupApiV1BoardGroupsGroupIdDeleteUrl = (
| applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponseError; groupId: string,
) => {
return `/api/v1/board-groups/${groupId}`;
};
export const getApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostUrl = export const deleteBoardGroupApiV1BoardGroupsGroupIdDelete = async (
(groupId: string) => { groupId: string,
return `/api/v1/board-groups/${groupId}/heartbeat`; options?: RequestInit,
}; ): Promise<deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse> => {
return customFetch<deleteBoardGroupApiV1BoardGroupsGroupIdDeleteResponse>(
getDeleteBoardGroupApiV1BoardGroupsGroupIdDeleteUrl(groupId),
{
...options,
method: "DELETE",
},
);
};
export const applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost = export const getDeleteBoardGroupApiV1BoardGroupsGroupIdDeleteMutationOptions = <
async ( TError = HTTPValidationError,
groupId: string, TContext = unknown,
boardGroupHeartbeatApply: BoardGroupHeartbeatApply, >(options?: {
options?: RequestInit, mutation?: UseMutationOptions<
): Promise<applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse> => { Awaited<ReturnType<typeof deleteBoardGroupApiV1BoardGroupsGroupIdDelete>>,
return customFetch<applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse>( TError,
getApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostUrl( { groupId: string },
groupId, TContext
), >;
{ request?: SecondParameter<typeof customFetch>;
...options, }): UseMutationOptions<
method: "POST", Awaited<ReturnType<typeof deleteBoardGroupApiV1BoardGroupsGroupIdDelete>>,
headers: { "Content-Type": "application/json", ...options?.headers }, TError,
body: JSON.stringify(boardGroupHeartbeatApply), { 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<ReturnType<typeof deleteBoardGroupApiV1BoardGroupsGroupIdDelete>>,
{ groupId: string }
> = (props) => {
const { groupId } = props ?? {};
return deleteBoardGroupApiV1BoardGroupsGroupIdDelete(
groupId,
requestOptions,
); );
}; };
export const getApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostMutationOptions = return { mutationFn, ...mutationOptions };
<TError = HTTPValidationError, TContext = unknown>(options?: { };
mutation?: UseMutationOptions<
Awaited<
ReturnType<
typeof applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost
>
>,
TError,
{ groupId: string; data: BoardGroupHeartbeatApply },
TContext
>;
request?: SecondParameter<typeof customFetch>;
}): 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< export type DeleteBoardGroupApiV1BoardGroupsGroupIdDeleteMutationResult =
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< NonNullable<
Awaited< Awaited<ReturnType<typeof deleteBoardGroupApiV1BoardGroupsGroupIdDelete>>
ReturnType<
typeof applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost
>
>
>; >;
export type ApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostMutationBody =
BoardGroupHeartbeatApply; export type DeleteBoardGroupApiV1BoardGroupsGroupIdDeleteMutationError =
export type ApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostMutationError =
HTTPValidationError; HTTPValidationError;
/** /**
* @summary Apply Board Group Heartbeat * @summary Delete Board Group
*/ */
export const useApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost = < export const useDeleteBoardGroupApiV1BoardGroupsGroupIdDelete = <
TError = HTTPValidationError, TError = HTTPValidationError,
TContext = unknown, TContext = unknown,
>( >(
options?: { options?: {
mutation?: UseMutationOptions< mutation?: UseMutationOptions<
Awaited< Awaited<ReturnType<typeof deleteBoardGroupApiV1BoardGroupsGroupIdDelete>>,
ReturnType<
typeof applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost
>
>,
TError, TError,
{ groupId: string; data: BoardGroupHeartbeatApply }, { groupId: string },
TContext TContext
>; >;
request?: SecondParameter<typeof customFetch>; request?: SecondParameter<typeof customFetch>;
}, },
queryClient?: QueryClient, queryClient?: QueryClient,
): UseMutationResult< ): UseMutationResult<
Awaited< Awaited<ReturnType<typeof deleteBoardGroupApiV1BoardGroupsGroupIdDelete>>,
ReturnType<
typeof applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost
>
>,
TError, TError,
{ groupId: string; data: BoardGroupHeartbeatApply }, { groupId: string },
TContext TContext
> => { > => {
return useMutation( return useMutation(
getApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostMutationOptions( getDeleteBoardGroupApiV1BoardGroupsGroupIdDeleteMutationOptions(options),
options,
),
queryClient, queryClient,
); );
}; };
@@ -1290,3 +1131,163 @@ export function useGetBoardGroupSnapshotApiV1BoardGroupsGroupIdSnapshotGet<
return { ...query, queryKey: queryOptions.queryKey }; 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<applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse> => {
return customFetch<applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostResponse>(
getApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostUrl(
groupId,
),
{
...options,
method: "POST",
headers: { "Content-Type": "application/json", ...options?.headers },
body: JSON.stringify(boardGroupHeartbeatApply),
},
);
};
export const getApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostMutationOptions =
<TError = HTTPValidationError, TContext = unknown>(options?: {
mutation?: UseMutationOptions<
Awaited<
ReturnType<
typeof applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost
>
>,
TError,
{ groupId: string; data: BoardGroupHeartbeatApply },
TContext
>;
request?: SecondParameter<typeof customFetch>;
}): 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<typeof customFetch>;
},
queryClient?: QueryClient,
): UseMutationResult<
Awaited<
ReturnType<
typeof applyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPost
>
>,
TError,
{ groupId: string; data: BoardGroupHeartbeatApply },
TContext
> => {
return useMutation(
getApplyBoardGroupHeartbeatApiV1BoardGroupsGroupIdHeartbeatPostMutationOptions(
options,
),
queryClient,
);
};

View File

@@ -274,6 +274,298 @@ export function useGetOnboardingApiV1BoardsBoardIdOnboardingGet<
return { ...query, queryKey: queryOptions.queryKey }; 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<startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse> => {
return customFetch<startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse>(
getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostUrl(boardId),
{
...options,
method: "POST",
headers: { "Content-Type": "application/json", ...options?.headers },
body: JSON.stringify(boardOnboardingStart),
},
);
};
export const getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationOptions =
<TError = HTTPValidationError, TContext = unknown>(options?: {
mutation?: UseMutationOptions<
Awaited<
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
>,
TError,
{ boardId: string; data: BoardOnboardingStart },
TContext
>;
request?: SecondParameter<typeof customFetch>;
}): UseMutationOptions<
Awaited<
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
>,
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<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
>,
{ boardId: string; data: BoardOnboardingStart }
> = (props) => {
const { boardId, data } = props ?? {};
return startOnboardingApiV1BoardsBoardIdOnboardingStartPost(
boardId,
data,
requestOptions,
);
};
return { mutationFn, ...mutationOptions };
};
export type StartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationResult =
NonNullable<
Awaited<
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
>
>;
export type StartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationBody =
BoardOnboardingStart;
export type StartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationError =
HTTPValidationError;
/**
* @summary Start Onboarding
*/
export const useStartOnboardingApiV1BoardsBoardIdOnboardingStartPost = <
TError = HTTPValidationError,
TContext = unknown,
>(
options?: {
mutation?: UseMutationOptions<
Awaited<
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
>,
TError,
{ boardId: string; data: BoardOnboardingStart },
TContext
>;
request?: SecondParameter<typeof customFetch>;
},
queryClient?: QueryClient,
): UseMutationResult<
Awaited<
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
>,
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<answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse> => {
return customFetch<answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse>(
getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostUrl(boardId),
{
...options,
method: "POST",
headers: { "Content-Type": "application/json", ...options?.headers },
body: JSON.stringify(boardOnboardingAnswer),
},
);
};
export const getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationOptions =
<TError = HTTPValidationError, TContext = unknown>(options?: {
mutation?: UseMutationOptions<
Awaited<
ReturnType<
typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost
>
>,
TError,
{ boardId: string; data: BoardOnboardingAnswer },
TContext
>;
request?: SecondParameter<typeof customFetch>;
}): UseMutationOptions<
Awaited<
ReturnType<typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost>
>,
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<typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost>
>
>;
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<typeof customFetch>;
},
queryClient?: QueryClient,
): UseMutationResult<
Awaited<
ReturnType<typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost>
>,
TError,
{ boardId: string; data: BoardOnboardingAnswer },
TContext
> => {
return useMutation(
getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationOptions(
options,
),
queryClient,
);
};
/** /**
* Store onboarding updates submitted by the gateway agent. * Store onboarding updates submitted by the gateway agent.
* @summary Agent Onboarding Update * @summary Agent Onboarding Update
@@ -449,156 +741,6 @@ export const useAgentOnboardingUpdateApiV1BoardsBoardIdOnboardingAgentPost = <
queryClient, 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<answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse> => {
return customFetch<answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse>(
getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostUrl(boardId),
{
...options,
method: "POST",
headers: { "Content-Type": "application/json", ...options?.headers },
body: JSON.stringify(boardOnboardingAnswer),
},
);
};
export const getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationOptions =
<TError = HTTPValidationError, TContext = unknown>(options?: {
mutation?: UseMutationOptions<
Awaited<
ReturnType<
typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost
>
>,
TError,
{ boardId: string; data: BoardOnboardingAnswer },
TContext
>;
request?: SecondParameter<typeof customFetch>;
}): UseMutationOptions<
Awaited<
ReturnType<typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost>
>,
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<typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost>
>
>;
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<typeof customFetch>;
},
queryClient?: QueryClient,
): UseMutationResult<
Awaited<
ReturnType<typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost>
>,
TError,
{ boardId: string; data: BoardOnboardingAnswer },
TContext
> => {
return useMutation(
getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationOptions(
options,
),
queryClient,
);
};
/** /**
* Confirm onboarding results and provision the board lead agent. * Confirm onboarding results and provision the board lead agent.
* @summary Confirm Onboarding * @summary Confirm Onboarding
@@ -753,145 +895,3 @@ export const useConfirmOnboardingApiV1BoardsBoardIdOnboardingConfirmPost = <
queryClient, 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<startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse> => {
return customFetch<startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse>(
getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostUrl(boardId),
{
...options,
method: "POST",
headers: { "Content-Type": "application/json", ...options?.headers },
body: JSON.stringify(boardOnboardingStart),
},
);
};
export const getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationOptions =
<TError = HTTPValidationError, TContext = unknown>(options?: {
mutation?: UseMutationOptions<
Awaited<
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
>,
TError,
{ boardId: string; data: BoardOnboardingStart },
TContext
>;
request?: SecondParameter<typeof customFetch>;
}): UseMutationOptions<
Awaited<
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
>,
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<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
>,
{ boardId: string; data: BoardOnboardingStart }
> = (props) => {
const { boardId, data } = props ?? {};
return startOnboardingApiV1BoardsBoardIdOnboardingStartPost(
boardId,
data,
requestOptions,
);
};
return { mutationFn, ...mutationOptions };
};
export type StartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationResult =
NonNullable<
Awaited<
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
>
>;
export type StartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationBody =
BoardOnboardingStart;
export type StartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationError =
HTTPValidationError;
/**
* @summary Start Onboarding
*/
export const useStartOnboardingApiV1BoardsBoardIdOnboardingStartPost = <
TError = HTTPValidationError,
TContext = unknown,
>(
options?: {
mutation?: UseMutationOptions<
Awaited<
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
>,
TError,
{ boardId: string; data: BoardOnboardingStart },
TContext
>;
request?: SecondParameter<typeof customFetch>;
},
queryClient?: QueryClient,
): UseMutationResult<
Awaited<
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
>,
TError,
{ boardId: string; data: BoardOnboardingStart },
TContext
> => {
return useMutation(
getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationOptions(
options,
),
queryClient,
);
};

View File

@@ -363,123 +363,6 @@ export const useCreateBoardApiV1BoardsPost = <
queryClient, 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<deleteBoardApiV1BoardsBoardIdDeleteResponse> => {
return customFetch<deleteBoardApiV1BoardsBoardIdDeleteResponse>(
getDeleteBoardApiV1BoardsBoardIdDeleteUrl(boardId),
{
...options,
method: "DELETE",
},
);
};
export const getDeleteBoardApiV1BoardsBoardIdDeleteMutationOptions = <
TError = HTTPValidationError,
TContext = unknown,
>(options?: {
mutation?: UseMutationOptions<
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
TError,
{ boardId: string },
TContext
>;
request?: SecondParameter<typeof customFetch>;
}): UseMutationOptions<
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
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<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
{ boardId: string }
> = (props) => {
const { boardId } = props ?? {};
return deleteBoardApiV1BoardsBoardIdDelete(boardId, requestOptions);
};
return { mutationFn, ...mutationOptions };
};
export type DeleteBoardApiV1BoardsBoardIdDeleteMutationResult = NonNullable<
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>
>;
export type DeleteBoardApiV1BoardsBoardIdDeleteMutationError =
HTTPValidationError;
/**
* @summary Delete Board
*/
export const useDeleteBoardApiV1BoardsBoardIdDelete = <
TError = HTTPValidationError,
TContext = unknown,
>(
options?: {
mutation?: UseMutationOptions<
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
TError,
{ boardId: string },
TContext
>;
request?: SecondParameter<typeof customFetch>;
},
queryClient?: QueryClient,
): UseMutationResult<
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
TError,
{ boardId: string },
TContext
> => {
return useMutation(
getDeleteBoardApiV1BoardsBoardIdDeleteMutationOptions(options),
queryClient,
);
};
/** /**
* Get a board by id. * Get a board by id.
* @summary Get Board * @summary Get Board
@@ -800,6 +683,362 @@ export const useUpdateBoardApiV1BoardsBoardIdPatch = <
queryClient, 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<deleteBoardApiV1BoardsBoardIdDeleteResponse> => {
return customFetch<deleteBoardApiV1BoardsBoardIdDeleteResponse>(
getDeleteBoardApiV1BoardsBoardIdDeleteUrl(boardId),
{
...options,
method: "DELETE",
},
);
};
export const getDeleteBoardApiV1BoardsBoardIdDeleteMutationOptions = <
TError = HTTPValidationError,
TContext = unknown,
>(options?: {
mutation?: UseMutationOptions<
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
TError,
{ boardId: string },
TContext
>;
request?: SecondParameter<typeof customFetch>;
}): UseMutationOptions<
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
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<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
{ boardId: string }
> = (props) => {
const { boardId } = props ?? {};
return deleteBoardApiV1BoardsBoardIdDelete(boardId, requestOptions);
};
return { mutationFn, ...mutationOptions };
};
export type DeleteBoardApiV1BoardsBoardIdDeleteMutationResult = NonNullable<
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>
>;
export type DeleteBoardApiV1BoardsBoardIdDeleteMutationError =
HTTPValidationError;
/**
* @summary Delete Board
*/
export const useDeleteBoardApiV1BoardsBoardIdDelete = <
TError = HTTPValidationError,
TContext = unknown,
>(
options?: {
mutation?: UseMutationOptions<
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
TError,
{ boardId: string },
TContext
>;
request?: SecondParameter<typeof customFetch>;
},
queryClient?: QueryClient,
): UseMutationResult<
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
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<getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponse> => {
return customFetch<getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponse>(
getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetUrl(boardId),
{
...options,
method: "GET",
},
);
};
export const getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryKey = (
boardId: string,
) => {
return [`/api/v1/boards/${boardId}/snapshot`] as const;
};
export const getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryOptions = <
TData = Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError = HTTPValidationError,
>(
boardId: string,
options?: {
query?: Partial<
UseQueryOptions<
Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError,
TData
>
>;
request?: SecondParameter<typeof customFetch>;
},
) => {
const { query: queryOptions, request: requestOptions } = options ?? {};
const queryKey =
queryOptions?.queryKey ??
getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryKey(boardId);
const queryFn: QueryFunction<
Awaited<ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>>
> = ({ signal }) =>
getBoardSnapshotApiV1BoardsBoardIdSnapshotGet(boardId, {
signal,
...requestOptions,
});
return {
queryKey,
queryFn,
enabled: !!boardId,
...queryOptions,
} as UseQueryOptions<
Awaited<ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>>,
TError,
TData
> & { queryKey: DataTag<QueryKey, TData, TError> };
};
export type GetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryResult =
NonNullable<
Awaited<ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>>
>;
export type GetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryError =
HTTPValidationError;
export function useGetBoardSnapshotApiV1BoardsBoardIdSnapshotGet<
TData = Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError = HTTPValidationError,
>(
boardId: string,
options: {
query: Partial<
UseQueryOptions<
Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError,
TData
>
> &
Pick<
DefinedInitialDataOptions<
Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError,
Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>
>,
"initialData"
>;
request?: SecondParameter<typeof customFetch>;
},
queryClient?: QueryClient,
): DefinedUseQueryResult<TData, TError> & {
queryKey: DataTag<QueryKey, TData, TError>;
};
export function useGetBoardSnapshotApiV1BoardsBoardIdSnapshotGet<
TData = Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError = HTTPValidationError,
>(
boardId: string,
options?: {
query?: Partial<
UseQueryOptions<
Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError,
TData
>
> &
Pick<
UndefinedInitialDataOptions<
Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError,
Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>
>,
"initialData"
>;
request?: SecondParameter<typeof customFetch>;
},
queryClient?: QueryClient,
): UseQueryResult<TData, TError> & {
queryKey: DataTag<QueryKey, TData, TError>;
};
export function useGetBoardSnapshotApiV1BoardsBoardIdSnapshotGet<
TData = Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError = HTTPValidationError,
>(
boardId: string,
options?: {
query?: Partial<
UseQueryOptions<
Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError,
TData
>
>;
request?: SecondParameter<typeof customFetch>;
},
queryClient?: QueryClient,
): UseQueryResult<TData, TError> & {
queryKey: DataTag<QueryKey, TData, TError>;
};
/**
* @summary Get Board Snapshot
*/
export function useGetBoardSnapshotApiV1BoardsBoardIdSnapshotGet<
TData = Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError = HTTPValidationError,
>(
boardId: string,
options?: {
query?: Partial<
UseQueryOptions<
Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError,
TData
>
>;
request?: SecondParameter<typeof customFetch>;
},
queryClient?: QueryClient,
): UseQueryResult<TData, TError> & {
queryKey: DataTag<QueryKey, TData, TError>;
} {
const queryOptions =
getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryOptions(
boardId,
options,
);
const query = useQuery(queryOptions, queryClient) as UseQueryResult<
TData,
TError
> & { queryKey: DataTag<QueryKey, TData, TError> };
return { ...query, queryKey: queryOptions.queryKey };
}
/** /**
* Get a grouped snapshot across related boards. * Get a grouped snapshot across related boards.
* @summary Get Board Group Snapshot * @summary Get Board Group Snapshot
@@ -1102,242 +1341,3 @@ export function useGetBoardGroupSnapshotApiV1BoardsBoardIdGroupSnapshotGet<
return { ...query, queryKey: queryOptions.queryKey }; 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<getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponse> => {
return customFetch<getBoardSnapshotApiV1BoardsBoardIdSnapshotGetResponse>(
getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetUrl(boardId),
{
...options,
method: "GET",
},
);
};
export const getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryKey = (
boardId: string,
) => {
return [`/api/v1/boards/${boardId}/snapshot`] as const;
};
export const getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryOptions = <
TData = Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError = HTTPValidationError,
>(
boardId: string,
options?: {
query?: Partial<
UseQueryOptions<
Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError,
TData
>
>;
request?: SecondParameter<typeof customFetch>;
},
) => {
const { query: queryOptions, request: requestOptions } = options ?? {};
const queryKey =
queryOptions?.queryKey ??
getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryKey(boardId);
const queryFn: QueryFunction<
Awaited<ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>>
> = ({ signal }) =>
getBoardSnapshotApiV1BoardsBoardIdSnapshotGet(boardId, {
signal,
...requestOptions,
});
return {
queryKey,
queryFn,
enabled: !!boardId,
...queryOptions,
} as UseQueryOptions<
Awaited<ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>>,
TError,
TData
> & { queryKey: DataTag<QueryKey, TData, TError> };
};
export type GetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryResult =
NonNullable<
Awaited<ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>>
>;
export type GetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryError =
HTTPValidationError;
export function useGetBoardSnapshotApiV1BoardsBoardIdSnapshotGet<
TData = Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError = HTTPValidationError,
>(
boardId: string,
options: {
query: Partial<
UseQueryOptions<
Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError,
TData
>
> &
Pick<
DefinedInitialDataOptions<
Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError,
Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>
>,
"initialData"
>;
request?: SecondParameter<typeof customFetch>;
},
queryClient?: QueryClient,
): DefinedUseQueryResult<TData, TError> & {
queryKey: DataTag<QueryKey, TData, TError>;
};
export function useGetBoardSnapshotApiV1BoardsBoardIdSnapshotGet<
TData = Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError = HTTPValidationError,
>(
boardId: string,
options?: {
query?: Partial<
UseQueryOptions<
Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError,
TData
>
> &
Pick<
UndefinedInitialDataOptions<
Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError,
Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>
>,
"initialData"
>;
request?: SecondParameter<typeof customFetch>;
},
queryClient?: QueryClient,
): UseQueryResult<TData, TError> & {
queryKey: DataTag<QueryKey, TData, TError>;
};
export function useGetBoardSnapshotApiV1BoardsBoardIdSnapshotGet<
TData = Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError = HTTPValidationError,
>(
boardId: string,
options?: {
query?: Partial<
UseQueryOptions<
Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError,
TData
>
>;
request?: SecondParameter<typeof customFetch>;
},
queryClient?: QueryClient,
): UseQueryResult<TData, TError> & {
queryKey: DataTag<QueryKey, TData, TError>;
};
/**
* @summary Get Board Snapshot
*/
export function useGetBoardSnapshotApiV1BoardsBoardIdSnapshotGet<
TData = Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError = HTTPValidationError,
>(
boardId: string,
options?: {
query?: Partial<
UseQueryOptions<
Awaited<
ReturnType<typeof getBoardSnapshotApiV1BoardsBoardIdSnapshotGet>
>,
TError,
TData
>
>;
request?: SecondParameter<typeof customFetch>;
},
queryClient?: QueryClient,
): UseQueryResult<TData, TError> & {
queryKey: DataTag<QueryKey, TData, TError>;
} {
const queryOptions =
getGetBoardSnapshotApiV1BoardsBoardIdSnapshotGetQueryOptions(
boardId,
options,
);
const query = useQuery(queryOptions, queryClient) as UseQueryResult<
TData,
TError
> & { queryKey: DataTag<QueryKey, TData, TError> };
return { ...query, queryKey: queryOptions.queryKey };
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -9,10 +9,10 @@
* Serialized activity event payload returned by activity endpoints. * Serialized activity event payload returned by activity endpoints.
*/ */
export interface ActivityEventRead { export interface ActivityEventRead {
agent_id: string | null;
created_at: string;
event_type: string;
id: string; id: string;
event_type: string;
message: string | null; message: string | null;
agent_id: string | null;
task_id: string | null; task_id: string | null;
created_at: string;
} }

View File

@@ -9,14 +9,14 @@
* Denormalized task-comment feed item enriched with task and board fields. * Denormalized task-comment feed item enriched with task and board fields.
*/ */
export interface ActivityTaskCommentFeedItemRead { export interface ActivityTaskCommentFeedItemRead {
id: string;
created_at: string;
message: string | null;
agent_id: string | null; agent_id: string | null;
agent_name?: string | null; agent_name?: string | null;
agent_role?: string | null; agent_role?: string | null;
board_id: string;
board_name: string;
created_at: string;
id: string;
message: string | null;
task_id: string; task_id: string;
task_title: string; task_title: string;
board_id: string;
board_name: string;
} }

View File

@@ -12,11 +12,11 @@ import type { AgentCreateIdentityProfile } from "./agentCreateIdentityProfile";
*/ */
export interface AgentCreate { export interface AgentCreate {
board_id?: string | null; board_id?: string | null;
/** @minLength 1 */
name: string;
status?: string;
heartbeat_config?: AgentCreateHeartbeatConfig; heartbeat_config?: AgentCreateHeartbeatConfig;
identity_profile?: AgentCreateIdentityProfile; identity_profile?: AgentCreateIdentityProfile;
identity_template?: string | null; identity_template?: string | null;
/** @minLength 1 */
name: string;
soul_template?: string | null; soul_template?: string | null;
status?: string;
} }

View File

@@ -1,10 +0,0 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* Mission Control API
* OpenAPI spec version: 0.1.0
*/
export interface AgentDeleteConfirm {
token: string;
}

View File

@@ -9,8 +9,8 @@
* Heartbeat payload used to create an agent lazily. * Heartbeat payload used to create an agent lazily.
*/ */
export interface AgentHeartbeatCreate { export interface AgentHeartbeatCreate {
board_id?: string | null; status?: string | null;
/** @minLength 1 */ /** @minLength 1 */
name: string; name: string;
status?: string | null; board_id?: string | null;
} }

View File

@@ -1,11 +0,0 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* Mission Control API
* OpenAPI spec version: 0.1.0
*/
export interface AgentProvisionConfirm {
token: string;
action?: string | null;
}

View File

@@ -12,19 +12,19 @@ import type { AgentReadIdentityProfile } from "./agentReadIdentityProfile";
*/ */
export interface AgentRead { export interface AgentRead {
board_id?: string | null; board_id?: string | null;
created_at: string;
gateway_id: string;
heartbeat_config?: AgentReadHeartbeatConfig;
id: string;
identity_profile?: AgentReadIdentityProfile;
identity_template?: string | null;
is_board_lead?: boolean;
is_gateway_main?: boolean;
last_seen_at: string | null;
/** @minLength 1 */ /** @minLength 1 */
name: string; name: string;
openclaw_session_id?: string | null;
soul_template?: string | null;
status?: string; status?: string;
heartbeat_config?: AgentReadHeartbeatConfig;
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;
updated_at: string; updated_at: string;
} }

View File

@@ -12,11 +12,11 @@ import type { AgentUpdateIdentityProfile } from "./agentUpdateIdentityProfile";
*/ */
export interface AgentUpdate { export interface AgentUpdate {
board_id?: string | null; board_id?: string | null;
is_gateway_main?: boolean | null;
name?: string | null;
status?: string | null;
heartbeat_config?: AgentUpdateHeartbeatConfig; heartbeat_config?: AgentUpdateHeartbeatConfig;
identity_profile?: AgentUpdateIdentityProfile; identity_profile?: AgentUpdateIdentityProfile;
identity_template?: string | null; identity_template?: string | null;
is_gateway_main?: boolean | null;
name?: string | null;
soul_template?: string | null; soul_template?: string | null;
status?: string | null;
} }

View File

@@ -13,11 +13,11 @@ import type { ApprovalCreateStatus } from "./approvalCreateStatus";
*/ */
export interface ApprovalCreate { export interface ApprovalCreate {
action_type: string; action_type: string;
agent_id?: string | null;
confidence: number;
payload?: ApprovalCreatePayload;
rubric_scores?: ApprovalCreateRubricScores;
status?: ApprovalCreateStatus;
task_id?: string | null; task_id?: string | null;
task_ids?: string[]; task_ids?: string[];
payload?: ApprovalCreatePayload;
confidence: number;
rubric_scores?: ApprovalCreateRubricScores;
status?: ApprovalCreateStatus;
agent_id?: string | null;
} }

View File

@@ -13,15 +13,15 @@ import type { ApprovalReadStatus } from "./approvalReadStatus";
*/ */
export interface ApprovalRead { export interface ApprovalRead {
action_type: string; action_type: string;
agent_id?: string | null;
board_id: string;
confidence: number;
created_at: string;
id: string;
payload?: ApprovalReadPayload;
resolved_at?: string | null;
rubric_scores?: ApprovalReadRubricScores;
status?: ApprovalReadStatus;
task_id?: string | null; task_id?: string | null;
task_ids?: string[]; task_ids?: string[];
payload?: ApprovalReadPayload;
confidence: number;
rubric_scores?: ApprovalReadRubricScores;
status?: ApprovalReadStatus;
id: string;
board_id: string;
agent_id?: string | null;
created_at: string;
resolved_at?: string | null;
} }

View File

@@ -9,6 +9,6 @@
* Error detail payload listing blocking dependency task identifiers. * Error detail payload listing blocking dependency task identifiers.
*/ */
export interface BlockedTaskDetail { export interface BlockedTaskDetail {
blocked_by_task_ids?: string[];
message: string; message: string;
blocked_by_task_ids?: string[];
} }

View File

@@ -10,15 +10,15 @@ import type { BoardCreateSuccessMetrics } from "./boardCreateSuccessMetrics";
* Payload for creating a board. * Payload for creating a board.
*/ */
export interface BoardCreate { export interface BoardCreate {
board_group_id?: string | null; name: string;
board_type?: string; slug: string;
description: string; description: string;
gateway_id?: string | null; gateway_id?: string | null;
goal_confirmed?: boolean; board_group_id?: string | null;
goal_source?: string | null; board_type?: string;
name: string;
objective?: string | null; objective?: string | null;
slug: string;
success_metrics?: BoardCreateSuccessMetrics; success_metrics?: BoardCreateSuccessMetrics;
target_date?: string | null; target_date?: string | null;
goal_confirmed?: boolean;
goal_source?: string | null;
} }

View File

@@ -9,7 +9,7 @@
* Payload for creating a board group. * Payload for creating a board group.
*/ */
export interface BoardGroupCreate { export interface BoardGroupCreate {
description?: string | null;
name: string; name: string;
slug: string; slug: string;
description?: string | null;
} }

View File

@@ -10,6 +10,6 @@
*/ */
export interface BoardGroupHeartbeatApply { export interface BoardGroupHeartbeatApply {
every: string; every: string;
include_board_leads?: boolean;
target?: string | null; target?: string | null;
include_board_leads?: boolean;
} }

View File

@@ -11,7 +11,7 @@ import type { BoardGroupHeartbeatApplyResultRequested } from "./boardGroupHeartb
*/ */
export interface BoardGroupHeartbeatApplyResult { export interface BoardGroupHeartbeatApplyResult {
board_group_id: string; board_group_id: string;
failed_agent_ids: string[];
requested: BoardGroupHeartbeatApplyResultRequested; requested: BoardGroupHeartbeatApplyResultRequested;
updated_agent_ids: string[]; updated_agent_ids: string[];
failed_agent_ids: string[];
} }

View File

@@ -11,6 +11,6 @@
export interface BoardGroupMemoryCreate { export interface BoardGroupMemoryCreate {
/** @minLength 1 */ /** @minLength 1 */
content: string; content: string;
source?: string | null;
tags?: string[] | null; tags?: string[] | null;
source?: string | null;
} }

View File

@@ -9,11 +9,11 @@
* Serialized board-group memory entry returned from read endpoints. * Serialized board-group memory entry returned from read endpoints.
*/ */
export interface BoardGroupMemoryRead { export interface BoardGroupMemoryRead {
id: string;
board_group_id: string; board_group_id: string;
content: string; content: string;
created_at: string;
id: string;
is_chat?: boolean;
source?: string | null;
tags?: string[] | null; tags?: string[] | null;
source?: string | null;
is_chat?: boolean;
created_at: string;
} }

View File

@@ -9,11 +9,11 @@
* Board-group payload returned from read endpoints. * Board-group payload returned from read endpoints.
*/ */
export interface BoardGroupRead { export interface BoardGroupRead {
created_at: string; name: string;
slug: string;
description?: string | null; description?: string | null;
id: string; id: string;
name: string;
organization_id: string; organization_id: string;
slug: string; created_at: string;
updated_at: string; updated_at: string;
} }

View File

@@ -11,6 +11,6 @@ import type { BoardGroupRead } from "./boardGroupRead";
* Top-level board-group snapshot response payload. * Top-level board-group snapshot response payload.
*/ */
export interface BoardGroupSnapshot { export interface BoardGroupSnapshot {
boards?: BoardGroupBoardSnapshot[];
group?: BoardGroupRead | null; group?: BoardGroupRead | null;
boards?: BoardGroupBoardSnapshot[];
} }

View File

@@ -4,23 +4,23 @@
* Mission Control API * Mission Control API
* OpenAPI spec version: 0.1.0 * OpenAPI spec version: 0.1.0
*/ */
import type { TaskTagRef } from "./taskTagRef"; import type { TagRef } from "./tagRef";
/** /**
* Task summary row used inside board-group snapshot responses. * Task summary row used inside board-group snapshot responses.
*/ */
export interface BoardGroupTaskSummary { export interface BoardGroupTaskSummary {
assigned_agent_id?: string | null; id: string;
assignee?: string | null;
board_id: string; board_id: string;
board_name: string; board_name: string;
created_at: string;
due_at?: string | null;
id: string;
in_progress_at?: string | null;
priority: string;
status: string;
tags?: TaskTagRef[];
title: 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[];
created_at: string;
updated_at: string; updated_at: string;
} }

View File

@@ -9,7 +9,7 @@
* Payload for partial board-group updates. * Payload for partial board-group updates.
*/ */
export interface BoardGroupUpdate { export interface BoardGroupUpdate {
description?: string | null;
name?: string | null; name?: string | null;
slug?: string | null; slug?: string | null;
description?: string | null;
} }

View File

@@ -11,6 +11,6 @@
export interface BoardMemoryCreate { export interface BoardMemoryCreate {
/** @minLength 1 */ /** @minLength 1 */
content: string; content: string;
source?: string | null;
tags?: string[] | null; tags?: string[] | null;
source?: string | null;
} }

View File

@@ -9,11 +9,11 @@
* Serialized board memory entry returned from read endpoints. * Serialized board memory entry returned from read endpoints.
*/ */
export interface BoardMemoryRead { export interface BoardMemoryRead {
id: string;
board_id: string; board_id: string;
content: string; content: string;
created_at: string;
id: string;
is_chat?: boolean;
source?: string | null;
tags?: string[] | null; tags?: string[] | null;
source?: string | null;
is_chat?: boolean;
created_at: string;
} }

View File

@@ -13,10 +13,10 @@ import type { BoardOnboardingUserProfile } from "./boardOnboardingUserProfile";
*/ */
export interface BoardOnboardingAgentComplete { export interface BoardOnboardingAgentComplete {
board_type: string; board_type: string;
lead_agent?: BoardOnboardingLeadAgentDraft | null;
objective?: string | null; objective?: string | null;
status: "complete";
success_metrics?: BoardOnboardingAgentCompleteSuccessMetrics; success_metrics?: BoardOnboardingAgentCompleteSuccessMetrics;
target_date?: string | null; target_date?: string | null;
status: "complete";
user_profile?: BoardOnboardingUserProfile | null; user_profile?: BoardOnboardingUserProfile | null;
lead_agent?: BoardOnboardingLeadAgentDraft | null;
} }

View File

@@ -1,13 +0,0 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* Mission Control API
* OpenAPI spec version: 0.1.0
*/
export type BoardOnboardingAgentCompleteStatus =
(typeof BoardOnboardingAgentCompleteStatus)[keyof typeof BoardOnboardingAgentCompleteStatus];
export const BoardOnboardingAgentCompleteStatus = {
complete: "complete",
} as const;

View File

@@ -10,8 +10,8 @@ import type { BoardOnboardingQuestionOption } from "./boardOnboardingQuestionOpt
* Question payload emitted by the onboarding assistant. * Question payload emitted by the onboarding assistant.
*/ */
export interface BoardOnboardingAgentQuestion { export interface BoardOnboardingAgentQuestion {
/** @minItems 1 */
options: BoardOnboardingQuestionOption[];
/** @minLength 1 */ /** @minLength 1 */
question: string; question: string;
/** @minItems 1 */
options: BoardOnboardingQuestionOption[];
} }

View File

@@ -10,11 +10,11 @@ import type { BoardOnboardingLeadAgentDraftIdentityProfile } from "./boardOnboar
* Editable lead-agent draft configuration. * Editable lead-agent draft configuration.
*/ */
export interface BoardOnboardingLeadAgentDraft { export interface BoardOnboardingLeadAgentDraft {
autonomy_level?: "ask_first" | "balanced" | "autonomous" | null;
custom_instructions?: string | null;
identity_profile?: BoardOnboardingLeadAgentDraftIdentityProfile;
name?: string | null; name?: string | null;
identity_profile?: BoardOnboardingLeadAgentDraftIdentityProfile;
autonomy_level?: "ask_first" | "balanced" | "autonomous" | null;
verbosity?: "concise" | "balanced" | "detailed" | null;
output_format?: "bullets" | "mixed" | "narrative" | null; output_format?: "bullets" | "mixed" | "narrative" | null;
update_cadence?: "asap" | "hourly" | "daily" | "weekly" | null; update_cadence?: "asap" | "hourly" | "daily" | "weekly" | null;
verbosity?: "concise" | "balanced" | "detailed" | null; custom_instructions?: string | null;
} }

View File

@@ -11,12 +11,12 @@ import type { BoardOnboardingReadMessages } from "./boardOnboardingReadMessages"
* Stored onboarding session state returned by API endpoints. * Stored onboarding session state returned by API endpoints.
*/ */
export interface BoardOnboardingRead { export interface BoardOnboardingRead {
board_id: string;
created_at: string;
draft_goal?: BoardOnboardingAgentComplete | null;
id: string; id: string;
messages?: BoardOnboardingReadMessages; board_id: string;
session_key: string; session_key: string;
status: string; status: string;
messages?: BoardOnboardingReadMessages;
draft_goal?: BoardOnboardingAgentComplete | null;
created_at: string;
updated_at: string; updated_at: string;
} }

View File

@@ -1,8 +0,0 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* Mission Control API
* OpenAPI spec version: 0.1.0
*/
export type BoardOnboardingReadDraftGoal = { [key: string]: unknown } | null;

View File

@@ -9,9 +9,9 @@
* User-profile preferences gathered during onboarding. * User-profile preferences gathered during onboarding.
*/ */
export interface BoardOnboardingUserProfile { export interface BoardOnboardingUserProfile {
context?: string | null;
notes?: string | null;
preferred_name?: string | null; preferred_name?: string | null;
pronouns?: string | null; pronouns?: string | null;
timezone?: string | null; timezone?: string | null;
notes?: string | null;
context?: string | null;
} }

View File

@@ -10,19 +10,19 @@ import type { BoardReadSuccessMetrics } from "./boardReadSuccessMetrics";
* Board payload returned from read endpoints. * Board payload returned from read endpoints.
*/ */
export interface BoardRead { export interface BoardRead {
board_group_id?: string | null; name: string;
board_type?: string; slug: string;
created_at: string;
description: string; description: string;
gateway_id?: string | null; gateway_id?: string | null;
board_group_id?: string | null;
board_type?: string;
objective?: string | null;
success_metrics?: BoardReadSuccessMetrics;
target_date?: string | null;
goal_confirmed?: boolean; goal_confirmed?: boolean;
goal_source?: string | null; goal_source?: string | null;
id: string; id: string;
name: string;
objective?: string | null;
organization_id: string; organization_id: string;
slug: string; created_at: string;
success_metrics?: BoardReadSuccessMetrics;
target_date?: string | null;
updated_at: string; updated_at: string;
} }

View File

@@ -14,10 +14,10 @@ import type { TaskCardRead } from "./taskCardRead";
* Aggregated board payload used by board snapshot endpoints. * Aggregated board payload used by board snapshot endpoints.
*/ */
export interface BoardSnapshot { export interface BoardSnapshot {
board: BoardRead;
tasks: TaskCardRead[];
agents: AgentRead[]; agents: AgentRead[];
approvals: ApprovalRead[]; approvals: ApprovalRead[];
board: BoardRead;
chat_messages: BoardMemoryRead[]; chat_messages: BoardMemoryRead[];
pending_approvals_count?: number; pending_approvals_count?: number;
tasks: TaskCardRead[];
} }

View File

@@ -10,15 +10,15 @@ import type { BoardUpdateSuccessMetrics } from "./boardUpdateSuccessMetrics";
* Payload for partial board updates. * Payload for partial board updates.
*/ */
export interface BoardUpdate { export interface BoardUpdate {
board_group_id?: string | null; name?: string | null;
board_type?: string | null; slug?: string | null;
description?: string | null; description?: string | null;
gateway_id?: string | null; gateway_id?: string | null;
goal_confirmed?: boolean | null; board_group_id?: string | null;
goal_source?: string | null; board_type?: string | null;
name?: string | null;
objective?: string | null; objective?: string | null;
slug?: string | null;
success_metrics?: BoardUpdateSuccessMetrics; success_metrics?: BoardUpdateSuccessMetrics;
target_date?: string | null; target_date?: string | null;
goal_confirmed?: boolean | null;
goal_source?: string | null;
} }

View File

@@ -1,10 +0,0 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* Mission Control API
* OpenAPI spec version: 0.1.0
*/
export type ConfirmDeleteAgentApiV1AgentsAgentIdDeleteConfirmPost200 = {
[key: string]: boolean;
};

View File

@@ -1,10 +0,0 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* Mission Control API
* OpenAPI spec version: 0.1.0
*/
export type ConfirmProvisionAgentApiV1AgentsAgentIdProvisionConfirmPost200 = {
[key: string]: boolean;
};

View File

@@ -10,7 +10,7 @@
*/ */
export interface DashboardKpis { export interface DashboardKpis {
active_agents: number; active_agents: number;
tasks_in_progress: number;
error_rate_pct: number; error_rate_pct: number;
median_cycle_time_hours_7d: number | null; median_cycle_time_hours_7d: number | null;
tasks_in_progress: number;
} }

View File

@@ -13,11 +13,11 @@ import type { DashboardWipSeriesSet } from "./dashboardWipSeriesSet";
* Complete dashboard metrics response payload. * Complete dashboard metrics response payload.
*/ */
export interface DashboardMetrics { export interface DashboardMetrics {
cycle_time: DashboardSeriesSet; range: DashboardMetricsRange;
error_rate: DashboardSeriesSet;
generated_at: string; generated_at: string;
kpis: DashboardKpis; kpis: DashboardKpis;
range: DashboardMetricsRange;
throughput: DashboardSeriesSet; throughput: DashboardSeriesSet;
cycle_time: DashboardSeriesSet;
error_rate: DashboardSeriesSet;
wip: DashboardWipSeriesSet; wip: DashboardWipSeriesSet;
} }

View File

@@ -1,14 +0,0 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* Mission Control API
* OpenAPI spec version: 0.1.0
*/
export type DashboardMetricsApiV1MetricsDashboardGetRange =
(typeof DashboardMetricsApiV1MetricsDashboardGetRange)[keyof typeof DashboardMetricsApiV1MetricsDashboardGetRange];
export const DashboardMetricsApiV1MetricsDashboardGetRange = {
"24h": "24h",
"7d": "7d",
} as const;

View File

@@ -12,7 +12,7 @@ import type { DashboardSeriesPoint } from "./dashboardSeriesPoint";
* Series payload for a single range/bucket combination. * Series payload for a single range/bucket combination.
*/ */
export interface DashboardRangeSeries { export interface DashboardRangeSeries {
range: DashboardRangeSeriesRange;
bucket: DashboardRangeSeriesBucket; bucket: DashboardRangeSeriesBucket;
points: DashboardSeriesPoint[]; points: DashboardSeriesPoint[];
range: DashboardRangeSeriesRange;
} }

View File

@@ -10,6 +10,6 @@ import type { DashboardRangeSeries } from "./dashboardRangeSeries";
* Primary vs comparison pair for generic series metrics. * Primary vs comparison pair for generic series metrics.
*/ */
export interface DashboardSeriesSet { export interface DashboardSeriesSet {
comparison: DashboardRangeSeries;
primary: DashboardRangeSeries; primary: DashboardRangeSeries;
comparison: DashboardRangeSeries;
} }

View File

@@ -9,8 +9,8 @@
* Work-in-progress point split by task status buckets. * Work-in-progress point split by task status buckets.
*/ */
export interface DashboardWipPoint { export interface DashboardWipPoint {
in_progress: number;
inbox: number;
period: string; period: string;
inbox: number;
in_progress: number;
review: number; review: number;
} }

View File

@@ -12,7 +12,7 @@ import type { DashboardWipRangeSeriesRange } from "./dashboardWipRangeSeriesRang
* WIP series payload for a single range/bucket combination. * WIP series payload for a single range/bucket combination.
*/ */
export interface DashboardWipRangeSeries { export interface DashboardWipRangeSeries {
range: DashboardWipRangeSeriesRange;
bucket: DashboardWipRangeSeriesBucket; bucket: DashboardWipRangeSeriesBucket;
points: DashboardWipPoint[]; points: DashboardWipPoint[];
range: DashboardWipRangeSeriesRange;
} }

View File

@@ -10,6 +10,6 @@ import type { DashboardWipRangeSeries } from "./dashboardWipRangeSeries";
* Primary vs comparison pair for WIP status series metrics. * Primary vs comparison pair for WIP status series metrics.
*/ */
export interface DashboardWipSeriesSet { export interface DashboardWipSeriesSet {
comparison: DashboardWipRangeSeries;
primary: DashboardWipRangeSeries; primary: DashboardWipRangeSeries;
comparison: DashboardWipRangeSeries;
} }

View File

@@ -1,8 +0,0 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* Mission Control API
* OpenAPI spec version: 0.1.0
*/
export type DeleteAgentApiV1AgentsAgentIdDelete200 = { [key: string]: boolean };

View File

@@ -1,8 +0,0 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* Mission Control API
* OpenAPI spec version: 0.1.0
*/
export type DeleteBoardApiV1BoardsBoardIdDelete200 = { [key: string]: boolean };

View File

@@ -1,10 +0,0 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* Mission Control API
* OpenAPI spec version: 0.1.0
*/
export type DeleteTaskApiV1BoardsBoardIdTasksTaskIdDelete200 = {
[key: string]: boolean;
};

View File

@@ -1,10 +0,0 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* Mission Control API
* OpenAPI spec version: 0.1.0
*/
export type GatewayCommandsApiV1GatewayCommandsGet200 = {
[key: string]: unknown;
};

View File

@@ -9,7 +9,7 @@
* Gateway command catalog and protocol metadata. * Gateway command catalog and protocol metadata.
*/ */
export interface GatewayCommandsResponse { export interface GatewayCommandsResponse {
events: string[];
methods: string[];
protocol_version: number; protocol_version: number;
methods: string[];
events: string[];
} }

View File

@@ -10,7 +10,7 @@
*/ */
export interface GatewayCreate { export interface GatewayCreate {
name: string; name: string;
token?: string | null;
url: string; url: string;
workspace_root: string; workspace_root: string;
token?: string | null;
} }

View File

@@ -10,8 +10,8 @@
*/ */
export interface GatewayLeadBroadcastBoardResult { export interface GatewayLeadBroadcastBoardResult {
board_id: string; board_id: string;
error?: string | null;
lead_agent_id?: string | null; lead_agent_id?: string | null;
lead_agent_name?: string | null; lead_agent_name?: string | null;
ok?: boolean; ok?: boolean;
error?: string | null;
} }

View File

@@ -10,11 +10,11 @@ import type { GatewayLeadBroadcastRequestKind } from "./gatewayLeadBroadcastRequ
* Request payload for broadcasting a message to multiple board leads. * Request payload for broadcasting a message to multiple board leads.
*/ */
export interface GatewayLeadBroadcastRequest { export interface GatewayLeadBroadcastRequest {
board_ids?: string[] | null; kind?: GatewayLeadBroadcastRequestKind;
correlation_id?: string | null;
/** @minLength 1 */ /** @minLength 1 */
content: string; content: string;
correlation_id?: string | null; board_ids?: string[] | null;
kind?: GatewayLeadBroadcastRequestKind;
reply_source?: string | null;
reply_tags?: string[]; reply_tags?: string[];
reply_source?: string | null;
} }

View File

@@ -10,8 +10,8 @@ import type { GatewayLeadBroadcastBoardResult } from "./gatewayLeadBroadcastBoar
* Aggregate response for a lead broadcast operation. * Aggregate response for a lead broadcast operation.
*/ */
export interface GatewayLeadBroadcastResponse { export interface GatewayLeadBroadcastResponse {
failed?: number;
ok?: boolean; ok?: boolean;
results?: GatewayLeadBroadcastBoardResult[];
sent?: number; sent?: number;
failed?: number;
results?: GatewayLeadBroadcastBoardResult[];
} }

View File

@@ -10,10 +10,10 @@ import type { GatewayLeadMessageRequestKind } from "./gatewayLeadMessageRequestK
* Request payload for sending a message to a board lead agent. * Request payload for sending a message to a board lead agent.
*/ */
export interface GatewayLeadMessageRequest { export interface GatewayLeadMessageRequest {
kind?: GatewayLeadMessageRequestKind;
correlation_id?: string | null;
/** @minLength 1 */ /** @minLength 1 */
content: string; content: string;
correlation_id?: string | null;
kind?: GatewayLeadMessageRequestKind;
reply_source?: string | null;
reply_tags?: string[]; reply_tags?: string[];
reply_source?: string | null;
} }

View File

@@ -9,9 +9,9 @@
* Response payload for a lead-message dispatch attempt. * Response payload for a lead-message dispatch attempt.
*/ */
export interface GatewayLeadMessageResponse { export interface GatewayLeadMessageResponse {
ok?: boolean;
board_id: string; board_id: string;
lead_agent_id?: string | null; lead_agent_id?: string | null;
lead_agent_name?: string | null; lead_agent_name?: string | null;
lead_created?: boolean; lead_created?: boolean;
ok?: boolean;
} }

View File

@@ -9,10 +9,10 @@
* Request payload for asking the end user via a main gateway agent. * Request payload for asking the end user via a main gateway agent.
*/ */
export interface GatewayMainAskUserRequest { export interface GatewayMainAskUserRequest {
correlation_id?: string | null;
/** @minLength 1 */ /** @minLength 1 */
content: string; content: string;
correlation_id?: string | null;
preferred_channel?: string | null; preferred_channel?: string | null;
reply_source?: string | null;
reply_tags?: string[]; reply_tags?: string[];
reply_source?: string | null;
} }

View File

@@ -9,8 +9,8 @@
* Response payload for user-question dispatch via gateway main agent. * Response payload for user-question dispatch via gateway main agent.
*/ */
export interface GatewayMainAskUserResponse { export interface GatewayMainAskUserResponse {
ok?: boolean;
board_id: string; board_id: string;
main_agent_id?: string | null; main_agent_id?: string | null;
main_agent_name?: string | null; main_agent_name?: string | null;
ok?: boolean;
} }

View File

@@ -9,12 +9,12 @@
* Gateway payload returned from read endpoints. * Gateway payload returned from read endpoints.
*/ */
export interface GatewayRead { export interface GatewayRead {
created_at: string;
id: string;
name: string; name: string;
organization_id: string;
token?: string | null;
updated_at: string;
url: string; url: string;
workspace_root: string; workspace_root: string;
id: string;
organization_id: string;
token?: string | null;
created_at: string;
updated_at: string;
} }

View File

@@ -1,15 +0,0 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* Mission Control API
* OpenAPI spec version: 0.1.0
*/
/**
* Query parameters used to resolve which gateway to target.
*/
export interface GatewayResolveQuery {
board_id?: string | null;
gateway_url?: string | null;
gateway_token?: string | null;
}

View File

@@ -9,6 +9,6 @@
* Gateway sessions list response payload. * Gateway sessions list response payload.
*/ */
export interface GatewaySessionsResponse { export interface GatewaySessionsResponse {
main_session?: unknown | null;
sessions: unknown[]; sessions: unknown[];
main_session?: unknown | null;
} }

View File

@@ -1,8 +0,0 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* Mission Control API
* OpenAPI spec version: 0.1.0
*/
export type GatewayStatusApiV1GatewayStatusGet200 = { [key: string]: unknown };

View File

@@ -1,10 +0,0 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* Mission Control API
* OpenAPI spec version: 0.1.0
*/
export type GatewayStatusApiV1GatewayStatusGetParams = {
board_id?: string | null;
};

View File

@@ -10,11 +10,11 @@ import type { GatewayTemplatesSyncError } from "./gatewayTemplatesSyncError";
* Summary payload returned by gateway template sync endpoints. * Summary payload returned by gateway template sync endpoints.
*/ */
export interface GatewayTemplatesSyncResult { export interface GatewayTemplatesSyncResult {
agents_skipped: number;
agents_updated: number;
errors?: GatewayTemplatesSyncError[];
gateway_id: string; gateway_id: string;
include_main: boolean; include_main: boolean;
main_updated: boolean;
reset_sessions: boolean; reset_sessions: boolean;
agents_updated: number;
agents_skipped: number;
main_updated: boolean;
errors?: GatewayTemplatesSyncError[];
} }

View File

@@ -10,7 +10,7 @@
*/ */
export interface GatewayUpdate { export interface GatewayUpdate {
name?: string | null; name?: string | null;
token?: string | null;
url?: string | null; url?: string | null;
token?: string | null;
workspace_root?: string | null; workspace_root?: string | null;
} }

View File

@@ -10,10 +10,10 @@
*/ */
export interface GatewaysStatusResponse { export interface GatewaysStatusResponse {
connected: boolean; connected: boolean;
error?: string | null;
gateway_url: string; gateway_url: string;
sessions_count?: number | null;
sessions?: unknown[] | null;
main_session?: unknown | null; main_session?: unknown | null;
main_session_error?: string | null; main_session_error?: string | null;
sessions?: unknown[] | null; error?: string | null;
sessions_count?: number | null;
} }

View File

@@ -1,10 +0,0 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* Mission Control API
* OpenAPI spec version: 0.1.0
*/
export type GetGatewaySessionApiV1GatewaySessionsSessionIdGet200 = {
[key: string]: unknown;
};

View File

@@ -1,10 +0,0 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* Mission Control API
* OpenAPI spec version: 0.1.0
*/
export type GetGatewaySessionApiV1GatewaySessionsSessionIdGetParams = {
board_id?: string | null;
};

View File

@@ -1,10 +0,0 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* Mission Control API
* OpenAPI spec version: 0.1.0
*/
export type GetSessionHistoryApiV1GatewaySessionsSessionIdHistoryGet200 = {
[key: string]: unknown;
};

View File

@@ -1,10 +0,0 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* Mission Control API
* OpenAPI spec version: 0.1.0
*/
export type GetSessionHistoryApiV1GatewaySessionsSessionIdHistoryGetParams = {
board_id?: string | null;
};

View File

@@ -10,11 +10,9 @@ export * from "./activityTaskCommentFeedItemRead";
export * from "./agentCreate"; export * from "./agentCreate";
export * from "./agentCreateHeartbeatConfig"; export * from "./agentCreateHeartbeatConfig";
export * from "./agentCreateIdentityProfile"; export * from "./agentCreateIdentityProfile";
export * from "./agentDeleteConfirm";
export * from "./agentHeartbeat"; export * from "./agentHeartbeat";
export * from "./agentHeartbeatCreate"; export * from "./agentHeartbeatCreate";
export * from "./agentNudge"; export * from "./agentNudge";
export * from "./agentProvisionConfirm";
export * from "./agentRead"; export * from "./agentRead";
export * from "./agentReadHeartbeatConfig"; export * from "./agentReadHeartbeatConfig";
export * from "./agentReadIdentityProfile"; export * from "./agentReadIdentityProfile";
@@ -49,7 +47,6 @@ export * from "./boardGroupUpdate";
export * from "./boardMemoryCreate"; export * from "./boardMemoryCreate";
export * from "./boardMemoryRead"; export * from "./boardMemoryRead";
export * from "./boardOnboardingAgentComplete"; export * from "./boardOnboardingAgentComplete";
export * from "./boardOnboardingAgentCompleteStatus";
export * from "./boardOnboardingAgentCompleteSuccessMetrics"; export * from "./boardOnboardingAgentCompleteSuccessMetrics";
export * from "./boardOnboardingAgentQuestion"; export * from "./boardOnboardingAgentQuestion";
export * from "./boardOnboardingAnswer"; export * from "./boardOnboardingAnswer";
@@ -59,7 +56,6 @@ export * from "./boardOnboardingLeadAgentDraft";
export * from "./boardOnboardingLeadAgentDraftIdentityProfile"; export * from "./boardOnboardingLeadAgentDraftIdentityProfile";
export * from "./boardOnboardingQuestionOption"; export * from "./boardOnboardingQuestionOption";
export * from "./boardOnboardingRead"; export * from "./boardOnboardingRead";
export * from "./boardOnboardingReadDraftGoal";
export * from "./boardOnboardingReadMessages"; export * from "./boardOnboardingReadMessages";
export * from "./boardOnboardingStart"; export * from "./boardOnboardingStart";
export * from "./boardOnboardingUserProfile"; export * from "./boardOnboardingUserProfile";
@@ -68,12 +64,9 @@ export * from "./boardReadSuccessMetrics";
export * from "./boardSnapshot"; export * from "./boardSnapshot";
export * from "./boardUpdate"; export * from "./boardUpdate";
export * from "./boardUpdateSuccessMetrics"; export * from "./boardUpdateSuccessMetrics";
export * from "./confirmDeleteAgentApiV1AgentsAgentIdDeleteConfirmPost200";
export * from "./confirmProvisionAgentApiV1AgentsAgentIdProvisionConfirmPost200";
export * from "./dashboardKpis"; export * from "./dashboardKpis";
export * from "./dashboardMetrics"; export * from "./dashboardMetrics";
export * from "./dashboardMetricsApiV1MetricsDashboardGetParams"; export * from "./dashboardMetricsApiV1MetricsDashboardGetParams";
export * from "./dashboardMetricsApiV1MetricsDashboardGetRange";
export * from "./dashboardMetricsApiV1MetricsDashboardGetRangeKey"; export * from "./dashboardMetricsApiV1MetricsDashboardGetRangeKey";
export * from "./dashboardMetricsRange"; export * from "./dashboardMetricsRange";
export * from "./dashboardRangeSeries"; export * from "./dashboardRangeSeries";
@@ -86,10 +79,6 @@ export * from "./dashboardWipRangeSeries";
export * from "./dashboardWipRangeSeriesBucket"; export * from "./dashboardWipRangeSeriesBucket";
export * from "./dashboardWipRangeSeriesRange"; export * from "./dashboardWipRangeSeriesRange";
export * from "./dashboardWipSeriesSet"; export * from "./dashboardWipSeriesSet";
export * from "./deleteAgentApiV1AgentsAgentIdDelete200";
export * from "./deleteBoardApiV1BoardsBoardIdDelete200";
export * from "./deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete200";
export * from "./gatewayCommandsApiV1GatewayCommandsGet200";
export * from "./gatewayCommandsResponse"; export * from "./gatewayCommandsResponse";
export * from "./gatewayCreate"; export * from "./gatewayCreate";
export * from "./gatewayLeadBroadcastBoardResult"; export * from "./gatewayLeadBroadcastBoardResult";
@@ -102,25 +91,18 @@ export * from "./gatewayLeadMessageResponse";
export * from "./gatewayMainAskUserRequest"; export * from "./gatewayMainAskUserRequest";
export * from "./gatewayMainAskUserResponse"; export * from "./gatewayMainAskUserResponse";
export * from "./gatewayRead"; export * from "./gatewayRead";
export * from "./gatewayResolveQuery";
export * from "./gatewaySessionHistoryResponse"; export * from "./gatewaySessionHistoryResponse";
export * from "./gatewaySessionMessageRequest"; export * from "./gatewaySessionMessageRequest";
export * from "./gatewaySessionResponse"; export * from "./gatewaySessionResponse";
export * from "./gatewaySessionsResponse"; export * from "./gatewaySessionsResponse";
export * from "./gatewaysStatusApiV1GatewaysStatusGetParams"; export * from "./gatewaysStatusApiV1GatewaysStatusGetParams";
export * from "./gatewaysStatusResponse"; export * from "./gatewaysStatusResponse";
export * from "./gatewayStatusApiV1GatewayStatusGet200";
export * from "./gatewayStatusApiV1GatewayStatusGetParams";
export * from "./gatewayTemplatesSyncError"; export * from "./gatewayTemplatesSyncError";
export * from "./gatewayTemplatesSyncResult"; export * from "./gatewayTemplatesSyncResult";
export * from "./gatewayUpdate"; export * from "./gatewayUpdate";
export * from "./getBoardGroupSnapshotApiV1BoardGroupsGroupIdSnapshotGetParams"; export * from "./getBoardGroupSnapshotApiV1BoardGroupsGroupIdSnapshotGetParams";
export * from "./getBoardGroupSnapshotApiV1BoardsBoardIdGroupSnapshotGetParams"; export * from "./getBoardGroupSnapshotApiV1BoardsBoardIdGroupSnapshotGetParams";
export * from "./getGatewaySessionApiV1GatewaySessionsSessionIdGet200";
export * from "./getGatewaySessionApiV1GatewaySessionsSessionIdGetParams";
export * from "./getGatewaySessionApiV1GatewaysSessionsSessionIdGetParams"; export * from "./getGatewaySessionApiV1GatewaysSessionsSessionIdGetParams";
export * from "./getSessionHistoryApiV1GatewaySessionsSessionIdHistoryGet200";
export * from "./getSessionHistoryApiV1GatewaySessionsSessionIdHistoryGetParams";
export * from "./getSessionHistoryApiV1GatewaysSessionsSessionIdHistoryGetParams"; export * from "./getSessionHistoryApiV1GatewaysSessionsSessionIdHistoryGetParams";
export * from "./healthHealthGet200"; export * from "./healthHealthGet200";
export * from "./healthzHealthzGet200"; export * from "./healthzHealthzGet200";
@@ -136,9 +118,9 @@ export * from "./limitOffsetPageTypeVarCustomizedBoardRead";
export * from "./limitOffsetPageTypeVarCustomizedGatewayRead"; export * from "./limitOffsetPageTypeVarCustomizedGatewayRead";
export * from "./limitOffsetPageTypeVarCustomizedOrganizationInviteRead"; export * from "./limitOffsetPageTypeVarCustomizedOrganizationInviteRead";
export * from "./limitOffsetPageTypeVarCustomizedOrganizationMemberRead"; export * from "./limitOffsetPageTypeVarCustomizedOrganizationMemberRead";
export * from "./limitOffsetPageTypeVarCustomizedTagRead";
export * from "./limitOffsetPageTypeVarCustomizedTaskCommentRead"; export * from "./limitOffsetPageTypeVarCustomizedTaskCommentRead";
export * from "./limitOffsetPageTypeVarCustomizedTaskRead"; export * from "./limitOffsetPageTypeVarCustomizedTaskRead";
export * from "./limitOffsetPageTypeVarCustomizedTaskTagRead";
export * from "./listActivityApiV1ActivityGetParams"; export * from "./listActivityApiV1ActivityGetParams";
export * from "./listAgentsApiV1AgentAgentsGetParams"; export * from "./listAgentsApiV1AgentAgentsGetParams";
export * from "./listAgentsApiV1AgentsGetParams"; export * from "./listAgentsApiV1AgentsGetParams";
@@ -155,14 +137,12 @@ export * from "./listGatewaysApiV1GatewaysGetParams";
export * from "./listGatewaySessionsApiV1GatewaysSessionsGetParams"; export * from "./listGatewaySessionsApiV1GatewaysSessionsGetParams";
export * from "./listOrgInvitesApiV1OrganizationsMeInvitesGetParams"; export * from "./listOrgInvitesApiV1OrganizationsMeInvitesGetParams";
export * from "./listOrgMembersApiV1OrganizationsMeMembersGetParams"; export * from "./listOrgMembersApiV1OrganizationsMeMembersGetParams";
export * from "./listSessionsApiV1GatewaySessionsGet200"; export * from "./listTagsApiV1TagsGetParams";
export * from "./listSessionsApiV1GatewaySessionsGetParams";
export * from "./listTaskCommentFeedApiV1ActivityTaskCommentsGetParams"; export * from "./listTaskCommentFeedApiV1ActivityTaskCommentsGetParams";
export * from "./listTaskCommentsApiV1AgentBoardsBoardIdTasksTaskIdCommentsGetParams"; export * from "./listTaskCommentsApiV1AgentBoardsBoardIdTasksTaskIdCommentsGetParams";
export * from "./listTaskCommentsApiV1BoardsBoardIdTasksTaskIdCommentsGetParams"; export * from "./listTaskCommentsApiV1BoardsBoardIdTasksTaskIdCommentsGetParams";
export * from "./listTasksApiV1AgentBoardsBoardIdTasksGetParams"; export * from "./listTasksApiV1AgentBoardsBoardIdTasksGetParams";
export * from "./listTasksApiV1BoardsBoardIdTasksGetParams"; export * from "./listTasksApiV1BoardsBoardIdTasksGetParams";
export * from "./listTaskTagsApiV1TagsGetParams";
export * from "./okResponse"; export * from "./okResponse";
export * from "./organizationActiveUpdate"; export * from "./organizationActiveUpdate";
export * from "./organizationBoardAccessRead"; export * from "./organizationBoardAccessRead";
@@ -180,9 +160,6 @@ export * from "./organizationUserRead";
export * from "./readyzReadyzGet200"; export * from "./readyzReadyzGet200";
export * from "./searchApiV1SoulsDirectorySearchGetParams"; export * from "./searchApiV1SoulsDirectorySearchGetParams";
export * from "./sendGatewaySessionMessageApiV1GatewaysSessionsSessionIdMessagePostParams"; export * from "./sendGatewaySessionMessageApiV1GatewaysSessionsSessionIdMessagePostParams";
export * from "./sendSessionMessageApiV1GatewaySessionsSessionIdMessagePost200";
export * from "./sendSessionMessageApiV1GatewaySessionsSessionIdMessagePostBody";
export * from "./sendSessionMessageApiV1GatewaySessionsSessionIdMessagePostParams";
export * from "./soulsDirectoryMarkdownResponse"; export * from "./soulsDirectoryMarkdownResponse";
export * from "./soulsDirectorySearchResponse"; export * from "./soulsDirectorySearchResponse";
export * from "./soulsDirectorySoulRef"; export * from "./soulsDirectorySoulRef";
@@ -195,6 +172,10 @@ export * from "./streamBoardMemoryApiV1BoardsBoardIdMemoryStreamGetParams";
export * from "./streamTaskCommentFeedApiV1ActivityTaskCommentsStreamGetParams"; export * from "./streamTaskCommentFeedApiV1ActivityTaskCommentsStreamGetParams";
export * from "./streamTasksApiV1BoardsBoardIdTasksStreamGetParams"; export * from "./streamTasksApiV1BoardsBoardIdTasksStreamGetParams";
export * from "./syncGatewayTemplatesApiV1GatewaysGatewayIdTemplatesSyncPostParams"; export * from "./syncGatewayTemplatesApiV1GatewaysGatewayIdTemplatesSyncPostParams";
export * from "./tagCreate";
export * from "./tagRead";
export * from "./tagRef";
export * from "./tagUpdate";
export * from "./taskCardRead"; export * from "./taskCardRead";
export * from "./taskCardReadStatus"; export * from "./taskCardReadStatus";
export * from "./taskCommentCreate"; export * from "./taskCommentCreate";
@@ -203,10 +184,6 @@ export * from "./taskCreate";
export * from "./taskCreateStatus"; export * from "./taskCreateStatus";
export * from "./taskRead"; export * from "./taskRead";
export * from "./taskReadStatus"; export * from "./taskReadStatus";
export * from "./taskTagCreate";
export * from "./taskTagRead";
export * from "./taskTagRef";
export * from "./taskTagUpdate";
export * from "./taskUpdate"; export * from "./taskUpdate";
export * from "./updateAgentApiV1AgentsAgentIdPatchParams"; export * from "./updateAgentApiV1AgentsAgentIdPatchParams";
export * from "./userRead"; export * from "./userRead";

View File

@@ -8,10 +8,10 @@ import type { ActivityEventRead } from "./activityEventRead";
export interface LimitOffsetPageTypeVarCustomizedActivityEventRead { export interface LimitOffsetPageTypeVarCustomizedActivityEventRead {
items: ActivityEventRead[]; items: ActivityEventRead[];
/** @minimum 0 */
total: number;
/** @minimum 1 */ /** @minimum 1 */
limit: number; limit: number;
/** @minimum 0 */ /** @minimum 0 */
offset: number; offset: number;
/** @minimum 0 */
total: number;
} }

View File

@@ -8,10 +8,10 @@ import type { ActivityTaskCommentFeedItemRead } from "./activityTaskCommentFeedI
export interface LimitOffsetPageTypeVarCustomizedActivityTaskCommentFeedItemRead { export interface LimitOffsetPageTypeVarCustomizedActivityTaskCommentFeedItemRead {
items: ActivityTaskCommentFeedItemRead[]; items: ActivityTaskCommentFeedItemRead[];
/** @minimum 0 */
total: number;
/** @minimum 1 */ /** @minimum 1 */
limit: number; limit: number;
/** @minimum 0 */ /** @minimum 0 */
offset: number; offset: number;
/** @minimum 0 */
total: number;
} }

View File

@@ -8,10 +8,10 @@ import type { AgentRead } from "./agentRead";
export interface LimitOffsetPageTypeVarCustomizedAgentRead { export interface LimitOffsetPageTypeVarCustomizedAgentRead {
items: AgentRead[]; items: AgentRead[];
/** @minimum 0 */
total: number;
/** @minimum 1 */ /** @minimum 1 */
limit: number; limit: number;
/** @minimum 0 */ /** @minimum 0 */
offset: number; offset: number;
/** @minimum 0 */
total: number;
} }

View File

@@ -8,10 +8,10 @@ import type { ApprovalRead } from "./approvalRead";
export interface LimitOffsetPageTypeVarCustomizedApprovalRead { export interface LimitOffsetPageTypeVarCustomizedApprovalRead {
items: ApprovalRead[]; items: ApprovalRead[];
/** @minimum 0 */
total: number;
/** @minimum 1 */ /** @minimum 1 */
limit: number; limit: number;
/** @minimum 0 */ /** @minimum 0 */
offset: number; offset: number;
/** @minimum 0 */
total: number;
} }

View File

@@ -8,10 +8,10 @@ import type { BoardGroupMemoryRead } from "./boardGroupMemoryRead";
export interface LimitOffsetPageTypeVarCustomizedBoardGroupMemoryRead { export interface LimitOffsetPageTypeVarCustomizedBoardGroupMemoryRead {
items: BoardGroupMemoryRead[]; items: BoardGroupMemoryRead[];
/** @minimum 0 */
total: number;
/** @minimum 1 */ /** @minimum 1 */
limit: number; limit: number;
/** @minimum 0 */ /** @minimum 0 */
offset: number; offset: number;
/** @minimum 0 */
total: number;
} }

View File

@@ -8,10 +8,10 @@ import type { BoardGroupRead } from "./boardGroupRead";
export interface LimitOffsetPageTypeVarCustomizedBoardGroupRead { export interface LimitOffsetPageTypeVarCustomizedBoardGroupRead {
items: BoardGroupRead[]; items: BoardGroupRead[];
/** @minimum 0 */
total: number;
/** @minimum 1 */ /** @minimum 1 */
limit: number; limit: number;
/** @minimum 0 */ /** @minimum 0 */
offset: number; offset: number;
/** @minimum 0 */
total: number;
} }

Some files were not shown because too many files have changed in this diff Show More