/** * This file was auto-generated by openapi-typescript. * Do not make direct changes to the file. */ export interface paths { "/ping": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Health ping endpoint * @description Simple endpoint to check if the service is running */ get: operations["ping"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/health": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Detailed health check * @description Returns detailed health status of the service */ get: operations["health"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/auth/login": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Initiate login with an identity provider * @description Selects an enabled identity provider, generates a CSRF state, stores the * (state, provider) pair in a signed `vx_state` cookie, and returns the * provider's authorization URL. The client should redirect the user to this * URL to begin the authentication flow. * * The provider is chosen with the `provider` query parameter, whose value is * one of the deployment's enabled providers (e.g. `google`, `github`, * `oidc`). When exactly one provider is enabled the parameter may be omitted * and that provider is used. When several are enabled the parameter is * required; an unknown or disabled value is rejected (no silent default). */ get: operations["login"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/auth/providers": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List enabled login providers * @description Returns the login providers enabled in this deployment's configuration, * each with a canonical `name` (the value to pass as `?provider=` to * `GET /api/v1/auth/login`) and a human-readable `display_name` for the * login UI. The login screen uses this to render a provider picker instead * of hardcoding the provider list. The list is stable-sorted and may be * empty when no provider is configured. */ get: operations["listAuthProviders"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/auth/callback": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Handle the identity-provider OAuth callback * @description Validates the CSRF `vx_state` cookie, recovers the provider bound to it, * exchanges the authorization code with that provider, looks up or creates * the user, writes a session cookie, and issues a 302 redirect to the * frontend home page. This endpoint is called by the browser after the user * authenticates with the upstream provider — it does not return a JSON body * on success. */ get: operations["authCallback"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/auth/logout": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Log out current user * @description Clears the session cookie and returns a JSON confirmation. After calling this * endpoint the client should discard any cached user state and redirect to the * login page. */ post: operations["logout"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/auth/dev/login": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Dev login (development only) * @description Creates or retrieves a user by email address and sets a session cookie without * going through an external identity provider. Only available when the server is * running in development mode (`DEV_LOGIN_ENABLED=true`). Returns 404 in all other environments. */ post: operations["devLogin"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/auth/me": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get current user information * @description Returns information about the currently authenticated user. Authentication is * verified via the encrypted session cookie (`vx_session`) set during the * identity-provider OAuth flow or dev login. */ get: operations["getMe"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/api-keys": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List API keys * @description Retrieves all API keys for the authenticated user */ get: operations["listAPIKeys"]; put?: never; /** * Create new API key * @description Creates a new API key for the authenticated user */ post: operations["createAPIKey"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/api-keys/{id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; post?: never; /** * Delete API key * @description Deletes an API key by ID */ delete: operations["deleteAPIKey"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/settings/api-keys": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List API keys * @description Retrieves all API keys for the authenticated user */ get: operations["listAPIKeysSettings"]; put?: never; /** * Create new API key * @description Creates a new API key for the authenticated user */ post: operations["createAPIKeySettings"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/settings/api-keys/{id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; post?: never; /** * Delete API key * @description Deletes an API key by ID */ delete: operations["deleteAPIKeySettings"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/support/message": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Submit support request * @description Submit a support request from an authenticated user. The request is sent to the VibeXP support team * via email. Optionally, an acknowledgement email can be sent to the user. */ post: operations["submitSupportRequest"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/artifacts": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List artifacts * @description Retrieves all artifacts for the specified team with optional filtering */ get: operations["listArtifacts"]; put?: never; /** * Create new artifact * @description Creates a new artifact for the authenticated user within the specified team */ post: operations["createArtifact"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/artifacts/stats": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get artifact statistics * @description Returns statistics about artifacts for the specified team */ get: operations["getArtifactStats"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/artifacts/{project_id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List artifacts by project * @description Retrieves artifacts for a specific project within the specified team */ get: operations["listArtifactsByProject"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/artifacts/{project_id}/{slug}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get artifact by project and slug * @description Retrieves a specific artifact by project ID and slug within the specified team */ get: operations["getArtifact"]; /** * Update artifact by project and slug * @description Updates a specific artifact by project ID and slug within the specified team */ put: operations["updateArtifact"]; post?: never; /** * Delete artifact by project and slug * @description Deletes a specific artifact by project ID and slug within the specified team */ delete: operations["deleteArtifact"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/attachments": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List attachments for an owner * @description Returns all attachments for the resource identified by the `owner_type` and `owner_id` query parameters, newest first, plus their combined size. */ get: operations["listAttachments"]; put?: never; /** * Upload an attachment * @description Uploads a single file (multipart field `file`) as an attachment on the resource identified by `owner_type` + `owner_id`. The owner_type must have a registered authorizer (currently `artifact`, `prompt`, `blueprint`); an unsupported owner_type returns 404. Enforces a 5 MB per-file limit, a 10 MB cumulative limit per owner, and a safe file-type allowlist. */ post: operations["uploadAttachment"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/attachments/{id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Download an attachment * @description Streams the attachment file as a download (Content-Disposition: attachment). The attachment id is sufficient; its owner is read from the stored row and authorized via the owner authorizer registry. */ get: operations["downloadAttachment"]; put?: never; post?: never; /** * Delete an attachment * @description Deletes the attachment metadata row and the stored object. The attachment id is sufficient; its owner is read from the stored row and authorized via the owner authorizer registry. */ delete: operations["deleteAttachment"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/artifacts/{project_id}/{slug}/attachments": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List attachments for an artifact * @deprecated * @description Returns all attachments on the artifact, newest first, plus their combined size. */ get: operations["listArtifactAttachments"]; put?: never; /** * Upload an attachment to an artifact * @deprecated * @description Uploads a single file (multipart field `file`) as an attachment on the artifact. Enforces a 5 MB per-file limit, a 10 MB cumulative limit per artifact, and a safe file-type allowlist. */ post: operations["uploadArtifactAttachment"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/artifacts/{project_id}/{slug}/attachments/{id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Download an artifact attachment * @deprecated * @description Streams the attachment file as a download (Content-Disposition attachment). */ get: operations["downloadArtifactAttachment"]; put?: never; post?: never; /** * Delete an artifact attachment * @deprecated * @description Deletes the attachment metadata row and the stored object. */ delete: operations["deleteArtifactAttachment"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/artifacts/{project_id}/{slug}/versions": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List artifact content versions * @description Returns the content-version history (newest first) for an artifact */ get: operations["listArtifactVersions"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/artifacts/{project_id}/{slug}/versions/{version_number}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get a specific artifact content version * @description Returns a single content-version snapshot of an artifact by version number */ get: operations["getArtifactVersion"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/artifacts/{project_id}/{slug}/versions/{version_number}/restore": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Restore an artifact to a content version * @description Restores the artifact's content to the given version. The pre-restore content is snapshotted as a new version. Returns the updated artifact. */ post: operations["restoreArtifactVersion"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/search": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Semantic search across team resources * @description Performs a pgvector cosine-similarity semantic search over the team's prompts, artifacts, blueprints and memories, returning relevance-ranked excerpts for RAG retrieval. One result is returned per matching entity, carrying its best-scoring (closest) chunk; `total_count`/`total_pages` count distinct matching resources, not chunks. */ post: operations["searchTeamResources"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/resource-access-metrics": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Per-resource daily access metrics * @description Returns a zero-filled daily access timeseries for a single resource, grouped by source (web, cli, mcp, api), for the resource detail-page chart. Every day in the requested range appears even when its count is zero. Free-tier accessible to team members. */ get: operations["getResourceAccessMetrics"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/memories": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List memories * @description Retrieves all memories for the authenticated user within the specified team with optional filtering */ get: operations["listMemories"]; put?: never; /** * Create new memory * @description Creates a new memory for the authenticated user within the specified team */ post: operations["createMemory"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/memories/{id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get memory by ID * @description Retrieves a specific memory by its ID within the specified team */ get: operations["getMemory"]; /** * Update memory by ID * @description Updates a specific memory by its ID within the specified team */ put: operations["updateMemory"]; post?: never; /** * Delete memory by ID * @description Deletes a specific memory by its ID within the specified team */ delete: operations["deleteMemory"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/memories/{id}/versions": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List memory content versions * @description Returns the content-version history (newest first) for a memory */ get: operations["listMemoryVersions"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/memories/{id}/versions/{version_number}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get a specific memory content version * @description Returns a single content-version snapshot of a memory by version number */ get: operations["getMemoryVersion"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/memories/{id}/versions/{version_number}/restore": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Restore a memory to a content version * @description Restores the memory's text to the given version. The pre-restore text is snapshotted as a new version. Returns the updated memory. */ post: operations["restoreMemoryVersion"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/projects/{slug}/stats": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get project statistics * @description Returns resource counts for a specific project within the specified team. */ get: operations["getProjectStats"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/projects/{slug}/resource-creation-metrics": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Per-project daily resource-creation metrics * @description Returns a zero-filled daily creation timeseries for a single project, counting prompts, artifacts, blueprints, and memories created on each day, for the project detail-page chart. Every day in the requested range appears even when its count is zero. Authorized via team ownership/membership (same boundary as the project stats endpoint). */ get: operations["getProjectResourceCreationMetrics"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/blueprints": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List spec libraries * @description Retrieves all spec libraries for the authenticated user with optional filtering and pagination. */ get: operations["listSpecLibraries"]; put?: never; /** * Create new spec library * @description Creates a new spec library for the authenticated user. Spec libraries are used to store API specifications (OpenAPI, AsyncAPI, etc.) and other technical documentation. */ post: operations["createBlueprint"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/blueprints/stats": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get spec library statistics * @description Returns statistics about user's spec libraries including counts by type, status, and recent additions */ get: operations["getBlueprintStats"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/blueprints/{project_id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List spec libraries by project * @description Retrieves spec libraries for a specific project with optional filtering. */ get: operations["listSpecLibrariesByProject"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/blueprints/{project_id}/{slug}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get spec library by project and slug * @description Retrieves a specific spec library by project name and slug */ get: operations["getBlueprint"]; /** * Update spec library by project and slug * @description Updates a specific spec library by project name and slug. All fields in the request body are optional - only provided fields will be updated. */ put: operations["updateBlueprint"]; post?: never; /** * Delete spec library by project and slug * @description Deletes a specific spec library by project name and slug. This also deletes associated embeddings. */ delete: operations["deleteBlueprint"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/blueprints/{project_id}/{slug}/versions": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List blueprint content versions * @description Returns the content-version history (newest first) for a blueprint */ get: operations["listBlueprintVersions"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/blueprints/{project_id}/{slug}/versions/{version_number}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get a specific blueprint content version * @description Returns a single content-version snapshot of a blueprint by version number */ get: operations["getBlueprintVersion"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/blueprints/{project_id}/{slug}/versions/{version_number}/restore": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Restore a blueprint to a content version * @description Restores the blueprint's content to the given version. The pre-restore content is snapshotted as a new version. Returns the updated blueprint. */ post: operations["restoreBlueprintVersion"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/prompts": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List prompts * @description Retrieves a paginated list of prompts for the specified team with optional filtering. */ get: operations["listPrompts"]; put?: never; /** * Create a new prompt * @description Creates a new prompt template for the specified team. The prompt can be used to store * reusable AI instructions with placeholders and references. */ post: operations["createPrompt"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/prompts/labels": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get prompt labels * @description Retrieves all unique labels used across prompts for the specified team. */ get: operations["getPromptLabels"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/prompts/{slug}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get a prompt by slug * @description Retrieves a specific prompt by its slug identifier for the specified team. */ get: operations["getPrompt"]; /** * Update a prompt * @description Updates an existing prompt for the specified team. All fields are optional. */ put: operations["updatePrompt"]; post?: never; /** * Delete a prompt * @description Deletes a prompt and its associated embeddings for the specified team. */ delete: operations["deletePrompt"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/prompts/{slug}/placeholders": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get prompt placeholders * @description Extracts and returns all placeholders (e.g., {{variable}}) found in the prompt body. */ get: operations["getPromptPlaceholders"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/prompts/{slug}/dependencies": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get prompt dependencies * @description Returns prompts that reference this prompt using @references syntax. */ get: operations["getPromptDependencies"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/prompts/{slug}/render": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Render a prompt * @description Renders a prompt by resolving @references and substituting placeholders with provided values. */ post: operations["renderPrompt"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/prompts/{slug}/share": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get prompt share details * @description Retrieves the share configuration for a prompt */ get: operations["getPromptShare"]; put?: never; /** * Create or update prompt share * @description Creates or updates a share for a prompt. Supports two share types: * - `public`: Anyone with the link can access the prompt * - `restricted`: Only specific email addresses can access the prompt */ post: operations["createPromptShare"]; /** * Delete prompt share * @description Removes the share for a prompt, making it no longer accessible via the shared link */ delete: operations["deletePromptShare"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/prompts/{slug}/versions": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List prompt content versions * @description Returns the content-version history (newest first) for a prompt. Each snapshot holds the raw prompt Body template (placeholders and @slug references), not any rendered output. */ get: operations["listPromptVersions"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/prompts/{slug}/versions/{version_number}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get a specific prompt content version * @description Returns a single content-version snapshot of a prompt by version number */ get: operations["getPromptVersion"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/prompts/{slug}/versions/{version_number}/restore": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Restore a prompt to a content version * @description Restores the prompt's raw Body template to the given version. The pre-restore body is snapshotted as a new version, so restore is non-destructive and preserves placeholders and @slug references. Returns the updated prompt. */ post: operations["restorePromptVersion"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/prompt-gallery/categories": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get prompt gallery categories * @description Retrieves all prompt categories with counts */ get: operations["getPromptGalleryCategories"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/prompt-gallery/prompts": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List prompt gallery prompts * @description Retrieves prompts from the gallery with optional filtering */ get: operations["listPromptGalleryPrompts"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/prompt-gallery/prompts/{id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get prompt gallery prompt by ID * @description Retrieves a specific prompt from the gallery */ get: operations["getPromptGalleryPrompt"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/prompt-gallery/prompts/{id}/use": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Track prompt gallery usage * @description Tracks when a user uses a prompt from the gallery */ post: operations["trackPromptGalleryUsage"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/shared/prompts/{token}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Access shared prompt * @description Public endpoint to access a shared prompt via its share token. * - For `public` shares: No authentication required * - For `restricted` shares: JWT authentication required and email must be in the access list * * Returns the prompt with @references resolved but {{placeholders}} preserved for client-side substitution. */ get: operations["getSharedPrompt"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/bo/v1/reports/usage-and-growth": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get usage and growth data * @description Retrieves platform-wide usage metrics and per-user activity data. * This endpoint is for administrative purposes only and requires the back office admin API key. * It is NOT accessible via JWT tokens or regular API keys. */ get: operations["getUsageAndGrowth"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/integrations/github/status": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get GitHub App installation status * @description Returns the GitHub App installation status for the specified team. */ get: operations["getGitHubStatus"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/integrations/github/install-url": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get GitHub App installation URL * @description Returns a signed GitHub App installation URL with CSRF protection. Requires team owner/admin — the same permission as completing the callback, so a caller cannot start an install they would be refused at the end of. */ get: operations["getGitHubInstallURL"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/integrations/github/callback": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Handle GitHub App installation callback * @description Completes the GitHub App installation flow after the user authorizes the app on GitHub. * The request must include the `installation_id` returned by GitHub, the signed `state` * parameter from the install URL (CSRF protection), and the `code` GitHub appends to the * post-install redirect. The `code` is exchanged for a user access token and the * installation is only bound to the team when that user has access to it on GitHub — a valid * `state` alone is not sufficient. Requires team owner/admin. */ post: operations["handleGitHubCallback"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/integrations/github/repositories": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List GitHub repositories * @description Lists GitHub repositories accessible by the team's GitHub App installation with pagination. */ get: operations["listGitHubRepositories"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/integrations/github/repositories/{repo_id}/import-project": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Import GitHub repository as a project * @description Imports a GitHub repository as a VibeXP project for the team. If a project already exists * for the repository URL it returns the existing project (idempotent). */ post: operations["importGitHubProject"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/integrations/github/import-blueprints": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Import AI assistant configurations as blueprints * @description Scans the specified GitHub repository for AI assistant configuration files * (`.claude/`, `.cursor/`, `.codex/`, `.agents/`, `CLAUDE.md`, `CURSOR.md`, `AGENTS.md`) * and imports each markdown file as a blueprint. A project must already exist for the * repository — use the import-project endpoint first. */ post: operations["importGitHubBlueprints"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/integrations/github/disconnect": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; post?: never; /** * Disconnect GitHub App installation * @description Removes the GitHub App installation link for the team. */ delete: operations["disconnectGitHub"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/webhooks/github": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Retired — use the per-App webhook URL * @description **Retired (410 Gone).** This endpoint verified deliveries against a single * instance-wide webhook secret. Each team now registers its own GitHub App * with its own secret, so there is no single secret left to verify against * and this path cannot be made to work. * * Each team's webhook URL is shown in its GitHub App settings; update it on * GitHub. This path is kept for a release or two so misdirected deliveries * get an explanation rather than a signature error. */ post: operations["handleGitHubWebhook"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/webhooks/github/{token}": { parameters: { query?: never; header?: never; path: { /** @description Opaque routing token identifying which team's GitHub App this delivery belongs to. Minted as unpadded URL-safe base64, so it needs no percent-encoding. Treat it as a secret: it selects the secret the signature is verified against, and it is redacted from access logs. */ token: string; }; cookie?: never; }; get?: never; put?: never; /** * Handle a GitHub webhook delivery for one team's App * @description Receives a GitHub webhook delivery for the App identified by the routing * token in the path. Each team registers its own GitHub App with its own * webhook secret, so the token is what selects which secret the * `X-Hub-Signature-256` HMAC is verified against. * * Public and unauthenticated by necessity — GitHub posts with no session. * The token routes the delivery; the webhook secret authenticates it. The * payload is not parsed until the signature verifies, so no attacker-supplied * byte influences which key it is checked with. * * An unknown or malformed token returns 404 with no detail, so the endpoint * cannot be used to discover which tokens exist. */ post: operations["handleGitHubWebhookByToken"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/feeds": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List feeds * @description Returns all feeds for the specified team with optional pagination */ get: operations["listFeeds"]; put?: never; /** * Create a new feed * @description Creates a new AI feed channel for the specified team (free-tier accessible) */ post: operations["createFeed"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/feeds/{feed_id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get a feed * @description Retrieves a specific feed by ID */ get: operations["getFeed"]; /** * Update a feed * @description Updates the name and/or description of an existing feed */ put: operations["updateFeed"]; post?: never; /** * Delete a feed * @description Permanently deletes a feed and cascades deletion to all its items */ delete: operations["deleteFeed"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/feeds/{feed_id}/items": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List items in a feed * @description Returns paginated items for a specific feed */ get: operations["listFeedItemsByFeed"]; put?: never; /** * Create a feed item * @description Posts a new AI-generated item to a specific feed */ post: operations["createFeedItem"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/feed-items": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List all feed items (cross-feed) * @description Returns paginated feed items across all feeds for the team, with optional filters */ get: operations["listFeedItems"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/feed-items/{item_id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get a feed item * @description Retrieves a specific feed item by ID (detail page) */ get: operations["getFeedItem"]; put?: never; post?: never; /** * Delete a feed item * @description Permanently deletes a feed item (hard delete) */ delete: operations["deleteFeedItem"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/feed-items/{item_id}/archive": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Archive a feed item * @description Sets archived_at to the current server time for the specified feed item */ post: operations["archiveFeedItem"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/feed-items/{item_id}/unarchive": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Unarchive a feed item * @description Clears archived_at (sets to NULL) for the specified feed item */ post: operations["unarchiveFeedItem"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/invitations/{token}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get invitation details by token * @description Returns enriched invitation details (team name, inviter info, role, status, expiry) * for the email-link landing page so the user can review the invitation before * accepting or rejecting it. * * Returns honest, distinct HTTP statuses for the lifecycle: * - `200` — valid pending invitation * - `404` — unknown / not found token * - `410 Gone` — invitation pending but past `expires_at` * - `409 Conflict` — invitation already accepted, rejected, or revoked */ get: operations["getInvitationByToken"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/agents": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List agents * @description Returns the agents of the specified team with optional filtering, sorting, and pagination */ get: operations["listAgents"]; put?: never; /** * Create new agent * @description Registers a new A2A agent for the specified team. The agent card is fetched * from `card_url` at creation time; name and description default to the card * values when omitted. */ post: operations["createAgent"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/agents/preview-card": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Preview agent card * @description Fetches and returns an A2A agent card from the given URL without creating an agent */ post: operations["previewAgentCard"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/agents/stats": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get agent statistics * @description Returns aggregate agent statistics and recent activity for the specified team */ get: operations["getAgentStats"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/agents/{id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get agent * @description Retrieves a specific agent by ID */ get: operations["getAgent"]; /** * Update agent * @description Updates an existing agent. When `card_url` is provided the agent card is * re-fetched. Agents cannot be moved between teams once created. */ put: operations["updateAgent"]; post?: never; /** * Delete agent * @description Permanently deletes an agent */ delete: operations["deleteAgent"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/agents/{id}/credentials": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; /** * Update agent credentials * @description Replaces the stored credentials for an agent. Values are encrypted at rest and never returned. */ put: operations["updateAgentCredentials"]; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/agents/{id}/execute": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Execute agent * @description Invokes an agent via the A2A protocol. For streaming-capable agents the call * returns immediately with status `pending` or `submitted`; poll * `GET /agents/executions/{id}/status` and fetch * `GET /agents/executions/{id}/events` for progress. For non-streaming agents * the call blocks until the execution finishes with status `success` or `error`. */ post: operations["executeAgent"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/agents/{id}/executions": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List agent executions * @description Returns executions for an agent with optional filtering and pagination */ get: operations["listAgentExecutions"]; put?: never; /** * Start agent execution * @description Creates a new execution record for an agent (manual execution tracking) */ post: operations["startAgentExecution"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/agents/{id}/conversations": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List agent conversations * @description Returns paginated conversation summaries for an agent */ get: operations["listAgentConversations"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/agents/executions/{execution_id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get agent execution * @description Retrieves a specific agent execution by ID */ get: operations["getAgentExecution"]; /** * Complete agent execution * @description Updates an execution with its final status, output, and optional error (manual execution tracking) */ put: operations["completeAgentExecution"]; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/agents/executions/{execution_id}/cancel": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Cancel an agent execution * @description Cancels a running agent execution: aborts local streaming, asks the remote * agent to cancel its task (A2A `tasks/cancel`) when there is one, and marks * the execution `cancelled`. The execution's agent must belong to the * specified team. */ post: operations["cancelAgentExecution"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/agents/executions/{id}/status": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get execution status * @description Returns the current status and A2A state of an agent execution, including * artifacts. The execution's agent must belong to the specified team. */ get: operations["getAgentExecutionStatus"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/agents/executions/{id}/events": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get execution events * @description Returns streaming events for an execution. Supports two modes: cursor-based * polling via `?since={sequence}` (returns execution status plus events after * that sequence number) and page-based pagination via `?page`/`?limit` for * historical viewing. */ get: operations["getAgentExecutionEvents"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/agents/conversations/{conversation_id}/executions": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List conversation executions * @description Returns the executions belonging to a conversation with cursor-based pagination (newest first, use `before` to page backwards) */ get: operations["listConversationExecutions"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/teams": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List teams * @description Returns the paginated list of teams the current user belongs to. Invalid * `page`/`page_size` values silently fall back to the defaults. */ get: operations["listTeams"]; put?: never; /** * Create a new team * @description Creates a new team owned by the current user and synchronously bootstraps a * default "Project 1" project inside it so resources created immediately * afterwards are correctly scoped. */ post: operations["createTeam"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/teams/{id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get a team * @description Returns the team with the requesting user's role populated (member_count is only populated on list responses and is 0 here). */ get: operations["getTeam"]; /** * Update a team * @description Updates the team's name and/or description. Only team owners can update a * team. At least one of `name` or `description` must be provided. */ put: operations["updateTeam"]; post?: never; /** * Delete a team * @description Deletes a team. Only team owners can delete a team; personal workspaces and * the default team cannot be deleted. * * Deletion conflicts return `409` with RFC 9457 problem details carrying an * UPPERCASE `code` and string-valued `metadata`: * - `TEAM_HAS_MEMBERS` — remove all members first (`metadata.member_count`) */ delete: operations["deleteTeam"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/teams/{id}/members": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List team members * @description Returns the paginated list of team members with user details and invitation * status. Invalid `page`/`page_size` values silently fall back to the defaults. */ get: operations["getTeamMembers"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/teams/{id}/members/{userId}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; post?: never; /** * Remove a team member * @description Removes a member from the team. Only team owners can remove members, and the * team owner cannot be removed. */ delete: operations["removeTeamMember"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/teams/{id}/members/{userId}/role": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; post?: never; delete?: never; options?: never; head?: never; /** * Change a team member's role * @description Changes a member's role between `member` and `admin`. * * Requires the caller to be an **owner or admin** of the team. The role value * may only be `member` or `admin` — ownership is never granted this way; use * the transfer-ownership operation instead. The team owner's role cannot be * changed by this operation, not even by another admin. */ patch: operations["updateTeamMemberRole"]; trace?: never; }; "/api/v1/teams/{id}/transfer-ownership": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Transfer team ownership * @description Transfers ownership of the team to another member. * * Requires the caller to be the **owner** of the team; admins cannot transfer * ownership. The target must already be a member. The target becomes the * owner and the previous owner becomes an admin, applied in a single * transaction so the team always has exactly one owner. Personal workspaces * cannot be transferred. */ post: operations["transferTeamOwnership"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/teams/{id}/invitations": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List team invitations * @description Returns all invitations for the team, each with its `token` populated so * an admin or owner can copy the accept link and share it out of band. The * `team_name` and `invited_by` fields are not populated on this listing. */ get: operations["listTeamInvitations"]; put?: never; /** * Send team invitations * @description Sends invitations to join the team to up to 50 email addresses with the given * role. Requires an eligible team (not a personal workspace). Team membership is * unlimited. * * Inviting users who are already team members returns `409` with code * `DUPLICATE_MEMBERS` and a top-level `duplicate_emails` string array. */ post: operations["sendTeamInvitations"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/teams/{id}/invitations/{invitationId}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; post?: never; /** * Revoke a team invitation * @description Revokes a pending team invitation so its token can no longer be accepted. */ delete: operations["revokeTeamInvitation"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/teams/{id}/stats": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get team statistics * @description Returns team-wide resource counts (projects, prompts, artifacts, blueprints, memories, feed items) for the team analytics page. Authorized via team membership. */ get: operations["getTeamStats"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/teams/{id}/resource-creation-metrics": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Per-team daily resource-creation metrics * @description Returns a zero-filled daily creation timeseries for a team, counting prompts, artifacts, blueprints, memories, and projects created on each day, for the team analytics-page chart. Every day in the requested range appears even when its count is zero. Authorized via team membership. */ get: operations["getTeamResourceCreationMetrics"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/teams/{id}/resource-access-metrics": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Per-team daily access metrics * @description Returns a zero-filled daily access timeseries for a team, grouped by source (web, cli, mcp, api), aggregated across every resource in the team, for the team analytics-page chart. Every day in the requested range appears even when its count is zero. Authorized via team membership. */ get: operations["getTeamResourceAccessMetrics"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/teams/{id}/feed-creation-metrics": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Per-team daily feed-creation metrics * @description Returns a zero-filled daily feed-creation timeseries for a team, counting feeds (channels, by creation date) and feed_items (AI updates posted, by posted date) on each day, for the team analytics-page "AI feeds created" chart. Every day in the requested range appears even when its count is zero. Authorized via team membership. */ get: operations["getTeamFeedCreationMetrics"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/teams/{id}/top-accessed-resources": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Per-team most-accessed resources * @description Returns the team's most-accessed resources over the requested window, ranked by access count descending and capped by the limit parameter, with each row's display name resolved so the frontend can render and deep-link it. Authorized via team membership. */ get: operations["getTeamTopAccessedResources"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/invitations/pending": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get pending invitations for the current user * @description Returns the current user's pending team invitations (matched by the user's * email), enriched with team name and inviter details where available. The * response is not actually paginated: all pending invitations are returned and * `page`/`page_size` are fixed at `1`/`20`. */ get: operations["getPendingInvitations"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/invitations/{token}/accept": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Accept a team invitation * @description Accepts a pending team invitation by token and adds the current user to the * team. The invitation must have been sent to the authenticated user's email * address. */ post: operations["acceptInvitation"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/invitations/{token}/reject": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Reject a team invitation * @description Rejects a pending team invitation by token. Only the invited user can reject it. */ post: operations["rejectInvitation"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/notifications": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List notifications * @description Returns the authenticated user's in-app notifications, newest first, with * offset-based pagination. `count` is the number of items in this page (≤ `limit`), * not the global total — use the unread-count endpoint for unread totals. */ get: operations["listNotifications"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/notifications/unread-count": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get unread notification count * @description Returns the total number of unread notifications for the authenticated user. */ get: operations["getUnreadNotificationCount"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/notifications/{id}/read": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; post?: never; delete?: never; options?: never; head?: never; /** * Mark notification as read * @description Marks a single notification as read for the authenticated user. Idempotent — * succeeds with 204 even if the notification is already read or does not belong * to the user (no 404 is returned). */ patch: operations["markNotificationRead"]; trace?: never; }; "/api/v1/notifications/read-all": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; post?: never; delete?: never; options?: never; head?: never; /** * Mark all notifications as read * @description Marks all of the authenticated user's notifications as read. No request body is required. */ patch: operations["markAllNotificationsRead"]; trace?: never; }; "/api/v1/{team_id}/types": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List types for a resource * @description Returns every type visible to the team for the given `resource_type`: the global system defaults plus the team's own custom types, system defaults first. */ get: operations["listTypes"]; put?: never; /** * Create a custom type * @description Creates a team-owned custom type for the given resource. The slug must be URL-safe (lowercase letters, numbers, hyphens) and unique within the team for the resource — a collision with a global default or an existing team type returns 409. */ post: operations["createType"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/types/{id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; post?: never; /** * Delete a custom type * @description Deletes a team-owned custom type. System defaults cannot be deleted (a delete targeting one — or another team's type — returns 404). Any resources still referencing the deleted type are reassigned to the resource's system default in the same transaction. */ delete: operations["deleteType"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/types/copy": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Copy another team's custom types into this team * @description Merges the custom types of `source_team_id` into the team named by `{team_id}`. The caller must be a member of BOTH teams — the same bar the destination's own create path sets — and the destination is checked first, so a caller who belongs to neither learns nothing about either. * The copy is a snapshot: the destination fully owns the resulting rows and may edit or delete them with no effect on the source. Global system defaults are excluded (every team already has them), and a slug the destination already uses is reported as skipped rather than failing the whole copy. */ post: operations["copyTypesFromTeam"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/admin/stats": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get instance statistics * @description Returns instance-wide entity counts (users, teams, prompts, artifacts, * memories) and the running backend application version. Requires the * authenticated user to be a configured instance admin * (auth.instance_admins); non-admin and unauthenticated requests receive 404. */ get: operations["getAdminStats"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/admin/users": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List instance users * @description Returns a paginated, instance-wide listing of users with each user's team * count. Supports case-insensitive search, typed filters, and allowlisted * sorting; filters combine with AND and the pagination envelope reflects the * filtered set. Instance-admin only; non-admin and unauthenticated requests * receive 404. */ get: operations["listAdminUsers"]; put?: never; /** * Create an instance user * @description Creates a user account directly, without waiting for them to complete an * identity-provider sign-in. * * The account is provisioned exactly like a self-signup: it gets a personal * "Private Workspace" team (owner membership, set as the user's default team) * and a default project. That provisioning is driven by the same * `user.created` event the sign-in path publishes, and it is handled * ASYNCHRONOUSLY — so the personal workspace may appear a moment after this * operation returns 201, exactly as it does for a self-signup. If the event * cannot be published at all, the user is not created and this returns 500, * so an unprovisioned account is never left behind. * * No password is set (VibeXP has no password provider); the account's owner * signs in through the configured identity provider. Instance-admin rights * are config-only and cannot be granted here. * * A duplicate email returns 409 and creates nothing. Instance-admin only; * non-admin and unauthenticated requests receive 404. */ post: operations["createAdminUser"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/admin/users/{id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get an instance user * @description Returns one user with their team memberships (team name + the user's role * in each team). Instance-admin only; non-admin and unauthenticated requests * receive 404, as does an unknown user id. */ get: operations["getAdminUser"]; put?: never; post?: never; /** * Delete an instance user * @description **Permanently and irreversibly** deletes a user. This cascades: the user's * personal team and everything they own (prompts, artifacts, memories, * projects, agents, feeds, API keys, …) are destroyed with them. Rows in * `attachments`, `content_versions`, `resource_access_events` and `types` * survive with a null user reference so audit and analytics history is kept. * * **Suspension (`POST /admin/users/{id}/suspend`) is the reversible * alternative** and should be preferred unless the data genuinely must go. * * The delete is REFUSED with 409 when the user owns any shared (non-personal) * team that still has other members, because removing them would cascade that * team away and destroy its other members' data. The response lists every * blocking team; transfer ownership first. Nothing is deleted in that case. * * Also refused with 409 when the acting admin targets themselves, or when the * target's email is listed in the `auth.instance_admins` config allowlist. * * Instance-admin only; non-admin and unauthenticated requests receive 404. */ delete: operations["deleteAdminUser"]; options?: never; head?: never; /** * Update an instance user * @description Updates the display name of a user. This is the ONLY field an instance * admin may change: `email`, `idp_provider` and `idp_subject` are owned by the * upstream identity provider, and a body containing any unknown or * non-editable field is rejected with 400 rather than silently ignored. * Instance-admin only; non-admin and unauthenticated requests receive 404. */ patch: operations["updateAdminUser"]; trace?: never; }; "/api/v1/admin/teams": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List instance teams * @description Returns a paginated, instance-wide listing of teams with each team's owner * and member count. Supports case-insensitive search, typed filters, and * allowlisted sorting; filters combine with AND and the pagination envelope * reflects the filtered set. Instance-admin only; non-admin and * unauthenticated requests receive 404. */ get: operations["listAdminTeams"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/admin/teams/{id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get an instance team * @description Returns one team with its owner and member list (each member's user * id/email/name, role, and join time). Instance-admin only; non-admin and * unauthenticated requests receive 404, as does an unknown team id. */ get: operations["getAdminTeam"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/admin/dashboard/overview": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get admin dashboard overview * @description Returns instance-wide entity totals, status/type breakdowns, and system * health (database size and per-table estimated row counts), plus the running * backend version. Computed on demand — there are no rollup tables. * Instance-admin only; non-admin and unauthenticated requests receive 404. */ get: operations["getAdminDashboardOverview"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/admin/dashboard/timeseries": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get admin dashboard time series * @description Returns growth, sign-in, and resource-access-by-source counts bucketed over * a time range. Omitting the parameters yields the last 30 days at `day` * granularity. Every bucket in the range is present in every series with an * explicit 0. * * Both event sources are TTL-pruned (config `retention.activity_days` and * `retention.access_event_days`), so the response carries a `data_window` * stating the earliest instant for which data still exists — a range older * than that legitimately reads as zeros rather than missing data. * * Instance-admin only; non-admin and unauthenticated requests receive 404. */ get: operations["getAdminDashboardTimeseries"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/admin/users/{id}/suspend": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Suspend a user * @description Suspends the account, blocking it at EVERY authentication entry point: * existing cookie sessions, API keys and MCP/OAuth bearer tokens all stop * working on their next request, not at expiry. A suspended user also cannot * complete a fresh sign-in. * * Suspension is instance-local — it does not disable the account at the * upstream identity provider — and is fully reversible via the reactivate * operation, with no data loss. * * Rejected with 409 when the acting admin targets themselves, or when the * target's email is listed in the `auth.instance_admins` config allowlist * (which would otherwise let an instance lock itself out of its own admin * surface). * * Suspending an already-suspended user is a no-op and returns 200. * Instance-admin only; non-admin and unauthenticated requests receive 404. */ post: operations["suspendAdminUser"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/admin/users/{id}/reactivate": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Reactivate a suspended user * @description Restores a suspended account to `active`. Access is restored at every * authentication entry point on the next request, and no data is lost — * teams, resources and API keys are untouched by suspension. * * Reactivating an already-active user is a no-op and returns 200. * Instance-admin only; non-admin and unauthenticated requests receive 404. */ post: operations["reactivateAdminUser"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/admin/projects": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List instance projects * @description Returns a paginated, instance-wide listing of projects with each project's * owning team and its creator. Supports case-insensitive search, typed * filters, and allowlisted sorting; filters combine with AND and the * pagination envelope reflects the filtered set. * * `owner` is the project's creator (`projects.user_id`), which is not * necessarily the owning team's owner. * * Instance-admin only; non-admin and unauthenticated requests receive 404. */ get: operations["listAdminProjects"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/admin/projects/{id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get an instance project * @description Returns one project with its owning team, its creator, and how many of each * PROJECT-SCOPED resource type it contains (prompts, artifacts, memories, * blueprints). Agents and feeds are not included because they are team-scoped * and have no project association. * * Instance-admin only; non-admin and unauthenticated requests receive 404, as * does an unknown project id. */ get: operations["getAdminProject"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/comments": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List a resource's comments * @description Returns a page of comments on the given resource, newest first. The caller must be a member of the team. */ get: operations["listComments"]; put?: never; /** * Create a comment * @description Adds a comment on a resource. Any team member may comment; the target resource must exist in the team (404 otherwise). */ post: operations["createComment"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/comments/recent": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List recent comment activity * @description Returns the team's most recent comment activity for the homepage card, ordered by latest activity (an edited comment resurfaces). Each entry carries its resource's resolved title and link fields; entries whose resource has been deleted are omitted. */ get: operations["listRecentComments"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/comments/{comment_id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; post?: never; /** * Delete a comment * @description Deletes a comment. The author may delete their own; a team admin or owner may delete any comment (403 otherwise). */ delete: operations["deleteComment"]; options?: never; head?: never; /** * Edit a comment * @description Updates a comment's content. Only the comment's author may edit it; no role can edit another member's comment (403 otherwise). */ patch: operations["updateComment"]; trace?: never; }; "/api/v1/{team_id}/relations": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List a resource's relations * @description Returns a page of the relations touching the given resource — both directions (the resource as subject or as object) — newest first, each enriched with the other endpoint's resolved title. The caller must be a member of the team. */ get: operations["listRelations"]; put?: never; /** * Create a relation * @description Creates a typed edge between two resources. Any team member may create a relation; both endpoints must exist in the team and share a project, and the object type must satisfy the relation-type matrix. Creation is idempotent — a duplicate edge returns the existing row with 200 instead of 201. */ post: operations["createRelation"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/relations/{relation_id}/confirm": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Confirm a suggested relation * @description Promotes a suggested relation to confirmed, recording the caller as the confirmer. Requires permission to update any resource in the team. Confirming an already-confirmed relation returns 409. */ post: operations["confirmRelation"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/relations/{relation_id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; post?: never; /** * Delete a relation * @description Deletes a relation. The creator may delete their own; a team admin or owner may delete any relation. */ delete: operations["deleteRelation"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/relations/seed": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Seed suggested relations from embedding similarity * @description Triggers a one-shot, per-team embedding-similarity backfill that proposes typed relations (origin=ai, status=suggested) between similar resources. Runs in the background and coalesces concurrent triggers; returns 202 immediately. Requires permission to create resources in the team. */ post: operations["seedRelations"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/embedding-providers": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; }; cookie?: never; }; /** * List embedding providers * @description Retrieves all embedding providers belonging to the authenticated user. * Returns a bare JSON array (no pagination envelope). Encrypted API keys * are never included; each item carries a `has_api_key` boolean instead. */ get: operations["listEmbeddingProviders"]; put?: never; /** * Create embedding provider * @description Creates a new embedding provider configuration for the authenticated user. * The `api_key` supplied in the request is encrypted at rest and is never * returned by the API — responses expose only a `has_api_key` boolean. * Returns 200 (not 201) on success. */ post: operations["createEmbeddingProvider"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/embedding-providers/coverage": { parameters: { query?: never; header?: never; path: { /** @description Team whose embedding coverage is reported. */ team_id: string; }; cookie?: never; }; /** * Get embedding coverage * @description Returns derived, team-scoped embedding coverage per entity type under the * team's active provider model: how many entities exist (`total`), how many * have an embedding (`embedded`), how many are still pending, and the * embedded percentage. Counts are computed from existing rows — there is no * per-entity state. When the team has no active provider, the response * reports every type as all-pending (0%) rather than an error. */ get: operations["getEmbeddingCoverage"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/embedding-providers/{id}": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; }; cookie?: never; }; /** * Get embedding provider * @description Retrieves a single embedding provider owned by the authenticated user. * The encrypted API key is never returned; `has_api_key` indicates whether * one is stored. */ get: operations["getEmbeddingProvider"]; /** * Update embedding provider * @description Updates an existing embedding provider. All fields are optional; only * provided fields are changed. A supplied `api_key` replaces the stored * (encrypted) key and is never echoed back in the response. */ put: operations["updateEmbeddingProvider"]; post?: never; /** * Delete embedding provider * @description Deletes an embedding provider owned by the authenticated user. Deleting * the user's last remaining provider is blocked with a 400 * `PROVIDER_LAST_DELETE_BLOCKED` error. */ delete: operations["deleteEmbeddingProvider"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/embedding-providers/{id}/reprocess": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; }; cookie?: never; }; get?: never; put?: never; /** * Reprocess missing embeddings * @description Re-drives embedding generation for the team's entities that are still * missing an embedding, through the concurrency-bounded embedding path so a * large run never fans out beyond the provider's configured concurrency. It * is the sanctioned replacement for the removed back-office backfill * endpoint. * * The provider `{id}` is validated and authorized, but the work is * team-scoped: an embedding provider is per-team, so reprocess enqueues the * team's entity set (generated via the team's active provider). It returns * 202 immediately and runs in the background; generation is idempotent * (delete-then-insert per entity) and a per-team in-flight guard makes * repeat calls safe (no double fan-out). */ post: operations["reprocessEmbeddingProvider"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/embedding-providers/validate": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; }; cookie?: never; }; get?: never; put?: never; /** * Validate embedding provider configuration * @description Validates an embedding provider configuration (connectivity/credentials) * without persisting anything. Validation outcome — including an invalid * configuration — is reported in the 200 response body (`is_valid`, * `message`, `details`); 500 is returned only for internal service errors. */ post: operations["validateEmbeddingProvider"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/metadata/keys": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List the metadata keys in use * @description Returns the distinct metadata keys present on the caller's rows of the requested resource type, optionally narrowed to a single project. Use it to populate the key side of a metadata filter. */ get: operations["getMetadataKeys"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/metadata/values": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List the values stored under a metadata key * @description Returns the distinct values stored under one metadata key on the caller's rows of the requested resource type. Values held in an array are flattened and non-string scalars are rendered in their text form, so the result is directly usable as filter input. Supply `q` for typeahead. */ get: operations["getMetadataValues"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/search": { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; /** * Get the team's search ranking settings * @description Returns the search ranking settings in effect for the team, together with their provenance (`source`), the instance defaults, and the instance-owned candidate cap. A team that has never overridden the settings gets `source: instance` and the deployment defaults. Any member of the team may read them. */ get: operations["getTeamSearchSettings"]; /** * Override the team's search ranking settings * @description Stores a complete ranking profile for the team, replacing any previous one. There is no partial update — the whole profile is required, and the team either owns all of it or (after a reset) none of it. Requires the `team.settings.update` permission, held by owners and admins. */ put: operations["updateTeamSearchSettings"]; post?: never; /** * Reset the team's search ranking settings to the instance defaults * @description Drops the team's stored profile so it inherits the deployment defaults again. Resetting a team that has no override is a no-op and still returns 204. Requires the `team.settings.update` permission. */ delete: operations["resetTeamSearchSettings"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/audit": { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; /** * List the team's settings audit log * @description Every configuration copied into this team from another team, newest first and paginated, with the actor and source-team names resolved server-side. Requires the team.settings.update permission (owner or admin). The list is empty, never null, past the last page. */ get: operations["listTeamSettingsAudit"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/freshness/rules": { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; /** * List the team's freshness rules * @description Returns every freshness rule the team has defined, oldest first. Any member of the team may read them. The array is empty, never null, when the team has no rules. */ get: operations["listFreshnessRules"]; put?: never; /** * Create a freshness rule * @description Adds a rule to the team. Requires the `team.settings.update` permission. An omitted `mediums` matches any medium; an omitted or null `project_id` applies the rule to every project in the team. */ post: operations["createFreshnessRule"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/freshness/rules/{rule_id}": { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Freshness rule identifier */ rule_id: string; }; cookie?: never; }; get?: never; /** * Replace a freshness rule * @description Replaces the rule in full — every mutable field is required, because an omitted field would otherwise reset that dimension. Requires the `team.settings.update` permission. */ put: operations["updateFreshnessRule"]; post?: never; /** * Delete a freshness rule * @description Removes the rule and strips it from any freshness state that matched it, so no stale resource keeps referencing a rule that no longer exists. Requires the `team.settings.update` permission. */ delete: operations["deleteFreshnessRule"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/freshness": { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; /** * Get the team's freshness settings * @description Returns the freshness evaluation settings in effect for the team, their provenance (`source`), and the defaults a reset would restore. A team that has never overridden them gets `source: instance`. Any member may read them. */ get: operations["getTeamFreshnessSettings"]; /** * Override the team's freshness settings * @description Replaces the team's freshness settings in full. `interval_seconds` below 3600 (one hour) is rejected. Requires the `team.settings.update` permission. */ put: operations["updateTeamFreshnessSettings"]; post?: never; /** * Reset the team's freshness settings to the defaults * @description Removes the team's stored settings so it inherits the defaults again. Requires the `team.settings.update` permission. Resetting a team that has no stored settings succeeds and changes nothing. */ delete: operations["resetTeamFreshnessSettings"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/freshness/metrics/over-time": { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; /** * Freshness activity over time * @description Daily marked/cleared counts and the reconstructed stale level over the requested window, zero-filled so every day in the range is present. */ get: operations["getFreshnessOverTimeMetrics"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/freshness/metrics/by-type": { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; /** * Stale resources by resource type * @description Current stale counts per resource type. All four types are always present; one with nothing stale reports 0. */ get: operations["getFreshnessByTypeMetrics"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/freshness/metrics/by-project": { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; /** * Stale resources by project * @description Current stale counts per project in the team, including projects with nothing stale. */ get: operations["getFreshnessByProjectMetrics"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/freshness/metrics/by-rule": { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; /** * Resources marked by each rule * @description How many resources each of the team's rules currently marks, including rules that match nothing. This is how an over-broad rule is spotted. */ get: operations["getFreshnessByRuleMetrics"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/freshness/audit": { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; /** * List the team's freshness audit log * @description Every recorded mark and clear for the team, newest first and paginated. Readable by any member. The list is empty, never null, past the last page. */ get: operations["listFreshnessAudit"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/embedding-providers": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; }; cookie?: never; }; /** * List embedding providers * @description Retrieves all embedding providers belonging to the authenticated user. * Returns a bare JSON array (no pagination envelope). Encrypted API keys * are never included; each item carries a `has_api_key` boolean instead. */ get: operations["listEmbeddingProvidersSettings"]; put?: never; /** * Create embedding provider * @description Creates a new embedding provider configuration for the authenticated user. * The `api_key` supplied in the request is encrypted at rest and is never * returned by the API — responses expose only a `has_api_key` boolean. * Returns 200 (not 201) on success. */ post: operations["createEmbeddingProviderSettings"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/embedding-providers/coverage": { parameters: { query?: never; header?: never; path: { /** @description Team whose embedding coverage is reported. */ team_id: string; }; cookie?: never; }; /** * Get embedding coverage * @description Returns derived, team-scoped embedding coverage per entity type under the * team's active provider model: how many entities exist (`total`), how many * have an embedding (`embedded`), how many are still pending, and the * embedded percentage. Counts are computed from existing rows — there is no * per-entity state. When the team has no active provider, the response * reports every type as all-pending (0%) rather than an error. */ get: operations["getEmbeddingCoverageSettings"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/embedding-providers/{id}": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; }; cookie?: never; }; /** * Get embedding provider * @description Retrieves a single embedding provider owned by the authenticated user. * The encrypted API key is never returned; `has_api_key` indicates whether * one is stored. */ get: operations["getEmbeddingProviderSettings"]; /** * Update embedding provider * @description Updates an existing embedding provider. All fields are optional; only * provided fields are changed. A supplied `api_key` replaces the stored * (encrypted) key and is never echoed back in the response. */ put: operations["updateEmbeddingProviderSettings"]; post?: never; /** * Delete embedding provider * @description Deletes an embedding provider owned by the authenticated user. Deleting * the user's last remaining provider is blocked with a 400 * `PROVIDER_LAST_DELETE_BLOCKED` error. */ delete: operations["deleteEmbeddingProviderSettings"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/embedding-providers/{id}/reprocess": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; }; cookie?: never; }; get?: never; put?: never; /** * Reprocess missing embeddings * @description Re-drives embedding generation for the team's entities that are still * missing an embedding, through the concurrency-bounded embedding path so a * large run never fans out beyond the provider's configured concurrency. It * is the sanctioned replacement for the removed back-office backfill * endpoint. * * The provider `{id}` is validated and authorized, but the work is * team-scoped: an embedding provider is per-team, so reprocess enqueues the * team's entity set (generated via the team's active provider). It returns * 202 immediately and runs in the background; generation is idempotent * (delete-then-insert per entity) and a per-team in-flight guard makes * repeat calls safe (no double fan-out). */ post: operations["reprocessEmbeddingProviderSettings"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/embedding-providers/validate": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; }; cookie?: never; }; get?: never; put?: never; /** * Validate embedding provider configuration * @description Validates an embedding provider configuration (connectivity/credentials) * without persisting anything. Validation outcome — including an invalid * configuration — is reported in the 200 response body (`is_valid`, * `message`, `details`); 500 is returned only for internal service errors. */ post: operations["validateEmbeddingProviderSettings"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/embedding-providers/embeddings": { parameters: { query?: never; header?: never; path: { /** @description Team whose stored embeddings are cleared. */ team_id: string; }; cookie?: never; }; get?: never; put?: never; post?: never; /** * Clear all embeddings (Settings) * @description Permanently deletes every stored embedding for the team (a destructive * truncate), returning how many rows were removed. Unlike reprocess, this * does not regenerate anything: the team's content stays unembedded — and * semantic search returns nothing for it — until a provider reprocess or an * identity-changing provider update re-embeds the team. It is team-scoped: * only the authenticated team's embeddings are affected. Exposed on the * settings route only (the destructive maintenance action lives in the * embedding settings UI). */ delete: operations["clearEmbeddingsSettings"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/embedding-providers/copy": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Copy an embedding provider from another team * @description Copies one embedding provider out of another team into this one (#831, * epic #827). The destination is `{team_id}`; the source is named in the * body. * * The stored API key moves as CIPHERTEXT: the source row's encrypted key is * written straight to the new row and is never decrypted, never held in * plaintext, and never appears in a request or response body. That is the * reason this is a server-side operation at all — keys are write-only over * the API, so a client copying a provider by hand cannot bring one with it. * * Authorization requires permission to manage provider settings in BOTH * teams. The destination is evaluated first and either denial answers the * same 403, so the response never reveals whether the source team exists. * * The copy is always written `is_default: false`, and its chunk sizing, * concurrency and instruction prefixes carry over from the source unless * overridden. It can nonetheless become the team's ACTIVE provider: the * active provider is "the default-flagged one, else the most recently * updated one", so a non-default copy takes over whenever the destination * has no default set. That verdict — and the model it displaces, with the * number of resources still embedded under it — is reported in * `activation`, because nothing else in the system reports it: mixing * embedding models produces no error, only worse search results. * * Note the `version` caveat on `EmbeddingProvider`: like the create * response, this one reports 0 for a row that persists at 1. */ post: operations["copyEmbeddingProviderFromTeam"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/integrations/github/app": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the GitHub App registration. */ team_id: string; }; cookie?: never; }; /** * Get the team's GitHub App configuration * @description Returns the team's GitHub App registration. Secrets are never included — * the response carries `has_private_key`, `has_client_secret` and * `has_webhook_secret` booleans plus the `webhook_url` to paste into GitHub. */ get: operations["getGitHubAppConfig"]; /** * Update the team's GitHub App configuration * @description Updates the team's GitHub App registration. Every field is optional: an * omitted field keeps the stored value, and an explicitly empty value is * rejected rather than clearing the stored one. Secrets are never returned. * * The webhook secret cannot be set here — it is server-generated and * replaced through rotation. */ put: operations["updateGitHubAppConfig"]; /** * Register the team's GitHub App * @description Registers a GitHub App for the team. The `private_key` and `client_secret` * are encrypted at rest and are never returned. * * The webhook secret is **generated by the server**, not supplied by the * caller, and is returned in this response **once only**. It cannot be read * back afterwards; a lost secret must be rotated. Returns 200 (not 201), * matching the provider convention. */ post: operations["createGitHubAppConfig"]; /** * Delete the team's GitHub App configuration * @description Removes the team's GitHub App registration. This also disconnects every * installation made through that App, since installations are meaningful * only in the context of the App they were installed from. */ delete: operations["deleteGitHubAppConfig"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/integrations/github/app/validate": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the GitHub App registration. */ team_id: string; }; cookie?: never; }; get?: never; put?: never; /** * Validate the team's GitHub App configuration * @description Probes GitHub with the stored credentials and reports whether they work. * This proves the private key belongs to the configured `app_id`, that the * stored slug matches what GitHub reports (a typo there would otherwise * produce a broken install URL), and which permissions the App holds. * * A failed probe is reported in the body with `is_valid: false`, not as an * HTTP error. `error_details` is always one of a fixed set of categories; * the real upstream error is logged server-side only. * * Authorized as a mutation, because it makes the server perform an * authenticated outbound call on the team's behalf. */ post: operations["validateGitHubAppConfig"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/integrations/github/app/rotate-webhook-token": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the GitHub App registration. */ team_id: string; }; cookie?: never; }; get?: never; put?: never; /** * Rotate the GitHub App webhook token * @description Mints a new opaque routing token, which changes the App's `webhook_url`. * The previous URL stops resolving immediately, so the new one must be * pasted into the App's settings on GitHub or deliveries will stop. * * This rotates the routing token only, not the webhook secret. */ post: operations["rotateGitHubAppWebhookToken"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/github-app": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the GitHub App registration. */ team_id: string; }; cookie?: never; }; /** * Get the team's GitHub App configuration * @description Returns the team's GitHub App registration. Secrets are never included — * the response carries `has_private_key`, `has_client_secret` and * `has_webhook_secret` booleans plus the `webhook_url` to paste into GitHub. */ get: operations["getGitHubAppConfigSettings"]; /** * Update the team's GitHub App configuration * @description Updates the team's GitHub App registration. Every field is optional: an * omitted field keeps the stored value, and an explicitly empty value is * rejected rather than clearing the stored one. Secrets are never returned. * * The webhook secret cannot be set here — it is server-generated and * replaced through rotation. */ put: operations["updateGitHubAppConfigSettings"]; /** * Register the team's GitHub App * @description Registers a GitHub App for the team. The `private_key` and `client_secret` * are encrypted at rest and are never returned. * * The webhook secret is **generated by the server**, not supplied by the * caller, and is returned in this response **once only**. It cannot be read * back afterwards; a lost secret must be rotated. Returns 200 (not 201), * matching the provider convention. */ post: operations["createGitHubAppConfigSettings"]; /** * Delete the team's GitHub App configuration * @description Removes the team's GitHub App registration. This also disconnects every * installation made through that App, since installations are meaningful * only in the context of the App they were installed from. */ delete: operations["deleteGitHubAppConfigSettings"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/github-app/validate": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the GitHub App registration. */ team_id: string; }; cookie?: never; }; get?: never; put?: never; /** * Validate the team's GitHub App configuration * @description Probes GitHub with the stored credentials and reports whether they work. * This proves the private key belongs to the configured `app_id`, that the * stored slug matches what GitHub reports (a typo there would otherwise * produce a broken install URL), and which permissions the App holds. * * A failed probe is reported in the body with `is_valid: false`, not as an * HTTP error. `error_details` is always one of a fixed set of categories; * the real upstream error is logged server-side only. * * Authorized as a mutation, because it makes the server perform an * authenticated outbound call on the team's behalf. */ post: operations["validateGitHubAppConfigSettings"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/github-app/rotate-webhook-token": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the GitHub App registration. */ team_id: string; }; cookie?: never; }; get?: never; put?: never; /** * Rotate the GitHub App webhook token * @description Mints a new opaque routing token, which changes the App's `webhook_url`. * The previous URL stops resolving immediately, so the new one must be * pasted into the App's settings on GitHub or deliveries will stop. * * This rotates the routing token only, not the webhook secret. */ post: operations["rotateGitHubAppWebhookTokenSettings"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/email-provider": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the email provider configuration. */ team_id: string; }; cookie?: never; }; /** * Get the team's effective email configuration * @description Returns the email configuration in force for the team. * * This **always returns 200**, never 404. A team without its own provider is * inheriting the instance provider, which is a valid state the caller needs * described — it reports `configured: false`, `source: "instance"` and the * instance's `effective_from_address`. * * Readable by any team member: the response carries no credential, and * `effective_from_address` is already in the From: header of every mail those * members receive. */ get: operations["getTeamEmailProvider"]; /** * Configure the team's email provider * @description Creates or replaces the team's email provider. Idempotent: the same body * applied twice leaves one row and returns 200 both times. * * `secret` is required the first time. On a team that already has a provider, * omit it to keep the stored credential; sending an empty string is rejected * rather than treated as "clear", because a provider without a credential * cannot send and silently disabling a team's mail is worse than an error. * * A team-supplied `settings.smtp.host` or `settings.mailgun.base_url` that * resolves into a reserved network range is rejected before anything is * stored or dialled. */ put: operations["upsertTeamEmailProvider"]; post?: never; /** * Remove the team's email provider * @description Deletes the team's provider, so the team reverts to the instance provider. * A subsequent GET reports `source: "instance"`. * * Deleting when the team has no provider of its own returns 409 rather than * 404: the endpoint exists and the team is addressable, it is simply not in a * state that can serve the request. */ delete: operations["deleteTeamEmailProvider"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/email-provider/test": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the email provider configuration. */ team_id: string; }; cookie?: never; }; get?: never; put?: never; /** * Send a test email with a candidate configuration * @description Sends a real message using the configuration **in this request body**, not * the stored one, so credentials can be verified before they are saved. The * body therefore always requires `secret`. * * The recipient is **always the acting user's own account email**. It cannot * be supplied by the caller, so this endpoint cannot be used to send mail to * third parties. * * A failed send is reported in the body with `is_valid: false` and a fixed * `details.error_details` category, not as an HTTP error. A 500 means an * internal fault, not a bad configuration. * * Authorized as a mutation, because it makes the server perform an outbound * send with team-supplied credentials. */ post: operations["testTeamEmailProvider"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/email-provider": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the email provider configuration. */ team_id: string; }; cookie?: never; }; /** * Get the team's effective email configuration * @description Returns the email configuration in force for the team. * * This **always returns 200**, never 404. A team without its own provider is * inheriting the instance provider, which is a valid state the caller needs * described — it reports `configured: false`, `source: "instance"` and the * instance's `effective_from_address`. * * Readable by any team member: the response carries no credential, and * `effective_from_address` is already in the From: header of every mail those * members receive. */ get: operations["getTeamEmailProviderSettings"]; /** * Configure the team's email provider * @description Creates or replaces the team's email provider. Idempotent: the same body * applied twice leaves one row and returns 200 both times. * * `secret` is required the first time. On a team that already has a provider, * omit it to keep the stored credential; sending an empty string is rejected * rather than treated as "clear", because a provider without a credential * cannot send and silently disabling a team's mail is worse than an error. * * A team-supplied `settings.smtp.host` or `settings.mailgun.base_url` that * resolves into a reserved network range is rejected before anything is * stored or dialled. */ put: operations["upsertTeamEmailProviderSettings"]; post?: never; /** * Remove the team's email provider * @description Deletes the team's provider, so the team reverts to the instance provider. * A subsequent GET reports `source: "instance"`. * * Deleting when the team has no provider of its own returns 409 rather than * 404: the endpoint exists and the team is addressable, it is simply not in a * state that can serve the request. */ delete: operations["deleteTeamEmailProviderSettings"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/email-provider/test": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the email provider configuration. */ team_id: string; }; cookie?: never; }; get?: never; put?: never; /** * Send a test email with a candidate configuration * @description Sends a real message using the configuration **in this request body**, not * the stored one, so credentials can be verified before they are saved. The * body therefore always requires `secret`. * * The recipient is **always the acting user's own account email**. It cannot * be supplied by the caller, so this endpoint cannot be used to send mail to * third parties. * * A failed send is reported in the body with `is_valid: false` and a fixed * `details.error_details` category, not as an HTTP error. A 500 means an * internal fault, not a bad configuration. * * Authorized as a mutation, because it makes the server perform an outbound * send with team-supplied credentials. */ post: operations["testTeamEmailProviderSettings"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/model-providers": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the model provider(s). */ team_id: string; }; cookie?: never; }; /** * List model providers * @description Retrieves all model providers belonging to the authenticated user. * Returns a bare JSON array (no pagination envelope). Encrypted API keys * are never included; each item carries a `has_api_key` boolean instead. */ get: operations["listModelProviders"]; put?: never; /** * Create model provider * @description Creates a new model provider configuration for the authenticated user. * The `api_key` supplied in the request is encrypted at rest and is never * returned by the API — responses expose only a `has_api_key` boolean. * Returns 200 (not 201) on success. */ post: operations["createModelProvider"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/model-providers/{id}": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the model provider(s). */ team_id: string; }; cookie?: never; }; /** * Get model provider * @description Retrieves a single model provider owned by the authenticated user. * The encrypted API key is never returned; `has_api_key` indicates whether * one is stored. */ get: operations["getModelProvider"]; /** * Update model provider * @description Updates an existing model provider. All fields are optional; only * provided fields are changed. A supplied `api_key` replaces the stored * (encrypted) key and is never echoed back in the response. A blank/omitted * `api_key` preserves the stored key. */ put: operations["updateModelProvider"]; post?: never; /** * Delete model provider * @description Deletes a model provider owned by the authenticated user. Deleting the * team's last remaining provider is blocked with a 400 * `MODEL_PROVIDER_LAST_DELETE_BLOCKED` error. */ delete: operations["deleteModelProvider"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/model-providers/validate": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the model provider(s). */ team_id: string; }; cookie?: never; }; get?: never; put?: never; /** * Validate model provider configuration * @description Validates a model provider configuration (connectivity/credentials) * without persisting anything. The probe attempts `GET {base_url}/models` * and falls back to `POST {base_url}/chat/completions`. Validation outcome — * including an invalid configuration — is reported in the 200 response body * (`is_valid`, `message`, `details`); 500 is returned only for internal * service errors. */ post: operations["validateModelProvider"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/model-providers": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the model provider(s). */ team_id: string; }; cookie?: never; }; /** * List model providers * @description Retrieves all model providers belonging to the authenticated user. * Returns a bare JSON array (no pagination envelope). Encrypted API keys * are never included; each item carries a `has_api_key` boolean instead. */ get: operations["listModelProvidersSettings"]; put?: never; /** * Create model provider * @description Creates a new model provider configuration for the authenticated user. * The `api_key` supplied in the request is encrypted at rest and is never * returned by the API — responses expose only a `has_api_key` boolean. * Returns 200 (not 201) on success. */ post: operations["createModelProviderSettings"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/model-providers/{id}": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the model provider(s). */ team_id: string; }; cookie?: never; }; /** * Get model provider * @description Retrieves a single model provider owned by the authenticated user. * The encrypted API key is never returned; `has_api_key` indicates whether * one is stored. */ get: operations["getModelProviderSettings"]; /** * Update model provider * @description Updates an existing model provider. All fields are optional; only * provided fields are changed. A supplied `api_key` replaces the stored * (encrypted) key and is never echoed back in the response. A blank/omitted * `api_key` preserves the stored key. */ put: operations["updateModelProviderSettings"]; post?: never; /** * Delete model provider * @description Deletes a model provider owned by the authenticated user. Deleting the * team's last remaining provider is blocked with a 400 * `MODEL_PROVIDER_LAST_DELETE_BLOCKED` error. */ delete: operations["deleteModelProviderSettings"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/model-providers/validate": { parameters: { query?: never; header?: never; path: { /** @description Team that owns the model provider(s). */ team_id: string; }; cookie?: never; }; get?: never; put?: never; /** * Validate model provider configuration * @description Validates a model provider configuration (connectivity/credentials) * without persisting anything. The probe attempts `GET {base_url}/models` * and falls back to `POST {base_url}/chat/completions`. Validation outcome — * including an invalid configuration — is reported in the 200 response body * (`is_valid`, `message`, `details`); 500 is returned only for internal * service errors. */ post: operations["validateModelProviderSettings"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/settings/model-providers/copy": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Copy a model provider from another team into this team * @description Copies the provider named by `source_provider_id` out of `source_team_id` and into the team named by `{team_id}`, credential included. The caller must be able to manage provider settings in BOTH teams — the same bar the destination's own create path sets — and the destination is checked first, so a caller entitled to neither learns nothing about either. * * The copy carries the source row's ENCRYPTED API key across without ever decrypting it, which is the only way the credential can move: it is write-only over the API, and responses report `has_api_key` alone. A source provider stored without a key copies fine and reports `has_api_key: false`. * * The copy is a snapshot. The destination fully owns the resulting row and may edit or delete it with no effect on the source. It always lands non-default (`is_default: false`) regardless of the source, so it can never displace the destination team's existing default. * * Note the `version` caveat on `ModelProvider`: like the create response, this one reports 0 for a row that persists at 1. */ post: operations["copyModelProviderFromTeam"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/projects": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List projects * @description Returns a paginated list of projects within the specified team. Each * project is enriched with a `github_connected` flag indicating whether * its git URL matches a repository accessible via the team's GitHub App * installation. */ get: operations["listProjects"]; put?: never; /** * Create new project * @description Creates a new project within the specified team. Project slugs must be * unique within the team. Requires team membership. */ post: operations["createProject"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/projects/{slug}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get project by slug * @description Returns a single project identified by its URL-encoded slug within the specified team. */ get: operations["getProject"]; /** * Update project * @description Partially updates a project identified by its slug. Only fields present * in the request body are changed. Uses optimistic locking — a concurrent * modification returns 409. Projects cannot be moved between teams. */ put: operations["updateProject"]; post?: never; /** * Delete project * @description Deletes a project identified by its slug. The last remaining project in * a team cannot be deleted (returns 400). */ delete: operations["deleteProject"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/projects/{project_id}/migration/inventory": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get project migration inventory * @description Returns a count and item list of all migratable resources (prompts, * artifacts, spec libraries, feed items) in the given project, used to * drive the migration UI. */ get: operations["getProjectMigrationInventory"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/projects/{project_id}/migration": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Migrate project resources * @description Moves selected resources (prompts, artifacts, spec libraries, feed items) * from the source project to a destination project in the same team. * Slug collisions are handled per the requested conflict policy * (skip, rename, or overwrite; defaults to skip). Returns per-type * migrated counts plus skipped/failed outcomes with a 200 status. */ post: operations["migrateProject"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/activities": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List activities * @description Returns a paginated list of the authenticated user's activities, with * optional filtering by type, entity, session, free-text search, and date * range. Activities are user-scoped (not team-scoped). Invalid filter or * pagination values are silently ignored and defaults applied. */ get: operations["listActivities"]; put?: never; /** * Create activity * @description Manually records an activity for the authenticated user. The server * enriches the activity metadata with manual_creation/created_via flags * and overwrites source_ip and user_agent from the request. */ post: operations["createActivity"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/activities/stats": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get activity statistics * @description Returns aggregated activity statistics for the authenticated user, * including totals, top activity/entity types, recent activities, and a * per-day count for the current week. */ get: operations["getActivityStats"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/activities/types": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get activity and entity types * @description Returns the catalog of activity types this endpoint exposes (a curated subset of all recorded types) and the entity types, in a single response. */ get: operations["getActivityTypes"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/activities/entity-types": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get entity types * @description Returns the static catalog of known entity types as a plain string array. */ get: operations["getActivityEntityTypes"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/activities/{id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get activity by ID * @description Returns a single activity owned by the authenticated user. */ get: operations["getActivity"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/preferences": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get user preferences * @description Returns the authenticated user's preferences (email notification settings and * per-channel/per-type notification delivery preferences). Defaults are created * on first access if the user has no stored preferences. */ get: operations["getPreferences"]; /** * Update user preferences * @description Updates the authenticated user's preferences. Both top-level fields are optional; * only the categories present in the request body are updated. */ put: operations["updatePreferences"]; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/user/onboarding/complete": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Mark onboarding as completed * @description Marks the authenticated user's onboarding flow as completed and returns the * updated user object. Takes no request body. */ post: operations["completeOnboarding"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/{team_id}/feed-items/{item_id}/replies": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List feed item replies * @description Returns paginated threaded replies for the specified feed item, team-scoped * (free-tier accessible). */ get: operations["listFeedItemReplies"]; put?: never; /** * Create a feed item reply * @description Posts a threaded reply to the specified feed item, team-scoped (free-tier * accessible). Replies cannot be posted to archived feed items. */ post: operations["createFeedItemReply"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; } export type webhooks = Record; export interface components { schemas: { HealthResponse: { /** @example healthy */ status: string; /** * @description Short release commit SHA (empty outside deployed environments) * @example de7db3a2 */ sha?: string; }; SuccessResponse: { /** @example success */ status: string; /** @example Operation completed successfully */ message: string; data?: { [key: string]: unknown; }; }; /** @description RFC 9457 Problem Details for HTTP APIs */ ErrorResponse: { /** * @description URI reference that identifies the problem type * @example https://api.example.com/errors/VALIDATION_FAILED */ type: string; /** * @description Short, human-readable summary of the problem type * @example Validation Failed */ title: string; /** * @description HTTP status code * @example 400 */ status: number; /** * @description Human-readable explanation specific to this occurrence * @example Request validation failed */ detail: string; /** * @description Application-specific error code * @example VALIDATION_FAILED */ code: string; /** * @description Unique request identifier for tracking and debugging * @example abc123-def456 */ request_id: string; /** * Format: date-time * @description Timestamp when the error occurred (RFC3339) * @example 2025-11-08T10:15:30Z */ timestamp: string; /** * @description URI reference that identifies the specific occurrence * @example /api/v1/agents */ instance?: string; /** @description Field-level validation errors (present for validation failures) */ validation_errors?: components["schemas"]["ValidationError"][]; }; PaginatedResponse: { data: unknown[]; /** * @description Current page number * @example 1 */ page: number; /** * @description Number of items per page * @example 10 */ limit: number; /** * @description Total number of records * @example 150 */ total: number; /** * @description Total number of pages * @example 15 */ total_pages: number; }; /** @description Per-source access counts for a single calendar day (UTC), zero-filled. */ ResourceAccessDailyCount: { /** * Format: date * @example 2026-05-01 */ date: string; /** @example 3 */ web: number; /** @example 1 */ cli: number; /** @example 0 */ mcp: number; /** @example 0 */ api: number; /** @example 4 */ total: number; }; ResourceAccessMetricsData: { /** * @description Sum of every access count across the whole window. * @example 142 */ total_accesses: number; /** * @example 30d * @enum {string} */ range: "7d" | "14d" | "30d" | "60d" | "90d" | "180d"; counts: components["schemas"]["ResourceAccessDailyCount"][]; }; ResourceAccessMetricsResponse: { /** @example success */ status: string; /** @example Resource access metrics retrieved successfully */ message: string; data: components["schemas"]["ResourceAccessMetricsData"]; }; User: { /** @example user_123 */ id: string; /** * @description Legacy Google OAuth subject identifier (may be null for non-Google accounts) * @example google_456 */ google_id?: string | null; /** * @description Identity provider name (e.g. "google", "oidc") * @example oidc */ idp_provider?: string | null; /** * @description Subject identifier from the identity provider * @example user_01ABCDEF1234567890 */ idp_subject?: string | null; /** * Format: email * @example user@example.com */ email: string; /** @example John Doe */ name: string; /** * Format: uri * @example https://example.com/avatar.jpg */ avatar_url?: string | null; /** @example team_abc123 */ default_team_id?: string | null; /** @example false */ onboarding_completed: boolean; /** Format: date-time */ onboarding_completed_at?: string | null; /** Format: date-time */ created_at: string; /** Format: date-time */ updated_at: string; /** * Format: int64 * @example 1 */ version: number; }; /** * @description The authenticated user as returned by GET /api/v1/auth/me — the full User * object plus session-relative flags. `is_instance_admin` lets the SPA gate the * Admin Portal menu and /admin routes; it is UI convenience only, as every * /api/v1/admin/* call is authorized server-side regardless. */ CurrentUser: components["schemas"]["User"] & { /** * @description Whether the authenticated user's email is in the configured * auth.instance_admins list (matched case-insensitively). False when the * list is empty (feature dormant). * @example false */ is_instance_admin: boolean; }; /** @description Response body returned by GET /api/v1/auth/login containing the authorization URL */ LoginResponse: { /** * Format: uri * @description Identity-provider authorization URL to redirect the user to for authentication * @example https://idp.example.com/authorize?client_id=...&redirect_uri=...&state=... */ url: string; }; /** @description Response body returned by POST /api/v1/auth/logout */ LogoutResponse: { /** * @description Confirmation message * @example logged out */ message: string; }; /** @description One enabled login provider, with display metadata for the login UI */ AuthProvider: { /** * @description Canonical provider name, also the value to pass as the `provider` * query parameter to GET /api/v1/auth/login (e.g. `google`, `github`, * `oidc`). * @example google */ name: string; /** * @description Human-readable label for the provider button in the login UI * @example Google */ display_name: string; }; /** * @description Response body returned by GET /api/v1/auth/providers listing the login * providers enabled in this deployment's configuration. */ ProvidersResponse: { /** @description Enabled login providers, stable-sorted by canonical name */ providers: components["schemas"]["AuthProvider"][]; }; /** @description Request body for POST /api/v1/auth/dev/login (development environment only) */ DevLoginRequest: { /** * Format: email * @description Email address to authenticate as * @example dev@example.com */ email: string; /** * @description Display name for the dev user (defaults to "Dev User" if omitted) * @example Dev User */ name?: string; }; APIKey: { /** @example api_key_123 */ id: string; /** @example user_123 */ user_id: string; /** @example Development Setup */ name: string; /** @example vxk_abc123 */ key_prefix: string; /** * @description Array of integration codes this API key can access * @example [ * "cli", * "mcp_server" * ] */ integrations: ("cli" | "mcp_server")[]; /** * @description Whether this is a legacy API key (pre-multi-integration) * @example false */ is_legacy: boolean; /** * @description Notes about the migration from legacy system * @example Migrated from usage_type: cli */ migration_notes?: string | null; /** * @deprecated * @description DEPRECATED: Legacy field for backward compatibility. Use 'integrations' instead. * @example cli * @enum {string} */ usage_type?: "cli" | "mcp" | "everything"; /** Format: date-time */ last_used_at?: string | null; /** * Format: date-time * @description When the key expires. Null means the key never expires. */ expires_at?: string | null; /** Format: date-time */ created_at: string; /** Format: date-time */ updated_at: string; }; CreateAPIKeyRequest: { /** * @description A descriptive name for the API key * @example Development Setup */ name: string; /** * @description Array of integration codes to grant access to * @example [ * "cli", * "mcp_server" * ] */ integration_codes: ("cli" | "mcp_server")[]; }; CreateAPIKeyResponse: { api_key: components["schemas"]["APIKey"]; /** @example vib_1234567890abcdef */ full_key: string; /** @example vib_ */ key_prefix: string; }; APIKeyListResponse: { api_keys: components["schemas"]["APIKey"][]; total_count: number; page: number; per_page: number; total_pages: number; }; Prompt: { /** @example prompt_123 */ id: string; /** @example Code Review Template */ name: string; /** @example code-review-template */ slug: string; /** @example Template for conducting code reviews */ description: string; /** @example Please review this code for: {{criteria}} */ body: string; /** @example user_123 */ user_id: string; /** * Format: uuid * @description Team identifier that owns this prompt * @example 123e4567-e89b-12d3-a456-426614174000 */ team_id: string; /** * Format: uuid * @description Project identifier that this prompt belongs to * @example 123e4567-e89b-12d3-a456-426614174001 */ project_id: string; /** * @example published * @enum {string} */ status: "draft" | "published"; /** * @description Whether this prompt is discoverable via MCP (Model Context Protocol) tools * @example true */ mcp_expose: boolean; /** * @description Whether this prompt has an active, non-expired share * @example false */ is_shared: boolean; /** * @description Labels for categorizing and filtering prompts. null on the wire when the prompt has none (nil slice serialization). * @example [ * "code-review", * "documentation" * ] */ labels?: string[] | null; /** Format: date-time */ created_at: string; /** Format: date-time */ updated_at: string; /** * Format: int64 * @description Version number for optimistic concurrency control * @example 1 */ version: number; /** @description Depth-1 typed neighborhood of this resource — the relations touching it in both directions, newest first, capped at 20. Typed summaries only, never bodies. Populated on the detail GET; empty in list responses. */ related?: components["schemas"]["RelatedResource"][]; /** @description Computed embedding-similarity neighborhood of this resource (up to 5), derived live at read time from vector similarity — NOT stored edges and distinct from `related`. Populated on the detail GET; empty otherwise. */ similar?: components["schemas"]["SimilarResource"][]; freshness?: components["schemas"]["ResourceFreshnessState"]; }; CreatePromptRequest: { /** @example Code Review Template */ name: string; /** @example code-review-template */ slug: string; /** @example Template for conducting code reviews */ description?: string; /** @example Please review this code for: {{criteria}} */ body: string; /** * Format: uuid * @description Project identifier that this prompt belongs to * @example 123e4567-e89b-12d3-a456-426614174000 */ project_id: string; /** * @example draft * @enum {string} */ status?: "draft" | "published"; /** * @description Whether this prompt should be discoverable via MCP tools. Defaults to true if not specified. * @example true */ mcp_expose?: boolean; /** * @description Optional labels for categorizing and filtering prompts * @example [ * "code-review", * "documentation" * ] */ labels?: string[]; }; UpdatePromptRequest: { name?: string; slug?: string; description?: string; body?: string; /** * Format: uuid * @description Project identifier to move this prompt to a different project */ project_id?: string; /** @enum {string} */ status?: "draft" | "published"; /** @description Whether this prompt should be discoverable via MCP tools */ mcp_expose?: boolean; /** @description Labels for categorizing and filtering prompts */ labels?: string[]; }; PromptListEnvelope: components["schemas"]["SuccessResponse"] & { data: components["schemas"]["PromptListResponse"]; }; PromptListResponse: { prompts: components["schemas"]["Prompt"][]; total_count: number; page: number; per_page: number; total_pages: number; }; PromptVersionListResponse: { /** @description Content-version snapshots for the prompt, newest first */ versions: components["schemas"]["ContentVersion"][]; }; RenderPromptRequest: { /** * @example { * "criteria": "security vulnerabilities and code quality" * } */ placeholders: { [key: string]: string; }; }; RenderPromptResponse: { /** @example Please review this code for: security vulnerabilities and code quality */ rendered_body: string; placeholders_missing?: string[]; references_used?: string[]; /** * @description Warnings about issues during rendering (e.g., missing references) * @example [ * "Reference not found: @nonexistent" * ] */ warnings?: string[]; }; PromptPlaceholdersResponse: { /** * @example [ * "criteria", * "language", * "framework" * ] */ placeholders: string[]; }; PromptDependencyInfo: { /** @description Prompt identifier */ id: string; /** @description Prompt slug */ slug: string; /** @description Prompt name */ name: string; }; PromptDependenciesResponse: { /** @description Prompts that reference this prompt */ used_by: components["schemas"]["PromptDependencyInfo"][]; /** @description Prompts that this prompt references */ uses: components["schemas"]["PromptDependencyInfo"][]; }; PromptGalleryTemplate: { /** @example gallery_prompt_123 */ id: string; /** @example Code Review Request */ title: string; /** @example Request a thorough code review with focus on best practices, security, and performance */ description?: string; /** * @example Please review the following code for: * - Code quality and best practices * - Security vulnerabilities * - Performance optimizations */ content: string; /** @example Engineering */ category: string; /** * @example [ * "code-review", * "quality", * "security" * ] */ tags?: string[]; /** * @example { * "difficulty": "beginner", * "use_case": "development" * } */ metadata?: { [key: string]: unknown; }; /** Format: date-time */ created_at: string; /** Format: date-time */ updated_at: string; }; PromptGalleryCategoryList: components["schemas"]["PromptGalleryCategory"][]; PromptLabelsEnvelope: components["schemas"]["SuccessResponse"] & { data: { /** * @example [ * "code-review", * "documentation", * "testing" * ] */ labels: string[]; }; }; PromptGalleryCategory: { /** @example Engineering */ category: string; /** @example 15 */ count: number; }; PromptGalleryListResponse: { prompts: components["schemas"]["PromptGalleryTemplate"][]; total_count: number; page: number; per_page: number; total_pages: number; }; PromptGalleryUsageRequest: { /** @example gallery_prompt_123 */ prompt_id: string; }; CreateShareRequest: { /** * @description Type of share: 'public' allows anyone with the link, 'restricted' requires specific email addresses * @example public * @enum {string} */ share_type: "public" | "restricted"; /** * @description List of email addresses allowed to access the shared prompt (required for 'restricted' shares) * @example [ * "user@example.com", * "colleague@example.com" * ] */ emails?: string[]; }; ShareResponse: { /** * @description Unique token for accessing the shared prompt * @example abc123xyz789... */ share_token: string; /** * @description Relative URL path to access the shared prompt * @example /shared/prompts/abc123xyz789... */ share_url: string; /** * @example public * @enum {string} */ share_type: "public" | "restricted"; /** * @description List of emails with access (only present for 'restricted' shares) * @example [ * "user@example.com" * ] */ emails?: string[]; /** Format: date-time */ created_at: string; }; SharedPromptResponse: { prompt: components["schemas"]["Prompt"]; /** * @example public * @enum {string} */ share_type: "public" | "restricted"; /** * @description Prompt body with @references resolved but {{placeholders}} preserved for client substitution * @example Please review this code for: {{criteria}} */ rendered_body: string; }; Agent: { /** @example agent_123 */ id: string; /** @example user_123 */ user_id: string; /** * Format: uuid * @description Team that owns the agent. Immutable after creation. * @example 550e8400-e29b-41d4-a716-446655440000 */ team_id: string; /** @example Code Reviewer Agent */ name: string; /** @example AI agent for automated code reviews */ description: string; /** * @example active * @enum {string} */ status: "active" | "paused" | "error"; /** * Format: uri * @example https://example.com/agent-card.json */ card_url?: string | null; /** @description A2A agent card fetched from card_url */ agent_card?: components["schemas"]["AgentCard"] | null; /** @description Serialized as null when the agent has no config (Go nil map) */ config: { [key: string]: unknown; } | null; /** * @description Names of credentials that are set (values are never returned) * @example [ * "api_key" * ] */ has_credentials?: string[]; /** Format: date-time */ last_run?: string | null; /** * Format: date-time * @description When the agent card was last re-fetched from card_url */ last_synced_at?: string | null; /** @example 42 */ total_runs: number; /** * Format: float * @example 0.95 */ success_rate: number; /** Format: date-time */ created_at: string; /** Format: date-time */ updated_at: string; /** * Format: int64 * @description Optimistic-locking version counter * @example 1 */ version: number; }; CreateAgentRequest: { /** @example Code Reviewer Agent */ name?: string; /** @example AI agent for automated code reviews */ description?: string; /** * @example active * @enum {string} */ status?: "active" | "paused"; /** * Format: uri * @example https://example.com/agent-card.json */ card_url: string; /** * @example { * "api_key": { * "type": "apiKey", * "value": "sk-1234567890abcdef" * } * } */ credentials?: { [key: string]: components["schemas"]["CredentialRequest"]; }; }; UpdateAgentRequest: { name?: string; description?: string; /** @enum {string} */ status?: "active" | "paused" | "error"; /** Format: uri */ card_url?: string; credentials?: { [key: string]: components["schemas"]["CredentialRequest"]; }; }; AgentListResponse: { agents: components["schemas"]["Agent"][]; total_count: number; page: number; per_page: number; total_pages: number; }; AgentStatsResponse: { total_agents: number; active_agents: number; paused_agents: number; error_agents: number; total_runs: number; /** Format: float */ avg_success_rate: number; runs_today: number; runs_this_week: number; /** @description Serialized as null when there is no recent activity (Go nil slice) */ recent_activities: { id?: string; agent_id?: string; agent_name?: string; action?: string; /** @enum {string} */ status?: "success" | "warning" | "error"; description?: string; /** Format: date-time */ created_at?: string; }[] | null; }; AgentExecution: { /** @example execution_123 */ id: string; /** @example agent_123 */ agent_id: string; /** @example user_123 */ user_id: string; /** * @example success * @enum {string} */ status: "running" | "success" | "error" | "pending" | "submitted" | "working" | "completed" | "failed" | "cancelled"; input?: { [key: string]: unknown; }; error?: string | null; /** Format: date-time */ started_at: string; /** Format: date-time */ ended_at?: string | null; /** @description Duration in milliseconds */ duration?: number | null; /** @description A2A task identifier (streaming executions) */ task_id?: string | null; /** @description A2A context identifier (streaming executions) */ context_id?: string | null; /** * @description Raw A2A task state as reported by the agent (A2A v1.0 values, e.g. TASK_STATE_WORKING / TASK_STATE_COMPLETED / TASK_STATE_CANCELED). Left as an open string because it mirrors the official SDK's states. * @example TASK_STATE_WORKING */ current_state?: string | null; /** @description A2A artifacts produced by the execution */ artifacts?: { [key: string]: unknown; }[] | null; /** @description Groups related executions into a conversation */ conversation_id?: string | null; /** * Format: int64 * @description Optimistic-locking version counter * @example 1 */ version: number; }; CreateAgentExecutionRequest: { /** * @description Ignored if provided — the agent ID from the URL path is always used. * @example agent_123 */ agent_id?: string; input?: { [key: string]: unknown; }; }; UpdateAgentExecutionRequest: { /** @enum {string} */ status: "running" | "success" | "error"; output?: { [key: string]: unknown; }; error?: string; }; Activity: { /** @example 01234567-89ab-cdef-0123-456789abcdef */ id: string; /** @example a1234567-89ab-cdef-0123-456789abcdef */ user_id: string; /** @example prompt_created */ activity_type: string; /** @example prompt */ entity_type: string; /** @example 01234567-89ab-cdef-0123-456789abcdef */ entity_id?: string | null; /** @example session_123 */ session_id?: string | null; /** @example Created new prompt template */ description: string; metadata: { [key: string]: unknown; }; /** @example 192.168.1.1 */ source_ip?: string | null; user_agent?: string | null; /** Format: date-time */ created_at: string; /** * @description Human-readable name of the referenced entity (omitted when the entity type has no resolvable name or the entity was deleted) * @example My Prompt */ entity_name?: string | null; /** * @description Display name of the user who performed the activity (omitted when the user record cannot be found) * @example Jane Doe */ actor_name?: string | null; }; CreateActivityRequest: { /** @example prompt_created */ activity_type: string; /** @example prompt */ entity_type: string; entity_id?: string; session_id?: string; /** @example Created new prompt template */ description: string; /** @description Arbitrary metadata; the server adds manual_creation and created_via keys */ metadata?: { [key: string]: unknown; }; /** @description Ignored — overwritten with the client IP derived from the request */ source_ip?: string; /** @description Ignored — overwritten with the User-Agent header from the request */ user_agent?: string; }; ActivityListResponse: { activities: components["schemas"]["Activity"][]; total_count: number; page: number; per_page: number; total_pages: number; }; ActivityStatsResponse: { total_activities: number; activities_today: number; activities_this_week: number; top_activity_types: { activity_type?: string; count?: number; }[]; top_entity_types: { entity_type?: string; count?: number; }[]; recent_activities: components["schemas"]["Activity"][]; activities_by_date_week: { date?: string; count?: number; }[]; }; ActivityTypesResponse: { /** * @example [ * "auth_login", * "prompt_created", * "claude_code_session" * ] */ activity_types: string[]; /** * @example [ * "user", * "api_key", * "prompt", * "session", * "system" * ] */ entity_types: string[]; }; EntityTypesResponse: { /** * @example [ * "prompt", * "agent", * "context", * "report" * ] */ entity_types: string[]; }; EmbeddingProvider: { /** @example provider_123 */ id: string; /** @example user_123 */ user_id: string; /** * Format: uuid * @description Team that owns this provider. * @example b1234567-89ab-cdef-0123-456789abcdef */ team_id?: string | null; /** @example OpenAI Embeddings */ name: string; /** @example openai */ provider_type: string; /** * @description Embedding model this provider requests. Must return the fixed vector width VibeXP stores (1024). * @example text-embedding-3-small */ model: string; /** * @description In-Go text-chunker size used when embedding documents. * @example 1000 */ chunk_size: number; /** * @description Overlap between adjacent chunks. * @example 200 */ chunk_overlap: number; /** * @description Maximum number of simultaneous embedding requests VibeXP issues to this provider. Keep at 1 for single-threaded providers. * @example 1 */ concurrency: number; /** * @description Instruction prefix prepended to search queries before they are embedded (only the text sent to the provider; nothing extra is stored). Asymmetric models require this — e.g. mxbai/BGE English expect "Represent this sentence for searching relevant passages: ", E5 expects "query: ". Empty/null means no prefix (default behaviour). * @example Represent this sentence for searching relevant passages: */ query_prefix?: string | null; /** * @description Instruction prefix prepended to document chunks before they are embedded (applied only to the text sent to the provider; the stored chunk content is unchanged). E5 expects "passage: "; mxbai/BGE embed documents raw. Changing this invalidates stored vectors and triggers a team re-embed. Empty/null means no prefix (default behaviour). * @example passage: */ document_prefix?: string | null; /** @example false */ is_default: boolean; /** * Format: uri * @example https://api.openai.com/v1 */ base_url?: string | null; /** @example {"model": "text-embedding-ada-002"} */ configuration: string; /** Format: date-time */ created_at: string; /** Format: date-time */ updated_at: string; /** * Format: int64 * @description Optimistic-concurrency version counter, incremented on each update. Note: create responses currently return 0 (the persisted row starts at 1) — read it from get/list/update responses instead. * @example 1 */ version: number; }; EmbeddingProviderArrayResponse: components["schemas"]["EmbeddingProviderResponse"][]; EmbeddingProviderResponse: components["schemas"]["EmbeddingProvider"] & { /** @example true */ has_api_key: boolean; }; CreateEmbeddingProviderRequest: { /** @example OpenAI Embeddings */ name: string; /** @example openai */ provider_type: string; /** * @description Embedding model that must return 1024-dimensional vectors. * @example text-embedding-3-small */ model: string; /** * @description Optional chunker size; defaults to 1000 when omitted. * @example 1000 */ chunk_size?: number; /** * @description Optional chunk overlap; defaults to 200 when omitted. * @example 200 */ chunk_overlap?: number; /** * @description Optional max simultaneous embedding requests to this provider; defaults to 1 when omitted. * @example 1 */ concurrency?: number; /** * @description Optional instruction prefix prepended to search queries before embedding. Defaults to empty (no prefix) when omitted. * @example Represent this sentence for searching relevant passages: */ query_prefix?: string | null; /** * @description Optional instruction prefix prepended to document chunks before embedding. Defaults to empty (no prefix) when omitted. * @example passage: */ document_prefix?: string | null; /** @example false */ is_default?: boolean; /** * Format: uri * @example https://api.openai.com/v1 */ base_url?: string; api_key?: string | null; configuration?: { [key: string]: unknown; }; }; UpdateEmbeddingProviderRequest: { name?: string; provider_type?: string; model?: string; chunk_size?: number; chunk_overlap?: number; concurrency?: number; /** @description Instruction prefix prepended to search queries before embedding. Send an empty string to clear a previously configured prefix. */ query_prefix?: string | null; /** @description Instruction prefix prepended to document chunks before embedding. Changing it triggers a team re-embed. Send an empty string to clear. */ document_prefix?: string | null; is_default?: boolean; /** Format: uri */ base_url?: string; api_key?: string; configuration?: { [key: string]: unknown; }; }; ValidateEmbeddingProviderRequest: { /** @example openai_compatible */ provider_type: string; /** * @description Embedding model to probe. The provider is accepted only if it returns vectors of the fixed dimension VibeXP stores (1024). * @example text-embedding-3-small */ model: string; /** * Format: uri * @example https://api.openai.com/v1 */ base_url: string; api_key?: string | null; configuration?: { [key: string]: unknown; }; }; ValidateEmbeddingProviderResponse: { /** @example true */ is_valid: boolean; /** @example Provider configuration is valid */ message: string; details?: { /** @example 150 */ response_time_ms?: number; /** @example 200 */ status_code?: number; /** * @description Vector width the provider returned during the probe. * @example 1024 */ dimension?: number; /** @example Connection timeout */ error_details?: string; }; }; /** @description Embedding coverage for a single entity type: how many entities exist, how many have an embedding under the team's active model, how many are still pending, and the embedded percentage. */ EmbeddingCoverageItem: { /** * @description The embeddable entity type this row reports on. * @example prompt * @enum {string} */ entity_type: "prompt" | "artifact" | "memory" | "blueprint" | "feed_item"; /** * Format: int64 * @description Total embeddable entities of this type owned by the team. * @example 120 */ total: number; /** * Format: int64 * @description Entities of this type that already have an embedding under the team's active model. * @example 90 */ embedded: number; /** * Format: int64 * @description Entities still missing an embedding (total − embedded). * @example 30 */ pending: number; /** * @description Rounded percentage of entities embedded (embedded / total * 100); 0 when there are no entities of this type. * @example 75 */ embedded_percent: number; }; /** @description Derived, team-scoped embedding coverage per entity type under the team's active provider model. Counts are computed from existing rows (no per-entity state); a non-decreasing pending count is the signal that embedding is stuck. When the team has no active provider, has_active_provider is false, active_model is null, and every type reports all entities as pending (0%). */ EmbeddingCoverageResponse: { /** * @description Whether the team has an active embedding provider configured. * @example true */ has_active_provider: boolean; /** * @description The active provider's embedding model the embedded counts are measured against, or null when no provider is configured. * @example text-embedding-3-small */ active_model: string | null; /** @description One entry per embeddable entity type, in a stable order. */ coverage: components["schemas"]["EmbeddingCoverageItem"][]; }; /** @description Result of clearing (truncating) all of a team's stored embeddings. Reports how many embedding rows were removed. Clearing does not regenerate anything — the team's content stays unembedded (and semantic search returns nothing for it) until a provider reprocess/re-embed runs. */ ClearEmbeddingsResponse: { /** * Format: int64 * @description Number of embedding rows deleted for the team (0 if there were none). * @example 157 */ deleted_count: number; }; /** * @description Request body for copying one embedding provider out of another team into this one (#831, epic #827). The destination is the `{team_id}` path parameter; only the source is carried here. * * The API key is deliberately absent. Responses expose `has_api_key` and never the key itself, so a client cannot carry the credential across — the server re-reads the source row's stored ciphertext and writes it to the copy untouched, without ever decrypting it. * * Every property other than the two source identifiers and `reprocess` is an OPTIONAL override of the value the source row already holds: omit one to copy the source value verbatim, or send it to change the copy without touching the source. An override that IS sent must be non-empty, the same bar the create path sets. * * The copy is always written non-default. It can still become the team's ACTIVE embedding provider — see `EmbeddingProviderCopyActivation` on the response. */ CopyEmbeddingProviderRequest: { /** * Format: uuid * @description Team to copy the provider from. The caller needs permission to manage provider settings in it, and it must differ from the destination team. * @example 770e8400-e29b-41d4-a716-446655440002 */ source_team_id: string; /** * Format: uuid * @description Provider to copy, as it exists in the source team. * @example 550e8400-e29b-41d4-a716-446655440000 */ source_provider_id: string; /** * @description Name for the copy. Sent, it is used verbatim, and a name the destination already holds fails the copy with 409. Omitted, the source name is used, disambiguated as " (copy)", " (copy 2)", … when the destination already holds it. * @example mxbai-embed-large (staging) */ name?: string; /** * @description Overrides the source provider's type. * @example openai_compatible */ provider_type?: string; /** * @description Overrides the source provider's embedding model. It must return the fixed vector width VibeXP stores (1024); this endpoint does not probe it, so validate the model first if you override it. * @example text-embedding-3-small */ model?: string; /** * Format: uri * @description Overrides the source provider's base URL. Send null or an empty string to store no base URL on the copy. * @example https://api.openai.com/v1 */ base_url?: string | null; /** * @description Overrides the source provider's chunk size. * @example 1000 */ chunk_size?: number; /** * @description Overrides the source provider's chunk overlap. * @example 200 */ chunk_overlap?: number; /** * @description Overrides the source provider's embedding request concurrency. * @example 1 */ concurrency?: number; /** * @description Overrides the source provider's query instruction prefix. Send null or an empty string to store no prefix on the copy. * @example Represent this sentence for searching relevant passages: */ query_prefix?: string | null; /** * @description Overrides the source provider's document instruction prefix. Send null or an empty string to store no prefix on the copy. * @example passage: */ document_prefix?: string | null; /** * @description Overrides the source provider's stored configuration object. * @example { * "timeout": 30 * } */ configuration?: { [key: string]: unknown; }; /** * @description Opt in to re-embedding the destination team's content after the copy. * * Omitted or false, nothing is enqueued and the response's `activation.reprocess_enqueued` is false. Sent true, a background re-embed is enqueued for the destination team, and the response reports whether the team's existing vectors were WIPED first: they are, and only are, when the copy becomes the effective active provider AND its model differs from the model it displaces — the case where the stored vectors can no longer be compared against new queries. Any other case fills gaps only, leaving stored vectors intact. * @default false * @example true */ reprocess: boolean; }; /** * @description What the copy did to the destination team's SEARCH behaviour (#831). * * A copy is always written `is_default: false`, but that is not the same as inert. The active provider is resolved as "the default-flagged one, else the most recently updated one", so a non-default copy silently becomes the team's active provider whenever the destination has no default set — and every resource already embedded with the previous model stops being comparable to new queries, with no error anywhere. This object reports that verdict so a client can warn before, or explain after. */ EmbeddingProviderCopyActivation: { /** * @description True when the copy is now the team's effective active embedding provider — the one that will generate every new document and query embedding. * @example true */ becomes_active: boolean; /** * @description The embedding model that WAS active in the destination team before this copy, when the copy displaced it. Null when the copy did not become active, or when the team had no provider at all. * * It may equal the copy's own model: copying a provider that only differs in credentials or base URL displaces nothing meaningful, and the stored vectors stay valid. * @example mxbai-embed-large */ displaced_model: string | null; /** * Format: int64 * @description How many of the destination team's resources are embedded with `displaced_model`. These are the vectors that stop matching new queries unless the team re-embeds. 0 when nothing was displaced. * @example 412 */ displaced_embedded_resources: number; /** * @description True when the request's `reprocess` flag actually started a background re-embed for the destination team. * * It reports what happened, not what was asked for: a re-embed already in flight for the team makes this false (the running one covers the work), and so does a failed wipe, which abandons the run rather than regenerating on top of stale vectors. * @example false */ reprocess_enqueued: boolean; /** * @description True when the enqueued re-embed DELETED the team's stored vectors before regenerating them. Only ever true alongside `reprocess_enqueued`, and only when the copy became active with a different model from the one it displaced. * @example false */ embeddings_wiped: boolean; }; /** @description The provider row created by a cross-team copy, plus the activation verdict that says what it did to the destination team's search (#831). */ CopyEmbeddingProviderResponse: { provider: components["schemas"]["EmbeddingProviderResponse"]; activation: components["schemas"]["EmbeddingProviderCopyActivation"]; }; ModelProvider: { /** @example provider_123 */ id: string; /** @example user_123 */ user_id: string; /** * Format: uuid * @description Team that owns this provider. * @example b1234567-89ab-cdef-0123-456789abcdef */ team_id?: string | null; /** @example OpenAI GPT-4o */ name: string; /** @example openai_compatible */ provider_type: string; /** * @description Chat/completion model this provider requests. * @example gpt-4o-mini */ model: string; /** @example false */ is_default: boolean; /** * Format: uri * @example https://api.openai.com/v1 */ base_url?: string | null; /** @example {"temperature": 0.7, "max_tokens": 1024} */ configuration: string; /** Format: date-time */ created_at: string; /** Format: date-time */ updated_at: string; /** * Format: int64 * @description Optimistic-concurrency version counter, incremented on each update. Note: create responses currently return 0 (the persisted row starts at 1) — read it from get/list/update responses instead. * @example 1 */ version: number; }; ModelProviderResponse: components["schemas"]["ModelProvider"] & { /** @example true */ has_api_key: boolean; }; CreateModelProviderRequest: { /** @example OpenAI GPT-4o */ name: string; /** @example openai_compatible */ provider_type: string; /** * @description Chat/completion model to use. * @example gpt-4o-mini */ model: string; /** @example false */ is_default?: boolean; /** * Format: uri * @example https://api.openai.com/v1 */ base_url?: string; api_key?: string | null; configuration?: { [key: string]: unknown; }; }; UpdateModelProviderRequest: { name?: string; provider_type?: string; model?: string; is_default?: boolean; /** Format: uri */ base_url?: string; api_key?: string; configuration?: { [key: string]: unknown; }; }; ModelProviderListResponse: { model_providers: components["schemas"]["ModelProviderResponse"][]; total_count: number; page: number; per_page: number; total_pages: number; }; ModelProviderResponseList: components["schemas"]["ModelProviderResponse"][]; /** * @description Request body for copying one model provider out of another team into this one. The destination is the `{team_id}` path parameter; only the source is carried here. * * The API key is deliberately absent. Responses expose `has_api_key` and never the key itself, so a client cannot carry the credential across — the server re-reads the source row's stored ciphertext and writes it to the copy untouched, without ever decrypting it. * * Every property other than the two source identifiers is an OPTIONAL override of the value the source row already holds: omit one to copy the source value verbatim, or send it to change the copy without touching the source. An override that IS sent must be non-empty, the same bar the create path sets. */ CopyModelProviderRequest: { /** * Format: uuid * @description Team to copy the provider from. The caller needs permission to manage provider settings in it, and it must differ from the destination team. * @example 770e8400-e29b-41d4-a716-446655440002 */ source_team_id: string; /** * Format: uuid * @description Provider to copy, as it exists in the source team. * @example 550e8400-e29b-41d4-a716-446655440000 */ source_provider_id: string; /** * @description Name for the copy. Sent, it is used verbatim, and a name the destination already holds fails the copy with 409. Omitted, the source name is used, disambiguated as " (copy)", " (copy 2)", … when the destination already holds it. * @example OpenAI GPT-4o (staging) */ name?: string; /** * @description Overrides the source provider's type. * @example openai_compatible */ provider_type?: string; /** * @description Overrides the source provider's chat/completion model. * @example gpt-4o-mini */ model?: string; /** * Format: uri * @description Overrides the source provider's base URL. Send null or an empty string to store no base URL at all. * @example https://api.openai.com/v1 */ base_url?: string | null; /** @description Overrides the source provider's configuration wholesale. */ configuration?: { [key: string]: unknown; }; }; ValidateModelProviderRequest: { /** @example openai_compatible */ provider_type: string; /** * @description Chat/completion model to probe for reachability and auth. * @example gpt-4o-mini */ model: string; /** * Format: uri * @example https://api.openai.com/v1 */ base_url: string; api_key?: string | null; configuration?: { [key: string]: unknown; }; }; ValidateModelProviderResponse: { /** @example true */ is_valid: boolean; /** @example Provider configuration is valid */ message: string; details?: { /** @example 150 */ response_time_ms?: number; /** @example 200 */ status_code?: number; /** @example Connection timeout */ error_details?: string; }; }; /** @description A team's own GitHub App registration. Never carries secret values. */ GitHubAppConfig: { /** * Format: uuid * @example b1234567-89ab-cdef-0123-456789abcdef */ id: string; /** * Format: uuid * @description Team that owns this App registration. * @example b1234567-89ab-cdef-0123-456789abcdef */ team_id: string; /** * Format: uuid * @description Who registered the App. Informational only — the team is the tenancy boundary, and no read is scoped by this field. */ user_id?: string | null; /** * @description GitHub's numeric App id, carried as a string. * @example 123456 */ app_id: string; /** * @description The App's slug, which builds its install URL (https://github.com/apps/{app_slug}/installations/new). * @example acme-vibexp */ app_slug: string; /** * @description The App's OAuth client id. Not a secret — GitHub shows it on the App settings page, and it is echoed back so an operator can confirm which App is wired up. * @example Iv1.a1b2c3d4e5f6 */ client_id: string; /** Format: date-time */ created_at: string; /** Format: date-time */ updated_at: string; /** * Format: int64 * @description Optimistic-concurrency version counter, incremented on each update. * @example 1 */ version: number; }; /** @description The App registration as returned by every read. Secrets are replaced by has_* booleans; webhook_url is the URL to paste into the App's settings. */ GitHubAppConfigResponse: components["schemas"]["GitHubAppConfig"] & { /** * @description Whether a private key is stored. The key itself is never returned. * @example true */ has_private_key: boolean; /** * @description Whether a client secret is stored. The secret itself is never returned. * @example true */ has_client_secret: boolean; /** * @description Whether a webhook secret is stored. The secret is disclosed only once, when it is generated; recovering a lost one means rotating it. * @example true */ has_webhook_secret: boolean; /** * @description The webhook URL for this App, carrying its opaque routing token. Paste it into the App's settings on GitHub. Empty when the instance has no public base URL configured. * @example https://vibexp.example.com/api/v1/webhooks/github/8Xk2mQ7pR4tN */ webhook_url: string; }; /** @description The one and only payload that carries a plaintext webhook secret. Returned by create and by webhook-secret rotation; every subsequent read returns GitHubAppConfigResponse, which cannot carry it. */ CreateGitHubAppConfigResponse: components["schemas"]["GitHubAppConfigResponse"] & { /** * @description The generated webhook secret, shown exactly once. Paste it into the App's settings alongside the webhook URL; it cannot be read back. * @example 9f8e7d6c5b4a39281706f5e4d3c2b1a09f8e7d6c5b4a39281706f5e4d3c2b1a0 */ webhook_secret: string; }; /** @description Registers a team's GitHub App. There is deliberately no webhook_secret field — the server generates it and returns it once. */ CreateGitHubAppConfigRequest: { /** * @description GitHub's numeric App id. * @example 123456 */ app_id: string; /** * @description The App's slug, used to build its install URL. * @example acme-vibexp */ app_slug: string; /** * @description The App's OAuth client id. * @example Iv1.a1b2c3d4e5f6 */ client_id: string; /** @description The App's RSA private key, as raw PEM or base64-encoded PEM. Encrypted at rest and never returned. */ private_key: string; /** @description The App's OAuth client secret. Encrypted at rest and never returned. */ client_secret: string; }; /** @description Edits the team's App registration. Every field is optional; an omitted field keeps the stored value. An explicitly EMPTY value is rejected rather than treated as a clear — a GitHub App with no private key is not a meaningful state, so a blank value is far more likely a client bug than an intent. webhook_secret is absent for the same reason it is absent from create: it is server-generated, and replaced through the rotation endpoint. */ UpdateGitHubAppConfigRequest: { app_id?: string; app_slug?: string; client_id?: string; /** @description Replacement RSA private key (raw PEM or base64-encoded PEM). */ private_key?: string; /** @description Replacement OAuth client secret. */ client_secret?: string; }; /** @description Result of probing GitHub with the stored credentials. A failed probe is reported here with is_valid=false, not as an HTTP error — a wrong key is user-correctable, not a server fault. error_details is always one of a fixed set of categories so the response cannot become an oracle for what the server could reach; the real upstream error is logged server-side only. */ ValidateGitHubAppConfigResponse: { /** @example true */ is_valid: boolean; /** * @description Human-readable summary of the outcome. * @example GitHub App configuration is valid */ message: string; /** * @description The slug GitHub reports for the authenticated App, echoed so a mismatch with the stored value is visible rather than silently producing a broken install URL later. * @example acme-vibexp */ app_slug?: string; /** * @description The App's granted permissions, so a missing contents/metadata read can be surfaced before it breaks an import. * @example { * "contents": "read", * "metadata": "read" * } */ permissions?: { [key: string]: string; }; details?: components["schemas"]["ValidateGitHubAppConfigDetails"]; }; /** @description Fixed-category diagnostics for a validation probe. */ ValidateGitHubAppConfigDetails: { /** @example 214 */ response_time_ms?: number; /** * @description HTTP status GitHub returned, when the probe got that far. * @example 200 */ status_code?: number; /** * @description Fixed failure category. Never carries upstream error text, which would reveal what the server could and could not reach. * @example invalid_credentials * @enum {string} */ error_details?: "invalid_credentials" | "app_not_found" | "slug_mismatch" | "insufficient_permissions" | "connection_failed"; }; /** @description Non-secret SMTP settings. The password is the provider's secret. */ SMTPProviderSettings: { /** * @description SMTP server hostname. * @example smtp.acme.test */ host: string; /** * @description SMTP port, as a string. Must parse to 1-65535. * @example 587 */ port: string; /** * @description SMTP username, when the server requires authentication. * @example mailer@acme.test */ username?: string; }; /** @description Non-secret Mailgun settings. The sending key is the provider's secret. */ MailgunProviderSettings: { /** * @description The Mailgun sending domain. Must be a bare domain, not a URL. * @example mg.acme.test */ domain: string; /** * @description Optional API base URL, to select a non-US region (for example https://api.eu.mailgun.net/v3). A missing /v2|/v3|/v4 suffix is normalised to /v3. * @example https://api.eu.mailgun.net/v3 */ base_url?: string; }; /** @description Non-secret Postmark settings. The server token is the provider's secret. */ PostmarkProviderSettings: { /** * @description Postmark message stream to send on. Defaults to "outbound", the default transactional stream. * @example outbound */ message_stream?: string; }; /** @description Per-type non-secret settings. Exactly the block matching `provider_type` may be present; a block belonging to another type is rejected rather than ignored. SendGrid has no block — its only configuration is its API key, which is the secret. */ TeamEmailProviderSettings: { smtp?: components["schemas"]["SMTPProviderSettings"]; mailgun?: components["schemas"]["MailgunProviderSettings"]; postmark?: components["schemas"]["PostmarkProviderSettings"]; }; /** @description The team's email provider configuration. This is an upsert, so the same body creates or replaces. */ UpsertTeamEmailProviderRequest: { /** * @description Which provider to send through. Matched case-insensitively. * @example mailgun * @enum {string} */ provider_type: "smtp" | "mailgun" | "postmark" | "sendgrid"; settings?: components["schemas"]["TeamEmailProviderSettings"]; /** * @description The provider's single credential (SMTP password, Mailgun sending key, Postmark server token, or SendGrid API key). Required when configuring a provider for the first time. * On a team that already has a provider, OMIT this field to keep the stored credential — it is never returned, so a client cannot resend it. An explicitly empty string is rejected: a provider with no credential cannot send, so clearing it would silently disable the team's mail. * @example key-abc123 */ secret?: string; /** * Format: email * @description The address the team's mail is sent from. * @example hello@acme.test */ from_address: string; /** * @description Optional display name shown beside the from address. * @example Acme Team */ from_name?: string | null; /** * Format: email * @description Optional Reply-To address. * @example support@acme.test */ reply_to?: string | null; }; /** * @description The email configuration in force for a team — its own provider, or the instance provider it inherits. This is never a 404: a team without its own provider is inheriting one, which is a state the caller needs described. * No field here can carry the credential; `has_credential` reports only that one is stored. */ TeamEmailProviderResponse: { /** * @description Whether the team has its own provider configured. * @example true */ configured: boolean; /** * @description Which provider will actually send: the team's own, or the instance provider from the deployment configuration. * @example team * @enum {string} */ source: "team" | "instance"; /** * @description The address mail will actually be sent from — the team's when configured, otherwise the instance's. * @example hello@acme.test */ effective_from_address: string; /** * @description The team's provider type, or null when the team inherits the instance provider. * @example mailgun * @enum {string|null} */ provider_type: "smtp" | "mailgun" | "postmark" | "sendgrid" | null; /** * @description Whether a credential is stored for the team's provider. The credential itself is never returned. * @example true */ has_credential: boolean; /** * @description The team's configured from address. Absent when inheriting the instance provider. * @example hello@acme.test */ from_address?: string; /** * @description The team's configured display name. * @example Acme Team */ from_name?: string | null; /** * @description The team's configured Reply-To address. * @example support@acme.test */ reply_to?: string | null; settings?: components["schemas"]["TeamEmailProviderSettings"]; /** * @description Whether the last observed send succeeded. Derived by comparing last_success_at with last_error_at, so a recovered provider is healthy even though last_error is still populated. * @example true */ is_healthy?: boolean; /** * Format: date-time * @description When a send through the team's provider last succeeded. */ last_success_at?: string | null; /** * @description The last delivery error. Deliberately retained after recovery for diagnosis, so its presence alone does not mean the provider is broken — use is_healthy. * @example smtp: connection refused */ last_error?: string | null; /** * Format: date-time * @description When the last delivery error occurred. */ last_error_at?: string | null; }; /** @description Fixed-category detail for a failed test send. The real upstream error is logged server-side only. */ TeamEmailProviderTestDetails: { /** * @description Why the test failed: `configuration_invalid` when the provider could not be built at all (nothing was dialled), `send_failed` when it was built but delivery failed. Absent on success. * @example send_failed * @enum {string} */ error_details?: "configuration_invalid" | "send_failed"; }; /** @description Outcome of a test send. A failed send is reported here with `is_valid: false`, not as an HTTP error — the caller asked whether the configuration works, and "no, because X" is a successful answer. */ TeamEmailProviderTestResponse: { /** * @description Whether the test message was accepted by the provider. * @example false */ is_valid: boolean; /** * @description Human-readable outcome, safe to show to an admin. * @example Sending failed: dial tcp 127.0.0.1:1: connect: connection refused */ message: string; /** * @description Where the test message was sent. Always the acting user's own account email — this endpoint never accepts a caller-supplied recipient, so it cannot be used to send mail to third parties. * @example admin@acme.test */ recipient: string; details: components["schemas"]["TeamEmailProviderTestDetails"]; }; SupportRequest: { /** @example I need help with configuring my API keys. */ text: string; /** * @example { * "source_url": "/settings/api-keys", * "browser": "Chrome", * "app_version": "1.4.2" * } */ additional_info?: { [key: string]: string; }; /** * @description Whether to send an acknowledgement email to the user * @default false * @example true */ acknowledgement: boolean; }; SupportResponse: { /** @example Thank you for your message! We'll get back to you soon. */ message: string; /** @example true */ success: boolean; }; Artifact: { /** * @description Unique identifier for the artifact * @example 01234567-89ab-cdef-0123-456789abcdef */ id: string; /** * Format: uuid * @description UUID of the project this artifact belongs to * @example 01234567-89ab-cdef-0123-456789abcdef */ project_id: string; /** * @description Unique slug for the artifact within the project * @example api-documentation */ slug: string; /** * @description ID of the user who owns this artifact * @example user-123 */ user_id: string; /** * @description The actual content of the artifact * @example This is the API documentation content... */ content?: string; /** * Format: date-time * @description Timestamp when the artifact was created * @example 2024-01-15T10:30:00Z */ created_at: string; /** * Format: date-time * @description Timestamp when the artifact was last updated * @example 2024-01-15T14:30:00Z */ updated_at: string; /** * @description Current status of the artifact * @example active * @enum {string} */ status: "active" | "draft" | "archived"; /** * @description Human-readable title for the artifact * @example API Documentation */ title: string; /** * @description Optional description of the artifact * @example Comprehensive API documentation for the project */ description?: string; /** * @description Type category of the artifact. An open string validated at runtime against the team's registered types (the system defaults work_reports, static_contexts and general, plus any custom types the team has added), not a fixed enum. * @example general */ type: string; /** * @description Additional metadata as key-value pairs * @example { * "tags": [ * "documentation", * "api" * ], * "priority": "high" * } */ metadata?: { [key: string]: unknown; }; /** @description Depth-1 typed neighborhood of this resource — the relations touching it in both directions, newest first, capped at 20. Typed summaries only, never bodies. Populated on the detail GET; empty in list responses. */ related?: components["schemas"]["RelatedResource"][]; /** @description Computed embedding-similarity neighborhood of this resource (up to 5), derived live at read time from vector similarity — NOT stored edges and distinct from `related`. Populated on the detail GET; empty otherwise. */ similar?: components["schemas"]["SimilarResource"][]; freshness?: components["schemas"]["ResourceFreshnessState"]; }; CreateArtifactRequest: { /** * Format: uuid * @description UUID of the project this artifact belongs to * @example 01234567-89ab-cdef-0123-456789abcdef */ project_id: string; /** * @description Unique slug for the artifact within the project * @example api-documentation */ slug: string; /** * @description The actual content of the artifact * @example This is the API documentation content... */ content: string; /** * @description Human-readable title for the artifact * @example API Documentation */ title: string; /** * @description Optional description of the artifact * @example Comprehensive API documentation for the project */ description?: string; /** * @description Type category of the artifact. An open string validated at runtime against the team's registered types (the system defaults work_reports, static_contexts and general, plus any custom types the team has added), not a fixed enum. Defaults to general when omitted. * @example general */ type?: string; /** * @description Initial status of the artifact * @example active * @enum {string} */ status?: "active" | "draft" | "archived"; /** * @description Additional metadata as key-value pairs * @example { * "tags": [ * "documentation", * "api" * ], * "priority": "high" * } */ metadata?: { [key: string]: unknown; }; }; UpdateArtifactRequest: { /** * Format: uuid * @description New project UUID for the artifact * @example 01234567-89ab-cdef-0123-456789abcdef */ project_id?: string; /** * @description New slug for the artifact * @example updated-api-documentation */ slug?: string; /** * @description Updated content of the artifact * @example This is the updated API documentation content... */ content?: string; /** * @description Updated title for the artifact * @example Updated API Documentation */ title?: string; /** * @description Updated description of the artifact * @example Updated comprehensive API documentation for the project */ description?: string; /** * @description Updated type category of the artifact. An open string validated at runtime against the team's registered types (the system defaults work_reports, static_contexts and general, plus any custom types the team has added), not a fixed enum. * @example general */ type?: string; /** * @description Updated status of the artifact * @example active * @enum {string} */ status?: "active" | "draft" | "archived"; /** * @description Updated metadata as key-value pairs * @example { * "tags": [ * "documentation", * "api", * "updated" * ], * "priority": "medium" * } */ metadata?: { [key: string]: unknown; }; /** * @description Optional human-readable summary of this edit, recorded on the content-version snapshot it produces and shown in the version history. * @example Tightened the restore-flow wording */ change_summary?: string; }; ArtifactListResponse: { /** @description List of artifacts */ artifacts: components["schemas"]["Artifact"][]; /** * @description Total number of artifacts matching the filter criteria * @example 42 */ total_count: number; /** * @description Current page number * @example 1 */ page: number; /** * @description Number of items per page * @example 20 */ per_page: number; /** * @description Total number of pages * @example 3 */ total_pages: number; }; ArtifactStatsResponse: { /** * @description Total number of projects with artifacts * @example 5 */ total_projects: number; /** * @description Total number of artifacts * @example 42 */ total_artifacts: number; /** * @description Number of artifacts added in the current week * @example 3 */ added_this_week: number; /** * @description Count of artifacts by type * @example { * "work_reports": 15, * "static_contexts": 20, * "general": 7 * } */ total_by_type: { [key: string]: number; }; /** * @description Count of artifacts by status * @example { * "active": 35, * "draft": 5, * "archived": 7 * } */ total_by_status: { [key: string]: number; }; }; Attachment: { /** * Format: uuid * @description Unique identifier for the attachment * @example 01234567-89ab-cdef-0123-456789abcdef */ id: string; /** * Format: uuid * @description Team that owns the attachment * @example 01234567-89ab-cdef-0123-456789abcdef */ team_id: string; /** * @description ID of the user who uploaded the attachment; omitted if that user was deleted * @example user-123 */ user_id?: string; /** * @description Polymorphic owner type (currently always "artifact") * @example artifact */ owner_type: string; /** * Format: uuid * @description ID of the owning resource (e.g. the artifact) * @example 01234567-89ab-cdef-0123-456789abcdef */ owner_id: string; /** * @description Original file name (basename only) * @example design-spec.pdf */ file_name: string; /** * @description Optional path relative to the owner's directory (e.g. "scripts/helper.py" for a multi-file skill companion). Absent for a plain attachment. Unique per owner. * @example scripts/helper.py */ relative_path?: string; /** * @description Canonical content type of the file * @example application/pdf */ content_type: string; /** * Format: int64 * @description Size of the file in bytes * @example 204800 */ size_bytes: number; /** * Format: date-time * @description Timestamp when the attachment was uploaded * @example 2024-01-15T10:30:00Z */ created_at: string; }; AttachmentListResponse: { /** @description List of attachments for the owner, newest first */ attachments: components["schemas"]["Attachment"][]; /** * @description Number of attachments * @example 3 */ total_count: number; /** * Format: int64 * @description Combined size of all attachments in bytes * @example 614400 */ total_size_bytes: number; }; ContentVersion: { /** * Format: uuid * @description Unique identifier for the version snapshot * @example 01234567-89ab-cdef-0123-456789abcdef */ id: string; /** * Format: uuid * @description Team that owns the versioned resource * @example 01234567-89ab-cdef-0123-456789abcdef */ team_id: string; /** * @description Type of the versioned resource * @example artifact */ resource_type: string; /** * Format: uuid * @description ID of the resource this snapshot belongs to * @example 01234567-89ab-cdef-0123-456789abcdef */ resource_id: string; /** * @description Monotonic per-resource version number * @example 3 */ version_number: number; /** * @description Snapshot of the resource content at this version * @example Previous artifact content... */ content: string; /** * @description Human-readable summary of the change captured at this version (the "commit message"). Null when none was recorded; the first version defaults to a resource-specific creation label (e.g. "Created the artifact"). * @example Tightened the restore-flow wording */ change_summary: string | null; /** * @description Who authored this version: 'human' for a user edit, 'system' for a system-generated version such as a restore. * @example human * @enum {string} */ actor_type: "human" | "system"; /** * Format: uuid * @description User who triggered the snapshot; null when that user is later deleted * @example 01234567-89ab-cdef-0123-456789abcdef */ created_by: string | null; author: components["schemas"]["VersionAuthor"]; /** * Format: date-time * @description Timestamp when the snapshot was created * @example 2024-01-15T10:30:00Z */ created_at: string; }; ArtifactVersionListResponse: { /** @description Content-version snapshots for the artifact, newest first */ versions: components["schemas"]["ContentVersion"][]; }; Feed: { /** * Format: uuid * @description Unique identifier for the feed * @example 01234567-89ab-cdef-0123-456789abcdef */ id: string; /** * Format: uuid * @description UUID of the team this feed belongs to * @example 01234567-89ab-cdef-0123-456789abcdef */ team_id: string; /** * @description Human-readable name for the feed * @example Product Updates */ name: string; /** * @description Optional description of the feed * @example AI-generated product update summaries */ description?: string | null; /** * @description ID of the user who created this feed * @example user-123 */ created_by_user_id: string; /** * Format: date-time * @description Timestamp when the feed was created * @example 2024-01-15T10:30:00Z */ created_at: string; /** * Format: date-time * @description Timestamp when the feed was last updated * @example 2024-01-15T14:30:00Z */ updated_at: string; }; FeedItem: { /** * Format: uuid * @description Unique identifier for the feed item * @example 01234567-89ab-cdef-0123-456789abcdef */ id: string; /** * Format: uuid * @description UUID of the team this item belongs to * @example 01234567-89ab-cdef-0123-456789abcdef */ team_id: string; /** * Format: uuid * @description UUID of the feed this item belongs to * @example 01234567-89ab-cdef-0123-456789abcdef */ feed_id: string; /** * Format: uuid * @description Optional UUID of the associated project * @example 01234567-89ab-cdef-0123-456789abcdef */ project_id?: string | null; /** * @description Title of the feed item * @example Sprint 42 Retrospective */ title: string; /** * @description Full content of the feed item (max 200 KB) * @example ## Summary * The sprint went well... */ content: string; /** * @description Server-computed plain-text excerpt (first 300 chars, markdown stripped) * @example The sprint went well and the team delivered all committed features. */ excerpt: string; /** * @description Name of the AI assistant that generated this item * @example claude-sonnet-4-5 */ ai_assistant_name: string; /** * @description ID of the user who posted this item * @example user-123 */ posted_by_user_id: string; /** * Format: date-time * @description Timestamp when the item was archived, null if active * @example null */ archived_at?: string | null; /** * Format: date-time * @description Server-set timestamp when the item was posted * @example 2024-01-15T10:30:00Z */ posted_at: string; /** * @description Number of replies to this item. Populated with the real count on list and single-item GET responses; always 0 on create responses (a new item has no replies yet). * @example 3 */ reply_count: number; }; CreateFeedRequest: { /** * @description Name of the feed (unique within the team) * @example Product Updates */ name: string; /** * @description Optional description of the feed * @example AI-generated product update summaries */ description?: string; }; UpdateFeedRequest: { /** * @description Updated name of the feed * @example Product Updates v2 */ name?: string; /** * @description Updated description of the feed * @example Updated AI-generated product summaries */ description?: string; }; CreateFeedItemRequest: { /** * @description Title of the feed item * @example Sprint 42 Retrospective */ title: string; /** * @description Full content of the feed item (max 200 KB) * @example ## Summary * The sprint went well... */ content: string; /** * @description Name of the AI assistant that generated this item (no normalization applied) * @example claude-sonnet-4-5 */ ai_assistant_name: string; /** * Format: uuid * @description Optional UUID of the associated project (must belong to the same team) * @example 01234567-89ab-cdef-0123-456789abcdef */ project_id?: string; }; FeedListResponse: { /** @description List of feeds */ feeds: components["schemas"]["Feed"][]; /** * @description Total number of feeds matching the filter criteria * @example 12 */ total_count: number; /** * @description Current page number * @example 1 */ page: number; /** * @description Number of items per page * @example 20 */ per_page: number; /** * @description Total number of pages * @example 1 */ total_pages: number; }; FeedItemListResponse: { /** @description List of feed items */ items: components["schemas"]["FeedItem"][]; /** * @description Total number of items matching the filter criteria * @example 42 */ total_count: number; /** * @description Current page number * @example 1 */ page: number; /** * @description Number of items per page * @example 20 */ per_page: number; /** * @description Total number of pages * @example 3 */ total_pages: number; }; GitHubImportProjectResultResponse: { project: components["schemas"]["Project"]; /** @description Whether the project was created by this request (false when it already existed) */ created: boolean; /** @example Project already exists for this repository */ message?: string; }; Project: { /** * Format: uuid * @description Unique identifier for the project * @example 01234567-89ab-cdef-0123-456789abcdef */ id: string; /** * Format: uuid * @description ID of the user who created this project * @example a1234567-89ab-cdef-0123-456789abcdef */ user_id: string; /** * Format: uuid * @description ID of the team this project belongs to * @example b1234567-89ab-cdef-0123-456789abcdef */ team_id: string; /** * @description Human-readable name of the project * @example My Awesome Project */ name: string; /** * @description Unique slug for the project (URL-friendly identifier) * @example my-awesome-project */ slug: string; /** * @description Optional description of the project (empty string when unset) * @example This is a comprehensive project for managing API documentation */ description: string; /** * @description Git repository URL for the project (empty string when unset) * @example https://github.com/user/my-awesome-project */ git_url: string; /** * @description Homepage URL for the project (empty string when unset) * @example https://myproject.com */ homepage: string; /** * Format: date-time * @description Timestamp when the project was created * @example 2024-01-15T10:30:00Z */ created_at: string; /** * Format: date-time * @description Timestamp when the project was last updated * @example 2024-01-15T14:30:00Z */ updated_at: string; /** * Format: int64 * @description Version number for optimistic locking * @example 1 */ version: number; }; CreateProjectRequest: { /** * @description Human-readable name of the project * @example My Awesome Project */ name: string; /** * @description Unique slug for the project (URL-friendly identifier) * @example my-awesome-project */ slug: string; /** * Format: uuid * @description Optional team ID; defaults to the team from the URL path * @example b1234567-89ab-cdef-0123-456789abcdef */ team_id?: string; /** * @description Optional description of the project * @example This is a comprehensive project for managing API documentation */ description?: string; /** * Format: uri * @description Git repository URL for the project * @example https://github.com/user/my-awesome-project */ git_url?: string; /** * Format: uri * @description Homepage URL for the project * @example https://myproject.com */ homepage?: string; }; UpdateProjectRequest: { /** * @description Updated name of the project * @example My Updated Project */ name?: string; /** * @description Updated slug for the project * @example my-updated-project */ slug?: string; /** * Format: uuid * @description Team ID; must match the project's current team (resources cannot be moved between teams) * @example b1234567-89ab-cdef-0123-456789abcdef */ team_id?: string; /** * @description Updated description of the project * @example This is the updated project description */ description?: string; /** * Format: uri * @description Updated git repository URL * @example https://github.com/user/my-updated-project */ git_url?: string; /** * Format: uri * @description Updated homepage URL * @example https://myupdatedproject.com */ homepage?: string; }; ProjectListResponse: { /** @description List of projects with computed fields */ projects: components["schemas"]["ProjectResponse"][]; /** * @description Total number of projects matching the filter criteria * @example 10 */ total_count: number; /** * @description Current page number * @example 1 */ page: number; /** * @description Number of items per page * @example 20 */ per_page: number; /** * @description Total number of pages * @example 1 */ total_pages: number; }; ProjectStatsResponse: { /** * @description Total number of prompts belonging to this project * @example 5 */ total_prompts?: number; /** * @description Total number of artifacts belonging to this project * @example 3 */ total_artifacts?: number; /** * @description Total number of spec libraries belonging to this project * @example 2 */ total_blueprints?: number; /** * @description Total number of memories belonging to this project * @example 8 */ total_memories?: number; /** * @description Total number of feed items belonging to this project * @example 12 */ total_feed_items?: number; }; ProjectResourceCreationMetricsResponse: { /** @example success */ status: string; /** @example Resource creation metrics retrieved successfully */ message: string; data: components["schemas"]["ProjectResourceCreationMetricsData"]; }; Memory: { /** * @description Unique identifier for the memory * @example 01234567-89ab-cdef-0123-456789abcdef */ id: string; /** * @description ID of the user who owns this memory * @example user-123 */ user_id: string; /** * @description ID of the team this memory belongs to * @example 01234567-89ab-cdef-0123-456789abcdef */ team_id: string; /** * @description ID of the project this memory belongs to * @example 01234567-89ab-cdef-0123-456789abcdef */ project_id: string; /** * @description The text content of the memory * @example Remember to update the API documentation when adding new endpoints */ text: string; /** * @description Current lifecycle status of the memory * @example active * @enum {string} */ status: "active" | "draft" | "archived"; /** * @description Additional metadata as key-value pairs * @example { * "category": "reminder", * "priority": "high", * "project": "api-project" * } */ metadata?: { [key: string]: unknown; }; /** * Format: date-time * @description Timestamp when the memory was created * @example 2024-01-15T10:30:00Z */ created_at: string; /** * Format: date-time * @description Timestamp when the memory was last updated * @example 2024-01-15T14:30:00Z */ updated_at: string; /** * Format: int64 * @description Version number for optimistic concurrency control * @example 1 */ version: number; /** @description Depth-1 typed neighborhood of this resource — the relations touching it in both directions, newest first, capped at 20. Typed summaries only, never bodies. Populated on the detail GET; empty in list responses. */ related?: components["schemas"]["RelatedResource"][]; /** @description Computed embedding-similarity neighborhood of this resource (up to 5), derived live at read time from vector similarity — NOT stored edges and distinct from `related`. Populated on the detail GET; empty otherwise. */ similar?: components["schemas"]["SimilarResource"][]; freshness?: components["schemas"]["ResourceFreshnessState"]; }; CreateMemoryRequest: { /** * Format: uuid * @description UUID of the project this memory belongs to * @example 01234567-89ab-cdef-0123-456789abcdef */ project_id: string; /** * @description The text content of the memory * @example Remember to update the API documentation when adding new endpoints */ text: string; /** * @description Initial lifecycle status of the memory (defaults to active) * @example active * @enum {string} */ status?: "active" | "draft" | "archived"; /** * @description Additional metadata as key-value pairs * @example { * "category": "reminder", * "priority": "high", * "project": "api-project" * } */ metadata?: { [key: string]: unknown; }; }; UpdateMemoryRequest: { /** * Format: uuid * @description New project UUID for the memory (moves it between projects) * @example 01234567-89ab-cdef-0123-456789abcdef */ project_id?: string; /** * @description Updated text content of the memory * @example Updated reminder to include versioning in API documentation */ text?: string; /** * @description Updated lifecycle status of the memory * @example archived * @enum {string} */ status?: "active" | "draft" | "archived"; /** * @description Updated metadata as key-value pairs * @example { * "category": "reminder", * "priority": "medium", * "project": "api-project", * "updated": true * } */ metadata?: { [key: string]: unknown; }; }; MemoryListResponse: { /** @description List of memories */ memories: components["schemas"]["Memory"][]; /** * @description Total number of memories matching the filter criteria * @example 25 */ total_count: number; /** * @description Current page number * @example 1 */ page: number; /** * @description Number of items per page * @example 50 */ per_page: number; /** * @description Total number of pages * @example 1 */ total_pages: number; }; MemoryVersionListResponse: { /** @description Content-version snapshots for the memory, newest first */ versions: components["schemas"]["ContentVersion"][]; }; SearchRequest: { /** * @description Free-text query to embed and search semantically * @example how to configure retries */ query: string; /** * @description Resource types to search. Omit or leave empty to search all four types. Unknown values are rejected with a 400. * @example [ * "prompts", * "artifacts" * ] */ types?: ("prompts" | "artifacts" | "blueprints" | "memories")[]; /** * Format: uuid * @description Optional project UUID. When set, results are restricted to this project across every type. Omit to search across all projects. * @example 7c9e6679-7425-40de-944b-e07fc1f90ae7 */ project_id?: string; /** * @description Page number * @default 1 * @example 1 */ page: number; /** * @description Number of items per page * @default 10 * @example 10 */ per_page: number; }; SearchResultItem: { /** * @description Singular resource type of the matched source entity * @example prompt * @enum {string} */ type: "prompt" | "artifact" | "blueprint" | "memory"; /** * Format: uuid * @description ID of the source resource the matched chunk belongs to */ id: string; /** * @description Title of the source resource * @example Retry configuration guide */ title: string; /** * @description Slug of the source resource, used to build slug-based detail-page links. Empty for memories, which are routed by id. * @example retry-configuration-guide */ slug: string; /** * Format: uuid * @description UUID of the parent project. Used to build artifact and blueprint detail-page links, which are keyed by project UUID. Always present — every resource belongs to exactly one project. * @example 7c9e6679-7425-40de-944b-e07fc1f90ae7 */ project_id: string; /** * @description Human-readable name of the parent project, shown alongside each result. * @example My Project */ project_name: string; /** @description Matched chunk content, truncated to at most 500 characters */ excerpt: string; /** * Format: double * @description Relevance score (1 - cosine distance), clamped to [0,1] * @example 0.87 */ score: number; /** * Format: uuid * @description ID of the matched embedding row (chunk) */ chunk_id: string; /** * Format: date-time * @description Last-updated timestamp of the source resource */ updated_at: string; }; SearchResultsResponse: { /** @description Relevance-ranked search results, one per matching entity (carrying its best-scoring chunk) */ results: components["schemas"]["SearchResultItem"][]; /** * @description Total number of matching resources (distinct entities) across all pages * @example 42 */ total_count: number; /** * @description Current page number * @example 1 */ page: number; /** * @description Number of items per page * @example 10 */ per_page: number; /** * @description Total number of pages * @example 5 */ total_pages: number; }; Blueprint: { /** * @description Unique identifier for the spec library * @example 01234567-89ab-cdef-0123-456789abcdef */ id: string; /** * Format: uuid * @description UUID of the project this spec library belongs to * @example 01234567-89ab-cdef-0123-456789abcdef */ project_id: string; /** * @description Unique slug for the spec library within the project * @example openapi-specification */ slug: string; /** * @description ID of the user who owns this spec library * @example user-123 */ user_id: string; /** * @description The actual content/specification of the spec library * @example openapi: 3.0.3 * info: * title: My API * version: 1.0.0... */ content: string; /** * Format: date-time * @description Timestamp when the spec library was created * @example 2024-01-15T10:30:00Z */ created_at: string; /** * Format: date-time * @description Timestamp when the spec library was last updated * @example 2024-01-15T14:30:00Z */ updated_at: string; /** * @description Current status of the spec library * @example active * @enum {string} */ status: "active" | "expired"; /** * @description Human-readable title for the spec library * @example OpenAPI Specification */ title: string; /** * @description Optional description of the spec library * @example Complete OpenAPI specification for the REST API */ description?: string; /** * @description Type category of the spec library * @example general * @enum {string} */ type: "general" | "claude-code" | "claude" | "cursor" | "codex"; /** * @description Subtype category for specific type spec libraries * @example sub-agents * @enum {string} */ subtype?: "sub-agents" | "skills" | "slash-commands" | "others" | "claude-md" | "agents" | "commands" | "rules" | "cursor-md" | "agents-md"; /** * @description Additional metadata as key-value pairs * @example { * "spec_type": "openapi", * "version": "3.0.3", * "tags": [ * "api", * "rest", * "specification" * ] * } */ metadata?: { [key: string]: unknown; }; /** * @description Canonical repo-relative path this blueprint materializes to. Derived from (type, subtype, slug) for VibeXP-authored blueprints, or the verbatim source path for imported ones. * @example .claude/skills/deploy/SKILL.md */ path: string; /** * @description SHA-256 (lowercase hex) of the raw content. * @example e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 */ content_sha?: string; source?: components["schemas"]["BlueprintSource"]; /** @description Depth-1 typed neighborhood of this resource — the relations touching it in both directions, newest first, capped at 20. Typed summaries only, never bodies. Populated on the detail GET; empty in list responses. */ related?: components["schemas"]["RelatedResource"][]; /** @description Computed embedding-similarity neighborhood of this resource (up to 5), derived live at read time from vector similarity — NOT stored edges and distinct from `related`. Populated on the detail GET; empty otherwise. */ similar?: components["schemas"]["SimilarResource"][]; freshness?: components["schemas"]["ResourceFreshnessState"]; }; /** @description Read-only import provenance; present only for imported blueprints. */ BlueprintSource: { /** * @description Source repository URL the blueprint was imported from. * @example https://github.com/vibexp/vibexp */ repo?: string; /** * @description Head commit SHA of the branch at import time. * @example 6706920221608... */ commit_sha?: string; /** * @description Git blob SHA of the source file at import time. * @example blobsha123... */ blob_sha?: string; /** * Format: date-time * @description Timestamp when the blueprint was imported. * @example 2024-01-15T10:30:00Z */ imported_at?: string; }; BlueprintDetail: components["schemas"]["Blueprint"] & { /** * @description Original raw bytes of the blueprint (frontmatter + body). Returned only on the detail GET, never in list responses. * @example --- * name: Deploy * --- * Body */ raw_content?: string; }; CreateBlueprintRequest: { /** * Format: uuid * @description UUID of the project this spec library belongs to * @example 01234567-89ab-cdef-0123-456789abcdef */ project_id?: string; /** * @description Unique slug for the spec library within the project * @example openapi-specification */ slug: string; /** * @description The actual content/specification of the spec library * @example openapi: 3.0.3 * info: * title: My API * version: 1.0.0... */ content: string; /** * @description Human-readable title for the spec library * @example OpenAPI Specification */ title: string; /** * @description Optional description of the spec library * @example Complete OpenAPI specification for the REST API */ description?: string; /** * @description Type category of the spec library * @default general * @example general * @enum {string} */ type: "general" | "claude-code" | "claude" | "cursor" | "codex"; /** * @description Subtype category for specific type spec libraries * @example sub-agents * @enum {string} */ subtype?: "sub-agents" | "skills" | "slash-commands" | "others" | "claude-md" | "agents" | "commands" | "rules" | "cursor-md" | "agents-md"; /** * @description Initial status of the spec library * @default active * @example active * @enum {string} */ status: "active" | "expired"; /** * @description Additional metadata as key-value pairs * @example { * "spec_type": "openapi", * "version": "3.0.3", * "tags": [ * "api", * "rest", * "specification" * ] * } */ metadata?: { [key: string]: unknown; }; /** * @description Optional repo-relative path to freeze for this blueprint. When omitted a default is derived from (type, subtype, slug). Must be relative — no leading "/", no "..", no backslashes. * @example .claude/skills/deploy/SKILL.md */ path?: string; }; UpdateBlueprintRequest: { /** * Format: uuid * @description New project UUID for the spec library * @example 01234567-89ab-cdef-0123-456789abcdef */ project_id?: string; /** * @description New slug for the spec library * @example updated-openapi-specification */ slug?: string; /** * @description Updated content/specification of the spec library * @example openapi: 3.0.3 * info: * title: My Updated API * version: 2.0.0... */ content?: string; /** * @description Updated title for the spec library * @example Updated OpenAPI Specification */ title?: string; /** * @description Updated description of the spec library * @example Updated complete OpenAPI specification for the REST API */ description?: string; /** * @description Updated type category of the spec library * @example general * @enum {string} */ type?: "general" | "claude-code" | "claude" | "cursor" | "codex"; /** * @description Updated subtype category for specific type spec libraries * @example sub-agents * @enum {string} */ subtype?: "sub-agents" | "skills" | "slash-commands" | "others" | "claude-md" | "agents" | "commands" | "rules" | "cursor-md" | "agents-md"; /** * @description Updated status of the spec library * @example active * @enum {string} */ status?: "active" | "expired"; /** * @description Updated metadata as key-value pairs * @example { * "spec_type": "openapi", * "version": "3.1.0", * "tags": [ * "api", * "rest", * "specification", * "updated" * ] * } */ metadata?: { [key: string]: unknown; }; /** * @description Optional repo-relative path override; freezes the blueprint's path. Must be relative — no leading "/", no "..", no backslashes. * @example .claude/skills/deploy/SKILL.md */ path?: string; }; BlueprintListResponse: { /** @description List of spec libraries */ blueprints: components["schemas"]["Blueprint"][]; /** * @description Total number of spec libraries matching the filter criteria * @example 42 */ total_count: number; /** * @description Current page number * @example 1 */ page: number; /** * @description Number of items per page * @example 20 */ per_page: number; /** * @description Total number of pages * @example 3 */ total_pages: number; }; BlueprintStatsResponse: { /** * @description Total number of projects with spec libraries * @example 5 */ total_projects: number; /** * @description Total number of blueprints * @example 42 */ total_blueprints: number; /** * @description Number of spec libraries added in the current week * @example 3 */ added_this_week: number; /** * @description Count of spec libraries by type * @example { * "general": 42 * } */ total_by_type: { [key: string]: number; }; /** * @description Count of spec libraries by status * @example { * "active": 35, * "expired": 7 * } */ total_by_status: { [key: string]: number; }; }; BlueprintVersionListResponse: { /** @description Content-version snapshots for the blueprint, newest first */ versions: components["schemas"]["ContentVersion"][]; }; /** @description Status of the GitHub App installation for a team */ GitHubInstallationStatus: { /** * @description Whether the GitHub App is installed for the team * @example true */ installed: boolean; /** * @description GitHub account or organization login that installed the app (present when installed is true) * @example my-org */ account_login?: string; /** * Format: int64 * @description GitHub installation ID (present when installed is true) * @example 12345678 */ installation_id?: number; /** * @description Whether the installation is currently suspended * @example false */ suspended?: boolean; /** * Format: date-time * @description When the GitHub App was installed (present when installed is true) * @example 2024-01-15T10:30:00Z */ installed_at?: string; }; /** @description A GitHub repository accessible by the installation */ GitHubRepository: { /** * Format: int64 * @description GitHub repository ID * @example 123456789 */ id: number; /** * @description Repository name (without owner) * @example my-repo */ name: string; /** * @description Full repository name including owner (owner/repo) * @example my-org/my-repo */ full_name: string; /** * @description Repository description * @example A sample repository */ description?: string | null; /** * @description Whether the repository is private * @example false */ private: boolean; /** * @description GitHub web URL for the repository * @example https://github.com/my-org/my-repo */ html_url: string; /** @description Repository owner information */ owner: { /** * @description Owner's GitHub login * @example my-org */ login: string; /** * @description Owner type (User or Organization) * @example Organization * @enum {string} */ type: "User" | "Organization"; }; /** * @description Slug of the existing VibeXP project imported from this repository (when the repo's html_url matches an existing project's git_url within the team). Omitted/empty when no matching project exists. * @example my-repo */ imported_project_slug?: string; }; /** @description Paginated list of GitHub repositories accessible by the installation */ GitHubRepositoriesResponse: { /** @description List of repositories for the current page */ repositories: components["schemas"]["GitHubRepository"][]; /** * @description Total number of repositories accessible by the installation * @example 42 */ total_count: number; /** * @description Current page number (1-based) * @example 1 */ page: number; /** * @description Number of items per page * @example 100 */ per_page: number; }; /** @description Response returned after successfully completing the GitHub App installation callback */ GitHubCallbackResponse: { /** * @description Whether this was a reconnection to an existing installation (true) or a new installation (false) * @example false */ reconnected: boolean; }; /** @description GitHub App installation URL with CSRF protection state parameter */ GitHubInstallURL: { /** * @description URL to redirect the user to for installing the GitHub App * @example https://github.com/apps/vibexp-app/installations/new?state=team-id%3A1234567890%3Asignature */ install_url: string; }; /** @description Details of a file that failed to be imported as a blueprint */ BlueprintImportFailed: { /** * @description Path of the file that failed to import * @example .claude/agents/my-agent.md */ file_path: string; /** * @description Generic error message (internal details are not exposed) * @example failed to import blueprint */ error: string; }; /** @description Details of a file successfully imported as a blueprint */ BlueprintImportSuccess: { /** * @description Path of the file that was imported * @example .claude/agents/my-agent.md */ file_path: string; /** * @description ID of the created blueprint * @example 01234567-89ab-cdef-0123-456789abcdef */ blueprint_id: string; /** * @description Title of the created blueprint * @example my-agent from my-repo */ title: string; /** * @description Blueprint type * @example claude-code */ type: string; /** * @description Blueprint subtype * @example sub-agents */ subtype?: string; }; /** @description Details of a file that was skipped during blueprint import */ BlueprintImportSkipped: { /** * @description Path of the file that was skipped * @example .claude/agents/script.py */ file_path: string; /** * @description Human-readable reason why the file was skipped * @example Not a markdown file */ reason: string; }; /** @description Summary report of a blueprint import operation */ BlueprintImportReport: { /** * @description Total number of files scanned during the import * @example 10 */ total_scanned: number; /** * @description Number of files successfully imported as blueprints * @example 7 */ total_successful: number; /** * @description Number of files that failed to import * @example 1 */ total_failed: number; /** * @description Number of files skipped (non-markdown, empty, too large, or already exists) * @example 2 */ total_skipped: number; /** @description Details of files that failed to import */ failed_items: components["schemas"]["BlueprintImportFailed"][]; /** @description Details of files successfully imported */ successful_items: components["schemas"]["BlueprintImportSuccess"][]; /** @description Details of files that were skipped */ skipped_items: components["schemas"]["BlueprintImportSkipped"][]; /** * @description Number of blueprints refreshed from a changed repo file (unedited in VibeXP) * @example 1 */ total_updated: number; /** * @description Number of blueprints left untouched because they were edited in VibeXP * @example 1 */ total_conflicts: number; /** * @description Number of blueprints whose repo file was unchanged (no-op) * @example 3 */ total_up_to_date: number; /** @description Details of blueprints refreshed from a changed repo file */ updated_items: components["schemas"]["BlueprintImportUpdated"][]; /** @description Details of blueprints left untouched due to a VibeXP edit */ conflict_items: components["schemas"]["BlueprintImportConflict"][]; /** @description Details of blueprints whose repo file was unchanged */ up_to_date_items: components["schemas"]["BlueprintImportUpToDate"][]; /** * @description Number of Agent Skill companion files stored as attachments (newly imported or replaced on re-import) * @example 2 */ total_companions_imported: number; /** * @description Number of companion files deleted during re-import reconciliation (absent from the re-imported skill) * @example 1 */ total_companions_removed: number; /** * @description Number of companion files rejected by the attachment service (oversized, over the per-owner budget, disallowed type, or storage unconfigured) * @example 1 */ total_companions_skipped: number; /** @description Per-file outcomes for Agent Skill companion files, distinct from the blueprint (SKILL.md) outcomes */ companion_items: components["schemas"]["BlueprintImportCompanion"][]; }; /** @description A blueprint refreshed from a changed repo file during re-import */ BlueprintImportUpdated: { /** @example .claude/agents/reviewer.md */ file_path: string; /** @example 01234567-89ab-cdef-0123-456789abcdef */ blueprint_id: string; /** @example Reviewer */ title: string; /** @example claude-code */ type: string; /** @example sub-agents */ subtype?: string; }; /** @description A blueprint left untouched during re-import because it was edited in VibeXP */ BlueprintImportConflict: { /** @example .claude/agents/reviewer.md */ file_path: string; /** @example 01234567-89ab-cdef-0123-456789abcdef */ blueprint_id: string; /** @example Blueprint was edited in VibeXP; re-import skipped to avoid overwriting local changes */ reason: string; }; /** @description A blueprint whose repo file was unchanged since import (re-import no-op) */ BlueprintImportUpToDate: { /** @example .claude/agents/reviewer.md */ file_path: string; /** @example 01234567-89ab-cdef-0123-456789abcdef */ blueprint_id: string; }; /** @description Per-file outcome of importing one Agent Skill companion file (a sibling of a SKILL.md) as a blueprint-owned attachment. */ BlueprintImportCompanion: { /** * @description ID of the blueprint (imported SKILL.md) that owns this companion * @example 01234567-89ab-cdef-0123-456789abcdef */ blueprint_id: string; /** * @description Path of the companion file relative to the skill directory * @example scripts/helper.txt */ relative_path: string; /** * @description What happened to the companion file during import * @example imported * @enum {string} */ outcome: "imported" | "updated" | "removed" | "skipped"; /** * @description Why the companion was skipped (present only when outcome is "skipped") * @example File type is not allowed */ reason?: string; }; /** @description Weekly usage metrics for a single week */ UsageMetricsRow: { /** * Format: date * @description Week start date (Monday) */ week_start?: string; /** @description Number of new users registered this week */ new_users?: number; /** @description Number of new artifacts created this week */ new_artifacts?: number; /** @description Number of new memories created this week */ new_memories?: number; /** @description Number of new API keys created this week */ new_api_keys?: number; /** @description Number of new prompts created this week */ new_prompts?: number; /** @description Number of new agents created this week */ new_agents?: number; /** @description Number of agent executions this week */ agent_executions?: number; }; /** @description Per-user activity summary */ UserActivityRow: { /** @description User ID */ user_id?: string; /** * Format: email * @description User email */ email?: string; /** @description User display name */ name?: string; /** * Format: date-time * @description User registration timestamp */ user_created_at?: string; /** @description Total number of artifacts created by user */ total_artifacts?: number; /** * Format: date-time * @description Timestamp of first artifact creation */ first_artifact_created_at?: string | null; /** @description Total number of memories created by user */ total_memories?: number; /** * Format: date-time * @description Timestamp of first memory creation */ first_memory_created_at?: string | null; /** @description Total number of prompts created by user */ total_prompts?: number; /** * Format: date-time * @description Timestamp of first prompt creation */ first_prompt_created_at?: string | null; /** @description Total number of agents created by user */ total_agents_created?: number; /** @description Total number of agent executions run by user */ total_agent_executions_run?: number; }; /** @description Usage and growth data response */ UsageAndGrowthResponse: { /** @description Weekly usage metrics */ usage?: components["schemas"]["UsageMetricsRow"][]; /** @description Per-user activity summary */ activities_per_user?: components["schemas"]["UserActivityRow"][]; }; /** @description Information about the user who sent a team invitation */ InviterInfo: { /** @example user_123 */ id?: string; /** @example Jane Doe */ name?: string; /** * Format: email * @example jane@example.com */ email?: string; }; /** @description Team invitation enriched with team and inviter details */ InvitationResponse: { /** @example inv_123 */ id?: string; /** * @description Opaque invitation token used in invitation URLs * @example abc123def456... */ token?: string; /** @example team_123 */ team_id?: string; /** @example Acme Corp */ team_name?: string; /** * Format: email * @example invitee@example.com */ invitee_email?: string; /** * @example member * @enum {string} */ role?: "member" | "admin"; /** * @example pending * @enum {string} */ status?: "pending" | "accepted" | "rejected" | "revoked"; /** * Format: date-time * @example 2025-09-29T12:00:00Z */ expires_at?: string; /** * Format: date-time * @example 2025-09-22T12:00:00Z */ created_at?: string; invited_by?: components["schemas"]["InviterInfo"]; }; /** @description Bare list of team invitations returned by the list endpoint. */ InvitationResponseList: components["schemas"]["InvitationResponse"][]; /** @description Wrapper response for the get-invitation-by-token endpoint */ InvitationDetailsResponse: { invitation: components["schemas"]["InvitationResponse"]; }; /** @description A2A (Agent-to-Agent) protocol agent card (protocol v1.0), mirroring the official a2a-go SDK's a2a.AgentCard type. */ AgentCard: { /** @example Code Reviewer Agent */ name?: string; description?: string; /** @example 1.0.0 */ version?: string; /** @description Supported transport/protocol/URL combinations for interacting with the agent. */ supportedInterfaces?: { /** Format: uri */ url?: string; /** * @description Transport protocol available at this URL (e.g. JSONRPC, GRPC, HTTP+JSON). * @example JSONRPC */ protocolBinding?: string; /** @example 1.0 */ protocolVersion?: string; tenant?: string | null; }[] | null; /** * @example [ * "text/plain" * ] */ defaultInputModes?: string[] | null; /** * @example [ * "text/plain" * ] */ defaultOutputModes?: string[] | null; /** Format: uri */ iconUrl?: string | null; /** Format: uri */ documentationUrl?: string | null; provider?: { organization?: string; /** Format: uri */ url?: string; } | null; capabilities?: { streaming?: boolean; pushNotifications?: boolean; extendedAgentCard?: boolean; extensions?: { uri?: string; description?: string; required?: boolean; params?: { [key: string]: unknown; } | null; }[] | null; }; skills?: { id?: string; name?: string; description?: string; tags?: string[] | null; examples?: string[] | null; inputModes?: string[] | null; outputModes?: string[] | null; securityRequirements?: { [key: string]: unknown; }[] | null; }[] | null; /** @description Security requirement options (OR of ANDs) applying to all agent interactions. */ securityRequirements?: { [key: string]: unknown; }[] | null; /** @description Security schemes available to authorize requests, keyed by scheme name. */ securitySchemes?: { [key: string]: { [key: string]: unknown; }; } | null; signatures?: { protected?: string; signature?: string; header?: { [key: string]: unknown; } | null; }[] | null; }; UpdateAgentCredentialsRequest: { /** * @example { * "api_key": { * "type": "apiKey", * "value": "sk-new-1234567890abcdef" * } * } */ credentials: { [key: string]: components["schemas"]["CredentialRequest"]; }; }; PreviewAgentCardRequest: { /** * Format: uri * @description URL of the A2A agent card to fetch and preview * @example https://example.com/.well-known/agent-card.json */ card_url: string; }; ExecuteAgentRequest: { /** @description Input payload forwarded to the agent */ input?: { [key: string]: unknown; }; /** @description Existing conversation to continue; a new conversation is started when omitted */ conversation_id?: string | null; }; AgentExecutionListResponse: { executions: components["schemas"]["AgentExecution"][]; total_count: number; page: number; per_page: number; total_pages: number; }; AgentExecutionEventsResponse: components["schemas"]["AgentExecutionEventsPollResponse"] | components["schemas"]["AgentExecutionEventsPageResponse"]; /** @description Cursor-based polling response (returned when the `since` query parameter is provided) */ AgentExecutionEventsPollResponse: { execution_id: string; /** @enum {string} */ status: "running" | "success" | "error" | "pending" | "submitted" | "working" | "completed" | "failed" | "cancelled"; current_state?: string | null; events: components["schemas"]["AgentExecutionEvent"][]; /** @description True while the execution is still pending or running */ has_more: boolean; /** @description Pass as `since` on the next poll */ next_sequence: number; }; /** @description Page-based pagination response (returned when the `since` query parameter is absent) */ AgentExecutionEventsPageResponse: { events: components["schemas"]["AgentExecutionEvent"][]; total_count: number; page: number; per_page: number; total_pages: number; }; ConversationListResponse: { conversations: components["schemas"]["ConversationSummary"][]; total_count: number; page: number; per_page: number; total_pages: number; }; ConversationExecutionsResponse: { executions: components["schemas"]["AgentExecution"][]; conversation_id: string; has_more: boolean; total_count: number; /** @description Number of executions in this page */ count: number; }; /** @description A team (workspace) in the system. `role`, `permissions` and `member_count` are computed at read time for the requesting user. */ Team: { /** * Format: uuid * @example 550e8400-e29b-41d4-a716-446655440000 */ id: string; /** * @description User ID of the team owner * @example user_01HXYZABC123 */ owner_id: string; /** @example Engineering Team */ name: string; /** @example engineering-team */ slug: string; /** @example Team for the core engineering group */ description: string; /** * @description Whether this is the user's personal workspace (cannot be deleted) * @example false */ is_personal: boolean; /** * @description The requesting user's role in this team: owner, admin, or member. Populated at runtime on every response that carries a team, including create (where the caller is by definition the owner). Not an enum constraint: older responses may still carry an empty string. * @example owner */ role?: string; /** * @description Exactly what `role` permits the requesting user to do in this team, expanded server-side from the role matrix (epic #220). Clients MUST gate their UI on these strings rather than re-deriving them from `role` — the matrix lives on the server and may change without a client release. * Computed at read time for the requesting user, alongside `role`, and always present (an empty array means the role grants nothing). The values are stable API surface: renaming one is a breaking change, and they are kept byte-identical to the `internal/authz` constants by a drift test. Meanings: * * `team.update` — change team name, slug or description. * `team.delete` — delete the team (owner only). * `team.transfer` — transfer ownership to another member (owner only). * `team.settings.update` — change team-level configuration, such as search ranking. * `member.invite` — invite new members. * `member.remove` — remove members from the team. * `member.role.update` — change a member's role. * `project.create` — create a project in the team. * `project.update` — update any project in the team. * `project.delete` — delete any project in the team. * `resource.create` — create a prompt, memory, artifact, blueprint or agent. * `resource.update.any` — update any resource, including other members'. * `resource.delete.own` — delete a resource the caller created. * `resource.delete.any` — delete a resource created by someone else. * `feed.delete.any` — delete another member's feed post or reply (moderation). * @example [ * "resource.create", * "resource.update.any", * "resource.delete.own" * ] */ permissions: ("team.update" | "team.delete" | "team.transfer" | "team.settings.update" | "member.invite" | "member.remove" | "member.role.update" | "project.create" | "project.update" | "project.delete" | "resource.create" | "resource.update.any" | "resource.delete.own" | "resource.delete.any" | "feed.delete.any")[]; /** * @description Number of members in this team. Populated only on list responses; 0 on create and single-team reads. * @example 5 */ member_count?: number; /** * Format: date-time * @example 2025-01-15T10:30:00Z */ created_at: string; /** * Format: date-time * @example 2025-01-20T14:45:00Z */ updated_at: string; }; /** @description Request body for creating a team */ CreateTeamRequest: { /** * @description Team name (required, at most 100 characters) * @example Engineering Team */ name: string; /** * @description Optional team description (at most 500 characters) * @example Team for the core engineering group */ description?: string; }; /** @description Request body for updating a team. At least one of `name` or `description` must be provided. */ UpdateTeamRequest: { /** * @description New team name (must be non-empty when provided) * @example Platform Team */ name?: string; /** * @description New team description * @example Renamed from Engineering Team */ description?: string; }; /** @description Paginated list of teams the user belongs to */ TeamListResponse: { teams: components["schemas"]["Team"][]; /** @example 3 */ total_count: number; /** @example 1 */ page: number; /** @example 20 */ page_size: number; }; /** @description Detailed information about a team member, including invitation status */ TeamMemberDetail: { /** @example user_01HXYZABC123 */ user_id: string; /** * Format: email * @example member@example.com */ email: string; /** @example Jane Doe */ name: string; /** * @example member * @enum {string} */ role: "owner" | "admin" | "member"; /** * Format: date-time * @description When the member joined the team * @example 2025-02-01T09:00:00Z */ joined_at: string; /** * @description Invitation status for this member (omitted when not applicable) * @example accepted * @enum {string} */ invitation_status?: "pending" | "accepted"; }; /** * @description Request body for changing a team member's role. Only `member` and `admin` are * accepted: a team has exactly one owner, and ownership moves solely through * the transfer-ownership operation. */ UpdateTeamMemberRoleRequest: { /** * @description The role to assign to the member * @example admin * @enum {string} */ role: "member" | "admin"; }; /** @description The team member after the role change */ UpdateTeamMemberRoleResponse: { member: components["schemas"]["TeamMemberDetail"]; }; /** * @description Request body for transferring team ownership. The target must already be a * member of the team; they become the owner and the current owner becomes an * admin, in a single transaction. */ TransferTeamOwnershipRequest: { /** * @description User ID of the member who will become the team owner * @example user_01HXYZABC123 */ new_owner_id: string; }; /** @description The team after ownership has been transferred */ TransferTeamOwnershipResponse: { team: components["schemas"]["Team"]; }; /** @description Paginated list of team members */ TeamMembersListResponse: { members: components["schemas"]["TeamMemberDetail"][]; /** @example 5 */ total_count: number; /** @example 1 */ page: number; /** @example 100 */ page_size: number; }; /** @description Request body for sending team invitations (1–50 email addresses per request) */ SendInvitationsRequest: { /** * @example [ * "invitee1@example.com", * "invitee2@example.com" * ] */ emails: string[]; /** * @description Role granted to invitees when they accept * @example member * @enum {string} */ role: "member" | "admin"; }; /** @description Response after successfully accepting a team invitation */ AcceptInvitationResponse: { /** * Format: uuid * @example 550e8400-e29b-41d4-a716-446655440000 */ team_id: string; /** @example Engineering Team */ team_name: string; /** @example Successfully joined team Engineering Team */ message: string; }; /** * @description RFC 9457 problem details returned when team deletion is blocked (HTTP 409). * Codes are UPPERCASE and all `metadata` values are strings: * - `TEAM_HAS_MEMBERS` — metadata: `member_count` (stringified integer) */ TeamDeleteConflictError: { /** * @description URI reference that identifies the problem type * @example https://api.example.com/errors/TEAM_HAS_MEMBERS */ type: string; /** * @description Short, human-readable summary of the problem type * @example Team Has Members * @enum {string} */ title: "Team Has Members"; /** @example 409 */ status: number; /** * @description Human-readable explanation specific to this occurrence * @example cannot delete team with active members. Remove all 3 members first */ detail: string; /** * @example TEAM_HAS_MEMBERS * @enum {string} */ code: "TEAM_HAS_MEMBERS"; /** @example abc123-def456 */ request_id: string; /** * Format: date-time * @example 2026-06-09T10:15:30Z */ timestamp: string; /** * @description URI reference that identifies the specific occurrence * @example /api/v1/teams/550e8400-e29b-41d4-a716-446655440000 */ instance?: string; /** * @description Code-specific string-valued metadata (see schema description for per-code keys) * @example { * "member_count": "3" * } */ metadata?: { [key: string]: string; }; }; InvitationDuplicateMembersError: { /** @example about:blank */ type?: string; /** @example Conflict */ title: string; /** @example 409 */ status: number; /** @example Some invitees are already members of this team */ detail?: string; /** @example DUPLICATE_MEMBERS */ code: string; /** * @description The submitted emails that already belong to team members * @example [ * "dev@example.com" * ] */ duplicate_emails?: string[]; }; TeamStatsResponse: { /** * @description Total number of projects belonging to this team * @example 4 */ total_projects: number; /** * @description Total number of prompts belonging to this team * @example 25 */ total_prompts: number; /** * @description Total number of artifacts belonging to this team * @example 13 */ total_artifacts: number; /** * @description Total number of blueprints belonging to this team * @example 6 */ total_blueprints: number; /** * @description Total number of memories belonging to this team * @example 40 */ total_memories: number; /** * @description Total number of feed items belonging to this team * @example 52 */ total_feed_items: number; }; TeamResourceCreationMetricsResponse: { /** @example success */ status: string; /** @example Team resource creation metrics retrieved successfully */ message: string; data: components["schemas"]["TeamResourceCreationMetricsData"]; }; TeamFeedCreationMetricsResponse: { /** @example success */ status: string; /** @example Team feed creation metrics retrieved successfully */ message: string; data: components["schemas"]["TeamFeedCreationMetricsData"]; }; TeamTopAccessedResourcesResponse: { /** @example success */ status: string; /** @example Team top accessed resources retrieved successfully */ message: string; data: components["schemas"]["TeamTopAccessedResourcesData"]; }; /** @description List of the current user's pending team invitations (page/page_size are fixed at 1/20; all pending invitations are returned) */ PendingInvitationsListResponse: { invitations: components["schemas"]["InvitationResponse"][]; /** @example 2 */ total_count: number; /** @example 1 */ page: number; /** @example 20 */ page_size: number; }; /** @description An in-app notification delivered to a user */ Notification: { /** * Format: uuid * @description Unique notification identifier * @example 550e8400-e29b-41d4-a716-446655440000 */ id: string; /** * @description Team context the notification relates to (omitted when not team-scoped) * @example 660e8400-e29b-41d4-a716-446655440001 */ team_id?: string; /** * @description Semantic notification type * @example feed.item.created */ type: string; /** * @description Urgency/priority classification * @example low * @enum {string} */ category: "high" | "low"; /** * @description Short notification headline * @example New feed item in Engineering Feed */ title: string; /** * @description Optional longer plain-text description (omitted when empty) * @example A new AI-generated item was posted to your feed. */ body?: string; /** * @description Optional deep-link URL for the notification action (omitted when empty) * @example https://app.example.com/teams/660e8400/feeds/abc123 */ action_url?: string; /** * @description Optional structured metadata about the related entity (omitted when empty) * @example { * "entity_type": "feed_item", * "entity_id": "770e8400-e29b-41d4-a716-446655440002" * } */ entity_ref?: { [key: string]: unknown; }; /** * Format: date-time * @description Timestamp when the notification was read (omitted while unread) * @example 2026-06-09T10:15:30Z */ read_at?: string; /** * Format: date-time * @description Timestamp when the notification was dismissed (omitted when not dismissed) * @example 2026-06-09T10:20:00Z */ dismissed_at?: string; /** * Format: date-time * @description Timestamp when the notification was created * @example 2026-06-09T09:00:00Z */ created_at: string; }; /** @description Paginated list of notifications for the authenticated user */ NotificationListResponse: { /** @description Notifications in this page, newest first */ notifications: components["schemas"]["Notification"][]; /** * @description Number of items in this page (≤ limit), NOT the global total * @example 20 */ count: number; /** * @description Page size used for this request * @example 20 */ limit: number; /** * @description Offset used for this request * @example 0 */ offset: number; }; /** @description Unread notification count for the authenticated user */ UnreadCountResponse: { /** * @description Total number of unread notifications * @example 3 */ unread_count: number; }; /** @description A resource category. System defaults are global and read-only (is_system true, no team_id); custom types belong to a team. Uniqueness is on (team_id, resource_type, slug). */ Type: { /** * Format: uuid * @description Unique type identifier * @example 550e8400-e29b-41d4-a716-446655440000 */ id: string; /** * Format: uuid * @description Owning team; omitted for global system defaults * @example 660e8400-e29b-41d4-a716-446655440001 */ team_id?: string; /** * @description Resource the type applies to (e.g. "artifacts") * @example artifacts */ resource_type: string; /** * @description URL-safe identifier, unique per (team, resource_type) * @example bug-report */ slug: string; /** * @description Human-readable display name * @example Bug report */ name: string; /** * @description True for built-in defaults that cannot be edited or deleted * @example false */ is_system: boolean; /** * Format: date-time * @description Timestamp when the type was created * @example 2026-06-15T09:00:00Z */ created_at: string; }; /** @description Request body for creating a team-owned custom type */ CreateTypeRequest: { /** * @description Resource the type applies to (currently only "artifacts") * @example artifacts */ resource_type: string; /** * @description URL-safe identifier (lowercase letters, numbers, hyphens) * @example bug-report */ slug: string; /** * @description Human-readable display name * @example Bug report */ name: string; }; /** @description System defaults plus the team's custom types for a resource */ TypeListResponse: { /** @description Types visible to the team, system defaults first */ types: components["schemas"]["Type"][]; /** * @description Number of types in the list * @example 4 */ total_count: number; }; /** @description Request body for copying another team's custom types into this one. The destination is the `{team_id}` path parameter; only the source is carried here. */ CopyTypesRequest: { /** * Format: uuid * @description Team to copy the custom types from. The caller must belong to it, and it must differ from the destination team. * @example 770e8400-e29b-41d4-a716-446655440002 */ source_team_id: string; }; /** @description A source type that was not copied because the destination already has a type with the same slug for that resource. A skip is a normal outcome, never an error. */ SkippedType: { /** * @description Resource the skipped type applies to * @example artifacts */ resource_type: string; /** * @description Slug that already exists in the destination team * @example bug-report */ slug: string; }; /** @description Outcome of copying a team's custom types. The copy is a merge: types whose slug is free in the destination are added, the rest are reported as skipped. System defaults are never part of the source set — every team already has them. */ CopyTypesResponse: { /** @description Types created in the destination team */ added: components["schemas"]["Type"][]; /** @description Source types left untouched because their slug is already taken */ skipped: components["schemas"]["SkippedType"][]; /** * @description Number of types created in the destination team * @example 3 */ added_count: number; /** * @description Number of source types skipped * @example 1 */ skipped_count: number; }; /** @description A team-visible comment on a resource. */ Comment: { /** * Format: uuid * @description Unique comment identifier * @example 550e8400-e29b-41d4-a716-446655440000 */ id: string; /** * Format: uuid * @description Owning team * @example 660e8400-e29b-41d4-a716-446655440001 */ team_id: string; /** * @description Type of the commented resource (artifact, memory, prompt, or blueprint) * @example artifact */ resource_type: string; /** * Format: uuid * @description Identifier of the commented resource * @example 770e8400-e29b-41d4-a716-446655440002 */ resource_id: string; /** * Format: uuid * @description Author of the comment * @example 880e8400-e29b-41d4-a716-446655440003 */ user_id: string; /** * @description Comment body (markdown, 1–10,000 characters) * @example These figures are from the v3 API, not v4. */ content: string; /** * Format: date-time * @description When the comment was created * @example 2026-07-16T09:00:00Z */ created_at: string; /** * Format: date-time * @description When the comment was last edited (equals created_at if never edited) * @example 2026-07-16T09:00:00Z */ updated_at: string; }; /** @description Request body for creating a comment on a resource. */ CreateCommentRequest: { /** * @description Type of the resource being commented on (artifact, memory, prompt, or blueprint) * @example artifact */ resource_type: string; /** * Format: uuid * @description Identifier of the resource being commented on * @example 770e8400-e29b-41d4-a716-446655440002 */ resource_id: string; /** * @description Comment body (markdown, 1–10,000 characters) * @example These figures are from the v3 API, not v4. */ content: string; }; /** @description Request body for editing a comment's content. */ UpdateCommentRequest: { /** * @description New comment body (markdown, 1–10,000 characters) * @example These figures are from the v3 API, not v4 (corrected). */ content: string; }; /** @description A page of a resource's comments, newest first. */ CommentListResponse: { /** @description Comments on the resource, newest first */ comments: components["schemas"]["Comment"][]; /** * @description Total number of comments on the resource * @example 7 */ total_count: number; /** * @description Current page number * @example 1 */ page: number; /** * @description Number of items per page * @example 20 */ per_page: number; /** * @description Total number of pages * @example 1 */ total_pages: number; }; /** @description A recent comment for the homepage activity card: the comment's latest state plus its resource's resolved title and link fields. No comment body snippet. project_id is present for every resource type; slug is present for artifact/blueprint/prompt and absent for memory. */ RecentComment: { /** * Format: uuid * @description Author of the comment * @example 880e8400-e29b-41d4-a716-446655440003 */ user_id: string; /** * Format: date-time * @description When the comment was created * @example 2026-07-16T09:00:00Z */ created_at: string; /** * Format: date-time * @description When the comment was last edited (updated_at > created_at means edited) * @example 2026-07-16T10:00:00Z */ updated_at: string; /** * @description Type of the commented resource * @example artifact */ resource_type: string; /** * Format: uuid * @description Identifier of the commented resource * @example 770e8400-e29b-41d4-a716-446655440002 */ resource_id: string; /** * @description Resolved display title of the resource * @example Q3 revenue analysis */ resource_title: string; /** * Format: uuid * @description Project the resource belongs to (for building the detail link) * @example 990e8400-e29b-41d4-a716-446655440004 */ project_id?: string; /** * @description Resource slug for the detail link (absent for memories) * @example q3-revenue-analysis */ slug?: string; }; /** @description The team's most recent comment activity, latest-activity first. */ RecentCommentListResponse: { /** @description Recent comments across the team, most-recently-active first */ comments: components["schemas"]["RecentComment"][]; /** * @description Number of entries in the list * @example 10 */ total_count: number; }; /** @description A directed, typed edge between two resources within a project. */ Relation: { /** * Format: uuid * @description Unique relation identifier * @example 550e8400-e29b-41d4-a716-446655440000 */ id: string; /** * Format: uuid * @description Owning team * @example 660e8400-e29b-41d4-a716-446655440001 */ team_id: string; /** * Format: uuid * @description Project both endpoints belong to * @example 990e8400-e29b-41d4-a716-446655440004 */ project_id: string; /** * @description Subject resource type (artifact, memory, prompt, or blueprint) * @example artifact */ from_type: string; /** * Format: uuid * @description Subject resource identifier * @example 770e8400-e29b-41d4-a716-446655440002 */ from_id: string; /** * @description Object resource type (artifact, memory, prompt, or blueprint) * @example blueprint */ to_type: string; /** * Format: uuid * @description Object resource identifier * @example 880e8400-e29b-41d4-a716-446655440003 */ to_id: string; /** * @description The edge's intent * @example governed-by * @enum {string} */ relation_type: "governed-by" | "supersedes" | "built-from" | "explained-by"; /** * @description Whether a human or the AI proposed the edge * @example human * @enum {string} */ origin: "ai" | "human"; /** * @description Tiered-trust lifecycle state * @example confirmed * @enum {string} */ status: "suggested" | "confirmed"; /** * Format: uuid * @description User who created the edge (absent if that user was deleted) * @example aa0e8400-e29b-41d4-a716-446655440005 */ created_by?: string; /** * Format: uuid * @description User who confirmed the edge (absent while suggested or if that user was deleted) * @example bb0e8400-e29b-41d4-a716-446655440006 */ confirmed_by?: string; /** * Format: date-time * @description When the edge was created * @example 2026-07-21T09:00:00Z */ created_at: string; /** * Format: date-time * @description When the edge was last updated (e.g. confirmed) * @example 2026-07-21T09:00:00Z */ updated_at: string; }; /** @description Request body for creating a typed relation between two resources. */ CreateRelationRequest: { /** * @description Subject resource type (artifact, memory, prompt, or blueprint) * @example artifact * @enum {string} */ from_type: "artifact" | "memory" | "prompt" | "blueprint"; /** * Format: uuid * @description Subject resource identifier * @example 770e8400-e29b-41d4-a716-446655440002 */ from_id: string; /** * @description Object resource type (artifact, memory, prompt, or blueprint) * @example blueprint * @enum {string} */ to_type: "artifact" | "memory" | "prompt" | "blueprint"; /** * Format: uuid * @description Object resource identifier * @example 880e8400-e29b-41d4-a716-446655440003 */ to_id: string; /** * @description The edge's intent. The object type is constrained per relation type: governed-by -> blueprint, built-from -> prompt, explained-by -> memory, supersedes -> same type as the subject. * @example governed-by * @enum {string} */ relation_type: "governed-by" | "supersedes" | "built-from" | "explained-by"; /** * @description Whether a human or the AI proposed the edge * @example human * @enum {string} */ origin: "ai" | "human"; }; /** @description One endpoint of a relation as seen from the other endpoint, enriched with the related resource's resolved title and link fields. project_id is present for every type; slug is present for artifact/blueprint/prompt and absent for memory. */ RelatedResource: { /** * Format: uuid * @description The relation this entry came from * @example 550e8400-e29b-41d4-a716-446655440000 */ relation_id: string; /** * @description The edge's intent * @example governed-by * @enum {string} */ relation_type: "governed-by" | "supersedes" | "built-from" | "explained-by"; /** * @description Whether the queried resource is the subject (outgoing) or object (incoming) of the edge * @example outgoing * @enum {string} */ direction: "outgoing" | "incoming"; /** * @description Whether a human or the AI proposed the edge * @example human * @enum {string} */ origin: "ai" | "human"; /** * @description Tiered-trust lifecycle state * @example confirmed * @enum {string} */ status: "suggested" | "confirmed"; /** * @description Type of the related (other) resource * @example blueprint */ resource_type: string; /** * Format: uuid * @description Identifier of the related (other) resource * @example 880e8400-e29b-41d4-a716-446655440003 */ resource_id: string; /** * @description Resolved display title of the related resource * @example Go coding standards */ title: string; /** * Format: uuid * @description Project the related resource belongs to * @example 990e8400-e29b-41d4-a716-446655440004 */ project_id?: string; /** * @description Related resource slug for the detail link (absent for memories) * @example go-coding-standards */ slug?: string; /** * Format: date-time * @description When the edge was created * @example 2026-07-21T09:00:00Z */ created_at: string; }; /** @description An embedding-similarity neighbor of a resource, COMPUTED live at read time from vector similarity — never a stored edge, and kept strictly distinct from the typed `related` edges. Score is 1 - cosine_distance (higher is closer). */ SimilarResource: { /** * Format: uuid * @description Identifier of the similar resource * @example 880e8400-e29b-41d4-a716-446655440003 */ id: string; /** * @description Type of the similar resource (artifact, memory, prompt, or blueprint) * @example memory */ type: string; /** * @description Resolved display title of the similar resource * @example Why we chose pgvector */ title: string; /** * Format: double * @description Similarity score, 1 - cosine_distance (higher is closer) * @example 0.82 */ score: number; }; /** @description A page of the relations touching a resource (both directions), newest first. */ RelationListResponse: { /** @description Relations touching the resource, newest first */ relations: components["schemas"]["RelatedResource"][]; /** * @description Total number of relations touching the resource * @example 3 */ total_count: number; /** * @description Current page number * @example 1 */ page: number; /** * @description Number of items per page * @example 20 */ per_page: number; /** * @description Total number of pages * @example 1 */ total_pages: number; }; MetadataKeysResponse: { /** * @description Distinct metadata keys present on the caller's rows of the requested resource type, in ascending order. * @example [ * "env", * "owner", * "spec.type" * ] */ keys: string[]; /** * @description True when more distinct keys exist than the requested limit returned. * @example false */ truncated: boolean; }; MetadataValuesResponse: { /** * @description Distinct values stored under the requested key, in ascending order. Values held in an array are flattened, and non-string scalars are rendered in their text form. Keys whose value is a JSON object are skipped, since they have no meaningful value list. * @example [ * "prod", * "staging" * ] */ values: string[]; /** * @description True when more distinct values exist than the requested limit returned. * @example false */ truncated: boolean; }; /** @description One team's rule for when a resource becomes stale. */ FreshnessRule: { /** * Format: uuid * @description Rule identifier. */ id: string; /** * Format: uuid * @description Team the rule belongs to. */ team_id: string; /** * Format: uuid * @description Scopes the rule to a single project. `null` means the rule applies to EVERY project in the team. */ project_id: string | null; /** @description Resource types the rule applies to. Never empty. */ resource_types: components["schemas"]["FreshnessRuleResourceType"][]; /** @description Access mediums that count as "accessed" for this rule. An EMPTY array means ANY medium counts — it does not mean "no medium". */ mediums: components["schemas"]["FreshnessRuleMedium"][]; /** * Format: int32 * @description Days without a qualifying access after which the resource is stale. Capped at 36500 (100 years), mirroring the search-settings half-life cap: past that the rule can never fire, and the bound keeps the value inside the int32 the column and the wire format use. */ threshold_days: number; /** @description Whether evaluation runs apply this rule. */ enabled: boolean; /** Format: date-time */ created_at: string; /** Format: date-time */ updated_at: string; }; /** * @description A resource type a freshness rule can cover. * @enum {string} */ FreshnessRuleResourceType: "artifact" | "prompt" | "blueprint" | "memory"; /** * @description An access medium that counts as "accessed" for a freshness rule. Note this is narrower than the set of mediums recorded on the access path — `api` accesses are stored but are deliberately not selectable as rule criteria. * @enum {string} */ FreshnessRuleMedium: "web" | "cli" | "mcp"; /** @description The team's freshness rules, oldest first. */ FreshnessRuleListResponse: { /** @description Freshness rules. Serializes as `[]` when the team has none, never `null`. */ rules: components["schemas"]["FreshnessRule"][]; }; /** @description Create a freshness rule. */ CreateFreshnessRuleRequest: { /** * Format: uuid * @description Scope to one project; omit or send `null` for every project in the team. */ project_id?: string | null; resource_types: components["schemas"]["FreshnessRuleResourceType"][]; /** @description Omit or send an empty array to match any medium. */ mediums?: components["schemas"]["FreshnessRuleMedium"][]; /** Format: int32 */ threshold_days: number; /** * @description Defaults to true when omitted. * @default true */ enabled: boolean; }; /** @description Replace a freshness rule in full. */ UpdateFreshnessRuleRequest: { /** * Format: uuid * @description Scope to one project; `null` means every project in the team. */ project_id: string | null; resource_types: components["schemas"]["FreshnessRuleResourceType"][]; /** @description An empty array matches any medium. */ mediums: components["schemas"]["FreshnessRuleMedium"][]; /** Format: int32 */ threshold_days: number; enabled: boolean; }; /** @description The tunable freshness-evaluation values, shared by the current settings and the defaults. */ FreshnessSettingsValues: { /** * Format: int32 * @description How often the team's rules are evaluated. Storage enforces a one-hour floor, matching the scheduler's own floor; the 31536000 (365-day) ceiling keeps the value inside the int32 the column and the wire format use, and an interval longer than a year is indistinguishable from off. */ interval_seconds: number; /** @description Whether accessing or editing a stale resource clears its stale state. */ reversibility_enabled: boolean; }; /** @description The freshness settings in effect for a team, with their provenance. A team that has never overridden them reports `source: instance` and the defaults. */ TeamFreshnessSettings: { /** * @description `team` when the team stores its own settings, `instance` when it inherits the defaults. * @enum {string} */ source: "instance" | "team"; /** Format: int32 */ interval_seconds: number; reversibility_enabled: boolean; /** @description The values a DELETE would restore. Present on every read so clients can preview a reset without a second call. */ defaults: components["schemas"]["FreshnessSettingsValues"]; }; /** @description Override the team's freshness settings. */ UpdateTeamFreshnessSettingsRequest: { /** * Format: int32 * @description Rejected below 3600 (one hour) or above 31536000 (365 days). */ interval_seconds: number; reversibility_enabled: boolean; }; /** * @description The reporting window for a time-series metric. The options mirror the other analytics endpoints so one range selector drives every chart. * @example 30d * @enum {string} */ FreshnessMetricsRange: "7d" | "14d" | "30d" | "60d" | "90d" | "180d"; /** @description One calendar day (UTC) of freshness activity, zero-filled: every day in the window is present even when nothing happened. */ FreshnessDailyStaleCount: { /** * Format: date * @example 2026-05-01 */ date: string; /** * Format: int32 * @description Resources that became stale on this day. */ marked: number; /** * Format: int32 * @description Resources that stopped being stale on this day, for any reason. */ cleared: number; /** * Format: int32 * @description How many resources were stale at the END of this day — the level, not the flow. It is reconstructed by walking today's live count backwards through the recorded transitions, so it is exact only for the period the audit log covers; days before freshness evaluation first ran on this team read as the earliest known level rather than as zero. The most recent day reports the live count as of the request. The reconstruction is clamped at zero, so on a team whose rows were removed by a project or team deletion — which writes no audit entry — the series can flatten at 0 instead of satisfying stale_total[i] = stale_total[i-1] + marked[i] - cleared[i]. */ stale_total: number; /** * Format: int32 * @description The day's total ACTIVITY, marked + cleared — the sum of the two series, not the level. It is the field the shared time-series chart reads for its per-day total, which is why it is a flow rather than stale_total. */ total: number; }; FreshnessOverTimeMetricsData: { range: components["schemas"]["FreshnessMetricsRange"]; /** * Format: int32 * @description Resources marked stale across the whole window. */ total_marked: number; /** * Format: int32 * @description Resources cleared across the whole window. */ total_cleared: number; /** @description One entry per day in the window, oldest first. Serializes as `[]`, never `null`. */ counts: components["schemas"]["FreshnessDailyStaleCount"][]; }; FreshnessOverTimeMetricsResponse: { /** @example success */ status: string; /** @example Freshness over-time metrics retrieved successfully */ message: string; data: components["schemas"]["FreshnessOverTimeMetricsData"]; }; /** @description How many of one resource type are stale right now. */ FreshnessTypeCount: { resource_type: components["schemas"]["FreshnessRuleResourceType"]; /** Format: int32 */ count: number; }; FreshnessByTypeMetricsData: { /** * Format: int32 * @description Total stale resources in the team, across every type. */ total_stale: number; /** @description One entry per resource type, always all four, in a stable order — a type with nothing stale reports 0 rather than being omitted, so the chart's bars never move. Serializes as `[]`, never `null`. */ counts: components["schemas"]["FreshnessTypeCount"][]; }; FreshnessByTypeMetricsResponse: { /** @example success */ status: string; /** @example Freshness by-type metrics retrieved successfully */ message: string; data: components["schemas"]["FreshnessByTypeMetricsData"]; }; /** @description How many resources are stale right now in one project. `name` and `slug` are carried so the client can label and deep-link the bar without a second request. */ FreshnessProjectCount: { /** Format: uuid */ project_id: string; name: string; slug: string; /** Format: int32 */ count: number; }; FreshnessByProjectMetricsData: { /** Format: int32 */ total_stale: number; /** @description One entry per project in the team, including projects with nothing stale (0), ordered by count descending then name. Serializes as `[]`, never `null`. */ counts: components["schemas"]["FreshnessProjectCount"][]; }; FreshnessByProjectMetricsResponse: { /** @example success */ status: string; /** @example Freshness by-project metrics retrieved successfully */ message: string; data: components["schemas"]["FreshnessByProjectMetricsData"]; }; /** @description How many resources one rule currently marks. Rules have no name, so the defining fields travel with the count for the client to label the bar. */ FreshnessRuleImpact: { /** Format: uuid */ rule_id: string; /** * Format: uuid * @description The project the rule is scoped to, or null for every project in the team. */ project_id: string | null; resource_types: components["schemas"]["FreshnessRuleResourceType"][]; /** Format: int32 */ threshold_days: number; /** @description A disabled rule reports 0 — it is listed so its absence from the chart is not mistaken for deletion. */ enabled: boolean; /** Format: int32 */ count: number; }; FreshnessByRuleMetricsData: { /** * Format: int32 * @description Distinct stale resources in the team. It is NOT the sum of the per-rule counts: a resource matched by two rules is counted once here and once under each rule, because staleness is a union across rules. */ total_stale: number; /** @description One entry per rule the team has defined, including rules matching nothing, ordered by count descending then rule id. Serializes as `[]`, never `null`. */ counts: components["schemas"]["FreshnessRuleImpact"][]; }; FreshnessByRuleMetricsResponse: { /** @example success */ status: string; /** @example Freshness by-rule metrics retrieved successfully */ message: string; data: components["schemas"]["FreshnessByRuleMetricsData"]; }; /** @description One recorded freshness transition. The log is append-only. */ FreshnessAuditEntry: { /** Format: uuid */ id: string; resource_type: components["schemas"]["FreshnessRuleResourceType"]; /** Format: uuid */ resource_id: string; /** * Format: uuid * @description The rule that caused the change, when exactly one did. Null for a reversal (caused by a read or an edit) and for a mark attributable to several rules at once — the resource's own state carries the full set. */ rule_id: string | null; /** * @description Whether the resource became stale or stopped being stale. * @enum {string} */ action: "marked" | "cleared"; /** * @description What caused it — a scheduled evaluation, a read, or an edit. * @enum {string} */ reason: "rule_run" | "accessed" | "edited"; /** @description The resource's current slug, resolved at read time so a client can deep-link the row. Null when the resource no longer exists, and always null for memories, which are deep-linked by id and have no slug column. Deliberately not stored on the log: slugs are mutable, so a stored copy would rot on the next rename and produce a confident link that 404s. */ slug?: string | null; /** * Format: uuid * @description The project the resource currently belongs to, resolved at read time. Null when the resource no longer exists. Required alongside the slug to deep-link artifacts and blueprints. */ project_id?: string | null; /** Format: date-time */ created_at: string; }; /** @description A page of the team's freshness audit log, newest first. */ FreshnessAuditListResponse: { /** @description Serializes as `[]` when the page is empty, never `null`. */ entries: components["schemas"]["FreshnessAuditEntry"][]; /** * @description Total entries in the team's log, ignoring pagination. * @example 142 */ total_count: number; /** * @description Current page number (1-based) * @example 1 */ page: number; /** * @description Number of entries per page * @example 20 */ per_page: number; /** * @description Total number of pages * @example 8 */ total_pages: number; }; /** @description The resource's staleness state. Present only when the resource is stale; absent means fresh. */ ResourceFreshnessState: { /** * @description Today the only state a resource can be in while it has freshness state at all. It is modelled as an enum rather than a boolean so a future state can be added without changing the field's type. * @enum {string} */ status: "stale"; /** * Format: date-time * @description When the resource was FIRST marked stale. It is preserved across re-evaluations that keep it stale, so it is the age a client can show. */ since: string; /** @description Every rule that currently marks this resource — staleness is a union across rules, so this answers "why is this stale". Serializes as `[]`, never `null`. */ matched_rule_ids: string[]; /** * @description What produced the current state. * @enum {string} */ reason: "rule_run" | "accessed" | "edited"; }; /** @description The search ranking settings in effect for a team, with enough context for a client to render the whole settings surface from this one response: the effective values, where they came from, the instance defaults to preview a reset against, and the instance-owned candidate cap. */ TeamSearchSettings: { /** * @description Where the effective values come from. `instance` means the team has no override and inherits the deployment defaults; `team` means the team has stored its own profile. * @example instance * @enum {string} */ source: "instance" | "team"; /** @description Effective value — the team's when source is `team`, otherwise the instance default. */ recency_ranking_enabled: boolean; /** * Format: double * @description Effective value — the team's when source is `team`, otherwise the instance default. */ rank_weight_relevance: number; /** * Format: double * @description Effective value — the team's when source is `team`, otherwise the instance default. */ rank_weight_created: number; /** * Format: double * @description Effective value — the team's when source is `team`, otherwise the instance default. */ rank_weight_updated: number; /** * Format: double * @description Effective value — the team's when source is `team`, otherwise the instance default. */ rank_half_life_days: number; /** @description The deployment-wide defaults from config.yaml, so a client can preview what "reset to defaults" would produce without a second request. Equal to the effective values when source is `instance`. */ instance_defaults: components["schemas"]["TeamSearchSettingsValues"]; /** * @description How many top-by-relevance rows are pulled and re-ranked in memory per query. Instance-owned and NOT team-configurable — one team must not be able to raise the whole deployment's per-query cost. Exposed so clients can explain why pagination is clamped to this many results when recency ranking is on. * Deliberately NOT marked `readOnly`: the update request uses a separate schema that has no such field, which is what actually makes the cap unsettable. Marking it readOnly additionally makes oapi-codegen emit it as an optional pointer, which would let a required field serialize as absent. * @example 200 */ rank_candidate_cap: number; }; /** @description A complete search ranking profile. The three weights are normalized by their sum at ranking time, so they need not pre-sum to 1. */ TeamSearchSettingsValues: { /** * @description When false, results keep relevance-only ordering. When true they are re-ranked by a weighted blend of relevance and freshness. * @example true */ recency_ranking_enabled: boolean; /** * Format: double * @description Weight of semantic relevance. Expected to be the dominant weight. * @example 0.5 */ rank_weight_relevance: number; /** * Format: double * @description Weight of how recently the resource was created. * @example 0.3 */ rank_weight_created: number; /** * Format: double * @description Weight of how recently the resource was updated. * @example 0.2 */ rank_weight_updated: number; /** * Format: double * @description Half-life in days for the exponential freshness decay applied to both created_at and updated_at. An item exactly one half-life old scores 0.5. * @example 90 */ rank_half_life_days: number; }; /** @description A complete replacement ranking profile for the team. There is no partial update: every field is required, and the whole profile is stored or replaced atomically. `rank_candidate_cap` is deliberately absent — it is instance-owned. */ UpdateTeamSearchSettingsRequest: { /** @example true */ recency_ranking_enabled: boolean; /** * Format: double * @example 0.5 */ rank_weight_relevance: number; /** * Format: double * @example 0.3 */ rank_weight_created: number; /** * Format: double * @example 0.2 */ rank_weight_updated: number; /** * Format: double * @example 90 */ rank_half_life_days: number; }; /** * @description Which settings surface was copied between teams. * @example model_provider * @enum {string} */ TeamSettingsAuditSurface: "embedding_provider" | "model_provider" | "custom_types"; /** @description One recorded settings copy into this team: which surface arrived, who brought it, and where it came from. */ TeamSettingsAuditEntry: { /** * Format: uuid * @description Identifier of the audit entry. */ id: string; surface: components["schemas"]["TeamSettingsAuditSurface"]; /** * Format: uuid * @description Who performed the copy. `null` once that account is deleted — the entry outlives the actor on purpose, so that deletion cannot erase the record of what the account did. */ actor_user_id: string | null; /** * @description The actor's display name (their email when the name is blank), resolved server-side so a client need not fan out per row. `null` when `actor_user_id` is null or no longer resolves to a user. * @example Ada Lovelace */ actor_name: string | null; /** * Format: uuid * @description The team the configuration was copied FROM. */ source_team_id: string | null; /** * @description The source team's name, resolved server-side. `null` when that team has since been deleted — the id above is then the only remaining handle on it, and is deliberately still present rather than blanked. * @example Platform Team */ source_team_name: string | null; /** * Format: uuid * @description The resource that was copied. `null` for a `custom_types` copy, where one action copies a whole set and the individual ids live in `detail`. */ source_resource_id: string | null; /** * Format: uuid * @description The resource created in this team. `null` for a `custom_types` copy, for the same reason as `source_resource_id`. */ created_resource_id: string | null; /** * @description Surface-specific facts snapshotted at write time — resource names, and for a provider copy whether it carried a credential and whether it became the team's active provider. Always an object, never null. * @example { * "source_name": "OpenAI (Platform)", * "created_name": "OpenAI (Platform)", * "has_api_key": true * } */ detail: { [key: string]: unknown; }; /** * Format: date-time * @description When the copy was recorded. */ created_at: string; }; /** @description A page of the team's settings audit log, newest first. */ TeamSettingsAuditListResponse: { /** @description Serializes as `[]` when the page is empty, never `null`. */ entries: components["schemas"]["TeamSettingsAuditEntry"][]; /** * @description Total entries in the team's log, ignoring pagination. * @example 42 */ total_count: number; /** * @description Current page number (1-based) * @example 1 */ page: number; /** * @description Number of entries per page * @example 20 */ per_page: number; /** * @description Total number of pages * @example 3 */ total_pages: number; }; /** @description Instance-wide totals for the top-level entities (unscoped counts). */ AdminInstanceCounts: { /** * Format: int64 * @description Total number of user accounts. * @example 42 */ users: number; /** * Format: int64 * @description Total number of teams. * @example 12 */ teams: number; /** * Format: int64 * @description Total number of prompts. * @example 340 */ prompts: number; /** * Format: int64 * @description Total number of artifacts. * @example 128 */ artifacts: number; /** * Format: int64 * @description Total number of memories. * @example 512 */ memories: number; }; /** @description Instance statistics returned by GET /api/v1/admin/stats. */ AdminStatsResponse: { counts: components["schemas"]["AdminInstanceCounts"]; /** * @description The running backend application version (config server.service_version; "dev" when unset). * @example 1.2.3 */ version: string; }; /** @description One user in the instance-wide admin user listing. */ AdminUserListItem: { /** * Format: uuid * @example user_123 */ id: string; /** * Format: email * @example user@example.com */ email: string; /** @example John Doe */ name: string; /** * @description Identity provider name (e.g. "google", "oidc"); null for accounts without one. * @example oidc */ idp_provider?: string | null; /** * @description Account lifecycle. A suspended account is rejected at every * authentication entry point — existing sessions, API keys and MCP/OAuth * tokens stop working immediately, not at expiry. Instance-local: it does * not disable the account at the upstream identity provider. * @example active * @enum {string} */ status: "active" | "suspended"; /** Format: date-time */ created_at: string; /** * Format: int64 * @description Number of teams the user belongs to. * @example 3 */ team_count: number; }; /** @description A page of the instance-wide user listing, newest first. */ AdminUserListResponse: { /** @description Users on this page, newest first. */ users: components["schemas"]["AdminUserListItem"][]; /** * @description Total number of users across the instance. * @example 128 */ total_count: number; /** * @description Current page number. * @example 1 */ page: number; /** * @description Number of items per page. * @example 20 */ per_page: number; /** * @description Total number of pages. * @example 7 */ total_pages: number; }; /** @description A team the user belongs to, with the user's role in that team. */ AdminTeamMembership: { /** * Format: uuid * @example team_abc123 */ team_id: string; /** @example Acme Engineering */ team_name: string; /** * @description The user's role in the team (owner, admin, or member). * @example member */ role: string; }; /** @description A single user with their team memberships (GET /api/v1/admin/users/{id}). */ AdminUserDetail: { /** * Format: uuid * @example user_123 */ id: string; /** * Format: email * @example user@example.com */ email: string; /** @example John Doe */ name: string; /** * @description Identity provider name (e.g. "google", "oidc"); null for accounts without one. * @example oidc */ idp_provider?: string | null; /** * @description Account lifecycle. A suspended account is rejected at every * authentication entry point — existing sessions, API keys and MCP/OAuth * tokens stop working immediately, not at expiry. Instance-local: it does * not disable the account at the upstream identity provider. * @example active * @enum {string} */ status: "active" | "suspended"; /** Format: date-time */ created_at: string; /** @description Teams the user belongs to. */ memberships: components["schemas"]["AdminTeamMembership"][]; }; /** * @description A user shown as the responsible party for a resource: the owner of a team, or * the creator of a project (#453). The shape is id/email/name in both cases; * which relationship it represents is stated on the referencing property. */ AdminTeamOwner: { /** * Format: uuid * @example user_123 */ id: string; /** * Format: email * @example owner@example.com */ email: string; /** @example Jane Owner */ name: string; }; /** @description One team in the instance-wide admin team listing. */ AdminTeamListItem: { /** * Format: uuid * @example team_abc123 */ id: string; /** @example Acme Engineering */ name: string; /** * @description URL-safe team identifier. * @example acme-engineering */ slug: string; /** * @description True for a user's default personal workspace, false for a shared team workspace. * @example false */ is_personal: boolean; owner: components["schemas"]["AdminTeamOwner"]; /** * Format: int64 * @description Number of members in the team. * @example 8 */ member_count: number; /** Format: date-time */ created_at: string; }; /** @description A page of the instance-wide team listing, newest first. */ AdminTeamListResponse: { /** @description Teams on this page, newest first. */ teams: components["schemas"]["AdminTeamListItem"][]; /** * @description Total number of teams across the instance. * @example 12 */ total_count: number; /** @example 1 */ page: number; /** @example 20 */ per_page: number; /** @example 1 */ total_pages: number; }; /** @description One member of a team, with the member's role and join time. */ AdminTeamMember: { /** * Format: uuid * @example user_123 */ user_id: string; /** * Format: email * @example member@example.com */ email: string; /** @example John Member */ name: string; /** * @description The member's role in the team (owner, admin, or member). * @example member */ role: string; /** Format: date-time */ joined_at: string; }; /** @description A single team with its owner and member list (GET /api/v1/admin/teams/{id}). */ AdminTeamDetail: { /** * Format: uuid * @example team_abc123 */ id: string; /** @example Acme Engineering */ name: string; /** * @description URL-safe team identifier. * @example acme-engineering */ slug: string; /** * @description True for a user's default personal workspace, false for a shared team workspace. * @example false */ is_personal: boolean; owner: components["schemas"]["AdminTeamOwner"]; /** Format: date-time */ created_at: string; /** @description The team's members. */ members: components["schemas"]["AdminTeamMember"][]; }; /** * @description Instance-wide totals for every top-level entity. A superset of * AdminInstanceCounts, which stays as-is for the legacy stats endpoint. */ AdminExtendedCounts: { /** * Format: int64 * @example 42 */ users: number; /** * Format: int64 * @example 12 */ teams: number; /** * Format: int64 * @example 30 */ projects: number; /** * Format: int64 * @example 340 */ prompts: number; /** * Format: int64 * @example 128 */ artifacts: number; /** * Format: int64 * @example 512 */ memories: number; /** * Format: int64 * @example 64 */ blueprints: number; /** * Format: int64 * @example 9 */ agents: number; /** * Format: int64 * @example 4 */ feeds: number; /** * Format: int64 * @example 17 */ api_keys: number; }; /** @description One value of a grouped column plus how many rows carry it. */ AdminBreakdownBucket: { /** * @description The column value. NULL values are reported as an empty string. * @example active */ value: string; /** * Format: int64 * @example 120 */ count: number; }; /** @description A GROUP BY over one status/type column of one entity table. */ AdminEntityBreakdown: { /** * @description The entity table the breakdown covers. * @example prompts */ entity: string; /** * @description The grouped column. * @example status */ field: string; /** @description One entry per distinct value, most frequent first. */ buckets: components["schemas"]["AdminBreakdownBucket"][]; }; /** @description Approximate row count for one table. */ AdminTableStat: { /** @example prompts */ table: string; /** * Format: int64 * @description ESTIMATE from pg_stat_user_tables.n_live_tup, not an exact COUNT(*) — * an exact per-table count does not scale and this figure is only meant * for relative sizing. Freshness depends on autovacuum/ANALYZE. * @example 34012 */ estimated_rows: number; }; /** @description Instance storage health. */ AdminSystemHealth: { /** * Format: int64 * @description pg_database_size(current_database()). * @example 184549376 */ database_size_bytes: number; /** @description Per-table estimated row counts, largest first. */ tables: components["schemas"]["AdminTableStat"][]; }; /** @description Totals, breakdowns and system health (GET /api/v1/admin/dashboard/overview). */ AdminDashboardOverview: { counts: components["schemas"]["AdminExtendedCounts"]; /** @description One entry per entity/column pair that has a status or type column. */ breakdowns: components["schemas"]["AdminEntityBreakdown"][]; system_health: components["schemas"]["AdminSystemHealth"]; /** * @description The running backend application version ("dev" when unset). * @example 1.2.3 */ version: string; }; /** @description New rows created per entity within one time bucket. */ AdminGrowthPoint: { /** * Format: date-time * @description Start of the bucket, in UTC. */ bucket: string; /** Format: int64 */ users: number; /** Format: int64 */ teams: number; /** Format: int64 */ projects: number; /** Format: int64 */ prompts: number; /** Format: int64 */ artifacts: number; /** Format: int64 */ memories: number; }; /** @description A single count within one time bucket. */ AdminCountPoint: { /** * Format: date-time * @description Start of the bucket, in UTC. */ bucket: string; /** Format: int64 */ count: number; }; /** @description A count for one access source within one time bucket. */ AdminSourcePoint: { /** * Format: date-time * @description Start of the bucket, in UTC. */ bucket: string; /** * @description Access source (e.g. "web", "cli", "mcp"). * @example mcp */ source: string; /** Format: int64 */ count: number; }; /** * @description Earliest instant for which event data still exists. Both source tables are * TTL-pruned (config retention.activity_days / retention.access_event_days), * so a chart asking for a range older than these values will legitimately show * zeros rather than missing data. */ AdminDataWindow: { /** * Format: date-time * @description now() - retention.activity_days. */ sign_ins_earliest_retained_at: string; /** * Format: date-time * @description now() - retention.access_event_days. */ access_by_source_earliest_retained_at: string; }; /** * @description Bucketed metrics over a time range (GET /api/v1/admin/dashboard/timeseries). * Every bucket in the requested range is present in every series with an * explicit 0 — the series are gap-filled, never sparse. */ AdminTimeseriesResponse: { /** * Format: date-time * @description Inclusive start of the range actually used. This is snapped DOWN to the * start of its bucket, so it may precede the requested `from` (asking for * 2026-07-15 at month granularity reports and queries 2026-07-01). Buckets * are therefore always whole, never partial at the head. */ from: string; /** * Format: date-time * @description Exclusive end of the range actually used (after defaulting). This is NOT * snapped, so the final bucket may cover only part of its period. */ to: string; /** * @description Bucket size actually used. * @enum {string} */ granularity: "day" | "week" | "month"; /** @description New entities per bucket, ascending by bucket. */ growth: components["schemas"]["AdminGrowthPoint"][]; /** @description Successful sign-ins per bucket (activities.auth_login), ascending. */ sign_ins: components["schemas"]["AdminCountPoint"][]; /** * @description Resource accesses per bucket per source, ascending by bucket then source. * Only sources actually observed in the range appear; a source with no * events in a bucket is gap-filled to 0 for the sources that do appear. */ access_by_source: components["schemas"]["AdminSourcePoint"][]; data_window: components["schemas"]["AdminDataWindow"]; }; /** * @description Fields an instance admin may change on a user. Deliberately minimal: email * and the identity-provider fields (idp_provider, idp_subject) are owned by the * upstream IdP and are not editable here — sending them is a 400 rather than a * silent no-op. */ AdminUserUpdateRequest: { /** * @description The user's display name. * @example Jane Doe */ name: string; }; /** * @description One reason a user cannot be deleted: a shared team they own that still has * other members. Ownership must be transferred before the account can be * removed. */ AdminDeleteBlocker: { /** Format: uuid */ team_id: string; /** @example Acme Engineering */ team_name: string; /** * Format: int64 * @description How many members the team has, including the owner. * @example 4 */ member_count: number; }; /** * @description Returned with 409 when a hard delete is refused. NOTHING was deleted: the * user and every listed team still exist. */ AdminUserDeleteBlockedResponse: { /** * @description Human-readable summary of why the delete was refused. * @example This user owns shared teams with other members. Transfer ownership before deleting. */ message: string; /** @description Every shared team blocking the delete. */ blockers: components["schemas"]["AdminDeleteBlocker"][]; }; /** * @description A user to create directly, without waiting for them to complete an * identity-provider sign-in. No password is set: VibeXP has no password * provider, and the account's owner still signs in through the configured IdP. */ AdminUserCreateRequest: { /** * Format: email * @description Must be unique across the instance; a duplicate is a 409. * @example new.user@example.com */ email: string; /** @example New User */ name: string; /** * @description Optional label recording which identity provider this account is expected * to sign in with (e.g. "google", "oidc"). Informational only — it does not * pre-link an IdP identity, which is established on first sign-in. * @example oidc */ idp_provider?: string; }; /** @description The team a project belongs to. */ AdminProjectTeam: { /** Format: uuid */ id: string; /** @example Acme Engineering */ name: string; /** @example acme-engineering */ slug: string; }; /** @description One project in the instance-wide admin project listing. */ AdminProjectListItem: { /** Format: uuid */ id: string; /** @example Platform */ name: string; /** @example platform */ slug: string; team: components["schemas"]["AdminProjectTeam"]; /** * @description The project's creator (projects.user_id). This is NOT necessarily the * owning team's owner — a project carries both a team and a creating user, * and the two can differ. */ owner: components["schemas"]["AdminTeamOwner"]; /** Format: date-time */ created_at: string; /** Format: date-time */ updated_at: string; }; /** @description A page of the instance-wide project listing. */ AdminProjectListResponse: { /** @description Projects on this page. */ projects: components["schemas"]["AdminProjectListItem"][]; /** * @description Total number of projects matching the filters. * @example 30 */ total_count: number; /** @example 1 */ page: number; /** @example 20 */ per_page: number; /** @example 2 */ total_pages: number; }; /** * @description How many of each PROJECT-SCOPED resource type the project contains. * * Only these four types belong to a project. Agents and feeds are deliberately * absent: neither table has a project_id column (both are team-scoped), so * reporting zero for them would read as "this project has no agents" rather * than "agents do not belong to projects". */ AdminProjectResourceCounts: { /** * Format: int64 * @example 12 */ prompts: number; /** * Format: int64 * @example 4 */ artifacts: number; /** * Format: int64 * @example 27 */ memories: number; /** * Format: int64 * @example 3 */ blueprints: number; }; /** @description A single project with its team, owner and resource counts (GET /api/v1/admin/projects/{id}). */ AdminProjectDetail: { /** Format: uuid */ id: string; /** @example Platform */ name: string; /** @example platform */ slug: string; /** * @description Empty string when unset (the column defaults to ''). * @example Core platform work */ description: string; /** * @description Empty string when unset. * @example https://github.com/acme/platform */ git_url: string; /** * @description Empty string when unset. * @example https://platform.acme.dev */ homepage: string; team: components["schemas"]["AdminProjectTeam"]; /** @description The project's creator (projects.user_id); see AdminProjectListItem.owner. */ owner: components["schemas"]["AdminTeamOwner"]; resource_counts: components["schemas"]["AdminProjectResourceCounts"]; /** Format: date-time */ created_at: string; /** Format: date-time */ updated_at: string; }; ProjectResponse: components["schemas"]["Project"] & { /** * @description Whether the project's git URL matches a repository accessible via the team's GitHub App installation * @example true */ github_connected: boolean; }; ResourceSelection: { /** * @description Migrate every resource of this type in the source project * @example false */ all?: boolean; /** @description Explicit list of resource IDs to migrate (used when all is false) */ ids?: string[]; }; ResourceSelections: { prompts?: components["schemas"]["ResourceSelection"]; artifacts?: components["schemas"]["ResourceSelection"]; blueprints?: components["schemas"]["ResourceSelection"]; feed_items?: components["schemas"]["ResourceSelection"]; }; MigrationRequest: { /** * Format: uuid * @description ID of the destination project (must belong to the same team) * @example 01234567-89ab-cdef-0123-456789abcdef */ destination_project_id: string; resources?: components["schemas"]["ResourceSelections"]; /** * @description How slug collisions in the destination project are handled * @default skip * @enum {string} */ conflict_policy: "skip" | "rename" | "overwrite"; }; ResourceInventoryItem: { /** @description Resource identifier */ id: string; /** @description Human-readable resource name */ name: string; }; ResourceInventory: { /** * @description Number of resources of this type in the source project * @example 3 */ count: number; /** @description Resources of this type (omitted when empty) */ items?: components["schemas"]["ResourceInventoryItem"][]; }; MigrationInventory: { prompts?: components["schemas"]["ResourceInventory"]; artifacts?: components["schemas"]["ResourceInventory"]; blueprints?: components["schemas"]["ResourceInventory"]; feed_items?: components["schemas"]["ResourceInventory"]; }; ResourceOutcome: { /** @description Resource identifier */ id: string; /** @description Why the resource was skipped or failed */ reason: string; }; ResourceMigrationCounts: { /** @example 2 */ prompts?: number; /** @example 1 */ artifacts?: number; /** @example 0 */ blueprints?: number; /** @example 0 */ feed_items?: number; }; ResourceMigrationOutcomes: { prompts?: components["schemas"]["ResourceOutcome"][]; artifacts?: components["schemas"]["ResourceOutcome"][]; blueprints?: components["schemas"]["ResourceOutcome"][]; feed_items?: components["schemas"]["ResourceOutcome"][]; }; MigrationResult: { migrated: components["schemas"]["ResourceMigrationCounts"]; skipped: components["schemas"]["ResourceMigrationOutcomes"]; failed: components["schemas"]["ResourceMigrationOutcomes"]; /** * @description Name of the source project * @example Project 1 */ source_project_name: string; /** * @description Name of the destination project * @example Project 2 */ destination_project_name: string; }; ActivityEnvelope: { /** @example success */ status: string; /** @example Activity retrieved successfully */ message: string; data: components["schemas"]["Activity"]; }; ActivityListEnvelope: { /** @example success */ status: string; /** @example Activities retrieved successfully */ message: string; data: components["schemas"]["ActivityListResponse"]; }; ActivityStatsEnvelope: { /** @example success */ status: string; /** @example Activity statistics retrieved successfully */ message: string; data: components["schemas"]["ActivityStatsResponse"]; }; ActivityTypesEnvelope: { /** @example success */ status: string; /** @example Activity and entity types retrieved successfully */ message: string; data: components["schemas"]["ActivityTypesResponse"]; }; ActivityEntityTypesEnvelope: { /** @example success */ status: string; /** @example Activity entity types retrieved successfully */ message: string; /** * @example [ * "user", * "api_key", * "prompt", * "session", * "system" * ] */ data: string[]; }; PreferencesResponse: { preferences: components["schemas"]["Preferences"]; /** * Format: date-time * @description When the preferences were last persisted. Zero value (0001-01-01T00:00:00Z) when the user has never saved preferences and defaults are being returned. * @example 2024-01-20T14:45:00Z */ updated_at: string; }; UpdatePreferencesRequest: { email_notification?: components["schemas"]["EmailNotificationPreferences"]; notifications?: components["schemas"]["NotificationPreferences"]; }; FeedItemReply: { /** * Format: uuid * @description Unique identifier for the reply * @example 01234567-89ab-cdef-0123-456789abcdef */ id: string; /** * Format: uuid * @description UUID of the team this reply belongs to * @example 01234567-89ab-cdef-0123-456789abcdef */ team_id: string; /** * Format: uuid * @description UUID of the feed item this reply belongs to * @example 01234567-89ab-cdef-0123-456789abcdef */ feed_item_id: string; /** * @description Content of the reply * @example Great summary — the deploy step needs one correction. */ content: string; /** * @description ID of the user who posted this reply * @example user-123 */ posted_by_user_id: string; /** * @description Name of the AI assistant that posted this reply, null for human replies * @example claude-sonnet-4-5 */ ai_assistant_name?: string | null; /** * Format: date-time * @description Server-set timestamp when the reply was posted * @example 2024-01-15T10:30:00Z */ posted_at: string; }; CreateFeedItemReplyRequest: { /** * @description Content of the reply (leading/trailing whitespace is trimmed) * @example Great summary — the deploy step needs one correction. */ content: string; /** * @description Optional name of the AI assistant posting this reply * @example claude-sonnet-4-5 */ ai_assistant_name?: string; }; FeedItemReplyListResponse: { /** @description List of feed item replies */ replies: components["schemas"]["FeedItemReply"][]; /** * @description Total number of replies for the feed item * @example 7 */ total_count: number; /** * @description Current page number * @example 1 */ page: number; /** * @description Number of items per page * @example 20 */ per_page: number; /** * @description Total number of pages * @example 1 */ total_pages: number; }; /** @description Field-level validation error details */ ValidationError: { /** * @description Name of the field that failed validation * @example name */ field: string; /** * @description Human-readable error message * @example Field 'name' is required */ message: string; /** * @description Validation error code * @example REQUIRED */ code: string; /** * @description The constraint that was violated * @example required */ constraint?: string; }; /** @description Resolved attribution for a version's author. Null when the version has no author (created_by is null) or the user can no longer be resolved. */ VersionAuthor: { /** * Format: uuid * @description User ID of the author * @example 01234567-89ab-cdef-0123-456789abcdef */ id: string; /** * @description Author's display name * @example Ada Lovelace */ display_name: string; /** * @description Author's avatar URL, if any * @example https://example.com/avatar.png */ avatar_url: string | null; /** * @description Up to two uppercase initials derived from the display name * @example AL */ initials: string; } | null; /** @description Per-resource-type creation counts for a single calendar day (UTC), zero-filled. */ ProjectResourceCreationDailyCount: { /** * Format: date * @example 2026-05-01 */ date: string; /** @example 3 */ prompts: number; /** @example 1 */ artifacts: number; /** @example 0 */ blueprints: number; /** @example 2 */ memories: number; /** @example 6 */ total: number; }; ProjectResourceCreationMetricsData: { /** * @description Sum of every creation count across the whole window. * @example 142 */ total_created: number; /** * @example 30d * @enum {string} */ range: "7d" | "14d" | "30d" | "60d" | "90d" | "180d"; counts: components["schemas"]["ProjectResourceCreationDailyCount"][]; }; CredentialRequest: { /** * @description Credential type. Must match a supported security scheme the backend can apply: `apiKey` (header/query/cookie) or `http` (bearer/basic). `oauth2`, `openIdConnect` and `mutualTLS` are rejected at save time. * @example apiKey * @enum {string} */ type: "apiKey" | "http"; /** * Format: password * @description The plain text credential value (will be encrypted on server) * @example sk-1234567890abcdef */ value: string; }; ConversationSummary: { conversation_id: string; agent_id: string; message_count: number; first_message: string; last_message: string; /** Format: date-time */ started_at: string; /** Format: date-time */ last_activity_at: string; last_status: string; }; AgentExecutionEvent: { id: string; execution_id: string; /** * @description Event type (task, status-update, artifact-update) * @example status-update */ event_type: string; event_data: { [key: string]: unknown; }; sequence_number: number; /** Format: date-time */ received_at: string; }; /** @description Per-resource-type creation counts for a single calendar day (UTC), zero-filled. */ TeamResourceCreationDailyCount: { /** * Format: date * @example 2026-05-01 */ date: string; /** @example 3 */ prompts: number; /** @example 1 */ artifacts: number; /** @example 0 */ blueprints: number; /** @example 2 */ memories: number; /** @example 1 */ projects: number; /** @example 7 */ total: number; }; TeamResourceCreationMetricsData: { /** * @description Sum of every creation count across the whole window. * @example 142 */ total_created: number; /** * @example 30d * @enum {string} */ range: "7d" | "14d" | "30d" | "60d" | "90d" | "180d"; counts: components["schemas"]["TeamResourceCreationDailyCount"][]; }; /** @description Per-feed-entity creation counts for a single calendar day (UTC), zero-filled. */ TeamFeedCreationDailyCount: { /** * Format: date * @example 2026-05-01 */ date: string; /** * @description Feeds (channels) created on this day. * @example 0 */ feeds: number; /** * @description Feed items (AI updates posted) created on this day. * @example 3 */ feed_items: number; /** * @description feeds + feed_items for this day. * @example 3 */ total: number; }; TeamFeedCreationMetricsData: { /** * @description Sum of every feed/feed_item creation across the whole window. * @example 42 */ total_created: number; /** * @example 30d * @enum {string} */ range: "7d" | "14d" | "30d" | "60d" | "90d" | "180d"; counts: components["schemas"]["TeamFeedCreationDailyCount"][]; }; /** @description One row of the team's most-accessed resources ranking. */ TopAccessedResourceItem: { /** * @description The accessed resource's type (e.g. prompt, artifact, blueprint, memory, project). * @example prompt */ resource_type: string; /** * Format: uuid * @example b3f1c2d4-5678-49ab-9cde-0123456789ab */ resource_id: string; /** * @description Resolved display name of the resource (prompt/project name, artifact/blueprint title, or truncated memory text). Empty when the resource no longer exists. * @example Onboarding checklist */ name: string; /** * @description Number of access events for the resource within the window. * @example 128 */ access_count: number; }; TeamTopAccessedResourcesData: { /** * @example 30d * @enum {string} */ range: "7d" | "14d" | "30d" | "60d" | "90d" | "180d"; items: components["schemas"]["TopAccessedResourceItem"][]; }; EmailNotificationPreferences: { /** * @description Receive platform announcement emails * @example true */ platform_announcement: boolean; /** * @description Receive account security emails * @example true */ account_security: boolean; /** * @description Receive new feature emails * @example true */ new_feature: boolean; /** * @description Receive marketing and promotional emails * @example false */ marketing_promotional: boolean; }; NotificationChannelPreferences: { /** * @description Enable in-app notifications globally * @example true */ in_app: boolean; /** * @description Enable email notifications globally * @example true */ email: boolean; }; NotificationTypePreference: { /** * @description Deliver this notification type in-app * @example true */ in_app: boolean; /** * @description Email delivery mode for this notification type * @example digest * @enum {string} */ email: "instant" | "digest" | "none"; }; NotificationPreferences: { channels: components["schemas"]["NotificationChannelPreferences"]; /** @description Per-type delivery preferences keyed by notification type (e.g. "feed.item.created", "feed.reply.created") */ types: { [key: string]: components["schemas"]["NotificationTypePreference"]; }; }; Preferences: { email_notification: components["schemas"]["EmailNotificationPreferences"]; notifications: components["schemas"]["NotificationPreferences"]; }; }; responses: never; parameters: never; requestBodies: never; headers: never; pathItems: never; } export type $defs = Record; export interface operations { ping: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Service is running */ 200: { headers: { [name: string]: unknown; }; content: { "text/plain": string; }; }; }; }; health: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Service health status */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HealthResponse"]; }; }; }; }; login: { parameters: { query?: { /** * @description Canonical name of the identity provider to use (e.g. `google`, * `github`, `oidc`). Optional when a single provider is enabled; * required when more than one is enabled. */ provider?: string; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Authorization URL generated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["LoginResponse"]; }; }; /** * @description The `provider` value is unknown/disabled, or it was omitted while * multiple providers are enabled. */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description No identity provider is configured (web login unavailable) */ 503: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listAuthProviders: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Enabled providers listed successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ProvidersResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; authCallback: { parameters: { query: { /** @description Authorization code returned by the identity provider after user authentication */ code: string; /** @description CSRF state value that must match the signed `vx_state` cookie */ state?: string; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** * @description Redirects the browser to the frontend. On success, to the home page * (a session cookie is set). When sign-in is denied by the access * allowlist, to `/auth/callback?error=access_restricted` with no session * cookie set. */ 302: { headers: { /** * @description Frontend URL — the home page on success (e.g. https://app.example.com/), * or /auth/callback?error=access_restricted on an allowlist denial. */ Location?: string; /** @description Encrypted session cookie (`vx_session`) containing the identity-provider access token */ "Set-Cookie"?: string; [name: string]: unknown; }; content?: never; }; /** @description Authorization code is missing */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Invalid or expired CSRF state cookie */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Identity provider authentication failed or session could not be created */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; logout: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Logged out successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["LogoutResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; devLogin: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["DevLoginRequest"]; }; }; responses: { /** @description Dev authentication successful — session cookie set, user object returned */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["User"]; }; }; /** @description Invalid request body or missing required fields */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** * @description Sign-in denied by the access allowlist. The response `code` is the * stable string `access_restricted`. */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Endpoint not available outside development environment */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Authentication failed or session could not be created */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getMe: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description User information retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["CurrentUser"]; }; }; /** @description Unauthorized - invalid or missing session cookie */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description User not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listAPIKeys: { parameters: { query?: { /** @description Page number */ page?: number; /** @description Items per page */ limit?: number; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description API keys retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["APIKeyListResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createAPIKey: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateAPIKeyRequest"]; }; }; responses: { /** @description API key created successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["CreateAPIKeyResponse"]; }; }; /** @description Invalid request data */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteAPIKey: { parameters: { query?: never; header?: never; path: { /** @description API key ID */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description API key deleted successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["SuccessResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description API key not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listAPIKeysSettings: { parameters: { query?: { /** @description Page number */ page?: number; /** @description Items per page */ limit?: number; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description API keys retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["APIKeyListResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createAPIKeySettings: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateAPIKeyRequest"]; }; }; responses: { /** @description API key created successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["CreateAPIKeyResponse"]; }; }; /** @description Invalid request data */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteAPIKeySettings: { parameters: { query?: never; header?: never; path: { /** @description API key ID */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description API key deleted successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["SuccessResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description API key not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; submitSupportRequest: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["SupportRequest"]; }; }; responses: { /** @description Support request submitted successfully */ 200: { headers: { [name: string]: unknown; }; content: { /** * @example { * "message": "Thank you for your message! We'll get back to you soon.", * "success": true * } */ "application/json": components["schemas"]["SupportResponse"]; }; }; /** @description Invalid request data or validation error */ 400: { headers: { [name: string]: unknown; }; content: { /** * @example { * "message": "Validation failed: Text is required", * "success": false * } */ "application/json": components["schemas"]["SupportResponse"]; }; }; /** @description Unauthorized - JWT token required */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error - failed to send support request */ 500: { headers: { [name: string]: unknown; }; content: { /** * @example { * "message": "Failed to send support request. Please try again later.", * "success": false * } */ "application/json": components["schemas"]["SupportResponse"]; }; }; }; }; listArtifacts: { parameters: { query?: { /** @description Filter to resources currently flagged stale by the team's freshness rules (epic #726). Omit for no freshness filtering. Returns 400 for any other value — a silently ignored filter would return the full list, which looks like a legitimate answer. */ freshness?: "stale"; /** @description Filter by project ID */ project_id?: string; /** @description Filter by status */ status?: "active" | "draft" | "archived"; /** @description Filter by type. An open string matched against the team's registered types (the system defaults work_reports, static_contexts and general, plus any custom types the team has added), not a fixed enum. */ type?: string; /** @description Search in title, description, and content */ search?: string; /** * @description Filter by metadata as a JSON object of key to array of string values. Keys are combined with AND, values within a key with OR, and an empty array means "the key exists". Values match metadata stored as a scalar or as an array, and numeric/boolean values are matched by their string form. At most 10 keys, 25 values per key, key length 255, value length 512. Example: {"env":["prod","staging"],"team":["core"]} * @example {"env":["prod","staging"]} */ metadata?: string; /** @description Sort field */ sort_by?: "created_at" | "updated_at" | "title"; /** @description Sort order */ sort_order?: "asc" | "desc"; /** @description Page number */ page?: number; /** @description Items per page */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Artifacts retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ArtifactListResponse"]; }; }; /** @description Invalid query parameter (for example a malformed `metadata` filter) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createArtifact: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateArtifactRequest"]; }; }; responses: { /** @description Artifact created successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Artifact"]; }; }; /** @description Invalid request data or validation error */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — insufficient team permissions */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Artifact with same slug already exists in project */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getArtifactStats: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Artifact statistics retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ArtifactStatsResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listArtifactsByProject: { parameters: { query?: { /** @description Filter to resources currently flagged stale by the team's freshness rules (epic #726). Omit for no freshness filtering. Returns 400 for any other value — a silently ignored filter would return the full list, which looks like a legitimate answer. */ freshness?: "stale"; /** @description Filter by status */ status?: "active" | "draft" | "archived"; /** @description Filter by type. An open string matched against the team's registered types (the system defaults work_reports, static_contexts and general, plus any custom types the team has added), not a fixed enum. */ type?: string; /** @description Search in title, description, and content */ search?: string; /** * @description Filter by metadata as a JSON object of key to array of string values. Keys are combined with AND, values within a key with OR, and an empty array means "the key exists". Values match metadata stored as a scalar or as an array, and numeric/boolean values are matched by their string form. At most 10 keys, 25 values per key, key length 255, value length 512. Example: {"env":["prod","staging"],"team":["core"]} * @example {"env":["prod","staging"]} */ metadata?: string; /** @description Sort field */ sort_by?: "created_at" | "updated_at" | "title"; /** @description Sort order */ sort_order?: "asc" | "desc"; /** @description Page number */ page?: number; /** @description Items per page */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description UUID of the project */ project_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Artifacts retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ArtifactListResponse"]; }; }; /** @description Invalid query parameter (for example a malformed `metadata` filter) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getArtifact: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description UUID of the project */ project_id: string; /** @description Artifact slug */ slug: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Artifact retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Artifact"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Artifact not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateArtifact: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description UUID of the project */ project_id: string; /** @description Artifact slug */ slug: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateArtifactRequest"]; }; }; responses: { /** @description Artifact updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Artifact"]; }; }; /** @description Invalid request data or validation error */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Artifact not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Artifact with same slug already exists in project */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteArtifact: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description UUID of the project */ project_id: string; /** @description Artifact slug */ slug: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Artifact deleted successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Artifact not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listAttachments: { parameters: { query: { /** @description Type of the owning resource (e.g. "artifact") */ owner_type: string; /** @description UUID of the owning resource */ owner_id: string; }; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Attachments retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AttachmentListResponse"]; }; }; /** @description Missing or invalid owner_type / owner_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unsupported owner_type, or the owning resource was not found / is not accessible */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; uploadAttachment: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody: { content: { "multipart/form-data": { /** * @description Type of the owning resource (e.g. "artifact") * @example artifact */ owner_type: string; /** * Format: uuid * @description UUID of the owning resource */ owner_id: string; /** * Format: binary * @description The file to attach */ file: string; /** * @description Optional path relative to the owner's directory (e.g. "scripts/helper.py"). Must be relative — no leading "/", no "..", no backslashes. Unique per owner. file_name stays the basename. * @example scripts/helper.py */ relative_path?: string; }; }; }; responses: { /** @description Attachment uploaded successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Attachment"]; }; }; /** @description Missing fields/file, invalid owner_id, file too large, cumulative limit exceeded, or disallowed type */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unsupported owner_type, or the owning resource was not found / is not accessible */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Attachment storage is not available */ 503: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; downloadAttachment: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Attachment identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Attachment file stream */ 200: { headers: { [name: string]: unknown; }; content: { "application/octet-stream": string; }; }; /** @description Invalid attachment id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Attachment not found, or its owner is not accessible */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Attachment storage is not available */ 503: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteAttachment: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Attachment identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Attachment deleted successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Invalid attachment id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Attachment not found, or its owner is not accessible */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listArtifactAttachments: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description UUID of the project */ project_id: string; /** @description Artifact slug */ slug: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Attachments retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AttachmentListResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Artifact not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; uploadArtifactAttachment: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description UUID of the project */ project_id: string; /** @description Artifact slug */ slug: string; }; cookie?: never; }; requestBody: { content: { "multipart/form-data": { /** * Format: binary * @description The file to attach */ file: string; /** * @description Optional path relative to the owner's directory (e.g. "scripts/helper.py"). Must be relative — no leading "/", no "..", no backslashes. Unique per owner. file_name stays the basename. * @example scripts/helper.py */ relative_path?: string; }; }; }; responses: { /** @description Attachment uploaded successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Attachment"]; }; }; /** @description Missing file, file too large, cumulative limit exceeded, or disallowed type */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Artifact not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Attachment storage is not available */ 503: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; downloadArtifactAttachment: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description UUID of the project */ project_id: string; /** @description Artifact slug */ slug: string; /** @description Attachment identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Attachment file stream */ 200: { headers: { [name: string]: unknown; }; content: { "application/octet-stream": string; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Artifact or attachment not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Attachment storage is not available */ 503: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteArtifactAttachment: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description UUID of the project */ project_id: string; /** @description Artifact slug */ slug: string; /** @description Attachment identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Attachment deleted successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Artifact or attachment not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listArtifactVersions: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description UUID of the project */ project_id: string; /** @description Artifact slug */ slug: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Artifact versions retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ArtifactVersionListResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Artifact not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getArtifactVersion: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description UUID of the project */ project_id: string; /** @description Artifact slug */ slug: string; /** @description Version number */ version_number: number; }; cookie?: never; }; requestBody?: never; responses: { /** @description Artifact version retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ContentVersion"]; }; }; /** @description Invalid version_number */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Artifact or version not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; restoreArtifactVersion: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description UUID of the project */ project_id: string; /** @description Artifact slug */ slug: string; /** @description Version number to restore */ version_number: number; }; cookie?: never; }; requestBody?: never; responses: { /** @description Artifact restored successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Artifact"]; }; }; /** @description Invalid version_number */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Artifact or version not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; searchTeamResources: { parameters: { query?: never; header?: never; path: { /** @description Team ID */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["SearchRequest"]; }; }; responses: { /** @description Search results retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["SearchResultsResponse"]; }; }; /** @description Invalid request data or validation error */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description User is not a member of the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getResourceAccessMetrics: { parameters: { query: { /** @description The resource type to report on (singular form). */ resource_type: "prompt" | "artifact" | "blueprint" | "memory" | "project" | "agent"; /** @description The resource UUID. */ resource_id: string; /** @description The reporting window. Defaults to 30d. */ range?: "7d" | "14d" | "30d" | "60d" | "90d" | "180d"; }; header?: never; path: { /** @description Team ID */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Resource access metrics retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ResourceAccessMetricsResponse"]; }; }; /** @description Invalid request parameters */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description User is not a member of the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to retrieve resource access metrics */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listMemories: { parameters: { query?: { /** @description Filter to resources currently flagged stale by the team's freshness rules (epic #726). Omit for no freshness filtering. Returns 400 for any other value — a silently ignored filter would return the full list, which looks like a legitimate answer. */ freshness?: "stale"; /** @description Filter memories by project ID */ project_id?: string; /** @description Search in memory text */ search?: string; /** * @description Filter by metadata as a JSON object of key to array of string values. Keys are combined with AND, values within a key with OR, and an empty array means "the key exists". Values match metadata stored as a scalar or as an array, and numeric/boolean values are matched by their string form. At most 10 keys, 25 values per key, key length 255, value length 512. Example: {"env":["prod","staging"],"team":["core"]} * @example {"env":["prod","staging"]} */ metadata?: string; /** @description Filter by lifecycle status. When omitted, archived memories are hidden (active and draft are returned); an explicit value returns only that status. Returns 400 for unknown values. */ status?: "active" | "draft" | "archived"; /** @description Field to sort results by. Allowed: text, updated_at, created_at. Returns 400 for unknown values. */ sort_by?: "text" | "updated_at" | "created_at"; /** @description Sort direction (asc or desc, default desc) */ sort_order?: "asc" | "desc"; /** @description Page number */ page?: number; /** @description Items per page */ limit?: number; }; header?: never; path: { /** @description Team ID */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Memories retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["MemoryListResponse"]; }; }; /** @description Invalid query parameter (for example an unknown `status` or `sort_by` value, or a malformed `metadata` filter) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createMemory: { parameters: { query?: never; header?: never; path: { /** @description Team ID */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateMemoryRequest"]; }; }; responses: { /** @description Memory created successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Memory"]; }; }; /** @description Invalid request data or validation error */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getMemory: { parameters: { query?: never; header?: never; path: { /** @description Team ID */ team_id: string; /** @description Memory ID */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Memory retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Memory"]; }; }; /** @description Memory not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateMemory: { parameters: { query?: never; header?: never; path: { /** @description Team ID */ team_id: string; /** @description Memory ID */ id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateMemoryRequest"]; }; }; responses: { /** @description Memory updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Memory"]; }; }; /** @description Invalid request data or validation error */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Memory not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteMemory: { parameters: { query?: never; header?: never; path: { /** @description Team ID */ team_id: string; /** @description Memory ID */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Memory deleted successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Memory not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listMemoryVersions: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Memory ID */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Memory versions retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["MemoryVersionListResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Memory not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getMemoryVersion: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Memory ID */ id: string; /** @description Version number */ version_number: number; }; cookie?: never; }; requestBody?: never; responses: { /** @description Memory version retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ContentVersion"]; }; }; /** @description Invalid version_number */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Memory or version not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; restoreMemoryVersion: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Memory ID */ id: string; /** @description Version number to restore */ version_number: number; }; cookie?: never; }; requestBody?: never; responses: { /** @description Memory restored successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Memory"]; }; }; /** @description Invalid version_number */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Memory or version not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getProjectStats: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Project slug */ slug: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Project statistics retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ProjectStatsResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Project not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getProjectResourceCreationMetrics: { parameters: { query?: { /** @description The reporting window. Defaults to 30d. */ range?: "7d" | "14d" | "30d" | "60d" | "90d" | "180d"; }; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Project slug */ slug: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Resource creation metrics retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ProjectResourceCreationMetricsResponse"]; }; }; /** @description Invalid request parameters */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Project not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listSpecLibraries: { parameters: { query?: { /** @description Filter to resources currently flagged stale by the team's freshness rules (epic #726). Omit for no freshness filtering. Returns 400 for any other value — a silently ignored filter would return the full list, which looks like a legitimate answer. */ freshness?: "stale"; /** @description Filter by project name */ project_name?: string; /** @description Filter by project ID. On this team-scoped variant the backend reads it only when a project is not already selected via a path parameter (i.e. not on listSpecLibrariesByProject). */ project_id?: string; /** @description Filter by status */ status?: "active" | "expired"; /** @description Filter by type */ type?: "general" | "claude-code" | "claude" | "cursor" | "codex"; /** @description Filter by subtype category */ subtype?: "sub-agents" | "skills" | "slash-commands" | "others" | "claude-md" | "agents" | "commands" | "rules" | "cursor-md" | "agents-md"; /** @description Search in title, description, and content */ search?: string; /** * @description Filter by metadata as a JSON object of key to array of string values. Keys are combined with AND, values within a key with OR, and an empty array means "the key exists". Values match metadata stored as a scalar or as an array, and numeric/boolean values are matched by their string form. At most 10 keys, 25 values per key, key length 255, value length 512. Example: {"env":["prod","staging"],"team":["core"]} * @example {"env":["prod","staging"]} */ metadata?: string; /** @description Sort field */ sort_by?: "created_at" | "updated_at" | "title"; /** @description Sort order */ sort_order?: "asc" | "desc"; /** @description Page number */ page?: number; /** @description Items per page */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Spec libraries retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["BlueprintListResponse"]; }; }; /** @description Invalid query parameter (for example a malformed `metadata` filter) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createBlueprint: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateBlueprintRequest"]; }; }; responses: { /** @description Spec library created successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Blueprint"]; }; }; /** @description Invalid request data or validation error */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description No permission to create blueprints in this team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Spec library with same slug already exists in project */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getBlueprintStats: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Spec library statistics retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { /** * @example { * "total_projects": 3, * "total_blueprints": 12, * "added_this_week": 2, * "total_by_type": { * "general": 12 * }, * "total_by_status": { * "active": 10, * "expired": 2 * } * } */ "application/json": components["schemas"]["BlueprintStatsResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listSpecLibrariesByProject: { parameters: { query?: { /** @description Filter to resources currently flagged stale by the team's freshness rules (epic #726). Omit for no freshness filtering. Returns 400 for any other value — a silently ignored filter would return the full list, which looks like a legitimate answer. */ freshness?: "stale"; /** @description Filter by status */ status?: "active" | "expired"; /** @description Filter by type */ type?: "general" | "claude-code" | "claude" | "cursor" | "codex"; /** @description Filter by subtype category */ subtype?: "sub-agents" | "skills" | "slash-commands" | "others" | "claude-md" | "agents" | "commands" | "rules" | "cursor-md" | "agents-md"; /** @description Search in title, description, and content */ search?: string; /** * @description Filter by metadata as a JSON object of key to array of string values. Keys are combined with AND, values within a key with OR, and an empty array means "the key exists". Values match metadata stored as a scalar or as an array, and numeric/boolean values are matched by their string form. At most 10 keys, 25 values per key, key length 255, value length 512. Example: {"env":["prod","staging"],"team":["core"]} * @example {"env":["prod","staging"]} */ metadata?: string; /** @description Sort field */ sort_by?: "created_at" | "updated_at" | "title"; /** @description Sort order */ sort_order?: "asc" | "desc"; /** @description Page number */ page?: number; /** @description Items per page */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Project identifier (URL-encoded) */ project_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Spec libraries retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["BlueprintListResponse"]; }; }; /** @description Invalid project name encoding */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getBlueprint: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Project identifier (URL-encoded) */ project_id: string; /** @description Spec library slug (URL-encoded) */ slug: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Spec library retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["BlueprintDetail"]; }; }; /** @description Invalid parameter encoding */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Spec library not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateBlueprint: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Project identifier (URL-encoded) */ project_id: string; /** @description Spec library slug (URL-encoded) */ slug: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateBlueprintRequest"]; }; }; responses: { /** @description Spec library updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Blueprint"]; }; }; /** @description Invalid request data or validation error */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Resource limit exceeded */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Spec library not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Spec library with same slug already exists in project */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteBlueprint: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Project identifier (URL-encoded) */ project_id: string; /** @description Spec library slug (URL-encoded) */ slug: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Spec library deleted successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Invalid parameter encoding */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Spec library not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listBlueprintVersions: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description UUID of the project */ project_id: string; /** @description Blueprint slug */ slug: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Blueprint versions retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["BlueprintVersionListResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Blueprint not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getBlueprintVersion: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description UUID of the project */ project_id: string; /** @description Blueprint slug */ slug: string; /** @description Version number */ version_number: number; }; cookie?: never; }; requestBody?: never; responses: { /** @description Blueprint version retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ContentVersion"]; }; }; /** @description Invalid version_number */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Blueprint or version not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; restoreBlueprintVersion: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description UUID of the project */ project_id: string; /** @description Blueprint slug */ slug: string; /** @description Version number to restore */ version_number: number; }; cookie?: never; }; requestBody?: never; responses: { /** @description Blueprint restored successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Blueprint"]; }; }; /** @description Invalid version_number */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Blueprint or version not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listPrompts: { parameters: { query?: { /** @description Filter to resources currently flagged stale by the team's freshness rules (epic #726). Omit for no freshness filtering. Returns 400 for any other value — a silently ignored filter would return the full list, which looks like a legitimate answer. */ freshness?: "stale"; /** @description Page number for pagination */ page?: number; /** @description Number of items per page */ limit?: number; /** @description Search term to filter prompts by name or description */ search?: string; /** @description Filter by prompt status */ status?: "draft" | "published"; /** @description Comma-separated list of labels to filter by */ labels?: string; /** @description Filter by project ID */ project_id?: string; /** @description Filter by MCP exposure flag. Non-boolean values are ignored (no filter applied). */ mcp_expose?: boolean; /** @description Filter by share status (prompts with an active share). Non-boolean values are ignored (no filter applied). */ shared?: boolean; /** @description Field to sort results by. Allowed: name, status, updated_at, created_at. Returns 400 for unknown values. */ sort_by?: "name" | "status" | "updated_at" | "created_at"; /** @description Sort direction (asc or desc, default desc) */ sort_order?: "asc" | "desc"; }; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description List of prompts retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PromptListEnvelope"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — insufficient team permissions */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createPrompt: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreatePromptRequest"]; }; }; responses: { /** @description Prompt created successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Prompt"]; }; }; /** @description Invalid request (validation error) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — insufficient team permissions */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Conflict (prompt with slug already exists) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getPromptLabels: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Labels retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PromptLabelsEnvelope"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — insufficient team permissions */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getPrompt: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Prompt slug identifier */ slug: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Prompt retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Prompt"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — insufficient team permissions */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Prompt not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updatePrompt: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Prompt slug identifier */ slug: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdatePromptRequest"]; }; }; responses: { /** @description Prompt updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Prompt"]; }; }; /** @description Invalid request (validation error) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — insufficient team permissions */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Prompt not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Conflict (slug already exists) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deletePrompt: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Prompt slug identifier */ slug: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Prompt deleted successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — insufficient team permissions */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Prompt not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getPromptPlaceholders: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Prompt slug identifier */ slug: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Placeholders retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PromptPlaceholdersResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — insufficient team permissions */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Prompt not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getPromptDependencies: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Prompt slug identifier */ slug: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Dependencies retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PromptDependenciesResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — insufficient team permissions */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Prompt not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; renderPrompt: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Prompt slug identifier */ slug: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["RenderPromptRequest"]; }; }; responses: { /** @description Prompt rendered successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["RenderPromptResponse"]; }; }; /** @description Invalid request */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — insufficient team permissions */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Prompt not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getPromptShare: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Prompt slug identifier */ slug: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Share details retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ShareResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — insufficient team permissions */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Prompt or share not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createPromptShare: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Prompt slug identifier */ slug: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateShareRequest"]; }; }; responses: { /** @description Share created or updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ShareResponse"]; }; }; /** @description Invalid request (e.g., restricted share without emails) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — insufficient team permissions */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Prompt not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deletePromptShare: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Prompt slug identifier */ slug: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Share deleted successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — insufficient team permissions */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Prompt or share not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listPromptVersions: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Prompt slug */ slug: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Prompt versions retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PromptVersionListResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Prompt not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getPromptVersion: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Prompt slug */ slug: string; /** @description Version number */ version_number: number; }; cookie?: never; }; requestBody?: never; responses: { /** @description Prompt version retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ContentVersion"]; }; }; /** @description Invalid version_number */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Prompt or version not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; restorePromptVersion: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Prompt slug */ slug: string; /** @description Version number to restore */ version_number: number; }; cookie?: never; }; requestBody?: never; responses: { /** @description Prompt restored successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Prompt"]; }; }; /** @description Invalid version_number */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Prompt or version not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getPromptGalleryCategories: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Categories retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PromptGalleryCategoryList"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listPromptGalleryPrompts: { parameters: { query?: { /** @description Filter by category */ category?: string; /** @description Search in title and description */ search?: string; /** @description Page number */ page?: number; /** @description Items per page */ limit?: number; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Prompts retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PromptGalleryListResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getPromptGalleryPrompt: { parameters: { query?: never; header?: never; path: { /** @description Prompt ID */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Prompt retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PromptGalleryTemplate"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Prompt not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; trackPromptGalleryUsage: { parameters: { query?: never; header?: never; path: { /** @description Prompt ID */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Usage tracked successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["SuccessResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Prompt not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getSharedPrompt: { parameters: { query?: never; header?: never; path: { /** @description Share token */ token: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Shared prompt retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["SharedPromptResponse"]; }; }; /** @description Authentication required for restricted share */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Access denied (share disabled, expired, or email not in access list) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Shared prompt not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getUsageAndGrowth: { parameters: { query?: { /** @description Filter data from this date (YYYY-MM-DD format). Both 'from' and 'to' must be provided together. */ from?: string; /** @description Filter data until this date (YYYY-MM-DD format). Both 'from' and 'to' must be provided together. */ to?: string; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Usage and growth data retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["UsageAndGrowthResponse"]; }; }; /** @description Invalid request parameters (e.g., invalid date format, 'to' before 'from') */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized - Missing or invalid back office admin API key */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getGitHubStatus: { parameters: { query?: never; header?: never; path: { /** @description Team ID (UUID) */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description GitHub installation status retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GitHubInstallationStatus"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - user does not have access to this team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getGitHubInstallURL: { parameters: { query?: never; header?: never; path: { /** @description Team ID (UUID) */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Install URL generated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GitHubInstallURL"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - user does not have access to this team, or is not a team owner/admin */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Conflict - the team has no GitHub App configured, so there is no App slug to build an install URL from. Register the team's App first. */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; handleGitHubCallback: { parameters: { query?: never; header?: never; path: { /** @description Team ID (UUID) */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": { /** * Format: int64 * @description GitHub App installation ID from the callback URL * @example 12345678 */ installation_id: number; /** * @description Setup action reported by GitHub on the callback URL (e.g. "install"). Accepted for forward compatibility but currently ignored server-side. * @example install */ setup_action?: string; /** * @description HMAC-signed state parameter from the install URL (CSRF protection). It is bound to the team's GitHub App config, so a state minted before the team replaced or rotated its App is no longer redeemable. * @example team-id:app-config-id:0:1234567890:signature */ state: string; /** * @description OAuth authorization code from GitHub's post-install redirect. Exchanged server-side for a user access token to verify the caller has access to the installation on GitHub. * @example abc123def456 */ code: string; }; }; }; responses: { /** @description GitHub App installation connected successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GitHubCallbackResponse"]; }; }; /** @description Invalid request body, missing required fields, an invalid/expired state parameter, or a state bound to a different installation or GitHub App than the team's current one */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - state does not match team, the caller is not a team owner/admin, or the caller has no access to the submitted GitHub App installation on GitHub */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Conflict - this GitHub organization is already connected to another team, or the team has no GitHub App configured to complete the installation against */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description GitHub App user authorization is not configured on this instance, so caller authority cannot be verified and the installation is not connected */ 503: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listGitHubRepositories: { parameters: { query?: { /** @description Page number for pagination (1-based) */ page?: number; }; header?: never; path: { /** @description Team ID (UUID) */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Repositories listed successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GitHubRepositoriesResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - user does not have access to this team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description GitHub App not installed for this team */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; importGitHubProject: { parameters: { query?: never; header?: never; path: { /** @description Team ID (UUID) */ team_id: string; /** @description GitHub repository ID */ repo_id: number; }; cookie?: never; }; requestBody?: never; responses: { /** @description Project already exists — returned without creating a new one */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GitHubImportProjectResultResponse"]; }; }; /** @description Project created successfully from the GitHub repository */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GitHubImportProjectResultResponse"]; }; }; /** @description Invalid repository ID */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - user does not have access to this team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description GitHub App not installed for this team or repository not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; importGitHubBlueprints: { parameters: { query?: never; header?: never; path: { /** @description Team ID (UUID) */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": { /** * Format: int64 * @description GitHub repository ID to import blueprints from * @example 123456789 */ repository_id: number; }; }; }; responses: { /** @description Import completed — check the report for per-file results */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["BlueprintImportReport"]; }; }; /** @description Invalid request body or missing repository_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - user does not have access to this team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description GitHub App not installed for this team or repository not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Precondition Failed - no project exists for this repository; import the repository as a project first */ 412: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; disconnectGitHub: { parameters: { query?: never; header?: never; path: { /** @description Team ID (UUID) */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description GitHub installation disconnected successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - user does not have access to this team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; handleGitHubWebhook: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody: { content: { "application/json": { [key: string]: unknown; }; }; }; responses: { /** @description Endpoint retired; use the team's per-App webhook URL */ 410: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; handleGitHubWebhookByToken: { parameters: { query?: never; header?: never; path: { /** @description Opaque routing token identifying which team's GitHub App this delivery belongs to. Minted as unpadded URL-safe base64, so it needs no percent-encoding. Treat it as a secret: it selects the secret the signature is verified against, and it is redacted from access logs. */ token: string; }; cookie?: never; }; requestBody: { content: { "application/json": { [key: string]: unknown; }; }; }; responses: { /** @description Delivery accepted (or already processed — dedup by delivery id) */ 200: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Unreadable body, unparseable payload, or missing installation reference */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Missing or invalid `X-Hub-Signature-256` */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unknown or malformed routing token (deliberately indistinguishable) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listFeeds: { parameters: { query?: { /** @description Search in feed name and description */ search?: string; /** @description Page number (default 1) */ page?: number; /** @description Items per page (default 20, max 100) */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Feeds retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FeedListResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createFeed: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateFeedRequest"]; }; }; responses: { /** @description Feed created successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Feed"]; }; }; /** @description Invalid request data or validation error */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description A feed with that name already exists in this team */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getFeed: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Feed identifier */ feed_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Feed retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Feed"]; }; }; /** @description Invalid feed_id format */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Feed not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateFeed: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Feed identifier */ feed_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateFeedRequest"]; }; }; responses: { /** @description Feed updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Feed"]; }; }; /** @description Invalid request data or validation error */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Feed not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description A feed with that name already exists in this team */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteFeed: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Feed identifier */ feed_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Feed deleted successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Invalid feed_id format */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Feed not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listFeedItemsByFeed: { parameters: { query?: { /** @description Filter by project ID */ project_id?: string; /** @description Filter by AI assistant name */ ai_assistant_name?: string; /** @description Search in feed item title and content (case-insensitive substring) */ search?: string; /** @description Filter by archived status: 'true' (archived only), 'false' (active only, default), 'all' */ archived?: "true" | "false" | "all"; /** @description Page number (default 1) */ page?: number; /** @description Items per page (default 20, max 100) */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Feed identifier */ feed_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Feed items retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FeedItemListResponse"]; }; }; /** @description Invalid feed_id format */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createFeedItem: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Feed identifier */ feed_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateFeedItemRequest"]; }; }; responses: { /** @description Feed item created successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FeedItem"]; }; }; /** @description Invalid request data or validation error */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member or project belongs to a different team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listFeedItems: { parameters: { query?: { /** @description Filter by feed ID */ feed_id?: string; /** @description Filter by project ID */ project_id?: string; /** @description Filter by AI assistant name */ ai_assistant_name?: string; /** @description Search in feed item title and content (case-insensitive substring) */ search?: string; /** @description Filter by archived status: 'true' (archived only), 'false' (active only, default), 'all' */ archived?: "true" | "false" | "all"; /** @description Page number (default 1) */ page?: number; /** @description Items per page (default 20, max 100) */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Feed items retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FeedItemListResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getFeedItem: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Feed item identifier */ item_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Feed item retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FeedItem"]; }; }; /** @description Invalid item_id format, or team_id is not a valid UUID */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Feed item not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteFeedItem: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Feed item identifier */ item_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Feed item deleted successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Invalid item_id format */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — caller is not a team member, or is not the item's poster, owner, or admin */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Feed item not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; archiveFeedItem: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Feed item identifier */ item_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Feed item archived successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Invalid item_id format */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Feed item not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; unarchiveFeedItem: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Feed item identifier */ item_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Feed item unarchived successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Invalid item_id format */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Feed item not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getInvitationByToken: { parameters: { query?: never; header?: never; path: { /** @description Opaque invitation token from the invitation email link */ token: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Invitation details retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["InvitationDetailsResponse"]; }; }; /** @description Authentication required */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Invitation not found for the given token */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Invitation has already been accepted, rejected, or revoked */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Invitation has expired */ 410: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listAgents: { parameters: { query?: { /** @description Filter by agent status */ status?: "active" | "paused" | "error"; /** @description Search in agent name and description */ search?: string; /** @description Sort field */ sort_by?: "name" | "status" | "updated_at" | "created_at" | "last_run" | "success_rate"; /** @description Sort order */ sort_order?: "asc" | "desc"; /** @description Page number */ page?: number; /** @description Items per page */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Agents retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AgentListResponse"]; }; }; /** @description Invalid sort_by value or invalid team_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createAgent: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateAgentRequest"]; }; }; responses: { /** @description Agent created successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Agent"]; }; }; /** @description Invalid request body, validation error, or invalid/unfetchable agent card (4xx from the card host) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — insufficient team permissions */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description An agent with that name already exists for this user */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Agent card host unreachable or returned a server error */ 502: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; previewAgentCard: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["PreviewAgentCardRequest"]; }; }; responses: { /** @description Agent card fetched successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AgentCard"]; }; }; /** @description Invalid request body, missing card_url, or invalid/unfetchable agent card (4xx from the card host) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Agent card host unreachable or returned a server error */ 502: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getAgentStats: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Agent statistics retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AgentStatsResponse"]; }; }; /** @description Invalid team_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getAgent: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Agent identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Agent retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Agent"]; }; }; /** @description Invalid team_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Agent not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateAgent: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Agent identifier */ id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateAgentRequest"]; }; }; responses: { /** @description Agent updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Agent"]; }; }; /** @description Invalid request body, validation error */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Agent not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description An agent with that name already exists for this user */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteAgent: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Agent identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Agent deleted successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Invalid team_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Agent not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateAgentCredentials: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Agent identifier */ id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateAgentCredentialsRequest"]; }; }; responses: { /** @description Credentials updated successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Invalid request body or validation error */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Agent not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; executeAgent: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Agent identifier */ id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["ExecuteAgentRequest"]; }; }; responses: { /** @description Execution created (streaming agents) or completed (non-streaming agents) */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AgentExecution"]; }; }; /** @description Invalid request body or agent is not active */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Agent not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listAgentExecutions: { parameters: { query?: { /** @description Filter by execution status */ status?: string; /** @description Filter executions started on or after this date */ date_from?: string; /** @description Filter executions started on or before this date */ date_to?: string; /** @description Page number */ page?: number; /** @description Items per page */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Agent identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Executions retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AgentExecutionListResponse"]; }; }; /** @description Invalid team_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; startAgentExecution: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Agent identifier */ id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateAgentExecutionRequest"]; }; }; responses: { /** @description Execution started successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AgentExecution"]; }; }; /** @description Invalid request body */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Agent not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listAgentConversations: { parameters: { query?: { /** @description Page number */ page?: number; /** @description Items per page */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Agent identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Conversations retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ConversationListResponse"]; }; }; /** @description Invalid team_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Agent not found in the specified team */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getAgentExecution: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Execution identifier */ execution_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Execution retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AgentExecution"]; }; }; /** @description Invalid team_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Execution not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; completeAgentExecution: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Execution identifier */ execution_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateAgentExecutionRequest"]; }; }; responses: { /** @description Execution updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AgentExecution"]; }; }; /** @description Invalid request body or status not one of running, success, error */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Execution not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; cancelAgentExecution: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Execution identifier */ execution_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Execution cancelled successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AgentExecution"]; }; }; /** @description Invalid team_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Execution not found, or its agent does not belong to the specified team */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Execution is already terminal or its task cannot be cancelled */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getAgentExecutionStatus: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Execution identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Execution status retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AgentExecution"]; }; }; /** @description Invalid team_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Execution not found, or its agent does not belong to the specified team */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getAgentExecutionEvents: { parameters: { query?: { /** @description Return events with a sequence number greater than this value (enables cursor-based polling) */ since?: number; /** @description Page number (page-based mode only) */ page?: number; /** @description Items per page (page-based mode only) */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Execution identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Events retrieved successfully (shape depends on whether `since` was provided) */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AgentExecutionEventsResponse"]; }; }; /** @description Invalid team_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Execution not found, or its agent does not belong to the specified team */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listConversationExecutions: { parameters: { query?: { /** @description Maximum number of executions to return */ limit?: number; /** @description Return executions started before this RFC 3339 timestamp */ before?: string; }; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Conversation identifier */ conversation_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Conversation executions retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ConversationExecutionsResponse"]; }; }; /** @description Invalid team_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Conversation's agent does not belong to the specified team */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listTeams: { parameters: { query?: { /** @description Page number (1-based; defaults to 1) */ page?: number; /** @description Items per page (defaults to 20, maximum 100) */ page_size?: number; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Teams retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TeamListResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createTeam: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateTeamRequest"]; }; }; responses: { /** @description Team created successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Team"]; }; }; /** @description Invalid request body or validation error (name required, name ≤ 100 chars, description ≤ 500 chars) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getTeam: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Team retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Team"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Team not found (or the user has no access to it) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateTeam: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateTeamRequest"]; }; }; responses: { /** @description Team updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Team"]; }; }; /** @description Invalid request body or validation error (no fields provided, empty name, name ≤ 100 chars, description ≤ 500 chars) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — only team owners can update a team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Team not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteTeam: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Team deleted successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not the team owner, personal workspace (code `CANNOT_DELETE_PERSONAL_WORKSPACE`), or default team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Team not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Deletion blocked — the team still has members (code `TEAM_HAS_MEMBERS`) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["TeamDeleteConflictError"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getTeamMembers: { parameters: { query?: { /** @description Page number (1-based; defaults to 1) */ page?: number; /** @description Items per page (defaults to 100, maximum 100) */ page_size?: number; }; header?: never; path: { /** @description Team identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Team members retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TeamMembersListResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Team not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; removeTeamMember: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ id: string; /** @description User ID of the member to remove */ userId: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Member removed successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — only team owners can remove members, or attempted to remove the team owner */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Team or member not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateTeamMemberRole: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ id: string; /** @description User ID of the member whose role is changing */ userId: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateTeamMemberRoleRequest"]; }; }; responses: { /** @description Role updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["UpdateTeamMemberRoleResponse"]; }; }; /** @description Invalid request body or role value */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — caller is not an owner or admin of the team, or the target is the team owner */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Team not found, or the target user is not a member of the team */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; transferTeamOwnership: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["TransferTeamOwnershipRequest"]; }; }; responses: { /** @description Ownership transferred successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TransferTeamOwnershipResponse"]; }; }; /** @description Invalid request body, or the caller is already the target owner */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — caller is not the team owner, or the team is a personal workspace */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Team not found, or the target user is not a member of the team */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listTeamInvitations: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Invitations retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["InvitationResponseList"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — no permission to view this team's invitations */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; sendTeamInvitations: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["SendInvitationsRequest"]; }; }; responses: { /** @description Invitations created successfully (the `token`, `team_name` and `invited_by` fields are not populated on this response) */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["InvitationResponseList"]; }; }; /** @description Invalid request body, validation error, more than 50 emails, or invalid role */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — personal workspace (code `upgrade_required`) or no permission to invite (code `FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Team not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Some invitees are already team members (code `DUPLICATE_MEMBERS`, includes `duplicate_emails` array) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["InvitationDuplicateMembersError"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; revokeTeamInvitation: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ id: string; /** @description Invitation identifier */ invitationId: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Invitation revoked successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — no permission to revoke invitations */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Invitation not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getTeamStats: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Team statistics retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TeamStatsResponse"]; }; }; /** @description Invalid team id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getTeamResourceCreationMetrics: { parameters: { query?: { /** @description The reporting window. Defaults to 30d. */ range?: "7d" | "14d" | "30d" | "60d" | "90d" | "180d"; }; header?: never; path: { /** @description Team identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Team resource creation metrics retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TeamResourceCreationMetricsResponse"]; }; }; /** @description Invalid request parameters */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getTeamResourceAccessMetrics: { parameters: { query?: { /** @description The reporting window. Defaults to 30d. */ range?: "7d" | "14d" | "30d" | "60d" | "90d" | "180d"; }; header?: never; path: { /** @description Team identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Team resource access metrics retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ResourceAccessMetricsResponse"]; }; }; /** @description Invalid request parameters */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getTeamFeedCreationMetrics: { parameters: { query?: { /** @description The reporting window. Defaults to 30d. */ range?: "7d" | "14d" | "30d" | "60d" | "90d" | "180d"; }; header?: never; path: { /** @description Team identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Team feed creation metrics retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TeamFeedCreationMetricsResponse"]; }; }; /** @description Invalid request parameters */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getTeamTopAccessedResources: { parameters: { query?: { /** @description The reporting window. Defaults to 30d. */ range?: "7d" | "14d" | "30d" | "60d" | "90d" | "180d"; /** @description Maximum number of resources to return (1–50). Defaults to 5. */ limit?: number; /** @description Restrict the ranking to a single access channel. Omitted or 'all' aggregates across all channels (the default behavior). */ source?: "all" | "web" | "cli" | "mcp" | "api"; }; header?: never; path: { /** @description Team identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Team top accessed resources retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TeamTopAccessedResourcesResponse"]; }; }; /** @description Invalid request parameters */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getPendingInvitations: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Pending invitations retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PendingInvitationsListResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; acceptInvitation: { parameters: { query?: never; header?: never; path: { /** @description Opaque invitation token from the invitation email link */ token: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Invitation accepted successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AcceptInvitationResponse"]; }; }; /** @description Invitation is not pending */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Invitation was sent to a different email address */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Invalid invitation token */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Already a member of this team */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Invitation has expired */ 410: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error (including invitation accepted but team details could not be fetched) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; rejectInvitation: { parameters: { query?: never; header?: never; path: { /** @description Opaque invitation token from the invitation email link */ token: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Invitation rejected successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Invitation is not pending */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Not authorized to reject this invitation */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Invalid invitation token */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listNotifications: { parameters: { query?: { /** @description Maximum number of notifications to return (1-100) */ limit?: number; /** @description Number of notifications to skip */ offset?: number; /** @description When true, return only unread notifications */ unread?: boolean; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Notifications retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["NotificationListResponse"]; }; }; /** @description Invalid query parameter (limit not in 1-100, negative offset, or non-boolean unread) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to list notifications */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getUnreadNotificationCount: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Unread count retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["UnreadCountResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to get unread notification count */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; markNotificationRead: { parameters: { query?: never; header?: never; path: { /** @description Notification identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Notification marked as read (no content) */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Notification id is not a valid UUID */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to mark notification as read */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; markAllNotificationsRead: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description All notifications marked as read (no content) */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to mark all notifications as read */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listTypes: { parameters: { query: { /** @description Resource whose types to list (currently only "artifacts") */ resource_type: string; }; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Types retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TypeListResponse"]; }; }; /** @description Missing or unsupported resource_type */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller is not a member of the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to list types */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createType: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateTypeRequest"]; }; }; responses: { /** @description Type created successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Type"]; }; }; /** @description Invalid or unsupported resource_type, slug, or name */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller is not a member of the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description A type with the same slug already exists for this resource */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to create type */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteType: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Type identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Type deleted (no content) */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Type id is not a valid UUID */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller is not a member of the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description No deletable custom type with this id exists in the team */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to delete type */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; copyTypesFromTeam: { parameters: { query?: never; header?: never; path: { /** @description Destination team identifier */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CopyTypesRequest"]; }; }; responses: { /** @description Copy completed (possibly with everything skipped) */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["CopyTypesResponse"]; }; }; /** @description Missing body, malformed source_team_id, or source equal to destination */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller is not a member of the destination team or of the source team. The two are deliberately indistinguishable, so the response never reveals whether the source team exists. */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to copy types */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getAdminStats: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Instance statistics retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AdminStatsResponse"]; }; }; /** @description Not found — the caller is not an instance admin (surface not advertised) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listAdminUsers: { parameters: { query?: { /** @description 1-based page number */ page?: number; /** @description Items per page */ limit?: number; /** @description Case-insensitive substring match over the user's email and name. */ search?: string; /** @description Exact match on the user's identity-provider name (e.g. "google", "oidc"). */ idp_provider?: string; /** @description Only users created at or after this instant (inclusive). */ created_from?: string; /** @description Only users created at or before this instant (inclusive). */ created_to?: string; /** @description Narrow to accounts in this lifecycle state. */ status?: "active" | "suspended"; /** @description Column to sort by. Ties are always broken by user id so paging is stable. */ sort_by?: "created_at" | "email" | "name" | "team_count"; /** @description Sort direction. */ sort_order?: "asc" | "desc"; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description A page of users */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AdminUserListResponse"]; }; }; /** @description Bad request — a query parameter is malformed or outside its enum */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Not found — the caller is not an instance admin (surface not advertised) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createAdminUser: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["AdminUserCreateRequest"]; }; }; responses: { /** @description The created user */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AdminUserDetail"]; }; }; /** @description Bad request — missing or malformed email/name, or an unknown field */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Not found — the caller is not an instance admin (surface not advertised) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Conflict — a user with that email already exists; nothing was created */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getAdminUser: { parameters: { query?: never; header?: never; path: { /** @description User id (UUID) */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description The user with their team memberships */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AdminUserDetail"]; }; }; /** @description Not found — unknown user id, or the caller is not an instance admin */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteAdminUser: { parameters: { query?: never; header?: never; path: { /** @description User id (UUID) */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description The user was deleted */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Bad request — malformed user id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Not found — unknown user id, or the caller is not an instance admin */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** * @description Conflict — the delete was refused and NOTHING was deleted. Either the * user owns shared teams with other members (see `blockers`), or the * target is the acting admin or a config-listed instance admin. */ 409: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AdminUserDeleteBlockedResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateAdminUser: { parameters: { query?: never; header?: never; path: { /** @description User id (UUID) */ id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["AdminUserUpdateRequest"]; }; }; responses: { /** @description The updated user */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AdminUserDetail"]; }; }; /** @description Bad request — malformed id, or a body carrying an unknown or non-editable field */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Not found — unknown user id, or the caller is not an instance admin */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listAdminTeams: { parameters: { query?: { /** @description 1-based page number */ page?: number; /** @description Items per page */ limit?: number; /** @description Case-insensitive substring match over the team name, team slug, and the owner's email. */ search?: string; /** @description Narrow to personal workspaces (true) or shared team workspaces (false). */ is_personal?: boolean; /** @description Only teams created at or after this instant (inclusive). */ created_from?: string; /** @description Only teams created at or before this instant (inclusive). */ created_to?: string; /** @description Column to sort by. Ties are always broken by team id so paging is stable. */ sort_by?: "created_at" | "name" | "member_count"; /** @description Sort direction. */ sort_order?: "asc" | "desc"; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description A page of teams */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AdminTeamListResponse"]; }; }; /** @description Bad request — a query parameter is malformed or outside its enum */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Not found — the caller is not an instance admin (surface not advertised) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getAdminTeam: { parameters: { query?: never; header?: never; path: { /** @description Team id (UUID) */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description The team with its owner and members */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AdminTeamDetail"]; }; }; /** @description Not found — unknown team id, or the caller is not an instance admin */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getAdminDashboardOverview: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Dashboard overview */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AdminDashboardOverview"]; }; }; /** @description Not found — the caller is not an instance admin (surface not advertised) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getAdminDashboardTimeseries: { parameters: { query?: { /** @description Inclusive start of the range. Defaults to 30 days before `to`. */ from?: string; /** @description Exclusive end of the range. Defaults to now. */ to?: string; /** @description Bucket size. */ granularity?: "day" | "week" | "month"; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Bucketed time series for the requested range */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AdminTimeseriesResponse"]; }; }; /** * @description Bad request — `to` is not after `from`, the range exceeds the maximum * span, or `granularity` is outside its enum */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Not found — the caller is not an instance admin (surface not advertised) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; suspendAdminUser: { parameters: { query?: never; header?: never; path: { /** @description User id (UUID) */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description The updated user */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AdminUserDetail"]; }; }; /** @description Bad request — malformed user id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Not found — unknown user id, or the caller is not an instance admin */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Conflict — the acting admin cannot suspend themselves or a config-listed instance admin */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; reactivateAdminUser: { parameters: { query?: never; header?: never; path: { /** @description User id (UUID) */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description The updated user */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AdminUserDetail"]; }; }; /** @description Bad request — malformed user id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Not found — unknown user id, or the caller is not an instance admin */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listAdminProjects: { parameters: { query?: { /** @description 1-based page number */ page?: number; /** @description Items per page */ limit?: number; /** @description Case-insensitive substring match over the project name and slug. */ search?: string; /** @description Narrow to projects belonging to one team. */ team_id?: string; /** @description Only projects created at or after this instant (inclusive). */ created_from?: string; /** @description Only projects created at or before this instant (inclusive). */ created_to?: string; /** @description Column to sort by. Ties are always broken by project id so paging is stable. */ sort_by?: "created_at" | "name"; /** @description Sort direction. */ sort_order?: "asc" | "desc"; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description A page of projects */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AdminProjectListResponse"]; }; }; /** @description Bad request — a query parameter is malformed or outside its enum */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Not found — the caller is not an instance admin (surface not advertised) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getAdminProject: { parameters: { query?: never; header?: never; path: { /** @description Project id (UUID) */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description The project with its team, owner and resource counts */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["AdminProjectDetail"]; }; }; /** @description Bad request — malformed project id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Not found — unknown project id, or the caller is not an instance admin */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listComments: { parameters: { query: { /** @description Type of the commented resource (artifact, memory, prompt, or blueprint) */ resource_type: string; /** @description Identifier of the commented resource */ resource_id: string; /** @description Page number (1-based) */ page?: number; /** @description Items per page */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Comments retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["CommentListResponse"]; }; }; /** @description Invalid resource_type or query parameters */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller is not a member of the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to list comments */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createComment: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateCommentRequest"]; }; }; responses: { /** @description Comment created successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Comment"]; }; }; /** @description Invalid resource_type or content */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller may not comment in the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Target resource not found in the team */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to create comment */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listRecentComments: { parameters: { query?: { /** @description Maximum number of entries to return */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Recent comments retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["RecentCommentListResponse"]; }; }; /** @description Invalid query parameters */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller is not a member of the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to list recent comments */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteComment: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Comment identifier */ comment_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Comment deleted (no content) */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description comment_id is not a valid UUID */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller may not delete this comment */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Comment not found in the team */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to delete comment */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateComment: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Comment identifier */ comment_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateCommentRequest"]; }; }; responses: { /** @description Comment updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Comment"]; }; }; /** @description Invalid content */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller is not the comment's author */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Comment not found in the team */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to update comment */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listRelations: { parameters: { query: { /** @description Type of the resource whose relations to list (artifact, memory, prompt, or blueprint) */ resource_type: string; /** @description Identifier of the resource whose relations to list */ resource_id: string; /** @description Page number (1-based) */ page?: number; /** @description Items per page */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Relations retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["RelationListResponse"]; }; }; /** @description Invalid resource_type or query parameters */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller is not a member of the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to list relations */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createRelation: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateRelationRequest"]; }; }; responses: { /** @description Relation already existed; the existing edge is returned (idempotent create) */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Relation"]; }; }; /** @description Relation created successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Relation"]; }; }; /** @description Invalid types, self-link, cross-project link, or matrix violation */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller may not create relations in the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description One of the endpoints does not exist in the team */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to create relation */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; confirmRelation: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Relation identifier */ relation_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Relation confirmed successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Relation"]; }; }; /** @description relation_id is not a valid UUID */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller may not confirm relations in the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Relation not found in the team */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Relation is already confirmed */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to confirm relation */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteRelation: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Relation identifier */ relation_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Relation deleted (no content) */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description relation_id is not a valid UUID */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller may not delete this relation */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Relation not found in the team */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to delete relation */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; seedRelations: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Seed backfill accepted and running in the background (no content) */ 202: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller may not create relations in the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to trigger the relation seed backfill */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listEmbeddingProviders: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Embedding providers retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["EmbeddingProviderArrayResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to retrieve embedding providers (`DATABASE_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createEmbeddingProvider: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateEmbeddingProviderRequest"]; }; }; responses: { /** @description Embedding provider created successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["EmbeddingProviderResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`) or missing required fields (`PROVIDER_VALIDATION_FAILED` with `validation_errors`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description A provider with the same name already exists (`PROVIDER_ALREADY_EXISTS`) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Provider creation failed (`PROVIDER_CREATE_FAILED`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getEmbeddingCoverage: { parameters: { query?: never; header?: never; path: { /** @description Team whose embedding coverage is reported. */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Embedding coverage retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["EmbeddingCoverageResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to retrieve embedding coverage (`DATABASE_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getEmbeddingProvider: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; /** @description Embedding provider ID */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Embedding provider retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["EmbeddingProviderResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Embedding provider not found (`PROVIDER_NOT_FOUND`) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to retrieve embedding provider (`DATABASE_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateEmbeddingProvider: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; /** @description Embedding provider ID */ id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateEmbeddingProviderRequest"]; }; }; responses: { /** @description Embedding provider updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["EmbeddingProviderResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Embedding provider not found (`PROVIDER_NOT_FOUND`) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Provider update failed (`PROVIDER_UPDATE_FAILED`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteEmbeddingProvider: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; /** @description Embedding provider ID */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Embedding provider deleted successfully (no body) */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Cannot delete the last embedding provider (`PROVIDER_LAST_DELETE_BLOCKED`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Embedding provider not found (`PROVIDER_NOT_FOUND`) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Provider deletion failed (`PROVIDER_DELETE_FAILED`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; reprocessEmbeddingProvider: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; /** @description Embedding provider ID */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Reprocess accepted; embeddings are regenerated in the background. */ 202: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["SuccessResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Embedding provider not found (`PROVIDER_NOT_FOUND`) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to load the provider before reprocess (`DATABASE_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; validateEmbeddingProvider: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["ValidateEmbeddingProviderRequest"]; }; }; responses: { /** @description Validation completed (check `is_valid` for the outcome) */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ValidateEmbeddingProviderResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`) or missing required fields (`PROVIDER_VALIDATION_FAILED` with `validation_errors`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Validation failed due to an internal service error (`INTERNAL_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getMetadataKeys: { parameters: { query: { /** @description Which resource type's metadata to enumerate */ resource_type: "artifacts" | "blueprints" | "memories"; /** @description Narrow the catalog to a single project */ project_id?: string; /** @description Maximum number of keys to return */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Metadata keys retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["MetadataKeysResponse"]; }; }; /** @description Invalid or missing query parameter */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller is not a member of the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getMetadataValues: { parameters: { query: { /** @description Which resource type's metadata to enumerate */ resource_type: "artifacts" | "blueprints" | "memories"; /** @description The metadata key whose values to enumerate */ key: string; /** @description Narrow the catalog to a single project */ project_id?: string; /** @description Case-insensitive substring filter for typeahead */ q?: string; /** @description Maximum number of values to return */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Metadata values retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["MetadataValuesResponse"]; }; }; /** @description Invalid or missing query parameter */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller is not a member of the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getTeamSearchSettings: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Settings retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TeamSearchSettings"]; }; }; /** @description Invalid team_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller is not a member of the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to read the team's search settings */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateTeamSearchSettings: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateTeamSearchSettingsRequest"]; }; }; responses: { /** @description Settings stored successfully; the response reports source `team` */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TeamSearchSettings"]; }; }; /** @description Invalid ranking parameters — a negative weight, all weights zero, or a half-life outside (0, 36500] */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller's role does not grant team.settings.update */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to store the team's search settings */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; resetTeamSearchSettings: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Settings reset (no content); the team now inherits the instance defaults */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Invalid team_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller's role does not grant team.settings.update */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to reset the team's search settings */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listTeamSettingsAudit: { parameters: { query?: { /** @description Page number (1-based). The upper bound is not a storage limit — it keeps page * limit inside the range the offset arithmetic can represent, so an absurd page is rejected rather than silently wrapping around to the first one. */ page?: number; /** @description Entries per page */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Audit log retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TeamSettingsAuditListResponse"]; }; }; /** @description Invalid team_id or query parameter */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Authentication required */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller's role does not grant team.settings.update */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to list the team's settings audit log */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listFreshnessRules: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Rules retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FreshnessRuleListResponse"]; }; }; /** @description Invalid team_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Authentication required */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller is not a member of the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to list the team's freshness rules */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createFreshnessRule: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateFreshnessRuleRequest"]; }; }; responses: { /** @description Rule created successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FreshnessRule"]; }; }; /** @description Invalid team_id or rule definition */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Authentication required */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller may not change the team's settings */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to create the freshness rule */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateFreshnessRule: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Freshness rule identifier */ rule_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateFreshnessRuleRequest"]; }; }; responses: { /** @description Rule updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FreshnessRule"]; }; }; /** @description Invalid identifiers or rule definition */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Authentication required */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller may not change the team's settings */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description No such rule in this team */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to update the freshness rule */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteFreshnessRule: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Freshness rule identifier */ rule_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Rule deleted (no content) */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Invalid identifiers */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Authentication required */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller may not change the team's settings */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description No such rule in this team */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to delete the freshness rule */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getTeamFreshnessSettings: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Settings retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TeamFreshnessSettings"]; }; }; /** @description Invalid team_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Authentication required */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller is not a member of the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to read the team's freshness settings */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateTeamFreshnessSettings: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateTeamFreshnessSettingsRequest"]; }; }; responses: { /** @description Settings updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TeamFreshnessSettings"]; }; }; /** @description Invalid team_id or settings */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Authentication required */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller may not change the team's settings */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to update the team's freshness settings */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; resetTeamFreshnessSettings: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Settings reset (no content); the team now inherits the defaults */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Invalid team_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Authentication required */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller may not change the team's settings */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to reset the team's freshness settings */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getFreshnessOverTimeMetrics: { parameters: { query?: { /** @description The reporting window. Defaults to 30d. */ range?: components["schemas"]["FreshnessMetricsRange"]; }; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Metrics retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FreshnessOverTimeMetricsResponse"]; }; }; /** @description Invalid team_id or query parameter */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Authentication required */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller is not a member of the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to build the team's freshness over-time metrics */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getFreshnessByTypeMetrics: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Metrics retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FreshnessByTypeMetricsResponse"]; }; }; /** @description Invalid team_id or query parameter */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Authentication required */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller is not a member of the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to build the team's freshness by-type metrics */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getFreshnessByProjectMetrics: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Metrics retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FreshnessByProjectMetricsResponse"]; }; }; /** @description Invalid team_id or query parameter */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Authentication required */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller is not a member of the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to build the team's freshness by-project metrics */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getFreshnessByRuleMetrics: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Metrics retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FreshnessByRuleMetricsResponse"]; }; }; /** @description Invalid team_id or query parameter */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Authentication required */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller is not a member of the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to build the team's freshness by-rule metrics */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listFreshnessAudit: { parameters: { query?: { /** @description Page number (1-based). The upper bound is not a storage limit — it keeps page * limit inside the range the offset arithmetic can represent, so an absurd page is rejected rather than silently wrapping around to the first one. */ page?: number; /** @description Entries per page */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Audit log retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FreshnessAuditListResponse"]; }; }; /** @description Invalid team_id or query parameter */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Authentication required */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller is not a member of the team */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to list the team's freshness audit log */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listEmbeddingProvidersSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Embedding providers retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["EmbeddingProviderArrayResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to retrieve embedding providers (`DATABASE_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createEmbeddingProviderSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateEmbeddingProviderRequest"]; }; }; responses: { /** @description Embedding provider created successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["EmbeddingProviderResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`) or missing required fields (`PROVIDER_VALIDATION_FAILED` with `validation_errors`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description A provider with the same name already exists (`PROVIDER_ALREADY_EXISTS`) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Provider creation failed (`PROVIDER_CREATE_FAILED`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getEmbeddingCoverageSettings: { parameters: { query?: never; header?: never; path: { /** @description Team whose embedding coverage is reported. */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Embedding coverage retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["EmbeddingCoverageResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to retrieve embedding coverage (`DATABASE_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getEmbeddingProviderSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; /** @description Embedding provider ID */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Embedding provider retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["EmbeddingProviderResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Embedding provider not found (`PROVIDER_NOT_FOUND`) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to retrieve embedding provider (`DATABASE_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateEmbeddingProviderSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; /** @description Embedding provider ID */ id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateEmbeddingProviderRequest"]; }; }; responses: { /** @description Embedding provider updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["EmbeddingProviderResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Embedding provider not found (`PROVIDER_NOT_FOUND`) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Provider update failed (`PROVIDER_UPDATE_FAILED`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteEmbeddingProviderSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; /** @description Embedding provider ID */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Embedding provider deleted successfully (no body) */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Cannot delete the last embedding provider (`PROVIDER_LAST_DELETE_BLOCKED`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Embedding provider not found (`PROVIDER_NOT_FOUND`) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Provider deletion failed (`PROVIDER_DELETE_FAILED`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; reprocessEmbeddingProviderSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; /** @description Embedding provider ID */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Reprocess accepted; embeddings are regenerated in the background. */ 202: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["SuccessResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Embedding provider not found (`PROVIDER_NOT_FOUND`) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to load the provider before reprocess (`DATABASE_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; validateEmbeddingProviderSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the embedding provider(s). */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["ValidateEmbeddingProviderRequest"]; }; }; responses: { /** @description Validation completed (check `is_valid` for the outcome) */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ValidateEmbeddingProviderResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`) or missing required fields (`PROVIDER_VALIDATION_FAILED` with `validation_errors`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Validation failed due to an internal service error (`INTERNAL_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; clearEmbeddingsSettings: { parameters: { query?: never; header?: never; path: { /** @description Team whose stored embeddings are cleared. */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Embeddings cleared; body reports how many rows were deleted. */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ClearEmbeddingsResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to clear embeddings (`DATABASE_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; copyEmbeddingProviderFromTeam: { parameters: { query?: never; header?: never; path: { /** @description Destination team identifier */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CopyEmbeddingProviderRequest"]; }; }; responses: { /** @description Provider copied into the destination team */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["CopyEmbeddingProviderResponse"]; }; }; /** @description Missing or malformed body, missing/malformed `source_team_id` or `source_provider_id`, source equal to destination (`BAD_REQUEST`), or an override sent empty or over-long (`PROVIDER_VALIDATION_FAILED` with `validation_errors`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller cannot manage provider settings in the destination team or in the source team (`FORBIDDEN`). The two are deliberately indistinguishable, so the response never reveals whether the source team exists. */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description No such provider in the source team (`PROVIDER_NOT_FOUND`). Only reachable once the caller is authorized on both teams, so it leaks nothing. */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description The destination team already holds the requested name (`PROVIDER_ALREADY_EXISTS`). Only reachable for a caller-supplied `name`; an inherited one is disambiguated instead. */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Copy failed (`INTERNAL_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getGitHubAppConfig: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the GitHub App registration. */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description The team's GitHub App configuration */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GitHubAppConfigResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description The team has no GitHub App configured (`GITHUB_APP_NOT_CONFIGURED`) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateGitHubAppConfig: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the GitHub App registration. */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateGitHubAppConfigRequest"]; }; }; responses: { /** @description GitHub App configuration updated */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GitHubAppConfigResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`), an explicitly empty field, or an unparseable private key (`VALIDATION_FAILED` with `validation_errors`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing the GitHub App requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description The team has no GitHub App configured (`GITHUB_APP_NOT_CONFIGURED`), another team already registered this `app_id` (`GITHUB_APP_ALREADY_REGISTERED`), or the configuration was modified concurrently (`GITHUB_APP_CONFIG_CONFLICT`) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createGitHubAppConfig: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the GitHub App registration. */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateGitHubAppConfigRequest"]; }; }; responses: { /** @description GitHub App registered. This is the only response that carries the plaintext `webhook_secret`. */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["CreateGitHubAppConfigResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`), missing required fields, or an unparseable private key (`VALIDATION_FAILED` with `validation_errors`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing the GitHub App requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description The team already has an App configured (`GITHUB_APP_CONFIG_EXISTS`), or another team already registered this `app_id` (`GITHUB_APP_ALREADY_REGISTERED`) — a GitHub App has a single webhook URL, so it cannot be shared across teams */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteGitHubAppConfig: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the GitHub App registration. */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description GitHub App configuration deleted */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing the GitHub App requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description The team has no GitHub App configured (`GITHUB_APP_NOT_CONFIGURED`) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; validateGitHubAppConfig: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the GitHub App registration. */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Validation result (successful or not) */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ValidateGitHubAppConfigResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing the GitHub App requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description The team has no GitHub App configured (`GITHUB_APP_NOT_CONFIGURED`) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; rotateGitHubAppWebhookToken: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the GitHub App registration. */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Token rotated; the response carries the new `webhook_url` */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GitHubAppConfigResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing the GitHub App requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description The team has no GitHub App configured (`GITHUB_APP_NOT_CONFIGURED`) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getGitHubAppConfigSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the GitHub App registration. */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description The team's GitHub App configuration */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GitHubAppConfigResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description The team has no GitHub App configured (`GITHUB_APP_NOT_CONFIGURED`) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateGitHubAppConfigSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the GitHub App registration. */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateGitHubAppConfigRequest"]; }; }; responses: { /** @description GitHub App configuration updated */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GitHubAppConfigResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`), an explicitly empty field, or an unparseable private key (`VALIDATION_FAILED` with `validation_errors`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing the GitHub App requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description The team has no GitHub App configured (`GITHUB_APP_NOT_CONFIGURED`), another team already registered this `app_id` (`GITHUB_APP_ALREADY_REGISTERED`), or the configuration was modified concurrently (`GITHUB_APP_CONFIG_CONFLICT`) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createGitHubAppConfigSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the GitHub App registration. */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateGitHubAppConfigRequest"]; }; }; responses: { /** @description GitHub App registered. This is the only response that carries the plaintext `webhook_secret`. */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["CreateGitHubAppConfigResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`), missing required fields, or an unparseable private key (`VALIDATION_FAILED` with `validation_errors`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing the GitHub App requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description The team already has an App configured (`GITHUB_APP_CONFIG_EXISTS`), or another team already registered this `app_id` (`GITHUB_APP_ALREADY_REGISTERED`) — a GitHub App has a single webhook URL, so it cannot be shared across teams */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteGitHubAppConfigSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the GitHub App registration. */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description GitHub App configuration deleted */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing the GitHub App requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description The team has no GitHub App configured (`GITHUB_APP_NOT_CONFIGURED`) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; validateGitHubAppConfigSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the GitHub App registration. */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Validation result (successful or not) */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ValidateGitHubAppConfigResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing the GitHub App requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description The team has no GitHub App configured (`GITHUB_APP_NOT_CONFIGURED`) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; rotateGitHubAppWebhookTokenSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the GitHub App registration. */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Token rotated; the response carries the new `webhook_url` */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GitHubAppConfigResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing the GitHub App requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description The team has no GitHub App configured (`GITHUB_APP_NOT_CONFIGURED`) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getTeamEmailProvider: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the email provider configuration. */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description The email configuration in force for the team */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TeamEmailProviderResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; upsertTeamEmailProvider: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the email provider configuration. */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpsertTeamEmailProviderRequest"]; }; }; responses: { /** @description The stored configuration */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TeamEmailProviderResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`), or an invalid configuration (`TEAM_EMAIL_PROVIDER_VALIDATION_FAILED` with `validation_errors`) — an unknown provider type, a missing or mismatched settings block, an empty `secret`, a malformed address, or a destination that is not allowed */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - configuring the team's email provider requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteTeamEmailProvider: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the email provider configuration. */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Provider removed; the team now uses the instance provider */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - configuring the team's email provider requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description The team has no email provider of its own (`TEAM_EMAIL_PROVIDER_NOT_CONFIGURED`) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; testTeamEmailProvider: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the email provider configuration. */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpsertTeamEmailProviderRequest"]; }; }; responses: { /** @description Test outcome (successful or not) */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TeamEmailProviderTestResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`), or an invalid configuration (`TEAM_EMAIL_PROVIDER_VALIDATION_FAILED` with `validation_errors`). `secret` is always required here, since there is no stored credential to fall back on */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - testing the team's email provider requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getTeamEmailProviderSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the email provider configuration. */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description The email configuration in force for the team */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TeamEmailProviderResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; upsertTeamEmailProviderSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the email provider configuration. */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpsertTeamEmailProviderRequest"]; }; }; responses: { /** @description The stored configuration */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TeamEmailProviderResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`), or an invalid configuration (`TEAM_EMAIL_PROVIDER_VALIDATION_FAILED` with `validation_errors`) — an unknown provider type, a missing or mismatched settings block, an empty `secret`, a malformed address, or a destination that is not allowed */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - configuring the team's email provider requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteTeamEmailProviderSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the email provider configuration. */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Provider removed; the team now uses the instance provider */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - configuring the team's email provider requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description The team has no email provider of its own (`TEAM_EMAIL_PROVIDER_NOT_CONFIGURED`) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; testTeamEmailProviderSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the email provider configuration. */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpsertTeamEmailProviderRequest"]; }; }; responses: { /** @description Test outcome (successful or not) */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["TeamEmailProviderTestResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`), or an invalid configuration (`TEAM_EMAIL_PROVIDER_VALIDATION_FAILED` with `validation_errors`). `secret` is always required here, since there is no stored credential to fall back on */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - testing the team's email provider requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listModelProviders: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the model provider(s). */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Model providers retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ModelProviderResponseList"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to retrieve model providers (`DATABASE_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createModelProvider: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the model provider(s). */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateModelProviderRequest"]; }; }; responses: { /** @description Model provider created successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ModelProviderResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`) or missing required fields (`MODEL_PROVIDER_VALIDATION_FAILED` with `validation_errors`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description A provider with the same name already exists (`MODEL_PROVIDER_ALREADY_EXISTS`) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Provider creation failed (`MODEL_PROVIDER_CREATE_FAILED`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getModelProvider: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the model provider(s). */ team_id: string; /** @description Model provider ID */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Model provider retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ModelProviderResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Model provider not found (`MODEL_PROVIDER_NOT_FOUND`) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to retrieve model provider (`DATABASE_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateModelProvider: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the model provider(s). */ team_id: string; /** @description Model provider ID */ id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateModelProviderRequest"]; }; }; responses: { /** @description Model provider updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ModelProviderResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Model provider not found (`MODEL_PROVIDER_NOT_FOUND`) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Provider update failed (`MODEL_PROVIDER_UPDATE_FAILED`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteModelProvider: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the model provider(s). */ team_id: string; /** @description Model provider ID */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Model provider deleted successfully (no body) */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Cannot delete the last model provider (`MODEL_PROVIDER_LAST_DELETE_BLOCKED`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Model provider not found (`MODEL_PROVIDER_NOT_FOUND`) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Provider deletion failed (`MODEL_PROVIDER_DELETE_FAILED`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; validateModelProvider: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the model provider(s). */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["ValidateModelProviderRequest"]; }; }; responses: { /** @description Validation completed (check `is_valid` for the outcome) */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ValidateModelProviderResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`) or missing required fields (`MODEL_PROVIDER_VALIDATION_FAILED` with `validation_errors`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Validation failed due to an internal service error (`INTERNAL_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listModelProvidersSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the model provider(s). */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Model providers retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ModelProviderResponseList"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to retrieve model providers (`DATABASE_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createModelProviderSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the model provider(s). */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateModelProviderRequest"]; }; }; responses: { /** @description Model provider created successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ModelProviderResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`) or missing required fields (`MODEL_PROVIDER_VALIDATION_FAILED` with `validation_errors`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description A provider with the same name already exists (`MODEL_PROVIDER_ALREADY_EXISTS`) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Provider creation failed (`MODEL_PROVIDER_CREATE_FAILED`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getModelProviderSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the model provider(s). */ team_id: string; /** @description Model provider ID */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Model provider retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ModelProviderResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Model provider not found (`MODEL_PROVIDER_NOT_FOUND`) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to retrieve model provider (`DATABASE_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateModelProviderSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the model provider(s). */ team_id: string; /** @description Model provider ID */ id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateModelProviderRequest"]; }; }; responses: { /** @description Model provider updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ModelProviderResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Model provider not found (`MODEL_PROVIDER_NOT_FOUND`) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Provider update failed (`MODEL_PROVIDER_UPDATE_FAILED`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteModelProviderSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the model provider(s). */ team_id: string; /** @description Model provider ID */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Model provider deleted successfully (no body) */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Cannot delete the last model provider (`MODEL_PROVIDER_LAST_DELETE_BLOCKED`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Model provider not found (`MODEL_PROVIDER_NOT_FOUND`) */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Provider deletion failed (`MODEL_PROVIDER_DELETE_FAILED`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; validateModelProviderSettings: { parameters: { query?: never; header?: never; path: { /** @description Team that owns the model provider(s). */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["ValidateModelProviderRequest"]; }; }; responses: { /** @description Validation completed (check `is_valid` for the outcome) */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ValidateModelProviderResponse"]; }; }; /** @description Malformed JSON body (`BAD_REQUEST`) or missing required fields (`MODEL_PROVIDER_VALIDATION_FAILED` with `validation_errors`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden - managing provider settings requires team owner/admin (`FORBIDDEN`) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Validation failed due to an internal service error (`INTERNAL_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; copyModelProviderFromTeam: { parameters: { query?: never; header?: never; path: { /** @description Destination team identifier */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CopyModelProviderRequest"]; }; }; responses: { /** @description Provider copied into the destination team */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ModelProviderResponse"]; }; }; /** @description Missing or malformed body, missing/malformed `source_team_id` or `source_provider_id`, source equal to destination (`BAD_REQUEST`), or an override sent empty (`MODEL_PROVIDER_VALIDATION_FAILED` with `validation_errors`) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Caller cannot manage provider settings in the destination team or in the source team (`FORBIDDEN`). The two are deliberately indistinguishable, so the response never reveals whether the source team exists. */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description No such provider in the source team (`MODEL_PROVIDER_NOT_FOUND`). Only reachable once the caller is authorized on both teams, so it leaks nothing. */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description The chosen name is already taken in the destination team (`MODEL_PROVIDER_ALREADY_EXISTS`). Normally that means a caller-supplied `name`, since an omitted one is disambiguated first — but a disambiguated name can still land here if another writer claims it in between, or if every generated variant is already taken. */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Failed to copy the model provider (`INTERNAL_ERROR`) */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listProjects: { parameters: { query?: { /** @description Search term to filter projects */ search?: string; /** @description Field to sort by */ sort_by?: string; /** @description Sort direction (asc or desc) */ sort_order?: string; /** @description Page number (1-based) */ page?: number; /** @description Number of items per page (values above 100 are clamped to 100) */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Projects retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ProjectListResponse"]; }; }; /** @description team_id is not a valid UUID */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createProject: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateProjectRequest"]; }; }; responses: { /** @description Project created successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Project"]; }; }; /** @description Invalid request body, validation failure, or team_id is not a valid UUID */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Project with the same slug already exists */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getProject: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Project slug (URL-encoded) */ slug: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Project retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Project"]; }; }; /** @description Invalid slug encoding or team_id is not a valid UUID */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Project not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updateProject: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Project slug (URL-encoded) */ slug: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdateProjectRequest"]; }; }; responses: { /** @description Project updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Project"]; }; }; /** @description Invalid request body, validation failure, cross-team move attempted, or invalid slug encoding */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Project not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Slug already exists, or the project was modified by another request (version mismatch) */ 409: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; deleteProject: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Project slug (URL-encoded) */ slug: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Project deleted successfully */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Cannot delete the last project in the team, or invalid slug encoding / team_id */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Project not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getProjectMigrationInventory: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Source project identifier */ project_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Migration inventory retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["MigrationInventory"]; }; }; /** @description project_id or team_id is not a valid UUID */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member, or project does not belong to the specified team) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Project not found or not accessible */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; migrateProject: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Source project identifier */ project_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["MigrationRequest"]; }; }; responses: { /** @description Migration completed (individual resources may still be reported as skipped or failed) */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["MigrationResult"]; }; }; /** @description Invalid request body, invalid UUID, invalid conflict_policy, or cross-team migration attempted */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden (not a team member, or project does not belong to the specified team) */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Source or destination project not found or not accessible */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listActivities: { parameters: { query?: { /** @description Page number (1-based); converted to an offset using the current limit */ page?: number; /** @description Number of items per page (values outside 1-100 are ignored) */ limit?: number; /** @description Explicit result offset (takes precedence over page when both are provided) */ offset?: number; /** @description Filter by activity type (e.g. prompt_created) */ activity_type?: string; /** @description Filter by entity type (e.g. prompt) */ entity_type?: string; /** @description Filter by entity identifier */ entity_id?: string; /** @description Filter by session identifier */ session_id?: string; /** @description Free-text search in activity descriptions */ search?: string; /** @description Include activities from this date (YYYY-MM-DD, inclusive) */ date_from?: string; /** @description Include activities up to this date (YYYY-MM-DD, inclusive end of day) */ date_to?: string; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Activities retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ActivityListEnvelope"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createActivity: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateActivityRequest"]; }; }; responses: { /** @description Activity created successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ActivityEnvelope"]; }; }; /** @description Invalid JSON payload or missing required field (activity_type, entity_type, description) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getActivityStats: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Activity statistics retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ActivityStatsEnvelope"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getActivityTypes: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Activity and entity types retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ActivityTypesEnvelope"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getActivityEntityTypes: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Entity types retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ActivityEntityTypesEnvelope"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getActivity: { parameters: { query?: never; header?: never; path: { /** @description Activity identifier */ id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Activity retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ActivityEnvelope"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Activity not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; getPreferences: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description User preferences retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PreferencesResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error — failed to retrieve preferences */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; updatePreferences: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["UpdatePreferencesRequest"]; }; }; responses: { /** @description User preferences updated successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PreferencesResponse"]; }; }; /** @description Invalid request body (malformed JSON) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error — preferences update failed */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; completeOnboarding: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Onboarding marked as completed — returns the updated user */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["User"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error — failed to mark onboarding completed or fetch user */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; listFeedItemReplies: { parameters: { query?: { /** @description Page number (default 1) */ page?: number; /** @description Items per page (default 20, max 100) */ limit?: number; }; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Feed item identifier */ item_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Feed item replies retrieved successfully */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FeedItemReplyListResponse"]; }; }; /** @description Invalid item_id format */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — not a team member */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Feed item not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; createFeedItemReply: { parameters: { query?: never; header?: never; path: { /** @description Team identifier */ team_id: string; /** @description Feed item identifier */ item_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CreateFeedItemReplyRequest"]; }; }; responses: { /** @description Feed item reply created successfully */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FeedItemReply"]; }; }; /** @description Invalid item_id format, team_id not a valid UUID, invalid request body, or validation failed (content required/too long) */ 400: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized */ 401: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Forbidden — insufficient team permissions */ 403: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Feed item not found */ 404: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Cannot reply to an archived feed item */ 422: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; /** @description Internal server error */ 500: { headers: { [name: string]: unknown; }; content: { "application/problem+json": components["schemas"]["ErrorResponse"]; }; }; }; }; }