@myagentroam/agent 0.11.32 → 0.11.34

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 (856) hide show
  1. package/dist/cli/catalog-file.d.ts +78 -0
  2. package/dist/cli/catalog-file.js +102 -0
  3. package/dist/cli/codex-auth-file.d.ts +1 -1
  4. package/dist/cli/codex-auth-file.js +9 -10
  5. package/dist/cli/main.js +44 -54
  6. package/dist/error.d.ts +15 -0
  7. package/dist/error.js +74 -0
  8. package/dist/extensions/agents.d.ts +100 -0
  9. package/dist/extensions/agents.js +121 -0
  10. package/dist/extensions/capabilities.d.ts +4 -0
  11. package/dist/extensions/commands.d.ts +23 -0
  12. package/dist/extensions/commands.js +45 -0
  13. package/dist/extensions/compaction.d.ts +36 -0
  14. package/dist/extensions/contracts.d.ts +147 -0
  15. package/dist/extensions/data.d.ts +81 -0
  16. package/dist/extensions/data.js +78 -0
  17. package/dist/extensions/environment.d.ts +39 -0
  18. package/dist/extensions/environment.js +52 -0
  19. package/dist/extensions/files.d.ts +68 -0
  20. package/dist/extensions/files.js +26 -0
  21. package/dist/extensions/hooks.d.ts +32 -0
  22. package/dist/extensions/host-ports.d.ts +24 -0
  23. package/dist/extensions/manager.d.ts +42 -0
  24. package/dist/extensions/manager.js +457 -0
  25. package/dist/extensions/mcp.d.ts +116 -0
  26. package/dist/extensions/mcp.js +434 -0
  27. package/dist/extensions/model-request.d.ts +65 -0
  28. package/dist/extensions/model-request.js +197 -0
  29. package/dist/extensions/model-stream.d.ts +18 -0
  30. package/dist/extensions/model-stream.js +108 -0
  31. package/dist/extensions/models.d.ts +46 -0
  32. package/dist/extensions/models.js +7 -0
  33. package/dist/extensions/network.d.ts +40 -0
  34. package/dist/extensions/network.js +97 -0
  35. package/dist/extensions/operation.d.ts +32 -0
  36. package/dist/extensions/processes.d.ts +64 -0
  37. package/dist/extensions/processes.js +284 -0
  38. package/dist/extensions/prompt-composition.d.ts +38 -0
  39. package/dist/extensions/prompt-composition.js +100 -0
  40. package/dist/extensions/prompt-input.d.ts +30 -0
  41. package/dist/extensions/prompt-input.js +48 -0
  42. package/dist/extensions/prompts.d.ts +31 -0
  43. package/dist/extensions/prompts.js +88 -0
  44. package/dist/extensions/resources.d.ts +26 -0
  45. package/dist/extensions/resources.js +221 -0
  46. package/dist/extensions/services.d.ts +31 -0
  47. package/dist/extensions/services.js +61 -0
  48. package/dist/extensions/session-api.d.ts +6 -0
  49. package/dist/extensions/session-api.js +52 -0
  50. package/dist/extensions/session-input.d.ts +184 -0
  51. package/dist/extensions/session-input.js +422 -0
  52. package/dist/extensions/session-messages.d.ts +41 -0
  53. package/dist/extensions/session-messages.js +76 -0
  54. package/dist/extensions/session-tools.d.ts +32 -0
  55. package/dist/extensions/session-tools.js +208 -0
  56. package/dist/extensions/session.d.ts +60 -0
  57. package/dist/extensions/session.js +265 -0
  58. package/dist/extensions/settings.d.ts +76 -0
  59. package/dist/extensions/settings.js +115 -0
  60. package/dist/extensions/store.d.ts +10 -0
  61. package/dist/extensions/store.js +131 -0
  62. package/dist/extensions/tool-runtime.d.ts +16 -0
  63. package/dist/extensions/tools.d.ts +80 -0
  64. package/dist/extensions/tools.js +270 -0
  65. package/dist/extensions.d.ts +22 -0
  66. package/dist/host/contracts.d.ts +58 -0
  67. package/dist/host/contracts.js +18 -0
  68. package/dist/host/description.d.ts +19 -0
  69. package/dist/host/local-agent-host.d.ts +96 -0
  70. package/dist/host/local-agent-host.js +429 -0
  71. package/dist/host/local-exec-tool.d.ts +26 -0
  72. package/dist/host/local-exec-tool.js +686 -0
  73. package/dist/host/local-file-access.d.ts +30 -0
  74. package/dist/host/local-file-access.js +107 -0
  75. package/dist/host/local-network-access.d.ts +6 -0
  76. package/dist/host/local-network-access.js +101 -0
  77. package/dist/host/local-process-executor.d.ts +5 -0
  78. package/dist/host/local-process-executor.js +17 -0
  79. package/dist/host/local-session-environment.d.ts +18 -0
  80. package/dist/host/local-shell.d.ts +3 -0
  81. package/dist/host/local-tool-registry.d.ts +34 -0
  82. package/dist/host/local-tool-registry.js +134 -0
  83. package/dist/host/network.d.ts +5 -0
  84. package/dist/host/network.js +42 -0
  85. package/dist/host/process-control.d.ts +2 -0
  86. package/dist/host/process-control.js +26 -0
  87. package/dist/host/skill-contract.d.ts +6 -0
  88. package/dist/host.d.ts +17 -0
  89. package/dist/host.js +3 -0
  90. package/dist/index.d.ts +26 -51
  91. package/dist/index.js +9 -12
  92. package/dist/model/anthropic-messages.d.ts +10 -0
  93. package/dist/model/anthropic-messages.js +692 -0
  94. package/dist/model/anthropic-thinking.js +33 -0
  95. package/dist/model/configuration.d.ts +111 -0
  96. package/dist/model/configuration.js +201 -0
  97. package/dist/model/contracts.d.ts +229 -0
  98. package/dist/model/http.d.ts +13 -0
  99. package/dist/model/http.js +119 -0
  100. package/dist/model/image-contract.d.ts +10 -0
  101. package/dist/model/image.d.ts +9 -0
  102. package/dist/model/inline-media-budget.d.ts +7 -0
  103. package/dist/model/inline-media-budget.js +36 -0
  104. package/dist/model/input-images.d.ts +3 -0
  105. package/dist/model/input-images.js +16 -0
  106. package/dist/model/openai-responses.d.ts +59 -0
  107. package/dist/model/openai-responses.js +1586 -0
  108. package/dist/model/recovery.js +80 -0
  109. package/dist/model/request-configuration.d.ts +17 -0
  110. package/dist/model/request-configuration.js +47 -0
  111. package/dist/model/responses-event-projection.d.ts +24 -0
  112. package/dist/model/responses-event-projection.js +194 -0
  113. package/dist/model/responses-request.d.ts +5 -0
  114. package/dist/model/responses-request.js +363 -0
  115. package/dist/model/responses-session-cache.d.ts +33 -0
  116. package/dist/model/responses-session-cache.js +64 -0
  117. package/dist/model/runtime-credential.d.ts +1 -0
  118. package/dist/model/runtime-credential.js +1 -0
  119. package/dist/model/sse.js +281 -0
  120. package/dist/model/text-blocks.js +40 -0
  121. package/dist/model/tool-declarations.d.ts +4 -0
  122. package/dist/model/tool-definition-projection.d.ts +6 -0
  123. package/dist/model/tool-definition-projection.js +11 -0
  124. package/dist/model/tool-schema.d.ts +2 -0
  125. package/dist/model/tool-schema.js +17 -0
  126. package/dist/model/transport-test.d.ts +10 -0
  127. package/dist/model/transport-test.js +27 -0
  128. package/dist/model/usage-observer.d.ts +5 -0
  129. package/dist/model/usage.d.ts +40 -0
  130. package/dist/network/credential-runtime.d.ts +8 -0
  131. package/dist/network/credential-runtime.js +72 -0
  132. package/dist/network/credentials.d.ts +20 -0
  133. package/dist/network/credentials.js +18 -0
  134. package/dist/network/http.d.ts +20 -0
  135. package/dist/network/http.js +421 -0
  136. package/dist/network/product-user-agent.d.ts +5 -0
  137. package/dist/network/product-user-agent.js +22 -0
  138. package/dist/network/transport-error.d.ts +5 -0
  139. package/dist/network/transport-error.js +31 -0
  140. package/dist/process/contracts.d.ts +26 -0
  141. package/dist/prompts/index.d.ts +20 -0
  142. package/dist/prompts/index.js +49 -0
  143. package/dist/prompts/prompt-sections.d.ts +6 -0
  144. package/dist/prompts/prompt-sections.js +6 -0
  145. package/dist/prompts/read-context.js +152 -0
  146. package/dist/runtime/compaction/contracts.d.ts +23 -0
  147. package/dist/runtime/compaction/coordinator.js +88 -0
  148. package/dist/runtime/compaction/generate.d.ts +31 -0
  149. package/dist/runtime/compaction/generate.js +84 -0
  150. package/dist/runtime/compaction/history.d.ts +16 -0
  151. package/dist/runtime/compaction/operation.d.ts +30 -0
  152. package/dist/runtime/compaction/operation.js +131 -0
  153. package/dist/runtime/compaction/requests.d.ts +16 -0
  154. package/dist/runtime/compaction/requests.js +114 -0
  155. package/dist/runtime/compaction/retained-context.d.ts +6 -0
  156. package/dist/runtime/compaction/retained-context.js +48 -0
  157. package/dist/runtime/compaction/smart.d.ts +14 -0
  158. package/dist/runtime/compaction/smart.js +59 -0
  159. package/dist/runtime/context/contextual-blocks.d.ts +31 -0
  160. package/dist/runtime/context/contextual-blocks.js +158 -0
  161. package/dist/runtime/context/environment.d.ts +5 -0
  162. package/dist/runtime/context/gc-candidates-code.d.ts +6 -0
  163. package/dist/runtime/context/gc-candidates-code.js +102 -0
  164. package/dist/runtime/context/gc-candidates-exec.d.ts +6 -0
  165. package/dist/runtime/context/gc-candidates-exec.js +131 -0
  166. package/dist/runtime/context/gc-candidates-read-patch.d.ts +7 -0
  167. package/dist/runtime/context/gc-candidates-read-patch.js +118 -0
  168. package/dist/runtime/context/gc-candidates-subagent.d.ts +6 -0
  169. package/dist/runtime/context/gc-candidates-subagent.js +100 -0
  170. package/dist/runtime/context/gc-candidates-web.d.ts +6 -0
  171. package/dist/runtime/context/gc-candidates-web.js +58 -0
  172. package/dist/runtime/context/gc-candidates.d.ts +12 -0
  173. package/dist/runtime/context/gc-candidates.js +192 -0
  174. package/dist/runtime/context/gc-contracts.d.ts +57 -0
  175. package/dist/runtime/context/gc-economics.d.ts +48 -0
  176. package/dist/runtime/context/gc-economics.js +161 -0
  177. package/dist/runtime/context/gc-runtime.d.ts +43 -0
  178. package/dist/runtime/context/gc-tokens.d.ts +26 -0
  179. package/dist/runtime/context/gc-tokens.js +106 -0
  180. package/dist/runtime/context/gc.d.ts +7 -0
  181. package/dist/runtime/context/gc.js +552 -0
  182. package/dist/runtime/context/instructions.d.ts +37 -0
  183. package/dist/runtime/context/instructions.js +297 -0
  184. package/dist/runtime/context/normalize.d.ts +5 -0
  185. package/dist/runtime/context/projection.d.ts +23 -0
  186. package/dist/runtime/context/projection.js +284 -0
  187. package/dist/runtime/context/request-budget.d.ts +5 -0
  188. package/dist/runtime/context/request-budget.js +25 -0
  189. package/dist/runtime/context/restore.d.ts +27 -0
  190. package/dist/runtime/context/restore.js +186 -0
  191. package/dist/runtime/context/usage.d.ts +17 -0
  192. package/dist/runtime/context/usage.js +124 -0
  193. package/dist/runtime/context/world-state.d.ts +34 -0
  194. package/dist/runtime/context/world-state.js +232 -0
  195. package/dist/runtime/contracts.d.ts +29 -0
  196. package/dist/runtime/event-projection.d.ts +14 -0
  197. package/dist/runtime/event-projection.js +87 -0
  198. package/dist/runtime/events.d.ts +195 -0
  199. package/dist/runtime/execution-handle.d.ts +12 -0
  200. package/dist/runtime/execution-handle.js +1 -0
  201. package/dist/runtime/execution.d.ts +55 -0
  202. package/dist/runtime/execution.js +444 -0
  203. package/dist/runtime/model-progress.js +85 -0
  204. package/dist/runtime/resource-publication.d.ts +27 -0
  205. package/dist/runtime/resource-publication.js +60 -0
  206. package/dist/runtime/tool-round-contract.d.ts +19 -0
  207. package/dist/runtime/tool-round-contract.js +1 -0
  208. package/dist/runtime/wait.js +82 -0
  209. package/dist/sandbox/linux/bubblewrap-sandbox-executor.d.ts +1 -1
  210. package/dist/sandbox/linux/bubblewrap-sandbox-executor.js +8 -8
  211. package/dist/sdk/agent.d.ts +7 -0
  212. package/dist/sdk/agent.js +321 -0
  213. package/dist/sdk/execution-code-mode.d.ts +18 -0
  214. package/dist/sdk/execution-code-mode.js +51 -0
  215. package/dist/sdk/execution-compact-commit.d.ts +23 -0
  216. package/dist/sdk/execution-compact-commit.js +41 -0
  217. package/dist/sdk/execution-compact-extension.d.ts +12 -0
  218. package/dist/sdk/execution-compact-extension.js +46 -0
  219. package/dist/sdk/execution-compact-generation.d.ts +17 -0
  220. package/dist/sdk/execution-compact-generation.js +30 -0
  221. package/dist/sdk/execution-compaction-flight.d.ts +31 -0
  222. package/dist/sdk/execution-compaction-flight.js +50 -0
  223. package/dist/sdk/execution-compaction.d.ts +47 -0
  224. package/dist/sdk/execution-compaction.js +121 -0
  225. package/dist/sdk/execution-context-coordinator.d.ts +56 -0
  226. package/dist/sdk/execution-context-coordinator.js +102 -0
  227. package/dist/sdk/execution-input.d.ts +58 -0
  228. package/dist/sdk/execution-input.js +266 -0
  229. package/dist/sdk/execution-model-context.d.ts +52 -0
  230. package/dist/sdk/execution-model-context.js +156 -0
  231. package/dist/sdk/execution-model-lifecycle.d.ts +39 -0
  232. package/dist/sdk/execution-model-lifecycle.js +73 -0
  233. package/dist/sdk/execution-model-request.d.ts +40 -0
  234. package/dist/sdk/execution-model-request.js +45 -0
  235. package/dist/sdk/execution-round-preparation.d.ts +11 -0
  236. package/dist/sdk/execution-round-preparation.js +18 -0
  237. package/dist/sdk/execution-round-request.d.ts +30 -0
  238. package/dist/sdk/execution-round-request.js +31 -0
  239. package/dist/sdk/execution-tool-catalog.d.ts +46 -0
  240. package/dist/sdk/execution-tool-catalog.js +103 -0
  241. package/dist/sdk/execution-tool-scope.d.ts +67 -0
  242. package/dist/sdk/execution-tool-scope.js +147 -0
  243. package/dist/sdk/extension-agent-controller.d.ts +3 -0
  244. package/dist/sdk/extension-agent-controller.js +69 -0
  245. package/dist/sdk/extension-agents.d.ts +9 -0
  246. package/dist/sdk/extension-agents.js +58 -0
  247. package/dist/sdk/extension-models.d.ts +17 -0
  248. package/dist/sdk/extension-models.js +142 -0
  249. package/dist/sdk/extension-session-launch.d.ts +18 -0
  250. package/dist/sdk/extension-session-launch.js +73 -0
  251. package/dist/sdk/extension-session.d.ts +30 -0
  252. package/dist/sdk/extension-session.js +107 -0
  253. package/dist/sdk/extension-tool-runtime.d.ts +2 -0
  254. package/dist/sdk/extension-tool-runtime.js +14 -0
  255. package/dist/sdk/extension-tools.d.ts +16 -0
  256. package/dist/sdk/extension-tools.js +126 -0
  257. package/dist/sdk/model-input-projection.d.ts +4 -0
  258. package/dist/sdk/model-input-projection.js +27 -0
  259. package/dist/sdk/model-runtime.d.ts +21 -0
  260. package/dist/sdk/model-runtime.js +91 -0
  261. package/dist/sdk/native-steer.d.ts +20 -0
  262. package/dist/sdk/native-steer.js +84 -0
  263. package/dist/sdk/request-preparation.d.ts +9 -0
  264. package/dist/sdk/resource-input.d.ts +33 -0
  265. package/dist/sdk/resource-input.js +402 -0
  266. package/dist/sdk/session-catalog.d.ts +2 -0
  267. package/dist/sdk/session-catalog.js +12 -0
  268. package/dist/sdk/session-composition.d.ts +54 -0
  269. package/dist/sdk/session-composition.js +1 -0
  270. package/dist/sdk/session-execution-factory.d.ts +43 -0
  271. package/dist/sdk/session-execution-factory.js +937 -0
  272. package/dist/sdk/session-execution.d.ts +163 -0
  273. package/dist/sdk/session-execution.js +388 -0
  274. package/dist/sdk/session-extension-messages.d.ts +16 -0
  275. package/dist/sdk/session-extension-messages.js +64 -0
  276. package/dist/sdk/session-extension-prompt.d.ts +35 -0
  277. package/dist/sdk/session-extension-prompt.js +62 -0
  278. package/dist/sdk/session-maintenance.d.ts +25 -0
  279. package/dist/sdk/session-maintenance.js +205 -0
  280. package/dist/sdk/session-model-adapters.d.ts +28 -0
  281. package/dist/sdk/session-model-adapters.js +96 -0
  282. package/dist/sdk/session-open.d.ts +22 -0
  283. package/dist/sdk/session-open.js +44 -0
  284. package/dist/sdk/session-registry.d.ts +17 -0
  285. package/dist/sdk/session-registry.js +83 -0
  286. package/dist/sdk/session-runtime.d.ts +72 -0
  287. package/dist/sdk/session-runtime.js +205 -0
  288. package/dist/sdk/session.d.ts +3 -0
  289. package/dist/sdk/session.js +313 -0
  290. package/dist/sdk/subagent-backend.d.ts +3 -0
  291. package/dist/sdk/subagent-backend.js +49 -0
  292. package/dist/sdk/types.d.ts +80 -0
  293. package/dist/sdk/types.js +1 -0
  294. package/dist/session/catalog.d.ts +70 -0
  295. package/dist/session/catalog.js +194 -0
  296. package/dist/session/code-observation-contract.d.ts +40 -0
  297. package/dist/session/code-observation-contract.js +1 -0
  298. package/dist/session/code-observation-projection.d.ts +54 -0
  299. package/dist/session/code-observation-projection.js +165 -0
  300. package/dist/session/code-state.d.ts +27 -0
  301. package/dist/session/code-state.js +89 -0
  302. package/dist/session/context-gc-checkpoint.d.ts +26 -0
  303. package/dist/session/context-gc-checkpoint.js +935 -0
  304. package/dist/session/context-gc-contract.d.ts +141 -0
  305. package/dist/session/context-gc-contract.js +1 -0
  306. package/dist/session/context-gc-observations.d.ts +58 -0
  307. package/dist/session/context-gc-observations.js +187 -0
  308. package/dist/session/context-gc-replacements.d.ts +63 -0
  309. package/dist/session/context-gc-subagent.d.ts +54 -0
  310. package/dist/session/deferred-input.d.ts +5 -0
  311. package/dist/session/deferred-input.js +74 -0
  312. package/dist/session/extension-checkpoint.d.ts +8 -0
  313. package/dist/session/extension-checkpoint.js +30 -0
  314. package/dist/session/history-input-limits.d.ts +4 -0
  315. package/dist/session/history-input-limits.js +4 -0
  316. package/dist/session/inline-media-contract.d.ts +16 -0
  317. package/dist/session/inline-media-contract.js +1 -0
  318. package/dist/session/inline-media.d.ts +26 -0
  319. package/dist/session/inline-media.js +138 -0
  320. package/dist/session/model-request.d.ts +14 -0
  321. package/dist/session/model-request.js +1 -0
  322. package/dist/session/record-contract.d.ts +19 -0
  323. package/dist/session/record-contract.js +1 -0
  324. package/dist/session/record-projection.d.ts +6 -0
  325. package/dist/session/record-projection.js +80 -0
  326. package/dist/session/resource-contract.d.ts +9 -0
  327. package/dist/session/resource-contract.js +1 -0
  328. package/dist/session/rollback.d.ts +13 -0
  329. package/dist/session/rollback.js +46 -0
  330. package/dist/session/store/contracts.d.ts +160 -0
  331. package/dist/session/store/contracts.js +1 -0
  332. package/dist/session/store/current-state.d.ts +17 -0
  333. package/dist/session/store/current-state.js +53 -0
  334. package/dist/session/store/execution-state.d.ts +13 -0
  335. package/dist/session/store/execution-state.js +103 -0
  336. package/dist/session/store/index.d.ts +4 -0
  337. package/dist/session/store/index.js +2 -0
  338. package/dist/session/store/jsonl/directory-index.d.ts +26 -0
  339. package/dist/session/store/jsonl/directory-index.js +283 -0
  340. package/dist/session/store/jsonl/fs-durability.d.ts +3 -0
  341. package/dist/session/store/jsonl/fs-durability.js +17 -0
  342. package/dist/session/store/jsonl/history-replacement.d.ts +48 -0
  343. package/dist/session/store/jsonl/history-replacement.js +147 -0
  344. package/dist/session/store/jsonl/history.d.ts +25 -0
  345. package/dist/session/store/jsonl/history.js +181 -0
  346. package/dist/session/store/jsonl/images.d.ts +19 -0
  347. package/dist/session/store/jsonl/images.js +122 -0
  348. package/dist/session/store/jsonl/index-transaction.d.ts +13 -0
  349. package/dist/session/store/jsonl/index-transaction.js +87 -0
  350. package/dist/session/store/jsonl/jsonl-admission.d.ts +10 -0
  351. package/dist/session/store/jsonl/jsonl-admission.js +205 -0
  352. package/dist/session/store/jsonl/jsonl-codec.d.ts +11 -0
  353. package/dist/session/store/jsonl/jsonl-codec.js +138 -0
  354. package/dist/session/store/jsonl/jsonl-migration.d.ts +12 -0
  355. package/dist/session/store/jsonl/jsonl-migration.js +105 -0
  356. package/dist/session/store/jsonl/jsonl-store.d.ts +171 -0
  357. package/dist/session/store/jsonl/jsonl-store.js +2482 -0
  358. package/dist/session/store/jsonl/open-recovery.d.ts +13 -0
  359. package/dist/session/store/jsonl/open-recovery.js +131 -0
  360. package/dist/session/store/jsonl/read-pins.d.ts +4 -0
  361. package/dist/session/store/jsonl/read-pins.js +131 -0
  362. package/dist/session/store/jsonl/record-append.d.ts +16 -0
  363. package/dist/session/store/jsonl/record-append.js +49 -0
  364. package/dist/session/store/jsonl/records.d.ts +30 -0
  365. package/dist/session/store/jsonl/records.js +313 -0
  366. package/dist/session/store/jsonl/resources.d.ts +19 -0
  367. package/dist/session/store/jsonl/resources.js +209 -0
  368. package/dist/session/store/jsonl/store-pool.d.ts +12 -0
  369. package/dist/session/store/jsonl/store-pool.js +55 -0
  370. package/dist/session/store/jsonl/transaction-recovery.d.ts +48 -0
  371. package/dist/session/store/jsonl/transaction-recovery.js +374 -0
  372. package/dist/session/store/jsonl/tree-maintenance.d.ts +12 -0
  373. package/dist/session/store/jsonl/tree-maintenance.js +59 -0
  374. package/dist/session/store/types.d.ts +69 -0
  375. package/dist/session/store/types.js +1 -0
  376. package/dist/session/summary.d.ts +18 -0
  377. package/dist/session/summary.js +1 -0
  378. package/dist/session/todo.d.ts +11 -0
  379. package/dist/session/todo.js +30 -0
  380. package/dist/session/tool-result-resources.d.ts +27 -0
  381. package/dist/session/tool-result-resources.js +255 -0
  382. package/dist/session/types.js +1 -0
  383. package/dist/session/user-history.d.ts +17 -0
  384. package/dist/session/user-history.js +1 -0
  385. package/dist/session-store.d.ts +2 -0
  386. package/dist/session-store.js +1 -0
  387. package/dist/shared/auto-title.d.ts +3 -3
  388. package/dist/shared/auto-title.js +6 -6
  389. package/dist/shared/model-text.d.ts +8 -8
  390. package/dist/shared/model-text.js +8 -7
  391. package/dist/storage/file-lock.js +83 -0
  392. package/dist/subagent/contracts.d.ts +107 -0
  393. package/dist/subagent/contracts.js +1 -0
  394. package/dist/subagent/limits.d.ts +17 -0
  395. package/dist/subagent/limits.js +17 -0
  396. package/dist/subagent/model-update.js +81 -0
  397. package/dist/subagent/session-controller.d.ts +148 -0
  398. package/dist/subagent/session-controller.js +1761 -0
  399. package/dist/subagent/wait-targets.d.ts +10 -0
  400. package/dist/subagent/wait-targets.js +26 -0
  401. package/dist/subagent/wait.d.ts +26 -0
  402. package/dist/subagent/wait.js +73 -0
  403. package/dist/tools/agent/agent-cancel.d.ts +7 -0
  404. package/dist/tools/agent/agent-cancel.js +29 -0
  405. package/dist/tools/agent/agent-message.d.ts +7 -0
  406. package/dist/tools/agent/agent-message.js +57 -0
  407. package/dist/tools/agent/agent-start.d.ts +12 -0
  408. package/dist/tools/agent/agent-start.js +106 -0
  409. package/dist/tools/agent/agent-wait.d.ts +7 -0
  410. package/dist/tools/agent/agent-wait.js +91 -0
  411. package/dist/tools/agent/question.d.ts +7 -0
  412. package/dist/tools/agent/question.js +125 -0
  413. package/dist/tools/agent/skill.d.ts +11 -0
  414. package/dist/tools/agent/skill.js +38 -0
  415. package/dist/tools/agent/sleep.d.ts +9 -0
  416. package/dist/tools/agent/sleep.js +54 -0
  417. package/dist/tools/agent/smart-compact.d.ts +9 -0
  418. package/dist/tools/agent/smart-compact.js +23 -0
  419. package/dist/tools/agent/todo-read.d.ts +14 -0
  420. package/dist/tools/agent/todo-write.d.ts +14 -0
  421. package/dist/tools/agent/todo-write.js +66 -0
  422. package/dist/tools/agent/todo.d.ts +25 -0
  423. package/dist/tools/agent/todo.js +32 -0
  424. package/dist/tools/callers.d.ts +7 -0
  425. package/dist/tools/callers.js +39 -0
  426. package/dist/tools/code-mode/cells.d.ts +29 -0
  427. package/dist/tools/code-mode/cells.js +338 -0
  428. package/dist/tools/code-mode/dispatch.d.ts +20 -0
  429. package/dist/tools/code-mode/dispatch.js +80 -0
  430. package/dist/tools/code-mode/engine.d.ts +60 -0
  431. package/dist/tools/code-mode/engine.js +1 -0
  432. package/dist/tools/code-mode/index.d.ts +31 -0
  433. package/dist/tools/code-mode/index.js +751 -0
  434. package/dist/tools/code-mode/observations.d.ts +8 -0
  435. package/dist/tools/code-mode/observations.js +64 -0
  436. package/dist/tools/code-mode/worker.d.ts +1 -0
  437. package/dist/tools/contracts.d.ts +193 -0
  438. package/dist/tools/contracts.js +1 -0
  439. package/dist/tools/definition-projection.d.ts +1 -0
  440. package/dist/tools/definition-projection.js +1 -0
  441. package/dist/tools/execution-limits.d.ts +69 -0
  442. package/dist/tools/execution-limits.js +58 -0
  443. package/dist/tools/execution.d.ts +30 -0
  444. package/dist/tools/execution.js +191 -0
  445. package/dist/tools/local/apply-patch-parser.js +177 -0
  446. package/dist/tools/local/apply-patch.d.ts +19 -0
  447. package/dist/tools/local/apply-patch.js +489 -0
  448. package/dist/tools/local/exec.d.ts +28 -0
  449. package/dist/tools/local/exec.js +194 -0
  450. package/dist/tools/local/image-processing.js +146 -0
  451. package/dist/tools/local/read.d.ts +43 -0
  452. package/dist/tools/local/read.js +470 -0
  453. package/dist/tools/local/view-image.d.ts +15 -0
  454. package/dist/tools/local/view-image.js +317 -0
  455. package/dist/tools/mcp/catalog.js +220 -0
  456. package/dist/tools/mcp/history.d.ts +4 -0
  457. package/dist/tools/mcp/tool-search.d.ts +45 -0
  458. package/dist/tools/mcp/tool-search.js +294 -0
  459. package/dist/tools/output-projection.d.ts +18 -0
  460. package/dist/tools/output-projection.js +341 -0
  461. package/dist/tools/permission-contract.d.ts +25 -0
  462. package/dist/tools/permission-contract.js +1 -0
  463. package/dist/tools/permissions.d.ts +61 -0
  464. package/dist/tools/permissions.js +237 -0
  465. package/dist/tools/registry.d.ts +7 -0
  466. package/dist/tools/result-extension-contract.d.ts +37 -0
  467. package/dist/tools/result-extension-contract.js +32 -0
  468. package/dist/tools/result-extensions.d.ts +12 -0
  469. package/dist/tools/result-extensions.js +104 -0
  470. package/dist/tools/runtime-context.d.ts +89 -0
  471. package/dist/tools/runtime-context.js +1 -0
  472. package/dist/tools/runtime-resource-handles.js +28 -0
  473. package/dist/tools/runtime.js +77 -0
  474. package/dist/tools/scheduler.d.ts +12 -0
  475. package/dist/tools/shared/path-resolver.js +133 -0
  476. package/dist/tools/wait.d.ts +1 -0
  477. package/dist/tools/wait.js +1 -0
  478. package/package.json +15 -3
  479. package/dist/agent-core/error.d.ts +0 -15
  480. package/dist/agent-core/error.js +0 -74
  481. package/dist/agent-core/extensions/agents.d.ts +0 -79
  482. package/dist/agent-core/extensions/agents.js +0 -186
  483. package/dist/agent-core/extensions/compaction.d.ts +0 -48
  484. package/dist/agent-core/extensions/contracts.d.ts +0 -265
  485. package/dist/agent-core/extensions/data.d.ts +0 -84
  486. package/dist/agent-core/extensions/data.js +0 -83
  487. package/dist/agent-core/extensions/environment.d.ts +0 -27
  488. package/dist/agent-core/extensions/environment.js +0 -52
  489. package/dist/agent-core/extensions/files.d.ts +0 -64
  490. package/dist/agent-core/extensions/files.js +0 -26
  491. package/dist/agent-core/extensions/hooks.d.ts +0 -32
  492. package/dist/agent-core/extensions/manager.d.ts +0 -39
  493. package/dist/agent-core/extensions/manager.js +0 -458
  494. package/dist/agent-core/extensions/mcp.d.ts +0 -99
  495. package/dist/agent-core/extensions/mcp.js +0 -433
  496. package/dist/agent-core/extensions/model-request.d.ts +0 -56
  497. package/dist/agent-core/extensions/model-request.js +0 -197
  498. package/dist/agent-core/extensions/model-stream.d.ts +0 -9
  499. package/dist/agent-core/extensions/model-stream.js +0 -108
  500. package/dist/agent-core/extensions/models.d.ts +0 -43
  501. package/dist/agent-core/extensions/network.d.ts +0 -32
  502. package/dist/agent-core/extensions/network.js +0 -97
  503. package/dist/agent-core/extensions/operation.d.ts +0 -30
  504. package/dist/agent-core/extensions/processes.d.ts +0 -52
  505. package/dist/agent-core/extensions/processes.js +0 -284
  506. package/dist/agent-core/extensions/prompt-composition.d.ts +0 -24
  507. package/dist/agent-core/extensions/prompt-composition.js +0 -106
  508. package/dist/agent-core/extensions/prompt-input.d.ts +0 -23
  509. package/dist/agent-core/extensions/prompt-input.js +0 -48
  510. package/dist/agent-core/extensions/resources.d.ts +0 -27
  511. package/dist/agent-core/extensions/resources.js +0 -221
  512. package/dist/agent-core/extensions/services.d.ts +0 -31
  513. package/dist/agent-core/extensions/services.js +0 -61
  514. package/dist/agent-core/extensions/session-input.d.ts +0 -163
  515. package/dist/agent-core/extensions/session-input.js +0 -411
  516. package/dist/agent-core/extensions/session-messages.d.ts +0 -41
  517. package/dist/agent-core/extensions/session-messages.js +0 -76
  518. package/dist/agent-core/extensions/session.d.ts +0 -69
  519. package/dist/agent-core/extensions/session.js +0 -607
  520. package/dist/agent-core/extensions/settings.d.ts +0 -59
  521. package/dist/agent-core/extensions/settings.js +0 -115
  522. package/dist/agent-core/extensions/store.d.ts +0 -10
  523. package/dist/agent-core/extensions/store.js +0 -131
  524. package/dist/agent-core/extensions/tools.d.ts +0 -61
  525. package/dist/agent-core/extensions/tools.js +0 -269
  526. package/dist/agent-core/host/contracts.d.ts +0 -100
  527. package/dist/agent-core/host/contracts.js +0 -18
  528. package/dist/agent-core/host/local-agent-host.d.ts +0 -96
  529. package/dist/agent-core/host/local-agent-host.js +0 -425
  530. package/dist/agent-core/host/local-file-access.d.ts +0 -30
  531. package/dist/agent-core/host/local-file-access.js +0 -107
  532. package/dist/agent-core/host/local-network-access.d.ts +0 -6
  533. package/dist/agent-core/host/local-network-access.js +0 -101
  534. package/dist/agent-core/host/local-process-executor.d.ts +0 -29
  535. package/dist/agent-core/host/local-process-executor.js +0 -41
  536. package/dist/agent-core/host/local-session-environment.d.ts +0 -18
  537. package/dist/agent-core/host/local-shell.d.ts +0 -3
  538. package/dist/agent-core/host/network.d.ts +0 -4
  539. package/dist/agent-core/host/network.js +0 -6
  540. package/dist/agent-core/model/anthropic-messages.d.ts +0 -10
  541. package/dist/agent-core/model/anthropic-messages.js +0 -707
  542. package/dist/agent-core/model/anthropic-thinking.js +0 -33
  543. package/dist/agent-core/model/catalog-file.d.ts +0 -80
  544. package/dist/agent-core/model/catalog-file.js +0 -103
  545. package/dist/agent-core/model/configuration.d.ts +0 -127
  546. package/dist/agent-core/model/configuration.js +0 -168
  547. package/dist/agent-core/model/contracts.d.ts +0 -229
  548. package/dist/agent-core/model/http.d.ts +0 -27
  549. package/dist/agent-core/model/http.js +0 -534
  550. package/dist/agent-core/model/image.d.ts +0 -17
  551. package/dist/agent-core/model/openai-responses.d.ts +0 -77
  552. package/dist/agent-core/model/openai-responses.js +0 -2123
  553. package/dist/agent-core/model/product-user-agent.d.ts +0 -5
  554. package/dist/agent-core/model/product-user-agent.js +0 -22
  555. package/dist/agent-core/model/recovery.js +0 -80
  556. package/dist/agent-core/model/request-configuration.d.ts +0 -17
  557. package/dist/agent-core/model/request-configuration.js +0 -47
  558. package/dist/agent-core/model/runtime-credential.d.ts +0 -8
  559. package/dist/agent-core/model/runtime-credential.js +0 -72
  560. package/dist/agent-core/model/sse.js +0 -281
  561. package/dist/agent-core/model/text-blocks.js +0 -40
  562. package/dist/agent-core/model/tool-declarations.d.ts +0 -4
  563. package/dist/agent-core/model/transport-test.d.ts +0 -3
  564. package/dist/agent-core/model/transport-test.js +0 -23
  565. package/dist/agent-core/model/usage-observer.d.ts +0 -31
  566. package/dist/agent-core/prompts/index.d.ts +0 -20
  567. package/dist/agent-core/prompts/index.js +0 -49
  568. package/dist/agent-core/runtime/compaction/coordinator.js +0 -88
  569. package/dist/agent-core/runtime/compaction/generate.d.ts +0 -28
  570. package/dist/agent-core/runtime/compaction/generate.js +0 -84
  571. package/dist/agent-core/runtime/compaction/history.d.ts +0 -16
  572. package/dist/agent-core/runtime/compaction/operation.d.ts +0 -29
  573. package/dist/agent-core/runtime/compaction/operation.js +0 -131
  574. package/dist/agent-core/runtime/compaction/requests.d.ts +0 -16
  575. package/dist/agent-core/runtime/compaction/requests.js +0 -114
  576. package/dist/agent-core/runtime/compaction/retained-context.d.ts +0 -6
  577. package/dist/agent-core/runtime/compaction/retained-context.js +0 -47
  578. package/dist/agent-core/runtime/compaction/smart.d.ts +0 -14
  579. package/dist/agent-core/runtime/compaction/smart.js +0 -59
  580. package/dist/agent-core/runtime/context/contextual-blocks.d.ts +0 -30
  581. package/dist/agent-core/runtime/context/contextual-blocks.js +0 -146
  582. package/dist/agent-core/runtime/context/environment.d.ts +0 -5
  583. package/dist/agent-core/runtime/context/gc-runtime.d.ts +0 -38
  584. package/dist/agent-core/runtime/context/gc-tokens.d.ts +0 -25
  585. package/dist/agent-core/runtime/context/gc-tokens.js +0 -103
  586. package/dist/agent-core/runtime/context/gc.d.ts +0 -75
  587. package/dist/agent-core/runtime/context/gc.js +0 -1386
  588. package/dist/agent-core/runtime/context/instructions.d.ts +0 -37
  589. package/dist/agent-core/runtime/context/instructions.js +0 -297
  590. package/dist/agent-core/runtime/context/normalize.d.ts +0 -5
  591. package/dist/agent-core/runtime/context/projection.d.ts +0 -23
  592. package/dist/agent-core/runtime/context/projection.js +0 -284
  593. package/dist/agent-core/runtime/context/request-budget.d.ts +0 -4
  594. package/dist/agent-core/runtime/context/request-budget.js +0 -25
  595. package/dist/agent-core/runtime/context/restore.d.ts +0 -25
  596. package/dist/agent-core/runtime/context/restore.js +0 -186
  597. package/dist/agent-core/runtime/context/usage.d.ts +0 -17
  598. package/dist/agent-core/runtime/context/usage.js +0 -124
  599. package/dist/agent-core/runtime/context/world-state.d.ts +0 -33
  600. package/dist/agent-core/runtime/context/world-state.js +0 -232
  601. package/dist/agent-core/runtime/contracts.d.ts +0 -41
  602. package/dist/agent-core/runtime/event-projection.d.ts +0 -14
  603. package/dist/agent-core/runtime/event-projection.js +0 -87
  604. package/dist/agent-core/runtime/events.d.ts +0 -197
  605. package/dist/agent-core/runtime/execution-handle.d.ts +0 -12
  606. package/dist/agent-core/runtime/execution.d.ts +0 -50
  607. package/dist/agent-core/runtime/execution.js +0 -445
  608. package/dist/agent-core/runtime/model-progress.js +0 -85
  609. package/dist/agent-core/runtime/resource-publication.d.ts +0 -8
  610. package/dist/agent-core/runtime/resource-publication.js +0 -60
  611. package/dist/agent-core/sdk/agent.d.ts +0 -11
  612. package/dist/agent-core/sdk/agent.js +0 -474
  613. package/dist/agent-core/sdk/extension-agents.d.ts +0 -9
  614. package/dist/agent-core/sdk/extension-agents.js +0 -58
  615. package/dist/agent-core/sdk/extension-models.d.ts +0 -13
  616. package/dist/agent-core/sdk/extension-models.js +0 -137
  617. package/dist/agent-core/sdk/extension-session.d.ts +0 -30
  618. package/dist/agent-core/sdk/extension-session.js +0 -105
  619. package/dist/agent-core/sdk/extension-tools.d.ts +0 -16
  620. package/dist/agent-core/sdk/extension-tools.js +0 -126
  621. package/dist/agent-core/sdk/model-runtime.d.ts +0 -18
  622. package/dist/agent-core/sdk/model-runtime.js +0 -93
  623. package/dist/agent-core/sdk/native-steer.d.ts +0 -20
  624. package/dist/agent-core/sdk/native-steer.js +0 -84
  625. package/dist/agent-core/sdk/request-preparation.d.ts +0 -7
  626. package/dist/agent-core/sdk/resource-input.d.ts +0 -32
  627. package/dist/agent-core/sdk/resource-input.js +0 -403
  628. package/dist/agent-core/sdk/session.d.ts +0 -94
  629. package/dist/agent-core/sdk/session.js +0 -2377
  630. package/dist/agent-core/sdk/subagent-backend.d.ts +0 -3
  631. package/dist/agent-core/sdk/subagent-backend.js +0 -49
  632. package/dist/agent-core/sdk/types.d.ts +0 -81
  633. package/dist/agent-core/session/catalog.d.ts +0 -99
  634. package/dist/agent-core/session/catalog.js +0 -200
  635. package/dist/agent-core/session/context-gc-checkpoint.d.ts +0 -165
  636. package/dist/agent-core/session/context-gc-checkpoint.js +0 -935
  637. package/dist/agent-core/session/context-gc-observations.d.ts +0 -60
  638. package/dist/agent-core/session/context-gc-observations.js +0 -187
  639. package/dist/agent-core/session/context-gc-replacements.d.ts +0 -62
  640. package/dist/agent-core/session/context-gc-subagent.d.ts +0 -53
  641. package/dist/agent-core/session/deferred-input.d.ts +0 -5
  642. package/dist/agent-core/session/deferred-input.js +0 -74
  643. package/dist/agent-core/session/inline-media.d.ts +0 -45
  644. package/dist/agent-core/session/inline-media.js +0 -163
  645. package/dist/agent-core/session/rollback.d.ts +0 -13
  646. package/dist/agent-core/session/rollback.js +0 -46
  647. package/dist/agent-core/session/store/contracts.d.ts +0 -158
  648. package/dist/agent-core/session/store/current-state.d.ts +0 -17
  649. package/dist/agent-core/session/store/current-state.js +0 -53
  650. package/dist/agent-core/session/store/directory-index.d.ts +0 -18
  651. package/dist/agent-core/session/store/directory-index.js +0 -169
  652. package/dist/agent-core/session/store/execution-state.d.ts +0 -18
  653. package/dist/agent-core/session/store/execution-state.js +0 -175
  654. package/dist/agent-core/session/store/history.d.ts +0 -25
  655. package/dist/agent-core/session/store/history.js +0 -181
  656. package/dist/agent-core/session/store/images.d.ts +0 -19
  657. package/dist/agent-core/session/store/images.js +0 -110
  658. package/dist/agent-core/session/store/index.d.ts +0 -4
  659. package/dist/agent-core/session/store/index.js +0 -2
  660. package/dist/agent-core/session/store/jsonl-store.d.ts +0 -171
  661. package/dist/agent-core/session/store/jsonl-store.js +0 -2078
  662. package/dist/agent-core/session/store/records.d.ts +0 -23
  663. package/dist/agent-core/session/store/records.js +0 -261
  664. package/dist/agent-core/session/store/resources.d.ts +0 -26
  665. package/dist/agent-core/session/store/resources.js +0 -197
  666. package/dist/agent-core/session/store/types.d.ts +0 -82
  667. package/dist/agent-core/session/tool-result-resources.d.ts +0 -26
  668. package/dist/agent-core/session/tool-result-resources.js +0 -256
  669. package/dist/agent-core/session/transaction-recovery.d.ts +0 -16
  670. package/dist/agent-core/session/transaction-recovery.js +0 -135
  671. package/dist/agent-core/storage/file-lock.js +0 -83
  672. package/dist/agent-core/subagent/contracts.d.ts +0 -117
  673. package/dist/agent-core/subagent/model-update.js +0 -81
  674. package/dist/agent-core/subagent/scheduler.d.ts +0 -135
  675. package/dist/agent-core/subagent/scheduler.js +0 -369
  676. package/dist/agent-core/subagent/session-controller.d.ts +0 -138
  677. package/dist/agent-core/subagent/session-controller.js +0 -1594
  678. package/dist/agent-core/subagent/wait.d.ts +0 -14
  679. package/dist/agent-core/subagent/wait.js +0 -32
  680. package/dist/agent-core/tools/agent/agent-cancel.d.ts +0 -7
  681. package/dist/agent-core/tools/agent/agent-cancel.js +0 -29
  682. package/dist/agent-core/tools/agent/agent-message.d.ts +0 -7
  683. package/dist/agent-core/tools/agent/agent-message.js +0 -57
  684. package/dist/agent-core/tools/agent/agent-start.d.ts +0 -12
  685. package/dist/agent-core/tools/agent/agent-start.js +0 -106
  686. package/dist/agent-core/tools/agent/agent-wait.d.ts +0 -7
  687. package/dist/agent-core/tools/agent/agent-wait.js +0 -91
  688. package/dist/agent-core/tools/agent/question.d.ts +0 -7
  689. package/dist/agent-core/tools/agent/question.js +0 -125
  690. package/dist/agent-core/tools/agent/skill.d.ts +0 -11
  691. package/dist/agent-core/tools/agent/skill.js +0 -38
  692. package/dist/agent-core/tools/agent/sleep.d.ts +0 -12
  693. package/dist/agent-core/tools/agent/sleep.js +0 -54
  694. package/dist/agent-core/tools/agent/smart-compact.d.ts +0 -9
  695. package/dist/agent-core/tools/agent/smart-compact.js +0 -23
  696. package/dist/agent-core/tools/agent/todo-read.d.ts +0 -14
  697. package/dist/agent-core/tools/agent/todo-write.d.ts +0 -14
  698. package/dist/agent-core/tools/agent/todo-write.js +0 -66
  699. package/dist/agent-core/tools/agent/todo.d.ts +0 -26
  700. package/dist/agent-core/tools/agent/todo.js +0 -60
  701. package/dist/agent-core/tools/callers.d.ts +0 -6
  702. package/dist/agent-core/tools/callers.js +0 -39
  703. package/dist/agent-core/tools/code-mode/cells.d.ts +0 -29
  704. package/dist/agent-core/tools/code-mode/cells.js +0 -337
  705. package/dist/agent-core/tools/code-mode/dispatch.d.ts +0 -20
  706. package/dist/agent-core/tools/code-mode/dispatch.js +0 -80
  707. package/dist/agent-core/tools/code-mode/engine.d.ts +0 -60
  708. package/dist/agent-core/tools/code-mode/index.d.ts +0 -29
  709. package/dist/agent-core/tools/code-mode/index.js +0 -749
  710. package/dist/agent-core/tools/code-mode/observations.d.ts +0 -98
  711. package/dist/agent-core/tools/code-mode/observations.js +0 -228
  712. package/dist/agent-core/tools/code-mode/state.d.ts +0 -9
  713. package/dist/agent-core/tools/code-mode/state.js +0 -82
  714. package/dist/agent-core/tools/contracts.d.ts +0 -211
  715. package/dist/agent-core/tools/definition-projection.d.ts +0 -7
  716. package/dist/agent-core/tools/definition-projection.js +0 -26
  717. package/dist/agent-core/tools/execution-limits.d.ts +0 -69
  718. package/dist/agent-core/tools/execution-limits.js +0 -69
  719. package/dist/agent-core/tools/execution.d.ts +0 -46
  720. package/dist/agent-core/tools/execution.js +0 -191
  721. package/dist/agent-core/tools/local/apply-patch-parser.js +0 -177
  722. package/dist/agent-core/tools/local/apply-patch.d.ts +0 -19
  723. package/dist/agent-core/tools/local/apply-patch.js +0 -489
  724. package/dist/agent-core/tools/local/exec.d.ts +0 -53
  725. package/dist/agent-core/tools/local/exec.js +0 -877
  726. package/dist/agent-core/tools/local/image-processing.js +0 -146
  727. package/dist/agent-core/tools/local/read-context.js +0 -152
  728. package/dist/agent-core/tools/local/read.d.ts +0 -43
  729. package/dist/agent-core/tools/local/read.js +0 -470
  730. package/dist/agent-core/tools/local/registry.d.ts +0 -34
  731. package/dist/agent-core/tools/local/registry.js +0 -132
  732. package/dist/agent-core/tools/local/view-image.d.ts +0 -15
  733. package/dist/agent-core/tools/local/view-image.js +0 -317
  734. package/dist/agent-core/tools/local/workspace-tools.d.ts +0 -12
  735. package/dist/agent-core/tools/local/workspace-tools.js +0 -28
  736. package/dist/agent-core/tools/mcp/catalog.js +0 -220
  737. package/dist/agent-core/tools/mcp/history.d.ts +0 -4
  738. package/dist/agent-core/tools/mcp/tool-search.d.ts +0 -45
  739. package/dist/agent-core/tools/mcp/tool-search.js +0 -294
  740. package/dist/agent-core/tools/output-projection.d.ts +0 -18
  741. package/dist/agent-core/tools/output-projection.js +0 -341
  742. package/dist/agent-core/tools/permissions.d.ts +0 -85
  743. package/dist/agent-core/tools/permissions.js +0 -237
  744. package/dist/agent-core/tools/registry.d.ts +0 -7
  745. package/dist/agent-core/tools/result-extensions.d.ts +0 -46
  746. package/dist/agent-core/tools/result-extensions.js +0 -134
  747. package/dist/agent-core/tools/runtime-context.d.ts +0 -74
  748. package/dist/agent-core/tools/runtime-resource-handles.js +0 -28
  749. package/dist/agent-core/tools/runtime.js +0 -77
  750. package/dist/agent-core/tools/scheduler.d.ts +0 -12
  751. package/dist/agent-core/tools/shared/path-resolver.js +0 -133
  752. package/dist/agent-core/tools/wait.js +0 -82
  753. /package/dist/{agent-core/extensions/models.js → extensions/capabilities.js} +0 -0
  754. /package/dist/{agent-core/extensions → extensions}/compaction.js +0 -0
  755. /package/dist/{agent-core/model → extensions}/contracts.js +0 -0
  756. /package/dist/{agent-core/extensions → extensions}/hooks.js +0 -0
  757. /package/dist/{agent-core/runtime/context/contracts.js → extensions/host-ports.js} +0 -0
  758. /package/dist/{agent-core/extensions → extensions}/operation.js +0 -0
  759. /package/dist/{agent-core/runtime/contracts.js → extensions/tool-runtime.js} +0 -0
  760. /package/dist/{agent-core/extensions/contracts.js → extensions.js} +0 -0
  761. /package/dist/{agent-core/runtime/events.js → host/description.js} +0 -0
  762. /package/dist/{agent-core/host → host}/local-session-environment.js +0 -0
  763. /package/dist/{agent-core/host → host}/local-shell.js +0 -0
  764. /package/dist/{agent-core/runtime/execution-handle.js → host/skill-contract.js} +0 -0
  765. /package/dist/{agent-core/model → model}/anthropic-thinking.d.ts +0 -0
  766. /package/dist/{agent-core/model → model}/attempt-diagnostics.d.ts +0 -0
  767. /package/dist/{agent-core/model → model}/attempt-diagnostics.js +0 -0
  768. /package/dist/{agent-core/session/store → model}/contracts.js +0 -0
  769. /package/dist/{agent-core/sdk/types.js → model/image-contract.js} +0 -0
  770. /package/dist/{agent-core/model → model}/image.js +0 -0
  771. /package/dist/{agent-core/model → model}/native-context.d.ts +0 -0
  772. /package/dist/{agent-core/model → model}/native-context.js +0 -0
  773. /package/dist/{agent-core/model → model}/recovery.d.ts +0 -0
  774. /package/dist/{agent-core/model → model}/sse.d.ts +0 -0
  775. /package/dist/{agent-core/model → model}/text-blocks.d.ts +0 -0
  776. /package/dist/{agent-core/model → model}/tool-declarations.js +0 -0
  777. /package/dist/{agent-core/model → model}/tool-input.d.ts +0 -0
  778. /package/dist/{agent-core/model → model}/tool-input.js +0 -0
  779. /package/dist/{agent-core/model → model}/usage-observer.js +0 -0
  780. /package/dist/{agent-core/session/store/types.js → model/usage.js} +0 -0
  781. /package/dist/{agent-core/subagent → process}/contracts.js +0 -0
  782. /package/dist/{agent-core/prompts → prompts}/compact.d.ts +0 -0
  783. /package/dist/{agent-core/prompts → prompts}/compact.js +0 -0
  784. /package/dist/{agent-core/prompts → prompts}/core.d.ts +0 -0
  785. /package/dist/{agent-core/prompts → prompts}/core.js +0 -0
  786. /package/dist/{agent-core/prompts → prompts}/markup.d.ts +0 -0
  787. /package/dist/{agent-core/prompts → prompts}/markup.js +0 -0
  788. /package/dist/{agent-core/prompts → prompts}/modes.d.ts +0 -0
  789. /package/dist/{agent-core/prompts → prompts}/modes.js +0 -0
  790. /package/dist/{agent-core/prompts → prompts}/output.d.ts +0 -0
  791. /package/dist/{agent-core/prompts → prompts}/output.js +0 -0
  792. /package/dist/{agent-core/prompts → prompts}/permissions.d.ts +0 -0
  793. /package/dist/{agent-core/prompts → prompts}/permissions.js +0 -0
  794. /package/dist/{agent-core/tools/local → prompts}/read-context.d.ts +0 -0
  795. /package/dist/{agent-core/prompts → prompts}/resources.d.ts +0 -0
  796. /package/dist/{agent-core/prompts → prompts}/resources.js +0 -0
  797. /package/dist/{agent-core/prompts → prompts}/subagent.d.ts +0 -0
  798. /package/dist/{agent-core/prompts → prompts}/subagent.js +0 -0
  799. /package/dist/{agent-core/prompts → prompts}/workflow.d.ts +0 -0
  800. /package/dist/{agent-core/prompts → prompts}/workflow.js +0 -0
  801. /package/dist/{agent-core/runtime → runtime}/async-queue.d.ts +0 -0
  802. /package/dist/{agent-core/runtime → runtime}/async-queue.js +0 -0
  803. /package/dist/{agent-core/tools → runtime/compaction}/contracts.js +0 -0
  804. /package/dist/{agent-core/runtime → runtime}/compaction/coordinator.d.ts +0 -0
  805. /package/dist/{agent-core/runtime → runtime}/compaction/history.js +0 -0
  806. /package/dist/{agent-core/runtime → runtime}/context/contracts.d.ts +0 -0
  807. /package/dist/{agent-core/session/types.js → runtime/context/contracts.js} +0 -0
  808. /package/dist/{agent-core/runtime → runtime}/context/environment.js +0 -0
  809. /package/dist/{agent-core/tools/code-mode/engine.js → runtime/context/gc-contracts.js} +0 -0
  810. /package/dist/{agent-core/runtime → runtime}/context/gc-runtime.js +0 -0
  811. /package/dist/{agent-core/runtime → runtime}/context/normalize.js +0 -0
  812. /package/dist/{agent-core/tools/code-mode/worker.d.ts → runtime/contracts.js} +0 -0
  813. /package/dist/{agent-core/tools/runtime-context.js → runtime/events.js} +0 -0
  814. /package/dist/{agent-core/runtime → runtime}/execution-policy.d.ts +0 -0
  815. /package/dist/{agent-core/runtime → runtime}/execution-policy.js +0 -0
  816. /package/dist/{agent-core/runtime → runtime}/model-generation-timing.d.ts +0 -0
  817. /package/dist/{agent-core/runtime → runtime}/model-generation-timing.js +0 -0
  818. /package/dist/{agent-core/runtime → runtime}/model-progress.d.ts +0 -0
  819. /package/dist/{agent-core/runtime → runtime}/plan-output.d.ts +0 -0
  820. /package/dist/{agent-core/runtime → runtime}/plan-output.js +0 -0
  821. /package/dist/{agent-core/tools/public-metadata.d.ts → runtime/public-tool-metadata.d.ts} +0 -0
  822. /package/dist/{agent-core/tools/public-metadata.js → runtime/public-tool-metadata.js} +0 -0
  823. /package/dist/{agent-core/runtime → runtime}/token-budget.d.ts +0 -0
  824. /package/dist/{agent-core/runtime → runtime}/token-budget.js +0 -0
  825. /package/dist/{agent-core/tools → runtime}/wait.d.ts +0 -0
  826. /package/dist/{agent-core/sdk → sdk}/request-preparation.js +0 -0
  827. /package/dist/{agent-core/session → session}/context-gc-markup.d.ts +0 -0
  828. /package/dist/{agent-core/session → session}/context-gc-markup.js +0 -0
  829. /package/dist/{agent-core/session → session}/context-gc-replacements.js +0 -0
  830. /package/dist/{agent-core/session → session}/context-gc-subagent.js +0 -0
  831. /package/dist/{agent-core/session → session}/types.d.ts +0 -0
  832. /package/dist/{agent-core/storage → storage}/file-lock.d.ts +0 -0
  833. /package/dist/{agent-core/subagent → subagent}/model-update.d.ts +0 -0
  834. /package/dist/{agent-core/tools → tools}/agent/todo-read.js +0 -0
  835. /package/dist/{agent-core/tools → tools}/code-mode/quickjs-engine.d.ts +0 -0
  836. /package/dist/{agent-core/tools → tools}/code-mode/quickjs-engine.js +0 -0
  837. /package/dist/{agent-core/tools → tools}/code-mode/text-output.d.ts +0 -0
  838. /package/dist/{agent-core/tools → tools}/code-mode/text-output.js +0 -0
  839. /package/dist/{agent-core/tools → tools}/code-mode/worker.js +0 -0
  840. /package/dist/{agent-core/tools → tools}/file-change-diff.d.ts +0 -0
  841. /package/dist/{agent-core/tools → tools}/file-change-diff.js +0 -0
  842. /package/dist/{agent-core/tools → tools}/input-diagnostics/source-preview.d.ts +0 -0
  843. /package/dist/{agent-core/tools → tools}/input-diagnostics/source-preview.js +0 -0
  844. /package/dist/{agent-core/tools → tools}/input.d.ts +0 -0
  845. /package/dist/{agent-core/tools → tools}/input.js +0 -0
  846. /package/dist/{agent-core/tools → tools}/local/apply-patch-parser.d.ts +0 -0
  847. /package/dist/{agent-core/tools → tools}/local/image-processing.d.ts +0 -0
  848. /package/dist/{agent-core/tools → tools}/mcp/catalog.d.ts +0 -0
  849. /package/dist/{agent-core/tools → tools}/mcp/history.js +0 -0
  850. /package/dist/{agent-core/tools → tools}/registry.js +0 -0
  851. /package/dist/{agent-core/tools → tools}/runtime-resource-handles.d.ts +0 -0
  852. /package/dist/{agent-core/tools → tools}/runtime.d.ts +0 -0
  853. /package/dist/{agent-core/tools → tools}/scheduler.js +0 -0
  854. /package/dist/{agent-core/tools → tools}/shared/patch-result.d.ts +0 -0
  855. /package/dist/{agent-core/tools → tools}/shared/patch-result.js +0 -0
  856. /package/dist/{agent-core/tools → tools}/shared/path-resolver.d.ts +0 -0
@@ -1,1386 +0,0 @@
1
- import { codeCallEvidence, codePartialPatchCallEvidence, codeObservationEvidence, retainedCodeInputs } from '../../session/context-gc-observations.js';
2
- import { ContextGcCheckpointCache, contextGcBaseFromRecords, contextGcCheckpointIntervalEligible, contextGcLogicalPathKey, contextGcMinimumUsageGrowth, contextGcTargetKey, normalizeContextGcReplacements } from '../../session/context-gc-checkpoint.js';
3
- import { codeCellCompletionSequence, contextGcApplyPatchInputReplacement, contextGcCodeModeInputReplacement, contextGcCodeModeOutputReplacement, contextGcExecInputReplacement, contextGcExecOutputReplacement, contextGcPatchResultFromCompletedPayload, contextGcPatchResultFromFailedPayload, contextGcStaleReadReplacement, contextGcWebOutputReplacement, normalizeContextGcCodeModeInput, normalizeContextGcExecResult } from '../../session/context-gc-replacements.js';
4
- import { contextGcSubagentNeedsRetainedPriorFinal, contextGcSubagentOutputReplacement, contextGcSubagentPriorFinalIsRetained, contextGcSubagentSnapshotIsPreciselyCovered, contextGcSubagentSnapshotIsSuperseded, contextGcSubagentSnapshotTurnId, normalizeContextGcSubagentSnapshot } from '../../session/context-gc-subagent.js';
5
- import { parseReadContextOutput } from '../../tools/local/read-context.js';
6
- import { CONTEXT_GC_TOKEN_ESTIMATOR, contextGcCacheImpact, contextGcMessageTokens, contextGcPrefixTokens, contextGcReclaimedTokens } from './gc-tokens.js';
7
- import { applyContextGcReplacementsToMessages, providerToolCallId, providerToolName } from './projection.js';
8
- export const CONTEXT_GC_POLICY = {
9
- version: 1,
10
- immediatePaybackRollouts: 3,
11
- maximumPaybackRollouts: 20,
12
- contextGrowthSampleWindow: 16,
13
- minimumContextGrowthSamples: 6,
14
- minimumObservationRollouts: 1,
15
- stageAProtectionRollouts: 2,
16
- largeExecProtectionRollouts: 6,
17
- normalInputCostRate: 1,
18
- cacheReadCostRate: 0.1,
19
- cacheWriteCostRate: 1.25,
20
- outputCostRate: 1,
21
- minimumGrossReductionRate: 0.2,
22
- minimumCacheInvestmentRoi: 0.1
23
- };
24
- const CONTEXT_GC_START_RATIO = 0.5;
25
- const HIGH_WATER_GROSS_REDUCTION_START_RATIO = 0.7;
26
- const HIGH_WATER_MINIMUM_GROSS_REDUCTION_RATE = 0.1;
27
- const MINIMUM_CONTEXT_WINDOW_REDUCTION_RATIO = 0.05;
28
- const COMPACT_CREDIT_ACTIVATION_RATIO = 0.8;
29
- const COMPACT_THRESHOLD_RATIO = 0.9;
30
- const IMMINENT_COMPACT_CREDIT_DISCOUNT = 0.8;
31
- export function evaluateContextGcEconomics(input) {
32
- const reclaimedTokens = Math.max(0, input.reclaimedTokens);
33
- const cacheReadTokens = Math.max(0, input.cacheReadTokens);
34
- const preservedCachedPrefixTokens = clamp(input.preservedCachedPrefixTokens, 0, cacheReadTokens);
35
- const invalidatedCachedSuffixTokens = cacheReadTokens - preservedCachedPrefixTokens;
36
- const reclaimedCachedTokens = clamp(input.reclaimedCachedTokens, 0, invalidatedCachedSuffixTokens);
37
- const invalidatedRetainedCachedTokens = Math.max(0, invalidatedCachedSuffixTokens - reclaimedCachedTokens);
38
- const cacheRebuildPenaltyCostUnits = invalidatedRetainedCachedTokens *
39
- (CONTEXT_GC_POLICY.cacheWriteCostRate - CONTEXT_GC_POLICY.cacheReadCostRate);
40
- const reclaimedUncachedTokens = Math.max(0, reclaimedTokens - reclaimedCachedTokens);
41
- const firstRolloutSavingsCostUnits = reclaimedCachedTokens * CONTEXT_GC_POLICY.cacheReadCostRate +
42
- reclaimedUncachedTokens * CONTEXT_GC_POLICY.normalInputCostRate;
43
- const steadyRolloutSavingsCostUnits = reclaimedTokens * CONTEXT_GC_POLICY.cacheReadCostRate;
44
- const netAt = (rollouts) => input.compactDeferralCreditCostUnits -
45
- cacheRebuildPenaltyCostUnits +
46
- (rollouts <= 0
47
- ? 0
48
- : firstRolloutSavingsCostUnits + Math.max(0, rollouts - 1) * steadyRolloutSavingsCostUnits);
49
- const maximumSearch = Math.max(CONTEXT_GC_POLICY.maximumPaybackRollouts + 1, 10_000);
50
- const requiredPositiveNetRollouts = firstMatchingRollout(maximumSearch, (rollouts) => netAt(rollouts) > 0);
51
- const requiredTargetRoiRollouts = cacheRebuildPenaltyCostUnits === 0
52
- ? requiredPositiveNetRollouts
53
- : firstMatchingRollout(maximumSearch, (rollouts) => netAt(rollouts) > 0 &&
54
- netAt(rollouts) / cacheRebuildPenaltyCostUnits >=
55
- CONTEXT_GC_POLICY.minimumCacheInvestmentRoi);
56
- const targetRollouts = Number.isFinite(requiredTargetRoiRollouts)
57
- ? requiredTargetRoiRollouts
58
- : CONTEXT_GC_POLICY.maximumPaybackRollouts;
59
- const expectedNetSavedCostUnits = netAt(targetRollouts);
60
- const cacheInvestmentRoi = cacheRebuildPenaltyCostUnits === 0
61
- ? 0
62
- : expectedNetSavedCostUnits / cacheRebuildPenaltyCostUnits;
63
- const grossReductionRate = reclaimedTokens / Math.max(1, Math.max(0, input.contextUsageTokens));
64
- const minimumGrossReductionRate = Math.max(0, input.minimumGrossReductionRate ?? CONTEXT_GC_POLICY.minimumGrossReductionRate);
65
- const minimumReclaimedTokens = Math.max(0, input.minimumReclaimedTokens ??
66
- Math.ceil(Math.max(0, input.contextUsageTokens) * minimumGrossReductionRate));
67
- const immediate = requiredTargetRoiRollouts <= CONTEXT_GC_POLICY.immediatePaybackRollouts;
68
- const passes = reclaimedTokens > 0 &&
69
- reclaimedTokens >= minimumReclaimedTokens &&
70
- Number.isFinite(requiredTargetRoiRollouts) &&
71
- (immediate ||
72
- (requiredTargetRoiRollouts <= CONTEXT_GC_POLICY.maximumPaybackRollouts &&
73
- input.contextGrowthSampleCount >= CONTEXT_GC_POLICY.minimumContextGrowthSamples &&
74
- requiredTargetRoiRollouts <= input.projectedRolloutsUntilCompactAfterGc));
75
- return {
76
- cacheRebuildPenaltyCostUnits,
77
- requiredPositiveNetRollouts,
78
- requiredTargetRoiRollouts,
79
- expectedNetSavedCostUnits,
80
- cacheInvestmentRoi,
81
- grossReductionRate,
82
- passes
83
- };
84
- }
85
- export function contextGcMinimumGrossReductionRate(usageRatio) {
86
- if (!Number.isFinite(usageRatio) || usageRatio <= HIGH_WATER_GROSS_REDUCTION_START_RATIO)
87
- return CONTEXT_GC_POLICY.minimumGrossReductionRate;
88
- if (usageRatio >= COMPACT_THRESHOLD_RATIO)
89
- return HIGH_WATER_MINIMUM_GROSS_REDUCTION_RATE;
90
- const progress = (usageRatio - HIGH_WATER_GROSS_REDUCTION_START_RATIO) /
91
- (COMPACT_THRESHOLD_RATIO - HIGH_WATER_GROSS_REDUCTION_START_RATIO);
92
- return (CONTEXT_GC_POLICY.minimumGrossReductionRate -
93
- progress *
94
- (CONTEXT_GC_POLICY.minimumGrossReductionRate - HIGH_WATER_MINIMUM_GROSS_REDUCTION_RATE));
95
- }
96
- export function contextGcMinimumReclaimedTokens(contextUsageTokens, contextWindowTokens) {
97
- if (!Number.isFinite(contextUsageTokens) ||
98
- contextUsageTokens < 0 ||
99
- !Number.isFinite(contextWindowTokens) ||
100
- contextWindowTokens <= 0)
101
- return 0;
102
- const usageRatio = contextUsageTokens / contextWindowTokens;
103
- const required = Math.max(contextUsageTokens * contextGcMinimumGrossReductionRate(usageRatio), contextWindowTokens * MINIMUM_CONTEXT_WINDOW_REDUCTION_RATIO);
104
- return Math.ceil(required - 1e-9);
105
- }
106
- export function contextGcEligibleUsage(usage, contextWindowTokens) {
107
- const contextUsageTokens = modelContextUsage(usage);
108
- if (contextUsageTokens === undefined ||
109
- !Number.isSafeInteger(contextWindowTokens) ||
110
- contextWindowTokens <= 0)
111
- return undefined;
112
- const usageRatio = contextUsageTokens / contextWindowTokens;
113
- if (usageRatio < CONTEXT_GC_START_RATIO || usageRatio >= COMPACT_THRESHOLD_RATIO)
114
- return undefined;
115
- return contextUsageTokens;
116
- }
117
- export function planContextGc(input) {
118
- return inspectContextGc(input).plan;
119
- }
120
- export function inspectContextGc(input) {
121
- const text = inspectTextGc(input);
122
- const media = input.inlineMedia;
123
- if (!media || (media.reason === 'TEXT_GC' && !text.plan))
124
- return text;
125
- const currentUsage = modelContextUsage(input.usage);
126
- const usageRecord = (currentUsage === undefined ? undefined : latestUsageRecord(input.records, input.modelId)) ??
127
- input.records.at(-1);
128
- const contextUsageTokens = currentUsage ?? 0;
129
- if (!usageRecord)
130
- return text;
131
- input = {
132
- ...input,
133
- tokenCache: new Map(),
134
- checkpointCache: input.checkpointCache ?? new ContextGcCheckpointCache()
135
- };
136
- const state = {
137
- stage: text.plan?.stage ?? 'INLINE_MEDIA',
138
- contextUsageTokens,
139
- usageRatio: contextUsageTokens / input.contextWindowTokens,
140
- usageRecord,
141
- normalRolloutOrdinal: countSuccessfulNormalRollouts(input.records, input.modelId, input.contextWindowTokens),
142
- protectedCandidateTokens: text.plan?.metrics.protectedCandidateTokens ?? 0
143
- };
144
- if (text.plan) {
145
- const combined = evaluateCandidateSet(input, [], [
146
- {
147
- replacements: text.plan.draft.replacements,
148
- observedRollouts: text.plan.metrics.minimumObservedRollouts,
149
- evidenceSequence: text.plan.draft.boundarySequence
150
- }
151
- ], state, media.project);
152
- if (combined?.economics.passes) {
153
- const plan = finalizePlan(input, combined, true);
154
- if (plan)
155
- return { plan };
156
- }
157
- if (media.reason === 'TEXT_GC')
158
- return text;
159
- }
160
- // Byte pressure has its own admission signal; it never relaxes text GC eligibility.
161
- const onlyMedia = evaluateCandidateSet(input, input.checkpointCache.read(input.records)?.payload.replacements ?? [], [
162
- {
163
- replacements: [],
164
- observedRollouts: media.reason === 'HARD_LIMIT' ? 0 : 2,
165
- evidenceSequence: input.records.at(-1).sequence
166
- }
167
- ], { ...state, stage: 'INLINE_MEDIA', mediaOnly: true }, media.project);
168
- const plan = onlyMedia && finalizePlan(input, onlyMedia, true);
169
- return plan ? { plan } : text;
170
- }
171
- function inspectTextGc(input) {
172
- const contextUsageTokens = contextGcEligibleUsage(input.usage, input.contextWindowTokens);
173
- if (contextUsageTokens === undefined)
174
- return {};
175
- input = {
176
- ...input,
177
- tokenCache: new Map(),
178
- checkpointCache: input.checkpointCache ?? new ContextGcCheckpointCache()
179
- };
180
- const usageRatio = contextUsageTokens / input.contextWindowTokens;
181
- const usageRecord = latestUsageRecord(input.records, input.modelId);
182
- if (!usageRecord)
183
- return {};
184
- const normalRolloutOrdinal = countSuccessfulNormalRollouts(input.records, input.modelId, input.contextWindowTokens);
185
- const previous = input.checkpointCache.read(input.records);
186
- const checkpointEligible = contextGcCheckpointIntervalEligible({
187
- usageSequence: usageRecord.sequence,
188
- contextInputTokens: contextUsageTokens,
189
- contextWindowTokens: input.contextWindowTokens,
190
- normalRolloutOrdinal,
191
- modelId: input.modelId,
192
- platform: input.platform
193
- }, previous?.payload.trigger);
194
- // Discovery and economic evaluation have their own low-growth opportunities;
195
- // neither a protected candidate nor periodic discovery makes a draft eligible.
196
- if (previous?.payload.trigger.modelId === input.modelId &&
197
- previous.payload.trigger.contextWindowTokens === input.contextWindowTokens) {
198
- const rolloutGrowth = normalRolloutOrdinal - previous.payload.trigger.normalRolloutOrdinal;
199
- if (rolloutGrowth < 2 ||
200
- (previous.payload.metrics.protectedCandidateTokens === 0 &&
201
- rolloutGrowth < CONTEXT_GC_POLICY.largeExecProtectionRollouts &&
202
- contextUsageTokens - previous.payload.trigger.contextInputTokens <
203
- contextGcMinimumUsageGrowth(input.contextWindowTokens)))
204
- return {};
205
- }
206
- if (input.messages.length !== input.messageSources.length)
207
- return {};
208
- const groups = buildToolGroups(input.records, input.messages, input.messageSources);
209
- const existing = previous?.payload.replacements ?? [];
210
- const candidateSavings = createCandidateSavingsEstimator(input, existing);
211
- const existingTargets = new Set(existing.flatMap((replacement) => [
212
- contextGcTargetKey(replacement.target),
213
- ...(replacement.kind === 'TOOL_CALL_INPUT'
214
- ? replacement.providerAliasTargets.map(contextGcTargetKey)
215
- : [])
216
- ]));
217
- const stageA = collectStageACandidates(input, groups, existing, existingTargets, candidateSavings);
218
- const subagent = collectSubagentCandidates(input, groups, existingTargets, candidateSavings);
219
- const deterministicCandidates = [...stageA.eligible, ...subagent.eligible];
220
- const deterministicProtectedTokens = stageA.protectedTokens + subagent.protectedTokens;
221
- const stageAPlan = evaluateCandidateSet(input, existing, deterministicCandidates, {
222
- stage: 'STAGE_A',
223
- contextUsageTokens,
224
- usageRatio,
225
- usageRecord,
226
- normalRolloutOrdinal,
227
- protectedCandidateTokens: deterministicProtectedTokens
228
- });
229
- if (stageAPlan?.economics.passes) {
230
- const exec = collectExecCandidates(input, groups, existingTargets, candidateSavings);
231
- const codeMode = collectCodeModeCandidates(input, groups, existingTargets, candidateSavings);
232
- const web = collectWebCandidates(input, groups, existingTargets, candidateSavings);
233
- const protectedCandidateTokens = deterministicProtectedTokens +
234
- exec.protectedTokens +
235
- codeMode.protectedTokens +
236
- web.protectedTokens;
237
- const stageAPlanWithProtectedCandidates = evaluateCandidateSet(input, existing, deterministicCandidates, {
238
- stage: 'STAGE_A',
239
- contextUsageTokens,
240
- usageRatio,
241
- usageRecord,
242
- normalRolloutOrdinal,
243
- protectedCandidateTokens
244
- }) ?? stageAPlan;
245
- const marginal = mergeMarginalLargeOutputCandidates(input, existing, deterministicCandidates, [...exec.eligible, ...codeMode.eligible, ...web.eligible], stageAPlanWithProtectedCandidates, {
246
- contextUsageTokens,
247
- usageRatio,
248
- usageRecord,
249
- normalRolloutOrdinal,
250
- protectedCandidateTokens
251
- });
252
- const plan = checkpointEligible
253
- ? finalizePlan(input, marginal ?? stageAPlanWithProtectedCandidates)
254
- : undefined;
255
- const retryAfterRollouts = Math.min(exec.retryAfterRollouts, codeMode.retryAfterRollouts, web.retryAfterRollouts);
256
- if (!plan && checkpointEligible)
257
- return {};
258
- return {
259
- ...(plan ? { plan } : {}),
260
- ...(protectedCandidateTokens > 0 && Number.isFinite(retryAfterRollouts)
261
- ? { retryAfterRollouts }
262
- : {})
263
- };
264
- }
265
- const exec = collectExecCandidates(input, groups, existingTargets, candidateSavings);
266
- const codeMode = collectCodeModeCandidates(input, groups, existingTargets, candidateSavings);
267
- const web = collectWebCandidates(input, groups, existingTargets, candidateSavings);
268
- const protectedCandidateTokens = deterministicProtectedTokens +
269
- exec.protectedTokens +
270
- codeMode.protectedTokens +
271
- web.protectedTokens;
272
- const combined = evaluateCandidateSet(input, existing, [...deterministicCandidates, ...exec.eligible, ...codeMode.eligible, ...web.eligible], {
273
- stage: 'STAGE_A_AND_EXEC',
274
- contextUsageTokens,
275
- usageRatio,
276
- usageRecord,
277
- normalRolloutOrdinal,
278
- protectedCandidateTokens
279
- });
280
- if (combined?.economics.passes && checkpointEligible) {
281
- const plan = finalizePlan(input, combined);
282
- return plan ? { plan } : {};
283
- }
284
- const retryAfterRollouts = Math.min(stageA.retryAfterRollouts, subagent.retryAfterRollouts, exec.retryAfterRollouts, codeMode.retryAfterRollouts, web.retryAfterRollouts);
285
- // A worthwhile mixed set retains every positive protected candidate's retry
286
- // hint even when the checkpoint interval prevents a durable draft.
287
- return protectedCandidateTokens > 0 &&
288
- (combined?.economics.passes ||
289
- protectedCandidateTokens >=
290
- contextGcMinimumReclaimedTokens(contextUsageTokens, input.contextWindowTokens)) &&
291
- Number.isFinite(retryAfterRollouts)
292
- ? { retryAfterRollouts }
293
- : {};
294
- }
295
- function collectCodeModeCandidates(input, groups, existingTargets, candidateSavings) {
296
- const eligible = [];
297
- let protectedTokens = 0;
298
- let retryAfterRollouts = Infinity;
299
- for (const group of [...groups.values()].filter((item) => ['code_exec', 'code_exec_wait'].includes(item.toolName))) {
300
- if (!group.call ||
301
- !group.result ||
302
- group.failed ||
303
- !group.completed ||
304
- group.call.message.role !== 'tool_call' ||
305
- group.result.message.role !== 'tool' ||
306
- typeof group.result.message.content !== 'string')
307
- continue;
308
- const code = normalizeContextGcCodeModeInput(group.call.message.arguments);
309
- const completedPayload = group.completed.payload;
310
- const completionSequence = codeCellCompletionSequence(input.records, group.completed);
311
- if ((group.toolName !== 'code_exec_wait' && !code) ||
312
- completionSequence === undefined ||
313
- !isRecord(completedPayload) ||
314
- typeof completedPayload.truncated !== 'boolean')
315
- continue;
316
- for (const observation of group.result.message.observations ?? []) {
317
- if (observation.type !== 'value')
318
- continue;
319
- const target = targetFor(group.result.record, {
320
- ...group.result.message,
321
- observationId: observation.id
322
- });
323
- if (!target || existingTargets.has(contextGcTargetKey(target)))
324
- continue;
325
- const evidenceSequence = group.result.record.sequence;
326
- const candidate = {
327
- replacements: [
328
- {
329
- kind: 'CODE_MODE_OUTPUT',
330
- callId: group.callId,
331
- target,
332
- replacementContent: contextGcCodeModeOutputReplacement(observation.value, observation.truncated === true),
333
- evidenceSequence
334
- }
335
- ],
336
- observedRollouts: successfulRolloutsAfter(input.records, Math.max(evidenceSequence, completionSequence), input.modelId, input.contextWindowTokens),
337
- evidenceSequence
338
- };
339
- const reclaimedTokens = candidateSavings(candidate);
340
- if (reclaimedTokens <= 0)
341
- continue;
342
- if (candidate.observedRollouts >= CONTEXT_GC_POLICY.largeExecProtectionRollouts)
343
- eligible.push(candidate);
344
- else {
345
- protectedTokens += reclaimedTokens;
346
- retryAfterRollouts = Math.min(retryAfterRollouts, CONTEXT_GC_POLICY.largeExecProtectionRollouts - candidate.observedRollouts);
347
- }
348
- }
349
- const callTarget = targetFor(group.call.record, group.call.message);
350
- const resultTarget = targetFor(group.result.record, group.result.message);
351
- if (!callTarget || !resultTarget)
352
- continue;
353
- const evidenceSequence = group.result.record.sequence;
354
- const replacements = [];
355
- if (code && !existingTargets.has(contextGcTargetKey(callTarget)))
356
- replacements.push({
357
- kind: 'TOOL_CALL_INPUT',
358
- toolName: group.toolName,
359
- callId: group.callId,
360
- target: callTarget,
361
- replacementArguments: contextGcCodeModeInputReplacement(code, group.result.message.observations ? retainedCodeInputs(input.records, group.callId) : []),
362
- providerAliasTargets: group.aliases
363
- .map(({ record, message }) => targetFor(record, message))
364
- .filter((target) => target !== undefined),
365
- evidenceSequence
366
- });
367
- if (!group.result.message.observations &&
368
- !existingTargets.has(contextGcTargetKey(resultTarget)))
369
- replacements.push({
370
- kind: 'CODE_MODE_OUTPUT',
371
- callId: group.callId,
372
- target: resultTarget,
373
- replacementContent: contextGcCodeModeOutputReplacement(group.result.message.content, completedPayload.truncated),
374
- evidenceSequence
375
- });
376
- if (replacements.length === 0)
377
- continue;
378
- const observedRollouts = successfulRolloutsAfter(input.records, Math.max(evidenceSequence, completionSequence), input.modelId, input.contextWindowTokens);
379
- const candidate = { replacements, observedRollouts, evidenceSequence };
380
- const reclaimedTokens = candidateSavings(candidate);
381
- if (reclaimedTokens <= 0)
382
- continue;
383
- if (observedRollouts >= CONTEXT_GC_POLICY.largeExecProtectionRollouts)
384
- eligible.push(candidate);
385
- else {
386
- protectedTokens += reclaimedTokens;
387
- retryAfterRollouts = Math.min(retryAfterRollouts, CONTEXT_GC_POLICY.largeExecProtectionRollouts - observedRollouts);
388
- }
389
- }
390
- return { eligible, protectedTokens, retryAfterRollouts };
391
- }
392
- function mergeMarginalLargeOutputCandidates(input, existing, deterministicCandidates, execCandidates, stageAPlan, state) {
393
- let selected = [...deterministicCandidates];
394
- let current = stageAPlan;
395
- const stageAEarliestSequence = contextGcEarliestReplacementSequence(deterministicCandidates.flatMap((candidate) => candidate.replacements));
396
- for (const candidate of [...execCandidates].sort((left, right) => right.evidenceSequence - left.evidenceSequence)) {
397
- const evaluated = evaluateCandidateSet(input, existing, [...selected, candidate], {
398
- stage: 'STAGE_A_AND_EXEC',
399
- ...state
400
- });
401
- if (!evaluated?.economics.passes || evaluated.reclaimedTokens <= current.reclaimedTokens)
402
- continue;
403
- const doesNotMoveInvalidationEarlier = contextGcEarliestReplacementSequence(candidate.replacements) >= stageAEarliestSequence;
404
- if (!doesNotMoveInvalidationEarlier &&
405
- !contextGcMarginalCacheInvestmentPaysBack({
406
- reclaimedTokens: current.reclaimedTokens,
407
- reclaimedCachedTokens: current.reclaimedCachedTokens,
408
- cacheRebuildPenaltyCostUnits: current.economics.cacheRebuildPenaltyCostUnits
409
- }, {
410
- reclaimedTokens: evaluated.reclaimedTokens,
411
- reclaimedCachedTokens: evaluated.reclaimedCachedTokens,
412
- cacheRebuildPenaltyCostUnits: evaluated.economics.cacheRebuildPenaltyCostUnits
413
- }))
414
- continue;
415
- selected = [...selected, candidate];
416
- current = evaluated;
417
- }
418
- return current === stageAPlan ? undefined : current;
419
- }
420
- export function contextGcMarginalCacheInvestmentPaysBack(current, combined) {
421
- const marginalPenalty = combined.cacheRebuildPenaltyCostUnits - current.cacheRebuildPenaltyCostUnits;
422
- if (marginalPenalty <= 0)
423
- return true;
424
- const firstRolloutSavings = (profile) => {
425
- const reclaimedCachedTokens = clamp(profile.reclaimedCachedTokens, 0, Math.max(0, profile.reclaimedTokens));
426
- return (reclaimedCachedTokens * CONTEXT_GC_POLICY.cacheReadCostRate +
427
- Math.max(0, profile.reclaimedTokens - reclaimedCachedTokens) *
428
- CONTEXT_GC_POLICY.normalInputCostRate);
429
- };
430
- const marginalFirstRolloutSavings = firstRolloutSavings(combined) - firstRolloutSavings(current);
431
- const marginalSteadyRolloutSavings = Math.max(0, combined.reclaimedTokens - current.reclaimedTokens) *
432
- CONTEXT_GC_POLICY.cacheReadCostRate;
433
- for (let rollouts = 1; rollouts <= CONTEXT_GC_POLICY.immediatePaybackRollouts; rollouts++) {
434
- const net = -marginalPenalty +
435
- marginalFirstRolloutSavings +
436
- Math.max(0, rollouts - 1) * marginalSteadyRolloutSavings;
437
- if (net > 0 && net / marginalPenalty >= CONTEXT_GC_POLICY.minimumCacheInvestmentRoi)
438
- return true;
439
- }
440
- return false;
441
- }
442
- export function contextGcEarliestReplacementSequence(replacements) {
443
- return Math.min(...replacements.flatMap((replacement) => [
444
- replacement.target.sequence,
445
- ...(replacement.kind === 'TOOL_CALL_INPUT'
446
- ? replacement.providerAliasTargets.map((target) => target.sequence)
447
- : [])
448
- ]));
449
- }
450
- function finalizePlan(input, evaluated, includeMedia = false) {
451
- if (!evaluated)
452
- return undefined;
453
- let inlineMedia;
454
- if (includeMedia && input.inlineMedia) {
455
- const { project: _project, ...checkpoint } = input.inlineMedia;
456
- inlineMedia = checkpoint;
457
- }
458
- const base = contextGcBaseFromRecords(input.records, evaluated.boundarySequence);
459
- if (!base)
460
- return undefined;
461
- const replacements = normalizeContextGcReplacements(evaluated.replacements);
462
- if (!replacements || (replacements.length === 0 && !inlineMedia))
463
- return undefined;
464
- const metrics = {
465
- stage: evaluated.stage,
466
- tokenEstimator: CONTEXT_GC_TOKEN_ESTIMATOR,
467
- beforeTokens: evaluated.beforeTokens,
468
- afterTokens: evaluated.afterTokens,
469
- reclaimedTokens: evaluated.reclaimedTokens,
470
- grossReductionRate: evaluated.economics.grossReductionRate,
471
- effectiveMinimumGrossReductionRate: evaluated.minimumGrossReductionRate,
472
- minimumRequiredReclaimedTokens: evaluated.minimumReclaimedTokens,
473
- cacheRebuildPenaltyCostUnits: evaluated.economics.cacheRebuildPenaltyCostUnits,
474
- compactDeferralCreditCostUnits: evaluated.compactDeferralCreditCostUnits,
475
- imminentCompactAvoidanceCreditCostUnits: evaluated.imminentCompactAvoidanceCreditCostUnits,
476
- appliedCompactCreditCostUnits: evaluated.appliedCompactCreditCostUnits,
477
- requiredPositiveNetRollouts: Number.isFinite(evaluated.economics.requiredPositiveNetRollouts)
478
- ? evaluated.economics.requiredPositiveNetRollouts
479
- : null,
480
- requiredTargetRoiRollouts: Number.isFinite(evaluated.economics.requiredTargetRoiRollouts)
481
- ? evaluated.economics.requiredTargetRoiRollouts
482
- : null,
483
- projectedRolloutsUntilCompactAfterGc: evaluated.projectedRolloutsUntilCompactAfterGc,
484
- projectedTokensBeforeGc: evaluated.projectedTokensBeforeGc,
485
- projectedTokensAfterGc: evaluated.projectedTokensAfterGc,
486
- contextGrowthSampleCount: evaluated.contextGrowthSamples.length,
487
- contextGrowthP75Tokens: evaluated.contextGrowthP75Tokens,
488
- expectedNetSavedCostUnits: evaluated.economics.expectedNetSavedCostUnits,
489
- cacheInvestmentRoi: evaluated.economics.cacheInvestmentRoi,
490
- minimumObservedRollouts: evaluated.minimumObservedRollouts,
491
- protectedCandidateTokens: evaluated.protectedCandidateTokens,
492
- eligibleCandidateCount: evaluated.eligibleCandidateCount,
493
- eligibleTargetCount: replacements.reduce((count, replacement) => count +
494
- 1 +
495
- (replacement.kind === 'TOOL_CALL_INPUT' ? replacement.providerAliasTargets.length : 0), 0),
496
- cachePenaltyKnown: input.usage.cacheReadTokens !== undefined
497
- };
498
- const draft = {
499
- ...(inlineMedia ? { inlineMedia } : {}),
500
- version: 1,
501
- base,
502
- boundarySequence: evaluated.boundarySequence,
503
- replacements,
504
- trigger: {
505
- usageSequence: modelContextUsage(input.usage) !== undefined &&
506
- isRecord(evaluated.usageRecord.payload) &&
507
- evaluated.usageRecord.payload.type === 'usage.updated'
508
- ? evaluated.usageRecord.sequence
509
- : null,
510
- contextInputTokens: evaluated.contextUsageTokens,
511
- contextWindowTokens: input.contextWindowTokens,
512
- normalRolloutOrdinal: evaluated.normalRolloutOrdinal,
513
- modelId: input.modelId,
514
- platform: input.platform
515
- },
516
- economics: CONTEXT_GC_POLICY,
517
- metrics
518
- };
519
- return { stage: evaluated.stage, draft, metrics };
520
- }
521
- function evaluateCandidateSet(input, existing, candidates, state, mediaProjection) {
522
- if (candidates.length === 0)
523
- return undefined;
524
- const replacements = normalizeContextGcReplacements([
525
- ...existing,
526
- ...candidates.flatMap((candidate) => candidate.replacements)
527
- ]);
528
- if (!replacements)
529
- return undefined;
530
- const projected = applyContextGcReplacementsToMessages(input.messages, input.messageSources, replacements);
531
- const projectedMessages = mediaProjection?.(projected.messages) ?? projected.messages;
532
- const reclaimedTokens = contextGcReclaimedTokens(input, input.messages, projectedMessages);
533
- const minimumGrossReductionRate = contextGcMinimumGrossReductionRate(state.usageRatio);
534
- const minimumReclaimedTokens = contextGcMinimumReclaimedTokens(state.contextUsageTokens, input.contextWindowTokens);
535
- if (!state.mediaOnly && reclaimedTokens < minimumReclaimedTokens)
536
- return undefined;
537
- const beforeTokens = contextGcPrefixTokens(input) + contextGcMessageTokens(input, input.messages);
538
- const afterTokens = contextGcPrefixTokens(input) + contextGcMessageTokens(input, projectedMessages);
539
- if (!state.mediaOnly && reclaimedTokens === 0)
540
- return undefined;
541
- const cache = contextGcCacheImpact(input, input.messages, projectedMessages, input.usage.cacheReadTokens ?? 0, reclaimedTokens);
542
- const growthSamples = collectContextGrowthSamples(input.records, input.modelId, input.contextWindowTokens, input.checkpointCache);
543
- const contextGrowthP75Tokens = percentile75(growthSamples);
544
- const compactThresholdTokens = Math.floor(input.contextWindowTokens * COMPACT_THRESHOLD_RATIO);
545
- // Usage describes the request before its generated output and tool results.
546
- const pendingMessages = input.messages.filter((_message, index) => input.messageSources[index].sequence > state.usageRecord.sequence);
547
- const pendingTokens = Math.max(0, input.usage.outputTokens ?? 0) + contextGcMessageTokens(input, pendingMessages);
548
- const projectedTokensBeforeGc = state.contextUsageTokens + pendingTokens;
549
- const projectedTokensAfterGc = Math.max(0, projectedTokensBeforeGc - reclaimedTokens);
550
- if (!state.mediaOnly && projectedTokensAfterGc >= compactThresholdTokens)
551
- return undefined;
552
- const projectedRolloutsUntilCompactAfterGc = contextGrowthP75Tokens <= 0
553
- ? 0
554
- : Math.max(0, Math.floor((compactThresholdTokens - projectedTokensAfterGc) / Math.max(1, contextGrowthP75Tokens)));
555
- const compactDeferralCreditCostUnits = state.usageRatio >= COMPACT_CREDIT_ACTIVATION_RATIO
556
- ? compactDeferralCredit(input, reclaimedTokens, compactThresholdTokens)
557
- : 0;
558
- const imminentCompactAvoidanceCreditCostUnits = contextGcImminentCompactAvoidanceCredit({
559
- contextUsageTokens: state.contextUsageTokens,
560
- contextWindowTokens: input.contextWindowTokens,
561
- compactThresholdTokens,
562
- projectedTokensBeforeGc,
563
- projectedTokensAfterGc,
564
- contextGrowthP75Tokens
565
- });
566
- const appliedCompactCreditCostUnits = contextGcAppliedCompactCreditCostUnits(compactDeferralCreditCostUnits, imminentCompactAvoidanceCreditCostUnits);
567
- const economics = evaluateContextGcEconomics({
568
- contextUsageTokens: state.contextUsageTokens,
569
- reclaimedTokens,
570
- reclaimedCachedTokens: cache.reclaimedCachedTokens,
571
- cacheReadTokens: input.usage.cacheReadTokens ?? 0,
572
- preservedCachedPrefixTokens: cache.preservedCachedPrefixTokens,
573
- compactDeferralCreditCostUnits: appliedCompactCreditCostUnits,
574
- projectedRolloutsUntilCompactAfterGc,
575
- contextGrowthSampleCount: growthSamples.length,
576
- minimumGrossReductionRate,
577
- minimumReclaimedTokens
578
- });
579
- return {
580
- ...state,
581
- economics,
582
- reclaimedCachedTokens: cache.reclaimedCachedTokens,
583
- replacements,
584
- beforeTokens,
585
- afterTokens,
586
- reclaimedTokens,
587
- contextGrowthSamples: growthSamples,
588
- contextGrowthP75Tokens,
589
- minimumGrossReductionRate,
590
- minimumReclaimedTokens,
591
- projectedRolloutsUntilCompactAfterGc,
592
- projectedTokensBeforeGc,
593
- projectedTokensAfterGc,
594
- compactDeferralCreditCostUnits,
595
- imminentCompactAvoidanceCreditCostUnits,
596
- appliedCompactCreditCostUnits,
597
- boundarySequence: input.records.at(-1)?.sequence ?? state.usageRecord.sequence,
598
- minimumObservedRollouts: Math.min(...candidates.map((candidate) => candidate.observedRollouts)),
599
- eligibleCandidateCount: candidates.length
600
- };
601
- }
602
- function collectStageACandidates(input, groups, existingReplacements, existingTargets, candidateSavings) {
603
- const eligible = [];
604
- let protectedTokens = 0;
605
- let retryAfterRollouts = Infinity;
606
- const existingReadReplacements = new Map(existingReplacements.flatMap((replacement) => replacement.kind === 'READ_OUTPUT_ITEMS'
607
- ? [[contextGcTargetKey(replacement.target), replacement]]
608
- : []));
609
- const reads = [...groups.values()].filter((group) => group.toolName === 'read' &&
610
- group.call?.message.role === 'tool_call' &&
611
- group.result?.message.role === 'tool');
612
- const claimedReadItems = new Set([...existingReadReplacements.values()].flatMap((replacement) => replacement.items.map((item) => `${replacement.target.recordId}:${replacement.target.observationId ?? ''}:${item.index}`)));
613
- const patches = [...groups.values()]
614
- .flatMap((patch) => {
615
- if (patch.toolName !== 'apply_patch' || !patch.call || !patch.result)
616
- return [];
617
- const terminal = patch.failed ?? patch.completed;
618
- if (!terminal)
619
- return [];
620
- const result = patch.failed
621
- ? contextGcPatchResultFromFailedPayload(terminal.payload)
622
- : contextGcPatchResultFromCompletedPayload(terminal.payload);
623
- return result
624
- ? [{ patch, result, terminal, evidenceSequence: patch.result.record.sequence }]
625
- : [];
626
- })
627
- .sort((left, right) => left.evidenceSequence - right.evidenceSequence);
628
- for (const { patch, result, terminal, evidenceSequence } of patches) {
629
- const patchCall = patch.call;
630
- const observedRollouts = successfulRolloutsAfter(input.records, evidenceSequence, input.modelId, input.contextWindowTokens);
631
- const replacements = [];
632
- const candidateReadItems = new Set();
633
- const patchTarget = targetFor(patchCall.record, patchCall.message);
634
- if (!patch.failed && patchTarget && !existingTargets.has(contextGcTargetKey(patchTarget)))
635
- replacements.push({
636
- kind: 'TOOL_CALL_INPUT',
637
- toolName: 'apply_patch',
638
- callId: patch.callId,
639
- target: patchTarget,
640
- replacementArguments: contextGcApplyPatchInputReplacement(patchCall.message.arguments, result),
641
- providerAliasTargets: patch.aliases
642
- .map(({ record, message }) => targetFor(record, message))
643
- .filter((target) => target !== undefined),
644
- evidenceSequence
645
- });
646
- for (const read of reads) {
647
- if ((read.completed?.sequence ?? read.result.record.sequence) >= terminal.sequence)
648
- continue;
649
- const parsed = parseReadContextOutput(read.result.message.content);
650
- if (!parsed)
651
- continue;
652
- const selected = parsed.items.flatMap((item) => {
653
- if (item.pathTruncated)
654
- return [];
655
- const itemKey = `${read.result.record.recordId}:${read.result.message.observationId ?? ''}:${item.index}`;
656
- if (claimedReadItems.has(itemKey) || candidateReadItems.has(itemKey))
657
- return [];
658
- const pathKey = contextGcLogicalPathKey(item.path, input.workspace, input.platform);
659
- const matched = result.files.find((file) => file.operation !== 'added' &&
660
- contextGcLogicalPathKey(file.path, input.workspace, input.platform) === pathKey);
661
- if (!pathKey || !matched || matched.operation === 'added')
662
- return [];
663
- candidateReadItems.add(itemKey);
664
- return [
665
- {
666
- index: item.index,
667
- path: item.path,
668
- replacement: contextGcStaleReadReplacement({
669
- path: item.path,
670
- content: item.content,
671
- operation: matched.operation
672
- }),
673
- evidenceSequence,
674
- ...(read.result.message.observationId ? { supersededByCallId: patch.callId } : {})
675
- }
676
- ];
677
- });
678
- if (selected.length === 0)
679
- continue;
680
- const target = targetFor(read.result.record, read.result.message);
681
- if (!target)
682
- continue;
683
- const existingRead = existingReadReplacements.get(contextGcTargetKey(target));
684
- replacements.push({
685
- kind: 'READ_OUTPUT_ITEMS',
686
- callId: read.callId,
687
- target,
688
- items: [...(existingRead?.items ?? []), ...selected],
689
- evidenceSequences: [
690
- ...new Set([...(existingRead?.evidenceSequences ?? []), evidenceSequence])
691
- ]
692
- });
693
- }
694
- if (replacements.length === 0)
695
- continue;
696
- const candidate = {
697
- replacements,
698
- observedRollouts,
699
- evidenceSequence
700
- };
701
- const reclaimedTokens = candidateSavings(candidate);
702
- if (reclaimedTokens <= 0)
703
- continue;
704
- for (const itemKey of candidateReadItems)
705
- claimedReadItems.add(itemKey);
706
- if (observedRollouts >= CONTEXT_GC_POLICY.stageAProtectionRollouts)
707
- eligible.push(candidate);
708
- else {
709
- protectedTokens += reclaimedTokens;
710
- retryAfterRollouts = Math.min(retryAfterRollouts, CONTEXT_GC_POLICY.stageAProtectionRollouts - observedRollouts);
711
- }
712
- }
713
- return { eligible, protectedTokens, retryAfterRollouts };
714
- }
715
- function collectSubagentCandidates(input, groups, existingTargets, candidateSavings) {
716
- const eligible = [];
717
- let protectedTokens = 0;
718
- let retryAfterRollouts = Infinity;
719
- const invocations = [...groups.values()]
720
- .flatMap((group) => {
721
- if (!isContextGcSubagentToolName(group.toolName) ||
722
- !group.call ||
723
- !group.result ||
724
- group.failed ||
725
- !group.completed ||
726
- group.call.message.role !== 'tool_call' ||
727
- group.result.message.role !== 'tool')
728
- return [];
729
- const snapshot = normalizeContextGcSubagentSnapshot(group.result.message.content, group.completed.payload, group.toolName);
730
- const turnId = snapshot && contextGcSubagentSnapshotTurnId(snapshot);
731
- return snapshot && turnId ? [{ group, snapshot, turnId }] : [];
732
- })
733
- .sort((left, right) => left.group.completed.sequence - right.group.completed.sequence);
734
- for (const [index, source] of invocations.entries()) {
735
- if (source.group.evidenceOnly)
736
- continue;
737
- if (source.group.toolName !== 'agent_wait' &&
738
- source.group.toolName !== 'agent_message' &&
739
- source.group.toolName !== 'agent_cancel')
740
- continue;
741
- const sourceTarget = targetFor(source.group.result.record, source.group.result.message);
742
- if (!sourceTarget || existingTargets.has(contextGcTargetKey(sourceTarget)))
743
- continue;
744
- const needsRetainedPriorFinal = contextGcSubagentNeedsRetainedPriorFinal(source.snapshot);
745
- const retainedPriorFinal = needsRetainedPriorFinal
746
- ? invocations
747
- .slice(0, index)
748
- .findLast((candidate) => contextGcSubagentPriorFinalIsRetained(source.snapshot, candidate.snapshot))
749
- : undefined;
750
- if (needsRetainedPriorFinal && retainedPriorFinal === undefined)
751
- continue;
752
- const terminal = invocations
753
- .slice(index + 1)
754
- .find((candidate) => candidate.snapshot.agentId === source.snapshot.agentId &&
755
- candidate.turnId === source.turnId &&
756
- (contextGcSubagentSnapshotIsSuperseded(source.snapshot, candidate.snapshot, retainedPriorFinal?.snapshot) ||
757
- contextGcSubagentSnapshotIsPreciselyCovered(source.snapshot, candidate.snapshot)));
758
- if (!terminal)
759
- continue;
760
- const sourceContent = source.group.result.message.content;
761
- if (typeof sourceContent !== 'string')
762
- continue;
763
- const evidenceSequence = terminal.group.result.record.sequence;
764
- const observedRollouts = successfulRolloutsAfter(input.records, evidenceSequence, input.modelId, input.contextWindowTokens);
765
- const replacement = {
766
- kind: 'SUBAGENT_OUTPUT',
767
- toolName: source.group.toolName,
768
- callId: source.group.callId,
769
- target: sourceTarget,
770
- replacementContent: contextGcSubagentOutputReplacement({
771
- sourceContent,
772
- source: source.snapshot,
773
- terminal: terminal.snapshot
774
- }),
775
- terminalToolName: terminal.group.toolName,
776
- terminalCallId: terminal.group.callId,
777
- evidenceSequence,
778
- ...(retainedPriorFinal === undefined
779
- ? {}
780
- : {
781
- retainedPriorFinal: {
782
- toolName: retainedPriorFinal.group.toolName,
783
- callId: retainedPriorFinal.group.callId,
784
- evidenceSequence: retainedPriorFinal.group.result.record.sequence
785
- }
786
- })
787
- };
788
- const candidate = {
789
- replacements: [replacement],
790
- observedRollouts,
791
- evidenceSequence
792
- };
793
- const reclaimedTokens = candidateSavings(candidate);
794
- if (reclaimedTokens <= 0)
795
- continue;
796
- if (observedRollouts >= CONTEXT_GC_POLICY.stageAProtectionRollouts)
797
- eligible.push(candidate);
798
- else {
799
- protectedTokens += reclaimedTokens;
800
- retryAfterRollouts = Math.min(retryAfterRollouts, CONTEXT_GC_POLICY.stageAProtectionRollouts - observedRollouts);
801
- }
802
- }
803
- return { eligible, protectedTokens, retryAfterRollouts };
804
- }
805
- function collectExecCandidates(input, groups, existingTargets, candidateSavings) {
806
- const eligible = [];
807
- let protectedTokens = 0;
808
- let retryAfterRollouts = Infinity;
809
- const execGroups = [...groups.values()]
810
- .filter((group) => group.toolName === 'exec' || group.toolName === 'exec_wait')
811
- .sort((left, right) => (left.call?.record.sequence ?? Number.MAX_SAFE_INTEGER) -
812
- (right.call?.record.sequence ?? Number.MAX_SAFE_INTEGER));
813
- const invocations = new Map();
814
- for (const group of execGroups) {
815
- if (!group.call ||
816
- !group.result ||
817
- group.failed ||
818
- !group.completed ||
819
- group.call.message.role !== 'tool_call' ||
820
- group.result.message.role !== 'tool' ||
821
- !isRecord(group.call.message.arguments))
822
- continue;
823
- const result = normalizeContextGcExecResult(group.result.message.content, group.completed.payload);
824
- if (result)
825
- invocations.set(group.callId, {
826
- group,
827
- input: group.call.message.arguments,
828
- result
829
- });
830
- }
831
- for (const startGroup of execGroups) {
832
- const start = invocations.get(startGroup.callId);
833
- if (!start)
834
- continue;
835
- const isStart = start.group.toolName === 'exec' &&
836
- (start.input.action === 'start' ||
837
- (start.input.action == null && typeof start.input.command === 'string'));
838
- const processId = typeof start.input.processId === 'string'
839
- ? start.input.processId
840
- : typeof start.result.processId === 'string'
841
- ? start.result.processId
842
- : undefined;
843
- if (!isStart) {
844
- if (start.group.toolName !== 'exec_wait' || !processId)
845
- continue;
846
- // A process may start inside a cell or before the visible history boundary.
847
- // Begin with its first visible wait, but never split an unfinished lifecycle.
848
- const previous = execGroups.findLast((group) => (group.call?.record.sequence ?? Infinity) < start.group.call.record.sequence &&
849
- ((isRecord(group.call?.message.arguments) &&
850
- group.call.message.arguments.processId === processId) ||
851
- invocations.get(group.callId)?.result.processId === processId));
852
- const previousStatus = previous && invocations.get(previous.callId)?.result.status;
853
- if (previous && previousStatus !== 'completed' && previousStatus !== 'cancelled')
854
- continue;
855
- }
856
- const lifecycle = [start];
857
- let terminal = start.result.status !== 'running';
858
- if (!terminal) {
859
- if (!processId)
860
- continue;
861
- const relatedGroups = execGroups.filter((group) => (group.call?.record.sequence ?? 0) > start.group.call.record.sequence &&
862
- isRecord(group.call?.message.arguments) &&
863
- group.call.message.arguments.processId === processId);
864
- if (relatedGroups.some((group) => !invocations.has(group.callId)) ||
865
- relatedGroups.length === 0)
866
- continue;
867
- for (const relatedGroup of relatedGroups) {
868
- const invocation = invocations.get(relatedGroup.callId);
869
- lifecycle.push(invocation);
870
- if (invocation.result.status !== 'running') {
871
- terminal = true;
872
- break;
873
- }
874
- }
875
- }
876
- if (!terminal || (processId && input.activeProcessIds.has(processId)))
877
- continue;
878
- const final = lifecycle.at(-1);
879
- const evidenceSequence = final.group.result.record.sequence;
880
- const observedRollouts = successfulRolloutsAfter(input.records, evidenceSequence, input.modelId, input.contextWindowTokens);
881
- const replacements = [];
882
- for (const invocation of lifecycle) {
883
- if (invocation.group.evidenceOnly)
884
- continue;
885
- const callTarget = targetFor(invocation.group.call.record, invocation.group.call.message);
886
- const resultTarget = targetFor(invocation.group.result.record, invocation.group.result.message);
887
- if (!resultTarget) {
888
- replacements.splice(0);
889
- break;
890
- }
891
- if (callTarget && !existingTargets.has(contextGcTargetKey(callTarget)))
892
- replacements.push({
893
- kind: 'TOOL_CALL_INPUT',
894
- toolName: invocation.group.toolName,
895
- callId: invocation.group.callId,
896
- target: callTarget,
897
- replacementArguments: contextGcExecInputReplacement(invocation.input, invocation.group.toolName),
898
- providerAliasTargets: invocation.group.aliases
899
- .map(({ record, message }) => targetFor(record, message))
900
- .filter((target) => target !== undefined),
901
- evidenceSequence
902
- });
903
- if (!existingTargets.has(contextGcTargetKey(resultTarget)))
904
- replacements.push({
905
- kind: 'EXEC_OUTPUT',
906
- ...(resultTarget.observationId ? { terminalCallId: final.group.callId } : {}),
907
- callId: invocation.group.callId,
908
- target: resultTarget,
909
- replacementContent: contextGcExecOutputReplacement(invocation.result),
910
- evidenceSequence
911
- });
912
- }
913
- if (replacements.length === 0)
914
- continue;
915
- const candidate = {
916
- replacements,
917
- observedRollouts,
918
- evidenceSequence
919
- };
920
- const reclaimedTokens = candidateSavings(candidate);
921
- if (reclaimedTokens <= 0)
922
- continue;
923
- if (observedRollouts >= CONTEXT_GC_POLICY.largeExecProtectionRollouts)
924
- eligible.push(candidate);
925
- else {
926
- protectedTokens += reclaimedTokens;
927
- retryAfterRollouts = Math.min(retryAfterRollouts, CONTEXT_GC_POLICY.largeExecProtectionRollouts - observedRollouts);
928
- }
929
- }
930
- return { eligible, protectedTokens, retryAfterRollouts };
931
- }
932
- function collectWebCandidates(input, groups, existingTargets, candidateSavings) {
933
- const eligible = [];
934
- let protectedTokens = 0;
935
- let retryAfterRollouts = Infinity;
936
- for (const group of [...groups.values()].sort((left, right) => (left.result?.record.sequence ?? Number.MAX_SAFE_INTEGER) -
937
- (right.result?.record.sequence ?? Number.MAX_SAFE_INTEGER))) {
938
- if (!isContextGcWebToolName(group.toolName) ||
939
- !group.call ||
940
- !group.result ||
941
- group.failed ||
942
- !group.completed ||
943
- group.call.message.role !== 'tool_call' ||
944
- group.result.message.role !== 'tool' ||
945
- typeof group.result.message.content !== 'string' ||
946
- !isRecord(group.completed.payload) ||
947
- group.completed.payload.type !== 'tool.completed' ||
948
- group.completed.payload.callId !== group.callId ||
949
- group.completed.payload.toolName !== group.toolName ||
950
- typeof group.completed.payload.truncated !== 'boolean')
951
- continue;
952
- const target = targetFor(group.result.record, group.result.message);
953
- if (!target || existingTargets.has(contextGcTargetKey(target)))
954
- continue;
955
- const evidenceSequence = group.result.record.sequence;
956
- const observedRollouts = successfulRolloutsAfter(input.records, evidenceSequence, input.modelId, input.contextWindowTokens);
957
- const candidate = {
958
- replacements: [
959
- {
960
- kind: 'WEB_OUTPUT',
961
- toolName: group.toolName,
962
- callId: group.callId,
963
- target,
964
- replacementContent: contextGcWebOutputReplacement(group.toolName, group.result.message.content, group.completed.payload.truncated),
965
- evidenceSequence
966
- }
967
- ],
968
- observedRollouts,
969
- evidenceSequence
970
- };
971
- const reclaimedTokens = candidateSavings(candidate);
972
- if (reclaimedTokens <= 0)
973
- continue;
974
- if (observedRollouts >= CONTEXT_GC_POLICY.largeExecProtectionRollouts)
975
- eligible.push(candidate);
976
- else {
977
- protectedTokens += reclaimedTokens;
978
- retryAfterRollouts = Math.min(retryAfterRollouts, CONTEXT_GC_POLICY.largeExecProtectionRollouts - observedRollouts);
979
- }
980
- }
981
- return { eligible, protectedTokens, retryAfterRollouts };
982
- }
983
- function isContextGcSubagentToolName(value) {
984
- return (value === 'agent_start' ||
985
- value === 'agent_wait' ||
986
- value === 'agent_message' ||
987
- value === 'agent_cancel');
988
- }
989
- function isContextGcWebToolName(value) {
990
- return value === 'web_search' || value === 'web_fetch';
991
- }
992
- function buildToolGroups(records, messages, sources) {
993
- const groups = new Map();
994
- const group = (callId, toolName = '') => {
995
- const current = groups.get(callId);
996
- if (current) {
997
- if (!current.toolName && toolName)
998
- current.toolName = toolName;
999
- return current;
1000
- }
1001
- const created = { callId, toolName, aliases: [] };
1002
- groups.set(callId, created);
1003
- return created;
1004
- };
1005
- for (const [index, message] of messages.entries()) {
1006
- const record = sources[index];
1007
- if (message.role === 'tool_call' && message.callId && message.name)
1008
- group(message.callId, message.name).call = { message, record };
1009
- else if (message.role === 'tool' && message.callId)
1010
- group(message.callId).result = { message, record };
1011
- else if (message.role === 'provider') {
1012
- const callId = providerToolCallId(message);
1013
- if (callId)
1014
- group(callId, providerToolName(message)).aliases.push({ message, record });
1015
- }
1016
- }
1017
- for (const record of records) {
1018
- if (!isRecord(record.payload))
1019
- continue;
1020
- const type = record.payload.type;
1021
- const callId = record.payload.callId;
1022
- const toolName = record.payload.toolName;
1023
- if (typeof callId !== 'string' || typeof toolName !== 'string')
1024
- continue;
1025
- const current = group(callId, toolName);
1026
- if (type === 'tool.completed')
1027
- current.completed = record;
1028
- else if (type === 'tool.failed')
1029
- current.failed = record;
1030
- }
1031
- for (const [index, message] of messages.entries()) {
1032
- if (!message.observations || message.role !== 'tool')
1033
- continue;
1034
- const record = sources[index];
1035
- for (const entry of message.calls ?? []) {
1036
- if (![
1037
- 'apply_patch',
1038
- 'exec',
1039
- 'exec_wait',
1040
- 'agent_start',
1041
- 'agent_wait',
1042
- 'agent_message',
1043
- 'agent_cancel'
1044
- ].includes(entry.toolName) ||
1045
- (entry.status === 'completed' &&
1046
- message.observations.some((value) => value.type === 'tool_result' && value.source.callId === entry.callId)))
1047
- continue;
1048
- const evidence = codeCallEvidence(records, record, entry) ??
1049
- codePartialPatchCallEvidence(records, record, entry);
1050
- if (!evidence)
1051
- continue;
1052
- groups.set(`execution:${evidence.callId}`, {
1053
- evidenceOnly: true,
1054
- callId: evidence.callId,
1055
- toolName: entry.toolName,
1056
- aliases: [],
1057
- ...('completed' in evidence
1058
- ? { completed: evidence.completed }
1059
- : { failed: evidence.failed }),
1060
- call: {
1061
- record: evidence.call,
1062
- message: {
1063
- role: 'tool_call',
1064
- callId: evidence.callId,
1065
- name: entry.toolName,
1066
- content: '',
1067
- arguments: entry.input
1068
- }
1069
- },
1070
- result: {
1071
- record,
1072
- message: {
1073
- role: 'tool',
1074
- callId: message.callId,
1075
- content: evidence.result.payload.content
1076
- }
1077
- }
1078
- });
1079
- }
1080
- for (const observation of message.observations) {
1081
- if (observation.type !== 'tool_result')
1082
- continue;
1083
- const evidence = codeObservationEvidence(records, record, observation);
1084
- if (!evidence)
1085
- continue;
1086
- groups.set(`${evidence.callId}:${observation.id}`, {
1087
- callId: evidence.callId,
1088
- toolName: observation.source.toolName,
1089
- aliases: [],
1090
- completed: evidence.completed,
1091
- call: {
1092
- record: evidence.call,
1093
- message: {
1094
- role: 'tool_call',
1095
- callId: evidence.callId,
1096
- name: observation.source.toolName,
1097
- content: '',
1098
- arguments: observation.source.input
1099
- }
1100
- },
1101
- result: {
1102
- record,
1103
- message: {
1104
- role: 'tool',
1105
- callId: message.callId,
1106
- content: observation.result.content,
1107
- observationId: observation.id
1108
- }
1109
- }
1110
- });
1111
- }
1112
- }
1113
- return groups;
1114
- }
1115
- function successfulRolloutsAfter(records, evidenceSequence, modelId, contextWindowTokens) {
1116
- return countSuccessfulNormalRollouts(records.filter((record) => record.sequence > evidenceSequence), modelId, contextWindowTokens, modelConfigurationAt(records, evidenceSequence, modelId, contextWindowTokens));
1117
- }
1118
- function countSuccessfulNormalRollouts(records, modelId, contextWindowTokens, initial = {
1119
- modelId,
1120
- contextWindowTokens
1121
- }) {
1122
- let activeModelId = initial.modelId;
1123
- let activeContextWindowTokens = initial.contextWindowTokens;
1124
- let count = 0;
1125
- for (const record of records) {
1126
- if (record.type === 'execution.header' && isRecord(record.payload)) {
1127
- activeModelId =
1128
- typeof record.payload.modelId === 'string' ? record.payload.modelId : activeModelId;
1129
- activeContextWindowTokens =
1130
- typeof record.payload.contextWindowTokens === 'number' &&
1131
- Number.isSafeInteger(record.payload.contextWindowTokens) &&
1132
- record.payload.contextWindowTokens > 0
1133
- ? record.payload.contextWindowTokens
1134
- : activeContextWindowTokens;
1135
- continue;
1136
- }
1137
- if (activeModelId === modelId &&
1138
- activeContextWindowTokens === contextWindowTokens &&
1139
- record.type === 'model.attempt' &&
1140
- isRecord(record.payload) &&
1141
- record.payload.purpose === 'EXECUTION' &&
1142
- record.payload.state === 'SUCCEEDED')
1143
- count++;
1144
- }
1145
- return count;
1146
- }
1147
- function modelConfigurationAt(records, boundarySequence, fallbackModelId, fallbackContextWindowTokens) {
1148
- let modelId = fallbackModelId;
1149
- let contextWindowTokens = fallbackContextWindowTokens;
1150
- for (const record of records) {
1151
- if (record.sequence > boundarySequence)
1152
- break;
1153
- if (record.type !== 'execution.header' || !isRecord(record.payload))
1154
- continue;
1155
- if (typeof record.payload.modelId === 'string')
1156
- modelId = record.payload.modelId;
1157
- if (typeof record.payload.contextWindowTokens === 'number' &&
1158
- Number.isSafeInteger(record.payload.contextWindowTokens) &&
1159
- record.payload.contextWindowTokens > 0)
1160
- contextWindowTokens = record.payload.contextWindowTokens;
1161
- }
1162
- return { modelId, contextWindowTokens };
1163
- }
1164
- function latestUsageRecord(records, selectedModelId) {
1165
- let activeModelId = selectedModelId;
1166
- let latest;
1167
- for (const record of records) {
1168
- if (record.type === 'execution.header') {
1169
- const modelId = modelIdFromRecord(record);
1170
- if (modelId)
1171
- activeModelId = modelId;
1172
- }
1173
- else if (activeModelId === selectedModelId &&
1174
- isRecord(record.payload) &&
1175
- record.payload.type === 'usage.updated' &&
1176
- modelContextUsage(record.payload) !== undefined)
1177
- latest = record;
1178
- }
1179
- return latest;
1180
- }
1181
- function collectContextGrowthSamples(records, modelId, contextWindowTokens, checkpointCache) {
1182
- const previous = checkpointCache.read(records);
1183
- const base = contextGcBaseFromRecords(records);
1184
- const startSequence = previous?.record.sequence ?? (base?.type === 'COMPACT' ? base.sequence : base?.firstSequence);
1185
- let activeModelId = modelId;
1186
- let activeWindow = contextWindowTokens;
1187
- let previousUsage;
1188
- const samples = [];
1189
- for (const record of records) {
1190
- if (startSequence !== undefined && record.sequence <= startSequence)
1191
- continue;
1192
- if (record.type === 'execution.header' && isRecord(record.payload)) {
1193
- const nextModel = modelIdFromRecord(record);
1194
- const nextWindow = record.payload.contextWindowTokens;
1195
- if (nextModel !== modelId ||
1196
- (typeof nextWindow === 'number' && nextWindow !== contextWindowTokens)) {
1197
- activeModelId = nextModel ?? activeModelId;
1198
- activeWindow =
1199
- typeof nextWindow === 'number' && Number.isSafeInteger(nextWindow)
1200
- ? nextWindow
1201
- : activeWindow;
1202
- previousUsage = undefined;
1203
- }
1204
- else {
1205
- activeModelId = modelId;
1206
- activeWindow = contextWindowTokens;
1207
- }
1208
- continue;
1209
- }
1210
- if (activeModelId !== modelId ||
1211
- activeWindow !== contextWindowTokens ||
1212
- !isRecord(record.payload) ||
1213
- record.payload.type !== 'usage.updated')
1214
- continue;
1215
- const usage = modelContextUsage(record.payload);
1216
- if (usage === undefined) {
1217
- previousUsage = undefined;
1218
- continue;
1219
- }
1220
- if (previousUsage !== undefined && usage > previousUsage)
1221
- samples.push(usage - previousUsage);
1222
- previousUsage = usage;
1223
- }
1224
- return samples.slice(-CONTEXT_GC_POLICY.contextGrowthSampleWindow);
1225
- }
1226
- export function contextGcImminentCompactAvoidanceCredit(input) {
1227
- if (input.contextUsageTokens >= input.compactThresholdTokens ||
1228
- input.contextGrowthP75Tokens <= 0 ||
1229
- input.projectedTokensBeforeGc < input.compactThresholdTokens)
1230
- return 0;
1231
- const safetyMarginTokens = Math.max(input.contextWindowTokens * MINIMUM_CONTEXT_WINDOW_REDUCTION_RATIO, input.contextGrowthP75Tokens * CONTEXT_GC_POLICY.immediatePaybackRollouts);
1232
- if (input.projectedTokensAfterGc > input.compactThresholdTokens - safetyMarginTokens)
1233
- return 0;
1234
- return (input.contextUsageTokens *
1235
- CONTEXT_GC_POLICY.normalInputCostRate *
1236
- IMMINENT_COMPACT_CREDIT_DISCOUNT);
1237
- }
1238
- export function contextGcAppliedCompactCreditCostUnits(compactDeferralCreditCostUnits, imminentCompactAvoidanceCreditCostUnits) {
1239
- return Math.max(0, compactDeferralCreditCostUnits, imminentCompactAvoidanceCreditCostUnits);
1240
- }
1241
- function compactDeferralCredit(input, reclaimedTokens, compactThresholdTokens) {
1242
- const base = contextGcBaseFromRecords(input.records);
1243
- if (base?.type !== 'COMPACT')
1244
- return 0;
1245
- const compact = input.records.find((record) => record.sequence === base.sequence);
1246
- if (!compact || !isRecord(compact.payload))
1247
- return 0;
1248
- if (compact.payload.modelId !== input.modelId ||
1249
- compact.payload.contextWindowTokens !== input.contextWindowTokens ||
1250
- !isRecord(compact.payload.usage))
1251
- return 0;
1252
- const usage = compact.payload.usage;
1253
- const contextInput = modelContextUsage(usage);
1254
- const cacheRead = nonnegativeNumber(usage.cacheReadTokens);
1255
- const cacheWrite = nonnegativeNumber(usage.cacheWriteTokens);
1256
- const output = nonnegativeNumber(usage.outputTokens);
1257
- if (contextInput === undefined ||
1258
- cacheRead === undefined ||
1259
- cacheWrite === undefined ||
1260
- output === undefined)
1261
- return 0;
1262
- const baseline = firstMatchingUsageAfter(input.records, compact.sequence, input.modelId, input.contextWindowTokens);
1263
- if (baseline === undefined || baseline >= compactThresholdTokens)
1264
- return 0;
1265
- const fresh = Math.max(0, contextInput - cacheRead - cacheWrite);
1266
- const compactCost = fresh * CONTEXT_GC_POLICY.normalInputCostRate +
1267
- cacheRead * CONTEXT_GC_POLICY.cacheReadCostRate +
1268
- cacheWrite * CONTEXT_GC_POLICY.cacheWriteCostRate +
1269
- output * CONTEXT_GC_POLICY.outputCostRate;
1270
- const cycleCapacity = Math.max(1, compactThresholdTokens - baseline);
1271
- return compactCost * clamp(reclaimedTokens / cycleCapacity, 0, 1);
1272
- }
1273
- function firstMatchingUsageAfter(records, sequence, modelId, contextWindowTokens) {
1274
- let activeModelId = modelId;
1275
- let activeContextWindowTokens = contextWindowTokens;
1276
- for (const record of records) {
1277
- if (record.sequence <= sequence)
1278
- continue;
1279
- if (record.type === 'execution.header' && isRecord(record.payload)) {
1280
- if (typeof record.payload.modelId === 'string')
1281
- activeModelId = record.payload.modelId;
1282
- if (typeof record.payload.contextWindowTokens === 'number' &&
1283
- Number.isSafeInteger(record.payload.contextWindowTokens) &&
1284
- record.payload.contextWindowTokens > 0)
1285
- activeContextWindowTokens = record.payload.contextWindowTokens;
1286
- continue;
1287
- }
1288
- if (activeModelId !== modelId ||
1289
- activeContextWindowTokens !== contextWindowTokens ||
1290
- !isRecord(record.payload) ||
1291
- record.payload.type !== 'usage.updated')
1292
- continue;
1293
- const usage = modelContextUsage(record.payload);
1294
- if (usage !== undefined)
1295
- return usage;
1296
- }
1297
- return undefined;
1298
- }
1299
- /** Measure only affected call families, retaining native aliases for provider lowering. */
1300
- function createCandidateSavingsEstimator(input, existing) {
1301
- const byCall = new Map();
1302
- const byRecord = new Map();
1303
- for (const [index, message] of input.messages.entries()) {
1304
- const callId = message.role === 'provider' ? providerToolCallId(message) : message.callId;
1305
- if (callId) {
1306
- const indices = byCall.get(callId) ?? [];
1307
- indices.push(index);
1308
- byCall.set(callId, indices);
1309
- }
1310
- const recordId = input.messageSources[index].recordId;
1311
- const indices = byRecord.get(recordId) ?? [];
1312
- indices.push(index);
1313
- byRecord.set(recordId, indices);
1314
- }
1315
- return (candidate) => {
1316
- const indices = new Set();
1317
- for (const replacement of candidate.replacements) {
1318
- const targets = [
1319
- replacement.target,
1320
- ...(replacement.kind === 'TOOL_CALL_INPUT' ? replacement.providerAliasTargets : [])
1321
- ];
1322
- for (const target of targets) {
1323
- for (const index of byRecord.get(target.recordId) ?? [])
1324
- indices.add(index);
1325
- if (target.callId)
1326
- for (const index of byCall.get(target.callId) ?? [])
1327
- indices.add(index);
1328
- }
1329
- }
1330
- const ordered = [...indices].sort((a, b) => a - b);
1331
- const messages = ordered.map((index) => input.messages[index]);
1332
- const sources = ordered.map((index) => input.messageSources[index]);
1333
- const replacements = normalizeContextGcReplacements([...existing, ...candidate.replacements]);
1334
- if (!replacements)
1335
- return 0;
1336
- const projected = applyContextGcReplacementsToMessages(messages, sources, replacements);
1337
- return contextGcReclaimedTokens(input, messages, projected.messages);
1338
- };
1339
- }
1340
- function targetFor(record, message) {
1341
- if (record.type !== 'model.context' ||
1342
- (message.role !== 'tool_call' && message.role !== 'tool' && message.role !== 'provider'))
1343
- return undefined;
1344
- const callId = message.role === 'provider' ? providerToolCallId(message) : message.callId;
1345
- const toolName = message.role === 'provider' ? providerToolName(message) : message.name;
1346
- return {
1347
- sequence: record.sequence,
1348
- recordId: record.recordId,
1349
- role: message.role,
1350
- ...(callId === undefined ? {} : { callId }),
1351
- ...(toolName === undefined ? {} : { toolName }),
1352
- ...(message.observationId ? { observationId: message.observationId } : {})
1353
- };
1354
- }
1355
- function modelContextUsage(value) {
1356
- const context = value.contextInputTokens ?? value.inputTokens;
1357
- return typeof context === 'number' && Number.isSafeInteger(context) && context >= 0
1358
- ? context
1359
- : undefined;
1360
- }
1361
- function modelIdFromRecord(record) {
1362
- if (!isRecord(record.payload))
1363
- return undefined;
1364
- return typeof record.payload.modelId === 'string' ? record.payload.modelId : undefined;
1365
- }
1366
- function percentile75(values) {
1367
- if (values.length === 0)
1368
- return 0;
1369
- const sorted = [...values].sort((left, right) => left - right);
1370
- return sorted[Math.max(0, Math.ceil(sorted.length * 0.75) - 1)];
1371
- }
1372
- function firstMatchingRollout(limit, predicate) {
1373
- for (let rollouts = 0; rollouts <= limit; rollouts++)
1374
- if (predicate(rollouts))
1375
- return rollouts;
1376
- return Number.POSITIVE_INFINITY;
1377
- }
1378
- function nonnegativeNumber(value) {
1379
- return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;
1380
- }
1381
- function clamp(value, minimum, maximum) {
1382
- return Math.min(maximum, Math.max(minimum, value));
1383
- }
1384
- function isRecord(value) {
1385
- return value !== null && typeof value === 'object' && !Array.isArray(value);
1386
- }