@the-open-engine/zeroshot 6.38.1 → 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 (377) 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/cluster/generated/protocol-schema.cjs +1 -1
  13. package/lib/cluster/generated/protocol-schema.mjs +1 -1
  14. package/lib/cluster/generated/protocol.d.cts +8 -0
  15. package/lib/cluster/generated/protocol.d.mts +8 -0
  16. package/lib/cluster/generated/protocol.d.ts +8 -0
  17. package/lib/clusters-registry.d.ts +23 -0
  18. package/lib/clusters-registry.js +17 -29
  19. package/lib/completion.d.ts +12 -0
  20. package/lib/completion.js +84 -94
  21. package/lib/compose-utils.d.ts +32 -0
  22. package/lib/compose-utils.js +57 -72
  23. package/lib/detached-startup.d.ts +83 -0
  24. package/lib/detached-startup.js +231 -302
  25. package/lib/docker-config.d.ts +43 -0
  26. package/lib/docker-config.js +150 -325
  27. package/lib/docker-env-auth.d.ts +17 -0
  28. package/lib/docker-env-auth.js +75 -0
  29. package/lib/git-remote-utils.d.ts +48 -0
  30. package/lib/git-remote-utils.js +147 -213
  31. package/lib/id-detector.d.ts +15 -0
  32. package/lib/id-detector.js +37 -41
  33. package/lib/path-check.d.ts +30 -0
  34. package/lib/path-check.js +42 -45
  35. package/lib/process-liveness.d.ts +16 -0
  36. package/lib/process-liveness.js +19 -12
  37. package/lib/provider-credential-path.d.ts +16 -0
  38. package/lib/provider-credential-path.js +31 -29
  39. package/lib/provider-defaults.d.ts +30 -0
  40. package/lib/provider-defaults.js +47 -42
  41. package/lib/provider-detection.d.ts +11 -0
  42. package/lib/provider-detection.js +91 -54
  43. package/lib/provider-names.d.ts +38 -0
  44. package/lib/provider-names.js +56 -64
  45. package/lib/repo-settings.d.ts +28 -0
  46. package/lib/repo-settings.js +83 -59
  47. package/lib/run-mode.d.ts +21 -0
  48. package/lib/run-mode.js +21 -20
  49. package/lib/run-plan.d.ts +28 -0
  50. package/lib/run-plan.js +17 -16
  51. package/lib/settings/claude-auth.d.ts +35 -0
  52. package/lib/settings/claude-auth.js +30 -47
  53. package/lib/settings-defaults.d.ts +20 -0
  54. package/lib/settings-defaults.js +149 -0
  55. package/lib/settings-error.d.ts +7 -0
  56. package/lib/settings-error.js +8 -0
  57. package/lib/settings-issue-providers.d.ts +10 -0
  58. package/lib/settings-issue-providers.js +12 -0
  59. package/lib/settings-models.d.ts +22 -0
  60. package/lib/settings-models.js +93 -0
  61. package/lib/settings-storage.d.ts +23 -0
  62. package/lib/settings-storage.js +205 -0
  63. package/lib/settings-validation.d.ts +7 -0
  64. package/lib/settings-validation.js +182 -0
  65. package/lib/settings.d.ts +29 -0
  66. package/lib/settings.js +41 -736
  67. package/lib/setup-apply-types.d.ts +66 -0
  68. package/lib/setup-apply-types.js +2 -0
  69. package/lib/setup-apply.d.ts +39 -0
  70. package/lib/setup-apply.js +267 -264
  71. package/lib/setup-journal.d.ts +41 -0
  72. package/lib/setup-journal.js +119 -76
  73. package/lib/setup-plan-types.d.ts +102 -0
  74. package/lib/setup-plan-types.js +2 -0
  75. package/lib/setup-plan.d.ts +30 -0
  76. package/lib/setup-plan.js +300 -324
  77. package/lib/setup-undo.d.ts +44 -0
  78. package/lib/setup-undo.js +61 -74
  79. package/lib/start-cluster-config.d.ts +26 -0
  80. package/lib/start-cluster-config.js +56 -0
  81. package/lib/start-cluster-environment.d.ts +40 -0
  82. package/lib/start-cluster-environment.js +134 -0
  83. package/lib/start-cluster-run-options.d.ts +53 -0
  84. package/lib/start-cluster-run-options.js +147 -0
  85. package/lib/start-cluster.d.ts +64 -0
  86. package/lib/start-cluster.js +98 -454
  87. package/lib/stream-json-parser.d.ts +17 -0
  88. package/lib/stream-json-parser.js +51 -52
  89. package/npm-shrinkwrap.json +2 -2
  90. package/package.json +12 -6
  91. package/scripts/postinstall.js +27 -0
  92. package/scripts/rust-distribution.js +23 -14
  93. package/src/agent/agent-command-proofs-context.js +35 -45
  94. package/src/agent/agent-command-proofs-context.ts +87 -0
  95. package/src/agent/agent-config-settings.js +19 -0
  96. package/src/agent/agent-config-settings.ts +41 -0
  97. package/src/agent/agent-config.js +122 -231
  98. package/src/agent/agent-config.ts +285 -0
  99. package/src/agent/agent-context-builder.js +38 -273
  100. package/src/agent/agent-context-builder.ts +51 -0
  101. package/src/agent/agent-context-environment-sections.js +105 -0
  102. package/src/agent/agent-context-environment-sections.ts +134 -0
  103. package/src/agent/agent-context-packs.js +165 -0
  104. package/src/agent/agent-context-packs.ts +296 -0
  105. package/src/agent/agent-context-prompt-sections.js +100 -0
  106. package/src/agent/agent-context-prompt-sections.ts +148 -0
  107. package/src/agent/agent-context-sections.js +25 -334
  108. package/src/agent/agent-context-sections.ts +36 -0
  109. package/src/agent/agent-context-sources.js +96 -149
  110. package/src/agent/agent-context-sources.ts +253 -0
  111. package/src/agent/agent-context-types.js +2 -0
  112. package/src/agent/agent-context-types.ts +132 -0
  113. package/src/agent/agent-context-validation-sections.js +73 -0
  114. package/src/agent/agent-context-validation-sections.ts +129 -0
  115. package/src/agent/agent-input-injector.js +99 -118
  116. package/src/agent/agent-input-injector.ts +195 -0
  117. package/src/agent/agent-liveness-poll.js +74 -78
  118. package/src/agent/agent-liveness-poll.ts +163 -0
  119. package/src/agent/agent-quality-gate-schema.js +77 -86
  120. package/src/agent/agent-quality-gate-schema.ts +135 -0
  121. package/src/agent/agent-quality-gates-context.js +44 -50
  122. package/src/agent/agent-quality-gates-context.ts +91 -0
  123. package/src/agent/agent-stuck-detector.js +171 -239
  124. package/src/agent/agent-stuck-detector.ts +288 -0
  125. package/src/agent/agent-trigger-evaluator.js +29 -46
  126. package/src/agent/agent-trigger-evaluator.ts +98 -0
  127. package/src/agent/context-metrics.js +110 -141
  128. package/src/agent/context-metrics.ts +261 -0
  129. package/src/agent/context-pack-builder.js +72 -358
  130. package/src/agent/context-pack-builder.ts +105 -0
  131. package/src/agent/context-pack-core.js +70 -0
  132. package/src/agent/context-pack-core.ts +96 -0
  133. package/src/agent/context-pack-selection.js +119 -0
  134. package/src/agent/context-pack-selection.ts +187 -0
  135. package/src/agent/context-pack-truncation.js +139 -0
  136. package/src/agent/context-pack-truncation.ts +208 -0
  137. package/src/agent/context-pack-types.js +2 -0
  138. package/src/agent/context-pack-types.ts +98 -0
  139. package/src/agent/context-replay-policy.js +30 -39
  140. package/src/agent/context-replay-policy.ts +71 -0
  141. package/src/agent/critical-agent-policy.js +6 -10
  142. package/src/agent/critical-agent-policy.ts +20 -0
  143. package/src/agent/guidance-queue.js +74 -87
  144. package/src/agent/guidance-queue.ts +166 -0
  145. package/src/agent/output-extraction-error-detail.js +45 -0
  146. package/src/agent/output-extraction-error-detail.ts +49 -0
  147. package/src/agent/output-extraction-failures.js +125 -0
  148. package/src/agent/output-extraction-failures.ts +149 -0
  149. package/src/agent/output-extraction-json.js +234 -0
  150. package/src/agent/output-extraction-json.ts +235 -0
  151. package/src/agent/output-extraction-pi.js +124 -0
  152. package/src/agent/output-extraction-pi.ts +137 -0
  153. package/src/agent/output-extraction-types.js +2 -0
  154. package/src/agent/output-extraction-types.ts +49 -0
  155. package/src/agent/output-extraction.js +17 -617
  156. package/src/agent/output-extraction.ts +30 -0
  157. package/src/agent/output-reformatter-errors.js +83 -0
  158. package/src/agent/output-reformatter-errors.ts +106 -0
  159. package/src/agent/output-reformatter-types.js +2 -0
  160. package/src/agent/output-reformatter-types.ts +86 -0
  161. package/src/agent/output-reformatter.js +140 -185
  162. package/src/agent/output-reformatter.ts +238 -0
  163. package/src/agent/pi-terminal-lifecycle-types.js +2 -0
  164. package/src/agent/pi-terminal-lifecycle-types.ts +41 -0
  165. package/src/agent/pi-terminal-lifecycle.js +186 -206
  166. package/src/agent/pi-terminal-lifecycle.ts +297 -0
  167. package/src/agent/provider-control-plane.js +22 -21
  168. package/src/agent/provider-control-plane.ts +52 -0
  169. package/src/agent/provider-terminal-failure-types.js +2 -0
  170. package/src/agent/provider-terminal-failure-types.ts +60 -0
  171. package/src/agent/provider-terminal-failure.js +194 -191
  172. package/src/agent/provider-terminal-failure.ts +262 -0
  173. package/src/agent/rate-limit-backoff.js +31 -74
  174. package/src/agent/rate-limit-backoff.ts +71 -0
  175. package/src/agent/schema-utils.js +85 -125
  176. package/src/agent/schema-utils.ts +148 -0
  177. package/src/agent/structured-output-error.js +34 -33
  178. package/src/agent/structured-output-error.ts +105 -0
  179. package/src/agent/validation-platform.js +27 -27
  180. package/src/agent/validation-platform.ts +49 -0
  181. package/src/attach/attach-client.js +232 -405
  182. package/src/attach/attach-client.ts +300 -0
  183. package/src/attach/attach-server-cleanup.js +43 -0
  184. package/src/attach/attach-server-cleanup.ts +39 -0
  185. package/src/attach/attach-server-clients.js +117 -0
  186. package/src/attach/attach-server-clients.ts +122 -0
  187. package/src/attach/attach-server-events.js +38 -0
  188. package/src/attach/attach-server-events.ts +36 -0
  189. package/src/attach/attach-server-pty.js +45 -0
  190. package/src/attach/attach-server-pty.ts +64 -0
  191. package/src/attach/attach-server-runtime.js +73 -0
  192. package/src/attach/attach-server-runtime.ts +62 -0
  193. package/src/attach/attach-server-socket.js +28 -0
  194. package/src/attach/attach-server-socket.ts +23 -0
  195. package/src/attach/attach-server-types.js +2 -0
  196. package/src/attach/attach-server-types.ts +82 -0
  197. package/src/attach/attach-server.js +106 -523
  198. package/src/attach/attach-server.ts +158 -0
  199. package/src/attach/index.js +18 -35
  200. package/src/attach/index.ts +18 -0
  201. package/src/attach/protocol.js +95 -184
  202. package/src/attach/protocol.ts +181 -0
  203. package/src/attach/ring-buffer.js +76 -102
  204. package/src/attach/ring-buffer.ts +109 -0
  205. package/src/attach/send-input.js +64 -75
  206. package/src/attach/send-input.ts +94 -0
  207. package/src/attach/socket-discovery.js +164 -218
  208. package/src/attach/socket-discovery.ts +230 -0
  209. package/src/attach/socket-paths.js +42 -61
  210. package/src/attach/socket-paths.ts +81 -0
  211. package/src/claude-credentials.js +51 -54
  212. package/src/claude-credentials.ts +89 -0
  213. package/src/cluster/generated/protocol-schema.ts +1 -1
  214. package/src/cluster/generated/protocol.ts +2 -1
  215. package/src/command-proofs.js +110 -141
  216. package/src/command-proofs.ts +216 -0
  217. package/src/config-router.js +81 -73
  218. package/src/config-router.ts +131 -0
  219. package/src/copy-worker.js +53 -29
  220. package/src/copy-worker.ts +75 -0
  221. package/src/darwin-keychain-boundary.js +80 -111
  222. package/src/darwin-keychain-boundary.ts +148 -0
  223. package/src/guidance-topics.js +4 -5
  224. package/src/guidance-topics.ts +10 -0
  225. package/src/input-helpers.js +33 -54
  226. package/src/input-helpers.ts +58 -0
  227. package/src/ledger-sequence.js +45 -48
  228. package/src/ledger-sequence.ts +63 -0
  229. package/src/legacy-lib/clusters-registry.ts +40 -0
  230. package/src/legacy-lib/completion.ts +148 -0
  231. package/src/legacy-lib/compose-utils.ts +102 -0
  232. package/src/legacy-lib/detached-startup.ts +449 -0
  233. package/src/legacy-lib/docker-config.ts +282 -0
  234. package/src/legacy-lib/docker-env-auth.ts +116 -0
  235. package/src/legacy-lib/git-remote-utils.ts +244 -0
  236. package/src/legacy-lib/id-detector.ts +57 -0
  237. package/src/legacy-lib/js-yaml.d.ts +3 -0
  238. package/src/legacy-lib/omelette.d.ts +15 -0
  239. package/src/legacy-lib/path-check.ts +89 -0
  240. package/src/legacy-lib/process-liveness.ts +36 -0
  241. package/src/legacy-lib/provider-credential-path.ts +57 -0
  242. package/src/legacy-lib/provider-defaults.ts +114 -0
  243. package/src/legacy-lib/provider-detection.ts +67 -0
  244. package/src/legacy-lib/provider-names.ts +126 -0
  245. package/src/legacy-lib/repo-settings.ts +88 -0
  246. package/src/legacy-lib/run-mode.ts +58 -0
  247. package/src/legacy-lib/run-plan.ts +49 -0
  248. package/src/legacy-lib/settings/claude-auth.ts +80 -0
  249. package/src/legacy-lib/settings-defaults.ts +212 -0
  250. package/src/legacy-lib/settings-error.ts +8 -0
  251. package/src/legacy-lib/settings-issue-providers.ts +18 -0
  252. package/src/legacy-lib/settings-models.ts +124 -0
  253. package/src/legacy-lib/settings-storage.ts +277 -0
  254. package/src/legacy-lib/settings-validation.ts +220 -0
  255. package/src/legacy-lib/settings.ts +87 -0
  256. package/src/legacy-lib/setup-apply-types.ts +70 -0
  257. package/src/legacy-lib/setup-apply.ts +456 -0
  258. package/src/legacy-lib/setup-journal.ts +185 -0
  259. package/src/legacy-lib/setup-plan-types.ts +96 -0
  260. package/src/legacy-lib/setup-plan.ts +500 -0
  261. package/src/legacy-lib/setup-undo.ts +142 -0
  262. package/src/legacy-lib/start-cluster-config.ts +124 -0
  263. package/src/legacy-lib/start-cluster-environment.ts +165 -0
  264. package/src/legacy-lib/start-cluster-run-options.ts +279 -0
  265. package/src/legacy-lib/start-cluster.ts +237 -0
  266. package/src/legacy-lib/stream-json-parser.ts +88 -0
  267. package/src/message-buffer.js +55 -71
  268. package/src/message-buffer.ts +107 -0
  269. package/src/message-bus-bridge.js +92 -133
  270. package/src/message-bus-bridge.ts +149 -0
  271. package/src/name-generator-shared.js +220 -0
  272. package/src/name-generator-shared.ts +231 -0
  273. package/src/name-generator.js +8 -217
  274. package/src/name-generator.ts +27 -0
  275. package/src/omp-blob-root.js +83 -64
  276. package/src/omp-blob-root.ts +116 -0
  277. package/src/omp-config-overlay.js +65 -38
  278. package/src/omp-config-overlay.ts +110 -0
  279. package/src/omp-execution-fingerprint.js +38 -43
  280. package/src/omp-execution-fingerprint.ts +92 -0
  281. package/src/omp-session-limits.js +10 -15
  282. package/src/omp-session-limits.ts +53 -0
  283. package/src/omp-session-partition.js +2 -2
  284. package/src/omp-session-verifier.js +1 -1
  285. package/src/orchestrator.js +19 -4
  286. package/src/providers/anthropic/index.js +3 -1
  287. package/src/providers/anthropic/index.ts +13 -0
  288. package/src/providers/capabilities.js +19 -27
  289. package/src/providers/capabilities.ts +44 -0
  290. package/src/providers/google/index.js +3 -1
  291. package/src/providers/google/index.ts +13 -0
  292. package/src/providers/openai/index.js +3 -1
  293. package/src/providers/openai/index.ts +13 -0
  294. package/src/providers/opencode/index.js +3 -1
  295. package/src/providers/opencode/index.ts +13 -0
  296. package/src/quality-gates.js +67 -127
  297. package/src/quality-gates.ts +149 -0
  298. package/src/repo-settings-access.js +40 -0
  299. package/src/repo-settings-access.ts +64 -0
  300. package/src/schemas/sub-cluster.js +127 -183
  301. package/src/schemas/sub-cluster.ts +238 -0
  302. package/src/state-snapshot-normalization.js +224 -0
  303. package/src/state-snapshot-normalization.ts +222 -0
  304. package/src/state-snapshot.js +192 -359
  305. package/src/state-snapshot.ts +291 -0
  306. package/src/state-snapshotter.js +118 -130
  307. package/src/state-snapshotter.ts +167 -0
  308. package/src/sub-cluster-wrapper.js +4 -13
  309. package/src/task-run-model-args.js +87 -124
  310. package/src/task-run-model-args.ts +204 -0
  311. package/src/task-runner.js +5 -25
  312. package/src/task-runner.ts +28 -0
  313. package/src/task-startup-error.js +73 -58
  314. package/src/task-startup-error.ts +126 -0
  315. package/src/template-validation/consensus-gate-contracts.js +2 -0
  316. package/src/template-validation/consensus-gate-contracts.ts +70 -0
  317. package/src/template-validation/consensus-gate-scenarios.js +76 -0
  318. package/src/template-validation/consensus-gate-scenarios.ts +130 -0
  319. package/src/template-validation/consensus-gate-stage.js +34 -0
  320. package/src/template-validation/consensus-gate-stage.ts +56 -0
  321. package/src/template-validation/random-topology-contracts.js +2 -0
  322. package/src/template-validation/random-topology-contracts.ts +54 -0
  323. package/src/template-validation/random-topology-dispatch.js +25 -0
  324. package/src/template-validation/random-topology-dispatch.ts +33 -0
  325. package/src/template-validation/random-topology-message-loop.js +53 -0
  326. package/src/template-validation/random-topology-message-loop.ts +73 -0
  327. package/src/template-validation/random-topology-operations.js +79 -0
  328. package/src/template-validation/random-topology-operations.ts +101 -0
  329. package/src/template-validation/random-topology-runtime.js +25 -0
  330. package/src/template-validation/random-topology-runtime.ts +43 -0
  331. package/src/template-validation/random-topology-scenario.js +52 -0
  332. package/src/template-validation/random-topology-scenario.ts +57 -0
  333. package/src/template-validation/random-topology-schema.js +159 -0
  334. package/src/template-validation/random-topology-schema.ts +190 -0
  335. package/src/template-validation/random-topology-state.js +28 -0
  336. package/src/template-validation/random-topology-state.ts +30 -0
  337. package/src/template-validation/random-topology-trigger-evaluation.js +45 -0
  338. package/src/template-validation/random-topology-trigger-evaluation.ts +65 -0
  339. package/src/template-validation/random-topology-trigger.js +75 -0
  340. package/src/template-validation/random-topology-trigger.ts +88 -0
  341. package/src/template-validation/report-formatter.js +40 -46
  342. package/src/template-validation/report-formatter.ts +101 -0
  343. package/src/template-validation/simulate-consensus-gates.js +111 -302
  344. package/src/template-validation/simulate-consensus-gates.ts +196 -0
  345. package/src/template-validation/simulate-random-topology.js +26 -519
  346. package/src/template-validation/simulate-random-topology.ts +57 -0
  347. package/src/template-validation/simulate-two-stage-validation.js +41 -265
  348. package/src/template-validation/simulate-two-stage-validation.ts +55 -0
  349. package/src/template-validation/simulation-agent-runtime.js +25 -0
  350. package/src/template-validation/simulation-agent-runtime.ts +40 -0
  351. package/src/template-validation/simulation-agent.js +29 -0
  352. package/src/template-validation/simulation-agent.ts +73 -0
  353. package/src/template-validation/simulation-runtime.js +34 -0
  354. package/src/template-validation/simulation-runtime.ts +72 -0
  355. package/src/template-validation/two-stage-contracts.js +2 -0
  356. package/src/template-validation/two-stage-contracts.ts +41 -0
  357. package/src/template-validation/two-stage-inputs.js +21 -0
  358. package/src/template-validation/two-stage-inputs.ts +29 -0
  359. package/src/template-validation/two-stage-results.js +30 -0
  360. package/src/template-validation/two-stage-results.ts +40 -0
  361. package/src/template-validation/two-stage-scenario.js +86 -0
  362. package/src/template-validation/two-stage-scenario.ts +120 -0
  363. package/src/worktree-claude-config.js +182 -220
  364. package/src/worktree-claude-config.ts +272 -0
  365. package/src/worktree-tooling-env.js +103 -125
  366. package/src/worktree-tooling-env.ts +142 -0
  367. package/task-lib/completion.js +2 -3
  368. package/task-lib/completion.ts +9 -0
  369. package/task-lib/config.js +1 -4
  370. package/task-lib/config.ts +11 -0
  371. package/task-lib/name-generator.js +4 -226
  372. package/task-lib/name-generator.ts +11 -0
  373. package/task-lib/omp-session-cleanup.js +1 -1
  374. package/task-lib/omp-storage-root.js +8 -12
  375. package/task-lib/omp-storage-root.ts +62 -0
  376. package/task-lib/process-termination.js +143 -166
  377. 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
  };