@the-open-engine/zeroshot 6.38.1 → 6.39.1

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 (383) hide show
  1. package/README.md +6 -0
  2. package/cli/event-copy.js +8 -7
  3. package/cli/event-copy.ts +12 -0
  4. package/cli/index.js +67 -48
  5. package/cli/json-export.js +61 -64
  6. package/cli/json-export.ts +112 -0
  7. package/cli/message-formatter-utils.js +68 -56
  8. package/cli/message-formatter-utils.ts +121 -0
  9. package/cli/message-formatters-normal.js +124 -259
  10. package/cli/message-formatters-normal.ts +250 -0
  11. package/cli/message-formatters-watch.js +81 -84
  12. package/cli/message-formatters-watch.ts +189 -0
  13. package/lib/cluster/generated/protocol-schema.cjs +1 -1
  14. package/lib/cluster/generated/protocol-schema.mjs +1 -1
  15. package/lib/cluster/generated/protocol.d.cts +8 -0
  16. package/lib/cluster/generated/protocol.d.mts +8 -0
  17. package/lib/cluster/generated/protocol.d.ts +8 -0
  18. package/lib/clusters-registry.d.ts +23 -0
  19. package/lib/clusters-registry.js +17 -29
  20. package/lib/completion.d.ts +12 -0
  21. package/lib/completion.js +84 -94
  22. package/lib/compose-utils.d.ts +32 -0
  23. package/lib/compose-utils.js +57 -72
  24. package/lib/detached-startup.d.ts +84 -0
  25. package/lib/detached-startup.js +232 -302
  26. package/lib/docker-config.d.ts +43 -0
  27. package/lib/docker-config.js +150 -325
  28. package/lib/docker-env-auth.d.ts +17 -0
  29. package/lib/docker-env-auth.js +75 -0
  30. package/lib/git-remote-utils.d.ts +48 -0
  31. package/lib/git-remote-utils.js +147 -213
  32. package/lib/id-detector.d.ts +15 -0
  33. package/lib/id-detector.js +37 -41
  34. package/lib/path-check.d.ts +30 -0
  35. package/lib/path-check.js +42 -45
  36. package/lib/process-liveness.d.ts +16 -0
  37. package/lib/process-liveness.js +19 -12
  38. package/lib/provider-credential-path.d.ts +16 -0
  39. package/lib/provider-credential-path.js +31 -29
  40. package/lib/provider-defaults.d.ts +30 -0
  41. package/lib/provider-defaults.js +47 -42
  42. package/lib/provider-detection.d.ts +11 -0
  43. package/lib/provider-detection.js +91 -54
  44. package/lib/provider-names.d.ts +38 -0
  45. package/lib/provider-names.js +56 -64
  46. package/lib/repo-settings.d.ts +28 -0
  47. package/lib/repo-settings.js +83 -59
  48. package/lib/run-mode.d.ts +21 -0
  49. package/lib/run-mode.js +21 -20
  50. package/lib/run-plan.d.ts +28 -0
  51. package/lib/run-plan.js +17 -16
  52. package/lib/settings/claude-auth.d.ts +35 -0
  53. package/lib/settings/claude-auth.js +30 -47
  54. package/lib/settings-defaults.d.ts +20 -0
  55. package/lib/settings-defaults.js +149 -0
  56. package/lib/settings-error.d.ts +7 -0
  57. package/lib/settings-error.js +8 -0
  58. package/lib/settings-issue-providers.d.ts +10 -0
  59. package/lib/settings-issue-providers.js +12 -0
  60. package/lib/settings-models.d.ts +22 -0
  61. package/lib/settings-models.js +93 -0
  62. package/lib/settings-storage.d.ts +23 -0
  63. package/lib/settings-storage.js +205 -0
  64. package/lib/settings-validation.d.ts +7 -0
  65. package/lib/settings-validation.js +182 -0
  66. package/lib/settings.d.ts +29 -0
  67. package/lib/settings.js +41 -736
  68. package/lib/setup-apply-types.d.ts +66 -0
  69. package/lib/setup-apply-types.js +2 -0
  70. package/lib/setup-apply.d.ts +39 -0
  71. package/lib/setup-apply.js +267 -264
  72. package/lib/setup-journal.d.ts +41 -0
  73. package/lib/setup-journal.js +119 -76
  74. package/lib/setup-plan-types.d.ts +102 -0
  75. package/lib/setup-plan-types.js +2 -0
  76. package/lib/setup-plan.d.ts +30 -0
  77. package/lib/setup-plan.js +300 -324
  78. package/lib/setup-undo.d.ts +44 -0
  79. package/lib/setup-undo.js +61 -74
  80. package/lib/start-cluster-config.d.ts +26 -0
  81. package/lib/start-cluster-config.js +56 -0
  82. package/lib/start-cluster-environment.d.ts +41 -0
  83. package/lib/start-cluster-environment.js +134 -0
  84. package/lib/start-cluster-run-options.d.ts +54 -0
  85. package/lib/start-cluster-run-options.js +148 -0
  86. package/lib/start-cluster.d.ts +64 -0
  87. package/lib/start-cluster.js +98 -454
  88. package/lib/stream-json-parser.d.ts +17 -0
  89. package/lib/stream-json-parser.js +51 -52
  90. package/npm-shrinkwrap.json +6 -8
  91. package/package.json +14 -8
  92. package/scripts/postinstall.js +27 -0
  93. package/scripts/rust-distribution.js +36 -45
  94. package/src/agent/agent-command-proofs-context.js +35 -45
  95. package/src/agent/agent-command-proofs-context.ts +87 -0
  96. package/src/agent/agent-config-settings.js +19 -0
  97. package/src/agent/agent-config-settings.ts +41 -0
  98. package/src/agent/agent-config.js +122 -231
  99. package/src/agent/agent-config.ts +285 -0
  100. package/src/agent/agent-context-builder.js +38 -273
  101. package/src/agent/agent-context-builder.ts +51 -0
  102. package/src/agent/agent-context-environment-sections.js +105 -0
  103. package/src/agent/agent-context-environment-sections.ts +134 -0
  104. package/src/agent/agent-context-packs.js +165 -0
  105. package/src/agent/agent-context-packs.ts +296 -0
  106. package/src/agent/agent-context-prompt-sections.js +100 -0
  107. package/src/agent/agent-context-prompt-sections.ts +148 -0
  108. package/src/agent/agent-context-sections.js +25 -334
  109. package/src/agent/agent-context-sections.ts +36 -0
  110. package/src/agent/agent-context-sources.js +96 -149
  111. package/src/agent/agent-context-sources.ts +253 -0
  112. package/src/agent/agent-context-types.js +2 -0
  113. package/src/agent/agent-context-types.ts +132 -0
  114. package/src/agent/agent-context-validation-sections.js +73 -0
  115. package/src/agent/agent-context-validation-sections.ts +129 -0
  116. package/src/agent/agent-input-injector.js +99 -118
  117. package/src/agent/agent-input-injector.ts +195 -0
  118. package/src/agent/agent-liveness-poll.js +74 -78
  119. package/src/agent/agent-liveness-poll.ts +163 -0
  120. package/src/agent/agent-quality-gate-schema.js +77 -86
  121. package/src/agent/agent-quality-gate-schema.ts +135 -0
  122. package/src/agent/agent-quality-gates-context.js +44 -50
  123. package/src/agent/agent-quality-gates-context.ts +91 -0
  124. package/src/agent/agent-stuck-detector.js +171 -239
  125. package/src/agent/agent-stuck-detector.ts +288 -0
  126. package/src/agent/agent-trigger-evaluator.js +29 -46
  127. package/src/agent/agent-trigger-evaluator.ts +98 -0
  128. package/src/agent/context-metrics.js +110 -141
  129. package/src/agent/context-metrics.ts +261 -0
  130. package/src/agent/context-pack-builder.js +72 -358
  131. package/src/agent/context-pack-builder.ts +105 -0
  132. package/src/agent/context-pack-core.js +70 -0
  133. package/src/agent/context-pack-core.ts +96 -0
  134. package/src/agent/context-pack-selection.js +119 -0
  135. package/src/agent/context-pack-selection.ts +187 -0
  136. package/src/agent/context-pack-truncation.js +139 -0
  137. package/src/agent/context-pack-truncation.ts +208 -0
  138. package/src/agent/context-pack-types.js +2 -0
  139. package/src/agent/context-pack-types.ts +98 -0
  140. package/src/agent/context-replay-policy.js +30 -39
  141. package/src/agent/context-replay-policy.ts +71 -0
  142. package/src/agent/critical-agent-policy.js +6 -10
  143. package/src/agent/critical-agent-policy.ts +20 -0
  144. package/src/agent/guidance-queue.js +74 -87
  145. package/src/agent/guidance-queue.ts +166 -0
  146. package/src/agent/output-extraction-error-detail.js +45 -0
  147. package/src/agent/output-extraction-error-detail.ts +49 -0
  148. package/src/agent/output-extraction-failures.js +125 -0
  149. package/src/agent/output-extraction-failures.ts +149 -0
  150. package/src/agent/output-extraction-json.js +234 -0
  151. package/src/agent/output-extraction-json.ts +235 -0
  152. package/src/agent/output-extraction-pi.js +124 -0
  153. package/src/agent/output-extraction-pi.ts +137 -0
  154. package/src/agent/output-extraction-types.js +2 -0
  155. package/src/agent/output-extraction-types.ts +49 -0
  156. package/src/agent/output-extraction.js +17 -617
  157. package/src/agent/output-extraction.ts +30 -0
  158. package/src/agent/output-reformatter-errors.js +83 -0
  159. package/src/agent/output-reformatter-errors.ts +106 -0
  160. package/src/agent/output-reformatter-types.js +2 -0
  161. package/src/agent/output-reformatter-types.ts +86 -0
  162. package/src/agent/output-reformatter.js +140 -185
  163. package/src/agent/output-reformatter.ts +238 -0
  164. package/src/agent/pi-terminal-lifecycle-types.js +2 -0
  165. package/src/agent/pi-terminal-lifecycle-types.ts +41 -0
  166. package/src/agent/pi-terminal-lifecycle.js +186 -206
  167. package/src/agent/pi-terminal-lifecycle.ts +297 -0
  168. package/src/agent/provider-control-plane.js +22 -21
  169. package/src/agent/provider-control-plane.ts +52 -0
  170. package/src/agent/provider-terminal-failure-types.js +2 -0
  171. package/src/agent/provider-terminal-failure-types.ts +60 -0
  172. package/src/agent/provider-terminal-failure.js +194 -191
  173. package/src/agent/provider-terminal-failure.ts +262 -0
  174. package/src/agent/rate-limit-backoff.js +31 -74
  175. package/src/agent/rate-limit-backoff.ts +71 -0
  176. package/src/agent/schema-utils.js +85 -125
  177. package/src/agent/schema-utils.ts +148 -0
  178. package/src/agent/structured-output-error.js +34 -33
  179. package/src/agent/structured-output-error.ts +105 -0
  180. package/src/agent/validation-platform.js +27 -27
  181. package/src/agent/validation-platform.ts +49 -0
  182. package/src/agents/git-pusher-template.js +17 -34
  183. package/src/attach/attach-client.js +232 -405
  184. package/src/attach/attach-client.ts +300 -0
  185. package/src/attach/attach-server-cleanup.js +43 -0
  186. package/src/attach/attach-server-cleanup.ts +39 -0
  187. package/src/attach/attach-server-clients.js +117 -0
  188. package/src/attach/attach-server-clients.ts +122 -0
  189. package/src/attach/attach-server-events.js +38 -0
  190. package/src/attach/attach-server-events.ts +36 -0
  191. package/src/attach/attach-server-pty.js +45 -0
  192. package/src/attach/attach-server-pty.ts +64 -0
  193. package/src/attach/attach-server-runtime.js +73 -0
  194. package/src/attach/attach-server-runtime.ts +62 -0
  195. package/src/attach/attach-server-socket.js +28 -0
  196. package/src/attach/attach-server-socket.ts +23 -0
  197. package/src/attach/attach-server-types.js +2 -0
  198. package/src/attach/attach-server-types.ts +82 -0
  199. package/src/attach/attach-server.js +106 -523
  200. package/src/attach/attach-server.ts +158 -0
  201. package/src/attach/index.js +18 -35
  202. package/src/attach/index.ts +18 -0
  203. package/src/attach/protocol.js +95 -184
  204. package/src/attach/protocol.ts +181 -0
  205. package/src/attach/ring-buffer.js +76 -102
  206. package/src/attach/ring-buffer.ts +109 -0
  207. package/src/attach/send-input.js +64 -75
  208. package/src/attach/send-input.ts +94 -0
  209. package/src/attach/socket-discovery.js +164 -218
  210. package/src/attach/socket-discovery.ts +230 -0
  211. package/src/attach/socket-paths.js +42 -61
  212. package/src/attach/socket-paths.ts +81 -0
  213. package/src/claude-credentials.js +51 -54
  214. package/src/claude-credentials.ts +89 -0
  215. package/src/cluster/generated/protocol-schema.ts +1 -1
  216. package/src/cluster/generated/protocol.ts +2 -1
  217. package/src/command-proofs.js +110 -141
  218. package/src/command-proofs.ts +216 -0
  219. package/src/config-router.js +81 -73
  220. package/src/config-router.ts +131 -0
  221. package/src/copy-containment.js +191 -0
  222. package/src/copy-containment.ts +259 -0
  223. package/src/copy-worker.js +53 -30
  224. package/src/copy-worker.ts +88 -0
  225. package/src/darwin-keychain-boundary.js +80 -111
  226. package/src/darwin-keychain-boundary.ts +148 -0
  227. package/src/guidance-topics.js +4 -5
  228. package/src/guidance-topics.ts +10 -0
  229. package/src/input-helpers.js +33 -54
  230. package/src/input-helpers.ts +58 -0
  231. package/src/isolation-manager.js +59 -20
  232. package/src/ledger-sequence.js +45 -48
  233. package/src/ledger-sequence.ts +63 -0
  234. package/src/legacy-lib/clusters-registry.ts +40 -0
  235. package/src/legacy-lib/completion.ts +148 -0
  236. package/src/legacy-lib/compose-utils.ts +102 -0
  237. package/src/legacy-lib/detached-startup.ts +451 -0
  238. package/src/legacy-lib/docker-config.ts +282 -0
  239. package/src/legacy-lib/docker-env-auth.ts +116 -0
  240. package/src/legacy-lib/git-remote-utils.ts +244 -0
  241. package/src/legacy-lib/id-detector.ts +57 -0
  242. package/src/legacy-lib/js-yaml.d.ts +3 -0
  243. package/src/legacy-lib/omelette.d.ts +15 -0
  244. package/src/legacy-lib/path-check.ts +89 -0
  245. package/src/legacy-lib/process-liveness.ts +36 -0
  246. package/src/legacy-lib/provider-credential-path.ts +57 -0
  247. package/src/legacy-lib/provider-defaults.ts +114 -0
  248. package/src/legacy-lib/provider-detection.ts +67 -0
  249. package/src/legacy-lib/provider-names.ts +126 -0
  250. package/src/legacy-lib/repo-settings.ts +88 -0
  251. package/src/legacy-lib/run-mode.ts +58 -0
  252. package/src/legacy-lib/run-plan.ts +49 -0
  253. package/src/legacy-lib/settings/claude-auth.ts +80 -0
  254. package/src/legacy-lib/settings-defaults.ts +212 -0
  255. package/src/legacy-lib/settings-error.ts +8 -0
  256. package/src/legacy-lib/settings-issue-providers.ts +18 -0
  257. package/src/legacy-lib/settings-models.ts +124 -0
  258. package/src/legacy-lib/settings-storage.ts +277 -0
  259. package/src/legacy-lib/settings-validation.ts +220 -0
  260. package/src/legacy-lib/settings.ts +87 -0
  261. package/src/legacy-lib/setup-apply-types.ts +70 -0
  262. package/src/legacy-lib/setup-apply.ts +456 -0
  263. package/src/legacy-lib/setup-journal.ts +185 -0
  264. package/src/legacy-lib/setup-plan-types.ts +96 -0
  265. package/src/legacy-lib/setup-plan.ts +500 -0
  266. package/src/legacy-lib/setup-undo.ts +142 -0
  267. package/src/legacy-lib/start-cluster-config.ts +124 -0
  268. package/src/legacy-lib/start-cluster-environment.ts +166 -0
  269. package/src/legacy-lib/start-cluster-run-options.ts +281 -0
  270. package/src/legacy-lib/start-cluster.ts +237 -0
  271. package/src/legacy-lib/stream-json-parser.ts +88 -0
  272. package/src/message-buffer.js +55 -71
  273. package/src/message-buffer.ts +107 -0
  274. package/src/message-bus-bridge.js +92 -133
  275. package/src/message-bus-bridge.ts +149 -0
  276. package/src/name-generator-shared.js +220 -0
  277. package/src/name-generator-shared.ts +231 -0
  278. package/src/name-generator.js +8 -217
  279. package/src/name-generator.ts +27 -0
  280. package/src/omp-blob-root.js +83 -64
  281. package/src/omp-blob-root.ts +116 -0
  282. package/src/omp-config-overlay.js +65 -38
  283. package/src/omp-config-overlay.ts +110 -0
  284. package/src/omp-execution-fingerprint.js +38 -43
  285. package/src/omp-execution-fingerprint.ts +92 -0
  286. package/src/omp-session-limits.js +10 -15
  287. package/src/omp-session-limits.ts +53 -0
  288. package/src/omp-session-partition.js +2 -2
  289. package/src/omp-session-verifier.js +1 -1
  290. package/src/orchestrator.js +32 -7
  291. package/src/pr-body-template.js +71 -0
  292. package/src/providers/anthropic/index.js +3 -1
  293. package/src/providers/anthropic/index.ts +13 -0
  294. package/src/providers/capabilities.js +19 -27
  295. package/src/providers/capabilities.ts +44 -0
  296. package/src/providers/google/index.js +3 -1
  297. package/src/providers/google/index.ts +13 -0
  298. package/src/providers/openai/index.js +3 -1
  299. package/src/providers/openai/index.ts +13 -0
  300. package/src/providers/opencode/index.js +3 -1
  301. package/src/providers/opencode/index.ts +13 -0
  302. package/src/quality-gates.js +67 -127
  303. package/src/quality-gates.ts +149 -0
  304. package/src/repo-settings-access.js +40 -0
  305. package/src/repo-settings-access.ts +64 -0
  306. package/src/schemas/sub-cluster.js +127 -183
  307. package/src/schemas/sub-cluster.ts +238 -0
  308. package/src/state-snapshot-normalization.js +224 -0
  309. package/src/state-snapshot-normalization.ts +222 -0
  310. package/src/state-snapshot.js +192 -359
  311. package/src/state-snapshot.ts +291 -0
  312. package/src/state-snapshotter.js +118 -130
  313. package/src/state-snapshotter.ts +167 -0
  314. package/src/sub-cluster-wrapper.js +4 -13
  315. package/src/task-run-model-args.js +87 -124
  316. package/src/task-run-model-args.ts +204 -0
  317. package/src/task-runner.js +5 -25
  318. package/src/task-runner.ts +28 -0
  319. package/src/task-startup-error.js +73 -58
  320. package/src/task-startup-error.ts +126 -0
  321. package/src/template-validation/consensus-gate-contracts.js +2 -0
  322. package/src/template-validation/consensus-gate-contracts.ts +70 -0
  323. package/src/template-validation/consensus-gate-scenarios.js +76 -0
  324. package/src/template-validation/consensus-gate-scenarios.ts +130 -0
  325. package/src/template-validation/consensus-gate-stage.js +34 -0
  326. package/src/template-validation/consensus-gate-stage.ts +56 -0
  327. package/src/template-validation/random-topology-contracts.js +2 -0
  328. package/src/template-validation/random-topology-contracts.ts +54 -0
  329. package/src/template-validation/random-topology-dispatch.js +25 -0
  330. package/src/template-validation/random-topology-dispatch.ts +33 -0
  331. package/src/template-validation/random-topology-message-loop.js +53 -0
  332. package/src/template-validation/random-topology-message-loop.ts +73 -0
  333. package/src/template-validation/random-topology-operations.js +79 -0
  334. package/src/template-validation/random-topology-operations.ts +101 -0
  335. package/src/template-validation/random-topology-runtime.js +25 -0
  336. package/src/template-validation/random-topology-runtime.ts +43 -0
  337. package/src/template-validation/random-topology-scenario.js +52 -0
  338. package/src/template-validation/random-topology-scenario.ts +57 -0
  339. package/src/template-validation/random-topology-schema.js +159 -0
  340. package/src/template-validation/random-topology-schema.ts +190 -0
  341. package/src/template-validation/random-topology-state.js +28 -0
  342. package/src/template-validation/random-topology-state.ts +30 -0
  343. package/src/template-validation/random-topology-trigger-evaluation.js +45 -0
  344. package/src/template-validation/random-topology-trigger-evaluation.ts +65 -0
  345. package/src/template-validation/random-topology-trigger.js +75 -0
  346. package/src/template-validation/random-topology-trigger.ts +88 -0
  347. package/src/template-validation/report-formatter.js +40 -46
  348. package/src/template-validation/report-formatter.ts +101 -0
  349. package/src/template-validation/simulate-consensus-gates.js +111 -302
  350. package/src/template-validation/simulate-consensus-gates.ts +196 -0
  351. package/src/template-validation/simulate-random-topology.js +26 -519
  352. package/src/template-validation/simulate-random-topology.ts +57 -0
  353. package/src/template-validation/simulate-two-stage-validation.js +41 -265
  354. package/src/template-validation/simulate-two-stage-validation.ts +55 -0
  355. package/src/template-validation/simulation-agent-runtime.js +25 -0
  356. package/src/template-validation/simulation-agent-runtime.ts +40 -0
  357. package/src/template-validation/simulation-agent.js +29 -0
  358. package/src/template-validation/simulation-agent.ts +73 -0
  359. package/src/template-validation/simulation-runtime.js +34 -0
  360. package/src/template-validation/simulation-runtime.ts +72 -0
  361. package/src/template-validation/two-stage-contracts.js +2 -0
  362. package/src/template-validation/two-stage-contracts.ts +41 -0
  363. package/src/template-validation/two-stage-inputs.js +21 -0
  364. package/src/template-validation/two-stage-inputs.ts +29 -0
  365. package/src/template-validation/two-stage-results.js +30 -0
  366. package/src/template-validation/two-stage-results.ts +40 -0
  367. package/src/template-validation/two-stage-scenario.js +86 -0
  368. package/src/template-validation/two-stage-scenario.ts +120 -0
  369. package/src/worktree-claude-config.js +182 -220
  370. package/src/worktree-claude-config.ts +272 -0
  371. package/src/worktree-tooling-env.js +103 -125
  372. package/src/worktree-tooling-env.ts +142 -0
  373. package/task-lib/completion.js +2 -3
  374. package/task-lib/completion.ts +9 -0
  375. package/task-lib/config.js +1 -4
  376. package/task-lib/config.ts +11 -0
  377. package/task-lib/name-generator.js +4 -226
  378. package/task-lib/name-generator.ts +11 -0
  379. package/task-lib/omp-session-cleanup.js +1 -1
  380. package/task-lib/omp-storage-root.js +8 -12
  381. package/task-lib/omp-storage-root.ts +62 -0
  382. package/task-lib/process-termination.js +143 -166
  383. package/task-lib/process-termination.ts +268 -0
@@ -0,0 +1,105 @@
1
+ const STRUCTURED_OUTPUT_INVALID_CODE = 'STRUCTURED_OUTPUT_INVALID';
2
+
3
+ interface ValidationFailure {
4
+ readonly error?: unknown;
5
+ }
6
+
7
+ interface RecoveryResult {
8
+ readonly status?: string;
9
+ readonly attempts?: number;
10
+ readonly lastError?: unknown;
11
+ }
12
+
13
+ interface StructuredOutputAgent {
14
+ readonly id: string;
15
+ readonly role: string;
16
+ }
17
+
18
+ interface StructuredOutputFailure {
19
+ readonly message: string;
20
+ readonly code: unknown;
21
+ readonly details?: unknown;
22
+ }
23
+
24
+ function createStructuredOutputInvalidError(
25
+ message: string,
26
+ kind: unknown,
27
+ validation: ValidationFailure | null = null,
28
+ recovery: RecoveryResult | null = null
29
+ ): Error & {
30
+ code: typeof STRUCTURED_OUTPUT_INVALID_CODE;
31
+ details: {
32
+ kind: unknown;
33
+ validationError: unknown;
34
+ recoveryAttempts: number | undefined;
35
+ recoveryError: unknown;
36
+ };
37
+ } {
38
+ const properties: {
39
+ code: typeof STRUCTURED_OUTPUT_INVALID_CODE;
40
+ details: {
41
+ kind: unknown;
42
+ validationError: unknown;
43
+ recoveryAttempts: number | undefined;
44
+ recoveryError: unknown;
45
+ };
46
+ } = {
47
+ code: STRUCTURED_OUTPUT_INVALID_CODE,
48
+ details: {
49
+ kind,
50
+ validationError: validation?.error ?? null,
51
+ recoveryAttempts: recovery?.status === 'exhausted' ? recovery.attempts : 0,
52
+ recoveryError: recovery?.status === 'exhausted' ? recovery.lastError : null,
53
+ },
54
+ };
55
+ return Object.assign(new Error(message), properties);
56
+ }
57
+
58
+ function isStructuredOutputInvalidError(error: unknown): boolean {
59
+ if ((typeof error !== 'object' || error === null) && typeof error !== 'function') {
60
+ return false;
61
+ }
62
+ return 'code' in error && error.code === STRUCTURED_OUTPUT_INVALID_CODE;
63
+ }
64
+
65
+ function buildStructuredOutputClusterFailure(
66
+ agent: StructuredOutputAgent,
67
+ error: StructuredOutputFailure
68
+ ): {
69
+ topic: 'CLUSTER_FAILED';
70
+ receiver: 'broadcast';
71
+ content: {
72
+ text: string;
73
+ data: {
74
+ reason: 'structured_output_invalid';
75
+ agentId: string;
76
+ role: string;
77
+ code: unknown;
78
+ details: unknown;
79
+ error: string;
80
+ };
81
+ };
82
+ } {
83
+ return {
84
+ topic: 'CLUSTER_FAILED',
85
+ receiver: 'broadcast',
86
+ content: {
87
+ text: `Cluster failed: structured output is invalid for ${agent.id} - ${error.message}`,
88
+ data: {
89
+ reason: 'structured_output_invalid',
90
+ agentId: agent.id,
91
+ role: agent.role,
92
+ code: error.code,
93
+ details: error.details ?? null,
94
+ error: error.message,
95
+ },
96
+ },
97
+ };
98
+ }
99
+
100
+ export = {
101
+ STRUCTURED_OUTPUT_INVALID_CODE,
102
+ createStructuredOutputInvalidError,
103
+ isStructuredOutputInvalidError,
104
+ buildStructuredOutputClusterFailure,
105
+ };
@@ -1,35 +1,35 @@
1
- const PLATFORM_MISMATCH_REGEX =
2
- /EBADPLATFORM|Unsupported platform|darwin-arm64|linux-x64|@esbuild\/linux-x64/i;
3
-
1
+ "use strict";
2
+ const PLATFORM_MISMATCH_REGEX = /EBADPLATFORM|Unsupported platform|darwin-arm64|linux-x64|@esbuild\/linux-x64/i;
3
+ function isValidationCriterion(value) {
4
+ return (typeof value === 'object' && value !== null) || typeof value === 'function';
5
+ }
4
6
  function isPlatformMismatchReason(reason) {
5
- if (!reason) return false;
6
- return PLATFORM_MISMATCH_REGEX.test(String(reason));
7
+ if (!reason)
8
+ return false;
9
+ return PLATFORM_MISMATCH_REGEX.test(String(reason));
7
10
  }
8
-
9
11
  function findPlatformMismatchReason(result = {}) {
10
- const criteriaResults = result.criteriaResults;
11
- if (Array.isArray(criteriaResults)) {
12
- for (const criteria of criteriaResults) {
13
- if (criteria?.status !== 'CANNOT_VALIDATE') continue;
14
- if (isPlatformMismatchReason(criteria.reason)) {
15
- return String(criteria.reason);
16
- }
12
+ const criteriaResults = result.criteriaResults;
13
+ if (Array.isArray(criteriaResults)) {
14
+ for (const criteria of criteriaResults) {
15
+ if (!isValidationCriterion(criteria) || criteria.status !== 'CANNOT_VALIDATE')
16
+ continue;
17
+ if (isPlatformMismatchReason(criteria.reason)) {
18
+ return String(criteria.reason);
19
+ }
20
+ }
17
21
  }
18
- }
19
-
20
- const errors = result.errors;
21
- if (Array.isArray(errors)) {
22
- for (const error of errors) {
23
- if (isPlatformMismatchReason(error)) {
24
- return String(error);
25
- }
22
+ const errors = result.errors;
23
+ if (Array.isArray(errors)) {
24
+ for (const error of errors) {
25
+ if (isPlatformMismatchReason(error)) {
26
+ return String(error);
27
+ }
28
+ }
26
29
  }
27
- }
28
-
29
- return null;
30
+ return null;
30
31
  }
31
-
32
32
  module.exports = {
33
- isPlatformMismatchReason,
34
- findPlatformMismatchReason,
33
+ isPlatformMismatchReason,
34
+ findPlatformMismatchReason,
35
35
  };
@@ -0,0 +1,49 @@
1
+ const PLATFORM_MISMATCH_REGEX =
2
+ /EBADPLATFORM|Unsupported platform|darwin-arm64|linux-x64|@esbuild\/linux-x64/i;
3
+
4
+ interface ValidationCriterion {
5
+ readonly status?: unknown;
6
+ readonly reason?: unknown;
7
+ }
8
+
9
+ interface ValidationResult {
10
+ readonly criteriaResults?: unknown;
11
+ readonly errors?: unknown;
12
+ }
13
+
14
+ function isValidationCriterion(value: unknown): value is ValidationCriterion {
15
+ return (typeof value === 'object' && value !== null) || typeof value === 'function';
16
+ }
17
+
18
+ function isPlatformMismatchReason(reason: unknown): boolean {
19
+ if (!reason) return false;
20
+ return PLATFORM_MISMATCH_REGEX.test(String(reason));
21
+ }
22
+
23
+ function findPlatformMismatchReason(result: ValidationResult = {}): string | null {
24
+ const criteriaResults = result.criteriaResults;
25
+ if (Array.isArray(criteriaResults)) {
26
+ for (const criteria of criteriaResults) {
27
+ if (!isValidationCriterion(criteria) || criteria.status !== 'CANNOT_VALIDATE') continue;
28
+ if (isPlatformMismatchReason(criteria.reason)) {
29
+ return String(criteria.reason);
30
+ }
31
+ }
32
+ }
33
+
34
+ const errors = result.errors;
35
+ if (Array.isArray(errors)) {
36
+ for (const error of errors) {
37
+ if (isPlatformMismatchReason(error)) {
38
+ return String(error);
39
+ }
40
+ }
41
+ }
42
+
43
+ return null;
44
+ }
45
+
46
+ export = {
47
+ isPlatformMismatchReason,
48
+ findPlatformMismatchReason,
49
+ };
@@ -277,6 +277,7 @@ return hasSufficientEvidence;`;
277
277
  const { readRepoSettings } = require('../../lib/repo-settings');
278
278
  const { normalizeGitRemoteName, quoteShellArgument } = require('../../lib/git-remote-utils');
279
279
  const { resolveRequiredQualityGates } = require('../quality-gates');
280
+ const { renderPullRequestBody, resolveIssueContext } = require('../pr-body-template');
280
281
 
281
282
  function getSafeBranchName(value) {
282
283
  if (typeof value !== 'string') {
@@ -314,35 +315,6 @@ function normalizeCloseIssueMode(value) {
314
315
  return null;
315
316
  }
316
317
 
317
- function normalizeIssueNumber(value) {
318
- const candidate = typeof value === 'number' ? String(value) : value;
319
- if (typeof candidate !== 'string') return 'unknown';
320
- const trimmed = candidate.trim();
321
- return /^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(trimmed) ? trimmed : 'unknown';
322
- }
323
-
324
- function normalizeIssueTitle(value) {
325
- if (typeof value !== 'string' || value.trim() === '') return 'Implementation';
326
- const normalized = [...value]
327
- .map((character) => {
328
- const codePoint = character.codePointAt(0);
329
- return codePoint < 0x20 || codePoint === 0x7f ? ' ' : character;
330
- })
331
- .join('')
332
- .trim();
333
- return normalized || 'Implementation';
334
- }
335
-
336
- function resolveIssueContext(options) {
337
- const issueNumber = normalizeIssueNumber(options.issueNumber);
338
- const issueTitle = normalizeIssueTitle(options.issueTitle);
339
- const issueReference =
340
- options.includeIssueReference === false || issueNumber === 'unknown'
341
- ? ''
342
- : `Closes #${issueNumber}`;
343
- return { issueNumber, issueTitle, issueReference };
344
- }
345
-
346
318
  /**
347
319
  * Resolve GitHub configuration from CLI options and repo settings.
348
320
  * Priority: CLI options > repo settings (.zeroshot/settings.json) > defaults
@@ -355,6 +327,7 @@ function resolveIssueContext(options) {
355
327
  * @param {string|number} [options.issueNumber] - Typed issue identifier for prompt commands
356
328
  * @param {string} [options.issueTitle] - Typed issue title for prompt commands
357
329
  * @param {boolean} [options.includeIssueReference] - Include the closing reference in PR text
330
+ * @param {string} [options.prBody] - Literal PR body template with supported issue tokens
358
331
  * @returns {Object} Resolved configuration
359
332
  */
360
333
  function resolveGitHubConfig(options = {}) {
@@ -385,16 +358,23 @@ function resolveGitHubConfig(options = {}) {
385
358
  options.autoMerge === true ||
386
359
  (options.autoMerge !== false && parseBool(repoGithub.autoMerge) === true);
387
360
 
361
+ const issueContext = resolveIssueContext(options);
362
+
388
363
  return {
389
364
  prBase,
390
365
  useMergeQueue,
391
366
  closeIssueMode,
392
367
  autoMerge,
393
368
  gitRemote,
394
- issueContext: resolveIssueContext(options),
369
+ issueContext,
370
+ prBody: renderPullRequestBody(options.prBody, options),
395
371
  };
396
372
  }
397
373
 
374
+ function resolvedPrBody(config, issueContext) {
375
+ return typeof config.prBody === 'string' ? config.prBody : issueContext.issueReference;
376
+ }
377
+
398
378
  /**
399
379
  * Generate platform-specific configuration based on resolved GitHub config.
400
380
  *
@@ -406,13 +386,15 @@ function getPlatformConfig(platform, config = {}) {
406
386
  const { prBase, useMergeQueue, closeIssueMode, autoMerge, gitRemote } = config;
407
387
  const issueContext = config.issueContext || resolveIssueContext({});
408
388
  const issueTitleArgument = quoteShellArgument(`feat: ${issueContext.issueTitle}`);
409
- const issueReferenceArgument = quoteShellArgument(issueContext.issueReference);
389
+ const prBodyArgument = quoteShellArgument(resolvedPrBody(config, issueContext));
410
390
 
411
391
  const PLATFORM_CONFIGS = {
412
392
  github: {
413
393
  prName: 'PR',
414
394
  prNameLower: 'pull request',
415
- createCmd: `gh pr create${prBase ? ` --base ${prBase}` : ''} --title ${issueTitleArgument} --body ${issueReferenceArgument}`,
395
+ createCmd:
396
+ `gh pr create${prBase ? ` --base ${prBase}` : ''} ` +
397
+ `--title ${issueTitleArgument} --body ${prBodyArgument}`,
416
398
  mergeCmd: useMergeQueue
417
399
  ? `PR_ID="$(timeout 30 gh pr view --json id --jq .id)"
418
400
  gh api graphql -f query='mutation($id:ID!){enqueuePullRequest(input:{pullRequestId:$id}){mergeQueueEntry{state}}}' -f id="$PR_ID"
@@ -434,7 +416,7 @@ for i in $(seq 1 90); do if timeout 30 gh pr view --json mergedAt --jq .mergedAt
434
416
  gitlab: {
435
417
  prName: 'MR',
436
418
  prNameLower: 'merge request',
437
- createCmd: `glab mr create --title ${issueTitleArgument} --description ${issueReferenceArgument}`,
419
+ createCmd: `glab mr create --title ${issueTitleArgument} --description ${prBodyArgument}`,
438
420
  mergeCmd: 'glab mr merge --auto-merge',
439
421
  mergeFallbackCmd: 'glab mr merge',
440
422
  prUrlExample: 'https://gitlab.com/owner/repo/-/merge_requests/123',
@@ -447,7 +429,7 @@ for i in $(seq 1 90); do if timeout 30 gh pr view --json mergedAt --jq .mergedAt
447
429
  'azure-devops': {
448
430
  prName: 'PR',
449
431
  prNameLower: 'pull request',
450
- createCmd: `az repos pr create --title ${issueTitleArgument} --description ${issueReferenceArgument}`,
432
+ createCmd: `az repos pr create --title ${issueTitleArgument} --description ${prBodyArgument}`,
451
433
  mergeCmd: 'az repos pr update --id <PR_ID> --auto-complete true',
452
434
  mergeFallbackCmd: 'az repos pr update --id <PR_ID> --status completed',
453
435
  prUrlExample: 'https://dev.azure.com/org/project/_git/repo/pullrequest/123',
@@ -803,6 +785,7 @@ If blocked before creating a ${prName}, output:
803
785
  * @param {string|number} [options.issueNumber] - Typed issue identifier for prompt commands
804
786
  * @param {string} [options.issueTitle] - Typed issue title for prompt commands
805
787
  * @param {boolean} [options.includeIssueReference] - Include the closing reference in PR text
788
+ * @param {string} [options.prBody] - Literal PR body template with supported issue tokens
806
789
  * @param {Array} [options.requiredQualityGates] - Required handoff quality gates
807
790
  * @param {boolean} [options.autoMerge] - Merge the PR (--ship). False stops after PR creation (--pr).
808
791
  * @returns {Object} Agent configuration object