@cat-factory/mcp-server 0.24.0 → 0.26.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.24.0";
5
+ export declare const MCP_SERVER_VERSION = "0.26.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.24.0';
22
+ export const MCP_SERVER_VERSION = '0.26.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,EAogCtD,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,CAepE,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,EA2jCtD,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"}
@@ -162,7 +162,7 @@ export const CAT_FACTORY_TOOLS = [
162
162
  operationId: 'createPublicService',
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
- 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, "required": ["body"] },
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
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." } } },
167
167
  invoke: (client, args) => client.services.create(args.body),
168
168
  },
@@ -177,6 +177,17 @@ export const CAT_FACTORY_TOOLS = [
177
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." } } } } } },
178
178
  invoke: (client, args) => client.services.list(),
179
179
  },
180
+ {
181
+ name: 'spec_get',
182
+ title: 'Get a service\'s in-repo specification',
183
+ group: 'spec',
184
+ operationId: 'getPublicServiceSpec',
185
+ readOnly: true,
186
+ description: 'Get a service\'s in-repo specification\n\nThe prescriptive specification stored in the service’s own repository under `spec/`: modules → feature groups → requirement items, each with its MoSCoW priority, its `aspirational`/`established` implementation state and its Given/When/Then acceptance criteria, plus the domain rules scoped to each group and the Gherkin `.feature` files rendered from the same tree. `provenance` names the branch and commit the read describes, because the default branch is not what a run with an open pull request is working against. The requirement ids here are the join key onto `requirements` on a run’s report and outcome, so criterion → evidence is a map lookup. Four outcomes are kept apart rather than folded: `present: false` means the default branch holds no spec, a `503` with `reason: "spec_read_failed"` means the repository could not be read, a `503` with `reason: "vcs_not_configured"` means the deployment or workspace wired no version control, and a partially readable spec is SERVED with `issues` naming each file that did not survive. Read-only: the spec’s write path is a reviewed commit.\n\nCalls `GET /api/v1/services/{serviceId}/spec` (operation `getPublicServiceSpec`).',
187
+ inputSchema: { "type": "object", "properties": { "serviceId": { "type": "string", "description": "Path parameter `serviceId`." } }, "additionalProperties": false, "required": ["serviceId"] },
188
+ outputSchema: { "type": "object", "properties": { "anchor": { "type": "string", "description": "One of: present, absent, unparsed. 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": { "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" } } }, "serviceId": { "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" } } } } } },
189
+ invoke: (client, args) => client.spec.get(str(args, 'serviceId')),
190
+ },
180
191
  {
181
192
  name: 'repos_list',
182
193
  title: 'List the repositories a service can be created against',
@@ -317,7 +328,7 @@ export const CAT_FACTORY_TOOLS = [
317
328
  readOnly: false,
318
329
  hints: { "destructive": true, "idempotent": false },
319
330
  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`).',
320
- 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", "body"] },
331
+ 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"] },
321
332
  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" } } },
322
333
  invoke: (client, args) => client.tasks.start(str(args, 'taskId'), args.body),
323
334
  },
@@ -339,7 +350,7 @@ export const CAT_FACTORY_TOOLS = [
339
350
  operationId: 'updatePublicTask',
340
351
  readOnly: false,
341
352
  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`).',
342
- 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", "body"] },
353
+ 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"] },
343
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" } } },
344
355
  invoke: (client, args) => client.tasks.update(str(args, 'taskId'), args.body),
345
356
  },
@@ -372,10 +383,10 @@ export const CAT_FACTORY_TOOLS = [
372
383
  operationId: 'actPublicNotification',
373
384
  readOnly: false,
374
385
  hints: { "destructive": true, "idempotent": false },
375
- description: 'Act on a notification\n\nRun a notification’s typed side-effect and resolve it: merge the PR (merge_review / pipeline_complete) or retry the run (ci_failed / test_failed). Performs a real GitHub merge, so it requires an admin-scoped key. Only these automated-action types are actionable through the API — a notification that parks a run on an interactive human decision cannot be acted on headlessly (dismiss it instead). A card that would retry a run on an individual-usage model likewise cannot be acted on through the API.\n\nCalls `POST /api/v1/notifications/{id}/act` (operation `actPublicNotification`).',
376
- inputSchema: { "type": "object", "properties": { "id": { "type": "string", "description": "Path parameter `id`." } }, "additionalProperties": false, "required": ["id"] },
386
+ description: 'Act on a notification\n\nRun a notification’s typed side-effect and resolve it: merge the PR (merge_review / pipeline_complete) or retry the run (ci_failed / test_failed). Performs a real GitHub merge, so it requires an admin-scoped key. Only these automated-action types are actionable through the API — a notification that parks a run on an interactive human decision cannot be acted on headlessly (dismiss it instead). A card that would retry a run on an individual-usage model likewise cannot be acted on through the API. To record how much review a merged pull request needed, call `POST /api/v1/merge-records/{recordId}/effort` (a `write` key) before or after this; a `merge_tag_request` card carries its record id on the payload and is resolved by tagging that record and dismissing the card.\n\nCalls `POST /api/v1/notifications/{id}/act` (operation `actPublicNotification`).',
387
+ inputSchema: { "type": "object", "properties": { "id": { "type": "string", "description": "Path parameter `id`." }, "body": { "type": "object", "properties": { "reviewEffort": { "anyOf": [{ "type": "string", "enum": ["none", "minor", "major"] }, { "type": "null" }] } }, "description": "The request body." } }, "additionalProperties": false, "required": ["id"] },
377
388
  outputSchema: { "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." } } },
378
- invoke: (client, args) => client.notifications.act(str(args, 'id')),
389
+ invoke: (client, args) => client.notifications.act(str(args, 'id'), args.body),
379
390
  },
380
391
  {
381
392
  name: 'notifications_dismiss',
@@ -462,7 +473,7 @@ export const CAT_FACTORY_TOOLS = [
462
473
  readOnly: false,
463
474
  hints: { "destructive": true, "idempotent": true },
464
475
  description: 'Register or update the outbound webhook\n\nRegister the HTTPS endpoint deliveries are POSTed to, or update the one already registered. Every omitted field keeps its stored value, so subscribing to run events is a one-field call that re-sends neither the URL nor the secret. `url` is required only on the first call, when there is nothing registered to keep; omitting it otherwise leaves the endpoint alone. Supplying `secret` rotates the signing secret; omitting it keeps the current one. The endpoint must be `https:` and publicly routable unless the deployment widened its allow-list.\n\nCalls `PUT /api/v1/notification-webhook` (operation `putPublicNotificationWebhook`).',
465
- inputSchema: { "type": "object", "properties": { "body": { "type": "object", "properties": { "alertEvents": { "type": "array", "items": { "type": "string", "enum": ["platform_health.firing", "platform_health.resolved"] } }, "enabled": { "type": "boolean" }, "name": { "type": "string", "minLength": 1, "maxLength": 100 }, "runEvents": { "type": "array", "items": { "type": "string", "enum": ["run.started", "run.completed", "run.failed"] } }, "secret": { "type": "string", "minLength": 16, "maxLength": 200 }, "types": { "type": "array", "items": { "type": "string", "enum": ["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"] } }, "url": { "type": "string", "maxLength": 2000 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["body"] },
476
+ inputSchema: { "type": "object", "properties": { "body": { "type": "object", "properties": { "alertEvents": { "type": "array", "items": { "type": "string", "enum": ["platform_health.firing", "platform_health.resolved"] } }, "enabled": { "type": "boolean" }, "name": { "type": "string", "minLength": 1, "maxLength": 100 }, "runEvents": { "type": "array", "items": { "type": "string", "enum": ["run.started", "run.completed", "run.failed"] } }, "secret": { "type": "string", "minLength": 16, "maxLength": 200 }, "types": { "type": "array", "items": { "type": "string", "enum": ["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"] } }, "url": { "type": "string", "maxLength": 2000 } }, "description": "The request body." } }, "additionalProperties": false },
466
477
  outputSchema: { "type": "object", "properties": { "alertEvents": { "type": "array", "items": { "type": "string", "description": "One of: platform_health.firing, platform_health.resolved. A newer deployment may report a member not in this list." } }, "enabled": { "type": "boolean" }, "hasSecret": { "type": "boolean" }, "id": { "type": "string" }, "name": { "type": "string" }, "runEvents": { "type": "array", "items": { "type": "string", "description": "One of: run.started, run.completed, run.failed. A newer deployment may report a member not in this list." } }, "types": { "type": "array", "items": { "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." } }, "updatedAt": { "type": "number" }, "url": { "type": "string" } } },
467
478
  invoke: (client, args) => client.webhook.set(args.body),
468
479
  },
@@ -474,7 +485,7 @@ export const CAT_FACTORY_TOOLS = [
474
485
  readOnly: false,
475
486
  hints: { "destructive": true, "idempotent": true },
476
487
  description: 'Register or update one named outbound webhook\n\nRegister an endpoint under an id YOU choose (1-63 characters of lowercase letters, digits, `-` or `_`), or update the one already there. Idempotent by id, so an integration can enroll its own receiver on every cold start without tracking whether it has enrolled before, and without displacing anything else the workspace registered. Every field follows the same keep-on-omit rule as the unnamed route, `url` being required only when there is nothing under this id to keep, and a supplied `secret` rotating this endpoint\'s own signing secret. Refused with `reason: "invalid_webhook_id"` for an id that is not a slug, and `reason: "webhook_limit_reached"` (409) when registering a NEW id would exceed the per-workspace cap; editing an existing one is admitted either way.\n\nCalls `PUT /api/v1/notification-webhooks/{webhookId}` (operation `putPublicNamedNotificationWebhook`).',
477
- inputSchema: { "type": "object", "properties": { "webhookId": { "type": "string", "description": "Path parameter `webhookId`." }, "body": { "type": "object", "properties": { "alertEvents": { "type": "array", "items": { "type": "string", "enum": ["platform_health.firing", "platform_health.resolved"] } }, "enabled": { "type": "boolean" }, "name": { "type": "string", "minLength": 1, "maxLength": 100 }, "runEvents": { "type": "array", "items": { "type": "string", "enum": ["run.started", "run.completed", "run.failed"] } }, "secret": { "type": "string", "minLength": 16, "maxLength": 200 }, "types": { "type": "array", "items": { "type": "string", "enum": ["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"] } }, "url": { "type": "string", "maxLength": 2000 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["webhookId", "body"] },
488
+ inputSchema: { "type": "object", "properties": { "webhookId": { "type": "string", "description": "Path parameter `webhookId`." }, "body": { "type": "object", "properties": { "alertEvents": { "type": "array", "items": { "type": "string", "enum": ["platform_health.firing", "platform_health.resolved"] } }, "enabled": { "type": "boolean" }, "name": { "type": "string", "minLength": 1, "maxLength": 100 }, "runEvents": { "type": "array", "items": { "type": "string", "enum": ["run.started", "run.completed", "run.failed"] } }, "secret": { "type": "string", "minLength": 16, "maxLength": 200 }, "types": { "type": "array", "items": { "type": "string", "enum": ["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"] } }, "url": { "type": "string", "maxLength": 2000 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["webhookId"] },
478
489
  outputSchema: { "type": "object", "properties": { "alertEvents": { "type": "array", "items": { "type": "string", "description": "One of: platform_health.firing, platform_health.resolved. A newer deployment may report a member not in this list." } }, "enabled": { "type": "boolean" }, "hasSecret": { "type": "boolean" }, "id": { "type": "string" }, "name": { "type": "string" }, "runEvents": { "type": "array", "items": { "type": "string", "description": "One of: run.started, run.completed, run.failed. A newer deployment may report a member not in this list." } }, "types": { "type": "array", "items": { "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." } }, "updatedAt": { "type": "number" }, "url": { "type": "string" } } },
479
490
  invoke: (client, args) => client.webhook.setNamed(str(args, 'webhookId'), args.body),
480
491
  },
@@ -551,7 +562,7 @@ export const CAT_FACTORY_TOOLS = [
551
562
  operationId: 'approvePublicRunStep',
552
563
  readOnly: false,
553
564
  description: 'Approve a parked step\n\nApprove the proposal a gated step is holding up, optionally replacing it with an edited one (the edit is what flows to every downstream step), and advance the run. The `approvalId` comes from the run\'s decision list; passing it back is what makes a racing app user and a racing integration resolve the same gate. Requires a `decide`-scope key.\n\nCalls `POST /api/v1/runs/{runId}/decisions/approvals/{approvalId}/approve` (operation `approvePublicRunStep`).',
554
- inputSchema: { "type": "object", "properties": { "runId": { "type": "string", "description": "Path parameter `runId`." }, "approvalId": { "type": "string", "description": "Path parameter `approvalId`." }, "body": { "type": "object", "properties": { "proposal": { "type": "string", "maxLength": 50000 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["runId", "approvalId", "body"] },
565
+ inputSchema: { "type": "object", "properties": { "runId": { "type": "string", "description": "Path parameter `runId`." }, "approvalId": { "type": "string", "description": "Path parameter `approvalId`." }, "body": { "type": "object", "properties": { "proposal": { "type": "string", "maxLength": 50000 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["runId", "approvalId"] },
555
566
  outputSchema: { "type": "object", "properties": { "decisions": { "type": "array", "items": { "description": "Discriminated by `kind` (requirements-review | fork | judge | input-gate | approval-gate | agent-decision | clarity-review | brainstorm | pr-review | human-test | visual-confirmation | follow-ups | interview). A newer deployment may report a variant not in this list." } }, "parked": { "type": "boolean" }, "runId": { "type": "string" }, "status": { "type": "string", "description": "One of: running, blocked, paused, done, failed. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "unanswerable": { "type": "array", "items": { "type": "object", "properties": { "detail": { "type": "string" }, "reason": { "type": "string", "description": "One of: human_wait_gate, unclassified_gate, unwired_interview_gate. A newer deployment may report a member not in this list." }, "stepIndex": { "type": "number" }, "stepKind": { "type": "string" } } } } } },
556
567
  invoke: (client, args) => client.decisions.approveStep(str(args, 'runId'), str(args, 'approvalId'), args.body),
557
568
  },
@@ -573,7 +584,7 @@ export const CAT_FACTORY_TOOLS = [
573
584
  operationId: 'challengePublicRunPrReviewFinding',
574
585
  readOnly: false,
575
586
  description: 'Challenge a PR review finding\n\nDispatch a read-only investigator to re-examine one finding against the full source, optionally with a specific concern. It upholds, strengthens or retracts the finding, and the review re-parks carrying the verdict. Requires a `decide`-scope key.\n\nCalls `POST /api/v1/runs/{runId}/decisions/pr-review/findings/{findingId}/challenge` (operation `challengePublicRunPrReviewFinding`).',
576
- inputSchema: { "type": "object", "properties": { "runId": { "type": "string", "description": "Path parameter `runId`." }, "findingId": { "type": "string", "description": "Path parameter `findingId`." }, "body": { "type": "object", "properties": { "question": { "type": "string", "maxLength": 4000 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["runId", "findingId", "body"] },
587
+ inputSchema: { "type": "object", "properties": { "runId": { "type": "string", "description": "Path parameter `runId`." }, "findingId": { "type": "string", "description": "Path parameter `findingId`." }, "body": { "type": "object", "properties": { "question": { "type": "string", "maxLength": 4000 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["runId", "findingId"] },
577
588
  outputSchema: { "type": "object", "properties": { "decisions": { "type": "array", "items": { "description": "Discriminated by `kind` (requirements-review | fork | judge | input-gate | approval-gate | agent-decision | clarity-review | brainstorm | pr-review | human-test | visual-confirmation | follow-ups | interview). A newer deployment may report a variant not in this list." } }, "parked": { "type": "boolean" }, "runId": { "type": "string" }, "status": { "type": "string", "description": "One of: running, blocked, paused, done, failed. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "unanswerable": { "type": "array", "items": { "type": "object", "properties": { "detail": { "type": "string" }, "reason": { "type": "string", "description": "One of: human_wait_gate, unclassified_gate, unwired_interview_gate. A newer deployment may report a member not in this list." }, "stepIndex": { "type": "number" }, "stepKind": { "type": "string" } } } } } },
578
589
  invoke: (client, args) => client.decisions.challengePrReviewFinding(str(args, 'runId'), str(args, 'findingId'), args.body),
579
590
  },
@@ -584,7 +595,7 @@ export const CAT_FACTORY_TOOLS = [
584
595
  operationId: 'choosePublicRunFork',
585
596
  readOnly: false,
586
597
  description: 'Choose an implementation approach\n\nPick one of the proposed implementation forks (by id) or submit your own approach. The Coder then runs with the choice folded in as a binding directive. Requires a `decide`-scope key.\n\nCalls `POST /api/v1/runs/{runId}/decisions/fork/choose` (operation `choosePublicRunFork`).',
587
- inputSchema: { "type": "object", "properties": { "runId": { "type": "string", "description": "Path parameter `runId`." }, "body": { "type": "object", "properties": { "custom": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "forkId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "note": { "anyOf": [{ "type": "string" }, { "type": "null" }] } }, "description": "The request body." } }, "additionalProperties": false, "required": ["runId", "body"] },
598
+ inputSchema: { "type": "object", "properties": { "runId": { "type": "string", "description": "Path parameter `runId`." }, "body": { "type": "object", "properties": { "custom": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "forkId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "note": { "anyOf": [{ "type": "string" }, { "type": "null" }] } }, "description": "The request body." } }, "additionalProperties": false, "required": ["runId"] },
588
599
  outputSchema: { "type": "object", "properties": { "decisions": { "type": "array", "items": { "description": "Discriminated by `kind` (requirements-review | fork | judge | input-gate | approval-gate | agent-decision | clarity-review | brainstorm | pr-review | human-test | visual-confirmation | follow-ups | interview). A newer deployment may report a variant not in this list." } }, "parked": { "type": "boolean" }, "runId": { "type": "string" }, "status": { "type": "string", "description": "One of: running, blocked, paused, done, failed. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "unanswerable": { "type": "array", "items": { "type": "object", "properties": { "detail": { "type": "string" }, "reason": { "type": "string", "description": "One of: human_wait_gate, unclassified_gate, unwired_interview_gate. A newer deployment may report a member not in this list." }, "stepIndex": { "type": "number" }, "stepKind": { "type": "string" } } } } } },
589
600
  invoke: (client, args) => client.decisions.chooseFork(str(args, 'runId'), args.body),
590
601
  },
@@ -650,7 +661,7 @@ export const CAT_FACTORY_TOOLS = [
650
661
  operationId: 'incorporatePublicRunRequirements',
651
662
  readOnly: false,
652
663
  description: 'Incorporate the answers\n\nFold the recorded answers into one standardized requirements document. Asynchronous — the run re-reviews in the background, so the response shows the review `incorporating`. Requires a `decide`-scope key.\n\nCalls `POST /api/v1/runs/{runId}/decisions/requirements/incorporate` (operation `incorporatePublicRunRequirements`).',
653
- inputSchema: { "type": "object", "properties": { "runId": { "type": "string", "description": "Path parameter `runId`." }, "body": { "type": "object", "properties": { "feedback": { "type": "string", "maxLength": 4000 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["runId", "body"] },
664
+ inputSchema: { "type": "object", "properties": { "runId": { "type": "string", "description": "Path parameter `runId`." }, "body": { "type": "object", "properties": { "feedback": { "type": "string", "maxLength": 4000 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["runId"] },
654
665
  outputSchema: { "type": "object", "properties": { "decisions": { "type": "array", "items": { "description": "Discriminated by `kind` (requirements-review | fork | judge | input-gate | approval-gate | agent-decision | clarity-review | brainstorm | pr-review | human-test | visual-confirmation | follow-ups | interview). A newer deployment may report a variant not in this list." } }, "parked": { "type": "boolean" }, "runId": { "type": "string" }, "status": { "type": "string", "description": "One of: running, blocked, paused, done, failed. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "unanswerable": { "type": "array", "items": { "type": "object", "properties": { "detail": { "type": "string" }, "reason": { "type": "string", "description": "One of: human_wait_gate, unclassified_gate, unwired_interview_gate. A newer deployment may report a member not in this list." }, "stepIndex": { "type": "number" }, "stepKind": { "type": "string" } } } } } },
655
666
  invoke: (client, args) => client.decisions.incorporate(str(args, 'runId'), args.body),
656
667
  },
@@ -661,7 +672,7 @@ export const CAT_FACTORY_TOOLS = [
661
672
  operationId: 'incorporatePublicRunBrainstorm',
662
673
  readOnly: false,
663
674
  description: 'Incorporate brainstorm picks\n\nFold the picks into one converged direction. ASYNCHRONOUS: the response shows the session `incorporating` while the durable driver folds and re-runs in the background. Requires a `decide`-scope key.\n\nCalls `POST /api/v1/runs/{runId}/decisions/brainstorm/{stage}/incorporate` (operation `incorporatePublicRunBrainstorm`).',
664
- inputSchema: { "type": "object", "properties": { "runId": { "type": "string", "description": "Path parameter `runId`." }, "stage": { "type": "string", "description": "Path parameter `stage`." }, "body": { "type": "object", "properties": { "feedback": { "type": "string", "maxLength": 4000 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["runId", "stage", "body"] },
675
+ inputSchema: { "type": "object", "properties": { "runId": { "type": "string", "description": "Path parameter `runId`." }, "stage": { "type": "string", "description": "Path parameter `stage`." }, "body": { "type": "object", "properties": { "feedback": { "type": "string", "maxLength": 4000 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["runId", "stage"] },
665
676
  outputSchema: { "type": "object", "properties": { "decisions": { "type": "array", "items": { "description": "Discriminated by `kind` (requirements-review | fork | judge | input-gate | approval-gate | agent-decision | clarity-review | brainstorm | pr-review | human-test | visual-confirmation | follow-ups | interview). A newer deployment may report a variant not in this list." } }, "parked": { "type": "boolean" }, "runId": { "type": "string" }, "status": { "type": "string", "description": "One of: running, blocked, paused, done, failed. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "unanswerable": { "type": "array", "items": { "type": "object", "properties": { "detail": { "type": "string" }, "reason": { "type": "string", "description": "One of: human_wait_gate, unclassified_gate, unwired_interview_gate. A newer deployment may report a member not in this list." }, "stepIndex": { "type": "number" }, "stepKind": { "type": "string" } } } } } },
666
677
  invoke: (client, args) => client.decisions.incorporateBrainstorm(str(args, 'runId'), str(args, 'stage'), args.body),
667
678
  },
@@ -672,7 +683,7 @@ export const CAT_FACTORY_TOOLS = [
672
683
  operationId: 'incorporatePublicRunClarity',
673
684
  readOnly: false,
674
685
  description: 'Incorporate clarity answers\n\nFold the recorded answers into one standardized bug report. ASYNCHRONOUS: the response shows the review `incorporating` while the durable driver folds and re-reviews in the background. Requires a `decide`-scope key.\n\nCalls `POST /api/v1/runs/{runId}/decisions/clarity/incorporate` (operation `incorporatePublicRunClarity`).',
675
- inputSchema: { "type": "object", "properties": { "runId": { "type": "string", "description": "Path parameter `runId`." }, "body": { "type": "object", "properties": { "feedback": { "type": "string", "maxLength": 4000 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["runId", "body"] },
686
+ inputSchema: { "type": "object", "properties": { "runId": { "type": "string", "description": "Path parameter `runId`." }, "body": { "type": "object", "properties": { "feedback": { "type": "string", "maxLength": 4000 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["runId"] },
676
687
  outputSchema: { "type": "object", "properties": { "decisions": { "type": "array", "items": { "description": "Discriminated by `kind` (requirements-review | fork | judge | input-gate | approval-gate | agent-decision | clarity-review | brainstorm | pr-review | human-test | visual-confirmation | follow-ups | interview). A newer deployment may report a variant not in this list." } }, "parked": { "type": "boolean" }, "runId": { "type": "string" }, "status": { "type": "string", "description": "One of: running, blocked, paused, done, failed. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "unanswerable": { "type": "array", "items": { "type": "object", "properties": { "detail": { "type": "string" }, "reason": { "type": "string", "description": "One of: human_wait_gate, unclassified_gate, unwired_interview_gate. A newer deployment may report a member not in this list." }, "stepIndex": { "type": "number" }, "stepKind": { "type": "string" } } } } } },
677
688
  invoke: (client, args) => client.decisions.incorporateClarity(str(args, 'runId'), args.body),
678
689
  },
@@ -738,7 +749,7 @@ export const CAT_FACTORY_TOOLS = [
738
749
  operationId: 'rejectPublicRunStep',
739
750
  readOnly: false,
740
751
  description: 'Reject a parked step\n\nReject the gated proposal: the run stops entirely, recording a terminal `rejected` failure the board can retry. Requires a `decide`-scope key.\n\nCalls `POST /api/v1/runs/{runId}/decisions/approvals/{approvalId}/reject` (operation `rejectPublicRunStep`).',
741
- inputSchema: { "type": "object", "properties": { "runId": { "type": "string", "description": "Path parameter `runId`." }, "approvalId": { "type": "string", "description": "Path parameter `approvalId`." }, "body": { "type": "object", "properties": { "reason": { "type": "string", "maxLength": 2000 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["runId", "approvalId", "body"] },
752
+ inputSchema: { "type": "object", "properties": { "runId": { "type": "string", "description": "Path parameter `runId`." }, "approvalId": { "type": "string", "description": "Path parameter `approvalId`." }, "body": { "type": "object", "properties": { "reason": { "type": "string", "maxLength": 2000 } }, "description": "The request body." } }, "additionalProperties": false, "required": ["runId", "approvalId"] },
742
753
  outputSchema: { "type": "object", "properties": { "decisions": { "type": "array", "items": { "description": "Discriminated by `kind` (requirements-review | fork | judge | input-gate | approval-gate | agent-decision | clarity-review | brainstorm | pr-review | human-test | visual-confirmation | follow-ups | interview). A newer deployment may report a variant not in this list." } }, "parked": { "type": "boolean" }, "runId": { "type": "string" }, "status": { "type": "string", "description": "One of: running, blocked, paused, done, failed. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "unanswerable": { "type": "array", "items": { "type": "object", "properties": { "detail": { "type": "string" }, "reason": { "type": "string", "description": "One of: human_wait_gate, unclassified_gate, unwired_interview_gate. A newer deployment may report a member not in this list." }, "stepIndex": { "type": "number" }, "stepKind": { "type": "string" } } } } } },
743
754
  invoke: (client, args) => client.decisions.rejectStep(str(args, 'runId'), str(args, 'approvalId'), args.body),
744
755
  },
@@ -903,7 +914,7 @@ export const CAT_FACTORY_TOOLS = [
903
914
  operationId: 'resolvePublicRunPrReview',
904
915
  readOnly: false,
905
916
  description: 'Resolve a parked PR deep review\n\nRecord the curated finding selection and say what to do with it: `finish` completes the read-only review, `fix` hands the selected findings to a fixer that commits onto the reviewed PR branch, `post` publishes them as inline PR review comments. `fix` and `post` need at least one selected finding and act on the real pull request. Requires a `decide`-scope key.\n\nCalls `POST /api/v1/runs/{runId}/decisions/pr-review/resolve` (operation `resolvePublicRunPrReview`).',
906
- inputSchema: { "type": "object", "properties": { "runId": { "type": "string", "description": "Path parameter `runId`." }, "body": { "type": "object", "properties": { "action": { "type": "string", "enum": ["finish", "fix", "post"] }, "findingIds": { "type": "array", "items": { "type": "string" } } }, "description": "The request body." } }, "additionalProperties": false, "required": ["runId", "body"] },
917
+ inputSchema: { "type": "object", "properties": { "runId": { "type": "string", "description": "Path parameter `runId`." }, "body": { "type": "object", "properties": { "action": { "type": "string", "enum": ["finish", "fix", "post"] }, "findingIds": { "type": "array", "items": { "type": "string" } } }, "description": "The request body." } }, "additionalProperties": false, "required": ["runId"] },
907
918
  outputSchema: { "type": "object", "properties": { "decisions": { "type": "array", "items": { "description": "Discriminated by `kind` (requirements-review | fork | judge | input-gate | approval-gate | agent-decision | clarity-review | brainstorm | pr-review | human-test | visual-confirmation | follow-ups | interview). A newer deployment may report a variant not in this list." } }, "parked": { "type": "boolean" }, "runId": { "type": "string" }, "status": { "type": "string", "description": "One of: running, blocked, paused, done, failed. A newer deployment may report a member not in this list." }, "taskId": { "type": "string" }, "unanswerable": { "type": "array", "items": { "type": "object", "properties": { "detail": { "type": "string" }, "reason": { "type": "string", "description": "One of: human_wait_gate, unclassified_gate, unwired_interview_gate. A newer deployment may report a member not in this list." }, "stepIndex": { "type": "number" }, "stepKind": { "type": "string" } } } } } },
908
919
  invoke: (client, args) => client.decisions.resolvePrReview(str(args, 'runId'), args.body),
909
920
  },
@@ -1105,6 +1116,50 @@ export const CAT_FACTORY_TOOLS = [
1105
1116
  outputSchema: { "type": "object", "properties": { "artifacts": { "type": "array", "items": { "type": "object", "properties": { "artifactId": { "type": "string" }, "byteSize": { "type": "number" }, "contentType": { "type": "string" }, "createdAt": { "type": "number" }, "hash": { "type": "string" }, "kind": { "type": "string", "description": "One of: screenshot, reference. A newer deployment may report a member not in this list." }, "scope": { "type": "string", "description": "One of: run, task. A newer deployment may report a member not in this list." }, "view": { "anyOf": [{ "type": "string" }, { "type": "null" }] } } } } } },
1106
1117
  invoke: (client, args) => client.evidence.listArtifacts(str(args, 'runId')),
1107
1118
  },
1119
+ {
1120
+ name: 'merge_records_get',
1121
+ title: 'Get one merge record',
1122
+ group: 'merge_records',
1123
+ operationId: 'getPublicMergeRecord',
1124
+ readOnly: true,
1125
+ description: 'Get one merge record\n\nThe same record addressed by its own id, for a caller that holds one without the run: the id a `merge_tag_request` notification carries on its payload, for instance. Scoped to the calling key’s workspace.\n\nCalls `GET /api/v1/merge-records/{recordId}` (operation `getPublicMergeRecord`).',
1126
+ inputSchema: { "type": "object", "properties": { "recordId": { "type": "string", "description": "Path parameter `recordId`." } }, "additionalProperties": false, "required": ["recordId"] },
1127
+ outputSchema: { "type": "object", "properties": { "changeClass": { "type": "string", "description": "One of: docs, test, dependency, config, source, schema, unknown. A newer deployment may report a member not in this list." }, "changedFileCount": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "complexity": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "createdAt": { "type": "number" }, "decision": { "type": "string", "description": "One of: pending_review, auto_merged, human_merged, external_merged, rejected. A newer deployment may report a member not in this list." }, "impact": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "mergePresetId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "mergePresetName": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "prNumber": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "prUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "provider": { "anyOf": [{ "type": "string", "description": "One of: github, gitlab. A newer deployment may report a member not in this list." }, { "type": "null" }] }, "recordId": { "type": "string" }, "repoId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "resolvedAt": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "reviewEffort": { "anyOf": [{ "type": "string", "description": "One of: none, minor, major. A newer deployment may report a member not in this list." }, { "type": "null" }] }, "risk": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "taggedAt": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "taskId": { "type": "string" } } },
1128
+ invoke: (client, args) => client.mergeRecords.get(str(args, 'recordId')),
1129
+ },
1130
+ {
1131
+ name: 'merge_records_get_for_run',
1132
+ title: 'Get the merge decision a run left behind',
1133
+ group: 'merge_records',
1134
+ operationId: 'getPublicRunMergeRecord',
1135
+ readOnly: true,
1136
+ description: 'Get the merge decision a run left behind\n\nWhat kind of change the run’s pull request made (a change class derived on the backend from the changed-file list, never from an agent’s opinion), what the merger scored it, which merge-threshold preset the decision was compared against, what ultimately happened to the pull request, and how much review a human spent if anybody has tagged it. The entry point of the merge-evidence loop for a caller holding a run id: it also hands back the `recordId` the effort-tag route takes. A run whose pipeline had no `merger` step made no merge decision and answers `404` with `details.reason: "no_merge_record"`, distinct from the `"run_not_found"` a run this key cannot read gets.\n\nCalls `GET /api/v1/runs/{runId}/merge-record` (operation `getPublicRunMergeRecord`).',
1137
+ inputSchema: { "type": "object", "properties": { "runId": { "type": "string", "description": "Path parameter `runId`." } }, "additionalProperties": false, "required": ["runId"] },
1138
+ outputSchema: { "type": "object", "properties": { "changeClass": { "type": "string", "description": "One of: docs, test, dependency, config, source, schema, unknown. A newer deployment may report a member not in this list." }, "changedFileCount": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "complexity": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "createdAt": { "type": "number" }, "decision": { "type": "string", "description": "One of: pending_review, auto_merged, human_merged, external_merged, rejected. A newer deployment may report a member not in this list." }, "impact": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "mergePresetId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "mergePresetName": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "prNumber": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "prUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "provider": { "anyOf": [{ "type": "string", "description": "One of: github, gitlab. A newer deployment may report a member not in this list." }, { "type": "null" }] }, "recordId": { "type": "string" }, "repoId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "resolvedAt": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "reviewEffort": { "anyOf": [{ "type": "string", "description": "One of: none, minor, major. A newer deployment may report a member not in this list." }, { "type": "null" }] }, "risk": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "taggedAt": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "taskId": { "type": "string" } } },
1139
+ invoke: (client, args) => client.mergeRecords.getForRun(str(args, 'runId')),
1140
+ },
1141
+ {
1142
+ name: 'merge_records_list_rollups',
1143
+ title: 'List the per-change-class merge rollups',
1144
+ group: 'merge_records',
1145
+ operationId: 'listPublicMergeClassRollups',
1146
+ readOnly: true,
1147
+ description: 'List the per-change-class merge rollups\n\nEvery change class’s accumulated track record for the workspace, as one aggregate: how many records it holds, how many landed and by which route (auto-merged, merged through the app, merged directly on the provider), how many were rejected or are still awaiting review, and the distribution of reviewer-effort tags. This is the evidence that justifies widening a per-class auto-merge rule; nothing widens one automatically. A class with no records is present as zeros rather than absent, so "nothing has landed here yet" never reads as a class the response left out. `unknown` is a real class (no changed-file list was available) and never matches a per-class rule.\n\nCalls `GET /api/v1/merge-records/rollups` (operation `listPublicMergeClassRollups`).',
1148
+ inputSchema: { "type": "object", "properties": {}, "additionalProperties": false },
1149
+ outputSchema: { "type": "object", "properties": { "rollups": { "type": "array", "items": { "type": "object", "properties": { "autoMerged": { "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." }, "effort": { "type": "object", "properties": { "major": { "type": "number" }, "minor": { "type": "number" }, "none": { "type": "number" }, "untagged": { "type": "number" } } }, "externalMerged": { "type": "number" }, "humanMerged": { "type": "number" }, "merged": { "type": "number" }, "pendingReview": { "type": "number" }, "rejected": { "type": "number" }, "total": { "type": "number" } } } } } },
1150
+ invoke: (client, args) => client.mergeRecords.listRollups(),
1151
+ },
1152
+ {
1153
+ name: 'merge_records_tag_effort',
1154
+ title: 'Tag the reviewer effort a merge took',
1155
+ group: 'merge_records',
1156
+ operationId: 'tagPublicMergeReviewEffort',
1157
+ readOnly: false,
1158
+ description: 'Tag the reviewer effort a merge took\n\nRecord how much review a landed pull request actually needed (`none` for zero blocking comments, `minor` for a nit pass, `major` for real rework), or `null` to clear the tag. This is the ground truth the auto-merge score thresholds are trying to approximate, and it is never mandatory: an untagged merge records a null tag and nothing downstream breaks. A `write` key, not an `admin` one: the pull request already landed, so tagging it merges nothing. Idempotent, and orthogonal to the decision, so a record can be tagged whenever the effort becomes known, before or after the `act` that merged it.\n\nCalls `POST /api/v1/merge-records/{recordId}/effort` (operation `tagPublicMergeReviewEffort`).',
1159
+ inputSchema: { "type": "object", "properties": { "recordId": { "type": "string", "description": "Path parameter `recordId`." }, "body": { "type": "object", "properties": { "reviewEffort": { "anyOf": [{ "type": "string", "enum": ["none", "minor", "major"] }, { "type": "null" }], "description": "Always present in a response; `null` when the server has no value for it." } }, "required": ["reviewEffort"], "description": "The request body." } }, "additionalProperties": false, "required": ["recordId", "body"] },
1160
+ outputSchema: { "type": "object", "properties": { "changeClass": { "type": "string", "description": "One of: docs, test, dependency, config, source, schema, unknown. A newer deployment may report a member not in this list." }, "changedFileCount": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "complexity": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "createdAt": { "type": "number" }, "decision": { "type": "string", "description": "One of: pending_review, auto_merged, human_merged, external_merged, rejected. A newer deployment may report a member not in this list." }, "impact": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "mergePresetId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "mergePresetName": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "prNumber": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "prUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "provider": { "anyOf": [{ "type": "string", "description": "One of: github, gitlab. A newer deployment may report a member not in this list." }, { "type": "null" }] }, "recordId": { "type": "string" }, "repoId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "resolvedAt": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "reviewEffort": { "anyOf": [{ "type": "string", "description": "One of: none, minor, major. A newer deployment may report a member not in this list." }, { "type": "null" }] }, "risk": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "runId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "taggedAt": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "taskId": { "type": "string" } } },
1161
+ invoke: (client, args) => client.mergeRecords.tagEffort(str(args, 'recordId'), args.body),
1162
+ },
1108
1163
  {
1109
1164
  name: 'keys_create',
1110
1165
  title: 'Provision an API key',
@@ -1163,6 +1218,7 @@ export const CAT_FACTORY_OMITTED_OPERATIONS = [
1163
1218
  export const CAT_FACTORY_TOOL_GROUPS = {
1164
1219
  'jobs': 'Headless jobs (a public, inline pipeline run against a brief): start, poll or stream one.',
1165
1220
  'services': 'The workspace\'s board services, the frames tasks are created under: list them, or create one (optionally backed by a repository).',
1221
+ '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.',
1166
1222
  'repos': 'The repositories this workspace can back a service with, and which service each already backs: the discovery half of service creation.',
1167
1223
  '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.',
1168
1224
  'pipelines': 'The pipelines a task can be started with, and whether each is headless-startable.',
@@ -1174,6 +1230,7 @@ export const CAT_FACTORY_TOOL_GROUPS = {
1174
1230
  'decisions': 'Every way a run stops for a person: approval gates, review and brainstorm loops, forks, judge verdicts, PR review findings, the human-verdict gates, follow-up triage and the interview gates.',
1175
1231
  'debug': 'A run\'s recorded telemetry: LLM calls, the context each agent was given, the tool calls it made, infra logs, and the whole model-activity bundle as one document.',
1176
1232
  'evidence': 'What a run proved: the engine\'s verification report, the outcome summary behind it, and the artifacts it captured, bytes included.',
1233
+ 'merge_records': 'The evidence behind the auto-merge policy: what kind of change each merged run made, what the merger scored it, what happened to the pull request, and how much review a human actually spent, plus the per-class rollups that justify widening a rule. Reading takes a `read` key and recording an effort tag a `write` one: neither merges anything.',
1177
1234
  'keys': 'The workspace\'s own API keys: provision one headlessly, list them, revoke one (and what it minted).',
1178
1235
  };
1179
1236
  //# sourceMappingURL=tools.generated.js.map