@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
@@ -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
  };