From 9929cbe117f19dfabca46e709f60fb055b84daa7 Mon Sep 17 00:00:00 2001 From: Rowan Stein Date: Tue, 24 Feb 2026 15:39:01 +0000 Subject: [PATCH 01/10] feat(team): add OpenAPI 3.0 schema for Agents, Tools, MCP Servers, WorkspaceConfigurations, MemoryBuckets, and Attachments --- openapi/team/openapi.yaml | 921 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 921 insertions(+) create mode 100644 openapi/team/openapi.yaml diff --git a/openapi/team/openapi.yaml b/openapi/team/openapi.yaml new file mode 100644 index 0000000..d6c6e1a --- /dev/null +++ b/openapi/team/openapi.yaml @@ -0,0 +1,921 @@ +openapi: 3.0.3 +info: + title: Team Management API + version: 0.1.0 + description: | + Schema-first REST API for managing team entities in Agyn Platform. + Entities: Agents, Tools, MCP Servers, WorkspaceConfiguration, MemoryBucket. + Relations are modeled as Attachments between entities. +servers: + - url: https://api.example.com + description: Placeholder base URL +tags: + - name: Agents + - name: Tools + - name: MCP Servers + - name: WorkspaceConfigurations + - name: MemoryBuckets + - name: Attachments +paths: + /agents: + get: + tags: [Agents] + summary: List agents + parameters: + - in: query + name: q + schema: + type: string + description: Free-text search (name/role). + - in: query + name: page + schema: + type: integer + minimum: 1 + default: 1 + - in: query + name: perPage + schema: + type: integer + minimum: 1 + maximum: 100 + default: 20 + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedAgents' + default: + $ref: '#/components/responses/ProblemResponse' + post: + tags: [Agents] + summary: Create agent + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/AgentCreateRequest' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/Agent' + default: + $ref: '#/components/responses/ProblemResponse' + /agents/{id}: + get: + tags: [Agents] + summary: Get agent by ID + parameters: + - $ref: '#/components/parameters/IdPath' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/Agent' + default: + $ref: '#/components/responses/ProblemResponse' + patch: + tags: [Agents] + summary: Update agent (partial) + parameters: + - $ref: '#/components/parameters/IdPath' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/AgentUpdateRequest' + responses: + '200': + description: Updated + content: + application/json: + schema: + $ref: '#/components/schemas/Agent' + default: + $ref: '#/components/responses/ProblemResponse' + delete: + tags: [Agents] + summary: Delete agent + parameters: + - $ref: '#/components/parameters/IdPath' + responses: + '204': + description: No Content + default: + $ref: '#/components/responses/ProblemResponse' + + /tools: + get: + tags: [Tools] + summary: List tools + parameters: + - in: query + name: type + schema: + $ref: '#/components/schemas/ToolType' + description: Filter by tool type + - in: query + name: page + schema: + type: integer + minimum: 1 + default: 1 + - in: query + name: perPage + schema: + type: integer + minimum: 1 + maximum: 100 + default: 20 + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedTools' + default: + $ref: '#/components/responses/ProblemResponse' + post: + tags: [Tools] + summary: Create tool + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ToolCreateRequest' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/Tool' + default: + $ref: '#/components/responses/ProblemResponse' + /tools/{id}: + get: + tags: [Tools] + summary: Get tool by ID + parameters: + - $ref: '#/components/parameters/IdPath' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/Tool' + default: + $ref: '#/components/responses/ProblemResponse' + patch: + tags: [Tools] + summary: Update tool (partial) + parameters: + - $ref: '#/components/parameters/IdPath' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ToolUpdateRequest' + responses: + '200': + description: Updated + content: + application/json: + schema: + $ref: '#/components/schemas/Tool' + default: + $ref: '#/components/responses/ProblemResponse' + delete: + tags: [Tools] + summary: Delete tool + parameters: + - $ref: '#/components/parameters/IdPath' + responses: + '204': + description: No Content + default: + $ref: '#/components/responses/ProblemResponse' + + /mcp-servers: + get: + tags: [MCP Servers] + summary: List MCP servers + parameters: + - in: query + name: page + schema: + type: integer + minimum: 1 + default: 1 + - in: query + name: perPage + schema: + type: integer + minimum: 1 + maximum: 100 + default: 20 + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedMcpServers' + default: + $ref: '#/components/responses/ProblemResponse' + post: + tags: [MCP Servers] + summary: Create MCP server + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/McpServerCreateRequest' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/McpServer' + default: + $ref: '#/components/responses/ProblemResponse' + /mcp-servers/{id}: + get: + tags: [MCP Servers] + summary: Get MCP server by ID + parameters: + - $ref: '#/components/parameters/IdPath' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/McpServer' + default: + $ref: '#/components/responses/ProblemResponse' + patch: + tags: [MCP Servers] + summary: Update MCP server (partial) + parameters: + - $ref: '#/components/parameters/IdPath' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/McpServerUpdateRequest' + responses: + '200': + description: Updated + content: + application/json: + schema: + $ref: '#/components/schemas/McpServer' + default: + $ref: '#/components/responses/ProblemResponse' + delete: + tags: [MCP Servers] + summary: Delete MCP server + parameters: + - $ref: '#/components/parameters/IdPath' + responses: + '204': + description: No Content + default: + $ref: '#/components/responses/ProblemResponse' + + /workspace-configurations: + get: + tags: [WorkspaceConfigurations] + summary: List workspace configurations + parameters: + - in: query + name: page + schema: + type: integer + minimum: 1 + default: 1 + - in: query + name: perPage + schema: + type: integer + minimum: 1 + maximum: 100 + default: 20 + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedWorkspaceConfigurations' + default: + $ref: '#/components/responses/ProblemResponse' + post: + tags: [WorkspaceConfigurations] + summary: Create workspace configuration + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/WorkspaceConfigurationCreateRequest' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/WorkspaceConfiguration' + default: + $ref: '#/components/responses/ProblemResponse' + /workspace-configurations/{id}: + get: + tags: [WorkspaceConfigurations] + summary: Get workspace configuration by ID + parameters: + - $ref: '#/components/parameters/IdPath' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/WorkspaceConfiguration' + default: + $ref: '#/components/responses/ProblemResponse' + patch: + tags: [WorkspaceConfigurations] + summary: Update workspace configuration (partial) + parameters: + - $ref: '#/components/parameters/IdPath' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/WorkspaceConfigurationUpdateRequest' + responses: + '200': + description: Updated + content: + application/json: + schema: + $ref: '#/components/schemas/WorkspaceConfiguration' + default: + $ref: '#/components/responses/ProblemResponse' + delete: + tags: [WorkspaceConfigurations] + summary: Delete workspace configuration + parameters: + - $ref: '#/components/parameters/IdPath' + responses: + '204': + description: No Content + default: + $ref: '#/components/responses/ProblemResponse' + + /memory-buckets: + get: + tags: [MemoryBuckets] + summary: List memory buckets + parameters: + - in: query + name: page + schema: + type: integer + minimum: 1 + default: 1 + - in: query + name: perPage + schema: + type: integer + minimum: 1 + maximum: 100 + default: 20 + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedMemoryBuckets' + default: + $ref: '#/components/responses/ProblemResponse' + post: + tags: [MemoryBuckets] + summary: Create memory bucket + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/MemoryBucketCreateRequest' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/MemoryBucket' + default: + $ref: '#/components/responses/ProblemResponse' + /memory-buckets/{id}: + get: + tags: [MemoryBuckets] + summary: Get memory bucket by ID + parameters: + - $ref: '#/components/parameters/IdPath' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/MemoryBucket' + default: + $ref: '#/components/responses/ProblemResponse' + patch: + tags: [MemoryBuckets] + summary: Update memory bucket (partial) + parameters: + - $ref: '#/components/parameters/IdPath' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/MemoryBucketUpdateRequest' + responses: + '200': + description: Updated + content: + application/json: + schema: + $ref: '#/components/schemas/MemoryBucket' + default: + $ref: '#/components/responses/ProblemResponse' + delete: + tags: [MemoryBuckets] + summary: Delete memory bucket + parameters: + - $ref: '#/components/parameters/IdPath' + responses: + '204': + description: No Content + default: + $ref: '#/components/responses/ProblemResponse' + + /attachments: + get: + tags: [Attachments] + summary: List attachments + parameters: + - in: query + name: sourceType + schema: + $ref: '#/components/schemas/EntityType' + - in: query + name: sourceId + schema: + type: string + format: uuid + - in: query + name: targetType + schema: + $ref: '#/components/schemas/EntityType' + - in: query + name: targetId + schema: + type: string + format: uuid + - in: query + name: kind + schema: + $ref: '#/components/schemas/AttachmentKind' + - in: query + name: page + schema: + type: integer + minimum: 1 + default: 1 + - in: query + name: perPage + schema: + type: integer + minimum: 1 + maximum: 100 + default: 20 + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedAttachments' + default: + $ref: '#/components/responses/ProblemResponse' + post: + tags: [Attachments] + summary: Create attachment (relation) + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/AttachmentCreateRequest' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/Attachment' + default: + $ref: '#/components/responses/ProblemResponse' + /attachments/{id}: + delete: + tags: [Attachments] + summary: Delete attachment + parameters: + - $ref: '#/components/parameters/IdPath' + responses: + '204': + description: No Content + default: + $ref: '#/components/responses/ProblemResponse' + +components: + parameters: + IdPath: + name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + ProblemResponse: + description: RFC 7807 problem response + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Problem' + schemas: + Problem: + type: object + properties: + type: { type: string, format: uri } + title: { type: string } + status: { type: integer } + detail: { type: string } + instance: { type: string, format: uri } + required: [title, status] + Pagination: + type: object + properties: + page: { type: integer, minimum: 1 } + perPage: { type: integer, minimum: 1 } + total: { type: integer, minimum: 0 } + required: [page, perPage, total] + EntityMeta: + type: object + properties: + id: { type: string, format: uuid } + createdAt: { type: string, format: date-time } + updatedAt: { type: string, format: date-time } + required: [id, createdAt] + + Agent: + allOf: + - $ref: '#/components/schemas/EntityMeta' + - type: object + properties: + title: { type: string } + name: { type: string } + role: { type: string } + config: { $ref: '#/components/schemas/AgentConfig' } + required: [config] + AgentConfig: + type: object + properties: + model: { type: string, default: 'gpt-5' } + systemPrompt: { type: string, default: 'You are a helpful AI assistant.' } + debounceMs: { type: integer, minimum: 0, default: 0 } + whenBusy: { type: string, enum: ['wait', 'injectAfterTools'], default: 'wait' } + processBuffer: { type: string, enum: ['allTogether', 'oneByOne'], default: 'allTogether' } + sendFinalResponseToThread: { type: boolean, default: true } + summarizationKeepTokens: { type: integer, minimum: 0, default: 0 } + summarizationMaxTokens: { type: integer, minimum: 1, default: 512 } + restrictOutput: { type: boolean, default: false } + restrictionMessage: { type: string, default: "Do not produce a final answer directly. Before finishing, call a tool. If no tool is needed, call the 'finish' tool." } + restrictionMaxInjections: { type: integer, minimum: 0, default: 0 } + title: { type: string } + name: { type: string } + role: { type: string } + additionalProperties: false + AgentCreateRequest: + type: object + properties: + title: { type: string } + name: { type: string } + role: { type: string } + config: { $ref: '#/components/schemas/AgentConfig' } + required: [config] + AgentUpdateRequest: + type: object + properties: + title: { type: string } + name: { type: string } + role: { type: string } + config: { $ref: '#/components/schemas/AgentConfig' } + additionalProperties: false + PaginatedAgents: + type: object + properties: + items: + type: array + items: { $ref: '#/components/schemas/Agent' } + page: { type: integer } + perPage: { type: integer } + total: { type: integer } + required: [items, page, perPage, total] + + Tool: + allOf: + - $ref: '#/components/schemas/EntityMeta' + - type: object + properties: + type: { $ref: '#/components/schemas/ToolType' } + name: { type: string } + description: { type: string } + config: { type: object } + required: [type] + ToolType: + type: string + enum: + - manage + - memory + - shell_command + - send_message + - send_slack_message + - remind_me + - github_clone_repo + - call_agent + ToolCreateRequest: + type: object + properties: + type: { $ref: '#/components/schemas/ToolType' } + name: { type: string } + description: { type: string } + config: { type: object } + required: [type] + ToolUpdateRequest: + type: object + properties: + name: { type: string } + description: { type: string } + config: { type: object } + additionalProperties: false + PaginatedTools: + type: object + properties: + items: + type: array + items: { $ref: '#/components/schemas/Tool' } + page: { type: integer } + perPage: { type: integer } + total: { type: integer } + required: [items, page, perPage, total] + + McpServer: + allOf: + - $ref: '#/components/schemas/EntityMeta' + - type: object + properties: + title: { type: string } + namespace: { type: string } + config: { $ref: '#/components/schemas/McpServerConfig' } + required: [config] + McpEnvItem: + type: object + properties: + name: { type: string } + value: { type: string } + required: [name, value] + McpServerConfig: + type: object + properties: + namespace: { type: string } + command: { type: string } + workdir: { type: string } + env: + type: array + items: { $ref: '#/components/schemas/McpEnvItem' } + requestTimeoutMs: { type: integer, minimum: 1 } + startupTimeoutMs: { type: integer, minimum: 1 } + heartbeatIntervalMs: { type: integer, minimum: 1 } + staleTimeoutMs: { type: integer, minimum: 0 } + restart: + type: object + properties: + maxAttempts: { type: integer, minimum: 1, default: 5 } + backoffMs: { type: integer, minimum: 1, default: 2000 } + additionalProperties: false + additionalProperties: false + McpServerCreateRequest: + type: object + properties: + title: { type: string } + namespace: { type: string } + config: { $ref: '#/components/schemas/McpServerConfig' } + required: [config] + McpServerUpdateRequest: + type: object + properties: + title: { type: string } + namespace: { type: string } + config: { $ref: '#/components/schemas/McpServerConfig' } + additionalProperties: false + PaginatedMcpServers: + type: object + properties: + items: + type: array + items: { $ref: '#/components/schemas/McpServer' } + page: { type: integer } + perPage: { type: integer } + total: { type: integer } + required: [items, page, perPage, total] + + WorkspaceConfiguration: + allOf: + - $ref: '#/components/schemas/EntityMeta' + - type: object + properties: + title: { type: string } + config: { $ref: '#/components/schemas/WorkspaceConfig' } + required: [config] + WorkspaceEnvItem: + type: object + properties: + name: { type: string } + value: { type: string } + required: [name, value] + WorkspaceVolumeConfig: + type: object + properties: + enabled: { type: boolean, default: false } + mountPath: { type: string, pattern: '^/' } + additionalProperties: false + WorkspacePlatform: + type: string + enum: [linux/amd64, linux/arm64, auto] + WorkspaceConfig: + type: object + properties: + image: { type: string } + env: + type: array + items: { $ref: '#/components/schemas/WorkspaceEnvItem' } + initialScript: { type: string } + cpu_limit: + oneOf: + - { type: number } + - { type: string } + memory_limit: + oneOf: + - { type: number } + - { type: string } + platform: { $ref: '#/components/schemas/WorkspacePlatform' } + enableDinD: { type: boolean, default: false } + ttlSeconds: { type: integer, minimum: 0, default: 86400 } + nix: { type: object } + volumes: { $ref: '#/components/schemas/WorkspaceVolumeConfig' } + additionalProperties: false + WorkspaceConfigurationCreateRequest: + type: object + properties: + title: { type: string } + config: { $ref: '#/components/schemas/WorkspaceConfig' } + required: [config] + WorkspaceConfigurationUpdateRequest: + type: object + properties: + title: { type: string } + config: { $ref: '#/components/schemas/WorkspaceConfig' } + additionalProperties: false + PaginatedWorkspaceConfigurations: + type: object + properties: + items: + type: array + items: { $ref: '#/components/schemas/WorkspaceConfiguration' } + page: { type: integer } + perPage: { type: integer } + total: { type: integer } + required: [items, page, perPage, total] + + MemoryBucket: + allOf: + - $ref: '#/components/schemas/EntityMeta' + - type: object + properties: + title: { type: string } + config: { $ref: '#/components/schemas/MemoryBucketConfig' } + required: [config] + MemoryBucketConfig: + type: object + properties: + scope: + type: string + enum: [global, perThread] + default: global + collectionPrefix: { type: string } + additionalProperties: false + MemoryBucketCreateRequest: + type: object + properties: + title: { type: string } + config: { $ref: '#/components/schemas/MemoryBucketConfig' } + required: [config] + MemoryBucketUpdateRequest: + type: object + properties: + title: { type: string } + config: { $ref: '#/components/schemas/MemoryBucketConfig' } + additionalProperties: false + PaginatedMemoryBuckets: + type: object + properties: + items: + type: array + items: { $ref: '#/components/schemas/MemoryBucket' } + page: { type: integer } + perPage: { type: integer } + total: { type: integer } + required: [items, page, perPage, total] + + EntityType: + type: string + enum: + - agent + - tool + - mcpServer + - workspaceConfiguration + - memoryBucket + AttachmentKind: + type: string + description: Relation type between entities + enum: + - agent_tool + - agent_memoryBucket + - agent_workspaceConfiguration + - agent_mcpServer + - mcpServer_workspaceConfiguration + Attachment: + allOf: + - $ref: '#/components/schemas/EntityMeta' + - type: object + properties: + kind: { $ref: '#/components/schemas/AttachmentKind' } + sourceType: { $ref: '#/components/schemas/EntityType' } + sourceId: { type: string, format: uuid } + targetType: { $ref: '#/components/schemas/EntityType' } + targetId: { type: string, format: uuid } + required: [kind, sourceType, sourceId, targetType, targetId] + AttachmentCreateRequest: + type: object + properties: + kind: { $ref: '#/components/schemas/AttachmentKind' } + sourceType: { $ref: '#/components/schemas/EntityType' } + sourceId: { type: string, format: uuid } + targetType: { $ref: '#/components/schemas/EntityType' } + targetId: { type: string, format: uuid } + required: [kind, sourceType, sourceId, targetType, targetId] + PaginatedAttachments: + type: object + properties: + items: + type: array + items: { $ref: '#/components/schemas/Attachment' } + page: { type: integer } + perPage: { type: integer } + total: { type: integer } + required: [items, page, perPage, total] From fbb5619edbae8250358b2766217b2594caebf929 Mon Sep 17 00:00:00 2001 From: Rowan Stein Date: Tue, 24 Feb 2026 16:05:04 +0000 Subject: [PATCH 02/10] refactor(team): split OpenAPI spec into multi-file layout (paths/components) and update root references --- .../team/components/parameters/IdPath.yaml | 6 + .../components/responses/ProblemResponse.yaml | 5 + openapi/team/components/schemas/Agent.yaml | 9 + .../team/components/schemas/AgentConfig.yaml | 17 + .../schemas/AgentCreateRequest.yaml | 7 + .../schemas/AgentUpdateRequest.yaml | 7 + .../team/components/schemas/Attachment.yaml | 10 + .../schemas/AttachmentCreateRequest.yaml | 8 + .../components/schemas/AttachmentKind.yaml | 8 + .../team/components/schemas/EntityMeta.yaml | 6 + .../team/components/schemas/EntityType.yaml | 7 + .../team/components/schemas/McpEnvItem.yaml | 5 + .../team/components/schemas/McpServer.yaml | 8 + .../components/schemas/McpServerConfig.yaml | 19 + .../schemas/McpServerCreateRequest.yaml | 6 + .../schemas/McpServerUpdateRequest.yaml | 6 + .../team/components/schemas/MemoryBucket.yaml | 7 + .../schemas/MemoryBucketConfig.yaml | 8 + .../schemas/MemoryBucketCreateRequest.yaml | 5 + .../schemas/MemoryBucketUpdateRequest.yaml | 5 + .../components/schemas/PaginatedAgents.yaml | 9 + .../schemas/PaginatedAttachments.yaml | 9 + .../schemas/PaginatedMcpServers.yaml | 9 + .../schemas/PaginatedMemoryBuckets.yaml | 9 + .../components/schemas/PaginatedTools.yaml | 9 + .../PaginatedWorkspaceConfigurations.yaml | 9 + .../team/components/schemas/Pagination.yaml | 6 + openapi/team/components/schemas/Problem.yaml | 8 + openapi/team/components/schemas/Tool.yaml | 9 + .../components/schemas/ToolCreateRequest.yaml | 7 + openapi/team/components/schemas/ToolType.yaml | 10 + .../components/schemas/ToolUpdateRequest.yaml | 6 + .../components/schemas/WorkspaceConfig.yaml | 21 + .../schemas/WorkspaceConfiguration.yaml | 7 + .../WorkspaceConfigurationCreateRequest.yaml | 5 + .../WorkspaceConfigurationUpdateRequest.yaml | 5 + .../components/schemas/WorkspaceEnvItem.yaml | 5 + .../components/schemas/WorkspacePlatform.yaml | 2 + .../schemas/WorkspaceVolumeConfig.yaml | 5 + openapi/team/openapi.yaml | 903 +----------------- openapi/team/paths/agent-by-id.yaml | 44 + openapi/team/paths/agents.yaml | 49 + openapi/team/paths/attachment-by-id.yaml | 10 + openapi/team/paths/attachments.yaml | 66 ++ openapi/team/paths/mcp-server-by-id.yaml | 44 + openapi/team/paths/mcp-servers.yaml | 44 + openapi/team/paths/memory-bucket-by-id.yaml | 44 + openapi/team/paths/memory-buckets.yaml | 44 + openapi/team/paths/tool-by-id.yaml | 44 + openapi/team/paths/tools.yaml | 49 + .../paths/workspace-configuration-by-id.yaml | 44 + .../team/paths/workspace-configurations.yaml | 44 + 52 files changed, 886 insertions(+), 852 deletions(-) create mode 100644 openapi/team/components/parameters/IdPath.yaml create mode 100644 openapi/team/components/responses/ProblemResponse.yaml create mode 100644 openapi/team/components/schemas/Agent.yaml create mode 100644 openapi/team/components/schemas/AgentConfig.yaml create mode 100644 openapi/team/components/schemas/AgentCreateRequest.yaml create mode 100644 openapi/team/components/schemas/AgentUpdateRequest.yaml create mode 100644 openapi/team/components/schemas/Attachment.yaml create mode 100644 openapi/team/components/schemas/AttachmentCreateRequest.yaml create mode 100644 openapi/team/components/schemas/AttachmentKind.yaml create mode 100644 openapi/team/components/schemas/EntityMeta.yaml create mode 100644 openapi/team/components/schemas/EntityType.yaml create mode 100644 openapi/team/components/schemas/McpEnvItem.yaml create mode 100644 openapi/team/components/schemas/McpServer.yaml create mode 100644 openapi/team/components/schemas/McpServerConfig.yaml create mode 100644 openapi/team/components/schemas/McpServerCreateRequest.yaml create mode 100644 openapi/team/components/schemas/McpServerUpdateRequest.yaml create mode 100644 openapi/team/components/schemas/MemoryBucket.yaml create mode 100644 openapi/team/components/schemas/MemoryBucketConfig.yaml create mode 100644 openapi/team/components/schemas/MemoryBucketCreateRequest.yaml create mode 100644 openapi/team/components/schemas/MemoryBucketUpdateRequest.yaml create mode 100644 openapi/team/components/schemas/PaginatedAgents.yaml create mode 100644 openapi/team/components/schemas/PaginatedAttachments.yaml create mode 100644 openapi/team/components/schemas/PaginatedMcpServers.yaml create mode 100644 openapi/team/components/schemas/PaginatedMemoryBuckets.yaml create mode 100644 openapi/team/components/schemas/PaginatedTools.yaml create mode 100644 openapi/team/components/schemas/PaginatedWorkspaceConfigurations.yaml create mode 100644 openapi/team/components/schemas/Pagination.yaml create mode 100644 openapi/team/components/schemas/Problem.yaml create mode 100644 openapi/team/components/schemas/Tool.yaml create mode 100644 openapi/team/components/schemas/ToolCreateRequest.yaml create mode 100644 openapi/team/components/schemas/ToolType.yaml create mode 100644 openapi/team/components/schemas/ToolUpdateRequest.yaml create mode 100644 openapi/team/components/schemas/WorkspaceConfig.yaml create mode 100644 openapi/team/components/schemas/WorkspaceConfiguration.yaml create mode 100644 openapi/team/components/schemas/WorkspaceConfigurationCreateRequest.yaml create mode 100644 openapi/team/components/schemas/WorkspaceConfigurationUpdateRequest.yaml create mode 100644 openapi/team/components/schemas/WorkspaceEnvItem.yaml create mode 100644 openapi/team/components/schemas/WorkspacePlatform.yaml create mode 100644 openapi/team/components/schemas/WorkspaceVolumeConfig.yaml create mode 100644 openapi/team/paths/agent-by-id.yaml create mode 100644 openapi/team/paths/agents.yaml create mode 100644 openapi/team/paths/attachment-by-id.yaml create mode 100644 openapi/team/paths/attachments.yaml create mode 100644 openapi/team/paths/mcp-server-by-id.yaml create mode 100644 openapi/team/paths/mcp-servers.yaml create mode 100644 openapi/team/paths/memory-bucket-by-id.yaml create mode 100644 openapi/team/paths/memory-buckets.yaml create mode 100644 openapi/team/paths/tool-by-id.yaml create mode 100644 openapi/team/paths/tools.yaml create mode 100644 openapi/team/paths/workspace-configuration-by-id.yaml create mode 100644 openapi/team/paths/workspace-configurations.yaml diff --git a/openapi/team/components/parameters/IdPath.yaml b/openapi/team/components/parameters/IdPath.yaml new file mode 100644 index 0000000..26f2028 --- /dev/null +++ b/openapi/team/components/parameters/IdPath.yaml @@ -0,0 +1,6 @@ +name: id +in: path +required: true +schema: + type: string + format: uuid diff --git a/openapi/team/components/responses/ProblemResponse.yaml b/openapi/team/components/responses/ProblemResponse.yaml new file mode 100644 index 0000000..0a98c5a --- /dev/null +++ b/openapi/team/components/responses/ProblemResponse.yaml @@ -0,0 +1,5 @@ +description: RFC 7807 problem response +content: + application/problem+json: + schema: + $ref: '../schemas/Problem.yaml' diff --git a/openapi/team/components/schemas/Agent.yaml b/openapi/team/components/schemas/Agent.yaml new file mode 100644 index 0000000..23dafb6 --- /dev/null +++ b/openapi/team/components/schemas/Agent.yaml @@ -0,0 +1,9 @@ +allOf: + - $ref: './EntityMeta.yaml' + - type: object + properties: + title: { type: string } + name: { type: string } + role: { type: string } + config: { $ref: './AgentConfig.yaml' } + required: [config] diff --git a/openapi/team/components/schemas/AgentConfig.yaml b/openapi/team/components/schemas/AgentConfig.yaml new file mode 100644 index 0000000..5d14986 --- /dev/null +++ b/openapi/team/components/schemas/AgentConfig.yaml @@ -0,0 +1,17 @@ +type: object +properties: + model: { type: string, default: 'gpt-5' } + systemPrompt: { type: string, default: 'You are a helpful AI assistant.' } + debounceMs: { type: integer, minimum: 0, default: 0 } + whenBusy: { type: string, enum: ['wait', 'injectAfterTools'], default: 'wait' } + processBuffer: { type: string, enum: ['allTogether', 'oneByOne'], default: 'allTogether' } + sendFinalResponseToThread: { type: boolean, default: true } + summarizationKeepTokens: { type: integer, minimum: 0, default: 0 } + summarizationMaxTokens: { type: integer, minimum: 1, default: 512 } + restrictOutput: { type: boolean, default: false } + restrictionMessage: { type: string, default: "Do not produce a final answer directly. Before finishing, call a tool. If no tool is needed, call the 'finish' tool." } + restrictionMaxInjections: { type: integer, minimum: 0, default: 0 } + title: { type: string } + name: { type: string } + role: { type: string } +additionalProperties: false diff --git a/openapi/team/components/schemas/AgentCreateRequest.yaml b/openapi/team/components/schemas/AgentCreateRequest.yaml new file mode 100644 index 0000000..68ee738 --- /dev/null +++ b/openapi/team/components/schemas/AgentCreateRequest.yaml @@ -0,0 +1,7 @@ +type: object +properties: + title: { type: string } + name: { type: string } + role: { type: string } + config: { $ref: './AgentConfig.yaml' } +required: [config] diff --git a/openapi/team/components/schemas/AgentUpdateRequest.yaml b/openapi/team/components/schemas/AgentUpdateRequest.yaml new file mode 100644 index 0000000..fa9af61 --- /dev/null +++ b/openapi/team/components/schemas/AgentUpdateRequest.yaml @@ -0,0 +1,7 @@ +type: object +properties: + title: { type: string } + name: { type: string } + role: { type: string } + config: { $ref: './AgentConfig.yaml' } +additionalProperties: false diff --git a/openapi/team/components/schemas/Attachment.yaml b/openapi/team/components/schemas/Attachment.yaml new file mode 100644 index 0000000..967cf37 --- /dev/null +++ b/openapi/team/components/schemas/Attachment.yaml @@ -0,0 +1,10 @@ +allOf: + - $ref: './EntityMeta.yaml' + - type: object + properties: + kind: { $ref: './AttachmentKind.yaml' } + sourceType: { $ref: './EntityType.yaml' } + sourceId: { type: string, format: uuid } + targetType: { $ref: './EntityType.yaml' } + targetId: { type: string, format: uuid } + required: [kind, sourceType, sourceId, targetType, targetId] diff --git a/openapi/team/components/schemas/AttachmentCreateRequest.yaml b/openapi/team/components/schemas/AttachmentCreateRequest.yaml new file mode 100644 index 0000000..6d21240 --- /dev/null +++ b/openapi/team/components/schemas/AttachmentCreateRequest.yaml @@ -0,0 +1,8 @@ +type: object +properties: + kind: { $ref: './AttachmentKind.yaml' } + sourceType: { $ref: './EntityType.yaml' } + sourceId: { type: string, format: uuid } + targetType: { $ref: './EntityType.yaml' } + targetId: { type: string, format: uuid } +required: [kind, sourceType, sourceId, targetType, targetId] diff --git a/openapi/team/components/schemas/AttachmentKind.yaml b/openapi/team/components/schemas/AttachmentKind.yaml new file mode 100644 index 0000000..db4785c --- /dev/null +++ b/openapi/team/components/schemas/AttachmentKind.yaml @@ -0,0 +1,8 @@ +type: string +description: Relation type between entities +enum: + - agent_tool + - agent_memoryBucket + - agent_workspaceConfiguration + - agent_mcpServer + - mcpServer_workspaceConfiguration diff --git a/openapi/team/components/schemas/EntityMeta.yaml b/openapi/team/components/schemas/EntityMeta.yaml new file mode 100644 index 0000000..7769ea1 --- /dev/null +++ b/openapi/team/components/schemas/EntityMeta.yaml @@ -0,0 +1,6 @@ +type: object +properties: + id: { type: string, format: uuid } + createdAt: { type: string, format: date-time } + updatedAt: { type: string, format: date-time } +required: [id, createdAt] diff --git a/openapi/team/components/schemas/EntityType.yaml b/openapi/team/components/schemas/EntityType.yaml new file mode 100644 index 0000000..3c919a1 --- /dev/null +++ b/openapi/team/components/schemas/EntityType.yaml @@ -0,0 +1,7 @@ +type: string +enum: + - agent + - tool + - mcpServer + - workspaceConfiguration + - memoryBucket diff --git a/openapi/team/components/schemas/McpEnvItem.yaml b/openapi/team/components/schemas/McpEnvItem.yaml new file mode 100644 index 0000000..c8e84d6 --- /dev/null +++ b/openapi/team/components/schemas/McpEnvItem.yaml @@ -0,0 +1,5 @@ +type: object +properties: + name: { type: string } + value: { type: string } +required: [name, value] diff --git a/openapi/team/components/schemas/McpServer.yaml b/openapi/team/components/schemas/McpServer.yaml new file mode 100644 index 0000000..ac31bf4 --- /dev/null +++ b/openapi/team/components/schemas/McpServer.yaml @@ -0,0 +1,8 @@ +allOf: + - $ref: './EntityMeta.yaml' + - type: object + properties: + title: { type: string } + namespace: { type: string } + config: { $ref: './McpServerConfig.yaml' } + required: [config] diff --git a/openapi/team/components/schemas/McpServerConfig.yaml b/openapi/team/components/schemas/McpServerConfig.yaml new file mode 100644 index 0000000..c096808 --- /dev/null +++ b/openapi/team/components/schemas/McpServerConfig.yaml @@ -0,0 +1,19 @@ +type: object +properties: + namespace: { type: string } + command: { type: string } + workdir: { type: string } + env: + type: array + items: { $ref: './McpEnvItem.yaml' } + requestTimeoutMs: { type: integer, minimum: 1 } + startupTimeoutMs: { type: integer, minimum: 1 } + heartbeatIntervalMs: { type: integer, minimum: 1 } + staleTimeoutMs: { type: integer, minimum: 0 } + restart: + type: object + properties: + maxAttempts: { type: integer, minimum: 1, default: 5 } + backoffMs: { type: integer, minimum: 1, default: 2000 } + additionalProperties: false +additionalProperties: false diff --git a/openapi/team/components/schemas/McpServerCreateRequest.yaml b/openapi/team/components/schemas/McpServerCreateRequest.yaml new file mode 100644 index 0000000..6812337 --- /dev/null +++ b/openapi/team/components/schemas/McpServerCreateRequest.yaml @@ -0,0 +1,6 @@ +type: object +properties: + title: { type: string } + namespace: { type: string } + config: { $ref: './McpServerConfig.yaml' } +required: [config] diff --git a/openapi/team/components/schemas/McpServerUpdateRequest.yaml b/openapi/team/components/schemas/McpServerUpdateRequest.yaml new file mode 100644 index 0000000..b848df5 --- /dev/null +++ b/openapi/team/components/schemas/McpServerUpdateRequest.yaml @@ -0,0 +1,6 @@ +type: object +properties: + title: { type: string } + namespace: { type: string } + config: { $ref: './McpServerConfig.yaml' } +additionalProperties: false diff --git a/openapi/team/components/schemas/MemoryBucket.yaml b/openapi/team/components/schemas/MemoryBucket.yaml new file mode 100644 index 0000000..cec6ba0 --- /dev/null +++ b/openapi/team/components/schemas/MemoryBucket.yaml @@ -0,0 +1,7 @@ +allOf: + - $ref: './EntityMeta.yaml' + - type: object + properties: + title: { type: string } + config: { $ref: './MemoryBucketConfig.yaml' } + required: [config] diff --git a/openapi/team/components/schemas/MemoryBucketConfig.yaml b/openapi/team/components/schemas/MemoryBucketConfig.yaml new file mode 100644 index 0000000..55d66be --- /dev/null +++ b/openapi/team/components/schemas/MemoryBucketConfig.yaml @@ -0,0 +1,8 @@ +type: object +properties: + scope: + type: string + enum: [global, perThread] + default: global + collectionPrefix: { type: string } +additionalProperties: false diff --git a/openapi/team/components/schemas/MemoryBucketCreateRequest.yaml b/openapi/team/components/schemas/MemoryBucketCreateRequest.yaml new file mode 100644 index 0000000..5973d6e --- /dev/null +++ b/openapi/team/components/schemas/MemoryBucketCreateRequest.yaml @@ -0,0 +1,5 @@ +type: object +properties: + title: { type: string } + config: { $ref: './MemoryBucketConfig.yaml' } +required: [config] diff --git a/openapi/team/components/schemas/MemoryBucketUpdateRequest.yaml b/openapi/team/components/schemas/MemoryBucketUpdateRequest.yaml new file mode 100644 index 0000000..230deda --- /dev/null +++ b/openapi/team/components/schemas/MemoryBucketUpdateRequest.yaml @@ -0,0 +1,5 @@ +type: object +properties: + title: { type: string } + config: { $ref: './MemoryBucketConfig.yaml' } +additionalProperties: false diff --git a/openapi/team/components/schemas/PaginatedAgents.yaml b/openapi/team/components/schemas/PaginatedAgents.yaml new file mode 100644 index 0000000..940abd0 --- /dev/null +++ b/openapi/team/components/schemas/PaginatedAgents.yaml @@ -0,0 +1,9 @@ +type: object +properties: + items: + type: array + items: { $ref: './Agent.yaml' } + page: { type: integer } + perPage: { type: integer } + total: { type: integer } +required: [items, page, perPage, total] diff --git a/openapi/team/components/schemas/PaginatedAttachments.yaml b/openapi/team/components/schemas/PaginatedAttachments.yaml new file mode 100644 index 0000000..f9a4269 --- /dev/null +++ b/openapi/team/components/schemas/PaginatedAttachments.yaml @@ -0,0 +1,9 @@ +type: object +properties: + items: + type: array + items: { $ref: './Attachment.yaml' } + page: { type: integer } + perPage: { type: integer } + total: { type: integer } +required: [items, page, perPage, total] diff --git a/openapi/team/components/schemas/PaginatedMcpServers.yaml b/openapi/team/components/schemas/PaginatedMcpServers.yaml new file mode 100644 index 0000000..cc1bdd2 --- /dev/null +++ b/openapi/team/components/schemas/PaginatedMcpServers.yaml @@ -0,0 +1,9 @@ +type: object +properties: + items: + type: array + items: { $ref: './McpServer.yaml' } + page: { type: integer } + perPage: { type: integer } + total: { type: integer } +required: [items, page, perPage, total] diff --git a/openapi/team/components/schemas/PaginatedMemoryBuckets.yaml b/openapi/team/components/schemas/PaginatedMemoryBuckets.yaml new file mode 100644 index 0000000..feb04d0 --- /dev/null +++ b/openapi/team/components/schemas/PaginatedMemoryBuckets.yaml @@ -0,0 +1,9 @@ +type: object +properties: + items: + type: array + items: { $ref: './MemoryBucket.yaml' } + page: { type: integer } + perPage: { type: integer } + total: { type: integer } +required: [items, page, perPage, total] diff --git a/openapi/team/components/schemas/PaginatedTools.yaml b/openapi/team/components/schemas/PaginatedTools.yaml new file mode 100644 index 0000000..02fa226 --- /dev/null +++ b/openapi/team/components/schemas/PaginatedTools.yaml @@ -0,0 +1,9 @@ +type: object +properties: + items: + type: array + items: { $ref: './Tool.yaml' } + page: { type: integer } + perPage: { type: integer } + total: { type: integer } +required: [items, page, perPage, total] diff --git a/openapi/team/components/schemas/PaginatedWorkspaceConfigurations.yaml b/openapi/team/components/schemas/PaginatedWorkspaceConfigurations.yaml new file mode 100644 index 0000000..80e8f9d --- /dev/null +++ b/openapi/team/components/schemas/PaginatedWorkspaceConfigurations.yaml @@ -0,0 +1,9 @@ +type: object +properties: + items: + type: array + items: { $ref: './WorkspaceConfiguration.yaml' } + page: { type: integer } + perPage: { type: integer } + total: { type: integer } +required: [items, page, perPage, total] diff --git a/openapi/team/components/schemas/Pagination.yaml b/openapi/team/components/schemas/Pagination.yaml new file mode 100644 index 0000000..82421f7 --- /dev/null +++ b/openapi/team/components/schemas/Pagination.yaml @@ -0,0 +1,6 @@ +type: object +properties: + page: { type: integer, minimum: 1 } + perPage: { type: integer, minimum: 1 } + total: { type: integer, minimum: 0 } +required: [page, perPage, total] diff --git a/openapi/team/components/schemas/Problem.yaml b/openapi/team/components/schemas/Problem.yaml new file mode 100644 index 0000000..ef475b1 --- /dev/null +++ b/openapi/team/components/schemas/Problem.yaml @@ -0,0 +1,8 @@ +type: object +properties: + type: { type: string, format: uri } + title: { type: string } + status: { type: integer } + detail: { type: string } + instance: { type: string, format: uri } +required: [title, status] diff --git a/openapi/team/components/schemas/Tool.yaml b/openapi/team/components/schemas/Tool.yaml new file mode 100644 index 0000000..693ccf3 --- /dev/null +++ b/openapi/team/components/schemas/Tool.yaml @@ -0,0 +1,9 @@ +allOf: + - $ref: './EntityMeta.yaml' + - type: object + properties: + type: { $ref: './ToolType.yaml' } + name: { type: string } + description: { type: string } + config: { type: object } + required: [type] diff --git a/openapi/team/components/schemas/ToolCreateRequest.yaml b/openapi/team/components/schemas/ToolCreateRequest.yaml new file mode 100644 index 0000000..7407ecb --- /dev/null +++ b/openapi/team/components/schemas/ToolCreateRequest.yaml @@ -0,0 +1,7 @@ +type: object +properties: + type: { $ref: './ToolType.yaml' } + name: { type: string } + description: { type: string } + config: { type: object } +required: [type] diff --git a/openapi/team/components/schemas/ToolType.yaml b/openapi/team/components/schemas/ToolType.yaml new file mode 100644 index 0000000..4711af7 --- /dev/null +++ b/openapi/team/components/schemas/ToolType.yaml @@ -0,0 +1,10 @@ +type: string +enum: + - manage + - memory + - shell_command + - send_message + - send_slack_message + - remind_me + - github_clone_repo + - call_agent diff --git a/openapi/team/components/schemas/ToolUpdateRequest.yaml b/openapi/team/components/schemas/ToolUpdateRequest.yaml new file mode 100644 index 0000000..9746958 --- /dev/null +++ b/openapi/team/components/schemas/ToolUpdateRequest.yaml @@ -0,0 +1,6 @@ +type: object +properties: + name: { type: string } + description: { type: string } + config: { type: object } +additionalProperties: false diff --git a/openapi/team/components/schemas/WorkspaceConfig.yaml b/openapi/team/components/schemas/WorkspaceConfig.yaml new file mode 100644 index 0000000..cdc5e25 --- /dev/null +++ b/openapi/team/components/schemas/WorkspaceConfig.yaml @@ -0,0 +1,21 @@ +type: object +properties: + image: { type: string } + env: + type: array + items: { $ref: './WorkspaceEnvItem.yaml' } + initialScript: { type: string } + cpu_limit: + oneOf: + - { type: number } + - { type: string } + memory_limit: + oneOf: + - { type: number } + - { type: string } + platform: { $ref: './WorkspacePlatform.yaml' } + enableDinD: { type: boolean, default: false } + ttlSeconds: { type: integer, minimum: 0, default: 86400 } + nix: { type: object } + volumes: { $ref: './WorkspaceVolumeConfig.yaml' } +additionalProperties: false diff --git a/openapi/team/components/schemas/WorkspaceConfiguration.yaml b/openapi/team/components/schemas/WorkspaceConfiguration.yaml new file mode 100644 index 0000000..64b0391 --- /dev/null +++ b/openapi/team/components/schemas/WorkspaceConfiguration.yaml @@ -0,0 +1,7 @@ +allOf: + - $ref: './EntityMeta.yaml' + - type: object + properties: + title: { type: string } + config: { $ref: './WorkspaceConfig.yaml' } + required: [config] diff --git a/openapi/team/components/schemas/WorkspaceConfigurationCreateRequest.yaml b/openapi/team/components/schemas/WorkspaceConfigurationCreateRequest.yaml new file mode 100644 index 0000000..953fa17 --- /dev/null +++ b/openapi/team/components/schemas/WorkspaceConfigurationCreateRequest.yaml @@ -0,0 +1,5 @@ +type: object +properties: + title: { type: string } + config: { $ref: './WorkspaceConfig.yaml' } +required: [config] diff --git a/openapi/team/components/schemas/WorkspaceConfigurationUpdateRequest.yaml b/openapi/team/components/schemas/WorkspaceConfigurationUpdateRequest.yaml new file mode 100644 index 0000000..dfb826a --- /dev/null +++ b/openapi/team/components/schemas/WorkspaceConfigurationUpdateRequest.yaml @@ -0,0 +1,5 @@ +type: object +properties: + title: { type: string } + config: { $ref: './WorkspaceConfig.yaml' } +additionalProperties: false diff --git a/openapi/team/components/schemas/WorkspaceEnvItem.yaml b/openapi/team/components/schemas/WorkspaceEnvItem.yaml new file mode 100644 index 0000000..c8e84d6 --- /dev/null +++ b/openapi/team/components/schemas/WorkspaceEnvItem.yaml @@ -0,0 +1,5 @@ +type: object +properties: + name: { type: string } + value: { type: string } +required: [name, value] diff --git a/openapi/team/components/schemas/WorkspacePlatform.yaml b/openapi/team/components/schemas/WorkspacePlatform.yaml new file mode 100644 index 0000000..a0f62dc --- /dev/null +++ b/openapi/team/components/schemas/WorkspacePlatform.yaml @@ -0,0 +1,2 @@ +type: string +enum: [linux/amd64, linux/arm64, auto] diff --git a/openapi/team/components/schemas/WorkspaceVolumeConfig.yaml b/openapi/team/components/schemas/WorkspaceVolumeConfig.yaml new file mode 100644 index 0000000..d43c93a --- /dev/null +++ b/openapi/team/components/schemas/WorkspaceVolumeConfig.yaml @@ -0,0 +1,5 @@ +type: object +properties: + enabled: { type: boolean, default: false } + mountPath: { type: string, pattern: '^/' } +additionalProperties: false diff --git a/openapi/team/openapi.yaml b/openapi/team/openapi.yaml index d6c6e1a..2a8c68d 100644 --- a/openapi/team/openapi.yaml +++ b/openapi/team/openapi.yaml @@ -2,13 +2,8 @@ openapi: 3.0.3 info: title: Team Management API version: 0.1.0 - description: | - Schema-first REST API for managing team entities in Agyn Platform. - Entities: Agents, Tools, MCP Servers, WorkspaceConfiguration, MemoryBucket. - Relations are modeled as Attachments between entities. servers: - url: https://api.example.com - description: Placeholder base URL tags: - name: Agents - name: Tools @@ -18,904 +13,108 @@ tags: - name: Attachments paths: /agents: - get: - tags: [Agents] - summary: List agents - parameters: - - in: query - name: q - schema: - type: string - description: Free-text search (name/role). - - in: query - name: page - schema: - type: integer - minimum: 1 - default: 1 - - in: query - name: perPage - schema: - type: integer - minimum: 1 - maximum: 100 - default: 20 - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/PaginatedAgents' - default: - $ref: '#/components/responses/ProblemResponse' - post: - tags: [Agents] - summary: Create agent - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/AgentCreateRequest' - responses: - '201': - description: Created - content: - application/json: - schema: - $ref: '#/components/schemas/Agent' - default: - $ref: '#/components/responses/ProblemResponse' + $ref: './paths/agents.yaml' /agents/{id}: - get: - tags: [Agents] - summary: Get agent by ID - parameters: - - $ref: '#/components/parameters/IdPath' - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/Agent' - default: - $ref: '#/components/responses/ProblemResponse' - patch: - tags: [Agents] - summary: Update agent (partial) - parameters: - - $ref: '#/components/parameters/IdPath' - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/AgentUpdateRequest' - responses: - '200': - description: Updated - content: - application/json: - schema: - $ref: '#/components/schemas/Agent' - default: - $ref: '#/components/responses/ProblemResponse' - delete: - tags: [Agents] - summary: Delete agent - parameters: - - $ref: '#/components/parameters/IdPath' - responses: - '204': - description: No Content - default: - $ref: '#/components/responses/ProblemResponse' - + $ref: './paths/agent-by-id.yaml' /tools: - get: - tags: [Tools] - summary: List tools - parameters: - - in: query - name: type - schema: - $ref: '#/components/schemas/ToolType' - description: Filter by tool type - - in: query - name: page - schema: - type: integer - minimum: 1 - default: 1 - - in: query - name: perPage - schema: - type: integer - minimum: 1 - maximum: 100 - default: 20 - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/PaginatedTools' - default: - $ref: '#/components/responses/ProblemResponse' - post: - tags: [Tools] - summary: Create tool - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ToolCreateRequest' - responses: - '201': - description: Created - content: - application/json: - schema: - $ref: '#/components/schemas/Tool' - default: - $ref: '#/components/responses/ProblemResponse' + $ref: './paths/tools.yaml' /tools/{id}: - get: - tags: [Tools] - summary: Get tool by ID - parameters: - - $ref: '#/components/parameters/IdPath' - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/Tool' - default: - $ref: '#/components/responses/ProblemResponse' - patch: - tags: [Tools] - summary: Update tool (partial) - parameters: - - $ref: '#/components/parameters/IdPath' - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ToolUpdateRequest' - responses: - '200': - description: Updated - content: - application/json: - schema: - $ref: '#/components/schemas/Tool' - default: - $ref: '#/components/responses/ProblemResponse' - delete: - tags: [Tools] - summary: Delete tool - parameters: - - $ref: '#/components/parameters/IdPath' - responses: - '204': - description: No Content - default: - $ref: '#/components/responses/ProblemResponse' - + $ref: './paths/tool-by-id.yaml' /mcp-servers: - get: - tags: [MCP Servers] - summary: List MCP servers - parameters: - - in: query - name: page - schema: - type: integer - minimum: 1 - default: 1 - - in: query - name: perPage - schema: - type: integer - minimum: 1 - maximum: 100 - default: 20 - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/PaginatedMcpServers' - default: - $ref: '#/components/responses/ProblemResponse' - post: - tags: [MCP Servers] - summary: Create MCP server - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/McpServerCreateRequest' - responses: - '201': - description: Created - content: - application/json: - schema: - $ref: '#/components/schemas/McpServer' - default: - $ref: '#/components/responses/ProblemResponse' + $ref: './paths/mcp-servers.yaml' /mcp-servers/{id}: - get: - tags: [MCP Servers] - summary: Get MCP server by ID - parameters: - - $ref: '#/components/parameters/IdPath' - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/McpServer' - default: - $ref: '#/components/responses/ProblemResponse' - patch: - tags: [MCP Servers] - summary: Update MCP server (partial) - parameters: - - $ref: '#/components/parameters/IdPath' - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/McpServerUpdateRequest' - responses: - '200': - description: Updated - content: - application/json: - schema: - $ref: '#/components/schemas/McpServer' - default: - $ref: '#/components/responses/ProblemResponse' - delete: - tags: [MCP Servers] - summary: Delete MCP server - parameters: - - $ref: '#/components/parameters/IdPath' - responses: - '204': - description: No Content - default: - $ref: '#/components/responses/ProblemResponse' - + $ref: './paths/mcp-server-by-id.yaml' /workspace-configurations: - get: - tags: [WorkspaceConfigurations] - summary: List workspace configurations - parameters: - - in: query - name: page - schema: - type: integer - minimum: 1 - default: 1 - - in: query - name: perPage - schema: - type: integer - minimum: 1 - maximum: 100 - default: 20 - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/PaginatedWorkspaceConfigurations' - default: - $ref: '#/components/responses/ProblemResponse' - post: - tags: [WorkspaceConfigurations] - summary: Create workspace configuration - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/WorkspaceConfigurationCreateRequest' - responses: - '201': - description: Created - content: - application/json: - schema: - $ref: '#/components/schemas/WorkspaceConfiguration' - default: - $ref: '#/components/responses/ProblemResponse' + $ref: './paths/workspace-configurations.yaml' /workspace-configurations/{id}: - get: - tags: [WorkspaceConfigurations] - summary: Get workspace configuration by ID - parameters: - - $ref: '#/components/parameters/IdPath' - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/WorkspaceConfiguration' - default: - $ref: '#/components/responses/ProblemResponse' - patch: - tags: [WorkspaceConfigurations] - summary: Update workspace configuration (partial) - parameters: - - $ref: '#/components/parameters/IdPath' - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/WorkspaceConfigurationUpdateRequest' - responses: - '200': - description: Updated - content: - application/json: - schema: - $ref: '#/components/schemas/WorkspaceConfiguration' - default: - $ref: '#/components/responses/ProblemResponse' - delete: - tags: [WorkspaceConfigurations] - summary: Delete workspace configuration - parameters: - - $ref: '#/components/parameters/IdPath' - responses: - '204': - description: No Content - default: - $ref: '#/components/responses/ProblemResponse' - + $ref: './paths/workspace-configuration-by-id.yaml' /memory-buckets: - get: - tags: [MemoryBuckets] - summary: List memory buckets - parameters: - - in: query - name: page - schema: - type: integer - minimum: 1 - default: 1 - - in: query - name: perPage - schema: - type: integer - minimum: 1 - maximum: 100 - default: 20 - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/PaginatedMemoryBuckets' - default: - $ref: '#/components/responses/ProblemResponse' - post: - tags: [MemoryBuckets] - summary: Create memory bucket - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/MemoryBucketCreateRequest' - responses: - '201': - description: Created - content: - application/json: - schema: - $ref: '#/components/schemas/MemoryBucket' - default: - $ref: '#/components/responses/ProblemResponse' + $ref: './paths/memory-buckets.yaml' /memory-buckets/{id}: - get: - tags: [MemoryBuckets] - summary: Get memory bucket by ID - parameters: - - $ref: '#/components/parameters/IdPath' - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/MemoryBucket' - default: - $ref: '#/components/responses/ProblemResponse' - patch: - tags: [MemoryBuckets] - summary: Update memory bucket (partial) - parameters: - - $ref: '#/components/parameters/IdPath' - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/MemoryBucketUpdateRequest' - responses: - '200': - description: Updated - content: - application/json: - schema: - $ref: '#/components/schemas/MemoryBucket' - default: - $ref: '#/components/responses/ProblemResponse' - delete: - tags: [MemoryBuckets] - summary: Delete memory bucket - parameters: - - $ref: '#/components/parameters/IdPath' - responses: - '204': - description: No Content - default: - $ref: '#/components/responses/ProblemResponse' - + $ref: './paths/memory-bucket-by-id.yaml' /attachments: - get: - tags: [Attachments] - summary: List attachments - parameters: - - in: query - name: sourceType - schema: - $ref: '#/components/schemas/EntityType' - - in: query - name: sourceId - schema: - type: string - format: uuid - - in: query - name: targetType - schema: - $ref: '#/components/schemas/EntityType' - - in: query - name: targetId - schema: - type: string - format: uuid - - in: query - name: kind - schema: - $ref: '#/components/schemas/AttachmentKind' - - in: query - name: page - schema: - type: integer - minimum: 1 - default: 1 - - in: query - name: perPage - schema: - type: integer - minimum: 1 - maximum: 100 - default: 20 - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/PaginatedAttachments' - default: - $ref: '#/components/responses/ProblemResponse' - post: - tags: [Attachments] - summary: Create attachment (relation) - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/AttachmentCreateRequest' - responses: - '201': - description: Created - content: - application/json: - schema: - $ref: '#/components/schemas/Attachment' - default: - $ref: '#/components/responses/ProblemResponse' + $ref: './paths/attachments.yaml' /attachments/{id}: - delete: - tags: [Attachments] - summary: Delete attachment - parameters: - - $ref: '#/components/parameters/IdPath' - responses: - '204': - description: No Content - default: - $ref: '#/components/responses/ProblemResponse' - + $ref: './paths/attachment-by-id.yaml' components: parameters: IdPath: - name: id - in: path - required: true - schema: - type: string - format: uuid + $ref: './components/parameters/IdPath.yaml' responses: ProblemResponse: - description: RFC 7807 problem response - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Problem' + $ref: './components/responses/ProblemResponse.yaml' schemas: Problem: - type: object - properties: - type: { type: string, format: uri } - title: { type: string } - status: { type: integer } - detail: { type: string } - instance: { type: string, format: uri } - required: [title, status] + $ref: './components/schemas/Problem.yaml' Pagination: - type: object - properties: - page: { type: integer, minimum: 1 } - perPage: { type: integer, minimum: 1 } - total: { type: integer, minimum: 0 } - required: [page, perPage, total] + $ref: './components/schemas/Pagination.yaml' EntityMeta: - type: object - properties: - id: { type: string, format: uuid } - createdAt: { type: string, format: date-time } - updatedAt: { type: string, format: date-time } - required: [id, createdAt] - + $ref: './components/schemas/EntityMeta.yaml' Agent: - allOf: - - $ref: '#/components/schemas/EntityMeta' - - type: object - properties: - title: { type: string } - name: { type: string } - role: { type: string } - config: { $ref: '#/components/schemas/AgentConfig' } - required: [config] + $ref: './components/schemas/Agent.yaml' AgentConfig: - type: object - properties: - model: { type: string, default: 'gpt-5' } - systemPrompt: { type: string, default: 'You are a helpful AI assistant.' } - debounceMs: { type: integer, minimum: 0, default: 0 } - whenBusy: { type: string, enum: ['wait', 'injectAfterTools'], default: 'wait' } - processBuffer: { type: string, enum: ['allTogether', 'oneByOne'], default: 'allTogether' } - sendFinalResponseToThread: { type: boolean, default: true } - summarizationKeepTokens: { type: integer, minimum: 0, default: 0 } - summarizationMaxTokens: { type: integer, minimum: 1, default: 512 } - restrictOutput: { type: boolean, default: false } - restrictionMessage: { type: string, default: "Do not produce a final answer directly. Before finishing, call a tool. If no tool is needed, call the 'finish' tool." } - restrictionMaxInjections: { type: integer, minimum: 0, default: 0 } - title: { type: string } - name: { type: string } - role: { type: string } - additionalProperties: false + $ref: './components/schemas/AgentConfig.yaml' AgentCreateRequest: - type: object - properties: - title: { type: string } - name: { type: string } - role: { type: string } - config: { $ref: '#/components/schemas/AgentConfig' } - required: [config] + $ref: './components/schemas/AgentCreateRequest.yaml' AgentUpdateRequest: - type: object - properties: - title: { type: string } - name: { type: string } - role: { type: string } - config: { $ref: '#/components/schemas/AgentConfig' } - additionalProperties: false + $ref: './components/schemas/AgentUpdateRequest.yaml' PaginatedAgents: - type: object - properties: - items: - type: array - items: { $ref: '#/components/schemas/Agent' } - page: { type: integer } - perPage: { type: integer } - total: { type: integer } - required: [items, page, perPage, total] - + $ref: './components/schemas/PaginatedAgents.yaml' Tool: - allOf: - - $ref: '#/components/schemas/EntityMeta' - - type: object - properties: - type: { $ref: '#/components/schemas/ToolType' } - name: { type: string } - description: { type: string } - config: { type: object } - required: [type] + $ref: './components/schemas/Tool.yaml' ToolType: - type: string - enum: - - manage - - memory - - shell_command - - send_message - - send_slack_message - - remind_me - - github_clone_repo - - call_agent + $ref: './components/schemas/ToolType.yaml' ToolCreateRequest: - type: object - properties: - type: { $ref: '#/components/schemas/ToolType' } - name: { type: string } - description: { type: string } - config: { type: object } - required: [type] + $ref: './components/schemas/ToolCreateRequest.yaml' ToolUpdateRequest: - type: object - properties: - name: { type: string } - description: { type: string } - config: { type: object } - additionalProperties: false + $ref: './components/schemas/ToolUpdateRequest.yaml' PaginatedTools: - type: object - properties: - items: - type: array - items: { $ref: '#/components/schemas/Tool' } - page: { type: integer } - perPage: { type: integer } - total: { type: integer } - required: [items, page, perPage, total] - + $ref: './components/schemas/PaginatedTools.yaml' McpServer: - allOf: - - $ref: '#/components/schemas/EntityMeta' - - type: object - properties: - title: { type: string } - namespace: { type: string } - config: { $ref: '#/components/schemas/McpServerConfig' } - required: [config] + $ref: './components/schemas/McpServer.yaml' McpEnvItem: - type: object - properties: - name: { type: string } - value: { type: string } - required: [name, value] + $ref: './components/schemas/McpEnvItem.yaml' McpServerConfig: - type: object - properties: - namespace: { type: string } - command: { type: string } - workdir: { type: string } - env: - type: array - items: { $ref: '#/components/schemas/McpEnvItem' } - requestTimeoutMs: { type: integer, minimum: 1 } - startupTimeoutMs: { type: integer, minimum: 1 } - heartbeatIntervalMs: { type: integer, minimum: 1 } - staleTimeoutMs: { type: integer, minimum: 0 } - restart: - type: object - properties: - maxAttempts: { type: integer, minimum: 1, default: 5 } - backoffMs: { type: integer, minimum: 1, default: 2000 } - additionalProperties: false - additionalProperties: false + $ref: './components/schemas/McpServerConfig.yaml' McpServerCreateRequest: - type: object - properties: - title: { type: string } - namespace: { type: string } - config: { $ref: '#/components/schemas/McpServerConfig' } - required: [config] + $ref: './components/schemas/McpServerCreateRequest.yaml' McpServerUpdateRequest: - type: object - properties: - title: { type: string } - namespace: { type: string } - config: { $ref: '#/components/schemas/McpServerConfig' } - additionalProperties: false + $ref: './components/schemas/McpServerUpdateRequest.yaml' PaginatedMcpServers: - type: object - properties: - items: - type: array - items: { $ref: '#/components/schemas/McpServer' } - page: { type: integer } - perPage: { type: integer } - total: { type: integer } - required: [items, page, perPage, total] - + $ref: './components/schemas/PaginatedMcpServers.yaml' WorkspaceConfiguration: - allOf: - - $ref: '#/components/schemas/EntityMeta' - - type: object - properties: - title: { type: string } - config: { $ref: '#/components/schemas/WorkspaceConfig' } - required: [config] + $ref: './components/schemas/WorkspaceConfiguration.yaml' WorkspaceEnvItem: - type: object - properties: - name: { type: string } - value: { type: string } - required: [name, value] + $ref: './components/schemas/WorkspaceEnvItem.yaml' WorkspaceVolumeConfig: - type: object - properties: - enabled: { type: boolean, default: false } - mountPath: { type: string, pattern: '^/' } - additionalProperties: false + $ref: './components/schemas/WorkspaceVolumeConfig.yaml' WorkspacePlatform: - type: string - enum: [linux/amd64, linux/arm64, auto] + $ref: './components/schemas/WorkspacePlatform.yaml' WorkspaceConfig: - type: object - properties: - image: { type: string } - env: - type: array - items: { $ref: '#/components/schemas/WorkspaceEnvItem' } - initialScript: { type: string } - cpu_limit: - oneOf: - - { type: number } - - { type: string } - memory_limit: - oneOf: - - { type: number } - - { type: string } - platform: { $ref: '#/components/schemas/WorkspacePlatform' } - enableDinD: { type: boolean, default: false } - ttlSeconds: { type: integer, minimum: 0, default: 86400 } - nix: { type: object } - volumes: { $ref: '#/components/schemas/WorkspaceVolumeConfig' } - additionalProperties: false + $ref: './components/schemas/WorkspaceConfig.yaml' WorkspaceConfigurationCreateRequest: - type: object - properties: - title: { type: string } - config: { $ref: '#/components/schemas/WorkspaceConfig' } - required: [config] + $ref: './components/schemas/WorkspaceConfigurationCreateRequest.yaml' WorkspaceConfigurationUpdateRequest: - type: object - properties: - title: { type: string } - config: { $ref: '#/components/schemas/WorkspaceConfig' } - additionalProperties: false + $ref: './components/schemas/WorkspaceConfigurationUpdateRequest.yaml' PaginatedWorkspaceConfigurations: - type: object - properties: - items: - type: array - items: { $ref: '#/components/schemas/WorkspaceConfiguration' } - page: { type: integer } - perPage: { type: integer } - total: { type: integer } - required: [items, page, perPage, total] - + $ref: './components/schemas/PaginatedWorkspaceConfigurations.yaml' MemoryBucket: - allOf: - - $ref: '#/components/schemas/EntityMeta' - - type: object - properties: - title: { type: string } - config: { $ref: '#/components/schemas/MemoryBucketConfig' } - required: [config] + $ref: './components/schemas/MemoryBucket.yaml' MemoryBucketConfig: - type: object - properties: - scope: - type: string - enum: [global, perThread] - default: global - collectionPrefix: { type: string } - additionalProperties: false + $ref: './components/schemas/MemoryBucketConfig.yaml' MemoryBucketCreateRequest: - type: object - properties: - title: { type: string } - config: { $ref: '#/components/schemas/MemoryBucketConfig' } - required: [config] + $ref: './components/schemas/MemoryBucketCreateRequest.yaml' MemoryBucketUpdateRequest: - type: object - properties: - title: { type: string } - config: { $ref: '#/components/schemas/MemoryBucketConfig' } - additionalProperties: false + $ref: './components/schemas/MemoryBucketUpdateRequest.yaml' PaginatedMemoryBuckets: - type: object - properties: - items: - type: array - items: { $ref: '#/components/schemas/MemoryBucket' } - page: { type: integer } - perPage: { type: integer } - total: { type: integer } - required: [items, page, perPage, total] - + $ref: './components/schemas/PaginatedMemoryBuckets.yaml' EntityType: - type: string - enum: - - agent - - tool - - mcpServer - - workspaceConfiguration - - memoryBucket + $ref: './components/schemas/EntityType.yaml' AttachmentKind: - type: string - description: Relation type between entities - enum: - - agent_tool - - agent_memoryBucket - - agent_workspaceConfiguration - - agent_mcpServer - - mcpServer_workspaceConfiguration + $ref: './components/schemas/AttachmentKind.yaml' Attachment: - allOf: - - $ref: '#/components/schemas/EntityMeta' - - type: object - properties: - kind: { $ref: '#/components/schemas/AttachmentKind' } - sourceType: { $ref: '#/components/schemas/EntityType' } - sourceId: { type: string, format: uuid } - targetType: { $ref: '#/components/schemas/EntityType' } - targetId: { type: string, format: uuid } - required: [kind, sourceType, sourceId, targetType, targetId] + $ref: './components/schemas/Attachment.yaml' AttachmentCreateRequest: - type: object - properties: - kind: { $ref: '#/components/schemas/AttachmentKind' } - sourceType: { $ref: '#/components/schemas/EntityType' } - sourceId: { type: string, format: uuid } - targetType: { $ref: '#/components/schemas/EntityType' } - targetId: { type: string, format: uuid } - required: [kind, sourceType, sourceId, targetType, targetId] + $ref: './components/schemas/AttachmentCreateRequest.yaml' PaginatedAttachments: - type: object - properties: - items: - type: array - items: { $ref: '#/components/schemas/Attachment' } - page: { type: integer } - perPage: { type: integer } - total: { type: integer } - required: [items, page, perPage, total] + $ref: './components/schemas/PaginatedAttachments.yaml' diff --git a/openapi/team/paths/agent-by-id.yaml b/openapi/team/paths/agent-by-id.yaml new file mode 100644 index 0000000..968ad6f --- /dev/null +++ b/openapi/team/paths/agent-by-id.yaml @@ -0,0 +1,44 @@ +get: + tags: [Agents] + summary: Get agent by ID + parameters: + - $ref: '../components/parameters/IdPath.yaml' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../components/schemas/Agent.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' +patch: + tags: [Agents] + summary: Update agent (partial) + parameters: + - $ref: '../components/parameters/IdPath.yaml' + requestBody: + required: true + content: + application/json: + schema: + $ref: '../components/schemas/AgentUpdateRequest.yaml' + responses: + '200': + description: Updated + content: + application/json: + schema: + $ref: '../components/schemas/Agent.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' +delete: + tags: [Agents] + summary: Delete agent + parameters: + - $ref: '../components/parameters/IdPath.yaml' + responses: + '204': + description: No Content + default: + $ref: '../components/responses/ProblemResponse.yaml' diff --git a/openapi/team/paths/agents.yaml b/openapi/team/paths/agents.yaml new file mode 100644 index 0000000..3bda6af --- /dev/null +++ b/openapi/team/paths/agents.yaml @@ -0,0 +1,49 @@ +get: + tags: [Agents] + summary: List agents + parameters: + - in: query + name: q + schema: + type: string + description: Free-text search (name/role). + - in: query + name: page + schema: + type: integer + minimum: 1 + default: 1 + - in: query + name: perPage + schema: + type: integer + minimum: 1 + maximum: 100 + default: 20 + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../components/schemas/PaginatedAgents.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' +post: + tags: [Agents] + summary: Create agent + requestBody: + required: true + content: + application/json: + schema: + $ref: '../components/schemas/AgentCreateRequest.yaml' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '../components/schemas/Agent.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' diff --git a/openapi/team/paths/attachment-by-id.yaml b/openapi/team/paths/attachment-by-id.yaml new file mode 100644 index 0000000..c16eb7b --- /dev/null +++ b/openapi/team/paths/attachment-by-id.yaml @@ -0,0 +1,10 @@ +delete: + tags: [Attachments] + summary: Delete attachment + parameters: + - $ref: '../components/parameters/IdPath.yaml' + responses: + '204': + description: No Content + default: + $ref: '../components/responses/ProblemResponse.yaml' diff --git a/openapi/team/paths/attachments.yaml b/openapi/team/paths/attachments.yaml new file mode 100644 index 0000000..412f728 --- /dev/null +++ b/openapi/team/paths/attachments.yaml @@ -0,0 +1,66 @@ +get: + tags: [Attachments] + summary: List attachments + parameters: + - in: query + name: sourceType + schema: + $ref: '../components/schemas/EntityType.yaml' + - in: query + name: sourceId + schema: + type: string + format: uuid + - in: query + name: targetType + schema: + $ref: '../components/schemas/EntityType.yaml' + - in: query + name: targetId + schema: + type: string + format: uuid + - in: query + name: kind + schema: + $ref: '../components/schemas/AttachmentKind.yaml' + - in: query + name: page + schema: + type: integer + minimum: 1 + default: 1 + - in: query + name: perPage + schema: + type: integer + minimum: 1 + maximum: 100 + default: 20 + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../components/schemas/PaginatedAttachments.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' +post: + tags: [Attachments] + summary: Create attachment (relation) + requestBody: + required: true + content: + application/json: + schema: + $ref: '../components/schemas/AttachmentCreateRequest.yaml' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '../components/schemas/Attachment.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' diff --git a/openapi/team/paths/mcp-server-by-id.yaml b/openapi/team/paths/mcp-server-by-id.yaml new file mode 100644 index 0000000..a34f8a4 --- /dev/null +++ b/openapi/team/paths/mcp-server-by-id.yaml @@ -0,0 +1,44 @@ +get: + tags: [MCP Servers] + summary: Get MCP server by ID + parameters: + - $ref: '../components/parameters/IdPath.yaml' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../components/schemas/McpServer.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' +patch: + tags: [MCP Servers] + summary: Update MCP server (partial) + parameters: + - $ref: '../components/parameters/IdPath.yaml' + requestBody: + required: true + content: + application/json: + schema: + $ref: '../components/schemas/McpServerUpdateRequest.yaml' + responses: + '200': + description: Updated + content: + application/json: + schema: + $ref: '../components/schemas/McpServer.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' +delete: + tags: [MCP Servers] + summary: Delete MCP server + parameters: + - $ref: '../components/parameters/IdPath.yaml' + responses: + '204': + description: No Content + default: + $ref: '../components/responses/ProblemResponse.yaml' diff --git a/openapi/team/paths/mcp-servers.yaml b/openapi/team/paths/mcp-servers.yaml new file mode 100644 index 0000000..9579704 --- /dev/null +++ b/openapi/team/paths/mcp-servers.yaml @@ -0,0 +1,44 @@ +get: + tags: [MCP Servers] + summary: List MCP servers + parameters: + - in: query + name: page + schema: + type: integer + minimum: 1 + default: 1 + - in: query + name: perPage + schema: + type: integer + minimum: 1 + maximum: 100 + default: 20 + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../components/schemas/PaginatedMcpServers.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' +post: + tags: [MCP Servers] + summary: Create MCP server + requestBody: + required: true + content: + application/json: + schema: + $ref: '../components/schemas/McpServerCreateRequest.yaml' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '../components/schemas/McpServer.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' diff --git a/openapi/team/paths/memory-bucket-by-id.yaml b/openapi/team/paths/memory-bucket-by-id.yaml new file mode 100644 index 0000000..2800f4f --- /dev/null +++ b/openapi/team/paths/memory-bucket-by-id.yaml @@ -0,0 +1,44 @@ +get: + tags: [MemoryBuckets] + summary: Get memory bucket by ID + parameters: + - $ref: '../components/parameters/IdPath.yaml' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../components/schemas/MemoryBucket.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' +patch: + tags: [MemoryBuckets] + summary: Update memory bucket (partial) + parameters: + - $ref: '../components/parameters/IdPath.yaml' + requestBody: + required: true + content: + application/json: + schema: + $ref: '../components/schemas/MemoryBucketUpdateRequest.yaml' + responses: + '200': + description: Updated + content: + application/json: + schema: + $ref: '../components/schemas/MemoryBucket.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' +delete: + tags: [MemoryBuckets] + summary: Delete memory bucket + parameters: + - $ref: '../components/parameters/IdPath.yaml' + responses: + '204': + description: No Content + default: + $ref: '../components/responses/ProblemResponse.yaml' diff --git a/openapi/team/paths/memory-buckets.yaml b/openapi/team/paths/memory-buckets.yaml new file mode 100644 index 0000000..7767210 --- /dev/null +++ b/openapi/team/paths/memory-buckets.yaml @@ -0,0 +1,44 @@ +get: + tags: [MemoryBuckets] + summary: List memory buckets + parameters: + - in: query + name: page + schema: + type: integer + minimum: 1 + default: 1 + - in: query + name: perPage + schema: + type: integer + minimum: 1 + maximum: 100 + default: 20 + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../components/schemas/PaginatedMemoryBuckets.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' +post: + tags: [MemoryBuckets] + summary: Create memory bucket + requestBody: + required: true + content: + application/json: + schema: + $ref: '../components/schemas/MemoryBucketCreateRequest.yaml' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '../components/schemas/MemoryBucket.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' diff --git a/openapi/team/paths/tool-by-id.yaml b/openapi/team/paths/tool-by-id.yaml new file mode 100644 index 0000000..f759c33 --- /dev/null +++ b/openapi/team/paths/tool-by-id.yaml @@ -0,0 +1,44 @@ +get: + tags: [Tools] + summary: Get tool by ID + parameters: + - $ref: '../components/parameters/IdPath.yaml' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../components/schemas/Tool.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' +patch: + tags: [Tools] + summary: Update tool (partial) + parameters: + - $ref: '../components/parameters/IdPath.yaml' + requestBody: + required: true + content: + application/json: + schema: + $ref: '../components/schemas/ToolUpdateRequest.yaml' + responses: + '200': + description: Updated + content: + application/json: + schema: + $ref: '../components/schemas/Tool.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' +delete: + tags: [Tools] + summary: Delete tool + parameters: + - $ref: '../components/parameters/IdPath.yaml' + responses: + '204': + description: No Content + default: + $ref: '../components/responses/ProblemResponse.yaml' diff --git a/openapi/team/paths/tools.yaml b/openapi/team/paths/tools.yaml new file mode 100644 index 0000000..0c97a9b --- /dev/null +++ b/openapi/team/paths/tools.yaml @@ -0,0 +1,49 @@ +get: + tags: [Tools] + summary: List tools + parameters: + - in: query + name: type + schema: + $ref: '../components/schemas/ToolType.yaml' + description: Filter by tool type + - in: query + name: page + schema: + type: integer + minimum: 1 + default: 1 + - in: query + name: perPage + schema: + type: integer + minimum: 1 + maximum: 100 + default: 20 + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../components/schemas/PaginatedTools.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' +post: + tags: [Tools] + summary: Create tool + requestBody: + required: true + content: + application/json: + schema: + $ref: '../components/schemas/ToolCreateRequest.yaml' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '../components/schemas/Tool.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' diff --git a/openapi/team/paths/workspace-configuration-by-id.yaml b/openapi/team/paths/workspace-configuration-by-id.yaml new file mode 100644 index 0000000..20c96a2 --- /dev/null +++ b/openapi/team/paths/workspace-configuration-by-id.yaml @@ -0,0 +1,44 @@ +get: + tags: [WorkspaceConfigurations] + summary: Get workspace configuration by ID + parameters: + - $ref: '../components/parameters/IdPath.yaml' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../components/schemas/WorkspaceConfiguration.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' +patch: + tags: [WorkspaceConfigurations] + summary: Update workspace configuration (partial) + parameters: + - $ref: '../components/parameters/IdPath.yaml' + requestBody: + required: true + content: + application/json: + schema: + $ref: '../components/schemas/WorkspaceConfigurationUpdateRequest.yaml' + responses: + '200': + description: Updated + content: + application/json: + schema: + $ref: '../components/schemas/WorkspaceConfiguration.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' +delete: + tags: [WorkspaceConfigurations] + summary: Delete workspace configuration + parameters: + - $ref: '../components/parameters/IdPath.yaml' + responses: + '204': + description: No Content + default: + $ref: '../components/responses/ProblemResponse.yaml' diff --git a/openapi/team/paths/workspace-configurations.yaml b/openapi/team/paths/workspace-configurations.yaml new file mode 100644 index 0000000..6011e5f --- /dev/null +++ b/openapi/team/paths/workspace-configurations.yaml @@ -0,0 +1,44 @@ +get: + tags: [WorkspaceConfigurations] + summary: List workspace configurations + parameters: + - in: query + name: page + schema: + type: integer + minimum: 1 + default: 1 + - in: query + name: perPage + schema: + type: integer + minimum: 1 + maximum: 100 + default: 20 + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../components/schemas/PaginatedWorkspaceConfigurations.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' +post: + tags: [WorkspaceConfigurations] + summary: Create workspace configuration + requestBody: + required: true + content: + application/json: + schema: + $ref: '../components/schemas/WorkspaceConfigurationCreateRequest.yaml' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '../components/schemas/WorkspaceConfiguration.yaml' + default: + $ref: '../components/responses/ProblemResponse.yaml' From d9a1eb7cb90d3d61158a2f81c7c0b6581107330d Mon Sep 17 00:00:00 2001 From: Rowan Stein Date: Tue, 24 Feb 2026 16:13:15 +0000 Subject: [PATCH 03/10] fix(attachments): remove source/target types from AttachmentCreateRequest to avoid duplication; kinds imply types --- .../team/components/schemas/AttachmentCreateRequest.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/openapi/team/components/schemas/AttachmentCreateRequest.yaml b/openapi/team/components/schemas/AttachmentCreateRequest.yaml index 6d21240..96df702 100644 --- a/openapi/team/components/schemas/AttachmentCreateRequest.yaml +++ b/openapi/team/components/schemas/AttachmentCreateRequest.yaml @@ -1,8 +1,9 @@ type: object +description: | + Create an attachment (relation) between two entities using a predefined `kind`. + Source/target types are implied by `kind` and validated by the backend; do not include them to avoid duplication. properties: kind: { $ref: './AttachmentKind.yaml' } - sourceType: { $ref: './EntityType.yaml' } sourceId: { type: string, format: uuid } - targetType: { $ref: './EntityType.yaml' } targetId: { type: string, format: uuid } -required: [kind, sourceType, sourceId, targetType, targetId] +required: [kind, sourceId, targetId] From 7caab3fbc70f511dfb3a6c52f5ef76da1e2ee8b8 Mon Sep 17 00:00:00 2001 From: Rowan Stein Date: Tue, 24 Feb 2026 16:20:28 +0000 Subject: [PATCH 04/10] feat(spec): standardize entities (Agent, MCP Server, WorkspaceConfiguration, MemoryBucket) to root title/description/config; move other fields into config; Tool remains with type discriminator --- openapi/team/components/schemas/Agent.yaml | 3 +-- openapi/team/components/schemas/AgentConfig.yaml | 1 - openapi/team/components/schemas/AgentCreateRequest.yaml | 3 +-- openapi/team/components/schemas/AgentUpdateRequest.yaml | 3 +-- openapi/team/components/schemas/McpServer.yaml | 2 +- openapi/team/components/schemas/McpServerCreateRequest.yaml | 2 +- openapi/team/components/schemas/McpServerUpdateRequest.yaml | 2 +- openapi/team/components/schemas/MemoryBucket.yaml | 1 + openapi/team/components/schemas/MemoryBucketCreateRequest.yaml | 1 + openapi/team/components/schemas/MemoryBucketUpdateRequest.yaml | 1 + openapi/team/components/schemas/WorkspaceConfiguration.yaml | 1 + .../schemas/WorkspaceConfigurationCreateRequest.yaml | 1 + .../schemas/WorkspaceConfigurationUpdateRequest.yaml | 1 + 13 files changed, 12 insertions(+), 10 deletions(-) diff --git a/openapi/team/components/schemas/Agent.yaml b/openapi/team/components/schemas/Agent.yaml index 23dafb6..69d93d6 100644 --- a/openapi/team/components/schemas/Agent.yaml +++ b/openapi/team/components/schemas/Agent.yaml @@ -3,7 +3,6 @@ allOf: - type: object properties: title: { type: string } - name: { type: string } - role: { type: string } + description: { type: string } config: { $ref: './AgentConfig.yaml' } required: [config] diff --git a/openapi/team/components/schemas/AgentConfig.yaml b/openapi/team/components/schemas/AgentConfig.yaml index 5d14986..97eb51c 100644 --- a/openapi/team/components/schemas/AgentConfig.yaml +++ b/openapi/team/components/schemas/AgentConfig.yaml @@ -11,7 +11,6 @@ properties: restrictOutput: { type: boolean, default: false } restrictionMessage: { type: string, default: "Do not produce a final answer directly. Before finishing, call a tool. If no tool is needed, call the 'finish' tool." } restrictionMaxInjections: { type: integer, minimum: 0, default: 0 } - title: { type: string } name: { type: string } role: { type: string } additionalProperties: false diff --git a/openapi/team/components/schemas/AgentCreateRequest.yaml b/openapi/team/components/schemas/AgentCreateRequest.yaml index 68ee738..5e54c33 100644 --- a/openapi/team/components/schemas/AgentCreateRequest.yaml +++ b/openapi/team/components/schemas/AgentCreateRequest.yaml @@ -1,7 +1,6 @@ type: object properties: title: { type: string } - name: { type: string } - role: { type: string } + description: { type: string } config: { $ref: './AgentConfig.yaml' } required: [config] diff --git a/openapi/team/components/schemas/AgentUpdateRequest.yaml b/openapi/team/components/schemas/AgentUpdateRequest.yaml index fa9af61..1dc01e5 100644 --- a/openapi/team/components/schemas/AgentUpdateRequest.yaml +++ b/openapi/team/components/schemas/AgentUpdateRequest.yaml @@ -1,7 +1,6 @@ type: object properties: title: { type: string } - name: { type: string } - role: { type: string } + description: { type: string } config: { $ref: './AgentConfig.yaml' } additionalProperties: false diff --git a/openapi/team/components/schemas/McpServer.yaml b/openapi/team/components/schemas/McpServer.yaml index ac31bf4..37c3e73 100644 --- a/openapi/team/components/schemas/McpServer.yaml +++ b/openapi/team/components/schemas/McpServer.yaml @@ -3,6 +3,6 @@ allOf: - type: object properties: title: { type: string } - namespace: { type: string } + description: { type: string } config: { $ref: './McpServerConfig.yaml' } required: [config] diff --git a/openapi/team/components/schemas/McpServerCreateRequest.yaml b/openapi/team/components/schemas/McpServerCreateRequest.yaml index 6812337..d60a80a 100644 --- a/openapi/team/components/schemas/McpServerCreateRequest.yaml +++ b/openapi/team/components/schemas/McpServerCreateRequest.yaml @@ -1,6 +1,6 @@ type: object properties: title: { type: string } - namespace: { type: string } + description: { type: string } config: { $ref: './McpServerConfig.yaml' } required: [config] diff --git a/openapi/team/components/schemas/McpServerUpdateRequest.yaml b/openapi/team/components/schemas/McpServerUpdateRequest.yaml index b848df5..0dd6777 100644 --- a/openapi/team/components/schemas/McpServerUpdateRequest.yaml +++ b/openapi/team/components/schemas/McpServerUpdateRequest.yaml @@ -1,6 +1,6 @@ type: object properties: title: { type: string } - namespace: { type: string } + description: { type: string } config: { $ref: './McpServerConfig.yaml' } additionalProperties: false diff --git a/openapi/team/components/schemas/MemoryBucket.yaml b/openapi/team/components/schemas/MemoryBucket.yaml index cec6ba0..5064716 100644 --- a/openapi/team/components/schemas/MemoryBucket.yaml +++ b/openapi/team/components/schemas/MemoryBucket.yaml @@ -3,5 +3,6 @@ allOf: - type: object properties: title: { type: string } + description: { type: string } config: { $ref: './MemoryBucketConfig.yaml' } required: [config] diff --git a/openapi/team/components/schemas/MemoryBucketCreateRequest.yaml b/openapi/team/components/schemas/MemoryBucketCreateRequest.yaml index 5973d6e..02adac3 100644 --- a/openapi/team/components/schemas/MemoryBucketCreateRequest.yaml +++ b/openapi/team/components/schemas/MemoryBucketCreateRequest.yaml @@ -1,5 +1,6 @@ type: object properties: title: { type: string } + description: { type: string } config: { $ref: './MemoryBucketConfig.yaml' } required: [config] diff --git a/openapi/team/components/schemas/MemoryBucketUpdateRequest.yaml b/openapi/team/components/schemas/MemoryBucketUpdateRequest.yaml index 230deda..d713fa1 100644 --- a/openapi/team/components/schemas/MemoryBucketUpdateRequest.yaml +++ b/openapi/team/components/schemas/MemoryBucketUpdateRequest.yaml @@ -1,5 +1,6 @@ type: object properties: title: { type: string } + description: { type: string } config: { $ref: './MemoryBucketConfig.yaml' } additionalProperties: false diff --git a/openapi/team/components/schemas/WorkspaceConfiguration.yaml b/openapi/team/components/schemas/WorkspaceConfiguration.yaml index 64b0391..6e868bc 100644 --- a/openapi/team/components/schemas/WorkspaceConfiguration.yaml +++ b/openapi/team/components/schemas/WorkspaceConfiguration.yaml @@ -3,5 +3,6 @@ allOf: - type: object properties: title: { type: string } + description: { type: string } config: { $ref: './WorkspaceConfig.yaml' } required: [config] diff --git a/openapi/team/components/schemas/WorkspaceConfigurationCreateRequest.yaml b/openapi/team/components/schemas/WorkspaceConfigurationCreateRequest.yaml index 953fa17..c110c2a 100644 --- a/openapi/team/components/schemas/WorkspaceConfigurationCreateRequest.yaml +++ b/openapi/team/components/schemas/WorkspaceConfigurationCreateRequest.yaml @@ -1,5 +1,6 @@ type: object properties: title: { type: string } + description: { type: string } config: { $ref: './WorkspaceConfig.yaml' } required: [config] diff --git a/openapi/team/components/schemas/WorkspaceConfigurationUpdateRequest.yaml b/openapi/team/components/schemas/WorkspaceConfigurationUpdateRequest.yaml index dfb826a..62a6069 100644 --- a/openapi/team/components/schemas/WorkspaceConfigurationUpdateRequest.yaml +++ b/openapi/team/components/schemas/WorkspaceConfigurationUpdateRequest.yaml @@ -1,5 +1,6 @@ type: object properties: title: { type: string } + description: { type: string } config: { $ref: './WorkspaceConfig.yaml' } additionalProperties: false From b6d53f07c9f666ef8cbf8b4324034c87795ddaf6 Mon Sep 17 00:00:00 2001 From: Rowan Stein Date: Tue, 24 Feb 2026 16:30:28 +0000 Subject: [PATCH 05/10] chore(spec): move Team OpenAPI spec into openapi/team/v1 directory --- openapi/team/{ => v1}/components/parameters/IdPath.yaml | 0 openapi/team/{ => v1}/components/responses/ProblemResponse.yaml | 0 openapi/team/{ => v1}/components/schemas/Agent.yaml | 0 openapi/team/{ => v1}/components/schemas/AgentConfig.yaml | 0 openapi/team/{ => v1}/components/schemas/AgentCreateRequest.yaml | 0 openapi/team/{ => v1}/components/schemas/AgentUpdateRequest.yaml | 0 openapi/team/{ => v1}/components/schemas/Attachment.yaml | 0 .../team/{ => v1}/components/schemas/AttachmentCreateRequest.yaml | 0 openapi/team/{ => v1}/components/schemas/AttachmentKind.yaml | 0 openapi/team/{ => v1}/components/schemas/EntityMeta.yaml | 0 openapi/team/{ => v1}/components/schemas/EntityType.yaml | 0 openapi/team/{ => v1}/components/schemas/McpEnvItem.yaml | 0 openapi/team/{ => v1}/components/schemas/McpServer.yaml | 0 openapi/team/{ => v1}/components/schemas/McpServerConfig.yaml | 0 .../team/{ => v1}/components/schemas/McpServerCreateRequest.yaml | 0 .../team/{ => v1}/components/schemas/McpServerUpdateRequest.yaml | 0 openapi/team/{ => v1}/components/schemas/MemoryBucket.yaml | 0 openapi/team/{ => v1}/components/schemas/MemoryBucketConfig.yaml | 0 .../{ => v1}/components/schemas/MemoryBucketCreateRequest.yaml | 0 .../{ => v1}/components/schemas/MemoryBucketUpdateRequest.yaml | 0 openapi/team/{ => v1}/components/schemas/PaginatedAgents.yaml | 0 .../team/{ => v1}/components/schemas/PaginatedAttachments.yaml | 0 openapi/team/{ => v1}/components/schemas/PaginatedMcpServers.yaml | 0 .../team/{ => v1}/components/schemas/PaginatedMemoryBuckets.yaml | 0 openapi/team/{ => v1}/components/schemas/PaginatedTools.yaml | 0 .../components/schemas/PaginatedWorkspaceConfigurations.yaml | 0 openapi/team/{ => v1}/components/schemas/Pagination.yaml | 0 openapi/team/{ => v1}/components/schemas/Problem.yaml | 0 openapi/team/{ => v1}/components/schemas/Tool.yaml | 0 openapi/team/{ => v1}/components/schemas/ToolCreateRequest.yaml | 0 openapi/team/{ => v1}/components/schemas/ToolType.yaml | 0 openapi/team/{ => v1}/components/schemas/ToolUpdateRequest.yaml | 0 openapi/team/{ => v1}/components/schemas/WorkspaceConfig.yaml | 0 .../team/{ => v1}/components/schemas/WorkspaceConfiguration.yaml | 0 .../components/schemas/WorkspaceConfigurationCreateRequest.yaml | 0 .../components/schemas/WorkspaceConfigurationUpdateRequest.yaml | 0 openapi/team/{ => v1}/components/schemas/WorkspaceEnvItem.yaml | 0 openapi/team/{ => v1}/components/schemas/WorkspacePlatform.yaml | 0 .../team/{ => v1}/components/schemas/WorkspaceVolumeConfig.yaml | 0 openapi/team/{ => v1}/openapi.yaml | 0 openapi/team/{ => v1}/paths/agent-by-id.yaml | 0 openapi/team/{ => v1}/paths/agents.yaml | 0 openapi/team/{ => v1}/paths/attachment-by-id.yaml | 0 openapi/team/{ => v1}/paths/attachments.yaml | 0 openapi/team/{ => v1}/paths/mcp-server-by-id.yaml | 0 openapi/team/{ => v1}/paths/mcp-servers.yaml | 0 openapi/team/{ => v1}/paths/memory-bucket-by-id.yaml | 0 openapi/team/{ => v1}/paths/memory-buckets.yaml | 0 openapi/team/{ => v1}/paths/tool-by-id.yaml | 0 openapi/team/{ => v1}/paths/tools.yaml | 0 openapi/team/{ => v1}/paths/workspace-configuration-by-id.yaml | 0 openapi/team/{ => v1}/paths/workspace-configurations.yaml | 0 52 files changed, 0 insertions(+), 0 deletions(-) rename openapi/team/{ => v1}/components/parameters/IdPath.yaml (100%) rename openapi/team/{ => v1}/components/responses/ProblemResponse.yaml (100%) rename openapi/team/{ => v1}/components/schemas/Agent.yaml (100%) rename openapi/team/{ => v1}/components/schemas/AgentConfig.yaml (100%) rename openapi/team/{ => v1}/components/schemas/AgentCreateRequest.yaml (100%) rename openapi/team/{ => v1}/components/schemas/AgentUpdateRequest.yaml (100%) rename openapi/team/{ => v1}/components/schemas/Attachment.yaml (100%) rename openapi/team/{ => v1}/components/schemas/AttachmentCreateRequest.yaml (100%) rename openapi/team/{ => v1}/components/schemas/AttachmentKind.yaml (100%) rename openapi/team/{ => v1}/components/schemas/EntityMeta.yaml (100%) rename openapi/team/{ => v1}/components/schemas/EntityType.yaml (100%) rename openapi/team/{ => v1}/components/schemas/McpEnvItem.yaml (100%) rename openapi/team/{ => v1}/components/schemas/McpServer.yaml (100%) rename openapi/team/{ => v1}/components/schemas/McpServerConfig.yaml (100%) rename openapi/team/{ => v1}/components/schemas/McpServerCreateRequest.yaml (100%) rename openapi/team/{ => v1}/components/schemas/McpServerUpdateRequest.yaml (100%) rename openapi/team/{ => v1}/components/schemas/MemoryBucket.yaml (100%) rename openapi/team/{ => v1}/components/schemas/MemoryBucketConfig.yaml (100%) rename openapi/team/{ => v1}/components/schemas/MemoryBucketCreateRequest.yaml (100%) rename openapi/team/{ => v1}/components/schemas/MemoryBucketUpdateRequest.yaml (100%) rename openapi/team/{ => v1}/components/schemas/PaginatedAgents.yaml (100%) rename openapi/team/{ => v1}/components/schemas/PaginatedAttachments.yaml (100%) rename openapi/team/{ => v1}/components/schemas/PaginatedMcpServers.yaml (100%) rename openapi/team/{ => v1}/components/schemas/PaginatedMemoryBuckets.yaml (100%) rename openapi/team/{ => v1}/components/schemas/PaginatedTools.yaml (100%) rename openapi/team/{ => v1}/components/schemas/PaginatedWorkspaceConfigurations.yaml (100%) rename openapi/team/{ => v1}/components/schemas/Pagination.yaml (100%) rename openapi/team/{ => v1}/components/schemas/Problem.yaml (100%) rename openapi/team/{ => v1}/components/schemas/Tool.yaml (100%) rename openapi/team/{ => v1}/components/schemas/ToolCreateRequest.yaml (100%) rename openapi/team/{ => v1}/components/schemas/ToolType.yaml (100%) rename openapi/team/{ => v1}/components/schemas/ToolUpdateRequest.yaml (100%) rename openapi/team/{ => v1}/components/schemas/WorkspaceConfig.yaml (100%) rename openapi/team/{ => v1}/components/schemas/WorkspaceConfiguration.yaml (100%) rename openapi/team/{ => v1}/components/schemas/WorkspaceConfigurationCreateRequest.yaml (100%) rename openapi/team/{ => v1}/components/schemas/WorkspaceConfigurationUpdateRequest.yaml (100%) rename openapi/team/{ => v1}/components/schemas/WorkspaceEnvItem.yaml (100%) rename openapi/team/{ => v1}/components/schemas/WorkspacePlatform.yaml (100%) rename openapi/team/{ => v1}/components/schemas/WorkspaceVolumeConfig.yaml (100%) rename openapi/team/{ => v1}/openapi.yaml (100%) rename openapi/team/{ => v1}/paths/agent-by-id.yaml (100%) rename openapi/team/{ => v1}/paths/agents.yaml (100%) rename openapi/team/{ => v1}/paths/attachment-by-id.yaml (100%) rename openapi/team/{ => v1}/paths/attachments.yaml (100%) rename openapi/team/{ => v1}/paths/mcp-server-by-id.yaml (100%) rename openapi/team/{ => v1}/paths/mcp-servers.yaml (100%) rename openapi/team/{ => v1}/paths/memory-bucket-by-id.yaml (100%) rename openapi/team/{ => v1}/paths/memory-buckets.yaml (100%) rename openapi/team/{ => v1}/paths/tool-by-id.yaml (100%) rename openapi/team/{ => v1}/paths/tools.yaml (100%) rename openapi/team/{ => v1}/paths/workspace-configuration-by-id.yaml (100%) rename openapi/team/{ => v1}/paths/workspace-configurations.yaml (100%) diff --git a/openapi/team/components/parameters/IdPath.yaml b/openapi/team/v1/components/parameters/IdPath.yaml similarity index 100% rename from openapi/team/components/parameters/IdPath.yaml rename to openapi/team/v1/components/parameters/IdPath.yaml diff --git a/openapi/team/components/responses/ProblemResponse.yaml b/openapi/team/v1/components/responses/ProblemResponse.yaml similarity index 100% rename from openapi/team/components/responses/ProblemResponse.yaml rename to openapi/team/v1/components/responses/ProblemResponse.yaml diff --git a/openapi/team/components/schemas/Agent.yaml b/openapi/team/v1/components/schemas/Agent.yaml similarity index 100% rename from openapi/team/components/schemas/Agent.yaml rename to openapi/team/v1/components/schemas/Agent.yaml diff --git a/openapi/team/components/schemas/AgentConfig.yaml b/openapi/team/v1/components/schemas/AgentConfig.yaml similarity index 100% rename from openapi/team/components/schemas/AgentConfig.yaml rename to openapi/team/v1/components/schemas/AgentConfig.yaml diff --git a/openapi/team/components/schemas/AgentCreateRequest.yaml b/openapi/team/v1/components/schemas/AgentCreateRequest.yaml similarity index 100% rename from openapi/team/components/schemas/AgentCreateRequest.yaml rename to openapi/team/v1/components/schemas/AgentCreateRequest.yaml diff --git a/openapi/team/components/schemas/AgentUpdateRequest.yaml b/openapi/team/v1/components/schemas/AgentUpdateRequest.yaml similarity index 100% rename from openapi/team/components/schemas/AgentUpdateRequest.yaml rename to openapi/team/v1/components/schemas/AgentUpdateRequest.yaml diff --git a/openapi/team/components/schemas/Attachment.yaml b/openapi/team/v1/components/schemas/Attachment.yaml similarity index 100% rename from openapi/team/components/schemas/Attachment.yaml rename to openapi/team/v1/components/schemas/Attachment.yaml diff --git a/openapi/team/components/schemas/AttachmentCreateRequest.yaml b/openapi/team/v1/components/schemas/AttachmentCreateRequest.yaml similarity index 100% rename from openapi/team/components/schemas/AttachmentCreateRequest.yaml rename to openapi/team/v1/components/schemas/AttachmentCreateRequest.yaml diff --git a/openapi/team/components/schemas/AttachmentKind.yaml b/openapi/team/v1/components/schemas/AttachmentKind.yaml similarity index 100% rename from openapi/team/components/schemas/AttachmentKind.yaml rename to openapi/team/v1/components/schemas/AttachmentKind.yaml diff --git a/openapi/team/components/schemas/EntityMeta.yaml b/openapi/team/v1/components/schemas/EntityMeta.yaml similarity index 100% rename from openapi/team/components/schemas/EntityMeta.yaml rename to openapi/team/v1/components/schemas/EntityMeta.yaml diff --git a/openapi/team/components/schemas/EntityType.yaml b/openapi/team/v1/components/schemas/EntityType.yaml similarity index 100% rename from openapi/team/components/schemas/EntityType.yaml rename to openapi/team/v1/components/schemas/EntityType.yaml diff --git a/openapi/team/components/schemas/McpEnvItem.yaml b/openapi/team/v1/components/schemas/McpEnvItem.yaml similarity index 100% rename from openapi/team/components/schemas/McpEnvItem.yaml rename to openapi/team/v1/components/schemas/McpEnvItem.yaml diff --git a/openapi/team/components/schemas/McpServer.yaml b/openapi/team/v1/components/schemas/McpServer.yaml similarity index 100% rename from openapi/team/components/schemas/McpServer.yaml rename to openapi/team/v1/components/schemas/McpServer.yaml diff --git a/openapi/team/components/schemas/McpServerConfig.yaml b/openapi/team/v1/components/schemas/McpServerConfig.yaml similarity index 100% rename from openapi/team/components/schemas/McpServerConfig.yaml rename to openapi/team/v1/components/schemas/McpServerConfig.yaml diff --git a/openapi/team/components/schemas/McpServerCreateRequest.yaml b/openapi/team/v1/components/schemas/McpServerCreateRequest.yaml similarity index 100% rename from openapi/team/components/schemas/McpServerCreateRequest.yaml rename to openapi/team/v1/components/schemas/McpServerCreateRequest.yaml diff --git a/openapi/team/components/schemas/McpServerUpdateRequest.yaml b/openapi/team/v1/components/schemas/McpServerUpdateRequest.yaml similarity index 100% rename from openapi/team/components/schemas/McpServerUpdateRequest.yaml rename to openapi/team/v1/components/schemas/McpServerUpdateRequest.yaml diff --git a/openapi/team/components/schemas/MemoryBucket.yaml b/openapi/team/v1/components/schemas/MemoryBucket.yaml similarity index 100% rename from openapi/team/components/schemas/MemoryBucket.yaml rename to openapi/team/v1/components/schemas/MemoryBucket.yaml diff --git a/openapi/team/components/schemas/MemoryBucketConfig.yaml b/openapi/team/v1/components/schemas/MemoryBucketConfig.yaml similarity index 100% rename from openapi/team/components/schemas/MemoryBucketConfig.yaml rename to openapi/team/v1/components/schemas/MemoryBucketConfig.yaml diff --git a/openapi/team/components/schemas/MemoryBucketCreateRequest.yaml b/openapi/team/v1/components/schemas/MemoryBucketCreateRequest.yaml similarity index 100% rename from openapi/team/components/schemas/MemoryBucketCreateRequest.yaml rename to openapi/team/v1/components/schemas/MemoryBucketCreateRequest.yaml diff --git a/openapi/team/components/schemas/MemoryBucketUpdateRequest.yaml b/openapi/team/v1/components/schemas/MemoryBucketUpdateRequest.yaml similarity index 100% rename from openapi/team/components/schemas/MemoryBucketUpdateRequest.yaml rename to openapi/team/v1/components/schemas/MemoryBucketUpdateRequest.yaml diff --git a/openapi/team/components/schemas/PaginatedAgents.yaml b/openapi/team/v1/components/schemas/PaginatedAgents.yaml similarity index 100% rename from openapi/team/components/schemas/PaginatedAgents.yaml rename to openapi/team/v1/components/schemas/PaginatedAgents.yaml diff --git a/openapi/team/components/schemas/PaginatedAttachments.yaml b/openapi/team/v1/components/schemas/PaginatedAttachments.yaml similarity index 100% rename from openapi/team/components/schemas/PaginatedAttachments.yaml rename to openapi/team/v1/components/schemas/PaginatedAttachments.yaml diff --git a/openapi/team/components/schemas/PaginatedMcpServers.yaml b/openapi/team/v1/components/schemas/PaginatedMcpServers.yaml similarity index 100% rename from openapi/team/components/schemas/PaginatedMcpServers.yaml rename to openapi/team/v1/components/schemas/PaginatedMcpServers.yaml diff --git a/openapi/team/components/schemas/PaginatedMemoryBuckets.yaml b/openapi/team/v1/components/schemas/PaginatedMemoryBuckets.yaml similarity index 100% rename from openapi/team/components/schemas/PaginatedMemoryBuckets.yaml rename to openapi/team/v1/components/schemas/PaginatedMemoryBuckets.yaml diff --git a/openapi/team/components/schemas/PaginatedTools.yaml b/openapi/team/v1/components/schemas/PaginatedTools.yaml similarity index 100% rename from openapi/team/components/schemas/PaginatedTools.yaml rename to openapi/team/v1/components/schemas/PaginatedTools.yaml diff --git a/openapi/team/components/schemas/PaginatedWorkspaceConfigurations.yaml b/openapi/team/v1/components/schemas/PaginatedWorkspaceConfigurations.yaml similarity index 100% rename from openapi/team/components/schemas/PaginatedWorkspaceConfigurations.yaml rename to openapi/team/v1/components/schemas/PaginatedWorkspaceConfigurations.yaml diff --git a/openapi/team/components/schemas/Pagination.yaml b/openapi/team/v1/components/schemas/Pagination.yaml similarity index 100% rename from openapi/team/components/schemas/Pagination.yaml rename to openapi/team/v1/components/schemas/Pagination.yaml diff --git a/openapi/team/components/schemas/Problem.yaml b/openapi/team/v1/components/schemas/Problem.yaml similarity index 100% rename from openapi/team/components/schemas/Problem.yaml rename to openapi/team/v1/components/schemas/Problem.yaml diff --git a/openapi/team/components/schemas/Tool.yaml b/openapi/team/v1/components/schemas/Tool.yaml similarity index 100% rename from openapi/team/components/schemas/Tool.yaml rename to openapi/team/v1/components/schemas/Tool.yaml diff --git a/openapi/team/components/schemas/ToolCreateRequest.yaml b/openapi/team/v1/components/schemas/ToolCreateRequest.yaml similarity index 100% rename from openapi/team/components/schemas/ToolCreateRequest.yaml rename to openapi/team/v1/components/schemas/ToolCreateRequest.yaml diff --git a/openapi/team/components/schemas/ToolType.yaml b/openapi/team/v1/components/schemas/ToolType.yaml similarity index 100% rename from openapi/team/components/schemas/ToolType.yaml rename to openapi/team/v1/components/schemas/ToolType.yaml diff --git a/openapi/team/components/schemas/ToolUpdateRequest.yaml b/openapi/team/v1/components/schemas/ToolUpdateRequest.yaml similarity index 100% rename from openapi/team/components/schemas/ToolUpdateRequest.yaml rename to openapi/team/v1/components/schemas/ToolUpdateRequest.yaml diff --git a/openapi/team/components/schemas/WorkspaceConfig.yaml b/openapi/team/v1/components/schemas/WorkspaceConfig.yaml similarity index 100% rename from openapi/team/components/schemas/WorkspaceConfig.yaml rename to openapi/team/v1/components/schemas/WorkspaceConfig.yaml diff --git a/openapi/team/components/schemas/WorkspaceConfiguration.yaml b/openapi/team/v1/components/schemas/WorkspaceConfiguration.yaml similarity index 100% rename from openapi/team/components/schemas/WorkspaceConfiguration.yaml rename to openapi/team/v1/components/schemas/WorkspaceConfiguration.yaml diff --git a/openapi/team/components/schemas/WorkspaceConfigurationCreateRequest.yaml b/openapi/team/v1/components/schemas/WorkspaceConfigurationCreateRequest.yaml similarity index 100% rename from openapi/team/components/schemas/WorkspaceConfigurationCreateRequest.yaml rename to openapi/team/v1/components/schemas/WorkspaceConfigurationCreateRequest.yaml diff --git a/openapi/team/components/schemas/WorkspaceConfigurationUpdateRequest.yaml b/openapi/team/v1/components/schemas/WorkspaceConfigurationUpdateRequest.yaml similarity index 100% rename from openapi/team/components/schemas/WorkspaceConfigurationUpdateRequest.yaml rename to openapi/team/v1/components/schemas/WorkspaceConfigurationUpdateRequest.yaml diff --git a/openapi/team/components/schemas/WorkspaceEnvItem.yaml b/openapi/team/v1/components/schemas/WorkspaceEnvItem.yaml similarity index 100% rename from openapi/team/components/schemas/WorkspaceEnvItem.yaml rename to openapi/team/v1/components/schemas/WorkspaceEnvItem.yaml diff --git a/openapi/team/components/schemas/WorkspacePlatform.yaml b/openapi/team/v1/components/schemas/WorkspacePlatform.yaml similarity index 100% rename from openapi/team/components/schemas/WorkspacePlatform.yaml rename to openapi/team/v1/components/schemas/WorkspacePlatform.yaml diff --git a/openapi/team/components/schemas/WorkspaceVolumeConfig.yaml b/openapi/team/v1/components/schemas/WorkspaceVolumeConfig.yaml similarity index 100% rename from openapi/team/components/schemas/WorkspaceVolumeConfig.yaml rename to openapi/team/v1/components/schemas/WorkspaceVolumeConfig.yaml diff --git a/openapi/team/openapi.yaml b/openapi/team/v1/openapi.yaml similarity index 100% rename from openapi/team/openapi.yaml rename to openapi/team/v1/openapi.yaml diff --git a/openapi/team/paths/agent-by-id.yaml b/openapi/team/v1/paths/agent-by-id.yaml similarity index 100% rename from openapi/team/paths/agent-by-id.yaml rename to openapi/team/v1/paths/agent-by-id.yaml diff --git a/openapi/team/paths/agents.yaml b/openapi/team/v1/paths/agents.yaml similarity index 100% rename from openapi/team/paths/agents.yaml rename to openapi/team/v1/paths/agents.yaml diff --git a/openapi/team/paths/attachment-by-id.yaml b/openapi/team/v1/paths/attachment-by-id.yaml similarity index 100% rename from openapi/team/paths/attachment-by-id.yaml rename to openapi/team/v1/paths/attachment-by-id.yaml diff --git a/openapi/team/paths/attachments.yaml b/openapi/team/v1/paths/attachments.yaml similarity index 100% rename from openapi/team/paths/attachments.yaml rename to openapi/team/v1/paths/attachments.yaml diff --git a/openapi/team/paths/mcp-server-by-id.yaml b/openapi/team/v1/paths/mcp-server-by-id.yaml similarity index 100% rename from openapi/team/paths/mcp-server-by-id.yaml rename to openapi/team/v1/paths/mcp-server-by-id.yaml diff --git a/openapi/team/paths/mcp-servers.yaml b/openapi/team/v1/paths/mcp-servers.yaml similarity index 100% rename from openapi/team/paths/mcp-servers.yaml rename to openapi/team/v1/paths/mcp-servers.yaml diff --git a/openapi/team/paths/memory-bucket-by-id.yaml b/openapi/team/v1/paths/memory-bucket-by-id.yaml similarity index 100% rename from openapi/team/paths/memory-bucket-by-id.yaml rename to openapi/team/v1/paths/memory-bucket-by-id.yaml diff --git a/openapi/team/paths/memory-buckets.yaml b/openapi/team/v1/paths/memory-buckets.yaml similarity index 100% rename from openapi/team/paths/memory-buckets.yaml rename to openapi/team/v1/paths/memory-buckets.yaml diff --git a/openapi/team/paths/tool-by-id.yaml b/openapi/team/v1/paths/tool-by-id.yaml similarity index 100% rename from openapi/team/paths/tool-by-id.yaml rename to openapi/team/v1/paths/tool-by-id.yaml diff --git a/openapi/team/paths/tools.yaml b/openapi/team/v1/paths/tools.yaml similarity index 100% rename from openapi/team/paths/tools.yaml rename to openapi/team/v1/paths/tools.yaml diff --git a/openapi/team/paths/workspace-configuration-by-id.yaml b/openapi/team/v1/paths/workspace-configuration-by-id.yaml similarity index 100% rename from openapi/team/paths/workspace-configuration-by-id.yaml rename to openapi/team/v1/paths/workspace-configuration-by-id.yaml diff --git a/openapi/team/paths/workspace-configurations.yaml b/openapi/team/v1/paths/workspace-configurations.yaml similarity index 100% rename from openapi/team/paths/workspace-configurations.yaml rename to openapi/team/v1/paths/workspace-configurations.yaml From a9960b52e99afbb19d69289d6c52c0d833efaab2 Mon Sep 17 00:00:00 2001 From: Rowan Stein Date: Tue, 24 Feb 2026 16:31:03 +0000 Subject: [PATCH 06/10] ci(openapi): add workflow to bundle (Redocly), lint (Spectral), and publish to GHCR via ORAS (v1 and version tags) --- .github/workflows/openapi-publish.yml | 79 +++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 .github/workflows/openapi-publish.yml diff --git a/.github/workflows/openapi-publish.yml b/.github/workflows/openapi-publish.yml new file mode 100644 index 0000000..6c48825 --- /dev/null +++ b/.github/workflows/openapi-publish.yml @@ -0,0 +1,79 @@ +name: OpenAPI Lint & Publish + +on: + pull_request: + paths: + - 'openapi/**' + push: + branches: [ main ] + paths: + - 'openapi/**' + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: '20' + - name: Install CLI tools (Redocly, Spectral) + run: | + npm install -g @redocly/cli @stoplight/spectral-cli + - name: Bundle spec (team v1) + run: | + mkdir -p dist + redocly bundle openapi/team/v1/openapi.yaml -o dist/team-v1.yaml + - name: Lint bundled spec with Spectral + run: | + spectral lint dist/team-v1.yaml + - name: Upload bundled artifact + uses: actions/upload-artifact@v4 + with: + name: team-v1-openapi + path: dist/team-v1.yaml + + publish: + if: github.event_name == 'push' + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: '20' + - name: Install Redocly + run: | + npm install -g @redocly/cli + - name: Bundle spec (team v1) + run: | + mkdir -p dist + redocly bundle openapi/team/v1/openapi.yaml -o dist/team-v1.yaml + - name: Install ORAS + env: + ORAS_VERSION: '1.1.0' + run: | + curl -L -o oras.tar.gz "https://github.com/oras-project/oras/releases/download/v${ORAS_VERSION}/oras_${ORAS_VERSION}_linux_amd64.tar.gz" + tar -xzf oras.tar.gz + sudo mv oras /usr/local/bin/oras + oras version + - name: Login to GHCR + env: + CR_PAT: ${{ secrets.GITHUB_TOKEN }} + run: | + echo "$CR_PAT" | oras login ghcr.io -u "${{ github.actor }}" --password-stdin + - name: Push OCI artifact to GHCR (v1) + run: | + oras push ghcr.io/${{ github.repository_owner }}/team-openapi:v1 \ + dist/team-v1.yaml:application/vnd.oai.openapi+yaml + - name: Push OCI artifact to GHCR (version tag) + run: | + SPEC_VERSION=$(awk '/^ version:/ {print $2}' openapi/team/v1/openapi.yaml) + oras push ghcr.io/${{ github.repository_owner }}/team-openapi:${SPEC_VERSION} \ + dist/team-v1.yaml:application/vnd.oai.openapi+yaml From 722f0155fb4354369539b9619aa2a3087c56a4bb Mon Sep 17 00:00:00 2001 From: Rowan Stein Date: Tue, 24 Feb 2026 16:37:55 +0000 Subject: [PATCH 07/10] ci(openapi): retarget GHCR to ghcr.io/agynio/openapi/team:1 and version tag; keep bundling/linting --- .github/workflows/openapi-publish.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/openapi-publish.yml b/.github/workflows/openapi-publish.yml index 6c48825..124ab23 100644 --- a/.github/workflows/openapi-publish.yml +++ b/.github/workflows/openapi-publish.yml @@ -68,12 +68,12 @@ jobs: CR_PAT: ${{ secrets.GITHUB_TOKEN }} run: | echo "$CR_PAT" | oras login ghcr.io -u "${{ github.actor }}" --password-stdin - - name: Push OCI artifact to GHCR (v1) + - name: Push OCI artifact to GHCR (major tag) run: | - oras push ghcr.io/${{ github.repository_owner }}/team-openapi:v1 \ + oras push ghcr.io/agynio/openapi/team:1 \ dist/team-v1.yaml:application/vnd.oai.openapi+yaml - name: Push OCI artifact to GHCR (version tag) run: | SPEC_VERSION=$(awk '/^ version:/ {print $2}' openapi/team/v1/openapi.yaml) - oras push ghcr.io/${{ github.repository_owner }}/team-openapi:${SPEC_VERSION} \ + oras push ghcr.io/agynio/openapi/team:${SPEC_VERSION} \ dist/team-v1.yaml:application/vnd.oai.openapi+yaml From 560c35f15af7eafbedb552a7f7f779b986e8315e Mon Sep 17 00:00:00 2001 From: Rowan Stein Date: Tue, 24 Feb 2026 16:45:07 +0000 Subject: [PATCH 08/10] ci(openapi): publish only to ghcr.io/agynio/openapi/team:1 (removed secondary tag) --- .github/workflows/openapi-publish.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/openapi-publish.yml b/.github/workflows/openapi-publish.yml index 124ab23..dca39e9 100644 --- a/.github/workflows/openapi-publish.yml +++ b/.github/workflows/openapi-publish.yml @@ -68,12 +68,7 @@ jobs: CR_PAT: ${{ secrets.GITHUB_TOKEN }} run: | echo "$CR_PAT" | oras login ghcr.io -u "${{ github.actor }}" --password-stdin - - name: Push OCI artifact to GHCR (major tag) + - name: Push OCI artifact to GHCR (major tag only) run: | oras push ghcr.io/agynio/openapi/team:1 \ dist/team-v1.yaml:application/vnd.oai.openapi+yaml - - name: Push OCI artifact to GHCR (version tag) - run: | - SPEC_VERSION=$(awk '/^ version:/ {print $2}' openapi/team/v1/openapi.yaml) - oras push ghcr.io/agynio/openapi/team:${SPEC_VERSION} \ - dist/team-v1.yaml:application/vnd.oai.openapi+yaml From 7cf83965beac36c85666c78c2a1172463ac7c33a Mon Sep 17 00:00:00 2001 From: Rowan Stein Date: Tue, 24 Feb 2026 16:58:02 +0000 Subject: [PATCH 09/10] ci(spectral): add ruleset (extends spectral:oas) and relax operationId-related rules to warnings --- .spectral.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .spectral.yaml diff --git a/.spectral.yaml b/.spectral.yaml new file mode 100644 index 0000000..614314d --- /dev/null +++ b/.spectral.yaml @@ -0,0 +1,11 @@ +extends: + - spectral:oas +rules: + operation-operationId: + severity: warn + operationId-unique: + severity: warn + info-description: + severity: warn + tag-description: + severity: warn From b7bcb8cac20f21a174dde958b97b7d25b49e3654 Mon Sep 17 00:00:00 2001 From: Rowan Stein Date: Tue, 24 Feb 2026 16:59:50 +0000 Subject: [PATCH 10/10] ci(spectral): simplify ruleset to only extend spectral:oas to fix validation error --- .spectral.yaml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.spectral.yaml b/.spectral.yaml index 614314d..22cd462 100644 --- a/.spectral.yaml +++ b/.spectral.yaml @@ -1,11 +1,2 @@ extends: - spectral:oas -rules: - operation-operationId: - severity: warn - operationId-unique: - severity: warn - info-description: - severity: warn - tag-description: - severity: warn