@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
@@ -1,530 +1,37 @@
1
- const Ledger = require('../ledger');
2
- const MessageBus = require('../message-bus');
3
- const LogicEngine = require('../logic-engine');
4
- const TemplateResolver = require('../template-resolver');
5
- const { executeHook } = require('../agent/agent-hook-executor');
6
- const { parseResultOutput } = require('../agent/agent-task-executor');
7
- const { findMatchingTrigger, evaluateTrigger } = require('../agent/agent-trigger-evaluator');
8
-
1
+ "use strict";
2
+ const random_topology_scenario_1 = require("./random-topology-scenario");
3
+ const random_topology_schema_1 = require("./random-topology-schema");
9
4
  const DEFAULT_SAMPLES = 6;
10
5
  const DEFAULT_MAX_STEPS = 120;
11
6
  const DEFAULT_MAX_SCENARIO_MS = 120;
12
7
  const MAX_ERRORS = 3;
13
-
14
- function createSeededRng(seed) {
15
- let state = seed >>> 0 || 0x9e3779b9;
16
- return () => {
17
- state ^= state << 13;
18
- state >>>= 0;
19
- state ^= state >>> 17;
20
- state >>>= 0;
21
- state ^= state << 5;
22
- state >>>= 0;
23
- return state / 4294967296;
24
- };
25
- }
26
-
27
- function randomInt(rng, min, max) {
28
- if (!Number.isFinite(min) || !Number.isFinite(max)) {
29
- return 0;
30
- }
31
- if (max <= min) {
32
- return Math.round(min);
33
- }
34
- return Math.floor(rng() * (max - min + 1)) + min;
35
- }
36
-
37
- function randomPick(rng, values, fallback = null) {
38
- if (!Array.isArray(values) || values.length === 0) {
39
- return fallback;
40
- }
41
- return values[randomInt(rng, 0, values.length - 1)];
42
- }
43
-
44
- function normalizeType(schema) {
45
- if (!schema || !schema.type) return null;
46
- if (Array.isArray(schema.type)) {
47
- return schema.type[0] || null;
48
- }
49
- return schema.type;
50
- }
51
-
52
- function sampleString(schema, rng) {
53
- const candidates = [];
54
- if (typeof schema.default === 'string') candidates.push(schema.default);
55
- if (typeof schema.description === 'string') candidates.push(schema.description);
56
- candidates.push('sample', 'ok', 'done', 'pass', 'fail');
57
- let value = randomPick(rng, candidates, 'sample');
58
-
59
- const minLength = Number.isInteger(schema.minLength) ? schema.minLength : 0;
60
- const maxLength = Number.isInteger(schema.maxLength) ? schema.maxLength : value.length;
61
-
62
- while (value.length < minLength) {
63
- value += 'x';
64
- }
65
- if (maxLength >= 0 && value.length > maxLength) {
66
- value = value.slice(0, maxLength);
67
- }
68
- if (!value && minLength > 0) {
69
- value = 'x'.repeat(minLength);
70
- }
71
- return value;
72
- }
73
-
74
- function sampleNumber(schema, rng, asInteger) {
75
- const minimum = Number.isFinite(schema.minimum) ? schema.minimum : asInteger ? 0 : 0;
76
- const maximum = Number.isFinite(schema.maximum) ? schema.maximum : asInteger ? 10 : 10;
77
- if (maximum < minimum) {
78
- return asInteger ? Math.round(minimum) : minimum;
79
- }
80
-
81
- if (asInteger) {
82
- return randomInt(rng, Math.ceil(minimum), Math.floor(maximum));
83
- }
84
- const fraction = rng();
85
- return minimum + (maximum - minimum) * fraction;
86
- }
87
-
88
- function sampleFromSchema(schema, rng, depth = 0) {
89
- if (!schema || typeof schema !== 'object') {
90
- return null;
91
- }
92
-
93
- if (depth > 4) {
94
- return null;
95
- }
96
-
97
- if (schema.const !== undefined) {
98
- return schema.const;
99
- }
100
-
101
- if (Array.isArray(schema.enum) && schema.enum.length > 0) {
102
- return randomPick(rng, schema.enum);
103
- }
104
-
105
- if (Array.isArray(schema.oneOf) && schema.oneOf.length > 0) {
106
- return sampleFromSchema(randomPick(rng, schema.oneOf), rng, depth + 1);
107
- }
108
- if (Array.isArray(schema.anyOf) && schema.anyOf.length > 0) {
109
- return sampleFromSchema(randomPick(rng, schema.anyOf), rng, depth + 1);
110
- }
111
- if (Array.isArray(schema.allOf) && schema.allOf.length > 0) {
112
- return sampleFromSchema(schema.allOf[0], rng, depth + 1);
113
- }
114
-
115
- const type = normalizeType(schema);
116
-
117
- if (type === 'boolean') {
118
- return rng() >= 0.5;
119
- }
120
-
121
- if (type === 'integer') {
122
- return sampleNumber(schema, rng, true);
123
- }
124
-
125
- if (type === 'number') {
126
- return sampleNumber(schema, rng, false);
127
- }
128
-
129
- if (type === 'array') {
130
- const minItems = Number.isInteger(schema.minItems) ? schema.minItems : 0;
131
- const maxItemsRaw = Number.isInteger(schema.maxItems) ? schema.maxItems : minItems + 2;
132
- const maxItems = Math.max(minItems, Math.min(maxItemsRaw, 3));
133
- const length = randomInt(rng, minItems, maxItems);
134
-
135
- const itemsSchema = Array.isArray(schema.items)
136
- ? randomPick(rng, schema.items, {})
137
- : schema.items || {};
138
- const values = [];
139
- for (let i = 0; i < length; i += 1) {
140
- values.push(sampleFromSchema(itemsSchema, rng, depth + 1));
141
- }
142
- return values;
143
- }
144
-
145
- if (type === 'object' || schema.properties) {
146
- const properties = schema.properties || {};
147
- const value = {};
148
-
149
- for (const [key, propSchema] of Object.entries(properties)) {
150
- value[key] = sampleFromSchema(propSchema, rng, depth + 1);
151
- }
152
-
153
- if (Object.keys(value).length === 0 && Object.keys(properties).length > 0) {
154
- const key = Object.keys(properties)[0];
155
- value[key] = sampleFromSchema(properties[key], rng, depth + 1);
156
- }
157
-
158
- return value;
159
- }
160
-
161
- return sampleString(schema, rng);
162
- }
163
-
164
- function sampleResultData(agentConfig, rng) {
165
- const schema = agentConfig?.jsonSchema || agentConfig?.structuredOutput || null;
166
- if (schema) {
167
- return sampleFromSchema(schema, rng);
168
- }
169
- return {
170
- summary: 'sample',
171
- result: 'sample',
172
- };
173
- }
174
-
175
- function createSimAgent({ agentConfig, cluster, messageBus, iteration }) {
176
- const simAgent = {
177
- id: agentConfig.id,
178
- role: agentConfig.role,
179
- iteration,
180
- cluster,
181
- messageBus,
182
- config: agentConfig,
183
- currentTaskId: `sim-${agentConfig.id}-${iteration}`,
184
- workingDirectory: process.cwd(),
185
- _log: () => {},
186
- _resolveProvider: () => 'claude',
187
- _parseResultOutput: (output) => parseResultOutput(simAgent, output),
188
- _publish: (message) => {
189
- const receiver = message.receiver || 'broadcast';
190
- return messageBus.publish({
191
- ...message,
192
- receiver,
193
- cluster_id: cluster.id,
194
- sender: simAgent.id,
195
- });
196
- },
197
- };
198
- return simAgent;
199
- }
200
-
201
- function addAgentsToState(state, agents) {
202
- for (const agent of agents || []) {
203
- if (!agent?.id) {
204
- continue;
205
- }
206
-
207
- if (state.agentConfigs.some((existing) => existing.id === agent.id)) {
208
- continue;
209
- }
210
-
211
- state.agentConfigs.push(agent);
212
- state.cluster.agents.push({ id: agent.id, role: agent.role });
213
- }
214
- }
215
-
216
- function parseOperations(raw) {
217
- if (Array.isArray(raw)) {
218
- return raw;
219
- }
220
- if (typeof raw === 'string') {
221
- return JSON.parse(raw);
222
- }
223
- return null;
224
- }
225
-
226
- function resolveConfigOperation({ configOp, templatesDir }) {
227
- const resolver = new TemplateResolver(templatesDir);
228
- return resolver.resolveConfigReference(configOp).loadedConfig;
229
- }
230
-
231
- function applyClusterOperation({ state, messageBus, operation, sourceMessage, templatesDir }) {
232
- if (!operation?.action) {
233
- return;
234
- }
235
-
236
- if (operation.action === 'load_config') {
237
- const loadedConfig = resolveConfigOperation({
238
- configOp: operation.config,
239
- templatesDir,
240
- });
241
- addAgentsToState(state, loadedConfig.agents || []);
242
- return;
243
- }
244
-
245
- if (operation.action === 'add_agents') {
246
- addAgentsToState(state, operation.agents || []);
247
- return;
248
- }
249
-
250
- if (operation.action === 'remove_agents') {
251
- const ids = new Set(operation.agentIds || []);
252
- state.agentConfigs = state.agentConfigs.filter((agent) => !ids.has(agent.id));
253
- state.cluster.agents = state.cluster.agents.filter((agent) => !ids.has(agent.id));
254
- return;
255
- }
256
-
257
- if (operation.action === 'update_agent') {
258
- const target = state.agentConfigs.find((agent) => agent.id === operation.agentId);
259
- if (!target || !operation.updates || typeof operation.updates !== 'object') {
260
- return;
261
- }
262
- Object.assign(target, operation.updates);
263
- return;
264
- }
265
-
266
- if (operation.action === 'publish') {
267
- messageBus.publish({
268
- cluster_id: state.cluster.id,
269
- topic: operation.topic,
270
- sender: '__sim_orchestrator__',
271
- receiver: operation.receiver || 'broadcast',
272
- content: operation.content || {},
273
- metadata: operation.metadata || {
274
- fromTopic: sourceMessage.topic,
275
- },
276
- });
277
- }
278
- }
279
-
280
- function handleClusterOperationsMessage({ state, messageBus, message, templatesDir }) {
281
- const raw = message?.content?.data?.operations;
282
- const operations = parseOperations(raw);
283
- if (!Array.isArray(operations)) {
284
- throw new Error(`CLUSTER_OPERATIONS missing operations array: ${JSON.stringify(raw)}`);
285
- }
286
-
287
- for (const operation of operations) {
288
- applyClusterOperation({ state, messageBus, operation, sourceMessage: message, templatesDir });
289
- }
290
- }
291
-
292
- function createIssueOpenedMessage(clusterId) {
293
- return {
294
- cluster_id: clusterId,
295
- topic: 'ISSUE_OPENED',
296
- sender: 'system',
297
- receiver: 'broadcast',
298
- content: {
299
- text: 'template validation simulation',
300
- data: {},
301
- },
302
- };
303
- }
304
-
305
- async function runScenario({ config, templateId, seed, maxSteps, maxScenarioMs, templatesDir }) {
306
- const initialAgentConfigs = JSON.parse(JSON.stringify(config.agents || []));
307
- const state = {
308
- agentConfigs: initialAgentConfigs,
309
- cluster: {
310
- id: `sim-${templateId}-${seed}`,
311
- agents: initialAgentConfigs.map((agent) => ({ id: agent.id, role: agent.role })),
312
- },
313
- };
314
-
315
- const rng = createSeededRng(seed);
316
- const ledger = new Ledger(':memory:');
317
- const messageBus = new MessageBus(ledger);
318
- const logicEngine = new LogicEngine(messageBus, state.cluster);
319
- const iterations = new Map();
320
- const queue = [];
321
- const unsubscribe = messageBus.subscribe((message) => {
322
- queue.push(message);
323
- });
324
-
325
- const startedAt = Date.now();
326
-
327
- try {
328
- messageBus.publish(createIssueOpenedMessage(state.cluster.id));
329
- let stepCount = 0;
330
-
331
- while (queue.length > 0) {
332
- if (Date.now() - startedAt > maxScenarioMs) {
333
- return {
334
- ok: false,
335
- reason: `scenario timed out after ${maxScenarioMs}ms`,
336
- };
337
- }
338
- if (stepCount >= maxSteps) {
339
- return {
340
- ok: false,
341
- reason: `scenario exceeded step budget (${maxSteps})`,
342
- };
343
- }
344
- stepCount += 1;
345
-
346
- const message = queue.shift();
347
- if (!message) continue;
348
-
349
- if (message.topic === 'CLUSTER_COMPLETE') {
350
- return { ok: true };
351
- }
352
- if (message.topic === 'CLUSTER_FAILED') {
353
- return {
354
- ok: false,
355
- reason: `scenario reached CLUSTER_FAILED`,
356
- };
357
- }
358
- if (message.topic === 'CLUSTER_OPERATIONS') {
359
- try {
360
- handleClusterOperationsMessage({
361
- state,
362
- messageBus,
363
- message,
8
+ async function simulateRandomTopology({ config, templateId, templatesDir, samples = DEFAULT_SAMPLES, maxSteps = DEFAULT_MAX_STEPS, maxScenarioMs = DEFAULT_MAX_SCENARIO_MS, }) {
9
+ const errors = [];
10
+ if (!config?.agents || config.agents.length === 0) {
11
+ return errors;
12
+ }
13
+ const baseSeed = 1337;
14
+ const scenarioCount = Math.max(1, Number(samples) || DEFAULT_SAMPLES);
15
+ for (let index = 0; index < scenarioCount; index += 1) {
16
+ const seed = baseSeed + index * 9973;
17
+ const outcome = await (0, random_topology_scenario_1.runScenario)({
18
+ config,
19
+ templateId,
20
+ seed,
21
+ maxSteps,
22
+ maxScenarioMs,
364
23
  templatesDir,
365
- });
366
- } catch (error) {
367
- return {
368
- ok: false,
369
- reason: `invalid CLUSTER_OPERATIONS: ${error.message}`,
370
- };
371
- }
372
- continue;
373
- }
374
-
375
- for (const agentConfig of state.agentConfigs) {
376
- const trigger = findMatchingTrigger({
377
- triggers: agentConfig.triggers || [],
378
- message,
379
- });
380
- if (!trigger) {
381
- continue;
382
- }
383
-
384
- let shouldExecute = true;
385
- try {
386
- shouldExecute = evaluateTrigger({
387
- trigger,
388
- message,
389
- agent: {
390
- id: agentConfig.id,
391
- role: agentConfig.role,
392
- iteration: iterations.get(agentConfig.id) || 0,
393
- cluster_id: state.cluster.id,
394
- },
395
- logicEngine,
396
- });
397
- } catch (error) {
398
- return {
399
- ok: false,
400
- reason: `trigger logic error (${agentConfig.id} on ${message.topic}): ${error.message}`,
401
- };
402
- }
403
-
404
- if (!shouldExecute) {
405
- continue;
406
- }
407
-
408
- const action = trigger.action || 'execute_task';
409
- if (action === 'stop_cluster') {
410
- messageBus.publish({
411
- cluster_id: state.cluster.id,
412
- topic: 'CLUSTER_COMPLETE',
413
- sender: agentConfig.id,
414
- receiver: 'system',
415
- content: {
416
- text: 'simulated completion',
417
- data: { topic: message.topic },
418
- },
419
- });
420
- continue;
421
- }
422
-
423
- if (action !== 'execute_task') {
424
- continue;
425
- }
426
-
427
- const nextIteration = (iterations.get(agentConfig.id) || 0) + 1;
428
- iterations.set(agentConfig.id, nextIteration);
429
- const maxIterations = Number.isInteger(agentConfig.maxIterations)
430
- ? agentConfig.maxIterations
431
- : 100;
432
- if (nextIteration > maxIterations) {
433
- messageBus.publish({
434
- cluster_id: state.cluster.id,
435
- topic: 'CLUSTER_FAILED',
436
- sender: agentConfig.id,
437
- receiver: 'system',
438
- content: {
439
- text: `maxIterations exceeded: ${agentConfig.id}`,
440
- data: { maxIterations, iteration: nextIteration },
441
- },
442
- });
443
- continue;
444
- }
445
-
446
- const sampledResult = sampleResultData(agentConfig, rng);
447
- const simAgent = createSimAgent({
448
- agentConfig,
449
- cluster: state.cluster,
450
- messageBus,
451
- iteration: nextIteration,
452
24
  });
453
-
454
- try {
455
- await executeHook({
456
- hook: agentConfig.hooks?.onComplete,
457
- agent: simAgent,
458
- message,
459
- result: {
460
- output: JSON.stringify(sampledResult || {}),
461
- success: true,
462
- taskId: `sim-task-${agentConfig.id}-${nextIteration}`,
463
- },
464
- messageBus,
465
- cluster: state.cluster,
466
- });
467
- } catch (error) {
468
- return {
469
- ok: false,
470
- reason: `hook execution failed (${agentConfig.id}): ${error.message}`,
471
- };
472
- }
473
- }
25
+ if (outcome.ok === true)
26
+ continue;
27
+ errors.push(`[RandomSim] ${templateId} seed=${seed}: ${outcome.reason}. ` +
28
+ 'Topology may be unsound under sampled schema-conformant outputs.');
29
+ if (errors.length >= MAX_ERRORS)
30
+ break;
474
31
  }
475
-
476
- return {
477
- ok: false,
478
- reason: 'message flow quiesced without CLUSTER_COMPLETE',
479
- };
480
- } finally {
481
- unsubscribe();
482
- ledger.close();
483
- }
484
- }
485
-
486
- async function simulateRandomTopology({
487
- config,
488
- templateId,
489
- templatesDir,
490
- samples = DEFAULT_SAMPLES,
491
- maxSteps = DEFAULT_MAX_STEPS,
492
- maxScenarioMs = DEFAULT_MAX_SCENARIO_MS,
493
- }) {
494
- const errors = [];
495
- if (!config?.agents || config.agents.length === 0) {
496
32
  return errors;
497
- }
498
-
499
- const baseSeed = 1337;
500
- const scenarioCount = Math.max(1, Number(samples) || DEFAULT_SAMPLES);
501
-
502
- for (let i = 0; i < scenarioCount; i += 1) {
503
- const seed = baseSeed + i * 9973;
504
- const outcome = await runScenario({
505
- config,
506
- templateId,
507
- seed,
508
- maxSteps,
509
- maxScenarioMs,
510
- templatesDir,
511
- });
512
- if (outcome.ok) {
513
- continue;
514
- }
515
- errors.push(
516
- `[RandomSim] ${templateId} seed=${seed}: ${outcome.reason}. ` +
517
- `Topology may be unsound under sampled schema-conformant outputs.`
518
- );
519
- if (errors.length >= MAX_ERRORS) {
520
- break;
521
- }
522
- }
523
-
524
- return errors;
525
33
  }
526
-
527
34
  module.exports = {
528
- simulateRandomTopology,
529
- sampleFromSchema,
35
+ simulateRandomTopology,
36
+ sampleFromSchema: random_topology_schema_1.sampleFromSchema,
530
37
  };
@@ -0,0 +1,57 @@
1
+ import type { RandomTemplateConfig } from './random-topology-contracts';
2
+ import { runScenario } from './random-topology-scenario';
3
+ import { sampleFromSchema } from './random-topology-schema';
4
+
5
+ const DEFAULT_SAMPLES = 6;
6
+ const DEFAULT_MAX_STEPS = 120;
7
+ const DEFAULT_MAX_SCENARIO_MS = 120;
8
+ const MAX_ERRORS = 3;
9
+
10
+ interface SimulateRandomTopologyOptions {
11
+ config: RandomTemplateConfig;
12
+ templateId: string;
13
+ templatesDir: string;
14
+ samples?: number;
15
+ maxSteps?: number;
16
+ maxScenarioMs?: number;
17
+ }
18
+
19
+ async function simulateRandomTopology({
20
+ config,
21
+ templateId,
22
+ templatesDir,
23
+ samples = DEFAULT_SAMPLES,
24
+ maxSteps = DEFAULT_MAX_STEPS,
25
+ maxScenarioMs = DEFAULT_MAX_SCENARIO_MS,
26
+ }: SimulateRandomTopologyOptions): Promise<string[]> {
27
+ const errors: string[] = [];
28
+ if (!config?.agents || config.agents.length === 0) {
29
+ return errors;
30
+ }
31
+
32
+ const baseSeed = 1337;
33
+ const scenarioCount = Math.max(1, Number(samples) || DEFAULT_SAMPLES);
34
+ for (let index = 0; index < scenarioCount; index += 1) {
35
+ const seed = baseSeed + index * 9973;
36
+ const outcome = await runScenario({
37
+ config,
38
+ templateId,
39
+ seed,
40
+ maxSteps,
41
+ maxScenarioMs,
42
+ templatesDir,
43
+ });
44
+ if (outcome.ok === true) continue;
45
+ errors.push(
46
+ `[RandomSim] ${templateId} seed=${seed}: ${outcome.reason}. ` +
47
+ 'Topology may be unsound under sampled schema-conformant outputs.'
48
+ );
49
+ if (errors.length >= MAX_ERRORS) break;
50
+ }
51
+ return errors;
52
+ }
53
+
54
+ export = {
55
+ simulateRandomTopology,
56
+ sampleFromSchema,
57
+ };