@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,281 @@
1
+ type RunIsolation = 'none' | 'worktree' | 'docker';
2
+ type RunDelivery = 'none' | 'pr' | 'ship';
3
+
4
+ interface RunPlan {
5
+ isolation: RunIsolation;
6
+ delivery: RunDelivery;
7
+ autoMerge: boolean;
8
+ }
9
+
10
+ interface Settings extends Record<string, unknown> {
11
+ defaultIsolation?: string;
12
+ defaultDelivery?: string;
13
+ }
14
+
15
+ interface RunOptions extends Record<string, unknown> {
16
+ autoMerge?: unknown;
17
+ autoPush?: unknown;
18
+ closeIssue?: unknown;
19
+ containerHome?: unknown;
20
+ cwd?: unknown;
21
+ docker?: unknown;
22
+ dockerImage?: unknown;
23
+ isolation?: unknown;
24
+ mergeQueue?: unknown;
25
+ mount?: readonly string[] | null;
26
+ mounts?: unknown;
27
+ noIsolation?: unknown;
28
+ noMounts?: unknown;
29
+ pr?: unknown;
30
+ prBase?: unknown;
31
+ prBody?: unknown;
32
+ preparedWorktree?: unknown;
33
+ requiredQualityGates?: unknown;
34
+ ship?: unknown;
35
+ worktree?: unknown;
36
+ }
37
+
38
+ interface RunPlanFacade {
39
+ resolveRunPlan(options?: RunOptions): Readonly<RunPlan>;
40
+ }
41
+
42
+ interface RunModeFacade {
43
+ runModeFromPlan(plan: RunPlan): string | null;
44
+ }
45
+
46
+ interface EnvironmentFacade {
47
+ firstTruthy<T>(...values: T[]): T | undefined;
48
+ anyTruthy(...values: unknown[]): boolean;
49
+ optionalValue<T>(value: T): T | undefined;
50
+ detectGitRepoRoot(): string;
51
+ resolveTargetCwd(): string | undefined;
52
+ resolveEnvBool(value: unknown): boolean | undefined;
53
+ mergeRunOptions(options: RunOptions): RunOptions;
54
+ resolveMergeQueue(options: RunOptions): boolean | undefined;
55
+ resolvePrBase(options: RunOptions): string | undefined;
56
+ resolveCloseIssue(options: RunOptions): 'auto' | 'always' | 'never' | undefined;
57
+ resolveMounts(options: RunOptions):
58
+ | Array<{ host: string; container: string; readonly: boolean }>
59
+ | undefined;
60
+ }
61
+
62
+ interface BuildStartOptionsArgs {
63
+ clusterId?: unknown;
64
+ options?: RunOptions;
65
+ settings?: Settings;
66
+ providerOverride?: unknown;
67
+ modelOverride?: unknown;
68
+ forceProvider?: unknown;
69
+ }
70
+
71
+ interface BuildTrustedStartOptionsArgs extends BuildStartOptionsArgs {
72
+ plan?: RunPlan | null;
73
+ }
74
+
75
+ interface BuildStartOptionsFromPlanArgs extends BuildStartOptionsArgs {
76
+ plan: RunPlan;
77
+ options: RunOptions;
78
+ settings: Settings;
79
+ preparedWorktree?: unknown;
80
+ environment: boolean;
81
+ }
82
+
83
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
84
+ const runPlan: RunPlanFacade = require('./run-plan');
85
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
86
+ const runMode: RunModeFacade = require('./run-mode');
87
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
88
+ const environmentHelpers: EnvironmentFacade = require('./start-cluster-environment');
89
+
90
+ const { resolveRunPlan } = runPlan;
91
+ const { runModeFromPlan } = runMode;
92
+ const {
93
+ firstTruthy,
94
+ anyTruthy,
95
+ optionalValue,
96
+ detectGitRepoRoot,
97
+ resolveTargetCwd,
98
+ resolveEnvBool,
99
+ mergeRunOptions,
100
+ resolveMergeQueue,
101
+ resolvePrBase,
102
+ resolveCloseIssue,
103
+ resolveMounts,
104
+ } = environmentHelpers;
105
+
106
+ function isRunIsolation(value: string): value is RunIsolation {
107
+ return value === 'none' || value === 'worktree' || value === 'docker';
108
+ }
109
+
110
+ function isRunDelivery(value: string): value is RunDelivery {
111
+ return value === 'none' || value === 'pr' || value === 'ship';
112
+ }
113
+
114
+ function validateSavedRunModes(settings: Settings): {
115
+ isolation: RunIsolation;
116
+ delivery: RunDelivery;
117
+ } {
118
+ const isolation = settings.defaultIsolation || 'none';
119
+ const delivery = settings.defaultDelivery || 'none';
120
+ if (!isRunIsolation(isolation)) {
121
+ throw new Error(`Invalid saved isolation mode: ${isolation}`);
122
+ }
123
+ if (!isRunDelivery(delivery)) {
124
+ throw new Error(`Invalid saved delivery mode: ${delivery}`);
125
+ }
126
+ return { isolation, delivery };
127
+ }
128
+
129
+ function resolveEffectiveIsolation(options: RunOptions, savedIsolation: RunIsolation): RunIsolation {
130
+ if (options.noIsolation === true || options.isolation === false) return 'none';
131
+ if (options.docker === true) return 'docker';
132
+ if (options.worktree === true || options.pr === true || options.ship === true) return 'worktree';
133
+ if (resolveEnvBool(process.env.ZEROSHOT_DOCKER) === true) return 'docker';
134
+ if (resolveEnvBool(process.env.ZEROSHOT_WORKTREE) === true) return 'worktree';
135
+ return savedIsolation;
136
+ }
137
+
138
+ function resolveEffectiveDelivery(options: RunOptions, savedDelivery: RunDelivery): RunDelivery {
139
+ if (options.ship === true || options.autoMerge === true) return 'ship';
140
+ if (options.pr === true || resolveEnvBool(process.env.ZEROSHOT_PR) === true) return 'pr';
141
+ return savedDelivery;
142
+ }
143
+
144
+ function resolveEffectiveRunPlan(
145
+ options: RunOptions = {},
146
+ settings: Settings = {}
147
+ ): Readonly<RunPlan> {
148
+ const mergedOptions = mergeRunOptions(options);
149
+ const noIsolation = mergedOptions.noIsolation === true || mergedOptions.isolation === false;
150
+ const conflicts = ['docker', 'worktree', 'pr', 'ship'].filter(
151
+ (key) => mergedOptions[key] === true
152
+ );
153
+ if (noIsolation && conflicts.length > 0) {
154
+ throw new Error(`--no-isolation conflicts with --${conflicts.join(', --')}`);
155
+ }
156
+
157
+ const saved = validateSavedRunModes(settings);
158
+ let isolation = resolveEffectiveIsolation(mergedOptions, saved.isolation);
159
+ const delivery = resolveEffectiveDelivery(mergedOptions, saved.delivery);
160
+ if (delivery !== 'none' && isolation === 'none') {
161
+ if (noIsolation) {
162
+ throw new Error(`--no-isolation conflicts with saved delivery mode "${delivery}"`);
163
+ }
164
+ isolation = 'worktree';
165
+ }
166
+ return resolveRunPlan({
167
+ docker: isolation === 'docker',
168
+ worktree: isolation === 'worktree',
169
+ pr: delivery === 'pr',
170
+ ship: delivery === 'ship',
171
+ });
172
+ }
173
+
174
+ function buildStartOptionsFromPlan({
175
+ clusterId,
176
+ plan,
177
+ options,
178
+ settings,
179
+ providerOverride,
180
+ modelOverride,
181
+ forceProvider,
182
+ preparedWorktree,
183
+ environment,
184
+ }: BuildStartOptionsFromPlanArgs): Readonly<Record<string, unknown>> {
185
+ const targetCwd = environment ? resolveTargetCwd() : options.cwd;
186
+ return Object.freeze({
187
+ clusterId,
188
+ cwd: targetCwd,
189
+ isolation: plan.isolation === 'docker',
190
+ isolationImage: environment
191
+ ? firstTruthy(options.dockerImage, process.env.ZEROSHOT_DOCKER_IMAGE)
192
+ : optionalValue(options.dockerImage),
193
+ worktree: plan.isolation === 'worktree',
194
+ preparedWorktree: preparedWorktree || undefined,
195
+ autoPr: plan.delivery !== 'none',
196
+ autoMerge: plan.autoMerge,
197
+ autoPush: environment ? process.env.ZEROSHOT_PUSH === '1' : options.autoPush === true,
198
+ modelOverride: optionalValue(modelOverride),
199
+ providerOverride: optionalValue(providerOverride),
200
+ noMounts: anyTruthy(options.mounts === false, options.noMounts === true),
201
+ mounts: resolveMounts(options),
202
+ containerHome: optionalValue(options.containerHome),
203
+ forceProvider: optionalValue(forceProvider),
204
+ prBase: environment ? resolvePrBase(options) : optionalValue(options.prBase),
205
+ prBody: typeof options.prBody === 'string' ? options.prBody : undefined,
206
+ mergeQueue: environment ? resolveMergeQueue(options) : optionalValue(options.mergeQueue),
207
+ closeIssue: environment ? resolveCloseIssue(options) : optionalValue(options.closeIssue),
208
+ ship: plan.delivery === 'ship',
209
+ runMode: runModeFromPlan(plan),
210
+ requiredQualityGates: options.requiredQualityGates,
211
+ settings,
212
+ });
213
+ }
214
+
215
+ function buildStartOptions({
216
+ clusterId,
217
+ options = {},
218
+ settings = {},
219
+ providerOverride,
220
+ modelOverride,
221
+ forceProvider,
222
+ }: BuildStartOptionsArgs): Readonly<Record<string, unknown>> {
223
+ const mergedOptions = mergeRunOptions(options);
224
+ const plan = resolveEffectiveRunPlan(options, settings);
225
+ return buildStartOptionsFromPlan({
226
+ clusterId,
227
+ plan,
228
+ options: mergedOptions,
229
+ settings,
230
+ providerOverride,
231
+ modelOverride,
232
+ forceProvider,
233
+ environment: true,
234
+ });
235
+ }
236
+
237
+ function buildTrustedStartOptions({
238
+ clusterId,
239
+ plan,
240
+ options = {},
241
+ settings = {},
242
+ providerOverride,
243
+ modelOverride,
244
+ forceProvider,
245
+ }: BuildTrustedStartOptionsArgs): Readonly<Record<string, unknown>> {
246
+ if (!plan || !Object.isFrozen(plan)) {
247
+ throw new Error('Trusted start requires a frozen canonical run plan');
248
+ }
249
+ const canonical = resolveRunPlan({
250
+ docker: plan.isolation === 'docker',
251
+ worktree: plan.isolation === 'worktree',
252
+ pr: plan.delivery === 'pr',
253
+ ship: plan.delivery === 'ship',
254
+ });
255
+ if (
256
+ canonical.isolation !== plan.isolation ||
257
+ canonical.delivery !== plan.delivery ||
258
+ canonical.autoMerge !== plan.autoMerge
259
+ ) {
260
+ throw new Error('Trusted start plan is not canonical');
261
+ }
262
+ if (canonical.isolation === 'none') {
263
+ throw new Error('Trusted worker start requires worktree or docker isolation');
264
+ }
265
+ if (options.preparedWorktree && canonical.isolation !== 'worktree') {
266
+ throw new Error('Prepared worktree requires canonical worktree isolation');
267
+ }
268
+ return buildStartOptionsFromPlan({
269
+ clusterId,
270
+ plan: canonical,
271
+ options,
272
+ settings,
273
+ providerOverride,
274
+ modelOverride,
275
+ forceProvider,
276
+ preparedWorktree: options.preparedWorktree,
277
+ environment: false,
278
+ });
279
+ }
280
+
281
+ export = { buildStartOptions, buildTrustedStartOptions, resolveEffectiveRunPlan, detectGitRepoRoot };
@@ -0,0 +1,237 @@
1
+ interface Settings extends Record<string, unknown> {}
2
+
3
+ interface ClusterConfig extends Record<string, unknown> {}
4
+
5
+ interface ClusterInput extends Record<string, string> {}
6
+
7
+ interface OrchestratorFacade {
8
+ loadConfig(configPath: string): ClusterConfig;
9
+ start(config: ClusterConfig, input: ClusterInput, options: unknown): unknown;
10
+ }
11
+
12
+ interface ProviderNamesFacade {
13
+ normalizeProviderName(name: string): string;
14
+ }
15
+
16
+ interface ProvidersFacade {
17
+ getProvider(providerId: string): unknown;
18
+ }
19
+
20
+ interface IssueProvidersFacade {
21
+ detectProvider(input: string, settings: Settings, forceProvider: string | null): unknown;
22
+ }
23
+
24
+ interface ConfigHelpersFacade {
25
+ resolveConfigPath(configName: string): string;
26
+ prepareClusterConfig(
27
+ config: ClusterConfig,
28
+ settings?: Settings,
29
+ providerOverride?: string | null
30
+ ): ClusterConfig;
31
+ loadClusterConfig(
32
+ orchestrator: OrchestratorFacade,
33
+ configPath: string,
34
+ settings?: Settings,
35
+ providerOverride?: string | null
36
+ ): ClusterConfig;
37
+ }
38
+
39
+ interface RunOptionsHelpersFacade {
40
+ buildStartOptions(args: Record<string, unknown>): unknown;
41
+ buildTrustedStartOptions(args: Record<string, unknown>): unknown;
42
+ resolveEffectiveRunPlan(options?: Record<string, unknown>, settings?: Settings): unknown;
43
+ detectGitRepoRoot(): string;
44
+ }
45
+
46
+ interface ProviderOverrideOptions {
47
+ provider?: string | null;
48
+ envProvider?: string | null;
49
+ validateProvider?: unknown;
50
+ }
51
+
52
+ interface StartClusterArgs extends Record<string, unknown> {
53
+ orchestrator?: OrchestratorFacade;
54
+ config?: ClusterConfig | null;
55
+ configPath?: string | null;
56
+ configName?: string | null;
57
+ settings?: Settings;
58
+ providerOverride?: string | null;
59
+ modelOverride?: unknown;
60
+ forceProvider?: unknown;
61
+ clusterId?: unknown;
62
+ options?: Record<string, unknown>;
63
+ text: string;
64
+ issue: string;
65
+ file: string;
66
+ }
67
+
68
+ interface ResolveConfigArgs {
69
+ orchestrator: OrchestratorFacade;
70
+ config?: ClusterConfig | null | undefined;
71
+ configPath?: string | null | undefined;
72
+ configName?: string | null | undefined;
73
+ settings?: Settings | undefined;
74
+ providerOverride?: string | null | undefined;
75
+ }
76
+
77
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
78
+ const providerNames: ProviderNamesFacade = require('./provider-names');
79
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
80
+ const providers: ProvidersFacade = require('../src/providers');
81
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
82
+ const issueProviders: IssueProvidersFacade = require('../src/issue-providers');
83
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
84
+ const configHelpers: ConfigHelpersFacade = require('./start-cluster-config');
85
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
86
+ const runOptionsHelpers: RunOptionsHelpersFacade = require('./start-cluster-run-options');
87
+
88
+ const { normalizeProviderName } = providerNames;
89
+ const { getProvider } = providers;
90
+ const { detectProvider } = issueProviders;
91
+ const { resolveConfigPath, prepareClusterConfig, loadClusterConfig } = configHelpers;
92
+ const { buildStartOptions, buildTrustedStartOptions, resolveEffectiveRunPlan, detectGitRepoRoot } =
93
+ runOptionsHelpers;
94
+
95
+ function buildTextInput(text: string): ClusterInput {
96
+ return { text };
97
+ }
98
+
99
+ function buildIssueInput(issue: string): ClusterInput {
100
+ return { issue };
101
+ }
102
+
103
+ function buildFileInput(file: string): ClusterInput {
104
+ return { file };
105
+ }
106
+
107
+ function detectRunInput(
108
+ inputArg: string,
109
+ settings: Settings = {},
110
+ forceProvider: string | null = null
111
+ ): ClusterInput {
112
+ const isMarkdownFile = /\.(md|markdown)$/i.test(inputArg);
113
+ if (isMarkdownFile) {
114
+ return buildFileInput(inputArg);
115
+ }
116
+
117
+ const ProviderClass = detectProvider(inputArg, settings, forceProvider);
118
+ if (ProviderClass) {
119
+ return buildIssueInput(inputArg);
120
+ }
121
+
122
+ return buildTextInput(inputArg);
123
+ }
124
+
125
+ const STDIN_MARKER = '-';
126
+
127
+ function isStdinInput(inputArg: string): boolean {
128
+ return inputArg === STDIN_MARKER;
129
+ }
130
+
131
+ async function readStdinText(
132
+ stream: AsyncIterable<string | Uint8Array> = process.stdin
133
+ ): Promise<string> {
134
+ const chunks: Array<string | Uint8Array> = [];
135
+ for await (const chunk of stream) {
136
+ chunks.push(chunk);
137
+ }
138
+ return Buffer.concat(chunks.map((chunk) => (Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))))
139
+ .toString('utf8')
140
+ .trim();
141
+ }
142
+
143
+ function encodeStdinEnv(text: string): string {
144
+ return Buffer.from(text, 'utf8').toString('base64');
145
+ }
146
+
147
+ function decodeStdinEnv(value: string): string {
148
+ return Buffer.from(value, 'base64').toString('utf8');
149
+ }
150
+
151
+ function resolveProviderOverride(options: ProviderOverrideOptions = {}): string | null {
152
+ const override = options.provider || options.envProvider || process.env.ZEROSHOT_PROVIDER;
153
+ if (!override || !override.trim()) {
154
+ return null;
155
+ }
156
+ const normalized = normalizeProviderName(override);
157
+ if (options.validateProvider) {
158
+ getProvider(normalized);
159
+ }
160
+ return normalized;
161
+ }
162
+
163
+ function resolveConfigOrThrow({
164
+ orchestrator,
165
+ config,
166
+ configPath,
167
+ configName,
168
+ settings,
169
+ providerOverride,
170
+ }: ResolveConfigArgs): ClusterConfig {
171
+ if (config) {
172
+ return config;
173
+ }
174
+ const resolvedPath = configPath || (configName ? resolveConfigPath(configName) : null);
175
+ if (!resolvedPath) {
176
+ throw new Error('configPath or configName is required when config is not provided');
177
+ }
178
+ return loadClusterConfig(orchestrator, resolvedPath, settings, providerOverride);
179
+ }
180
+
181
+ function startClusterWithInput(args: StartClusterArgs, input: ClusterInput): unknown {
182
+ const { orchestrator, config, configPath, configName, settings, providerOverride } = args;
183
+ if (!orchestrator) {
184
+ throw new Error('orchestrator is required');
185
+ }
186
+ const resolvedConfig = resolveConfigOrThrow({
187
+ orchestrator,
188
+ config,
189
+ configPath,
190
+ configName,
191
+ settings,
192
+ providerOverride,
193
+ });
194
+ const startOptions = buildStartOptions({
195
+ clusterId: args.clusterId,
196
+ options: args.options || {},
197
+ settings,
198
+ providerOverride,
199
+ modelOverride: args.modelOverride,
200
+ forceProvider: args.forceProvider,
201
+ });
202
+ return orchestrator.start(resolvedConfig, input, startOptions);
203
+ }
204
+
205
+ function startClusterFromText(args: StartClusterArgs): unknown {
206
+ return startClusterWithInput(args, buildTextInput(args.text));
207
+ }
208
+
209
+ function startClusterFromIssue(args: StartClusterArgs): unknown {
210
+ return startClusterWithInput(args, buildIssueInput(args.issue));
211
+ }
212
+
213
+ function startClusterFromFile(args: StartClusterArgs): unknown {
214
+ return startClusterWithInput(args, buildFileInput(args.file));
215
+ }
216
+
217
+ export = {
218
+ buildTextInput,
219
+ buildIssueInput,
220
+ buildFileInput,
221
+ detectRunInput,
222
+ isStdinInput,
223
+ readStdinText,
224
+ encodeStdinEnv,
225
+ decodeStdinEnv,
226
+ resolveProviderOverride,
227
+ resolveConfigPath,
228
+ prepareClusterConfig,
229
+ loadClusterConfig,
230
+ buildStartOptions,
231
+ buildTrustedStartOptions,
232
+ resolveEffectiveRunPlan,
233
+ startClusterFromText,
234
+ startClusterFromIssue,
235
+ startClusterFromFile,
236
+ detectGitRepoRoot,
237
+ };
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Provider-agnostic stream-json parser for `zeroshot logs`.
3
+ *
4
+ * Provider parsing is delegated to the helper-backed runtime provider facade.
5
+ */
6
+
7
+ type ParsedEvent = Readonly<Record<string, unknown>>;
8
+ type ProviderEvent = ParsedEvent | ParsedEvent[] | null;
9
+
10
+ interface ProviderParser {
11
+ parseEvent(line: string): ProviderEvent;
12
+ }
13
+
14
+ interface ProviderFacade {
15
+ getProvider(name: string): ProviderParser;
16
+ listProviders(): string[];
17
+ }
18
+
19
+ // The runtime facade is maintained JavaScript; keep its original emitted require path.
20
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
21
+ const { getProvider, listProviders }: ProviderFacade = require('../src/providers');
22
+
23
+ function createProviderParsers(): ProviderParser[] {
24
+ return listProviders().map((name) => getProvider(name));
25
+ }
26
+
27
+ function stripTimestampPrefix(line: unknown): string {
28
+ if (!line || typeof line !== 'string') return '';
29
+ let trimmed = line.trim().replace(/\r$/, '');
30
+ if (!trimmed) return '';
31
+
32
+ const tsMatch = /^\[(\d{13})\](.*)$/.exec(trimmed);
33
+ if (tsMatch) trimmed = (tsMatch[2] || '').trimStart();
34
+
35
+ if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {
36
+ const pipeMatch = /^[^|]{1,40}\|\s*(.*)$/.exec(trimmed);
37
+ if (pipeMatch) {
38
+ const afterPipe = (pipeMatch[1] || '').trimStart();
39
+ if (afterPipe.startsWith('{') || afterPipe.startsWith('[')) return afterPipe;
40
+ }
41
+ }
42
+
43
+ return trimmed;
44
+ }
45
+
46
+ // The provider protocol intentionally permits one event, an event batch, or no event.
47
+ // eslint-disable-next-line sonarjs/function-return-type
48
+ function parseEvent(
49
+ line: unknown,
50
+ providerParsers: readonly ProviderParser[] = createProviderParsers()
51
+ ): ProviderEvent {
52
+ const content = stripTimestampPrefix(line);
53
+ let result: ProviderEvent = null;
54
+ if (content) {
55
+ for (const provider of providerParsers) {
56
+ const event = provider.parseEvent(content);
57
+ if (event) {
58
+ result = event;
59
+ break;
60
+ }
61
+ }
62
+ }
63
+ return result;
64
+ }
65
+
66
+ function collectEvent(events: ParsedEvent[], event: ProviderEvent): void {
67
+ if (!event) return;
68
+ if (Array.isArray(event)) {
69
+ events.push(...event);
70
+ return;
71
+ }
72
+ events.push(event);
73
+ }
74
+
75
+ function parseChunk(chunk: unknown): ParsedEvent[] {
76
+ const events: ParsedEvent[] = [];
77
+ const lines = String(chunk || '').split('\n');
78
+ const providerParsers = createProviderParsers();
79
+
80
+ for (const line of lines) {
81
+ if (!line.trim()) continue;
82
+ collectEvent(events, parseEvent(line, providerParsers));
83
+ }
84
+
85
+ return events;
86
+ }
87
+
88
+ export = { parseEvent, parseChunk };