@the-open-engine/zeroshot 6.38.0 → 6.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/cli/event-copy.js +8 -7
  2. package/cli/event-copy.ts +12 -0
  3. package/cli/index.js +7 -31
  4. package/cli/json-export.js +61 -64
  5. package/cli/json-export.ts +112 -0
  6. package/cli/message-formatter-utils.js +68 -56
  7. package/cli/message-formatter-utils.ts +121 -0
  8. package/cli/message-formatters-normal.js +124 -259
  9. package/cli/message-formatters-normal.ts +250 -0
  10. package/cli/message-formatters-watch.js +81 -84
  11. package/cli/message-formatters-watch.ts +189 -0
  12. package/lib/agent-cli-provider/adapters/codex.d.ts.map +1 -1
  13. package/lib/agent-cli-provider/adapters/codex.js +3 -1
  14. package/lib/agent-cli-provider/adapters/codex.js.map +1 -1
  15. package/lib/cluster/generated/protocol-schema.cjs +1 -1
  16. package/lib/cluster/generated/protocol-schema.mjs +1 -1
  17. package/lib/cluster/generated/protocol.d.cts +8 -0
  18. package/lib/cluster/generated/protocol.d.mts +8 -0
  19. package/lib/cluster/generated/protocol.d.ts +8 -0
  20. package/lib/clusters-registry.d.ts +23 -0
  21. package/lib/clusters-registry.js +17 -29
  22. package/lib/completion.d.ts +12 -0
  23. package/lib/completion.js +84 -94
  24. package/lib/compose-utils.d.ts +32 -0
  25. package/lib/compose-utils.js +57 -72
  26. package/lib/detached-startup.d.ts +83 -0
  27. package/lib/detached-startup.js +231 -302
  28. package/lib/docker-config.d.ts +43 -0
  29. package/lib/docker-config.js +150 -325
  30. package/lib/docker-env-auth.d.ts +17 -0
  31. package/lib/docker-env-auth.js +75 -0
  32. package/lib/git-remote-utils.d.ts +48 -0
  33. package/lib/git-remote-utils.js +147 -213
  34. package/lib/id-detector.d.ts +15 -0
  35. package/lib/id-detector.js +37 -41
  36. package/lib/path-check.d.ts +30 -0
  37. package/lib/path-check.js +42 -45
  38. package/lib/process-liveness.d.ts +16 -0
  39. package/lib/process-liveness.js +19 -12
  40. package/lib/provider-credential-path.d.ts +16 -0
  41. package/lib/provider-credential-path.js +31 -29
  42. package/lib/provider-defaults.d.ts +30 -0
  43. package/lib/provider-defaults.js +47 -42
  44. package/lib/provider-detection.d.ts +11 -0
  45. package/lib/provider-detection.js +91 -54
  46. package/lib/provider-names.d.ts +38 -0
  47. package/lib/provider-names.js +56 -64
  48. package/lib/repo-settings.d.ts +28 -0
  49. package/lib/repo-settings.js +83 -59
  50. package/lib/run-mode.d.ts +21 -0
  51. package/lib/run-mode.js +21 -20
  52. package/lib/run-plan.d.ts +28 -0
  53. package/lib/run-plan.js +17 -16
  54. package/lib/settings/claude-auth.d.ts +35 -0
  55. package/lib/settings/claude-auth.js +30 -47
  56. package/lib/settings-defaults.d.ts +20 -0
  57. package/lib/settings-defaults.js +149 -0
  58. package/lib/settings-error.d.ts +7 -0
  59. package/lib/settings-error.js +8 -0
  60. package/lib/settings-issue-providers.d.ts +10 -0
  61. package/lib/settings-issue-providers.js +12 -0
  62. package/lib/settings-models.d.ts +22 -0
  63. package/lib/settings-models.js +93 -0
  64. package/lib/settings-storage.d.ts +23 -0
  65. package/lib/settings-storage.js +205 -0
  66. package/lib/settings-validation.d.ts +7 -0
  67. package/lib/settings-validation.js +182 -0
  68. package/lib/settings.d.ts +29 -0
  69. package/lib/settings.js +41 -736
  70. package/lib/setup-apply-types.d.ts +66 -0
  71. package/lib/setup-apply-types.js +2 -0
  72. package/lib/setup-apply.d.ts +39 -0
  73. package/lib/setup-apply.js +267 -264
  74. package/lib/setup-journal.d.ts +41 -0
  75. package/lib/setup-journal.js +119 -76
  76. package/lib/setup-plan-types.d.ts +102 -0
  77. package/lib/setup-plan-types.js +2 -0
  78. package/lib/setup-plan.d.ts +30 -0
  79. package/lib/setup-plan.js +300 -324
  80. package/lib/setup-undo.d.ts +44 -0
  81. package/lib/setup-undo.js +61 -74
  82. package/lib/start-cluster-config.d.ts +26 -0
  83. package/lib/start-cluster-config.js +56 -0
  84. package/lib/start-cluster-environment.d.ts +40 -0
  85. package/lib/start-cluster-environment.js +134 -0
  86. package/lib/start-cluster-run-options.d.ts +53 -0
  87. package/lib/start-cluster-run-options.js +147 -0
  88. package/lib/start-cluster.d.ts +64 -0
  89. package/lib/start-cluster.js +98 -454
  90. package/lib/stream-json-parser.d.ts +17 -0
  91. package/lib/stream-json-parser.js +51 -52
  92. package/npm-shrinkwrap.json +2 -2
  93. package/package.json +12 -6
  94. package/scripts/postinstall.js +27 -0
  95. package/scripts/rust-distribution.js +23 -14
  96. package/src/agent/agent-command-proofs-context.js +35 -45
  97. package/src/agent/agent-command-proofs-context.ts +87 -0
  98. package/src/agent/agent-config-settings.js +19 -0
  99. package/src/agent/agent-config-settings.ts +41 -0
  100. package/src/agent/agent-config.js +122 -231
  101. package/src/agent/agent-config.ts +285 -0
  102. package/src/agent/agent-context-builder.js +38 -273
  103. package/src/agent/agent-context-builder.ts +51 -0
  104. package/src/agent/agent-context-environment-sections.js +105 -0
  105. package/src/agent/agent-context-environment-sections.ts +134 -0
  106. package/src/agent/agent-context-packs.js +165 -0
  107. package/src/agent/agent-context-packs.ts +296 -0
  108. package/src/agent/agent-context-prompt-sections.js +100 -0
  109. package/src/agent/agent-context-prompt-sections.ts +148 -0
  110. package/src/agent/agent-context-sections.js +25 -334
  111. package/src/agent/agent-context-sections.ts +36 -0
  112. package/src/agent/agent-context-sources.js +96 -149
  113. package/src/agent/agent-context-sources.ts +253 -0
  114. package/src/agent/agent-context-types.js +2 -0
  115. package/src/agent/agent-context-types.ts +132 -0
  116. package/src/agent/agent-context-validation-sections.js +73 -0
  117. package/src/agent/agent-context-validation-sections.ts +129 -0
  118. package/src/agent/agent-input-injector.js +99 -118
  119. package/src/agent/agent-input-injector.ts +195 -0
  120. package/src/agent/agent-liveness-poll.js +74 -78
  121. package/src/agent/agent-liveness-poll.ts +163 -0
  122. package/src/agent/agent-quality-gate-schema.js +77 -86
  123. package/src/agent/agent-quality-gate-schema.ts +135 -0
  124. package/src/agent/agent-quality-gates-context.js +44 -50
  125. package/src/agent/agent-quality-gates-context.ts +91 -0
  126. package/src/agent/agent-stuck-detector.js +171 -239
  127. package/src/agent/agent-stuck-detector.ts +288 -0
  128. package/src/agent/agent-trigger-evaluator.js +29 -46
  129. package/src/agent/agent-trigger-evaluator.ts +98 -0
  130. package/src/agent/context-metrics.js +110 -141
  131. package/src/agent/context-metrics.ts +261 -0
  132. package/src/agent/context-pack-builder.js +72 -358
  133. package/src/agent/context-pack-builder.ts +105 -0
  134. package/src/agent/context-pack-core.js +70 -0
  135. package/src/agent/context-pack-core.ts +96 -0
  136. package/src/agent/context-pack-selection.js +119 -0
  137. package/src/agent/context-pack-selection.ts +187 -0
  138. package/src/agent/context-pack-truncation.js +139 -0
  139. package/src/agent/context-pack-truncation.ts +208 -0
  140. package/src/agent/context-pack-types.js +2 -0
  141. package/src/agent/context-pack-types.ts +98 -0
  142. package/src/agent/context-replay-policy.js +30 -39
  143. package/src/agent/context-replay-policy.ts +71 -0
  144. package/src/agent/critical-agent-policy.js +6 -10
  145. package/src/agent/critical-agent-policy.ts +20 -0
  146. package/src/agent/guidance-queue.js +74 -87
  147. package/src/agent/guidance-queue.ts +166 -0
  148. package/src/agent/output-extraction-error-detail.js +45 -0
  149. package/src/agent/output-extraction-error-detail.ts +49 -0
  150. package/src/agent/output-extraction-failures.js +125 -0
  151. package/src/agent/output-extraction-failures.ts +149 -0
  152. package/src/agent/output-extraction-json.js +234 -0
  153. package/src/agent/output-extraction-json.ts +235 -0
  154. package/src/agent/output-extraction-pi.js +124 -0
  155. package/src/agent/output-extraction-pi.ts +137 -0
  156. package/src/agent/output-extraction-types.js +2 -0
  157. package/src/agent/output-extraction-types.ts +49 -0
  158. package/src/agent/output-extraction.js +17 -617
  159. package/src/agent/output-extraction.ts +30 -0
  160. package/src/agent/output-reformatter-errors.js +83 -0
  161. package/src/agent/output-reformatter-errors.ts +106 -0
  162. package/src/agent/output-reformatter-types.js +2 -0
  163. package/src/agent/output-reformatter-types.ts +86 -0
  164. package/src/agent/output-reformatter.js +140 -185
  165. package/src/agent/output-reformatter.ts +238 -0
  166. package/src/agent/pi-terminal-lifecycle-types.js +2 -0
  167. package/src/agent/pi-terminal-lifecycle-types.ts +41 -0
  168. package/src/agent/pi-terminal-lifecycle.js +186 -206
  169. package/src/agent/pi-terminal-lifecycle.ts +297 -0
  170. package/src/agent/provider-control-plane.js +22 -21
  171. package/src/agent/provider-control-plane.ts +52 -0
  172. package/src/agent/provider-terminal-failure-types.js +2 -0
  173. package/src/agent/provider-terminal-failure-types.ts +60 -0
  174. package/src/agent/provider-terminal-failure.js +194 -191
  175. package/src/agent/provider-terminal-failure.ts +262 -0
  176. package/src/agent/rate-limit-backoff.js +31 -74
  177. package/src/agent/rate-limit-backoff.ts +71 -0
  178. package/src/agent/schema-utils.js +85 -125
  179. package/src/agent/schema-utils.ts +148 -0
  180. package/src/agent/structured-output-error.js +34 -33
  181. package/src/agent/structured-output-error.ts +105 -0
  182. package/src/agent/validation-platform.js +27 -27
  183. package/src/agent/validation-platform.ts +49 -0
  184. package/src/agent-cli-provider/adapters/codex.ts +3 -1
  185. package/src/attach/attach-client.js +232 -405
  186. package/src/attach/attach-client.ts +300 -0
  187. package/src/attach/attach-server-cleanup.js +43 -0
  188. package/src/attach/attach-server-cleanup.ts +39 -0
  189. package/src/attach/attach-server-clients.js +117 -0
  190. package/src/attach/attach-server-clients.ts +122 -0
  191. package/src/attach/attach-server-events.js +38 -0
  192. package/src/attach/attach-server-events.ts +36 -0
  193. package/src/attach/attach-server-pty.js +45 -0
  194. package/src/attach/attach-server-pty.ts +64 -0
  195. package/src/attach/attach-server-runtime.js +73 -0
  196. package/src/attach/attach-server-runtime.ts +62 -0
  197. package/src/attach/attach-server-socket.js +28 -0
  198. package/src/attach/attach-server-socket.ts +23 -0
  199. package/src/attach/attach-server-types.js +2 -0
  200. package/src/attach/attach-server-types.ts +82 -0
  201. package/src/attach/attach-server.js +106 -523
  202. package/src/attach/attach-server.ts +158 -0
  203. package/src/attach/index.js +18 -35
  204. package/src/attach/index.ts +18 -0
  205. package/src/attach/protocol.js +95 -184
  206. package/src/attach/protocol.ts +181 -0
  207. package/src/attach/ring-buffer.js +76 -102
  208. package/src/attach/ring-buffer.ts +109 -0
  209. package/src/attach/send-input.js +64 -75
  210. package/src/attach/send-input.ts +94 -0
  211. package/src/attach/socket-discovery.js +164 -218
  212. package/src/attach/socket-discovery.ts +230 -0
  213. package/src/attach/socket-paths.js +42 -61
  214. package/src/attach/socket-paths.ts +81 -0
  215. package/src/claude-credentials.js +51 -54
  216. package/src/claude-credentials.ts +89 -0
  217. package/src/cluster/generated/protocol-schema.ts +1 -1
  218. package/src/cluster/generated/protocol.ts +2 -1
  219. package/src/command-proofs.js +110 -141
  220. package/src/command-proofs.ts +216 -0
  221. package/src/config-router.js +81 -73
  222. package/src/config-router.ts +131 -0
  223. package/src/copy-worker.js +53 -29
  224. package/src/copy-worker.ts +75 -0
  225. package/src/darwin-keychain-boundary.js +80 -111
  226. package/src/darwin-keychain-boundary.ts +148 -0
  227. package/src/guidance-topics.js +4 -5
  228. package/src/guidance-topics.ts +10 -0
  229. package/src/input-helpers.js +33 -54
  230. package/src/input-helpers.ts +58 -0
  231. package/src/ledger-sequence.js +45 -48
  232. package/src/ledger-sequence.ts +63 -0
  233. package/src/legacy-lib/clusters-registry.ts +40 -0
  234. package/src/legacy-lib/completion.ts +148 -0
  235. package/src/legacy-lib/compose-utils.ts +102 -0
  236. package/src/legacy-lib/detached-startup.ts +449 -0
  237. package/src/legacy-lib/docker-config.ts +282 -0
  238. package/src/legacy-lib/docker-env-auth.ts +116 -0
  239. package/src/legacy-lib/git-remote-utils.ts +244 -0
  240. package/src/legacy-lib/id-detector.ts +57 -0
  241. package/src/legacy-lib/js-yaml.d.ts +3 -0
  242. package/src/legacy-lib/omelette.d.ts +15 -0
  243. package/src/legacy-lib/path-check.ts +89 -0
  244. package/src/legacy-lib/process-liveness.ts +36 -0
  245. package/src/legacy-lib/provider-credential-path.ts +57 -0
  246. package/src/legacy-lib/provider-defaults.ts +114 -0
  247. package/src/legacy-lib/provider-detection.ts +67 -0
  248. package/src/legacy-lib/provider-names.ts +126 -0
  249. package/src/legacy-lib/repo-settings.ts +88 -0
  250. package/src/legacy-lib/run-mode.ts +58 -0
  251. package/src/legacy-lib/run-plan.ts +49 -0
  252. package/src/legacy-lib/settings/claude-auth.ts +80 -0
  253. package/src/legacy-lib/settings-defaults.ts +212 -0
  254. package/src/legacy-lib/settings-error.ts +8 -0
  255. package/src/legacy-lib/settings-issue-providers.ts +18 -0
  256. package/src/legacy-lib/settings-models.ts +124 -0
  257. package/src/legacy-lib/settings-storage.ts +277 -0
  258. package/src/legacy-lib/settings-validation.ts +220 -0
  259. package/src/legacy-lib/settings.ts +87 -0
  260. package/src/legacy-lib/setup-apply-types.ts +70 -0
  261. package/src/legacy-lib/setup-apply.ts +456 -0
  262. package/src/legacy-lib/setup-journal.ts +185 -0
  263. package/src/legacy-lib/setup-plan-types.ts +96 -0
  264. package/src/legacy-lib/setup-plan.ts +500 -0
  265. package/src/legacy-lib/setup-undo.ts +142 -0
  266. package/src/legacy-lib/start-cluster-config.ts +124 -0
  267. package/src/legacy-lib/start-cluster-environment.ts +165 -0
  268. package/src/legacy-lib/start-cluster-run-options.ts +279 -0
  269. package/src/legacy-lib/start-cluster.ts +237 -0
  270. package/src/legacy-lib/stream-json-parser.ts +88 -0
  271. package/src/message-buffer.js +55 -71
  272. package/src/message-buffer.ts +107 -0
  273. package/src/message-bus-bridge.js +92 -133
  274. package/src/message-bus-bridge.ts +149 -0
  275. package/src/name-generator-shared.js +220 -0
  276. package/src/name-generator-shared.ts +231 -0
  277. package/src/name-generator.js +8 -217
  278. package/src/name-generator.ts +27 -0
  279. package/src/omp-blob-root.js +83 -64
  280. package/src/omp-blob-root.ts +116 -0
  281. package/src/omp-config-overlay.js +65 -38
  282. package/src/omp-config-overlay.ts +110 -0
  283. package/src/omp-execution-fingerprint.js +38 -43
  284. package/src/omp-execution-fingerprint.ts +92 -0
  285. package/src/omp-session-limits.js +10 -15
  286. package/src/omp-session-limits.ts +53 -0
  287. package/src/omp-session-partition.js +2 -2
  288. package/src/omp-session-verifier.js +1 -1
  289. package/src/orchestrator.js +19 -4
  290. package/src/providers/anthropic/index.js +3 -1
  291. package/src/providers/anthropic/index.ts +13 -0
  292. package/src/providers/capabilities.js +19 -27
  293. package/src/providers/capabilities.ts +44 -0
  294. package/src/providers/google/index.js +3 -1
  295. package/src/providers/google/index.ts +13 -0
  296. package/src/providers/openai/index.js +3 -1
  297. package/src/providers/openai/index.ts +13 -0
  298. package/src/providers/opencode/index.js +3 -1
  299. package/src/providers/opencode/index.ts +13 -0
  300. package/src/quality-gates.js +67 -127
  301. package/src/quality-gates.ts +149 -0
  302. package/src/repo-settings-access.js +40 -0
  303. package/src/repo-settings-access.ts +64 -0
  304. package/src/schemas/sub-cluster.js +127 -183
  305. package/src/schemas/sub-cluster.ts +238 -0
  306. package/src/state-snapshot-normalization.js +224 -0
  307. package/src/state-snapshot-normalization.ts +222 -0
  308. package/src/state-snapshot.js +192 -359
  309. package/src/state-snapshot.ts +291 -0
  310. package/src/state-snapshotter.js +118 -130
  311. package/src/state-snapshotter.ts +167 -0
  312. package/src/sub-cluster-wrapper.js +4 -13
  313. package/src/task-run-model-args.js +87 -124
  314. package/src/task-run-model-args.ts +204 -0
  315. package/src/task-runner.js +5 -25
  316. package/src/task-runner.ts +28 -0
  317. package/src/task-startup-error.js +73 -58
  318. package/src/task-startup-error.ts +126 -0
  319. package/src/template-validation/consensus-gate-contracts.js +2 -0
  320. package/src/template-validation/consensus-gate-contracts.ts +70 -0
  321. package/src/template-validation/consensus-gate-scenarios.js +76 -0
  322. package/src/template-validation/consensus-gate-scenarios.ts +130 -0
  323. package/src/template-validation/consensus-gate-stage.js +34 -0
  324. package/src/template-validation/consensus-gate-stage.ts +56 -0
  325. package/src/template-validation/random-topology-contracts.js +2 -0
  326. package/src/template-validation/random-topology-contracts.ts +54 -0
  327. package/src/template-validation/random-topology-dispatch.js +25 -0
  328. package/src/template-validation/random-topology-dispatch.ts +33 -0
  329. package/src/template-validation/random-topology-message-loop.js +53 -0
  330. package/src/template-validation/random-topology-message-loop.ts +73 -0
  331. package/src/template-validation/random-topology-operations.js +79 -0
  332. package/src/template-validation/random-topology-operations.ts +101 -0
  333. package/src/template-validation/random-topology-runtime.js +25 -0
  334. package/src/template-validation/random-topology-runtime.ts +43 -0
  335. package/src/template-validation/random-topology-scenario.js +52 -0
  336. package/src/template-validation/random-topology-scenario.ts +57 -0
  337. package/src/template-validation/random-topology-schema.js +159 -0
  338. package/src/template-validation/random-topology-schema.ts +190 -0
  339. package/src/template-validation/random-topology-state.js +28 -0
  340. package/src/template-validation/random-topology-state.ts +30 -0
  341. package/src/template-validation/random-topology-trigger-evaluation.js +45 -0
  342. package/src/template-validation/random-topology-trigger-evaluation.ts +65 -0
  343. package/src/template-validation/random-topology-trigger.js +75 -0
  344. package/src/template-validation/random-topology-trigger.ts +88 -0
  345. package/src/template-validation/report-formatter.js +40 -46
  346. package/src/template-validation/report-formatter.ts +101 -0
  347. package/src/template-validation/simulate-consensus-gates.js +111 -302
  348. package/src/template-validation/simulate-consensus-gates.ts +196 -0
  349. package/src/template-validation/simulate-random-topology.js +26 -519
  350. package/src/template-validation/simulate-random-topology.ts +57 -0
  351. package/src/template-validation/simulate-two-stage-validation.js +41 -265
  352. package/src/template-validation/simulate-two-stage-validation.ts +55 -0
  353. package/src/template-validation/simulation-agent-runtime.js +25 -0
  354. package/src/template-validation/simulation-agent-runtime.ts +40 -0
  355. package/src/template-validation/simulation-agent.js +29 -0
  356. package/src/template-validation/simulation-agent.ts +73 -0
  357. package/src/template-validation/simulation-runtime.js +34 -0
  358. package/src/template-validation/simulation-runtime.ts +72 -0
  359. package/src/template-validation/two-stage-contracts.js +2 -0
  360. package/src/template-validation/two-stage-contracts.ts +41 -0
  361. package/src/template-validation/two-stage-inputs.js +21 -0
  362. package/src/template-validation/two-stage-inputs.ts +29 -0
  363. package/src/template-validation/two-stage-results.js +30 -0
  364. package/src/template-validation/two-stage-results.ts +40 -0
  365. package/src/template-validation/two-stage-scenario.js +86 -0
  366. package/src/template-validation/two-stage-scenario.ts +120 -0
  367. package/src/worktree-claude-config.js +182 -220
  368. package/src/worktree-claude-config.ts +272 -0
  369. package/src/worktree-tooling-env.js +103 -125
  370. package/src/worktree-tooling-env.ts +142 -0
  371. package/task-lib/completion.js +2 -3
  372. package/task-lib/completion.ts +9 -0
  373. package/task-lib/config.js +1 -4
  374. package/task-lib/config.ts +11 -0
  375. package/task-lib/name-generator.js +4 -226
  376. package/task-lib/name-generator.ts +11 -0
  377. package/task-lib/omp-session-cleanup.js +1 -1
  378. package/task-lib/omp-storage-root.js +8 -12
  379. package/task-lib/omp-storage-root.ts +62 -0
  380. package/task-lib/process-termination.js +143 -166
  381. package/task-lib/process-termination.ts +268 -0
@@ -0,0 +1,54 @@
1
+ import type { SimulationAgentConfig, SimulationCluster } from './simulation-agent';
2
+
3
+ export type RandomNumberGenerator = () => number;
4
+
5
+ export interface RandomTrigger {
6
+ topic: string;
7
+ logic?: { script?: string };
8
+ action?: string;
9
+ }
10
+
11
+ export interface RandomAgentConfig extends SimulationAgentConfig {
12
+ triggers?: RandomTrigger[];
13
+ hooks?: { onComplete?: unknown };
14
+ jsonSchema?: unknown;
15
+ structuredOutput?: unknown;
16
+ maxIterations?: number;
17
+ }
18
+
19
+ export interface RandomTemplateConfig {
20
+ agents?: RandomAgentConfig[];
21
+ }
22
+
23
+ export interface SimulationMessage {
24
+ topic: string;
25
+ [key: string]: unknown;
26
+ }
27
+
28
+ export interface RandomSimulationState {
29
+ agentConfigs: RandomAgentConfig[];
30
+ cluster: SimulationCluster;
31
+ }
32
+
33
+ export interface SimulationMessageBus {
34
+ publish(message: unknown): unknown;
35
+ }
36
+
37
+ export interface RandomDispatchContext {
38
+ state: RandomSimulationState;
39
+ messageBus: SimulationMessageBus;
40
+ logicEngine: unknown;
41
+ iterations: Map<string, number>;
42
+ rng: RandomNumberGenerator;
43
+ }
44
+
45
+ export type ScenarioOutcome = { ok: true } | { ok: false; reason: string };
46
+
47
+ export interface RunScenarioOptions {
48
+ config: RandomTemplateConfig;
49
+ templateId: string;
50
+ seed: number;
51
+ maxSteps: number;
52
+ maxScenarioMs: number;
53
+ templatesDir: string;
54
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dispatchScenarioMessage = dispatchScenarioMessage;
4
+ const randomTopologyRuntime = require("./random-topology-runtime");
5
+ const random_topology_trigger_1 = require("./random-topology-trigger");
6
+ function isRandomTrigger(value) {
7
+ return (typeof value === 'object' &&
8
+ value !== null &&
9
+ 'topic' in value &&
10
+ typeof value.topic === 'string');
11
+ }
12
+ async function dispatchScenarioMessage(context, message) {
13
+ for (const agentConfig of context.state.agentConfigs) {
14
+ const triggerValue = randomTopologyRuntime.findMatchingTrigger({
15
+ triggers: agentConfig.triggers || [],
16
+ message,
17
+ });
18
+ if (!isRandomTrigger(triggerValue))
19
+ continue;
20
+ const outcome = await (0, random_topology_trigger_1.executeAgentTrigger)(context, agentConfig, triggerValue, message);
21
+ if (outcome)
22
+ return outcome;
23
+ }
24
+ return null;
25
+ }
@@ -0,0 +1,33 @@
1
+ import type {
2
+ RandomDispatchContext,
3
+ RandomTrigger,
4
+ ScenarioOutcome,
5
+ SimulationMessage,
6
+ } from './random-topology-contracts';
7
+ import randomTopologyRuntime = require('./random-topology-runtime');
8
+ import { executeAgentTrigger } from './random-topology-trigger';
9
+
10
+ function isRandomTrigger(value: unknown): value is RandomTrigger {
11
+ return (
12
+ typeof value === 'object' &&
13
+ value !== null &&
14
+ 'topic' in value &&
15
+ typeof value.topic === 'string'
16
+ );
17
+ }
18
+
19
+ export async function dispatchScenarioMessage(
20
+ context: RandomDispatchContext,
21
+ message: SimulationMessage
22
+ ): Promise<ScenarioOutcome | null> {
23
+ for (const agentConfig of context.state.agentConfigs) {
24
+ const triggerValue = randomTopologyRuntime.findMatchingTrigger({
25
+ triggers: agentConfig.triggers || [],
26
+ message,
27
+ });
28
+ if (!isRandomTrigger(triggerValue)) continue;
29
+ const outcome = await executeAgentTrigger(context, agentConfig, triggerValue, message);
30
+ if (outcome) return outcome;
31
+ }
32
+ return null;
33
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runMessageLoop = runMessageLoop;
4
+ const random_topology_dispatch_1 = require("./random-topology-dispatch");
5
+ const random_topology_operations_1 = require("./random-topology-operations");
6
+ function isSimulationMessage(value) {
7
+ return (typeof value === 'object' &&
8
+ value !== null &&
9
+ 'topic' in value &&
10
+ typeof value.topic === 'string');
11
+ }
12
+ function errorMessage(error) {
13
+ return error instanceof Error ? error.message : String(error);
14
+ }
15
+ function processMessage(context, message) {
16
+ if (message.topic === 'CLUSTER_COMPLETE')
17
+ return Promise.resolve({ ok: true });
18
+ if (message.topic === 'CLUSTER_FAILED') {
19
+ return Promise.resolve({ ok: false, reason: 'scenario reached CLUSTER_FAILED' });
20
+ }
21
+ if (message.topic === 'CLUSTER_OPERATIONS') {
22
+ try {
23
+ (0, random_topology_operations_1.handleClusterOperationsMessage)(context.state, context.messageBus, message, context.templatesDir);
24
+ return Promise.resolve(null);
25
+ }
26
+ catch (error) {
27
+ return Promise.resolve({
28
+ ok: false,
29
+ reason: `invalid CLUSTER_OPERATIONS: ${errorMessage(error)}`,
30
+ });
31
+ }
32
+ }
33
+ return (0, random_topology_dispatch_1.dispatchScenarioMessage)(context, message);
34
+ }
35
+ async function runMessageLoop(context) {
36
+ let stepCount = 0;
37
+ while (context.queue.length > 0) {
38
+ if (Date.now() - context.startedAt > context.maxScenarioMs) {
39
+ return { ok: false, reason: `scenario timed out after ${context.maxScenarioMs}ms` };
40
+ }
41
+ if (stepCount >= context.maxSteps) {
42
+ return { ok: false, reason: `scenario exceeded step budget (${context.maxSteps})` };
43
+ }
44
+ stepCount += 1;
45
+ const messageValue = context.queue.shift();
46
+ if (!isSimulationMessage(messageValue))
47
+ continue;
48
+ const outcome = await processMessage(context, messageValue);
49
+ if (outcome)
50
+ return outcome;
51
+ }
52
+ return { ok: false, reason: 'message flow quiesced without CLUSTER_COMPLETE' };
53
+ }
@@ -0,0 +1,73 @@
1
+ import type {
2
+ RandomDispatchContext,
3
+ ScenarioOutcome,
4
+ SimulationMessage,
5
+ } from './random-topology-contracts';
6
+ import { dispatchScenarioMessage } from './random-topology-dispatch';
7
+ import { handleClusterOperationsMessage } from './random-topology-operations';
8
+
9
+ export interface MessageLoopContext extends RandomDispatchContext {
10
+ queue: unknown[];
11
+ templatesDir: string;
12
+ startedAt: number;
13
+ maxSteps: number;
14
+ maxScenarioMs: number;
15
+ }
16
+
17
+ function isSimulationMessage(value: unknown): value is SimulationMessage {
18
+ return (
19
+ typeof value === 'object' &&
20
+ value !== null &&
21
+ 'topic' in value &&
22
+ typeof value.topic === 'string'
23
+ );
24
+ }
25
+
26
+ function errorMessage(error: unknown): string {
27
+ return error instanceof Error ? error.message : String(error);
28
+ }
29
+
30
+ function processMessage(
31
+ context: MessageLoopContext,
32
+ message: SimulationMessage
33
+ ): Promise<ScenarioOutcome | null> {
34
+ if (message.topic === 'CLUSTER_COMPLETE') return Promise.resolve({ ok: true });
35
+ if (message.topic === 'CLUSTER_FAILED') {
36
+ return Promise.resolve({ ok: false, reason: 'scenario reached CLUSTER_FAILED' });
37
+ }
38
+ if (message.topic === 'CLUSTER_OPERATIONS') {
39
+ try {
40
+ handleClusterOperationsMessage(
41
+ context.state,
42
+ context.messageBus,
43
+ message,
44
+ context.templatesDir
45
+ );
46
+ return Promise.resolve(null);
47
+ } catch (error) {
48
+ return Promise.resolve({
49
+ ok: false,
50
+ reason: `invalid CLUSTER_OPERATIONS: ${errorMessage(error)}`,
51
+ });
52
+ }
53
+ }
54
+ return dispatchScenarioMessage(context, message);
55
+ }
56
+
57
+ export async function runMessageLoop(context: MessageLoopContext): Promise<ScenarioOutcome> {
58
+ let stepCount = 0;
59
+ while (context.queue.length > 0) {
60
+ if (Date.now() - context.startedAt > context.maxScenarioMs) {
61
+ return { ok: false, reason: `scenario timed out after ${context.maxScenarioMs}ms` };
62
+ }
63
+ if (stepCount >= context.maxSteps) {
64
+ return { ok: false, reason: `scenario exceeded step budget (${context.maxSteps})` };
65
+ }
66
+ stepCount += 1;
67
+ const messageValue = context.queue.shift();
68
+ if (!isSimulationMessage(messageValue)) continue;
69
+ const outcome = await processMessage(context, messageValue);
70
+ if (outcome) return outcome;
71
+ }
72
+ return { ok: false, reason: 'message flow quiesced without CLUSTER_COMPLETE' };
73
+ }
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleClusterOperationsMessage = handleClusterOperationsMessage;
4
+ const randomTopologyRuntime = require("./random-topology-runtime");
5
+ const random_topology_state_1 = require("./random-topology-state");
6
+ function parseOperations(raw) {
7
+ if (Array.isArray(raw))
8
+ return raw.map((operation) => operation);
9
+ if (typeof raw === 'string') {
10
+ const parsed = JSON.parse(raw);
11
+ return Array.isArray(parsed) ? parsed.map((operation) => operation) : null;
12
+ }
13
+ return null;
14
+ }
15
+ function isRecord(value) {
16
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
17
+ }
18
+ function resolveConfigOperation(configOperation, templatesDir) {
19
+ const resolver = new randomTopologyRuntime.TemplateResolver(templatesDir);
20
+ const resolved = resolver.resolveConfigReference(configOperation);
21
+ if (!isRecord(resolved) || !isRecord(resolved.loadedConfig)) {
22
+ throw new TypeError('TemplateResolver returned an invalid loadedConfig');
23
+ }
24
+ return resolved.loadedConfig;
25
+ }
26
+ function publishOperation(state, messageBus, operation, sourceMessage) {
27
+ messageBus.publish({
28
+ cluster_id: state.cluster.id,
29
+ topic: operation.topic,
30
+ sender: '__sim_orchestrator__',
31
+ receiver: operation.receiver || 'broadcast',
32
+ content: operation.content || {},
33
+ metadata: operation.metadata || { fromTopic: sourceMessage.topic },
34
+ });
35
+ }
36
+ function applyClusterOperation(options) {
37
+ const { state, messageBus, operation: operationValue, sourceMessage, templatesDir } = options;
38
+ if (!isRecord(operationValue) || !operationValue.action)
39
+ return;
40
+ const operation = operationValue;
41
+ if (operation.action === 'load_config') {
42
+ (0, random_topology_state_1.addAgentsToState)(state, resolveConfigOperation(operation.config, templatesDir).agents);
43
+ }
44
+ else if (operation.action === 'add_agents') {
45
+ (0, random_topology_state_1.addAgentsToState)(state, operation.agents);
46
+ }
47
+ else if (operation.action === 'remove_agents') {
48
+ const ids = new Set(operationAgentIds(operation.agentIds));
49
+ state.agentConfigs = state.agentConfigs.filter((agent) => !ids.has(agent.id));
50
+ state.cluster.agents = state.cluster.agents.filter((agent) => !ids.has(agent.id));
51
+ }
52
+ else if (operation.action === 'update_agent') {
53
+ const target = state.agentConfigs.find((agent) => agent.id === operation.agentId);
54
+ if (target && isRecord(operation.updates))
55
+ Object.assign(target, operation.updates);
56
+ }
57
+ else if (operation.action === 'publish') {
58
+ publishOperation(state, messageBus, operation, sourceMessage);
59
+ }
60
+ }
61
+ function operationAgentIds(value) {
62
+ return Array.isArray(value) ? value : [];
63
+ }
64
+ function operationsValue(message) {
65
+ const content = message.content;
66
+ if (!isRecord(content) || !isRecord(content.data))
67
+ return undefined;
68
+ return content.data.operations;
69
+ }
70
+ function handleClusterOperationsMessage(state, messageBus, message, templatesDir) {
71
+ const raw = operationsValue(message);
72
+ const operations = parseOperations(raw);
73
+ if (!operations) {
74
+ throw new Error(`CLUSTER_OPERATIONS missing operations array: ${JSON.stringify(raw)}`);
75
+ }
76
+ for (const operation of operations) {
77
+ applyClusterOperation({ state, messageBus, operation, sourceMessage: message, templatesDir });
78
+ }
79
+ }
@@ -0,0 +1,101 @@
1
+ import randomTopologyRuntime = require('./random-topology-runtime');
2
+ import type {
3
+ RandomSimulationState,
4
+ SimulationMessage,
5
+ SimulationMessageBus,
6
+ } from './random-topology-contracts';
7
+ import { addAgentsToState } from './random-topology-state';
8
+
9
+ type UnknownRecord = Record<string, unknown>;
10
+
11
+ function parseOperations(raw: unknown): unknown[] | null {
12
+ if (Array.isArray(raw)) return raw.map((operation: unknown) => operation);
13
+ if (typeof raw === 'string') {
14
+ const parsed: unknown = JSON.parse(raw);
15
+ return Array.isArray(parsed) ? parsed.map((operation: unknown) => operation) : null;
16
+ }
17
+ return null;
18
+ }
19
+
20
+ function isRecord(value: unknown): value is UnknownRecord {
21
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
22
+ }
23
+
24
+ function resolveConfigOperation(configOperation: unknown, templatesDir: string): UnknownRecord {
25
+ const resolver = new randomTopologyRuntime.TemplateResolver(templatesDir);
26
+ const resolved = resolver.resolveConfigReference(configOperation);
27
+ if (!isRecord(resolved) || !isRecord(resolved.loadedConfig)) {
28
+ throw new TypeError('TemplateResolver returned an invalid loadedConfig');
29
+ }
30
+ return resolved.loadedConfig;
31
+ }
32
+
33
+ interface ApplyOperationOptions {
34
+ state: RandomSimulationState;
35
+ messageBus: SimulationMessageBus;
36
+ operation: unknown;
37
+ sourceMessage: SimulationMessage;
38
+ templatesDir: string;
39
+ }
40
+
41
+ function publishOperation(
42
+ state: RandomSimulationState,
43
+ messageBus: SimulationMessageBus,
44
+ operation: UnknownRecord,
45
+ sourceMessage: SimulationMessage
46
+ ): void {
47
+ messageBus.publish({
48
+ cluster_id: state.cluster.id,
49
+ topic: operation.topic,
50
+ sender: '__sim_orchestrator__',
51
+ receiver: operation.receiver || 'broadcast',
52
+ content: operation.content || {},
53
+ metadata: operation.metadata || { fromTopic: sourceMessage.topic },
54
+ });
55
+ }
56
+
57
+ function applyClusterOperation(options: ApplyOperationOptions): void {
58
+ const { state, messageBus, operation: operationValue, sourceMessage, templatesDir } = options;
59
+ if (!isRecord(operationValue) || !operationValue.action) return;
60
+ const operation = operationValue;
61
+ if (operation.action === 'load_config') {
62
+ addAgentsToState(state, resolveConfigOperation(operation.config, templatesDir).agents);
63
+ } else if (operation.action === 'add_agents') {
64
+ addAgentsToState(state, operation.agents);
65
+ } else if (operation.action === 'remove_agents') {
66
+ const ids = new Set(operationAgentIds(operation.agentIds));
67
+ state.agentConfigs = state.agentConfigs.filter((agent) => !ids.has(agent.id));
68
+ state.cluster.agents = state.cluster.agents.filter((agent) => !ids.has(agent.id));
69
+ } else if (operation.action === 'update_agent') {
70
+ const target = state.agentConfigs.find((agent) => agent.id === operation.agentId);
71
+ if (target && isRecord(operation.updates)) Object.assign(target, operation.updates);
72
+ } else if (operation.action === 'publish') {
73
+ publishOperation(state, messageBus, operation, sourceMessage);
74
+ }
75
+ }
76
+
77
+ function operationAgentIds(value: unknown): unknown[] {
78
+ return Array.isArray(value) ? value : [];
79
+ }
80
+
81
+ function operationsValue(message: SimulationMessage): unknown {
82
+ const content = message.content;
83
+ if (!isRecord(content) || !isRecord(content.data)) return undefined;
84
+ return content.data.operations;
85
+ }
86
+
87
+ export function handleClusterOperationsMessage(
88
+ state: RandomSimulationState,
89
+ messageBus: SimulationMessageBus,
90
+ message: SimulationMessage,
91
+ templatesDir: string
92
+ ): void {
93
+ const raw = operationsValue(message);
94
+ const operations = parseOperations(raw);
95
+ if (!operations) {
96
+ throw new Error(`CLUSTER_OPERATIONS missing operations array: ${JSON.stringify(raw)}`);
97
+ }
98
+ for (const operation of operations) {
99
+ applyClusterOperation({ state, messageBus, operation, sourceMessage: message, templatesDir });
100
+ }
101
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ function isTemplateResolverConstructor(value) {
3
+ return typeof value === 'function';
4
+ }
5
+ function isTriggerEvaluatorModule(value) {
6
+ return (typeof value === 'object' &&
7
+ value !== null &&
8
+ 'findMatchingTrigger' in value &&
9
+ typeof value.findMatchingTrigger === 'function' &&
10
+ 'evaluateTrigger' in value &&
11
+ typeof value.evaluateTrigger === 'function');
12
+ }
13
+ const templateResolverModule = require('../template-resolver');
14
+ const triggerEvaluatorModule = require('../agent/agent-trigger-evaluator');
15
+ if (!isTemplateResolverConstructor(templateResolverModule)) {
16
+ throw new TypeError('template-resolver must export a constructor');
17
+ }
18
+ if (!isTriggerEvaluatorModule(triggerEvaluatorModule)) {
19
+ throw new TypeError('agent-trigger-evaluator must export trigger functions');
20
+ }
21
+ module.exports = {
22
+ TemplateResolver: templateResolverModule,
23
+ findMatchingTrigger: triggerEvaluatorModule.findMatchingTrigger,
24
+ evaluateTrigger: triggerEvaluatorModule.evaluateTrigger,
25
+ };
@@ -0,0 +1,43 @@
1
+ interface TemplateResolverInstance {
2
+ resolveConfigReference(configOperation: unknown): unknown;
3
+ }
4
+
5
+ interface TemplateResolverConstructor {
6
+ new (templatesDirectory: string): TemplateResolverInstance;
7
+ }
8
+
9
+ interface TriggerEvaluatorModule {
10
+ findMatchingTrigger(options: unknown): unknown;
11
+ evaluateTrigger(options: unknown): boolean;
12
+ }
13
+
14
+ function isTemplateResolverConstructor(value: unknown): value is TemplateResolverConstructor {
15
+ return typeof value === 'function';
16
+ }
17
+
18
+ function isTriggerEvaluatorModule(value: unknown): value is TriggerEvaluatorModule {
19
+ return (
20
+ typeof value === 'object' &&
21
+ value !== null &&
22
+ 'findMatchingTrigger' in value &&
23
+ typeof value.findMatchingTrigger === 'function' &&
24
+ 'evaluateTrigger' in value &&
25
+ typeof value.evaluateTrigger === 'function'
26
+ );
27
+ }
28
+
29
+ const templateResolverModule: unknown = require('../template-resolver');
30
+ const triggerEvaluatorModule: unknown = require('../agent/agent-trigger-evaluator');
31
+
32
+ if (!isTemplateResolverConstructor(templateResolverModule)) {
33
+ throw new TypeError('template-resolver must export a constructor');
34
+ }
35
+ if (!isTriggerEvaluatorModule(triggerEvaluatorModule)) {
36
+ throw new TypeError('agent-trigger-evaluator must export trigger functions');
37
+ }
38
+
39
+ export = {
40
+ TemplateResolver: templateResolverModule,
41
+ findMatchingTrigger: triggerEvaluatorModule.findMatchingTrigger,
42
+ evaluateTrigger: triggerEvaluatorModule.evaluateTrigger,
43
+ };
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runScenario = runScenario;
4
+ const random_topology_message_loop_1 = require("./random-topology-message-loop");
5
+ const random_topology_schema_1 = require("./random-topology-schema");
6
+ const random_topology_state_1 = require("./random-topology-state");
7
+ const simulationRuntime = require("./simulation-runtime");
8
+ function createIssueOpenedMessage(clusterId) {
9
+ return {
10
+ cluster_id: clusterId,
11
+ topic: 'ISSUE_OPENED',
12
+ sender: 'system',
13
+ receiver: 'broadcast',
14
+ content: { text: 'template validation simulation', data: {} },
15
+ };
16
+ }
17
+ function createState(options) {
18
+ const agentConfigs = (0, random_topology_state_1.cloneAgentConfigs)(options.config.agents || []);
19
+ return {
20
+ agentConfigs,
21
+ cluster: {
22
+ id: `sim-${options.templateId}-${options.seed}`,
23
+ agents: agentConfigs.map((agent) => ({ id: agent.id, role: agent.role })),
24
+ },
25
+ };
26
+ }
27
+ async function runScenario(options) {
28
+ const state = createState(options);
29
+ const runtime = simulationRuntime.createSimulationRuntime(state.cluster);
30
+ const queue = [];
31
+ const unsubscribe = runtime.messageBus.subscribe((message) => queue.push(message));
32
+ const startedAt = Date.now();
33
+ try {
34
+ runtime.messageBus.publish(createIssueOpenedMessage(state.cluster.id));
35
+ return await (0, random_topology_message_loop_1.runMessageLoop)({
36
+ state,
37
+ messageBus: runtime.messageBus,
38
+ logicEngine: runtime.logicEngine,
39
+ iterations: new Map(),
40
+ rng: (0, random_topology_schema_1.createSeededRng)(options.seed),
41
+ queue,
42
+ templatesDir: options.templatesDir,
43
+ startedAt,
44
+ maxSteps: options.maxSteps,
45
+ maxScenarioMs: options.maxScenarioMs,
46
+ });
47
+ }
48
+ finally {
49
+ unsubscribe();
50
+ runtime.ledger.close();
51
+ }
52
+ }
@@ -0,0 +1,57 @@
1
+ import type {
2
+ RandomSimulationState,
3
+ RunScenarioOptions,
4
+ ScenarioOutcome,
5
+ SimulationMessage,
6
+ } from './random-topology-contracts';
7
+ import { runMessageLoop } from './random-topology-message-loop';
8
+ import { createSeededRng } from './random-topology-schema';
9
+ import { cloneAgentConfigs } from './random-topology-state';
10
+ import simulationRuntime = require('./simulation-runtime');
11
+
12
+ function createIssueOpenedMessage(clusterId: string): SimulationMessage {
13
+ return {
14
+ cluster_id: clusterId,
15
+ topic: 'ISSUE_OPENED',
16
+ sender: 'system',
17
+ receiver: 'broadcast',
18
+ content: { text: 'template validation simulation', data: {} },
19
+ };
20
+ }
21
+
22
+ function createState(options: RunScenarioOptions): RandomSimulationState {
23
+ const agentConfigs = cloneAgentConfigs(options.config.agents || []);
24
+ return {
25
+ agentConfigs,
26
+ cluster: {
27
+ id: `sim-${options.templateId}-${options.seed}`,
28
+ agents: agentConfigs.map((agent) => ({ id: agent.id, role: agent.role })),
29
+ },
30
+ };
31
+ }
32
+
33
+ export async function runScenario(options: RunScenarioOptions): Promise<ScenarioOutcome> {
34
+ const state = createState(options);
35
+ const runtime = simulationRuntime.createSimulationRuntime(state.cluster);
36
+ const queue: unknown[] = [];
37
+ const unsubscribe = runtime.messageBus.subscribe((message) => queue.push(message));
38
+ const startedAt = Date.now();
39
+ try {
40
+ runtime.messageBus.publish(createIssueOpenedMessage(state.cluster.id));
41
+ return await runMessageLoop({
42
+ state,
43
+ messageBus: runtime.messageBus,
44
+ logicEngine: runtime.logicEngine,
45
+ iterations: new Map(),
46
+ rng: createSeededRng(options.seed),
47
+ queue,
48
+ templatesDir: options.templatesDir,
49
+ startedAt,
50
+ maxSteps: options.maxSteps,
51
+ maxScenarioMs: options.maxScenarioMs,
52
+ });
53
+ } finally {
54
+ unsubscribe();
55
+ runtime.ledger.close();
56
+ }
57
+ }