@the-open-engine/zeroshot 6.38.1 → 6.39.1

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