@the-open-engine/zeroshot 6.38.0 → 6.39.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 (381) hide show
  1. package/cli/event-copy.js +8 -7
  2. package/cli/event-copy.ts +12 -0
  3. package/cli/index.js +7 -31
  4. package/cli/json-export.js +61 -64
  5. package/cli/json-export.ts +112 -0
  6. package/cli/message-formatter-utils.js +68 -56
  7. package/cli/message-formatter-utils.ts +121 -0
  8. package/cli/message-formatters-normal.js +124 -259
  9. package/cli/message-formatters-normal.ts +250 -0
  10. package/cli/message-formatters-watch.js +81 -84
  11. package/cli/message-formatters-watch.ts +189 -0
  12. package/lib/agent-cli-provider/adapters/codex.d.ts.map +1 -1
  13. package/lib/agent-cli-provider/adapters/codex.js +3 -1
  14. package/lib/agent-cli-provider/adapters/codex.js.map +1 -1
  15. package/lib/cluster/generated/protocol-schema.cjs +1 -1
  16. package/lib/cluster/generated/protocol-schema.mjs +1 -1
  17. package/lib/cluster/generated/protocol.d.cts +8 -0
  18. package/lib/cluster/generated/protocol.d.mts +8 -0
  19. package/lib/cluster/generated/protocol.d.ts +8 -0
  20. package/lib/clusters-registry.d.ts +23 -0
  21. package/lib/clusters-registry.js +17 -29
  22. package/lib/completion.d.ts +12 -0
  23. package/lib/completion.js +84 -94
  24. package/lib/compose-utils.d.ts +32 -0
  25. package/lib/compose-utils.js +57 -72
  26. package/lib/detached-startup.d.ts +83 -0
  27. package/lib/detached-startup.js +231 -302
  28. package/lib/docker-config.d.ts +43 -0
  29. package/lib/docker-config.js +150 -325
  30. package/lib/docker-env-auth.d.ts +17 -0
  31. package/lib/docker-env-auth.js +75 -0
  32. package/lib/git-remote-utils.d.ts +48 -0
  33. package/lib/git-remote-utils.js +147 -213
  34. package/lib/id-detector.d.ts +15 -0
  35. package/lib/id-detector.js +37 -41
  36. package/lib/path-check.d.ts +30 -0
  37. package/lib/path-check.js +42 -45
  38. package/lib/process-liveness.d.ts +16 -0
  39. package/lib/process-liveness.js +19 -12
  40. package/lib/provider-credential-path.d.ts +16 -0
  41. package/lib/provider-credential-path.js +31 -29
  42. package/lib/provider-defaults.d.ts +30 -0
  43. package/lib/provider-defaults.js +47 -42
  44. package/lib/provider-detection.d.ts +11 -0
  45. package/lib/provider-detection.js +91 -54
  46. package/lib/provider-names.d.ts +38 -0
  47. package/lib/provider-names.js +56 -64
  48. package/lib/repo-settings.d.ts +28 -0
  49. package/lib/repo-settings.js +83 -59
  50. package/lib/run-mode.d.ts +21 -0
  51. package/lib/run-mode.js +21 -20
  52. package/lib/run-plan.d.ts +28 -0
  53. package/lib/run-plan.js +17 -16
  54. package/lib/settings/claude-auth.d.ts +35 -0
  55. package/lib/settings/claude-auth.js +30 -47
  56. package/lib/settings-defaults.d.ts +20 -0
  57. package/lib/settings-defaults.js +149 -0
  58. package/lib/settings-error.d.ts +7 -0
  59. package/lib/settings-error.js +8 -0
  60. package/lib/settings-issue-providers.d.ts +10 -0
  61. package/lib/settings-issue-providers.js +12 -0
  62. package/lib/settings-models.d.ts +22 -0
  63. package/lib/settings-models.js +93 -0
  64. package/lib/settings-storage.d.ts +23 -0
  65. package/lib/settings-storage.js +205 -0
  66. package/lib/settings-validation.d.ts +7 -0
  67. package/lib/settings-validation.js +182 -0
  68. package/lib/settings.d.ts +29 -0
  69. package/lib/settings.js +41 -736
  70. package/lib/setup-apply-types.d.ts +66 -0
  71. package/lib/setup-apply-types.js +2 -0
  72. package/lib/setup-apply.d.ts +39 -0
  73. package/lib/setup-apply.js +267 -264
  74. package/lib/setup-journal.d.ts +41 -0
  75. package/lib/setup-journal.js +119 -76
  76. package/lib/setup-plan-types.d.ts +102 -0
  77. package/lib/setup-plan-types.js +2 -0
  78. package/lib/setup-plan.d.ts +30 -0
  79. package/lib/setup-plan.js +300 -324
  80. package/lib/setup-undo.d.ts +44 -0
  81. package/lib/setup-undo.js +61 -74
  82. package/lib/start-cluster-config.d.ts +26 -0
  83. package/lib/start-cluster-config.js +56 -0
  84. package/lib/start-cluster-environment.d.ts +40 -0
  85. package/lib/start-cluster-environment.js +134 -0
  86. package/lib/start-cluster-run-options.d.ts +53 -0
  87. package/lib/start-cluster-run-options.js +147 -0
  88. package/lib/start-cluster.d.ts +64 -0
  89. package/lib/start-cluster.js +98 -454
  90. package/lib/stream-json-parser.d.ts +17 -0
  91. package/lib/stream-json-parser.js +51 -52
  92. package/npm-shrinkwrap.json +2 -2
  93. package/package.json +12 -6
  94. package/scripts/postinstall.js +27 -0
  95. package/scripts/rust-distribution.js +23 -14
  96. package/src/agent/agent-command-proofs-context.js +35 -45
  97. package/src/agent/agent-command-proofs-context.ts +87 -0
  98. package/src/agent/agent-config-settings.js +19 -0
  99. package/src/agent/agent-config-settings.ts +41 -0
  100. package/src/agent/agent-config.js +122 -231
  101. package/src/agent/agent-config.ts +285 -0
  102. package/src/agent/agent-context-builder.js +38 -273
  103. package/src/agent/agent-context-builder.ts +51 -0
  104. package/src/agent/agent-context-environment-sections.js +105 -0
  105. package/src/agent/agent-context-environment-sections.ts +134 -0
  106. package/src/agent/agent-context-packs.js +165 -0
  107. package/src/agent/agent-context-packs.ts +296 -0
  108. package/src/agent/agent-context-prompt-sections.js +100 -0
  109. package/src/agent/agent-context-prompt-sections.ts +148 -0
  110. package/src/agent/agent-context-sections.js +25 -334
  111. package/src/agent/agent-context-sections.ts +36 -0
  112. package/src/agent/agent-context-sources.js +96 -149
  113. package/src/agent/agent-context-sources.ts +253 -0
  114. package/src/agent/agent-context-types.js +2 -0
  115. package/src/agent/agent-context-types.ts +132 -0
  116. package/src/agent/agent-context-validation-sections.js +73 -0
  117. package/src/agent/agent-context-validation-sections.ts +129 -0
  118. package/src/agent/agent-input-injector.js +99 -118
  119. package/src/agent/agent-input-injector.ts +195 -0
  120. package/src/agent/agent-liveness-poll.js +74 -78
  121. package/src/agent/agent-liveness-poll.ts +163 -0
  122. package/src/agent/agent-quality-gate-schema.js +77 -86
  123. package/src/agent/agent-quality-gate-schema.ts +135 -0
  124. package/src/agent/agent-quality-gates-context.js +44 -50
  125. package/src/agent/agent-quality-gates-context.ts +91 -0
  126. package/src/agent/agent-stuck-detector.js +171 -239
  127. package/src/agent/agent-stuck-detector.ts +288 -0
  128. package/src/agent/agent-trigger-evaluator.js +29 -46
  129. package/src/agent/agent-trigger-evaluator.ts +98 -0
  130. package/src/agent/context-metrics.js +110 -141
  131. package/src/agent/context-metrics.ts +261 -0
  132. package/src/agent/context-pack-builder.js +72 -358
  133. package/src/agent/context-pack-builder.ts +105 -0
  134. package/src/agent/context-pack-core.js +70 -0
  135. package/src/agent/context-pack-core.ts +96 -0
  136. package/src/agent/context-pack-selection.js +119 -0
  137. package/src/agent/context-pack-selection.ts +187 -0
  138. package/src/agent/context-pack-truncation.js +139 -0
  139. package/src/agent/context-pack-truncation.ts +208 -0
  140. package/src/agent/context-pack-types.js +2 -0
  141. package/src/agent/context-pack-types.ts +98 -0
  142. package/src/agent/context-replay-policy.js +30 -39
  143. package/src/agent/context-replay-policy.ts +71 -0
  144. package/src/agent/critical-agent-policy.js +6 -10
  145. package/src/agent/critical-agent-policy.ts +20 -0
  146. package/src/agent/guidance-queue.js +74 -87
  147. package/src/agent/guidance-queue.ts +166 -0
  148. package/src/agent/output-extraction-error-detail.js +45 -0
  149. package/src/agent/output-extraction-error-detail.ts +49 -0
  150. package/src/agent/output-extraction-failures.js +125 -0
  151. package/src/agent/output-extraction-failures.ts +149 -0
  152. package/src/agent/output-extraction-json.js +234 -0
  153. package/src/agent/output-extraction-json.ts +235 -0
  154. package/src/agent/output-extraction-pi.js +124 -0
  155. package/src/agent/output-extraction-pi.ts +137 -0
  156. package/src/agent/output-extraction-types.js +2 -0
  157. package/src/agent/output-extraction-types.ts +49 -0
  158. package/src/agent/output-extraction.js +17 -617
  159. package/src/agent/output-extraction.ts +30 -0
  160. package/src/agent/output-reformatter-errors.js +83 -0
  161. package/src/agent/output-reformatter-errors.ts +106 -0
  162. package/src/agent/output-reformatter-types.js +2 -0
  163. package/src/agent/output-reformatter-types.ts +86 -0
  164. package/src/agent/output-reformatter.js +140 -185
  165. package/src/agent/output-reformatter.ts +238 -0
  166. package/src/agent/pi-terminal-lifecycle-types.js +2 -0
  167. package/src/agent/pi-terminal-lifecycle-types.ts +41 -0
  168. package/src/agent/pi-terminal-lifecycle.js +186 -206
  169. package/src/agent/pi-terminal-lifecycle.ts +297 -0
  170. package/src/agent/provider-control-plane.js +22 -21
  171. package/src/agent/provider-control-plane.ts +52 -0
  172. package/src/agent/provider-terminal-failure-types.js +2 -0
  173. package/src/agent/provider-terminal-failure-types.ts +60 -0
  174. package/src/agent/provider-terminal-failure.js +194 -191
  175. package/src/agent/provider-terminal-failure.ts +262 -0
  176. package/src/agent/rate-limit-backoff.js +31 -74
  177. package/src/agent/rate-limit-backoff.ts +71 -0
  178. package/src/agent/schema-utils.js +85 -125
  179. package/src/agent/schema-utils.ts +148 -0
  180. package/src/agent/structured-output-error.js +34 -33
  181. package/src/agent/structured-output-error.ts +105 -0
  182. package/src/agent/validation-platform.js +27 -27
  183. package/src/agent/validation-platform.ts +49 -0
  184. package/src/agent-cli-provider/adapters/codex.ts +3 -1
  185. package/src/attach/attach-client.js +232 -405
  186. package/src/attach/attach-client.ts +300 -0
  187. package/src/attach/attach-server-cleanup.js +43 -0
  188. package/src/attach/attach-server-cleanup.ts +39 -0
  189. package/src/attach/attach-server-clients.js +117 -0
  190. package/src/attach/attach-server-clients.ts +122 -0
  191. package/src/attach/attach-server-events.js +38 -0
  192. package/src/attach/attach-server-events.ts +36 -0
  193. package/src/attach/attach-server-pty.js +45 -0
  194. package/src/attach/attach-server-pty.ts +64 -0
  195. package/src/attach/attach-server-runtime.js +73 -0
  196. package/src/attach/attach-server-runtime.ts +62 -0
  197. package/src/attach/attach-server-socket.js +28 -0
  198. package/src/attach/attach-server-socket.ts +23 -0
  199. package/src/attach/attach-server-types.js +2 -0
  200. package/src/attach/attach-server-types.ts +82 -0
  201. package/src/attach/attach-server.js +106 -523
  202. package/src/attach/attach-server.ts +158 -0
  203. package/src/attach/index.js +18 -35
  204. package/src/attach/index.ts +18 -0
  205. package/src/attach/protocol.js +95 -184
  206. package/src/attach/protocol.ts +181 -0
  207. package/src/attach/ring-buffer.js +76 -102
  208. package/src/attach/ring-buffer.ts +109 -0
  209. package/src/attach/send-input.js +64 -75
  210. package/src/attach/send-input.ts +94 -0
  211. package/src/attach/socket-discovery.js +164 -218
  212. package/src/attach/socket-discovery.ts +230 -0
  213. package/src/attach/socket-paths.js +42 -61
  214. package/src/attach/socket-paths.ts +81 -0
  215. package/src/claude-credentials.js +51 -54
  216. package/src/claude-credentials.ts +89 -0
  217. package/src/cluster/generated/protocol-schema.ts +1 -1
  218. package/src/cluster/generated/protocol.ts +2 -1
  219. package/src/command-proofs.js +110 -141
  220. package/src/command-proofs.ts +216 -0
  221. package/src/config-router.js +81 -73
  222. package/src/config-router.ts +131 -0
  223. package/src/copy-worker.js +53 -29
  224. package/src/copy-worker.ts +75 -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/ledger-sequence.js +45 -48
  232. package/src/ledger-sequence.ts +63 -0
  233. package/src/legacy-lib/clusters-registry.ts +40 -0
  234. package/src/legacy-lib/completion.ts +148 -0
  235. package/src/legacy-lib/compose-utils.ts +102 -0
  236. package/src/legacy-lib/detached-startup.ts +449 -0
  237. package/src/legacy-lib/docker-config.ts +282 -0
  238. package/src/legacy-lib/docker-env-auth.ts +116 -0
  239. package/src/legacy-lib/git-remote-utils.ts +244 -0
  240. package/src/legacy-lib/id-detector.ts +57 -0
  241. package/src/legacy-lib/js-yaml.d.ts +3 -0
  242. package/src/legacy-lib/omelette.d.ts +15 -0
  243. package/src/legacy-lib/path-check.ts +89 -0
  244. package/src/legacy-lib/process-liveness.ts +36 -0
  245. package/src/legacy-lib/provider-credential-path.ts +57 -0
  246. package/src/legacy-lib/provider-defaults.ts +114 -0
  247. package/src/legacy-lib/provider-detection.ts +67 -0
  248. package/src/legacy-lib/provider-names.ts +126 -0
  249. package/src/legacy-lib/repo-settings.ts +88 -0
  250. package/src/legacy-lib/run-mode.ts +58 -0
  251. package/src/legacy-lib/run-plan.ts +49 -0
  252. package/src/legacy-lib/settings/claude-auth.ts +80 -0
  253. package/src/legacy-lib/settings-defaults.ts +212 -0
  254. package/src/legacy-lib/settings-error.ts +8 -0
  255. package/src/legacy-lib/settings-issue-providers.ts +18 -0
  256. package/src/legacy-lib/settings-models.ts +124 -0
  257. package/src/legacy-lib/settings-storage.ts +277 -0
  258. package/src/legacy-lib/settings-validation.ts +220 -0
  259. package/src/legacy-lib/settings.ts +87 -0
  260. package/src/legacy-lib/setup-apply-types.ts +70 -0
  261. package/src/legacy-lib/setup-apply.ts +456 -0
  262. package/src/legacy-lib/setup-journal.ts +185 -0
  263. package/src/legacy-lib/setup-plan-types.ts +96 -0
  264. package/src/legacy-lib/setup-plan.ts +500 -0
  265. package/src/legacy-lib/setup-undo.ts +142 -0
  266. package/src/legacy-lib/start-cluster-config.ts +124 -0
  267. package/src/legacy-lib/start-cluster-environment.ts +165 -0
  268. package/src/legacy-lib/start-cluster-run-options.ts +279 -0
  269. package/src/legacy-lib/start-cluster.ts +237 -0
  270. package/src/legacy-lib/stream-json-parser.ts +88 -0
  271. package/src/message-buffer.js +55 -71
  272. package/src/message-buffer.ts +107 -0
  273. package/src/message-bus-bridge.js +92 -133
  274. package/src/message-bus-bridge.ts +149 -0
  275. package/src/name-generator-shared.js +220 -0
  276. package/src/name-generator-shared.ts +231 -0
  277. package/src/name-generator.js +8 -217
  278. package/src/name-generator.ts +27 -0
  279. package/src/omp-blob-root.js +83 -64
  280. package/src/omp-blob-root.ts +116 -0
  281. package/src/omp-config-overlay.js +65 -38
  282. package/src/omp-config-overlay.ts +110 -0
  283. package/src/omp-execution-fingerprint.js +38 -43
  284. package/src/omp-execution-fingerprint.ts +92 -0
  285. package/src/omp-session-limits.js +10 -15
  286. package/src/omp-session-limits.ts +53 -0
  287. package/src/omp-session-partition.js +2 -2
  288. package/src/omp-session-verifier.js +1 -1
  289. package/src/orchestrator.js +19 -4
  290. package/src/providers/anthropic/index.js +3 -1
  291. package/src/providers/anthropic/index.ts +13 -0
  292. package/src/providers/capabilities.js +19 -27
  293. package/src/providers/capabilities.ts +44 -0
  294. package/src/providers/google/index.js +3 -1
  295. package/src/providers/google/index.ts +13 -0
  296. package/src/providers/openai/index.js +3 -1
  297. package/src/providers/openai/index.ts +13 -0
  298. package/src/providers/opencode/index.js +3 -1
  299. package/src/providers/opencode/index.ts +13 -0
  300. package/src/quality-gates.js +67 -127
  301. package/src/quality-gates.ts +149 -0
  302. package/src/repo-settings-access.js +40 -0
  303. package/src/repo-settings-access.ts +64 -0
  304. package/src/schemas/sub-cluster.js +127 -183
  305. package/src/schemas/sub-cluster.ts +238 -0
  306. package/src/state-snapshot-normalization.js +224 -0
  307. package/src/state-snapshot-normalization.ts +222 -0
  308. package/src/state-snapshot.js +192 -359
  309. package/src/state-snapshot.ts +291 -0
  310. package/src/state-snapshotter.js +118 -130
  311. package/src/state-snapshotter.ts +167 -0
  312. package/src/sub-cluster-wrapper.js +4 -13
  313. package/src/task-run-model-args.js +87 -124
  314. package/src/task-run-model-args.ts +204 -0
  315. package/src/task-runner.js +5 -25
  316. package/src/task-runner.ts +28 -0
  317. package/src/task-startup-error.js +73 -58
  318. package/src/task-startup-error.ts +126 -0
  319. package/src/template-validation/consensus-gate-contracts.js +2 -0
  320. package/src/template-validation/consensus-gate-contracts.ts +70 -0
  321. package/src/template-validation/consensus-gate-scenarios.js +76 -0
  322. package/src/template-validation/consensus-gate-scenarios.ts +130 -0
  323. package/src/template-validation/consensus-gate-stage.js +34 -0
  324. package/src/template-validation/consensus-gate-stage.ts +56 -0
  325. package/src/template-validation/random-topology-contracts.js +2 -0
  326. package/src/template-validation/random-topology-contracts.ts +54 -0
  327. package/src/template-validation/random-topology-dispatch.js +25 -0
  328. package/src/template-validation/random-topology-dispatch.ts +33 -0
  329. package/src/template-validation/random-topology-message-loop.js +53 -0
  330. package/src/template-validation/random-topology-message-loop.ts +73 -0
  331. package/src/template-validation/random-topology-operations.js +79 -0
  332. package/src/template-validation/random-topology-operations.ts +101 -0
  333. package/src/template-validation/random-topology-runtime.js +25 -0
  334. package/src/template-validation/random-topology-runtime.ts +43 -0
  335. package/src/template-validation/random-topology-scenario.js +52 -0
  336. package/src/template-validation/random-topology-scenario.ts +57 -0
  337. package/src/template-validation/random-topology-schema.js +159 -0
  338. package/src/template-validation/random-topology-schema.ts +190 -0
  339. package/src/template-validation/random-topology-state.js +28 -0
  340. package/src/template-validation/random-topology-state.ts +30 -0
  341. package/src/template-validation/random-topology-trigger-evaluation.js +45 -0
  342. package/src/template-validation/random-topology-trigger-evaluation.ts +65 -0
  343. package/src/template-validation/random-topology-trigger.js +75 -0
  344. package/src/template-validation/random-topology-trigger.ts +88 -0
  345. package/src/template-validation/report-formatter.js +40 -46
  346. package/src/template-validation/report-formatter.ts +101 -0
  347. package/src/template-validation/simulate-consensus-gates.js +111 -302
  348. package/src/template-validation/simulate-consensus-gates.ts +196 -0
  349. package/src/template-validation/simulate-random-topology.js +26 -519
  350. package/src/template-validation/simulate-random-topology.ts +57 -0
  351. package/src/template-validation/simulate-two-stage-validation.js +41 -265
  352. package/src/template-validation/simulate-two-stage-validation.ts +55 -0
  353. package/src/template-validation/simulation-agent-runtime.js +25 -0
  354. package/src/template-validation/simulation-agent-runtime.ts +40 -0
  355. package/src/template-validation/simulation-agent.js +29 -0
  356. package/src/template-validation/simulation-agent.ts +73 -0
  357. package/src/template-validation/simulation-runtime.js +34 -0
  358. package/src/template-validation/simulation-runtime.ts +72 -0
  359. package/src/template-validation/two-stage-contracts.js +2 -0
  360. package/src/template-validation/two-stage-contracts.ts +41 -0
  361. package/src/template-validation/two-stage-inputs.js +21 -0
  362. package/src/template-validation/two-stage-inputs.ts +29 -0
  363. package/src/template-validation/two-stage-results.js +30 -0
  364. package/src/template-validation/two-stage-results.ts +40 -0
  365. package/src/template-validation/two-stage-scenario.js +86 -0
  366. package/src/template-validation/two-stage-scenario.ts +120 -0
  367. package/src/worktree-claude-config.js +182 -220
  368. package/src/worktree-claude-config.ts +272 -0
  369. package/src/worktree-tooling-env.js +103 -125
  370. package/src/worktree-tooling-env.ts +142 -0
  371. package/task-lib/completion.js +2 -3
  372. package/task-lib/completion.ts +9 -0
  373. package/task-lib/config.js +1 -4
  374. package/task-lib/config.ts +11 -0
  375. package/task-lib/name-generator.js +4 -226
  376. package/task-lib/name-generator.ts +11 -0
  377. package/task-lib/omp-session-cleanup.js +1 -1
  378. package/task-lib/omp-storage-root.js +8 -12
  379. package/task-lib/omp-storage-root.ts +62 -0
  380. package/task-lib/process-termination.js +143 -166
  381. package/task-lib/process-termination.ts +268 -0
@@ -1,55 +1,49 @@
1
- const path = require('node:path');
2
-
3
- function formatEntry({ relativePath, result, changedFiles, lines, suppressed }) {
4
- if (!result.valid) {
5
- lines.push(`\n❌ ${relativePath}`);
6
- for (const error of result.errors) {
7
- lines.push(` ERROR: ${error}`);
1
+ "use strict";
2
+ const path = require("node:path");
3
+ function formatEntry({ relativePath, result, changedFiles, lines, suppressed, }) {
4
+ if (!result.valid) {
5
+ lines.push(`\n❌ ${relativePath}`);
6
+ for (const error of result.errors) {
7
+ lines.push(` ERROR: ${error}`);
8
+ }
9
+ return true;
8
10
  }
9
- return true;
10
- }
11
-
12
- if (result.warnings.length > 0) {
13
- if (changedFiles === null || changedFiles.has(relativePath)) {
14
- lines.push(`\n⚠️ ${relativePath}`);
15
- for (const warning of result.warnings) {
16
- lines.push(` WARN: ${warning}`);
17
- }
18
- } else {
19
- suppressed.count += result.warnings.length;
20
- suppressed.fileCount += 1;
11
+ if (result.warnings.length > 0) {
12
+ if (changedFiles === null || changedFiles.has(relativePath)) {
13
+ lines.push(`\n⚠️ ${relativePath}`);
14
+ for (const warning of result.warnings) {
15
+ lines.push(` WARN: ${warning}`);
16
+ }
17
+ }
18
+ else {
19
+ suppressed.count += result.warnings.length;
20
+ suppressed.fileCount += 1;
21
+ }
22
+ return false;
21
23
  }
24
+ lines.push(`✓ ${relativePath}`);
22
25
  return false;
23
- }
24
-
25
- lines.push(`✓ ${relativePath}`);
26
- return false;
27
26
  }
28
-
29
27
  function formatValidationReport(report, { changedFiles = null, cwd = process.cwd() } = {}) {
30
- const lines = [];
31
- const suppressed = { count: 0, fileCount: 0 };
32
- let hasErrors = false;
33
-
34
- for (const { filePath, result } of report.results) {
35
- const relativePath = path.relative(cwd, filePath);
36
- if (formatEntry({ relativePath, result, changedFiles, lines, suppressed })) {
37
- hasErrors = true;
28
+ const lines = [];
29
+ const suppressed = { count: 0, fileCount: 0 };
30
+ let hasErrors = false;
31
+ for (const { filePath, result } of report.results) {
32
+ const relativePath = path.relative(cwd, filePath);
33
+ if (formatEntry({ relativePath, result, changedFiles, lines, suppressed })) {
34
+ hasErrors = true;
35
+ }
38
36
  }
39
- }
40
-
41
- if (suppressed.count > 0) {
42
- lines.push(
43
- `\n${suppressed.count} pre-existing warning(s) across ${suppressed.fileCount} unrelated template(s) — run \`npm run validate:templates\` for detail`
44
- );
45
- }
46
-
47
- lines.push(`\n${'='.repeat(60)}`);
48
- lines.push(`Validated: ${report.validated} templates, Skipped: ${report.skipped} files`);
49
-
50
- return { lines, hasErrors };
37
+ if (suppressed.count > 0) {
38
+ const summary = `\n${suppressed.count} pre-existing warning(s) across ` +
39
+ `${suppressed.fileCount} unrelated template(s) — ` +
40
+ 'run `npm run validate:templates` for detail';
41
+ lines.push(summary);
42
+ }
43
+ lines.push(`\n${'='.repeat(60)}`);
44
+ lines.push(`Validated: ${report.validated} templates, Skipped: ${report.skipped} files`);
45
+ return { lines, hasErrors };
51
46
  }
52
-
53
47
  module.exports = {
54
- formatValidationReport,
48
+ formatValidationReport,
55
49
  };
@@ -0,0 +1,101 @@
1
+ import path = require('node:path');
2
+
3
+ interface ValidationResult {
4
+ valid: boolean;
5
+ errors: string[];
6
+ warnings: string[];
7
+ }
8
+
9
+ interface ValidationReport {
10
+ results: Array<{ filePath: string; result: ValidationResult }>;
11
+ validated: number;
12
+ skipped: number;
13
+ }
14
+
15
+ interface ReportOptions {
16
+ changedFiles?: Set<string> | null;
17
+ cwd?: string;
18
+ }
19
+
20
+ interface SuppressedWarnings {
21
+ count: number;
22
+ fileCount: number;
23
+ }
24
+
25
+ interface FormatEntryOptions {
26
+ relativePath: string;
27
+ result: ValidationResult;
28
+ changedFiles: Set<string> | null;
29
+ lines: string[];
30
+ suppressed: SuppressedWarnings;
31
+ }
32
+
33
+ interface FormattedValidationReport {
34
+ lines: string[];
35
+ hasErrors: boolean;
36
+ }
37
+
38
+ function formatEntry({
39
+ relativePath,
40
+ result,
41
+ changedFiles,
42
+ lines,
43
+ suppressed,
44
+ }: FormatEntryOptions): boolean {
45
+ if (!result.valid) {
46
+ lines.push(`\n❌ ${relativePath}`);
47
+ for (const error of result.errors) {
48
+ lines.push(` ERROR: ${error}`);
49
+ }
50
+ return true;
51
+ }
52
+
53
+ if (result.warnings.length > 0) {
54
+ if (changedFiles === null || changedFiles.has(relativePath)) {
55
+ lines.push(`\n⚠️ ${relativePath}`);
56
+ for (const warning of result.warnings) {
57
+ lines.push(` WARN: ${warning}`);
58
+ }
59
+ } else {
60
+ suppressed.count += result.warnings.length;
61
+ suppressed.fileCount += 1;
62
+ }
63
+ return false;
64
+ }
65
+
66
+ lines.push(`✓ ${relativePath}`);
67
+ return false;
68
+ }
69
+
70
+ function formatValidationReport(
71
+ report: ValidationReport,
72
+ { changedFiles = null, cwd = process.cwd() }: ReportOptions = {}
73
+ ): FormattedValidationReport {
74
+ const lines: string[] = [];
75
+ const suppressed = { count: 0, fileCount: 0 };
76
+ let hasErrors = false;
77
+
78
+ for (const { filePath, result } of report.results) {
79
+ const relativePath = path.relative(cwd, filePath);
80
+ if (formatEntry({ relativePath, result, changedFiles, lines, suppressed })) {
81
+ hasErrors = true;
82
+ }
83
+ }
84
+
85
+ if (suppressed.count > 0) {
86
+ const summary =
87
+ `\n${suppressed.count} pre-existing warning(s) across ` +
88
+ `${suppressed.fileCount} unrelated template(s) — ` +
89
+ 'run `npm run validate:templates` for detail';
90
+ lines.push(summary);
91
+ }
92
+
93
+ lines.push(`\n${'='.repeat(60)}`);
94
+ lines.push(`Validated: ${report.validated} templates, Skipped: ${report.skipped} files`);
95
+
96
+ return { lines, hasErrors };
97
+ }
98
+
99
+ export = {
100
+ formatValidationReport,
101
+ };
@@ -1,324 +1,133 @@
1
- const Ledger = require('../ledger');
2
- const MessageBus = require('../message-bus');
3
- const LogicEngine = require('../logic-engine');
4
-
5
- const STAGE_START_TOPICS = ['IMPLEMENTATION_READY', 'QUICK_VALIDATION_PASSED'];
6
- const EXTERNAL_STAGE_SENDERS = {
7
- IMPLEMENTATION_READY: 'worker',
8
- QUICK_VALIDATION_PASSED: 'consensus-coordinator',
9
- };
10
-
11
- function scriptReferencesTopic(logicScript, topic) {
12
- return logicScript.includes(`topic: '${topic}'`) || logicScript.includes(`topic: "${topic}"`);
13
- }
14
-
15
- function getRequiredStageTopics(logicScript) {
16
- return STAGE_START_TOPICS.filter((topic) => scriptReferencesTopic(logicScript, topic));
17
- }
18
-
19
- function publishStageStartMessages({
20
- messageBus,
21
- clusterId,
22
- producersByTopic,
23
- requiredStageTopics,
24
- allowExternalTopics,
25
- }) {
26
- let timestamp = Date.now();
27
-
28
- for (const topic of requiredStageTopics) {
29
- const producers = Array.from(producersByTopic.get(topic) || []);
30
- const sender =
31
- producers[0] || (allowExternalTopics.includes(topic) ? EXTERNAL_STAGE_SENDERS[topic] : null);
32
- if (!sender) {
33
- continue;
34
- }
35
-
36
- messageBus.publish({
37
- cluster_id: clusterId,
38
- topic,
39
- sender,
40
- timestamp: timestamp++,
41
- });
42
- }
43
- }
44
-
1
+ "use strict";
2
+ const consensus_gate_scenarios_1 = require("./consensus-gate-scenarios");
3
+ const consensus_gate_stage_1 = require("./consensus-gate-stage");
45
4
  function collectTopicProducers(config) {
46
- const producersByTopic = new Map();
47
-
48
- for (const agent of config.agents || []) {
49
- const topic = getPublishedTopic(agent);
50
- if (!topic) continue;
51
- if (!producersByTopic.has(topic)) {
52
- producersByTopic.set(topic, new Set());
5
+ const producersByTopic = new Map();
6
+ for (const agent of config.agents || []) {
7
+ const topic = getPublishedTopic(agent);
8
+ if (!topic)
9
+ continue;
10
+ const producers = producersByTopic.get(topic) || new Set();
11
+ producers.add(agent.id);
12
+ producersByTopic.set(topic, producers);
53
13
  }
54
- producersByTopic.get(topic).add(agent.id);
55
- }
56
-
57
- return producersByTopic;
14
+ return producersByTopic;
58
15
  }
59
-
60
16
  function getPublishedTopic(agent) {
61
- const onComplete = agent?.hooks?.onComplete;
62
- if (!onComplete) return null;
63
- if (onComplete.action !== 'publish_message') return null;
64
- if (!onComplete.config?.topic) return null;
65
- return String(onComplete.config.topic);
66
- }
67
-
68
- function hasConsensusLikeId(agentId) {
69
- return agentId.includes('consensus') || agentId.includes('coordinator');
17
+ const onComplete = agent.hooks?.onComplete;
18
+ if (!onComplete)
19
+ return null;
20
+ if (onComplete.action !== 'publish_message')
21
+ return null;
22
+ if (!onComplete.config?.topic)
23
+ return null;
24
+ return String(onComplete.config.topic);
70
25
  }
71
-
72
- function hasStopClusterTrigger(agent) {
73
- return agent?.triggers?.some((trigger) => trigger.action === 'stop_cluster');
74
- }
75
-
76
26
  function isConsensusLikeAgent(agent) {
77
- const agentId = String(agent?.id || '');
78
- const explicitIds = ['git-pusher', 'completion-detector'];
79
-
80
- return (
81
- agent?.role === 'coordinator' ||
82
- explicitIds.includes(agentId) ||
83
- hasConsensusLikeId(agentId) ||
84
- hasStopClusterTrigger(agent)
85
- );
27
+ const agentId = String(agent.id || '');
28
+ const explicitIds = ['git-pusher', 'completion-detector'];
29
+ const hasConsensusLikeId = agentId.includes('consensus') || agentId.includes('coordinator');
30
+ const hasStopClusterTrigger = agent.triggers?.some((trigger) => trigger.action === 'stop_cluster') === true;
31
+ return (agent.role === 'coordinator' ||
32
+ explicitIds.includes(agentId) ||
33
+ hasConsensusLikeId ||
34
+ hasStopClusterTrigger);
86
35
  }
87
-
88
36
  function getMissingStageTopics(requiredStageTopics, producersByTopic, allowExternalTopics) {
89
- return requiredStageTopics.filter((stageTopic) => {
90
- const producers = producersByTopic.get(stageTopic);
91
- return (!producers || producers.size === 0) && !allowExternalTopics.includes(stageTopic);
92
- });
37
+ return requiredStageTopics.filter((stageTopic) => {
38
+ const producers = producersByTopic.get(stageTopic);
39
+ return (!producers || producers.size === 0) && !allowExternalTopics.includes(stageTopic);
40
+ });
93
41
  }
94
-
95
42
  function createSimulationContext(config, options = {}) {
96
- const agents = Array.isArray(config.agents) ? config.agents : [];
97
-
98
- return {
99
- agents,
100
- producersByTopic: collectTopicProducers(config),
101
- allowExternalTopics: Array.isArray(options.allowExternalTopics)
102
- ? options.allowExternalTopics
103
- : [],
104
- cluster: {
105
- id: 'template-sim',
106
- agents: agents.map((a) => ({
107
- id: a.id,
108
- role: a.role,
109
- requiredQualityGates: a.requiredQualityGates || [],
110
- })),
111
- },
112
- };
43
+ const agents = Array.isArray(config.agents) ? config.agents : [];
44
+ return {
45
+ agents,
46
+ producersByTopic: collectTopicProducers(config),
47
+ allowExternalTopics: Array.isArray(options.allowExternalTopics)
48
+ ? options.allowExternalTopics
49
+ : [],
50
+ cluster: {
51
+ id: 'template-sim',
52
+ agents: agents.map((agent) => ({
53
+ id: agent.id,
54
+ role: agent.role,
55
+ requiredQualityGates: agent.requiredQualityGates || [],
56
+ })),
57
+ },
58
+ };
113
59
  }
114
-
115
- function evaluateScenario({
116
- agentId,
117
- cluster,
118
- topic,
119
- script,
120
- requiredQualityGates,
121
- producers,
122
- producersByTopic,
123
- requiredStageTopics,
124
- allowExternalTopics,
125
- publishMessages,
126
- }) {
127
- const ledger = new Ledger(':memory:');
128
- const messageBus = new MessageBus(ledger);
129
- const logicEngine = new LogicEngine(messageBus, cluster);
130
-
131
- publishStageStartMessages({
132
- messageBus,
133
- clusterId: cluster.id,
134
- producersByTopic,
135
- requiredStageTopics,
136
- allowExternalTopics,
137
- });
138
-
139
- publishMessages(messageBus, producers, cluster.id);
140
-
141
- const result = logicEngine.evaluate(
142
- script,
143
- { id: agentId, cluster_id: cluster.id, requiredQualityGates },
144
- { topic }
145
- );
146
- ledger.close();
147
- return result;
148
- }
149
-
150
- function getPassingQualityGate(requiredGate) {
151
- const scope = requiredGate.scope || 'template-sim';
152
- return {
153
- id: requiredGate.id,
154
- status: 'PASS',
155
- scope,
156
- completedAt: Date.now(),
157
- evidence: {
158
- command: `quality-check --scope ${scope}`,
159
- exitCode: 0,
160
- output: 'template simulation quality pass',
161
- },
162
- };
163
- }
164
-
165
- function getApprovedResultData(context) {
166
- const data = { approved: true };
167
- const requiredQualityGates = Array.isArray(context.requiredQualityGates)
168
- ? context.requiredQualityGates
169
- : [];
170
- if (
171
- context.agentId === 'git-pusher' &&
172
- context.topic === 'VALIDATION_RESULT' &&
173
- requiredQualityGates.length > 0
174
- ) {
175
- data.qualityGates = requiredQualityGates.map(getPassingQualityGate);
176
- }
177
- return data;
178
- }
179
-
180
- function checkDuplicateProducerScenario(context) {
181
- return evaluateScenario({
182
- ...context,
183
- publishMessages(messageBus, producers, clusterId) {
184
- messageBus.publish({
185
- cluster_id: clusterId,
186
- topic: context.topic,
187
- sender: producers[0],
188
- content: { data: getApprovedResultData(context) },
189
- });
190
- messageBus.publish({
191
- cluster_id: clusterId,
192
- topic: context.topic,
193
- sender: producers[0],
194
- content: { data: getApprovedResultData(context) },
195
- });
196
- },
197
- });
198
- }
199
-
200
- function checkDistinctProducerScenario(context) {
201
- return evaluateScenario({
202
- ...context,
203
- publishMessages(messageBus, producers, clusterId) {
204
- for (const producer of producers) {
205
- messageBus.publish({
206
- cluster_id: clusterId,
207
- topic: context.topic,
208
- sender: producer,
209
- content: { data: getApprovedResultData(context) },
210
- });
211
- }
212
- },
213
- });
214
- }
215
-
216
60
  function getMissingStageFailure(agentId, topic, missingStageTopics) {
217
- if (missingStageTopics.length === 0) {
218
- return null;
219
- }
220
-
221
- return (
222
- `Agent "${agentId}" trigger on "${topic}" depends on missing stage topic(s): ${missingStageTopics.join(', ')}. ` +
223
- 'Preflight must validate real producers, not synthesize stage-start messages.'
224
- );
61
+ if (missingStageTopics.length === 0)
62
+ return null;
63
+ return (`Agent "${agentId}" trigger on "${topic}" depends on missing stage topic(s): ${missingStageTopics.join(', ')}. ` +
64
+ 'Preflight must validate real producers, not synthesize stage-start messages.');
65
+ }
66
+ function hasAtLeastTwoProducers(producers) {
67
+ return producers.length >= 2;
225
68
  }
226
-
227
69
  function getConsensusScenarioContext(agent, trigger, simulation) {
228
- const topic = trigger?.topic;
229
- const script = trigger?.logic?.script;
230
- if (!topic || !script) {
231
- return null;
232
- }
233
-
234
- const requiredStageTopics = getRequiredStageTopics(script);
235
- const missingStageTopics = getMissingStageTopics(
236
- requiredStageTopics,
237
- simulation.producersByTopic,
238
- simulation.allowExternalTopics
239
- );
240
- const missingStageFailure = getMissingStageFailure(agent.id, topic, missingStageTopics);
241
- if (missingStageFailure) {
242
- return { failure: missingStageFailure };
243
- }
244
-
245
- const producers = Array.from(simulation.producersByTopic.get(topic) || []);
246
- if (producers.length < 2) {
247
- return { failure: null };
248
- }
249
-
250
- return {
251
- context: {
252
- agentId: agent.id,
253
- cluster: simulation.cluster,
254
- topic,
255
- script,
256
- requiredQualityGates: agent.requiredQualityGates || [],
257
- producers,
258
- producersByTopic: simulation.producersByTopic,
259
- requiredStageTopics,
260
- allowExternalTopics: simulation.allowExternalTopics,
261
- },
262
- failure: null,
263
- };
70
+ const topic = trigger.topic;
71
+ const script = trigger.logic?.script;
72
+ if (!topic || !script)
73
+ return null;
74
+ const requiredStageTopics = (0, consensus_gate_stage_1.getRequiredStageTopics)(script);
75
+ const missingStageFailure = getMissingStageFailure(agent.id, topic, getMissingStageTopics(requiredStageTopics, simulation.producersByTopic, simulation.allowExternalTopics));
76
+ if (missingStageFailure)
77
+ return { failure: missingStageFailure };
78
+ const producers = Array.from(simulation.producersByTopic.get(topic) || []);
79
+ if (!hasAtLeastTwoProducers(producers))
80
+ return { failure: null };
81
+ return {
82
+ context: {
83
+ agentId: agent.id,
84
+ cluster: simulation.cluster,
85
+ topic,
86
+ script,
87
+ requiredQualityGates: agent.requiredQualityGates || [],
88
+ producers,
89
+ producersByTopic: simulation.producersByTopic,
90
+ requiredStageTopics,
91
+ allowExternalTopics: simulation.allowExternalTopics,
92
+ },
93
+ failure: null,
94
+ };
264
95
  }
265
-
266
96
  function validateConsensusTrigger(agent, trigger, simulation) {
267
- const scenario = getConsensusScenarioContext(agent, trigger, simulation);
268
- if (!scenario) {
269
- return [];
270
- }
271
-
272
- if (scenario.failure) {
273
- return [scenario.failure];
274
- }
275
-
276
- if (!scenario.context) {
277
- return [];
278
- }
279
-
280
- const { context } = scenario;
281
- const { producers, topic } = context;
282
-
283
- const failures = [];
284
- if (checkDuplicateProducerScenario(context)) {
285
- failures.push(
286
- `Agent "${agent.id}" trigger on "${topic}" fires early on duplicate sender (${producers[0]}). ` +
287
- `Gate must require distinct producers: ${producers.join(', ')}`
288
- );
289
- }
290
-
291
- if (!checkDistinctProducerScenario(context)) {
292
- failures.push(
293
- `Agent "${agent.id}" trigger on "${topic}" did not fire after all producers published. ` +
294
- `Expected producers: ${producers.join(', ')}`
295
- );
296
- }
297
-
298
- return failures;
97
+ const scenario = getConsensusScenarioContext(agent, trigger, simulation);
98
+ if (!scenario)
99
+ return [];
100
+ if (scenario.failure)
101
+ return [scenario.failure];
102
+ if (!('context' in scenario))
103
+ return [];
104
+ const { context } = scenario;
105
+ const { producers, topic } = context;
106
+ const failures = [];
107
+ if ((0, consensus_gate_scenarios_1.checkDuplicateProducerScenario)(context)) {
108
+ failures.push(`Agent "${agent.id}" trigger on "${topic}" fires early on duplicate sender (${producers[0]}). ` +
109
+ `Gate must require distinct producers: ${producers.join(', ')}`);
110
+ }
111
+ if (!(0, consensus_gate_scenarios_1.checkDistinctProducerScenario)(context)) {
112
+ failures.push(`Agent "${agent.id}" trigger on "${topic}" did not fire after all producers published. ` +
113
+ `Expected producers: ${producers.join(', ')}`);
114
+ }
115
+ return failures;
299
116
  }
300
-
301
- /**
302
- * Micro-sim: consensus-like trigger gates must not fire early due to duplicate publishes
303
- * from the same producer (common in retries / double-publish bugs).
304
- *
305
- * Returns an array of error strings.
306
- */
117
+ /** Validate consensus-like trigger gates against duplicate and distinct producer scenarios. */
307
118
  function simulateConsensusGates(config, options = {}) {
308
- const simulation = createSimulationContext(config, options);
309
- const failures = [];
310
-
311
- for (const agent of simulation.agents) {
312
- if (!isConsensusLikeAgent(agent)) continue;
313
- for (const trigger of agent.triggers || []) {
314
- failures.push(...validateConsensusTrigger(agent, trigger, simulation));
119
+ const simulation = createSimulationContext(config, options);
120
+ const failures = [];
121
+ for (const agent of simulation.agents) {
122
+ if (!isConsensusLikeAgent(agent))
123
+ continue;
124
+ for (const trigger of agent.triggers || []) {
125
+ failures.push(...validateConsensusTrigger(agent, trigger, simulation));
126
+ }
315
127
  }
316
- }
317
-
318
- return failures;
128
+ return failures;
319
129
  }
320
-
321
130
  module.exports = {
322
- collectTopicProducers,
323
- simulateConsensusGates,
131
+ collectTopicProducers,
132
+ simulateConsensusGates,
324
133
  };