openapi: 3.0.3 info: title: Chat Switchboard API description: 'Multi-provider AI chat platform with team workspaces, workflow automation, and extensibility via Starlark packages. ## Authentication Three authentication modes, selected by the `AUTH_MODE` environment variable. All three produce the same JWT-based session — downstream middleware is auth-mode-agnostic. **Builtin (default):** Username/password via `POST /api/v1/auth/login`. Include the returned token as `Authorization: Bearer `. **OIDC:** Authorization code flow via `GET /api/v1/auth/oidc/login`. Compatible with any OpenID Connect provider (tested with Keycloak). **mTLS:** Mutual TLS via reverse proxy headers. No explicit login — user identity is extracted from the client certificate on every request. ## WebSocket Real-time events are delivered over WebSocket at `/ws`. Obtain a single-use ticket (30s TTL) via `POST /api/v1/ws/ticket` and connect with `?ticket=`. Cross-pod safe (v0.32.0). ## Response Conventions - **List endpoints** return `{ "data": [...] }` with an array under `data`. - **Single-object endpoints** return the object directly. - **Composite endpoints** use named keys (e.g. `{ "settings": {...} }`). - **Errors** return `{ "error": "description" }`. ' version: ${VERSION} contact: name: Chat Switchboard servers: - url: / description: Current instance tags: - name: Auth description: Authentication and session management - name: Profile description: User profile, preferences, and credentials - name: Channels description: Chat channel CRUD and messaging - name: Messages description: Message CRUD, editing, regeneration, and tree navigation - name: Completions description: AI completion requests (streaming and non-streaming) - name: Personas description: AI persona CRUD, system prompts, tool config, KB bindings - name: Models description: Model catalog, preferences, and capability management - name: Providers description: Provider config CRUD (BYOK) and model fetching - name: Notes description: Obsidian-style notes with wikilinks, backlinks, and graph - name: Knowledge Bases description: Document ingestion, embedding, and semantic search - name: Memory description: Conversation memory extraction, review, and compaction - name: Projects description: Project containers for channels, KBs, notes, and files - name: Workspaces description: File workspaces with git integration - name: Tasks description: Scheduled and on-demand task execution (Go + Starlark) - name: Workflows description: Multi-stage workflow definitions, instances, and assignments - name: Teams description: Team CRUD, membership, roles, and scoped resources - name: Extensions description: Package install, permissions, secrets, and lifecycle - name: Surfaces description: Extension surface mounting and management - name: Notifications description: User notification list, preferences, and read state - name: Files description: File upload, download, and metadata - name: Health description: System health, readiness, and metrics - name: Admin description: Platform administration (requires admin role) - name: Usage description: Token usage and cost tracking - name: WebSocket description: Real-time event delivery - name: Data Portability description: Export, import, GDPR compliance paths: /api/v1/auth/register: post: tags: - Auth summary: Register a new user description: 'Builtin auth only. Gated by `allow_registration` policy. A unique `handle` is auto-generated from `username`. ' requestBody: required: true content: application/json: schema: type: object required: - username - password - email properties: username: type: string minLength: 3 password: type: string minLength: 8 maxLength: 128 email: type: string format: email display_name: type: string example: username: jdoe password: s3cure-p@ss email: jdoe@example.com display_name: Jane Doe responses: '201': description: User created and logged in content: application/json: schema: $ref: '#/components/schemas/AuthResponse' '400': $ref: '#/components/responses/BadRequest' '403': description: Registration disabled by policy '409': description: Username or email already taken '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/auth/login: post: tags: - Auth summary: Authenticate and obtain JWT tokens description: 'Builtin auth. Accepts `login` (username or email) and `password`. Returns an access token (15m TTL) and a refresh token (7d TTL). ' requestBody: required: true content: application/json: schema: type: object required: - login - password properties: login: type: string description: Username or email address password: type: string example: login: jdoe password: s3cure-p@ss responses: '200': description: Login successful content: application/json: schema: $ref: '#/components/schemas/AuthResponse' '401': description: Invalid credentials '403': description: Account inactive (awaiting admin approval) '429': $ref: '#/components/responses/RateLimited' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/auth/refresh: post: tags: - Auth summary: Refresh an expired access token description: 'Exchanges a valid refresh token for a new token pair. The old refresh token is invalidated (rotation). ' requestBody: required: true content: application/json: schema: type: object required: - refresh_token properties: refresh_token: type: string responses: '200': description: New token pair content: application/json: schema: $ref: '#/components/schemas/AuthResponse' '401': description: Invalid or expired refresh token '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/auth/logout: post: tags: - Auth summary: Invalidate the current session description: Revokes the provided refresh token. security: - bearerAuth: [] requestBody: content: application/json: schema: type: object properties: refresh_token: type: string responses: '200': description: Logged out content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/auth/oidc/login: get: tags: - Auth summary: Initiate OIDC authorization code flow description: 'Redirects to the configured OIDC identity provider. Stores `state` and `nonce` for CSRF protection. Only available when `AUTH_MODE=oidc`. ' responses: '302': description: Redirect to IdP authorization endpoint '500': description: OIDC not configured or discovery failed '200': description: Success content: application/json: schema: type: object /api/v1/auth/oidc/callback: get: tags: - Auth summary: OIDC authorization code callback description: 'Receives the authorization code from the IdP, exchanges it for tokens, validates the ID token via JWKS, and auto-provisions the user on first login. Returns an HTML fragment that passes tokens to the frontend via URL fragment. ' parameters: - name: code in: query required: true schema: type: string - name: state in: query required: true schema: type: string responses: '200': description: HTML with embedded tokens content: text/html: schema: type: string '400': description: Invalid state or code '500': description: Token exchange or validation failed /api/v1/profile: get: tags: - Profile summary: Get current user's profile security: - bearerAuth: [] responses: '200': description: User profile content: application/json: schema: $ref: '#/components/schemas/UserProfile' '401': $ref: '#/components/responses/Unauthorized' put: tags: - Profile summary: Update profile fields description: 'Partial update — only provided fields are changed. Supports `display_name` and `email`. ' security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object properties: display_name: type: string email: type: string format: email example: display_name: Jane D. email: jane@newdomain.com responses: '200': description: Updated profile content: application/json: schema: $ref: '#/components/schemas/UserProfile' '409': $ref: '#/components/responses/Conflict' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' /api/v1/profile/password: post: tags: - Profile summary: Change password description: 'Builtin auth only. Validates current password, then updates. Re-wraps the User Encryption Key (UEK) so BYOK-encrypted provider keys remain accessible. ' security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: - current_password - new_password properties: current_password: type: string new_password: type: string minLength: 8 maxLength: 128 responses: '200': description: Password updated content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': description: Current password incorrect '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/profile/avatar: post: tags: - Profile summary: Upload avatar description: 'Accepts a base64 data URI or raw base64 string. The server decodes, resizes to 128x128 PNG, and stores as a data URI. Max input 2 MB. ' security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: - image properties: image: type: string description: Base64 data URI or raw base64 string responses: '200': description: Avatar stored content: application/json: schema: type: object properties: avatar: type: string description: Data URI of the stored avatar '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' delete: tags: - Profile summary: Remove avatar security: - bearerAuth: [] responses: '200': description: Avatar removed content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' /api/v1/settings: get: tags: - Profile summary: Get user preferences description: 'Returns user-level preferences wrapped in a `settings` key. Value is `{}` if the user has never saved preferences. ' security: - bearerAuth: [] responses: '200': description: User settings content: application/json: schema: type: object required: - settings properties: settings: type: object additionalProperties: true example: settings: theme: dark editor_keybindings: vim default_model: claude-sonnet-4-5 '401': $ref: '#/components/responses/Unauthorized' put: tags: - Profile summary: Update user preferences description: 'Shallow merge — incoming keys overwrite existing, unmentioned keys are preserved. Returns the full merged settings object. ' security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object additionalProperties: true example: theme: light font_size: 14 responses: '200': description: Updated settings content: application/json: schema: type: object required: - settings properties: settings: type: object additionalProperties: true '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' /api/v1/settings/public: get: tags: - Profile summary: Get public platform settings description: 'Returns platform-level settings visible to authenticated users (e.g. allowed registration, default model, branding). ' security: - bearerAuth: [] responses: '200': description: Public settings content: application/json: schema: type: object additionalProperties: true '401': $ref: '#/components/responses/Unauthorized' /api/v1/channels: get: tags: - Channels summary: List channels accessible to the current user security: - bearerAuth: [] parameters: - name: type in: query schema: type: string enum: - direct - group - workflow - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/PerPage' responses: '200': description: Channel list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Channel' page: type: integer per_page: type: integer total: type: integer total_pages: type: integer '401': $ref: '#/components/responses/Unauthorized' post: tags: - Channels summary: Create a new channel security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object properties: title: type: string type: type: string enum: - direct - group default: direct system_prompt: type: string responses: '201': description: Channel created content: application/json: schema: $ref: '#/components/schemas/Channel' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/channels/{id}: get: tags: - Channels summary: Get channel details security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Channel details content: application/json: schema: $ref: '#/components/schemas/Channel' '404': $ref: '#/components/responses/NotFound' '401': $ref: '#/components/responses/Unauthorized' put: tags: - Channels summary: Update channel settings security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: required: true content: application/json: schema: type: object properties: title: type: string system_prompt: type: string ai_mode: type: string enum: - auto - false - mention_only responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Channel' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Channels summary: Delete or leave a channel description: | Owner: deletes (or archives for retention when TTL > 0). Non-owner participant: leaves the channel. When retention_ttl_days > 0, all channels are archived and purged after TTL. Only Personal (BYOK) provider channels are exempt and always immediately deleted. security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted, archived for retention, or left channel content: application/json: schema: type: object properties: message: type: string enum: - channel deleted - channel archived for retention - left channel purge_after: type: string format: date-time description: Only present when archived for retention '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/chat/completions: post: tags: - Completions summary: Send a message and get an AI completion description: 'Streams SSE events by default. Set `stream: false` for a single JSON response. Supports tool calling, @mentions, multi-model routing, and workflow integration. ' security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CompletionRequest' responses: '200': description: '**Streaming:** SSE events (`data: {"content":"..."}`, `data: [DONE]`). **Non-streaming:** OpenAI-compatible JSON response. ' content: text/event-stream: schema: type: string application/json: schema: $ref: '#/components/schemas/CompletionResponse' '400': $ref: '#/components/responses/BadRequest' '429': $ref: '#/components/responses/RateLimited' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /health: get: tags: - Health summary: Basic health check description: Public, no auth required. Also mirrored at `/api/v1/health`. responses: '200': description: System status content: application/json: schema: type: object properties: status: type: string example: ok version: type: string database: type: boolean schema_version: type: integer /healthz/live: get: tags: - Health summary: Kubernetes liveness probe responses: '200': description: Process alive content: application/json: schema: type: object /healthz/ready: get: tags: - Health summary: Kubernetes readiness probe description: Pings the database with a 2s timeout. Returns 503 if unreachable. responses: '200': description: Ready to serve traffic content: application/json: schema: type: object '503': description: Database unavailable /metrics: get: tags: - Health summary: Prometheus metrics endpoint description: 'Returns all `switchboard_*` metrics in Prometheus text exposition format. Includes HTTP request latency, WebSocket connections, completion tokens, DB pool stats, and provider health gauges. ' responses: '200': description: Prometheus text format content: text/plain: schema: type: string /api/v1/ws/ticket: post: tags: - WebSocket summary: Obtain a WebSocket connection ticket description: 'Returns a single-use ticket (30s TTL) for authenticating the WebSocket upgrade at `/ws?ticket=`. Stored in PG for cross-pod validation (v0.32.0). ' security: - bearerAuth: [] responses: '200': description: Ticket issued content: application/json: schema: type: object properties: ticket: type: string '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/export: post: tags: - Data Portability summary: Convert markdown to PDF or DOCX description: 'Uses pandoc to convert markdown content to the requested format. Returns the binary file with appropriate Content-Type. ' security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: - content - format properties: content: type: string description: Markdown content to convert format: type: string enum: - pdf - docx filename: type: string description: Output filename (without extension) responses: '200': description: Converted document content: application/pdf: schema: type: string format: binary application/vnd.openxmlformats-officedocument.wordprocessingml.document: schema: type: string format: binary '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/channels/{id}/mark-read: post: tags: - Channels summary: Mark channel as read security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Read cursor updated content: application/json: schema: $ref: '#/components/schemas/Channel' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/channels/{id}/typing: post: tags: - Channels summary: Broadcast typing indicator security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Typing event sent content: application/json: schema: $ref: '#/components/schemas/Channel' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/channels/{id}/summarize: post: tags: - Channels summary: Trigger conversation summarization security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Summary created content: application/json: schema: type: object properties: message: type: string summary_id: type: string format: uuid '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/channels/{id}/generate-title: post: tags: - Channels summary: Auto-generate channel title from first exchange security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Title generated content: application/json: schema: type: object properties: title: type: string '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/channels/{id}/path: get: tags: - Messages summary: Get active message path (tree walk) description: Returns messages along the active branch from root to leaf. security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Active message path content: application/json: schema: type: object properties: messages: type: array items: $ref: '#/components/schemas/Message' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/channels/{id}/messages: get: tags: - Messages summary: List all messages (flat, all branches) description: Debug/legacy endpoint. Returns every message regardless of branch. security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/PerPage' responses: '200': description: All messages in channel content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Message' page: type: integer per_page: type: integer total: type: integer total_pages: type: integer '404': $ref: '#/components/responses/NotFound' '401': $ref: '#/components/responses/Unauthorized' post: tags: - Messages summary: Create a message security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: required: true content: application/json: schema: type: object required: - role - content properties: role: type: string enum: - user - system content: type: string parent_id: type: string format: uuid nullable: true attachments: type: array items: type: string format: uuid responses: '201': description: Message created content: application/json: schema: $ref: '#/components/schemas/Message' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/channels/{id}/messages/{msgId}/edit: post: tags: - Messages summary: Edit a message (creates sibling branch) security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: msgId in: path required: true schema: type: string format: uuid requestBody: required: true content: application/json: schema: type: object required: - content properties: content: type: string responses: '201': description: Sibling message created content: application/json: schema: $ref: '#/components/schemas/Message' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/channels/{id}/messages/{msgId}/regenerate: post: tags: - Messages summary: Regenerate an assistant response (creates sibling) security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: msgId in: path required: true schema: type: string format: uuid requestBody: content: application/json: schema: type: object properties: model: type: string provider_config_id: type: string format: uuid responses: '200': description: Streaming regeneration started content: application/json: schema: $ref: '#/components/schemas/Message' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/channels/{id}/messages/{msgId}/siblings: get: tags: - Messages summary: List siblings at a branch point security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: msgId in: path required: true schema: type: string format: uuid responses: '200': description: Sibling messages content: application/json: schema: type: object properties: siblings: type: array items: $ref: '#/components/schemas/Message' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/channels/{id}/cursor: put: tags: - Messages summary: Switch active branch security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: required: true content: application/json: schema: type: object required: - active_leaf_id properties: active_leaf_id: type: string format: uuid responses: '200': description: Cursor updated content: application/json: schema: $ref: '#/components/schemas/Message' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/tools: get: tags: - Completions summary: List available tools security: - bearerAuth: [] responses: '200': description: Tool definitions content: application/json: schema: type: object properties: tools: type: array items: $ref: '#/components/schemas/ToolDef' '401': $ref: '#/components/responses/Unauthorized' /api/v1/channels/{id}/models: get: tags: - Channels summary: List channel model roster security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Channel model roster content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Channel' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' post: tags: - Channels summary: Add model to channel roster security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: required: true content: application/json: schema: type: object required: - model - provider_config_id properties: model: type: string provider_config_id: type: string format: uuid display_name: type: string responses: '201': description: Model added to roster content: application/json: schema: $ref: '#/components/schemas/Channel' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/channels/{id}/models/{modelId}: patch: tags: - Channels summary: Update channel model entry security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: modelId in: path required: true schema: type: string format: uuid responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Channel' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Channels summary: Remove model from channel roster security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: modelId in: path required: true schema: type: string format: uuid responses: '200': description: Removed content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/channels/{id}/participants: get: tags: - Channels summary: List channel participants security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Participant list content: application/json: schema: type: object properties: participants: type: array items: $ref: '#/components/schemas/Participant' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' post: tags: - Channels summary: Add participant to channel security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: required: true content: application/json: schema: type: object required: - participant_type - participant_id properties: participant_type: type: string enum: - user - persona participant_id: type: string format: uuid role: type: string enum: - member - observer default: member responses: '201': description: Participant added content: application/json: schema: $ref: '#/components/schemas/Channel' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/channels/{id}/participants/{participantId}: patch: tags: - Channels summary: Update participant role security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: participantId in: path required: true schema: type: string format: uuid requestBody: content: application/json: schema: type: object properties: role: type: string enum: - member - observer responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Channel' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Channels summary: Remove participant security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: participantId in: path required: true schema: type: string format: uuid responses: '200': description: Removed content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/channels/{id}/knowledge-bases: get: tags: - Channels - Knowledge Bases summary: List KB bindings for channel security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Channel KB bindings content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Channel' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Channels - Knowledge Bases summary: Set channel KB bindings (replace all) security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: required: true content: application/json: schema: type: object required: - kb_ids properties: kb_ids: type: array items: type: string format: uuid responses: '200': description: Bindings updated content: application/json: schema: $ref: '#/components/schemas/Channel' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/channels/{id}/files: post: tags: - Files summary: Upload file to channel security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: required: true content: multipart/form-data: schema: type: object properties: file: type: string format: binary responses: '201': description: File uploaded content: application/json: schema: $ref: '#/components/schemas/FileObject' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' get: tags: - Files summary: List files in channel security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: origin in: query schema: type: string enum: - user_upload - tool_output - system responses: '200': description: Channel files content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/FileObject' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/files: get: tags: - Files summary: List all files owned by user security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/PerPage' responses: '200': description: User file list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/FileObject' '401': $ref: '#/components/responses/Unauthorized' /api/v1/files/{id}: get: tags: - Files summary: Get file metadata security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: File metadata content: application/json: schema: $ref: '#/components/schemas/FileObject' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Files summary: Delete file security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/files/{id}/download: get: tags: - Files summary: Download file security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: File content content: application/octet-stream: schema: type: string format: binary '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/messages/{id}/files: get: tags: - Files summary: List files attached to a message security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Message files content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/FileObject' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/folders: get: tags: - Channels summary: List chat folders security: - bearerAuth: [] responses: '200': description: User folders content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Channel' '401': $ref: '#/components/responses/Unauthorized' post: tags: - Channels summary: Create folder security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: - name properties: name: type: string sort_order: type: integer default: 0 responses: '201': description: Folder created content: application/json: schema: $ref: '#/components/schemas/Channel' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/folders/{id}: put: tags: - Channels summary: Update folder security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Channel' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Channels summary: Delete folder (chats become unfiled) security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/presence/heartbeat: post: tags: - Channels summary: Send presence heartbeat security: - bearerAuth: [] responses: '200': description: Heartbeat recorded content: application/json: schema: $ref: '#/components/schemas/Channel' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/presence: get: tags: - Channels summary: Query user presence status security: - bearerAuth: [] parameters: - name: users in: query required: true schema: type: string description: Comma-separated user UUIDs (max 100) responses: '200': description: Presence map content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Channel' '401': $ref: '#/components/responses/Unauthorized' /api/v1/users/search: get: tags: - Channels summary: Search users (for DM creation and participant picker) security: - bearerAuth: [] parameters: - name: q in: query required: true schema: type: string responses: '200': description: Matching users (max 20) content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Channel' '401': $ref: '#/components/responses/Unauthorized' /api/v1/personas: get: tags: - Personas summary: List user's personal personas security: - bearerAuth: [] responses: '200': description: Personal personas content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Persona' '401': $ref: '#/components/responses/Unauthorized' post: tags: - Personas summary: Create personal persona security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PersonaInput' responses: '201': description: Persona created content: application/json: schema: $ref: '#/components/schemas/Persona' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/personas/{id}: put: tags: - Personas summary: Update personal persona security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Persona' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Personas summary: Delete personal persona security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/personas/{id}/avatar: post: tags: - Personas summary: Upload persona avatar security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: content: application/json: schema: type: object properties: image: type: string responses: '200': description: Avatar uploaded content: application/json: schema: $ref: '#/components/schemas/Persona' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' delete: tags: - Personas summary: Delete persona avatar security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Avatar removed content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/personas/{id}/knowledge-bases: get: tags: - Personas - Knowledge Bases summary: Get persona KB bindings security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Persona KB bindings content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Persona' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Personas - Knowledge Bases summary: Set persona KB bindings (replace all) security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: content: application/json: schema: type: object properties: kb_ids: type: array items: type: string format: uuid auto_search: type: object additionalProperties: type: boolean responses: '200': description: Bindings updated content: application/json: schema: $ref: '#/components/schemas/Persona' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/personas/{id}/tool-grants: get: tags: - Personas summary: Get persona tool grants security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Tool grant list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Persona' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Personas summary: Set persona tool grants security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: content: application/json: schema: type: object properties: tool_names: type: array items: type: string responses: '200': description: Grants updated content: application/json: schema: $ref: '#/components/schemas/Persona' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/persona-groups: get: tags: - Personas summary: List persona groups security: - bearerAuth: [] responses: '200': description: Persona group list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Persona' '401': $ref: '#/components/responses/Unauthorized' post: tags: - Personas summary: Create persona group security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: - name properties: name: type: string description: type: string responses: '201': description: Group created content: application/json: schema: $ref: '#/components/schemas/Persona' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/persona-groups/{id}: get: tags: - Personas summary: Get persona group with members security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Group with members content: application/json: schema: $ref: '#/components/schemas/Persona' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Personas summary: Update persona group security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Persona' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Personas summary: Delete persona group security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/persona-groups/{id}/members: post: tags: - Personas summary: Add persona to group security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: content: application/json: schema: type: object required: - persona_id properties: persona_id: type: string format: uuid is_leader: type: boolean default: false responses: '201': description: Member added content: application/json: schema: $ref: '#/components/schemas/Persona' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/persona-groups/{id}/members/{memberId}: delete: tags: - Personas summary: Remove persona from group security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: memberId in: path required: true schema: type: string format: uuid responses: '200': description: Removed content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/models/enabled: get: tags: - Models summary: List models available to current user description: Primary endpoint for model selectors. Returns models, personas, and default. security: - bearerAuth: [] responses: '200': description: Available models with default content: application/json: schema: type: object properties: data: type: array items: type: object default_model: type: string '401': $ref: '#/components/responses/Unauthorized' /api/v1/models/preferences: get: tags: - Models summary: Get user model preferences security: - bearerAuth: [] responses: '200': description: User model preferences content: application/json: schema: type: object properties: data: type: array items: type: object '401': $ref: '#/components/responses/Unauthorized' put: tags: - Models summary: Set model preference (upsert) security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: - model_id - provider_config_id properties: model_id: type: string provider_config_id: type: string format: uuid hidden: type: boolean sort_order: type: integer responses: '200': description: Preference updated content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' /api/v1/models/preferences/bulk: post: tags: - Models summary: Bulk set model visibility security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: - entries - hidden properties: entries: type: array items: type: object properties: model_id: type: string provider_config_id: type: string format: uuid hidden: type: boolean responses: '200': description: Preferences updated content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/api-configs: get: tags: - Providers summary: List user's BYOK provider configs security: - bearerAuth: [] responses: '200': description: Provider configs (keys redacted) content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/ProviderConfig' '401': $ref: '#/components/responses/Unauthorized' post: tags: - Providers summary: Create BYOK provider config security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ProviderConfigInput' responses: '201': description: Config created content: application/json: schema: $ref: '#/components/schemas/ProviderConfig' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/api-configs/{id}: get: tags: - Providers summary: Get provider config (key redacted) security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Provider config content: application/json: schema: $ref: '#/components/schemas/ProviderConfig' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Providers summary: Update provider config security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/ProviderConfig' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Providers summary: Delete provider config security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/api-configs/{id}/models: get: tags: - Providers summary: List models for a provider config security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Model catalog entries content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/ProviderConfig' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/api-configs/{id}/models/fetch: post: tags: - Providers summary: Sync models from provider API security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Models synced content: application/json: schema: $ref: '#/components/schemas/ProviderConfig' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/notes: get: tags: - Notes summary: List notes (paginated) security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/PerPage' - name: folder in: query schema: type: string responses: '200': description: Note list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Note' '401': $ref: '#/components/responses/Unauthorized' post: tags: - Notes summary: Create note security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: - title properties: title: type: string content: type: string folder: type: string responses: '201': description: Note created content: application/json: schema: $ref: '#/components/schemas/Note' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/notes/{id}: get: tags: - Notes summary: Get note security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Full note object content: application/json: schema: $ref: '#/components/schemas/Note' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Notes summary: Update note security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Note' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Notes summary: Delete note security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/notes/{id}/backlinks: get: tags: - Notes summary: Get notes that link to this note security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Backlink list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Note' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/notes/search: get: tags: - Notes summary: Full-text search notes security: - bearerAuth: [] parameters: - name: q in: query required: true schema: type: string responses: '200': description: Search results with highlights content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Note' '401': $ref: '#/components/responses/Unauthorized' /api/v1/notes/search-titles: get: tags: - Notes summary: Title search (for wikilink autocomplete) security: - bearerAuth: [] parameters: - name: q in: query required: true schema: type: string responses: '200': description: Matching titles content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Note' '401': $ref: '#/components/responses/Unauthorized' /api/v1/notes/graph: get: tags: - Notes summary: Get note graph topology security: - bearerAuth: [] responses: '200': description: Graph with nodes, edges, and unresolved links content: application/json: schema: type: object properties: nodes: type: array items: type: object properties: id: type: string format: uuid title: type: string edges: type: array items: type: object properties: source: type: string format: uuid target: type: string format: uuid unresolved: type: array items: type: object properties: source: type: string format: uuid target_title: type: string '401': $ref: '#/components/responses/Unauthorized' /api/v1/notes/folders: get: tags: - Notes summary: List distinct note folder names security: - bearerAuth: [] responses: '200': description: Folder list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Note' '401': $ref: '#/components/responses/Unauthorized' /api/v1/notes/bulk-delete: post: tags: - Notes summary: Bulk delete notes security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: - ids properties: ids: type: array items: type: string format: uuid responses: '200': description: Notes deleted content: application/json: schema: $ref: '#/components/schemas/Note' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/knowledge-bases: get: tags: - Knowledge Bases summary: List knowledge bases security: - bearerAuth: [] responses: '200': description: KB list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/KnowledgeBase' '401': $ref: '#/components/responses/Unauthorized' post: tags: - Knowledge Bases summary: Create knowledge base security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: - name properties: name: type: string description: type: string scope: type: string enum: - personal - team - global default: personal team_id: type: string format: uuid responses: '201': description: KB created content: application/json: schema: $ref: '#/components/schemas/KnowledgeBase' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/knowledge-bases/{id}: get: tags: - Knowledge Bases summary: Get knowledge base security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: KB object content: application/json: schema: $ref: '#/components/schemas/KnowledgeBase' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Knowledge Bases summary: Update knowledge base security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/KnowledgeBase' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Knowledge Bases summary: Delete knowledge base security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/knowledge-bases/{id}/documents: get: tags: - Knowledge Bases summary: List KB documents security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Document list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/KnowledgeBase' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' post: tags: - Knowledge Bases summary: Upload document to KB security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: required: true content: multipart/form-data: schema: type: object properties: file: type: string format: binary responses: '202': description: Document accepted for processing content: application/json: schema: type: object '412': description: No embedding model configured '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/knowledge-bases/{id}/documents/{docId}/status: get: tags: - Knowledge Bases summary: Get document processing status security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: docId in: path required: true schema: type: string format: uuid responses: '200': description: Document status content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/KnowledgeBase' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/knowledge-bases/{id}/documents/{docId}: delete: tags: - Knowledge Bases summary: Delete KB document security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: docId in: path required: true schema: type: string format: uuid responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/knowledge-bases/{id}/search: post: tags: - Knowledge Bases summary: Semantic search within KB security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: required: true content: application/json: schema: type: object required: - query properties: query: type: string limit: type: integer default: 5 maximum: 20 threshold: type: number default: 0.3 responses: '200': description: Search results with similarity scores content: application/json: schema: $ref: '#/components/schemas/KnowledgeBase' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/knowledge-bases/{id}/rebuild: post: tags: - Knowledge Bases summary: Re-chunk and re-embed all documents security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '202': description: Rebuild started content: application/json: schema: type: object properties: message: type: string total_docs: type: integer rebuilding: type: integer skipped: type: integer '503': description: Ingestion pipeline not configured '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/knowledge-bases-discoverable: get: tags: - Knowledge Bases summary: List discoverable KBs (for picker UI) security: - bearerAuth: [] responses: '200': description: Discoverable KB list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/KnowledgeBase' '401': $ref: '#/components/responses/Unauthorized' /api/v1/knowledge-bases/{id}/discoverable: put: tags: - Knowledge Bases summary: Toggle KB discoverability security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: content: application/json: schema: type: object properties: discoverable: type: boolean responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/KnowledgeBase' '403': description: Only owner or admin can change '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/memories: get: tags: - Memory summary: List user's memories security: - bearerAuth: [] parameters: - name: status in: query schema: type: string enum: - active - pending_review - archived default: active - name: query in: query schema: type: string responses: '200': description: Memory list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Memory' '401': $ref: '#/components/responses/Unauthorized' /api/v1/memories/{id}: put: tags: - Memory summary: Update memory security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: content: application/json: schema: type: object properties: key: type: string value: type: string confidence: type: number responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Memory' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Memory summary: Delete memory security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/memories/{id}/approve: post: tags: - Memory summary: Approve a pending memory security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Approved content: application/json: schema: $ref: '#/components/schemas/Memory' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/memories/{id}/reject: post: tags: - Memory summary: Reject a pending memory security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Rejected content: application/json: schema: $ref: '#/components/schemas/Memory' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/memories/count: get: tags: - Memory summary: Get memory counts by status security: - bearerAuth: [] responses: '200': description: Memory counts content: application/json: schema: type: object properties: active: type: integer pending: type: integer '401': $ref: '#/components/responses/Unauthorized' /api/v1/memories/compact: post: tags: - Memory summary: Compact memories security: - bearerAuth: [] responses: '200': description: Compaction triggered content: application/json: schema: $ref: '#/components/schemas/Memory' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/projects: get: tags: - Projects summary: List projects security: - bearerAuth: [] parameters: - name: include_archived in: query schema: type: boolean default: false responses: '200': description: Project list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Project' '401': $ref: '#/components/responses/Unauthorized' post: tags: - Projects summary: Create project security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: - name properties: name: type: string maxLength: 200 description: type: string color: type: string icon: type: string responses: '201': description: Project created content: application/json: schema: $ref: '#/components/schemas/Project' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/projects/{id}: get: tags: - Projects summary: Get project security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Project object content: application/json: schema: $ref: '#/components/schemas/Project' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Projects summary: Update project security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Project' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Projects summary: Delete project security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/projects/{id}/channels: get: tags: - Projects summary: List project channels security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Project channels content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Channel' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' post: tags: - Projects summary: Add channel to project security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: content: application/json: schema: type: object required: - channel_id properties: channel_id: type: string format: uuid position: type: integer responses: '200': description: Channel added content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' /api/v1/projects/{id}/channels/{channelId}: delete: tags: - Projects summary: Remove channel from project security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: channelId in: path required: true schema: type: string format: uuid responses: '200': description: Removed content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/projects/{id}/channels/reorder: put: tags: - Projects summary: Reorder project channels security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: content: application/json: schema: type: object properties: channel_ids: type: array items: type: string format: uuid responses: '200': description: Reordered content: application/json: schema: $ref: '#/components/schemas/Project' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/projects/{id}/knowledge-bases: get: tags: - Projects - Knowledge Bases summary: List project KB associations security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Project KBs content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Project' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' post: tags: - Projects - Knowledge Bases summary: Add KB to project security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: content: application/json: schema: type: object required: - kb_id properties: kb_id: type: string format: uuid auto_search: type: boolean default: false responses: '201': description: KB added content: application/json: schema: $ref: '#/components/schemas/Project' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/projects/{id}/knowledge-bases/{kbId}: delete: tags: - Projects - Knowledge Bases summary: Remove KB from project security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: kbId in: path required: true schema: type: string format: uuid responses: '200': description: Removed content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/projects/{id}/notes: get: tags: - Projects - Notes summary: List project note associations security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Project notes content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Project' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' post: tags: - Projects - Notes summary: Add note to project security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: content: application/json: schema: type: object required: - note_id properties: note_id: type: string format: uuid responses: '201': description: Note added content: application/json: schema: $ref: '#/components/schemas/Project' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/projects/{id}/notes/{noteId}: delete: tags: - Projects - Notes summary: Remove note from project security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: noteId in: path required: true schema: type: string format: uuid responses: '200': description: Removed content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/projects/{id}/files: get: tags: - Projects - Files summary: List project files (workspace-backed) description: Returns workspace files for the project. Auto-creates workspace on first upload. security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: path in: query schema: type: string description: Directory path to list (empty = root) - name: recursive in: query schema: type: string default: 'true' description: Include subdirectories responses: '200': description: Project files content: application/json: schema: type: object properties: files: type: array items: type: object properties: id: type: string path: type: string is_directory: type: boolean content_type: type: string size_bytes: type: integer count: type: integer '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' post: tags: - Projects - Files summary: Upload file to project workspace description: Uploads a file to the project's workspace. Auto-creates workspace on first upload. security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: path in: query schema: type: string description: Subdirectory path to upload into requestBody: content: multipart/form-data: schema: type: object properties: file: type: string format: binary responses: '201': description: File uploaded content: application/json: schema: type: object properties: path: type: string filename: type: string content_type: type: string size_bytes: type: integer '413': description: File too large or workspace quota exceeded '401': $ref: '#/components/responses/Unauthorized' delete: tags: - Projects - Files summary: Delete project file security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: path in: query required: true schema: type: string - name: recursive in: query schema: type: string responses: '200': description: File deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '401': $ref: '#/components/responses/Unauthorized' /api/v1/projects/{id}/files/download: get: tags: - Projects - Files summary: Download project file description: Streams raw file content with Content-Disposition attachment header. security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: path in: query required: true schema: type: string responses: '200': description: File content content: application/octet-stream: schema: type: string format: binary '404': $ref: '#/components/responses/NotFound' /api/v1/projects/{id}/files/mkdir: post: tags: - Projects - Files summary: Create directory in project workspace security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: content: application/json: schema: type: object properties: path: type: string required: - path responses: '201': description: Directory created content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '401': $ref: '#/components/responses/Unauthorized' /api/v1/projects/{id}/archive/upload: post: tags: - Projects - Files summary: Upload and extract archive into project workspace description: Accepts .zip or .tar.gz, extracts contents into workspace root. security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: content: multipart/form-data: schema: type: object properties: file: type: string format: binary responses: '200': description: Archive extracted content: application/json: schema: type: object properties: ok: type: boolean files_extracted: type: integer '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' /api/v1/projects/{id}/archive/download: get: tags: - Projects - Files summary: Download all project files as archive security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: format in: query schema: type: string enum: [zip, tar.gz, tgz] default: zip responses: '200': description: Archive download content: application/zip: schema: type: string format: binary '404': $ref: '#/components/responses/NotFound' /api/v1/workspaces: get: tags: - Workspaces summary: List workspaces security: - bearerAuth: [] responses: '200': description: Workspace list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workspace' '401': $ref: '#/components/responses/Unauthorized' post: tags: - Workspaces summary: Create workspace security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: - name properties: name: type: string owner_type: type: string enum: - user - project - channel - team owner_id: type: string format: uuid responses: '201': description: Workspace created content: application/json: schema: $ref: '#/components/schemas/Workspace' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/workspaces/default: get: tags: - Workspaces summary: Get or create user's default workspace description: Returns the current user's personal "My Files" workspace, auto-creating it on first access. Idempotent. security: - bearerAuth: [] responses: '200': description: Default workspace content: application/json: schema: $ref: '#/components/schemas/Workspace' '401': $ref: '#/components/responses/Unauthorized' /api/v1/workspaces/{id}: get: tags: - Workspaces summary: Get workspace security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Workspace object content: application/json: schema: $ref: '#/components/schemas/Workspace' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' patch: tags: - Workspaces summary: Update workspace security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Workspace' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Workspaces summary: Delete workspace security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/workspaces/{id}/files: get: tags: - Workspaces summary: List workspace files security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: File tree content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workspace' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/workspaces/{id}/files/read: get: tags: - Workspaces summary: Read file content security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: path in: query required: true schema: type: string responses: '200': description: File content content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workspace' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/workspaces/{id}/files/write: put: tags: - Workspaces summary: Write file content security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: File written content: application/json: schema: $ref: '#/components/schemas/Workspace' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/workspaces/{id}/files/delete: delete: tags: - Workspaces summary: Delete workspace file security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/workspaces/{id}/files/mkdir: post: tags: - Workspaces summary: Create directory security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '201': description: Directory created content: application/json: schema: $ref: '#/components/schemas/Workspace' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/workspaces/{id}/archive/upload: post: tags: - Workspaces summary: Upload archive (zip/tar.gz) to workspace security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Archive extracted content: application/json: schema: $ref: '#/components/schemas/Workspace' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/workspaces/{id}/archive/download: get: tags: - Workspaces summary: Download workspace as archive security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Archive download content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workspace' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/workspaces/{id}/reconcile: post: tags: - Workspaces summary: Reconcile workspace state security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Reconciled content: application/json: schema: $ref: '#/components/schemas/Workspace' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/workspaces/{id}/stats: get: tags: - Workspaces summary: Get workspace statistics security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Workspace stats content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workspace' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/workspaces/{id}/index-status: get: tags: - Workspaces summary: Get full-text index status security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Index status content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workspace' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/workspaces/{id}/git/clone: post: tags: - Workspaces summary: Clone git remote into workspace security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Clone started content: application/json: schema: $ref: '#/components/schemas/Workspace' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/workspaces/{id}/git/pull: post: tags: - Workspaces summary: Pull from remote security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Pull complete content: application/json: schema: $ref: '#/components/schemas/Workspace' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/workspaces/{id}/git/push: post: tags: - Workspaces summary: Push to remote security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Push complete content: application/json: schema: $ref: '#/components/schemas/Workspace' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/workspaces/{id}/git/status: get: tags: - Workspaces summary: Git status security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Working tree status content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workspace' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/workspaces/{id}/git/diff: get: tags: - Workspaces summary: Git diff security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Diff output content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workspace' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/workspaces/{id}/git/commit: post: tags: - Workspaces summary: Commit changes security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Committed content: application/json: schema: $ref: '#/components/schemas/Workspace' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/workspaces/{id}/git/log: get: tags: - Workspaces summary: Git log security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Commit history content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workspace' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/workspaces/{id}/git/branches: get: tags: - Workspaces summary: List git branches security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Branch list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workspace' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/workspaces/{id}/git/checkout: post: tags: - Workspaces summary: Checkout branch security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Checked out content: application/json: schema: $ref: '#/components/schemas/Workspace' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/git-credentials: get: tags: - Workspaces summary: List git credentials security: - bearerAuth: [] responses: '200': description: Credential list (keys redacted) content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workspace' '401': $ref: '#/components/responses/Unauthorized' post: tags: - Workspaces summary: Create git credential security: - bearerAuth: [] responses: '201': description: Credential created content: application/json: schema: $ref: '#/components/schemas/Workspace' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/git-credentials/generate: post: tags: - Workspaces summary: Generate SSH key pair security: - bearerAuth: [] responses: '201': description: Key pair generated content: application/json: schema: $ref: '#/components/schemas/Workspace' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/git-credentials/{id}/public-key: get: tags: - Workspaces summary: Get SSH public key security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Public key content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workspace' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/git-credentials/{id}: delete: tags: - Workspaces summary: Delete git credential security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/tasks: get: tags: - Tasks summary: List user's tasks security: - bearerAuth: [] responses: '200': description: Task list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Task' '401': $ref: '#/components/responses/Unauthorized' post: tags: - Tasks summary: Create task security: - bearerAuth: [] responses: '201': description: Task created content: application/json: schema: $ref: '#/components/schemas/Task' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/tasks/{id}: get: tags: - Tasks summary: Get task security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Task object content: application/json: schema: $ref: '#/components/schemas/Task' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Tasks summary: Update task security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Task' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Tasks summary: Delete task security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/tasks/{id}/runs: get: tags: - Tasks summary: List task runs security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Run history content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Task' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/tasks/{id}/run: post: tags: - Tasks summary: Execute task immediately security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Run started content: application/json: schema: $ref: '#/components/schemas/Task' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/tasks/{id}/kill: post: tags: - Tasks summary: Kill running task security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Task killed content: application/json: schema: $ref: '#/components/schemas/Task' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/workflows: get: tags: - Workflows summary: List workflows security: - bearerAuth: [] responses: '200': description: Workflow list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workflow' '401': $ref: '#/components/responses/Unauthorized' post: tags: - Workflows summary: Create workflow security: - bearerAuth: [] responses: '201': description: Workflow created content: application/json: schema: $ref: '#/components/schemas/Workflow' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/workflows/{id}: get: tags: - Workflows summary: Get workflow security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Workflow object content: application/json: schema: $ref: '#/components/schemas/Workflow' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' patch: tags: - Workflows summary: Update workflow security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Workflow' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Workflows summary: Delete workflow security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/workflows/{id}/stages: get: tags: - Workflows summary: List workflow stages security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Stage list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workflow' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' post: tags: - Workflows summary: Create workflow stage security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '201': description: Stage created content: application/json: schema: $ref: '#/components/schemas/Workflow' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/workflows/{id}/stages/{sid}: put: tags: - Workflows summary: Update workflow stage security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: sid in: path required: true schema: type: string format: uuid responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Workflow' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Workflows summary: Delete workflow stage security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: sid in: path required: true schema: type: string format: uuid responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/workflows/{id}/stages/reorder: patch: tags: - Workflows summary: Reorder workflow stages security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Reordered content: application/json: schema: $ref: '#/components/schemas/Workflow' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/workflows/{id}/publish: post: tags: - Workflows summary: Publish workflow version security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Published content: application/json: schema: $ref: '#/components/schemas/Workflow' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/workflows/{id}/versions/{version}: get: tags: - Workflows summary: Get specific workflow version security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: version in: path required: true schema: type: integer responses: '200': description: Version snapshot content: application/json: schema: $ref: '#/components/schemas/Workflow' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/workflows/{id}/start: post: tags: - Workflows summary: Start workflow instance security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '201': description: Instance started content: application/json: schema: $ref: '#/components/schemas/Workflow' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/channels/{id}/workflow/status: get: tags: - Workflows summary: Get workflow status for channel security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Workflow instance status content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workflow' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/channels/{id}/workflow/advance: post: tags: - Workflows summary: Advance workflow to next stage security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Advanced content: application/json: schema: $ref: '#/components/schemas/Workflow' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/channels/{id}/workflow/reject: post: tags: - Workflows summary: Reject and return to previous stage security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Rejected content: application/json: schema: $ref: '#/components/schemas/Workflow' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/workflow-assignments/mine: get: tags: - Workflows summary: List assignments for current user security: - bearerAuth: [] responses: '200': description: Assignment list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workflow' '401': $ref: '#/components/responses/Unauthorized' /api/v1/workflow-assignments/{id}: get: tags: - Workflows summary: Get assignment details security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Assignment details content: application/json: schema: $ref: '#/components/schemas/Workflow' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/workflow-assignments/{id}/claim: post: tags: - Workflows summary: Claim an assignment security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Claimed content: application/json: schema: $ref: '#/components/schemas/Workflow' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/workflow-assignments/{id}/complete: post: tags: - Workflows summary: Complete an assignment security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Completed content: application/json: schema: $ref: '#/components/schemas/Workflow' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/workflow-assignments/{id}/comment: post: tags: - Workflows summary: Add comment to assignment security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '201': description: Comment added content: application/json: schema: $ref: '#/components/schemas/Workflow' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/w/{id}/form: get: tags: - Workflows summary: Get form template for workflow stage parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Form template JSON content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workflow' /api/v1/w/{id}/form-submit: post: tags: - Workflows summary: Submit form data for workflow stage parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Form submitted content: application/json: schema: $ref: '#/components/schemas/Workflow' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/workflow-entry/{scope}/{slug}: post: tags: - Workflows summary: Start workflow as visitor parameters: - name: scope in: path required: true schema: type: string - name: slug in: path required: true schema: type: string responses: '201': description: Workflow instance started content: application/json: schema: $ref: '#/components/schemas/Workflow' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/notifications: get: tags: - Notifications summary: List notifications security: - bearerAuth: [] parameters: - name: limit in: query schema: type: integer default: 20 maximum: 100 - name: offset in: query schema: type: integer default: 0 - name: unread_only in: query schema: type: boolean default: false responses: '200': description: Notification list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Notification' '401': $ref: '#/components/responses/Unauthorized' /api/v1/notifications/unread-count: get: tags: - Notifications summary: Get unread notification count security: - bearerAuth: [] responses: '200': description: Unread count content: application/json: schema: type: object properties: count: type: integer '401': $ref: '#/components/responses/Unauthorized' /api/v1/notifications/{id}/read: patch: tags: - Notifications summary: Mark notification as read security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Marked read content: application/json: schema: $ref: '#/components/schemas/Notification' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/notifications/mark-all-read: post: tags: - Notifications summary: Mark all notifications as read security: - bearerAuth: [] responses: '200': description: All marked read content: application/json: schema: $ref: '#/components/schemas/Notification' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/notifications/{id}: delete: tags: - Notifications summary: Delete notification security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/notifications/preferences: get: tags: - Notifications summary: List notification preferences security: - bearerAuth: [] responses: '200': description: Preference list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Notification' '401': $ref: '#/components/responses/Unauthorized' /api/v1/notifications/preferences/{type}: put: tags: - Notifications summary: Set notification preference for type security: - bearerAuth: [] parameters: - name: type in: path required: true schema: type: string requestBody: content: application/json: schema: type: object properties: in_app: type: boolean email: type: boolean responses: '200': description: Preference set content: application/json: schema: $ref: '#/components/schemas/Notification' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' delete: tags: - Notifications summary: Reset notification preference to default security: - bearerAuth: [] parameters: - name: type in: path required: true schema: type: string responses: '200': description: Reset to default content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' /api/v1/extensions: get: tags: - Extensions summary: List user-visible extensions security: - bearerAuth: [] responses: '200': description: Extension list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Extension' '401': $ref: '#/components/responses/Unauthorized' /api/v1/extensions/{id}/settings: post: tags: - Extensions summary: Update user extension settings security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Settings updated content: application/json: schema: $ref: '#/components/schemas/Extension' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/extensions/{id}/manifest: get: tags: - Extensions summary: Get extension manifest security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Manifest JSON content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Extension' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/extensions/tools: get: tags: - Extensions summary: List browser tool schemas from extensions security: - bearerAuth: [] responses: '200': description: Tool schema list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Extension' '401': $ref: '#/components/responses/Unauthorized' /api/v1/surfaces: get: tags: - Surfaces summary: List enabled surface packages security: - bearerAuth: [] responses: '200': description: Surface list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Surface' '401': $ref: '#/components/responses/Unauthorized' /api/v1/packages: get: tags: - Extensions summary: List packages visible to user security: - bearerAuth: [] responses: '200': description: Package list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Extension' '401': $ref: '#/components/responses/Unauthorized' /api/v1/packages/install: post: tags: - Extensions summary: Install personal package security: - bearerAuth: [] responses: '201': description: Package installed content: application/json: schema: $ref: '#/components/schemas/Extension' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/packages/{id}: delete: tags: - Extensions summary: Delete personal package security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/users: get: tags: - Admin summary: List all users security: - bearerAuth: [] responses: '200': description: User list content: application/json: schema: &id005 type: object properties: data: type: array items: $ref: '#/components/schemas/AuthUser' '401': $ref: '#/components/responses/Unauthorized' post: tags: - Admin summary: Create user security: - bearerAuth: [] responses: '201': description: User created content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/users/{id}/role: put: tags: - Admin summary: Update user role security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Role updated content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/users/{id}/active: put: tags: - Admin summary: Toggle user active status security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Status toggled content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/users/{id}/reset-password: post: tags: - Admin summary: Reset user password security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Password reset content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/users/{id}/vault/reset: post: tags: - Admin summary: Reset user vault (BYOK keys lost) security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Vault reset content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/users/{id}: delete: tags: - Admin summary: Delete user security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: User deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/users/{id}/permissions: get: tags: - Admin summary: Get effective permissions for user security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Permission list content: application/json: schema: &id003 type: object properties: data: type: array items: type: object '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/settings: get: tags: - Admin summary: List all global settings security: - bearerAuth: [] responses: '200': description: Settings list content: application/json: schema: &id001 type: object properties: data: type: array items: type: object '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/settings/{key}: get: tags: - Admin summary: Get global setting by key security: - bearerAuth: [] parameters: - name: key in: path required: true schema: type: string responses: '200': description: Setting value content: application/json: schema: *id001 '401': $ref: '#/components/responses/Unauthorized' put: tags: - Admin summary: Update global setting security: - bearerAuth: [] parameters: - name: key in: path required: true schema: type: string responses: '200': description: Setting updated content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/configs: get: tags: - Admin - Providers summary: List global provider configs security: - bearerAuth: [] responses: '200': description: Provider config list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/ProviderConfig' '401': $ref: '#/components/responses/Unauthorized' post: tags: - Admin - Providers summary: Create global provider config security: - bearerAuth: [] responses: '201': description: Config created content: application/json: schema: $ref: '#/components/schemas/ProviderConfig' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/configs/{id}: put: tags: - Admin - Providers summary: Update global provider config security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/ProviderConfig' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Admin - Providers summary: Delete global provider config security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/models: get: tags: - Admin - Models summary: List model catalog security: - bearerAuth: [] responses: '200': description: Model catalog content: application/json: schema: type: object properties: data: type: array items: type: object '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/models/fetch: post: tags: - Admin - Models summary: Sync models from provider APIs security: - bearerAuth: [] responses: '200': description: Models synced content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/models/bulk: put: tags: - Admin - Models summary: Bulk update model visibility security: - bearerAuth: [] responses: '200': description: Bulk updated content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/models/{id}: put: tags: - Admin - Models summary: Update model config security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Admin - Models summary: Delete model from catalog security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/models/{id}/capabilities: get: tags: - Admin - Models summary: Get model capability overrides security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Capabilities content: application/json: schema: type: object properties: data: type: array items: type: object '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Admin - Models summary: Set model capability override security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Override set content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/models/{id}/capabilities/{overrideId}: delete: tags: - Admin - Models summary: Delete capability override security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: overrideId in: path required: true schema: type: string format: uuid responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/capability-overrides: get: tags: - Admin - Models summary: List all capability overrides security: - bearerAuth: [] responses: '200': description: All overrides content: application/json: schema: type: object properties: data: type: array items: type: object '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/provider-types: get: tags: - Admin - Providers summary: List supported provider types security: - bearerAuth: [] responses: '200': description: Provider type registry content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/ProviderConfig' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/personas: get: tags: - Admin - Personas summary: List global personas security: - bearerAuth: [] responses: '200': description: Global persona list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Persona' '401': $ref: '#/components/responses/Unauthorized' post: tags: - Admin - Personas summary: Create global persona security: - bearerAuth: [] responses: '201': description: Persona created content: application/json: schema: $ref: '#/components/schemas/Persona' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/personas/{id}: put: tags: - Admin - Personas summary: Update global persona security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Persona' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Admin - Personas summary: Delete global persona security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/personas/{id}/avatar: post: tags: - Admin - Personas summary: Upload global persona avatar security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Avatar uploaded content: application/json: schema: $ref: '#/components/schemas/Persona' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' delete: tags: - Admin - Personas summary: Delete global persona avatar security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Avatar removed content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/personas/{id}/knowledge-bases: get: tags: - Admin - Personas summary: Get global persona KB bindings security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: KB bindings content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Persona' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Admin - Personas summary: Set global persona KB bindings security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Bindings updated content: application/json: schema: $ref: '#/components/schemas/Persona' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/personas/{id}/tool-grants: get: tags: - Admin - Personas summary: Get global persona tool grants security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Tool grants content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Persona' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Admin - Personas summary: Set global persona tool grants security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Grants updated content: application/json: schema: $ref: '#/components/schemas/Persona' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/memories/pending: get: tags: - Admin - Memory summary: List pending memories for review security: - bearerAuth: [] responses: '200': description: Pending memories content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Memory' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/memories/bulk-approve: post: tags: - Admin - Memory summary: Bulk approve pending memories security: - bearerAuth: [] responses: '200': description: Memories approved content: application/json: schema: $ref: '#/components/schemas/Memory' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/teams: get: tags: - Admin - Teams summary: List all teams security: - bearerAuth: [] responses: '200': description: Team list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' post: tags: - Admin - Teams summary: Create team security: - bearerAuth: [] responses: '201': description: Team created content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/teams/{id}: get: tags: - Admin - Teams summary: Get team security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Team object content: application/json: schema: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Admin - Teams summary: Update team security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Admin - Teams summary: Delete team security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/teams/{id}/members: get: tags: - Admin - Teams summary: List team members security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Member list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' post: tags: - Admin - Teams summary: Add team member security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '201': description: Member added content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/teams/{id}/members/{memberId}: put: tags: - Admin - Teams summary: Update team member security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: memberId in: path required: true schema: type: string format: uuid responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Admin - Teams summary: Remove team member security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: memberId in: path required: true schema: type: string format: uuid responses: '200': description: Removed content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/teams/{id}/export: get: tags: - Admin - Teams - Data Portability summary: Export team data security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Team data archive content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/teams/{id}/import: post: tags: - Admin - Teams - Data Portability summary: Import team data security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Team data imported content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/notifications/broadcast: post: tags: - Admin - Notifications summary: Broadcast notification to all users security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: - title - message properties: title: type: string message: type: string level: type: string enum: - info - warning - critical default: info responses: '200': description: Broadcast sent content: application/json: schema: $ref: '#/components/schemas/Notification' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/notifications/test-email: post: tags: - Admin - Notifications summary: Send test email to admin security: - bearerAuth: [] responses: '200': description: Test email sent content: application/json: schema: $ref: '#/components/schemas/Notification' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/audit: get: tags: - Admin summary: List platform audit log security: - bearerAuth: [] responses: '200': description: Audit entries content: application/json: schema: type: object properties: data: type: array items: type: object '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/audit/actions: get: tags: - Admin summary: List distinct audit actions security: - bearerAuth: [] responses: '200': description: Action list content: application/json: schema: type: object properties: data: type: array items: type: string '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/groups: get: tags: - Admin summary: List permission groups security: - bearerAuth: [] responses: '200': description: Group list content: application/json: schema: &id002 type: object properties: data: type: array items: type: object '401': $ref: '#/components/responses/Unauthorized' post: tags: - Admin summary: Create permission group security: - bearerAuth: [] responses: '201': description: Group created content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/groups/{id}: get: tags: - Admin summary: Get permission group security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Group object content: application/json: schema: *id002 '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Admin summary: Update permission group security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Admin summary: Delete permission group security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/groups/{id}/members: get: tags: - Admin summary: List group members security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Member list content: application/json: schema: type: object properties: data: type: array items: type: object '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' post: tags: - Admin summary: Add user to group security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '201': description: Member added content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/groups/{id}/members/{userId}: delete: tags: - Admin summary: Remove user from group security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: userId in: path required: true schema: type: string format: uuid responses: '200': description: Removed content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/permissions: get: tags: - Admin summary: List all available permissions security: - bearerAuth: [] responses: '200': description: Permission list content: application/json: schema: *id003 '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/grants/{type}/{id}: get: tags: - Admin summary: Get resource grant security: - bearerAuth: [] parameters: - name: type in: path required: true schema: type: string - $ref: '#/components/parameters/ResourceID' responses: '200': description: Grant object content: application/json: schema: type: object '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Admin summary: Set resource grant security: - bearerAuth: [] parameters: - name: type in: path required: true schema: type: string - $ref: '#/components/parameters/ResourceID' responses: '200': description: Grant set content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Admin summary: Delete resource grant security: - bearerAuth: [] parameters: - name: type in: path required: true schema: type: string - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/roles: get: tags: - Admin summary: List roles security: - bearerAuth: [] responses: '200': description: Role list content: application/json: schema: &id004 type: object properties: data: type: array items: type: object '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/roles/{role}: get: tags: - Admin summary: Get role definition security: - bearerAuth: [] parameters: - name: role in: path required: true schema: type: string responses: '200': description: Role object content: application/json: schema: *id004 '401': $ref: '#/components/responses/Unauthorized' put: tags: - Admin summary: Update role permissions security: - bearerAuth: [] parameters: - name: role in: path required: true schema: type: string responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/roles/{role}/test: post: tags: - Admin summary: Test role permission check security: - bearerAuth: [] parameters: - name: role in: path required: true schema: type: string responses: '200': description: Test result content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/usage/users/{id}: get: tags: - Admin - Usage summary: Usage for specific user security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: User usage content: application/json: schema: *id005 '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/usage/teams/{id}: get: tags: - Admin - Usage summary: Usage for specific team security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Team usage content: application/json: schema: type: object '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/pricing: get: tags: - Admin - Usage summary: List pricing overrides security: - bearerAuth: [] responses: '200': description: Pricing list content: application/json: schema: type: object properties: data: type: array items: type: object '401': $ref: '#/components/responses/Unauthorized' put: tags: - Admin - Usage summary: Upsert pricing override security: - bearerAuth: [] responses: '200': description: Pricing set content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/pricing/{provider}/{model}: delete: tags: - Admin - Usage summary: Delete pricing override security: - bearerAuth: [] parameters: - name: provider in: path required: true schema: type: string - name: model in: path required: true schema: type: string responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/storage/status: get: tags: - Admin summary: Storage backend status security: - bearerAuth: [] responses: '200': description: Storage status content: application/json: schema: type: object '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/storage/orphans: get: tags: - Admin summary: Count orphaned storage objects security: - bearerAuth: [] responses: '200': description: Orphan count content: application/json: schema: type: object '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/storage/cleanup: post: tags: - Admin summary: Clean up orphaned storage objects security: - bearerAuth: [] responses: '200': description: Cleanup results content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/storage/extraction: get: tags: - Admin summary: Text extraction pipeline status security: - bearerAuth: [] responses: '200': description: Extraction status content: application/json: schema: type: object '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/vault/status: get: tags: - Admin summary: Vault encryption status security: - bearerAuth: [] responses: '200': description: Vault status content: application/json: schema: type: object '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/channels/archived: get: tags: - Admin summary: List archived channels security: - bearerAuth: [] responses: '200': description: Archived channel list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Channel' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/channels/{id}/purge: delete: tags: - Admin summary: Permanently purge archived channel security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Purged content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/extensions: get: tags: - Admin - Extensions summary: List all extensions security: - bearerAuth: [] responses: '200': description: Extension list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Extension' '401': $ref: '#/components/responses/Unauthorized' post: tags: - Admin - Extensions summary: Install extension security: - bearerAuth: [] responses: '201': description: Installed content: application/json: schema: $ref: '#/components/schemas/Extension' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/extensions/{id}: put: tags: - Admin - Extensions summary: Update extension security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Extension' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Admin - Extensions summary: Uninstall extension security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Uninstalled content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/extensions/{id}/permissions: get: tags: - Admin - Extensions summary: List extension permissions security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Permission list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Extension' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/extensions/{id}/review: get: tags: - Admin - Extensions summary: Review package permissions security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Review summary content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Extension' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/extensions/{id}/permissions/{perm}/grant: post: tags: - Admin - Extensions summary: Grant extension permission security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: perm in: path required: true schema: type: string responses: '200': description: Granted content: application/json: schema: $ref: '#/components/schemas/Extension' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/extensions/{id}/permissions/{perm}/revoke: post: tags: - Admin - Extensions summary: Revoke extension permission security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' - name: perm in: path required: true schema: type: string responses: '200': description: Revoked content: application/json: schema: $ref: '#/components/schemas/Extension' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/extensions/{id}/permissions/grant-all: post: tags: - Admin - Extensions summary: Grant all requested permissions security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: All granted content: application/json: schema: $ref: '#/components/schemas/Extension' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/extensions/{id}/secrets: get: tags: - Admin - Extensions summary: Get extension secrets (redacted) security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Secret keys (values redacted) content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Extension' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Admin - Extensions summary: Set extension secrets security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Secrets set content: application/json: schema: $ref: '#/components/schemas/Extension' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Admin - Extensions summary: Delete extension secrets security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Secrets deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/routing/policies: get: tags: - Admin - Providers summary: List routing policies security: - bearerAuth: [] responses: '200': description: Policy list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/ProviderConfig' '401': $ref: '#/components/responses/Unauthorized' post: tags: - Admin - Providers summary: Create routing policy security: - bearerAuth: [] responses: '201': description: Policy created content: application/json: schema: $ref: '#/components/schemas/ProviderConfig' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/routing/policies/{id}: get: tags: - Admin - Providers summary: Get routing policy security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Policy object content: application/json: schema: $ref: '#/components/schemas/ProviderConfig' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Admin - Providers summary: Update routing policy security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/ProviderConfig' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Admin - Providers summary: Delete routing policy security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/routing/test: post: tags: - Admin - Providers summary: Dry-run routing evaluation security: - bearerAuth: [] responses: '200': description: Routing candidates content: application/json: schema: $ref: '#/components/schemas/ProviderConfig' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/packages/registry: get: tags: - Admin - Extensions summary: Browse package registry security: - bearerAuth: [] responses: '200': description: Registry entries content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Extension' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/packages/registry/install: post: tags: - Admin - Extensions summary: Install from registry security: - bearerAuth: [] responses: '201': description: Installed content: application/json: schema: $ref: '#/components/schemas/Extension' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/packages: get: tags: - Admin - Extensions summary: List installed packages security: - bearerAuth: [] responses: '200': description: Package list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Extension' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/packages/{id}: get: tags: - Admin - Extensions summary: Get package details security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Package object content: application/json: schema: $ref: '#/components/schemas/Extension' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Admin - Extensions summary: Delete package security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/packages/install: post: tags: - Admin - Extensions summary: Install package from upload description: | Upload a .pkg/.surface/.zip archive containing manifest.json and optional assets. For starlark-tier packages, the archive must include `script.star` (or the manifest's `entry_point` value). Starlark submodules in `star/` are extracted alongside static assets (js/, css/, assets/). The manifest `entry_point` field overrides the default entry script name (v0.38.0). security: - bearerAuth: [] responses: '201': description: Installed content: application/json: schema: $ref: '#/components/schemas/Extension' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/packages/{id}/enable: put: tags: - Admin - Extensions summary: Enable package security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Enabled content: application/json: schema: $ref: '#/components/schemas/Extension' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/packages/{id}/disable: put: tags: - Admin - Extensions summary: Disable package security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Disabled content: application/json: schema: $ref: '#/components/schemas/Extension' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/packages/{id}/settings: get: tags: - Admin - Extensions summary: Get package settings security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Package settings content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Extension' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Admin - Extensions summary: Update package settings security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Settings updated content: application/json: schema: $ref: '#/components/schemas/Extension' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/packages/{id}/export: get: tags: - Admin - Extensions summary: Export package as archive security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Package archive content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Extension' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' # ── Extension Dependencies (v0.38.2) ───────────────────────────────── /api/v1/admin/packages/{id}/dependencies: get: tags: [Admin, Extensions] summary: List libraries this package depends on description: "v0.38.2: Returns dependency records where this package is the consumer." security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Dependencies list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/ExtDependency' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/packages/{id}/consumers: get: tags: [Admin, Extensions] summary: List packages that depend on this library description: "v0.38.2: Returns dependency records where this package is the library." security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Consumers list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/ExtDependency' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/dependencies: get: tags: [Admin, Extensions] summary: List all package dependencies description: "v0.38.2: Returns the full dependency graph." security: - bearerAuth: [] responses: '200': description: Full dependency graph content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/ExtDependency' '401': $ref: '#/components/responses/Unauthorized' # ── Extension Connections (v0.38.1) ───────────────────────────────── /api/v1/connections: get: tags: [Extensions] summary: List personal connections security: - bearerAuth: [] responses: '200': description: Personal connections (secrets masked) content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/ExtConnection' post: tags: [Extensions] summary: Create personal connection security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: [type, package_id, name] properties: type: { type: string } package_id: { type: string } name: { type: string } config: { type: object } responses: '201': description: Created /api/v1/connections/{id}: get: tags: [Extensions] summary: Get personal connection security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Connection (secrets masked) put: tags: [Extensions] summary: Update personal connection security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' requestBody: content: application/json: schema: type: object properties: name: { type: string } config: { type: object } responses: '200': description: Updated delete: tags: [Extensions] summary: Delete personal connection security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted /api/v1/connections/resolve: get: tags: [Extensions] summary: Resolve connection via scope chain (personal > team > global) description: | Returns a single connection with decrypted config, resolved via the scope chain. Requires `type` query parameter. Optional `name` for named resolution. security: - bearerAuth: [] parameters: - name: type in: query required: true schema: { type: string } - name: name in: query schema: { type: string } responses: '200': description: Resolved connection with decrypted config '404': description: No matching connection found /api/v1/teams/{teamId}/connections: get: tags: [Teams, Extensions] summary: List team connections security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/TeamID' responses: '200': description: Team connections post: tags: [Teams, Extensions] summary: Create team connection security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/TeamID' requestBody: required: true content: application/json: schema: type: object required: [type, package_id, name] properties: type: { type: string } package_id: { type: string } name: { type: string } config: { type: object } responses: '201': description: Created /api/v1/teams/{teamId}/connections/{id}: put: tags: [Teams, Extensions] summary: Update team connection security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/TeamID' - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated delete: tags: [Teams, Extensions] summary: Delete team connection security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/TeamID' - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted /api/v1/admin/connections: get: tags: [Admin, Extensions] summary: List global connections security: - bearerAuth: [] responses: '200': description: Global connections post: tags: [Admin, Extensions] summary: Create global connection security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: [type, package_id, name] properties: type: { type: string } package_id: { type: string } name: { type: string } config: { type: object } responses: '201': description: Created /api/v1/admin/connections/{id}: put: tags: [Admin, Extensions] summary: Update global connection security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated delete: tags: [Admin, Extensions] summary: Delete global connection security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted /api/v1/admin/workflows/{id}/export: get: tags: - Admin - Workflows summary: Export workflow as package security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Workflow package archive content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workflow' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/workflows/monitor/instances: get: tags: - Admin - Workflows summary: List active workflow instances security: - bearerAuth: [] responses: '200': description: Active instance list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workflow' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/workflows/monitor/funnel/{id}: get: tags: - Admin - Workflows summary: Get workflow stage funnel security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Funnel data content: application/json: schema: $ref: '#/components/schemas/Workflow' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/workflows/monitor/stale: get: tags: - Admin - Workflows summary: List stale workflow instances security: - bearerAuth: [] responses: '200': description: Stale instances content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Workflow' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/surfaces: get: tags: - Admin - Surfaces summary: List installed surfaces security: - bearerAuth: [] responses: '200': description: Surface list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Surface' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/surfaces/{id}: delete: tags: - Admin - Surfaces summary: Delete surface security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/surfaces/install: post: tags: - Admin - Surfaces summary: Install surface package security: - bearerAuth: [] responses: '201': description: Installed content: application/json: schema: $ref: '#/components/schemas/Surface' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/surfaces/{id}/enable: put: tags: - Admin - Surfaces summary: Enable surface security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Enabled content: application/json: schema: $ref: '#/components/schemas/Surface' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/surfaces/{id}/disable: put: tags: - Admin - Surfaces summary: Disable surface security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Disabled content: application/json: schema: $ref: '#/components/schemas/Surface' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/tasks: get: tags: - Admin - Tasks summary: List all tasks security: - bearerAuth: [] responses: '200': description: Task list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Task' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/tasks/{id}/run: post: tags: - Admin - Tasks summary: Force-run task security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Run started content: application/json: schema: $ref: '#/components/schemas/Task' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/tasks/{id}/kill: post: tags: - Admin - Tasks summary: Kill task run security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Killed content: application/json: schema: $ref: '#/components/schemas/Task' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/tasks/{id}: delete: tags: - Admin - Tasks summary: Delete task security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/admin/system-functions: get: tags: - Admin - Tasks summary: List registered system functions security: - bearerAuth: [] responses: '200': description: System function registry content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Task' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/projects: get: tags: - Admin - Projects summary: List all projects (cross-user) security: - bearerAuth: [] responses: '200': description: All projects content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Project' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/projects/{id}: delete: tags: - Admin - Projects summary: Delete project security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/mine: get: tags: - Teams summary: List teams the current user belongs to security: - bearerAuth: [] responses: '200': description: User's teams content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' /api/v1/teams/{teamId}/members: get: tags: - Teams summary: List team members security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '200': description: Member list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' post: tags: - Teams summary: Add team member security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '201': description: Member added content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/teams/{teamId}/members/{memberId}: put: tags: - Teams summary: Update team member role security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - name: memberId in: path required: true schema: type: string format: uuid responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Teams summary: Remove team member security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - name: memberId in: path required: true schema: type: string format: uuid responses: '200': description: Removed content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/models: get: tags: - Teams - Models summary: List models available to team security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '200': description: Team model list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/providers: get: tags: - Teams - Providers summary: List team provider configs security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '200': description: Team provider list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' post: tags: - Teams - Providers summary: Create team provider config security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '201': description: Config created content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/teams/{teamId}/providers/{id}: put: tags: - Teams - Providers summary: Update team provider config security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Teams - Providers summary: Delete team provider config security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/providers/{id}/models: get: tags: - Teams - Providers summary: List models for team provider security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Model list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/personas: get: tags: - Teams - Personas summary: List team personas security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '200': description: Team persona list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' post: tags: - Teams - Personas summary: Create team persona security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '201': description: Persona created content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/teams/{teamId}/personas/{id}: put: tags: - Teams - Personas summary: Update team persona security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Teams - Personas summary: Delete team persona security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/personas/{id}/avatar: post: tags: - Teams - Personas summary: Upload team persona avatar security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Avatar uploaded content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' delete: tags: - Teams - Personas summary: Delete team persona avatar security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Avatar removed content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/personas/{id}/knowledge-bases: get: tags: - Teams - Personas summary: Get team persona KB bindings security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: KB bindings content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Teams - Personas summary: Set team persona KB bindings security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Bindings updated content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/personas/{id}/tool-grants: get: tags: - Teams - Personas summary: Get team persona tool grants security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Tool grants content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: tags: - Teams - Personas summary: Set team persona tool grants security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Grants updated content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/roles: get: tags: - Teams summary: List team roles security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '200': description: Team role list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/roles/{role}: put: tags: - Teams summary: Update team role security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - name: role in: path required: true schema: type: string responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Teams summary: Delete team role security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - name: role in: path required: true schema: type: string responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/audit: get: tags: - Teams summary: Team audit log security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '200': description: Audit entries content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/audit/actions: get: tags: - Teams summary: List distinct team audit actions security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '200': description: Action list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/usage: get: tags: - Teams - Usage summary: Team usage stats security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '200': description: Team usage content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/groups: get: tags: - Teams summary: List groups for team security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '200': description: Team groups content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/packages/install: post: tags: - Teams - Extensions summary: Install package for team security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '201': description: Package installed content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/teams/{teamId}/packages/{id}: delete: tags: - Teams - Extensions summary: Delete team package security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/assignments: get: tags: - Teams - Workflows summary: List workflow assignments for team security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '200': description: Team assignments content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/workflows: get: tags: - Teams - Workflows summary: List team workflows security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '200': description: Team workflow list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' post: tags: - Teams - Workflows summary: Create team workflow security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '201': description: Workflow created content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/teams/{teamId}/workflows/{id}: get: tags: - Teams - Workflows summary: Get team workflow security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Workflow object content: application/json: schema: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' patch: tags: - Teams - Workflows summary: Update team workflow security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Teams - Workflows summary: Delete team workflow security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/workflows/{id}/stages: get: tags: - Teams - Workflows summary: List team workflow stages security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Stage list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' post: tags: - Teams - Workflows summary: Create team workflow stage security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '201': description: Stage created content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/teams/{teamId}/workflows/{id}/stages/{sid}: put: tags: - Teams - Workflows summary: Update team workflow stage security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' - name: sid in: path required: true schema: type: string format: uuid responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Teams - Workflows summary: Delete team workflow stage security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' - name: sid in: path required: true schema: type: string format: uuid responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/workflows/{id}/stages/reorder: patch: tags: - Teams - Workflows summary: Reorder team workflow stages security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Reordered content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/workflows/{id}/publish: post: tags: - Teams - Workflows summary: Publish team workflow version security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Published content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/teams/{teamId}/workflows/{id}/versions/{version}: get: tags: - Teams - Workflows summary: Get team workflow version security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' - name: version in: path required: true schema: type: integer responses: '200': description: Version snapshot content: application/json: schema: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/workflows/monitor/instances: get: tags: - Teams - Workflows summary: List team active workflow instances security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '200': description: Active instances content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/tasks: get: tags: - Teams - Tasks summary: List team tasks (member view) security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '200': description: Team task list content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' post: tags: - Teams - Tasks summary: Create team task security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid responses: '201': description: Task created content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '200': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/teams/{teamId}/tasks/{id}: put: tags: - Teams - Tasks summary: Update team task security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Updated content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: tags: - Teams - Tasks summary: Delete team task security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/teams/{teamId}/tasks/{id}/run: post: tags: - Teams - Tasks summary: Run team task security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Run started content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/teams/{teamId}/tasks/{id}/kill: post: tags: - Teams - Tasks summary: Kill team task run security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Killed content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/teams/{teamId}/tasks/{id}/runs: get: tags: - Teams - Tasks summary: List team task runs security: - bearerAuth: [] parameters: - name: teamId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/ResourceID' responses: '200': description: Run history content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v1/groups/mine: get: tags: - Teams summary: List permission groups the user belongs to security: - bearerAuth: [] responses: '200': description: User's groups content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/Unauthorized' /api/v1/usage: get: tags: - Usage summary: Personal usage stats security: - bearerAuth: [] responses: '200': description: Personal usage content: application/json: schema: type: object '401': $ref: '#/components/responses/Unauthorized' /api/v1/export/me: get: tags: - Data Portability summary: Export all user data (GDPR) security: - bearerAuth: [] responses: '200': description: User data archive content: application/json: schema: type: string format: binary '401': $ref: '#/components/responses/Unauthorized' /api/v1/import/me: post: tags: - Data Portability summary: Import user data security: - bearerAuth: [] responses: '200': description: Data imported content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/import/chatgpt: post: tags: - Data Portability summary: Import ChatGPT conversation export security: - bearerAuth: [] responses: '200': description: Conversations imported content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/me: delete: tags: - Data Portability summary: Delete account and all data (GDPR) security: - bearerAuth: [] requestBody: content: application/json: schema: type: object required: - password properties: password: type: string description: Confirmation password responses: '200': description: Account deleted content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' /api/v1/hooks/t/{token}: post: tags: - Workflows summary: Webhook trigger endpoint parameters: - name: token in: path required: true schema: type: string responses: '200': description: Trigger processed content: application/json: schema: $ref: '#/components/schemas/Workflow' '201': description: Success content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /api/v1/admin/stats: get: tags: - Admin summary: Platform statistics security: - bearerAuth: [] responses: '200': description: Aggregate counts content: application/json: schema: type: object properties: users: type: integer channels: type: integer messages: type: integer '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/providers/health: get: tags: - Admin summary: Current health status for all providers security: - bearerAuth: [] responses: '200': description: Provider health summaries content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/ProviderHealth' '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/usage: get: tags: - Admin - Usage summary: Aggregated token usage security: - bearerAuth: [] parameters: - name: since in: query schema: type: string format: date-time - name: until in: query schema: type: string format: date-time - name: period in: query schema: type: string enum: - 7d - 30d - 90d - name: group_by in: query schema: type: string enum: - model - user - provider - day responses: '200': description: Usage data content: application/json: schema: type: object '401': $ref: '#/components/responses/Unauthorized' /api/v1/admin/dashboard: get: tags: - Admin summary: Real-time observability dashboard data description: 'Aggregates provider health, 24h usage, DB pool stats, WebSocket count, recent errors, and uptime into a single response. ' security: - bearerAuth: [] responses: '200': description: Dashboard snapshot content: application/json: schema: type: object properties: provider_health: type: array items: $ref: '#/components/schemas/ProviderHealth' usage_24h: type: object db_pool: type: object properties: open_connections: type: integer in_use: type: integer idle: type: integer ws_connections: type: integer recent_errors: type: array items: type: object runtime: type: object properties: goroutines: type: integer heap_mb: type: integer sys_mb: type: integer num_gc: type: integer go_version: type: string uptime: type: string description: Go duration string (e.g. "4h32m10s") '401': $ref: '#/components/responses/Unauthorized' components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: 'JWT access token obtained via `POST /api/v1/auth/login` (builtin), OIDC callback, or mTLS auto-provisioning. 15-minute TTL, refreshable via `POST /api/v1/auth/refresh`. ' mtlsAuth: type: mutualTLS description: 'Mutual TLS via reverse proxy headers. The proxy terminates TLS and forwards certificate DN fields. Configured via `AUTH_MODE=mtls`. No explicit login — user identity extracted from certificate on every request. Auto-provisions on first connection. ' parameters: ResourceID: name: id in: path required: true description: Resource UUID schema: type: string format: uuid Page: name: page in: query description: Page number (1-indexed) schema: type: integer default: 1 minimum: 1 PerPage: name: per_page in: query description: Items per page schema: type: integer default: 50 minimum: 1 maximum: 200 responses: BadRequest: description: Invalid request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' Unauthorized: description: Missing or invalid authentication content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' Forbidden: description: Insufficient permissions content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' NotFound: description: Resource not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' Conflict: description: Resource conflict (duplicate, version mismatch) content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' RateLimited: description: Rate limited content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' schemas: ErrorResponse: type: object required: - error properties: error: type: string description: Human-readable error message example: error: resource not found MessageResponse: type: object properties: message: type: string example: message: operation completed AuthResponse: type: object properties: access_token: type: string description: JWT access token (15m TTL) refresh_token: type: string description: Opaque refresh token (7d TTL, rotation on use) token_type: type: string example: Bearer expires_in: type: integer description: Access token TTL in seconds example: 900 user: $ref: '#/components/schemas/AuthUser' AuthUser: type: object properties: id: type: string format: uuid username: type: string email: type: string format: email display_name: type: string nullable: true role: type: string enum: - admin - user handle: type: string description: Unique @mention handle auth_source: type: string enum: - builtin - oidc - mtls UserProfile: type: object properties: id: type: string format: uuid username: type: string email: type: string format: email display_name: type: string nullable: true role: type: string enum: - admin - user avatar: type: string nullable: true description: Data URI (PNG, 128x128). Null if unset. settings: type: object additionalProperties: true description: User preferences (theme, keybindings, etc.) created_at: type: string format: date-time last_login_at: type: string format: date-time nullable: true Channel: type: object properties: id: type: string format: uuid title: type: string type: type: string enum: - direct - group - dm - workflow user_id: type: string format: uuid team_id: type: string format: uuid nullable: true ai_mode: type: string enum: - auto - false - mention_only system_prompt: type: string nullable: true model: type: string nullable: true persona_id: type: string format: uuid nullable: true project_id: type: string format: uuid nullable: true settings: type: object additionalProperties: true nullable: true created_at: type: string format: date-time updated_at: type: string format: date-time CompletionRequest: type: object required: - content - channel_id properties: channel_id: type: string format: uuid content: type: string model: type: string description: Override the default model persona_id: type: string format: uuid provider_config_id: type: string format: uuid max_tokens: type: integer temperature: type: number minimum: 0 maximum: 2 top_p: type: number minimum: 0 maximum: 1 stream: type: boolean default: true file_ids: type: array items: type: string format: uuid disabled_tools: type: array items: type: string CompletionResponse: type: object description: OpenAI-compatible non-streaming response properties: model: type: string choices: type: array items: type: object properties: message: type: object properties: role: type: string content: type: string finish_reason: type: string usage: $ref: '#/components/schemas/TokenUsage' TokenUsage: type: object properties: prompt_tokens: type: integer completion_tokens: type: integer total_tokens: type: integer ProviderHealth: type: object properties: provider_config_id: type: string format: uuid name: type: string provider_type: type: string status: type: string enum: - healthy - degraded - down - unknown request_count: type: integer error_count: type: integer error_rate: type: number avg_latency_ms: type: number max_latency_ms: type: integer Message: type: object properties: id: type: string format: uuid channel_id: type: string format: uuid parent_id: type: string format: uuid nullable: true role: type: string enum: - user - assistant - system - tool content: type: string model: type: string nullable: true provider_config_id: type: string format: uuid nullable: true participant_id: type: string format: uuid nullable: true participant_type: type: string enum: - user - persona - session nullable: true thinking: type: string nullable: true tool_calls: type: array items: type: object nullable: true tool_results: type: array items: type: object nullable: true attachments: type: array items: type: object nullable: true has_siblings: type: boolean sibling_index: type: integer sibling_count: type: integer created_at: type: string format: date-time Participant: type: object properties: id: type: string format: uuid channel_id: type: string format: uuid participant_type: type: string enum: - user - persona - session participant_id: type: string format: uuid role: type: string enum: - owner - member - observer display_name: type: string avatar_url: type: string nullable: true joined_at: type: string format: date-time FileObject: type: object properties: id: type: string format: uuid channel_id: type: string format: uuid nullable: true message_id: type: string format: uuid nullable: true user_id: type: string format: uuid origin: type: string enum: - user_upload - tool_output - system filename: type: string content_type: type: string size_bytes: type: integer display_hint: type: string enum: - inline - download - thumbnail extracted_text: type: string nullable: true metadata: type: object created_at: type: string format: date-time updated_at: type: string format: date-time ToolDef: type: object properties: name: type: string display_name: type: string description: type: string category: type: string parameters: type: object description: JSON Schema for tool parameters PersonaInput: type: object required: - name - base_model_id properties: name: type: string handle: type: string description: Auto-generated from name if omitted description: type: string icon: type: string base_model_id: type: string provider_config_id: type: string format: uuid system_prompt: type: string temperature: type: number max_tokens: type: integer thinking_budget: type: integer nullable: true is_active: type: boolean default: true memory_enabled: type: boolean default: false ProviderConfigInput: type: object required: - name - provider - api_key properties: name: type: string provider: type: string description: Provider type slug (anthropic, openai, etc.) endpoint: type: string format: uri api_key: type: string model_default: type: string config: type: object headers: type: object settings: type: object Persona: type: object properties: id: type: string format: uuid name: type: string handle: type: string description: type: string icon: type: string avatar: type: string nullable: true base_model_id: type: string provider_config_id: type: string format: uuid nullable: true system_prompt: type: string temperature: type: number nullable: true max_tokens: type: integer nullable: true thinking_budget: type: integer nullable: true scope: type: string enum: - personal - team - global owner_id: type: string format: uuid nullable: true is_active: type: boolean memory_enabled: type: boolean kb_ids: type: array items: type: string format: uuid created_at: type: string format: date-time updated_at: type: string format: date-time Note: type: object properties: id: type: string format: uuid user_id: type: string format: uuid title: type: string content: type: string folder: type: string nullable: true source_message_id: type: string format: uuid nullable: true created_at: type: string format: date-time updated_at: type: string format: date-time KnowledgeBase: type: object properties: id: type: string format: uuid name: type: string description: type: string scope: type: string enum: - personal - team - global owner_id: type: string format: uuid nullable: true team_id: type: string format: uuid nullable: true document_count: type: integer chunk_count: type: integer total_bytes: type: integer status: type: string enum: - active - processing - error created_at: type: string format: date-time updated_at: type: string format: date-time Memory: type: object properties: id: type: string format: uuid scope: type: string enum: - user - persona - persona_user owner_id: type: string format: uuid user_id: type: string format: uuid nullable: true key: type: string value: type: string source_channel_id: type: string format: uuid nullable: true confidence: type: number status: type: string enum: - active - pending_review - archived created_at: type: string format: date-time updated_at: type: string format: date-time Project: type: object properties: id: type: string format: uuid name: type: string description: type: string color: type: string nullable: true icon: type: string nullable: true scope: type: string enum: - personal - team - global owner_id: type: string format: uuid team_id: type: string format: uuid nullable: true workspace_id: type: string format: uuid nullable: true is_archived: type: boolean settings: type: object channel_count: type: integer kb_count: type: integer note_count: type: integer created_at: type: string format: date-time updated_at: type: string format: date-time Workspace: type: object properties: id: type: string format: uuid name: type: string owner_type: type: string enum: - user - project - channel - team owner_id: type: string format: uuid status: type: string enum: - active - archived - deleting max_bytes: type: integer nullable: true indexing_enabled: type: boolean git_remote_url: type: string nullable: true git_branch: type: string nullable: true git_credential_id: type: string format: uuid nullable: true git_last_sync: type: string format: date-time nullable: true file_count: type: integer total_bytes: type: integer created_at: type: string format: date-time updated_at: type: string format: date-time Task: type: object properties: id: type: string format: uuid name: type: string description: type: string task_type: type: string enum: - system - starlark schedule: type: string description: Cron expression trigger_type: type: string enum: - cron - manual - event owner_id: type: string format: uuid team_id: type: string format: uuid nullable: true is_active: type: boolean config: type: object last_run_at: type: string format: date-time nullable: true next_run_at: type: string format: date-time nullable: true created_at: type: string format: date-time updated_at: type: string format: date-time Workflow: type: object properties: id: type: string format: uuid name: type: string slug: type: string description: type: string scope: type: string enum: - personal - team - global owner_id: type: string format: uuid team_id: type: string format: uuid nullable: true persona_id: type: string format: uuid nullable: true published_version: type: integer nullable: true is_active: type: boolean branding: type: object nullable: true created_at: type: string format: date-time updated_at: type: string format: date-time Notification: type: object properties: id: type: string format: uuid user_id: type: string format: uuid type: type: string description: domain.action convention title: type: string body: type: string resource_type: type: string nullable: true resource_id: type: string format: uuid nullable: true is_read: type: boolean created_at: type: string format: date-time ProviderConfig: type: object description: Provider config with API key redacted properties: id: type: string format: uuid name: type: string provider: type: string description: Provider type slug endpoint: type: string format: uri model_default: type: string nullable: true scope: type: string enum: - personal - team - global owner_id: type: string format: uuid nullable: true is_active: type: boolean has_key: type: boolean config: type: object headers: type: object settings: type: object created_at: type: string format: date-time Team: type: object properties: id: type: string format: uuid name: type: string slug: type: string description: type: string settings: type: object member_count: type: integer created_at: type: string format: date-time updated_at: type: string format: date-time ExtDependency: type: object description: "v0.38.2: Package dependency record (consumer → library)" properties: consumer_id: type: string description: Package ID of the consumer library_id: type: string description: Package ID of the library version_spec: type: string description: Semver version spec declared by consumer resolved_ver: type: string description: Actual library version at dependency creation time ConfigSection: type: object description: "v0.38.3: Manifest-declared config section for Settings/Admin/Team Admin surfaces" properties: label: type: string description: Nav link text icon: type: string description: Optional SVG path data (compact format) component: type: string description: Relative asset path within package archive (default js/config.js) surfaces: type: array items: type: string enum: [admin, settings, team-admin] description: Which surfaces show this section category: type: string description: Admin-only category tab (default system) ExtConnection: type: object description: "v0.38.1: Extension connection credential (secrets masked in list responses)" properties: id: type: string format: uuid type: type: string description: Connection type identifier (e.g. "gitea", "github") package_id: type: string description: Declaring package ID (UI attribution) scope: type: string enum: [global, team, personal] name: type: string description: User label (e.g. "Work Gitea") is_active: type: boolean has_config: type: boolean description: Whether config fields are set (secrets never exposed in list) created_at: type: string format: date-time updated_at: type: string format: date-time Extension: type: object properties: id: type: string format: uuid name: type: string slug: type: string version: type: string description: type: string type: type: string enum: - package - surface is_enabled: type: boolean permissions: type: array items: type: string created_at: type: string format: date-time Surface: $ref: '#/components/schemas/Extension'