@caupulican/pi-adaptative 0.81.39 → 0.81.41

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 (884) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/README.md +2 -0
  3. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts +2 -0
  4. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts.map +1 -1
  5. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js +3 -0
  6. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js.map +1 -1
  7. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.ts +4 -0
  8. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts +9 -0
  9. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts.map +1 -1
  10. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js +290 -107
  11. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js.map +1 -1
  12. package/dist/bundled-resources/extensions/tmux-agent-manager/index.ts +357 -122
  13. package/dist/bundled-resources/skills/tool-call-repair/references/repair-catalogue.md +2 -2
  14. package/dist/cli/args.d.ts +4 -0
  15. package/dist/cli/args.d.ts.map +1 -1
  16. package/dist/cli/args.js +31 -1
  17. package/dist/cli/args.js.map +1 -1
  18. package/dist/core/agent-directory-layout.d.ts +15 -0
  19. package/dist/core/agent-directory-layout.d.ts.map +1 -0
  20. package/dist/core/agent-directory-layout.js +72 -0
  21. package/dist/core/agent-directory-layout.js.map +1 -0
  22. package/dist/core/agent-paths.d.ts +25 -2
  23. package/dist/core/agent-paths.d.ts.map +1 -1
  24. package/dist/core/agent-paths.js +79 -4
  25. package/dist/core/agent-paths.js.map +1 -1
  26. package/dist/core/agent-session-contracts.d.ts +293 -0
  27. package/dist/core/agent-session-contracts.d.ts.map +1 -0
  28. package/dist/core/agent-session-contracts.js +26 -0
  29. package/dist/core/agent-session-contracts.js.map +1 -0
  30. package/dist/core/agent-session-runtime.d.ts +52 -8
  31. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  32. package/dist/core/agent-session-runtime.js +400 -79
  33. package/dist/core/agent-session-runtime.js.map +1 -1
  34. package/dist/core/agent-session-services.d.ts +1 -0
  35. package/dist/core/agent-session-services.d.ts.map +1 -1
  36. package/dist/core/agent-session-services.js +1 -0
  37. package/dist/core/agent-session-services.js.map +1 -1
  38. package/dist/core/agent-session.d.ts +74 -518
  39. package/dist/core/agent-session.d.ts.map +1 -1
  40. package/dist/core/agent-session.js +370 -1432
  41. package/dist/core/agent-session.js.map +1 -1
  42. package/dist/core/auth-storage.d.ts.map +1 -1
  43. package/dist/core/auth-storage.js +3 -1
  44. package/dist/core/auth-storage.js.map +1 -1
  45. package/dist/core/autonomy/approval-gate.d.ts +3 -2
  46. package/dist/core/autonomy/approval-gate.d.ts.map +1 -1
  47. package/dist/core/autonomy/approval-gate.js +6 -28
  48. package/dist/core/autonomy/approval-gate.js.map +1 -1
  49. package/dist/core/autonomy/bounded-completion.d.ts +1 -1
  50. package/dist/core/autonomy/bounded-completion.d.ts.map +1 -1
  51. package/dist/core/autonomy/bounded-completion.js +1 -1
  52. package/dist/core/autonomy/bounded-completion.js.map +1 -1
  53. package/dist/core/autonomy/contracts.d.ts +20 -12
  54. package/dist/core/autonomy/contracts.d.ts.map +1 -1
  55. package/dist/core/autonomy/contracts.js.map +1 -1
  56. package/dist/core/autonomy/foreground-envelope.d.ts +8 -2
  57. package/dist/core/autonomy/foreground-envelope.d.ts.map +1 -1
  58. package/dist/core/autonomy/foreground-envelope.js +8 -25
  59. package/dist/core/autonomy/foreground-envelope.js.map +1 -1
  60. package/dist/core/autonomy/gates.d.ts.map +1 -1
  61. package/dist/core/autonomy/gates.js +8 -10
  62. package/dist/core/autonomy/gates.js.map +1 -1
  63. package/dist/core/autonomy/lane-private-paths.d.ts +2 -0
  64. package/dist/core/autonomy/lane-private-paths.d.ts.map +1 -0
  65. package/dist/core/autonomy/lane-private-paths.js +16 -0
  66. package/dist/core/autonomy/lane-private-paths.js.map +1 -0
  67. package/dist/core/autonomy/lane-tool-surface.d.ts +10 -0
  68. package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
  69. package/dist/core/autonomy/lane-tool-surface.js +48 -9
  70. package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
  71. package/dist/core/autonomy/lane-tracker.d.ts +14 -0
  72. package/dist/core/autonomy/lane-tracker.d.ts.map +1 -1
  73. package/dist/core/autonomy/lane-tracker.js +38 -0
  74. package/dist/core/autonomy/lane-tracker.js.map +1 -1
  75. package/dist/core/autonomy/risk-assessment.d.ts +1 -2
  76. package/dist/core/autonomy/risk-assessment.d.ts.map +1 -1
  77. package/dist/core/autonomy/risk-assessment.js +1 -123
  78. package/dist/core/autonomy/risk-assessment.js.map +1 -1
  79. package/dist/core/autonomy/session-lane-record.d.ts +4 -4
  80. package/dist/core/autonomy/session-lane-record.d.ts.map +1 -1
  81. package/dist/core/autonomy/session-lane-record.js +16 -29
  82. package/dist/core/autonomy/session-lane-record.js.map +1 -1
  83. package/dist/core/autonomy/telemetry-events.d.ts +1 -1
  84. package/dist/core/autonomy/telemetry-events.d.ts.map +1 -1
  85. package/dist/core/autonomy/telemetry-events.js +1 -1
  86. package/dist/core/autonomy/telemetry-events.js.map +1 -1
  87. package/dist/core/autonomy-telemetry.d.ts +7 -7
  88. package/dist/core/autonomy-telemetry.d.ts.map +1 -1
  89. package/dist/core/autonomy-telemetry.js +9 -9
  90. package/dist/core/autonomy-telemetry.js.map +1 -1
  91. package/dist/core/background-lane-controller.d.ts +56 -236
  92. package/dist/core/background-lane-controller.d.ts.map +1 -1
  93. package/dist/core/background-lane-controller.js +141 -1273
  94. package/dist/core/background-lane-controller.js.map +1 -1
  95. package/dist/core/bedrock-sso-login.d.ts +16 -0
  96. package/dist/core/bedrock-sso-login.d.ts.map +1 -0
  97. package/dist/core/bedrock-sso-login.js +98 -0
  98. package/dist/core/bedrock-sso-login.js.map +1 -0
  99. package/dist/core/capability-contract.d.ts +4 -0
  100. package/dist/core/capability-contract.d.ts.map +1 -0
  101. package/dist/core/capability-contract.js +28 -0
  102. package/dist/core/capability-contract.js.map +1 -0
  103. package/dist/core/compaction-controller.d.ts +90 -0
  104. package/dist/core/compaction-controller.d.ts.map +1 -0
  105. package/dist/core/compaction-controller.js +452 -0
  106. package/dist/core/compaction-controller.js.map +1 -0
  107. package/dist/core/compaction-support.d.ts +13 -17
  108. package/dist/core/compaction-support.d.ts.map +1 -1
  109. package/dist/core/compaction-support.js +3 -3
  110. package/dist/core/compaction-support.js.map +1 -1
  111. package/dist/core/context/context-artifacts.d.ts +6 -2
  112. package/dist/core/context/context-artifacts.d.ts.map +1 -1
  113. package/dist/core/context/context-artifacts.js +34 -2
  114. package/dist/core/context/context-artifacts.js.map +1 -1
  115. package/dist/core/context/context-store-retention.d.ts +8 -2
  116. package/dist/core/context/context-store-retention.d.ts.map +1 -1
  117. package/dist/core/context/context-store-retention.js +158 -35
  118. package/dist/core/context/context-store-retention.js.map +1 -1
  119. package/dist/core/context/okf-memory.d.ts.map +1 -1
  120. package/dist/core/context/okf-memory.js +9 -11
  121. package/dist/core/context/okf-memory.js.map +1 -1
  122. package/dist/core/context/sqlite-runtime-index.d.ts.map +1 -1
  123. package/dist/core/context/sqlite-runtime-index.js +6 -8
  124. package/dist/core/context/sqlite-runtime-index.js.map +1 -1
  125. package/dist/core/context-gc.d.ts +3 -0
  126. package/dist/core/context-gc.d.ts.map +1 -1
  127. package/dist/core/context-gc.js +10 -5
  128. package/dist/core/context-gc.js.map +1 -1
  129. package/dist/core/context-pipeline.d.ts +1 -1
  130. package/dist/core/context-pipeline.d.ts.map +1 -1
  131. package/dist/core/context-pipeline.js +16 -37
  132. package/dist/core/context-pipeline.js.map +1 -1
  133. package/dist/core/cost/cost-summary.d.ts.map +1 -1
  134. package/dist/core/cost/cost-summary.js +5 -3
  135. package/dist/core/cost/cost-summary.js.map +1 -1
  136. package/dist/core/cost/daily-usage.d.ts.map +1 -1
  137. package/dist/core/cost/daily-usage.js +4 -5
  138. package/dist/core/cost/daily-usage.js.map +1 -1
  139. package/dist/core/default-tool-surface.d.ts.map +1 -1
  140. package/dist/core/default-tool-surface.js +2 -0
  141. package/dist/core/default-tool-surface.js.map +1 -1
  142. package/dist/core/delegation/managed-lane-controller.d.ts +34 -0
  143. package/dist/core/delegation/managed-lane-controller.d.ts.map +1 -0
  144. package/dist/core/delegation/managed-lane-controller.js +217 -0
  145. package/dist/core/delegation/managed-lane-controller.js.map +1 -0
  146. package/dist/core/delegation/session-worker-claim.d.ts +44 -0
  147. package/dist/core/delegation/session-worker-claim.d.ts.map +1 -0
  148. package/dist/core/delegation/session-worker-claim.js +98 -0
  149. package/dist/core/delegation/session-worker-claim.js.map +1 -0
  150. package/dist/core/delegation/worker-actions.d.ts +7 -5
  151. package/dist/core/delegation/worker-actions.d.ts.map +1 -1
  152. package/dist/core/delegation/worker-actions.js +20 -4
  153. package/dist/core/delegation/worker-actions.js.map +1 -1
  154. package/dist/core/delegation/{worker-result.d.ts → worker-claim.d.ts} +13 -13
  155. package/dist/core/delegation/worker-claim.d.ts.map +1 -0
  156. package/dist/core/delegation/{worker-result.js → worker-claim.js} +61 -51
  157. package/dist/core/delegation/worker-claim.js.map +1 -0
  158. package/dist/core/delegation/worker-delegation-controller.d.ts +110 -0
  159. package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -0
  160. package/dist/core/delegation/worker-delegation-controller.js +861 -0
  161. package/dist/core/delegation/worker-delegation-controller.js.map +1 -0
  162. package/dist/core/delegation/worker-delegation-request.d.ts +11 -0
  163. package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -0
  164. package/dist/core/delegation/worker-delegation-request.js +2 -0
  165. package/dist/core/delegation/worker-delegation-request.js.map +1 -0
  166. package/dist/core/delegation/worker-dispatch-scheduler.d.ts +40 -0
  167. package/dist/core/delegation/worker-dispatch-scheduler.d.ts.map +1 -0
  168. package/dist/core/delegation/worker-dispatch-scheduler.js +93 -0
  169. package/dist/core/delegation/worker-dispatch-scheduler.js.map +1 -0
  170. package/dist/core/delegation/worker-execution-policy.d.ts +62 -0
  171. package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -0
  172. package/dist/core/delegation/worker-execution-policy.js +160 -0
  173. package/dist/core/delegation/worker-execution-policy.js.map +1 -0
  174. package/dist/core/delegation/worker-lane-projection.d.ts +14 -0
  175. package/dist/core/delegation/worker-lane-projection.d.ts.map +1 -0
  176. package/dist/core/delegation/worker-lane-projection.js +100 -0
  177. package/dist/core/delegation/worker-lane-projection.js.map +1 -0
  178. package/dist/core/delegation/worker-lifecycle.d.ts +97 -0
  179. package/dist/core/delegation/worker-lifecycle.d.ts.map +1 -0
  180. package/dist/core/delegation/worker-lifecycle.js +339 -0
  181. package/dist/core/delegation/worker-lifecycle.js.map +1 -0
  182. package/dist/core/delegation/worker-notification-coordinator.d.ts +36 -0
  183. package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -0
  184. package/dist/core/delegation/worker-notification-coordinator.js +90 -0
  185. package/dist/core/delegation/worker-notification-coordinator.js.map +1 -0
  186. package/dist/core/delegation/worker-profile-resolver.d.ts +55 -0
  187. package/dist/core/delegation/worker-profile-resolver.d.ts.map +1 -0
  188. package/dist/core/delegation/worker-profile-resolver.js +113 -0
  189. package/dist/core/delegation/worker-profile-resolver.js.map +1 -0
  190. package/dist/core/delegation/worker-runner.d.ts +25 -14
  191. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  192. package/dist/core/delegation/worker-runner.js +122 -53
  193. package/dist/core/delegation/worker-runner.js.map +1 -1
  194. package/dist/core/delegation/worker-task-label.d.ts +3 -0
  195. package/dist/core/delegation/worker-task-label.d.ts.map +1 -0
  196. package/dist/core/delegation/worker-task-label.js +11 -0
  197. package/dist/core/delegation/worker-task-label.js.map +1 -0
  198. package/dist/core/doctor.d.ts +8 -0
  199. package/dist/core/doctor.d.ts.map +1 -1
  200. package/dist/core/doctor.js +32 -1
  201. package/dist/core/doctor.js.map +1 -1
  202. package/dist/core/extension-import-authority.d.ts +6 -0
  203. package/dist/core/extension-import-authority.d.ts.map +1 -0
  204. package/dist/core/extension-import-authority.js +10 -0
  205. package/dist/core/extension-import-authority.js.map +1 -0
  206. package/dist/core/extensions/index.d.ts +1 -1
  207. package/dist/core/extensions/index.d.ts.map +1 -1
  208. package/dist/core/extensions/index.js.map +1 -1
  209. package/dist/core/extensions/loader.d.ts +5 -1
  210. package/dist/core/extensions/loader.d.ts.map +1 -1
  211. package/dist/core/extensions/loader.js +52 -18
  212. package/dist/core/extensions/loader.js.map +1 -1
  213. package/dist/core/extensions/runner.d.ts +3 -0
  214. package/dist/core/extensions/runner.d.ts.map +1 -1
  215. package/dist/core/extensions/runner.js +20 -5
  216. package/dist/core/extensions/runner.js.map +1 -1
  217. package/dist/core/extensions/stale-context.d.ts +2 -0
  218. package/dist/core/extensions/stale-context.d.ts.map +1 -0
  219. package/dist/core/extensions/stale-context.js +2 -0
  220. package/dist/core/extensions/stale-context.js.map +1 -0
  221. package/dist/core/extensions/storage.d.ts +8 -0
  222. package/dist/core/extensions/storage.d.ts.map +1 -0
  223. package/dist/core/extensions/storage.js +28 -0
  224. package/dist/core/extensions/storage.js.map +1 -0
  225. package/dist/core/extensions/types.d.ts +78 -21
  226. package/dist/core/extensions/types.d.ts.map +1 -1
  227. package/dist/core/extensions/types.js.map +1 -1
  228. package/dist/core/failure-corpus.d.ts +1 -15
  229. package/dist/core/failure-corpus.d.ts.map +1 -1
  230. package/dist/core/failure-corpus.js +9 -37
  231. package/dist/core/failure-corpus.js.map +1 -1
  232. package/dist/core/foreground-recovery-controller.d.ts +53 -0
  233. package/dist/core/foreground-recovery-controller.d.ts.map +1 -0
  234. package/dist/core/foreground-recovery-controller.js +111 -0
  235. package/dist/core/foreground-recovery-controller.js.map +1 -0
  236. package/dist/core/gateways/channel-provider.d.ts +3 -0
  237. package/dist/core/gateways/channel-provider.d.ts.map +1 -1
  238. package/dist/core/gateways/channel-provider.js +31 -6
  239. package/dist/core/gateways/channel-provider.js.map +1 -1
  240. package/dist/core/goal-loop-controller.d.ts +14 -9
  241. package/dist/core/goal-loop-controller.d.ts.map +1 -1
  242. package/dist/core/goal-loop-controller.js +47 -75
  243. package/dist/core/goal-loop-controller.js.map +1 -1
  244. package/dist/core/goals/compact-goal-context.d.ts +11 -0
  245. package/dist/core/goals/compact-goal-context.d.ts.map +1 -0
  246. package/dist/core/goals/compact-goal-context.js +59 -0
  247. package/dist/core/goals/compact-goal-context.js.map +1 -0
  248. package/dist/core/goals/goal-acceptance.d.ts +11 -0
  249. package/dist/core/goals/goal-acceptance.d.ts.map +1 -0
  250. package/dist/core/goals/goal-acceptance.js +27 -0
  251. package/dist/core/goals/goal-acceptance.js.map +1 -0
  252. package/dist/core/goals/goal-auto-continue-controller.d.ts +28 -0
  253. package/dist/core/goals/goal-auto-continue-controller.d.ts.map +1 -0
  254. package/dist/core/goals/goal-auto-continue-controller.js +90 -0
  255. package/dist/core/goals/goal-auto-continue-controller.js.map +1 -0
  256. package/dist/core/goals/goal-continuation-controller.d.ts +2 -2
  257. package/dist/core/goals/goal-continuation-controller.d.ts.map +1 -1
  258. package/dist/core/goals/goal-continuation-controller.js +52 -11
  259. package/dist/core/goals/goal-continuation-controller.js.map +1 -1
  260. package/dist/core/goals/goal-continuation-defaults.d.ts +4 -29
  261. package/dist/core/goals/goal-continuation-defaults.d.ts.map +1 -1
  262. package/dist/core/goals/goal-continuation-defaults.js +4 -32
  263. package/dist/core/goals/goal-continuation-defaults.js.map +1 -1
  264. package/dist/core/goals/goal-continuation-prompt.d.ts +8 -18
  265. package/dist/core/goals/goal-continuation-prompt.d.ts.map +1 -1
  266. package/dist/core/goals/goal-continuation-prompt.js +9 -179
  267. package/dist/core/goals/goal-continuation-prompt.js.map +1 -1
  268. package/dist/core/goals/goal-lifecycle.d.ts +43 -0
  269. package/dist/core/goals/goal-lifecycle.d.ts.map +1 -0
  270. package/dist/core/goals/goal-lifecycle.js +102 -0
  271. package/dist/core/goals/goal-lifecycle.js.map +1 -0
  272. package/dist/core/goals/goal-record.d.ts +17 -0
  273. package/dist/core/goals/goal-record.d.ts.map +1 -0
  274. package/dist/core/goals/goal-record.js +31 -0
  275. package/dist/core/goals/goal-record.js.map +1 -0
  276. package/dist/core/goals/goal-runtime-snapshot.d.ts +11 -9
  277. package/dist/core/goals/goal-runtime-snapshot.d.ts.map +1 -1
  278. package/dist/core/goals/goal-runtime-snapshot.js +10 -8
  279. package/dist/core/goals/goal-runtime-snapshot.js.map +1 -1
  280. package/dist/core/goals/goal-session-controller.d.ts +42 -0
  281. package/dist/core/goals/goal-session-controller.d.ts.map +1 -0
  282. package/dist/core/goals/goal-session-controller.js +128 -0
  283. package/dist/core/goals/goal-session-controller.js.map +1 -0
  284. package/dist/core/goals/goal-state.d.ts +46 -25
  285. package/dist/core/goals/goal-state.d.ts.map +1 -1
  286. package/dist/core/goals/goal-state.js +91 -24
  287. package/dist/core/goals/goal-state.js.map +1 -1
  288. package/dist/core/goals/goal-tool-core.d.ts +9 -10
  289. package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
  290. package/dist/core/goals/goal-tool-core.js +60 -75
  291. package/dist/core/goals/goal-tool-core.js.map +1 -1
  292. package/dist/core/goals/session-goal-state.d.ts +20 -12
  293. package/dist/core/goals/session-goal-state.d.ts.map +1 -1
  294. package/dist/core/goals/session-goal-state.js +133 -33
  295. package/dist/core/goals/session-goal-state.js.map +1 -1
  296. package/dist/core/human-input-controller.d.ts +47 -0
  297. package/dist/core/human-input-controller.d.ts.map +1 -0
  298. package/dist/core/human-input-controller.js +181 -0
  299. package/dist/core/human-input-controller.js.map +1 -0
  300. package/dist/core/human-input.d.ts +100 -0
  301. package/dist/core/human-input.d.ts.map +1 -0
  302. package/dist/core/human-input.js +362 -0
  303. package/dist/core/human-input.js.map +1 -0
  304. package/dist/core/index.d.ts +9 -1
  305. package/dist/core/index.d.ts.map +1 -1
  306. package/dist/core/index.js +9 -1
  307. package/dist/core/index.js.map +1 -1
  308. package/dist/core/{telemetry.d.ts → install-telemetry.d.ts} +1 -1
  309. package/dist/core/install-telemetry.d.ts.map +1 -0
  310. package/dist/core/{telemetry.js → install-telemetry.js} +1 -1
  311. package/dist/core/install-telemetry.js.map +1 -0
  312. package/dist/core/keybindings.d.ts +17 -1
  313. package/dist/core/keybindings.d.ts.map +1 -1
  314. package/dist/core/keybindings.js +24 -6
  315. package/dist/core/keybindings.js.map +1 -1
  316. package/dist/core/learning/learning-audit.d.ts +2 -4
  317. package/dist/core/learning/learning-audit.d.ts.map +1 -1
  318. package/dist/core/learning/learning-audit.js +9 -29
  319. package/dist/core/learning/learning-audit.js.map +1 -1
  320. package/dist/core/learning/learning-gate.d.ts.map +1 -1
  321. package/dist/core/learning/learning-gate.js +1 -6
  322. package/dist/core/learning/learning-gate.js.map +1 -1
  323. package/dist/core/learning/session-learning-decision.d.ts +2 -4
  324. package/dist/core/learning/session-learning-decision.d.ts.map +1 -1
  325. package/dist/core/learning/session-learning-decision.js +9 -29
  326. package/dist/core/learning/session-learning-decision.js.map +1 -1
  327. package/dist/core/local-runtime-controller.d.ts +1 -1
  328. package/dist/core/local-runtime-controller.d.ts.map +1 -1
  329. package/dist/core/local-runtime-controller.js.map +1 -1
  330. package/dist/core/memory-controller.d.ts.map +1 -1
  331. package/dist/core/memory-controller.js +4 -4
  332. package/dist/core/memory-controller.js.map +1 -1
  333. package/dist/core/model-capability.d.ts +0 -19
  334. package/dist/core/model-capability.d.ts.map +1 -1
  335. package/dist/core/model-capability.js +1 -19
  336. package/dist/core/model-capability.js.map +1 -1
  337. package/dist/core/model-registry.d.ts +6 -1
  338. package/dist/core/model-registry.d.ts.map +1 -1
  339. package/dist/core/model-registry.js +13 -5
  340. package/dist/core/model-registry.js.map +1 -1
  341. package/dist/core/model-resolver.d.ts +17 -2
  342. package/dist/core/model-resolver.d.ts.map +1 -1
  343. package/dist/core/model-resolver.js +38 -25
  344. package/dist/core/model-resolver.js.map +1 -1
  345. package/dist/core/model-router/intent-classifier.d.ts +1 -4
  346. package/dist/core/model-router/intent-classifier.d.ts.map +1 -1
  347. package/dist/core/model-router/intent-classifier.js +1 -156
  348. package/dist/core/model-router/intent-classifier.js.map +1 -1
  349. package/dist/core/model-router-controller.d.ts +1 -1
  350. package/dist/core/model-router-controller.d.ts.map +1 -1
  351. package/dist/core/model-router-controller.js +2 -2
  352. package/dist/core/model-router-controller.js.map +1 -1
  353. package/dist/core/model-selection-controller.d.ts +5 -5
  354. package/dist/core/model-selection-controller.d.ts.map +1 -1
  355. package/dist/core/model-selection-controller.js.map +1 -1
  356. package/dist/core/model-tool-protocol.d.ts +23 -0
  357. package/dist/core/model-tool-protocol.d.ts.map +1 -0
  358. package/dist/core/model-tool-protocol.js +43 -0
  359. package/dist/core/model-tool-protocol.js.map +1 -0
  360. package/dist/core/models/adaptation-store.d.ts +4 -6
  361. package/dist/core/models/adaptation-store.d.ts.map +1 -1
  362. package/dist/core/models/adaptation-store.js +95 -83
  363. package/dist/core/models/adaptation-store.js.map +1 -1
  364. package/dist/core/models/fitness-store.d.ts +2 -12
  365. package/dist/core/models/fitness-store.d.ts.map +1 -1
  366. package/dist/core/models/fitness-store.js +84 -57
  367. package/dist/core/models/fitness-store.js.map +1 -1
  368. package/dist/core/models/host-state-store.d.ts +34 -0
  369. package/dist/core/models/host-state-store.d.ts.map +1 -0
  370. package/dist/core/models/host-state-store.js +86 -0
  371. package/dist/core/models/host-state-store.js.map +1 -0
  372. package/dist/core/orchestration/agent-resume.d.ts +24 -0
  373. package/dist/core/orchestration/agent-resume.d.ts.map +1 -0
  374. package/dist/core/orchestration/agent-resume.js +90 -0
  375. package/dist/core/orchestration/agent-resume.js.map +1 -0
  376. package/dist/core/orchestration/capability-gateway.d.ts +61 -0
  377. package/dist/core/orchestration/capability-gateway.d.ts.map +1 -0
  378. package/dist/core/orchestration/capability-gateway.js +152 -0
  379. package/dist/core/orchestration/capability-gateway.js.map +1 -0
  380. package/dist/core/orchestration/contracts.d.ts +343 -0
  381. package/dist/core/orchestration/contracts.d.ts.map +1 -0
  382. package/dist/core/orchestration/contracts.js +135 -0
  383. package/dist/core/orchestration/contracts.js.map +1 -0
  384. package/dist/core/orchestration/delegation-ledger.d.ts +56 -0
  385. package/dist/core/orchestration/delegation-ledger.d.ts.map +1 -0
  386. package/dist/core/orchestration/delegation-ledger.js +200 -0
  387. package/dist/core/orchestration/delegation-ledger.js.map +1 -0
  388. package/dist/core/orchestration/event-store.d.ts +83 -0
  389. package/dist/core/orchestration/event-store.d.ts.map +1 -0
  390. package/dist/core/orchestration/event-store.js +560 -0
  391. package/dist/core/orchestration/event-store.js.map +1 -0
  392. package/dist/core/orchestration/lane-tool-manifests.d.ts +9 -0
  393. package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -0
  394. package/dist/core/orchestration/lane-tool-manifests.js +37 -0
  395. package/dist/core/orchestration/lane-tool-manifests.js.map +1 -0
  396. package/dist/core/orchestration/model-binding.d.ts +15 -0
  397. package/dist/core/orchestration/model-binding.d.ts.map +1 -0
  398. package/dist/core/orchestration/model-binding.js +29 -0
  399. package/dist/core/orchestration/model-binding.js.map +1 -0
  400. package/dist/core/orchestration/policy-compiler.d.ts +49 -0
  401. package/dist/core/orchestration/policy-compiler.d.ts.map +1 -0
  402. package/dist/core/orchestration/policy-compiler.js +191 -0
  403. package/dist/core/orchestration/policy-compiler.js.map +1 -0
  404. package/dist/core/orchestration/policy-gate.d.ts +18 -0
  405. package/dist/core/orchestration/policy-gate.d.ts.map +1 -0
  406. package/dist/core/orchestration/policy-gate.js +24 -0
  407. package/dist/core/orchestration/policy-gate.js.map +1 -0
  408. package/dist/core/orchestration/profile-registry.d.ts +51 -0
  409. package/dist/core/orchestration/profile-registry.d.ts.map +1 -0
  410. package/dist/core/orchestration/profile-registry.js +393 -0
  411. package/dist/core/orchestration/profile-registry.js.map +1 -0
  412. package/dist/core/orchestration/profile-store.d.ts +31 -0
  413. package/dist/core/orchestration/profile-store.d.ts.map +1 -0
  414. package/dist/core/orchestration/profile-store.js +136 -0
  415. package/dist/core/orchestration/profile-store.js.map +1 -0
  416. package/dist/core/orchestration/risk-budget.d.ts +9 -0
  417. package/dist/core/orchestration/risk-budget.d.ts.map +1 -0
  418. package/dist/core/orchestration/risk-budget.js +48 -0
  419. package/dist/core/orchestration/risk-budget.js.map +1 -0
  420. package/dist/core/orchestration/task-runtime.d.ts +168 -0
  421. package/dist/core/orchestration/task-runtime.d.ts.map +1 -0
  422. package/dist/core/orchestration/task-runtime.js +1600 -0
  423. package/dist/core/orchestration/task-runtime.js.map +1 -0
  424. package/dist/core/orchestration/work-state-projection.d.ts +32 -0
  425. package/dist/core/orchestration/work-state-projection.d.ts.map +1 -0
  426. package/dist/core/orchestration/work-state-projection.js +116 -0
  427. package/dist/core/orchestration/work-state-projection.js.map +1 -0
  428. package/dist/core/orchestration/worker-execution-contract.d.ts +21 -0
  429. package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -0
  430. package/dist/core/orchestration/worker-execution-contract.js +179 -0
  431. package/dist/core/orchestration/worker-execution-contract.js.map +1 -0
  432. package/dist/core/orchestration/worker-result-adapter.d.ts +21 -0
  433. package/dist/core/orchestration/worker-result-adapter.d.ts.map +1 -0
  434. package/dist/core/orchestration/worker-result-adapter.js +109 -0
  435. package/dist/core/orchestration/worker-result-adapter.js.map +1 -0
  436. package/dist/core/package-manager.d.ts.map +1 -1
  437. package/dist/core/package-manager.js +20 -3
  438. package/dist/core/package-manager.js.map +1 -1
  439. package/dist/core/process-identity.d.ts +11 -0
  440. package/dist/core/process-identity.d.ts.map +1 -0
  441. package/dist/core/process-identity.js +26 -0
  442. package/dist/core/process-identity.js.map +1 -0
  443. package/dist/core/process-matrix/codes.d.ts +14 -3
  444. package/dist/core/process-matrix/codes.d.ts.map +1 -1
  445. package/dist/core/process-matrix/codes.js.map +1 -1
  446. package/dist/core/process-matrix/resume-launcher.d.ts +26 -0
  447. package/dist/core/process-matrix/resume-launcher.d.ts.map +1 -0
  448. package/dist/core/process-matrix/resume-launcher.js +62 -0
  449. package/dist/core/process-matrix/resume-launcher.js.map +1 -0
  450. package/dist/core/process-matrix/runtime.d.ts +37 -22
  451. package/dist/core/process-matrix/runtime.d.ts.map +1 -1
  452. package/dist/core/process-matrix/runtime.js +399 -76
  453. package/dist/core/process-matrix/runtime.js.map +1 -1
  454. package/dist/core/process-matrix/store.d.ts +5 -2
  455. package/dist/core/process-matrix/store.d.ts.map +1 -1
  456. package/dist/core/process-matrix/store.js +123 -14
  457. package/dist/core/process-matrix/store.js.map +1 -1
  458. package/dist/core/process-matrix/supervisor.d.ts +10 -7
  459. package/dist/core/process-matrix/supervisor.d.ts.map +1 -1
  460. package/dist/core/process-matrix/supervisor.js +45 -14
  461. package/dist/core/process-matrix/supervisor.js.map +1 -1
  462. package/dist/core/profile-filter-controller.d.ts +8 -1
  463. package/dist/core/profile-filter-controller.d.ts.map +1 -1
  464. package/dist/core/profile-filter-controller.js +23 -5
  465. package/dist/core/profile-filter-controller.js.map +1 -1
  466. package/dist/core/profile-registry.d.ts.map +1 -1
  467. package/dist/core/profile-registry.js +6 -8
  468. package/dist/core/profile-registry.js.map +1 -1
  469. package/dist/core/prompt-templates.d.ts +1 -0
  470. package/dist/core/prompt-templates.d.ts.map +1 -1
  471. package/dist/core/prompt-templates.js +18 -29
  472. package/dist/core/prompt-templates.js.map +1 -1
  473. package/dist/core/reflection-controller.d.ts +5 -5
  474. package/dist/core/reflection-controller.d.ts.map +1 -1
  475. package/dist/core/reflection-controller.js +5 -2
  476. package/dist/core/reflection-controller.js.map +1 -1
  477. package/dist/core/reload-blockers.d.ts.map +1 -1
  478. package/dist/core/reload-blockers.js +6 -8
  479. package/dist/core/reload-blockers.js.map +1 -1
  480. package/dist/core/request-auth.d.ts +7 -0
  481. package/dist/core/request-auth.d.ts.map +1 -0
  482. package/dist/core/request-auth.js +8 -0
  483. package/dist/core/request-auth.js.map +1 -0
  484. package/dist/core/research/evidence-bundle.d.ts.map +1 -1
  485. package/dist/core/research/evidence-bundle.js +1 -6
  486. package/dist/core/research/evidence-bundle.js.map +1 -1
  487. package/dist/core/research/lane-model-resolver.d.ts +33 -0
  488. package/dist/core/research/lane-model-resolver.d.ts.map +1 -0
  489. package/dist/core/research/lane-model-resolver.js +65 -0
  490. package/dist/core/research/lane-model-resolver.js.map +1 -0
  491. package/dist/core/research/model-fitness-controller.d.ts +38 -0
  492. package/dist/core/research/model-fitness-controller.d.ts.map +1 -0
  493. package/dist/core/research/model-fitness-controller.js +106 -0
  494. package/dist/core/research/model-fitness-controller.js.map +1 -0
  495. package/dist/core/research/model-fitness.d.ts +1 -1
  496. package/dist/core/research/model-fitness.d.ts.map +1 -1
  497. package/dist/core/research/model-fitness.js +4 -4
  498. package/dist/core/research/model-fitness.js.map +1 -1
  499. package/dist/core/research/research-gate.d.ts.map +1 -1
  500. package/dist/core/research/research-gate.js +7 -7
  501. package/dist/core/research/research-gate.js.map +1 -1
  502. package/dist/core/research/research-lane-controller.d.ts +62 -0
  503. package/dist/core/research/research-lane-controller.d.ts.map +1 -0
  504. package/dist/core/research/research-lane-controller.js +292 -0
  505. package/dist/core/research/research-lane-controller.js.map +1 -0
  506. package/dist/core/research/session-evidence-bundle.d.ts +2 -4
  507. package/dist/core/research/session-evidence-bundle.d.ts.map +1 -1
  508. package/dist/core/research/session-evidence-bundle.js +10 -46
  509. package/dist/core/research/session-evidence-bundle.js.map +1 -1
  510. package/dist/core/resource-loader.d.ts.map +1 -1
  511. package/dist/core/resource-loader.js +23 -8
  512. package/dist/core/resource-loader.js.map +1 -1
  513. package/dist/core/risk-classifier.d.ts +6 -0
  514. package/dist/core/risk-classifier.d.ts.map +1 -0
  515. package/dist/core/risk-classifier.js +233 -0
  516. package/dist/core/risk-classifier.js.map +1 -0
  517. package/dist/core/runtime-builder.d.ts +41 -23
  518. package/dist/core/runtime-builder.d.ts.map +1 -1
  519. package/dist/core/runtime-builder.js +365 -253
  520. package/dist/core/runtime-builder.js.map +1 -1
  521. package/dist/core/sdk.d.ts +6 -3
  522. package/dist/core/sdk.d.ts.map +1 -1
  523. package/dist/core/sdk.js +68 -25
  524. package/dist/core/sdk.js.map +1 -1
  525. package/dist/core/secrets/credential-exposure-guard.d.ts +9 -0
  526. package/dist/core/secrets/credential-exposure-guard.d.ts.map +1 -0
  527. package/dist/core/secrets/credential-exposure-guard.js +241 -0
  528. package/dist/core/secrets/credential-exposure-guard.js.map +1 -0
  529. package/dist/core/secrets/secret-dotenv.d.ts +27 -0
  530. package/dist/core/secrets/secret-dotenv.d.ts.map +1 -0
  531. package/dist/core/secrets/secret-dotenv.js +183 -0
  532. package/dist/core/secrets/secret-dotenv.js.map +1 -0
  533. package/dist/core/secrets/secret-vault-format.d.ts +112 -0
  534. package/dist/core/secrets/secret-vault-format.d.ts.map +1 -0
  535. package/dist/core/secrets/secret-vault-format.js +397 -0
  536. package/dist/core/secrets/secret-vault-format.js.map +1 -0
  537. package/dist/core/secrets/secret-vault.d.ts +72 -0
  538. package/dist/core/secrets/secret-vault.d.ts.map +1 -0
  539. package/dist/core/secrets/secret-vault.js +671 -0
  540. package/dist/core/secrets/secret-vault.js.map +1 -0
  541. package/dist/core/session-analytics.d.ts +4 -23
  542. package/dist/core/session-analytics.d.ts.map +1 -1
  543. package/dist/core/session-analytics.js +67 -70
  544. package/dist/core/session-analytics.js.map +1 -1
  545. package/dist/core/session-image-store.d.ts +33 -0
  546. package/dist/core/session-image-store.d.ts.map +1 -0
  547. package/dist/core/session-image-store.js +283 -0
  548. package/dist/core/session-image-store.js.map +1 -0
  549. package/dist/core/session-role.d.ts +11 -4
  550. package/dist/core/session-role.d.ts.map +1 -1
  551. package/dist/core/session-role.js +24 -5
  552. package/dist/core/session-role.js.map +1 -1
  553. package/dist/core/session-snapshot.d.ts +34 -0
  554. package/dist/core/session-snapshot.d.ts.map +1 -0
  555. package/dist/core/session-snapshot.js +68 -0
  556. package/dist/core/session-snapshot.js.map +1 -0
  557. package/dist/core/session-supervision-runtime.d.ts +31 -0
  558. package/dist/core/session-supervision-runtime.d.ts.map +1 -0
  559. package/dist/core/session-supervision-runtime.js +97 -0
  560. package/dist/core/session-supervision-runtime.js.map +1 -0
  561. package/dist/core/session-tree-navigator.d.ts +4 -6
  562. package/dist/core/session-tree-navigator.d.ts.map +1 -1
  563. package/dist/core/session-tree-navigator.js +4 -1
  564. package/dist/core/session-tree-navigator.js.map +1 -1
  565. package/dist/core/settings-manager.d.ts +10 -5
  566. package/dist/core/settings-manager.d.ts.map +1 -1
  567. package/dist/core/settings-manager.js +81 -29
  568. package/dist/core/settings-manager.js.map +1 -1
  569. package/dist/core/slash-commands.d.ts.map +1 -1
  570. package/dist/core/slash-commands.js +2 -2
  571. package/dist/core/slash-commands.js.map +1 -1
  572. package/dist/core/tasks/session-task-state.d.ts +2 -4
  573. package/dist/core/tasks/session-task-state.d.ts.map +1 -1
  574. package/dist/core/tasks/session-task-state.js +10 -28
  575. package/dist/core/tasks/session-task-state.js.map +1 -1
  576. package/dist/core/tasks/task-projection.d.ts +20 -0
  577. package/dist/core/tasks/task-projection.d.ts.map +1 -0
  578. package/dist/core/tasks/task-projection.js +47 -0
  579. package/dist/core/tasks/task-projection.js.map +1 -0
  580. package/dist/core/tasks/task-state.d.ts +4 -0
  581. package/dist/core/tasks/task-state.d.ts.map +1 -1
  582. package/dist/core/tasks/task-state.js +28 -11
  583. package/dist/core/tasks/task-state.js.map +1 -1
  584. package/dist/core/tool-capability-policy.d.ts +13 -0
  585. package/dist/core/tool-capability-policy.d.ts.map +1 -0
  586. package/dist/core/tool-capability-policy.js +86 -0
  587. package/dist/core/tool-capability-policy.js.map +1 -0
  588. package/dist/core/tool-gate-controller.d.ts.map +1 -1
  589. package/dist/core/tool-gate-controller.js +8 -2
  590. package/dist/core/tool-gate-controller.js.map +1 -1
  591. package/dist/core/tool-protocol-controller.d.ts +89 -0
  592. package/dist/core/tool-protocol-controller.d.ts.map +1 -0
  593. package/dist/core/tool-protocol-controller.js +512 -0
  594. package/dist/core/tool-protocol-controller.js.map +1 -0
  595. package/dist/core/tool-recovery-log-records.d.ts +2 -3
  596. package/dist/core/tool-recovery-log-records.d.ts.map +1 -1
  597. package/dist/core/tool-recovery-log-records.js +9 -35
  598. package/dist/core/tool-recovery-log-records.js.map +1 -1
  599. package/dist/core/tool-recovery-stats.d.ts +21 -1
  600. package/dist/core/tool-recovery-stats.d.ts.map +1 -1
  601. package/dist/core/tool-recovery-stats.js.map +1 -1
  602. package/dist/core/tool-selection/tool-performance-store.d.ts +3 -7
  603. package/dist/core/tool-selection/tool-performance-store.d.ts.map +1 -1
  604. package/dist/core/tool-selection/tool-performance-store.js +97 -138
  605. package/dist/core/tool-selection/tool-performance-store.js.map +1 -1
  606. package/dist/core/tools/ask-question.d.ts +124 -0
  607. package/dist/core/tools/ask-question.d.ts.map +1 -0
  608. package/dist/core/tools/ask-question.js +693 -0
  609. package/dist/core/tools/ask-question.js.map +1 -0
  610. package/dist/core/tools/bash.d.ts +5 -0
  611. package/dist/core/tools/bash.d.ts.map +1 -1
  612. package/dist/core/tools/bash.js +59 -5
  613. package/dist/core/tools/bash.js.map +1 -1
  614. package/dist/core/tools/delegate-status.d.ts +31 -3
  615. package/dist/core/tools/delegate-status.d.ts.map +1 -1
  616. package/dist/core/tools/delegate-status.js +148 -29
  617. package/dist/core/tools/delegate-status.js.map +1 -1
  618. package/dist/core/tools/delegate.d.ts +15 -13
  619. package/dist/core/tools/delegate.d.ts.map +1 -1
  620. package/dist/core/tools/delegate.js +106 -23
  621. package/dist/core/tools/delegate.js.map +1 -1
  622. package/dist/core/tools/extensionify.d.ts.map +1 -1
  623. package/dist/core/tools/extensionify.js +1 -0
  624. package/dist/core/tools/extensionify.js.map +1 -1
  625. package/dist/core/tools/git-filter.d.ts +1 -8
  626. package/dist/core/tools/git-filter.d.ts.map +1 -1
  627. package/dist/core/tools/git-filter.js +2 -63
  628. package/dist/core/tools/git-filter.js.map +1 -1
  629. package/dist/core/tools/goal.d.ts +10 -8
  630. package/dist/core/tools/goal.d.ts.map +1 -1
  631. package/dist/core/tools/goal.js +106 -28
  632. package/dist/core/tools/goal.js.map +1 -1
  633. package/dist/core/tools/index.d.ts +1 -0
  634. package/dist/core/tools/index.d.ts.map +1 -1
  635. package/dist/core/tools/index.js +1 -0
  636. package/dist/core/tools/index.js.map +1 -1
  637. package/dist/core/tools/model-fitness.d.ts.map +1 -1
  638. package/dist/core/tools/model-fitness.js +2 -2
  639. package/dist/core/tools/model-fitness.js.map +1 -1
  640. package/dist/core/tools/orchestration-panel.d.ts +40 -0
  641. package/dist/core/tools/orchestration-panel.d.ts.map +1 -0
  642. package/dist/core/tools/orchestration-panel.js +124 -0
  643. package/dist/core/tools/orchestration-panel.js.map +1 -0
  644. package/dist/core/tools/output-accumulator.d.ts +11 -0
  645. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  646. package/dist/core/tools/output-accumulator.js +36 -3
  647. package/dist/core/tools/output-accumulator.js.map +1 -1
  648. package/dist/core/tools/python.d.ts +2 -0
  649. package/dist/core/tools/python.d.ts.map +1 -1
  650. package/dist/core/tools/python.js +3 -1
  651. package/dist/core/tools/python.js.map +1 -1
  652. package/dist/core/tools/read.d.ts.map +1 -1
  653. package/dist/core/tools/read.js +1 -1
  654. package/dist/core/tools/read.js.map +1 -1
  655. package/dist/core/tools/run-process.d.ts +26 -0
  656. package/dist/core/tools/run-process.d.ts.map +1 -0
  657. package/dist/core/tools/run-process.js +138 -0
  658. package/dist/core/tools/run-process.js.map +1 -0
  659. package/dist/core/tools/search-command-guard.d.ts +14 -0
  660. package/dist/core/tools/search-command-guard.d.ts.map +1 -0
  661. package/dist/core/tools/search-command-guard.js +333 -0
  662. package/dist/core/tools/search-command-guard.js.map +1 -0
  663. package/dist/core/tools/secret-store.d.ts +38 -0
  664. package/dist/core/tools/secret-store.d.ts.map +1 -0
  665. package/dist/core/tools/secret-store.js +412 -0
  666. package/dist/core/tools/secret-store.js.map +1 -0
  667. package/dist/core/tools/shell-command-parser.d.ts +16 -0
  668. package/dist/core/tools/shell-command-parser.d.ts.map +1 -0
  669. package/dist/core/tools/shell-command-parser.js +113 -0
  670. package/dist/core/tools/shell-command-parser.js.map +1 -0
  671. package/dist/core/tools/task-steps.d.ts +2 -0
  672. package/dist/core/tools/task-steps.d.ts.map +1 -1
  673. package/dist/core/tools/task-steps.js +99 -0
  674. package/dist/core/tools/task-steps.js.map +1 -1
  675. package/dist/core/tools/tmux-dispatch.d.ts +3 -5
  676. package/dist/core/tools/tmux-dispatch.d.ts.map +1 -1
  677. package/dist/core/tools/tmux-dispatch.js +4 -4
  678. package/dist/core/tools/tmux-dispatch.js.map +1 -1
  679. package/dist/core/tools/windows-shell-engine.d.ts.map +1 -1
  680. package/dist/core/tools/windows-shell-engine.js +4 -6
  681. package/dist/core/tools/windows-shell-engine.js.map +1 -1
  682. package/dist/core/util/atomic-file.d.ts +6 -2
  683. package/dist/core/util/atomic-file.d.ts.map +1 -1
  684. package/dist/core/util/atomic-file.js +4 -4
  685. package/dist/core/util/atomic-file.js.map +1 -1
  686. package/dist/core/util/bounded-jsonl.d.ts +10 -0
  687. package/dist/core/util/bounded-jsonl.d.ts.map +1 -0
  688. package/dist/core/util/bounded-jsonl.js +75 -0
  689. package/dist/core/util/bounded-jsonl.js.map +1 -0
  690. package/dist/core/util/value-guards.d.ts +5 -0
  691. package/dist/core/util/value-guards.d.ts.map +1 -0
  692. package/dist/core/util/value-guards.js +12 -0
  693. package/dist/core/util/value-guards.js.map +1 -0
  694. package/dist/core/worktree-sync/store.d.ts +3 -3
  695. package/dist/core/worktree-sync/store.d.ts.map +1 -1
  696. package/dist/core/worktree-sync/store.js +10 -5
  697. package/dist/core/worktree-sync/store.js.map +1 -1
  698. package/dist/index.d.ts +15 -4
  699. package/dist/index.d.ts.map +1 -1
  700. package/dist/index.js +14 -3
  701. package/dist/index.js.map +1 -1
  702. package/dist/main.d.ts.map +1 -1
  703. package/dist/main.js +149 -51
  704. package/dist/main.js.map +1 -1
  705. package/dist/migrations.d.ts +4 -6
  706. package/dist/migrations.d.ts.map +1 -1
  707. package/dist/migrations.js +186 -28
  708. package/dist/migrations.js.map +1 -1
  709. package/dist/modes/interactive/auth-dialogs-controller.d.ts +4 -0
  710. package/dist/modes/interactive/auth-dialogs-controller.d.ts.map +1 -1
  711. package/dist/modes/interactive/auth-dialogs-controller.js +60 -1
  712. package/dist/modes/interactive/auth-dialogs-controller.js.map +1 -1
  713. package/dist/modes/interactive/clipboard-input.d.ts +7 -1
  714. package/dist/modes/interactive/clipboard-input.d.ts.map +1 -1
  715. package/dist/modes/interactive/clipboard-input.js +44 -6
  716. package/dist/modes/interactive/clipboard-input.js.map +1 -1
  717. package/dist/modes/interactive/components/activity-lane.d.ts +55 -0
  718. package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -0
  719. package/dist/modes/interactive/components/activity-lane.js +304 -0
  720. package/dist/modes/interactive/components/activity-lane.js.map +1 -0
  721. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  722. package/dist/modes/interactive/components/assistant-message.js +19 -10
  723. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  724. package/dist/modes/interactive/components/expandable-text.d.ts +12 -0
  725. package/dist/modes/interactive/components/expandable-text.d.ts.map +1 -0
  726. package/dist/modes/interactive/components/expandable-text.js +17 -0
  727. package/dist/modes/interactive/components/expandable-text.js.map +1 -0
  728. package/dist/modes/interactive/components/extension-editor.d.ts +15 -1
  729. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  730. package/dist/modes/interactive/components/extension-editor.js +30 -21
  731. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  732. package/dist/modes/interactive/components/extension-input.d.ts +1 -0
  733. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  734. package/dist/modes/interactive/components/extension-input.js +6 -1
  735. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  736. package/dist/modes/interactive/components/scoped-models-selector.d.ts +2 -2
  737. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  738. package/dist/modes/interactive/components/scoped-models-selector.js +23 -14
  739. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  740. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  741. package/dist/modes/interactive/components/settings-selector.js +6 -6
  742. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  743. package/dist/modes/interactive/components/tool-execution.d.ts +19 -11
  744. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  745. package/dist/modes/interactive/components/tool-execution.js +53 -20
  746. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  747. package/dist/modes/interactive/components/tool-group.d.ts.map +1 -1
  748. package/dist/modes/interactive/components/tool-group.js +3 -0
  749. package/dist/modes/interactive/components/tool-group.js.map +1 -1
  750. package/dist/modes/interactive/components/usage-action-selector.d.ts +16 -0
  751. package/dist/modes/interactive/components/usage-action-selector.d.ts.map +1 -0
  752. package/dist/modes/interactive/components/usage-action-selector.js +46 -0
  753. package/dist/modes/interactive/components/usage-action-selector.js.map +1 -0
  754. package/dist/modes/interactive/config-backup.d.ts.map +1 -1
  755. package/dist/modes/interactive/config-backup.js +5 -4
  756. package/dist/modes/interactive/config-backup.js.map +1 -1
  757. package/dist/modes/interactive/extension-ui-host.d.ts +14 -0
  758. package/dist/modes/interactive/extension-ui-host.d.ts.map +1 -1
  759. package/dist/modes/interactive/extension-ui-host.js +77 -15
  760. package/dist/modes/interactive/extension-ui-host.js.map +1 -1
  761. package/dist/modes/interactive/external-editor.d.ts +15 -0
  762. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  763. package/dist/modes/interactive/external-editor.js +27 -19
  764. package/dist/modes/interactive/external-editor.js.map +1 -1
  765. package/dist/modes/interactive/history-reload-math.d.ts +6 -2
  766. package/dist/modes/interactive/history-reload-math.d.ts.map +1 -1
  767. package/dist/modes/interactive/history-reload-math.js +10 -5
  768. package/dist/modes/interactive/history-reload-math.js.map +1 -1
  769. package/dist/modes/interactive/interactive-event-controller.d.ts +74 -0
  770. package/dist/modes/interactive/interactive-event-controller.d.ts.map +1 -0
  771. package/dist/modes/interactive/interactive-event-controller.js +328 -0
  772. package/dist/modes/interactive/interactive-event-controller.js.map +1 -0
  773. package/dist/modes/interactive/interactive-mode.d.ts +22 -24
  774. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  775. package/dist/modes/interactive/interactive-mode.js +245 -595
  776. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  777. package/dist/modes/interactive/key-handlers.d.ts.map +1 -1
  778. package/dist/modes/interactive/key-handlers.js +1 -1
  779. package/dist/modes/interactive/key-handlers.js.map +1 -1
  780. package/dist/modes/interactive/loaded-resources-view.d.ts +20 -0
  781. package/dist/modes/interactive/loaded-resources-view.d.ts.map +1 -0
  782. package/dist/modes/interactive/loaded-resources-view.js +147 -0
  783. package/dist/modes/interactive/loaded-resources-view.js.map +1 -0
  784. package/dist/modes/interactive/profile-menu-controller.d.ts.map +1 -1
  785. package/dist/modes/interactive/profile-menu-controller.js +7 -7
  786. package/dist/modes/interactive/profile-menu-controller.js.map +1 -1
  787. package/dist/modes/interactive/report-commands.d.ts.map +1 -1
  788. package/dist/modes/interactive/report-commands.js +21 -0
  789. package/dist/modes/interactive/report-commands.js.map +1 -1
  790. package/dist/modes/interactive/resource-display.d.ts.map +1 -1
  791. package/dist/modes/interactive/resource-display.js +8 -2
  792. package/dist/modes/interactive/resource-display.js.map +1 -1
  793. package/dist/modes/interactive/resource-shell-commands.d.ts +1 -5
  794. package/dist/modes/interactive/resource-shell-commands.d.ts.map +1 -1
  795. package/dist/modes/interactive/resource-shell-commands.js +0 -5
  796. package/dist/modes/interactive/resource-shell-commands.js.map +1 -1
  797. package/dist/modes/interactive/session-flow-commands.d.ts +27 -8
  798. package/dist/modes/interactive/session-flow-commands.d.ts.map +1 -1
  799. package/dist/modes/interactive/session-flow-commands.js +150 -64
  800. package/dist/modes/interactive/session-flow-commands.js.map +1 -1
  801. package/dist/modes/interactive/session-io-commands.d.ts.map +1 -1
  802. package/dist/modes/interactive/session-io-commands.js +16 -6
  803. package/dist/modes/interactive/session-io-commands.js.map +1 -1
  804. package/dist/modes/interactive/session-replacement-errors.d.ts +7 -0
  805. package/dist/modes/interactive/session-replacement-errors.d.ts.map +1 -0
  806. package/dist/modes/interactive/session-replacement-errors.js +15 -0
  807. package/dist/modes/interactive/session-replacement-errors.js.map +1 -0
  808. package/dist/modes/interactive/startup-checks.d.ts.map +1 -1
  809. package/dist/modes/interactive/startup-checks.js +1 -1
  810. package/dist/modes/interactive/startup-checks.js.map +1 -1
  811. package/dist/modes/interactive/usage-commands.d.ts +34 -0
  812. package/dist/modes/interactive/usage-commands.d.ts.map +1 -0
  813. package/dist/modes/interactive/usage-commands.js +225 -0
  814. package/dist/modes/interactive/usage-commands.js.map +1 -0
  815. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  816. package/dist/modes/rpc/rpc-mode.js +82 -23
  817. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  818. package/dist/modes/rpc/rpc-types.d.ts +15 -0
  819. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  820. package/dist/modes/rpc/rpc-types.js +138 -1
  821. package/dist/modes/rpc/rpc-types.js.map +1 -1
  822. package/dist/utils/clipboard-image.d.ts.map +1 -1
  823. package/dist/utils/clipboard-image.js +2 -13
  824. package/dist/utils/clipboard-image.js.map +1 -1
  825. package/dist/utils/clipboard-native.d.ts +1 -0
  826. package/dist/utils/clipboard-native.d.ts.map +1 -1
  827. package/dist/utils/clipboard-native.js.map +1 -1
  828. package/dist/utils/clipboard.d.ts +1 -0
  829. package/dist/utils/clipboard.d.ts.map +1 -1
  830. package/dist/utils/clipboard.js +52 -1
  831. package/dist/utils/clipboard.js.map +1 -1
  832. package/dist/utils/platform.d.ts +3 -0
  833. package/dist/utils/platform.d.ts.map +1 -0
  834. package/dist/utils/platform.js +8 -0
  835. package/dist/utils/platform.js.map +1 -0
  836. package/dist/utils/shell.d.ts.map +1 -1
  837. package/dist/utils/shell.js +5 -3
  838. package/dist/utils/shell.js.map +1 -1
  839. package/dist/utils/version-check.d.ts.map +1 -1
  840. package/dist/utils/version-check.js +3 -1
  841. package/dist/utils/version-check.js.map +1 -1
  842. package/dist/utils/work-directory.d.ts +11 -0
  843. package/dist/utils/work-directory.d.ts.map +1 -1
  844. package/dist/utils/work-directory.js +30 -9
  845. package/dist/utils/work-directory.js.map +1 -1
  846. package/docs/UI_POLISH_ORCHESTRATION.md +38 -0
  847. package/docs/UI_QUALITY_ORCHESTRATION.md +28 -0
  848. package/docs/docs.json +4 -0
  849. package/docs/extensions.md +62 -2
  850. package/docs/harness-architecture.md +156 -0
  851. package/docs/keybindings.md +11 -1
  852. package/docs/process-matrix.md +59 -26
  853. package/docs/providers.md +9 -1
  854. package/docs/rpc.md +45 -2
  855. package/docs/sessions.md +15 -0
  856. package/docs/settings.md +125 -11
  857. package/docs/task-steps.md +8 -0
  858. package/docs/telemetry.md +19 -0
  859. package/docs/tmux-agent-manager.md +10 -3
  860. package/docs/ui-reference/README.md +9 -0
  861. package/docs/ui-reference/orchestration-after.txt +14 -0
  862. package/docs/ui-reference/orchestration-before.txt +13 -0
  863. package/docs/ui-reference/orchestration-reference.txt +16 -0
  864. package/docs/usage.md +22 -2
  865. package/docs/work-directory.md +19 -8
  866. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  867. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  868. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  869. package/examples/extensions/question.ts +34 -245
  870. package/examples/extensions/questionnaire.ts +41 -407
  871. package/examples/extensions/sandbox/package-lock.json +2 -2
  872. package/examples/extensions/sandbox/package.json +1 -1
  873. package/examples/extensions/with-deps/package-lock.json +2 -2
  874. package/examples/extensions/with-deps/package.json +1 -1
  875. package/npm-shrinkwrap.json +13 -13
  876. package/package.json +4 -4
  877. package/dist/core/delegation/session-worker-result.d.ts +0 -46
  878. package/dist/core/delegation/session-worker-result.d.ts.map +0 -1
  879. package/dist/core/delegation/session-worker-result.js +0 -113
  880. package/dist/core/delegation/session-worker-result.js.map +0 -1
  881. package/dist/core/delegation/worker-result.d.ts.map +0 -1
  882. package/dist/core/delegation/worker-result.js.map +0 -1
  883. package/dist/core/telemetry.d.ts.map +0 -1
  884. package/dist/core/telemetry.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"context-pipeline.js","sourceRoot":"","sources":["../../src/core/context-pipeline.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Context pipeline: the session's per-turn context-shaping subsystem — the observe-only context\n * audit, the shadow prompt-policy plan and its correlation with legacy context-gc, the enforcement\n * pilot, the relevance-curation queue + the fitness-gated curation model resolver / brain-curation\n * drain + compaction pre-digest, the legacy context-gc pass and its packed-artifact reference\n * release, the tool-output artifact store, and the current-context token estimate.\n *\n * Extracted verbatim from agent-session.ts (god-file decomposition). Owns the latest\n * audit/policy/correlation/enforcement/gc reports, the {@link BrainCurator} sidecar and its last\n * skip reasons, and the lazily-built tool-artifact store. Everything else it needs — the turn\n * index, the session/settings managers, the model registry, agent/workspace dirs, the active tool\n * names, the disposed flag, the isolated-completion primitive, spawned-usage accounting, and the\n * live {@link MemoryManager} — is reached through narrow deps accessors rather than the whole\n * AgentSession.\n *\n * Context-transform boundary (deliberate): the per-turn stages ({@link estimateCurrentContextTokens},\n * {@link runContextAudit}, {@link runPromptPolicyPlanning}, {@link applyContextGc},\n * {@link correlatePromptPolicyWithContextGc}, {@link runPromptEnforcement},\n * {@link enqueueRelevanceCuration}, {@link maybeDrainBrainCuration}) are invoked from the session's\n * context transform as one-line delegations, so the transform stays the single owner of the pass\n * ordering. This controller reaches {@link MemoryController} functionality only through\n * {@link ContextPipelineDeps.getMemoryManager} (never imports it), and MemoryController never imports\n * the pipeline — keeping the transform the one place the two subsystems meet.\n */\n\nimport { createHash } from \"node:crypto\";\nimport type { AgentMessage } from \"@caupulican/pi-agent-core\";\nimport {\n\ttype CompactionEntry,\n\tcalculateContextTokens,\n\testimateTokens,\n\tgetLatestCompactionEntry,\n\ttype SessionEntry,\n\ttype SessionManager,\n\tTokenBudget,\n} from \"@caupulican/pi-agent-core/node\";\nimport type { Api, AssistantMessage, Model, Usage } from \"@caupulican/pi-ai\";\nimport type { IsolatedCompletionOptions, IsolatedCompletionResult } from \"./agent-session.ts\";\nimport { BrainCurator, type CurationTelemetrySnapshot, preDigestConversationText } from \"./context/brain-curator.ts\";\nimport { type ArtifactStore, createFileArtifactStore } from \"./context/context-artifacts.ts\";\nimport {\n\ttype ContextAuditMemo,\n\ttype ContextAuditOptions,\n\ttype ContextAuditReport,\n\trunContextAudit,\n} from \"./context/context-audit.ts\";\nimport { enforcePromptPolicy, type PromptEnforcementReport } from \"./context/context-prompt-enforcement.ts\";\nimport {\n\tcorrelateWithContextGc,\n\ttype PromptPolicyGcCorrelationReport,\n\ttype PromptPolicyShadowReport,\n\tplanPromptPolicy,\n} from \"./context/context-prompt-policy.ts\";\nimport { acquireContextStoreRetention, type ContextStoreRetentionLease } from \"./context/context-store-retention.ts\";\nimport { applyContextGc, type ContextGcReport } from \"./context-gc.ts\";\nimport type { MemoryManager } from \"./memory/memory-manager.ts\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\nimport { resolveCliModel } from \"./model-resolver.ts\";\nimport { evaluateSurfaceFitness } from \"./model-router/fitness-gate.ts\";\nimport { FitnessStore } from \"./models/fitness-store.ts\";\nimport { HF_TRANSFORMERS_PROVIDER, OLLAMA_PROVIDER } from \"./models/local-registration.ts\";\nimport type { SettingsManager } from \"./settings-manager.ts\";\n\n/**\n * Deterministic `addSpawnedUsage` reportId: `kind` + session id + a content hash of `identity`\n * (never `Date.now`/random). Same identity on a retry of the same logical work unit yields the same\n * id, so the ledger's `seenSubagentReportIds` dedupe catches a duplicate report instead of\n * double-counting spend.\n */\nfunction deriveSpawnedUsageReportId(kind: string, sessionId: string, identity: string): string {\n\tconst digest = createHash(\"sha256\").update(identity).digest(\"hex\").slice(0, 16);\n\treturn `${kind}:${sessionId}:${digest}`;\n}\n\nfunction joinTextPrefix(content: readonly unknown[], maxChars = Number.POSITIVE_INFINITY): string {\n\tlet found = false;\n\tlet text = \"\";\n\tfor (const part of content) {\n\t\tif (typeof part !== \"object\" || part === null || (part as { type?: unknown }).type !== \"text\") continue;\n\t\tconst blockText = (part as { text?: unknown }).text;\n\t\tif (typeof blockText !== \"string\") continue;\n\t\tif (!found) {\n\t\t\tfound = true;\n\t\t\tif (blockText.length >= maxChars) return blockText.slice(0, maxChars);\n\t\t\ttext = blockText;\n\t\t\tcontinue;\n\t\t}\n\t\tconst available = maxChars - text.length;\n\t\tif (available <= 0) return text;\n\t\tif (available === 1) return `${text}\\n`;\n\t\tconst remaining = available - 1;\n\t\ttext += `\\n${blockText.slice(0, remaining)}`;\n\t\tif (blockText.length >= remaining) return text;\n\t}\n\treturn text;\n}\n\n/** Latest user prompt text in the provider-visible array. */\nexport function latestUserPromptText(messages: AgentMessage[], maxChars = Number.POSITIVE_INFINITY): string {\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst message = messages[index];\n\t\tif (!message || message.role !== \"user\") continue;\n\t\tif (typeof message.content === \"string\") {\n\t\t\treturn message.content.length > maxChars ? message.content.slice(0, maxChars) : message.content;\n\t\t}\n\t\tconst text = joinTextPrefix(message.content, maxChars);\n\t\tif (text.length > 0) return text;\n\t}\n\treturn \"\";\n}\n\n/** Read a packed artifact-producing tool result's `details.artifactId`, if present, without `any`. */\nfunction extractArtifactId(message: AgentMessage | undefined): string | undefined {\n\tif (!message || message.role !== \"toolResult\") return undefined;\n\tconst details = (message as { details?: unknown }).details;\n\tif (typeof details !== \"object\" || details === null) return undefined;\n\tconst artifactId = (details as { artifactId?: unknown }).artifactId;\n\treturn typeof artifactId === \"string\" ? artifactId : undefined;\n}\n\n/** Per-message memo of `estimateTokens(message)`, keyed by message object identity --\n * same contract as {@link ContextAuditMemo}. See `estimateContextTokensMemoized`. */\ntype TokenMemo = Map<AgentMessage, number>;\n\ninterface ContextTokenEstimate {\n\ttokens: number;\n\tusageTokens: number;\n\ttrailingTokens: number;\n\tlastUsageIndex: number | null;\n}\n\n/** Mirrors compaction.ts's private `getAssistantUsage`: a non-aborted, non-error assistant\n * message's usage, or undefined. */\nfunction assistantUsageForTokenEstimate(message: AgentMessage): Usage | undefined {\n\tif (message.role !== \"assistant\") return undefined;\n\tconst assistant = message as AssistantMessage;\n\tif (assistant.stopReason === \"aborted\" || assistant.stopReason === \"error\" || !assistant.usage) return undefined;\n\treturn assistant.usage;\n}\n\n/** Mirrors compaction.ts's private `getLastAssistantUsageInfo`: the most recent message with\n * usable usage and its index, scanning from the end. */\nfunction findLastAssistantUsage(messages: AgentMessage[]): { usage: Usage; index: number } | undefined {\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst message = messages[index];\n\t\tif (!message) continue;\n\t\tconst usage = assistantUsageForTokenEstimate(message);\n\t\tif (usage) return { usage, index };\n\t}\n\treturn undefined;\n}\n\n/**\n * Incremental-memo reimplementation of `estimateContextTokens` (compaction.ts), built\n * from that module's exported per-message primitives (`estimateTokens`, `calculateContextTokens`)\n * instead of adding a memo parameter to `estimateContextTokens` itself: compaction.ts is left\n * unmodified, so the incremental design stays entirely inside context-pipeline.ts, matching a\n * \"zero agent-session.ts change\" scope. The orchestration (finding the last-assistant-usage\n * boundary, summing) is cheap and always reruns in full; only the expensive per-message\n * `estimateTokens` text scan is memoized, keyed by message object identity exactly like\n * `_auditMemo`. Produces byte-identical output to `estimateContextTokens(messages)` for the\n * same input regardless of `memo` -- see the equivalence test.\n */\nfunction estimateContextTokensMemoized(messages: AgentMessage[], memo?: TokenMemo): ContextTokenEstimate {\n\tconst freshMemo: TokenMemo | undefined = memo ? new Map() : undefined;\n\tconst tokensFor = (message: AgentMessage): number => {\n\t\tconst cached = memo?.get(message);\n\t\tconst tokens = cached ?? estimateTokens(message);\n\t\tfreshMemo?.set(message, tokens);\n\t\treturn tokens;\n\t};\n\n\tconst usageInfo = findLastAssistantUsage(messages);\n\tlet result: ContextTokenEstimate;\n\tif (!usageInfo) {\n\t\tlet estimated = 0;\n\t\tfor (const message of messages) {\n\t\t\testimated += tokensFor(message);\n\t\t}\n\t\tresult = { tokens: estimated, usageTokens: 0, trailingTokens: estimated, lastUsageIndex: null };\n\t} else {\n\t\tconst usageTokens = calculateContextTokens(usageInfo.usage);\n\t\tlet trailingTokens = 0;\n\t\tfor (let index = usageInfo.index + 1; index < messages.length; index++) {\n\t\t\ttrailingTokens += tokensFor(messages[index]);\n\t\t}\n\t\tresult = { tokens: usageTokens + trailingTokens, usageTokens, trailingTokens, lastUsageIndex: usageInfo.index };\n\t}\n\n\tif (memo && freshMemo) {\n\t\tmemo.clear();\n\t\tfor (const [key, value] of freshMemo) memo.set(key, value);\n\t}\n\treturn result;\n}\n\nexport interface ContextPipelineDeps {\n\t/** Current turn index, stamped into audit/policy/enforcement reports. */\n\tgetTurnIndex(): number;\n\t/** Session log: audit lookup, gc/artifact storage dirs, curation entries, token-estimate compaction anchor. */\n\tgetSessionManager(): SessionManager;\n\t/** Context-gc / prompt-enforcement / curation settings (all opt-in gates). */\n\tgetSettingsManager(): SettingsManager;\n\t/** Resolves a configured curation model pattern against configured auth. */\n\tgetModelRegistry(): ModelRegistry;\n\t/** Foreground model currently executing the transformed request. */\n\tgetModel(): Model<Api> | undefined;\n\t/** Root dir the host-keyed {@link FitnessStore} and per-session gc/artifact storage live under. */\n\tgetAgentDir(): string;\n\t/** Workspace root, passed to the context-gc pass. */\n\tgetCwd(): string;\n\t/** Currently-active tool names — enforcement checks whether artifact_retrieve is a live affordance. */\n\tgetActiveToolNames(): string[];\n\t/** A disposed session must never persist a curation/pre-digest entry. */\n\tisDisposed(): boolean;\n\t/** The live memory manager — the active providers' page markers feed the semantic-gc scan. */\n\tgetMemoryManager(): MemoryManager;\n\t/** Roll a curation drain's spawned usage into session accounting (idempotent per reportId).\n\t * `reportId` is REQUIRED: every caller derives a stable id from the work unit's identity\n\t * so a retry cannot double-count. */\n\taddSpawnedUsage(\n\t\tusage: Usage,\n\t\topts: { label?: string; sourceSessionId?: string; reportId: string },\n\t): string | undefined;\n\t/** One-shot LLM call fully isolated from the main session — the curation/pre-digest execution primitive. */\n\trunIsolatedCompletion(opts: IsolatedCompletionOptions): Promise<IsolatedCompletionResult>;\n}\n\nexport class ContextPipeline {\n\tprivate _latestContextGcReport: ContextGcReport | undefined = undefined;\n\t/** Brain-curation sidecar (design: brain-context-curation-design.md). Inert unless the\n\t * contextPolicy.curation setting is enabled AND the model passes the digest fitness gate. */\n\tprivate readonly _brainCurator = new BrainCurator();\n\tprivate _lastCurationSkipReason: string | undefined = undefined;\n\tprivate _lastPreDigestSkipReason: string | undefined = undefined;\n\tprivate _toolArtifactStore: ArtifactStore | undefined = undefined;\n\tprivate _contextStoreRetentionLease: ContextStoreRetentionLease | undefined;\n\tprivate _latestContextAuditReport: ContextAuditReport | undefined = undefined;\n\tprivate _latestPromptPolicyReport: PromptPolicyShadowReport | undefined = undefined;\n\tprivate _latestPromptPolicyGcCorrelation: PromptPolicyGcCorrelationReport | undefined = undefined;\n\tprivate _latestPromptEnforcementReport: PromptEnforcementReport | undefined = undefined;\n\tprivate readonly _tokenBudget = new TokenBudget();\n\tprivate _hasTokenBudgetAnchor = false;\n\tprivate _tokenBudgetAnchorCompactionId: string | undefined = undefined;\n\tprivate _lastTokenBudgetAnchorKey: string | undefined = undefined;\n\t/** Incremental current-branch lookup used by the per-turn audit. It retains only tool calls\n\t * still present in the provider-visible context, so compaction also bounds this cache. */\n\tprivate _sessionEntryLookupCache: { leafId: string | null; byToolCallId: Map<string, string> } | undefined =\n\t\tundefined;\n\t/** Incremental memo for the hot-path audit's expensive per-message work, keyed by\n\t * message object identity -- see {@link ContextAuditMemo}'s doc for the invalidation\n\t * contract. Rebuilt fresh (stale entries dropped) by `runContextAudit` every pass. */\n\tprivate readonly _auditMemo: ContextAuditMemo = new Map();\n\t/** Incremental memo for the per-message token estimate `estimateContextTokensMemoized`\n\t * relies on -- same object-identity-keyed, fresh-rebuild-per-pass contract as `_auditMemo`,\n\t * just for a plain `estimateTokens(message)` number instead of a built ContextItem. */\n\tprivate readonly _tokenMemo: TokenMemo = new Map();\n\n\tprivate readonly deps: ContextPipelineDeps;\n\n\tconstructor(deps: ContextPipelineDeps) {\n\t\tthis.deps = deps;\n\t}\n\n\tprivate _ensureContextStoreRetention(): ContextStoreRetentionLease {\n\t\tif (!this._contextStoreRetentionLease) {\n\t\t\tthis._contextStoreRetentionLease = acquireContextStoreRetention(\n\t\t\t\tthis.deps.getAgentDir(),\n\t\t\t\tthis.deps.getSessionManager().getSessionId(),\n\t\t\t);\n\t\t}\n\t\treturn this._contextStoreRetentionLease;\n\t}\n\n\tprivate _contextGcStorageDir(): string {\n\t\treturn this._ensureContextStoreRetention().gcDir;\n\t}\n\n\tprivate _toolArtifactsDir(): string {\n\t\treturn this._ensureContextStoreRetention().artifactsDir;\n\t}\n\n\t/**\n\t * Session-scoped, filesystem-backed artifact store for first-capture-then-bound tool\n\t * output (grep/find/run_toolkit_script -- see tool-output-artifacts.md). Lazily created and\n\t * cached so every tool construction in this session shares one store instance.\n\t *\n\t * `packToolOutput()` registers a reference (the packing tool call's id) at pack time\n\t * and fails closed, so packed artifacts are never prematurely collected.\n\t * `_releaseGcPackedArtifactReferences()` (called from `applyContextGc()`) releases\n\t * that reference once context-gc packs the result out of live context, and\n\t * opportunistically reclaims now-unreferenced artifacts via `cleanup()`.\n\t * Cross-session retention is enforced when either payload store is first used. Active\n\t * sessions hold PID-marked leases; inactive stores are pruned by age, count, and bytes.\n\t */\n\tgetToolArtifactStore(): ArtifactStore {\n\t\tthis._toolArtifactStore ??= createFileArtifactStore({ baseDir: this._toolArtifactsDir() });\n\t\treturn this._toolArtifactStore;\n\t}\n\n\t/**\n\t * Best-effort final sweep of any already-released (zero-reference) tool-output artifact at\n\t * session dispose. Reads the field (not the getter) so a session that never packed anything\n\t * doesn't force-create a store/dir just to sweep it.\n\t */\n\tcleanupToolArtifactStoreOnDispose(): void {\n\t\tthis._toolArtifactStore?.cleanup();\n\t\tthis._contextStoreRetentionLease?.release();\n\t\tthis._contextStoreRetentionLease = undefined;\n\t\t// Release memoized message references promptly so a disposed session's messages are\n\t\t// GC-eligible even if this ContextPipeline instance itself briefly lingers.\n\t\tthis._auditMemo.clear();\n\t\tthis._tokenMemo.clear();\n\t}\n\n\t/**\n\t * Map tool-result call ids to persisted session-entry ids. Linear branch growth is handled\n\t * incrementally by walking only entries appended since the cached leaf; a branch switch falls\n\t * back to one full rebuild so lookups never leak entries from the abandoned branch.\n\t */\n\tprivate _getLatestCompactionEntry(): CompactionEntry | null {\n\t\tconst sessionManager = this.deps.getSessionManager();\n\t\tconst indexedSessionManager = sessionManager as unknown as {\n\t\t\tgetLeafId?: () => string | null;\n\t\t\tgetEntry?: (id: string) => SessionEntry | undefined;\n\t\t};\n\t\tconst getLeafId = indexedSessionManager.getLeafId?.bind(sessionManager);\n\t\tconst getEntry = indexedSessionManager.getEntry?.bind(sessionManager);\n\t\tconst leafId = getLeafId?.();\n\t\tif (getLeafId && getEntry && leafId !== undefined) {\n\t\t\tlet currentId = leafId;\n\t\t\twhile (currentId !== null) {\n\t\t\t\tconst entry = getEntry(currentId);\n\t\t\t\tif (!entry) break;\n\t\t\t\tif (entry.type === \"compaction\") return entry;\n\t\t\t\tcurrentId = entry.parentId;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\treturn getLatestCompactionEntry(sessionManager.getBranch());\n\t}\n\n\tprivate _buildSessionEntryIdLookup(\n\t\twantedToolCallIds: ReadonlySet<string>,\n\t): (toolCallId: string) => string | undefined {\n\t\tconst sessionManager = this.deps.getSessionManager();\n\t\tconst indexedSessionManager = sessionManager as unknown as {\n\t\t\tgetLeafId?: () => string | null;\n\t\t\tgetEntry?: (id: string) => SessionEntry | undefined;\n\t\t};\n\t\tconst getLeafId = indexedSessionManager.getLeafId?.bind(sessionManager);\n\t\tconst getEntry = indexedSessionManager.getEntry?.bind(sessionManager);\n\t\tconst leafId = getLeafId?.();\n\t\tconst cached = this._sessionEntryLookupCache;\n\t\tif (cached) {\n\t\t\tfor (const toolCallId of cached.byToolCallId.keys()) {\n\t\t\t\tif (!wantedToolCallIds.has(toolCallId)) cached.byToolCallId.delete(toolCallId);\n\t\t\t}\n\t\t}\n\t\tif (getLeafId && getEntry && leafId !== undefined) {\n\t\t\tif (cached?.leafId === leafId) {\n\t\t\t\treturn (toolCallId) => cached.byToolCallId.get(toolCallId);\n\t\t\t}\n\t\t\tif (cached) {\n\t\t\t\tconst appendedEntries: SessionEntry[] = [];\n\t\t\t\tlet cursor = leafId;\n\t\t\t\twhile (cursor !== null && cursor !== cached.leafId) {\n\t\t\t\t\tconst entry = getEntry(cursor);\n\t\t\t\t\tif (!entry) break;\n\t\t\t\t\tappendedEntries.push(entry);\n\t\t\t\t\tcursor = entry.parentId;\n\t\t\t\t}\n\t\t\t\tif (cursor === cached.leafId) {\n\t\t\t\t\tfor (let index = appendedEntries.length - 1; index >= 0; index--) {\n\t\t\t\t\t\tconst entry = appendedEntries[index];\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tentry.type === \"message\" &&\n\t\t\t\t\t\t\tentry.message.role === \"toolResult\" &&\n\t\t\t\t\t\t\twantedToolCallIds.has(entry.message.toolCallId)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcached.byToolCallId.set(entry.message.toolCallId, entry.id);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcached.leafId = leafId;\n\t\t\t\t\treturn (toolCallId) => cached.byToolCallId.get(toolCallId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst byToolCallId = new Map<string, string>();\n\t\tfor (const entry of sessionManager.getBranch()) {\n\t\t\tif (\n\t\t\t\tentry.type === \"message\" &&\n\t\t\t\tentry.message.role === \"toolResult\" &&\n\t\t\t\twantedToolCallIds.has(entry.message.toolCallId)\n\t\t\t) {\n\t\t\t\tbyToolCallId.set(entry.message.toolCallId, entry.id);\n\t\t\t}\n\t\t}\n\t\tif (leafId !== undefined) this._sessionEntryLookupCache = { leafId, byToolCallId };\n\t\treturn (toolCallId) => byToolCallId.get(toolCallId);\n\t}\n\n\t/** Options shared by the memoized hot path and the no-memo full-scan path. */\n\tprivate _buildContextAuditOptions(messages: AgentMessage[]): ContextAuditOptions {\n\t\tconst wantedToolCallIds = new Set(\n\t\t\tmessages.filter((message) => message.role === \"toolResult\").map((message) => message.toolCallId),\n\t\t);\n\t\treturn {\n\t\t\tturnIndex: this.deps.getTurnIndex(),\n\t\t\tartifactStore: this._toolArtifactStore,\n\t\t\tsessionEntryIdForToolCallId: this._buildSessionEntryIdLookup(wantedToolCallIds),\n\t\t};\n\t}\n\n\t/**\n\t * Phase 1 observe-only audit pass (see context/context-audit.ts): converts live\n\t * toolResult messages into ContextItems and runs the existing retention/hard-constraint\n\t * evaluators over them, storing the latest deterministic report for tests/debugging.\n\t * Read-only with respect to messages, the transcript, and artifact references -- uses\n\t * `_toolArtifactStore` (the field), not `getToolArtifactStore()` (the getter), so a\n\t * session that never packed anything doesn't force-create a store/dir just to audit.\n\t * Never throws into a live turn: any failure degrades to an empty report.\n\t *\n\t * This is the memoized hot path (the real per-turn context transform calls it every\n\t * round trip via agent-session.ts's one-line delegation) -- see `_auditMemo`'s doc for the\n\t * incremental design. `getContextAuditReport`/`getPromptPolicyReport`'s `messages`-arg\n\t * recompute variants deliberately do NOT go through this method (see\n\t * `_runContextAuditFullScan`), so a read-only debug/test peek at a hypothetical `messages`\n\t * array can never evict a live entry out of the hot-path memo.\n\t */\n\trunContextAudit(messages: AgentMessage[]): ContextAuditReport {\n\t\ttry {\n\t\t\tconst report = runContextAudit(messages, this._buildContextAuditOptions(messages), this._auditMemo);\n\t\t\tthis._latestContextAuditReport = report;\n\t\t\treturn report;\n\t\t} catch {\n\t\t\tconst report: ContextAuditReport = { turnIndex: this.deps.getTurnIndex(), items: [] };\n\t\t\tthis._latestContextAuditReport = report;\n\t\t\treturn report;\n\t\t}\n\t}\n\n\t/** No-memo full-scan variant of {@link runContextAudit}, for read-only recompute callers. */\n\tprivate _runContextAuditFullScan(messages: AgentMessage[]): ContextAuditReport {\n\t\ttry {\n\t\t\tconst report = runContextAudit(messages, this._buildContextAuditOptions(messages));\n\t\t\tthis._latestContextAuditReport = report;\n\t\t\treturn report;\n\t\t} catch {\n\t\t\tconst report: ContextAuditReport = { turnIndex: this.deps.getTurnIndex(), items: [] };\n\t\t\tthis._latestContextAuditReport = report;\n\t\t\treturn report;\n\t\t}\n\t}\n\n\t/**\n\t * Read-only inspection of the context audit. With `messages`, recomputes fresh against\n\t * the given array (still no mutation of messages/transcript/artifact refs) -- a pure\n\t * full scan, bypassing the hot-path memo (see `_runContextAuditFullScan`); without,\n\t * returns the last report computed during a real transform pass.\n\t */\n\tgetContextAuditReport(messages?: AgentMessage[]): ContextAuditReport {\n\t\tif (messages) return this._runContextAuditFullScan(messages);\n\t\treturn this._latestContextAuditReport ?? { turnIndex: this.deps.getTurnIndex(), items: [] };\n\t}\n\n\t/**\n\t * Observe-first shadow/planning pass (see context/context-prompt-policy.ts): re-shapes\n\t * the audit report into a per-item policy plan whose `appliedAction` is always\n\t * \"keep_raw\" -- this never enforces anything, it only records what the policy engine\n\t * would say. Never throws into a live turn: any failure degrades to an empty report.\n\t */\n\trunPromptPolicyPlanning(auditReport: ContextAuditReport): PromptPolicyShadowReport {\n\t\ttry {\n\t\t\tconst report = planPromptPolicy(auditReport);\n\t\t\tthis._latestPromptPolicyReport = report;\n\t\t\treturn report;\n\t\t} catch {\n\t\t\tconst report: PromptPolicyShadowReport = { turnIndex: this.deps.getTurnIndex(), items: [] };\n\t\t\tthis._latestPromptPolicyReport = report;\n\t\t\treturn report;\n\t\t}\n\t}\n\n\t/**\n\t * Read-only inspection of the shadow policy plan. With `messages`, recomputes fresh\n\t * (audit + plan) against the given array; without, returns the last plan computed\n\t * during a real transform pass. Never mutates messages/transcript/artifact refs.\n\t */\n\tgetPromptPolicyReport(messages?: AgentMessage[]): PromptPolicyShadowReport {\n\t\tif (messages) return this.runPromptPolicyPlanning(this._runContextAuditFullScan(messages));\n\t\treturn this._latestPromptPolicyReport ?? { turnIndex: this.deps.getTurnIndex(), items: [] };\n\t}\n\n\t/**\n\t * Report-only correlation between the shadow plan just computed this turn and what the\n\t * legacy context-gc pass actually packed. Runs after `applyContextGc()` has already\n\t * produced its report; never influences context-gc itself. Never throws into a live\n\t * turn: any failure degrades to an empty correlation.\n\t */\n\tcorrelatePromptPolicyWithContextGc(gcReport: ContextGcReport): void {\n\t\tconst shadowReport = this._latestPromptPolicyReport ?? { turnIndex: this.deps.getTurnIndex(), items: [] };\n\t\ttry {\n\t\t\tthis._latestPromptPolicyGcCorrelation = correlateWithContextGc(shadowReport, gcReport);\n\t\t} catch {\n\t\t\tthis._latestPromptPolicyGcCorrelation = { turnIndex: this.deps.getTurnIndex(), entries: [] };\n\t\t}\n\t}\n\n\t/** Read-only inspection of the latest shadow-plan/legacy-gc correlation, for tests/debugging. */\n\tgetPromptPolicyGcCorrelation(): PromptPolicyGcCorrelationReport {\n\t\treturn this._latestPromptPolicyGcCorrelation ?? { turnIndex: this.deps.getTurnIndex(), entries: [] };\n\t}\n\n\t/**\n\t * First enforcement pilot (see context/context-prompt-enforcement.ts): opt-in,\n\t * default-disabled stub-in-place of stale artifact-backed tool_output results in the\n\t * provider-visible message array only. Runs on `messages` AFTER context-gc has already\n\t * produced its own result, so legacy context-gc's own packing/reporting is completely\n\t * unaffected by this pass -- it only ever acts on messages gc left untouched this turn.\n\t * Never throws into a live turn: any failure degrades to returning `messages` unchanged.\n\t */\n\trunPromptEnforcement(\n\t\tmessages: AgentMessage[],\n\t\tshadowReport: PromptPolicyShadowReport,\n\t): { messages: AgentMessage[]; report: PromptEnforcementReport } {\n\t\ttry {\n\t\t\tconst persistedSettings = this.deps.getSettingsManager().getContextPromptEnforcementSettings();\n\t\t\tconst curationEnabled = this.deps.getSettingsManager().getContextCurationSettings().enabled;\n\t\t\tconst settings = {\n\t\t\t\t...persistedSettings,\n\t\t\t\t// Runtime fact, never assumed: artifact_retrieve is a companion affordance\n\t\t\t\t// (auto-activated alongside grep/find), not a default/global tool, so active\n\t\t\t\t// tools can differ turn to turn -- see context-prompt-enforcement.ts's doc\n\t\t\t\t// comment on why this is checked separately from hasAvailableRetrievalPath.\n\t\t\t\tretrievalToolAvailable: this.deps.getActiveToolNames().includes(\"artifact_retrieve\"),\n\t\t\t\tbrainRelevance: curationEnabled ? (itemId: string) => this._brainCurator.getRelevance(itemId) : undefined,\n\t\t\t};\n\t\t\tconst result = enforcePromptPolicy(messages, shadowReport, settings);\n\t\t\tthis._latestPromptEnforcementReport = result.report;\n\t\t\treturn result;\n\t\t} catch {\n\t\t\tconst report: PromptEnforcementReport = { turnIndex: this.deps.getTurnIndex(), items: [] };\n\t\t\tthis._latestPromptEnforcementReport = report;\n\t\t\treturn { messages, report };\n\t\t}\n\t}\n\n\t/**\n\t * Enqueue relevance-scoring jobs for stale, artifact-backed tool outputs the enforcement\n\t * pilot could act on. Pure queueing — the verdicts only ever take effect through the\n\t * asymmetric advisory lever inside enforcePromptPolicy. Never throws into a turn.\n\t */\n\tenqueueRelevanceCuration(messages: AgentMessage[], shadowReport: PromptPolicyShadowReport): void {\n\t\ttry {\n\t\t\tconst settings = this.deps.getSettingsManager().getContextCurationSettings();\n\t\t\tif (!settings.enabled) return;\n\t\t\tconst goal = latestUserPromptText(messages, 400);\n\t\t\tfor (const item of shadowReport.items) {\n\t\t\t\tif (!item.hasAvailableRetrievalPath) continue;\n\t\t\t\tconst message = messages[item.messageIndex];\n\t\t\t\tif (!message || message.role !== \"toolResult\" || message.toolCallId !== item.toolCallId) continue;\n\t\t\t\tif (message.isError) continue;\n\t\t\t\tconst details = message.details as\n\t\t\t\t\t| { contextGc?: { packed?: unknown }; promptPolicy?: { enforced?: unknown } }\n\t\t\t\t\t| undefined;\n\t\t\t\tif (details?.contextGc?.packed === true || details?.promptPolicy?.enforced === true) continue;\n\t\t\t\tconst text = joinTextPrefix(message.content, 4000);\n\t\t\t\tif (text.length === 0) continue;\n\t\t\t\tthis._brainCurator.enqueue({ kind: \"relevance\", key: item.itemId, content: text, goal });\n\t\t\t}\n\t\t} catch {\n\t\t\t// curation is a sidecar; it must never disrupt a turn\n\t\t}\n\t}\n\n\t/**\n\t * Drain gate: settings on, model configured+authed, and the model has PASSED the digest\n\t * fitness probe on THIS host (design: unfit or unprobed models are refused with a visible\n\t * reason, never silently degraded). Fire-and-forget; never throws into a turn.\n\t */\n\t/**\n\t * Resolve the curation model IFF every gate passes: setting enabled, model configured,\n\t * resolvable+authed, and digest-fitness-proven on THIS host (canonical \"provider/id\" ref —\n\t * runModelFitness stores reports under it, while settings.model may be a bare id or pattern).\n\t * Sets _lastCurationSkipReason on refusal; never throws.\n\t */\n\tprivate _effectiveContextWindowFromFitness(model: Model<Api>): number {\n\t\tconst registered = model.contextWindow > 0 ? model.contextWindow : Number.POSITIVE_INFINITY;\n\t\tconst capacity = FitnessStore.forAgentDir(this.deps.getAgentDir())\n\t\t\t.getForHost()\n\t\t\t.find((entry) => entry.model === `${model.provider}/${model.id}`)?.report.capacity?.servedContextWindow;\n\t\treturn capacity && capacity > 0 ? Math.min(registered, capacity) : registered;\n\t}\n\n\tresolveCurationModelIfFit(): Model<Api> | undefined {\n\t\tconst settings = this.deps.getSettingsManager().getContextCurationSettings();\n\t\tif (!settings.enabled) {\n\t\t\t// Never surface a stale refusal reason for a feature the user has since disabled.\n\t\t\tthis._lastCurationSkipReason = undefined;\n\t\t\treturn undefined;\n\t\t}\n\t\tif (!settings.model) {\n\t\t\tthis._lastCurationSkipReason = \"curation_model_unset\";\n\t\t\treturn undefined;\n\t\t}\n\t\tconst resolved = resolveCliModel({ cliModel: settings.model, modelRegistry: this.deps.getModelRegistry() });\n\t\tif (!resolved.model || !this.deps.getModelRegistry().hasConfiguredAuth(resolved.model)) {\n\t\t\tthis._lastCurationSkipReason = \"curation_model_unresolved\";\n\t\t\treturn undefined;\n\t\t}\n\t\tconst canonicalRef = `${resolved.model.provider}/${resolved.model.id}`;\n\t\tconst fitness = FitnessStore.forAgentDir(this.deps.getAgentDir())\n\t\t\t.getForHost()\n\t\t\t.find((entry) => entry.model === canonicalRef);\n\t\tconst verdict = evaluateSurfaceFitness(\"curation\", fitness?.report);\n\t\tif (!verdict.fit) {\n\t\t\tthis._lastCurationSkipReason =\n\t\t\t\tverdict.reason === \"unprobed\" ? \"curation_model_unprobed\" : \"curation_model_digest_unfit\";\n\t\t\treturn undefined;\n\t\t}\n\t\tthis._lastCurationSkipReason = undefined;\n\t\treturn resolved.model;\n\t}\n\n\tmaybeDrainBrainCuration(): void {\n\t\ttry {\n\t\t\tif (!this._brainCurator.hasWork() || this._brainCurator.isDraining) return;\n\t\t\tconst model = this.resolveCurationModelIfFit();\n\t\t\tif (!model) return;\n\t\t\tconst foregroundModel = this.deps.getModel();\n\t\t\tconst foregroundIsManagedLocal =\n\t\t\t\tforegroundModel?.provider === OLLAMA_PROVIDER || foregroundModel?.provider === HF_TRANSFORMERS_PROVIDER;\n\t\t\tconst curatorIsManagedLocal =\n\t\t\t\tmodel.provider === OLLAMA_PROVIDER || model.provider === HF_TRANSFORMERS_PROVIDER;\n\t\t\tif (foregroundIsManagedLocal && curatorIsManagedLocal) {\n\t\t\t\t// Local foreground accuracy/latency wins. A fire-and-forget curator can otherwise reach\n\t\t\t\t// a single-parallel server first and make the user's request wait behind sidecar work.\n\t\t\t\tthis._lastCurationSkipReason = \"curation_deferred_for_local_foreground\";\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst settings = this.deps.getSettingsManager().getContextCurationSettings();\n\t\t\tvoid this._drainBrainCuration(model, settings.maxJobsPerTurn);\n\t\t} catch {\n\t\t\t// curation is a sidecar; it must never disrupt a turn\n\t\t}\n\t}\n\n\t/**\n\t * Compaction pre-digest gate (design surface 3): everything the drain gate requires PLUS a\n\t * RUNTIME reliability proof — the curator must have run >=5 jobs on this session with a parse\n\t * failure rate <=5% before it is trusted to pre-digest compaction input. Returns undefined\n\t * (verbatim compaction, byte-for-byte today's behavior) whenever any gate refuses.\n\t */\n\tbuildCompactionPreDigest(): ((text: string, signal?: AbortSignal) => Promise<string>) | undefined {\n\t\ttry {\n\t\t\tconst model = this.resolveCurationModelIfFit();\n\t\t\tif (!model) return undefined;\n\t\t\tconst telemetry = this._brainCurator.telemetry();\n\t\t\tif (telemetry.jobsRun < 5 || telemetry.parseFailures / telemetry.jobsRun > 0.05) {\n\t\t\t\tthis._lastPreDigestSkipReason = \"curation_predigest_reliability_unproven\";\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tthis._lastPreDigestSkipReason = undefined;\n\t\t\treturn async (text, signal) => {\n\t\t\t\tconst effectiveWindow = this._effectiveContextWindowFromFitness(model);\n\t\t\t\tconst chunkChars = Number.isFinite(effectiveWindow)\n\t\t\t\t\t? Math.max(1_000, Math.floor((effectiveWindow - 1024) * 4))\n\t\t\t\t\t: undefined;\n\t\t\t\tconst result = await preDigestConversationText({\n\t\t\t\t\ttext,\n\t\t\t\t\tsignal,\n\t\t\t\t\tchunkChars,\n\t\t\t\t\tcomplete: async ({ systemPrompt, userPrompt, signal: chunkSignal }) => {\n\t\t\t\t\t\tconst completion = await this.deps.runIsolatedCompletion({\n\t\t\t\t\t\t\tsystemPrompt,\n\t\t\t\t\t\t\tmessages: [{ role: \"user\", content: [{ type: \"text\", text: userPrompt }], timestamp: Date.now() }],\n\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\tthinkingLevel: \"off\",\n\t\t\t\t\t\t\tmaxTokens: 512,\n\t\t\t\t\t\t\tsignal: chunkSignal,\n\t\t\t\t\t\t\tcacheRetention: \"short\",\n\t\t\t\t\t\t\t// Stable per-lane synthetic affinity key so repeat pre-digest chunk\n\t\t\t\t\t\t\t// calls hit the same cache-warm backend.\n\t\t\t\t\t\t\tlaneKind: \"curation\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttext: completion.text,\n\t\t\t\t\t\t\tcostUsd: completion.usage.cost.total,\n\t\t\t\t\t\t\tstopReason: String(completion.stopReason),\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tif (!this.deps.isDisposed() && result.totalChunks > 0) {\n\t\t\t\t\tthis.deps.getSessionManager().appendCustomEntry(\"brain-curation-predigest\", {\n\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\ttotalChunks: result.totalChunks,\n\t\t\t\t\t\tdigested: result.digested,\n\t\t\t\t\t\tfailed: result.failed,\n\t\t\t\t\t\tcharsBefore: text.length,\n\t\t\t\t\t\tcharsAfter: result.text.length,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn result.text;\n\t\t\t};\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate async _drainBrainCuration(model: Model<Api>, maxJobs: number): Promise<void> {\n\t\ttry {\n\t\t\t// ACCUMULATE across all drained jobs (the drain runs the completer once PER job) —\n\t\t\t// keeping only the last job's usage would under-report every multi-job drain.\n\t\t\tlet spentUsage: AssistantMessage[\"usage\"] | undefined;\n\t\t\tconst results = await this._brainCurator.drain({\n\t\t\t\tmaxJobs,\n\t\t\t\tcomplete: async ({ systemPrompt, userPrompt, signal }) => {\n\t\t\t\t\tconst completion = await this.deps.runIsolatedCompletion({\n\t\t\t\t\t\tsystemPrompt,\n\t\t\t\t\t\tmessages: [{ role: \"user\", content: [{ type: \"text\", text: userPrompt }], timestamp: Date.now() }],\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tthinkingLevel: \"off\",\n\t\t\t\t\t\tmaxTokens: 256,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t// Both curation system prompts are static — the provider can cache the prefix.\n\t\t\t\t\t\tcacheRetention: \"short\",\n\t\t\t\t\t\t// Stable per-lane synthetic affinity key so repeat curation jobs hit the\n\t\t\t\t\t\t// same cache-warm backend.\n\t\t\t\t\t\tlaneKind: \"curation\",\n\t\t\t\t\t});\n\t\t\t\t\tconst usage = completion.usage;\n\t\t\t\t\tif (!spentUsage) {\n\t\t\t\t\t\tspentUsage = structuredClone(usage);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tspentUsage.input += usage.input;\n\t\t\t\t\t\tspentUsage.output += usage.output;\n\t\t\t\t\t\tspentUsage.cacheRead += usage.cacheRead;\n\t\t\t\t\t\tspentUsage.cacheWrite += usage.cacheWrite;\n\t\t\t\t\t\tspentUsage.totalTokens += usage.totalTokens;\n\t\t\t\t\t\tspentUsage.cost.input += usage.cost.input;\n\t\t\t\t\t\tspentUsage.cost.output += usage.cost.output;\n\t\t\t\t\t\tspentUsage.cost.cacheRead += usage.cost.cacheRead;\n\t\t\t\t\t\tspentUsage.cost.cacheWrite += usage.cost.cacheWrite;\n\t\t\t\t\t\tspentUsage.cost.total += usage.cost.total;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttext: completion.text,\n\t\t\t\t\t\tcostUsd: completion.usage.cost.total,\n\t\t\t\t\t\tstopReason: String(completion.stopReason),\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t});\n\t\t\t// Honest accounting even for free local models: token visibility is the contract.\n\t\t\tif (spentUsage && (spentUsage.cost.total > 0 || spentUsage.totalTokens > 0)) {\n\t\t\t\t// `reportId` keyed on the drained jobs' own idempotency keys — stable across a\n\t\t\t\t// retry of the same drain batch, distinct across genuinely different batches.\n\t\t\t\tconst reportId = deriveSpawnedUsageReportId(\n\t\t\t\t\t\"context-curator\",\n\t\t\t\t\tthis.deps.getSessionManager().getSessionId(),\n\t\t\t\t\tresults.map((result) => result.key).join(\" \"),\n\t\t\t\t);\n\t\t\t\tthis.deps.addSpawnedUsage(spentUsage, { label: \"context-curator\", reportId });\n\t\t\t}\n\t\t\tif (this.deps.isDisposed() || results.length === 0) return;\n\t\t\tthis.deps.getSessionManager().appendCustomEntry(\"brain-curation\", {\n\t\t\t\tversion: 1,\n\t\t\t\tresults: results.map((result) => ({\n\t\t\t\t\tkey: result.key,\n\t\t\t\t\tkind: result.kind,\n\t\t\t\t\tok: result.ok,\n\t\t\t\t\tms: result.ms,\n\t\t\t\t\t...(result.digest !== undefined ? { digest: result.digest } : {}),\n\t\t\t\t\t...(result.relevant !== undefined ? { relevant: result.relevant, confidence: result.confidence } : {}),\n\t\t\t\t})),\n\t\t\t\ttelemetry: this._brainCurator.telemetry(),\n\t\t\t});\n\t\t} catch {\n\t\t\t// curation is a sidecar; it must never disrupt a turn\n\t\t}\n\t}\n\n\t/** Curation status for diagnostics/dashboard: settings, live telemetry, last refusal reason. */\n\tgetContextCurationStatus(): {\n\t\tenabled: boolean;\n\t\tmodel?: string;\n\t\ttelemetry: CurationTelemetrySnapshot;\n\t\tlastSkipReason?: string;\n\t\tlastPreDigestSkipReason?: string;\n\t} {\n\t\tconst settings = this.deps.getSettingsManager().getContextCurationSettings();\n\t\treturn {\n\t\t\tenabled: settings.enabled,\n\t\t\tmodel: settings.model,\n\t\t\ttelemetry: this._brainCurator.telemetry(),\n\t\t\tlastSkipReason: this._lastCurationSkipReason,\n\t\t\tlastPreDigestSkipReason: this._lastPreDigestSkipReason,\n\t\t};\n\t}\n\n\t/** Read-only inspection of the latest prompt-enforcement report, for tests/debugging. */\n\tgetPromptEnforcementReport(): PromptEnforcementReport {\n\t\treturn this._latestPromptEnforcementReport ?? { turnIndex: this.deps.getTurnIndex(), items: [] };\n\t}\n\n\tapplyContextGc(\n\t\tmessages: AgentMessage[],\n\t\twritePayloads: boolean,\n\t): { messages: AgentMessage[]; report: ContextGcReport } {\n\t\ttry {\n\t\t\tconst settings = this.deps.getSettingsManager().getContextGcSettings();\n\t\t\t// Merge the ACTIVE memory providers' own page markers (e.g. transcript-recall's\n\t\t\t// \"<memory_context\") into the semantic-memory marker list. The settings default is\n\t\t\t// provider-agnostic and non-empty, so without this merge the recall pages the bundled\n\t\t\t// default provider actually emits are never recognized as semantic-memory pages and\n\t\t\t// accumulate raw for the life of the session — the exact growth Bug #7 GC exists to stop.\n\t\t\tconst providerMarkers = this.deps.getMemoryManager().getContextMarkers();\n\t\t\tconst curationSettings = this.deps.getSettingsManager().getContextCurationSettings();\n\t\t\tconst result = applyContextGc(messages, {\n\t\t\t\t...settings,\n\t\t\t\tsemanticMemory: {\n\t\t\t\t\t...settings.semanticMemory,\n\t\t\t\t\tmarkers: [...new Set([...settings.semanticMemory.markers, ...providerMarkers])],\n\t\t\t\t},\n\t\t\t\tcwd: this.deps.getCwd(),\n\t\t\t\tstorageDir: this._contextGcStorageDir(),\n\t\t\t\twritePayloads,\n\t\t\t\tcuration: curationSettings.enabled\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tresolveDigest: (digestKey) => {\n\t\t\t\t\t\t\t\tconst digest = this._brainCurator.getDigest(digestKey);\n\t\t\t\t\t\t\t\t// Count serves on the REAL per-turn pass only, never the report path.\n\t\t\t\t\t\t\t\tif (digest !== undefined && writePayloads) this._brainCurator.noteDigestServed();\n\t\t\t\t\t\t\t\treturn digest;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t// Only the real per-turn pass enqueues work; the read-only report path\n\t\t\t\t\t\t\t// (writePayloads=false) stays side-effect free.\n\t\t\t\t\t\t\tonPacked: writePayloads\n\t\t\t\t\t\t\t\t? (record, originalText) => {\n\t\t\t\t\t\t\t\t\t\tthis._brainCurator.enqueue({\n\t\t\t\t\t\t\t\t\t\t\tkind: \"stub_digest\",\n\t\t\t\t\t\t\t\t\t\t\tkey: record.key ?? record.toolCallId,\n\t\t\t\t\t\t\t\t\t\t\tcontent: originalText,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t\tthis._latestContextGcReport = result.report;\n\t\t\t// Only release/reclaim on the real per-turn pass (writePayloads=true), never on\n\t\t\t// the read-only status-report path (getContextGcReport with writePayloads=false),\n\t\t\t// so merely inspecting the report can't have side effects.\n\t\t\tif (writePayloads && result.report.packedCount > 0) {\n\t\t\t\tthis._releaseGcPackedArtifactReferences(messages, result.report);\n\t\t\t}\n\t\t\treturn result;\n\t\t} catch {\n\t\t\tconst report: ContextGcReport = {\n\t\t\t\tenabled: false,\n\t\t\t\tpackedCount: 0,\n\t\t\t\toriginalTokens: 0,\n\t\t\t\tpackedTokens: 0,\n\t\t\t\tsavedTokens: 0,\n\t\t\t\trecords: [],\n\t\t\t};\n\t\t\tthis._latestContextGcReport = report;\n\t\t\treturn { messages, report };\n\t\t}\n\t}\n\n\t/**\n\t * Reference-release + cleanup lifecycle: once context-gc has packed an artifact-producing\n\t * tool result (grep/find/run_toolkit_script) out of the live prompt (the message is no longer current/active working\n\t * context -- see contracts-and-retention.md's \"ephemeral\"/\"expired\" retention\n\t * classes), release the pack-time reference `packToolOutput()` registered for it, and\n\t * opportunistically reclaim now-unreferenced artifacts. This is the other half of the\n\t * D2b-1 gate: artifacts were being registered but never released, so they accumulated\n\t * for the life of the session.\n\t *\n\t * `record.toolCallId` (from context-gc's packed record) is exactly the holder id\n\t * `packToolOutput()` used when it called `addReference()` -- both trace back to the\n\t * same tool call's id -- so no separate bookkeeping is needed to find it.\n\t */\n\tprivate _releaseGcPackedArtifactReferences(messages: AgentMessage[], report: ContextGcReport): void {\n\t\tconst store = this._toolArtifactStore;\n\t\tif (!store) return; // no store was ever constructed, so nothing could have been packed to one\n\n\t\tlet releasedAny = false;\n\t\tfor (const record of report.records) {\n\t\t\tif (record.toolName !== \"grep\" && record.toolName !== \"find\" && record.toolName !== \"run_toolkit_script\")\n\t\t\t\tcontinue;\n\t\t\tconst artifactId = extractArtifactId(messages[record.messageIndex]);\n\t\t\tif (!artifactId) continue;\n\t\t\tif (store.removeReference(artifactId, record.toolCallId)) releasedAny = true;\n\t\t}\n\t\t// Cleanup only runs immediately after a release actually happened in this pass, so\n\t\t// a long session doesn't re-scan the artifact directory on every turn once nothing\n\t\t// new became eligible for release.\n\t\tif (releasedAny) store.cleanup();\n\t}\n\n\tgetContextGcReport(messages?: AgentMessage[]): ContextGcReport {\n\t\tif (messages) return this.applyContextGc(messages, false).report;\n\t\treturn (\n\t\t\tthis._latestContextGcReport ?? {\n\t\t\t\tenabled: this.deps.getSettingsManager().getContextGcSettings().enabled,\n\t\t\t\tpackedCount: 0,\n\t\t\t\toriginalTokens: 0,\n\t\t\t\tpackedTokens: 0,\n\t\t\t\tsavedTokens: 0,\n\t\t\t\trecords: [],\n\t\t\t}\n\t\t);\n\t}\n\n\tobserveProviderUsage(messages: AgentMessage[], usageMessage: AssistantMessage): void {\n\t\tif (usageMessage.stopReason === \"error\" || usageMessage.stopReason === \"aborted\") {\n\t\t\treturn;\n\t\t}\n\n\t\tconst estimate = estimateContextTokensMemoized(messages, this._tokenMemo);\n\t\tif (estimate.lastUsageIndex === null || messages[estimate.lastUsageIndex] !== usageMessage) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst compactionEntry = this._getLatestCompactionEntry();\n\t\tif (!compactionEntry) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst compactionTimestamp = new Date(compactionEntry.timestamp).getTime();\n\t\tif (usageMessage.timestamp <= compactionTimestamp) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst coveredChars = estimateConversationChars(messages, 0, estimate.lastUsageIndex + 1);\n\t\tif (estimate.usageTokens <= 0 || coveredChars <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst anchorKey = `${compactionEntry.id}:${usageMessage.timestamp}:${estimate.usageTokens}:${coveredChars}`;\n\t\tif (anchorKey === this._lastTokenBudgetAnchorKey) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._tokenBudget.anchor(estimate.usageTokens, coveredChars);\n\t\tthis._hasTokenBudgetAnchor = true;\n\t\tthis._tokenBudgetAnchorCompactionId = compactionEntry.id;\n\t\tthis._lastTokenBudgetAnchorKey = anchorKey;\n\t}\n\n\testimateCurrentContextTokens(messages: AgentMessage[]): number {\n\t\tconst estimate = estimateContextTokensMemoized(messages, this._tokenMemo);\n\t\tif (estimate.lastUsageIndex === null) {\n\t\t\treturn this._tokenBudget.estimateDelta(estimateConversationChars(messages));\n\t\t}\n\n\t\tconst usageMessage = messages[estimate.lastUsageIndex];\n\t\tconst compactionEntry = this._getLatestCompactionEntry();\n\t\tif (usageMessage?.role !== \"assistant\" || !compactionEntry) {\n\t\t\treturn estimate.tokens;\n\t\t}\n\t\tconst usageTimestamp = (usageMessage as AssistantMessage).timestamp;\n\t\tconst compactionTimestamp = new Date(compactionEntry.timestamp).getTime();\n\t\tif (usageTimestamp <= compactionTimestamp) {\n\t\t\treturn this._tokenBudget.estimateDelta(estimateConversationChars(messages));\n\t\t}\n\n\t\tif (!this._hasTokenBudgetAnchor || this._tokenBudgetAnchorCompactionId !== compactionEntry.id) {\n\t\t\treturn estimate.tokens;\n\t\t}\n\n\t\tconst deltaChars = estimateConversationChars(messages, estimate.lastUsageIndex + 1, messages.length);\n\t\treturn this._tokenBudget.current(deltaChars, estimate.tokens);\n\t}\n}\n\n/**\n * Estimate covered characters from the provider-visible context messages.\n */\nfunction estimateConversationChars(messages: AgentMessage[], start = 0, end = messages.length): number {\n\tlet total = 0;\n\tfor (let index = Math.max(0, start); index < Math.min(messages.length, end); index++) {\n\t\tconst message = messages[index];\n\t\tif (!message) continue;\n\t\tconst rawContent = (message as { content?: unknown }).content;\n\t\tif (typeof rawContent === \"string\") {\n\t\t\ttotal += rawContent.length;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!Array.isArray(rawContent)) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const block of rawContent) {\n\t\t\tif (typeof block === \"string\") {\n\t\t\t\ttotal += block.length;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!block || typeof block !== \"object\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (typeof (block as { text?: unknown }).text === \"string\") {\n\t\t\t\ttotal += (block as { text?: string }).text?.length ?? 0;\n\t\t\t}\n\t\t\tif (typeof (block as { thinking?: unknown }).thinking === \"string\") {\n\t\t\t\ttotal += (block as { thinking?: string }).thinking?.length ?? 0;\n\t\t\t}\n\t\t}\n\t}\n\treturn total;\n}\n"]}
1
+ {"version":3,"file":"context-pipeline.js","sourceRoot":"","sources":["../../src/core/context-pipeline.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Context pipeline: the session's per-turn context-shaping subsystem — the observe-only context\n * audit, the shadow prompt-policy plan and its correlation with legacy context-gc, the enforcement\n * pilot, the relevance-curation queue + the fitness-gated curation model resolver / brain-curation\n * drain + compaction pre-digest, the legacy context-gc pass and its packed-artifact reference\n * release, the tool-output artifact store, and the current-context token estimate.\n *\n * Extracted verbatim from agent-session.ts (god-file decomposition). Owns the latest\n * audit/policy/correlation/enforcement/gc reports, the {@link BrainCurator} sidecar and its last\n * skip reasons, and the lazily-built tool-artifact store. Everything else it needs — the turn\n * index, the session/settings managers, the model registry, agent/workspace dirs, the active tool\n * names, the disposed flag, the isolated-completion primitive, spawned-usage accounting, and the\n * live {@link MemoryManager} — is reached through narrow deps accessors rather than the whole\n * AgentSession.\n *\n * Context-transform boundary (deliberate): the per-turn stages ({@link estimateCurrentContextTokens},\n * {@link runContextAudit}, {@link runPromptPolicyPlanning}, {@link applyContextGc},\n * {@link correlatePromptPolicyWithContextGc}, {@link runPromptEnforcement},\n * {@link enqueueRelevanceCuration}, {@link maybeDrainBrainCuration}) are invoked from the session's\n * context transform as one-line delegations, so the transform stays the single owner of the pass\n * ordering. This controller reaches {@link MemoryController} functionality only through\n * {@link ContextPipelineDeps.getMemoryManager} (never imports it), and MemoryController never imports\n * the pipeline — keeping the transform the one place the two subsystems meet.\n */\n\nimport { createHash } from \"node:crypto\";\nimport type { AgentMessage } from \"@caupulican/pi-agent-core\";\nimport {\n\ttype CompactionEntry,\n\tcalculateContextTokens,\n\testimateTokens,\n\tgetApplicableAssistantUsageInfo,\n\tgetLatestCompactionEntry,\n\ttype SessionEntry,\n\ttype SessionManager,\n\tTokenBudget,\n} from \"@caupulican/pi-agent-core/node\";\nimport type { Api, AssistantMessage, Model, Usage } from \"@caupulican/pi-ai\";\nimport type { IsolatedCompletionOptions, IsolatedCompletionResult } from \"./agent-session-contracts.ts\";\nimport { BrainCurator, type CurationTelemetrySnapshot, preDigestConversationText } from \"./context/brain-curator.ts\";\nimport { type ArtifactStore, createFileArtifactStore } from \"./context/context-artifacts.ts\";\nimport {\n\ttype ContextAuditMemo,\n\ttype ContextAuditOptions,\n\ttype ContextAuditReport,\n\trunContextAudit,\n} from \"./context/context-audit.ts\";\nimport { enforcePromptPolicy, type PromptEnforcementReport } from \"./context/context-prompt-enforcement.ts\";\nimport {\n\tcorrelateWithContextGc,\n\ttype PromptPolicyGcCorrelationReport,\n\ttype PromptPolicyShadowReport,\n\tplanPromptPolicy,\n} from \"./context/context-prompt-policy.ts\";\nimport {\n\tacquireContextStoreRetention,\n\ttype ContextStoreRetentionLease,\n\tgetContextStoreDir,\n\tmigrateLegacyContextStores,\n} from \"./context/context-store-retention.ts\";\nimport { applyContextGc, type ContextGcReport } from \"./context-gc.ts\";\nimport type { MemoryManager } from \"./memory/memory-manager.ts\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\nimport { resolveCliModel } from \"./model-resolver.ts\";\nimport { evaluateSurfaceFitness } from \"./model-router/fitness-gate.ts\";\nimport { FitnessStore } from \"./models/fitness-store.ts\";\nimport { HF_TRANSFORMERS_PROVIDER, OLLAMA_PROVIDER } from \"./models/local-registration.ts\";\nimport type { SettingsManager } from \"./settings-manager.ts\";\n\n/**\n * Deterministic `addSpawnedUsage` reportId: `kind` + session id + a content hash of `identity`\n * (never `Date.now`/random). Same identity on a retry of the same logical work unit yields the same\n * id, so the ledger's `seenSubagentReportIds` dedupe catches a duplicate report instead of\n * double-counting spend.\n */\nfunction deriveSpawnedUsageReportId(kind: string, sessionId: string, identity: string): string {\n\tconst digest = createHash(\"sha256\").update(identity).digest(\"hex\").slice(0, 16);\n\treturn `${kind}:${sessionId}:${digest}`;\n}\n\nfunction joinTextPrefix(content: readonly unknown[], maxChars = Number.POSITIVE_INFINITY): string {\n\tlet found = false;\n\tlet text = \"\";\n\tfor (const part of content) {\n\t\tif (typeof part !== \"object\" || part === null || (part as { type?: unknown }).type !== \"text\") continue;\n\t\tconst blockText = (part as { text?: unknown }).text;\n\t\tif (typeof blockText !== \"string\") continue;\n\t\tif (!found) {\n\t\t\tfound = true;\n\t\t\tif (blockText.length >= maxChars) return blockText.slice(0, maxChars);\n\t\t\ttext = blockText;\n\t\t\tcontinue;\n\t\t}\n\t\tconst available = maxChars - text.length;\n\t\tif (available <= 0) return text;\n\t\tif (available === 1) return `${text}\\n`;\n\t\tconst remaining = available - 1;\n\t\ttext += `\\n${blockText.slice(0, remaining)}`;\n\t\tif (blockText.length >= remaining) return text;\n\t}\n\treturn text;\n}\n\n/** Latest user prompt text in the provider-visible array. */\nexport function latestUserPromptText(messages: AgentMessage[], maxChars = Number.POSITIVE_INFINITY): string {\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst message = messages[index];\n\t\tif (!message || message.role !== \"user\") continue;\n\t\tif (typeof message.content === \"string\") {\n\t\t\treturn message.content.length > maxChars ? message.content.slice(0, maxChars) : message.content;\n\t\t}\n\t\tconst text = joinTextPrefix(message.content, maxChars);\n\t\tif (text.length > 0) return text;\n\t}\n\treturn \"\";\n}\n\n/** Read a packed artifact-producing tool result's `details.artifactId`, if present, without `any`. */\nfunction extractArtifactId(message: AgentMessage | undefined): string | undefined {\n\tif (!message || message.role !== \"toolResult\") return undefined;\n\tconst details = (message as { details?: unknown }).details;\n\tif (typeof details !== \"object\" || details === null) return undefined;\n\tconst artifactId = (details as { artifactId?: unknown }).artifactId;\n\treturn typeof artifactId === \"string\" ? artifactId : undefined;\n}\n\n/** Per-message memo of `estimateTokens(message)`, keyed by message object identity --\n * same contract as {@link ContextAuditMemo}. See `estimateContextTokensMemoized`. */\ntype TokenMemo = Map<AgentMessage, number>;\n\ninterface ContextTokenEstimate {\n\ttokens: number;\n\tusageTokens: number;\n\ttrailingTokens: number;\n\tlastUsageIndex: number | null;\n}\n\n/**\n * Incremental-memo implementation of `estimateContextTokens` (compaction.ts). The shared\n * `getApplicableAssistantUsageInfo` owns usage-anchor selection so compaction rewrites cannot make\n * this hot path drift from the canonical estimator. Only the expensive per-message\n * `estimateTokens` text scan is memoized, keyed by message object identity exactly like\n * `_auditMemo`. Produces byte-identical output to `estimateContextTokens(messages)` for the same\n * input regardless of `memo` -- see the equivalence test.\n */\nfunction estimateContextTokensMemoized(messages: AgentMessage[], memo?: TokenMemo): ContextTokenEstimate {\n\tconst freshMemo: TokenMemo | undefined = memo ? new Map() : undefined;\n\tconst tokensFor = (message: AgentMessage): number => {\n\t\tconst cached = memo?.get(message);\n\t\tconst tokens = cached ?? estimateTokens(message);\n\t\tfreshMemo?.set(message, tokens);\n\t\treturn tokens;\n\t};\n\n\tconst usageInfo = getApplicableAssistantUsageInfo(messages);\n\tlet result: ContextTokenEstimate;\n\tif (!usageInfo) {\n\t\tlet estimated = 0;\n\t\tfor (const message of messages) {\n\t\t\testimated += tokensFor(message);\n\t\t}\n\t\tresult = { tokens: estimated, usageTokens: 0, trailingTokens: estimated, lastUsageIndex: null };\n\t} else {\n\t\tconst usageTokens = calculateContextTokens(usageInfo.usage);\n\t\tlet trailingTokens = 0;\n\t\tfor (let index = usageInfo.index + 1; index < messages.length; index++) {\n\t\t\ttrailingTokens += tokensFor(messages[index]);\n\t\t}\n\t\tresult = { tokens: usageTokens + trailingTokens, usageTokens, trailingTokens, lastUsageIndex: usageInfo.index };\n\t}\n\n\tif (memo && freshMemo) {\n\t\tmemo.clear();\n\t\tfor (const [key, value] of freshMemo) memo.set(key, value);\n\t}\n\treturn result;\n}\n\nexport interface ContextPipelineDeps {\n\t/** Current turn index, stamped into audit/policy/enforcement reports. */\n\tgetTurnIndex(): number;\n\t/** Session log: audit lookup, gc/artifact storage dirs, curation entries, token-estimate compaction anchor. */\n\tgetSessionManager(): SessionManager;\n\t/** Context-gc / prompt-enforcement / curation settings (all opt-in gates). */\n\tgetSettingsManager(): SettingsManager;\n\t/** Resolves a configured curation model pattern against configured auth. */\n\tgetModelRegistry(): ModelRegistry;\n\t/** Foreground model currently executing the transformed request. */\n\tgetModel(): Model<Api> | undefined;\n\t/** Root dir the host-keyed {@link FitnessStore} and per-session gc/artifact storage live under. */\n\tgetAgentDir(): string;\n\t/** Workspace root, passed to the context-gc pass. */\n\tgetCwd(): string;\n\t/** Currently-active tool names — enforcement checks whether artifact_retrieve is a live affordance. */\n\tgetActiveToolNames(): string[];\n\t/** A disposed session must never persist a curation/pre-digest entry. */\n\tisDisposed(): boolean;\n\t/** The live memory manager — the active providers' page markers feed the semantic-gc scan. */\n\tgetMemoryManager(): MemoryManager;\n\t/** Roll a curation drain's spawned usage into session accounting (idempotent per reportId).\n\t * `reportId` is REQUIRED: every caller derives a stable id from the work unit's identity\n\t * so a retry cannot double-count. */\n\taddSpawnedUsage(\n\t\tusage: Usage,\n\t\topts: { label?: string; sourceSessionId?: string; reportId: string },\n\t): string | undefined;\n\t/** One-shot LLM call fully isolated from the main session — the curation/pre-digest execution primitive. */\n\trunIsolatedCompletion(opts: IsolatedCompletionOptions): Promise<IsolatedCompletionResult>;\n}\n\nexport class ContextPipeline {\n\tprivate _latestContextGcReport: ContextGcReport | undefined = undefined;\n\t/** Brain-curation sidecar (design: brain-context-curation-design.md). Inert unless the\n\t * contextPolicy.curation setting is enabled AND the model passes the digest fitness gate. */\n\tprivate readonly _brainCurator = new BrainCurator();\n\tprivate _lastCurationSkipReason: string | undefined = undefined;\n\tprivate _lastPreDigestSkipReason: string | undefined = undefined;\n\tprivate _toolArtifactStore: ArtifactStore | undefined = undefined;\n\tprivate _contextStoreRetentionLease: ContextStoreRetentionLease | undefined;\n\tprivate _latestContextAuditReport: ContextAuditReport | undefined = undefined;\n\tprivate _latestPromptPolicyReport: PromptPolicyShadowReport | undefined = undefined;\n\tprivate _latestPromptPolicyGcCorrelation: PromptPolicyGcCorrelationReport | undefined = undefined;\n\tprivate _latestPromptEnforcementReport: PromptEnforcementReport | undefined = undefined;\n\tprivate readonly _tokenBudget = new TokenBudget();\n\tprivate _hasTokenBudgetAnchor = false;\n\tprivate _tokenBudgetAnchorCompactionId: string | undefined = undefined;\n\tprivate _lastTokenBudgetAnchorKey: string | undefined = undefined;\n\t/** Incremental current-branch lookup used by the per-turn audit. It retains only tool calls\n\t * still present in the provider-visible context, so compaction also bounds this cache. */\n\tprivate _sessionEntryLookupCache: { leafId: string | null; byToolCallId: Map<string, string> } | undefined =\n\t\tundefined;\n\t/** Incremental memo for the hot-path audit's expensive per-message work, keyed by\n\t * message object identity -- see {@link ContextAuditMemo}'s doc for the invalidation\n\t * contract. Rebuilt fresh (stale entries dropped) by `runContextAudit` every pass. */\n\tprivate readonly _auditMemo: ContextAuditMemo = new Map();\n\t/** Incremental memo for the per-message token estimate `estimateContextTokensMemoized`\n\t * relies on -- same object-identity-keyed, fresh-rebuild-per-pass contract as `_auditMemo`,\n\t * just for a plain `estimateTokens(message)` number instead of a built ContextItem. */\n\tprivate readonly _tokenMemo: TokenMemo = new Map();\n\n\tprivate readonly deps: ContextPipelineDeps;\n\n\tconstructor(deps: ContextPipelineDeps) {\n\t\tthis.deps = deps;\n\t}\n\n\tprivate _ensureContextStoreRetention(): ContextStoreRetentionLease {\n\t\tif (!this._contextStoreRetentionLease) {\n\t\t\tthis._contextStoreRetentionLease = acquireContextStoreRetention(\n\t\t\t\tthis.deps.getAgentDir(),\n\t\t\t\tthis.deps.getSessionManager().getSessionId(),\n\t\t\t);\n\t\t}\n\t\treturn this._contextStoreRetentionLease;\n\t}\n\n\tprivate _contextGcStorageDir(): string {\n\t\treturn getContextStoreDir(this.deps.getAgentDir(), \"gc\", this.deps.getSessionManager().getSessionId());\n\t}\n\n\tprivate _toolArtifactsDir(): string {\n\t\treturn getContextStoreDir(this.deps.getAgentDir(), \"artifacts\", this.deps.getSessionManager().getSessionId());\n\t}\n\n\t/**\n\t * Session-scoped, filesystem-backed artifact store for first-capture-then-bound tool\n\t * output (grep/find/run_toolkit_script -- see tool-output-artifacts.md). Lazily created and\n\t * cached so every tool construction in this session shares one store instance.\n\t *\n\t * `packToolOutput()` registers a reference (the packing tool call's id) at pack time\n\t * and fails closed, so packed artifacts are never prematurely collected.\n\t * `_releaseGcPackedArtifactReferences()` (called from `applyContextGc()`) releases\n\t * that reference once context-gc packs the result out of live context, and\n\t * opportunistically reclaims now-unreferenced artifacts via `cleanup()`.\n\t * Cross-session retention is enforced when either payload store is first used. Active\n\t * sessions hold PID-marked leases; inactive stores are pruned by age, count, and bytes.\n\t */\n\tgetToolArtifactStore(): ArtifactStore {\n\t\tthis._toolArtifactStore ??= createFileArtifactStore({\n\t\t\tbaseDir: this._toolArtifactsDir(),\n\t\t\tprepareBaseDir: () =>\n\t\t\t\tmigrateLegacyContextStores(this.deps.getAgentDir(), this.deps.getSessionManager().getSessionId()),\n\t\t\tacquireBaseDir: () => this._ensureContextStoreRetention().artifactsDir,\n\t\t});\n\t\treturn this._toolArtifactStore;\n\t}\n\n\t/**\n\t * Best-effort final sweep of any already-released (zero-reference) tool-output artifact at\n\t * session dispose. Reads the field (not the getter) so a session that never packed anything\n\t * doesn't force-create a store/dir just to sweep it.\n\t */\n\tcleanupToolArtifactStoreOnDispose(): void {\n\t\tthis._toolArtifactStore?.cleanup();\n\t\tthis._contextStoreRetentionLease?.release();\n\t\tthis._contextStoreRetentionLease = undefined;\n\t\t// Release memoized message references promptly so a disposed session's messages are\n\t\t// GC-eligible even if this ContextPipeline instance itself briefly lingers.\n\t\tthis._auditMemo.clear();\n\t\tthis._tokenMemo.clear();\n\t}\n\n\t/**\n\t * Map tool-result call ids to persisted session-entry ids. Linear branch growth is handled\n\t * incrementally by walking only entries appended since the cached leaf; a branch switch falls\n\t * back to one full rebuild so lookups never leak entries from the abandoned branch.\n\t */\n\tprivate _getLatestCompactionEntry(): CompactionEntry | null {\n\t\tconst sessionManager = this.deps.getSessionManager();\n\t\tconst indexedSessionManager = sessionManager as unknown as {\n\t\t\tgetLeafId?: () => string | null;\n\t\t\tgetEntry?: (id: string) => SessionEntry | undefined;\n\t\t};\n\t\tconst getLeafId = indexedSessionManager.getLeafId?.bind(sessionManager);\n\t\tconst getEntry = indexedSessionManager.getEntry?.bind(sessionManager);\n\t\tconst leafId = getLeafId?.();\n\t\tif (getLeafId && getEntry && leafId !== undefined) {\n\t\t\tlet currentId = leafId;\n\t\t\twhile (currentId !== null) {\n\t\t\t\tconst entry = getEntry(currentId);\n\t\t\t\tif (!entry) break;\n\t\t\t\tif (entry.type === \"compaction\") return entry;\n\t\t\t\tcurrentId = entry.parentId;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\treturn getLatestCompactionEntry(sessionManager.getBranch());\n\t}\n\n\tprivate _buildSessionEntryIdLookup(\n\t\twantedToolCallIds: ReadonlySet<string>,\n\t): (toolCallId: string) => string | undefined {\n\t\tconst sessionManager = this.deps.getSessionManager();\n\t\tconst indexedSessionManager = sessionManager as unknown as {\n\t\t\tgetLeafId?: () => string | null;\n\t\t\tgetEntry?: (id: string) => SessionEntry | undefined;\n\t\t};\n\t\tconst getLeafId = indexedSessionManager.getLeafId?.bind(sessionManager);\n\t\tconst getEntry = indexedSessionManager.getEntry?.bind(sessionManager);\n\t\tconst leafId = getLeafId?.();\n\t\tconst cached = this._sessionEntryLookupCache;\n\t\tif (cached) {\n\t\t\tfor (const toolCallId of cached.byToolCallId.keys()) {\n\t\t\t\tif (!wantedToolCallIds.has(toolCallId)) cached.byToolCallId.delete(toolCallId);\n\t\t\t}\n\t\t}\n\t\tif (getLeafId && getEntry && leafId !== undefined) {\n\t\t\tif (cached?.leafId === leafId) {\n\t\t\t\treturn (toolCallId) => cached.byToolCallId.get(toolCallId);\n\t\t\t}\n\t\t\tif (cached) {\n\t\t\t\tconst appendedEntries: SessionEntry[] = [];\n\t\t\t\tlet cursor = leafId;\n\t\t\t\twhile (cursor !== null && cursor !== cached.leafId) {\n\t\t\t\t\tconst entry = getEntry(cursor);\n\t\t\t\t\tif (!entry) break;\n\t\t\t\t\tappendedEntries.push(entry);\n\t\t\t\t\tcursor = entry.parentId;\n\t\t\t\t}\n\t\t\t\tif (cursor === cached.leafId) {\n\t\t\t\t\tfor (let index = appendedEntries.length - 1; index >= 0; index--) {\n\t\t\t\t\t\tconst entry = appendedEntries[index];\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tentry.type === \"message\" &&\n\t\t\t\t\t\t\tentry.message.role === \"toolResult\" &&\n\t\t\t\t\t\t\twantedToolCallIds.has(entry.message.toolCallId)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcached.byToolCallId.set(entry.message.toolCallId, entry.id);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcached.leafId = leafId;\n\t\t\t\t\treturn (toolCallId) => cached.byToolCallId.get(toolCallId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst byToolCallId = new Map<string, string>();\n\t\tfor (const entry of sessionManager.getBranch()) {\n\t\t\tif (\n\t\t\t\tentry.type === \"message\" &&\n\t\t\t\tentry.message.role === \"toolResult\" &&\n\t\t\t\twantedToolCallIds.has(entry.message.toolCallId)\n\t\t\t) {\n\t\t\t\tbyToolCallId.set(entry.message.toolCallId, entry.id);\n\t\t\t}\n\t\t}\n\t\tif (leafId !== undefined) this._sessionEntryLookupCache = { leafId, byToolCallId };\n\t\treturn (toolCallId) => byToolCallId.get(toolCallId);\n\t}\n\n\t/** Options shared by the memoized hot path and the no-memo full-scan path. */\n\tprivate _buildContextAuditOptions(messages: AgentMessage[]): ContextAuditOptions {\n\t\tconst wantedToolCallIds = new Set(\n\t\t\tmessages.filter((message) => message.role === \"toolResult\").map((message) => message.toolCallId),\n\t\t);\n\t\treturn {\n\t\t\tturnIndex: this.deps.getTurnIndex(),\n\t\t\tartifactStore: this._toolArtifactStore,\n\t\t\tsessionEntryIdForToolCallId: this._buildSessionEntryIdLookup(wantedToolCallIds),\n\t\t};\n\t}\n\n\t/**\n\t * Phase 1 observe-only audit pass (see context/context-audit.ts): converts live\n\t * toolResult messages into ContextItems and runs the existing retention/hard-constraint\n\t * evaluators over them, storing the latest deterministic report for tests/debugging.\n\t * Read-only with respect to messages, the transcript, and artifact references -- uses\n\t * `_toolArtifactStore` (the field), not `getToolArtifactStore()` (the getter), so a\n\t * session that never packed anything doesn't force-create a store/dir just to audit.\n\t * Never throws into a live turn: any failure degrades to an empty report.\n\t *\n\t * This is the memoized hot path (the real per-turn context transform calls it every\n\t * round trip via agent-session.ts's one-line delegation) -- see `_auditMemo`'s doc for the\n\t * incremental design. `getContextAuditReport`/`getPromptPolicyReport`'s `messages`-arg\n\t * recompute variants deliberately do NOT go through this method (see\n\t * `_runContextAuditFullScan`), so a read-only debug/test peek at a hypothetical `messages`\n\t * array can never evict a live entry out of the hot-path memo.\n\t */\n\trunContextAudit(messages: AgentMessage[]): ContextAuditReport {\n\t\ttry {\n\t\t\tconst report = runContextAudit(messages, this._buildContextAuditOptions(messages), this._auditMemo);\n\t\t\tthis._latestContextAuditReport = report;\n\t\t\treturn report;\n\t\t} catch {\n\t\t\tconst report: ContextAuditReport = { turnIndex: this.deps.getTurnIndex(), items: [] };\n\t\t\tthis._latestContextAuditReport = report;\n\t\t\treturn report;\n\t\t}\n\t}\n\n\t/** No-memo full-scan variant of {@link runContextAudit}, for read-only recompute callers. */\n\tprivate _runContextAuditFullScan(messages: AgentMessage[]): ContextAuditReport {\n\t\ttry {\n\t\t\tconst report = runContextAudit(messages, this._buildContextAuditOptions(messages));\n\t\t\tthis._latestContextAuditReport = report;\n\t\t\treturn report;\n\t\t} catch {\n\t\t\tconst report: ContextAuditReport = { turnIndex: this.deps.getTurnIndex(), items: [] };\n\t\t\tthis._latestContextAuditReport = report;\n\t\t\treturn report;\n\t\t}\n\t}\n\n\t/**\n\t * Read-only inspection of the context audit. With `messages`, recomputes fresh against\n\t * the given array (still no mutation of messages/transcript/artifact refs) -- a pure\n\t * full scan, bypassing the hot-path memo (see `_runContextAuditFullScan`); without,\n\t * returns the last report computed during a real transform pass.\n\t */\n\tgetContextAuditReport(messages?: AgentMessage[]): ContextAuditReport {\n\t\tif (messages) return this._runContextAuditFullScan(messages);\n\t\treturn this._latestContextAuditReport ?? { turnIndex: this.deps.getTurnIndex(), items: [] };\n\t}\n\n\t/**\n\t * Observe-first shadow/planning pass (see context/context-prompt-policy.ts): re-shapes\n\t * the audit report into a per-item policy plan whose `appliedAction` is always\n\t * \"keep_raw\" -- this never enforces anything, it only records what the policy engine\n\t * would say. Never throws into a live turn: any failure degrades to an empty report.\n\t */\n\trunPromptPolicyPlanning(auditReport: ContextAuditReport): PromptPolicyShadowReport {\n\t\ttry {\n\t\t\tconst report = planPromptPolicy(auditReport);\n\t\t\tthis._latestPromptPolicyReport = report;\n\t\t\treturn report;\n\t\t} catch {\n\t\t\tconst report: PromptPolicyShadowReport = { turnIndex: this.deps.getTurnIndex(), items: [] };\n\t\t\tthis._latestPromptPolicyReport = report;\n\t\t\treturn report;\n\t\t}\n\t}\n\n\t/**\n\t * Read-only inspection of the shadow policy plan. With `messages`, recomputes fresh\n\t * (audit + plan) against the given array; without, returns the last plan computed\n\t * during a real transform pass. Never mutates messages/transcript/artifact refs.\n\t */\n\tgetPromptPolicyReport(messages?: AgentMessage[]): PromptPolicyShadowReport {\n\t\tif (messages) return this.runPromptPolicyPlanning(this._runContextAuditFullScan(messages));\n\t\treturn this._latestPromptPolicyReport ?? { turnIndex: this.deps.getTurnIndex(), items: [] };\n\t}\n\n\t/**\n\t * Report-only correlation between the shadow plan just computed this turn and what the\n\t * legacy context-gc pass actually packed. Runs after `applyContextGc()` has already\n\t * produced its report; never influences context-gc itself. Never throws into a live\n\t * turn: any failure degrades to an empty correlation.\n\t */\n\tcorrelatePromptPolicyWithContextGc(gcReport: ContextGcReport): void {\n\t\tconst shadowReport = this._latestPromptPolicyReport ?? { turnIndex: this.deps.getTurnIndex(), items: [] };\n\t\ttry {\n\t\t\tthis._latestPromptPolicyGcCorrelation = correlateWithContextGc(shadowReport, gcReport);\n\t\t} catch {\n\t\t\tthis._latestPromptPolicyGcCorrelation = { turnIndex: this.deps.getTurnIndex(), entries: [] };\n\t\t}\n\t}\n\n\t/** Read-only inspection of the latest shadow-plan/legacy-gc correlation, for tests/debugging. */\n\tgetPromptPolicyGcCorrelation(): PromptPolicyGcCorrelationReport {\n\t\treturn this._latestPromptPolicyGcCorrelation ?? { turnIndex: this.deps.getTurnIndex(), entries: [] };\n\t}\n\n\t/**\n\t * First enforcement pilot (see context/context-prompt-enforcement.ts): opt-in,\n\t * default-disabled stub-in-place of stale artifact-backed tool_output results in the\n\t * provider-visible message array only. Runs on `messages` AFTER context-gc has already\n\t * produced its own result, so legacy context-gc's own packing/reporting is completely\n\t * unaffected by this pass -- it only ever acts on messages gc left untouched this turn.\n\t * Never throws into a live turn: any failure degrades to returning `messages` unchanged.\n\t */\n\trunPromptEnforcement(\n\t\tmessages: AgentMessage[],\n\t\tshadowReport: PromptPolicyShadowReport,\n\t): { messages: AgentMessage[]; report: PromptEnforcementReport } {\n\t\ttry {\n\t\t\tconst persistedSettings = this.deps.getSettingsManager().getContextPromptEnforcementSettings();\n\t\t\tconst curationEnabled = this.deps.getSettingsManager().getContextCurationSettings().enabled;\n\t\t\tconst settings = {\n\t\t\t\t...persistedSettings,\n\t\t\t\t// Runtime fact, never assumed: artifact_retrieve is a companion affordance\n\t\t\t\t// (auto-activated alongside grep/find), not a default/global tool, so active\n\t\t\t\t// tools can differ turn to turn -- see context-prompt-enforcement.ts's doc\n\t\t\t\t// comment on why this is checked separately from hasAvailableRetrievalPath.\n\t\t\t\tretrievalToolAvailable: this.deps.getActiveToolNames().includes(\"artifact_retrieve\"),\n\t\t\t\tbrainRelevance: curationEnabled ? (itemId: string) => this._brainCurator.getRelevance(itemId) : undefined,\n\t\t\t};\n\t\t\tconst result = enforcePromptPolicy(messages, shadowReport, settings);\n\t\t\tthis._latestPromptEnforcementReport = result.report;\n\t\t\treturn result;\n\t\t} catch {\n\t\t\tconst report: PromptEnforcementReport = { turnIndex: this.deps.getTurnIndex(), items: [] };\n\t\t\tthis._latestPromptEnforcementReport = report;\n\t\t\treturn { messages, report };\n\t\t}\n\t}\n\n\t/**\n\t * Enqueue relevance-scoring jobs for stale, artifact-backed tool outputs the enforcement\n\t * pilot could act on. Pure queueing — the verdicts only ever take effect through the\n\t * asymmetric advisory lever inside enforcePromptPolicy. Never throws into a turn.\n\t */\n\tenqueueRelevanceCuration(messages: AgentMessage[], shadowReport: PromptPolicyShadowReport): void {\n\t\ttry {\n\t\t\tconst settings = this.deps.getSettingsManager().getContextCurationSettings();\n\t\t\tif (!settings.enabled) return;\n\t\t\tconst goal = latestUserPromptText(messages, 400);\n\t\t\tfor (const item of shadowReport.items) {\n\t\t\t\tif (!item.hasAvailableRetrievalPath) continue;\n\t\t\t\tconst message = messages[item.messageIndex];\n\t\t\t\tif (!message || message.role !== \"toolResult\" || message.toolCallId !== item.toolCallId) continue;\n\t\t\t\tif (message.isError) continue;\n\t\t\t\tconst details = message.details as\n\t\t\t\t\t| { contextGc?: { packed?: unknown }; promptPolicy?: { enforced?: unknown } }\n\t\t\t\t\t| undefined;\n\t\t\t\tif (details?.contextGc?.packed === true || details?.promptPolicy?.enforced === true) continue;\n\t\t\t\tconst text = joinTextPrefix(message.content, 4000);\n\t\t\t\tif (text.length === 0) continue;\n\t\t\t\tthis._brainCurator.enqueue({ kind: \"relevance\", key: item.itemId, content: text, goal });\n\t\t\t}\n\t\t} catch {\n\t\t\t// curation is a sidecar; it must never disrupt a turn\n\t\t}\n\t}\n\n\t/**\n\t * Drain gate: settings on, model configured+authed, and the model has PASSED the digest\n\t * fitness probe on THIS host (design: unfit or unprobed models are refused with a visible\n\t * reason, never silently degraded). Fire-and-forget; never throws into a turn.\n\t */\n\t/**\n\t * Resolve the curation model IFF every gate passes: setting enabled, model configured,\n\t * resolvable+authed, and digest-fitness-proven on THIS host (canonical \"provider/id\" ref —\n\t * runModelFitness stores reports under it, while settings.model may be a bare id or pattern).\n\t * Sets _lastCurationSkipReason on refusal; never throws.\n\t */\n\tprivate _effectiveContextWindowFromFitness(model: Model<Api>): number {\n\t\tconst registered = model.contextWindow > 0 ? model.contextWindow : Number.POSITIVE_INFINITY;\n\t\tconst capacity = FitnessStore.forAgentDir(this.deps.getAgentDir())\n\t\t\t.getForHost()\n\t\t\t.find((entry) => entry.model === `${model.provider}/${model.id}`)?.report.capacity?.servedContextWindow;\n\t\treturn capacity && capacity > 0 ? Math.min(registered, capacity) : registered;\n\t}\n\n\tresolveCurationModelIfFit(): Model<Api> | undefined {\n\t\tconst settings = this.deps.getSettingsManager().getContextCurationSettings();\n\t\tif (!settings.enabled) {\n\t\t\t// Never surface a stale refusal reason for a feature the user has since disabled.\n\t\t\tthis._lastCurationSkipReason = undefined;\n\t\t\treturn undefined;\n\t\t}\n\t\tif (!settings.model) {\n\t\t\tthis._lastCurationSkipReason = \"curation_model_unset\";\n\t\t\treturn undefined;\n\t\t}\n\t\tconst resolved = resolveCliModel({ cliModel: settings.model, modelRegistry: this.deps.getModelRegistry() });\n\t\tif (!resolved.model || !this.deps.getModelRegistry().hasConfiguredAuth(resolved.model)) {\n\t\t\tthis._lastCurationSkipReason = \"curation_model_unresolved\";\n\t\t\treturn undefined;\n\t\t}\n\t\tconst canonicalRef = `${resolved.model.provider}/${resolved.model.id}`;\n\t\tconst fitness = FitnessStore.forAgentDir(this.deps.getAgentDir())\n\t\t\t.getForHost()\n\t\t\t.find((entry) => entry.model === canonicalRef);\n\t\tconst verdict = evaluateSurfaceFitness(\"curation\", fitness?.report);\n\t\tif (!verdict.fit) {\n\t\t\tthis._lastCurationSkipReason =\n\t\t\t\tverdict.reason === \"unprobed\" ? \"curation_model_unprobed\" : \"curation_model_digest_unfit\";\n\t\t\treturn undefined;\n\t\t}\n\t\tthis._lastCurationSkipReason = undefined;\n\t\treturn resolved.model;\n\t}\n\n\tmaybeDrainBrainCuration(): void {\n\t\ttry {\n\t\t\tif (!this._brainCurator.hasWork() || this._brainCurator.isDraining) return;\n\t\t\tconst model = this.resolveCurationModelIfFit();\n\t\t\tif (!model) return;\n\t\t\tconst foregroundModel = this.deps.getModel();\n\t\t\tconst foregroundIsManagedLocal =\n\t\t\t\tforegroundModel?.provider === OLLAMA_PROVIDER || foregroundModel?.provider === HF_TRANSFORMERS_PROVIDER;\n\t\t\tconst curatorIsManagedLocal =\n\t\t\t\tmodel.provider === OLLAMA_PROVIDER || model.provider === HF_TRANSFORMERS_PROVIDER;\n\t\t\tif (foregroundIsManagedLocal && curatorIsManagedLocal) {\n\t\t\t\t// Local foreground accuracy/latency wins. A fire-and-forget curator can otherwise reach\n\t\t\t\t// a single-parallel server first and make the user's request wait behind sidecar work.\n\t\t\t\tthis._lastCurationSkipReason = \"curation_deferred_for_local_foreground\";\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst settings = this.deps.getSettingsManager().getContextCurationSettings();\n\t\t\tvoid this._drainBrainCuration(model, settings.maxJobsPerTurn);\n\t\t} catch {\n\t\t\t// curation is a sidecar; it must never disrupt a turn\n\t\t}\n\t}\n\n\t/**\n\t * Compaction pre-digest gate (design surface 3): everything the drain gate requires PLUS a\n\t * RUNTIME reliability proof — the curator must have run >=5 jobs on this session with a parse\n\t * failure rate <=5% before it is trusted to pre-digest compaction input. Returns undefined\n\t * (verbatim compaction, byte-for-byte today's behavior) whenever any gate refuses.\n\t */\n\tbuildCompactionPreDigest(): ((text: string, signal?: AbortSignal) => Promise<string>) | undefined {\n\t\ttry {\n\t\t\tconst model = this.resolveCurationModelIfFit();\n\t\t\tif (!model) return undefined;\n\t\t\tconst telemetry = this._brainCurator.telemetry();\n\t\t\tif (telemetry.jobsRun < 5 || telemetry.parseFailures / telemetry.jobsRun > 0.05) {\n\t\t\t\tthis._lastPreDigestSkipReason = \"curation_predigest_reliability_unproven\";\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tthis._lastPreDigestSkipReason = undefined;\n\t\t\treturn async (text, signal) => {\n\t\t\t\tconst effectiveWindow = this._effectiveContextWindowFromFitness(model);\n\t\t\t\tconst chunkChars = Number.isFinite(effectiveWindow)\n\t\t\t\t\t? Math.max(1_000, Math.floor((effectiveWindow - 1024) * 4))\n\t\t\t\t\t: undefined;\n\t\t\t\tconst result = await preDigestConversationText({\n\t\t\t\t\ttext,\n\t\t\t\t\tsignal,\n\t\t\t\t\tchunkChars,\n\t\t\t\t\tcomplete: async ({ systemPrompt, userPrompt, signal: chunkSignal }) => {\n\t\t\t\t\t\tconst completion = await this.deps.runIsolatedCompletion({\n\t\t\t\t\t\t\tsystemPrompt,\n\t\t\t\t\t\t\tmessages: [{ role: \"user\", content: [{ type: \"text\", text: userPrompt }], timestamp: Date.now() }],\n\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\tthinkingLevel: \"off\",\n\t\t\t\t\t\t\tmaxTokens: 512,\n\t\t\t\t\t\t\tsignal: chunkSignal,\n\t\t\t\t\t\t\tcacheRetention: \"short\",\n\t\t\t\t\t\t\t// Stable per-lane synthetic affinity key so repeat pre-digest chunk\n\t\t\t\t\t\t\t// calls hit the same cache-warm backend.\n\t\t\t\t\t\t\tlaneKind: \"curation\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttext: completion.text,\n\t\t\t\t\t\t\tcostUsd: completion.usage.cost.total,\n\t\t\t\t\t\t\tstopReason: String(completion.stopReason),\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tif (!this.deps.isDisposed() && result.totalChunks > 0) {\n\t\t\t\t\tthis.deps.getSessionManager().appendCustomEntry(\"brain-curation-predigest\", {\n\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\ttotalChunks: result.totalChunks,\n\t\t\t\t\t\tdigested: result.digested,\n\t\t\t\t\t\tfailed: result.failed,\n\t\t\t\t\t\tcharsBefore: text.length,\n\t\t\t\t\t\tcharsAfter: result.text.length,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn result.text;\n\t\t\t};\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate async _drainBrainCuration(model: Model<Api>, maxJobs: number): Promise<void> {\n\t\ttry {\n\t\t\t// ACCUMULATE across all drained jobs (the drain runs the completer once PER job) —\n\t\t\t// keeping only the last job's usage would under-report every multi-job drain.\n\t\t\tlet spentUsage: AssistantMessage[\"usage\"] | undefined;\n\t\t\tconst results = await this._brainCurator.drain({\n\t\t\t\tmaxJobs,\n\t\t\t\tcomplete: async ({ systemPrompt, userPrompt, signal }) => {\n\t\t\t\t\tconst completion = await this.deps.runIsolatedCompletion({\n\t\t\t\t\t\tsystemPrompt,\n\t\t\t\t\t\tmessages: [{ role: \"user\", content: [{ type: \"text\", text: userPrompt }], timestamp: Date.now() }],\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tthinkingLevel: \"off\",\n\t\t\t\t\t\tmaxTokens: 256,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t// Both curation system prompts are static — the provider can cache the prefix.\n\t\t\t\t\t\tcacheRetention: \"short\",\n\t\t\t\t\t\t// Stable per-lane synthetic affinity key so repeat curation jobs hit the\n\t\t\t\t\t\t// same cache-warm backend.\n\t\t\t\t\t\tlaneKind: \"curation\",\n\t\t\t\t\t});\n\t\t\t\t\tconst usage = completion.usage;\n\t\t\t\t\tif (!spentUsage) {\n\t\t\t\t\t\tspentUsage = structuredClone(usage);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tspentUsage.input += usage.input;\n\t\t\t\t\t\tspentUsage.output += usage.output;\n\t\t\t\t\t\tspentUsage.cacheRead += usage.cacheRead;\n\t\t\t\t\t\tspentUsage.cacheWrite += usage.cacheWrite;\n\t\t\t\t\t\tspentUsage.totalTokens += usage.totalTokens;\n\t\t\t\t\t\tspentUsage.cost.input += usage.cost.input;\n\t\t\t\t\t\tspentUsage.cost.output += usage.cost.output;\n\t\t\t\t\t\tspentUsage.cost.cacheRead += usage.cost.cacheRead;\n\t\t\t\t\t\tspentUsage.cost.cacheWrite += usage.cost.cacheWrite;\n\t\t\t\t\t\tspentUsage.cost.total += usage.cost.total;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttext: completion.text,\n\t\t\t\t\t\tcostUsd: completion.usage.cost.total,\n\t\t\t\t\t\tstopReason: String(completion.stopReason),\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t});\n\t\t\t// Honest accounting even for free local models: token visibility is the contract.\n\t\t\tif (spentUsage && (spentUsage.cost.total > 0 || spentUsage.totalTokens > 0)) {\n\t\t\t\t// `reportId` keyed on the drained jobs' own idempotency keys — stable across a\n\t\t\t\t// retry of the same drain batch, distinct across genuinely different batches.\n\t\t\t\tconst reportId = deriveSpawnedUsageReportId(\n\t\t\t\t\t\"context-curator\",\n\t\t\t\t\tthis.deps.getSessionManager().getSessionId(),\n\t\t\t\t\tresults.map((result) => result.key).join(\" \"),\n\t\t\t\t);\n\t\t\t\tthis.deps.addSpawnedUsage(spentUsage, { label: \"context-curator\", reportId });\n\t\t\t}\n\t\t\tif (this.deps.isDisposed() || results.length === 0) return;\n\t\t\tthis.deps.getSessionManager().appendCustomEntry(\"brain-curation\", {\n\t\t\t\tversion: 1,\n\t\t\t\tresults: results.map((result) => ({\n\t\t\t\t\tkey: result.key,\n\t\t\t\t\tkind: result.kind,\n\t\t\t\t\tok: result.ok,\n\t\t\t\t\tms: result.ms,\n\t\t\t\t\t...(result.digest !== undefined ? { digest: result.digest } : {}),\n\t\t\t\t\t...(result.relevant !== undefined ? { relevant: result.relevant, confidence: result.confidence } : {}),\n\t\t\t\t})),\n\t\t\t\ttelemetry: this._brainCurator.telemetry(),\n\t\t\t});\n\t\t} catch {\n\t\t\t// curation is a sidecar; it must never disrupt a turn\n\t\t}\n\t}\n\n\t/** Curation status for diagnostics/dashboard: settings, live telemetry, last refusal reason. */\n\tgetContextCurationStatus(): {\n\t\tenabled: boolean;\n\t\tmodel?: string;\n\t\ttelemetry: CurationTelemetrySnapshot;\n\t\tlastSkipReason?: string;\n\t\tlastPreDigestSkipReason?: string;\n\t} {\n\t\tconst settings = this.deps.getSettingsManager().getContextCurationSettings();\n\t\treturn {\n\t\t\tenabled: settings.enabled,\n\t\t\tmodel: settings.model,\n\t\t\ttelemetry: this._brainCurator.telemetry(),\n\t\t\tlastSkipReason: this._lastCurationSkipReason,\n\t\t\tlastPreDigestSkipReason: this._lastPreDigestSkipReason,\n\t\t};\n\t}\n\n\t/** Read-only inspection of the latest prompt-enforcement report, for tests/debugging. */\n\tgetPromptEnforcementReport(): PromptEnforcementReport {\n\t\treturn this._latestPromptEnforcementReport ?? { turnIndex: this.deps.getTurnIndex(), items: [] };\n\t}\n\n\tapplyContextGc(\n\t\tmessages: AgentMessage[],\n\t\twritePayloads: boolean,\n\t): { messages: AgentMessage[]; report: ContextGcReport } {\n\t\ttry {\n\t\t\tconst settings = this.deps.getSettingsManager().getContextGcSettings();\n\t\t\t// Merge the ACTIVE memory providers' own page markers (e.g. transcript-recall's\n\t\t\t// \"<memory_context\") into the semantic-memory marker list. The settings default is\n\t\t\t// provider-agnostic and non-empty, so without this merge the recall pages the bundled\n\t\t\t// default provider actually emits are never recognized as semantic-memory pages and\n\t\t\t// accumulate raw for the life of the session — the exact growth Bug #7 GC exists to stop.\n\t\t\tconst providerMarkers = this.deps.getMemoryManager().getContextMarkers();\n\t\t\tconst curationSettings = this.deps.getSettingsManager().getContextCurationSettings();\n\t\t\tconst result = applyContextGc(messages, {\n\t\t\t\t...settings,\n\t\t\t\tsemanticMemory: {\n\t\t\t\t\t...settings.semanticMemory,\n\t\t\t\t\tmarkers: [...new Set([...settings.semanticMemory.markers, ...providerMarkers])],\n\t\t\t\t},\n\t\t\t\tcwd: this.deps.getCwd(),\n\t\t\t\tstorageDir: this._contextGcStorageDir(),\n\t\t\t\tacquireStorageDir: () => this._ensureContextStoreRetention().gcDir,\n\t\t\t\twritePayloads,\n\t\t\t\tcuration: curationSettings.enabled\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tresolveDigest: (digestKey) => {\n\t\t\t\t\t\t\t\tconst digest = this._brainCurator.getDigest(digestKey);\n\t\t\t\t\t\t\t\t// Count serves on the REAL per-turn pass only, never the report path.\n\t\t\t\t\t\t\t\tif (digest !== undefined && writePayloads) this._brainCurator.noteDigestServed();\n\t\t\t\t\t\t\t\treturn digest;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t// Only the real per-turn pass enqueues work; the read-only report path\n\t\t\t\t\t\t\t// (writePayloads=false) stays side-effect free.\n\t\t\t\t\t\t\tonPacked: writePayloads\n\t\t\t\t\t\t\t\t? (record, originalText) => {\n\t\t\t\t\t\t\t\t\t\tthis._brainCurator.enqueue({\n\t\t\t\t\t\t\t\t\t\t\tkind: \"stub_digest\",\n\t\t\t\t\t\t\t\t\t\t\tkey: record.key ?? record.toolCallId,\n\t\t\t\t\t\t\t\t\t\t\tcontent: originalText,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t\tthis._latestContextGcReport = result.report;\n\t\t\t// Only release/reclaim on the real per-turn pass (writePayloads=true), never on\n\t\t\t// the read-only status-report path (getContextGcReport with writePayloads=false),\n\t\t\t// so merely inspecting the report can't have side effects.\n\t\t\tif (writePayloads && result.report.packedCount > 0) {\n\t\t\t\tthis._releaseGcPackedArtifactReferences(messages, result.report);\n\t\t\t}\n\t\t\treturn result;\n\t\t} catch {\n\t\t\tconst report: ContextGcReport = {\n\t\t\t\tenabled: false,\n\t\t\t\tpackedCount: 0,\n\t\t\t\toriginalTokens: 0,\n\t\t\t\tpackedTokens: 0,\n\t\t\t\tsavedTokens: 0,\n\t\t\t\trecords: [],\n\t\t\t};\n\t\t\tthis._latestContextGcReport = report;\n\t\t\treturn { messages, report };\n\t\t}\n\t}\n\n\t/**\n\t * Reference-release + cleanup lifecycle: once context-gc has packed an artifact-producing\n\t * tool result (grep/find/run_toolkit_script) out of the live prompt (the message is no longer current/active working\n\t * context -- see contracts-and-retention.md's \"ephemeral\"/\"expired\" retention\n\t * classes), release the pack-time reference `packToolOutput()` registered for it, and\n\t * opportunistically reclaim now-unreferenced artifacts. This is the other half of the\n\t * D2b-1 gate: artifacts were being registered but never released, so they accumulated\n\t * for the life of the session.\n\t *\n\t * `record.toolCallId` (from context-gc's packed record) is exactly the holder id\n\t * `packToolOutput()` used when it called `addReference()` -- both trace back to the\n\t * same tool call's id -- so no separate bookkeeping is needed to find it.\n\t */\n\tprivate _releaseGcPackedArtifactReferences(messages: AgentMessage[], report: ContextGcReport): void {\n\t\tconst store = this._toolArtifactStore;\n\t\tif (!store) return; // no store was ever constructed, so nothing could have been packed to one\n\n\t\tlet releasedAny = false;\n\t\tfor (const record of report.records) {\n\t\t\tif (record.toolName !== \"grep\" && record.toolName !== \"find\" && record.toolName !== \"run_toolkit_script\")\n\t\t\t\tcontinue;\n\t\t\tconst artifactId = extractArtifactId(messages[record.messageIndex]);\n\t\t\tif (!artifactId) continue;\n\t\t\tif (store.removeReference(artifactId, record.toolCallId)) releasedAny = true;\n\t\t}\n\t\t// Cleanup only runs immediately after a release actually happened in this pass, so\n\t\t// a long session doesn't re-scan the artifact directory on every turn once nothing\n\t\t// new became eligible for release.\n\t\tif (releasedAny) store.cleanup();\n\t}\n\n\tgetContextGcReport(messages?: AgentMessage[]): ContextGcReport {\n\t\tif (messages) return this.applyContextGc(messages, false).report;\n\t\treturn (\n\t\t\tthis._latestContextGcReport ?? {\n\t\t\t\tenabled: this.deps.getSettingsManager().getContextGcSettings().enabled,\n\t\t\t\tpackedCount: 0,\n\t\t\t\toriginalTokens: 0,\n\t\t\t\tpackedTokens: 0,\n\t\t\t\tsavedTokens: 0,\n\t\t\t\trecords: [],\n\t\t\t}\n\t\t);\n\t}\n\n\tobserveProviderUsage(messages: AgentMessage[], usageMessage: AssistantMessage): void {\n\t\tif (usageMessage.stopReason === \"error\" || usageMessage.stopReason === \"aborted\") {\n\t\t\treturn;\n\t\t}\n\n\t\tconst estimate = estimateContextTokensMemoized(messages, this._tokenMemo);\n\t\tif (estimate.lastUsageIndex === null || messages[estimate.lastUsageIndex] !== usageMessage) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst compactionEntry = this._getLatestCompactionEntry();\n\t\tif (!compactionEntry) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst compactionTimestamp = new Date(compactionEntry.timestamp).getTime();\n\t\tif (usageMessage.timestamp <= compactionTimestamp) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst coveredChars = estimateConversationChars(messages, 0, estimate.lastUsageIndex + 1);\n\t\tif (estimate.usageTokens <= 0 || coveredChars <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst anchorKey = `${compactionEntry.id}:${usageMessage.timestamp}:${estimate.usageTokens}:${coveredChars}`;\n\t\tif (anchorKey === this._lastTokenBudgetAnchorKey) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._tokenBudget.anchor(estimate.usageTokens, coveredChars);\n\t\tthis._hasTokenBudgetAnchor = true;\n\t\tthis._tokenBudgetAnchorCompactionId = compactionEntry.id;\n\t\tthis._lastTokenBudgetAnchorKey = anchorKey;\n\t}\n\n\testimateCurrentContextTokens(messages: AgentMessage[]): number {\n\t\tconst estimate = estimateContextTokensMemoized(messages, this._tokenMemo);\n\t\tif (estimate.lastUsageIndex === null) {\n\t\t\treturn this._tokenBudget.estimateDelta(estimateConversationChars(messages));\n\t\t}\n\n\t\tconst usageMessage = messages[estimate.lastUsageIndex];\n\t\tconst compactionEntry = this._getLatestCompactionEntry();\n\t\tif (usageMessage?.role !== \"assistant\" || !compactionEntry) {\n\t\t\treturn estimate.tokens;\n\t\t}\n\t\tconst usageTimestamp = (usageMessage as AssistantMessage).timestamp;\n\t\tconst compactionTimestamp = new Date(compactionEntry.timestamp).getTime();\n\t\tif (usageTimestamp <= compactionTimestamp) {\n\t\t\treturn this._tokenBudget.estimateDelta(estimateConversationChars(messages));\n\t\t}\n\n\t\tif (!this._hasTokenBudgetAnchor || this._tokenBudgetAnchorCompactionId !== compactionEntry.id) {\n\t\t\treturn estimate.tokens;\n\t\t}\n\n\t\tconst deltaChars = estimateConversationChars(messages, estimate.lastUsageIndex + 1, messages.length);\n\t\treturn this._tokenBudget.current(deltaChars, estimate.tokens);\n\t}\n}\n\n/**\n * Estimate covered characters from the provider-visible context messages.\n */\nfunction estimateConversationChars(messages: AgentMessage[], start = 0, end = messages.length): number {\n\tlet total = 0;\n\tfor (let index = Math.max(0, start); index < Math.min(messages.length, end); index++) {\n\t\tconst message = messages[index];\n\t\tif (!message) continue;\n\t\tconst rawContent = (message as { content?: unknown }).content;\n\t\tif (typeof rawContent === \"string\") {\n\t\t\ttotal += rawContent.length;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!Array.isArray(rawContent)) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const block of rawContent) {\n\t\t\tif (typeof block === \"string\") {\n\t\t\t\ttotal += block.length;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!block || typeof block !== \"object\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (typeof (block as { text?: unknown }).text === \"string\") {\n\t\t\t\ttotal += (block as { text?: string }).text?.length ?? 0;\n\t\t\t}\n\t\t\tif (typeof (block as { thinking?: unknown }).thinking === \"string\") {\n\t\t\t\ttotal += (block as { thinking?: string }).thinking?.length ?? 0;\n\t\t\t}\n\t\t}\n\t}\n\treturn total;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"cost-summary.d.ts","sourceRoot":"","sources":["../../../src/core/cost/cost-summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE3E,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,6BAA8B,SAAQ,wBAAwB;IAC9E,qBAAqB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,kBAAmB,SAAQ,wBAAwB;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,aAAa,EAAE,gBAAgB,CAAC;CAChC;AAWD,wBAAgB,mCAAmC,IAAI,6BAA6B,CAQnF;AAED,wBAAgB,wCAAwC,CACvD,WAAW,EAAE,6BAA6B,EAC1C,OAAO,EAAE,SAAS,YAAY,EAAE,GAC9B,6BAA6B,CAqB/B;AAED,wBAAgB,uCAAuC,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,wBAAwB,CAMlH;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC9C,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAClC,WAAW,EAAE,gBAAgB,CAAC;IAC9B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,aAAa,CAAC,EAAE,wBAAwB,CAAC;CACzC,GAAG,kBAAkB,CAgBrB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAEzE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,iBAAiB,GAAG,cAAc,CAAC,GAAG,OAAO,CAEpH;AAMD,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,kBAAkB,EAC3B,SAAS,SAAI,EACb,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GACtC,MAAM,EAAE,CAYV;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,kBAAkB,EAAE,SAAS,SAAI,GAAG,MAAM,CAS1F","sourcesContent":["import type { SessionEntry } from \"@caupulican/pi-agent-core/node\";\nimport type { AssistantMessage, Usage } from \"@caupulican/pi-ai\";\nimport { SPAWNED_USAGE_CUSTOM_TYPE, type SpawnedUsageReport } from \"../agent-session.ts\";\nimport type { DailyUsageTotals, DailyUsageWindow } from \"./daily-usage.ts\";\n\nexport interface CurrentSessionCostTotals {\n\townCost: number;\n\tsubagentCost: number;\n\tsubagentReports: number;\n\tcurrentCost: number;\n}\n\nexport interface CurrentSessionCostAccumulator extends CurrentSessionCostTotals {\n\tseenSubagentReportIds: Set<string>;\n}\n\nexport interface SessionCostSummary extends CurrentSessionCostTotals {\n\ttodayCost: number;\n\ttodayOwnCost: number;\n\ttodaySubagentCost: number;\n\ttodayWindow: DailyUsageWindow;\n\ttodayRollover: \"local-midnight\";\n}\n\nfunction isFiniteCost(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction getUsageTotalCost(usage: Usage | undefined): number | undefined {\n\tconst total = usage?.cost?.total;\n\treturn isFiniteCost(total) ? total : undefined;\n}\n\nexport function createCurrentSessionCostAccumulator(): CurrentSessionCostAccumulator {\n\treturn {\n\t\townCost: 0,\n\t\tsubagentCost: 0,\n\t\tsubagentReports: 0,\n\t\tcurrentCost: 0,\n\t\tseenSubagentReportIds: new Set<string>(),\n\t};\n}\n\nexport function accumulateCurrentSessionCostsFromEntries(\n\taccumulator: CurrentSessionCostAccumulator,\n\tentries: readonly SessionEntry[],\n): CurrentSessionCostAccumulator {\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tconst total = getUsageTotalCost((entry.message as AssistantMessage).usage);\n\t\t\tif (total !== undefined) accumulator.ownCost += total;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (entry.type !== \"custom\" || entry.customType !== SPAWNED_USAGE_CUSTOM_TYPE) continue;\n\t\tconst report = entry.data as SpawnedUsageReport | undefined;\n\t\tconst total = getUsageTotalCost(report?.usage);\n\t\tif (total === undefined) continue;\n\t\tif (report?.reportId) {\n\t\t\tif (accumulator.seenSubagentReportIds.has(report.reportId)) continue;\n\t\t\taccumulator.seenSubagentReportIds.add(report.reportId);\n\t\t}\n\t\taccumulator.subagentCost += total;\n\t\taccumulator.subagentReports += 1;\n\t}\n\taccumulator.currentCost = accumulator.ownCost + accumulator.subagentCost;\n\treturn accumulator;\n}\n\nexport function aggregateCurrentSessionCostsFromEntries(entries: readonly SessionEntry[]): CurrentSessionCostTotals {\n\tconst { seenSubagentReportIds: _seenSubagentReportIds, ...totals } = accumulateCurrentSessionCostsFromEntries(\n\t\tcreateCurrentSessionCostAccumulator(),\n\t\tentries,\n\t);\n\treturn totals;\n}\n\nexport function createSessionCostSummary(args: {\n\tentries?: readonly SessionEntry[];\n\tdailyTotals: DailyUsageTotals;\n\ttodayWindow: DailyUsageWindow;\n\tcurrentTotals?: CurrentSessionCostTotals;\n}): SessionCostSummary {\n\tconst currentSource = args.currentTotals ?? aggregateCurrentSessionCostsFromEntries(args.entries ?? []);\n\tconst current: CurrentSessionCostTotals = {\n\t\townCost: currentSource.ownCost,\n\t\tsubagentCost: currentSource.subagentCost,\n\t\tsubagentReports: currentSource.subagentReports,\n\t\tcurrentCost: currentSource.currentCost,\n\t};\n\treturn {\n\t\t...current,\n\t\ttodayCost: args.dailyTotals.totalCost,\n\t\ttodayOwnCost: args.dailyTotals.ownCost,\n\t\ttodaySubagentCost: args.dailyTotals.spawnedCost,\n\t\ttodayWindow: args.todayWindow,\n\t\ttodayRollover: \"local-midnight\",\n\t};\n}\n\nexport function hasCostSummarySignal(summary: SessionCostSummary): boolean {\n\treturn summary.currentCost > 0 || summary.todayCost > 0 || summary.subagentReports > 0;\n}\n\nexport function hasSubagentCostSignal(summary: Pick<SessionCostSummary, \"subagentReports\" | \"subagentCost\">): boolean {\n\treturn summary.subagentReports > 0 || summary.subagentCost > 0;\n}\n\nfunction formatCost(value: number, precision: number): string {\n\treturn `$${value.toFixed(precision)}`;\n}\n\nexport function formatFooterCostParts(\n\tsummary: SessionCostSummary,\n\tprecision = 3,\n\toptions: { subscription?: boolean } = {},\n): string[] {\n\tconst parts: string[] = [];\n\tif (summary.currentCost > 0 || hasSubagentCostSignal(summary) || options.subscription) {\n\t\tparts.push(`CURRENT:${formatCost(summary.currentCost, precision)}${options.subscription ? \" (sub)\" : \"\"}`);\n\t}\n\tif (summary.todayCost > 0) {\n\t\tparts.push(`TODAY:${formatCost(summary.todayCost, precision)}`);\n\t}\n\tif (hasSubagentCostSignal(summary)) {\n\t\tparts.push(`SUBAGENTS:${formatCost(summary.subagentCost, precision)} in CURRENT`);\n\t}\n\treturn parts;\n}\n\nexport function formatStatusCostSummary(summary: SessionCostSummary, precision = 4): string {\n\tconst parts = [\n\t\t`CURRENT ${formatCost(summary.currentCost, precision)}`,\n\t\t`TODAY ${formatCost(summary.todayCost, precision)}`,\n\t];\n\tif (hasSubagentCostSignal(summary)) {\n\t\tparts.push(`SUBAGENTS ${formatCost(summary.subagentCost, precision)} (included in CURRENT)`);\n\t}\n\treturn parts.join(\", \");\n}\n"]}
1
+ {"version":3,"file":"cost-summary.d.ts","sourceRoot":"","sources":["../../../src/core/cost/cost-summary.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE3E,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,6BAA8B,SAAQ,wBAAwB;IAC9E,qBAAqB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,kBAAmB,SAAQ,wBAAwB;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,aAAa,EAAE,gBAAgB,CAAC;CAChC;AAWD,wBAAgB,mCAAmC,IAAI,6BAA6B,CAQnF;AAED,wBAAgB,wCAAwC,CACvD,WAAW,EAAE,6BAA6B,EAC1C,OAAO,EAAE,SAAS,YAAY,EAAE,GAC9B,6BAA6B,CAsB/B;AAED,wBAAgB,uCAAuC,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,wBAAwB,CAMlH;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC9C,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAClC,WAAW,EAAE,gBAAgB,CAAC;IAC9B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,aAAa,CAAC,EAAE,wBAAwB,CAAC;CACzC,GAAG,kBAAkB,CAgBrB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAEzE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,iBAAiB,GAAG,cAAc,CAAC,GAAG,OAAO,CAEpH;AAMD,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,kBAAkB,EAC3B,SAAS,SAAI,EACb,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GACtC,MAAM,EAAE,CAYV;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,kBAAkB,EAAE,SAAS,SAAI,GAAG,MAAM,CAS1F","sourcesContent":["import { getSessionEntryUsage } from \"@caupulican/pi-agent-core\";\nimport type { SessionEntry } from \"@caupulican/pi-agent-core/node\";\nimport type { Usage } from \"@caupulican/pi-ai\";\nimport { SPAWNED_USAGE_CUSTOM_TYPE, type SpawnedUsageReport } from \"../agent-session-contracts.ts\";\nimport type { DailyUsageTotals, DailyUsageWindow } from \"./daily-usage.ts\";\n\nexport interface CurrentSessionCostTotals {\n\townCost: number;\n\tsubagentCost: number;\n\tsubagentReports: number;\n\tcurrentCost: number;\n}\n\nexport interface CurrentSessionCostAccumulator extends CurrentSessionCostTotals {\n\tseenSubagentReportIds: Set<string>;\n}\n\nexport interface SessionCostSummary extends CurrentSessionCostTotals {\n\ttodayCost: number;\n\ttodayOwnCost: number;\n\ttodaySubagentCost: number;\n\ttodayWindow: DailyUsageWindow;\n\ttodayRollover: \"local-midnight\";\n}\n\nfunction isFiniteCost(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction getUsageTotalCost(usage: Usage | undefined): number | undefined {\n\tconst total = usage?.cost?.total;\n\treturn isFiniteCost(total) ? total : undefined;\n}\n\nexport function createCurrentSessionCostAccumulator(): CurrentSessionCostAccumulator {\n\treturn {\n\t\townCost: 0,\n\t\tsubagentCost: 0,\n\t\tsubagentReports: 0,\n\t\tcurrentCost: 0,\n\t\tseenSubagentReportIds: new Set<string>(),\n\t};\n}\n\nexport function accumulateCurrentSessionCostsFromEntries(\n\taccumulator: CurrentSessionCostAccumulator,\n\tentries: readonly SessionEntry[],\n): CurrentSessionCostAccumulator {\n\tfor (const entry of entries) {\n\t\tconst usage = getSessionEntryUsage(entry);\n\t\tif (usage) {\n\t\t\tconst total = getUsageTotalCost(usage);\n\t\t\tif (total !== undefined) accumulator.ownCost += total;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (entry.type !== \"custom\" || entry.customType !== SPAWNED_USAGE_CUSTOM_TYPE) continue;\n\t\tconst report = entry.data as SpawnedUsageReport | undefined;\n\t\tconst total = getUsageTotalCost(report?.usage);\n\t\tif (total === undefined) continue;\n\t\tif (report?.reportId) {\n\t\t\tif (accumulator.seenSubagentReportIds.has(report.reportId)) continue;\n\t\t\taccumulator.seenSubagentReportIds.add(report.reportId);\n\t\t}\n\t\taccumulator.subagentCost += total;\n\t\taccumulator.subagentReports += 1;\n\t}\n\taccumulator.currentCost = accumulator.ownCost + accumulator.subagentCost;\n\treturn accumulator;\n}\n\nexport function aggregateCurrentSessionCostsFromEntries(entries: readonly SessionEntry[]): CurrentSessionCostTotals {\n\tconst { seenSubagentReportIds: _seenSubagentReportIds, ...totals } = accumulateCurrentSessionCostsFromEntries(\n\t\tcreateCurrentSessionCostAccumulator(),\n\t\tentries,\n\t);\n\treturn totals;\n}\n\nexport function createSessionCostSummary(args: {\n\tentries?: readonly SessionEntry[];\n\tdailyTotals: DailyUsageTotals;\n\ttodayWindow: DailyUsageWindow;\n\tcurrentTotals?: CurrentSessionCostTotals;\n}): SessionCostSummary {\n\tconst currentSource = args.currentTotals ?? aggregateCurrentSessionCostsFromEntries(args.entries ?? []);\n\tconst current: CurrentSessionCostTotals = {\n\t\townCost: currentSource.ownCost,\n\t\tsubagentCost: currentSource.subagentCost,\n\t\tsubagentReports: currentSource.subagentReports,\n\t\tcurrentCost: currentSource.currentCost,\n\t};\n\treturn {\n\t\t...current,\n\t\ttodayCost: args.dailyTotals.totalCost,\n\t\ttodayOwnCost: args.dailyTotals.ownCost,\n\t\ttodaySubagentCost: args.dailyTotals.spawnedCost,\n\t\ttodayWindow: args.todayWindow,\n\t\ttodayRollover: \"local-midnight\",\n\t};\n}\n\nexport function hasCostSummarySignal(summary: SessionCostSummary): boolean {\n\treturn summary.currentCost > 0 || summary.todayCost > 0 || summary.subagentReports > 0;\n}\n\nexport function hasSubagentCostSignal(summary: Pick<SessionCostSummary, \"subagentReports\" | \"subagentCost\">): boolean {\n\treturn summary.subagentReports > 0 || summary.subagentCost > 0;\n}\n\nfunction formatCost(value: number, precision: number): string {\n\treturn `$${value.toFixed(precision)}`;\n}\n\nexport function formatFooterCostParts(\n\tsummary: SessionCostSummary,\n\tprecision = 3,\n\toptions: { subscription?: boolean } = {},\n): string[] {\n\tconst parts: string[] = [];\n\tif (summary.currentCost > 0 || hasSubagentCostSignal(summary) || options.subscription) {\n\t\tparts.push(`CURRENT:${formatCost(summary.currentCost, precision)}${options.subscription ? \" (sub)\" : \"\"}`);\n\t}\n\tif (summary.todayCost > 0) {\n\t\tparts.push(`TODAY:${formatCost(summary.todayCost, precision)}`);\n\t}\n\tif (hasSubagentCostSignal(summary)) {\n\t\tparts.push(`SUBAGENTS:${formatCost(summary.subagentCost, precision)} in CURRENT`);\n\t}\n\treturn parts;\n}\n\nexport function formatStatusCostSummary(summary: SessionCostSummary, precision = 4): string {\n\tconst parts = [\n\t\t`CURRENT ${formatCost(summary.currentCost, precision)}`,\n\t\t`TODAY ${formatCost(summary.todayCost, precision)}`,\n\t];\n\tif (hasSubagentCostSignal(summary)) {\n\t\tparts.push(`SUBAGENTS ${formatCost(summary.subagentCost, precision)} (included in CURRENT)`);\n\t}\n\treturn parts.join(\", \");\n}\n"]}
@@ -1,4 +1,5 @@
1
- import { SPAWNED_USAGE_CUSTOM_TYPE } from "../agent-session.js";
1
+ import { getSessionEntryUsage } from "@caupulican/pi-agent-core";
2
+ import { SPAWNED_USAGE_CUSTOM_TYPE } from "../agent-session-contracts.js";
2
3
  function isFiniteCost(value) {
3
4
  return typeof value === "number" && Number.isFinite(value);
4
5
  }
@@ -17,8 +18,9 @@ export function createCurrentSessionCostAccumulator() {
17
18
  }
18
19
  export function accumulateCurrentSessionCostsFromEntries(accumulator, entries) {
19
20
  for (const entry of entries) {
20
- if (entry.type === "message" && entry.message.role === "assistant") {
21
- const total = getUsageTotalCost(entry.message.usage);
21
+ const usage = getSessionEntryUsage(entry);
22
+ if (usage) {
23
+ const total = getUsageTotalCost(usage);
22
24
  if (total !== undefined)
23
25
  accumulator.ownCost += total;
24
26
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"cost-summary.js","sourceRoot":"","sources":["../../../src/core/cost/cost-summary.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAA2B,MAAM,qBAAqB,CAAC;AAsBzF,SAAS,YAAY,CAAC,KAAc,EAAmB;IACtD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAAA,CAC3D;AAED,SAAS,iBAAiB,CAAC,KAAwB,EAAsB;IACxE,MAAM,KAAK,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;IACjC,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CAC/C;AAED,MAAM,UAAU,mCAAmC,GAAkC;IACpF,OAAO;QACN,OAAO,EAAE,CAAC;QACV,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,CAAC;QAClB,WAAW,EAAE,CAAC;QACd,qBAAqB,EAAE,IAAI,GAAG,EAAU;KACxC,CAAC;AAAA,CACF;AAED,MAAM,UAAU,wCAAwC,CACvD,WAA0C,EAC1C,OAAgC,EACA;IAChC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACpE,MAAM,KAAK,GAAG,iBAAiB,CAAE,KAAK,CAAC,OAA4B,CAAC,KAAK,CAAC,CAAC;YAC3E,IAAI,KAAK,KAAK,SAAS;gBAAE,WAAW,CAAC,OAAO,IAAI,KAAK,CAAC;YACtD,SAAS;QACV,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,KAAK,yBAAyB;YAAE,SAAS;QACxF,MAAM,MAAM,GAAG,KAAK,CAAC,IAAsC,CAAC;QAC5D,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC/C,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC;YACtB,IAAI,WAAW,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAAE,SAAS;YACrE,WAAW,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxD,CAAC;QACD,WAAW,CAAC,YAAY,IAAI,KAAK,CAAC;QAClC,WAAW,CAAC,eAAe,IAAI,CAAC,CAAC;IAClC,CAAC;IACD,WAAW,CAAC,WAAW,GAAG,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,YAAY,CAAC;IACzE,OAAO,WAAW,CAAC;AAAA,CACnB;AAED,MAAM,UAAU,uCAAuC,CAAC,OAAgC,EAA4B;IACnH,MAAM,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,GAAG,MAAM,EAAE,GAAG,wCAAwC,CAC5G,mCAAmC,EAAE,EACrC,OAAO,CACP,CAAC;IACF,OAAO,MAAM,CAAC;AAAA,CACd;AAED,MAAM,UAAU,wBAAwB,CAAC,IAKxC,EAAsB;IACtB,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,uCAAuC,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACxG,MAAM,OAAO,GAA6B;QACzC,OAAO,EAAE,aAAa,CAAC,OAAO;QAC9B,YAAY,EAAE,aAAa,CAAC,YAAY;QACxC,eAAe,EAAE,aAAa,CAAC,eAAe;QAC9C,WAAW,EAAE,aAAa,CAAC,WAAW;KACtC,CAAC;IACF,OAAO;QACN,GAAG,OAAO;QACV,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS;QACrC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO;QACtC,iBAAiB,EAAE,IAAI,CAAC,WAAW,CAAC,WAAW;QAC/C,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,aAAa,EAAE,gBAAgB;KAC/B,CAAC;AAAA,CACF;AAED,MAAM,UAAU,oBAAoB,CAAC,OAA2B,EAAW;IAC1E,OAAO,OAAO,CAAC,WAAW,GAAG,CAAC,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,IAAI,OAAO,CAAC,eAAe,GAAG,CAAC,CAAC;AAAA,CACvF;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAqE,EAAW;IACrH,OAAO,OAAO,CAAC,eAAe,GAAG,CAAC,IAAI,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC;AAAA,CAC/D;AAED,SAAS,UAAU,CAAC,KAAa,EAAE,SAAiB,EAAU;IAC7D,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;AAAA,CACtC;AAED,MAAM,UAAU,qBAAqB,CACpC,OAA2B,EAC3B,SAAS,GAAG,CAAC,EACb,OAAO,GAA+B,EAAE,EAC7B;IACX,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,WAAW,GAAG,CAAC,IAAI,qBAAqB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACvF,KAAK,CAAC,IAAI,CAAC,WAAW,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5G,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,SAAS,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,aAAa,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CACb;AAED,MAAM,UAAU,uBAAuB,CAAC,OAA2B,EAAE,SAAS,GAAG,CAAC,EAAU;IAC3F,MAAM,KAAK,GAAG;QACb,WAAW,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE;QACvD,SAAS,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE;KACnD,CAAC;IACF,IAAI,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,aAAa,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,wBAAwB,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,CACxB","sourcesContent":["import type { SessionEntry } from \"@caupulican/pi-agent-core/node\";\nimport type { AssistantMessage, Usage } from \"@caupulican/pi-ai\";\nimport { SPAWNED_USAGE_CUSTOM_TYPE, type SpawnedUsageReport } from \"../agent-session.ts\";\nimport type { DailyUsageTotals, DailyUsageWindow } from \"./daily-usage.ts\";\n\nexport interface CurrentSessionCostTotals {\n\townCost: number;\n\tsubagentCost: number;\n\tsubagentReports: number;\n\tcurrentCost: number;\n}\n\nexport interface CurrentSessionCostAccumulator extends CurrentSessionCostTotals {\n\tseenSubagentReportIds: Set<string>;\n}\n\nexport interface SessionCostSummary extends CurrentSessionCostTotals {\n\ttodayCost: number;\n\ttodayOwnCost: number;\n\ttodaySubagentCost: number;\n\ttodayWindow: DailyUsageWindow;\n\ttodayRollover: \"local-midnight\";\n}\n\nfunction isFiniteCost(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction getUsageTotalCost(usage: Usage | undefined): number | undefined {\n\tconst total = usage?.cost?.total;\n\treturn isFiniteCost(total) ? total : undefined;\n}\n\nexport function createCurrentSessionCostAccumulator(): CurrentSessionCostAccumulator {\n\treturn {\n\t\townCost: 0,\n\t\tsubagentCost: 0,\n\t\tsubagentReports: 0,\n\t\tcurrentCost: 0,\n\t\tseenSubagentReportIds: new Set<string>(),\n\t};\n}\n\nexport function accumulateCurrentSessionCostsFromEntries(\n\taccumulator: CurrentSessionCostAccumulator,\n\tentries: readonly SessionEntry[],\n): CurrentSessionCostAccumulator {\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tconst total = getUsageTotalCost((entry.message as AssistantMessage).usage);\n\t\t\tif (total !== undefined) accumulator.ownCost += total;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (entry.type !== \"custom\" || entry.customType !== SPAWNED_USAGE_CUSTOM_TYPE) continue;\n\t\tconst report = entry.data as SpawnedUsageReport | undefined;\n\t\tconst total = getUsageTotalCost(report?.usage);\n\t\tif (total === undefined) continue;\n\t\tif (report?.reportId) {\n\t\t\tif (accumulator.seenSubagentReportIds.has(report.reportId)) continue;\n\t\t\taccumulator.seenSubagentReportIds.add(report.reportId);\n\t\t}\n\t\taccumulator.subagentCost += total;\n\t\taccumulator.subagentReports += 1;\n\t}\n\taccumulator.currentCost = accumulator.ownCost + accumulator.subagentCost;\n\treturn accumulator;\n}\n\nexport function aggregateCurrentSessionCostsFromEntries(entries: readonly SessionEntry[]): CurrentSessionCostTotals {\n\tconst { seenSubagentReportIds: _seenSubagentReportIds, ...totals } = accumulateCurrentSessionCostsFromEntries(\n\t\tcreateCurrentSessionCostAccumulator(),\n\t\tentries,\n\t);\n\treturn totals;\n}\n\nexport function createSessionCostSummary(args: {\n\tentries?: readonly SessionEntry[];\n\tdailyTotals: DailyUsageTotals;\n\ttodayWindow: DailyUsageWindow;\n\tcurrentTotals?: CurrentSessionCostTotals;\n}): SessionCostSummary {\n\tconst currentSource = args.currentTotals ?? aggregateCurrentSessionCostsFromEntries(args.entries ?? []);\n\tconst current: CurrentSessionCostTotals = {\n\t\townCost: currentSource.ownCost,\n\t\tsubagentCost: currentSource.subagentCost,\n\t\tsubagentReports: currentSource.subagentReports,\n\t\tcurrentCost: currentSource.currentCost,\n\t};\n\treturn {\n\t\t...current,\n\t\ttodayCost: args.dailyTotals.totalCost,\n\t\ttodayOwnCost: args.dailyTotals.ownCost,\n\t\ttodaySubagentCost: args.dailyTotals.spawnedCost,\n\t\ttodayWindow: args.todayWindow,\n\t\ttodayRollover: \"local-midnight\",\n\t};\n}\n\nexport function hasCostSummarySignal(summary: SessionCostSummary): boolean {\n\treturn summary.currentCost > 0 || summary.todayCost > 0 || summary.subagentReports > 0;\n}\n\nexport function hasSubagentCostSignal(summary: Pick<SessionCostSummary, \"subagentReports\" | \"subagentCost\">): boolean {\n\treturn summary.subagentReports > 0 || summary.subagentCost > 0;\n}\n\nfunction formatCost(value: number, precision: number): string {\n\treturn `$${value.toFixed(precision)}`;\n}\n\nexport function formatFooterCostParts(\n\tsummary: SessionCostSummary,\n\tprecision = 3,\n\toptions: { subscription?: boolean } = {},\n): string[] {\n\tconst parts: string[] = [];\n\tif (summary.currentCost > 0 || hasSubagentCostSignal(summary) || options.subscription) {\n\t\tparts.push(`CURRENT:${formatCost(summary.currentCost, precision)}${options.subscription ? \" (sub)\" : \"\"}`);\n\t}\n\tif (summary.todayCost > 0) {\n\t\tparts.push(`TODAY:${formatCost(summary.todayCost, precision)}`);\n\t}\n\tif (hasSubagentCostSignal(summary)) {\n\t\tparts.push(`SUBAGENTS:${formatCost(summary.subagentCost, precision)} in CURRENT`);\n\t}\n\treturn parts;\n}\n\nexport function formatStatusCostSummary(summary: SessionCostSummary, precision = 4): string {\n\tconst parts = [\n\t\t`CURRENT ${formatCost(summary.currentCost, precision)}`,\n\t\t`TODAY ${formatCost(summary.todayCost, precision)}`,\n\t];\n\tif (hasSubagentCostSignal(summary)) {\n\t\tparts.push(`SUBAGENTS ${formatCost(summary.subagentCost, precision)} (included in CURRENT)`);\n\t}\n\treturn parts.join(\", \");\n}\n"]}
1
+ {"version":3,"file":"cost-summary.js","sourceRoot":"","sources":["../../../src/core/cost/cost-summary.ts"],"names":[],"mappings":"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","sourcesContent":["import { getSessionEntryUsage } from \"@caupulican/pi-agent-core\";\nimport type { SessionEntry } from \"@caupulican/pi-agent-core/node\";\nimport type { Usage } from \"@caupulican/pi-ai\";\nimport { SPAWNED_USAGE_CUSTOM_TYPE, type SpawnedUsageReport } from \"../agent-session-contracts.ts\";\nimport type { DailyUsageTotals, DailyUsageWindow } from \"./daily-usage.ts\";\n\nexport interface CurrentSessionCostTotals {\n\townCost: number;\n\tsubagentCost: number;\n\tsubagentReports: number;\n\tcurrentCost: number;\n}\n\nexport interface CurrentSessionCostAccumulator extends CurrentSessionCostTotals {\n\tseenSubagentReportIds: Set<string>;\n}\n\nexport interface SessionCostSummary extends CurrentSessionCostTotals {\n\ttodayCost: number;\n\ttodayOwnCost: number;\n\ttodaySubagentCost: number;\n\ttodayWindow: DailyUsageWindow;\n\ttodayRollover: \"local-midnight\";\n}\n\nfunction isFiniteCost(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction getUsageTotalCost(usage: Usage | undefined): number | undefined {\n\tconst total = usage?.cost?.total;\n\treturn isFiniteCost(total) ? total : undefined;\n}\n\nexport function createCurrentSessionCostAccumulator(): CurrentSessionCostAccumulator {\n\treturn {\n\t\townCost: 0,\n\t\tsubagentCost: 0,\n\t\tsubagentReports: 0,\n\t\tcurrentCost: 0,\n\t\tseenSubagentReportIds: new Set<string>(),\n\t};\n}\n\nexport function accumulateCurrentSessionCostsFromEntries(\n\taccumulator: CurrentSessionCostAccumulator,\n\tentries: readonly SessionEntry[],\n): CurrentSessionCostAccumulator {\n\tfor (const entry of entries) {\n\t\tconst usage = getSessionEntryUsage(entry);\n\t\tif (usage) {\n\t\t\tconst total = getUsageTotalCost(usage);\n\t\t\tif (total !== undefined) accumulator.ownCost += total;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (entry.type !== \"custom\" || entry.customType !== SPAWNED_USAGE_CUSTOM_TYPE) continue;\n\t\tconst report = entry.data as SpawnedUsageReport | undefined;\n\t\tconst total = getUsageTotalCost(report?.usage);\n\t\tif (total === undefined) continue;\n\t\tif (report?.reportId) {\n\t\t\tif (accumulator.seenSubagentReportIds.has(report.reportId)) continue;\n\t\t\taccumulator.seenSubagentReportIds.add(report.reportId);\n\t\t}\n\t\taccumulator.subagentCost += total;\n\t\taccumulator.subagentReports += 1;\n\t}\n\taccumulator.currentCost = accumulator.ownCost + accumulator.subagentCost;\n\treturn accumulator;\n}\n\nexport function aggregateCurrentSessionCostsFromEntries(entries: readonly SessionEntry[]): CurrentSessionCostTotals {\n\tconst { seenSubagentReportIds: _seenSubagentReportIds, ...totals } = accumulateCurrentSessionCostsFromEntries(\n\t\tcreateCurrentSessionCostAccumulator(),\n\t\tentries,\n\t);\n\treturn totals;\n}\n\nexport function createSessionCostSummary(args: {\n\tentries?: readonly SessionEntry[];\n\tdailyTotals: DailyUsageTotals;\n\ttodayWindow: DailyUsageWindow;\n\tcurrentTotals?: CurrentSessionCostTotals;\n}): SessionCostSummary {\n\tconst currentSource = args.currentTotals ?? aggregateCurrentSessionCostsFromEntries(args.entries ?? []);\n\tconst current: CurrentSessionCostTotals = {\n\t\townCost: currentSource.ownCost,\n\t\tsubagentCost: currentSource.subagentCost,\n\t\tsubagentReports: currentSource.subagentReports,\n\t\tcurrentCost: currentSource.currentCost,\n\t};\n\treturn {\n\t\t...current,\n\t\ttodayCost: args.dailyTotals.totalCost,\n\t\ttodayOwnCost: args.dailyTotals.ownCost,\n\t\ttodaySubagentCost: args.dailyTotals.spawnedCost,\n\t\ttodayWindow: args.todayWindow,\n\t\ttodayRollover: \"local-midnight\",\n\t};\n}\n\nexport function hasCostSummarySignal(summary: SessionCostSummary): boolean {\n\treturn summary.currentCost > 0 || summary.todayCost > 0 || summary.subagentReports > 0;\n}\n\nexport function hasSubagentCostSignal(summary: Pick<SessionCostSummary, \"subagentReports\" | \"subagentCost\">): boolean {\n\treturn summary.subagentReports > 0 || summary.subagentCost > 0;\n}\n\nfunction formatCost(value: number, precision: number): string {\n\treturn `$${value.toFixed(precision)}`;\n}\n\nexport function formatFooterCostParts(\n\tsummary: SessionCostSummary,\n\tprecision = 3,\n\toptions: { subscription?: boolean } = {},\n): string[] {\n\tconst parts: string[] = [];\n\tif (summary.currentCost > 0 || hasSubagentCostSignal(summary) || options.subscription) {\n\t\tparts.push(`CURRENT:${formatCost(summary.currentCost, precision)}${options.subscription ? \" (sub)\" : \"\"}`);\n\t}\n\tif (summary.todayCost > 0) {\n\t\tparts.push(`TODAY:${formatCost(summary.todayCost, precision)}`);\n\t}\n\tif (hasSubagentCostSignal(summary)) {\n\t\tparts.push(`SUBAGENTS:${formatCost(summary.subagentCost, precision)} in CURRENT`);\n\t}\n\treturn parts;\n}\n\nexport function formatStatusCostSummary(summary: SessionCostSummary, precision = 4): string {\n\tconst parts = [\n\t\t`CURRENT ${formatCost(summary.currentCost, precision)}`,\n\t\t`TODAY ${formatCost(summary.todayCost, precision)}`,\n\t];\n\tif (hasSubagentCostSignal(summary)) {\n\t\tparts.push(`SUBAGENTS ${formatCost(summary.subagentCost, precision)} (included in CURRENT)`);\n\t}\n\treturn parts.join(\", \");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"daily-usage.d.ts","sourceRoot":"","sources":["../../../src/core/cost/daily-usage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAIxF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AA8EF,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,MAAM,EAAE,gBAAgB,GACtB,gBAAgB,CAKlB;AAED,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;CACjC;AAUD,wBAAgB,mCAAmC,CAClD,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,gBAAgB,EACxB,WAAW,CAAC,EAAE,2BAA2B,GACvC,gBAAgB,CAclB;AAED,wBAAgB,kCAAkC,CACjD,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,gBAAgB,EACxB,WAAW,CAAC,EAAE,2BAA2B,GACvC,gBAAgB,CAkBlB;AAED,wBAAgB,yBAAyB,CACxC,MAAM,EAAE,gBAAgB,EACxB,WAAW,GAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAyB,GACvD,MAAM,CAQR;AAED,wBAAgB,iBAAiB,CAAC,GAAG,OAAa,GAAG,gBAAgB,CAMpE","sourcesContent":["import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { loadEntriesFromFile, type SessionEntry } from \"@caupulican/pi-agent-core/node\";\nimport type { AssistantMessage, Usage } from \"@caupulican/pi-ai\";\nimport { SPAWNED_USAGE_CUSTOM_TYPE, type SpawnedUsageReport } from \"../agent-session.ts\";\n\nexport type DailyUsageWindow = {\n\tstartMs: number;\n\tendMs: number;\n};\n\nexport type DailyUsageTotals = {\n\townCost: number;\n\tspawnedCost: number;\n\ttotalCost: number;\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\ttotalTokens: number;\n\tsessions: number;\n\treports: number;\n};\n\nfunction createZeroTotals(): DailyUsageTotals {\n\treturn {\n\t\townCost: 0,\n\t\tspawnedCost: 0,\n\t\ttotalCost: 0,\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: 0,\n\t\tsessions: 0,\n\t\treports: 0,\n\t};\n}\n\nfunction isInsideWindow(timestamp: number, window: DailyUsageWindow): boolean {\n\treturn timestamp >= window.startMs && timestamp < window.endMs;\n}\n\nfunction addUsage(\n\ttotals: Pick<DailyUsageTotals, \"input\" | \"output\" | \"cacheRead\" | \"cacheWrite\" | \"totalTokens\">,\n\tusage: Usage,\n): void {\n\ttotals.input += usage.input;\n\ttotals.output += usage.output;\n\ttotals.cacheRead += usage.cacheRead;\n\ttotals.cacheWrite += usage.cacheWrite;\n\ttotals.totalTokens += usage.totalTokens;\n}\n\nfunction addDailyUsageFromEntries(\n\ttotals: DailyUsageTotals,\n\tentries: readonly SessionEntry[],\n\twindow: DailyUsageWindow,\n\tseenSpawnedReportIds: Set<string>,\n): boolean {\n\tlet hasUsage = false;\n\tfor (const entry of entries) {\n\t\tif (!isInsideWindow(Date.parse(entry.timestamp), window)) continue;\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tconst usage = (entry.message as AssistantMessage).usage;\n\t\t\tif (!usage) continue;\n\t\t\ttotals.ownCost += usage.cost.total;\n\t\t\taddUsage(totals, usage);\n\t\t\thasUsage = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (entry.type === \"custom\" && entry.customType === SPAWNED_USAGE_CUSTOM_TYPE) {\n\t\t\tconst data = entry.data as SpawnedUsageReport | undefined;\n\t\t\tif (!data?.usage) continue;\n\t\t\tif (data.reportId) {\n\t\t\t\tif (seenSpawnedReportIds.has(data.reportId)) continue;\n\t\t\t\tseenSpawnedReportIds.add(data.reportId);\n\t\t\t}\n\t\t\ttotals.spawnedCost += data.usage.cost.total;\n\t\t\ttotals.reports += 1;\n\t\t\taddUsage(totals, data.usage);\n\t\t\thasUsage = true;\n\t\t}\n\t}\n\treturn hasUsage;\n}\n\nfunction finishTotals(totals: DailyUsageTotals): DailyUsageTotals {\n\ttotals.totalCost = totals.ownCost + totals.spawnedCost;\n\treturn totals;\n}\n\nfunction shouldReadSessionFile(filePath: string, window: DailyUsageWindow): boolean {\n\ttry {\n\t\treturn statSync(filePath).mtimeMs >= window.startMs;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function aggregateDailyUsageFromEntries(\n\tentries: readonly SessionEntry[],\n\twindow: DailyUsageWindow,\n): DailyUsageTotals {\n\tconst totals = createZeroTotals();\n\tconst hasUsage = addDailyUsageFromEntries(totals, entries, window, new Set());\n\ttotals.sessions = hasUsage ? 1 : 0;\n\treturn finishTotals(totals);\n}\n\nexport interface LiveSessionDailyUsageSource {\n\tfilePath: string;\n\tentries: readonly SessionEntry[];\n}\n\nfunction getSessionEntries(\n\tfilePath: string,\n\tliveSession: LiveSessionDailyUsageSource | undefined,\n): readonly SessionEntry[] {\n\tif (liveSession && resolve(filePath) === resolve(liveSession.filePath)) return liveSession.entries;\n\treturn loadEntriesFromFile(filePath).filter((entry): entry is SessionEntry => entry.type !== \"session\");\n}\n\nexport function aggregateDailyUsageFromSessionFiles(\n\tsessionDir: string,\n\twindow: DailyUsageWindow,\n\tliveSession?: LiveSessionDailyUsageSource,\n): DailyUsageTotals {\n\tconst totals = createZeroTotals();\n\tif (!sessionDir || !existsSync(sessionDir)) return totals;\n\tconst seenSpawnedReportIds = new Set<string>();\n\tfor (const name of readdirSync(sessionDir)) {\n\t\tif (!name.endsWith(\".jsonl\")) continue;\n\t\tconst filePath = join(sessionDir, name);\n\t\tif (!shouldReadSessionFile(filePath, window)) continue;\n\t\tconst entries = getSessionEntries(filePath, liveSession);\n\t\tif (addDailyUsageFromEntries(totals, entries, window, seenSpawnedReportIds)) {\n\t\t\ttotals.sessions += 1;\n\t\t}\n\t}\n\treturn finishTotals(totals);\n}\n\nexport function aggregateDailyUsageFromSessionRoot(\n\tsessionRoot: string,\n\twindow: DailyUsageWindow,\n\tliveSession?: LiveSessionDailyUsageSource,\n): DailyUsageTotals {\n\tconst totals = createZeroTotals();\n\tif (!sessionRoot || !existsSync(sessionRoot)) return totals;\n\tconst seenSpawnedReportIds = new Set<string>();\n\tfor (const name of readdirSync(sessionRoot)) {\n\t\tconst dir = join(sessionRoot, name);\n\t\tif (!existsSync(dir) || !statSync(dir).isDirectory()) continue;\n\t\tfor (const fileName of readdirSync(dir)) {\n\t\t\tif (!fileName.endsWith(\".jsonl\")) continue;\n\t\t\tconst filePath = join(dir, fileName);\n\t\t\tif (!shouldReadSessionFile(filePath, window)) continue;\n\t\t\tconst entries = getSessionEntries(filePath, liveSession);\n\t\t\tif (addDailyUsageFromEntries(totals, entries, window, seenSpawnedReportIds)) {\n\t\t\t\ttotals.sessions += 1;\n\t\t\t}\n\t\t}\n\t}\n\treturn finishTotals(totals);\n}\n\nexport function formatDailyUsageBreakdown(\n\ttotals: DailyUsageTotals,\n\tformatLabel: (label: string) => string = (label) => label,\n): string {\n\treturn [\n\t\t`${formatLabel(\"Today:\")} $${totals.totalCost.toFixed(4)}`,\n\t\t`${formatLabel(\"Own/session messages:\")} $${totals.ownCost.toFixed(4)}`,\n\t\t`${formatLabel(\"Spawned/background reports:\")} $${totals.spawnedCost.toFixed(4)}`,\n\t\t`${formatLabel(\"Sessions scanned:\")} ${totals.sessions}`,\n\t\t`${formatLabel(\"Spawned/background report count:\")} ${totals.reports}`,\n\t].join(\"\\n\");\n}\n\nexport function getLocalDayWindow(now = new Date()): DailyUsageWindow {\n\tconst start = new Date(now);\n\tstart.setHours(0, 0, 0, 0);\n\tconst end = new Date(start);\n\tend.setDate(end.getDate() + 1);\n\treturn { startMs: start.getTime(), endMs: end.getTime() };\n}\n"]}
1
+ {"version":3,"file":"daily-usage.d.ts","sourceRoot":"","sources":["../../../src/core/cost/daily-usage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAIxF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AA6EF,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,MAAM,EAAE,gBAAgB,GACtB,gBAAgB,CAKlB;AAED,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;CACjC;AAUD,wBAAgB,mCAAmC,CAClD,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,gBAAgB,EACxB,WAAW,CAAC,EAAE,2BAA2B,GACvC,gBAAgB,CAclB;AAED,wBAAgB,kCAAkC,CACjD,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,gBAAgB,EACxB,WAAW,CAAC,EAAE,2BAA2B,GACvC,gBAAgB,CAkBlB;AAED,wBAAgB,yBAAyB,CACxC,MAAM,EAAE,gBAAgB,EACxB,WAAW,GAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAyB,GACvD,MAAM,CAQR;AAED,wBAAgB,iBAAiB,CAAC,GAAG,OAAa,GAAG,gBAAgB,CAMpE","sourcesContent":["import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { getSessionEntryUsage } from \"@caupulican/pi-agent-core\";\nimport { loadEntriesFromFile, type SessionEntry } from \"@caupulican/pi-agent-core/node\";\nimport type { Usage } from \"@caupulican/pi-ai\";\nimport { SPAWNED_USAGE_CUSTOM_TYPE, type SpawnedUsageReport } from \"../agent-session-contracts.ts\";\n\nexport type DailyUsageWindow = {\n\tstartMs: number;\n\tendMs: number;\n};\n\nexport type DailyUsageTotals = {\n\townCost: number;\n\tspawnedCost: number;\n\ttotalCost: number;\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\ttotalTokens: number;\n\tsessions: number;\n\treports: number;\n};\n\nfunction createZeroTotals(): DailyUsageTotals {\n\treturn {\n\t\townCost: 0,\n\t\tspawnedCost: 0,\n\t\ttotalCost: 0,\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: 0,\n\t\tsessions: 0,\n\t\treports: 0,\n\t};\n}\n\nfunction isInsideWindow(timestamp: number, window: DailyUsageWindow): boolean {\n\treturn timestamp >= window.startMs && timestamp < window.endMs;\n}\n\nfunction addUsage(\n\ttotals: Pick<DailyUsageTotals, \"input\" | \"output\" | \"cacheRead\" | \"cacheWrite\" | \"totalTokens\">,\n\tusage: Usage,\n): void {\n\ttotals.input += usage.input;\n\ttotals.output += usage.output;\n\ttotals.cacheRead += usage.cacheRead;\n\ttotals.cacheWrite += usage.cacheWrite;\n\ttotals.totalTokens += usage.totalTokens;\n}\n\nfunction addDailyUsageFromEntries(\n\ttotals: DailyUsageTotals,\n\tentries: readonly SessionEntry[],\n\twindow: DailyUsageWindow,\n\tseenSpawnedReportIds: Set<string>,\n): boolean {\n\tlet hasUsage = false;\n\tfor (const entry of entries) {\n\t\tif (!isInsideWindow(Date.parse(entry.timestamp), window)) continue;\n\t\tconst usage = getSessionEntryUsage(entry);\n\t\tif (usage) {\n\t\t\ttotals.ownCost += usage.cost.total;\n\t\t\taddUsage(totals, usage);\n\t\t\thasUsage = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (entry.type === \"custom\" && entry.customType === SPAWNED_USAGE_CUSTOM_TYPE) {\n\t\t\tconst data = entry.data as SpawnedUsageReport | undefined;\n\t\t\tif (!data?.usage) continue;\n\t\t\tif (data.reportId) {\n\t\t\t\tif (seenSpawnedReportIds.has(data.reportId)) continue;\n\t\t\t\tseenSpawnedReportIds.add(data.reportId);\n\t\t\t}\n\t\t\ttotals.spawnedCost += data.usage.cost.total;\n\t\t\ttotals.reports += 1;\n\t\t\taddUsage(totals, data.usage);\n\t\t\thasUsage = true;\n\t\t}\n\t}\n\treturn hasUsage;\n}\n\nfunction finishTotals(totals: DailyUsageTotals): DailyUsageTotals {\n\ttotals.totalCost = totals.ownCost + totals.spawnedCost;\n\treturn totals;\n}\n\nfunction shouldReadSessionFile(filePath: string, window: DailyUsageWindow): boolean {\n\ttry {\n\t\treturn statSync(filePath).mtimeMs >= window.startMs;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function aggregateDailyUsageFromEntries(\n\tentries: readonly SessionEntry[],\n\twindow: DailyUsageWindow,\n): DailyUsageTotals {\n\tconst totals = createZeroTotals();\n\tconst hasUsage = addDailyUsageFromEntries(totals, entries, window, new Set());\n\ttotals.sessions = hasUsage ? 1 : 0;\n\treturn finishTotals(totals);\n}\n\nexport interface LiveSessionDailyUsageSource {\n\tfilePath: string;\n\tentries: readonly SessionEntry[];\n}\n\nfunction getSessionEntries(\n\tfilePath: string,\n\tliveSession: LiveSessionDailyUsageSource | undefined,\n): readonly SessionEntry[] {\n\tif (liveSession && resolve(filePath) === resolve(liveSession.filePath)) return liveSession.entries;\n\treturn loadEntriesFromFile(filePath).filter((entry): entry is SessionEntry => entry.type !== \"session\");\n}\n\nexport function aggregateDailyUsageFromSessionFiles(\n\tsessionDir: string,\n\twindow: DailyUsageWindow,\n\tliveSession?: LiveSessionDailyUsageSource,\n): DailyUsageTotals {\n\tconst totals = createZeroTotals();\n\tif (!sessionDir || !existsSync(sessionDir)) return totals;\n\tconst seenSpawnedReportIds = new Set<string>();\n\tfor (const name of readdirSync(sessionDir)) {\n\t\tif (!name.endsWith(\".jsonl\")) continue;\n\t\tconst filePath = join(sessionDir, name);\n\t\tif (!shouldReadSessionFile(filePath, window)) continue;\n\t\tconst entries = getSessionEntries(filePath, liveSession);\n\t\tif (addDailyUsageFromEntries(totals, entries, window, seenSpawnedReportIds)) {\n\t\t\ttotals.sessions += 1;\n\t\t}\n\t}\n\treturn finishTotals(totals);\n}\n\nexport function aggregateDailyUsageFromSessionRoot(\n\tsessionRoot: string,\n\twindow: DailyUsageWindow,\n\tliveSession?: LiveSessionDailyUsageSource,\n): DailyUsageTotals {\n\tconst totals = createZeroTotals();\n\tif (!sessionRoot || !existsSync(sessionRoot)) return totals;\n\tconst seenSpawnedReportIds = new Set<string>();\n\tfor (const name of readdirSync(sessionRoot)) {\n\t\tconst dir = join(sessionRoot, name);\n\t\tif (!existsSync(dir) || !statSync(dir).isDirectory()) continue;\n\t\tfor (const fileName of readdirSync(dir)) {\n\t\t\tif (!fileName.endsWith(\".jsonl\")) continue;\n\t\t\tconst filePath = join(dir, fileName);\n\t\t\tif (!shouldReadSessionFile(filePath, window)) continue;\n\t\t\tconst entries = getSessionEntries(filePath, liveSession);\n\t\t\tif (addDailyUsageFromEntries(totals, entries, window, seenSpawnedReportIds)) {\n\t\t\t\ttotals.sessions += 1;\n\t\t\t}\n\t\t}\n\t}\n\treturn finishTotals(totals);\n}\n\nexport function formatDailyUsageBreakdown(\n\ttotals: DailyUsageTotals,\n\tformatLabel: (label: string) => string = (label) => label,\n): string {\n\treturn [\n\t\t`${formatLabel(\"Today:\")} $${totals.totalCost.toFixed(4)}`,\n\t\t`${formatLabel(\"Own/session messages:\")} $${totals.ownCost.toFixed(4)}`,\n\t\t`${formatLabel(\"Spawned/background reports:\")} $${totals.spawnedCost.toFixed(4)}`,\n\t\t`${formatLabel(\"Sessions scanned:\")} ${totals.sessions}`,\n\t\t`${formatLabel(\"Spawned/background report count:\")} ${totals.reports}`,\n\t].join(\"\\n\");\n}\n\nexport function getLocalDayWindow(now = new Date()): DailyUsageWindow {\n\tconst start = new Date(now);\n\tstart.setHours(0, 0, 0, 0);\n\tconst end = new Date(start);\n\tend.setDate(end.getDate() + 1);\n\treturn { startMs: start.getTime(), endMs: end.getTime() };\n}\n"]}
@@ -1,7 +1,8 @@
1
1
  import { existsSync, readdirSync, statSync } from "node:fs";
2
2
  import { join, resolve } from "node:path";
3
+ import { getSessionEntryUsage } from "@caupulican/pi-agent-core";
3
4
  import { loadEntriesFromFile } from "@caupulican/pi-agent-core/node";
4
- import { SPAWNED_USAGE_CUSTOM_TYPE } from "../agent-session.js";
5
+ import { SPAWNED_USAGE_CUSTOM_TYPE } from "../agent-session-contracts.js";
5
6
  function createZeroTotals() {
6
7
  return {
7
8
  ownCost: 0,
@@ -31,10 +32,8 @@ function addDailyUsageFromEntries(totals, entries, window, seenSpawnedReportIds)
31
32
  for (const entry of entries) {
32
33
  if (!isInsideWindow(Date.parse(entry.timestamp), window))
33
34
  continue;
34
- if (entry.type === "message" && entry.message.role === "assistant") {
35
- const usage = entry.message.usage;
36
- if (!usage)
37
- continue;
35
+ const usage = getSessionEntryUsage(entry);
36
+ if (usage) {
38
37
  totals.ownCost += usage.cost.total;
39
38
  addUsage(totals, usage);
40
39
  hasUsage = true;
@@ -1 +1 @@
1
- {"version":3,"file":"daily-usage.js","sourceRoot":"","sources":["../../../src/core/cost/daily-usage.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { loadEntriesFromFile, type SessionEntry } from \"@caupulican/pi-agent-core/node\";\nimport type { AssistantMessage, Usage } from \"@caupulican/pi-ai\";\nimport { SPAWNED_USAGE_CUSTOM_TYPE, type SpawnedUsageReport } from \"../agent-session.ts\";\n\nexport type DailyUsageWindow = {\n\tstartMs: number;\n\tendMs: number;\n};\n\nexport type DailyUsageTotals = {\n\townCost: number;\n\tspawnedCost: number;\n\ttotalCost: number;\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\ttotalTokens: number;\n\tsessions: number;\n\treports: number;\n};\n\nfunction createZeroTotals(): DailyUsageTotals {\n\treturn {\n\t\townCost: 0,\n\t\tspawnedCost: 0,\n\t\ttotalCost: 0,\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: 0,\n\t\tsessions: 0,\n\t\treports: 0,\n\t};\n}\n\nfunction isInsideWindow(timestamp: number, window: DailyUsageWindow): boolean {\n\treturn timestamp >= window.startMs && timestamp < window.endMs;\n}\n\nfunction addUsage(\n\ttotals: Pick<DailyUsageTotals, \"input\" | \"output\" | \"cacheRead\" | \"cacheWrite\" | \"totalTokens\">,\n\tusage: Usage,\n): void {\n\ttotals.input += usage.input;\n\ttotals.output += usage.output;\n\ttotals.cacheRead += usage.cacheRead;\n\ttotals.cacheWrite += usage.cacheWrite;\n\ttotals.totalTokens += usage.totalTokens;\n}\n\nfunction addDailyUsageFromEntries(\n\ttotals: DailyUsageTotals,\n\tentries: readonly SessionEntry[],\n\twindow: DailyUsageWindow,\n\tseenSpawnedReportIds: Set<string>,\n): boolean {\n\tlet hasUsage = false;\n\tfor (const entry of entries) {\n\t\tif (!isInsideWindow(Date.parse(entry.timestamp), window)) continue;\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tconst usage = (entry.message as AssistantMessage).usage;\n\t\t\tif (!usage) continue;\n\t\t\ttotals.ownCost += usage.cost.total;\n\t\t\taddUsage(totals, usage);\n\t\t\thasUsage = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (entry.type === \"custom\" && entry.customType === SPAWNED_USAGE_CUSTOM_TYPE) {\n\t\t\tconst data = entry.data as SpawnedUsageReport | undefined;\n\t\t\tif (!data?.usage) continue;\n\t\t\tif (data.reportId) {\n\t\t\t\tif (seenSpawnedReportIds.has(data.reportId)) continue;\n\t\t\t\tseenSpawnedReportIds.add(data.reportId);\n\t\t\t}\n\t\t\ttotals.spawnedCost += data.usage.cost.total;\n\t\t\ttotals.reports += 1;\n\t\t\taddUsage(totals, data.usage);\n\t\t\thasUsage = true;\n\t\t}\n\t}\n\treturn hasUsage;\n}\n\nfunction finishTotals(totals: DailyUsageTotals): DailyUsageTotals {\n\ttotals.totalCost = totals.ownCost + totals.spawnedCost;\n\treturn totals;\n}\n\nfunction shouldReadSessionFile(filePath: string, window: DailyUsageWindow): boolean {\n\ttry {\n\t\treturn statSync(filePath).mtimeMs >= window.startMs;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function aggregateDailyUsageFromEntries(\n\tentries: readonly SessionEntry[],\n\twindow: DailyUsageWindow,\n): DailyUsageTotals {\n\tconst totals = createZeroTotals();\n\tconst hasUsage = addDailyUsageFromEntries(totals, entries, window, new Set());\n\ttotals.sessions = hasUsage ? 1 : 0;\n\treturn finishTotals(totals);\n}\n\nexport interface LiveSessionDailyUsageSource {\n\tfilePath: string;\n\tentries: readonly SessionEntry[];\n}\n\nfunction getSessionEntries(\n\tfilePath: string,\n\tliveSession: LiveSessionDailyUsageSource | undefined,\n): readonly SessionEntry[] {\n\tif (liveSession && resolve(filePath) === resolve(liveSession.filePath)) return liveSession.entries;\n\treturn loadEntriesFromFile(filePath).filter((entry): entry is SessionEntry => entry.type !== \"session\");\n}\n\nexport function aggregateDailyUsageFromSessionFiles(\n\tsessionDir: string,\n\twindow: DailyUsageWindow,\n\tliveSession?: LiveSessionDailyUsageSource,\n): DailyUsageTotals {\n\tconst totals = createZeroTotals();\n\tif (!sessionDir || !existsSync(sessionDir)) return totals;\n\tconst seenSpawnedReportIds = new Set<string>();\n\tfor (const name of readdirSync(sessionDir)) {\n\t\tif (!name.endsWith(\".jsonl\")) continue;\n\t\tconst filePath = join(sessionDir, name);\n\t\tif (!shouldReadSessionFile(filePath, window)) continue;\n\t\tconst entries = getSessionEntries(filePath, liveSession);\n\t\tif (addDailyUsageFromEntries(totals, entries, window, seenSpawnedReportIds)) {\n\t\t\ttotals.sessions += 1;\n\t\t}\n\t}\n\treturn finishTotals(totals);\n}\n\nexport function aggregateDailyUsageFromSessionRoot(\n\tsessionRoot: string,\n\twindow: DailyUsageWindow,\n\tliveSession?: LiveSessionDailyUsageSource,\n): DailyUsageTotals {\n\tconst totals = createZeroTotals();\n\tif (!sessionRoot || !existsSync(sessionRoot)) return totals;\n\tconst seenSpawnedReportIds = new Set<string>();\n\tfor (const name of readdirSync(sessionRoot)) {\n\t\tconst dir = join(sessionRoot, name);\n\t\tif (!existsSync(dir) || !statSync(dir).isDirectory()) continue;\n\t\tfor (const fileName of readdirSync(dir)) {\n\t\t\tif (!fileName.endsWith(\".jsonl\")) continue;\n\t\t\tconst filePath = join(dir, fileName);\n\t\t\tif (!shouldReadSessionFile(filePath, window)) continue;\n\t\t\tconst entries = getSessionEntries(filePath, liveSession);\n\t\t\tif (addDailyUsageFromEntries(totals, entries, window, seenSpawnedReportIds)) {\n\t\t\t\ttotals.sessions += 1;\n\t\t\t}\n\t\t}\n\t}\n\treturn finishTotals(totals);\n}\n\nexport function formatDailyUsageBreakdown(\n\ttotals: DailyUsageTotals,\n\tformatLabel: (label: string) => string = (label) => label,\n): string {\n\treturn [\n\t\t`${formatLabel(\"Today:\")} $${totals.totalCost.toFixed(4)}`,\n\t\t`${formatLabel(\"Own/session messages:\")} $${totals.ownCost.toFixed(4)}`,\n\t\t`${formatLabel(\"Spawned/background reports:\")} $${totals.spawnedCost.toFixed(4)}`,\n\t\t`${formatLabel(\"Sessions scanned:\")} ${totals.sessions}`,\n\t\t`${formatLabel(\"Spawned/background report count:\")} ${totals.reports}`,\n\t].join(\"\\n\");\n}\n\nexport function getLocalDayWindow(now = new Date()): DailyUsageWindow {\n\tconst start = new Date(now);\n\tstart.setHours(0, 0, 0, 0);\n\tconst end = new Date(start);\n\tend.setDate(end.getDate() + 1);\n\treturn { startMs: start.getTime(), endMs: end.getTime() };\n}\n"]}
1
+ {"version":3,"file":"daily-usage.js","sourceRoot":"","sources":["../../../src/core/cost/daily-usage.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { getSessionEntryUsage } from \"@caupulican/pi-agent-core\";\nimport { loadEntriesFromFile, type SessionEntry } from \"@caupulican/pi-agent-core/node\";\nimport type { Usage } from \"@caupulican/pi-ai\";\nimport { SPAWNED_USAGE_CUSTOM_TYPE, type SpawnedUsageReport } from \"../agent-session-contracts.ts\";\n\nexport type DailyUsageWindow = {\n\tstartMs: number;\n\tendMs: number;\n};\n\nexport type DailyUsageTotals = {\n\townCost: number;\n\tspawnedCost: number;\n\ttotalCost: number;\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\ttotalTokens: number;\n\tsessions: number;\n\treports: number;\n};\n\nfunction createZeroTotals(): DailyUsageTotals {\n\treturn {\n\t\townCost: 0,\n\t\tspawnedCost: 0,\n\t\ttotalCost: 0,\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: 0,\n\t\tsessions: 0,\n\t\treports: 0,\n\t};\n}\n\nfunction isInsideWindow(timestamp: number, window: DailyUsageWindow): boolean {\n\treturn timestamp >= window.startMs && timestamp < window.endMs;\n}\n\nfunction addUsage(\n\ttotals: Pick<DailyUsageTotals, \"input\" | \"output\" | \"cacheRead\" | \"cacheWrite\" | \"totalTokens\">,\n\tusage: Usage,\n): void {\n\ttotals.input += usage.input;\n\ttotals.output += usage.output;\n\ttotals.cacheRead += usage.cacheRead;\n\ttotals.cacheWrite += usage.cacheWrite;\n\ttotals.totalTokens += usage.totalTokens;\n}\n\nfunction addDailyUsageFromEntries(\n\ttotals: DailyUsageTotals,\n\tentries: readonly SessionEntry[],\n\twindow: DailyUsageWindow,\n\tseenSpawnedReportIds: Set<string>,\n): boolean {\n\tlet hasUsage = false;\n\tfor (const entry of entries) {\n\t\tif (!isInsideWindow(Date.parse(entry.timestamp), window)) continue;\n\t\tconst usage = getSessionEntryUsage(entry);\n\t\tif (usage) {\n\t\t\ttotals.ownCost += usage.cost.total;\n\t\t\taddUsage(totals, usage);\n\t\t\thasUsage = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (entry.type === \"custom\" && entry.customType === SPAWNED_USAGE_CUSTOM_TYPE) {\n\t\t\tconst data = entry.data as SpawnedUsageReport | undefined;\n\t\t\tif (!data?.usage) continue;\n\t\t\tif (data.reportId) {\n\t\t\t\tif (seenSpawnedReportIds.has(data.reportId)) continue;\n\t\t\t\tseenSpawnedReportIds.add(data.reportId);\n\t\t\t}\n\t\t\ttotals.spawnedCost += data.usage.cost.total;\n\t\t\ttotals.reports += 1;\n\t\t\taddUsage(totals, data.usage);\n\t\t\thasUsage = true;\n\t\t}\n\t}\n\treturn hasUsage;\n}\n\nfunction finishTotals(totals: DailyUsageTotals): DailyUsageTotals {\n\ttotals.totalCost = totals.ownCost + totals.spawnedCost;\n\treturn totals;\n}\n\nfunction shouldReadSessionFile(filePath: string, window: DailyUsageWindow): boolean {\n\ttry {\n\t\treturn statSync(filePath).mtimeMs >= window.startMs;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function aggregateDailyUsageFromEntries(\n\tentries: readonly SessionEntry[],\n\twindow: DailyUsageWindow,\n): DailyUsageTotals {\n\tconst totals = createZeroTotals();\n\tconst hasUsage = addDailyUsageFromEntries(totals, entries, window, new Set());\n\ttotals.sessions = hasUsage ? 1 : 0;\n\treturn finishTotals(totals);\n}\n\nexport interface LiveSessionDailyUsageSource {\n\tfilePath: string;\n\tentries: readonly SessionEntry[];\n}\n\nfunction getSessionEntries(\n\tfilePath: string,\n\tliveSession: LiveSessionDailyUsageSource | undefined,\n): readonly SessionEntry[] {\n\tif (liveSession && resolve(filePath) === resolve(liveSession.filePath)) return liveSession.entries;\n\treturn loadEntriesFromFile(filePath).filter((entry): entry is SessionEntry => entry.type !== \"session\");\n}\n\nexport function aggregateDailyUsageFromSessionFiles(\n\tsessionDir: string,\n\twindow: DailyUsageWindow,\n\tliveSession?: LiveSessionDailyUsageSource,\n): DailyUsageTotals {\n\tconst totals = createZeroTotals();\n\tif (!sessionDir || !existsSync(sessionDir)) return totals;\n\tconst seenSpawnedReportIds = new Set<string>();\n\tfor (const name of readdirSync(sessionDir)) {\n\t\tif (!name.endsWith(\".jsonl\")) continue;\n\t\tconst filePath = join(sessionDir, name);\n\t\tif (!shouldReadSessionFile(filePath, window)) continue;\n\t\tconst entries = getSessionEntries(filePath, liveSession);\n\t\tif (addDailyUsageFromEntries(totals, entries, window, seenSpawnedReportIds)) {\n\t\t\ttotals.sessions += 1;\n\t\t}\n\t}\n\treturn finishTotals(totals);\n}\n\nexport function aggregateDailyUsageFromSessionRoot(\n\tsessionRoot: string,\n\twindow: DailyUsageWindow,\n\tliveSession?: LiveSessionDailyUsageSource,\n): DailyUsageTotals {\n\tconst totals = createZeroTotals();\n\tif (!sessionRoot || !existsSync(sessionRoot)) return totals;\n\tconst seenSpawnedReportIds = new Set<string>();\n\tfor (const name of readdirSync(sessionRoot)) {\n\t\tconst dir = join(sessionRoot, name);\n\t\tif (!existsSync(dir) || !statSync(dir).isDirectory()) continue;\n\t\tfor (const fileName of readdirSync(dir)) {\n\t\t\tif (!fileName.endsWith(\".jsonl\")) continue;\n\t\t\tconst filePath = join(dir, fileName);\n\t\t\tif (!shouldReadSessionFile(filePath, window)) continue;\n\t\t\tconst entries = getSessionEntries(filePath, liveSession);\n\t\t\tif (addDailyUsageFromEntries(totals, entries, window, seenSpawnedReportIds)) {\n\t\t\t\ttotals.sessions += 1;\n\t\t\t}\n\t\t}\n\t}\n\treturn finishTotals(totals);\n}\n\nexport function formatDailyUsageBreakdown(\n\ttotals: DailyUsageTotals,\n\tformatLabel: (label: string) => string = (label) => label,\n): string {\n\treturn [\n\t\t`${formatLabel(\"Today:\")} $${totals.totalCost.toFixed(4)}`,\n\t\t`${formatLabel(\"Own/session messages:\")} $${totals.ownCost.toFixed(4)}`,\n\t\t`${formatLabel(\"Spawned/background reports:\")} $${totals.spawnedCost.toFixed(4)}`,\n\t\t`${formatLabel(\"Sessions scanned:\")} ${totals.sessions}`,\n\t\t`${formatLabel(\"Spawned/background report count:\")} ${totals.reports}`,\n\t].join(\"\\n\");\n}\n\nexport function getLocalDayWindow(now = new Date()): DailyUsageWindow {\n\tconst start = new Date(now);\n\tstart.setHours(0, 0, 0, 0);\n\tconst end = new Date(start);\n\tend.setDate(end.getDate() + 1);\n\treturn { startMs: start.getTime(), endMs: end.getTime() };\n}\n"]}