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