@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":"file-store.js","sourceRoot":"","sources":["../../../../src/core/memory/providers/file-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { promises as fs } from \"node:fs\";\nimport { type Static, Type } from \"typebox\";\nimport { configFile } from \"../../agent-paths.ts\";\nimport type { MemoryPromptBudget } from \"../../context/memory-prompt-budget.ts\";\nimport type { ToolDefinition } from \"../../extensions/types.ts\";\nimport { hasInvisibleUnicode, scanContextFileThreats, stripInvisibleUnicode } from \"../../resource-loader.ts\";\nimport { jaccard, tokenize } from \"../../tools/skill-audit.ts\";\nimport { withFileLock, writeFileAtomic } from \"../../util/atomic-file.ts\";\nimport type { MemoryLifecycleContext, MemoryProvider } from \"../memory-provider.ts\";\nimport { UserMemoryArchive } from \"./user-memory-archive.ts\";\n\n/**\n * Confront-before-write (anti append-rot): if `content` is a near-duplicate of an existing\n * non-empty line (token Jaccard ≥ threshold — i.e. the same fact reworded), supersede that line in\n * place and return the rewritten file; otherwise return null (the caller appends normally).\n */\nexport function supersedeNearDuplicateLine(existing: string, content: string): string | null {\n\tconst NEAR_DUP_THRESHOLD = 0.6;\n\tconst contentTokens = tokenize(content);\n\tif (contentTokens.length === 0) return null;\n\tconst lines = existing.split(\"\\n\");\n\tlet bestIdx = -1;\n\tlet bestScore = NEAR_DUP_THRESHOLD;\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i].trim();\n\t\tif (!line) continue;\n\t\t// Never supersede structural Markdown (headings, list markers as headings) — a fact must not\n\t\t// silently overwrite section structure.\n\t\tif (line.startsWith(\"#\")) continue;\n\t\tconst score = jaccard(contentTokens, tokenize(line));\n\t\tif (score >= bestScore) {\n\t\t\tbestScore = score;\n\t\t\tbestIdx = i;\n\t\t}\n\t}\n\tif (bestIdx === -1) return null;\n\tlines[bestIdx] = content;\n\treturn lines.join(\"\\n\");\n}\n\nconst memorySchema = Type.Object({\n\taction: Type.Union([Type.Literal(\"add\"), Type.Literal(\"replace\"), Type.Literal(\"remove\")], {\n\t\tdescription: \"Action to perform: add new content, replace existing content, or remove content\",\n\t}),\n\ttarget: Type.Union([Type.Literal(\"memory\"), Type.Literal(\"user\")], {\n\t\tdescription: \"Target file: 'memory' for MEMORY.md, 'user' for USER.md\",\n\t}),\n\tcontent: Type.Optional(Type.String({ description: \"Content to write (required for 'add' or 'replace')\" })),\n\toldContent: Type.Optional(\n\t\tType.String({ description: \"Exact substring to replace or remove (required for 'replace' or 'remove')\" }),\n\t),\n});\n\ntype MemoryParams = Static<typeof memorySchema>;\n\nexport interface FileStoreProviderOptions {\n\tonDurableMemoryChanged?: () => void;\n}\n\nexport const FILE_STORE_MEMORY_SYSTEM_NOTE =\n\t\"[System Note: Below is a snapshot of persistent memory. Proactively record verified reusable project facts and user preferences with the 'memory' tool; never store transient noise.]\";\n\ninterface ManagedMemoryState {\n\tversion: 1;\n\tcommittedDigest: string;\n\tpendingDigest?: string;\n}\n\ntype ManagedMemoryStateRead =\n\t| { status: \"missing\" }\n\t| { status: \"valid\"; state: ManagedMemoryState }\n\t| { status: \"invalid\"; raw: string };\n\nfunction managedMemoryStatePath(filePath: string): string {\n\treturn `${filePath}.pi-managed.json`;\n}\n\nfunction contentDigest(content: string): string {\n\treturn createHash(\"sha256\").update(content, \"utf8\").digest(\"hex\");\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n\treturn typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\";\n}\n\nfunction parseManagedMemoryState(raw: string): ManagedMemoryState | undefined {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (typeof parsed !== \"object\" || parsed === null) return undefined;\n\tconst record = parsed as Record<string, unknown>;\n\tif (record.version !== 1 || typeof record.committedDigest !== \"string\") return undefined;\n\tif (record.pendingDigest !== undefined && typeof record.pendingDigest !== \"string\") return undefined;\n\treturn {\n\t\tversion: 1,\n\t\tcommittedDigest: record.committedDigest,\n\t\t...(typeof record.pendingDigest === \"string\" ? { pendingDigest: record.pendingDigest } : {}),\n\t};\n}\n\nasync function readManagedMemoryState(filePath: string): Promise<ManagedMemoryStateRead> {\n\ttry {\n\t\tconst raw = await fs.readFile(managedMemoryStatePath(filePath), \"utf8\");\n\t\tconst state = parseManagedMemoryState(raw);\n\t\treturn state ? { status: \"valid\", state } : { status: \"invalid\", raw };\n\t} catch (error) {\n\t\tif (isMissingFileError(error)) return { status: \"missing\" };\n\t\tthrow error;\n\t}\n}\n\nfunction serializeManagedMemoryState(state: ManagedMemoryState): string {\n\treturn `${JSON.stringify(state)}\\n`;\n}\n\nasync function writeManagedMemoryState(filePath: string, state: ManagedMemoryState): Promise<void> {\n\tawait writeFileAtomic(managedMemoryStatePath(filePath), serializeManagedMemoryState(state), { mode: 0o600 });\n}\n\nfunction reconcileManagedMemoryState(\n\tcurrentDigest: string,\n\tstate: ManagedMemoryState,\n): { recognized: true; state: ManagedMemoryState; changed: boolean } | { recognized: false } {\n\tif (currentDigest === state.committedDigest) {\n\t\tif (state.pendingDigest === undefined) return { recognized: true, state, changed: false };\n\t\treturn {\n\t\t\trecognized: true,\n\t\t\tstate: { version: 1, committedDigest: state.committedDigest },\n\t\t\tchanged: true,\n\t\t};\n\t}\n\tif (state.pendingDigest !== undefined && currentDigest === state.pendingDigest) {\n\t\treturn {\n\t\t\trecognized: true,\n\t\t\tstate: { version: 1, committedDigest: state.pendingDigest },\n\t\t\tchanged: true,\n\t\t};\n\t}\n\treturn { recognized: false };\n}\n\nfunction fitMemoryBlockToBudget(block: string, budget: MemoryPromptBudget | undefined): string {\n\tif (budget === undefined) return block;\n\tif (!budget.enabled || budget.maxLines <= 0 || budget.maxChars <= 0) return \"\";\n\tif (block.split(\"\\n\").length <= budget.maxLines && block.length <= budget.maxChars) return block;\n\t// Micro-context profiles deliberately omit a block that cannot fit whole. Larger constrained\n\t// profiles retain a bounded head and say explicitly that more memory exists on disk.\n\tif (budget.compact) return \"\";\n\n\tconst marker = \"[…memory truncated for capability budget; full files remain on disk]\";\n\tif (budget.maxLines < 2 || budget.maxChars <= marker.length + 1) return \"\";\n\tconst lines: string[] = [];\n\tlet chars = 0;\n\tconst contentCharLimit = budget.maxChars - marker.length - 1;\n\tfor (const line of block.split(\"\\n\")) {\n\t\tif (lines.length >= budget.maxLines - 1) break;\n\t\tconst separatorChars = lines.length > 0 ? 1 : 0;\n\t\tconst remaining = contentCharLimit - chars - separatorChars;\n\t\tif (remaining <= 0) break;\n\t\tconst rendered = line.length <= remaining ? line : `${line.slice(0, Math.max(0, remaining - 1))}…`;\n\t\tlines.push(rendered);\n\t\tchars += separatorChars + rendered.length;\n\t\tif (rendered.length !== line.length) break;\n\t}\n\tif (lines.length === 0) return \"\";\n\tlines.push(marker);\n\treturn lines.join(\"\\n\");\n}\n\nexport class FileStoreProvider implements MemoryProvider {\n\tpublic readonly name = \"file-store\";\n\tpublic readonly egress = \"local\";\n\n\tprivate ctx?: MemoryLifecycleContext;\n\tprivate memoryFilePath = \"\";\n\tprivate userFilePath = \"\";\n\n\tprivate lastWrittenMemory = \"\";\n\tprivate lastWrittenUser = \"\";\n\tprivate userArchive?: UserMemoryArchive;\n\tprivate readonly options: FileStoreProviderOptions;\n\n\t// Character budgets\n\tprivate static readonly BUDGET_MEMORY = 2200;\n\tprivate static readonly BUDGET_USER = 1375;\n\n\tconstructor(options: FileStoreProviderOptions = {}) {\n\t\tthis.options = options;\n\t}\n\n\tpublic isAvailable(): boolean {\n\t\treturn true;\n\t}\n\n\tpublic getCapabilities() {\n\t\treturn { surfaces: [\"context\" as const] };\n\t}\n\n\tpublic async initialize(_sessionId: string, ctx: MemoryLifecycleContext): Promise<void> {\n\t\tthis.ctx = ctx;\n\t\tthis.memoryFilePath = configFile(ctx.agentDir, \"MEMORY.md\");\n\t\tthis.userFilePath = configFile(ctx.agentDir, \"USER.md\");\n\t\tthis.userArchive = new UserMemoryArchive(ctx.agentDir);\n\n\t\tawait fs.mkdir(ctx.agentDir, { recursive: true });\n\t\t[this.lastWrittenMemory, this.lastWrittenUser] = await Promise.all([\n\t\t\tthis.initializeManagedFile(this.memoryFilePath),\n\t\t\tthis.initializeManagedFile(this.userFilePath),\n\t\t]);\n\t}\n\n\tprivate async initializeManagedFile(filePath: string): Promise<string> {\n\t\treturn withFileLock(filePath, async () => {\n\t\t\tlet current = \"\";\n\t\t\ttry {\n\t\t\t\tcurrent = await fs.readFile(filePath, \"utf8\");\n\t\t\t} catch (error) {\n\t\t\t\tif (!isMissingFileError(error)) throw error;\n\t\t\t\tawait writeFileAtomic(filePath, \"\", { mode: 0o600 });\n\t\t\t}\n\n\t\t\tconst currentDigest = contentDigest(current);\n\t\t\tconst stateRead = await readManagedMemoryState(filePath);\n\t\t\tif (stateRead.status === \"missing\") {\n\t\t\t\tawait writeManagedMemoryState(filePath, { version: 1, committedDigest: currentDigest });\n\t\t\t\treturn current;\n\t\t\t}\n\t\t\tif (stateRead.status === \"invalid\") {\n\t\t\t\tawait writeFileAtomic(\n\t\t\t\t\t`${managedMemoryStatePath(filePath)}.bak.${Date.now()}.${randomUUID()}`,\n\t\t\t\t\tstateRead.raw,\n\t\t\t\t\t{ mode: 0o600 },\n\t\t\t\t);\n\t\t\t\tawait writeManagedMemoryState(filePath, { version: 1, committedDigest: currentDigest });\n\t\t\t\treturn current;\n\t\t\t}\n\n\t\t\tconst reconciled = reconcileManagedMemoryState(currentDigest, stateRead.state);\n\t\t\tif (reconciled.recognized && reconciled.changed) {\n\t\t\t\tawait writeManagedMemoryState(filePath, reconciled.state);\n\t\t\t}\n\t\t\treturn current;\n\t\t});\n\t}\n\n\tpublic systemPromptBlock(budget?: MemoryPromptBudget): string {\n\t\tconst sanitize = (content: string) => {\n\t\t\t// Strip hidden/bidi-control chars before injecting memory into the prompt (defence in depth: the\n\t\t\t// write path already blocks them, but a file edited out-of-band could carry them). Strip #31.\n\t\t\tconst lines = stripInvisibleUnicode(content).cleaned.split(\"\\n\");\n\t\t\tconst sanitizedLines = lines.map((line) => {\n\t\t\t\tconst threats = scanContextFileThreats(line);\n\t\t\t\tif (threats.length > 0) {\n\t\t\t\t\treturn `[BLOCKED: potential threat detected (${threats.join(\", \")})]`;\n\t\t\t\t}\n\t\t\t\treturn line;\n\t\t\t});\n\t\t\treturn sanitizedLines.join(\"\\n\");\n\t\t};\n\n\t\t// Read-time budget guard (cost): the memory tool already caps writes at BUDGET_*, but a file edited\n\t\t// externally (or by any path that bypasses the tool) could be arbitrarily large and would then\n\t\t// bloat the system prompt on EVERY turn. Cap the injected view to the same budget so the per-turn\n\t\t// cost stays bounded; the file on disk is untouched and the model is told it was truncated.\n\t\tconst cap = (content: string, limit: number) => {\n\t\t\tif (content.length <= limit) return content;\n\t\t\treturn `${content.slice(0, limit)}\\n[…truncated to ${limit} chars for the prompt; full file is on disk]`;\n\t\t};\n\n\t\tconst mem = cap(sanitize(this.lastWrittenMemory), FileStoreProvider.BUDGET_MEMORY);\n\t\tconst usr = cap(sanitize(this.lastWrittenUser), FileStoreProvider.BUDGET_USER);\n\n\t\tconst blocks: string[] = [];\n\t\tif (mem.trim()) {\n\t\t\tblocks.push(`## MEMORY.md:\\n${mem}`);\n\t\t}\n\t\tif (usr.trim()) {\n\t\t\tblocks.push(`## USER.md:\\n${usr}`);\n\t\t}\n\n\t\tif (blocks.length === 0) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tconst block = `=== Persistent Memory (file-store) ===\\n${FILE_STORE_MEMORY_SYSTEM_NOTE}\\n\\n${blocks.join(\"\\n\\n\")}`;\n\t\treturn fitMemoryBlockToBudget(block, budget);\n\t}\n\n\tpublic async prefetch(_query: string): Promise<string> {\n\t\t// static system prompt block is sufficient for file-store default; no-op prefetch\n\t\treturn \"\";\n\t}\n\n\tpublic async shutdown(): Promise<void> {\n\t\t// no-op\n\t}\n\n\tpublic getContextMarkers(): string[] {\n\t\treturn [];\n\t}\n\n\tpublic getToolDefinitions(): ToolDefinition[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\tname: \"memory\",\n\t\t\t\tlabel: \"Persistent Memory Manager\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Add, replace, or remove durable project facts and user preferences. Proactively store newly verified reusable facts; USER.md overflow is migrated into indexed OKF shards.\",\n\t\t\t\tparameters: memorySchema,\n\t\t\t\texecute: async (_toolCallId, params: MemoryParams, _signal, _onUpdate, _execCtx) => {\n\t\t\t\t\tif (this.ctx?.isChildSession) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\ttext: \"Error: Writes to persistent memory are not allowed in child sessions (subagents).\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdetails: { success: false, error: \"Child session write-gated\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tconst { action, target, content, oldContent } = params;\n\n\t\t\t\t\t// Strict-scope injection guard on the high-privilege WRITE path (agy #31): a poisoned\n\t\t\t\t\t// memory entry persists across sessions and is injected into every future system prompt,\n\t\t\t\t\t// so block outright rather than strip. Hidden/bidi-control chars have no legitimate place\n\t\t\t\t\t// in a memory note, so reject those too.\n\t\t\t\t\tif ((action === \"add\" || action === \"replace\") && content !== undefined) {\n\t\t\t\t\t\tif (hasInvisibleUnicode(content)) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\ttext: \"Error: memory write rejected — contains hidden/bidirectional control characters.\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tdetails: { success: false, error: \"Invisible unicode in memory write\" },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst threats = scanContextFileThreats(content, \"strict\");\n\t\t\t\t\t\tif (threats.length > 0) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\ttext: `Error: memory write rejected — potential injection/exfiltration detected (${threats.join(\", \")}).`,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tdetails: { success: false, error: \"Threat in memory write\" },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst filePath = target === \"memory\" ? this.memoryFilePath : this.userFilePath;\n\t\t\t\t\tconst budget = target === \"memory\" ? FileStoreProvider.BUDGET_MEMORY : FileStoreProvider.BUDGET_USER;\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn await withFileLock(filePath, async () => {\n\t\t\t\t\t\t\tconst currentOnDisk = await fs.readFile(filePath, \"utf8\");\n\t\t\t\t\t\t\tconst currentDigest = contentDigest(currentOnDisk);\n\t\t\t\t\t\t\tconst stateRead = await readManagedMemoryState(filePath);\n\t\t\t\t\t\t\tlet managedState: ManagedMemoryState | undefined;\n\t\t\t\t\t\t\tif (stateRead.status === \"valid\") {\n\t\t\t\t\t\t\t\tconst reconciled = reconcileManagedMemoryState(currentDigest, stateRead.state);\n\t\t\t\t\t\t\t\tif (reconciled.recognized) {\n\t\t\t\t\t\t\t\t\tmanagedState = reconciled.state;\n\t\t\t\t\t\t\t\t\tif (reconciled.changed) await writeManagedMemoryState(filePath, reconciled.state);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!managedState) {\n\t\t\t\t\t\t\t\tconst backupPath = `${filePath}.bak.${Date.now()}`;\n\t\t\t\t\t\t\t\tawait writeFileAtomic(backupPath, currentOnDisk, { mode: 0o600 });\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\ttext: `Error: Drift detected. The memory file has been modified out-of-band by an external process. A backup was created at ${backupPath}. Operation aborted.`,\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\tdetails: { success: false, error: \"Drift detected\" },\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// A peer session's committed write is authoritative. Refresh this provider's prompt\n\t\t\t\t\t\t\t// snapshot before applying the caller's mutation to that current content.\n\t\t\t\t\t\t\tif (target === \"memory\") this.lastWrittenMemory = currentOnDisk;\n\t\t\t\t\t\t\telse this.lastWrittenUser = currentOnDisk;\n\n\t\t\t\t\t\t\tlet newContent = currentOnDisk;\n\t\t\t\t\t\t\tlet archiveChanged = false;\n\t\t\t\t\t\t\tif (target === \"user\") {\n\t\t\t\t\t\t\t\tif (!this.userArchive) throw new Error(\"User memory archive is not initialized.\");\n\t\t\t\t\t\t\t\tif (action === \"add\") {\n\t\t\t\t\t\t\t\t\tif (content === undefined)\n\t\t\t\t\t\t\t\t\t\tthrow new Error(\"Parameter 'content' is required for action 'add'.\");\n\t\t\t\t\t\t\t\t\tconst result = await this.userArchive.apply(\n\t\t\t\t\t\t\t\t\t\tcurrentOnDisk,\n\t\t\t\t\t\t\t\t\t\t{ action, content },\n\t\t\t\t\t\t\t\t\t\tbudget,\n\t\t\t\t\t\t\t\t\t\tsupersedeNearDuplicateLine,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tnewContent = result.userContent;\n\t\t\t\t\t\t\t\t\tarchiveChanged = result.archiveChanged;\n\t\t\t\t\t\t\t\t} else if (action === \"replace\") {\n\t\t\t\t\t\t\t\t\tif (content === undefined || oldContent === undefined) {\n\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t\"Parameters 'content' and 'oldContent' are required for action 'replace'.\",\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\tconst result = await this.userArchive.apply(\n\t\t\t\t\t\t\t\t\t\tcurrentOnDisk,\n\t\t\t\t\t\t\t\t\t\t{ action, content, oldContent },\n\t\t\t\t\t\t\t\t\t\tbudget,\n\t\t\t\t\t\t\t\t\t\tsupersedeNearDuplicateLine,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tnewContent = result.userContent;\n\t\t\t\t\t\t\t\t\tarchiveChanged = result.archiveChanged;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tif (oldContent === undefined)\n\t\t\t\t\t\t\t\t\t\tthrow new Error(\"Parameter 'oldContent' is required for action 'remove'.\");\n\t\t\t\t\t\t\t\t\tconst result = await this.userArchive.apply(\n\t\t\t\t\t\t\t\t\t\tcurrentOnDisk,\n\t\t\t\t\t\t\t\t\t\t{ action, oldContent },\n\t\t\t\t\t\t\t\t\t\tbudget,\n\t\t\t\t\t\t\t\t\t\tsupersedeNearDuplicateLine,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tnewContent = result.userContent;\n\t\t\t\t\t\t\t\t\tarchiveChanged = result.archiveChanged;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (action === \"add\") {\n\t\t\t\t\t\t\t\tif (content === undefined) {\n\t\t\t\t\t\t\t\t\tthrow new Error(\"Parameter 'content' is required for action 'add'.\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst superseded = supersedeNearDuplicateLine(currentOnDisk, content);\n\t\t\t\t\t\t\t\tif (superseded !== null) {\n\t\t\t\t\t\t\t\t\tnewContent = superseded;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewContent =\n\t\t\t\t\t\t\t\t\t\tnewContent.endsWith(\"\\n\") || newContent === \"\"\n\t\t\t\t\t\t\t\t\t\t\t? `${newContent}${content}\\n`\n\t\t\t\t\t\t\t\t\t\t\t: `${newContent}\\n${content}\\n`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (action === \"replace\") {\n\t\t\t\t\t\t\t\tif (content === undefined || oldContent === undefined) {\n\t\t\t\t\t\t\t\t\tthrow new Error(\"Parameters 'content' and 'oldContent' are required for action 'replace'.\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!currentOnDisk.includes(oldContent)) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`The content to replace ('oldContent') was not found in the file.`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tnewContent = currentOnDisk.replace(oldContent, content);\n\t\t\t\t\t\t\t} else if (action === \"remove\") {\n\t\t\t\t\t\t\t\tif (oldContent === undefined) {\n\t\t\t\t\t\t\t\t\tthrow new Error(\"Parameter 'oldContent' is required for action 'remove'.\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!currentOnDisk.includes(oldContent)) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`The content to remove ('oldContent') was not found in the file.`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tnewContent = currentOnDisk.replace(oldContent, \"\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (newContent.length > budget) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\ttext: `Error: Memory budget exceeded. ${target === \"memory\" ? \"MEMORY.md\" : \"USER.md\"} limit is ${budget} characters. Current operation would result in ${newContent.length} characters.`,\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\tdetails: { success: false, error: \"Memory budget exceeded\" },\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (newContent !== currentOnDisk) {\n\t\t\t\t\t\t\t\tconst newDigest = contentDigest(newContent);\n\t\t\t\t\t\t\t\tawait writeManagedMemoryState(filePath, {\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\tcommittedDigest: managedState.committedDigest,\n\t\t\t\t\t\t\t\t\tpendingDigest: newDigest,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tawait writeFileAtomic(filePath, newContent, { mode: 0o600 });\n\t\t\t\t\t\t\t\tawait writeManagedMemoryState(filePath, { version: 1, committedDigest: newDigest });\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (target === \"memory\") this.lastWrittenMemory = newContent;\n\t\t\t\t\t\t\telse this.lastWrittenUser = newContent;\n\t\t\t\t\t\t\tif (archiveChanged || newContent !== currentOnDisk) this.options.onDurableMemoryChanged?.();\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\ttext: `Successfully updated ${target === \"memory\" ? \"MEMORY.md\" : \"USER.md\"}.`,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tdetails: { success: true },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\ttext: `Error: Failed to perform memory operation: ${String(err)}`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdetails: { success: false, error: String(err) },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t}\n}\n"]}
1
+ {"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../../../src/core/memory/providers/file-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { promises as fs } from \"node:fs\";\nimport { type Static, Type } from \"typebox\";\nimport { configFile } from \"../../agent-paths.ts\";\nimport type { MemoryPromptBudget } from \"../../context/memory-prompt-budget.ts\";\nimport type { ToolDefinition } from \"../../extensions/types.ts\";\nimport {\n\thasInvisibleUnicode,\n\tscanContextFileThreats,\n\tstripInvisibleUnicode,\n} from \"../../security/context-threat-scanner.ts\";\nimport { jaccard, tokenize } from \"../../tools/skill-audit.ts\";\nimport { withFileLock, writeFileAtomic } from \"../../util/atomic-file.ts\";\nimport type { MemoryLifecycleContext, MemoryProvider } from \"../memory-provider.ts\";\nimport { UserMemoryArchive } from \"./user-memory-archive.ts\";\n\n/**\n * Confront-before-write (anti append-rot): if `content` is a near-duplicate of an existing\n * non-empty line (token Jaccard ≥ threshold — i.e. the same fact reworded), supersede that line in\n * place and return the rewritten file; otherwise return null (the caller appends normally).\n */\nexport function supersedeNearDuplicateLine(existing: string, content: string): string | null {\n\tconst NEAR_DUP_THRESHOLD = 0.6;\n\tconst contentTokens = tokenize(content);\n\tif (contentTokens.length === 0) return null;\n\tconst lines = existing.split(\"\\n\");\n\tlet bestIdx = -1;\n\tlet bestScore = NEAR_DUP_THRESHOLD;\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i].trim();\n\t\tif (!line) continue;\n\t\t// Never supersede structural Markdown (headings, list markers as headings) — a fact must not\n\t\t// silently overwrite section structure.\n\t\tif (line.startsWith(\"#\")) continue;\n\t\tconst score = jaccard(contentTokens, tokenize(line));\n\t\tif (score >= bestScore) {\n\t\t\tbestScore = score;\n\t\t\tbestIdx = i;\n\t\t}\n\t}\n\tif (bestIdx === -1) return null;\n\tlines[bestIdx] = content;\n\treturn lines.join(\"\\n\");\n}\n\nconst memorySchema = Type.Object({\n\taction: Type.Union([Type.Literal(\"add\"), Type.Literal(\"replace\"), Type.Literal(\"remove\")], {\n\t\tdescription: \"Action to perform: add new content, replace existing content, or remove content\",\n\t}),\n\ttarget: Type.Union([Type.Literal(\"memory\"), Type.Literal(\"user\")], {\n\t\tdescription: \"Target file: 'memory' for MEMORY.md, 'user' for USER.md\",\n\t}),\n\tcontent: Type.Optional(Type.String({ description: \"Content to write (required for 'add' or 'replace')\" })),\n\toldContent: Type.Optional(\n\t\tType.String({ description: \"Exact substring to replace or remove (required for 'replace' or 'remove')\" }),\n\t),\n});\n\ntype MemoryParams = Static<typeof memorySchema>;\n\nexport interface FileStoreProviderOptions {\n\tonDurableMemoryChanged?: () => void;\n}\n\nexport const FILE_STORE_MEMORY_SYSTEM_NOTE =\n\t\"[System Note: Below is a snapshot of persistent memory. Proactively record verified reusable project facts and user preferences with the 'memory' tool; never store transient noise.]\";\n\ninterface ManagedMemoryState {\n\tversion: 1;\n\tcommittedDigest: string;\n\tpendingDigest?: string;\n}\n\ntype ManagedMemoryStateRead =\n\t| { status: \"missing\" }\n\t| { status: \"valid\"; state: ManagedMemoryState }\n\t| { status: \"invalid\"; raw: string };\n\nfunction managedMemoryStatePath(filePath: string): string {\n\treturn `${filePath}.pi-managed.json`;\n}\n\nfunction contentDigest(content: string): string {\n\treturn createHash(\"sha256\").update(content, \"utf8\").digest(\"hex\");\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n\treturn typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\";\n}\n\nfunction parseManagedMemoryState(raw: string): ManagedMemoryState | undefined {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (typeof parsed !== \"object\" || parsed === null) return undefined;\n\tconst record = parsed as Record<string, unknown>;\n\tif (record.version !== 1 || typeof record.committedDigest !== \"string\") return undefined;\n\tif (record.pendingDigest !== undefined && typeof record.pendingDigest !== \"string\") return undefined;\n\treturn {\n\t\tversion: 1,\n\t\tcommittedDigest: record.committedDigest,\n\t\t...(typeof record.pendingDigest === \"string\" ? { pendingDigest: record.pendingDigest } : {}),\n\t};\n}\n\nasync function readManagedMemoryState(filePath: string): Promise<ManagedMemoryStateRead> {\n\ttry {\n\t\tconst raw = await fs.readFile(managedMemoryStatePath(filePath), \"utf8\");\n\t\tconst state = parseManagedMemoryState(raw);\n\t\treturn state ? { status: \"valid\", state } : { status: \"invalid\", raw };\n\t} catch (error) {\n\t\tif (isMissingFileError(error)) return { status: \"missing\" };\n\t\tthrow error;\n\t}\n}\n\nfunction serializeManagedMemoryState(state: ManagedMemoryState): string {\n\treturn `${JSON.stringify(state)}\\n`;\n}\n\nasync function writeManagedMemoryState(filePath: string, state: ManagedMemoryState): Promise<void> {\n\tawait writeFileAtomic(managedMemoryStatePath(filePath), serializeManagedMemoryState(state), { mode: 0o600 });\n}\n\nfunction reconcileManagedMemoryState(\n\tcurrentDigest: string,\n\tstate: ManagedMemoryState,\n): { recognized: true; state: ManagedMemoryState; changed: boolean } | { recognized: false } {\n\tif (currentDigest === state.committedDigest) {\n\t\tif (state.pendingDigest === undefined) return { recognized: true, state, changed: false };\n\t\treturn {\n\t\t\trecognized: true,\n\t\t\tstate: { version: 1, committedDigest: state.committedDigest },\n\t\t\tchanged: true,\n\t\t};\n\t}\n\tif (state.pendingDigest !== undefined && currentDigest === state.pendingDigest) {\n\t\treturn {\n\t\t\trecognized: true,\n\t\t\tstate: { version: 1, committedDigest: state.pendingDigest },\n\t\t\tchanged: true,\n\t\t};\n\t}\n\treturn { recognized: false };\n}\n\nfunction fitMemoryBlockToBudget(block: string, budget: MemoryPromptBudget | undefined): string {\n\tif (budget === undefined) return block;\n\tif (!budget.enabled || budget.maxLines <= 0 || budget.maxChars <= 0) return \"\";\n\tif (block.split(\"\\n\").length <= budget.maxLines && block.length <= budget.maxChars) return block;\n\t// Micro-context profiles deliberately omit a block that cannot fit whole. Larger constrained\n\t// profiles retain a bounded head and say explicitly that more memory exists on disk.\n\tif (budget.compact) return \"\";\n\n\tconst marker = \"[…memory truncated for capability budget; full files remain on disk]\";\n\tif (budget.maxLines < 2 || budget.maxChars <= marker.length + 1) return \"\";\n\tconst lines: string[] = [];\n\tlet chars = 0;\n\tconst contentCharLimit = budget.maxChars - marker.length - 1;\n\tfor (const line of block.split(\"\\n\")) {\n\t\tif (lines.length >= budget.maxLines - 1) break;\n\t\tconst separatorChars = lines.length > 0 ? 1 : 0;\n\t\tconst remaining = contentCharLimit - chars - separatorChars;\n\t\tif (remaining <= 0) break;\n\t\tconst rendered = line.length <= remaining ? line : `${line.slice(0, Math.max(0, remaining - 1))}…`;\n\t\tlines.push(rendered);\n\t\tchars += separatorChars + rendered.length;\n\t\tif (rendered.length !== line.length) break;\n\t}\n\tif (lines.length === 0) return \"\";\n\tlines.push(marker);\n\treturn lines.join(\"\\n\");\n}\n\nexport class FileStoreProvider implements MemoryProvider {\n\tpublic readonly name = \"file-store\";\n\tpublic readonly egress = \"local\";\n\n\tprivate ctx?: MemoryLifecycleContext;\n\tprivate memoryFilePath = \"\";\n\tprivate userFilePath = \"\";\n\n\tprivate lastWrittenMemory = \"\";\n\tprivate lastWrittenUser = \"\";\n\tprivate userArchive?: UserMemoryArchive;\n\tprivate readonly options: FileStoreProviderOptions;\n\n\t// Character budgets\n\tprivate static readonly BUDGET_MEMORY = 2200;\n\tprivate static readonly BUDGET_USER = 1375;\n\n\tconstructor(options: FileStoreProviderOptions = {}) {\n\t\tthis.options = options;\n\t}\n\n\tpublic isAvailable(): boolean {\n\t\treturn true;\n\t}\n\n\tpublic getCapabilities() {\n\t\treturn { surfaces: [\"context\" as const] };\n\t}\n\n\tpublic async initialize(_sessionId: string, ctx: MemoryLifecycleContext): Promise<void> {\n\t\tthis.ctx = ctx;\n\t\tthis.memoryFilePath = configFile(ctx.agentDir, \"MEMORY.md\");\n\t\tthis.userFilePath = configFile(ctx.agentDir, \"USER.md\");\n\t\tthis.userArchive = new UserMemoryArchive(ctx.agentDir);\n\n\t\tawait fs.mkdir(ctx.agentDir, { recursive: true });\n\t\t[this.lastWrittenMemory, this.lastWrittenUser] = await Promise.all([\n\t\t\tthis.initializeManagedFile(this.memoryFilePath),\n\t\t\tthis.initializeManagedFile(this.userFilePath),\n\t\t]);\n\t}\n\n\tprivate async initializeManagedFile(filePath: string): Promise<string> {\n\t\treturn withFileLock(filePath, async () => {\n\t\t\tlet current = \"\";\n\t\t\ttry {\n\t\t\t\tcurrent = await fs.readFile(filePath, \"utf8\");\n\t\t\t} catch (error) {\n\t\t\t\tif (!isMissingFileError(error)) throw error;\n\t\t\t\tawait writeFileAtomic(filePath, \"\", { mode: 0o600 });\n\t\t\t}\n\n\t\t\tconst currentDigest = contentDigest(current);\n\t\t\tconst stateRead = await readManagedMemoryState(filePath);\n\t\t\tif (stateRead.status === \"missing\") {\n\t\t\t\tawait writeManagedMemoryState(filePath, { version: 1, committedDigest: currentDigest });\n\t\t\t\treturn current;\n\t\t\t}\n\t\t\tif (stateRead.status === \"invalid\") {\n\t\t\t\tawait writeFileAtomic(\n\t\t\t\t\t`${managedMemoryStatePath(filePath)}.bak.${Date.now()}.${randomUUID()}`,\n\t\t\t\t\tstateRead.raw,\n\t\t\t\t\t{ mode: 0o600 },\n\t\t\t\t);\n\t\t\t\tawait writeManagedMemoryState(filePath, { version: 1, committedDigest: currentDigest });\n\t\t\t\treturn current;\n\t\t\t}\n\n\t\t\tconst reconciled = reconcileManagedMemoryState(currentDigest, stateRead.state);\n\t\t\tif (reconciled.recognized && reconciled.changed) {\n\t\t\t\tawait writeManagedMemoryState(filePath, reconciled.state);\n\t\t\t}\n\t\t\treturn current;\n\t\t});\n\t}\n\n\tpublic systemPromptBlock(budget?: MemoryPromptBudget): string {\n\t\tconst sanitize = (content: string) => {\n\t\t\t// Strip hidden/bidi-control chars before injecting memory into the prompt (defence in depth: the\n\t\t\t// write path already blocks them, but a file edited out-of-band could carry them). Strip #31.\n\t\t\tconst lines = stripInvisibleUnicode(content).cleaned.split(\"\\n\");\n\t\t\tconst sanitizedLines = lines.map((line) => {\n\t\t\t\tconst threats = scanContextFileThreats(line);\n\t\t\t\tif (threats.length > 0) {\n\t\t\t\t\treturn `[BLOCKED: potential threat detected (${threats.join(\", \")})]`;\n\t\t\t\t}\n\t\t\t\treturn line;\n\t\t\t});\n\t\t\treturn sanitizedLines.join(\"\\n\");\n\t\t};\n\n\t\t// Read-time budget guard (cost): the memory tool already caps writes at BUDGET_*, but a file edited\n\t\t// externally (or by any path that bypasses the tool) could be arbitrarily large and would then\n\t\t// bloat the system prompt on EVERY turn. Cap the injected view to the same budget so the per-turn\n\t\t// cost stays bounded; the file on disk is untouched and the model is told it was truncated.\n\t\tconst cap = (content: string, limit: number) => {\n\t\t\tif (content.length <= limit) return content;\n\t\t\treturn `${content.slice(0, limit)}\\n[…truncated to ${limit} chars for the prompt; full file is on disk]`;\n\t\t};\n\n\t\tconst mem = cap(sanitize(this.lastWrittenMemory), FileStoreProvider.BUDGET_MEMORY);\n\t\tconst usr = cap(sanitize(this.lastWrittenUser), FileStoreProvider.BUDGET_USER);\n\n\t\tconst blocks: string[] = [];\n\t\tif (mem.trim()) {\n\t\t\tblocks.push(`## MEMORY.md:\\n${mem}`);\n\t\t}\n\t\tif (usr.trim()) {\n\t\t\tblocks.push(`## USER.md:\\n${usr}`);\n\t\t}\n\n\t\tif (blocks.length === 0) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tconst block = `=== Persistent Memory (file-store) ===\\n${FILE_STORE_MEMORY_SYSTEM_NOTE}\\n\\n${blocks.join(\"\\n\\n\")}`;\n\t\treturn fitMemoryBlockToBudget(block, budget);\n\t}\n\n\tpublic async prefetch(_query: string): Promise<string> {\n\t\t// static system prompt block is sufficient for file-store default; no-op prefetch\n\t\treturn \"\";\n\t}\n\n\tpublic async shutdown(): Promise<void> {\n\t\t// no-op\n\t}\n\n\tpublic getContextMarkers(): string[] {\n\t\treturn [];\n\t}\n\n\tpublic getToolDefinitions(): ToolDefinition[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\tname: \"memory\",\n\t\t\t\tlabel: \"Persistent Memory Manager\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Add, replace, or remove durable project facts and user preferences. Proactively store newly verified reusable facts; USER.md overflow is migrated into indexed OKF shards.\",\n\t\t\t\tparameters: memorySchema,\n\t\t\t\texecute: async (_toolCallId, params: MemoryParams, _signal, _onUpdate, _execCtx) => {\n\t\t\t\t\tif (this.ctx?.isChildSession) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\ttext: \"Error: Writes to persistent memory are not allowed in child sessions (subagents).\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdetails: { success: false, error: \"Child session write-gated\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tconst { action, target, content, oldContent } = params;\n\n\t\t\t\t\t// Strict-scope injection guard on the high-privilege WRITE path (agy #31): a poisoned\n\t\t\t\t\t// memory entry persists across sessions and is injected into every future system prompt,\n\t\t\t\t\t// so block outright rather than strip. Hidden/bidi-control chars have no legitimate place\n\t\t\t\t\t// in a memory note, so reject those too.\n\t\t\t\t\tif ((action === \"add\" || action === \"replace\") && content !== undefined) {\n\t\t\t\t\t\tif (hasInvisibleUnicode(content)) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\ttext: \"Error: memory write rejected — contains hidden/bidirectional control characters.\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tdetails: { success: false, error: \"Invisible unicode in memory write\" },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst threats = scanContextFileThreats(content, \"strict\");\n\t\t\t\t\t\tif (threats.length > 0) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\ttext: `Error: memory write rejected — potential injection/exfiltration detected (${threats.join(\", \")}).`,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tdetails: { success: false, error: \"Threat in memory write\" },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst filePath = target === \"memory\" ? this.memoryFilePath : this.userFilePath;\n\t\t\t\t\tconst budget = target === \"memory\" ? FileStoreProvider.BUDGET_MEMORY : FileStoreProvider.BUDGET_USER;\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn await withFileLock(filePath, async () => {\n\t\t\t\t\t\t\tconst currentOnDisk = await fs.readFile(filePath, \"utf8\");\n\t\t\t\t\t\t\tconst currentDigest = contentDigest(currentOnDisk);\n\t\t\t\t\t\t\tconst stateRead = await readManagedMemoryState(filePath);\n\t\t\t\t\t\t\tlet managedState: ManagedMemoryState | undefined;\n\t\t\t\t\t\t\tif (stateRead.status === \"valid\") {\n\t\t\t\t\t\t\t\tconst reconciled = reconcileManagedMemoryState(currentDigest, stateRead.state);\n\t\t\t\t\t\t\t\tif (reconciled.recognized) {\n\t\t\t\t\t\t\t\t\tmanagedState = reconciled.state;\n\t\t\t\t\t\t\t\t\tif (reconciled.changed) await writeManagedMemoryState(filePath, reconciled.state);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!managedState) {\n\t\t\t\t\t\t\t\tconst backupPath = `${filePath}.bak.${Date.now()}`;\n\t\t\t\t\t\t\t\tawait writeFileAtomic(backupPath, currentOnDisk, { mode: 0o600 });\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\ttext: `Error: Drift detected. The memory file has been modified out-of-band by an external process. A backup was created at ${backupPath}. Operation aborted.`,\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\tdetails: { success: false, error: \"Drift detected\" },\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// A peer session's committed write is authoritative. Refresh this provider's prompt\n\t\t\t\t\t\t\t// snapshot before applying the caller's mutation to that current content.\n\t\t\t\t\t\t\tif (target === \"memory\") this.lastWrittenMemory = currentOnDisk;\n\t\t\t\t\t\t\telse this.lastWrittenUser = currentOnDisk;\n\n\t\t\t\t\t\t\tlet newContent = currentOnDisk;\n\t\t\t\t\t\t\tlet archiveChanged = false;\n\t\t\t\t\t\t\tif (target === \"user\") {\n\t\t\t\t\t\t\t\tif (!this.userArchive) throw new Error(\"User memory archive is not initialized.\");\n\t\t\t\t\t\t\t\tif (action === \"add\") {\n\t\t\t\t\t\t\t\t\tif (content === undefined)\n\t\t\t\t\t\t\t\t\t\tthrow new Error(\"Parameter 'content' is required for action 'add'.\");\n\t\t\t\t\t\t\t\t\tconst result = await this.userArchive.apply(\n\t\t\t\t\t\t\t\t\t\tcurrentOnDisk,\n\t\t\t\t\t\t\t\t\t\t{ action, content },\n\t\t\t\t\t\t\t\t\t\tbudget,\n\t\t\t\t\t\t\t\t\t\tsupersedeNearDuplicateLine,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tnewContent = result.userContent;\n\t\t\t\t\t\t\t\t\tarchiveChanged = result.archiveChanged;\n\t\t\t\t\t\t\t\t} else if (action === \"replace\") {\n\t\t\t\t\t\t\t\t\tif (content === undefined || oldContent === undefined) {\n\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t\"Parameters 'content' and 'oldContent' are required for action 'replace'.\",\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\tconst result = await this.userArchive.apply(\n\t\t\t\t\t\t\t\t\t\tcurrentOnDisk,\n\t\t\t\t\t\t\t\t\t\t{ action, content, oldContent },\n\t\t\t\t\t\t\t\t\t\tbudget,\n\t\t\t\t\t\t\t\t\t\tsupersedeNearDuplicateLine,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tnewContent = result.userContent;\n\t\t\t\t\t\t\t\t\tarchiveChanged = result.archiveChanged;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tif (oldContent === undefined)\n\t\t\t\t\t\t\t\t\t\tthrow new Error(\"Parameter 'oldContent' is required for action 'remove'.\");\n\t\t\t\t\t\t\t\t\tconst result = await this.userArchive.apply(\n\t\t\t\t\t\t\t\t\t\tcurrentOnDisk,\n\t\t\t\t\t\t\t\t\t\t{ action, oldContent },\n\t\t\t\t\t\t\t\t\t\tbudget,\n\t\t\t\t\t\t\t\t\t\tsupersedeNearDuplicateLine,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tnewContent = result.userContent;\n\t\t\t\t\t\t\t\t\tarchiveChanged = result.archiveChanged;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (action === \"add\") {\n\t\t\t\t\t\t\t\tif (content === undefined) {\n\t\t\t\t\t\t\t\t\tthrow new Error(\"Parameter 'content' is required for action 'add'.\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst superseded = supersedeNearDuplicateLine(currentOnDisk, content);\n\t\t\t\t\t\t\t\tif (superseded !== null) {\n\t\t\t\t\t\t\t\t\tnewContent = superseded;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewContent =\n\t\t\t\t\t\t\t\t\t\tnewContent.endsWith(\"\\n\") || newContent === \"\"\n\t\t\t\t\t\t\t\t\t\t\t? `${newContent}${content}\\n`\n\t\t\t\t\t\t\t\t\t\t\t: `${newContent}\\n${content}\\n`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (action === \"replace\") {\n\t\t\t\t\t\t\t\tif (content === undefined || oldContent === undefined) {\n\t\t\t\t\t\t\t\t\tthrow new Error(\"Parameters 'content' and 'oldContent' are required for action 'replace'.\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!currentOnDisk.includes(oldContent)) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`The content to replace ('oldContent') was not found in the file.`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tnewContent = currentOnDisk.replace(oldContent, content);\n\t\t\t\t\t\t\t} else if (action === \"remove\") {\n\t\t\t\t\t\t\t\tif (oldContent === undefined) {\n\t\t\t\t\t\t\t\t\tthrow new Error(\"Parameter 'oldContent' is required for action 'remove'.\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!currentOnDisk.includes(oldContent)) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`The content to remove ('oldContent') was not found in the file.`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tnewContent = currentOnDisk.replace(oldContent, \"\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (newContent.length > budget) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\ttext: `Error: Memory budget exceeded. ${target === \"memory\" ? \"MEMORY.md\" : \"USER.md\"} limit is ${budget} characters. Current operation would result in ${newContent.length} characters.`,\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\tdetails: { success: false, error: \"Memory budget exceeded\" },\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (newContent !== currentOnDisk) {\n\t\t\t\t\t\t\t\tconst newDigest = contentDigest(newContent);\n\t\t\t\t\t\t\t\tawait writeManagedMemoryState(filePath, {\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\tcommittedDigest: managedState.committedDigest,\n\t\t\t\t\t\t\t\t\tpendingDigest: newDigest,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tawait writeFileAtomic(filePath, newContent, { mode: 0o600 });\n\t\t\t\t\t\t\t\tawait writeManagedMemoryState(filePath, { version: 1, committedDigest: newDigest });\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (target === \"memory\") this.lastWrittenMemory = newContent;\n\t\t\t\t\t\t\telse this.lastWrittenUser = newContent;\n\t\t\t\t\t\t\tif (archiveChanged || newContent !== currentOnDisk) this.options.onDurableMemoryChanged?.();\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\ttext: `Successfully updated ${target === \"memory\" ? \"MEMORY.md\" : \"USER.md\"}.`,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tdetails: { success: true },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\ttext: `Error: Failed to perform memory operation: ${String(err)}`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdetails: { success: false, error: String(err) },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t}\n}\n"]}
@@ -3,7 +3,7 @@ import { promises as fs } from "node:fs";
3
3
  import { join } from "node:path";
4
4
  import { okfMemoryDir } from "../../agent-paths.js";
5
5
  import { formatOkfMemoryDocument, parseOkfMemoryDocument } from "../../context/okf-memory.js";
6
- import { hasInvisibleUnicode, scanContextFileThreats } from "../../resource-loader.js";
6
+ import { hasInvisibleUnicode, scanContextFileThreats } from "../../security/context-threat-scanner.js";
7
7
  const ARCHIVE_DIR_NAME = "user-preferences";
8
8
  const ARCHIVE_INDEX_NAME = "index.okf.md";
9
9
  const SHARD_NAME_RE = /^user-preferences-([a-f0-9]{16})\.okf\.md$/;
@@ -1 +1 @@
1
- {"version":3,"file":"user-memory-archive.js","sourceRoot":"","sources":["../../../../src/core/memory/providers/user-memory-archive.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { type Dirent, promises as fs } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { okfMemoryDir } from \"../../agent-paths.ts\";\nimport { formatOkfMemoryDocument, parseOkfMemoryDocument } from \"../../context/okf-memory.ts\";\nimport { hasInvisibleUnicode, scanContextFileThreats } from \"../../resource-loader.ts\";\n\nconst ARCHIVE_DIR_NAME = \"user-preferences\";\nconst ARCHIVE_INDEX_NAME = \"index.okf.md\";\nconst SHARD_NAME_RE = /^user-preferences-([a-f0-9]{16})\\.okf\\.md$/;\nconst MAX_SHARD_BODY_CHARS = 64_000;\n\nexport const USER_ARCHIVE_POINTER =\n\t\"# User profile\\n\\nArchived preferences: [User preference archive](okf-memory/user-preferences/index.okf.md).\\n\";\n\nexport type UserMemoryAction =\n\t| { action: \"add\"; content: string }\n\t| { action: \"replace\"; oldContent: string; content: string }\n\t| { action: \"remove\"; oldContent: string };\n\nexport interface UserMemoryMutationResult {\n\tuserContent: string;\n\tarchiveChanged: boolean;\n}\n\ninterface UserPreferenceShard {\n\tpath: string;\n\tname: string;\n\tbody: string;\n\ttitle: string;\n\ttimestamp?: string;\n}\n\nfunction appendLine(existing: string, content: string): string {\n\treturn existing.endsWith(\"\\n\") || existing === \"\" ? `${existing}${content}\\n` : `${existing}\\n${content}\\n`;\n}\n\nfunction activeUserContent(content: string): { active: string; managed: boolean } {\n\tif (!content.startsWith(USER_ARCHIVE_POINTER)) return { active: content, managed: false };\n\treturn { active: content.slice(USER_ARCHIVE_POINTER.length), managed: true };\n}\n\nfunction safeDescription(body: string): string {\n\tconst line = body\n\t\t.split(\"\\n\")\n\t\t.map((candidate) => candidate.trim())\n\t\t.find((candidate) => candidate.length > 0 && !candidate.startsWith(\"#\"));\n\tconst normalized = (line ?? \"Archived user preferences\")\n\t\t.replace(/^[-*+]\\s+/, \"\")\n\t\t.replace(/[<>[\\]()]/g, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n\treturn normalized.slice(0, 220) || \"Archived user preferences\";\n}\n\nfunction splitArchiveBody(body: string): string[] {\n\tconst chunks: string[] = [];\n\tlet remaining = body;\n\twhile (remaining.length > MAX_SHARD_BODY_CHARS) {\n\t\tconst newline = remaining.lastIndexOf(\"\\n\", MAX_SHARD_BODY_CHARS);\n\t\tconst end = newline >= Math.floor(MAX_SHARD_BODY_CHARS / 2) ? newline : MAX_SHARD_BODY_CHARS;\n\t\tchunks.push(remaining.slice(0, end));\n\t\tremaining = remaining.slice(end + (remaining[end] === \"\\n\" ? 1 : 0));\n\t}\n\tif (remaining.length > 0) chunks.push(remaining);\n\treturn chunks;\n}\n\nasync function atomicWrite(path: string, content: string): Promise<void> {\n\tconst temporaryPath = `${path}.tmp-${process.pid}`;\n\tawait fs.writeFile(temporaryPath, content, \"utf8\");\n\tawait fs.rename(temporaryPath, path);\n}\n\n/**\n * Owns USER.md overflow migration and archived preference mutation. USER.md stays the bounded hot\n * index; canonical overflow content lives in valid OKF documents discovered by the existing memory\n * provider. The caller owns the USER.md lock, so every multi-file operation is serialized through\n * the same mandatory write path.\n */\nexport class UserMemoryArchive {\n\tprivate readonly archiveDir: string;\n\tprivate readonly indexPath: string;\n\n\tconstructor(agentDir: string) {\n\t\tthis.archiveDir = join(okfMemoryDir(agentDir), ARCHIVE_DIR_NAME);\n\t\tthis.indexPath = join(this.archiveDir, ARCHIVE_INDEX_NAME);\n\t}\n\n\tasync apply(\n\t\tcurrentUser: string,\n\t\taction: UserMemoryAction,\n\t\tbudget: number,\n\t\tsupersedeNearDuplicate: (existing: string, content: string) => string | null,\n\t): Promise<UserMemoryMutationResult> {\n\t\t// Validate the generated storage boundary before any shard discovery. Otherwise a symlinked\n\t\t// archive directory could redirect a replace/remove before the later index rebuild rejected it.\n\t\tawait this.ensureArchiveDir();\n\t\tconst split = activeUserContent(currentUser);\n\t\tlet active = split.active;\n\t\tlet archiveChanged = false;\n\n\t\tif (action.action === \"add\") {\n\t\t\tconst supersededActive = supersedeNearDuplicate(active, action.content);\n\t\t\tif (supersededActive !== null) {\n\t\t\t\tactive = supersededActive;\n\t\t\t} else if (await this.supersedeArchivedFact(action.content, supersedeNearDuplicate)) {\n\t\t\t\tarchiveChanged = true;\n\t\t\t} else {\n\t\t\t\tactive = appendLine(active, action.content);\n\t\t\t}\n\t\t} else {\n\t\t\tconst replacement = action.action === \"replace\" ? action.content : \"\";\n\t\t\tif (active.includes(action.oldContent)) {\n\t\t\t\tactive = active.replace(action.oldContent, replacement);\n\t\t\t} else if (await this.replaceArchivedFact(action.oldContent, replacement)) {\n\t\t\t\tarchiveChanged = true;\n\t\t\t} else {\n\t\t\t\tthrow new Error(`The content to ${action.action} ('oldContent') was not found in the file or its archive.`);\n\t\t\t}\n\t\t}\n\n\t\tif (archiveChanged) {\n\t\t\tawait this.rebuildIndex();\n\t\t\treturn { userContent: currentUser, archiveChanged: true };\n\t\t}\n\n\t\tconst hasArchive = split.managed || (await this.hasArchivedShards());\n\t\tconst candidate = `${hasArchive ? USER_ARCHIVE_POINTER : \"\"}${active}`;\n\t\tif (candidate.length <= budget) {\n\t\t\tif (hasArchive) await this.rebuildIndex();\n\t\t\treturn { userContent: candidate, archiveChanged: false };\n\t\t}\n\n\t\tconst body = active.trim();\n\t\tif (!body) throw new Error(\"USER.md index exceeds its character budget without archivable content.\");\n\t\tthis.validateArchiveContent(body);\n\t\tawait this.archiveBody(body);\n\t\tawait this.rebuildIndex();\n\t\treturn { userContent: USER_ARCHIVE_POINTER, archiveChanged: true };\n\t}\n\n\tprivate validateArchiveContent(body: string): void {\n\t\tif (hasInvisibleUnicode(body) || scanContextFileThreats(body, \"strict\").length > 0) {\n\t\t\tthrow new Error(\"USER.md contains unsafe content and cannot be migrated into durable memory shards.\");\n\t\t}\n\t}\n\n\tprivate async ensureArchiveDir(): Promise<void> {\n\t\tawait fs.mkdir(this.archiveDir, { recursive: true });\n\t\tconst stat = await fs.lstat(this.archiveDir);\n\t\tif (!stat.isDirectory() || stat.isSymbolicLink()) {\n\t\t\tthrow new Error(\"User memory archive path must be a real directory, not a symlink.\");\n\t\t}\n\t}\n\n\tprivate async shardFiles(): Promise<UserPreferenceShard[]> {\n\t\tlet entries: Dirent[];\n\t\ttry {\n\t\t\tentries = await fs.readdir(this.archiveDir, { withFileTypes: true, encoding: \"utf8\" });\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t\tconst shards: UserPreferenceShard[] = [];\n\t\tfor (const entry of entries) {\n\t\t\tif (!entry.isFile() || !SHARD_NAME_RE.test(entry.name)) continue;\n\t\t\tconst path = join(this.archiveDir, entry.name);\n\t\t\tlet content: string;\n\t\t\ttry {\n\t\t\t\tcontent = await fs.readFile(path, \"utf8\");\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst parsed = parseOkfMemoryDocument(content, { uri: `okf:${ARCHIVE_DIR_NAME}/${entry.name}` });\n\t\t\tif (parsed.diagnostics.length > 0 || parsed.item?.kind !== \"user_preference\") continue;\n\t\t\tshards.push({\n\t\t\t\tpath,\n\t\t\t\tname: entry.name,\n\t\t\t\tbody: parsed.body,\n\t\t\t\ttitle: parsed.item.title ?? `User preference shard ${entry.name.slice(17, 33)}`,\n\t\t\t\ttimestamp: parsed.item.timestamp,\n\t\t\t});\n\t\t}\n\t\treturn shards.sort((left, right) => left.name.localeCompare(right.name));\n\t}\n\n\tprivate async hasArchivedShards(): Promise<boolean> {\n\t\treturn (await this.shardFiles()).length > 0;\n\t}\n\n\tprivate async archiveBody(body: string): Promise<void> {\n\t\tawait this.ensureArchiveDir();\n\t\tconst migrationDigest = createHash(\"sha256\").update(body).digest(\"hex\");\n\t\tconst chunks = splitArchiveBody(body);\n\t\tfor (let index = 0; index < chunks.length; index++) {\n\t\t\tconst chunk = chunks[index];\n\t\t\tif (chunk === undefined) continue;\n\t\t\tconst identity = `${migrationDigest}\\0${index}`;\n\t\t\tawait this.writeNewShard(chunk, identity);\n\t\t}\n\t}\n\n\tprivate async writeNewShard(body: string, identity: string): Promise<void> {\n\t\tconst hash = createHash(\"sha256\").update(identity).digest(\"hex\").slice(0, 16);\n\t\tconst name = `user-preferences-${hash}.okf.md`;\n\t\tconst path = join(this.archiveDir, name);\n\t\ttry {\n\t\t\tconst existing = await fs.readFile(path, \"utf8\");\n\t\t\tconst parsed = parseOkfMemoryDocument(existing);\n\t\t\tif (parsed.diagnostics.length === 0 && parsed.body.trim() === body) return;\n\t\t\tthrow new Error(`User memory shard hash collision at ${name}.`);\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n\t\t}\n\n\t\tconst timestamp = new Date().toISOString();\n\t\tawait atomicWrite(\n\t\t\tpath,\n\t\t\tformatOkfMemoryDocument({\n\t\t\t\ttype: \"User Preference\",\n\t\t\t\ttitle: `User preference shard ${hash}`,\n\t\t\t\tdescription: safeDescription(body),\n\t\t\t\tscope: \"user\",\n\t\t\t\tbody,\n\t\t\t\ttags: [\"user-preferences\", \"archived\"],\n\t\t\t\ttimestamp,\n\t\t\t}),\n\t\t);\n\t}\n\n\tprivate async writeShard(shard: UserPreferenceShard, body: string): Promise<void> {\n\t\tif (!body.trim()) {\n\t\t\tawait fs.unlink(shard.path);\n\t\t\treturn;\n\t\t}\n\t\tthis.validateArchiveContent(body);\n\t\tconst chunks = splitArchiveBody(body);\n\t\tconst first = chunks[0];\n\t\tif (first === undefined) return;\n\t\tawait atomicWrite(\n\t\t\tshard.path,\n\t\t\tformatOkfMemoryDocument({\n\t\t\t\ttype: \"User Preference\",\n\t\t\t\ttitle: shard.title,\n\t\t\t\tdescription: safeDescription(first),\n\t\t\t\tscope: \"user\",\n\t\t\t\tbody: first,\n\t\t\t\ttags: [\"user-preferences\", \"archived\"],\n\t\t\t\ttimestamp: shard.timestamp,\n\t\t\t}),\n\t\t);\n\t\tconst mutationDigest = createHash(\"sha256\").update(`${shard.name}\\0${body}`).digest(\"hex\");\n\t\tfor (let index = 1; index < chunks.length; index++) {\n\t\t\tconst chunk = chunks[index];\n\t\t\tif (chunk !== undefined) await this.writeNewShard(chunk, `${mutationDigest}\\0${index}`);\n\t\t}\n\t}\n\n\tprivate async supersedeArchivedFact(\n\t\tcontent: string,\n\t\tsupersedeNearDuplicate: (existing: string, content: string) => string | null,\n\t): Promise<boolean> {\n\t\tfor (const shard of await this.shardFiles()) {\n\t\t\tconst superseded = supersedeNearDuplicate(shard.body, content);\n\t\t\tif (superseded === null) continue;\n\t\t\tawait this.writeShard(shard, superseded);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate async replaceArchivedFact(oldContent: string, replacement: string): Promise<boolean> {\n\t\tfor (const shard of await this.shardFiles()) {\n\t\t\tif (!shard.body.includes(oldContent)) continue;\n\t\t\tawait this.writeShard(shard, shard.body.replace(oldContent, replacement));\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate async rebuildIndex(): Promise<void> {\n\t\tawait this.ensureArchiveDir();\n\t\tconst shards = await this.shardFiles();\n\t\tconst body =\n\t\t\tshards.length === 0\n\t\t\t\t? \"No archived user preference shards.\"\n\t\t\t\t: shards.map((shard) => `- [${shard.name}](./${shard.name}): ${safeDescription(shard.body)}`).join(\"\\n\");\n\t\tawait atomicWrite(\n\t\t\tthis.indexPath,\n\t\t\tformatOkfMemoryDocument({\n\t\t\t\ttype: \"User Preference\",\n\t\t\t\ttitle: \"User preference archive index\",\n\t\t\t\tdescription: \"Index of archived durable user preference shards.\",\n\t\t\t\tscope: \"user\",\n\t\t\t\tbody,\n\t\t\t\ttags: [\"user-preferences\", \"index\"],\n\t\t\t}),\n\t\t);\n\t}\n}\n"]}
1
+ {"version":3,"file":"user-memory-archive.js","sourceRoot":"","sources":["../../../../src/core/memory/providers/user-memory-archive.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { type Dirent, promises as fs } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { okfMemoryDir } from \"../../agent-paths.ts\";\nimport { formatOkfMemoryDocument, parseOkfMemoryDocument } from \"../../context/okf-memory.ts\";\nimport { hasInvisibleUnicode, scanContextFileThreats } from \"../../security/context-threat-scanner.ts\";\n\nconst ARCHIVE_DIR_NAME = \"user-preferences\";\nconst ARCHIVE_INDEX_NAME = \"index.okf.md\";\nconst SHARD_NAME_RE = /^user-preferences-([a-f0-9]{16})\\.okf\\.md$/;\nconst MAX_SHARD_BODY_CHARS = 64_000;\n\nexport const USER_ARCHIVE_POINTER =\n\t\"# User profile\\n\\nArchived preferences: [User preference archive](okf-memory/user-preferences/index.okf.md).\\n\";\n\nexport type UserMemoryAction =\n\t| { action: \"add\"; content: string }\n\t| { action: \"replace\"; oldContent: string; content: string }\n\t| { action: \"remove\"; oldContent: string };\n\nexport interface UserMemoryMutationResult {\n\tuserContent: string;\n\tarchiveChanged: boolean;\n}\n\ninterface UserPreferenceShard {\n\tpath: string;\n\tname: string;\n\tbody: string;\n\ttitle: string;\n\ttimestamp?: string;\n}\n\nfunction appendLine(existing: string, content: string): string {\n\treturn existing.endsWith(\"\\n\") || existing === \"\" ? `${existing}${content}\\n` : `${existing}\\n${content}\\n`;\n}\n\nfunction activeUserContent(content: string): { active: string; managed: boolean } {\n\tif (!content.startsWith(USER_ARCHIVE_POINTER)) return { active: content, managed: false };\n\treturn { active: content.slice(USER_ARCHIVE_POINTER.length), managed: true };\n}\n\nfunction safeDescription(body: string): string {\n\tconst line = body\n\t\t.split(\"\\n\")\n\t\t.map((candidate) => candidate.trim())\n\t\t.find((candidate) => candidate.length > 0 && !candidate.startsWith(\"#\"));\n\tconst normalized = (line ?? \"Archived user preferences\")\n\t\t.replace(/^[-*+]\\s+/, \"\")\n\t\t.replace(/[<>[\\]()]/g, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n\treturn normalized.slice(0, 220) || \"Archived user preferences\";\n}\n\nfunction splitArchiveBody(body: string): string[] {\n\tconst chunks: string[] = [];\n\tlet remaining = body;\n\twhile (remaining.length > MAX_SHARD_BODY_CHARS) {\n\t\tconst newline = remaining.lastIndexOf(\"\\n\", MAX_SHARD_BODY_CHARS);\n\t\tconst end = newline >= Math.floor(MAX_SHARD_BODY_CHARS / 2) ? newline : MAX_SHARD_BODY_CHARS;\n\t\tchunks.push(remaining.slice(0, end));\n\t\tremaining = remaining.slice(end + (remaining[end] === \"\\n\" ? 1 : 0));\n\t}\n\tif (remaining.length > 0) chunks.push(remaining);\n\treturn chunks;\n}\n\nasync function atomicWrite(path: string, content: string): Promise<void> {\n\tconst temporaryPath = `${path}.tmp-${process.pid}`;\n\tawait fs.writeFile(temporaryPath, content, \"utf8\");\n\tawait fs.rename(temporaryPath, path);\n}\n\n/**\n * Owns USER.md overflow migration and archived preference mutation. USER.md stays the bounded hot\n * index; canonical overflow content lives in valid OKF documents discovered by the existing memory\n * provider. The caller owns the USER.md lock, so every multi-file operation is serialized through\n * the same mandatory write path.\n */\nexport class UserMemoryArchive {\n\tprivate readonly archiveDir: string;\n\tprivate readonly indexPath: string;\n\n\tconstructor(agentDir: string) {\n\t\tthis.archiveDir = join(okfMemoryDir(agentDir), ARCHIVE_DIR_NAME);\n\t\tthis.indexPath = join(this.archiveDir, ARCHIVE_INDEX_NAME);\n\t}\n\n\tasync apply(\n\t\tcurrentUser: string,\n\t\taction: UserMemoryAction,\n\t\tbudget: number,\n\t\tsupersedeNearDuplicate: (existing: string, content: string) => string | null,\n\t): Promise<UserMemoryMutationResult> {\n\t\t// Validate the generated storage boundary before any shard discovery. Otherwise a symlinked\n\t\t// archive directory could redirect a replace/remove before the later index rebuild rejected it.\n\t\tawait this.ensureArchiveDir();\n\t\tconst split = activeUserContent(currentUser);\n\t\tlet active = split.active;\n\t\tlet archiveChanged = false;\n\n\t\tif (action.action === \"add\") {\n\t\t\tconst supersededActive = supersedeNearDuplicate(active, action.content);\n\t\t\tif (supersededActive !== null) {\n\t\t\t\tactive = supersededActive;\n\t\t\t} else if (await this.supersedeArchivedFact(action.content, supersedeNearDuplicate)) {\n\t\t\t\tarchiveChanged = true;\n\t\t\t} else {\n\t\t\t\tactive = appendLine(active, action.content);\n\t\t\t}\n\t\t} else {\n\t\t\tconst replacement = action.action === \"replace\" ? action.content : \"\";\n\t\t\tif (active.includes(action.oldContent)) {\n\t\t\t\tactive = active.replace(action.oldContent, replacement);\n\t\t\t} else if (await this.replaceArchivedFact(action.oldContent, replacement)) {\n\t\t\t\tarchiveChanged = true;\n\t\t\t} else {\n\t\t\t\tthrow new Error(`The content to ${action.action} ('oldContent') was not found in the file or its archive.`);\n\t\t\t}\n\t\t}\n\n\t\tif (archiveChanged) {\n\t\t\tawait this.rebuildIndex();\n\t\t\treturn { userContent: currentUser, archiveChanged: true };\n\t\t}\n\n\t\tconst hasArchive = split.managed || (await this.hasArchivedShards());\n\t\tconst candidate = `${hasArchive ? USER_ARCHIVE_POINTER : \"\"}${active}`;\n\t\tif (candidate.length <= budget) {\n\t\t\tif (hasArchive) await this.rebuildIndex();\n\t\t\treturn { userContent: candidate, archiveChanged: false };\n\t\t}\n\n\t\tconst body = active.trim();\n\t\tif (!body) throw new Error(\"USER.md index exceeds its character budget without archivable content.\");\n\t\tthis.validateArchiveContent(body);\n\t\tawait this.archiveBody(body);\n\t\tawait this.rebuildIndex();\n\t\treturn { userContent: USER_ARCHIVE_POINTER, archiveChanged: true };\n\t}\n\n\tprivate validateArchiveContent(body: string): void {\n\t\tif (hasInvisibleUnicode(body) || scanContextFileThreats(body, \"strict\").length > 0) {\n\t\t\tthrow new Error(\"USER.md contains unsafe content and cannot be migrated into durable memory shards.\");\n\t\t}\n\t}\n\n\tprivate async ensureArchiveDir(): Promise<void> {\n\t\tawait fs.mkdir(this.archiveDir, { recursive: true });\n\t\tconst stat = await fs.lstat(this.archiveDir);\n\t\tif (!stat.isDirectory() || stat.isSymbolicLink()) {\n\t\t\tthrow new Error(\"User memory archive path must be a real directory, not a symlink.\");\n\t\t}\n\t}\n\n\tprivate async shardFiles(): Promise<UserPreferenceShard[]> {\n\t\tlet entries: Dirent[];\n\t\ttry {\n\t\t\tentries = await fs.readdir(this.archiveDir, { withFileTypes: true, encoding: \"utf8\" });\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t\tconst shards: UserPreferenceShard[] = [];\n\t\tfor (const entry of entries) {\n\t\t\tif (!entry.isFile() || !SHARD_NAME_RE.test(entry.name)) continue;\n\t\t\tconst path = join(this.archiveDir, entry.name);\n\t\t\tlet content: string;\n\t\t\ttry {\n\t\t\t\tcontent = await fs.readFile(path, \"utf8\");\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst parsed = parseOkfMemoryDocument(content, { uri: `okf:${ARCHIVE_DIR_NAME}/${entry.name}` });\n\t\t\tif (parsed.diagnostics.length > 0 || parsed.item?.kind !== \"user_preference\") continue;\n\t\t\tshards.push({\n\t\t\t\tpath,\n\t\t\t\tname: entry.name,\n\t\t\t\tbody: parsed.body,\n\t\t\t\ttitle: parsed.item.title ?? `User preference shard ${entry.name.slice(17, 33)}`,\n\t\t\t\ttimestamp: parsed.item.timestamp,\n\t\t\t});\n\t\t}\n\t\treturn shards.sort((left, right) => left.name.localeCompare(right.name));\n\t}\n\n\tprivate async hasArchivedShards(): Promise<boolean> {\n\t\treturn (await this.shardFiles()).length > 0;\n\t}\n\n\tprivate async archiveBody(body: string): Promise<void> {\n\t\tawait this.ensureArchiveDir();\n\t\tconst migrationDigest = createHash(\"sha256\").update(body).digest(\"hex\");\n\t\tconst chunks = splitArchiveBody(body);\n\t\tfor (let index = 0; index < chunks.length; index++) {\n\t\t\tconst chunk = chunks[index];\n\t\t\tif (chunk === undefined) continue;\n\t\t\tconst identity = `${migrationDigest}\\0${index}`;\n\t\t\tawait this.writeNewShard(chunk, identity);\n\t\t}\n\t}\n\n\tprivate async writeNewShard(body: string, identity: string): Promise<void> {\n\t\tconst hash = createHash(\"sha256\").update(identity).digest(\"hex\").slice(0, 16);\n\t\tconst name = `user-preferences-${hash}.okf.md`;\n\t\tconst path = join(this.archiveDir, name);\n\t\ttry {\n\t\t\tconst existing = await fs.readFile(path, \"utf8\");\n\t\t\tconst parsed = parseOkfMemoryDocument(existing);\n\t\t\tif (parsed.diagnostics.length === 0 && parsed.body.trim() === body) return;\n\t\t\tthrow new Error(`User memory shard hash collision at ${name}.`);\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n\t\t}\n\n\t\tconst timestamp = new Date().toISOString();\n\t\tawait atomicWrite(\n\t\t\tpath,\n\t\t\tformatOkfMemoryDocument({\n\t\t\t\ttype: \"User Preference\",\n\t\t\t\ttitle: `User preference shard ${hash}`,\n\t\t\t\tdescription: safeDescription(body),\n\t\t\t\tscope: \"user\",\n\t\t\t\tbody,\n\t\t\t\ttags: [\"user-preferences\", \"archived\"],\n\t\t\t\ttimestamp,\n\t\t\t}),\n\t\t);\n\t}\n\n\tprivate async writeShard(shard: UserPreferenceShard, body: string): Promise<void> {\n\t\tif (!body.trim()) {\n\t\t\tawait fs.unlink(shard.path);\n\t\t\treturn;\n\t\t}\n\t\tthis.validateArchiveContent(body);\n\t\tconst chunks = splitArchiveBody(body);\n\t\tconst first = chunks[0];\n\t\tif (first === undefined) return;\n\t\tawait atomicWrite(\n\t\t\tshard.path,\n\t\t\tformatOkfMemoryDocument({\n\t\t\t\ttype: \"User Preference\",\n\t\t\t\ttitle: shard.title,\n\t\t\t\tdescription: safeDescription(first),\n\t\t\t\tscope: \"user\",\n\t\t\t\tbody: first,\n\t\t\t\ttags: [\"user-preferences\", \"archived\"],\n\t\t\t\ttimestamp: shard.timestamp,\n\t\t\t}),\n\t\t);\n\t\tconst mutationDigest = createHash(\"sha256\").update(`${shard.name}\\0${body}`).digest(\"hex\");\n\t\tfor (let index = 1; index < chunks.length; index++) {\n\t\t\tconst chunk = chunks[index];\n\t\t\tif (chunk !== undefined) await this.writeNewShard(chunk, `${mutationDigest}\\0${index}`);\n\t\t}\n\t}\n\n\tprivate async supersedeArchivedFact(\n\t\tcontent: string,\n\t\tsupersedeNearDuplicate: (existing: string, content: string) => string | null,\n\t): Promise<boolean> {\n\t\tfor (const shard of await this.shardFiles()) {\n\t\t\tconst superseded = supersedeNearDuplicate(shard.body, content);\n\t\t\tif (superseded === null) continue;\n\t\t\tawait this.writeShard(shard, superseded);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate async replaceArchivedFact(oldContent: string, replacement: string): Promise<boolean> {\n\t\tfor (const shard of await this.shardFiles()) {\n\t\t\tif (!shard.body.includes(oldContent)) continue;\n\t\t\tawait this.writeShard(shard, shard.body.replace(oldContent, replacement));\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate async rebuildIndex(): Promise<void> {\n\t\tawait this.ensureArchiveDir();\n\t\tconst shards = await this.shardFiles();\n\t\tconst body =\n\t\t\tshards.length === 0\n\t\t\t\t? \"No archived user preference shards.\"\n\t\t\t\t: shards.map((shard) => `- [${shard.name}](./${shard.name}): ${safeDescription(shard.body)}`).join(\"\\n\");\n\t\tawait atomicWrite(\n\t\t\tthis.indexPath,\n\t\t\tformatOkfMemoryDocument({\n\t\t\t\ttype: \"User Preference\",\n\t\t\t\ttitle: \"User preference archive index\",\n\t\t\t\tdescription: \"Index of archived durable user preference shards.\",\n\t\t\t\tscope: \"user\",\n\t\t\t\tbody,\n\t\t\t\ttags: [\"user-preferences\", \"index\"],\n\t\t\t}),\n\t\t);\n\t}\n}\n"]}
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * Model registry - manages built-in and custom models, provides API key resolution.
3
3
  */
4
- import { type Api, type AssistantMessageEventStream, type Context, type Model, type OAuthProviderInterface, type SimpleStreamOptions } from "@caupulican/pi-ai";
4
+ import { type OAuthProviderInterface } from "@caupulican/pi-ai/oauth";
5
+ import type { Api, AssistantMessageEventStream, Context, Model, SimpleStreamOptions } from "@caupulican/pi-ai/types";
5
6
  import { type Static, Type } from "typebox";
6
7
  import type { AuthStatus, AuthStorage } from "./auth-storage.ts";
7
8
  import { clearConfigValueCache } from "./resolve-config-value.ts";
@@ -1 +1 @@
1
- {"version":3,"file":"model-registry.d.ts","sourceRoot":"","sources":["../../src/core/model-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-registry.d.ts","sourceRoot":"","sources":["../../src/core/model-registry.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,11 @@
1
1
  /**
2
2
  * Model registry - manages built-in and custom models, provides API key resolution.
3
3
  */
4
- import { getEnvAuthHeaders, getModels, getProviders, registerApiProvider, resetApiProviders, } from "@caupulican/pi-ai";
4
+ import { registerApiProvider } from "@caupulican/pi-ai/api-registry";
5
+ import { getEnvAuthHeaders } from "@caupulican/pi-ai/env-api-keys";
6
+ import { getModels, getProviders } from "@caupulican/pi-ai/models";
5
7
  import { registerOAuthProvider, resetOAuthProviders } from "@caupulican/pi-ai/oauth";
8
+ import { resetApiProviders } from "@caupulican/pi-ai/register-builtins";
6
9
  import { formatValidationPath } from "@caupulican/pi-ai/validation-path";
7
10
  import { existsSync, readFileSync } from "fs";
8
11
  import { join } from "path";