@caupulican/pi-adaptative 0.85.4 → 0.86.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (480) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/dist/bun/cli.d.ts +1 -1
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js +1 -0
  5. package/dist/bun/cli.js.map +1 -1
  6. package/dist/core/agent-paths.d.ts +3 -3
  7. package/dist/core/agent-paths.d.ts.map +1 -1
  8. package/dist/core/agent-paths.js +3 -3
  9. package/dist/core/agent-paths.js.map +1 -1
  10. package/dist/core/agent-session-runtime.d.ts +1 -1
  11. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  12. package/dist/core/agent-session-runtime.js +1 -1
  13. package/dist/core/agent-session-runtime.js.map +1 -1
  14. package/dist/core/agent-session.d.ts +11 -5
  15. package/dist/core/agent-session.d.ts.map +1 -1
  16. package/dist/core/agent-session.js +14 -3
  17. package/dist/core/agent-session.js.map +1 -1
  18. package/dist/core/auth-storage.d.ts +2 -2
  19. package/dist/core/auth-storage.d.ts.map +1 -1
  20. package/dist/core/auth-storage.js +2 -2
  21. package/dist/core/auth-storage.js.map +1 -1
  22. package/dist/core/autonomy/bounded-completion.d.ts.map +1 -1
  23. package/dist/core/autonomy/bounded-completion.js +19 -8
  24. package/dist/core/autonomy/bounded-completion.js.map +1 -1
  25. package/dist/core/autonomy/lane-tool-surface.d.ts +11 -5
  26. package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
  27. package/dist/core/autonomy/lane-tool-surface.js +34 -8
  28. package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
  29. package/dist/core/autonomy/subagent-prompt.d.ts +3 -3
  30. package/dist/core/autonomy/subagent-prompt.js +9 -9
  31. package/dist/core/autonomy/subagent-prompt.js.map +1 -1
  32. package/dist/core/background-lane-controller.d.ts +10 -8
  33. package/dist/core/background-lane-controller.d.ts.map +1 -1
  34. package/dist/core/background-lane-controller.js +23 -13
  35. package/dist/core/background-lane-controller.js.map +1 -1
  36. package/dist/core/bash-execution-controller.d.ts +4 -0
  37. package/dist/core/bash-execution-controller.d.ts.map +1 -1
  38. package/dist/core/bash-execution-controller.js +11 -4
  39. package/dist/core/bash-execution-controller.js.map +1 -1
  40. package/dist/core/bash-executor.d.ts +2 -0
  41. package/dist/core/bash-executor.d.ts.map +1 -1
  42. package/dist/core/bash-executor.js +4 -3
  43. package/dist/core/bash-executor.js.map +1 -1
  44. package/dist/core/billing-failover-controller.d.ts +2 -2
  45. package/dist/core/billing-failover-controller.d.ts.map +1 -1
  46. package/dist/core/billing-failover-controller.js +1 -1
  47. package/dist/core/billing-failover-controller.js.map +1 -1
  48. package/dist/core/capability-contract.d.ts +1 -1
  49. package/dist/core/capability-contract.d.ts.map +1 -1
  50. package/dist/core/capability-contract.js +0 -1
  51. package/dist/core/capability-contract.js.map +1 -1
  52. package/dist/core/compaction-controller.d.ts +8 -2
  53. package/dist/core/compaction-controller.d.ts.map +1 -1
  54. package/dist/core/compaction-controller.js +73 -3
  55. package/dist/core/compaction-controller.js.map +1 -1
  56. package/dist/core/compaction-support.d.ts +2 -2
  57. package/dist/core/compaction-support.d.ts.map +1 -1
  58. package/dist/core/compaction-support.js +9 -1
  59. package/dist/core/compaction-support.js.map +1 -1
  60. package/dist/core/context/artifact-retrieval.d.ts +1 -1
  61. package/dist/core/context/artifact-retrieval.d.ts.map +1 -1
  62. package/dist/core/context/artifact-retrieval.js +1 -1
  63. package/dist/core/context/artifact-retrieval.js.map +1 -1
  64. package/dist/core/context/context-artifacts.d.ts +6 -6
  65. package/dist/core/context/context-artifacts.d.ts.map +1 -1
  66. package/dist/core/context/context-artifacts.js +151 -63
  67. package/dist/core/context/context-artifacts.js.map +1 -1
  68. package/dist/core/context/context-composition.js +1 -1
  69. package/dist/core/context/context-composition.js.map +1 -1
  70. package/dist/core/context/context-store-retention.d.ts.map +1 -1
  71. package/dist/core/context/context-store-retention.js +5 -2
  72. package/dist/core/context/context-store-retention.js.map +1 -1
  73. package/dist/core/context/file-store-memory-provider.js +1 -1
  74. package/dist/core/context/file-store-memory-provider.js.map +1 -1
  75. package/dist/core/context/tool-output-packer.d.ts +1 -1
  76. package/dist/core/context/tool-output-packer.d.ts.map +1 -1
  77. package/dist/core/context/tool-output-packer.js +1 -1
  78. package/dist/core/context/tool-output-packer.js.map +1 -1
  79. package/dist/core/context-gc.d.ts.map +1 -1
  80. package/dist/core/context-gc.js +7 -5
  81. package/dist/core/context-gc.js.map +1 -1
  82. package/dist/core/context-pipeline.d.ts +2 -2
  83. package/dist/core/context-pipeline.d.ts.map +1 -1
  84. package/dist/core/context-pipeline.js +8 -4
  85. package/dist/core/context-pipeline.js.map +1 -1
  86. package/dist/core/cost/cost-summary.d.ts +1 -1
  87. package/dist/core/cost/cost-summary.d.ts.map +1 -1
  88. package/dist/core/cost/cost-summary.js +1 -1
  89. package/dist/core/cost/cost-summary.js.map +1 -1
  90. package/dist/core/cost/daily-usage.d.ts +1 -1
  91. package/dist/core/cost/daily-usage.d.ts.map +1 -1
  92. package/dist/core/cost/daily-usage.js +2 -2
  93. package/dist/core/cost/daily-usage.js.map +1 -1
  94. package/dist/core/cost/session-usage.d.ts +1 -1
  95. package/dist/core/cost/session-usage.d.ts.map +1 -1
  96. package/dist/core/cost/session-usage.js +1 -1
  97. package/dist/core/cost/session-usage.js.map +1 -1
  98. package/dist/core/default-tool-surface.d.ts +1 -0
  99. package/dist/core/default-tool-surface.d.ts.map +1 -1
  100. package/dist/core/default-tool-surface.js +3 -2
  101. package/dist/core/default-tool-surface.js.map +1 -1
  102. package/dist/core/delegation/worker-actions.js +1 -1
  103. package/dist/core/delegation/worker-actions.js.map +1 -1
  104. package/dist/core/delegation/worker-agent-control-coordinator.d.ts +27 -8
  105. package/dist/core/delegation/worker-agent-control-coordinator.d.ts.map +1 -1
  106. package/dist/core/delegation/worker-agent-control-coordinator.js +191 -33
  107. package/dist/core/delegation/worker-agent-control-coordinator.js.map +1 -1
  108. package/dist/core/delegation/worker-agent-control.d.ts +45 -6
  109. package/dist/core/delegation/worker-agent-control.d.ts.map +1 -1
  110. package/dist/core/delegation/worker-agent-control.js +110 -13
  111. package/dist/core/delegation/worker-agent-control.js.map +1 -1
  112. package/dist/core/delegation/worker-attempt-executor.d.ts +1 -1
  113. package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
  114. package/dist/core/delegation/worker-attempt-executor.js +180 -160
  115. package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
  116. package/dist/core/delegation/worker-authority-resolver.d.ts +23 -0
  117. package/dist/core/delegation/worker-authority-resolver.d.ts.map +1 -0
  118. package/dist/core/delegation/worker-authority-resolver.js +128 -0
  119. package/dist/core/delegation/worker-authority-resolver.js.map +1 -0
  120. package/dist/core/delegation/worker-conversation-store.d.ts +2 -1
  121. package/dist/core/delegation/worker-conversation-store.d.ts.map +1 -1
  122. package/dist/core/delegation/worker-conversation-store.js +4 -3
  123. package/dist/core/delegation/worker-conversation-store.js.map +1 -1
  124. package/dist/core/delegation/worker-delegation-controller.d.ts +7 -1
  125. package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
  126. package/dist/core/delegation/worker-delegation-controller.js +260 -87
  127. package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
  128. package/dist/core/delegation/worker-delegation-request.d.ts +25 -4
  129. package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -1
  130. package/dist/core/delegation/worker-delegation-request.js +90 -1
  131. package/dist/core/delegation/worker-delegation-request.js.map +1 -1
  132. package/dist/core/delegation/worker-execution-policy.d.ts +2 -0
  133. package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -1
  134. package/dist/core/delegation/worker-execution-policy.js +22 -12
  135. package/dist/core/delegation/worker-execution-policy.js.map +1 -1
  136. package/dist/core/delegation/worker-lifecycle.d.ts +1 -0
  137. package/dist/core/delegation/worker-lifecycle.d.ts.map +1 -1
  138. package/dist/core/delegation/worker-lifecycle.js +4 -2
  139. package/dist/core/delegation/worker-lifecycle.js.map +1 -1
  140. package/dist/core/delegation/worker-profile-resolver.d.ts +0 -2
  141. package/dist/core/delegation/worker-profile-resolver.d.ts.map +1 -1
  142. package/dist/core/delegation/worker-profile-resolver.js +8 -35
  143. package/dist/core/delegation/worker-profile-resolver.js.map +1 -1
  144. package/dist/core/delegation/worker-recovery-coordinator.d.ts.map +1 -1
  145. package/dist/core/delegation/worker-recovery-coordinator.js +1 -0
  146. package/dist/core/delegation/worker-recovery-coordinator.js.map +1 -1
  147. package/dist/core/delegation/worker-runner.d.ts +6 -1
  148. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  149. package/dist/core/delegation/worker-runner.js +20 -6
  150. package/dist/core/delegation/worker-runner.js.map +1 -1
  151. package/dist/core/delegation/worker-tree-budget-coordinator.d.ts +47 -0
  152. package/dist/core/delegation/worker-tree-budget-coordinator.d.ts.map +1 -0
  153. package/dist/core/delegation/worker-tree-budget-coordinator.js +210 -0
  154. package/dist/core/delegation/worker-tree-budget-coordinator.js.map +1 -0
  155. package/dist/core/extensions/builtin.d.ts +2 -2
  156. package/dist/core/extensions/builtin.d.ts.map +1 -1
  157. package/dist/core/extensions/builtin.js +2 -2
  158. package/dist/core/extensions/builtin.js.map +1 -1
  159. package/dist/core/extensions/bundled-virtual-modules.d.ts +2 -0
  160. package/dist/core/extensions/bundled-virtual-modules.d.ts.map +1 -0
  161. package/dist/core/extensions/bundled-virtual-modules.js +129 -0
  162. package/dist/core/extensions/bundled-virtual-modules.js.map +1 -0
  163. package/dist/core/extensions/factory-runtime.d.ts +22 -0
  164. package/dist/core/extensions/factory-runtime.d.ts.map +1 -0
  165. package/dist/core/extensions/factory-runtime.js +334 -0
  166. package/dist/core/extensions/factory-runtime.js.map +1 -0
  167. package/dist/core/extensions/index.d.ts +1 -1
  168. package/dist/core/extensions/index.d.ts.map +1 -1
  169. package/dist/core/extensions/index.js +1 -1
  170. package/dist/core/extensions/index.js.map +1 -1
  171. package/dist/core/extensions/lifecycle.d.ts +13 -0
  172. package/dist/core/extensions/lifecycle.d.ts.map +1 -0
  173. package/dist/core/extensions/lifecycle.js +52 -0
  174. package/dist/core/extensions/lifecycle.js.map +1 -0
  175. package/dist/core/extensions/loader.d.ts +3 -24
  176. package/dist/core/extensions/loader.d.ts.map +1 -1
  177. package/dist/core/extensions/loader.js +21 -531
  178. package/dist/core/extensions/loader.js.map +1 -1
  179. package/dist/core/extensions/virtual-modules.d.ts +51 -0
  180. package/dist/core/extensions/virtual-modules.d.ts.map +1 -0
  181. package/dist/core/extensions/virtual-modules.js +59 -0
  182. package/dist/core/extensions/virtual-modules.js.map +1 -0
  183. package/dist/core/foreground-recovery-controller.d.ts +2 -1
  184. package/dist/core/foreground-recovery-controller.d.ts.map +1 -1
  185. package/dist/core/foreground-recovery-controller.js +3 -3
  186. package/dist/core/foreground-recovery-controller.js.map +1 -1
  187. package/dist/core/goal-loop-controller.js +1 -1
  188. package/dist/core/goal-loop-controller.js.map +1 -1
  189. package/dist/core/goals/compact-goal-context.d.ts +1 -1
  190. package/dist/core/goals/compact-goal-context.d.ts.map +1 -1
  191. package/dist/core/goals/compact-goal-context.js +1 -1
  192. package/dist/core/goals/compact-goal-context.js.map +1 -1
  193. package/dist/core/goals/goal-auto-continue-controller.js +1 -1
  194. package/dist/core/goals/goal-auto-continue-controller.js.map +1 -1
  195. package/dist/core/goals/goal-session-controller.d.ts +1 -1
  196. package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
  197. package/dist/core/goals/goal-session-controller.js +1 -1
  198. package/dist/core/goals/goal-session-controller.js.map +1 -1
  199. package/dist/core/http-dispatcher.d.ts +1 -1
  200. package/dist/core/http-dispatcher.d.ts.map +1 -1
  201. package/dist/core/http-dispatcher.js +1 -1
  202. package/dist/core/http-dispatcher.js.map +1 -1
  203. package/dist/core/index.d.ts +3 -2
  204. package/dist/core/index.d.ts.map +1 -1
  205. package/dist/core/index.js +2 -1
  206. package/dist/core/index.js.map +1 -1
  207. package/dist/core/memory/providers/file-store.d.ts.map +1 -1
  208. package/dist/core/memory/providers/file-store.js +1 -1
  209. package/dist/core/memory/providers/file-store.js.map +1 -1
  210. package/dist/core/memory/providers/user-memory-archive.js +1 -1
  211. package/dist/core/memory/providers/user-memory-archive.js.map +1 -1
  212. package/dist/core/model-registry.d.ts +2 -1
  213. package/dist/core/model-registry.d.ts.map +1 -1
  214. package/dist/core/model-registry.js +4 -1
  215. package/dist/core/model-registry.js.map +1 -1
  216. package/dist/core/model-resolver.d.ts +1 -1
  217. package/dist/core/model-resolver.d.ts.map +1 -1
  218. package/dist/core/model-resolver.js +1 -1
  219. package/dist/core/model-resolver.js.map +1 -1
  220. package/dist/core/model-router-controller.js +1 -1
  221. package/dist/core/model-router-controller.js.map +1 -1
  222. package/dist/core/model-selection-controller.js +1 -1
  223. package/dist/core/model-selection-controller.js.map +1 -1
  224. package/dist/core/model-tool-protocol.d.ts +1 -1
  225. package/dist/core/model-tool-protocol.d.ts.map +1 -1
  226. package/dist/core/model-tool-protocol.js +1 -1
  227. package/dist/core/model-tool-protocol.js.map +1 -1
  228. package/dist/core/models/llamacpp-runtime.d.ts +7 -0
  229. package/dist/core/models/llamacpp-runtime.d.ts.map +1 -1
  230. package/dist/core/models/llamacpp-runtime.js +8 -3
  231. package/dist/core/models/llamacpp-runtime.js.map +1 -1
  232. package/dist/core/models/local-runtime.js +1 -1
  233. package/dist/core/models/local-runtime.js.map +1 -1
  234. package/dist/core/models/runtime-process.d.ts.map +1 -1
  235. package/dist/core/models/runtime-process.js +5 -18
  236. package/dist/core/models/runtime-process.js.map +1 -1
  237. package/dist/core/orchestration/bounded-string-array.d.ts +11 -0
  238. package/dist/core/orchestration/bounded-string-array.d.ts.map +1 -0
  239. package/dist/core/orchestration/bounded-string-array.js +17 -0
  240. package/dist/core/orchestration/bounded-string-array.js.map +1 -0
  241. package/dist/core/orchestration/capability-gateway.d.ts +16 -0
  242. package/dist/core/orchestration/capability-gateway.d.ts.map +1 -1
  243. package/dist/core/orchestration/capability-gateway.js +38 -0
  244. package/dist/core/orchestration/capability-gateway.js.map +1 -1
  245. package/dist/core/orchestration/contracts.d.ts +11 -3
  246. package/dist/core/orchestration/contracts.d.ts.map +1 -1
  247. package/dist/core/orchestration/contracts.js +0 -1
  248. package/dist/core/orchestration/contracts.js.map +1 -1
  249. package/dist/core/orchestration/delegation-ledger.d.ts +1 -0
  250. package/dist/core/orchestration/delegation-ledger.d.ts.map +1 -1
  251. package/dist/core/orchestration/delegation-ledger.js +3 -0
  252. package/dist/core/orchestration/delegation-ledger.js.map +1 -1
  253. package/dist/core/orchestration/event-store.d.ts +12 -10
  254. package/dist/core/orchestration/event-store.d.ts.map +1 -1
  255. package/dist/core/orchestration/event-store.js +94 -104
  256. package/dist/core/orchestration/event-store.js.map +1 -1
  257. package/dist/core/orchestration/lane-tool-manifests.d.ts +2 -2
  258. package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -1
  259. package/dist/core/orchestration/lane-tool-manifests.js +4 -1
  260. package/dist/core/orchestration/lane-tool-manifests.js.map +1 -1
  261. package/dist/core/orchestration/model-binding.d.ts +1 -1
  262. package/dist/core/orchestration/model-binding.d.ts.map +1 -1
  263. package/dist/core/orchestration/model-binding.js +1 -1
  264. package/dist/core/orchestration/model-binding.js.map +1 -1
  265. package/dist/core/orchestration/policy-compiler.d.ts.map +1 -1
  266. package/dist/core/orchestration/policy-compiler.js +8 -9
  267. package/dist/core/orchestration/policy-compiler.js.map +1 -1
  268. package/dist/core/orchestration/profile-registry.d.ts.map +1 -1
  269. package/dist/core/orchestration/profile-registry.js +4 -10
  270. package/dist/core/orchestration/profile-registry.js.map +1 -1
  271. package/dist/core/orchestration/task-profile-writer.js +1 -1
  272. package/dist/core/orchestration/task-profile-writer.js.map +1 -1
  273. package/dist/core/orchestration/task-runtime.d.ts +1 -0
  274. package/dist/core/orchestration/task-runtime.d.ts.map +1 -1
  275. package/dist/core/orchestration/task-runtime.js +58 -3
  276. package/dist/core/orchestration/task-runtime.js.map +1 -1
  277. package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -1
  278. package/dist/core/orchestration/worker-execution-contract.js +10 -17
  279. package/dist/core/orchestration/worker-execution-contract.js.map +1 -1
  280. package/dist/core/process-matrix/runtime.d.ts +15 -1
  281. package/dist/core/process-matrix/runtime.d.ts.map +1 -1
  282. package/dist/core/process-matrix/runtime.js +55 -34
  283. package/dist/core/process-matrix/runtime.js.map +1 -1
  284. package/dist/core/reflection-controller.d.ts +4 -3
  285. package/dist/core/reflection-controller.d.ts.map +1 -1
  286. package/dist/core/reflection-controller.js +2 -2
  287. package/dist/core/reflection-controller.js.map +1 -1
  288. package/dist/core/research/model-fitness-controller.js +1 -1
  289. package/dist/core/research/model-fitness-controller.js.map +1 -1
  290. package/dist/core/research/research-lane-controller.d.ts +2 -2
  291. package/dist/core/research/research-lane-controller.d.ts.map +1 -1
  292. package/dist/core/research/research-lane-controller.js +1 -1
  293. package/dist/core/research/research-lane-controller.js.map +1 -1
  294. package/dist/core/resource-loader.d.ts +10 -19
  295. package/dist/core/resource-loader.d.ts.map +1 -1
  296. package/dist/core/resource-loader.js +8 -70
  297. package/dist/core/resource-loader.js.map +1 -1
  298. package/dist/core/risk-classifier.js +3 -3
  299. package/dist/core/risk-classifier.js.map +1 -1
  300. package/dist/core/runtime-builder.d.ts +4 -1
  301. package/dist/core/runtime-builder.d.ts.map +1 -1
  302. package/dist/core/runtime-builder.js +47 -18
  303. package/dist/core/runtime-builder.js.map +1 -1
  304. package/dist/core/scout-controller.d.ts +1 -1
  305. package/dist/core/scout-controller.d.ts.map +1 -1
  306. package/dist/core/scout-controller.js +1 -1
  307. package/dist/core/scout-controller.js.map +1 -1
  308. package/dist/core/sdk.d.ts +2 -2
  309. package/dist/core/sdk.d.ts.map +1 -1
  310. package/dist/core/sdk.js +3 -3
  311. package/dist/core/sdk.js.map +1 -1
  312. package/dist/core/secrets/bitwarden-credential-storage.d.ts +51 -0
  313. package/dist/core/secrets/bitwarden-credential-storage.d.ts.map +1 -0
  314. package/dist/core/secrets/bitwarden-credential-storage.js +345 -0
  315. package/dist/core/secrets/bitwarden-credential-storage.js.map +1 -0
  316. package/dist/core/secrets/credential-exposure-guard.d.ts +8 -4
  317. package/dist/core/secrets/credential-exposure-guard.d.ts.map +1 -1
  318. package/dist/core/secrets/credential-exposure-guard.js +31 -29
  319. package/dist/core/secrets/credential-exposure-guard.js.map +1 -1
  320. package/dist/core/secrets/credential-manager.d.ts +109 -0
  321. package/dist/core/secrets/credential-manager.d.ts.map +1 -0
  322. package/dist/core/secrets/credential-manager.js +384 -0
  323. package/dist/core/secrets/credential-manager.js.map +1 -0
  324. package/dist/core/secrets/credential-project.d.ts +4 -0
  325. package/dist/core/secrets/credential-project.d.ts.map +1 -0
  326. package/dist/core/secrets/credential-project.js +145 -0
  327. package/dist/core/secrets/credential-project.js.map +1 -0
  328. package/dist/core/secrets/secret-dotenv.d.ts +1 -1
  329. package/dist/core/secrets/secret-dotenv.js +1 -1
  330. package/dist/core/secrets/secret-dotenv.js.map +1 -1
  331. package/dist/core/security/context-threat-scanner.d.ts +14 -0
  332. package/dist/core/security/context-threat-scanner.d.ts.map +1 -0
  333. package/dist/core/security/context-threat-scanner.js +71 -0
  334. package/dist/core/security/context-threat-scanner.js.map +1 -0
  335. package/dist/core/session-supervision-runtime.d.ts +4 -1
  336. package/dist/core/session-supervision-runtime.d.ts.map +1 -1
  337. package/dist/core/session-supervision-runtime.js +49 -11
  338. package/dist/core/session-supervision-runtime.js.map +1 -1
  339. package/dist/core/settings-manager.d.ts +4 -2
  340. package/dist/core/settings-manager.d.ts.map +1 -1
  341. package/dist/core/settings-manager.js +10 -6
  342. package/dist/core/settings-manager.js.map +1 -1
  343. package/dist/core/slash-commands.d.ts.map +1 -1
  344. package/dist/core/slash-commands.js +1 -0
  345. package/dist/core/slash-commands.js.map +1 -1
  346. package/dist/core/system-prompt.js +1 -1
  347. package/dist/core/system-prompt.js.map +1 -1
  348. package/dist/core/tool-capability-policy.js +2 -2
  349. package/dist/core/tool-capability-policy.js.map +1 -1
  350. package/dist/core/tool-recovery-logger.js +1 -1
  351. package/dist/core/tool-recovery-logger.js.map +1 -1
  352. package/dist/core/tools/artifact-retrieve.js +1 -1
  353. package/dist/core/tools/artifact-retrieve.js.map +1 -1
  354. package/dist/core/tools/bash.d.ts +2 -2
  355. package/dist/core/tools/bash.d.ts.map +1 -1
  356. package/dist/core/tools/bash.js +16 -4
  357. package/dist/core/tools/bash.js.map +1 -1
  358. package/dist/core/tools/delegate.d.ts +29 -1
  359. package/dist/core/tools/delegate.d.ts.map +1 -1
  360. package/dist/core/tools/delegate.js +179 -28
  361. package/dist/core/tools/delegate.js.map +1 -1
  362. package/dist/core/tools/extensionify-runtime.d.ts +44 -0
  363. package/dist/core/tools/extensionify-runtime.d.ts.map +1 -0
  364. package/dist/core/tools/extensionify-runtime.js +115 -0
  365. package/dist/core/tools/extensionify-runtime.js.map +1 -0
  366. package/dist/core/tools/extensionify.d.ts +9 -30
  367. package/dist/core/tools/extensionify.d.ts.map +1 -1
  368. package/dist/core/tools/extensionify.js +10 -140
  369. package/dist/core/tools/extensionify.js.map +1 -1
  370. package/dist/core/tools/find.d.ts +1 -1
  371. package/dist/core/tools/find.d.ts.map +1 -1
  372. package/dist/core/tools/find.js +1 -1
  373. package/dist/core/tools/find.js.map +1 -1
  374. package/dist/core/tools/git-filter.d.ts +1 -0
  375. package/dist/core/tools/git-filter.d.ts.map +1 -1
  376. package/dist/core/tools/git-filter.js +1 -1
  377. package/dist/core/tools/git-filter.js.map +1 -1
  378. package/dist/core/tools/index.d.ts +2 -4
  379. package/dist/core/tools/index.d.ts.map +1 -1
  380. package/dist/core/tools/index.js +7 -43
  381. package/dist/core/tools/index.js.map +1 -1
  382. package/dist/core/tools/ls.d.ts +1 -1
  383. package/dist/core/tools/ls.d.ts.map +1 -1
  384. package/dist/core/tools/ls.js +1 -1
  385. package/dist/core/tools/ls.js.map +1 -1
  386. package/dist/core/tools/output-accumulator.d.ts +1 -1
  387. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  388. package/dist/core/tools/output-accumulator.js +1 -1
  389. package/dist/core/tools/output-accumulator.js.map +1 -1
  390. package/dist/core/tools/profile-writer.js +3 -3
  391. package/dist/core/tools/profile-writer.js.map +1 -1
  392. package/dist/core/tools/python.d.ts +2 -0
  393. package/dist/core/tools/python.d.ts.map +1 -1
  394. package/dist/core/tools/python.js +17 -12
  395. package/dist/core/tools/python.js.map +1 -1
  396. package/dist/core/tools/render-utils.js +1 -1
  397. package/dist/core/tools/render-utils.js.map +1 -1
  398. package/dist/core/tools/run-process.d.ts +2 -0
  399. package/dist/core/tools/run-process.d.ts.map +1 -1
  400. package/dist/core/tools/run-process.js +7 -3
  401. package/dist/core/tools/run-process.js.map +1 -1
  402. package/dist/core/tools/search-command-guard.d.ts +8 -0
  403. package/dist/core/tools/search-command-guard.d.ts.map +1 -1
  404. package/dist/core/tools/search-command-guard.js +54 -0
  405. package/dist/core/tools/search-command-guard.js.map +1 -1
  406. package/dist/core/tools/secret-store.d.ts +8 -18
  407. package/dist/core/tools/secret-store.d.ts.map +1 -1
  408. package/dist/core/tools/secret-store.js +83 -348
  409. package/dist/core/tools/secret-store.js.map +1 -1
  410. package/dist/core/tools/shell-contract-router.d.ts.map +1 -1
  411. package/dist/core/tools/shell-contract-router.js +9 -4
  412. package/dist/core/tools/shell-contract-router.js.map +1 -1
  413. package/dist/core/tools/shell-session.d.ts.map +1 -1
  414. package/dist/core/tools/shell-session.js +6 -4
  415. package/dist/core/tools/shell-session.js.map +1 -1
  416. package/dist/core/tools/tool-definition-factory.d.ts +32 -0
  417. package/dist/core/tools/tool-definition-factory.d.ts.map +1 -0
  418. package/dist/core/tools/tool-definition-factory.js +55 -0
  419. package/dist/core/tools/tool-definition-factory.js.map +1 -0
  420. package/dist/core/util/atomic-file.d.ts.map +1 -1
  421. package/dist/core/util/atomic-file.js +79 -32
  422. package/dist/core/util/atomic-file.js.map +1 -1
  423. package/dist/index.d.ts +5 -2
  424. package/dist/index.d.ts.map +1 -1
  425. package/dist/index.js +5 -2
  426. package/dist/index.js.map +1 -1
  427. package/dist/main.d.ts +2 -0
  428. package/dist/main.d.ts.map +1 -1
  429. package/dist/main.js +24 -18
  430. package/dist/main.js.map +1 -1
  431. package/dist/modes/interactive/auto-learn-controller.js +1 -1
  432. package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
  433. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  434. package/dist/modes/interactive/components/settings-selector.js +35 -14
  435. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  436. package/dist/modes/interactive/components/tool-execution.js +1 -1
  437. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  438. package/dist/modes/interactive/interactive-event-controller.js +1 -1
  439. package/dist/modes/interactive/interactive-event-controller.js.map +1 -1
  440. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  441. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  442. package/dist/modes/interactive/interactive-mode.js +27 -4
  443. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  444. package/dist/modes/interactive/secret-menu-controller.d.ts +21 -0
  445. package/dist/modes/interactive/secret-menu-controller.d.ts.map +1 -0
  446. package/dist/modes/interactive/secret-menu-controller.js +276 -0
  447. package/dist/modes/interactive/secret-menu-controller.js.map +1 -0
  448. package/dist/utils/child-process.js +1 -1
  449. package/dist/utils/child-process.js.map +1 -1
  450. package/dist/utils/tools-manager.d.ts +2 -1
  451. package/dist/utils/tools-manager.d.ts.map +1 -1
  452. package/dist/utils/tools-manager.js +43 -48
  453. package/dist/utils/tools-manager.js.map +1 -1
  454. package/dist/utils/zip-extractor.d.ts +8 -0
  455. package/dist/utils/zip-extractor.d.ts.map +1 -0
  456. package/dist/utils/zip-extractor.js +275 -0
  457. package/dist/utils/zip-extractor.js.map +1 -0
  458. package/docs/harness-architecture.md +34 -22
  459. package/docs/index.md +1 -1
  460. package/docs/resources.md +1 -1
  461. package/docs/settings.md +39 -103
  462. package/docs/usage.md +7 -5
  463. package/docs/worker-profiles.md +9 -7
  464. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  465. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  466. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  467. package/examples/extensions/sandbox/package-lock.json +2 -2
  468. package/examples/extensions/sandbox/package.json +1 -1
  469. package/examples/extensions/with-deps/package-lock.json +2 -2
  470. package/examples/extensions/with-deps/package.json +1 -1
  471. package/npm-shrinkwrap.json +12 -12
  472. package/package.json +7 -5
  473. package/dist/core/secrets/secret-vault-format.d.ts +0 -112
  474. package/dist/core/secrets/secret-vault-format.d.ts.map +0 -1
  475. package/dist/core/secrets/secret-vault-format.js +0 -396
  476. package/dist/core/secrets/secret-vault-format.js.map +0 -1
  477. package/dist/core/secrets/secret-vault.d.ts +0 -72
  478. package/dist/core/secrets/secret-vault.d.ts.map +0 -1
  479. package/dist/core/secrets/secret-vault.js +0 -663
  480. package/dist/core/secrets/secret-vault.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"compaction-support.js","sourceRoot":"","sources":["../../src/core/compaction-support.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Compaction support: summarizer model selection (#30 cost guard), request-auth resolution\n * with session-model fallback, and window-adapted compaction settings.\n *\n * This is the policy half of compaction. CompactionController owns detection, execution, retry,\n * persistence, notification, and cancellation; AgentSession keeps compatibility delegations at\n * established regression seams.\n */\nimport type { ThinkingLevel } from \"@caupulican/pi-agent-core\";\nimport { type CompactionSettings, summarizerCanIngest } from \"@caupulican/pi-agent-core/node\";\nimport type { Api, Model } from \"@caupulican/pi-ai\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\nimport { resolveCliModel } from \"./model-resolver.ts\";\nimport { evaluateSurfaceFitness } from \"./model-router/fitness-gate.ts\";\nimport type { RequestAuth } from \"./request-auth.ts\";\nimport type { ModelFitnessReport } from \"./research/model-fitness.ts\";\nimport type { SettingsManager } from \"./settings-manager.ts\";\n\nexport interface CompactionSupportDeps {\n\tgetModel(): Model<Api> | undefined;\n\tgetSettingsManager(): SettingsManager;\n\tgetModelRegistry(): ModelRegistry;\n\t/** True when the agent's streamFn is (or wraps) the raw streamSimple — auth must be explicit then. */\n\tisRawStream(): boolean;\n\t/** Host auth resolution that THROWS with a user-actionable message when no key exists. */\n\tgetRequiredRequestAuth(model: Model<Api>): Promise<RequestAuth>;\n\tisModelExhausted(ref: string): boolean;\n\tgetStoredFitnessReport(ref: string): ModelFitnessReport | undefined;\n\t/** Estimated tokens of the summarization input (live context; over-estimates, which is safe). */\n\testimateSummarizationInputTokens(): number;\n\temitWarning(message: string): void;\n\t/**\n\t * The same readiness/residency gate every other isolated consumer uses\n\t * (LocalRuntimeController.ensureIsolatedModelReady) before this model is used for an\n\t * out-of-band call. No-ops for a non-managed-local model (checked internally by the gate);\n\t * throws with a user-actionable reason when a managed-local model cannot be made ready.\n\t */\n\tensureModelReady(model: Model<Api>): Promise<void>;\n}\n\nexport class CompactionSupport {\n\tprivate readonly deps: CompactionSupportDeps;\n\tprivate lastSelectionReason: string | undefined;\n\n\tconstructor(deps: CompactionSupportDeps) {\n\t\tthis.deps = deps;\n\t}\n\n\tgetLastSelectionReason(): string | undefined {\n\t\treturn this.lastSelectionReason;\n\t}\n\n\tgetAdaptedSettings(): CompactionSettings {\n\t\tconst settings = this.deps.getSettingsManager().getCompactionSettings();\n\t\tconst model = this.deps.getModel();\n\t\tif (!model) return settings;\n\t\tconst contextWindow = model.contextWindow ?? 0;\n\t\tif (contextWindow <= 0) return settings;\n\n\t\t// Adapt reserveTokens: at most 25% of context window\n\t\tconst maxReserve = Math.floor(contextWindow * 0.25);\n\t\tconst reserveTokens = Math.min(settings.reserveTokens, maxReserve);\n\n\t\t// Adapt keepRecentTokens: at most 50% of context window\n\t\tconst maxKeepRecent = Math.floor(contextWindow * 0.5);\n\t\tconst keepRecentTokens = Math.min(settings.keepRecentTokens, maxKeepRecent);\n\n\t\treturn {\n\t\t\t...settings,\n\t\t\treserveTokens,\n\t\t\tkeepRecentTokens,\n\t\t};\n\t}\n\n\tasync getRequestAuth(model: Model<Api>): Promise<RequestAuth> {\n\t\tif (this.deps.isRawStream()) {\n\t\t\treturn this.deps.getRequiredRequestAuth(model);\n\t\t}\n\n\t\tconst result = await this.deps.getModelRegistry().getApiKeyAndHeaders(model);\n\t\treturn result.ok ? { apiKey: result.apiKey, headers: result.headers } : {};\n\t}\n\n\t/**\n\t * Readiness/residency gate a candidate summarizer model right before it is handed back for\n\t * use. A no-op for a non-managed-local model (checked internally by\n\t * {@link CompactionSupportDeps.ensureModelReady}); a managed-local model that cannot be made\n\t * ready (server down, model missing, residency refused) returns its failure reason instead of\n\t * throwing, so callers can still try the next candidate in the existing auth-fallback ladder\n\t * rather than aborting resolution outright.\n\t */\n\tprivate async readinessFailure(model: Model<Api>): Promise<string | undefined> {\n\t\ttry {\n\t\t\tawait this.deps.ensureModelReady(model);\n\t\t\treturn undefined;\n\t\t} catch (error) {\n\t\t\treturn error instanceof Error ? error.message : String(error);\n\t\t}\n\t}\n\n\t/**\n\t * Resolve the summarizer model AND its request auth for auto-compaction. The cheap auxiliary\n\t * model (#30) can be nominally available yet fail key resolution at request time (expired\n\t * OAuth, revoked key) — or, for a managed-local model, fail the readiness/residency gate (\n\t * server down, model not installed, residency refused). Falling back to the session model keeps\n\t * auto-compaction working in exactly the situations where manual /compact works; only when\n\t * neither resolves do we fail — and then with a concrete message instead of a silent no-op or a\n\t * bypass of the readiness gate.\n\t */\n\tasync resolveModelAndAuth(\n\t\tcompactionModel: Model<Api>,\n\t\tsessionModel: Model<Api>,\n\t): Promise<{ model: Model<Api>; apiKey?: string; headers?: Record<string, string>; failure?: string }> {\n\t\tif (this.deps.isRawStream()) {\n\t\t\tconst registry = this.deps.getModelRegistry();\n\t\t\tlet auth = await registry.getApiKeyAndHeaders(compactionModel);\n\t\t\tlet readiness: string | undefined;\n\t\t\tif (registry.canUseResolvedRequestAuth(compactionModel, auth)) {\n\t\t\t\treadiness = await this.readinessFailure(compactionModel);\n\t\t\t\tif (!readiness) return { model: compactionModel, apiKey: auth.apiKey, headers: auth.headers };\n\t\t\t}\n\t\t\tconst isSameModel =\n\t\t\t\tcompactionModel.provider === sessionModel.provider && compactionModel.id === sessionModel.id;\n\t\t\tif (!isSameModel) {\n\t\t\t\tauth = await registry.getApiKeyAndHeaders(sessionModel);\n\t\t\t\tif (registry.canUseResolvedRequestAuth(sessionModel, auth)) {\n\t\t\t\t\treadiness = await this.readinessFailure(sessionModel);\n\t\t\t\t\tif (!readiness) return { model: sessionModel, apiKey: auth.apiKey, headers: auth.headers };\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tmodel: sessionModel,\n\t\t\t\tfailure: readiness\n\t\t\t\t\t? `summarizer ${isSameModel ? compactionModel.id : sessionModel.id} not ready: ${readiness}`\n\t\t\t\t\t: `no usable request authentication for the summarizer (tried ${compactionModel.id}${isSameModel ? \"\" : ` and ${sessionModel.id}`})`,\n\t\t\t};\n\t\t}\n\n\t\t// Custom streamFn owns auth injection (CLI path) — resolve best-effort, never fail on auth\n\t\t// here; a managed-local summarizer must still pass the readiness gate before compact() runs.\n\t\tconst { apiKey, headers } = await this.getRequestAuth(compactionModel);\n\t\tconst readiness = await this.readinessFailure(compactionModel);\n\t\tif (readiness) {\n\t\t\treturn {\n\t\t\t\tmodel: compactionModel,\n\t\t\t\tapiKey,\n\t\t\t\theaders,\n\t\t\t\tfailure: `summarizer ${compactionModel.id} not ready: ${readiness}`,\n\t\t\t};\n\t\t}\n\t\treturn { model: compactionModel, apiKey, headers };\n\t}\n\n\tprivate getExplicitCompactionModelSetting(): string | undefined {\n\t\tconst setting = this.deps.getSettingsManager().getCompactionModel().trim();\n\t\treturn setting && setting !== \"auto\" ? setting : undefined;\n\t}\n\n\tprivate modelRef(model: Model<Api>): string {\n\t\treturn `${model.provider}/${model.id}`;\n\t}\n\n\tprivate resolveConfiguredModel(pattern: string): { model?: Model<Api>; cause?: \"unresolved\" | \"unauthed\" } {\n\t\tconst registry = this.deps.getModelRegistry();\n\t\tconst resolved = resolveCliModel({ cliModel: pattern, modelRegistry: registry });\n\t\tif (!resolved.model) return { cause: \"unresolved\" };\n\t\tif (!registry.hasConfiguredAuth(resolved.model)) return { cause: \"unauthed\" };\n\t\treturn { model: resolved.model };\n\t}\n\n\tprivate selectConfiguredModel(pattern: string): { model?: Model<Api>; cause?: string } {\n\t\tconst resolved = this.resolveConfiguredModel(pattern);\n\t\tif (!resolved.model) return { cause: resolved.cause };\n\t\tif (this.deps.isModelExhausted(this.modelRef(resolved.model))) return { cause: \"exhausted\" };\n\t\treturn { model: resolved.model };\n\t}\n\n\tprivate effectiveContextWindow(model: Model<Api>): number {\n\t\tconst registered = model.contextWindow > 0 ? model.contextWindow : Number.POSITIVE_INFINITY;\n\t\tconst served = this.deps.getStoredFitnessReport(this.modelRef(model))?.capacity?.servedContextWindow;\n\t\treturn served && served > 0 ? Math.min(registered, served) : registered;\n\t}\n\n\tprivate modelWithEffectiveWindow(model: Model<Api>): Model<Api> {\n\t\tconst contextWindow = this.effectiveContextWindow(model);\n\t\treturn contextWindow === model.contextWindow ? model : { ...model, contextWindow };\n\t}\n\n\tprivate resolveDefaultModel(sessionModel: Model<Api>): Model<Api> {\n\t\tconst router = this.deps.getSettingsManager().getModelRouterSettings();\n\t\tif (!router.enabled || !router.cheapModel) {\n\t\t\tthis.lastSelectionReason = \"session_default\";\n\t\t\treturn sessionModel;\n\t\t}\n\t\tconst selected = this.selectConfiguredModel(router.cheapModel);\n\t\tif (!selected.model) {\n\t\t\tthis.lastSelectionReason = `fallback:${selected.cause}`;\n\t\t\treturn sessionModel;\n\t\t}\n\t\t// Capacity is a hard constraint, independent of the fitness doctrine: a summarizer whose\n\t\t// window cannot hold the actual span produces recall-empty checkpoints (local servers\n\t\t// silently truncate over-window prompts instead of erroring), and the verification gate\n\t\t// then fails deterministically.\n\t\tconst estimatedInputTokens = this.deps.estimateSummarizationInputTokens();\n\t\tconst effectiveWindow = this.effectiveContextWindow(selected.model);\n\t\tif (!summarizerCanIngest(this.modelWithEffectiveWindow(selected.model), estimatedInputTokens)) {\n\t\t\tthis.lastSelectionReason = `fallback:window_too_small(~${Math.ceil(estimatedInputTokens / 1000)}k input vs ${effectiveWindow} window)`;\n\t\t\treturn sessionModel;\n\t\t}\n\t\tconst fitness = this.deps.getStoredFitnessReport(this.modelRef(selected.model));\n\t\tconst verdict = evaluateSurfaceFitness(\"compaction\", fitness);\n\t\tif (!verdict.fit) {\n\t\t\tthis.lastSelectionReason =\n\t\t\t\tverdict.reason === \"lane_failed\"\n\t\t\t\t\t? `fallback:digest_unfit(${verdict.succeeded}/${verdict.total})`\n\t\t\t\t\t: \"fallback:unprobed\";\n\t\t\treturn sessionModel;\n\t\t}\n\t\tthis.lastSelectionReason = \"router_cheap\";\n\t\treturn selected.model;\n\t}\n\n\tprivate modelsAreEqual(left: Model<Api>, right: Model<Api>): boolean {\n\t\treturn left.provider === right.provider && left.id === right.id;\n\t}\n\n\t/**\n\t * Resolve the model used to SUMMARIZE during compaction. Selection:\n\t * - an explicit `compaction.model` setting wins, but only if its provider is authed (else fall back);\n\t * - `\"auto\"`/unset follows the model router's configured cheap model when the router is enabled;\n\t * - otherwise the session model is used (safe default).\n\t */\n\tresolveModel(sessionModel: Model<Api>): Model<Api> {\n\t\tconst explicitSetting = this.getExplicitCompactionModelSetting();\n\t\tif (explicitSetting) {\n\t\t\tconst selected = this.selectConfiguredModel(explicitSetting);\n\t\t\tthis.lastSelectionReason = selected.model ? \"explicit\" : `fallback:${selected.cause}`;\n\t\t\tif (!selected.model) this.deps.emitWarning(`Compaction summarizer ${this.lastSelectionReason}`);\n\t\t\t// An explicit user choice is honored (Class C doctrine), but silently sending an\n\t\t\t// over-window prompt yields a recall-empty summary — warn with the numbers.\n\t\t\tif (selected.model) {\n\t\t\t\tconst estimatedInputTokens = this.deps.estimateSummarizationInputTokens();\n\t\t\t\tconst effectiveWindow = this.effectiveContextWindow(selected.model);\n\t\t\t\tif (!summarizerCanIngest(this.modelWithEffectiveWindow(selected.model), estimatedInputTokens)) {\n\t\t\t\t\tthis.deps.emitWarning(\n\t\t\t\t\t\t`Compaction summarizer (explicit setting) likely cannot ingest the current context: ~${Math.ceil(estimatedInputTokens / 1000)}k input tokens vs a ${effectiveWindow}-token window`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn selected.model ?? sessionModel;\n\t\t}\n\t\tconst model = this.resolveDefaultModel(sessionModel);\n\t\tif (this.lastSelectionReason?.startsWith(\"fallback:\")) {\n\t\t\tthis.deps.emitWarning(`Compaction summarizer ${this.lastSelectionReason}`);\n\t\t}\n\t\treturn model;\n\t}\n\n\t/** Default compaction should never inherit expensive session thinking. */\n\tresolveThinkingLevel(\n\t\tsessionThinkingLevel: ThinkingLevel | undefined,\n\t\tcompactionModel: Model<Api>,\n\t\tsessionModel: Model<Api>,\n\t): ThinkingLevel | undefined {\n\t\tif (this.getExplicitCompactionModelSetting()) return sessionThinkingLevel;\n\n\t\tconst router = this.deps.getSettingsManager().getModelRouterSettings();\n\t\tif (router.enabled && router.cheapModel) {\n\t\t\tconst routerModel = this.resolveConfiguredModel(router.cheapModel).model;\n\t\t\tif (routerModel && this.modelsAreEqual(routerModel, compactionModel)) {\n\t\t\t\treturn router.cheapThinking ?? \"low\";\n\t\t\t}\n\t\t}\n\n\t\treturn this.modelsAreEqual(compactionModel, sessionModel) ? \"low\" : sessionThinkingLevel;\n\t}\n}\n"]}
1
+ {"version":3,"file":"compaction-support.js","sourceRoot":"","sources":["../../src/core/compaction-support.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Compaction support: summarizer model selection (#30 cost guard), request-auth resolution\n * with session-model fallback, and window-adapted compaction settings.\n *\n * This is the policy half of compaction. CompactionController owns detection, execution, retry,\n * persistence, notification, and cancellation; AgentSession keeps compatibility delegations at\n * established regression seams.\n */\nimport { type CompactionSettings, summarizerCanIngest } from \"@caupulican/pi-agent-core/compaction/compaction\";\nimport type { ThinkingLevel } from \"@caupulican/pi-agent-core/types\";\nimport type { Api, Model } from \"@caupulican/pi-ai\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\nimport { resolveCliModel } from \"./model-resolver.ts\";\nimport { evaluateSurfaceFitness } from \"./model-router/fitness-gate.ts\";\nimport type { RequestAuth } from \"./request-auth.ts\";\nimport type { ModelFitnessReport } from \"./research/model-fitness.ts\";\nimport type { SettingsManager } from \"./settings-manager.ts\";\n\nexport interface CompactionSupportDeps {\n\tgetModel(): Model<Api> | undefined;\n\tgetSettingsManager(): SettingsManager;\n\tgetModelRegistry(): ModelRegistry;\n\t/** True when the agent's streamFn is (or wraps) the raw streamSimple — auth must be explicit then. */\n\tisRawStream(): boolean;\n\t/** Host auth resolution that THROWS with a user-actionable message when no key exists. */\n\tgetRequiredRequestAuth(model: Model<Api>): Promise<RequestAuth>;\n\tisModelExhausted(ref: string): boolean;\n\tgetStoredFitnessReport(ref: string): ModelFitnessReport | undefined;\n\t/** Estimated tokens of the summarization input (live context; over-estimates, which is safe). */\n\testimateSummarizationInputTokens(): number;\n\temitWarning(message: string): void;\n\t/**\n\t * The same readiness/residency gate every other isolated consumer uses\n\t * (LocalRuntimeController.ensureIsolatedModelReady) before this model is used for an\n\t * out-of-band call. No-ops for a non-managed-local model (checked internally by the gate);\n\t * throws with a user-actionable reason when a managed-local model cannot be made ready.\n\t */\n\tensureModelReady(model: Model<Api>): Promise<void>;\n}\n\nexport class CompactionSupport {\n\tprivate readonly deps: CompactionSupportDeps;\n\tprivate lastSelectionReason: string | undefined;\n\n\tconstructor(deps: CompactionSupportDeps) {\n\t\tthis.deps = deps;\n\t}\n\n\tgetLastSelectionReason(): string | undefined {\n\t\treturn this.lastSelectionReason;\n\t}\n\n\tgetAdaptedSettings(): CompactionSettings {\n\t\tconst settings = this.deps.getSettingsManager().getCompactionSettings();\n\t\tconst model = this.deps.getModel();\n\t\tif (!model) return settings;\n\t\tconst contextWindow = model.contextWindow ?? 0;\n\t\tif (contextWindow <= 0) return settings;\n\n\t\t// Adapt reserveTokens: at most 25% of context window\n\t\tconst maxReserve = Math.floor(contextWindow * 0.25);\n\t\tconst reserveTokens = Math.min(settings.reserveTokens, maxReserve);\n\n\t\t// Adapt keepRecentTokens: at most 50% of context window\n\t\tconst maxKeepRecent = Math.floor(contextWindow * 0.5);\n\t\tconst keepRecentTokens = Math.min(settings.keepRecentTokens, maxKeepRecent);\n\n\t\treturn {\n\t\t\t...settings,\n\t\t\treserveTokens,\n\t\t\tkeepRecentTokens,\n\t\t};\n\t}\n\n\tasync getRequestAuth(model: Model<Api>): Promise<RequestAuth> {\n\t\tif (this.deps.isRawStream()) {\n\t\t\treturn this.deps.getRequiredRequestAuth(model);\n\t\t}\n\n\t\tconst result = await this.deps.getModelRegistry().getApiKeyAndHeaders(model);\n\t\treturn result.ok ? { apiKey: result.apiKey, headers: result.headers } : {};\n\t}\n\n\t/**\n\t * Readiness/residency gate a candidate summarizer model right before it is handed back for\n\t * use. A no-op for a non-managed-local model (checked internally by\n\t * {@link CompactionSupportDeps.ensureModelReady}); a managed-local model that cannot be made\n\t * ready (server down, model missing, residency refused) returns its failure reason instead of\n\t * throwing, so callers can still try the next candidate in the existing auth-fallback ladder\n\t * rather than aborting resolution outright.\n\t */\n\tprivate async readinessFailure(model: Model<Api>): Promise<string | undefined> {\n\t\ttry {\n\t\t\tawait this.deps.ensureModelReady(model);\n\t\t\treturn undefined;\n\t\t} catch (error) {\n\t\t\treturn error instanceof Error ? error.message : String(error);\n\t\t}\n\t}\n\n\t/**\n\t * Resolve the summarizer model AND its request auth for auto-compaction. The cheap auxiliary\n\t * model (#30) can be nominally available yet fail key resolution at request time (expired\n\t * OAuth, revoked key) — or, for a managed-local model, fail the readiness/residency gate (\n\t * server down, model not installed, residency refused). Falling back to the session model keeps\n\t * auto-compaction working in exactly the situations where manual /compact works; only when\n\t * neither resolves do we fail — and then with a concrete message instead of a silent no-op or a\n\t * bypass of the readiness gate.\n\t */\n\tasync resolveModelAndAuth(\n\t\tcompactionModel: Model<Api>,\n\t\tsessionModel: Model<Api>,\n\t): Promise<{ model: Model<Api>; apiKey?: string; headers?: Record<string, string>; failure?: string }> {\n\t\tif (this.deps.isRawStream()) {\n\t\t\tconst registry = this.deps.getModelRegistry();\n\t\t\tlet auth = await registry.getApiKeyAndHeaders(compactionModel);\n\t\t\tlet readiness: string | undefined;\n\t\t\tif (registry.canUseResolvedRequestAuth(compactionModel, auth)) {\n\t\t\t\treadiness = await this.readinessFailure(compactionModel);\n\t\t\t\tif (!readiness) return { model: compactionModel, apiKey: auth.apiKey, headers: auth.headers };\n\t\t\t}\n\t\t\tconst isSameModel =\n\t\t\t\tcompactionModel.provider === sessionModel.provider && compactionModel.id === sessionModel.id;\n\t\t\tif (!isSameModel) {\n\t\t\t\tauth = await registry.getApiKeyAndHeaders(sessionModel);\n\t\t\t\tif (registry.canUseResolvedRequestAuth(sessionModel, auth)) {\n\t\t\t\t\treadiness = await this.readinessFailure(sessionModel);\n\t\t\t\t\tif (!readiness) return { model: sessionModel, apiKey: auth.apiKey, headers: auth.headers };\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tmodel: sessionModel,\n\t\t\t\tfailure: readiness\n\t\t\t\t\t? `summarizer ${isSameModel ? compactionModel.id : sessionModel.id} not ready: ${readiness}`\n\t\t\t\t\t: `no usable request authentication for the summarizer (tried ${compactionModel.id}${isSameModel ? \"\" : ` and ${sessionModel.id}`})`,\n\t\t\t};\n\t\t}\n\n\t\t// Custom streamFn owns auth injection (CLI path) — resolve best-effort, never fail on auth\n\t\t// here; a managed-local summarizer must still pass the readiness gate before compact() runs.\n\t\tconst { apiKey, headers } = await this.getRequestAuth(compactionModel);\n\t\tconst readiness = await this.readinessFailure(compactionModel);\n\t\tif (readiness) {\n\t\t\treturn {\n\t\t\t\tmodel: compactionModel,\n\t\t\t\tapiKey,\n\t\t\t\theaders,\n\t\t\t\tfailure: `summarizer ${compactionModel.id} not ready: ${readiness}`,\n\t\t\t};\n\t\t}\n\t\treturn { model: compactionModel, apiKey, headers };\n\t}\n\n\tprivate getExplicitCompactionModelSetting(): string | undefined {\n\t\tconst setting = this.deps.getSettingsManager().getCompactionModel().trim();\n\t\treturn setting && setting !== \"auto\" ? setting : undefined;\n\t}\n\n\tprivate modelRef(model: Model<Api>): string {\n\t\treturn `${model.provider}/${model.id}`;\n\t}\n\n\tprivate resolveConfiguredModel(pattern: string): { model?: Model<Api>; cause?: \"unresolved\" | \"unauthed\" } {\n\t\tconst registry = this.deps.getModelRegistry();\n\t\tconst resolved = resolveCliModel({ cliModel: pattern, modelRegistry: registry });\n\t\tif (!resolved.model) return { cause: \"unresolved\" };\n\t\tif (!registry.hasConfiguredAuth(resolved.model)) return { cause: \"unauthed\" };\n\t\treturn { model: resolved.model };\n\t}\n\n\tprivate selectConfiguredModel(pattern: string): { model?: Model<Api>; cause?: string } {\n\t\tconst resolved = this.resolveConfiguredModel(pattern);\n\t\tif (!resolved.model) return { cause: resolved.cause };\n\t\tif (this.deps.isModelExhausted(this.modelRef(resolved.model))) return { cause: \"exhausted\" };\n\t\treturn { model: resolved.model };\n\t}\n\n\tprivate effectiveContextWindow(model: Model<Api>): number {\n\t\tconst registered = model.contextWindow > 0 ? model.contextWindow : Number.POSITIVE_INFINITY;\n\t\tconst served = this.deps.getStoredFitnessReport(this.modelRef(model))?.capacity?.servedContextWindow;\n\t\treturn served && served > 0 ? Math.min(registered, served) : registered;\n\t}\n\n\tprivate modelWithEffectiveWindow(model: Model<Api>): Model<Api> {\n\t\tconst contextWindow = this.effectiveContextWindow(model);\n\t\treturn contextWindow === model.contextWindow ? model : { ...model, contextWindow };\n\t}\n\n\tprivate resolveDefaultModel(sessionModel: Model<Api>): Model<Api> {\n\t\tconst router = this.deps.getSettingsManager().getModelRouterSettings();\n\t\tif (!router.enabled || !router.cheapModel) {\n\t\t\tthis.lastSelectionReason = \"session_default\";\n\t\t\treturn sessionModel;\n\t\t}\n\t\tconst selected = this.selectConfiguredModel(router.cheapModel);\n\t\tif (!selected.model) {\n\t\t\tthis.lastSelectionReason = `fallback:${selected.cause}`;\n\t\t\treturn sessionModel;\n\t\t}\n\t\t// Capacity is a hard constraint, independent of the fitness doctrine: a summarizer whose\n\t\t// window cannot hold the actual span produces recall-empty checkpoints (local servers\n\t\t// silently truncate over-window prompts instead of erroring), and the verification gate\n\t\t// then fails deterministically.\n\t\tconst estimatedInputTokens = this.deps.estimateSummarizationInputTokens();\n\t\tconst effectiveWindow = this.effectiveContextWindow(selected.model);\n\t\tif (!summarizerCanIngest(this.modelWithEffectiveWindow(selected.model), estimatedInputTokens)) {\n\t\t\tthis.lastSelectionReason = `fallback:window_too_small(~${Math.ceil(estimatedInputTokens / 1000)}k input vs ${effectiveWindow} window)`;\n\t\t\treturn sessionModel;\n\t\t}\n\t\tconst fitness = this.deps.getStoredFitnessReport(this.modelRef(selected.model));\n\t\tconst verdict = evaluateSurfaceFitness(\"compaction\", fitness);\n\t\tif (!verdict.fit) {\n\t\t\tthis.lastSelectionReason =\n\t\t\t\tverdict.reason === \"lane_failed\"\n\t\t\t\t\t? `fallback:digest_unfit(${verdict.succeeded}/${verdict.total})`\n\t\t\t\t\t: \"fallback:unprobed\";\n\t\t\treturn sessionModel;\n\t\t}\n\t\tthis.lastSelectionReason = \"router_cheap\";\n\t\treturn selected.model;\n\t}\n\n\tprivate modelsAreEqual(left: Model<Api>, right: Model<Api>): boolean {\n\t\treturn left.provider === right.provider && left.id === right.id;\n\t}\n\n\t/**\n\t * Resolve the model used to SUMMARIZE during compaction. Selection:\n\t * - an explicit `compaction.model` setting wins, but only if its provider is authed (else fall back);\n\t * - `\"auto\"`/unset follows the model router's configured cheap model when the router is enabled;\n\t * - otherwise the session model is used (safe default).\n\t */\n\tresolveModel(sessionModel: Model<Api>): Model<Api> {\n\t\tconst explicitSetting = this.getExplicitCompactionModelSetting();\n\t\tif (explicitSetting) {\n\t\t\tconst selected = this.selectConfiguredModel(explicitSetting);\n\t\t\tthis.lastSelectionReason = selected.model ? \"explicit\" : `fallback:${selected.cause}`;\n\t\t\tif (!selected.model) this.deps.emitWarning(`Compaction summarizer ${this.lastSelectionReason}`);\n\t\t\t// An explicit user choice is honored (Class C doctrine), but silently sending an\n\t\t\t// over-window prompt yields a recall-empty summary — warn with the numbers.\n\t\t\tif (selected.model) {\n\t\t\t\tconst estimatedInputTokens = this.deps.estimateSummarizationInputTokens();\n\t\t\t\tconst effectiveWindow = this.effectiveContextWindow(selected.model);\n\t\t\t\tif (!summarizerCanIngest(this.modelWithEffectiveWindow(selected.model), estimatedInputTokens)) {\n\t\t\t\t\tthis.deps.emitWarning(\n\t\t\t\t\t\t`Compaction summarizer (explicit setting) likely cannot ingest the current context: ~${Math.ceil(estimatedInputTokens / 1000)}k input tokens vs a ${effectiveWindow}-token window`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn selected.model ?? sessionModel;\n\t\t}\n\t\tconst model = this.resolveDefaultModel(sessionModel);\n\t\tif (this.lastSelectionReason?.startsWith(\"fallback:\")) {\n\t\t\tthis.deps.emitWarning(`Compaction summarizer ${this.lastSelectionReason}`);\n\t\t}\n\t\treturn model;\n\t}\n\n\t/** Default compaction should never inherit expensive session thinking. */\n\tresolveThinkingLevel(\n\t\tsessionThinkingLevel: ThinkingLevel | undefined,\n\t\tcompactionModel: Model<Api>,\n\t\tsessionModel: Model<Api>,\n\t): ThinkingLevel | undefined {\n\t\tif (this.getExplicitCompactionModelSetting()) return sessionThinkingLevel;\n\n\t\tconst router = this.deps.getSettingsManager().getModelRouterSettings();\n\t\tif (router.enabled && router.cheapModel) {\n\t\t\tconst routerModel = this.resolveConfiguredModel(router.cheapModel).model;\n\t\t\tif (routerModel && this.modelsAreEqual(routerModel, compactionModel)) {\n\t\t\t\treturn router.cheapThinking ?? \"low\";\n\t\t\t}\n\t\t}\n\n\t\treturn this.modelsAreEqual(compactionModel, sessionModel) ? \"low\" : sessionThinkingLevel;\n\t}\n}\n"]}
@@ -11,7 +11,7 @@
11
11
  * already fits within the bound is still returned in full; the guarantee is "never more
12
12
  * than the configured hard bounds," not "never the whole artifact."
13
13
  */
14
- import { type TruncationResult } from "@caupulican/pi-agent-core/node";
14
+ import { type TruncationResult } from "@caupulican/pi-agent-core/truncate";
15
15
  import type { ArtifactStore } from "./context-artifacts.ts";
16
16
  import { type MissingArtifactReason } from "./context-artifacts.ts";
17
17
  import type { ContextArtifactRef } from "./context-item.ts";
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-retrieval.d.ts","sourceRoot":"","sources":["../../../src/core/context/artifact-retrieval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAqB,KAAK,gBAAgB,EAA8B,MAAM,gCAAgC,CAAC;AACtH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAA2B,KAAK,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjE,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,kFAAkF;AAClF,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,eAAO,MAAM,mBAAmB,QAAoB,CAAC;AAErD,MAAM,WAAW,wBAAwB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,qBAAqB,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,uBAAuB,GAChC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,aAAa,EAAE,qBAAqB,CAAA;CAAE,GACtD;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,kBAAkB,CAAA;CAAE,GAC1D;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,GAAG,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAQhH;;;;GAIG;AACH,wBAAgB,qBAAqB,CACpC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,wBAAwB,GAC/B,uBAAuB,CAqBzB"}
1
+ {"version":3,"file":"artifact-retrieval.d.ts","sourceRoot":"","sources":["../../../src/core/context/artifact-retrieval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAEN,KAAK,gBAAgB,EAGrB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAA2B,KAAK,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjE,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,kFAAkF;AAClF,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,eAAO,MAAM,mBAAmB,QAAoB,CAAC;AAErD,MAAM,WAAW,wBAAwB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,qBAAqB,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,uBAAuB,GAChC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,aAAa,EAAE,qBAAqB,CAAA;CAAE,GACtD;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,kBAAkB,CAAA;CAAE,GAC1D;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,GAAG,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAQhH;;;;GAIG;AACH,wBAAgB,qBAAqB,CACpC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,wBAAwB,GAC/B,uBAAuB,CAqBzB"}
@@ -11,7 +11,7 @@
11
11
  * already fits within the bound is still returned in full; the guarantee is "never more
12
12
  * than the configured hard bounds," not "never the whole artifact."
13
13
  */
14
- import { DEFAULT_MAX_BYTES, truncateHead, truncateTail } from "@caupulican/pi-agent-core/node";
14
+ import { DEFAULT_MAX_BYTES, truncateHead, truncateTail, } from "@caupulican/pi-agent-core/truncate";
15
15
  import { isMissingArtifactMarker } from "./context-artifacts.js";
16
16
  export const DEFAULT_RETRIEVAL_MAX_LINES = 200;
17
17
  /** Hard ceilings: a caller-requested maxLines/maxBytes can never exceed these. */
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-retrieval.js","sourceRoot":"","sources":["../../../src/core/context/artifact-retrieval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,iBAAiB,EAAyB,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEtH,OAAO,EAAE,uBAAuB,EAA8B,MAAM,wBAAwB,CAAC;AAK7F,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAE/C,kFAAkF;AAClF,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACxC,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAcrD,SAAS,kBAAkB,CAAC,SAA6B,EAAE,QAAgB,EAAE,WAAmB;IAC/F,MAAM,SAAS,GAAG,SAAS,IAAI,QAAQ,CAAC;IACxC,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACpC,KAAoB,EACpB,OAAiC;IAEjC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC;IACpC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,iBAAiB,GAAG;QACzB,QAAQ,EAAE,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,2BAA2B,EAAE,mBAAmB,CAAC;QAChG,QAAQ,EAAE,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,iBAAiB,EAAE,mBAAmB,CAAC;KACtF,CAAC;IACF,MAAM,UAAU,GACf,IAAI,KAAK,MAAM;QACd,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,CAAC;QACjD,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAEpD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;AACtF,CAAC","sourcesContent":["/**\n * Bounded artifact retrieval (Phase 8-style helper landing early, per D2b): resolve an\n * artifact id shown in a \"Full output: artifact tool-output:<id>\" notice back into a\n * small, useful slice. Per tool-output-artifacts.md's retrieval behavior: retrieve the\n * smallest useful slice by default (metadata, or a bounded head/tail).\n *\n * Bounds are hard limits, not just defaults: a caller-provided `maxLines`/`maxBytes` is\n * clamped to `MAX_RETRIEVAL_LINES`/`MAX_RETRIEVAL_BYTES` before use, so no caller --\n * including a future agent-facing tool wrapper -- can force a large artifact to be fully\n * rehydrated in one call by simply requesting a larger bound. A small artifact that\n * already fits within the bound is still returned in full; the guarantee is \"never more\n * than the configured hard bounds,\" not \"never the whole artifact.\"\n */\n\nimport { DEFAULT_MAX_BYTES, type TruncationResult, truncateHead, truncateTail } from \"@caupulican/pi-agent-core/node\";\nimport type { ArtifactStore } from \"./context-artifacts.ts\";\nimport { isMissingArtifactMarker, type MissingArtifactReason } from \"./context-artifacts.ts\";\nimport type { ContextArtifactRef } from \"./context-item.ts\";\n\nexport type ArtifactRetrievalMode = \"metadata\" | \"head\" | \"tail\";\n\nexport const DEFAULT_RETRIEVAL_MAX_LINES = 200;\n\n/** Hard ceilings: a caller-requested maxLines/maxBytes can never exceed these. */\nexport const MAX_RETRIEVAL_LINES = 2000;\nexport const MAX_RETRIEVAL_BYTES = DEFAULT_MAX_BYTES;\n\nexport interface ArtifactRetrievalRequest {\n\tartifactId: string;\n\tmode?: ArtifactRetrievalMode;\n\tmaxLines?: number;\n\tmaxBytes?: number;\n}\n\nexport type ArtifactRetrievalResult =\n\t| { found: false; missingReason: MissingArtifactReason }\n\t| { found: true; mode: \"metadata\"; ref: ContextArtifactRef }\n\t| { found: true; mode: \"head\" | \"tail\"; ref: ContextArtifactRef; slice: string; truncation: TruncationResult };\n\nfunction clampToHardCeiling(requested: number | undefined, fallback: number, hardCeiling: number): number {\n\tconst candidate = requested ?? fallback;\n\tif (candidate <= 0) return 0;\n\treturn Math.min(candidate, hardCeiling);\n}\n\n/**\n * Resolve `request.artifactId` against `store` and return a bounded slice. `maxLines`/\n * `maxBytes` are hard-clamped to `MAX_RETRIEVAL_LINES`/`MAX_RETRIEVAL_BYTES` regardless of\n * what the caller requests -- see the module doc comment for the exact guarantee.\n */\nexport function retrieveArtifactSlice(\n\tstore: ArtifactStore,\n\trequest: ArtifactRetrievalRequest,\n): ArtifactRetrievalResult {\n\tconst record = store.read(request.artifactId);\n\tif (isMissingArtifactMarker(record)) {\n\t\treturn { found: false, missingReason: record.reason };\n\t}\n\n\tconst mode = request.mode ?? \"head\";\n\tif (mode === \"metadata\") {\n\t\treturn { found: true, mode: \"metadata\", ref: record.ref };\n\t}\n\n\tconst truncationOptions = {\n\t\tmaxLines: clampToHardCeiling(request.maxLines, DEFAULT_RETRIEVAL_MAX_LINES, MAX_RETRIEVAL_LINES),\n\t\tmaxBytes: clampToHardCeiling(request.maxBytes, DEFAULT_MAX_BYTES, MAX_RETRIEVAL_BYTES),\n\t};\n\tconst truncation =\n\t\tmode === \"tail\"\n\t\t\t? truncateTail(record.content, truncationOptions)\n\t\t\t: truncateHead(record.content, truncationOptions);\n\n\treturn { found: true, mode, ref: record.ref, slice: truncation.content, truncation };\n}\n"]}
1
+ {"version":3,"file":"artifact-retrieval.js","sourceRoot":"","sources":["../../../src/core/context/artifact-retrieval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACN,iBAAiB,EAEjB,YAAY,EACZ,YAAY,GACZ,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,uBAAuB,EAA8B,MAAM,wBAAwB,CAAC;AAK7F,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAE/C,kFAAkF;AAClF,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACxC,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAcrD,SAAS,kBAAkB,CAAC,SAA6B,EAAE,QAAgB,EAAE,WAAmB;IAC/F,MAAM,SAAS,GAAG,SAAS,IAAI,QAAQ,CAAC;IACxC,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACpC,KAAoB,EACpB,OAAiC;IAEjC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC;IACpC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,iBAAiB,GAAG;QACzB,QAAQ,EAAE,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,2BAA2B,EAAE,mBAAmB,CAAC;QAChG,QAAQ,EAAE,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,iBAAiB,EAAE,mBAAmB,CAAC;KACtF,CAAC;IACF,MAAM,UAAU,GACf,IAAI,KAAK,MAAM;QACd,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,CAAC;QACjD,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAEpD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;AACtF,CAAC","sourcesContent":["/**\n * Bounded artifact retrieval (Phase 8-style helper landing early, per D2b): resolve an\n * artifact id shown in a \"Full output: artifact tool-output:<id>\" notice back into a\n * small, useful slice. Per tool-output-artifacts.md's retrieval behavior: retrieve the\n * smallest useful slice by default (metadata, or a bounded head/tail).\n *\n * Bounds are hard limits, not just defaults: a caller-provided `maxLines`/`maxBytes` is\n * clamped to `MAX_RETRIEVAL_LINES`/`MAX_RETRIEVAL_BYTES` before use, so no caller --\n * including a future agent-facing tool wrapper -- can force a large artifact to be fully\n * rehydrated in one call by simply requesting a larger bound. A small artifact that\n * already fits within the bound is still returned in full; the guarantee is \"never more\n * than the configured hard bounds,\" not \"never the whole artifact.\"\n */\n\nimport {\n\tDEFAULT_MAX_BYTES,\n\ttype TruncationResult,\n\ttruncateHead,\n\ttruncateTail,\n} from \"@caupulican/pi-agent-core/truncate\";\nimport type { ArtifactStore } from \"./context-artifacts.ts\";\nimport { isMissingArtifactMarker, type MissingArtifactReason } from \"./context-artifacts.ts\";\nimport type { ContextArtifactRef } from \"./context-item.ts\";\n\nexport type ArtifactRetrievalMode = \"metadata\" | \"head\" | \"tail\";\n\nexport const DEFAULT_RETRIEVAL_MAX_LINES = 200;\n\n/** Hard ceilings: a caller-requested maxLines/maxBytes can never exceed these. */\nexport const MAX_RETRIEVAL_LINES = 2000;\nexport const MAX_RETRIEVAL_BYTES = DEFAULT_MAX_BYTES;\n\nexport interface ArtifactRetrievalRequest {\n\tartifactId: string;\n\tmode?: ArtifactRetrievalMode;\n\tmaxLines?: number;\n\tmaxBytes?: number;\n}\n\nexport type ArtifactRetrievalResult =\n\t| { found: false; missingReason: MissingArtifactReason }\n\t| { found: true; mode: \"metadata\"; ref: ContextArtifactRef }\n\t| { found: true; mode: \"head\" | \"tail\"; ref: ContextArtifactRef; slice: string; truncation: TruncationResult };\n\nfunction clampToHardCeiling(requested: number | undefined, fallback: number, hardCeiling: number): number {\n\tconst candidate = requested ?? fallback;\n\tif (candidate <= 0) return 0;\n\treturn Math.min(candidate, hardCeiling);\n}\n\n/**\n * Resolve `request.artifactId` against `store` and return a bounded slice. `maxLines`/\n * `maxBytes` are hard-clamped to `MAX_RETRIEVAL_LINES`/`MAX_RETRIEVAL_BYTES` regardless of\n * what the caller requests -- see the module doc comment for the exact guarantee.\n */\nexport function retrieveArtifactSlice(\n\tstore: ArtifactStore,\n\trequest: ArtifactRetrievalRequest,\n): ArtifactRetrievalResult {\n\tconst record = store.read(request.artifactId);\n\tif (isMissingArtifactMarker(record)) {\n\t\treturn { found: false, missingReason: record.reason };\n\t}\n\n\tconst mode = request.mode ?? \"head\";\n\tif (mode === \"metadata\") {\n\t\treturn { found: true, mode: \"metadata\", ref: record.ref };\n\t}\n\n\tconst truncationOptions = {\n\t\tmaxLines: clampToHardCeiling(request.maxLines, DEFAULT_RETRIEVAL_MAX_LINES, MAX_RETRIEVAL_LINES),\n\t\tmaxBytes: clampToHardCeiling(request.maxBytes, DEFAULT_MAX_BYTES, MAX_RETRIEVAL_BYTES),\n\t};\n\tconst truncation =\n\t\tmode === \"tail\"\n\t\t\t? truncateTail(record.content, truncationOptions)\n\t\t\t: truncateHead(record.content, truncationOptions);\n\n\treturn { found: true, mode, ref: record.ref, slice: truncation.content, truncation };\n}\n"]}
@@ -80,12 +80,12 @@ export interface FileArtifactStoreOptions {
80
80
  }
81
81
  /**
82
82
  * Filesystem-backed `ArtifactStore`: payload and metadata (including reference holder ids)
83
- * are written to `baseDir` so content, ref fields, and cleanup-protecting references all
84
- * survive recreating the store (e.g. across a process restart against the same
85
- * directory) -- unlike the in-memory store, which loses everything when the instance is
86
- * dropped. No SQLite or other index is used; each artifact's metadata is a small sidecar
87
- * JSON file next to its payload file, per the "keep SQLite out of scope unless a minimal
88
- * metadata shape is unavoidable" constraint for this slice.
83
+ * are written to `baseDir` so content, ref fields, and cleanup-protecting references all survive
84
+ * recreating the store (e.g. across a process restart against the same directory) -- unlike the
85
+ * in-memory store, which loses everything when the instance is dropped. Each artifact has a small
86
+ * metadata sidecar plus one hashed holder marker per active reference. Marker updates are O(1) and
87
+ * every lifecycle mutation shares the artifact lock, so foreground/background processes cannot
88
+ * lose ownership through a shared-array read-modify-write race.
89
89
  *
90
90
  * The one thing that does NOT survive recreation: the missing-artifact reason
91
91
  * distinction. A fresh instance has no in-memory record of which ids it personally
@@ -1 +1 @@
1
- {"version":3,"file":"context-artifacts.d.ts","sourceRoot":"","sources":["../../../src/core/context/context-artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,EAAE,KAAK,kBAAkB,EAAyC,MAAM,mBAAmB,CAAC;AAEnG,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC9B,GAAG,EAAE,kBAAkB,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,qBAAqB,GAAG,WAAW,GAAG,YAAY,CAAC;AAE/D,MAAM,WAAW,qBAAqB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,qBAAqB,CAAC;CAC9B;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,cAAc,GAAG,qBAAqB,GAAG,KAAK,IAAI,qBAAqB,CAErH;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,IAAI,CACZ,oBAAoB,EACpB,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,gBAAgB,GAAG,eAAe,GAAG,cAAc,CAC1G,GACC,MAAM,CAeR;AAiBD,MAAM,WAAW,aAAa;IAC7B,KAAK,CAAC,OAAO,EAAE,oBAAoB,GAAG,cAAc,CAAC;IACrD,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,qBAAqB,CAAC;IACzD;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAAC;IACpD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IACpD,yGAAyG;IACzG,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IACvD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACnC,2FAA2F;IAC3F,OAAO,IAAI,MAAM,EAAE,CAAC;CACpB;AAQD,wBAAgB,2BAA2B,IAAI,aAAa,CAgE3D;AAED,MAAM,WAAW,wBAAwB;IACxC,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC;IAChB,sGAAsG;IACtG,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,+EAA+E;IAC/E,cAAc,CAAC,EAAE,MAAM,MAAM,CAAC;CAC9B;AA+ED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,aAAa,CAuHxF"}
1
+ {"version":3,"file":"context-artifacts.d.ts","sourceRoot":"","sources":["../../../src/core/context/context-artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,EAAE,KAAK,kBAAkB,EAAyC,MAAM,mBAAmB,CAAC;AAEnG,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC9B,GAAG,EAAE,kBAAkB,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,qBAAqB,GAAG,WAAW,GAAG,YAAY,CAAC;AAE/D,MAAM,WAAW,qBAAqB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,qBAAqB,CAAC;CAC9B;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,cAAc,GAAG,qBAAqB,GAAG,KAAK,IAAI,qBAAqB,CAErH;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,IAAI,CACZ,oBAAoB,EACpB,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,gBAAgB,GAAG,eAAe,GAAG,cAAc,CAC1G,GACC,MAAM,CAeR;AAiBD,MAAM,WAAW,aAAa;IAC7B,KAAK,CAAC,OAAO,EAAE,oBAAoB,GAAG,cAAc,CAAC;IACrD,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,qBAAqB,CAAC;IACzD;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAAC;IACpD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IACpD,yGAAyG;IACzG,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IACvD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACnC,2FAA2F;IAC3F,OAAO,IAAI,MAAM,EAAE,CAAC;CACpB;AAQD,wBAAgB,2BAA2B,IAAI,aAAa,CAgE3D;AAED,MAAM,WAAW,wBAAwB;IACxC,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC;IAChB,sGAAsG;IACtG,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,+EAA+E;IAC/E,cAAc,CAAC,EAAE,MAAM,MAAM,CAAC;CAC9B;AAyHD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,aAAa,CA+JxF"}
@@ -14,8 +14,9 @@
14
14
  * out of band via the artifact_retrieve tool (context/artifact-retrieval.ts).
15
15
  */
16
16
  import { createHash } from "node:crypto";
17
- import { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
17
+ import { existsSync, mkdirSync, readdirSync, readFileSync, rmdirSync, unlinkSync, writeFileSync } from "node:fs";
18
18
  import { join } from "node:path";
19
+ import { withFileLockSync, writeFileAtomicSync } from "../util/atomic-file.js";
19
20
  import { estimateByteLength, estimateLineCount } from "./context-item.js";
20
21
  export function isMissingArtifactMarker(value) {
21
22
  return value.missing === true;
@@ -118,6 +119,7 @@ export function createInMemoryArtifactStore() {
118
119
  }
119
120
  const META_SUFFIX = ".meta.json";
120
121
  const PAYLOAD_SUFFIX = ".payload";
122
+ const REFERENCES_SUFFIX = ".refs";
121
123
  /**
122
124
  * Artifact ids are generated by `generateArtifactId` as a lowercase hex digest. Reject
123
125
  * anything else so a caller-supplied id (including one echoed back from model output)
@@ -132,6 +134,12 @@ function payloadPath(baseDir, id) {
132
134
  function metaPath(baseDir, id) {
133
135
  return join(baseDir, `${id}${META_SUFFIX}`);
134
136
  }
137
+ function referencesDir(baseDir, id) {
138
+ return join(baseDir, `${id}${REFERENCES_SUFFIX}`);
139
+ }
140
+ function referencePath(baseDir, id, holderId) {
141
+ return join(referencesDir(baseDir, id), createHash("sha256").update(holderId).digest("hex"));
142
+ }
135
143
  const VALID_ARTIFACT_KINDS = new Set([
136
144
  "tool_output",
137
145
  "file_snapshot",
@@ -177,16 +185,50 @@ function readMeta(baseDir, id) {
177
185
  }
178
186
  }
179
187
  function writeMeta(baseDir, id, meta) {
180
- writeFileSync(metaPath(baseDir, id), JSON.stringify(meta), "utf8");
188
+ writeFileAtomicSync(metaPath(baseDir, id), JSON.stringify(meta));
189
+ }
190
+ /**
191
+ * Holder markers are immutable and every reader/writer holds the artifact lock. A direct exclusive
192
+ * create is therefore already complete before it becomes observable; a temp-file rename would add
193
+ * two Windows filesystem operations per holder without improving the visibility contract.
194
+ */
195
+ function writeReferenceMarker(baseDir, id, holderId) {
196
+ const path = referencePath(baseDir, id, holderId);
197
+ mkdirSync(referencesDir(baseDir, id), { recursive: true });
198
+ writeFileSync(path, holderId, { encoding: "utf8", flag: "wx" });
199
+ }
200
+ /** Move the legacy shared reference array to O(1)-update holder markers exactly once. */
201
+ function migratePersistedReferences(baseDir, id, meta) {
202
+ if (meta.references.length === 0)
203
+ return;
204
+ for (const holderId of meta.references) {
205
+ const path = referencePath(baseDir, id, holderId);
206
+ if (!existsSync(path))
207
+ writeReferenceMarker(baseDir, id, holderId);
208
+ }
209
+ meta.references = [];
210
+ writeMeta(baseDir, id, meta);
211
+ }
212
+ /** Undefined means the marker directory could not be inspected, so cleanup must fail closed. */
213
+ function referenceMarkerCount(baseDir, id) {
214
+ const dir = referencesDir(baseDir, id);
215
+ if (!existsSync(dir))
216
+ return 0;
217
+ try {
218
+ return readdirSync(dir, { withFileTypes: true }).length;
219
+ }
220
+ catch {
221
+ return undefined;
222
+ }
181
223
  }
182
224
  /**
183
225
  * Filesystem-backed `ArtifactStore`: payload and metadata (including reference holder ids)
184
- * are written to `baseDir` so content, ref fields, and cleanup-protecting references all
185
- * survive recreating the store (e.g. across a process restart against the same
186
- * directory) -- unlike the in-memory store, which loses everything when the instance is
187
- * dropped. No SQLite or other index is used; each artifact's metadata is a small sidecar
188
- * JSON file next to its payload file, per the "keep SQLite out of scope unless a minimal
189
- * metadata shape is unavoidable" constraint for this slice.
226
+ * are written to `baseDir` so content, ref fields, and cleanup-protecting references all survive
227
+ * recreating the store (e.g. across a process restart against the same directory) -- unlike the
228
+ * in-memory store, which loses everything when the instance is dropped. Each artifact has a small
229
+ * metadata sidecar plus one hashed holder marker per active reference. Marker updates are O(1) and
230
+ * every lifecycle mutation shares the artifact lock, so foreground/background processes cannot
231
+ * lose ownership through a shared-array read-modify-write race.
190
232
  *
191
233
  * The one thing that does NOT survive recreation: the missing-artifact reason
192
234
  * distinction. A fresh instance has no in-memory record of which ids it personally
@@ -216,33 +258,62 @@ export function createFileArtifactStore(options) {
216
258
  ensureBaseDir();
217
259
  return true;
218
260
  };
261
+ const mutateReference = (id, holderId, mutate) => {
262
+ if (!isSafeArtifactId(id) || !ensureExistingBaseDir())
263
+ return false;
264
+ try {
265
+ return withFileLockSync(metaPath(baseDir, id), () => {
266
+ const meta = readMeta(baseDir, id);
267
+ if (!meta)
268
+ return false;
269
+ migratePersistedReferences(baseDir, id, meta);
270
+ return mutate(referencePath(baseDir, id, holderId));
271
+ });
272
+ }
273
+ catch {
274
+ return false;
275
+ }
276
+ };
219
277
  return {
220
278
  write(request) {
221
279
  ensureBaseDir();
222
280
  const id = generateArtifactId(request);
223
- const existingMeta = readMeta(baseDir, id);
224
- const existingPayloadPath = payloadPath(baseDir, id);
225
- if (existingMeta && existsSync(existingPayloadPath)) {
281
+ return withFileLockSync(metaPath(baseDir, id), () => {
282
+ const existingMeta = readMeta(baseDir, id);
283
+ const existingPayloadPath = payloadPath(baseDir, id);
284
+ if (existingMeta && existsSync(existingPayloadPath)) {
285
+ cleanedUpThisInstance.delete(id);
286
+ return { ref: existingMeta.ref, content: readFileSync(existingPayloadPath, "utf8") };
287
+ }
288
+ const ref = createArtifactRef(id, request);
289
+ writeFileAtomicSync(payloadPath(baseDir, id), request.content);
290
+ writeMeta(baseDir, id, { ref, references: [] });
226
291
  cleanedUpThisInstance.delete(id);
227
- return { ref: existingMeta.ref, content: readFileSync(existingPayloadPath, "utf8") };
228
- }
229
- const ref = createArtifactRef(id, request);
230
- writeFileSync(payloadPath(baseDir, id), request.content, "utf8");
231
- writeMeta(baseDir, id, { ref, references: [] });
232
- cleanedUpThisInstance.delete(id);
233
- return { ref, content: request.content };
292
+ return { ref, content: request.content };
293
+ });
234
294
  },
235
295
  read(id) {
236
296
  if (!isSafeArtifactId(id))
237
297
  return { id, missing: true, reason: "not_found" };
238
298
  if (!ensureExistingBaseDir())
239
299
  return { id, missing: true, reason: "not_found" };
240
- const meta = readMeta(baseDir, id);
241
- const pPath = payloadPath(baseDir, id);
242
- if (!meta || !existsSync(pPath)) {
300
+ try {
301
+ return withFileLockSync(metaPath(baseDir, id), () => {
302
+ const meta = readMeta(baseDir, id);
303
+ const pPath = payloadPath(baseDir, id);
304
+ if (!meta || !existsSync(pPath)) {
305
+ return {
306
+ id,
307
+ missing: true,
308
+ reason: cleanedUpThisInstance.has(id) ? "cleaned_up" : "not_found",
309
+ };
310
+ }
311
+ return { ref: meta.ref, content: readFileSync(pPath, "utf8") };
312
+ });
313
+ }
314
+ catch {
243
315
  return { id, missing: true, reason: cleanedUpThisInstance.has(id) ? "cleaned_up" : "not_found" };
244
316
  }
245
- return { ref: meta.ref, content: readFileSync(pPath, "utf8") };
246
317
  },
247
318
  readRef(id) {
248
319
  if (!isSafeArtifactId(id))
@@ -262,40 +333,44 @@ export function createFileArtifactStore(options) {
262
333
  return readMeta(baseDir, id) !== undefined && existsSync(payloadPath(baseDir, id));
263
334
  },
264
335
  addReference(id, holderId) {
265
- if (!isSafeArtifactId(id))
266
- return false;
267
- if (!ensureExistingBaseDir())
268
- return false;
269
- const meta = readMeta(baseDir, id);
270
- if (!meta || !existsSync(payloadPath(baseDir, id)))
271
- return false;
272
- if (!meta.references.includes(holderId)) {
273
- meta.references.push(holderId);
274
- writeMeta(baseDir, id, meta);
275
- }
276
- return true;
336
+ return mutateReference(id, holderId, (path) => {
337
+ if (!existsSync(payloadPath(baseDir, id)))
338
+ return false;
339
+ if (existsSync(path))
340
+ return readFileSync(path, "utf8") === holderId;
341
+ writeReferenceMarker(baseDir, id, holderId);
342
+ return true;
343
+ });
277
344
  },
278
345
  removeReference(id, holderId) {
279
- if (!isSafeArtifactId(id))
280
- return false;
281
- if (!ensureExistingBaseDir())
282
- return false;
283
- const meta = readMeta(baseDir, id);
284
- if (!meta)
285
- return false;
286
- const index = meta.references.indexOf(holderId);
287
- if (index === -1)
288
- return false;
289
- meta.references.splice(index, 1);
290
- writeMeta(baseDir, id, meta);
291
- return true;
346
+ return mutateReference(id, holderId, (path) => {
347
+ if (!existsSync(path) || readFileSync(path, "utf8") !== holderId)
348
+ return false;
349
+ unlinkSync(path);
350
+ try {
351
+ rmdirSync(referencesDir(baseDir, id));
352
+ }
353
+ catch { }
354
+ return true;
355
+ });
292
356
  },
293
357
  referenceCount(id) {
294
358
  if (!isSafeArtifactId(id))
295
359
  return 0;
296
360
  if (!ensureExistingBaseDir())
297
361
  return 0;
298
- return readMeta(baseDir, id)?.references.length ?? 0;
362
+ try {
363
+ return withFileLockSync(metaPath(baseDir, id), () => {
364
+ const meta = readMeta(baseDir, id);
365
+ if (!meta)
366
+ return 0;
367
+ migratePersistedReferences(baseDir, id, meta);
368
+ return referenceMarkerCount(baseDir, id) ?? 0;
369
+ });
370
+ }
371
+ catch {
372
+ return 0;
373
+ }
299
374
  },
300
375
  cleanup() {
301
376
  const deleted = [];
@@ -307,23 +382,36 @@ export function createFileArtifactStore(options) {
307
382
  const id = entry.slice(0, -META_SUFFIX.length);
308
383
  if (!isSafeArtifactId(id))
309
384
  continue;
310
- const meta = readMeta(baseDir, id);
311
- if (!meta || meta.references.length > 0)
312
- continue;
313
- try {
314
- unlinkSync(metaPath(baseDir, id));
315
- }
316
- catch {
317
- continue;
318
- }
319
385
  try {
320
- unlinkSync(payloadPath(baseDir, id));
321
- }
322
- catch {
323
- // Payload already gone; metadata removal above is what matters for reachability.
386
+ withFileLockSync(metaPath(baseDir, id), () => {
387
+ const meta = readMeta(baseDir, id);
388
+ if (!meta)
389
+ return;
390
+ migratePersistedReferences(baseDir, id, meta);
391
+ const references = referenceMarkerCount(baseDir, id);
392
+ if (references === undefined || references > 0)
393
+ return;
394
+ try {
395
+ unlinkSync(metaPath(baseDir, id));
396
+ }
397
+ catch {
398
+ return;
399
+ }
400
+ try {
401
+ unlinkSync(payloadPath(baseDir, id));
402
+ }
403
+ catch {
404
+ // Payload already gone; metadata removal above is what matters for reachability.
405
+ }
406
+ try {
407
+ rmdirSync(referencesDir(baseDir, id));
408
+ }
409
+ catch { }
410
+ cleanedUpThisInstance.add(id);
411
+ deleted.push(id);
412
+ });
324
413
  }
325
- cleanedUpThisInstance.add(id);
326
- deleted.push(id);
414
+ catch { }
327
415
  }
328
416
  return deleted;
329
417
  },