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