@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,270 +1,46 @@
1
- const assert = require('node:assert');
2
-
3
- const Ledger = require('../ledger');
4
- const MessageBus = require('../message-bus');
5
- const LogicEngine = require('../logic-engine');
6
- const { executeHook } = require('../agent/agent-hook-executor');
7
- const { parseResultOutput } = require('../agent/agent-task-executor');
8
-
9
- function createSimAgent({ agentConfig, cluster, messageBus }) {
10
- const simAgent = {
11
- id: agentConfig.id,
12
- role: agentConfig.role,
13
- iteration: 1,
14
- cluster,
15
- messageBus,
16
- config: agentConfig,
17
- currentTaskId: 'sim-task',
18
- workingDirectory: process.cwd(),
19
- _log: () => {},
20
- _resolveProvider: () => 'claude',
21
- _parseResultOutput: (output) => parseResultOutput(simAgent, output),
22
- _publish: (message) => {
23
- const receiver = message.receiver || 'broadcast';
24
- return messageBus.publish({
25
- ...message,
26
- receiver,
27
- cluster_id: cluster.id,
28
- sender: simAgent.id,
29
- });
30
- },
31
- };
32
- return simAgent;
33
- }
34
-
35
- async function simulateQuickValidation({ config }) {
36
- const cluster = {
37
- id: 'quick-sim',
38
- agents: config.agents.map((a) => ({ id: a.id, role: a.role })),
39
- };
40
-
41
- const coordinator = config.agents.find((a) => a.id === 'consensus-coordinator');
42
- assert.ok(coordinator, 'quick-validation: consensus-coordinator missing');
43
-
44
- const trigger = coordinator.triggers.find((t) => t.topic === 'QUICK_VALIDATION_RESULT');
45
- assert.ok(trigger?.logic?.script, 'quick-validation: coordinator trigger logic missing');
46
- assert.ok(coordinator.hooks?.onComplete, 'quick-validation: coordinator onComplete missing');
47
-
48
- const failures = [];
49
-
50
- const runScenario = async (allApproved) => {
51
- const ledger = new Ledger(':memory:');
52
- const messageBus = new MessageBus(ledger);
53
- const logicEngine = new LogicEngine(messageBus, cluster);
54
-
55
- // Stage start
56
- const now = Date.now();
57
- messageBus.publish({
58
- cluster_id: cluster.id,
59
- topic: 'IMPLEMENTATION_READY',
60
- sender: 'worker',
61
- timestamp: now,
62
- });
63
-
64
- // Validator outputs (stage 1)
65
- messageBus.publish({
66
- cluster_id: cluster.id,
67
- topic: 'QUICK_VALIDATION_RESULT',
68
- sender: 'validator-requirements',
69
- timestamp: now + 10,
70
- content: { data: { approved: true, errors: ['req-error'] } },
71
- });
72
- messageBus.publish({
73
- cluster_id: cluster.id,
74
- topic: 'QUICK_VALIDATION_RESULT',
75
- sender: 'validator-code',
76
- timestamp: now + 20,
77
- content: { data: { approved: true, errors: ['code-error'] } },
78
- });
79
-
80
- const gateOk = logicEngine.evaluate(
81
- trigger.logic.script,
82
- { id: 'consensus-coordinator', cluster_id: cluster.id },
83
- { topic: 'QUICK_VALIDATION_RESULT' }
84
- );
85
- if (!gateOk) {
86
- ledger.close();
87
- return { ok: false, error: 'quick-validation: gate did not open after both validators' };
88
- }
89
-
90
- const simAgent = createSimAgent({ agentConfig: coordinator, cluster, messageBus });
91
- const triggeringMessage = messageBus.findLast({
92
- cluster_id: cluster.id,
93
- topic: 'QUICK_VALIDATION_RESULT',
94
- });
95
-
96
- try {
97
- await executeHook({
98
- hook: coordinator.hooks.onComplete,
99
- agent: simAgent,
100
- message: triggeringMessage,
101
- result: {
102
- output: JSON.stringify({ allApproved, summary: allApproved ? 'ok' : 'nope' }),
103
- success: true,
104
- taskId: 'sim-task',
105
- },
106
- messageBus,
107
- cluster,
108
- });
109
- } catch (err) {
110
- ledger.close();
111
- return { ok: false, error: `quick-validation: onComplete failed: ${err.message}` };
112
- }
113
-
114
- const passed = messageBus.findLast({
115
- cluster_id: cluster.id,
116
- topic: 'QUICK_VALIDATION_PASSED',
117
- });
118
- const validationResult = messageBus.findLast({
119
- cluster_id: cluster.id,
120
- topic: 'VALIDATION_RESULT',
121
- });
122
-
123
- ledger.close();
124
-
125
- if (allApproved) {
126
- if (!passed)
127
- return { ok: false, error: 'quick-validation: expected QUICK_VALIDATION_PASSED' };
128
- return { ok: true };
129
- }
130
-
131
- if (!validationResult) {
132
- return { ok: false, error: 'quick-validation: expected VALIDATION_RESULT on rejection' };
133
- }
134
-
135
- const errors = validationResult.content?.data?.errors || [];
136
- if (!errors.includes('req-error') || !errors.includes('code-error')) {
137
- return { ok: false, error: 'quick-validation: rejection did not aggregate validator errors' };
138
- }
139
-
140
- return { ok: true };
141
- };
142
-
143
- for (const allApproved of [true, false]) {
144
- const res = await runScenario(allApproved);
145
- if (!res.ok) failures.push(res.error);
146
- }
147
-
148
- return failures;
149
- }
150
-
151
- async function simulateHeavyValidation({ config }) {
152
- const cluster = {
153
- id: 'heavy-sim',
154
- agents: config.agents.map((a) => ({ id: a.id, role: a.role })),
155
- };
156
-
157
- const coordinator = config.agents.find((a) => a.id === 'consensus-coordinator');
158
- assert.ok(coordinator, 'heavy-validation: consensus-coordinator missing');
159
-
160
- const trigger = coordinator.triggers.find((t) => t.topic === 'HEAVY_VALIDATION_RESULT');
161
- assert.ok(trigger?.logic?.script, 'heavy-validation: coordinator trigger logic missing');
162
- assert.ok(coordinator.hooks?.onComplete, 'heavy-validation: coordinator onComplete missing');
163
-
164
- const failures = [];
165
-
166
- const runScenario = async (allApproved) => {
167
- const ledger = new Ledger(':memory:');
168
- const messageBus = new MessageBus(ledger);
169
- const logicEngine = new LogicEngine(messageBus, cluster);
170
-
171
- const now = Date.now();
172
- messageBus.publish({
173
- cluster_id: cluster.id,
174
- topic: 'QUICK_VALIDATION_PASSED',
175
- sender: 'consensus-coordinator',
176
- timestamp: now,
177
- });
178
-
179
- messageBus.publish({
180
- cluster_id: cluster.id,
181
- topic: 'HEAVY_VALIDATION_RESULT',
182
- sender: 'validator-security',
183
- timestamp: now + 10,
184
- content: { data: { approved: true, errors: ['sec-error'] } },
185
- });
186
- messageBus.publish({
187
- cluster_id: cluster.id,
188
- topic: 'HEAVY_VALIDATION_RESULT',
189
- sender: 'validator-tester',
190
- timestamp: now + 20,
191
- content: { data: { approved: true, errors: ['test-error'] } },
192
- });
193
-
194
- const gateOk = logicEngine.evaluate(
195
- trigger.logic.script,
196
- { id: 'consensus-coordinator', cluster_id: cluster.id },
197
- { topic: 'HEAVY_VALIDATION_RESULT' }
198
- );
199
- if (!gateOk) {
200
- ledger.close();
201
- return { ok: false, error: 'heavy-validation: gate did not open after both validators' };
202
- }
203
-
204
- const simAgent = createSimAgent({ agentConfig: coordinator, cluster, messageBus });
205
- const triggeringMessage = messageBus.findLast({
206
- cluster_id: cluster.id,
207
- topic: 'HEAVY_VALIDATION_RESULT',
208
- });
209
-
210
- try {
211
- await executeHook({
212
- hook: coordinator.hooks.onComplete,
213
- agent: simAgent,
214
- message: triggeringMessage,
215
- result: {
216
- output: JSON.stringify({ allApproved, summary: allApproved ? 'ok' : 'nope' }),
217
- success: true,
218
- taskId: 'sim-task',
219
- },
220
- messageBus,
221
- cluster,
222
- });
223
- } catch (err) {
224
- ledger.close();
225
- return { ok: false, error: `heavy-validation: onComplete failed: ${err.message}` };
226
- }
227
-
228
- const validationResult = messageBus.findLast({
229
- cluster_id: cluster.id,
230
- topic: 'VALIDATION_RESULT',
231
- });
232
- ledger.close();
233
-
234
- if (!validationResult) {
235
- return { ok: false, error: 'heavy-validation: expected VALIDATION_RESULT' };
1
+ "use strict";
2
+ const two_stage_scenario_1 = require("./two-stage-scenario");
3
+ const QUICK_VALIDATION_SPEC = {
4
+ templateId: 'quick-validation',
5
+ clusterId: 'quick-sim',
6
+ triggerTopic: 'QUICK_VALIDATION_RESULT',
7
+ stageStartTopic: 'IMPLEMENTATION_READY',
8
+ stageStartSender: 'worker',
9
+ validators: [
10
+ { sender: 'validator-requirements', error: 'req-error' },
11
+ { sender: 'validator-code', error: 'code-error' },
12
+ ],
13
+ passTopic: 'QUICK_VALIDATION_PASSED',
14
+ gateFailure: 'quick-validation: gate did not open after both validators',
15
+ missingPassFailure: 'quick-validation: expected QUICK_VALIDATION_PASSED',
16
+ missingResultFailure: 'quick-validation: expected VALIDATION_RESULT on rejection',
17
+ aggregateFailure: 'quick-validation: rejection did not aggregate validator errors',
18
+ };
19
+ const HEAVY_VALIDATION_SPEC = {
20
+ templateId: 'heavy-validation',
21
+ clusterId: 'heavy-sim',
22
+ triggerTopic: 'HEAVY_VALIDATION_RESULT',
23
+ stageStartTopic: 'QUICK_VALIDATION_PASSED',
24
+ stageStartSender: 'consensus-coordinator',
25
+ validators: [
26
+ { sender: 'validator-security', error: 'sec-error' },
27
+ { sender: 'validator-tester', error: 'test-error' },
28
+ ],
29
+ gateFailure: 'heavy-validation: gate did not open after both validators',
30
+ missingPassFailure: 'heavy-validation: expected QUICK_VALIDATION_PASSED',
31
+ missingResultFailure: 'heavy-validation: expected VALIDATION_RESULT',
32
+ aggregateFailure: 'heavy-validation: did not aggregate validator errors',
33
+ };
34
+ /** Run deterministic two-stage validation scenarios for base templates. */
35
+ function simulateTwoStageValidation({ templateId, config }) {
36
+ if (templateId === 'quick-validation') {
37
+ return (0, two_stage_scenario_1.simulateValidationStage)(QUICK_VALIDATION_SPEC, config);
236
38
  }
237
-
238
- const errors = validationResult.content?.data?.errors || [];
239
- if (!errors.includes('sec-error') || !errors.includes('test-error')) {
240
- return { ok: false, error: 'heavy-validation: did not aggregate validator errors' };
39
+ if (templateId === 'heavy-validation') {
40
+ return (0, two_stage_scenario_1.simulateValidationStage)(HEAVY_VALIDATION_SPEC, config);
241
41
  }
242
-
243
- return { ok: true };
244
- };
245
-
246
- for (const allApproved of [true, false]) {
247
- const res = await runScenario(allApproved);
248
- if (!res.ok) failures.push(res.error);
249
- }
250
-
251
- return failures;
252
- }
253
-
254
- /**
255
- * Deep sim: run deterministic two-stage validation scenarios for base templates.
256
- * Returns an array of error strings.
257
- */
258
- function simulateTwoStageValidation({ templateId, config }) {
259
- if (templateId === 'quick-validation') {
260
- return simulateQuickValidation({ config });
261
- }
262
- if (templateId === 'heavy-validation') {
263
- return simulateHeavyValidation({ config });
264
- }
265
- return Promise.resolve([]);
42
+ return Promise.resolve([]);
266
43
  }
267
-
268
44
  module.exports = {
269
- simulateTwoStageValidation,
45
+ simulateTwoStageValidation,
270
46
  };
@@ -0,0 +1,55 @@
1
+ import { simulateValidationStage } from './two-stage-scenario';
2
+ import type { ValidationStageSpec, ValidationTemplateConfig } from './two-stage-contracts';
3
+
4
+ const QUICK_VALIDATION_SPEC: ValidationStageSpec = {
5
+ templateId: 'quick-validation',
6
+ clusterId: 'quick-sim',
7
+ triggerTopic: 'QUICK_VALIDATION_RESULT',
8
+ stageStartTopic: 'IMPLEMENTATION_READY',
9
+ stageStartSender: 'worker',
10
+ validators: [
11
+ { sender: 'validator-requirements', error: 'req-error' },
12
+ { sender: 'validator-code', error: 'code-error' },
13
+ ],
14
+ passTopic: 'QUICK_VALIDATION_PASSED',
15
+ gateFailure: 'quick-validation: gate did not open after both validators',
16
+ missingPassFailure: 'quick-validation: expected QUICK_VALIDATION_PASSED',
17
+ missingResultFailure: 'quick-validation: expected VALIDATION_RESULT on rejection',
18
+ aggregateFailure: 'quick-validation: rejection did not aggregate validator errors',
19
+ };
20
+
21
+ const HEAVY_VALIDATION_SPEC: ValidationStageSpec = {
22
+ templateId: 'heavy-validation',
23
+ clusterId: 'heavy-sim',
24
+ triggerTopic: 'HEAVY_VALIDATION_RESULT',
25
+ stageStartTopic: 'QUICK_VALIDATION_PASSED',
26
+ stageStartSender: 'consensus-coordinator',
27
+ validators: [
28
+ { sender: 'validator-security', error: 'sec-error' },
29
+ { sender: 'validator-tester', error: 'test-error' },
30
+ ],
31
+ gateFailure: 'heavy-validation: gate did not open after both validators',
32
+ missingPassFailure: 'heavy-validation: expected QUICK_VALIDATION_PASSED',
33
+ missingResultFailure: 'heavy-validation: expected VALIDATION_RESULT',
34
+ aggregateFailure: 'heavy-validation: did not aggregate validator errors',
35
+ };
36
+
37
+ interface SimulationInput {
38
+ templateId: string;
39
+ config: ValidationTemplateConfig;
40
+ }
41
+
42
+ /** Run deterministic two-stage validation scenarios for base templates. */
43
+ function simulateTwoStageValidation({ templateId, config }: SimulationInput): Promise<string[]> {
44
+ if (templateId === 'quick-validation') {
45
+ return simulateValidationStage(QUICK_VALIDATION_SPEC, config);
46
+ }
47
+ if (templateId === 'heavy-validation') {
48
+ return simulateValidationStage(HEAVY_VALIDATION_SPEC, config);
49
+ }
50
+ return Promise.resolve([]);
51
+ }
52
+
53
+ export = {
54
+ simulateTwoStageValidation,
55
+ };
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ function isAgentHookExecutorModule(value) {
3
+ return (typeof value === 'object' &&
4
+ value !== null &&
5
+ 'executeHook' in value &&
6
+ typeof value.executeHook === 'function');
7
+ }
8
+ function isAgentTaskExecutorModule(value) {
9
+ return (typeof value === 'object' &&
10
+ value !== null &&
11
+ 'parseResultOutput' in value &&
12
+ typeof value.parseResultOutput === 'function');
13
+ }
14
+ const agentHookExecutorModule = require('../agent/agent-hook-executor');
15
+ const agentTaskExecutorModule = require('../agent/agent-task-executor');
16
+ if (!isAgentHookExecutorModule(agentHookExecutorModule)) {
17
+ throw new TypeError('agent-hook-executor must export executeHook');
18
+ }
19
+ if (!isAgentTaskExecutorModule(agentTaskExecutorModule)) {
20
+ throw new TypeError('agent-task-executor must export parseResultOutput');
21
+ }
22
+ module.exports = {
23
+ executeHook: agentHookExecutorModule.executeHook,
24
+ parseResultOutput: agentTaskExecutorModule.parseResultOutput,
25
+ };
@@ -0,0 +1,40 @@
1
+ interface AgentHookExecutorModule {
2
+ executeHook(options: unknown): Promise<void>;
3
+ }
4
+
5
+ interface AgentTaskExecutorModule {
6
+ parseResultOutput(agent: unknown, output: string): Promise<unknown>;
7
+ }
8
+
9
+ function isAgentHookExecutorModule(value: unknown): value is AgentHookExecutorModule {
10
+ return (
11
+ typeof value === 'object' &&
12
+ value !== null &&
13
+ 'executeHook' in value &&
14
+ typeof value.executeHook === 'function'
15
+ );
16
+ }
17
+
18
+ function isAgentTaskExecutorModule(value: unknown): value is AgentTaskExecutorModule {
19
+ return (
20
+ typeof value === 'object' &&
21
+ value !== null &&
22
+ 'parseResultOutput' in value &&
23
+ typeof value.parseResultOutput === 'function'
24
+ );
25
+ }
26
+
27
+ const agentHookExecutorModule: unknown = require('../agent/agent-hook-executor');
28
+ const agentTaskExecutorModule: unknown = require('../agent/agent-task-executor');
29
+
30
+ if (!isAgentHookExecutorModule(agentHookExecutorModule)) {
31
+ throw new TypeError('agent-hook-executor must export executeHook');
32
+ }
33
+ if (!isAgentTaskExecutorModule(agentTaskExecutorModule)) {
34
+ throw new TypeError('agent-task-executor must export parseResultOutput');
35
+ }
36
+
37
+ export = {
38
+ executeHook: agentHookExecutorModule.executeHook,
39
+ parseResultOutput: agentTaskExecutorModule.parseResultOutput,
40
+ };
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSimulationAgent = createSimulationAgent;
4
+ const simulationAgentRuntime = require("./simulation-agent-runtime");
5
+ function createSimulationAgent({ agentConfig, cluster, messageBus, iteration = 1, currentTaskId = 'sim-task', }) {
6
+ const simulationAgent = {
7
+ id: agentConfig.id,
8
+ role: agentConfig.role,
9
+ iteration,
10
+ cluster,
11
+ messageBus,
12
+ config: agentConfig,
13
+ currentTaskId,
14
+ workingDirectory: process.cwd(),
15
+ _log: () => { },
16
+ _resolveProvider: () => 'claude',
17
+ _parseResultOutput: (output) => simulationAgentRuntime.parseResultOutput(simulationAgent, output),
18
+ _publish: (message) => {
19
+ const receiver = message.receiver || 'broadcast';
20
+ return messageBus.publish({
21
+ ...message,
22
+ receiver,
23
+ cluster_id: cluster.id,
24
+ sender: simulationAgent.id,
25
+ });
26
+ },
27
+ };
28
+ return simulationAgent;
29
+ }
@@ -0,0 +1,73 @@
1
+ import simulationAgentRuntime = require('./simulation-agent-runtime');
2
+
3
+ interface SimulationMessageBus {
4
+ publish(message: unknown): unknown;
5
+ }
6
+
7
+ type PublishMessage = Record<string, unknown> & { receiver?: unknown };
8
+
9
+ export interface SimulationAgentConfig {
10
+ id: string;
11
+ role?: string;
12
+ }
13
+
14
+ export interface SimulationCluster {
15
+ id: string;
16
+ agents: Array<{ id: string; role: string | undefined }>;
17
+ }
18
+
19
+ interface SimulationAgent {
20
+ id: string;
21
+ role: string | undefined;
22
+ iteration: number;
23
+ cluster: SimulationCluster;
24
+ messageBus: SimulationMessageBus;
25
+ config: SimulationAgentConfig;
26
+ currentTaskId: string;
27
+ workingDirectory: string;
28
+ _log(...arguments_: unknown[]): void;
29
+ _resolveProvider(): 'claude';
30
+ _parseResultOutput(output: string): Promise<unknown>;
31
+ _publish(message: PublishMessage): unknown;
32
+ }
33
+
34
+ interface CreateSimulationAgentOptions {
35
+ agentConfig: SimulationAgentConfig;
36
+ cluster: SimulationCluster;
37
+ messageBus: SimulationMessageBus;
38
+ iteration?: number;
39
+ currentTaskId?: string;
40
+ }
41
+
42
+ export function createSimulationAgent({
43
+ agentConfig,
44
+ cluster,
45
+ messageBus,
46
+ iteration = 1,
47
+ currentTaskId = 'sim-task',
48
+ }: CreateSimulationAgentOptions): SimulationAgent {
49
+ const simulationAgent: SimulationAgent = {
50
+ id: agentConfig.id,
51
+ role: agentConfig.role,
52
+ iteration,
53
+ cluster,
54
+ messageBus,
55
+ config: agentConfig,
56
+ currentTaskId,
57
+ workingDirectory: process.cwd(),
58
+ _log: () => {},
59
+ _resolveProvider: () => 'claude',
60
+ _parseResultOutput: (output) =>
61
+ simulationAgentRuntime.parseResultOutput(simulationAgent, output),
62
+ _publish: (message) => {
63
+ const receiver = message.receiver || 'broadcast';
64
+ return messageBus.publish({
65
+ ...message,
66
+ receiver,
67
+ cluster_id: cluster.id,
68
+ sender: simulationAgent.id,
69
+ });
70
+ },
71
+ };
72
+ return simulationAgent;
73
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ function isLedgerConstructor(value) {
3
+ return typeof value === 'function';
4
+ }
5
+ function isMessageBusConstructor(value) {
6
+ return typeof value === 'function';
7
+ }
8
+ function isLogicEngineConstructor(value) {
9
+ return typeof value === 'function';
10
+ }
11
+ const ledgerModule = require('../ledger');
12
+ const messageBusModule = require('../message-bus');
13
+ const logicEngineModule = require('../logic-engine');
14
+ if (!isLedgerConstructor(ledgerModule)) {
15
+ throw new TypeError('ledger must export a constructor');
16
+ }
17
+ if (!isMessageBusConstructor(messageBusModule)) {
18
+ throw new TypeError('message-bus must export a constructor');
19
+ }
20
+ if (!isLogicEngineConstructor(logicEngineModule)) {
21
+ throw new TypeError('logic-engine must export a constructor');
22
+ }
23
+ const Ledger = ledgerModule;
24
+ const MessageBus = messageBusModule;
25
+ const LogicEngine = logicEngineModule;
26
+ function createSimulationRuntime(cluster) {
27
+ const ledger = new Ledger(':memory:');
28
+ const messageBus = new MessageBus(ledger);
29
+ const logicEngine = new LogicEngine(messageBus, cluster);
30
+ return { ledger, messageBus, logicEngine };
31
+ }
32
+ module.exports = {
33
+ createSimulationRuntime,
34
+ };
@@ -0,0 +1,72 @@
1
+ interface SimulationLedger {
2
+ close(): void;
3
+ }
4
+
5
+ interface SimulationMessageBus {
6
+ publish(message: unknown): unknown;
7
+ subscribe(listener: (message: unknown) => void): () => void;
8
+ findLast(criteria: unknown): unknown;
9
+ }
10
+
11
+ interface SimulationLogicEngine {
12
+ evaluate(script: string, agent: unknown, message: unknown): boolean;
13
+ }
14
+
15
+ interface LedgerConstructor {
16
+ new (databasePath: string): SimulationLedger;
17
+ }
18
+
19
+ interface MessageBusConstructor {
20
+ new (ledger: SimulationLedger): SimulationMessageBus;
21
+ }
22
+
23
+ interface LogicEngineConstructor {
24
+ new (messageBus: SimulationMessageBus, cluster: unknown): SimulationLogicEngine;
25
+ }
26
+
27
+ interface SimulationRuntime {
28
+ ledger: SimulationLedger;
29
+ messageBus: SimulationMessageBus;
30
+ logicEngine: SimulationLogicEngine;
31
+ }
32
+
33
+ function isLedgerConstructor(value: unknown): value is LedgerConstructor {
34
+ return typeof value === 'function';
35
+ }
36
+
37
+ function isMessageBusConstructor(value: unknown): value is MessageBusConstructor {
38
+ return typeof value === 'function';
39
+ }
40
+
41
+ function isLogicEngineConstructor(value: unknown): value is LogicEngineConstructor {
42
+ return typeof value === 'function';
43
+ }
44
+
45
+ const ledgerModule: unknown = require('../ledger');
46
+ const messageBusModule: unknown = require('../message-bus');
47
+ const logicEngineModule: unknown = require('../logic-engine');
48
+
49
+ if (!isLedgerConstructor(ledgerModule)) {
50
+ throw new TypeError('ledger must export a constructor');
51
+ }
52
+ if (!isMessageBusConstructor(messageBusModule)) {
53
+ throw new TypeError('message-bus must export a constructor');
54
+ }
55
+ if (!isLogicEngineConstructor(logicEngineModule)) {
56
+ throw new TypeError('logic-engine must export a constructor');
57
+ }
58
+
59
+ const Ledger = ledgerModule;
60
+ const MessageBus = messageBusModule;
61
+ const LogicEngine = logicEngineModule;
62
+
63
+ function createSimulationRuntime(cluster: unknown): SimulationRuntime {
64
+ const ledger = new Ledger(':memory:');
65
+ const messageBus = new MessageBus(ledger);
66
+ const logicEngine = new LogicEngine(messageBus, cluster);
67
+ return { ledger, messageBus, logicEngine };
68
+ }
69
+
70
+ export = {
71
+ createSimulationRuntime,
72
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });