@qodeca/xezar 0.13.1 → 0.14.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.
Files changed (250) hide show
  1. package/README.md +45 -15
  2. package/dist/agent-config/account-identity.d.ts +2 -8
  3. package/dist/agent-config/account-identity.js +54 -10
  4. package/dist/agent-config/account-identity.js.map +1 -1
  5. package/dist/agent-config/catalog.d.ts +49 -7
  6. package/dist/agent-config/catalog.js +107 -0
  7. package/dist/agent-config/catalog.js.map +1 -1
  8. package/dist/agent-config/model-settings/pi.d.ts +12 -6
  9. package/dist/agent-config/model-settings/pi.js +12 -6
  10. package/dist/agent-config/model-settings/pi.js.map +1 -1
  11. package/dist/agent-config/seed.js +10 -0
  12. package/dist/agent-config/seed.js.map +1 -1
  13. package/dist/contract/github.d.ts +15 -0
  14. package/dist/contract/index.d.ts +9 -0
  15. package/dist/contract/index.js +1527 -895
  16. package/dist/contract/mcp-api-reference.d.ts +174 -0
  17. package/dist/contract/mcp-audit.d.ts +103 -0
  18. package/dist/contract/mcp-discovery.d.ts +257 -0
  19. package/dist/contract/mcp-event-catalog.d.ts +121 -0
  20. package/dist/contract/mcp-event-catalog.test.d.ts +1 -0
  21. package/dist/contract/mcp-idempotency.d.ts +200 -0
  22. package/dist/contract/mcp-journal.d.ts +268 -0
  23. package/dist/contract/mcp-leader.d.ts +88 -0
  24. package/dist/contract/mcp-ownership.d.ts +78 -0
  25. package/dist/contract/mcp-versioning.d.ts +139 -0
  26. package/dist/contract/runs.d.ts +81 -0
  27. package/dist/core/agent-profiles.d.ts +15 -4
  28. package/dist/core/agent-profiles.js +22 -8
  29. package/dist/core/agent-profiles.js.map +1 -1
  30. package/dist/core/opencode-server-runner.js +71 -11
  31. package/dist/core/opencode-server-runner.js.map +1 -1
  32. package/dist/core/secret-redaction.d.ts +7 -1
  33. package/dist/core/secret-redaction.js +44 -10
  34. package/dist/core/secret-redaction.js.map +1 -1
  35. package/dist/index.js +138 -27
  36. package/dist/index.js.map +1 -1
  37. package/dist/machine-identity.d.ts +66 -0
  38. package/dist/machine-identity.js +96 -0
  39. package/dist/machine-identity.js.map +1 -0
  40. package/dist/mcp/adapters/claude-code.d.ts +41 -0
  41. package/dist/mcp/adapters/claude-code.js +40 -0
  42. package/dist/mcp/adapters/claude-code.js.map +1 -0
  43. package/dist/mcp/adapters/codex.d.ts +140 -0
  44. package/dist/mcp/adapters/codex.js +323 -0
  45. package/dist/mcp/adapters/codex.js.map +1 -0
  46. package/dist/mcp/adapters/opencode.d.ts +148 -0
  47. package/dist/mcp/adapters/opencode.js +528 -0
  48. package/dist/mcp/adapters/opencode.js.map +1 -0
  49. package/dist/mcp/adapters/pi-link.d.ts +102 -0
  50. package/dist/mcp/adapters/pi-link.js +235 -0
  51. package/dist/mcp/adapters/pi-link.js.map +1 -0
  52. package/dist/mcp/adapters/pi.d.ts +188 -0
  53. package/dist/mcp/adapters/pi.js +418 -0
  54. package/dist/mcp/adapters/pi.js.map +1 -0
  55. package/dist/mcp/api-reference.d.ts +26 -0
  56. package/dist/mcp/api-reference.js +133 -0
  57. package/dist/mcp/api-reference.js.map +1 -0
  58. package/dist/mcp/audit-trail.d.ts +162 -0
  59. package/dist/mcp/audit-trail.js +306 -0
  60. package/dist/mcp/audit-trail.js.map +1 -0
  61. package/dist/mcp/bridge.d.ts +81 -0
  62. package/dist/mcp/bridge.js +407 -0
  63. package/dist/mcp/bridge.js.map +1 -0
  64. package/dist/mcp/connection-file.d.ts +49 -0
  65. package/dist/mcp/connection-file.js +63 -0
  66. package/dist/mcp/connection-file.js.map +1 -0
  67. package/dist/mcp/echo-guard.d.ts +94 -0
  68. package/dist/mcp/echo-guard.js +160 -0
  69. package/dist/mcp/echo-guard.js.map +1 -0
  70. package/dist/mcp/event-catalog.d.ts +120 -0
  71. package/dist/mcp/event-catalog.js +306 -0
  72. package/dist/mcp/event-catalog.js.map +1 -0
  73. package/dist/mcp/event-controller.d.ts +230 -0
  74. package/dist/mcp/event-controller.js +596 -0
  75. package/dist/mcp/event-controller.js.map +1 -0
  76. package/dist/mcp/event-journal.d.ts +57 -0
  77. package/dist/mcp/event-journal.js +423 -0
  78. package/dist/mcp/event-journal.js.map +1 -0
  79. package/dist/mcp/index.d.ts +63 -0
  80. package/dist/mcp/index.js +386 -0
  81. package/dist/mcp/index.js.map +1 -0
  82. package/dist/mcp/ipc.d.ts +202 -0
  83. package/dist/mcp/ipc.js +206 -0
  84. package/dist/mcp/ipc.js.map +1 -0
  85. package/dist/mcp/leader-delivery.d.ts +119 -0
  86. package/dist/mcp/leader-delivery.js +450 -0
  87. package/dist/mcp/leader-delivery.js.map +1 -0
  88. package/dist/mcp/operation-receipts.d.ts +210 -0
  89. package/dist/mcp/operation-receipts.js +723 -0
  90. package/dist/mcp/operation-receipts.js.map +1 -0
  91. package/dist/mcp/project-catalogs.d.ts +23 -0
  92. package/dist/mcp/project-catalogs.js +25 -0
  93. package/dist/mcp/project-catalogs.js.map +1 -0
  94. package/dist/mcp/project-leaders.d.ts +26 -0
  95. package/dist/mcp/project-leaders.js +17 -0
  96. package/dist/mcp/project-leaders.js.map +1 -0
  97. package/dist/mcp/protocol.d.ts +50 -0
  98. package/dist/mcp/protocol.js +47 -0
  99. package/dist/mcp/protocol.js.map +1 -0
  100. package/dist/mcp/reconnect.d.ts +297 -0
  101. package/dist/mcp/reconnect.js +465 -0
  102. package/dist/mcp/reconnect.js.map +1 -0
  103. package/dist/mcp/resource-ownership.d.ts +228 -0
  104. package/dist/mcp/resource-ownership.js +390 -0
  105. package/dist/mcp/resource-ownership.js.map +1 -0
  106. package/dist/mcp/service-adapter.d.ts +16488 -0
  107. package/dist/mcp/service-adapter.js +148 -0
  108. package/dist/mcp/service-adapter.js.map +1 -0
  109. package/dist/mcp/service.d.ts +83 -0
  110. package/dist/mcp/service.js +233 -0
  111. package/dist/mcp/service.js.map +1 -0
  112. package/dist/mcp/session-binding.d.ts +105 -0
  113. package/dist/mcp/session-binding.js +163 -0
  114. package/dist/mcp/session-binding.js.map +1 -0
  115. package/dist/mcp/stale-write.d.ts +145 -0
  116. package/dist/mcp/stale-write.js +219 -0
  117. package/dist/mcp/stale-write.js.map +1 -0
  118. package/dist/mcp/tool.d.ts +48 -0
  119. package/dist/mcp/tool.js +24 -0
  120. package/dist/mcp/tool.js.map +1 -0
  121. package/dist/mcp/tools/discovery.d.ts +40 -0
  122. package/dist/mcp/tools/discovery.js +232 -0
  123. package/dist/mcp/tools/discovery.js.map +1 -0
  124. package/dist/mcp/tools/execution-control.d.ts +171 -0
  125. package/dist/mcp/tools/execution-control.js +513 -0
  126. package/dist/mcp/tools/execution-control.js.map +1 -0
  127. package/dist/mcp/tools/handoff-git.d.ts +26 -0
  128. package/dist/mcp/tools/handoff-git.js +544 -0
  129. package/dist/mcp/tools/handoff-git.js.map +1 -0
  130. package/dist/mcp/tools/index.d.ts +2 -0
  131. package/dist/mcp/tools/index.js +23 -0
  132. package/dist/mcp/tools/index.js.map +1 -0
  133. package/dist/mcp/tools/leader-events.d.ts +46 -0
  134. package/dist/mcp/tools/leader-events.js +126 -0
  135. package/dist/mcp/tools/leader-events.js.map +1 -0
  136. package/dist/mcp/tools/local-handoff.d.ts +102 -0
  137. package/dist/mcp/tools/local-handoff.js +306 -0
  138. package/dist/mcp/tools/local-handoff.js.map +1 -0
  139. package/dist/mcp/tools/project-config.d.ts +340 -0
  140. package/dist/mcp/tools/project-config.js +1075 -0
  141. package/dist/mcp/tools/project-config.js.map +1 -0
  142. package/dist/mcp/tools/results-evidence.d.ts +112 -0
  143. package/dist/mcp/tools/results-evidence.js +1045 -0
  144. package/dist/mcp/tools/results-evidence.js.map +1 -0
  145. package/dist/mcp/tools/task-create.d.ts +70 -0
  146. package/dist/mcp/tools/task-create.js +473 -0
  147. package/dist/mcp/tools/task-create.js.map +1 -0
  148. package/dist/mcp/tools/task-reads.d.ts +102 -0
  149. package/dist/mcp/tools/task-reads.js +689 -0
  150. package/dist/mcp/tools/task-reads.js.map +1 -0
  151. package/dist/mcp/tools/work-organisation.d.ts +2 -0
  152. package/dist/mcp/tools/work-organisation.js +502 -0
  153. package/dist/mcp/tools/work-organisation.js.map +1 -0
  154. package/dist/paths.d.ts +17 -7
  155. package/dist/paths.js +18 -8
  156. package/dist/paths.js.map +1 -1
  157. package/dist/runs/project-writer.js +76 -11
  158. package/dist/runs/project-writer.js.map +1 -1
  159. package/dist/runs/retention.d.ts +24 -1
  160. package/dist/runs/retention.js +62 -1
  161. package/dist/runs/retention.js.map +1 -1
  162. package/dist/server/forge/github.js +44 -0
  163. package/dist/server/forge/github.js.map +1 -1
  164. package/dist/server/forge/types.d.ts +16 -0
  165. package/dist/server/project-context.d.ts +81 -8
  166. package/dist/server/project-context.js +143 -35
  167. package/dist/server/project-context.js.map +1 -1
  168. package/dist/server/server.d.ts +1050 -53
  169. package/dist/server/server.js +326 -120
  170. package/dist/server/server.js.map +1 -1
  171. package/dist/server/validators.d.ts +26 -6
  172. package/dist/server/validators.js +17 -0
  173. package/dist/server/validators.js.map +1 -1
  174. package/dist/skills-remote.js +64 -6
  175. package/dist/skills-remote.js.map +1 -1
  176. package/dist/workflows/run.d.ts +277 -12
  177. package/dist/workflows/run.js +554 -59
  178. package/dist/workflows/run.js.map +1 -1
  179. package/dist/workspace/agent-profiles.d.ts +30 -3
  180. package/dist/workspace/agent-profiles.js +39 -4
  181. package/dist/workspace/agent-profiles.js.map +1 -1
  182. package/dist/workspace/config.js +25 -4
  183. package/dist/workspace/config.js.map +1 -1
  184. package/dist/workspace/project-owner.d.ts +210 -0
  185. package/dist/workspace/project-owner.js +518 -0
  186. package/dist/workspace/project-owner.js.map +1 -0
  187. package/package.json +5 -3
  188. package/scripts/pi-leader-extension.ts +420 -0
  189. package/scripts/sync-readme.mjs +83 -2
  190. package/web/dist/assets/{alert-dialog-BVsVcbFy.js → alert-dialog-D6rP6d39.js} +1 -1
  191. package/web/dist/assets/arrow-down-DMOfFIzW.js +1 -0
  192. package/web/dist/assets/arrow-left-C4Ec2BUg.js +1 -0
  193. package/web/dist/assets/{centered-state-Djgly6Ni.js → centered-state-B0ZqrPaa.js} +12 -12
  194. package/web/dist/assets/chevron-right-mHJ-crvn.js +1 -0
  195. package/web/dist/assets/{collapsible-DZ4D-DHG.js → collapsible-DchEHgUM.js} +1 -1
  196. package/web/dist/assets/{commit-list-B-z1JL9G.js → commit-list-BpMim1Rv.js} +1 -1
  197. package/web/dist/assets/{compare-variants-D62m4j3B.js → compare-variants-D5ItQbAq.js} +1 -1
  198. package/web/dist/assets/{diff-BKew9rQX.js → diff-HqqZ_WDR.js} +2 -2
  199. package/web/dist/assets/{diff-stat-D0mc5V6Z.js → diff-stat-NsU-3ecr.js} +1 -1
  200. package/web/dist/assets/{diff-view-xpIcuLIC.js → diff-view-B7c11Xux.js} +1 -1
  201. package/web/dist/assets/{dropdown-menu-CEQziH7X.js → dropdown-menu-CtTpnyod.js} +1 -1
  202. package/web/dist/assets/{editable-title-BCX3T2BY.js → editable-title-BXtuGQry.js} +1 -1
  203. package/web/dist/assets/{ellipsis-vertical-ByVdDc4z.js → ellipsis-vertical-MHtGZSH6.js} +1 -1
  204. package/web/dist/assets/{file-xBSB5hXO.js → file-DKLw5SOb.js} +1 -1
  205. package/web/dist/assets/{folder-CldgbZ5A.js → folder-Drw6-ufH.js} +1 -1
  206. package/web/dist/assets/{git-toolbar-DJANqg7Y.js → git-toolbar-BQH8bORV.js} +1 -1
  207. package/web/dist/assets/github-ynnpKFCJ.js +1 -0
  208. package/web/dist/assets/{image-preview-Cv5mZr0n.js → image-preview-DLhMN_R9.js} +1 -1
  209. package/web/dist/assets/index-BEsrNdXt.js +29 -0
  210. package/web/dist/assets/index-Da8DOBau.css +2 -0
  211. package/web/dist/assets/{markdown-CgEEE2ND.js → markdown-q365eN6Y.js} +1 -1
  212. package/web/dist/assets/{new-task-form-1r2bgsdD.js → new-task-form-CW-hNIWQ.js} +1 -1
  213. package/web/dist/assets/{pill-q-x22_ej.js → pill-B_TFulXa.js} +1 -1
  214. package/web/dist/assets/{project-router-VDN4jQM8.js → project-router-CLPc-ImZ.js} +1 -1
  215. package/web/dist/assets/{prompt-templates-BmZtCe-L.js → prompt-templates-CLc4RxyO.js} +1 -1
  216. package/web/dist/assets/{repo-git-btG0sdbO.js → repo-git-Is7R6-Tj.js} +1 -1
  217. package/web/dist/assets/{run-diff-vguEMJzh.js → run-diff-DHMvDlVo.js} +2 -2
  218. package/web/dist/assets/run-header-DvZJbQ8I.js +1 -0
  219. package/web/dist/assets/{search-x-QmhaAbg5.js → search-x-Ce2MMetu.js} +1 -1
  220. package/web/dist/assets/{skill-empty-hint-BrzUwByZ.js → skill-empty-hint-C_xCSvzB.js} +1 -1
  221. package/web/dist/assets/skills-CivqD4si.js +1 -0
  222. package/web/dist/assets/{sparkles-CP8QDOgX.js → sparkles-BCqPoj5g.js} +1 -1
  223. package/web/dist/assets/{square-terminal-CGypshSD.js → square-terminal-ikj5g-oK.js} +1 -1
  224. package/web/dist/assets/{tab-link-D4lFzzI1.js → tab-link-VsEjFV1Y.js} +1 -1
  225. package/web/dist/assets/{task-changes-BtZId14z.js → task-changes-CH-E81-_.js} +1 -1
  226. package/web/dist/assets/{task-commits-BoeyJXrv.js → task-commits-DqfkMFxp.js} +1 -1
  227. package/web/dist/assets/{task-files-DIy2oUnj.js → task-files-D_nkHZ_a.js} +2 -2
  228. package/web/dist/assets/task-thread-bxQompxJ.js +9 -0
  229. package/web/dist/assets/{textarea-CyBCyKIk.js → textarea-xajuW1L_.js} +1 -1
  230. package/web/dist/assets/{thread-loading-Cuq2jchC.js → thread-loading-C3JQZbIE.js} +1 -1
  231. package/web/dist/assets/{trash-2-B6Dp3ZNs.js → trash-2-hJrBhpUD.js} +1 -1
  232. package/web/dist/assets/{triangle-alert-xBya8FUp.js → triangle-alert-D1u82y1a.js} +1 -1
  233. package/web/dist/assets/{upload-D6MXEB9p.js → upload-Bn6FBZ59.js} +1 -1
  234. package/web/dist/assets/{use-desktop-CPBwzQ7M.js → use-desktop-DOIMfHfY.js} +1 -1
  235. package/web/dist/assets/{use-submit-shortcut-JTpNzU-u.js → use-submit-shortcut-Dj4DHTdE.js} +1 -1
  236. package/web/dist/assets/utils-YwBpOoRN.js +64 -0
  237. package/web/dist/assets/{workflows-DG115scU.js → workflows-CTaAKz2m.js} +3 -3
  238. package/web/dist/assets/{zoomable-image-GTYwLtkS.js → zoomable-image-C1-6P3tg.js} +1 -1
  239. package/web/dist/index.html +23 -23
  240. package/web/dist/assets/arrow-down-CYgAlZtW.js +0 -1
  241. package/web/dist/assets/arrow-left-BOqE0a3k.js +0 -1
  242. package/web/dist/assets/chevron-right-Cc9BWnbN.js +0 -1
  243. package/web/dist/assets/github-D6vK0jFn.js +0 -1
  244. package/web/dist/assets/index-CkmR6h7s.css +0 -2
  245. package/web/dist/assets/index-DVDqF4bM.js +0 -9
  246. package/web/dist/assets/refresh-cw-DcNCj2nu.js +0 -1
  247. package/web/dist/assets/run-header-DM7MiKj9.js +0 -1
  248. package/web/dist/assets/skills-DMfxQtrD.js +0 -1
  249. package/web/dist/assets/task-thread-CbMPmrWq.js +0 -9
  250. package/web/dist/assets/utils--z9hRtl3.js +0 -64
@@ -0,0 +1,513 @@
1
+ import { attachmentInputSchema, mcpExpectedVersionSchema, operationIdSchema, runIdParamSchema, staleVersionRejectionSchema, } from '../../contract/index.js';
2
+ import { hc } from 'hono/client';
3
+ import { z } from 'zod';
4
+ import { MCP_ORIGIN, McpServiceAdapter } from '../service-adapter.js';
5
+ import { staleRejectionIn } from '../stale-write.js';
6
+ import { defineTool, errorResult, textResult } from '../tool.js';
7
+ /**
8
+ * Execution control and session messaging for the bound project's own tasks (#94, F-08, F-09,
9
+ * M-03, M-04; inventory I-032, I-034–I-040).
10
+ *
11
+ * WHAT IT CAN TARGET. A task of the project this connection is bound to, named by its run id —
12
+ * and nothing else. Every action first reads the task through the shared service adapter (#89),
13
+ * whose scope is the connection's project, so another project's task is a 404 before anything
14
+ * is dispatched. There is no argument for a process id, a signal, a command or a path, and this
15
+ * module starts or signals no process itself: every effect is one of the cockpit's own routes,
16
+ * and the RunManager behind that route is the only thing that ever touches an agent process.
17
+ * F-08 is explicit that a generic "kill PID" does not meet the boundary; none exists here.
18
+ *
19
+ * THE SAME STATE MACHINE AS THE COCKPIT. Each action is offered in exactly the states the
20
+ * cockpit offers it (`run-actions.ts` `runActionFlags`, `task-thread.tsx`'s composer routing,
21
+ * `ask-answer.ts` `askDeliveryMode`), and refused — with nothing changed — in every other one.
22
+ * The refusal is checked here AND again by the route, so a state that moved between the read and
23
+ * the write is still refused by the service.
24
+ *
25
+ * NO NEW STATES. Every action lands the task in a state the cockpit already reaches, through the
26
+ * cockpit's own route, so every exit a state already has — a user message, the autonomous
27
+ * nudge, the monitoring wake timer, cancel, finish, the idle close — still applies to it.
28
+ * Nothing here parks a task, holds a session open or schedules anything.
29
+ *
30
+ * WHERE THE SERVICE COMES FROM. `McpToolContext` does not carry the service's in-process entry
31
+ * yet (#86 shipped it without one, #89 left widening it to later work). This tool reads it from
32
+ * an optional `service` field on the context and answers an honest tool error when it is absent;
33
+ * the service passing its app there is the one wiring step this tool cannot take from its own
34
+ * file.
35
+ *
36
+ * STALE WRITES (#250, N-03). Every action changes the task, so every action requires the
37
+ * `expectedVersion` a `task_read` of it handed out, and sends it to the route, which compares it
38
+ * with the task's current version in the same synchronous stretch as the engine call. A task that
39
+ * moved since is refused with nothing applied (`status: "conflict"`, `error: "stale_version"`,
40
+ * `currentVersion`). The version moves with every event a task records, so a RUNNING task's
41
+ * version moves while its agent works: read it right before acting on a running task. The same holds
42
+ * for an answer that meets an idle close: the close changes the task, so the resume after it is
43
+ * refused as stale rather than retried with a fresh version — the leader reads again and answers
44
+ * again (D-06 § 4.4 rule 3).
45
+ */
46
+ export const EXECUTION_CONTROL_ACTIONS = [
47
+ 'cancel',
48
+ 'finish',
49
+ 'continue',
50
+ 'send_message',
51
+ 'answer_question',
52
+ 'edit_queued_message',
53
+ 'remove_queued_message',
54
+ 'cancel_auto_resume',
55
+ ];
56
+ /** The cockpit's own schedule (`ask-answer.ts`): the idle timer closes the backend before the
57
+ * RunManager has released the run, so a resume can arrive a few milliseconds early. Only that
58
+ * exact refusal is retried; every other 409 is an answer. */
59
+ export const IDLE_TEARDOWN_RETRY_DELAYS_MS = [50, 100, 200, 400, 800, 1_000, 1_000, 1_000, 1_000];
60
+ const IDLE_TEARDOWN_REFUSAL = 'run is still active';
61
+ /** The review panel's Send back prefix (`review-panel.tsx`). */
62
+ const REVIEW_FEEDBACK_PREFIX = 'Review feedback:\n';
63
+ const answerSchema = z
64
+ .object({
65
+ choices: z
66
+ .array(z.string().min(1).max(60))
67
+ .min(1)
68
+ .max(4)
69
+ .describe('Option labels for this question, exactly as the question lists them. One for a single-select question.'),
70
+ })
71
+ .strict();
72
+ const FIELDS = ['text', 'images', 'finishAs', 'questionId', 'answers', 'messageId'];
73
+ /** Which arguments each action takes. Anything else is refused rather than silently dropped. */
74
+ const ACTION_FIELDS = {
75
+ cancel: { required: [], optional: [] },
76
+ finish: { required: ['finishAs'], optional: [] },
77
+ continue: { required: [], optional: ['text', 'images'] },
78
+ send_message: { required: [], optional: ['text', 'images'] },
79
+ answer_question: { required: ['questionId'], optional: ['answers', 'text'] },
80
+ edit_queued_message: { required: ['messageId'], optional: ['text', 'images'] },
81
+ remove_queued_message: { required: ['messageId'], optional: [] },
82
+ cancel_auto_resume: { required: [], optional: [] },
83
+ };
84
+ const hasText = (text) => text !== undefined && text.trim().length > 0;
85
+ export const executionControlInputSchema = z
86
+ .object({
87
+ action: z.enum(EXECUTION_CONTROL_ACTIONS).describe('What to do with the task.'),
88
+ runId: z.string().min(1).max(128).describe("The task's run id, in the project this connection is bound to."),
89
+ expectedVersion: mcpExpectedVersionSchema.describe('The `version` task_read returned for this task. Echo it verbatim; if the task changed since, nothing is applied.'),
90
+ // D-06 § 5.2 (#264). Required on every call, because every action of this tool changes the task:
91
+ // there is no read here to exempt.
92
+ operationId: operationIdSchema.describe('Client-generated key for this operation (8–128 chars). Reuse it only to repeat the same operation: a repeat returns the first answer and controls the task once.'),
93
+ text: z
94
+ .string()
95
+ .max(100_000)
96
+ .optional()
97
+ .describe('Message, continuation prompt, review feedback, free-form answer, or the new text of a queued message.'),
98
+ images: z
99
+ .array(attachmentInputSchema)
100
+ .max(4)
101
+ .optional()
102
+ .describe('Attachments (base64) for send_message, continue or edit_queued_message — the same four the composer allows.'),
103
+ finishAs: z
104
+ .enum(['close_session', 'accept_review'])
105
+ .optional()
106
+ .describe('Which finish you mean: close_session for a waiting task, accept_review to accept a task at review without a PR. Refused when it does not match the task.'),
107
+ questionId: z.string().min(1).max(128).optional().describe("The pending question's id (its ask requestId)."),
108
+ answers: z
109
+ .array(answerSchema)
110
+ .min(1)
111
+ .max(4)
112
+ .optional()
113
+ .describe('One entry per question, in the order the question card lists them.'),
114
+ messageId: z.string().min(1).max(128).optional().describe("A queued message's id."),
115
+ })
116
+ .strict()
117
+ .superRefine((args, ctx) => {
118
+ const allowed = ACTION_FIELDS[args.action];
119
+ for (const field of FIELDS) {
120
+ const present = args[field] !== undefined;
121
+ if (allowed.required.includes(field) && !present) {
122
+ ctx.addIssue({ code: 'custom', path: [field], message: `${args.action} needs ${field}` });
123
+ }
124
+ if (present && !allowed.required.includes(field) && !allowed.optional.includes(field)) {
125
+ ctx.addIssue({ code: 'custom', path: [field], message: `${field} does not apply to ${args.action}` });
126
+ }
127
+ }
128
+ const bodyActions = ['send_message', 'edit_queued_message'];
129
+ if (bodyActions.includes(args.action) && !hasText(args.text) && !args.images?.length) {
130
+ ctx.addIssue({ code: 'custom', path: ['text'], message: `${args.action} needs text or at least one attachment` });
131
+ }
132
+ if (args.action === 'answer_question' && (args.answers !== undefined) === hasText(args.text)) {
133
+ ctx.addIssue({ code: 'custom', path: ['answers'], message: 'answer_question needs exactly one of answers or text' });
134
+ }
135
+ });
136
+ /** The result, text block and `structuredContent` alike (D-05 § 6.8: the text is authoritative,
137
+ * and the result is a slim projection rather than the task record). */
138
+ export const executionControlResultSchema = z.object({
139
+ action: z.enum(EXECUTION_CONTROL_ACTIONS),
140
+ accepted: z.boolean(),
141
+ /** D-05's closed set, narrowed to what a control can report. `accepted` never means done. */
142
+ status: z.enum(['accepted', 'done', 'cancelled', 'conflict', 'failed']),
143
+ subject: z.object({ type: z.literal('run'), id: z.string() }),
144
+ runStatus: z.string().optional(),
145
+ /** Which seam a message or answer travelled on — the state routing made visible. */
146
+ delivery: z.enum(['live', 'deferred', 'amended', 'continued', 'resumed']).optional(),
147
+ questionId: z.string().optional(),
148
+ messageId: z.string().optional(),
149
+ hadPendingAutoResume: z.boolean().optional(),
150
+ reason: z.string().optional(),
151
+ // A stale-version refusal (#250) carries D-06 § 4.4's payload keys verbatim beside the above.
152
+ ...staleVersionRejectionSchema.omit({ status: true }).partial().shape,
153
+ origin: z.literal(MCP_ORIGIN),
154
+ });
155
+ // ---- the routes the shared adapter does not name yet -------------------------------------------
156
+ const IN_PROCESS_BASE = 'http://127.0.0.1';
157
+ const IN_PROCESS_HOST = '127.0.0.1';
158
+ /** The same in-process client the adapter builds (`service-adapter.ts`): loopback host, no Origin. */
159
+ const scopedApi = (service) => hc(IN_PROCESS_BASE, {
160
+ fetch: async (input, init) => {
161
+ const headers = new Headers(init?.headers);
162
+ headers.set('host', IN_PROCESS_HOST);
163
+ headers.delete('origin');
164
+ const url = input instanceof Request ? input.url : String(input);
165
+ return service.request(url, { ...init, headers });
166
+ },
167
+ }).api.v1.p[':projectId'];
168
+ /** Map a service answer. A success without a JSON body is an error, never an empty value. */
169
+ async function settle(pending, success) {
170
+ const res = await pending;
171
+ const body = await res.json().catch(() => undefined);
172
+ if (success.includes(res.status)) {
173
+ if (body === undefined)
174
+ return { ok: false, status: 502, error: `service answered ${res.status} without a body` };
175
+ return { ok: true, status: res.status, value: body };
176
+ }
177
+ const error = body && typeof body === 'object' && typeof body.error === 'string'
178
+ ? body.error
179
+ : `service answered ${res.status}`;
180
+ return { ok: false, status: res.status, error, body };
181
+ }
182
+ /** The adapter's rule for a path parameter: a valid id that is not a dot segment. */
183
+ const validPathId = (id) => id !== '.' && id !== '..' && runIdParamSchema.safeParse({ id }).success;
184
+ /** `run-actions.ts` `isRunActive`: the engine still owns the run. */
185
+ const isActive = (run) => run.status === 'running' || run.status === 'queued' || run.status === 'waiting';
186
+ /** `task-thread.tsx`: the composer delivers into a live session while running or waiting. */
187
+ const sessionOpen = (run) => run.status === 'running' || run.status === 'waiting';
188
+ /** `run-actions.ts` `lastSessionId` — Continue needs a recorded agent session. */
189
+ const hasSession = (run) => run.steps.some((step) => step.sessionId);
190
+ /** `ask-answer.ts` `askDeliveryMode`. */
191
+ export function askDeliveryMode(run) {
192
+ if (isActive(run))
193
+ return 'live';
194
+ return hasSession(run) ? 'resume' : 'unavailable';
195
+ }
196
+ const askQuestionSchema = z
197
+ .object({
198
+ header: z.string(),
199
+ options: z.array(z.object({ label: z.string() }).passthrough()),
200
+ multiSelect: z.boolean().optional(),
201
+ })
202
+ .passthrough();
203
+ /**
204
+ * The one question an answer can reach: the newest `ask.requested` with no `user-message` after
205
+ * it — the cockpit's reducer (`thread-state.ts`), which resolves whichever ask is pending with
206
+ * the next user message. An older ask that a newer one superseded is NOT pending, however
207
+ * unanswered it looks: a message sent for it would be read as the answer to the newer one.
208
+ * `events` may be in any order; a malformed ask is skipped, exactly as the reducer skips it.
209
+ */
210
+ export function pendingQuestionIn(events) {
211
+ const newestFirst = [...events].sort((a, b) => b.seq - a.seq);
212
+ for (const event of newestFirst) {
213
+ if (event.type === 'user-message')
214
+ return null;
215
+ if (event.type !== 'ask.requested' || typeof event.requestId !== 'string' || !Array.isArray(event.questions))
216
+ continue;
217
+ const questions = event.questions.flatMap((q) => {
218
+ const parsed = askQuestionSchema.safeParse(q);
219
+ return parsed.success ? [parsed.data] : [];
220
+ });
221
+ if (questions.length > 0)
222
+ return { requestId: event.requestId, questions };
223
+ }
224
+ // Neither found in these events: the caller must read older ones before concluding "none".
225
+ return undefined;
226
+ }
227
+ /** The ask card's answer text (`ask-card.tsx` `formatAnswer`), one line per question. */
228
+ export function formatAnswers(questions, answers) {
229
+ if (answers.length !== questions.length) {
230
+ return { ok: false, error: `answer every question: this one has ${questions.length}, the call gave ${answers.length}` };
231
+ }
232
+ const lines = [];
233
+ for (const [index, question] of questions.entries()) {
234
+ const choices = answers[index].choices;
235
+ const labels = question.options.map((option) => option.label);
236
+ const unknown = choices.find((choice) => !labels.includes(choice));
237
+ if (unknown !== undefined) {
238
+ return { ok: false, error: `"${unknown}" is not an option of "${question.header}" (${labels.join(', ')})` };
239
+ }
240
+ if (new Set(choices).size !== choices.length)
241
+ return { ok: false, error: `"${question.header}" repeats a choice` };
242
+ if (question.multiSelect !== true && choices.length !== 1) {
243
+ return { ok: false, error: `"${question.header}" takes exactly one choice` };
244
+ }
245
+ lines.push(`${question.header}: ${choices.join(', ')}`);
246
+ }
247
+ return { ok: true, text: lines.join('\n') };
248
+ }
249
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
250
+ function result(args, fields) {
251
+ const value = {
252
+ action: args.action,
253
+ subject: { type: 'run', id: args.runId },
254
+ ...fields,
255
+ origin: MCP_ORIGIN,
256
+ };
257
+ const structured = value;
258
+ const text = JSON.stringify(value);
259
+ return value.status === 'failed' ? errorResult(text, structured) : textResult(text, structured);
260
+ }
261
+ /** A state that does not allow the action: an ordinary result (D-05: a business conflict is not
262
+ * `isError`), and nothing was changed. */
263
+ const conflict = (args, run, reason) => result(args, { accepted: false, status: 'conflict', runStatus: run.status, reason });
264
+ /** A bad target or a service failure: a tool error the model can correct. */
265
+ const failed = (args, reason) => result(args, { accepted: false, status: 'failed', reason });
266
+ /** The task changed after the leader read it (#250): refused, nothing applied, never retried here. */
267
+ function staleConflict(args, run, stale) {
268
+ const { status: _conflict, ...payload } = stale;
269
+ return result(args, { accepted: false, status: 'conflict', runStatus: run.status, reason: stale.guidance, ...payload });
270
+ }
271
+ /** The service refused: a stale version, a state conflict (409), or a failure. */
272
+ const refused = (args, run, answer) => {
273
+ const stale = staleRejectionIn(answer.body);
274
+ if (stale)
275
+ return staleConflict(args, run, stale);
276
+ return answer.status === 409 ? conflict(args, run, answer.error) : failed(args, answer.error);
277
+ };
278
+ async function currentStatus(s, runId, fallback) {
279
+ const read = await s.adapter.getRun(runId);
280
+ return read.ok ? read.value.status : fallback;
281
+ }
282
+ async function pendingQuestion(s, runId) {
283
+ let cursor;
284
+ // Newest page first, then older ones, until a user message or an ask is found or history ends.
285
+ for (;;) {
286
+ const page = await settle(s.api.runs[':id'].history.$get({ param: { projectId: s.projectId, id: runId }, query: cursor ? { cursor } : {} }), [200]);
287
+ if (!page.ok)
288
+ return page;
289
+ const found = pendingQuestionIn(page.value.events);
290
+ if (found !== undefined)
291
+ return { ok: true, status: 200, value: found };
292
+ if (!page.value.hasOlder || !page.value.olderCursor)
293
+ return { ok: true, status: 200, value: null };
294
+ cursor = page.value.olderCursor;
295
+ }
296
+ }
297
+ async function postMessage(s, runId, text, images, expectedVersion) {
298
+ return settle(s.api.runs[':id'].messages.$post({
299
+ param: { projectId: s.projectId, id: runId },
300
+ json: { text: text ?? '', images: images ?? [], expectedVersion },
301
+ }), [200]);
302
+ }
303
+ async function postContinue(s, runId, text, images, expectedVersion) {
304
+ return settle(s.api.runs[':id'].continue.$post({
305
+ param: { projectId: s.projectId, id: runId },
306
+ json: { ...(text !== undefined ? { text } : {}), ...(images?.length ? { images } : {}), expectedVersion },
307
+ }), [200]);
308
+ }
309
+ /** `ask-answer.ts` `resumeAfterIdleTeardown`: retry only the idle-teardown 409, on its schedule. A
310
+ * stale-version refusal is never retried: it is not the teardown, it is the answer. */
311
+ async function continueAfterIdleTeardown(s, runId, text, expectedVersion) {
312
+ for (let retries = 0;; retries += 1) {
313
+ const answer = await postContinue(s, runId, text, undefined, expectedVersion);
314
+ const delay = IDLE_TEARDOWN_RETRY_DELAYS_MS[retries];
315
+ if (answer.ok || answer.status !== 409 || answer.error !== IDLE_TEARDOWN_REFUSAL || delay === undefined)
316
+ return answer;
317
+ await s.wait(delay);
318
+ }
319
+ }
320
+ const messageDelivery = (value) => 'queued' in value ? 'amended' : 'deferred' in value ? 'deferred' : 'live';
321
+ async function control(args, s) {
322
+ // The target is read first, through the adapter: an id outside the bound project is a 404 and
323
+ // a malformed one is refused before anything is dispatched.
324
+ const read = await s.adapter.getRun(args.runId);
325
+ if (!read.ok)
326
+ return failed(args, read.error);
327
+ const run = read.value;
328
+ const id = run.id;
329
+ // Sent with every effect below; the route compares it with the task's current version (#250).
330
+ const version = args.expectedVersion;
331
+ const guard = { expectedVersion: version };
332
+ switch (args.action) {
333
+ case 'cancel': {
334
+ if (!isActive(run))
335
+ return conflict(args, run, `cancel is offered only while the task is active; it is ${run.status}`);
336
+ const answer = await s.adapter.cancelRun(id, version);
337
+ if (!answer.ok)
338
+ return refused(args, run, answer);
339
+ if (!answer.value.cancelled)
340
+ return conflict(args, run, 'the task was no longer active, so nothing was cancelled');
341
+ const after = await currentStatus(s, id, run.status);
342
+ // A queued task is dropped at once; an active one stops asynchronously. Its worktree stays.
343
+ return result(args, { accepted: true, status: after === 'cancelled' ? 'cancelled' : 'accepted', runStatus: after });
344
+ }
345
+ case 'finish': {
346
+ const meaning = run.status === 'waiting' ? 'close_session' : run.status === 'review' ? 'accept_review' : undefined;
347
+ if (!meaning) {
348
+ return conflict(args, run, `finish is offered only for a waiting task (close the session) or a task at review (accept without a PR); it is ${run.status}`);
349
+ }
350
+ if (args.finishAs !== meaning) {
351
+ return conflict(args, run, `the task is ${run.status}, so finish means ${meaning} here, not ${args.finishAs}; nothing was changed`);
352
+ }
353
+ const answer = await settle(s.api.runs[':id'].finish.$post({ param: { projectId: s.projectId, id }, json: guard }), [200]);
354
+ if (!answer.ok)
355
+ return refused(args, run, answer);
356
+ const after = await currentStatus(s, id, run.status);
357
+ return result(args, { accepted: true, status: meaning === 'accept_review' ? 'done' : 'accepted', runStatus: after });
358
+ }
359
+ case 'continue': {
360
+ if (isActive(run))
361
+ return conflict(args, run, `the task is ${run.status}, not closed — send a message instead`);
362
+ if (!hasSession(run))
363
+ return conflict(args, run, 'no agent session to resume');
364
+ let text = args.text;
365
+ if (run.status === 'review') {
366
+ // Send back (`review-panel.tsx`): feedback is required and rides with its prefix.
367
+ if (!hasText(text))
368
+ return conflict(args, run, 'sending a task at review back needs feedback: write what to change first');
369
+ text = `${REVIEW_FEEDBACK_PREFIX}${text}`;
370
+ }
371
+ const answer = await postContinue(s, id, text, args.images, version);
372
+ if (!answer.ok)
373
+ return refused(args, run, answer);
374
+ const after = await currentStatus(s, id, run.status);
375
+ return result(args, { accepted: true, status: 'accepted', runStatus: after, delivery: 'continued' });
376
+ }
377
+ case 'send_message': {
378
+ // The composer's routing (`task-thread.tsx`): open session → send, queued → amend,
379
+ // closed with a session → continue with the text, anything else → disabled.
380
+ if (sessionOpen(run) || run.status === 'queued') {
381
+ const answer = await postMessage(s, id, args.text, args.images, version);
382
+ if (!answer.ok)
383
+ return refused(args, run, answer);
384
+ const delivery = messageDelivery(answer.value);
385
+ const after = await currentStatus(s, id, run.status);
386
+ return result(args, {
387
+ accepted: true,
388
+ status: delivery === 'amended' ? 'done' : 'accepted',
389
+ runStatus: after,
390
+ delivery,
391
+ ...('queued' in answer.value ? { messageId: answer.value.message.id } : {}),
392
+ });
393
+ }
394
+ if (!hasSession(run))
395
+ return conflict(args, run, 'Session closed — no session to resume.');
396
+ const answer = await postContinue(s, id, args.text, args.images, version);
397
+ if (!answer.ok)
398
+ return refused(args, run, answer);
399
+ const after = await currentStatus(s, id, run.status);
400
+ return result(args, { accepted: true, status: 'accepted', runStatus: after, delivery: 'continued' });
401
+ }
402
+ case 'answer_question': {
403
+ const pending = await pendingQuestion(s, id);
404
+ if (!pending.ok)
405
+ return refused(args, run, pending);
406
+ if (!pending.value)
407
+ return conflict(args, run, 'this task has no pending question; nothing was sent');
408
+ // THE TARGETING CHECK: an answer is delivered as the task's next user message, which the
409
+ // task reads as the answer to ITS pending question. Any other question id — a superseded
410
+ // ask, or another task's — would have its answer land on the wrong question.
411
+ if (pending.value.requestId !== args.questionId) {
412
+ return conflict(args, run, `that question is not this task's pending question (${pending.value.requestId}); nothing was sent`);
413
+ }
414
+ let text;
415
+ if (args.answers) {
416
+ const formatted = formatAnswers(pending.value.questions, args.answers);
417
+ if (!formatted.ok)
418
+ return failed(args, formatted.error);
419
+ text = formatted.text;
420
+ }
421
+ else {
422
+ text = args.text;
423
+ }
424
+ const mode = askDeliveryMode(run);
425
+ if (mode === 'unavailable') {
426
+ return conflict(args, run, 'This session has ended and no agent session was recorded, so the answer cannot be delivered.');
427
+ }
428
+ const questionId = pending.value.requestId;
429
+ if (mode === 'live') {
430
+ const answer = await postMessage(s, id, text, undefined, version);
431
+ if (answer.ok) {
432
+ const after = await currentStatus(s, id, run.status);
433
+ return result(args, { accepted: true, status: 'accepted', runStatus: after, delivery: messageDelivery(answer.value), questionId });
434
+ }
435
+ // The record said live but the session had just closed: resume rather than drop it. A
436
+ // stale version is not that case — the task moved, and the leader must read it again.
437
+ if (answer.status !== 409 || !hasSession(run) || staleRejectionIn(answer.body))
438
+ return refused(args, run, answer);
439
+ }
440
+ const answer = await continueAfterIdleTeardown(s, id, text, version);
441
+ if (!answer.ok)
442
+ return refused(args, run, answer);
443
+ const after = await currentStatus(s, id, run.status);
444
+ return result(args, { accepted: true, status: 'accepted', runStatus: after, delivery: 'resumed', questionId });
445
+ }
446
+ case 'edit_queued_message':
447
+ case 'remove_queued_message': {
448
+ const messageId = args.messageId;
449
+ // A fixed message: a refusal never echoes what the caller sent (#88, N-01).
450
+ if (!validPathId(messageId))
451
+ return failed(args, 'not a message id');
452
+ if (run.status !== 'queued') {
453
+ return conflict(args, run, `queued messages can be changed only while the task is queued; it is ${run.status}`);
454
+ }
455
+ const param = { projectId: s.projectId, id, msgId: messageId };
456
+ const answer = args.action === 'edit_queued_message'
457
+ ? await settle(s.api.runs[':id']['queued-messages'][':msgId'].$patch({
458
+ param,
459
+ json: {
460
+ ...(args.text !== undefined ? { text: args.text } : {}),
461
+ ...(args.images ? { images: args.images } : {}),
462
+ ...guard,
463
+ },
464
+ }), [200])
465
+ : await settle(s.api.runs[':id']['queued-messages'][':msgId'].$delete({ param, json: guard }), [200]);
466
+ if (!answer.ok)
467
+ return refused(args, run, answer);
468
+ return result(args, { accepted: true, status: 'done', runStatus: run.status, messageId });
469
+ }
470
+ case 'cancel_auto_resume': {
471
+ const answer = await settle(s.api.runs[':id']['auto-resume'].$delete({ param: { projectId: s.projectId, id }, json: guard }), [200]);
472
+ if (!answer.ok)
473
+ return refused(args, run, answer);
474
+ return result(args, {
475
+ accepted: true,
476
+ status: 'done',
477
+ runStatus: run.status,
478
+ hadPendingAutoResume: run.autoResumeAt !== undefined,
479
+ });
480
+ }
481
+ }
482
+ }
483
+ /** Build the tool over an injectable wait, so the idle-teardown schedule is testable. */
484
+ export function createExecutionControlTool(wait = sleep) {
485
+ return defineTool({
486
+ name: 'execution_control',
487
+ title: 'Control a task and talk to its session',
488
+ description: [
489
+ "Control one of this project's own tasks, as the cockpit's buttons and composer do. Each action is allowed only in the states the cockpit allows it and is otherwise refused with nothing changed (status \"conflict\" and a reason).",
490
+ 'cancel — stop a queued, running or waiting task; it ends cancelled and keeps its worktree.',
491
+ 'finish — finishAs "close_session" closes a waiting task\'s session; finishAs "accept_review" accepts a task at review without a PR.',
492
+ 'continue — reopen a closed task\'s last session, with optional text; for a task at review, text is required and is sent back as review feedback.',
493
+ 'send_message — routed by state: an open session receives it, a queued task gets it folded into its prompt, a closed task with a session is continued with it; otherwise refused.',
494
+ 'answer_question — answer the task\'s pending question by its questionId, with the option labels (answers) or free text; only the pending question can be answered, and a closed session is reopened to deliver it.',
495
+ 'edit_queued_message / remove_queued_message — change a message stacked on a queued task.',
496
+ 'cancel_auto_resume — stop a scheduled automatic resume after a usage limit.',
497
+ 'Every action needs expectedVersion: the `version` task_read (view task) returned for this task. If the task changed since you read it, nothing is applied and the answer is status "conflict" with error "stale_version": read it again and decide again. A running task\'s version moves as its agent works, so read it right before acting.',
498
+ 'Targets tasks only by run id in the bound project; there is no process-level control. Plan approval and decisions outside the approved goal stay with the human.',
499
+ ].join('\n'),
500
+ inputSchema: executionControlInputSchema,
501
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
502
+ async call(args, ctx) {
503
+ const service = ctx.service;
504
+ if (!service) {
505
+ return errorResult('execution_control is not connected to this cockpit\'s task services yet; nothing was changed. Use the cockpit for this action.');
506
+ }
507
+ const projectId = ctx.project.id;
508
+ return control(args, { adapter: new McpServiceAdapter({ projectId, service }), api: scopedApi(service), projectId, wait });
509
+ },
510
+ });
511
+ }
512
+ export const executionControlTool = createExecutionControlTool();
513
+ //# sourceMappingURL=execution-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-control.js","sourceRoot":"","sources":["../../../src/mcp/tools/execution-control.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type GithubPrMergeState } from '../../contract/index.js';
2
+ import { z } from 'zod';
3
+ export declare const HANDOFF_ACTIONS: readonly ['repo', 'commit', 'push', 'create_pr', 'merge_state', 'ready', 'merge', 'branch'];
4
+ /** The next legitimate action after a quality blocker. It offers no waiver, to anyone (A-22). */
5
+ export declare const QUALITY_BLOCKER_NEXT_ACTION: string;
6
+ /**
7
+ * Every reason this pull request's quality is not proven, from the fresh merge state. A check the
8
+ * forge could not classify (`required: null`) counts as required: unknown evidence is never a
9
+ * pass. An empty list is the only answer that lets a merge be dispatched at all.
10
+ */
11
+ export declare function qualityBlockers(state: GithubPrMergeState): Array<{
12
+ code: string;
13
+ message: string;
14
+ }>;
15
+ /**
16
+ * Every reason a draft should NOT be marked ready yet (#262): a required check that is already
17
+ * failing, and a review that asked for changes. Readying such a pull request asks reviewers to look
18
+ * at work whose own gate says it is not done. A pending check or a review nobody has given yet is
19
+ * not on this list: those are exactly what "ready for review" invites, and a draft never gets them
20
+ * otherwise. Like `qualityBlockers`, a check the forge could not classify counts as required.
21
+ */
22
+ export declare function readyBlockers(state: GithubPrMergeState): Array<{
23
+ code: string;
24
+ message: string;
25
+ }>;
26
+ export declare const handoffGitTool: import("../tool.ts").McpTool<z.ZodObject<z.core.$ZodLooseShape, z.core.$strip>>;