@cat-factory/mcp-server 0.29.0 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/server.d.ts CHANGED
@@ -2,7 +2,7 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
2
  import { type CatFactoryMcpOptions } from './config.ts';
3
3
  import { type CatFactoryTool } from './tools.generated.ts';
4
4
  /** The npm version, stamped into the SDK's `User-Agent` so a deployment can attribute calls. */
5
- export declare const MCP_SERVER_VERSION = "0.29.0";
5
+ export declare const MCP_SERVER_VERSION = "0.31.0";
6
6
  /** The name this server reports to a host. */
7
7
  export declare const MCP_SERVER_NAME = "cat-factory";
8
8
  export interface CatFactoryMcpServer {
package/dist/server.js CHANGED
@@ -19,7 +19,7 @@ import { CAT_FACTORY_TOOLS } from './tools.generated.js';
19
19
  // has been round-tripped through a second type system, and every gap in that conversion becomes a
20
20
  // tool that misdescribes its own input.
21
21
  /** The npm version, stamped into the SDK's `User-Agent` so a deployment can attribute calls. */
22
- export const MCP_SERVER_VERSION = '0.29.0';
22
+ export const MCP_SERVER_VERSION = '0.31.0';
23
23
  /** The name this server reports to a host. */
24
24
  export const MCP_SERVER_NAME = 'cat-factory';
25
25
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"tools.generated.d.ts","sourceRoot":"","sources":["../src/tools.generated.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAExD,6CAA6C;AAC7C,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAA;IACZ,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;IACb,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAA;IACb,sFAAsF;IACtF,WAAW,EAAE,MAAM,CAAA;IACnB,8FAA8F;IAC9F,QAAQ,EAAE,OAAO,CAAA;IACjB;;;;OAIG;IACH,KAAK,CAAC,EAAE;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAAA;IACrD,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAA;QACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACnC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;QAC5B,oBAAoB,EAAE,KAAK,CAAA;KAC5B,CAAA;IACD;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE;QACb,IAAI,EAAE,QAAQ,CAAA;QACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACpC,CAAA;IACD,kDAAkD;IAClD,MAAM,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CACtF;AAED;;;;;;GAMG;AACH,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAA;IACnB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf;AAuHD,wFAAwF;AACxF,eAAO,MAAM,iBAAiB,EAAE,SAAS,cAAc,EAskCtD,CAAA;AAED,wEAAwE;AACxE,eAAO,MAAM,8BAA8B,EAAE,SAAS,0BAA0B,EAmB/E,CAAA;AAED,kEAAkE;AAClE,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBpE,CAAA"}
1
+ {"version":3,"file":"tools.generated.d.ts","sourceRoot":"","sources":["../src/tools.generated.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAExD,6CAA6C;AAC7C,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAA;IACZ,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;IACb,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAA;IACb,sFAAsF;IACtF,WAAW,EAAE,MAAM,CAAA;IACnB,8FAA8F;IAC9F,QAAQ,EAAE,OAAO,CAAA;IACjB;;;;OAIG;IACH,KAAK,CAAC,EAAE;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAAA;IACrD,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAA;QACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACnC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;QAC5B,oBAAoB,EAAE,KAAK,CAAA;KAC5B,CAAA;IACD;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE;QACb,IAAI,EAAE,QAAQ,CAAA;QACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACpC,CAAA;IACD,kDAAkD;IAClD,MAAM,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CACtF;AAED;;;;;;GAMG;AACH,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAA;IACnB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf;AAuHD,wFAAwF;AACxF,eAAO,MAAM,iBAAiB,EAAE,SAAS,cAAc,EAyqCtD,CAAA;AAED,wEAAwE;AACxE,eAAO,MAAM,8BAA8B,EAAE,SAAS,0BAA0B,EAmB/E,CAAA;AAED,kEAAkE;AAClE,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBpE,CAAA"}
@@ -163,7 +163,7 @@ export const CAT_FACTORY_TOOLS = [
163
163
  readOnly: false,
164
164
  description: 'Create a service\n\nCreate a board service, optionally backed by a repository from `GET /api/v1/repos`. The repository link is what makes the service runnable: execution resolves a task’s repository by walking up to its enclosing service frame, so a service with none holds tasks and can start none of them. A whole-repo repository that already backs a service in this account is MOUNTED rather than duplicated; a monorepo service must name its subdirectory. The board lays the service out itself: this surface publishes no coordinates. Requires an `admin` key.\n\nCalls `POST /api/v1/services` (operation `createPublicService`).',
165
165
  inputSchema: { "type": "object", "properties": { "body": { "type": "object", "properties": { "description": { "type": "string", "maxLength": 2000 }, "repo": { "type": "object", "properties": { "directory": { "type": "string", "maxLength": 400 }, "monorepo": { "type": "boolean" }, "repoId": { "type": "number" } }, "required": ["repoId"] }, "title": { "type": "string", "minLength": 1, "maxLength": 200 }, "type": { "type": "string", "enum": ["service", "frontend", "library", "document"] } }, "description": "The request body." } }, "additionalProperties": false },
166
- outputSchema: { "type": "object", "properties": { "description": { "type": "string" }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "title": { "type": "string" }, "type": { "type": "string", "description": "One of: frontend, service, library, document, api, database, queue, integration, external, environment. A newer deployment may report a member not in this list." } } },
166
+ outputSchema: { "type": "object", "properties": { "description": { "type": "string" }, "provisioning": { "description": "Discriminated by `type` (kubernetes). A newer deployment may report a variant not in this list." }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "title": { "type": "string" }, "type": { "type": "string", "description": "One of: frontend, service, library, document, api, database, queue, integration, external, environment. A newer deployment may report a member not in this list." } } },
167
167
  invoke: (client, args) => client.services.create(args.body),
168
168
  },
169
169
  {
@@ -174,9 +174,20 @@ export const CAT_FACTORY_TOOLS = [
174
174
  readOnly: true,
175
175
  description: 'List the workspace\'s services\n\nList the board service frames in the key’s workspace, so a caller can discover the serviceId to create/list tasks under.\n\nCalls `GET /api/v1/services` (operation `listPublicServices`).',
176
176
  inputSchema: { "type": "object", "properties": {}, "additionalProperties": false },
177
- outputSchema: { "type": "object", "properties": { "services": { "type": "array", "items": { "type": "object", "properties": { "description": { "type": "string" }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "title": { "type": "string" }, "type": { "type": "string", "description": "One of: frontend, service, library, document, api, database, queue, integration, external, environment. A newer deployment may report a member not in this list." } } } } } },
177
+ outputSchema: { "type": "object", "properties": { "services": { "type": "array", "items": { "type": "object", "properties": { "description": { "type": "string" }, "provisioning": { "description": "Discriminated by `type` (kubernetes). A newer deployment may report a variant not in this list." }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "title": { "type": "string" }, "type": { "type": "string", "description": "One of: frontend, service, library, document, api, database, queue, integration, external, environment. A newer deployment may report a member not in this list." } } } } } },
178
178
  invoke: (client, args) => client.services.list(),
179
179
  },
180
+ {
181
+ name: 'services_update',
182
+ title: 'Patch a service, including where its per-run manifests live',
183
+ group: 'services',
184
+ operationId: 'updatePublicService',
185
+ readOnly: false,
186
+ description: 'Patch a service, including where its per-run manifests live\n\nChange a service’s authored fields, and declare its `provisioning`: where the manifests for a per-run environment are read from. That second half is what a connected cluster alone cannot supply, because the platform keeps “which cluster” (one per workspace) apart from “which manifests” (one set per service). An omitted `provisioning` leaves the stored one alone rather than clearing it. Board coordinates are deliberately absent, as they are on service creation.\n\nCalls `PATCH /api/v1/services/{serviceId}` (operation `updatePublicService`).',
187
+ inputSchema: { "type": "object", "properties": { "serviceId": { "type": "string", "description": "Path parameter `serviceId`." }, "body": { "type": "object", "properties": { "description": { "type": "string", "maxLength": 2000 }, "provisioning": { "anyOf": [{ "type": "object", "properties": { "manifestSource": { "anyOf": [{ "type": "object", "properties": { "path": { "type": "string", "minLength": 1, "maxLength": 500 }, "renderer": { "type": "string", "enum": ["raw", "kustomize"] }, "type": { "const": "colocated" } }, "required": ["path", "type"] }, { "type": "object", "properties": { "path": { "type": "string", "minLength": 1, "maxLength": 500 }, "ref": { "type": "string", "minLength": 1 }, "renderer": { "type": "string", "enum": ["raw", "kustomize"] }, "repo": { "type": "string" }, "type": { "const": "separate" } }, "required": ["path", "repo", "type"] }], "description": "Discriminated by `type` (colocated | separate)." }, "type": { "const": "kubernetes" } }, "required": ["manifestSource", "type"] }], "description": "Discriminated by `type` (kubernetes)." }, "title": { "type": "string", "minLength": 1, "maxLength": 200 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["serviceId"] },
188
+ outputSchema: { "type": "object", "properties": { "description": { "type": "string" }, "provisioning": { "description": "Discriminated by `type` (kubernetes). A newer deployment may report a variant not in this list." }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "title": { "type": "string" }, "type": { "type": "string", "description": "One of: frontend, service, library, document, api, database, queue, integration, external, environment. A newer deployment may report a member not in this list." } } },
189
+ invoke: (client, args) => client.services.update(str(args, 'serviceId'), args.body),
190
+ },
180
191
  {
181
192
  name: 'spec_get',
182
193
  title: 'Get a service\'s in-repo specification',
@@ -199,6 +210,28 @@ export const CAT_FACTORY_TOOLS = [
199
210
  outputSchema: { "type": "object", "properties": { "anchor": { "type": "string", "description": "One of: present, absent, unparsed, not_read. A newer deployment may report a member not in this list." }, "features": { "type": "array", "items": { "type": "object", "properties": { "chars": { "type": "number" }, "content": { "type": "string" }, "group": { "type": "string" }, "module": { "type": "string" }, "path": { "type": "string" }, "totalChars": { "type": "number" }, "truncated": { "type": "boolean" } } } }, "issues": { "type": "array", "items": { "type": "object", "properties": { "dropped": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "kind": { "type": "string", "description": "One of: read_failed, unparsed, partial, unread. A newer deployment may report a member not in this list." }, "path": { "type": "string" } } } }, "provenance": { "anyOf": [{ "type": "object", "properties": { "commit": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "owner": { "type": "string" }, "provider": { "type": "string", "description": "One of: github, gitlab. A newer deployment may report a member not in this list." }, "ref": { "type": "string" }, "repo": { "type": "string" } } }, { "type": "null" }] }, "runId": { "type": "string" }, "spec": { "anyOf": [{ "type": "object", "properties": { "modules": { "type": "array", "items": { "type": "object", "properties": { "groups": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "requirements": { "type": "array", "items": { "type": "object", "properties": { "acceptance": { "type": "array", "items": { "type": "object", "properties": { "given": { "type": "string" }, "id": { "type": "string" }, "outcome": { "type": "string" }, "when": { "type": "string" } } } }, "id": { "type": "string" }, "kind": { "type": "string", "description": "One of: functional, nonfunctional, constraint. A newer deployment may report a member not in this list." }, "priority": { "type": "string", "description": "One of: must, should, could. A newer deployment may report a member not in this list." }, "sourceBlockIds": { "type": "array", "items": { "type": "string" } }, "state": { "type": "string", "description": "One of: aspirational, established. A newer deployment may report a member not in this list." }, "statement": { "type": "string" }, "title": { "type": "string" } } } }, "rules": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "rationale": { "type": "string" }, "rule": { "type": "string" }, "sourceBlockIds": { "type": "array", "items": { "type": "string" } } } } }, "summary": { "type": "string" } } } }, "name": { "type": "string" }, "summary": { "type": "string" } } } }, "service": { "type": "string" }, "summary": { "type": "string" } } }, { "type": "null" }] }, "truncations": { "type": "array", "items": { "type": "object", "properties": { "section": { "type": "string", "description": "One of: requirements, rules, acceptance, features, issues. A newer deployment may report a member not in this list." }, "shown": { "type": "number" }, "total": { "type": "number" } } } } } },
200
211
  invoke: (client, args) => client.spec.getForRun(str(args, 'runId')),
201
212
  },
213
+ {
214
+ name: 'repos_bootstrap',
215
+ title: 'Create a repository and adapt it with the bootstrapper agent',
216
+ group: 'repos',
217
+ operationId: 'startPublicRepoBootstrap',
218
+ readOnly: false,
219
+ description: 'Create a repository and adapt it with the bootstrapper agent\n\nCreate a brand-new repository under the account the workspace is connected to, then run the bootstrapper agent in a container to write it against the supplied brief (or to adapt a reference architecture). Answers 201 with a job to poll rather than blocking for the minutes a container takes. The job names the board service frame it materialises, so work can be filed against the service before the repository has finished being written. This is the one act of board setup with no other public counterpart: creating a service takes a repoId, and nothing else here makes one.\n\nCalls `POST /api/v1/repos/bootstrap` (operation `startPublicRepoBootstrap`).',
220
+ inputSchema: { "type": "object", "properties": { "body": { "type": "object", "properties": { "description": { "type": "string", "maxLength": 2000 }, "instructions": { "type": "string", "maxLength": 8000 }, "private": { "type": "boolean" }, "referenceArchitectureId": { "type": "string", "minLength": 1 }, "repoName": { "type": "string", "minLength": 1, "maxLength": 100 }, "type": { "type": "string", "enum": ["service", "frontend", "library", "document"] } }, "required": ["repoName"], "description": "The request body." } }, "additionalProperties": false, "required": ["body"] },
221
+ outputSchema: { "type": "object", "properties": { "createdAt": { "type": "number" }, "error": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "failureDetail": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "failureHint": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "failureKind": { "anyOf": [{ "type": "string", "description": "One of: preflight, dispatch, environment, evicted, timeout, agent, job_failed, rejected, companion_rejected, stalled, cancelled, unknown. A newer deployment may report a member not in this list." }, { "type": "null" }] }, "jobId": { "type": "string" }, "progress": { "anyOf": [{ "type": "object", "properties": { "completed": { "type": "number" }, "inProgress": { "type": "number" }, "items": { "type": "array", "items": { "type": "object", "properties": { "label": { "type": "string" }, "status": { "type": "string", "description": "One of: pending, in_progress, completed. A newer deployment may report a member not in this list." } } } }, "total": { "type": "number" } } }, { "type": "null" }] }, "repoName": { "type": "string" }, "repoOwner": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "repoUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "status": { "type": "string", "description": "One of: pending, running, succeeded, failed. A newer deployment may report a member not in this list." }, "updatedAt": { "type": "number" } } },
222
+ invoke: (client, args) => client.repos.bootstrap(args.body),
223
+ },
224
+ {
225
+ name: 'repos_get_bootstrap',
226
+ title: 'Poll one repository bootstrap',
227
+ group: 'repos',
228
+ operationId: 'getPublicRepoBootstrap',
229
+ readOnly: true,
230
+ description: 'Poll one repository bootstrap\n\nRead a bootstrap run’s current state. `failureKind` says whether a retry could plausibly help: a `preflight` refusal (the target repository already has content, nothing is connected) cannot be retried into success, where an `evicted` container can.\n\nCalls `GET /api/v1/repos/bootstrap/{jobId}` (operation `getPublicRepoBootstrap`).',
231
+ inputSchema: { "type": "object", "properties": { "jobId": { "type": "string", "description": "Path parameter `jobId`." } }, "additionalProperties": false, "required": ["jobId"] },
232
+ outputSchema: { "type": "object", "properties": { "createdAt": { "type": "number" }, "error": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "failureDetail": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "failureHint": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "failureKind": { "anyOf": [{ "type": "string", "description": "One of: preflight, dispatch, environment, evicted, timeout, agent, job_failed, rejected, companion_rejected, stalled, cancelled, unknown. A newer deployment may report a member not in this list." }, { "type": "null" }] }, "jobId": { "type": "string" }, "progress": { "anyOf": [{ "type": "object", "properties": { "completed": { "type": "number" }, "inProgress": { "type": "number" }, "items": { "type": "array", "items": { "type": "object", "properties": { "label": { "type": "string" }, "status": { "type": "string", "description": "One of: pending, in_progress, completed. A newer deployment may report a member not in this list." } } } }, "total": { "type": "number" } } }, { "type": "null" }] }, "repoName": { "type": "string" }, "repoOwner": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "repoUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "status": { "type": "string", "description": "One of: pending, running, succeeded, failed. A newer deployment may report a member not in this list." }, "updatedAt": { "type": "number" } } },
233
+ invoke: (client, args) => client.repos.getBootstrap(str(args, 'jobId')),
234
+ },
202
235
  {
203
236
  name: 'repos_list',
204
237
  title: 'List the repositories a service can be created against',
@@ -218,7 +251,7 @@ export const CAT_FACTORY_TOOLS = [
218
251
  readOnly: false,
219
252
  description: 'Declare that a task waits for another\n\nRecord that this task cannot start until `dependsOnTaskId` is done. Both ends must be tasks in this workspace, and an edge that would close a cycle is refused. Idempotent: an edge that already exists is returned as-is rather than toggled off, so a provisioning integration re-running its own setup converges. Pair it with `autoStartDependents` on the BLOCKER (the task patch) to have the chain run itself.\n\nCalls `POST /api/v1/tasks/{taskId}/dependencies` (operation `addPublicTaskDependency`).',
220
253
  inputSchema: { "type": "object", "properties": { "taskId": { "type": "string", "description": "Path parameter `taskId`." }, "body": { "type": "object", "properties": { "dependsOnTaskId": { "type": "string", "minLength": 1, "maxLength": 120 } }, "required": ["dependsOnTaskId"], "description": "The request body." } }, "additionalProperties": false, "required": ["taskId", "body"] },
221
- outputSchema: { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "dependsOn": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "progress": { "type": "number" }, "pullRequestUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph, recurring. Other values are accepted where the deployment defines them." }, "title": { "type": "string" } } },
254
+ outputSchema: { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "dependsOn": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "modelPresetId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "progress": { "type": "number" }, "pullRequestUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "riskPolicyId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph, recurring. Other values are accepted where the deployment defines them." }, "title": { "type": "string" } } },
222
255
  invoke: (client, args) => client.tasks.addDependency(str(args, 'taskId'), args.body),
223
256
  },
224
257
  {
@@ -239,8 +272,8 @@ export const CAT_FACTORY_TOOLS = [
239
272
  operationId: 'createPublicTask',
240
273
  readOnly: false,
241
274
  description: 'Create a task under a service\n\nCreate a task inside a service frame the key’s workspace owns. The task starts in the `planned` state; start it with the start endpoint. Optionally file it FROM a tracker ticket, and/or attach the requirements documents it is to be built against (named in a connected document source, or uploaded inline): the only way to get spec-sized input onto a repository-touching run.\n\nCalls `POST /api/v1/services/{serviceId}/tasks` (operation `createPublicTask`).',
242
- inputSchema: { "type": "object", "properties": { "serviceId": { "type": "string", "description": "Path parameter `serviceId`." }, "body": { "type": "object", "properties": { "description": { "type": "string", "maxLength": 2000 }, "documents": { "type": "array", "items": { "anyOf": [{ "type": "object", "properties": { "kind": { "const": "source" }, "ref": { "type": "string", "minLength": 1, "maxLength": 500 }, "source": { "type": "string", "enum": ["confluence", "notion", "github", "figma", "zeplin", "linear"] } }, "required": ["kind", "ref", "source"] }, { "type": "object", "properties": { "content": { "type": "string", "minLength": 1, "maxLength": 100000 }, "kind": { "const": "upload" }, "title": { "type": "string", "minLength": 1, "maxLength": 200 } }, "required": ["content", "kind", "title"] }], "description": "Discriminated by `kind` (source | upload)." } }, "fields": { "type": "object", "additionalProperties": { "anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }, { "type": "boolean" }, { "type": "number" }] } }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph. Other values are accepted where the deployment defines them." }, "ticket": { "type": "object", "properties": { "ref": { "type": "string", "minLength": 1, "maxLength": 500 }, "source": { "type": "string", "description": "Usually one of: jira, github, linear, gitlab. Other values are accepted where the deployment defines them." } }, "required": ["ref", "source"] }, "title": { "type": "string", "minLength": 1, "maxLength": 200 } }, "required": ["title"], "description": "The request body." } }, "additionalProperties": false, "required": ["serviceId", "body"] },
243
- outputSchema: { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "dependsOn": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "progress": { "type": "number" }, "pullRequestUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph, recurring. Other values are accepted where the deployment defines them." }, "title": { "type": "string" } } },
275
+ inputSchema: { "type": "object", "properties": { "serviceId": { "type": "string", "description": "Path parameter `serviceId`." }, "body": { "type": "object", "properties": { "description": { "type": "string", "maxLength": 2000 }, "documents": { "type": "array", "items": { "anyOf": [{ "type": "object", "properties": { "kind": { "const": "source" }, "ref": { "type": "string", "minLength": 1, "maxLength": 500 }, "source": { "type": "string", "enum": ["confluence", "notion", "github", "figma", "zeplin", "linear"] } }, "required": ["kind", "ref", "source"] }, { "type": "object", "properties": { "content": { "type": "string", "minLength": 1, "maxLength": 100000 }, "kind": { "const": "upload" }, "title": { "type": "string", "minLength": 1, "maxLength": 200 } }, "required": ["content", "kind", "title"] }], "description": "Discriminated by `kind` (source | upload)." } }, "fields": { "type": "object", "additionalProperties": { "anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }, { "type": "boolean" }, { "type": "number" }] } }, "modelPresetId": { "type": "string", "minLength": 1, "maxLength": 120 }, "riskPolicyId": { "type": "string", "minLength": 1, "maxLength": 120 }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph. Other values are accepted where the deployment defines them." }, "ticket": { "type": "object", "properties": { "ref": { "type": "string", "minLength": 1, "maxLength": 500 }, "source": { "type": "string", "description": "Usually one of: jira, github, linear, gitlab. Other values are accepted where the deployment defines them." } }, "required": ["ref", "source"] }, "title": { "type": "string", "minLength": 1, "maxLength": 200 } }, "required": ["title"], "description": "The request body." } }, "additionalProperties": false, "required": ["serviceId", "body"] },
276
+ outputSchema: { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "dependsOn": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "modelPresetId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "progress": { "type": "number" }, "pullRequestUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "riskPolicyId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph, recurring. Other values are accepted where the deployment defines them." }, "title": { "type": "string" } } },
244
277
  invoke: (client, args) => client.tasks.create(str(args, 'serviceId'), args.body),
245
278
  },
246
279
  {
@@ -272,7 +305,7 @@ export const CAT_FACTORY_TOOLS = [
272
305
  readOnly: true,
273
306
  description: 'Get a task\'s status\n\nRead a task’s current lifecycle status, run progress, run id, and PR URL (once one exists).\n\nCalls `GET /api/v1/tasks/{taskId}` (operation `getPublicTask`).',
274
307
  inputSchema: { "type": "object", "properties": { "taskId": { "type": "string", "description": "Path parameter `taskId`." } }, "additionalProperties": false, "required": ["taskId"] },
275
- outputSchema: { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "dependsOn": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "progress": { "type": "number" }, "pullRequestUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph, recurring. Other values are accepted where the deployment defines them." }, "title": { "type": "string" } } },
308
+ outputSchema: { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "dependsOn": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "modelPresetId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "progress": { "type": "number" }, "pullRequestUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "riskPolicyId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph, recurring. Other values are accepted where the deployment defines them." }, "title": { "type": "string" } } },
276
309
  invoke: (client, args) => client.tasks.get(str(args, 'taskId')),
277
310
  },
278
311
  {
@@ -294,7 +327,7 @@ export const CAT_FACTORY_TOOLS = [
294
327
  readOnly: true,
295
328
  description: 'List a service\'s tasks\n\nList every task under a service (the whole subtree — tasks directly under the frame and under its modules).\n\nCalls `GET /api/v1/services/{serviceId}/tasks` (operation `listPublicServiceTasks`).',
296
329
  inputSchema: { "type": "object", "properties": { "serviceId": { "type": "string", "description": "Path parameter `serviceId`." }, "limit": { "type": "integer" }, "cursor": { "type": "string" }, "status": { "type": "string", "enum": ["planned", "ready", "in_progress", "blocked", "pr_ready", "done"] } }, "additionalProperties": false, "required": ["serviceId"] },
297
- outputSchema: { "type": "object", "properties": { "nextCursor": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "tasks": { "type": "array", "items": { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "dependsOn": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "progress": { "type": "number" }, "pullRequestUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph, recurring. Other values are accepted where the deployment defines them." }, "title": { "type": "string" } } } } } },
330
+ outputSchema: { "type": "object", "properties": { "nextCursor": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "tasks": { "type": "array", "items": { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "dependsOn": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "modelPresetId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "progress": { "type": "number" }, "pullRequestUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "riskPolicyId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph, recurring. Other values are accepted where the deployment defines them." }, "title": { "type": "string" } } } } } },
298
331
  invoke: (client, args) => client.tasks.listByService(str(args, 'serviceId'), pick(args, QUERY_TASKS_LIST_BY_SERVICE)),
299
332
  },
300
333
  {
@@ -316,7 +349,7 @@ export const CAT_FACTORY_TOOLS = [
316
349
  readOnly: false,
317
350
  description: 'Drop a dependency edge\n\nRemove the ordering between this task and `dependsOnTaskId`. Idempotent: an edge that is not there is a no-op.\n\nCalls `POST /api/v1/tasks/{taskId}/dependencies/remove` (operation `removePublicTaskDependency`).',
318
351
  inputSchema: { "type": "object", "properties": { "taskId": { "type": "string", "description": "Path parameter `taskId`." }, "body": { "type": "object", "properties": { "dependsOnTaskId": { "type": "string", "minLength": 1, "maxLength": 120 } }, "required": ["dependsOnTaskId"], "description": "The request body." } }, "additionalProperties": false, "required": ["taskId", "body"] },
319
- outputSchema: { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "dependsOn": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "progress": { "type": "number" }, "pullRequestUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph, recurring. Other values are accepted where the deployment defines them." }, "title": { "type": "string" } } },
352
+ outputSchema: { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "dependsOn": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "modelPresetId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "progress": { "type": "number" }, "pullRequestUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "riskPolicyId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph, recurring. Other values are accepted where the deployment defines them." }, "title": { "type": "string" } } },
320
353
  invoke: (client, args) => client.tasks.removeDependency(str(args, 'taskId'), args.body),
321
354
  },
322
355
  {
@@ -328,7 +361,7 @@ export const CAT_FACTORY_TOOLS = [
328
361
  hints: { "destructive": true, "idempotent": false },
329
362
  description: 'Retry a task\'s failed run\n\nRetry a task’s failed run. A task on an individual-usage model cannot be retried through the API (no headless personal-credential unlock).\n\nCalls `POST /api/v1/tasks/{taskId}/retry` (operation `retryPublicTask`).',
330
363
  inputSchema: { "type": "object", "properties": { "taskId": { "type": "string", "description": "Path parameter `taskId`." } }, "additionalProperties": false, "required": ["taskId"] },
331
- outputSchema: { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "dependsOn": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "progress": { "type": "number" }, "pullRequestUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph, recurring. Other values are accepted where the deployment defines them." }, "title": { "type": "string" } } },
364
+ outputSchema: { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "dependsOn": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "modelPresetId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "progress": { "type": "number" }, "pullRequestUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "riskPolicyId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph, recurring. Other values are accepted where the deployment defines them." }, "title": { "type": "string" } } },
332
365
  invoke: (client, args) => client.tasks.retry(str(args, 'taskId')),
333
366
  },
334
367
  {
@@ -340,7 +373,7 @@ export const CAT_FACTORY_TOOLS = [
340
373
  hints: { "destructive": true, "idempotent": false },
341
374
  description: 'Start (run) a task\n\nStart a task’s pipeline. Uses the request’s pipelineId, else the task’s pinned pipeline. A pipeline that can park on a human decision requires a `decide`-scope key. A task on an individual-usage model cannot be started through the API (no headless personal-credential unlock).\n\nCalls `POST /api/v1/tasks/{taskId}/start` (operation `startPublicTask`).',
342
375
  inputSchema: { "type": "object", "properties": { "taskId": { "type": "string", "description": "Path parameter `taskId`." }, "body": { "type": "object", "properties": { "pipelineId": { "type": "string", "minLength": 1, "maxLength": 120 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["taskId"] },
343
- outputSchema: { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "dependsOn": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "progress": { "type": "number" }, "pullRequestUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph, recurring. Other values are accepted where the deployment defines them." }, "title": { "type": "string" } } },
376
+ outputSchema: { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "dependsOn": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "modelPresetId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "progress": { "type": "number" }, "pullRequestUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "riskPolicyId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph, recurring. Other values are accepted where the deployment defines them." }, "title": { "type": "string" } } },
344
377
  invoke: (client, args) => client.tasks.start(str(args, 'taskId'), args.body),
345
378
  },
346
379
  {
@@ -351,7 +384,7 @@ export const CAT_FACTORY_TOOLS = [
351
384
  readOnly: false,
352
385
  description: 'Stop a task\'s run\n\nStop a task’s in-flight run. Records a `cancelled` terminal state, leaving the run retryable.\n\nCalls `POST /api/v1/tasks/{taskId}/stop` (operation `stopPublicTask`).',
353
386
  inputSchema: { "type": "object", "properties": { "taskId": { "type": "string", "description": "Path parameter `taskId`." } }, "additionalProperties": false, "required": ["taskId"] },
354
- outputSchema: { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "dependsOn": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "progress": { "type": "number" }, "pullRequestUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph, recurring. Other values are accepted where the deployment defines them." }, "title": { "type": "string" } } },
387
+ outputSchema: { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "dependsOn": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "modelPresetId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "progress": { "type": "number" }, "pullRequestUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "riskPolicyId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph, recurring. Other values are accepted where the deployment defines them." }, "title": { "type": "string" } } },
355
388
  invoke: (client, args) => client.tasks.stop(str(args, 'taskId')),
356
389
  },
357
390
  {
@@ -361,8 +394,8 @@ export const CAT_FACTORY_TOOLS = [
361
394
  operationId: 'updatePublicTask',
362
395
  readOnly: false,
363
396
  description: 'Edit a task\'s inputs\n\nEdit a task’s human-authored inputs before it runs: its title, its description, and `fields`, the per-case values for its own task type (checked against the descriptors `GET /api/v1/task-types` serves). All are optional. `fields` is MERGED over what the task already carries — a key you send is written, a key you omit keeps its stored value — because this API does not serve the bag back. This is what makes an input the pre-dispatch gate refused repairable: supply the value it named, then recheck the parked run.\n\nCalls `PATCH /api/v1/tasks/{taskId}` (operation `updatePublicTask`).',
364
- inputSchema: { "type": "object", "properties": { "taskId": { "type": "string", "description": "Path parameter `taskId`." }, "body": { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "description": { "type": "string", "maxLength": 2000 }, "fields": { "type": "object", "additionalProperties": { "anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }, { "type": "boolean" }, { "type": "number" }] } }, "title": { "type": "string", "minLength": 1, "maxLength": 200 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["taskId"] },
365
- outputSchema: { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "dependsOn": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "progress": { "type": "number" }, "pullRequestUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph, recurring. Other values are accepted where the deployment defines them." }, "title": { "type": "string" } } },
397
+ inputSchema: { "type": "object", "properties": { "taskId": { "type": "string", "description": "Path parameter `taskId`." }, "body": { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "description": { "type": "string", "maxLength": 2000 }, "fields": { "type": "object", "additionalProperties": { "anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }, { "type": "boolean" }, { "type": "number" }] } }, "modelPresetId": { "type": "string", "minLength": 1, "maxLength": 120 }, "riskPolicyId": { "type": "string", "minLength": 1, "maxLength": 120 }, "title": { "type": "string", "minLength": 1, "maxLength": 200 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["taskId"] },
398
+ outputSchema: { "type": "object", "properties": { "autoStartDependents": { "type": "boolean" }, "dependsOn": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "modelPresetId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "progress": { "type": "number" }, "pullRequestUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "riskPolicyId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "serviceId": { "type": "string" }, "status": { "type": "string", "description": "One of: planned, ready, in_progress, blocked, pr_ready, done. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "taskType": { "type": "string", "description": "Usually one of: feature, bug, document, spike, review, ralph, recurring. Other values are accepted where the deployment defines them." }, "title": { "type": "string" } } },
366
399
  invoke: (client, args) => client.tasks.update(str(args, 'taskId'), args.body),
367
400
  },
368
401
  {
@@ -421,6 +454,72 @@ export const CAT_FACTORY_TOOLS = [
421
454
  outputSchema: { "type": "object", "properties": { "notifications": { "type": "array", "items": { "type": "object", "properties": { "blockId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "body": { "type": "string" }, "createdAt": { "type": "number" }, "executionId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "id": { "type": "string" }, "payload": { "anyOf": [{ "type": "object", "properties": { "assessment": { "type": "object", "properties": { "complexity": { "type": "number" }, "impact": { "type": "number" }, "rationale": { "type": "string" }, "risk": { "type": "number" } } }, "budgetAlerts": { "type": "array", "items": { "type": "object", "properties": { "projectedOverrun": { "type": "boolean" }, "threshold": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "tier": { "type": "string", "description": "One of: workspace, account. A newer deployment may report a member not in this list." } } } }, "budgetPeriodStart": { "type": "number" }, "changeClass": { "type": "string", "description": "One of: docs, test, dependency, config, source, schema, unknown. A newer deployment may report a member not in this list." }, "driftAffected": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "label": { "type": "string" }, "reason": { "type": "string", "description": "One of: key-mismatch, corrupt. A newer deployment may report a member not in this list." }, "sealedAt": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "source": { "type": "string" } } } }, "findingCount": { "type": "number" }, "forkCount": { "type": "number" }, "initiativeReason": { "type": "string", "description": "One of: item_blocked, complete, checkpoint. A newer deployment may report a member not in this list." }, "mergeTrackRecordId": { "type": "string" }, "mergedRepos": { "type": "array", "items": { "type": "string" } }, "onCallAssessment": { "type": "object", "properties": { "culpritConfidence": { "type": "number" }, "evidence": { "type": "array", "items": { "type": "string" } }, "rationale": { "type": "string" }, "recommendation": { "type": "string", "description": "One of: revert, hold, monitor. A newer deployment may report a member not in this list." } } }, "pipelineName": { "type": "string" }, "platformAlertFailureKinds": { "type": "array", "items": { "type": "string" } }, "platformAlertTransition": { "type": "number" }, "platformAlerts": { "type": "array", "items": { "type": "string", "description": "One of: failure_rate_high, duration_p99_high, backlog_high, throughput_stalled, failure_kind_dominant, failure_kind_rate_high, sweep_degraded. A newer deployment may report a member not in this list." } }, "platformFailedTotal": { "type": "number" }, "platformFailingRuns": { "type": "array", "items": { "type": "object", "properties": { "blockId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "createdAt": { "type": "number" }, "executionId": { "type": "string" }, "failureKind": { "type": "string" } } } }, "platformWindow": { "type": "string", "description": "One of: 1h, 24h, 7d. A newer deployment may report a member not in this list." }, "prUrl": { "type": "string" }, "releaseSignals": { "type": "array", "items": { "type": "object", "properties": { "detail": { "type": "string" }, "id": { "type": "string" }, "kind": { "type": "string", "description": "One of: monitor, slo. A newer deployment may report a member not in this list." }, "name": { "type": "string" }, "state": { "type": "string", "description": "One of: ok, warn, alert, no_data. A newer deployment may report a member not in this list." } } } }, "revertUrl": { "type": "string" }, "sliceCount": { "type": "number" }, "targetUserId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "unmergedRepos": { "type": "array", "items": { "type": "string" } }, "unreachableAreas": { "type": "array", "items": { "type": "string", "description": "One of: ephemeralEnvironments, agentExecutor, binaryStorage. A newer deployment may report a member not in this list." } } } }, { "type": "null" }] }, "resolvedAt": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "severity": { "type": "string", "description": "One of: normal, urgent. A newer deployment may report a member not in this list." }, "status": { "type": "string", "description": "One of: open, acted, dismissed. A newer deployment may report a member not in this list." }, "title": { "type": "string" }, "type": { "type": "string", "description": "One of: merge_review, pipeline_complete, ci_failed, test_failed, requirement_review, clarity_review, release_regression, decision_required, human_test_ready, visual_confirmation_ready, human_review, followup_pending, fork_decision_pending, judge_review, pr_review_ready, initiative, platform_health, infra_unreachable, budget_paused, budget_threshold, key_drift, merge_tag_request. A newer deployment may report a member not in this list." } } } } } },
422
455
  invoke: (client, args) => client.notifications.list(),
423
456
  },
457
+ {
458
+ name: 'environments_connect',
459
+ title: 'Connect the workspace to the cluster its environments deploy onto',
460
+ group: 'environments',
461
+ operationId: 'connectPublicEnvironment',
462
+ readOnly: false,
463
+ description: 'Connect the workspace to the cluster its environments deploy onto\n\nBind environment provisioning to a Kubernetes cluster: the apiserver, how its TLS is verified, the namespace template, and how an environment URL is derived once manifests are applied. The secret bundle authenticating the connection is write-only; the response reports which secret KEYS were stored and never their values. Idempotent, so re-connecting replaces rather than accumulating.\n\nCalls `POST /api/v1/environments/connections` (operation `connectPublicEnvironment`).',
464
+ inputSchema: { "type": "object", "properties": { "body": { "type": "object", "properties": { "connection": { "anyOf": [{ "type": "object", "properties": { "engine": { "const": "kubernetes" }, "kubernetes": { "type": "object", "properties": { "annotations": { "type": "object", "additionalProperties": { "type": "string" } }, "apiServerUrl": { "type": "string", "maxLength": 500 }, "caCertPem": { "type": "string" }, "defaultTtlMs": { "type": "number", "minimum": 60000 }, "imageTemplate": { "type": "string", "maxLength": 500 }, "insecureSkipTlsVerify": { "type": "boolean" }, "label": { "type": "string", "minLength": 1, "maxLength": 120 }, "labels": { "type": "object", "additionalProperties": { "type": "string" } }, "namespaceTemplate": { "type": "string", "minLength": 1, "maxLength": 200 }, "url": { "anyOf": [{ "type": "object", "properties": { "hostTemplate": { "type": "string", "minLength": 1, "maxLength": 500 }, "port": { "type": "integer", "minimum": 1, "maximum": 65535 }, "scheme": { "type": "string", "enum": ["http", "https"] }, "source": { "const": "ingressTemplate" } }, "required": ["hostTemplate", "source"] }, { "type": "object", "properties": { "ingressName": { "type": "string", "minLength": 1 }, "scheme": { "type": "string", "enum": ["http", "https"] }, "source": { "const": "ingressStatus" } }, "required": ["source"] }, { "type": "object", "properties": { "port": { "type": "integer", "minimum": 1, "maximum": 65535 }, "scheme": { "type": "string", "enum": ["http", "https"] }, "serviceName": { "type": "string", "minLength": 1 }, "source": { "const": "serviceStatus" } }, "required": ["serviceName", "source"] }, { "type": "object", "properties": { "gatewayName": { "type": "string", "minLength": 1 }, "scheme": { "type": "string", "enum": ["http", "https"] }, "source": { "const": "gatewayStatus" } }, "required": ["source"] }, { "type": "object", "properties": { "httpRouteName": { "type": "string", "minLength": 1 }, "scheme": { "type": "string", "enum": ["http", "https"] }, "source": { "const": "httpRouteStatus" } }, "required": ["source"] }], "description": "Discriminated by `source` (ingressTemplate | ingressStatus | serviceStatus | gatewayStatus | httpRouteStatus)." } }, "required": ["apiServerUrl", "label", "url"] } }, "required": ["engine", "kubernetes"] }], "description": "Discriminated by `engine` (kubernetes)." }, "secrets": { "type": "object", "additionalProperties": { "type": "string" } } }, "required": ["connection", "secrets"], "description": "The request body." } }, "additionalProperties": false, "required": ["body"] },
465
+ outputSchema: { "type": "object", "properties": { "apiServerUrl": { "type": "string" }, "engine": { "type": "string" }, "label": { "type": "string" }, "provisionType": { "type": "string" }, "secretKeys": { "type": "array", "items": { "type": "string" } } } },
466
+ invoke: (client, args) => client.environments.connect(args.body),
467
+ },
468
+ {
469
+ name: 'environments_test_connection',
470
+ title: 'Probe a candidate cluster connection without saving it',
471
+ group: 'environments',
472
+ operationId: 'testPublicEnvironmentConnection',
473
+ readOnly: false,
474
+ description: 'Probe a candidate cluster connection without saving it\n\nReach the apiserver with the supplied credentials and report what came back, persisting nothing. Worth a call of its own because the alternative is discovering an unreachable cluster or an expired token on the deploy step of a run that has already paid for a design pass and an implementation. A cluster that refuses the credential is an ANSWER, so it is a 200 carrying `ok: false` rather than an error.\n\nCalls `POST /api/v1/environments/connections/test` (operation `testPublicEnvironmentConnection`).',
475
+ inputSchema: { "type": "object", "properties": { "body": { "type": "object", "properties": { "connection": { "anyOf": [{ "type": "object", "properties": { "engine": { "const": "kubernetes" }, "kubernetes": { "type": "object", "properties": { "annotations": { "type": "object", "additionalProperties": { "type": "string" } }, "apiServerUrl": { "type": "string", "maxLength": 500 }, "caCertPem": { "type": "string" }, "defaultTtlMs": { "type": "number", "minimum": 60000 }, "imageTemplate": { "type": "string", "maxLength": 500 }, "insecureSkipTlsVerify": { "type": "boolean" }, "label": { "type": "string", "minLength": 1, "maxLength": 120 }, "labels": { "type": "object", "additionalProperties": { "type": "string" } }, "namespaceTemplate": { "type": "string", "minLength": 1, "maxLength": 200 }, "url": { "anyOf": [{ "type": "object", "properties": { "hostTemplate": { "type": "string", "minLength": 1, "maxLength": 500 }, "port": { "type": "integer", "minimum": 1, "maximum": 65535 }, "scheme": { "type": "string", "enum": ["http", "https"] }, "source": { "const": "ingressTemplate" } }, "required": ["hostTemplate", "source"] }, { "type": "object", "properties": { "ingressName": { "type": "string", "minLength": 1 }, "scheme": { "type": "string", "enum": ["http", "https"] }, "source": { "const": "ingressStatus" } }, "required": ["source"] }, { "type": "object", "properties": { "port": { "type": "integer", "minimum": 1, "maximum": 65535 }, "scheme": { "type": "string", "enum": ["http", "https"] }, "serviceName": { "type": "string", "minLength": 1 }, "source": { "const": "serviceStatus" } }, "required": ["serviceName", "source"] }, { "type": "object", "properties": { "gatewayName": { "type": "string", "minLength": 1 }, "scheme": { "type": "string", "enum": ["http", "https"] }, "source": { "const": "gatewayStatus" } }, "required": ["source"] }, { "type": "object", "properties": { "httpRouteName": { "type": "string", "minLength": 1 }, "scheme": { "type": "string", "enum": ["http", "https"] }, "source": { "const": "httpRouteStatus" } }, "required": ["source"] }], "description": "Discriminated by `source` (ingressTemplate | ingressStatus | serviceStatus | gatewayStatus | httpRouteStatus)." } }, "required": ["apiServerUrl", "label", "url"] } }, "required": ["engine", "kubernetes"] }], "description": "Discriminated by `engine` (kubernetes)." }, "secrets": { "type": "object", "additionalProperties": { "type": "string" } } }, "required": ["connection"], "description": "The request body." } }, "additionalProperties": false, "required": ["body"] },
476
+ outputSchema: { "type": "object", "properties": { "message": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "ok": { "type": "boolean" } } },
477
+ invoke: (client, args) => client.environments.testConnection(args.body),
478
+ },
479
+ {
480
+ name: 'models_list',
481
+ title: 'List the models a run in this workspace could dispatch to',
482
+ group: 'models',
483
+ operationId: 'listPublicWiredModels',
484
+ readOnly: true,
485
+ description: 'List the models a run in this workspace could dispatch to\n\nThe workspace’s model catalog with the two flags that decide whether an agent step can run at all: `available`, and `policyBlocked` for a model that is configured but refused by the account’s model-family policy. Those two need OPPOSITE fixes, which is why they are separate: everything blocked by policy is already configured, so adding another provider key changes nothing.\n\nCalls `GET /api/v1/models` (operation `listPublicWiredModels`).',
486
+ inputSchema: { "type": "object", "properties": {}, "additionalProperties": false },
487
+ outputSchema: { "type": "object", "properties": { "excludesUserScopedModels": { "type": "boolean" }, "models": { "type": "array", "items": { "type": "object", "properties": { "available": { "type": "boolean" }, "label": { "type": "string" }, "modelId": { "type": "string" }, "policyBlocked": { "type": "boolean" }, "provider": { "type": "string" } } } } } },
488
+ invoke: (client, args) => client.models.list(),
489
+ },
490
+ {
491
+ name: 'vcs_get_connection',
492
+ title: 'Read the workspace’s source-control connection and what it may do',
493
+ group: 'vcs',
494
+ operationId: 'getPublicVcsConnection',
495
+ readOnly: true,
496
+ description: 'Read the workspace’s source-control connection and what it may do\n\nThe connected account, how the workspace authenticates to it, and the two permissions that decide whether an automated flow can complete: whether the platform may create repositories, and whether it may write workflow files. Both are enforced by the provider at push time, so a caller that cannot read them discovers a missing workflow permission as a repository that bootstrapped and then failed to gain its CI workflow. Provider-neutral: a GitLab-connected workspace answers here too. `connection` is null when nothing is connected, which is a state rather than an error.\n\nCalls `GET /api/v1/vcs/connection` (operation `getPublicVcsConnection`).',
497
+ inputSchema: { "type": "object", "properties": {}, "additionalProperties": false },
498
+ outputSchema: { "type": "object", "properties": { "connection": { "anyOf": [{ "type": "object", "properties": { "accountLogin": { "type": "string" }, "canCreateRepos": { "type": "boolean" }, "canManageWorkflows": { "type": "boolean" }, "method": { "type": "string", "description": "One of: app, pat. A newer deployment may report a member not in this list." }, "provider": { "type": "string", "description": "One of: github, gitlab. A newer deployment may report a member not in this list." } } }, { "type": "null" }] } } },
499
+ invoke: (client, args) => client.vcs.getConnection(),
500
+ },
501
+ {
502
+ name: 'risk_policies_list',
503
+ title: 'List the workspace’s risk policies',
504
+ group: 'risk_policies',
505
+ operationId: 'listPublicRiskPolicies',
506
+ readOnly: true,
507
+ description: 'List the workspace’s risk policies\n\nThe policy library, including which row is the workspace default that a task pinning none resolves. `autoMergeEnabled` is the master switch that decides whether a run can land its pull request without a person; `dryRunRoles` names the roles whose runs the policy forces into dry-run mode, which is the difference between “this policy merges” and “this policy merges for everyone except one role”. A policy also caps CI-fixer attempts, requirement and tester iteration rounds and the release-health watch, which is why it is not called a merge preset; the id is what a task pins as `riskPolicyId`.\n\nCalls `GET /api/v1/risk-policies` (operation `listPublicRiskPolicies`).',
508
+ inputSchema: { "type": "object", "properties": {}, "additionalProperties": false },
509
+ outputSchema: { "type": "object", "properties": { "policies": { "type": "array", "items": { "type": "object", "properties": { "autoMergeEnabled": { "type": "boolean" }, "ciMaxAttempts": { "type": "number" }, "dryRunRoles": { "type": "array", "items": { "type": "string", "description": "One of: admin, member, viewer. A newer deployment may report a member not in this list." } }, "isDefault": { "type": "boolean" }, "name": { "type": "string" }, "policyId": { "type": "string" }, "submissionRestrictedRoles": { "type": "array", "items": { "type": "string", "description": "One of: admin, member, viewer. A newer deployment may report a member not in this list." } } } } } } },
510
+ invoke: (client, args) => client.riskPolicies.list(),
511
+ },
512
+ {
513
+ name: 'model_presets_list',
514
+ title: 'List the workspace’s model presets',
515
+ group: 'model_presets',
516
+ operationId: 'listPublicModelPresets',
517
+ readOnly: true,
518
+ description: 'List the workspace’s model presets\n\nThe preset library, including which row is the workspace default that a task pinning none resolves. `baseModelId` is the model every agent step runs on under the preset, and `overrides` names the agent kinds that run on something else, which is usually the one that matters: two presets often differ only in what the CODER gets. Whether a preset can actually be dispatched to is NOT repeated here, because the models endpoint already answers it while keeping unconfigured apart from refused-by-policy; join on `baseModelId`.\n\nCalls `GET /api/v1/model-presets` (operation `listPublicModelPresets`).',
519
+ inputSchema: { "type": "object", "properties": {}, "additionalProperties": false },
520
+ outputSchema: { "type": "object", "properties": { "presets": { "type": "array", "items": { "type": "object", "properties": { "baseModelId": { "type": "string" }, "isDefault": { "type": "boolean" }, "name": { "type": "string" }, "overrides": { "type": "object", "additionalProperties": { "type": "string" } }, "presetId": { "type": "string" } } } } } },
521
+ invoke: (client, args) => client.modelPresets.list(),
522
+ },
424
523
  {
425
524
  name: 'webhook_delete',
426
525
  title: 'Remove the outbound webhook',
@@ -1228,13 +1327,18 @@ export const CAT_FACTORY_OMITTED_OPERATIONS = [
1228
1327
  /** One line per resource group, for the server's instructions. */
1229
1328
  export const CAT_FACTORY_TOOL_GROUPS = {
1230
1329
  'jobs': 'Headless jobs (a public, inline pipeline run against a brief): start, poll or stream one.',
1231
- 'services': 'The workspace\'s board services, the frames tasks are created under: list them, or create one (optionally backed by a repository).',
1330
+ 'services': 'The workspace\'s board services, the frames tasks are created under: list them, create one (optionally backed by a repository), or patch one, including declaring where the manifests for its per-run environments are read from.',
1232
1331
  'spec': 'A service\'s in-repo specification: the structured requirement tree (modules → feature groups → requirements, with their acceptance criteria and domain rules), the Gherkin rendered from it, and the branch and commit the read describes. Read-only; the requirement ids are the join key onto a run\'s report and outcome.',
1233
- 'repos': 'The repositories this workspace can back a service with, and which service each already backs: the discovery half of service creation.',
1332
+ 'repos': 'The repositories this workspace can back a service with, and which service each already backs (the discovery half of service creation), plus creating a brand-new one: a bootstrap writes the repository with an agent and reports the board service it materialises.',
1234
1333
  'tasks': 'A board task\'s whole lifecycle: create, edit, start, stop, retry, watch, delete, plus the two relationships that outlive a create: the tasks it waits for, and the requirements documents it is built against.',
1235
1334
  'pipelines': 'The pipelines a task can be started with, and whether each is headless-startable.',
1236
1335
  'task_types': 'What a task can be created AS in this workspace (the built-in kinds plus the operations the deployment registered), and the fields each one accepts.',
1237
1336
  'notifications': 'The workspace\'s human-actionable inbox: list, act on, or dismiss a run tail.',
1337
+ 'environments': 'The cluster this workspace provisions per-run environments onto: probe a candidate connection without saving it, or bind one. The credential is write-only, so a read reports which secret keys are stored and never their values.',
1338
+ 'models': 'The models a run in this workspace could actually dispatch to, and why an unavailable one is unavailable: unconfigured, or refused by the account model-family policy. Those two need opposite fixes.',
1339
+ 'vcs': 'The workspace\'s source-control connection: which account it talks to, how it authenticates, and whether it may create repositories and write workflow files. Both permissions are enforced by the provider at push time, so reading them beats discovering one missing halfway through an automated setup.',
1340
+ 'risk_policies': 'The risk policies a task can pin, including which is the workspace default: what decides whether a run can land its pull request without a person, and how many attempts its CI fixer, requirement rounds and release watch are given. Broader than merging, which is why it is not called a merge preset.',
1341
+ 'model_presets': 'The model presets a task can pin, including which is the workspace default: what decides which model each agent step runs on, and so what a run costs. Availability is not repeated here; join `baseModelId` against the models group, which keeps unconfigured and policy-refused apart.',
1238
1342
  'webhook': 'The workspace\'s outbound endpoints: register, inspect or remove the receivers that notifications, run-lifecycle events and health alerts are pushed to. The unnamed calls address the `default` endpoint; the named ones let an integration enroll its own receiver, with its own signing secret and filters, beside whatever else is registered.',
1239
1343
  'usage': 'The workspace\'s money, two ways: the billing period\'s metered budget position with the per-model breakdown behind it, and spend over a window sliced by the dimension a budget is kept against (a repository, a tracker ticket, one run).',
1240
1344
  'me': 'What the calling key is and what it may do — the self-check an integration runs at startup.',