@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,165 +1,112 @@
1
- const { isReplayableMessage } = require('./context-replay-policy');
2
-
1
+ "use strict";
2
+ const replayPolicy = require("./context-replay-policy");
3
+ const { isReplayableMessage } = replayPolicy;
3
4
  function resolveSourceSince(source, cluster, lastTaskEndTime, lastAgentStartTime) {
4
- const sinceValue = source.since;
5
-
6
- if (sinceValue === 'cluster_start') {
7
- return cluster.createdAt;
8
- }
9
-
10
- if (sinceValue === 'last_task_end') {
11
- return lastTaskEndTime || cluster.createdAt;
12
- }
13
-
14
- if (sinceValue === 'last_agent_start') {
15
- return lastAgentStartTime ? lastAgentStartTime + 1 : cluster.createdAt;
16
- }
17
-
18
- if (typeof sinceValue === 'string') {
19
- const parsed = Date.parse(sinceValue);
20
- if (Number.isNaN(parsed)) {
21
- throw new Error(
22
- `Unknown context source "since" value "${sinceValue}" for topic ${source.topic}. ` +
23
- 'Use cluster_start, last_task_end, last_agent_start, or an ISO timestamp.'
24
- );
5
+ const sinceValue = source.since;
6
+ if (sinceValue === 'cluster_start') {
7
+ return cluster.createdAt;
25
8
  }
26
- return parsed;
27
- }
28
-
29
- return sinceValue;
9
+ if (sinceValue === 'last_task_end') {
10
+ return lastTaskEndTime || cluster.createdAt;
11
+ }
12
+ if (sinceValue === 'last_agent_start') {
13
+ return lastAgentStartTime ? lastAgentStartTime + 1 : cluster.createdAt;
14
+ }
15
+ if (typeof sinceValue === 'string') {
16
+ const parsed = Date.parse(sinceValue);
17
+ if (Number.isNaN(parsed)) {
18
+ throw new Error(`Unknown context source "since" value "${sinceValue}" for topic ${source.topic}. ` +
19
+ 'Use cluster_start, last_task_end, last_agent_start, or an ISO timestamp.');
20
+ }
21
+ return parsed;
22
+ }
23
+ return sinceValue;
30
24
  }
31
-
32
25
  function formatSourceMessagesSection(source, messages) {
33
- let context = `\n## Messages from topic: ${source.topic}\n\n`;
34
-
35
- for (const msg of messages) {
36
- context += `[${new Date(msg.timestamp).toISOString()}] ${msg.sender}:\n`;
37
- if (msg.content?.text) {
38
- context += `${msg.content.text}\n`;
39
- }
40
- if (msg.content?.data) {
41
- context += `Data: ${JSON.stringify(msg.content.data, null, 2)}\n`;
26
+ let context = `\n## Messages from topic: ${source.topic}\n\n`;
27
+ for (const msg of messages) {
28
+ context += `[${new Date(msg.timestamp).toISOString()}] ${msg.sender}:\n`;
29
+ if (msg.content?.text) {
30
+ context += `${msg.content.text}\n`;
31
+ }
32
+ if (msg.content?.data) {
33
+ context += `Data: ${JSON.stringify(msg.content.data, null, 2)}\n`;
34
+ }
35
+ context += '\n';
42
36
  }
43
- context += '\n';
44
- }
45
-
46
- return context;
37
+ return context;
47
38
  }
48
-
49
39
  function resolveSourceSelection(source, { compact = false } = {}) {
50
- const baseAmount = source.amount ?? source.limit;
51
- const baseStrategy = source.strategy ?? (baseAmount !== undefined ? 'latest' : 'all');
52
-
53
- if (!compact) {
54
- return { amount: baseAmount, strategy: baseStrategy };
55
- }
56
-
57
- return {
58
- amount: source.compactAmount ?? 1,
59
- strategy: source.compactStrategy ?? (baseStrategy === 'all' ? 'latest' : baseStrategy),
60
- };
40
+ const baseAmount = source.amount ?? source.limit;
41
+ const baseStrategy = source.strategy ?? (baseAmount !== undefined ? 'latest' : 'all');
42
+ if (!compact) {
43
+ return { amount: baseAmount, strategy: baseStrategy };
44
+ }
45
+ return {
46
+ amount: source.compactAmount ?? 1,
47
+ strategy: source.compactStrategy ?? (baseStrategy === 'all' ? 'latest' : baseStrategy),
48
+ };
61
49
  }
62
-
63
- function resolveSourceMessages({
64
- source,
65
- messageBus,
66
- cluster,
67
- lastTaskEndTime,
68
- lastAgentStartTime,
69
- afterId,
70
- throughId,
71
- triggeringMessageId,
72
- compact = false,
73
- }) {
74
- const sinceTimestamp = resolveSourceSince(
75
- source,
76
- cluster,
77
- lastTaskEndTime,
78
- lastAgentStartTime
79
- );
80
- const { amount, strategy } = resolveSourceSelection(source, { compact });
81
- const messages = messageBus.query({
82
- cluster_id: cluster.id,
83
- topic: source.topic,
84
- sender: source.sender,
85
- since: sinceTimestamp,
86
- afterId,
87
- throughId,
88
- });
89
- const replayableMessages = messages.filter(
90
- (message) => isReplayableMessage(message) && message.id !== triggeringMessageId
91
- );
92
-
93
- if (amount === undefined) {
94
- return replayableMessages;
95
- }
96
-
97
- if (strategy === 'latest') {
98
- return replayableMessages.slice(-amount);
99
- }
100
-
101
- return replayableMessages.slice(0, amount);
50
+ function resolveSourceMessages({ source, messageBus, cluster, lastTaskEndTime, lastAgentStartTime, afterId, throughId, triggeringMessageId, compact = false, }) {
51
+ const sinceTimestamp = resolveSourceSince(source, cluster, lastTaskEndTime, lastAgentStartTime);
52
+ const { amount, strategy } = resolveSourceSelection(source, { compact });
53
+ const messages = messageBus.query({
54
+ cluster_id: cluster.id,
55
+ topic: source.topic,
56
+ sender: source.sender,
57
+ since: sinceTimestamp,
58
+ afterId,
59
+ throughId,
60
+ });
61
+ const replayableMessages = messages.filter((message) => isReplayableMessage(message) && message.id !== triggeringMessageId);
62
+ if (amount === undefined) {
63
+ return replayableMessages;
64
+ }
65
+ if (strategy === 'latest') {
66
+ return replayableMessages.slice(-amount);
67
+ }
68
+ return replayableMessages.slice(0, amount);
102
69
  }
103
-
104
70
  const REQUIRED_TOPICS = new Set(['STATE_SNAPSHOT', 'ISSUE_OPENED', 'PLAN_READY']);
105
71
  const HIGH_PRIORITY_TOPICS = new Set(['VALIDATION_RESULT', 'IMPLEMENTATION_READY']);
106
-
107
72
  function resolveSourcePriority(source) {
108
- if (source.priority) {
109
- return source.priority;
110
- }
111
-
112
- if (REQUIRED_TOPICS.has(source.topic)) {
113
- return 'required';
114
- }
115
-
116
- if (HIGH_PRIORITY_TOPICS.has(source.topic)) {
117
- return 'high';
118
- }
119
-
120
- return 'medium';
121
- }
122
-
123
- function buildSourcePack({
124
- source,
125
- index,
126
- messageBus,
127
- cluster,
128
- lastTaskEndTime,
129
- lastAgentStartTime,
130
- afterId,
131
- throughId,
132
- triggeringMessageId,
133
- }) {
134
- const render = (compact) => {
135
- const messages = resolveSourceMessages({
136
- source,
137
- messageBus,
138
- cluster,
139
- lastTaskEndTime,
140
- lastAgentStartTime,
141
- afterId,
142
- throughId,
143
- triggeringMessageId,
144
- compact,
145
- });
146
-
147
- if (messages.length === 0) {
148
- return '';
73
+ if (source.priority) {
74
+ return source.priority;
149
75
  }
150
-
151
- return formatSourceMessagesSection(source, messages);
152
- };
153
-
154
- return {
155
- id: `source:${source.topic}:${index}`,
156
- section: 'sources',
157
- priority: resolveSourcePriority(source),
158
- render: () => render(false),
159
- compact: () => render(true),
160
- };
76
+ if (REQUIRED_TOPICS.has(source.topic)) {
77
+ return 'required';
78
+ }
79
+ if (HIGH_PRIORITY_TOPICS.has(source.topic)) {
80
+ return 'high';
81
+ }
82
+ return 'medium';
83
+ }
84
+ function buildSourcePack({ source, index, messageBus, cluster, lastTaskEndTime, lastAgentStartTime, afterId, throughId, triggeringMessageId, }) {
85
+ const render = (compact) => {
86
+ const messages = resolveSourceMessages({
87
+ source,
88
+ messageBus,
89
+ cluster,
90
+ lastTaskEndTime,
91
+ lastAgentStartTime,
92
+ afterId,
93
+ throughId,
94
+ triggeringMessageId,
95
+ compact,
96
+ });
97
+ if (messages.length === 0) {
98
+ return '';
99
+ }
100
+ return formatSourceMessagesSection(source, messages);
101
+ };
102
+ return {
103
+ id: `source:${source.topic}:${index}`,
104
+ section: 'sources',
105
+ priority: resolveSourcePriority(source),
106
+ render: () => render(false),
107
+ compact: () => render(true),
108
+ };
161
109
  }
162
-
163
110
  module.exports = {
164
- buildSourcePack,
111
+ buildSourcePack,
165
112
  };
@@ -0,0 +1,253 @@
1
+ import replayPolicy = require('./context-replay-policy');
2
+
3
+ type MessageTimestamp = string | number;
4
+
5
+ interface ReplayFields {
6
+ readonly contextSafe?: unknown;
7
+ readonly replayPolicy?: unknown;
8
+ readonly [key: string]: unknown;
9
+ }
10
+
11
+ interface ContextMessage {
12
+ readonly id?: unknown;
13
+ readonly topic?: unknown;
14
+ readonly timestamp: MessageTimestamp;
15
+ readonly sender: string;
16
+ readonly metadata?: ReplayFields | null;
17
+ readonly content?: {
18
+ readonly text?: string | null;
19
+ readonly data?: ReplayFields | null;
20
+ } | null;
21
+ }
22
+
23
+ interface ContextSource {
24
+ topic: string;
25
+ sender?: unknown;
26
+ since?: unknown;
27
+ amount?: number;
28
+ limit?: number;
29
+ strategy?: string;
30
+ compactAmount?: number;
31
+ compactStrategy?: string;
32
+ priority?: string;
33
+ }
34
+
35
+ interface SourceCluster {
36
+ id: string;
37
+ createdAt: number;
38
+ }
39
+
40
+ interface MessageQuery {
41
+ cluster_id: string;
42
+ topic: string;
43
+ sender?: unknown;
44
+ since?: unknown;
45
+ afterId?: unknown;
46
+ throughId?: unknown;
47
+ }
48
+
49
+ interface SourceMessageBus {
50
+ query(criteria: MessageQuery): ContextMessage[];
51
+ }
52
+
53
+ interface SourceSelectionOptions {
54
+ compact?: boolean;
55
+ }
56
+
57
+ interface SourceSelection {
58
+ amount: number | undefined;
59
+ strategy: string;
60
+ }
61
+
62
+ interface SourceMessageParams {
63
+ source: ContextSource;
64
+ messageBus: SourceMessageBus;
65
+ cluster: SourceCluster;
66
+ lastTaskEndTime?: number | null | undefined;
67
+ lastAgentStartTime?: number | null | undefined;
68
+ afterId?: unknown;
69
+ throughId?: unknown;
70
+ triggeringMessageId?: unknown;
71
+ compact?: boolean;
72
+ }
73
+
74
+ interface SourcePackParams extends Omit<SourceMessageParams, 'compact'> {
75
+ index: number;
76
+ }
77
+
78
+ interface SourcePack {
79
+ id: string;
80
+ section: 'sources';
81
+ priority: string;
82
+ render(): string;
83
+ compact(): string;
84
+ }
85
+
86
+ const { isReplayableMessage } = replayPolicy;
87
+
88
+ function resolveSourceSince(
89
+ source: ContextSource,
90
+ cluster: SourceCluster,
91
+ lastTaskEndTime: number | null | undefined,
92
+ lastAgentStartTime: number | null | undefined
93
+ ): unknown {
94
+ const sinceValue = source.since;
95
+
96
+ if (sinceValue === 'cluster_start') {
97
+ return cluster.createdAt;
98
+ }
99
+
100
+ if (sinceValue === 'last_task_end') {
101
+ return lastTaskEndTime || cluster.createdAt;
102
+ }
103
+
104
+ if (sinceValue === 'last_agent_start') {
105
+ return lastAgentStartTime ? lastAgentStartTime + 1 : cluster.createdAt;
106
+ }
107
+
108
+ if (typeof sinceValue === 'string') {
109
+ const parsed = Date.parse(sinceValue);
110
+ if (Number.isNaN(parsed)) {
111
+ throw new Error(
112
+ `Unknown context source "since" value "${sinceValue}" for topic ${source.topic}. ` +
113
+ 'Use cluster_start, last_task_end, last_agent_start, or an ISO timestamp.'
114
+ );
115
+ }
116
+ return parsed;
117
+ }
118
+
119
+ return sinceValue;
120
+ }
121
+
122
+ function formatSourceMessagesSection(source: ContextSource, messages: ContextMessage[]): string {
123
+ let context = `\n## Messages from topic: ${source.topic}\n\n`;
124
+
125
+ for (const msg of messages) {
126
+ context += `[${new Date(msg.timestamp).toISOString()}] ${msg.sender}:\n`;
127
+ if (msg.content?.text) {
128
+ context += `${msg.content.text}\n`;
129
+ }
130
+ if (msg.content?.data) {
131
+ context += `Data: ${JSON.stringify(msg.content.data, null, 2)}\n`;
132
+ }
133
+ context += '\n';
134
+ }
135
+
136
+ return context;
137
+ }
138
+
139
+ function resolveSourceSelection(
140
+ source: ContextSource,
141
+ { compact = false }: SourceSelectionOptions = {}
142
+ ): SourceSelection {
143
+ const baseAmount = source.amount ?? source.limit;
144
+ const baseStrategy = source.strategy ?? (baseAmount !== undefined ? 'latest' : 'all');
145
+
146
+ if (!compact) {
147
+ return { amount: baseAmount, strategy: baseStrategy };
148
+ }
149
+
150
+ return {
151
+ amount: source.compactAmount ?? 1,
152
+ strategy: source.compactStrategy ?? (baseStrategy === 'all' ? 'latest' : baseStrategy),
153
+ };
154
+ }
155
+
156
+ function resolveSourceMessages({
157
+ source,
158
+ messageBus,
159
+ cluster,
160
+ lastTaskEndTime,
161
+ lastAgentStartTime,
162
+ afterId,
163
+ throughId,
164
+ triggeringMessageId,
165
+ compact = false,
166
+ }: SourceMessageParams): ContextMessage[] {
167
+ const sinceTimestamp = resolveSourceSince(source, cluster, lastTaskEndTime, lastAgentStartTime);
168
+ const { amount, strategy } = resolveSourceSelection(source, { compact });
169
+ const messages = messageBus.query({
170
+ cluster_id: cluster.id,
171
+ topic: source.topic,
172
+ sender: source.sender,
173
+ since: sinceTimestamp,
174
+ afterId,
175
+ throughId,
176
+ });
177
+ const replayableMessages = messages.filter(
178
+ (message) => isReplayableMessage(message) && message.id !== triggeringMessageId
179
+ );
180
+
181
+ if (amount === undefined) {
182
+ return replayableMessages;
183
+ }
184
+
185
+ if (strategy === 'latest') {
186
+ return replayableMessages.slice(-amount);
187
+ }
188
+
189
+ return replayableMessages.slice(0, amount);
190
+ }
191
+
192
+ const REQUIRED_TOPICS = new Set(['STATE_SNAPSHOT', 'ISSUE_OPENED', 'PLAN_READY']);
193
+ const HIGH_PRIORITY_TOPICS = new Set(['VALIDATION_RESULT', 'IMPLEMENTATION_READY']);
194
+
195
+ function resolveSourcePriority(source: ContextSource): string {
196
+ if (source.priority) {
197
+ return source.priority;
198
+ }
199
+
200
+ if (REQUIRED_TOPICS.has(source.topic)) {
201
+ return 'required';
202
+ }
203
+
204
+ if (HIGH_PRIORITY_TOPICS.has(source.topic)) {
205
+ return 'high';
206
+ }
207
+
208
+ return 'medium';
209
+ }
210
+
211
+ function buildSourcePack({
212
+ source,
213
+ index,
214
+ messageBus,
215
+ cluster,
216
+ lastTaskEndTime,
217
+ lastAgentStartTime,
218
+ afterId,
219
+ throughId,
220
+ triggeringMessageId,
221
+ }: SourcePackParams): SourcePack {
222
+ const render = (compact: boolean): string => {
223
+ const messages = resolveSourceMessages({
224
+ source,
225
+ messageBus,
226
+ cluster,
227
+ lastTaskEndTime,
228
+ lastAgentStartTime,
229
+ afterId,
230
+ throughId,
231
+ triggeringMessageId,
232
+ compact,
233
+ });
234
+
235
+ if (messages.length === 0) {
236
+ return '';
237
+ }
238
+
239
+ return formatSourceMessagesSection(source, messages);
240
+ };
241
+
242
+ return {
243
+ id: `source:${source.topic}:${index}`,
244
+ section: 'sources',
245
+ priority: resolveSourcePriority(source),
246
+ render: () => render(false),
247
+ compact: () => render(true),
248
+ };
249
+ }
250
+
251
+ export = {
252
+ buildSourcePack,
253
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,132 @@
1
+ export interface JsonSchema {
2
+ readonly type?: string;
3
+ readonly description?: string;
4
+ readonly enum?: readonly unknown[];
5
+ readonly properties?: Readonly<Record<string, JsonSchema | null | undefined>>;
6
+ }
7
+
8
+ export interface LegacyOutputFormat {
9
+ readonly rules?: readonly string[];
10
+ readonly example?: unknown;
11
+ }
12
+
13
+ export interface PromptObject {
14
+ readonly system?: string | null;
15
+ readonly outputFormat?: LegacyOutputFormat | null;
16
+ }
17
+
18
+ export interface ContextSource {
19
+ topic: string;
20
+ sender?: unknown;
21
+ since?: unknown;
22
+ amount?: number;
23
+ limit?: number;
24
+ strategy?: string;
25
+ compactAmount?: number;
26
+ compactStrategy?: string;
27
+ priority?: string;
28
+ }
29
+
30
+ export interface ContextStrategy {
31
+ maxTokens?: number;
32
+ sources?: ContextSource[];
33
+ readonly [key: string]: unknown;
34
+ }
35
+
36
+ export interface AgentContextConfig {
37
+ readonly prompt?: string | PromptObject | null;
38
+ readonly promptConfig?: {
39
+ readonly type?: string | null;
40
+ } | null;
41
+ readonly cwd?: string | null;
42
+ readonly jsonSchema?: JsonSchema | null;
43
+ readonly outputFormat?: string | null;
44
+ readonly role?: string;
45
+ readonly requiredQualityGates?: unknown;
46
+ readonly commandProofs?: unknown;
47
+ readonly contextStrategy?: ContextStrategy | null;
48
+ }
49
+
50
+ export interface WorktreeContext {
51
+ readonly enabled?: boolean;
52
+ readonly path?: string | null;
53
+ }
54
+
55
+ export interface IsolationContext {
56
+ readonly enabled?: boolean;
57
+ }
58
+
59
+ export interface ValidationCriterion {
60
+ readonly status?: string;
61
+ readonly id?: string;
62
+ readonly reason?: string;
63
+ }
64
+
65
+ export interface ContextMessageData {
66
+ readonly criteriaResults?: readonly ValidationCriterion[] | null;
67
+ readonly contextSafe?: unknown;
68
+ readonly replayPolicy?: unknown;
69
+ readonly [key: string]: unknown;
70
+ }
71
+
72
+ export interface ContextMessage {
73
+ readonly id?: unknown;
74
+ readonly topic?: unknown;
75
+ readonly timestamp: string | number;
76
+ readonly sender: string;
77
+ readonly metadata?: ContextMessageData | null;
78
+ readonly content?: {
79
+ readonly text?: string | null;
80
+ readonly data?: ContextMessageData | null;
81
+ } | null;
82
+ }
83
+
84
+ export interface ContextQuery {
85
+ cluster_id: string;
86
+ topic: string;
87
+ sender?: unknown;
88
+ since?: unknown;
89
+ afterId?: unknown;
90
+ throughId?: unknown;
91
+ limit?: number;
92
+ }
93
+
94
+ export interface ContextMessageBus {
95
+ query(criteria: ContextQuery): ContextMessage[];
96
+ publish(message: unknown): unknown;
97
+ }
98
+
99
+ export interface ContextCluster {
100
+ id: string;
101
+ createdAt: number;
102
+ }
103
+
104
+ export interface TriggeringMessage {
105
+ id?: unknown;
106
+ topic: string;
107
+ sender: string;
108
+ content?: {
109
+ text?: string | null;
110
+ } | null;
111
+ }
112
+
113
+ export interface BuildContextParams {
114
+ id: string;
115
+ role: string;
116
+ iteration: number;
117
+ config: AgentContextConfig;
118
+ messageBus: ContextMessageBus;
119
+ cluster: ContextCluster;
120
+ triggeringMessage: TriggeringMessage;
121
+ lastTaskEndTime?: number | null | undefined;
122
+ lastAgentStartTime?: number | null | undefined;
123
+ selectedPrompt?: string | null | undefined;
124
+ queuedGuidance?: string | null | undefined;
125
+ worktree?: WorktreeContext | null | undefined;
126
+ isolation?: IsolationContext | null | undefined;
127
+ mode?: string | undefined;
128
+ continuationSequence?: unknown;
129
+ contextThroughId?: unknown;
130
+ previousPromptIdentity?: unknown;
131
+ currentPromptIdentity?: unknown;
132
+ }