@the-open-engine/zeroshot 6.38.1 → 6.39.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (383) hide show
  1. package/README.md +6 -0
  2. package/cli/event-copy.js +8 -7
  3. package/cli/event-copy.ts +12 -0
  4. package/cli/index.js +67 -48
  5. package/cli/json-export.js +61 -64
  6. package/cli/json-export.ts +112 -0
  7. package/cli/message-formatter-utils.js +68 -56
  8. package/cli/message-formatter-utils.ts +121 -0
  9. package/cli/message-formatters-normal.js +124 -259
  10. package/cli/message-formatters-normal.ts +250 -0
  11. package/cli/message-formatters-watch.js +81 -84
  12. package/cli/message-formatters-watch.ts +189 -0
  13. package/lib/cluster/generated/protocol-schema.cjs +1 -1
  14. package/lib/cluster/generated/protocol-schema.mjs +1 -1
  15. package/lib/cluster/generated/protocol.d.cts +8 -0
  16. package/lib/cluster/generated/protocol.d.mts +8 -0
  17. package/lib/cluster/generated/protocol.d.ts +8 -0
  18. package/lib/clusters-registry.d.ts +23 -0
  19. package/lib/clusters-registry.js +17 -29
  20. package/lib/completion.d.ts +12 -0
  21. package/lib/completion.js +84 -94
  22. package/lib/compose-utils.d.ts +32 -0
  23. package/lib/compose-utils.js +57 -72
  24. package/lib/detached-startup.d.ts +84 -0
  25. package/lib/detached-startup.js +232 -302
  26. package/lib/docker-config.d.ts +43 -0
  27. package/lib/docker-config.js +150 -325
  28. package/lib/docker-env-auth.d.ts +17 -0
  29. package/lib/docker-env-auth.js +75 -0
  30. package/lib/git-remote-utils.d.ts +48 -0
  31. package/lib/git-remote-utils.js +147 -213
  32. package/lib/id-detector.d.ts +15 -0
  33. package/lib/id-detector.js +37 -41
  34. package/lib/path-check.d.ts +30 -0
  35. package/lib/path-check.js +42 -45
  36. package/lib/process-liveness.d.ts +16 -0
  37. package/lib/process-liveness.js +19 -12
  38. package/lib/provider-credential-path.d.ts +16 -0
  39. package/lib/provider-credential-path.js +31 -29
  40. package/lib/provider-defaults.d.ts +30 -0
  41. package/lib/provider-defaults.js +47 -42
  42. package/lib/provider-detection.d.ts +11 -0
  43. package/lib/provider-detection.js +91 -54
  44. package/lib/provider-names.d.ts +38 -0
  45. package/lib/provider-names.js +56 -64
  46. package/lib/repo-settings.d.ts +28 -0
  47. package/lib/repo-settings.js +83 -59
  48. package/lib/run-mode.d.ts +21 -0
  49. package/lib/run-mode.js +21 -20
  50. package/lib/run-plan.d.ts +28 -0
  51. package/lib/run-plan.js +17 -16
  52. package/lib/settings/claude-auth.d.ts +35 -0
  53. package/lib/settings/claude-auth.js +30 -47
  54. package/lib/settings-defaults.d.ts +20 -0
  55. package/lib/settings-defaults.js +149 -0
  56. package/lib/settings-error.d.ts +7 -0
  57. package/lib/settings-error.js +8 -0
  58. package/lib/settings-issue-providers.d.ts +10 -0
  59. package/lib/settings-issue-providers.js +12 -0
  60. package/lib/settings-models.d.ts +22 -0
  61. package/lib/settings-models.js +93 -0
  62. package/lib/settings-storage.d.ts +23 -0
  63. package/lib/settings-storage.js +205 -0
  64. package/lib/settings-validation.d.ts +7 -0
  65. package/lib/settings-validation.js +182 -0
  66. package/lib/settings.d.ts +29 -0
  67. package/lib/settings.js +41 -736
  68. package/lib/setup-apply-types.d.ts +66 -0
  69. package/lib/setup-apply-types.js +2 -0
  70. package/lib/setup-apply.d.ts +39 -0
  71. package/lib/setup-apply.js +267 -264
  72. package/lib/setup-journal.d.ts +41 -0
  73. package/lib/setup-journal.js +119 -76
  74. package/lib/setup-plan-types.d.ts +102 -0
  75. package/lib/setup-plan-types.js +2 -0
  76. package/lib/setup-plan.d.ts +30 -0
  77. package/lib/setup-plan.js +300 -324
  78. package/lib/setup-undo.d.ts +44 -0
  79. package/lib/setup-undo.js +61 -74
  80. package/lib/start-cluster-config.d.ts +26 -0
  81. package/lib/start-cluster-config.js +56 -0
  82. package/lib/start-cluster-environment.d.ts +41 -0
  83. package/lib/start-cluster-environment.js +134 -0
  84. package/lib/start-cluster-run-options.d.ts +54 -0
  85. package/lib/start-cluster-run-options.js +148 -0
  86. package/lib/start-cluster.d.ts +64 -0
  87. package/lib/start-cluster.js +98 -454
  88. package/lib/stream-json-parser.d.ts +17 -0
  89. package/lib/stream-json-parser.js +51 -52
  90. package/npm-shrinkwrap.json +6 -8
  91. package/package.json +14 -8
  92. package/scripts/postinstall.js +27 -0
  93. package/scripts/rust-distribution.js +36 -45
  94. package/src/agent/agent-command-proofs-context.js +35 -45
  95. package/src/agent/agent-command-proofs-context.ts +87 -0
  96. package/src/agent/agent-config-settings.js +19 -0
  97. package/src/agent/agent-config-settings.ts +41 -0
  98. package/src/agent/agent-config.js +122 -231
  99. package/src/agent/agent-config.ts +285 -0
  100. package/src/agent/agent-context-builder.js +38 -273
  101. package/src/agent/agent-context-builder.ts +51 -0
  102. package/src/agent/agent-context-environment-sections.js +105 -0
  103. package/src/agent/agent-context-environment-sections.ts +134 -0
  104. package/src/agent/agent-context-packs.js +165 -0
  105. package/src/agent/agent-context-packs.ts +296 -0
  106. package/src/agent/agent-context-prompt-sections.js +100 -0
  107. package/src/agent/agent-context-prompt-sections.ts +148 -0
  108. package/src/agent/agent-context-sections.js +25 -334
  109. package/src/agent/agent-context-sections.ts +36 -0
  110. package/src/agent/agent-context-sources.js +96 -149
  111. package/src/agent/agent-context-sources.ts +253 -0
  112. package/src/agent/agent-context-types.js +2 -0
  113. package/src/agent/agent-context-types.ts +132 -0
  114. package/src/agent/agent-context-validation-sections.js +73 -0
  115. package/src/agent/agent-context-validation-sections.ts +129 -0
  116. package/src/agent/agent-input-injector.js +99 -118
  117. package/src/agent/agent-input-injector.ts +195 -0
  118. package/src/agent/agent-liveness-poll.js +74 -78
  119. package/src/agent/agent-liveness-poll.ts +163 -0
  120. package/src/agent/agent-quality-gate-schema.js +77 -86
  121. package/src/agent/agent-quality-gate-schema.ts +135 -0
  122. package/src/agent/agent-quality-gates-context.js +44 -50
  123. package/src/agent/agent-quality-gates-context.ts +91 -0
  124. package/src/agent/agent-stuck-detector.js +171 -239
  125. package/src/agent/agent-stuck-detector.ts +288 -0
  126. package/src/agent/agent-trigger-evaluator.js +29 -46
  127. package/src/agent/agent-trigger-evaluator.ts +98 -0
  128. package/src/agent/context-metrics.js +110 -141
  129. package/src/agent/context-metrics.ts +261 -0
  130. package/src/agent/context-pack-builder.js +72 -358
  131. package/src/agent/context-pack-builder.ts +105 -0
  132. package/src/agent/context-pack-core.js +70 -0
  133. package/src/agent/context-pack-core.ts +96 -0
  134. package/src/agent/context-pack-selection.js +119 -0
  135. package/src/agent/context-pack-selection.ts +187 -0
  136. package/src/agent/context-pack-truncation.js +139 -0
  137. package/src/agent/context-pack-truncation.ts +208 -0
  138. package/src/agent/context-pack-types.js +2 -0
  139. package/src/agent/context-pack-types.ts +98 -0
  140. package/src/agent/context-replay-policy.js +30 -39
  141. package/src/agent/context-replay-policy.ts +71 -0
  142. package/src/agent/critical-agent-policy.js +6 -10
  143. package/src/agent/critical-agent-policy.ts +20 -0
  144. package/src/agent/guidance-queue.js +74 -87
  145. package/src/agent/guidance-queue.ts +166 -0
  146. package/src/agent/output-extraction-error-detail.js +45 -0
  147. package/src/agent/output-extraction-error-detail.ts +49 -0
  148. package/src/agent/output-extraction-failures.js +125 -0
  149. package/src/agent/output-extraction-failures.ts +149 -0
  150. package/src/agent/output-extraction-json.js +234 -0
  151. package/src/agent/output-extraction-json.ts +235 -0
  152. package/src/agent/output-extraction-pi.js +124 -0
  153. package/src/agent/output-extraction-pi.ts +137 -0
  154. package/src/agent/output-extraction-types.js +2 -0
  155. package/src/agent/output-extraction-types.ts +49 -0
  156. package/src/agent/output-extraction.js +17 -617
  157. package/src/agent/output-extraction.ts +30 -0
  158. package/src/agent/output-reformatter-errors.js +83 -0
  159. package/src/agent/output-reformatter-errors.ts +106 -0
  160. package/src/agent/output-reformatter-types.js +2 -0
  161. package/src/agent/output-reformatter-types.ts +86 -0
  162. package/src/agent/output-reformatter.js +140 -185
  163. package/src/agent/output-reformatter.ts +238 -0
  164. package/src/agent/pi-terminal-lifecycle-types.js +2 -0
  165. package/src/agent/pi-terminal-lifecycle-types.ts +41 -0
  166. package/src/agent/pi-terminal-lifecycle.js +186 -206
  167. package/src/agent/pi-terminal-lifecycle.ts +297 -0
  168. package/src/agent/provider-control-plane.js +22 -21
  169. package/src/agent/provider-control-plane.ts +52 -0
  170. package/src/agent/provider-terminal-failure-types.js +2 -0
  171. package/src/agent/provider-terminal-failure-types.ts +60 -0
  172. package/src/agent/provider-terminal-failure.js +194 -191
  173. package/src/agent/provider-terminal-failure.ts +262 -0
  174. package/src/agent/rate-limit-backoff.js +31 -74
  175. package/src/agent/rate-limit-backoff.ts +71 -0
  176. package/src/agent/schema-utils.js +85 -125
  177. package/src/agent/schema-utils.ts +148 -0
  178. package/src/agent/structured-output-error.js +34 -33
  179. package/src/agent/structured-output-error.ts +105 -0
  180. package/src/agent/validation-platform.js +27 -27
  181. package/src/agent/validation-platform.ts +49 -0
  182. package/src/agents/git-pusher-template.js +17 -34
  183. package/src/attach/attach-client.js +232 -405
  184. package/src/attach/attach-client.ts +300 -0
  185. package/src/attach/attach-server-cleanup.js +43 -0
  186. package/src/attach/attach-server-cleanup.ts +39 -0
  187. package/src/attach/attach-server-clients.js +117 -0
  188. package/src/attach/attach-server-clients.ts +122 -0
  189. package/src/attach/attach-server-events.js +38 -0
  190. package/src/attach/attach-server-events.ts +36 -0
  191. package/src/attach/attach-server-pty.js +45 -0
  192. package/src/attach/attach-server-pty.ts +64 -0
  193. package/src/attach/attach-server-runtime.js +73 -0
  194. package/src/attach/attach-server-runtime.ts +62 -0
  195. package/src/attach/attach-server-socket.js +28 -0
  196. package/src/attach/attach-server-socket.ts +23 -0
  197. package/src/attach/attach-server-types.js +2 -0
  198. package/src/attach/attach-server-types.ts +82 -0
  199. package/src/attach/attach-server.js +106 -523
  200. package/src/attach/attach-server.ts +158 -0
  201. package/src/attach/index.js +18 -35
  202. package/src/attach/index.ts +18 -0
  203. package/src/attach/protocol.js +95 -184
  204. package/src/attach/protocol.ts +181 -0
  205. package/src/attach/ring-buffer.js +76 -102
  206. package/src/attach/ring-buffer.ts +109 -0
  207. package/src/attach/send-input.js +64 -75
  208. package/src/attach/send-input.ts +94 -0
  209. package/src/attach/socket-discovery.js +164 -218
  210. package/src/attach/socket-discovery.ts +230 -0
  211. package/src/attach/socket-paths.js +42 -61
  212. package/src/attach/socket-paths.ts +81 -0
  213. package/src/claude-credentials.js +51 -54
  214. package/src/claude-credentials.ts +89 -0
  215. package/src/cluster/generated/protocol-schema.ts +1 -1
  216. package/src/cluster/generated/protocol.ts +2 -1
  217. package/src/command-proofs.js +110 -141
  218. package/src/command-proofs.ts +216 -0
  219. package/src/config-router.js +81 -73
  220. package/src/config-router.ts +131 -0
  221. package/src/copy-containment.js +191 -0
  222. package/src/copy-containment.ts +259 -0
  223. package/src/copy-worker.js +53 -30
  224. package/src/copy-worker.ts +88 -0
  225. package/src/darwin-keychain-boundary.js +80 -111
  226. package/src/darwin-keychain-boundary.ts +148 -0
  227. package/src/guidance-topics.js +4 -5
  228. package/src/guidance-topics.ts +10 -0
  229. package/src/input-helpers.js +33 -54
  230. package/src/input-helpers.ts +58 -0
  231. package/src/isolation-manager.js +59 -20
  232. package/src/ledger-sequence.js +45 -48
  233. package/src/ledger-sequence.ts +63 -0
  234. package/src/legacy-lib/clusters-registry.ts +40 -0
  235. package/src/legacy-lib/completion.ts +148 -0
  236. package/src/legacy-lib/compose-utils.ts +102 -0
  237. package/src/legacy-lib/detached-startup.ts +451 -0
  238. package/src/legacy-lib/docker-config.ts +282 -0
  239. package/src/legacy-lib/docker-env-auth.ts +116 -0
  240. package/src/legacy-lib/git-remote-utils.ts +244 -0
  241. package/src/legacy-lib/id-detector.ts +57 -0
  242. package/src/legacy-lib/js-yaml.d.ts +3 -0
  243. package/src/legacy-lib/omelette.d.ts +15 -0
  244. package/src/legacy-lib/path-check.ts +89 -0
  245. package/src/legacy-lib/process-liveness.ts +36 -0
  246. package/src/legacy-lib/provider-credential-path.ts +57 -0
  247. package/src/legacy-lib/provider-defaults.ts +114 -0
  248. package/src/legacy-lib/provider-detection.ts +67 -0
  249. package/src/legacy-lib/provider-names.ts +126 -0
  250. package/src/legacy-lib/repo-settings.ts +88 -0
  251. package/src/legacy-lib/run-mode.ts +58 -0
  252. package/src/legacy-lib/run-plan.ts +49 -0
  253. package/src/legacy-lib/settings/claude-auth.ts +80 -0
  254. package/src/legacy-lib/settings-defaults.ts +212 -0
  255. package/src/legacy-lib/settings-error.ts +8 -0
  256. package/src/legacy-lib/settings-issue-providers.ts +18 -0
  257. package/src/legacy-lib/settings-models.ts +124 -0
  258. package/src/legacy-lib/settings-storage.ts +277 -0
  259. package/src/legacy-lib/settings-validation.ts +220 -0
  260. package/src/legacy-lib/settings.ts +87 -0
  261. package/src/legacy-lib/setup-apply-types.ts +70 -0
  262. package/src/legacy-lib/setup-apply.ts +456 -0
  263. package/src/legacy-lib/setup-journal.ts +185 -0
  264. package/src/legacy-lib/setup-plan-types.ts +96 -0
  265. package/src/legacy-lib/setup-plan.ts +500 -0
  266. package/src/legacy-lib/setup-undo.ts +142 -0
  267. package/src/legacy-lib/start-cluster-config.ts +124 -0
  268. package/src/legacy-lib/start-cluster-environment.ts +166 -0
  269. package/src/legacy-lib/start-cluster-run-options.ts +281 -0
  270. package/src/legacy-lib/start-cluster.ts +237 -0
  271. package/src/legacy-lib/stream-json-parser.ts +88 -0
  272. package/src/message-buffer.js +55 -71
  273. package/src/message-buffer.ts +107 -0
  274. package/src/message-bus-bridge.js +92 -133
  275. package/src/message-bus-bridge.ts +149 -0
  276. package/src/name-generator-shared.js +220 -0
  277. package/src/name-generator-shared.ts +231 -0
  278. package/src/name-generator.js +8 -217
  279. package/src/name-generator.ts +27 -0
  280. package/src/omp-blob-root.js +83 -64
  281. package/src/omp-blob-root.ts +116 -0
  282. package/src/omp-config-overlay.js +65 -38
  283. package/src/omp-config-overlay.ts +110 -0
  284. package/src/omp-execution-fingerprint.js +38 -43
  285. package/src/omp-execution-fingerprint.ts +92 -0
  286. package/src/omp-session-limits.js +10 -15
  287. package/src/omp-session-limits.ts +53 -0
  288. package/src/omp-session-partition.js +2 -2
  289. package/src/omp-session-verifier.js +1 -1
  290. package/src/orchestrator.js +32 -7
  291. package/src/pr-body-template.js +71 -0
  292. package/src/providers/anthropic/index.js +3 -1
  293. package/src/providers/anthropic/index.ts +13 -0
  294. package/src/providers/capabilities.js +19 -27
  295. package/src/providers/capabilities.ts +44 -0
  296. package/src/providers/google/index.js +3 -1
  297. package/src/providers/google/index.ts +13 -0
  298. package/src/providers/openai/index.js +3 -1
  299. package/src/providers/openai/index.ts +13 -0
  300. package/src/providers/opencode/index.js +3 -1
  301. package/src/providers/opencode/index.ts +13 -0
  302. package/src/quality-gates.js +67 -127
  303. package/src/quality-gates.ts +149 -0
  304. package/src/repo-settings-access.js +40 -0
  305. package/src/repo-settings-access.ts +64 -0
  306. package/src/schemas/sub-cluster.js +127 -183
  307. package/src/schemas/sub-cluster.ts +238 -0
  308. package/src/state-snapshot-normalization.js +224 -0
  309. package/src/state-snapshot-normalization.ts +222 -0
  310. package/src/state-snapshot.js +192 -359
  311. package/src/state-snapshot.ts +291 -0
  312. package/src/state-snapshotter.js +118 -130
  313. package/src/state-snapshotter.ts +167 -0
  314. package/src/sub-cluster-wrapper.js +4 -13
  315. package/src/task-run-model-args.js +87 -124
  316. package/src/task-run-model-args.ts +204 -0
  317. package/src/task-runner.js +5 -25
  318. package/src/task-runner.ts +28 -0
  319. package/src/task-startup-error.js +73 -58
  320. package/src/task-startup-error.ts +126 -0
  321. package/src/template-validation/consensus-gate-contracts.js +2 -0
  322. package/src/template-validation/consensus-gate-contracts.ts +70 -0
  323. package/src/template-validation/consensus-gate-scenarios.js +76 -0
  324. package/src/template-validation/consensus-gate-scenarios.ts +130 -0
  325. package/src/template-validation/consensus-gate-stage.js +34 -0
  326. package/src/template-validation/consensus-gate-stage.ts +56 -0
  327. package/src/template-validation/random-topology-contracts.js +2 -0
  328. package/src/template-validation/random-topology-contracts.ts +54 -0
  329. package/src/template-validation/random-topology-dispatch.js +25 -0
  330. package/src/template-validation/random-topology-dispatch.ts +33 -0
  331. package/src/template-validation/random-topology-message-loop.js +53 -0
  332. package/src/template-validation/random-topology-message-loop.ts +73 -0
  333. package/src/template-validation/random-topology-operations.js +79 -0
  334. package/src/template-validation/random-topology-operations.ts +101 -0
  335. package/src/template-validation/random-topology-runtime.js +25 -0
  336. package/src/template-validation/random-topology-runtime.ts +43 -0
  337. package/src/template-validation/random-topology-scenario.js +52 -0
  338. package/src/template-validation/random-topology-scenario.ts +57 -0
  339. package/src/template-validation/random-topology-schema.js +159 -0
  340. package/src/template-validation/random-topology-schema.ts +190 -0
  341. package/src/template-validation/random-topology-state.js +28 -0
  342. package/src/template-validation/random-topology-state.ts +30 -0
  343. package/src/template-validation/random-topology-trigger-evaluation.js +45 -0
  344. package/src/template-validation/random-topology-trigger-evaluation.ts +65 -0
  345. package/src/template-validation/random-topology-trigger.js +75 -0
  346. package/src/template-validation/random-topology-trigger.ts +88 -0
  347. package/src/template-validation/report-formatter.js +40 -46
  348. package/src/template-validation/report-formatter.ts +101 -0
  349. package/src/template-validation/simulate-consensus-gates.js +111 -302
  350. package/src/template-validation/simulate-consensus-gates.ts +196 -0
  351. package/src/template-validation/simulate-random-topology.js +26 -519
  352. package/src/template-validation/simulate-random-topology.ts +57 -0
  353. package/src/template-validation/simulate-two-stage-validation.js +41 -265
  354. package/src/template-validation/simulate-two-stage-validation.ts +55 -0
  355. package/src/template-validation/simulation-agent-runtime.js +25 -0
  356. package/src/template-validation/simulation-agent-runtime.ts +40 -0
  357. package/src/template-validation/simulation-agent.js +29 -0
  358. package/src/template-validation/simulation-agent.ts +73 -0
  359. package/src/template-validation/simulation-runtime.js +34 -0
  360. package/src/template-validation/simulation-runtime.ts +72 -0
  361. package/src/template-validation/two-stage-contracts.js +2 -0
  362. package/src/template-validation/two-stage-contracts.ts +41 -0
  363. package/src/template-validation/two-stage-inputs.js +21 -0
  364. package/src/template-validation/two-stage-inputs.ts +29 -0
  365. package/src/template-validation/two-stage-results.js +30 -0
  366. package/src/template-validation/two-stage-results.ts +40 -0
  367. package/src/template-validation/two-stage-scenario.js +86 -0
  368. package/src/template-validation/two-stage-scenario.ts +120 -0
  369. package/src/worktree-claude-config.js +182 -220
  370. package/src/worktree-claude-config.ts +272 -0
  371. package/src/worktree-tooling-env.js +103 -125
  372. package/src/worktree-tooling-env.ts +142 -0
  373. package/task-lib/completion.js +2 -3
  374. package/task-lib/completion.ts +9 -0
  375. package/task-lib/config.js +1 -4
  376. package/task-lib/config.ts +11 -0
  377. package/task-lib/name-generator.js +4 -226
  378. package/task-lib/name-generator.ts +11 -0
  379. package/task-lib/omp-session-cleanup.js +1 -1
  380. package/task-lib/omp-storage-root.js +8 -12
  381. package/task-lib/omp-storage-root.ts +62 -0
  382. package/task-lib/process-termination.js +143 -166
  383. package/task-lib/process-termination.ts +268 -0
@@ -0,0 +1,285 @@
1
+ /** Agent configuration validation and defaults. */
2
+
3
+ import qualityGateSchema = require('./agent-quality-gate-schema');
4
+ import settingsFacade = require('./agent-config-settings');
5
+
6
+ type ModelLevel = 'level1' | 'level2' | 'level3';
7
+ type JsonSchemaType = 'array' | 'boolean' | 'integer' | 'number' | 'object' | 'string';
8
+
9
+ interface JsonSchema {
10
+ type?: JsonSchemaType;
11
+ description?: string;
12
+ enum?: string[];
13
+ items?: JsonSchema;
14
+ properties?: Record<string, JsonSchema>;
15
+ required?: string[];
16
+ anyOf?: JsonSchema[];
17
+ }
18
+
19
+ interface ModelRule extends Record<string, unknown> {
20
+ iterations?: unknown;
21
+ model?: string;
22
+ modelLevel?: string;
23
+ }
24
+
25
+ interface PromptRule extends Record<string, unknown> {}
26
+
27
+ interface PromptOptions extends Record<string, unknown> {
28
+ initial?: string;
29
+ subsequent?: string;
30
+ iterations?: PromptRule[];
31
+ system?: string;
32
+ }
33
+
34
+ interface AgentTrigger extends Record<string, unknown> {
35
+ action?: string;
36
+ }
37
+
38
+ interface AgentConfig extends Record<string, unknown> {
39
+ id: string;
40
+ outputFormat?: string;
41
+ structuredOutput?: JsonSchema;
42
+ jsonSchema?: JsonSchema;
43
+ modelRules?: ModelRule[];
44
+ model?: string;
45
+ modelLevel?: string;
46
+ strictSchema?: boolean;
47
+ prompt?: string | PromptOptions | null;
48
+ timeout?: number | string | null;
49
+ maxIterations?: number;
50
+ staleDuration?: number;
51
+ enableLivenessCheck?: boolean;
52
+ triggers?: AgentTrigger[];
53
+ role?: string;
54
+ requiredQualityGates?: unknown;
55
+ hooks?: {
56
+ onComplete?: {
57
+ config?: {
58
+ content?: {
59
+ data?: {
60
+ qualityGates?: unknown;
61
+ [key: string]: unknown;
62
+ };
63
+ };
64
+ };
65
+ };
66
+ };
67
+ }
68
+
69
+ interface AgentConfigOptions extends Record<string, unknown> {
70
+ mockSpawnFn?: unknown;
71
+ taskRunner?: unknown;
72
+ testMode?: boolean;
73
+ }
74
+
75
+ type SettingsRecord = ReturnType<typeof settingsFacade.loadSettings>;
76
+
77
+ interface StaticModelConfig {
78
+ type: 'static';
79
+ model: string | null;
80
+ modelLevel: string | null;
81
+ }
82
+
83
+ interface RulesModelConfig {
84
+ type: 'rules';
85
+ rules: ModelRule[];
86
+ }
87
+
88
+ type ModelConfig = StaticModelConfig | RulesModelConfig;
89
+ type PromptConfig =
90
+ | { type: 'static'; system: string }
91
+ | { type: 'rules'; rules: PromptRule[] }
92
+ | null;
93
+
94
+ type NormalizedAgentConfig = Omit<AgentConfig, 'timeout'> & {
95
+ modelConfig: ModelConfig;
96
+ promptConfig: PromptConfig;
97
+ maxIterations: number;
98
+ timeout: number;
99
+ staleDuration: number;
100
+ enableLivenessCheck: boolean;
101
+ };
102
+
103
+ const VALID_LEVELS: readonly ModelLevel[] = ['level1', 'level2', 'level3'];
104
+ const DEFAULT_MAX_ITERATIONS = 100;
105
+ const DEFAULT_TIMEOUT = 0;
106
+ const DEFAULT_STALE_DURATION_MS = 30 * 60 * 1000;
107
+ const DEFAULT_LIVENESS_CHECK_ENABLED = false;
108
+
109
+ function isRecord(value: unknown): value is Record<string, unknown> {
110
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
111
+ }
112
+
113
+ function isModelLevel(value: string): value is ModelLevel {
114
+ return value === 'level1' || value === 'level2' || value === 'level3';
115
+ }
116
+
117
+ const { loadSettings, validateModelAgainstMax, VALID_MODELS } = settingsFacade;
118
+ const { applyValidatorQualityGateDefaults } = qualityGateSchema;
119
+
120
+ function applyOutputDefaults(config: AgentConfig): void {
121
+ if (!config.outputFormat) config.outputFormat = 'json';
122
+ if (config.structuredOutput && !config.jsonSchema) config.jsonSchema = config.structuredOutput;
123
+ if (config.outputFormat === 'json' && !config.jsonSchema) {
124
+ config.jsonSchema = {
125
+ type: 'object',
126
+ properties: {
127
+ summary: { type: 'string', description: 'Brief summary of what was done' },
128
+ result: { type: 'string', description: 'Detailed result or output' },
129
+ },
130
+ required: ['summary', 'result'],
131
+ };
132
+ }
133
+ applyValidatorQualityGateDefaults(config);
134
+ }
135
+
136
+ function buildModelConfig(config: AgentConfig): ModelConfig {
137
+ if (config.modelRules) return { type: 'rules', rules: config.modelRules };
138
+ return { type: 'static', model: config.model || null, modelLevel: config.modelLevel || null };
139
+ }
140
+
141
+ function applyStrictSchemaDefault(config: AgentConfig, settings: SettingsRecord): void {
142
+ if (config.strictSchema === undefined) config.strictSchema = settings.strictSchema !== false;
143
+ }
144
+
145
+ function errorMessage(error: unknown): unknown {
146
+ return isRecord(error) ? error.message : undefined;
147
+ }
148
+
149
+ function validateStaticModelConfig(
150
+ configId: string,
151
+ modelConfig: StaticModelConfig,
152
+ maxModel: string,
153
+ minModel: string | null
154
+ ): void {
155
+ if (modelConfig.model && VALID_MODELS.includes(modelConfig.model)) {
156
+ try {
157
+ validateModelAgainstMax(modelConfig.model, maxModel, minModel);
158
+ } catch (error: unknown) {
159
+ throw new Error(`Agent "${configId}": ${String(errorMessage(error))}`);
160
+ }
161
+ }
162
+ if (modelConfig.modelLevel && !isModelLevel(modelConfig.modelLevel)) {
163
+ throw new Error(
164
+ `Agent "${configId}": invalid modelLevel "${modelConfig.modelLevel}". Valid: ${VALID_LEVELS.join(', ')}`
165
+ );
166
+ }
167
+ }
168
+
169
+ function validateModelRule(
170
+ configId: string,
171
+ rule: ModelRule,
172
+ maxModel: string,
173
+ minModel: string | null
174
+ ): void {
175
+ if (rule.model && VALID_MODELS.includes(rule.model)) {
176
+ try {
177
+ validateModelAgainstMax(rule.model, maxModel, minModel);
178
+ } catch {
179
+ throw new Error(
180
+ `Agent "${configId}": modelRule "${String(rule.iterations)}" requests "${rule.model}" ` +
181
+ `but maxModel is "${maxModel}"${minModel ? ` and minModel is "${minModel}"` : ''}. ` +
182
+ `Either adjust the rule's model or change maxModel/minModel settings.`
183
+ );
184
+ }
185
+ }
186
+ if (rule.modelLevel && !isModelLevel(rule.modelLevel)) {
187
+ throw new Error(
188
+ `Agent "${configId}": modelRule "${String(rule.iterations)}" has invalid modelLevel ` +
189
+ `"${rule.modelLevel}". Valid: ${VALID_LEVELS.join(', ')}`
190
+ );
191
+ }
192
+ }
193
+
194
+ function validateModelConfig(
195
+ config: AgentConfig,
196
+ modelConfig: ModelConfig,
197
+ maxModel: string,
198
+ minModel: string | null
199
+ ): void {
200
+ if (modelConfig.type === 'static') {
201
+ validateStaticModelConfig(config.id, modelConfig, maxModel, minModel);
202
+ } else {
203
+ for (const rule of modelConfig.rules) validateModelRule(config.id, rule, maxModel, minModel);
204
+ }
205
+ }
206
+
207
+ function buildInitialPromptRules(prompt: PromptOptions): PromptRule[] | null {
208
+ if (!prompt.initial && !prompt.subsequent) return null;
209
+ const rules: PromptRule[] = [];
210
+ if (prompt.initial) rules.push({ match: '1', system: prompt.initial });
211
+ if (prompt.subsequent) rules.push({ match: '2+', system: prompt.subsequent });
212
+ return rules;
213
+ }
214
+
215
+ function buildPromptConfig(config: AgentConfig): PromptConfig {
216
+ const prompt = config.prompt;
217
+ if (prompt && typeof prompt !== 'string' && prompt.iterations) {
218
+ return { type: 'rules', rules: prompt.iterations };
219
+ }
220
+ if (prompt && typeof prompt !== 'string') {
221
+ const initialRules = buildInitialPromptRules(prompt);
222
+ if (initialRules) return { type: 'rules', rules: initialRules };
223
+ }
224
+ if (typeof prompt === 'string') return { type: 'static', system: prompt };
225
+ if (prompt?.system) return { type: 'static', system: prompt.system };
226
+ if (prompt) throw new Error(`Agent "${config.id}": invalid prompt format`);
227
+ return null;
228
+ }
229
+
230
+ function normalizeTimeout(config: AgentConfig): number {
231
+ const timeout =
232
+ config.timeout === undefined || config.timeout === null || config.timeout === ''
233
+ ? DEFAULT_TIMEOUT
234
+ : Number(config.timeout);
235
+ config.timeout = timeout;
236
+ if (!Number.isFinite(timeout) || timeout < 0) {
237
+ throw new Error(
238
+ `Agent "${config.id}": timeout must be a non-negative number (got ${timeout}).`
239
+ );
240
+ }
241
+ return timeout;
242
+ }
243
+
244
+ function assertTestModeSafety(config: AgentConfig, options: AgentConfigOptions): void {
245
+ const executesTask = config.triggers?.some(
246
+ (trigger) => !trigger.action || trigger.action === 'execute_task'
247
+ );
248
+ if (options.testMode && !options.mockSpawnFn && !options.taskRunner && executesTask) {
249
+ throw new Error(
250
+ `AgentWrapper: testMode=true but no mockSpawnFn/taskRunner provided for agent '${config.id}'. ` +
251
+ `This would cause real Claude API calls. ABORTING.`
252
+ );
253
+ }
254
+ }
255
+
256
+ function validateAgentConfig(
257
+ config: AgentConfig,
258
+ options: AgentConfigOptions = {}
259
+ ): NormalizedAgentConfig {
260
+ applyOutputDefaults(config);
261
+ const modelConfig = buildModelConfig(config);
262
+ const settings = loadSettings();
263
+ const minModel = settings.minModel || null;
264
+ applyStrictSchemaDefault(config, settings);
265
+ validateModelConfig(config, modelConfig, settings.maxModel, minModel);
266
+ const promptConfig = buildPromptConfig(config);
267
+ const timeout = normalizeTimeout(config);
268
+ assertTestModeSafety(config, options);
269
+ return {
270
+ ...config,
271
+ modelConfig,
272
+ promptConfig,
273
+ maxIterations: config.maxIterations || DEFAULT_MAX_ITERATIONS,
274
+ timeout,
275
+ staleDuration: config.staleDuration || DEFAULT_STALE_DURATION_MS,
276
+ enableLivenessCheck: config.enableLivenessCheck ?? DEFAULT_LIVENESS_CHECK_ENABLED,
277
+ };
278
+ }
279
+
280
+ export = {
281
+ validateAgentConfig,
282
+ DEFAULT_MAX_ITERATIONS,
283
+ DEFAULT_STALE_DURATION_MS,
284
+ DEFAULT_LIVENESS_CHECK_ENABLED,
285
+ };
@@ -1,278 +1,43 @@
1
- /**
2
- * AgentContextBuilder - Build agent execution context from ledger
3
- *
4
- * Provides:
5
- * - Context assembly from multiple message sources
6
- * - Context strategy evaluation (topics, limits, since timestamps)
7
- * - Prompt injection and formatting
8
- * - Token-budgeted context packs
9
- * - Defensive context overflow prevention
10
- */
11
-
12
- // Defensive limit: 500,000 chars ≈ 125k tokens (safe buffer below 200k limit)
13
- // Prevents "Prompt is too long" errors that kill tasks
1
+ "use strict";
2
+ const contextMetrics = require("./context-metrics");
3
+ const contextPackBuilder = require("./context-pack-builder");
4
+ const agentContextPacks = require("./agent-context-packs");
14
5
  const MAX_CONTEXT_CHARS = 500000;
15
- const {
16
- buildContextMetrics,
17
- emitContextMetrics,
18
- resolveLegacyMaxTokens,
19
- updateTotalMetrics,
20
- } = require('./context-metrics');
21
- const { buildContextPacks } = require('./context-pack-builder');
22
- const { buildSourcePack } = require('./agent-context-sources');
23
- const {
24
- buildHeaderContext,
25
- buildInstructionsSection,
26
- buildJsonSchemaSection,
27
- buildLegacyOutputSchemaSection,
28
- buildRepoToolingSection,
29
- buildTriggeringMessageSection,
30
- buildValidatorSkipSection,
31
- } = require('./agent-context-sections');
32
- const { buildRequiredQualityGatesSection } = require('./agent-quality-gates-context');
33
- const { buildCommandProofsSection } = require('./agent-command-proofs-context');
34
-
35
- function pushStaticPack({ packs, packId, section, text, order, options = {} }) {
36
- if (!text) {
37
- return order;
38
- }
39
-
40
- packs.push({
41
- id: packId,
42
- section,
43
- priority: 'required',
44
- order,
45
- preserve: options.preserve || false,
46
- render: () => text,
47
- });
48
-
49
- return order + 1;
50
- }
51
-
52
- function appendSourcePacks(packs, strategy, params, startingOrder) {
53
- if (!Array.isArray(strategy.sources)) {
54
- return startingOrder;
55
- }
56
-
57
- let order = startingOrder;
58
- strategy.sources.forEach((source, index) => {
59
- packs.push({ ...buildSourcePack({ source, index, ...params }), order });
60
- order += 1;
61
- });
62
-
63
- return order;
64
- }
65
-
66
- function buildStaticSections(params) {
67
- const {
68
- id,
69
- role,
70
- iteration,
71
- config,
72
- selectedPrompt,
73
- queuedGuidance,
74
- messageBus,
75
- cluster,
76
- triggeringMessage,
77
- worktree,
78
- isolation,
79
- } = params;
80
- const isIsolated = !!(worktree?.enabled || isolation?.enabled);
81
-
82
- return {
83
- header: buildHeaderContext({ id, role, iteration, isIsolated }),
84
- instructions: buildInstructionsSection({ config, selectedPrompt, id }),
85
- repoTooling: buildRepoToolingSection({ config, worktree }),
86
- commandProofs: buildCommandProofsSection(config),
87
- legacyOutputSchema: buildLegacyOutputSchemaSection(config),
88
- queuedGuidance: queuedGuidance || '',
89
- requiredQualityGates: buildRequiredQualityGatesSection(config),
90
- jsonSchema: buildJsonSchemaSection(config),
91
- validatorSkip: buildValidatorSkipSection({ role, messageBus, cluster, isolation }),
92
- triggeringMessage: buildTriggeringMessageSection(triggeringMessage),
93
- };
94
- }
95
-
96
- function buildPacks(params) {
97
- const { strategy, messageBus, cluster, lastTaskEndTime, lastAgentStartTime, triggeringMessage } =
98
- params;
99
- const sections = buildStaticSections(params);
100
- const packs = [];
101
- let order = 0;
102
- const staticPackIds = [
103
- 'header',
104
- 'instructions',
105
- 'repoTooling',
106
- 'commandProofs',
107
- 'queuedGuidance',
108
- 'legacyOutputSchema',
109
- 'requiredQualityGates',
110
- 'jsonSchema',
111
- ];
112
-
113
- for (const packId of staticPackIds) {
114
- order = pushStaticPack({ packs, packId, section: packId, text: sections[packId], order });
115
- }
116
-
117
- order = appendSourcePacks(
118
- packs,
119
- strategy,
120
- {
121
- messageBus,
122
- cluster,
123
- lastTaskEndTime,
124
- lastAgentStartTime,
125
- throughId: params.contextThroughId,
126
- triggeringMessageId: triggeringMessage?.id,
127
- },
128
- order
129
- );
130
- order = pushStaticPack({
131
- packs,
132
- packId: 'validatorSkip',
133
- section: 'validatorSkip',
134
- text: sections.validatorSkip,
135
- order,
136
- });
137
- pushStaticPack({
138
- packs,
139
- packId: 'triggeringMessage',
140
- section: 'triggeringMessage',
141
- text: sections.triggeringMessage,
142
- order,
143
- options: { preserve: true },
144
- });
145
-
146
- return packs;
147
- }
148
-
149
- function buildContinuationPacks(params) {
150
- const {
151
- id,
152
- iteration,
153
- config,
154
- selectedPrompt,
155
- queuedGuidance,
156
- triggeringMessage,
157
- strategy,
158
- messageBus,
159
- cluster,
160
- lastTaskEndTime,
161
- lastAgentStartTime,
162
- continuationSequence,
163
- contextThroughId,
164
- previousPromptIdentity,
165
- currentPromptIdentity,
166
- } = params;
167
- const packs = [];
168
- let order = 0;
169
-
170
- order = pushStaticPack({
171
- packs,
172
- packId: 'continuationHeader',
173
- section: 'continuationHeader',
174
- text: `## Continuation Turn\n\nAgent: ${id}\nIteration: ${iteration}\n\nApply only the new material below while retaining the existing session instructions.\n\n`,
175
- order,
176
- });
177
-
178
- // Iteration-rule prompts may intentionally change between turns. Static prompts,
179
- // repository tooling, ISSUE_OPENED/PLAN_READY sources, and output contracts are
180
- // already present in the provider session and must not be replayed.
181
- if (config.promptConfig?.type === 'rules' && currentPromptIdentity !== previousPromptIdentity) {
182
- order = pushStaticPack({
183
- packs,
184
- packId: 'iterationInstructions',
185
- section: 'iterationInstructions',
186
- text: buildInstructionsSection({ config, selectedPrompt, id }),
187
- order,
188
- });
189
- }
190
-
191
- order = pushStaticPack({
192
- packs,
193
- packId: 'queuedGuidance',
194
- section: 'queuedGuidance',
195
- text: queuedGuidance || '',
196
- order,
197
- });
198
- order = appendSourcePacks(
199
- packs,
200
- strategy,
201
- {
202
- messageBus,
203
- cluster,
204
- lastTaskEndTime,
205
- lastAgentStartTime,
206
- afterId: continuationSequence,
207
- throughId: contextThroughId,
208
- triggeringMessageId: triggeringMessage?.id,
209
- },
210
- order
211
- );
212
- pushStaticPack({
213
- packs,
214
- packId: 'triggeringMessage',
215
- section: 'triggeringMessage',
216
- text: buildTriggeringMessageSection(triggeringMessage),
217
- order,
218
- options: { preserve: true },
219
- });
220
-
221
- return packs;
222
- }
223
-
224
- /**
225
- * Build execution context for an agent
226
- * @param {object} params - Context building parameters
227
- * @param {string} params.id - Agent ID
228
- * @param {string} params.role - Agent role
229
- * @param {number} params.iteration - Current iteration number
230
- * @param {any} params.config - Agent configuration
231
- * @param {any} params.messageBus - Message bus for querying ledger
232
- * @param {any} params.cluster - Cluster object
233
- * @param {number} [params.lastTaskEndTime] - Timestamp of last task completion
234
- * @param {number} [params.lastAgentStartTime] - Timestamp when this agent last started work
235
- * @param {any} params.triggeringMessage - Message that triggered this execution
236
- * @param {string} [params.selectedPrompt] - Pre-selected prompt from _selectPrompt() (iteration-based)
237
- * @param {object} [params.worktree] - Worktree isolation state (if running in worktree mode)
238
- * @param {object} [params.isolation] - Docker isolation state (if running in Docker mode)
239
- * @returns {string} Assembled context string
240
- */
6
+ const { buildContextMetrics, emitContextMetrics, resolveLegacyMaxTokens, updateTotalMetrics } = contextMetrics;
7
+ const { buildContextPacks } = contextPackBuilder;
8
+ const { buildAgentContextPacks } = agentContextPacks;
241
9
  function buildContext(params) {
242
- const strategy = params.config.contextStrategy || { sources: [] };
243
- const continuation = params.mode === 'continuation';
244
- const packs = continuation
245
- ? buildContinuationPacks({ ...params, strategy })
246
- : buildPacks({ ...params, strategy });
247
- const maxTokens = resolveLegacyMaxTokens(strategy);
248
- const packResult = buildContextPacks({
249
- packs,
250
- maxTokens,
251
- maxChars: MAX_CONTEXT_CHARS,
252
- });
253
-
254
- const metrics = buildContextMetrics({
255
- clusterId: params.cluster.id,
256
- agentId: params.id,
257
- role: params.role,
258
- iteration: params.iteration,
259
- triggeringMessage: params.triggeringMessage,
260
- strategy: { ...strategy, contextMode: continuation ? 'continuation' : 'full' },
261
- packs: packResult.packDecisions,
262
- budget: packResult.budget,
263
- truncation: packResult.truncation,
264
- });
265
-
266
- updateTotalMetrics(metrics, packResult.context.length);
267
- emitContextMetrics(metrics, {
268
- messageBus: params.messageBus,
269
- clusterId: params.cluster.id,
270
- agentId: params.id,
271
- });
272
-
273
- return packResult.context;
10
+ const strategy = params.config.contextStrategy || { sources: [] };
11
+ const continuation = params.mode === 'continuation';
12
+ const packs = buildAgentContextPacks(params, strategy, continuation);
13
+ const maxTokens = resolveLegacyMaxTokens(strategy);
14
+ const packResult = buildContextPacks({
15
+ packs,
16
+ maxTokens,
17
+ maxChars: MAX_CONTEXT_CHARS,
18
+ });
19
+ const metrics = buildContextMetrics({
20
+ clusterId: params.cluster.id,
21
+ agentId: params.id,
22
+ role: params.role,
23
+ iteration: params.iteration,
24
+ triggeringMessage: params.triggeringMessage,
25
+ strategy: {
26
+ ...strategy,
27
+ contextMode: continuation ? 'continuation' : 'full',
28
+ },
29
+ packs: packResult.packDecisions,
30
+ budget: packResult.budget,
31
+ truncation: packResult.truncation,
32
+ });
33
+ updateTotalMetrics(metrics, packResult.context.length);
34
+ emitContextMetrics(metrics, {
35
+ messageBus: params.messageBus,
36
+ clusterId: params.cluster.id,
37
+ agentId: params.id,
38
+ });
39
+ return packResult.context;
274
40
  }
275
-
276
41
  module.exports = {
277
- buildContext,
42
+ buildContext,
278
43
  };
@@ -0,0 +1,51 @@
1
+ import contextMetrics = require('./context-metrics');
2
+ import contextPackBuilder = require('./context-pack-builder');
3
+ import agentContextPacks = require('./agent-context-packs');
4
+
5
+ import type { BuildContextParams, ContextStrategy } from './agent-context-types';
6
+
7
+ const MAX_CONTEXT_CHARS = 500000;
8
+ const { buildContextMetrics, emitContextMetrics, resolveLegacyMaxTokens, updateTotalMetrics } =
9
+ contextMetrics;
10
+ const { buildContextPacks } = contextPackBuilder;
11
+ const { buildAgentContextPacks } = agentContextPacks;
12
+
13
+ function buildContext(params: BuildContextParams): string {
14
+ const strategy: ContextStrategy = params.config.contextStrategy || { sources: [] };
15
+ const continuation = params.mode === 'continuation';
16
+ const packs = buildAgentContextPacks(params, strategy, continuation);
17
+ const maxTokens = resolveLegacyMaxTokens(strategy);
18
+ const packResult = buildContextPacks({
19
+ packs,
20
+ maxTokens,
21
+ maxChars: MAX_CONTEXT_CHARS,
22
+ });
23
+
24
+ const metrics = buildContextMetrics({
25
+ clusterId: params.cluster.id,
26
+ agentId: params.id,
27
+ role: params.role,
28
+ iteration: params.iteration,
29
+ triggeringMessage: params.triggeringMessage,
30
+ strategy: {
31
+ ...strategy,
32
+ contextMode: continuation ? 'continuation' : 'full',
33
+ },
34
+ packs: packResult.packDecisions,
35
+ budget: packResult.budget,
36
+ truncation: packResult.truncation,
37
+ });
38
+
39
+ updateTotalMetrics(metrics, packResult.context.length);
40
+ emitContextMetrics(metrics, {
41
+ messageBus: params.messageBus,
42
+ clusterId: params.cluster.id,
43
+ agentId: params.id,
44
+ });
45
+
46
+ return packResult.context;
47
+ }
48
+
49
+ export = {
50
+ buildContext,
51
+ };