@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,367 +1,81 @@
1
- const { estimateTokensFromChars } = require('./context-metrics');
2
-
3
- const PRIORITY_RANK = {
4
- required: 0,
5
- high: 1,
6
- medium: 2,
7
- low: 3,
8
- };
9
-
10
- const DEFAULT_PRIORITY = 'medium';
11
- const TRUNCATION_SUFFIX = '\n\n[Context truncated to fit limit]\n';
12
-
13
- function normalizePriority(priority, required) {
14
- if (required) return 'required';
15
- if (priority && PRIORITY_RANK[priority] !== undefined) return priority;
16
- return DEFAULT_PRIORITY;
17
- }
18
-
19
- function normalizePack(pack, index) {
20
- const priority = normalizePriority(pack.priority, pack.required);
21
- return {
22
- ...pack,
23
- priority,
24
- required: pack.required || priority === 'required',
25
- order: pack.order ?? index,
26
- };
27
- }
28
-
29
- function renderVariant(pack, variant, cache) {
30
- const cacheKey = `${pack.id}:${variant}`;
31
- if (cache.has(cacheKey)) return cache.get(cacheKey);
32
-
33
- let text = '';
34
- if (variant === 'full') {
35
- text = typeof pack.render === 'function' ? pack.render() : '';
36
- } else if (variant === 'compact') {
37
- text = typeof pack.compact === 'function' ? pack.compact() : '';
38
- }
39
-
40
- if (typeof text !== 'string') {
41
- text = '';
42
- }
43
-
44
- const chars = text.length;
45
- const estimatedTokens = estimateTokensFromChars(chars);
46
- const rendered = { text, chars, estimatedTokens };
47
- cache.set(cacheKey, rendered);
48
- return rendered;
49
- }
50
-
51
- function sortByPriorityThenOrder(a, b) {
52
- const priorityDelta = PRIORITY_RANK[a.priority] - PRIORITY_RANK[b.priority];
53
- if (priorityDelta !== 0) return priorityDelta;
54
- return a.order - b.order;
55
- }
56
-
57
- function sortByOrder(a, b) {
58
- return a.order - b.order;
59
- }
60
-
61
- function sortByPriorityDescThenOrderDesc(a, b) {
62
- const priorityDelta = PRIORITY_RANK[b.priority] - PRIORITY_RANK[a.priority];
63
- if (priorityDelta !== 0) return priorityDelta;
64
- return b.order - a.order;
65
- }
66
-
67
- function selectVariant(pack, remainingTokens, cache) {
68
- const full = renderVariant(pack, 'full', cache);
69
- const compact = pack.compact ? renderVariant(pack, 'compact', cache) : null;
70
-
71
- const hasFull = full.chars > 0;
72
- const hasCompact = compact && compact.chars > 0;
73
-
74
- if (!hasFull && !hasCompact) {
75
- return {
76
- status: 'skipped',
77
- variant: null,
78
- reason: 'empty',
79
- chars: 0,
80
- estimatedTokens: 0,
81
- };
82
- }
83
-
84
- if (pack.required) {
85
- let chosen = full;
86
- let variant = 'full';
87
-
88
- if (!hasFull && hasCompact) {
89
- chosen = compact;
90
- variant = 'compact';
91
- } else if (
92
- Number.isFinite(remainingTokens) &&
93
- hasCompact &&
94
- full.estimatedTokens > remainingTokens
95
- ) {
96
- if (
97
- compact.estimatedTokens <= remainingTokens ||
98
- compact.estimatedTokens < full.estimatedTokens
99
- ) {
100
- chosen = compact;
101
- variant = 'compact';
102
- }
1
+ "use strict";
2
+ const contextMetrics = require("./context-metrics");
3
+ const contextPackCore = require("./context-pack-core");
4
+ const contextPackSelection = require("./context-pack-selection");
5
+ const contextPackTruncation = require("./context-pack-truncation");
6
+ const { estimateTokensFromChars } = contextMetrics;
7
+ const { normalizePack, sortByOrder } = contextPackCore;
8
+ const { selectPacks } = contextPackSelection;
9
+ const { applyMaxCharsGuard } = contextPackTruncation;
10
+ function renderSelectedContext(packs, selected) {
11
+ let context = '';
12
+ for (const pack of packs) {
13
+ const selectedPack = selected.get(pack.id);
14
+ if (selectedPack) {
15
+ context += selectedPack.text;
16
+ }
103
17
  }
104
-
105
- return {
106
- status: 'included',
107
- variant,
108
- chars: chosen.chars,
109
- estimatedTokens: chosen.estimatedTokens,
110
- text: chosen.text,
111
- };
112
- }
113
-
114
- if (!Number.isFinite(remainingTokens) || full.estimatedTokens <= remainingTokens) {
115
- return {
116
- status: 'included',
117
- variant: 'full',
118
- chars: full.chars,
119
- estimatedTokens: full.estimatedTokens,
120
- text: full.text,
121
- };
122
- }
123
-
124
- if (hasCompact && compact.estimatedTokens <= remainingTokens) {
125
- return {
126
- status: 'included',
127
- variant: 'compact',
128
- chars: compact.chars,
129
- estimatedTokens: compact.estimatedTokens,
130
- text: compact.text,
131
- };
132
- }
133
-
134
- return {
135
- status: 'skipped',
136
- variant: null,
137
- reason: 'budget',
138
- chars: 0,
139
- estimatedTokens: 0,
140
- };
141
- }
142
-
143
- function truncateText(text, targetChars) {
144
- if (text.length <= targetChars) {
145
- return { text, truncated: false };
146
- }
147
-
148
- if (targetChars <= 0) {
149
- return { text: '', truncated: true };
150
- }
151
-
152
- if (targetChars <= TRUNCATION_SUFFIX.length) {
153
- return { text: text.slice(0, targetChars), truncated: true };
154
- }
155
-
156
- const sliceLength = targetChars - TRUNCATION_SUFFIX.length;
157
- return { text: text.slice(0, sliceLength) + TRUNCATION_SUFFIX, truncated: true };
18
+ return context;
158
19
  }
159
-
160
- function applyMaxCharsGuard({ packs, selected, decisions, cache, maxChars, totalChars }) {
161
- let currentChars = totalChars;
162
- if (!Number.isFinite(maxChars) || currentChars <= maxChars) {
163
- return { applied: false, beforeChars: totalChars, afterChars: totalChars };
164
- }
165
-
166
- const includedOptional = packs
167
- .filter((pack) => selected.has(pack.id) && !pack.required)
168
- .sort(sortByPriorityDescThenOrderDesc);
169
-
170
- for (const pack of includedOptional) {
171
- if (currentChars <= maxChars) break;
172
- const decision = decisions.get(pack.id);
173
- if (!decision || decision.variant === 'compact' || !pack.compact) continue;
174
-
175
- const compact = renderVariant(pack, 'compact', cache);
176
- if (compact.chars === 0 || compact.chars >= decision.chars) continue;
177
-
178
- const previousChars = decision.chars;
179
- selected.set(pack.id, { ...compact, variant: 'compact' });
180
- decision.variant = 'compact';
181
- decision.chars = compact.chars;
182
- decision.estimatedTokens = compact.estimatedTokens;
183
- decision.reason = decision.reason || 'max_chars';
184
-
185
- currentChars -= previousChars - compact.chars;
186
- currentChars = Math.max(0, currentChars);
187
- }
188
-
189
- for (const pack of includedOptional) {
190
- if (currentChars <= maxChars) break;
191
- if (!selected.has(pack.id)) continue;
192
-
193
- const decision = decisions.get(pack.id);
194
- currentChars -= decision?.chars || 0;
195
- selected.delete(pack.id);
196
- if (decision) {
197
- decision.status = 'skipped';
198
- decision.reason = decision.reason || 'max_chars';
199
- decision.chars = 0;
200
- decision.estimatedTokens = 0;
201
- }
202
- }
203
-
204
- if (currentChars > maxChars) {
205
- let overage = currentChars - maxChars;
206
- const requiredCandidates = packs
207
- .filter((pack) => selected.has(pack.id) && pack.required)
208
- .sort((a, b) => {
209
- const preserveDelta = (a.preserve ? 1 : 0) - (b.preserve ? 1 : 0);
210
- if (preserveDelta !== 0) return preserveDelta;
211
- const sizeDelta = (selected.get(b.id)?.chars || 0) - (selected.get(a.id)?.chars || 0);
212
- if (sizeDelta !== 0) return sizeDelta;
213
- return b.order - a.order;
214
- });
215
-
216
- for (const pack of requiredCandidates) {
217
- if (overage <= 0) break;
218
- const decision = decisions.get(pack.id);
219
- const selectedPack = selected.get(pack.id);
220
- if (!decision || !selectedPack) continue;
221
-
222
- const targetChars = Math.max(0, selectedPack.chars - overage);
223
- const truncated = truncateText(selectedPack.text, targetChars);
224
- if (truncated.text.length === selectedPack.chars) continue;
225
-
226
- const newChars = truncated.text.length;
227
- const reduced = selectedPack.chars - newChars;
228
- overage -= reduced;
229
-
230
- selected.set(pack.id, {
231
- text: truncated.text,
232
- chars: newChars,
233
- estimatedTokens: estimateTokensFromChars(newChars),
234
- variant: selectedPack.variant,
235
- });
236
-
237
- decision.chars = newChars;
238
- decision.estimatedTokens = estimateTokensFromChars(newChars);
239
- decision.truncated = true;
240
- decision.reason = decision.reason || 'max_chars';
241
- }
242
- }
243
-
244
- const afterChars = Array.from(selected.values()).reduce((sum, item) => sum + item.chars, 0);
245
- return { applied: true, beforeChars: totalChars, afterChars };
20
+ function finalizePackDecisions(packs, decisions) {
21
+ return packs.map((pack) => {
22
+ const decision = decisions.get(pack.id);
23
+ if (!decision) {
24
+ throw new Error(`Missing context-pack decision for "${pack.id}"`);
25
+ }
26
+ return {
27
+ id: decision.id,
28
+ section: decision.section,
29
+ priority: decision.priority,
30
+ required: decision.required,
31
+ status: decision.status,
32
+ variant: decision.variant,
33
+ chars: decision.chars,
34
+ estimatedTokens: decision.estimatedTokens,
35
+ order: decision.order,
36
+ reason: decision.reason,
37
+ truncated: decision.truncated || false,
38
+ };
39
+ });
246
40
  }
247
-
248
- function buildContextPacks({ packs, maxTokens, maxChars }) {
249
- const normalized = packs.map(normalizePack);
250
- const selectionOrder = normalized.slice().sort(sortByPriorityThenOrder);
251
- const renderCache = new Map();
252
- const decisions = new Map();
253
- const selected = new Map();
254
-
255
- let remainingTokens = Number.isFinite(maxTokens) ? maxTokens : Infinity;
256
- let overBudgetTokens = 0;
257
-
258
- for (const pack of selectionOrder) {
259
- const selection = selectVariant(pack, remainingTokens, renderCache);
260
- const decision = {
261
- id: pack.id,
262
- section: pack.section || null,
263
- priority: pack.priority,
264
- required: pack.required,
265
- status: selection.status,
266
- variant: selection.variant,
267
- chars: selection.chars,
268
- estimatedTokens: selection.estimatedTokens,
269
- order: pack.order,
270
- reason: selection.reason || null,
271
- };
272
-
273
- decisions.set(pack.id, decision);
274
-
275
- if (selection.status !== 'included') {
276
- continue;
277
- }
278
-
279
- selected.set(pack.id, {
280
- text: selection.text,
281
- chars: selection.chars,
282
- estimatedTokens: selection.estimatedTokens,
283
- variant: selection.variant,
41
+ function buildContextPacks({ packs, maxTokens, maxChars, }) {
42
+ const normalized = packs.map(normalizePack);
43
+ const ordered = normalized.slice().sort(sortByOrder);
44
+ const selection = selectPacks(normalized, maxTokens);
45
+ const initialContext = renderSelectedContext(ordered, selection.selected);
46
+ const truncation = applyMaxCharsGuard({
47
+ packs: ordered,
48
+ selected: selection.selected,
49
+ decisions: selection.decisions,
50
+ cache: selection.renderCache,
51
+ maxChars,
52
+ totalChars: initialContext.length,
284
53
  });
285
-
286
- if (!Number.isFinite(remainingTokens)) {
287
- continue;
288
- }
289
-
290
- if (selection.estimatedTokens > remainingTokens) {
291
- overBudgetTokens += selection.estimatedTokens - remainingTokens;
292
- remainingTokens = 0;
293
- } else {
294
- remainingTokens -= selection.estimatedTokens;
295
- }
296
- }
297
-
298
- const ordered = normalized.slice().sort(sortByOrder);
299
- let context = '';
300
- for (const pack of ordered) {
301
- const selectedPack = selected.get(pack.id);
302
- if (selectedPack) {
303
- context += selectedPack.text;
304
- }
305
- }
306
-
307
- const totalChars = context.length;
308
- const truncation = applyMaxCharsGuard({
309
- packs: ordered,
310
- selected,
311
- decisions,
312
- cache: renderCache,
313
- maxChars,
314
- totalChars,
315
- });
316
-
317
- if (truncation.applied) {
318
- context = '';
319
- for (const pack of ordered) {
320
- const selectedPack = selected.get(pack.id);
321
- if (selectedPack) {
322
- context += selectedPack.text;
323
- }
324
- }
325
- }
326
-
327
- const finalChars = context.length;
328
- const finalTokens = estimateTokensFromChars(finalChars);
329
- const packDecisions = ordered.map((pack) => {
330
- const decision = decisions.get(pack.id);
54
+ const context = truncation.applied
55
+ ? renderSelectedContext(ordered, selection.selected)
56
+ : initialContext;
57
+ const finalChars = context.length;
58
+ const finalTokens = estimateTokensFromChars(finalChars);
331
59
  return {
332
- id: decision.id,
333
- section: decision.section,
334
- priority: decision.priority,
335
- required: decision.required,
336
- status: decision.status,
337
- variant: decision.variant,
338
- chars: decision.chars,
339
- estimatedTokens: decision.estimatedTokens,
340
- order: decision.order,
341
- reason: decision.reason,
342
- truncated: decision.truncated || false,
60
+ context,
61
+ packDecisions: finalizePackDecisions(ordered, selection.decisions),
62
+ budget: {
63
+ maxTokens,
64
+ remainingTokens: Number.isFinite(selection.remainingTokens)
65
+ ? selection.remainingTokens
66
+ : null,
67
+ overBudgetTokens: selection.overBudgetTokens,
68
+ finalTokens,
69
+ },
70
+ truncation: {
71
+ maxContextChars: {
72
+ applied: truncation.applied,
73
+ beforeChars: truncation.beforeChars,
74
+ afterChars: truncation.afterChars,
75
+ },
76
+ },
343
77
  };
344
- });
345
-
346
- return {
347
- context,
348
- packDecisions,
349
- budget: {
350
- maxTokens,
351
- remainingTokens: Number.isFinite(remainingTokens) ? remainingTokens : null,
352
- overBudgetTokens,
353
- finalTokens,
354
- },
355
- truncation: {
356
- maxContextChars: {
357
- applied: truncation.applied,
358
- beforeChars: truncation.beforeChars,
359
- afterChars: truncation.afterChars,
360
- },
361
- },
362
- };
363
78
  }
364
-
365
79
  module.exports = {
366
- buildContextPacks,
80
+ buildContextPacks,
367
81
  };
@@ -0,0 +1,105 @@
1
+ import contextMetrics = require('./context-metrics');
2
+ import contextPackCore = require('./context-pack-core');
3
+ import contextPackSelection = require('./context-pack-selection');
4
+ import contextPackTruncation = require('./context-pack-truncation');
5
+
6
+ import type {
7
+ BuildContextPacksParams,
8
+ ContextPackDecision,
9
+ ContextPackResult,
10
+ MutableContextPackDecision,
11
+ NormalizedContextPack,
12
+ SelectedVariant,
13
+ } from './context-pack-types';
14
+
15
+ const { estimateTokensFromChars } = contextMetrics;
16
+ const { normalizePack, sortByOrder } = contextPackCore;
17
+ const { selectPacks } = contextPackSelection;
18
+ const { applyMaxCharsGuard } = contextPackTruncation;
19
+
20
+ function renderSelectedContext(
21
+ packs: readonly NormalizedContextPack[],
22
+ selected: ReadonlyMap<string, SelectedVariant>
23
+ ): string {
24
+ let context = '';
25
+ for (const pack of packs) {
26
+ const selectedPack = selected.get(pack.id);
27
+ if (selectedPack) {
28
+ context += selectedPack.text;
29
+ }
30
+ }
31
+ return context;
32
+ }
33
+
34
+ function finalizePackDecisions(
35
+ packs: readonly NormalizedContextPack[],
36
+ decisions: ReadonlyMap<string, MutableContextPackDecision>
37
+ ): ContextPackDecision[] {
38
+ return packs.map((pack): ContextPackDecision => {
39
+ const decision = decisions.get(pack.id);
40
+ if (!decision) {
41
+ throw new Error(`Missing context-pack decision for "${pack.id}"`);
42
+ }
43
+ return {
44
+ id: decision.id,
45
+ section: decision.section,
46
+ priority: decision.priority,
47
+ required: decision.required,
48
+ status: decision.status,
49
+ variant: decision.variant,
50
+ chars: decision.chars,
51
+ estimatedTokens: decision.estimatedTokens,
52
+ order: decision.order,
53
+ reason: decision.reason,
54
+ truncated: decision.truncated || false,
55
+ };
56
+ });
57
+ }
58
+
59
+ function buildContextPacks({
60
+ packs,
61
+ maxTokens,
62
+ maxChars,
63
+ }: BuildContextPacksParams): ContextPackResult {
64
+ const normalized = packs.map(normalizePack);
65
+ const ordered = normalized.slice().sort(sortByOrder);
66
+ const selection = selectPacks(normalized, maxTokens);
67
+ const initialContext = renderSelectedContext(ordered, selection.selected);
68
+ const truncation = applyMaxCharsGuard({
69
+ packs: ordered,
70
+ selected: selection.selected,
71
+ decisions: selection.decisions,
72
+ cache: selection.renderCache,
73
+ maxChars,
74
+ totalChars: initialContext.length,
75
+ });
76
+ const context = truncation.applied
77
+ ? renderSelectedContext(ordered, selection.selected)
78
+ : initialContext;
79
+ const finalChars = context.length;
80
+ const finalTokens = estimateTokensFromChars(finalChars);
81
+
82
+ return {
83
+ context,
84
+ packDecisions: finalizePackDecisions(ordered, selection.decisions),
85
+ budget: {
86
+ maxTokens,
87
+ remainingTokens: Number.isFinite(selection.remainingTokens)
88
+ ? selection.remainingTokens
89
+ : null,
90
+ overBudgetTokens: selection.overBudgetTokens,
91
+ finalTokens,
92
+ },
93
+ truncation: {
94
+ maxContextChars: {
95
+ applied: truncation.applied,
96
+ beforeChars: truncation.beforeChars,
97
+ afterChars: truncation.afterChars,
98
+ },
99
+ },
100
+ };
101
+ }
102
+
103
+ export = {
104
+ buildContextPacks,
105
+ };
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ const contextMetrics = require("./context-metrics");
3
+ const { estimateTokensFromChars } = contextMetrics;
4
+ const PRIORITY_RANK = {
5
+ required: 0,
6
+ high: 1,
7
+ medium: 2,
8
+ low: 3,
9
+ };
10
+ const DEFAULT_PRIORITY = 'medium';
11
+ function isContextPackPriority(priority) {
12
+ return (priority === 'required' || priority === 'high' || priority === 'medium' || priority === 'low');
13
+ }
14
+ function normalizePriority(priority, required) {
15
+ if (required)
16
+ return 'required';
17
+ if (priority && isContextPackPriority(priority))
18
+ return priority;
19
+ return DEFAULT_PRIORITY;
20
+ }
21
+ function normalizePack(pack, index) {
22
+ const priority = normalizePriority(pack.priority, pack.required);
23
+ return {
24
+ ...pack,
25
+ priority,
26
+ required: pack.required || priority === 'required',
27
+ order: pack.order ?? index,
28
+ };
29
+ }
30
+ function renderVariant(pack, variant, cache) {
31
+ const cacheKey = `${pack.id}:${variant}`;
32
+ const cached = cache.get(cacheKey);
33
+ if (cached)
34
+ return cached;
35
+ let text = '';
36
+ if (variant === 'full') {
37
+ text = typeof pack.render === 'function' ? pack.render() : '';
38
+ }
39
+ else if (variant === 'compact') {
40
+ text = typeof pack.compact === 'function' ? pack.compact() : '';
41
+ }
42
+ const safeText = typeof text === 'string' ? text : '';
43
+ const chars = safeText.length;
44
+ const estimatedTokens = estimateTokensFromChars(chars);
45
+ const rendered = { text: safeText, chars, estimatedTokens };
46
+ cache.set(cacheKey, rendered);
47
+ return rendered;
48
+ }
49
+ function sortByPriorityThenOrder(a, b) {
50
+ const priorityDelta = PRIORITY_RANK[a.priority] - PRIORITY_RANK[b.priority];
51
+ if (priorityDelta !== 0)
52
+ return priorityDelta;
53
+ return a.order - b.order;
54
+ }
55
+ function sortByOrder(a, b) {
56
+ return a.order - b.order;
57
+ }
58
+ function sortByPriorityDescThenOrderDesc(a, b) {
59
+ const priorityDelta = PRIORITY_RANK[b.priority] - PRIORITY_RANK[a.priority];
60
+ if (priorityDelta !== 0)
61
+ return priorityDelta;
62
+ return b.order - a.order;
63
+ }
64
+ module.exports = {
65
+ normalizePack,
66
+ renderVariant,
67
+ sortByPriorityThenOrder,
68
+ sortByOrder,
69
+ sortByPriorityDescThenOrderDesc,
70
+ };