@xopcai/xopc 0.0.136 → 0.0.138

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 (271) hide show
  1. package/README.md +4 -0
  2. package/README.zh-CN.md +4 -0
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/demo-memory/src/index.js +4 -0
  5. package/dist/extensions/demo-memory/src/index.js.map +1 -1
  6. package/dist/extensions/telegram/xopc.extension.json +1 -1
  7. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CER17NHM.js → agent-avatar-dicebear-CIsGDJzd.js} +1 -1
  8. package/dist/gateway/static/root/assets/agents-fX97A6iN.js +2 -0
  9. package/dist/gateway/static/root/assets/{app-management-settings-panel-B3Ap_wpX.js → app-management-settings-panel-ByM4Bzwm.js} +1 -1
  10. package/dist/gateway/static/root/assets/{appearance-settings-3kBO22Xd.js → appearance-settings-BF_poRd3.js} +1 -1
  11. package/dist/gateway/static/root/assets/{apps-page-BHYbGQcZ.js → apps-page-BssdA5Qc.js} +1 -1
  12. package/dist/gateway/static/root/assets/{archive-plugin-D_vGeNB8.js → archive-plugin-DJaYoyGn.js} +1 -1
  13. package/dist/gateway/static/root/assets/{attachment-load-hWV_8pHL.js → attachment-load-xx6dBaZU.js} +1 -1
  14. package/dist/gateway/static/root/assets/{automation-suggestion-card-DVKmVTIo.js → automation-suggestion-card-BMvGqYob.js} +1 -1
  15. package/dist/gateway/static/root/assets/{automations-page-BCTXpOBp.js → automations-page-Dip8ZFmx.js} +1 -1
  16. package/dist/gateway/static/root/assets/{binary-plugins-BuXIeSPc.js → binary-plugins-CuPLWibr.js} +1 -1
  17. package/dist/gateway/static/root/assets/{block-editor-C1m0u-UU.js → block-editor-bzfvlJnh.js} +58 -54
  18. package/dist/gateway/static/root/assets/{browser-settings-page-ChUF08V5.js → browser-settings-page-lbx_8Dku.js} +4 -4
  19. package/dist/gateway/static/root/assets/{capability-presets-api-B7WWYaEh.js → capability-presets-api-X4Imbf8n.js} +1 -1
  20. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-D_Bh1PnA.js → capability-presets-settings-panel-v9JgKjJu.js} +1 -1
  21. package/dist/gateway/static/root/assets/{channel-recipient-api-sV06LCht.js → channel-recipient-api-DllrPmp-.js} +1 -1
  22. package/dist/gateway/static/root/assets/{channels-settings-BI2ChQc7.js → channels-settings-CED7Oy5Y.js} +1 -1
  23. package/dist/gateway/static/root/assets/channels-status-swr-EUwWYx8l.js +1 -0
  24. package/dist/gateway/static/root/assets/{connectors-page-qgvEp09M.js → connectors-page-BMfp0jWL.js} +1 -1
  25. package/dist/gateway/static/root/assets/{desktop-pet-BxMJlvb-.js → desktop-pet-oTig6qFO.js} +1 -1
  26. package/dist/gateway/static/root/assets/{desktop-pet-settings-DCvpDImn.js → desktop-pet-settings-DXJiPL_H.js} +1 -1
  27. package/dist/gateway/static/root/assets/{directory-picker-path-field-D1nxs9PA.js → directory-picker-path-field-CltkXSR2.js} +1 -1
  28. package/dist/gateway/static/root/assets/{dreaming-settings-EAWkpOgw.js → dreaming-settings-CYrZQxoL.js} +1 -1
  29. package/dist/gateway/static/root/assets/{extension-debug-page-LUQ8dE8z.js → extension-debug-page-C-4BOy1R.js} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-page-B_mnhoRd.js → extension-page-C8nMpXqh.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-settings-page-BWQsGmvW.js → extension-settings-page-CXWYOwka.js} +1 -1
  32. package/dist/gateway/static/root/assets/{fetch-BWXmBizE.js → fetch-BID89uCH.js} +1 -1
  33. package/dist/gateway/static/root/assets/{gateway-config-api-M9bzPASf.js → gateway-config-api-B3TGdim5.js} +1 -1
  34. package/dist/gateway/static/root/assets/{gateway-settings-CbgtpprN.js → gateway-settings-D7tOnGAJ.js} +1 -1
  35. package/dist/gateway/static/root/assets/{gateway-startup-retry-BALL91S7.js → gateway-startup-retry-BkrLLlpE.js} +1 -1
  36. package/dist/gateway/static/root/assets/{goal-create-dialog-CbP4t9aM.js → goal-create-dialog-BL_cRshf.js} +1 -1
  37. package/dist/gateway/static/root/assets/{goal-detail-page-DlwI-MZZ.js → goal-detail-page-T1vg6Ng_.js} +1 -1
  38. package/dist/gateway/static/root/assets/{goals-config-api-BBhFVzBS.js → goals-config-api-D-WZWhP2.js} +1 -1
  39. package/dist/gateway/static/root/assets/{goals-page-D26r7knp.js → goals-page-1vzWXl5W.js} +1 -1
  40. package/dist/gateway/static/root/assets/{goals-settings-DdmVG_TR.js → goals-settings-DgGwvLVC.js} +1 -1
  41. package/dist/gateway/static/root/assets/{heartbeat-settings-DZW2Xq-U.js → heartbeat-settings-yh0bEIwQ.js} +1 -1
  42. package/dist/gateway/static/root/assets/index-B8s8Pq5U.css +1 -0
  43. package/dist/gateway/static/root/assets/index-NwiCnzI-.js +262 -0
  44. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-1IWd88-T.js → keyboard-shortcuts-settings-CnxRFbgA.js} +1 -1
  45. package/dist/gateway/static/root/assets/{logs-page-DxoKJO7-.js → logs-page-DebnvTpD.js} +1 -1
  46. package/dist/gateway/static/root/assets/{markdown-split-BtdBj32h.js → markdown-split-BU69Nof8.js} +1 -1
  47. package/dist/gateway/static/root/assets/{media-plugins-CpoPj3s8.js → media-plugins-CDs7OvWt.js} +1 -1
  48. package/dist/gateway/static/root/assets/messages-DbNQuFdA.js +3 -0
  49. package/dist/gateway/static/root/assets/{models-hub-panel-D1Rp__dV.js → models-hub-panel-Ca_jy26S.js} +1 -1
  50. package/dist/gateway/static/root/assets/{notes-page-CgR1bO2W.js → notes-page-DTpeaI65.js} +1 -1
  51. package/dist/gateway/static/root/assets/{notes-workbench-ozsnmDTV.js → notes-workbench-uKMYsjUU.js} +2 -2
  52. package/dist/gateway/static/root/assets/{page-tabs-CVLqCfQB.js → page-tabs-CROo8Vgz.js} +1 -1
  53. package/dist/gateway/static/root/assets/{preview-open-alternatives-CKUXJk2t.js → preview-open-alternatives-BxsS9i1G.js} +1 -1
  54. package/dist/gateway/static/root/assets/{project-detail-page-B4dqFAQF.js → project-detail-page-BWKOhshy.js} +1 -1
  55. package/dist/gateway/static/root/assets/{projects-page-DlRGXv4a.js → projects-page-CoowiCLe.js} +1 -1
  56. package/dist/gateway/static/root/assets/{remote-access-hub-rZEYQMZV.js → remote-access-hub-CiOaX1wd.js} +1 -1
  57. package/dist/gateway/static/root/assets/{save-bar-controls-BtGni268.js → save-bar-controls-B4N17dMG.js} +1 -1
  58. package/dist/gateway/static/root/assets/{schedule-field-BDGzKVWn.js → schedule-field-ClJzQ2vz.js} +1 -1
  59. package/dist/gateway/static/root/assets/{schema-form-DQJsKMCE.js → schema-form-oZvQUfDg.js} +1 -1
  60. package/dist/gateway/static/root/assets/{sessions-page-DxGoCGU8.js → sessions-page-Sx9Gc0cv.js} +1 -1
  61. package/dist/gateway/static/root/assets/settings-advanced-gate-CnbVdze4.js +1 -0
  62. package/dist/gateway/static/root/assets/{settings-collapsible-section-c8XGd4-8.js → settings-collapsible-section-B0kOLXUf.js} +1 -1
  63. package/dist/gateway/static/root/assets/{settings-form-section-By0YiDWo.js → settings-form-section-DoVPlVFd.js} +1 -1
  64. package/dist/gateway/static/root/assets/{settings-loading-skeleton-SYCPY-WM.js → settings-loading-skeleton-C7J96bLc.js} +1 -1
  65. package/dist/gateway/static/root/assets/{settings-page-D9NwvnBt.js → settings-page-CXiAByF0.js} +1 -1
  66. package/dist/gateway/static/root/assets/{settings-page-layout-CrICyGob.js → settings-page-layout-R-6ArlMI.js} +1 -1
  67. package/dist/gateway/static/root/assets/{setup-status-panel-IjK-hDxf.js → setup-status-panel-Drz23n9l.js} +1 -1
  68. package/dist/gateway/static/root/assets/{share-preview-page-Dfnk9M_m.js → share-preview-page-Bn1umseg.js} +1 -1
  69. package/dist/gateway/static/root/assets/{shares-settings-vQiRBra7.js → shares-settings-Bb-pcMWg.js} +1 -1
  70. package/dist/gateway/static/root/assets/skill-reload-api-DE9HCHct.js +1 -0
  71. package/dist/gateway/static/root/assets/{skills-page-CruV215G.js → skills-page-B6cDPqkk.js} +1 -1
  72. package/dist/gateway/static/root/assets/{system-settings-panel-BBVbSDFD.js → system-settings-panel-CtEddAy-.js} +1 -1
  73. package/dist/gateway/static/root/assets/{typed-models-lib-CwFayhxu.js → typed-models-lib-BkhSnYq7.js} +1 -1
  74. package/dist/gateway/static/root/assets/{use-channel-catalog-BKtHOM50.js → use-channel-catalog-EA4hfbsP.js} +1 -1
  75. package/dist/gateway/static/root/assets/{user-profile-settings-panel-_KDWzagh.js → user-profile-settings-panel-BssTVOBS.js} +1 -1
  76. package/dist/gateway/static/root/assets/{utils-BiUjIHb4.js → utils-CI3ywKLT.js} +1 -1
  77. package/dist/gateway/static/root/assets/{voice-api-key-field-agJqlm4o.js → voice-api-key-field-DXMEGw9O.js} +1 -1
  78. package/dist/gateway/static/root/assets/{work-item-detail-page-Bdw4ATCb.js → work-item-detail-page-DsFqU0tK.js} +1 -1
  79. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-D-Dy6mTy.js → workflow-run-setup-panel-DImBi-m6.js} +1 -1
  80. package/dist/gateway/static/root/assets/{workflow-start-dialog-GammZ2GK.js → workflow-start-dialog-DuPpKAAc.js} +1 -1
  81. package/dist/gateway/static/root/assets/{workflows-page-Cw5zrqti.js → workflows-page-DfTVzTNY.js} +1 -1
  82. package/dist/gateway/static/root/index.html +5 -5
  83. package/dist/package.js +1 -1
  84. package/dist/src/agent/agent-instance-gateway.d.ts +3 -3
  85. package/dist/src/agent/agent-manager.d.ts +7 -8
  86. package/dist/src/agent/agent-manager.js +24 -25
  87. package/dist/src/agent/agent-manager.js.map +1 -1
  88. package/dist/src/agent/background-review/coordinator.d.ts +9 -23
  89. package/dist/src/agent/background-review/coordinator.js +45 -54
  90. package/dist/src/agent/background-review/coordinator.js.map +1 -1
  91. package/dist/src/agent/background-review/prompts.d.ts +2 -4
  92. package/dist/src/agent/background-review/prompts.js +7 -19
  93. package/dist/src/agent/background-review/prompts.js.map +1 -1
  94. package/dist/src/agent/background-review/run-background-review.d.ts +0 -8
  95. package/dist/src/agent/background-review/run-background-review.js +87 -72
  96. package/dist/src/agent/background-review/run-background-review.js.map +1 -1
  97. package/dist/src/agent/background-review/settings.d.ts +4 -4
  98. package/dist/src/agent/background-review/settings.js +25 -10
  99. package/dist/src/agent/background-review/settings.js.map +1 -1
  100. package/dist/src/agent/code-intelligence/binary.d.ts +1 -0
  101. package/dist/src/agent/code-intelligence/binary.js +42 -0
  102. package/dist/src/agent/code-intelligence/binary.js.map +1 -0
  103. package/dist/src/agent/code-intelligence/index.d.ts +4 -0
  104. package/dist/src/agent/code-intelligence/index.js +4 -0
  105. package/dist/src/agent/code-intelligence/runtime.d.ts +34 -0
  106. package/dist/src/agent/code-intelligence/runtime.js +282 -0
  107. package/dist/src/agent/code-intelligence/runtime.js.map +1 -0
  108. package/dist/src/agent/code-intelligence/tools.d.ts +6 -0
  109. package/dist/src/agent/code-intelligence/tools.js +268 -0
  110. package/dist/src/agent/code-intelligence/tools.js.map +1 -0
  111. package/dist/src/agent/code-intelligence/types.d.ts +22 -0
  112. package/dist/src/agent/code-intelligence/types.js +1 -0
  113. package/dist/src/agent/memory/builtin-provider.d.ts +1 -2
  114. package/dist/src/agent/memory/builtin-provider.js +31 -12
  115. package/dist/src/agent/memory/builtin-provider.js.map +1 -1
  116. package/dist/src/agent/memory/context/planner.d.ts +11 -0
  117. package/dist/src/agent/memory/context/planner.js +163 -0
  118. package/dist/src/agent/memory/context/planner.js.map +1 -0
  119. package/dist/src/agent/memory/context/types.d.ts +19 -0
  120. package/dist/src/agent/memory/context/types.js +1 -0
  121. package/dist/src/agent/memory/context-fence.d.ts +3 -3
  122. package/dist/src/agent/memory/context-fence.js +9 -9
  123. package/dist/src/agent/memory/context-fence.js.map +1 -1
  124. package/dist/src/agent/memory/index.d.ts +6 -4
  125. package/dist/src/agent/memory/index.js +5 -5
  126. package/dist/src/agent/memory/manager.d.ts +16 -4
  127. package/dist/src/agent/memory/manager.js +32 -34
  128. package/dist/src/agent/memory/manager.js.map +1 -1
  129. package/dist/src/agent/memory/memory-config.d.ts +1 -1
  130. package/dist/src/agent/memory/memory-config.js +2 -2
  131. package/dist/src/agent/memory/memory-config.js.map +1 -1
  132. package/dist/src/agent/memory/provider.d.ts +1 -3
  133. package/dist/src/agent/memory/stub-memory-provider.d.ts +0 -1
  134. package/dist/src/agent/memory/stub-memory-provider.js +0 -5
  135. package/dist/src/agent/memory/stub-memory-provider.js.map +1 -1
  136. package/dist/src/agent/memory/types.d.ts +31 -2
  137. package/dist/src/agent/memory/understanding/correction.d.ts +3 -0
  138. package/dist/src/agent/memory/understanding/correction.js +41 -0
  139. package/dist/src/agent/memory/understanding/correction.js.map +1 -0
  140. package/dist/src/agent/memory/understanding/quality.d.ts +8 -0
  141. package/dist/src/agent/memory/understanding/quality.js +20 -0
  142. package/dist/src/agent/memory/understanding/quality.js.map +1 -0
  143. package/dist/src/agent/memory/understanding/service.d.ts +26 -0
  144. package/dist/src/agent/memory/understanding/service.js +233 -0
  145. package/dist/src/agent/memory/understanding/service.js.map +1 -0
  146. package/dist/src/agent/memory/understanding/types.d.ts +22 -0
  147. package/dist/src/agent/memory/understanding/types.js +1 -0
  148. package/dist/src/agent/memory/user-context-coordinator.d.ts +21 -0
  149. package/dist/src/agent/memory/user-context-coordinator.js +90 -0
  150. package/dist/src/agent/memory/user-context-coordinator.js.map +1 -0
  151. package/dist/src/agent/orchestration/agent-event-handler.d.ts +1 -0
  152. package/dist/src/agent/orchestration/agent-event-handler.js +1 -1
  153. package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
  154. package/dist/src/agent/orchestration/agent-orchestrator.js +2 -2
  155. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  156. package/dist/src/agent/orchestration/index.d.ts +1 -1
  157. package/dist/src/agent/orchestration/index.js +2 -2
  158. package/dist/src/agent/prompt/sections/tooling.js +10 -0
  159. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  160. package/dist/src/agent/prompt/system-prompt.js +2 -0
  161. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  162. package/dist/src/agent/service/direct-turn-helpers.js +2 -2
  163. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  164. package/dist/src/agent/service.js +7 -1
  165. package/dist/src/agent/service.js.map +1 -1
  166. package/dist/src/agent/session/session-inspector.d.ts +1 -0
  167. package/dist/src/agent/session/session-inspector.js +8 -2
  168. package/dist/src/agent/session/session-inspector.js.map +1 -1
  169. package/dist/src/agent/tools/factory.d.ts +3 -0
  170. package/dist/src/agent/tools/factory.js +17 -10
  171. package/dist/src/agent/tools/factory.js.map +1 -1
  172. package/dist/src/agent/tools/index.d.ts +1 -0
  173. package/dist/src/agent/tools/index.js +2 -1
  174. package/dist/src/agent/workspace-runtime/registry.d.ts +2 -0
  175. package/dist/src/agent/workspace-runtime/registry.js +11 -3
  176. package/dist/src/agent/workspace-runtime/registry.js.map +1 -1
  177. package/dist/src/agent-manifest/index.js +2 -2
  178. package/dist/src/agent-manifest/schema.d.ts +91 -0
  179. package/dist/src/agent-manifest/schema.js +27 -5
  180. package/dist/src/agent-manifest/schema.js.map +1 -1
  181. package/dist/src/agent-runtime/memory-runtime.d.ts +1 -1
  182. package/dist/src/agent-runtime/memory-runtime.js.map +1 -1
  183. package/dist/src/automations/domain/validation.d.ts +22 -22
  184. package/dist/src/automations/draft/automation-draft-validator.d.ts +4 -4
  185. package/dist/src/cli/command-loaders.js +1 -0
  186. package/dist/src/cli/command-loaders.js.map +1 -1
  187. package/dist/src/cli/command-manifest.js +4 -0
  188. package/dist/src/cli/command-manifest.js.map +1 -1
  189. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  190. package/dist/src/cli/commands/resume.d.ts +1 -0
  191. package/dist/src/cli/commands/resume.js +31 -0
  192. package/dist/src/cli/commands/resume.js.map +1 -0
  193. package/dist/src/cli/commands/tui-runner.d.ts +9 -0
  194. package/dist/src/cli/commands/tui-runner.js +40 -0
  195. package/dist/src/cli/commands/tui-runner.js.map +1 -0
  196. package/dist/src/cli/commands/tui.js +4 -28
  197. package/dist/src/cli/commands/tui.js.map +1 -1
  198. package/dist/src/config/agent-profile.js +1 -1
  199. package/dist/src/config/index.js +2 -2
  200. package/dist/src/config/schema.d.ts +115 -0
  201. package/dist/src/config/schema.js +53 -4
  202. package/dist/src/config/schema.js.map +1 -1
  203. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  204. package/dist/src/gateway/agent-builtin-tools.js +5 -0
  205. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  206. package/dist/src/gateway/agents-admin.js +1 -1
  207. package/dist/src/gateway/hono/lib/config-payload.d.ts +18 -4
  208. package/dist/src/gateway/hono/routes/home.js +37 -2
  209. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  210. package/dist/src/gateway/hono/routes/memory.js +129 -4
  211. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  212. package/dist/src/gateway/hono/routes/projects.js +16 -0
  213. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  214. package/dist/src/knowledge/index.d.ts +2 -0
  215. package/dist/src/knowledge/index.js +2 -0
  216. package/dist/src/knowledge/ingestion-service.d.ts +20 -0
  217. package/dist/src/knowledge/ingestion-service.js +75 -0
  218. package/dist/src/knowledge/ingestion-service.js.map +1 -0
  219. package/dist/src/knowledge/types.d.ts +70 -0
  220. package/dist/src/knowledge/types.js +1 -0
  221. package/dist/src/projects/project-kind.js +0 -1
  222. package/dist/src/projects/project-kind.js.map +1 -1
  223. package/dist/src/providers/presentation.js +1 -1
  224. package/dist/src/providers/presentation.js.map +1 -1
  225. package/dist/src/storage/sqlite/index.d.ts +2 -1
  226. package/dist/src/storage/sqlite/index.js +3 -2
  227. package/dist/src/storage/sqlite/knowledge-repository.d.ts +50 -0
  228. package/dist/src/storage/sqlite/knowledge-repository.js +237 -0
  229. package/dist/src/storage/sqlite/knowledge-repository.js.map +1 -0
  230. package/dist/src/storage/sqlite/memory-records-repository.d.ts +80 -2
  231. package/dist/src/storage/sqlite/memory-records-repository.js +271 -9
  232. package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -1
  233. package/dist/src/storage/sqlite/migrations/029_user_understanding.sql +133 -0
  234. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  235. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  236. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  237. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  238. package/dist/src/storage/sqlite/schema.js +1 -1
  239. package/dist/src/tui/tui-picker-overlay.d.ts +6 -1
  240. package/dist/src/tui/tui-picker-overlay.js +4 -1
  241. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  242. package/dist/src/tui/tui-types.d.ts +2 -0
  243. package/dist/src/tui/tui-types.js.map +1 -1
  244. package/dist/src/tui/tui.js +17 -2
  245. package/dist/src/tui/tui.js.map +1 -1
  246. package/dist/src/work-items/work-item-service.d.ts +1 -0
  247. package/dist/src/work-items/work-item-service.js +3 -0
  248. package/dist/src/work-items/work-item-service.js.map +1 -1
  249. package/dist/src/work-items/work-item-store.d.ts +1 -0
  250. package/dist/src/work-items/work-item-store.js +13 -0
  251. package/dist/src/work-items/work-item-store.js.map +1 -1
  252. package/package.json +2 -1
  253. package/dist/gateway/static/root/assets/agents-Bv5R-N8Q.js +0 -2
  254. package/dist/gateway/static/root/assets/channels-status-swr-MY4Xh4fM.js +0 -1
  255. package/dist/gateway/static/root/assets/index-CPwVzi9x.css +0 -1
  256. package/dist/gateway/static/root/assets/index-DZOm5_ex.js +0 -262
  257. package/dist/gateway/static/root/assets/messages-CQ_k8RHj.js +0 -3
  258. package/dist/gateway/static/root/assets/settings-advanced-gate-4e8ZQwxr.js +0 -1
  259. package/dist/gateway/static/root/assets/skill-reload-api-BIWv778A.js +0 -1
  260. package/dist/src/agent/memory/candidate-extractor.d.ts +0 -6
  261. package/dist/src/agent/memory/candidate-extractor.js +0 -60
  262. package/dist/src/agent/memory/candidate-extractor.js.map +0 -1
  263. package/dist/src/agent/memory/context-assembler.d.ts +0 -10
  264. package/dist/src/agent/memory/context-assembler.js +0 -26
  265. package/dist/src/agent/memory/context-assembler.js.map +0 -1
  266. package/dist/src/agent/memory/inject-prefetch.d.ts +0 -6
  267. package/dist/src/agent/memory/inject-prefetch.js +0 -48
  268. package/dist/src/agent/memory/inject-prefetch.js.map +0 -1
  269. package/dist/src/agent/memory/prefetch-coordinator.d.ts +0 -37
  270. package/dist/src/agent/memory/prefetch-coordinator.js +0 -45
  271. package/dist/src/agent/memory/prefetch-coordinator.js.map +0 -1
@@ -0,0 +1,268 @@
1
+ import { execFile } from "node:child_process";
2
+ import { Type } from "@sinclair/typebox";
3
+ import { promisify } from "node:util";
4
+ //#region src/agent/code-intelligence/tools.ts
5
+ const execFileAsync = promisify(execFile);
6
+ function statusHeader(status) {
7
+ const fields = [
8
+ `project=${status.project}`,
9
+ `freshness=${status.state}`,
10
+ `coverage=${status.coverage}`
11
+ ];
12
+ if (status.indexedAt) fields.push(`indexedAt=${status.indexedAt}`);
13
+ if (status.dirtyPaths.length > 0) fields.push(`dirtyPaths=${status.dirtyPaths.length}`);
14
+ return `[Code intelligence: ${fields.join(", ")}]`;
15
+ }
16
+ function success(result) {
17
+ return {
18
+ content: [{
19
+ type: "text",
20
+ text: `${statusHeader(result.status)}\n${result.text}`.trim()
21
+ }],
22
+ details: { codeIntelligence: result.status }
23
+ };
24
+ }
25
+ function failure(error, runtime) {
26
+ const status = runtime.getStatus();
27
+ const message = error instanceof Error ? error.message : String(error);
28
+ return {
29
+ content: [{
30
+ type: "text",
31
+ text: `${statusHeader(status)}\nCode intelligence failed: ${message}\nUse grep/find/read_file for direct source inspection and do not infer absence from the graph.`
32
+ }],
33
+ details: { codeIntelligence: status }
34
+ };
35
+ }
36
+ function searchWasEmpty(text) {
37
+ try {
38
+ return JSON.parse(text).total === 0;
39
+ } catch {
40
+ return /(?:^|\n)total:\s*0(?:\n|$)/.test(text);
41
+ }
42
+ }
43
+ function escapeCypherString(value) {
44
+ return value.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
45
+ }
46
+ function normalizeDetectChangesResult(result, limit) {
47
+ try {
48
+ const parsed = JSON.parse(result.text);
49
+ if (!Array.isArray(parsed.changed_files)) return result;
50
+ const changedFiles = [...new Set(parsed.changed_files.filter((file) => typeof file === "string"))];
51
+ const impactedSymbols = Array.isArray(parsed.impacted_symbols) ? parsed.impacted_symbols : [];
52
+ const impactedSymbolCount = impactedSymbols.length;
53
+ return {
54
+ ...result,
55
+ text: JSON.stringify({
56
+ ...parsed,
57
+ changed_files: changedFiles,
58
+ changed_count: changedFiles.length,
59
+ impacted_symbols: impactedSymbols.slice(0, limit),
60
+ impacted_symbol_count: impactedSymbolCount,
61
+ impacted_symbols_truncated: impactedSymbolCount > limit
62
+ })
63
+ };
64
+ } catch {
65
+ return result;
66
+ }
67
+ }
68
+ async function changedFilesForImpact(params) {
69
+ const args = ["diff", "--name-only"];
70
+ if (params.baseBranch) args.push(`${params.baseBranch}...HEAD`);
71
+ else args.push(params.since ?? "HEAD");
72
+ args.push("--");
73
+ if (params.scope) args.push(params.scope);
74
+ const untrackedArgs = [
75
+ "ls-files",
76
+ "--others",
77
+ "--exclude-standard",
78
+ "--"
79
+ ];
80
+ if (params.scope) untrackedArgs.push(params.scope);
81
+ const [diff, untracked] = await Promise.all([execFileAsync("git", args, {
82
+ cwd: params.workspace,
83
+ timeout: 2e4,
84
+ maxBuffer: 1024 * 1024
85
+ }), execFileAsync("git", untrackedArgs, {
86
+ cwd: params.workspace,
87
+ timeout: 2e4,
88
+ maxBuffer: 1024 * 1024
89
+ })]);
90
+ return [...new Set(`${diff.stdout}\n${untracked.stdout}`.split(/\r?\n/).map((line) => line.trim()).filter(Boolean))].slice(0, 100);
91
+ }
92
+ async function queryImpactCompatibility(runtime, params, signal) {
93
+ const status = runtime.getStatus();
94
+ const files = await changedFilesForImpact({
95
+ workspace: status.workspace,
96
+ since: params.since,
97
+ baseBranch: params.baseBranch,
98
+ scope: params.scope
99
+ });
100
+ if (files.length === 0) return {
101
+ text: "No changed files found for the requested Git comparison.",
102
+ status
103
+ };
104
+ const predicate = files.map((file) => `changed.file_path = '${escapeCypherString(file)}'`).join(" OR ");
105
+ const depth = Math.max(1, Math.min(5, Math.floor(params.depth ?? 3)));
106
+ const limit = Math.max(1, Math.min(500, Math.floor(params.limit ?? 100)));
107
+ const query = [
108
+ "MATCH (changed)",
109
+ `WHERE ${predicate}`,
110
+ `OPTIONAL MATCH (caller)-[:CALLS*1..${depth}]->(changed)`,
111
+ "RETURN DISTINCT changed.qualified_name AS changed_symbol, changed.file_path AS changed_file,",
112
+ "caller.qualified_name AS affected_caller, caller.file_path AS affected_file",
113
+ `LIMIT ${limit}`
114
+ ].join(" ");
115
+ const result = await runtime.callTool("query_graph", {
116
+ project: status.project,
117
+ query,
118
+ max_rows: limit
119
+ }, signal);
120
+ return {
121
+ ...result,
122
+ text: `Changed files (${files.length}):\n${files.join("\n")}\n\nGraph impact:\n${result.text}`
123
+ };
124
+ }
125
+ function buildTool(options) {
126
+ return {
127
+ name: options.name,
128
+ label: options.name,
129
+ description: options.description,
130
+ parameters: options.parameters,
131
+ supportsParallel: true,
132
+ idempotent: true,
133
+ async execute(_toolCallId, params, signal) {
134
+ const runtime = options.deps.getRuntime();
135
+ try {
136
+ return success(await options.run(runtime, params, signal));
137
+ } catch (error) {
138
+ return failure(error, runtime);
139
+ }
140
+ }
141
+ };
142
+ }
143
+ const SearchSchema = Type.Object({
144
+ query: Type.String({ description: "Natural-language intent or symbol keywords" }),
145
+ label: Type.Optional(Type.String({ description: "Optional graph label such as Function, Method, Class, Interface, or Route" })),
146
+ filePattern: Type.Optional(Type.String({ description: "Optional file/path pattern to narrow the search" })),
147
+ semanticKeywords: Type.Optional(Type.Array(Type.String(), { description: "Optional semantic concepts; use 2-4 concise terms" })),
148
+ limit: Type.Optional(Type.Number({ description: "Maximum results, default 20" }))
149
+ });
150
+ const ReadSymbolSchema = Type.Object({
151
+ qualifiedName: Type.String({ description: "Exact qualified_name returned by code_search" }),
152
+ includeNeighbors: Type.Optional(Type.Boolean({ description: "Include nearby source context" }))
153
+ });
154
+ const TraceSchema = Type.Object({
155
+ functionName: Type.String({ description: "Exact or unambiguous function/method name" }),
156
+ direction: Type.Optional(Type.Union([
157
+ Type.Literal("inbound"),
158
+ Type.Literal("outbound"),
159
+ Type.Literal("both")
160
+ ])),
161
+ depth: Type.Optional(Type.Number({ description: "Traversal depth, default 3" })),
162
+ mode: Type.Optional(Type.Union([
163
+ Type.Literal("calls"),
164
+ Type.Literal("data_flow"),
165
+ Type.Literal("cross_service")
166
+ ])),
167
+ parameterName: Type.Optional(Type.String({ description: "Parameter to follow in data_flow mode" })),
168
+ includeTests: Type.Optional(Type.Boolean()),
169
+ riskLabels: Type.Optional(Type.Boolean())
170
+ });
171
+ const ImpactSchema = Type.Object({
172
+ since: Type.Optional(Type.String({ description: "Git ref or date, for example HEAD~1 or a tag" })),
173
+ baseBranch: Type.Optional(Type.String({ description: "Base branch for comparison" })),
174
+ scope: Type.Optional(Type.String({ description: "Optional file or directory scope" })),
175
+ depth: Type.Optional(Type.Number({ description: "Impact traversal depth, default 3" })),
176
+ limit: Type.Optional(Type.Number({ description: "Maximum impacted symbols, default 100, maximum 500" }))
177
+ });
178
+ const ArchitectureSchema = Type.Object({ aspects: Type.Optional(Type.Array(Type.String(), { description: "Optional aspects such as packages, boundaries, layers, entry_points, hotspots, or clusters" })) });
179
+ function createCodeIntelligenceTools(deps) {
180
+ return [
181
+ buildTool({
182
+ name: "code_search",
183
+ description: "Search the repository knowledge graph for definitions, implementations, routes, types, and structurally important symbols. Prefer this over grep for code discovery.",
184
+ parameters: SearchSchema,
185
+ deps,
186
+ run: async (runtime, params, signal) => {
187
+ const graphResult = await runtime.callTool("search_graph", {
188
+ project: runtime.getStatus().project,
189
+ query: params.query,
190
+ ...params.label ? { label: params.label } : {},
191
+ ...params.filePattern ? { file_pattern: params.filePattern } : {},
192
+ ...params.semanticKeywords?.length ? { semantic_query: params.semanticKeywords } : {},
193
+ limit: params.limit ?? 20
194
+ }, signal);
195
+ if (!searchWasEmpty(graphResult.text)) return graphResult;
196
+ const textResult = await runtime.callTool("search_code", {
197
+ project: runtime.getStatus().project,
198
+ pattern: params.query,
199
+ ...params.filePattern ? { path_filter: params.filePattern } : {},
200
+ mode: "compact",
201
+ limit: params.limit ?? 20
202
+ }, signal);
203
+ return {
204
+ ...textResult,
205
+ text: `No graph symbol matched; graph-augmented text fallback:\n${textResult.text}`
206
+ };
207
+ }
208
+ }),
209
+ buildTool({
210
+ name: "code_read_symbol",
211
+ description: "Read the exact source for a symbol returned by code_search. Use this to ground graph results in current source before editing.",
212
+ parameters: ReadSymbolSchema,
213
+ deps,
214
+ run: (runtime, params, signal) => runtime.callTool("get_code_snippet", {
215
+ project: runtime.getStatus().project,
216
+ qualified_name: params.qualifiedName,
217
+ include_neighbors: params.includeNeighbors ?? false
218
+ }, signal)
219
+ }),
220
+ buildTool({
221
+ name: "code_trace",
222
+ description: "Trace callers, callees, data flow, or cross-service paths for a function or method.",
223
+ parameters: TraceSchema,
224
+ deps,
225
+ run: (runtime, params, signal) => runtime.callTool(["trace_path", "trace_call_path"], {
226
+ project: runtime.getStatus().project,
227
+ function_name: params.functionName,
228
+ direction: params.direction ?? "both",
229
+ depth: params.depth ?? 3,
230
+ mode: params.mode ?? "calls",
231
+ ...params.parameterName ? { parameter_name: params.parameterName } : {},
232
+ include_tests: params.includeTests ?? false,
233
+ risk_labels: params.riskLabels ?? false
234
+ }, signal)
235
+ }),
236
+ buildTool({
237
+ name: "code_impact",
238
+ description: "Map the current git diff or a git range to changed symbols, callers, and blast radius before or after edits.",
239
+ parameters: ImpactSchema,
240
+ deps,
241
+ run: async (runtime, params, signal) => {
242
+ const limit = Math.max(1, Math.min(500, Math.floor(params.limit ?? 100)));
243
+ if (runtime.supportsTool("detect_changes")) return normalizeDetectChangesResult(await runtime.callTool("detect_changes", {
244
+ project: runtime.getStatus().project,
245
+ ...params.since || !params.baseBranch ? { since: params.since ?? "HEAD" } : {},
246
+ ...params.baseBranch ? { base_branch: params.baseBranch } : {},
247
+ ...params.scope ? { scope: params.scope } : {},
248
+ depth: params.depth ?? 3
249
+ }, signal), limit);
250
+ return queryImpactCompatibility(runtime, params, signal);
251
+ }
252
+ }),
253
+ buildTool({
254
+ name: "code_architecture",
255
+ description: "Get a compact repository architecture map including packages, boundaries, layers, entry points, hotspots, and graph-derived clusters.",
256
+ parameters: ArchitectureSchema,
257
+ deps,
258
+ run: (runtime, params, signal) => runtime.callTool("get_architecture", {
259
+ project: runtime.getStatus().project,
260
+ ...params.aspects?.length ? { aspects: params.aspects } : {}
261
+ }, signal)
262
+ })
263
+ ];
264
+ }
265
+ //#endregion
266
+ export { createCodeIntelligenceTools };
267
+
268
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","names":[],"sources":["../../../../src/agent/code-intelligence/tools.ts"],"sourcesContent":["import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nimport type { AgentTool, AgentToolResult } from '@earendil-works/pi-agent-core';\nimport { Type } from '@sinclair/typebox';\n\nimport type {\n CodeIntelligenceRuntimeLike,\n CodeIntelligenceStatus,\n CodeIntelligenceToolResult,\n} from './types.js';\n\nexport interface CodeIntelligenceToolDeps {\n getRuntime: () => CodeIntelligenceRuntimeLike;\n}\n\ntype ToolDetails = { codeIntelligence: CodeIntelligenceStatus };\nconst execFileAsync = promisify(execFile);\n\nfunction statusHeader(status: CodeIntelligenceStatus): string {\n const fields = [\n `project=${status.project}`,\n `freshness=${status.state}`,\n `coverage=${status.coverage}`,\n ];\n if (status.indexedAt) fields.push(`indexedAt=${status.indexedAt}`);\n if (status.dirtyPaths.length > 0) fields.push(`dirtyPaths=${status.dirtyPaths.length}`);\n return `[Code intelligence: ${fields.join(', ')}]`;\n}\n\nfunction success(result: CodeIntelligenceToolResult): AgentToolResult<ToolDetails> {\n return {\n content: [{ type: 'text', text: `${statusHeader(result.status)}\\n${result.text}`.trim() }],\n details: { codeIntelligence: result.status },\n };\n}\n\nfunction failure(error: unknown, runtime: CodeIntelligenceRuntimeLike): AgentToolResult<ToolDetails> {\n const status = runtime.getStatus();\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{\n type: 'text',\n text: `${statusHeader(status)}\\nCode intelligence failed: ${message}\\nUse grep/find/read_file for direct source inspection and do not infer absence from the graph.`,\n }],\n details: { codeIntelligence: status },\n };\n}\n\nfunction searchWasEmpty(text: string): boolean {\n try {\n const parsed = JSON.parse(text) as { total?: unknown };\n return parsed.total === 0;\n } catch {\n return /(?:^|\\n)total:\\s*0(?:\\n|$)/.test(text);\n }\n}\n\nfunction escapeCypherString(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\nfunction normalizeDetectChangesResult(\n result: CodeIntelligenceToolResult,\n limit: number,\n): CodeIntelligenceToolResult {\n try {\n const parsed = JSON.parse(result.text) as Record<string, unknown>;\n if (!Array.isArray(parsed.changed_files)) return result;\n const changedFiles = [...new Set(parsed.changed_files.filter(\n (file): file is string => typeof file === 'string',\n ))];\n const impactedSymbols = Array.isArray(parsed.impacted_symbols)\n ? parsed.impacted_symbols\n : [];\n const impactedSymbolCount = impactedSymbols.length;\n return {\n ...result,\n text: JSON.stringify({\n ...parsed,\n changed_files: changedFiles,\n changed_count: changedFiles.length,\n impacted_symbols: impactedSymbols.slice(0, limit),\n impacted_symbol_count: impactedSymbolCount,\n impacted_symbols_truncated: impactedSymbolCount > limit,\n }),\n };\n } catch {\n return result;\n }\n}\n\nasync function changedFilesForImpact(params: {\n workspace: string;\n since?: string;\n baseBranch?: string;\n scope?: string;\n}): Promise<string[]> {\n const args = ['diff', '--name-only'];\n if (params.baseBranch) {\n args.push(`${params.baseBranch}...HEAD`);\n } else {\n args.push(params.since ?? 'HEAD');\n }\n args.push('--');\n if (params.scope) args.push(params.scope);\n const untrackedArgs = ['ls-files', '--others', '--exclude-standard', '--'];\n if (params.scope) untrackedArgs.push(params.scope);\n const [diff, untracked] = await Promise.all([\n execFileAsync('git', args, {\n cwd: params.workspace,\n timeout: 20_000,\n maxBuffer: 1024 * 1024,\n }),\n execFileAsync('git', untrackedArgs, {\n cwd: params.workspace,\n timeout: 20_000,\n maxBuffer: 1024 * 1024,\n }),\n ]);\n return [...new Set(`${diff.stdout}\\n${untracked.stdout}`\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean))].slice(0, 100);\n}\n\nasync function queryImpactCompatibility(\n runtime: CodeIntelligenceRuntimeLike,\n params: { since?: string; baseBranch?: string; scope?: string; depth?: number; limit?: number },\n signal?: AbortSignal,\n): Promise<CodeIntelligenceToolResult> {\n const status = runtime.getStatus();\n const files = await changedFilesForImpact({\n workspace: status.workspace,\n since: params.since,\n baseBranch: params.baseBranch,\n scope: params.scope,\n });\n if (files.length === 0) {\n return { text: 'No changed files found for the requested Git comparison.', status };\n }\n const predicate = files\n .map((file) => `changed.file_path = '${escapeCypherString(file)}'`)\n .join(' OR ');\n const depth = Math.max(1, Math.min(5, Math.floor(params.depth ?? 3)));\n const limit = Math.max(1, Math.min(500, Math.floor(params.limit ?? 100)));\n const query = [\n 'MATCH (changed)',\n `WHERE ${predicate}`,\n `OPTIONAL MATCH (caller)-[:CALLS*1..${depth}]->(changed)`,\n 'RETURN DISTINCT changed.qualified_name AS changed_symbol, changed.file_path AS changed_file,',\n 'caller.qualified_name AS affected_caller, caller.file_path AS affected_file',\n `LIMIT ${limit}`,\n ].join(' ');\n const result = await runtime.callTool('query_graph', {\n project: status.project,\n query,\n max_rows: limit,\n }, signal);\n return {\n ...result,\n text: `Changed files (${files.length}):\\n${files.join('\\n')}\\n\\nGraph impact:\\n${result.text}`,\n };\n}\n\nfunction buildTool<T extends Record<string, unknown>>(options: {\n name: string;\n description: string;\n parameters: ReturnType<typeof Type.Object>;\n run: (runtime: CodeIntelligenceRuntimeLike, params: T, signal?: AbortSignal) => Promise<CodeIntelligenceToolResult>;\n deps: CodeIntelligenceToolDeps;\n}): AgentTool {\n return {\n name: options.name,\n label: options.name,\n description: options.description,\n parameters: options.parameters,\n supportsParallel: true,\n idempotent: true,\n async execute(_toolCallId, params, signal) {\n const runtime = options.deps.getRuntime();\n try {\n return success(await options.run(runtime, params as T, signal));\n } catch (error) {\n return failure(error, runtime);\n }\n },\n } as AgentTool;\n}\n\nconst SearchSchema = Type.Object({\n query: Type.String({ description: 'Natural-language intent or symbol keywords' }),\n label: Type.Optional(Type.String({ description: 'Optional graph label such as Function, Method, Class, Interface, or Route' })),\n filePattern: Type.Optional(Type.String({ description: 'Optional file/path pattern to narrow the search' })),\n semanticKeywords: Type.Optional(Type.Array(Type.String(), { description: 'Optional semantic concepts; use 2-4 concise terms' })),\n limit: Type.Optional(Type.Number({ description: 'Maximum results, default 20' })),\n});\n\nconst ReadSymbolSchema = Type.Object({\n qualifiedName: Type.String({ description: 'Exact qualified_name returned by code_search' }),\n includeNeighbors: Type.Optional(Type.Boolean({ description: 'Include nearby source context' })),\n});\n\nconst TraceSchema = Type.Object({\n functionName: Type.String({ description: 'Exact or unambiguous function/method name' }),\n direction: Type.Optional(Type.Union([\n Type.Literal('inbound'),\n Type.Literal('outbound'),\n Type.Literal('both'),\n ])),\n depth: Type.Optional(Type.Number({ description: 'Traversal depth, default 3' })),\n mode: Type.Optional(Type.Union([\n Type.Literal('calls'),\n Type.Literal('data_flow'),\n Type.Literal('cross_service'),\n ])),\n parameterName: Type.Optional(Type.String({ description: 'Parameter to follow in data_flow mode' })),\n includeTests: Type.Optional(Type.Boolean()),\n riskLabels: Type.Optional(Type.Boolean()),\n});\n\nconst ImpactSchema = Type.Object({\n since: Type.Optional(Type.String({ description: 'Git ref or date, for example HEAD~1 or a tag' })),\n baseBranch: Type.Optional(Type.String({ description: 'Base branch for comparison' })),\n scope: Type.Optional(Type.String({ description: 'Optional file or directory scope' })),\n depth: Type.Optional(Type.Number({ description: 'Impact traversal depth, default 3' })),\n limit: Type.Optional(Type.Number({ description: 'Maximum impacted symbols, default 100, maximum 500' })),\n});\n\nconst ArchitectureSchema = Type.Object({\n aspects: Type.Optional(Type.Array(Type.String(), {\n description: 'Optional aspects such as packages, boundaries, layers, entry_points, hotspots, or clusters',\n })),\n});\n\nexport function createCodeIntelligenceTools(deps: CodeIntelligenceToolDeps): AgentTool[] {\n return [\n buildTool({\n name: 'code_search',\n description: 'Search the repository knowledge graph for definitions, implementations, routes, types, and structurally important symbols. Prefer this over grep for code discovery.',\n parameters: SearchSchema,\n deps,\n run: async (runtime, params: {\n query: string;\n label?: string;\n filePattern?: string;\n semanticKeywords?: string[];\n limit?: number;\n }, signal) => {\n const graphResult = await runtime.callTool('search_graph', {\n project: runtime.getStatus().project,\n query: params.query,\n ...(params.label ? { label: params.label } : {}),\n ...(params.filePattern ? { file_pattern: params.filePattern } : {}),\n ...(params.semanticKeywords?.length ? { semantic_query: params.semanticKeywords } : {}),\n limit: params.limit ?? 20,\n }, signal);\n if (!searchWasEmpty(graphResult.text)) return graphResult;\n const textResult = await runtime.callTool('search_code', {\n project: runtime.getStatus().project,\n pattern: params.query,\n ...(params.filePattern ? { path_filter: params.filePattern } : {}),\n mode: 'compact',\n limit: params.limit ?? 20,\n }, signal);\n return {\n ...textResult,\n text: `No graph symbol matched; graph-augmented text fallback:\\n${textResult.text}`,\n };\n },\n }),\n buildTool({\n name: 'code_read_symbol',\n description: 'Read the exact source for a symbol returned by code_search. Use this to ground graph results in current source before editing.',\n parameters: ReadSymbolSchema,\n deps,\n run: (runtime, params: { qualifiedName: string; includeNeighbors?: boolean }, signal) =>\n runtime.callTool('get_code_snippet', {\n project: runtime.getStatus().project,\n qualified_name: params.qualifiedName,\n include_neighbors: params.includeNeighbors ?? false,\n }, signal),\n }),\n buildTool({\n name: 'code_trace',\n description: 'Trace callers, callees, data flow, or cross-service paths for a function or method.',\n parameters: TraceSchema,\n deps,\n run: (runtime, params: {\n functionName: string;\n direction?: 'inbound' | 'outbound' | 'both';\n depth?: number;\n mode?: 'calls' | 'data_flow' | 'cross_service';\n parameterName?: string;\n includeTests?: boolean;\n riskLabels?: boolean;\n }, signal) => runtime.callTool(['trace_path', 'trace_call_path'], {\n project: runtime.getStatus().project,\n function_name: params.functionName,\n direction: params.direction ?? 'both',\n depth: params.depth ?? 3,\n mode: params.mode ?? 'calls',\n ...(params.parameterName ? { parameter_name: params.parameterName } : {}),\n include_tests: params.includeTests ?? false,\n risk_labels: params.riskLabels ?? false,\n }, signal),\n }),\n buildTool({\n name: 'code_impact',\n description: 'Map the current git diff or a git range to changed symbols, callers, and blast radius before or after edits.',\n parameters: ImpactSchema,\n deps,\n run: async (runtime, params: { since?: string; baseBranch?: string; scope?: string; depth?: number; limit?: number }, signal) => {\n const limit = Math.max(1, Math.min(500, Math.floor(params.limit ?? 100)));\n if (runtime.supportsTool('detect_changes')) {\n const result = await runtime.callTool('detect_changes', {\n project: runtime.getStatus().project,\n ...(params.since || !params.baseBranch ? { since: params.since ?? 'HEAD' } : {}),\n ...(params.baseBranch ? { base_branch: params.baseBranch } : {}),\n ...(params.scope ? { scope: params.scope } : {}),\n depth: params.depth ?? 3,\n }, signal);\n return normalizeDetectChangesResult(result, limit);\n }\n return queryImpactCompatibility(runtime, params, signal);\n },\n }),\n buildTool({\n name: 'code_architecture',\n description: 'Get a compact repository architecture map including packages, boundaries, layers, entry points, hotspots, and graph-derived clusters.',\n parameters: ArchitectureSchema,\n deps,\n run: (runtime, params: { aspects?: string[] }, signal) => runtime.callTool('get_architecture', {\n project: runtime.getStatus().project,\n ...(params.aspects?.length ? { aspects: params.aspects } : {}),\n }, signal),\n }),\n ];\n}\n"],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export type CodeIntelligenceState = 'idle' | 'connecting' | 'indexing' | 'ready' | 'dirty' | 'degraded' | 'unavailable' | 'disposed';
2
+ export interface CodeIntelligenceStatus {
3
+ state: CodeIntelligenceState;
4
+ workspace: string;
5
+ project: string;
6
+ indexedAt?: string;
7
+ dirtyPaths: string[];
8
+ coverage: 'complete' | 'partial' | 'unknown';
9
+ errorMessage?: string;
10
+ }
11
+ export interface CodeIntelligenceToolResult {
12
+ text: string;
13
+ status: CodeIntelligenceStatus;
14
+ }
15
+ export interface CodeIntelligenceRuntimeLike {
16
+ prime(): Promise<void>;
17
+ markDirty(paths: readonly string[]): void;
18
+ supportsTool(name: string): boolean;
19
+ callTool(toolNames: string | readonly string[], input: Record<string, unknown>, signal?: AbortSignal): Promise<CodeIntelligenceToolResult>;
20
+ getStatus(): CodeIntelligenceStatus;
21
+ dispose(): Promise<void>;
22
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -8,7 +8,7 @@ import type { MemoryDeleteRequest, MemoryListRequest, MemoryReadRequest, MemoryR
8
8
  export declare class BuiltinMemoryProvider implements MemoryProvider {
9
9
  private readonly store;
10
10
  readonly id = "local";
11
- readonly displayName = "Local Markdown Memory";
11
+ readonly displayName = "Local Knowledge Store";
12
12
  readonly capabilities: {
13
13
  search: boolean;
14
14
  read: boolean;
@@ -28,7 +28,6 @@ export declare class BuiltinMemoryProvider implements MemoryProvider {
28
28
  isAvailable(): boolean;
29
29
  initialize(_sessionId: string, options?: MemoryProviderInitOptions): Promise<void>;
30
30
  systemPromptBlock(): string;
31
- prefetch(): Promise<string>;
32
31
  queuePrefetch(): void;
33
32
  getToolSchemas(): any[];
34
33
  search(request: MemorySearchRequest): Promise<MemorySearchResult[]>;
@@ -8,7 +8,7 @@ import { memoryGet, memorySearch } from "../prompt/memory/index.js";
8
8
  */
9
9
  var BuiltinMemoryProvider = class {
10
10
  id = "local";
11
- displayName = "Local Markdown Memory";
11
+ displayName = "Local Knowledge Store";
12
12
  capabilities = {
13
13
  search: true,
14
14
  read: true,
@@ -37,9 +37,6 @@ var BuiltinMemoryProvider = class {
37
37
  systemPromptBlock() {
38
38
  return "";
39
39
  }
40
- async prefetch() {
41
- return "";
42
- }
43
40
  queuePrefetch() {}
44
41
  getToolSchemas() {
45
42
  return [];
@@ -136,9 +133,11 @@ var BuiltinMemoryProvider = class {
136
133
  agentId: request.scope?.agentId ?? this.agentId,
137
134
  workspaceId: request.scope?.workspaceId ?? this.workspaceDir,
138
135
  kind: request.kind,
136
+ status: request.status,
137
+ canonicalKey: request.canonicalKey,
139
138
  limit: 200
140
139
  });
141
- if (records.length > 0 || request.kind) return request.target ? records.filter((record) => targetForKind(record.kind) === request.target) : records;
140
+ if (records.length > 0 || request.kind || request.status || request.canonicalKey) return request.target ? records.filter((record) => targetForKind(record.kind) === request.target) : records;
142
141
  const target = request.target ?? (request.kind === "user_profile" ? "user" : "memory");
143
142
  return this.store.getLiveEntries(target).map((content, index) => upsertMemoryRecord({
144
143
  id: `curated:${target}:${index + 1}`,
@@ -160,23 +159,31 @@ var BuiltinMemoryProvider = class {
160
159
  message: "Memory candidate added to inbox",
161
160
  record: upsertMemoryRecord({
162
161
  providerId: this.id,
163
- kind: target === "user" ? "user_profile" : request.kind,
162
+ kind: request.kind,
164
163
  agentId: request.scope?.agentId ?? this.agentId,
165
164
  workspaceId: request.scope?.workspaceId ?? this.workspaceDir,
166
165
  sessionKey: request.scope?.sessionKey,
167
166
  content: request.content,
168
167
  source: {
169
168
  ...request.source ?? {},
170
- provider: this.id,
171
- path: sourcePathForTarget(target)
169
+ provider: this.id
172
170
  },
173
171
  confidence: request.confidence,
174
172
  tags: request.tags,
175
173
  status: "candidate",
176
174
  sensitivity: request.sensitivity,
175
+ canonicalKey: request.canonicalKey,
176
+ explicitness: request.explicitness,
177
+ durability: request.durability,
178
+ importance: request.importance,
179
+ disclosurePolicy: request.disclosurePolicy,
177
180
  evidence: request.evidence,
181
+ validFrom: request.validFrom,
182
+ validTo: request.validTo,
178
183
  reviewAfter: request.reviewAfter,
179
- expiresAt: request.expiresAt
184
+ expiresAt: request.expiresAt,
185
+ supersedesRecordId: request.supersedesRecordId,
186
+ conflictGroupId: request.conflictGroupId
180
187
  })
181
188
  };
182
189
  const result = await this.store.add(target, request.content);
@@ -190,7 +197,7 @@ var BuiltinMemoryProvider = class {
190
197
  record: upsertMemoryRecord({
191
198
  id: `curated:${target}:${Date.now()}`,
192
199
  providerId: this.id,
193
- kind: target === "user" ? "user_profile" : request.kind,
200
+ kind: request.kind,
194
201
  agentId: request.scope?.agentId ?? this.agentId,
195
202
  workspaceId: request.scope?.workspaceId ?? this.workspaceDir,
196
203
  sessionKey: request.scope?.sessionKey,
@@ -200,7 +207,19 @@ var BuiltinMemoryProvider = class {
200
207
  provider: this.id,
201
208
  path: sourcePathForTarget(target)
202
209
  },
203
- tags: request.tags
210
+ tags: request.tags,
211
+ canonicalKey: request.canonicalKey,
212
+ explicitness: request.explicitness,
213
+ durability: request.durability,
214
+ importance: request.importance,
215
+ disclosurePolicy: request.disclosurePolicy,
216
+ evidence: request.evidence,
217
+ validFrom: request.validFrom,
218
+ validTo: request.validTo,
219
+ reviewAfter: request.reviewAfter,
220
+ expiresAt: request.expiresAt,
221
+ supersedesRecordId: request.supersedesRecordId,
222
+ conflictGroupId: request.conflictGroupId
204
223
  })
205
224
  };
206
225
  }
@@ -294,7 +313,7 @@ function inferKindFromPath(path) {
294
313
  return "workspace_fact";
295
314
  }
296
315
  function targetForKind(kind) {
297
- return kind === "user_profile" ? "user" : "memory";
316
+ return kind === "user_profile" || kind === "preference" || kind === "relationship" || kind === "routine" || kind === "personal_logistics" ? "user" : "memory";
298
317
  }
299
318
  function sourcePathForTarget(target) {
300
319
  return target === "user" ? "user/MEMORY.md" : "MEMORY.md";
@@ -1 +1 @@
1
- {"version":3,"file":"builtin-provider.js","names":[],"sources":["../../../../src/agent/memory/builtin-provider.ts"],"sourcesContent":["import type { BuiltinMemoryStore } from './builtin-memory-store.js';\nimport type { MemoryProvider, MemoryProviderInitOptions } from './provider.js';\nimport { memoryGet, memorySearch } from '../prompt/memory/index.js';\nimport {\n appendMemorySignal,\n deleteMemoryRecord,\n getMemoryRecord,\n listMemoryRecords,\n searchMemoryRecords,\n upsertMemoryRecord,\n} from '../../storage/sqlite/index.js';\nimport type {\n MemoryDeleteRequest,\n MemoryListRequest,\n MemoryReadRequest,\n MemoryReadResult,\n MemoryRecord,\n MemorySearchRequest,\n MemorySearchResult,\n MemoryUpdateRequest,\n MemoryWriteRequest,\n MemoryWriteResult,\n MemorySyncEvent,\n} from './types.js';\n\n/**\n * Builtin local memory provider backed by profile memory, agent-home curated files,\n * and the local SQLite FTS index.\n */\nexport class BuiltinMemoryProvider implements MemoryProvider {\n readonly id = 'local';\n readonly displayName = 'Local Markdown Memory';\n readonly capabilities = {\n search: true,\n read: true,\n write: true,\n update: true,\n delete: true,\n keywordSearch: true,\n semanticSearch: false,\n hybridSearch: false,\n citations: true,\n sync: false,\n local: true,\n };\n\n private workspaceDir = '';\n private agentId = 'main';\n\n constructor(private readonly store: BuiltinMemoryStore) {}\n\n isAvailable(): boolean {\n return true;\n }\n\n async initialize(_sessionId: string, options?: MemoryProviderInitOptions): Promise<void> {\n this.workspaceDir = options?.workspace ?? options?.agentWorkspace ?? this.store.workspaceDir;\n this.agentId = String(options?.agentId ?? this.agentId);\n }\n\n systemPromptBlock(): string {\n return '';\n }\n\n async prefetch(): Promise<string> {\n return '';\n }\n\n queuePrefetch(): void {}\n\n getToolSchemas() {\n return [];\n }\n\n async search(request: MemorySearchRequest): Promise<MemorySearchResult[]> {\n const agentId = request.scope?.agentId ?? this.agentId;\n const workspaceId = request.scope?.workspaceId ?? this.workspaceDir;\n const recordHits = searchMemoryRecords({\n query: request.query,\n agentId,\n workspaceId,\n providerId: this.id,\n kinds: request.kinds,\n maxResults: request.maxResults,\n minScore: request.minScore,\n });\n if (recordHits.length > 0) {\n return recordHits;\n }\n\n const results = await memorySearch(this.workspaceDir, request.query, {\n maxResults: request.maxResults,\n minScore: request.minScore,\n memoriesDir: this.store.memoriesDir,\n userMemoryPath: this.store.userMemoryPath,\n agentId,\n });\n return results.map((entry) => {\n const start = entry.lineNumbers[0] ?? 1;\n const end = entry.lineNumbers[entry.lineNumbers.length - 1] ?? start;\n const id = `${entry.file}#L${start}-L${end}`;\n const kind = inferKindFromPath(entry.file);\n const record = upsertMemoryRecord({\n id,\n providerId: this.id,\n kind,\n agentId,\n workspaceId,\n content: entry.lines,\n source: {\n provider: this.id,\n path: entry.file,\n lineStart: start,\n lineEnd: end,\n },\n confidence: entry.score,\n });\n return {\n record,\n score: entry.score,\n snippet: entry.lines,\n citation: {\n providerId: this.id,\n recordId: id,\n path: entry.file,\n lineStart: start,\n lineEnd: end,\n },\n };\n });\n }\n\n async read(request: MemoryReadRequest): Promise<MemoryReadResult | null> {\n if (request.id && !request.path) {\n const existing = getMemoryRecord(request.id);\n if (existing) {\n return { record: existing };\n }\n }\n const result = memoryGet(\n this.workspaceDir,\n request.path ?? request.id ?? '',\n request.from,\n request.lines,\n this.store.memoriesDir,\n this.store.userMemoryPath,\n );\n if (!result) return null;\n const path = request.path ?? request.id ?? '';\n const record = upsertMemoryRecord({\n id: `${path}#L${result.lineNumbers.start}-L${result.lineNumbers.end}`,\n providerId: this.id,\n kind: inferKindFromPath(path),\n agentId: request.scope?.agentId ?? this.agentId,\n workspaceId: request.scope?.workspaceId ?? this.workspaceDir,\n content: result.content,\n source: {\n provider: this.id,\n path,\n lineStart: result.lineNumbers.start,\n lineEnd: result.lineNumbers.end,\n },\n });\n return {\n record,\n lineNumbers: result.lineNumbers,\n };\n }\n\n async get(id: string): Promise<MemoryRecord | null> {\n const parsed = parseLineAddress(id);\n const result = await this.read({\n path: parsed.path,\n from: parsed.lineStart,\n lines: parsed.lineEnd != null ? parsed.lineEnd - parsed.lineStart + 1 : undefined,\n });\n return result?.record ?? null;\n }\n\n async list(request: MemoryListRequest): Promise<MemoryRecord[]> {\n const records = listMemoryRecords({\n providerId: this.id,\n agentId: request.scope?.agentId ?? this.agentId,\n workspaceId: request.scope?.workspaceId ?? this.workspaceDir,\n kind: request.kind,\n limit: 200,\n });\n if (records.length > 0 || request.kind) {\n return request.target\n ? records.filter((record) => targetForKind(record.kind) === request.target)\n : records;\n }\n\n const target = request.target ?? (request.kind === 'user_profile' ? 'user' : 'memory');\n return this.store.getLiveEntries(target).map((content, index) =>\n upsertMemoryRecord({\n id: `curated:${target}:${index + 1}`,\n providerId: this.id,\n kind: target === 'user' ? 'user_profile' : 'agent_note',\n agentId: request.scope?.agentId ?? this.agentId,\n workspaceId: request.scope?.workspaceId ?? this.workspaceDir,\n content,\n source: {\n provider: this.id,\n path: sourcePathForTarget(target),\n },\n }),\n );\n }\n\n async write(request: MemoryWriteRequest): Promise<MemoryWriteResult> {\n const target = request.target ?? (request.kind === 'user_profile' ? 'user' : 'memory');\n if (request.status === 'candidate') {\n const record = upsertMemoryRecord({\n providerId: this.id,\n kind: target === 'user' ? 'user_profile' : request.kind,\n agentId: request.scope?.agentId ?? this.agentId,\n workspaceId: request.scope?.workspaceId ?? this.workspaceDir,\n sessionKey: request.scope?.sessionKey,\n content: request.content,\n source: {\n ...(request.source ?? {}),\n provider: this.id,\n path: sourcePathForTarget(target),\n },\n confidence: request.confidence,\n tags: request.tags,\n status: 'candidate',\n sensitivity: request.sensitivity,\n evidence: request.evidence,\n reviewAfter: request.reviewAfter,\n expiresAt: request.expiresAt,\n });\n return {\n success: true,\n message: 'Memory candidate added to inbox',\n record,\n };\n }\n const result = await this.store.add(target, request.content);\n if (!result.success) return { success: false, error: result.error };\n return {\n success: true,\n message: result.message,\n record: upsertMemoryRecord({\n id: `curated:${target}:${Date.now()}`,\n providerId: this.id,\n kind: target === 'user' ? 'user_profile' : request.kind,\n agentId: request.scope?.agentId ?? this.agentId,\n workspaceId: request.scope?.workspaceId ?? this.workspaceDir,\n sessionKey: request.scope?.sessionKey,\n content: request.content,\n source: {\n ...(request.source ?? {}),\n provider: this.id,\n path: sourcePathForTarget(target),\n },\n tags: request.tags,\n }),\n };\n }\n\n async update(request: MemoryUpdateRequest): Promise<MemoryWriteResult> {\n const target = request.target ?? 'memory';\n const result = await this.store.replace(target, request.matchText ?? request.id ?? '', request.content);\n if (!result.success) return { success: false, error: result.error };\n if (request.id) {\n const existing = getMemoryRecord(request.id);\n upsertMemoryRecord({\n id: request.id,\n providerId: this.id,\n kind: existing?.kind ?? (target === 'user' ? 'user_profile' : 'agent_note'),\n agentId: existing?.scope.agentId ?? request.scope?.agentId ?? this.agentId,\n workspaceId: existing?.scope.workspaceId ?? request.scope?.workspaceId ?? this.workspaceDir,\n sessionKey: existing?.scope.sessionKey ?? request.scope?.sessionKey,\n content: request.content,\n source: existing?.source ?? { provider: this.id, path: sourcePathForTarget(target) },\n tags: existing?.tags,\n });\n } else if (request.matchText) {\n for (const existing of listMemoryRecords({\n providerId: this.id,\n agentId: request.scope?.agentId ?? this.agentId,\n workspaceId: request.scope?.workspaceId ?? this.workspaceDir,\n kind: target === 'user' ? 'user_profile' : 'agent_note',\n limit: 200,\n })) {\n if (!existing.content.includes(request.matchText)) continue;\n upsertMemoryRecord({\n id: existing.id,\n providerId: this.id,\n kind: existing.kind,\n agentId: existing.scope.agentId,\n workspaceId: existing.scope.workspaceId,\n sessionKey: existing.scope.sessionKey,\n content: request.content,\n source: existing.source,\n tags: existing.tags,\n });\n }\n }\n return { success: true, message: result.message };\n }\n\n async delete(request: MemoryDeleteRequest): Promise<MemoryWriteResult> {\n const target = request.target ?? 'memory';\n const result = await this.store.remove(target, request.matchText ?? request.id ?? '');\n if (!result.success) return { success: false, error: result.error };\n if (request.id) {\n deleteMemoryRecord(request.id);\n } else if (request.matchText) {\n for (const existing of listMemoryRecords({\n providerId: this.id,\n agentId: request.scope?.agentId ?? this.agentId,\n workspaceId: request.scope?.workspaceId ?? this.workspaceDir,\n kind: target === 'user' ? 'user_profile' : 'agent_note',\n limit: 200,\n })) {\n if (existing.content.includes(request.matchText)) {\n deleteMemoryRecord(existing.id);\n }\n }\n }\n return { success: true, message: result.message };\n }\n\n sync(event: MemorySyncEvent): void {\n if (event.type !== 'signal') return;\n appendMemorySignal({\n signal: event.signal,\n providerId: this.id,\n agentId: this.agentId,\n workspaceId: this.workspaceDir,\n sessionKey:\n typeof event.signal.metadata?.sessionKey === 'string'\n ? event.signal.metadata.sessionKey\n : undefined,\n });\n }\n\n async shutdown(): Promise<void> {}\n}\n\nfunction inferKindFromPath(path: string): MemoryRecord['kind'] {\n const normalized = path.replace(/\\\\/g, '/');\n if (normalized === 'user/MEMORY.md' || normalized.endsWith('/user/MEMORY.md')) return 'user_profile';\n if (/^memory\\/\\d{4}-\\d{2}-\\d{2}\\.md$/.test(normalized)) return 'daily_note';\n if (normalized.endsWith('MEMORY.md')) return 'agent_note';\n return 'workspace_fact';\n}\n\nfunction targetForKind(kind: MemoryRecord['kind']): 'memory' | 'user' {\n return kind === 'user_profile' ? 'user' : 'memory';\n}\n\nfunction sourcePathForTarget(target: 'memory' | 'user'): string {\n return target === 'user' ? 'user/MEMORY.md' : 'MEMORY.md';\n}\n\nfunction parseLineAddress(id: string): { path: string; lineStart?: number; lineEnd?: number } {\n const match = /^(.*)#L(\\d+)(?:-L(\\d+))?$/.exec(id);\n if (!match) return { path: id };\n const lineStart = Number.parseInt(match[2] ?? '1', 10);\n const lineEnd = Number.parseInt(match[3] ?? match[2] ?? '1', 10);\n return {\n path: match[1] ?? id,\n lineStart: Number.isFinite(lineStart) ? lineStart : undefined,\n lineEnd: Number.isFinite(lineEnd) ? lineEnd : undefined,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"builtin-provider.js","names":[],"sources":["../../../../src/agent/memory/builtin-provider.ts"],"sourcesContent":["import type { BuiltinMemoryStore } from './builtin-memory-store.js';\nimport type { MemoryProvider, MemoryProviderInitOptions } from './provider.js';\nimport { memoryGet, memorySearch } from '../prompt/memory/index.js';\nimport {\n appendMemorySignal,\n deleteMemoryRecord,\n getMemoryRecord,\n listMemoryRecords,\n searchMemoryRecords,\n upsertMemoryRecord,\n} from '../../storage/sqlite/index.js';\nimport type {\n MemoryDeleteRequest,\n MemoryListRequest,\n MemoryReadRequest,\n MemoryReadResult,\n MemoryRecord,\n MemorySearchRequest,\n MemorySearchResult,\n MemoryUpdateRequest,\n MemoryWriteRequest,\n MemoryWriteResult,\n MemorySyncEvent,\n} from './types.js';\n\n/**\n * Builtin local memory provider backed by profile memory, agent-home curated files,\n * and the local SQLite FTS index.\n */\nexport class BuiltinMemoryProvider implements MemoryProvider {\n readonly id = 'local';\n readonly displayName = 'Local Knowledge Store';\n readonly capabilities = {\n search: true,\n read: true,\n write: true,\n update: true,\n delete: true,\n keywordSearch: true,\n semanticSearch: false,\n hybridSearch: false,\n citations: true,\n sync: false,\n local: true,\n };\n\n private workspaceDir = '';\n private agentId = 'main';\n\n constructor(private readonly store: BuiltinMemoryStore) {}\n\n isAvailable(): boolean {\n return true;\n }\n\n async initialize(_sessionId: string, options?: MemoryProviderInitOptions): Promise<void> {\n this.workspaceDir = options?.workspace ?? options?.agentWorkspace ?? this.store.workspaceDir;\n this.agentId = String(options?.agentId ?? this.agentId);\n }\n\n systemPromptBlock(): string {\n return '';\n }\n\n queuePrefetch(): void {}\n\n getToolSchemas() {\n return [];\n }\n\n async search(request: MemorySearchRequest): Promise<MemorySearchResult[]> {\n const agentId = request.scope?.agentId ?? this.agentId;\n const workspaceId = request.scope?.workspaceId ?? this.workspaceDir;\n const recordHits = searchMemoryRecords({\n query: request.query,\n agentId,\n workspaceId,\n providerId: this.id,\n kinds: request.kinds,\n maxResults: request.maxResults,\n minScore: request.minScore,\n });\n if (recordHits.length > 0) {\n return recordHits;\n }\n\n const results = await memorySearch(this.workspaceDir, request.query, {\n maxResults: request.maxResults,\n minScore: request.minScore,\n memoriesDir: this.store.memoriesDir,\n userMemoryPath: this.store.userMemoryPath,\n agentId,\n });\n return results.map((entry) => {\n const start = entry.lineNumbers[0] ?? 1;\n const end = entry.lineNumbers[entry.lineNumbers.length - 1] ?? start;\n const id = `${entry.file}#L${start}-L${end}`;\n const kind = inferKindFromPath(entry.file);\n const record = upsertMemoryRecord({\n id,\n providerId: this.id,\n kind,\n agentId,\n workspaceId,\n content: entry.lines,\n source: {\n provider: this.id,\n path: entry.file,\n lineStart: start,\n lineEnd: end,\n },\n confidence: entry.score,\n });\n return {\n record,\n score: entry.score,\n snippet: entry.lines,\n citation: {\n providerId: this.id,\n recordId: id,\n path: entry.file,\n lineStart: start,\n lineEnd: end,\n },\n };\n });\n }\n\n async read(request: MemoryReadRequest): Promise<MemoryReadResult | null> {\n if (request.id && !request.path) {\n const existing = getMemoryRecord(request.id);\n if (existing) {\n return { record: existing };\n }\n }\n const result = memoryGet(\n this.workspaceDir,\n request.path ?? request.id ?? '',\n request.from,\n request.lines,\n this.store.memoriesDir,\n this.store.userMemoryPath,\n );\n if (!result) return null;\n const path = request.path ?? request.id ?? '';\n const record = upsertMemoryRecord({\n id: `${path}#L${result.lineNumbers.start}-L${result.lineNumbers.end}`,\n providerId: this.id,\n kind: inferKindFromPath(path),\n agentId: request.scope?.agentId ?? this.agentId,\n workspaceId: request.scope?.workspaceId ?? this.workspaceDir,\n content: result.content,\n source: {\n provider: this.id,\n path,\n lineStart: result.lineNumbers.start,\n lineEnd: result.lineNumbers.end,\n },\n });\n return {\n record,\n lineNumbers: result.lineNumbers,\n };\n }\n\n async get(id: string): Promise<MemoryRecord | null> {\n const parsed = parseLineAddress(id);\n const result = await this.read({\n path: parsed.path,\n from: parsed.lineStart,\n lines: parsed.lineEnd != null ? parsed.lineEnd - parsed.lineStart + 1 : undefined,\n });\n return result?.record ?? null;\n }\n\n async list(request: MemoryListRequest): Promise<MemoryRecord[]> {\n const records = listMemoryRecords({\n providerId: this.id,\n agentId: request.scope?.agentId ?? this.agentId,\n workspaceId: request.scope?.workspaceId ?? this.workspaceDir,\n kind: request.kind,\n status: request.status,\n canonicalKey: request.canonicalKey,\n limit: 200,\n });\n if (records.length > 0 || request.kind || request.status || request.canonicalKey) {\n return request.target\n ? records.filter((record) => targetForKind(record.kind) === request.target)\n : records;\n }\n\n const target = request.target ?? (request.kind === 'user_profile' ? 'user' : 'memory');\n return this.store.getLiveEntries(target).map((content, index) =>\n upsertMemoryRecord({\n id: `curated:${target}:${index + 1}`,\n providerId: this.id,\n kind: target === 'user' ? 'user_profile' : 'agent_note',\n agentId: request.scope?.agentId ?? this.agentId,\n workspaceId: request.scope?.workspaceId ?? this.workspaceDir,\n content,\n source: {\n provider: this.id,\n path: sourcePathForTarget(target),\n },\n }),\n );\n }\n\n async write(request: MemoryWriteRequest): Promise<MemoryWriteResult> {\n const target = request.target ?? (request.kind === 'user_profile' ? 'user' : 'memory');\n if (request.status === 'candidate') {\n const record = upsertMemoryRecord({\n providerId: this.id,\n kind: request.kind,\n agentId: request.scope?.agentId ?? this.agentId,\n workspaceId: request.scope?.workspaceId ?? this.workspaceDir,\n sessionKey: request.scope?.sessionKey,\n content: request.content,\n source: {\n ...(request.source ?? {}),\n provider: this.id,\n },\n confidence: request.confidence,\n tags: request.tags,\n status: 'candidate',\n sensitivity: request.sensitivity,\n canonicalKey: request.canonicalKey,\n explicitness: request.explicitness,\n durability: request.durability,\n importance: request.importance,\n disclosurePolicy: request.disclosurePolicy,\n evidence: request.evidence,\n validFrom: request.validFrom,\n validTo: request.validTo,\n reviewAfter: request.reviewAfter,\n expiresAt: request.expiresAt,\n supersedesRecordId: request.supersedesRecordId,\n conflictGroupId: request.conflictGroupId,\n });\n return {\n success: true,\n message: 'Memory candidate added to inbox',\n record,\n };\n }\n const result = await this.store.add(target, request.content);\n if (!result.success) return { success: false, error: result.error };\n return {\n success: true,\n message: result.message,\n record: upsertMemoryRecord({\n id: `curated:${target}:${Date.now()}`,\n providerId: this.id,\n kind: request.kind,\n agentId: request.scope?.agentId ?? this.agentId,\n workspaceId: request.scope?.workspaceId ?? this.workspaceDir,\n sessionKey: request.scope?.sessionKey,\n content: request.content,\n source: {\n ...(request.source ?? {}),\n provider: this.id,\n path: sourcePathForTarget(target),\n },\n tags: request.tags,\n canonicalKey: request.canonicalKey,\n explicitness: request.explicitness,\n durability: request.durability,\n importance: request.importance,\n disclosurePolicy: request.disclosurePolicy,\n evidence: request.evidence,\n validFrom: request.validFrom,\n validTo: request.validTo,\n reviewAfter: request.reviewAfter,\n expiresAt: request.expiresAt,\n supersedesRecordId: request.supersedesRecordId,\n conflictGroupId: request.conflictGroupId,\n }),\n };\n }\n\n async update(request: MemoryUpdateRequest): Promise<MemoryWriteResult> {\n const target = request.target ?? 'memory';\n const result = await this.store.replace(target, request.matchText ?? request.id ?? '', request.content);\n if (!result.success) return { success: false, error: result.error };\n if (request.id) {\n const existing = getMemoryRecord(request.id);\n upsertMemoryRecord({\n id: request.id,\n providerId: this.id,\n kind: existing?.kind ?? (target === 'user' ? 'user_profile' : 'agent_note'),\n agentId: existing?.scope.agentId ?? request.scope?.agentId ?? this.agentId,\n workspaceId: existing?.scope.workspaceId ?? request.scope?.workspaceId ?? this.workspaceDir,\n sessionKey: existing?.scope.sessionKey ?? request.scope?.sessionKey,\n content: request.content,\n source: existing?.source ?? { provider: this.id, path: sourcePathForTarget(target) },\n tags: existing?.tags,\n });\n } else if (request.matchText) {\n for (const existing of listMemoryRecords({\n providerId: this.id,\n agentId: request.scope?.agentId ?? this.agentId,\n workspaceId: request.scope?.workspaceId ?? this.workspaceDir,\n kind: target === 'user' ? 'user_profile' : 'agent_note',\n limit: 200,\n })) {\n if (!existing.content.includes(request.matchText)) continue;\n upsertMemoryRecord({\n id: existing.id,\n providerId: this.id,\n kind: existing.kind,\n agentId: existing.scope.agentId,\n workspaceId: existing.scope.workspaceId,\n sessionKey: existing.scope.sessionKey,\n content: request.content,\n source: existing.source,\n tags: existing.tags,\n });\n }\n }\n return { success: true, message: result.message };\n }\n\n async delete(request: MemoryDeleteRequest): Promise<MemoryWriteResult> {\n const target = request.target ?? 'memory';\n const result = await this.store.remove(target, request.matchText ?? request.id ?? '');\n if (!result.success) return { success: false, error: result.error };\n if (request.id) {\n deleteMemoryRecord(request.id);\n } else if (request.matchText) {\n for (const existing of listMemoryRecords({\n providerId: this.id,\n agentId: request.scope?.agentId ?? this.agentId,\n workspaceId: request.scope?.workspaceId ?? this.workspaceDir,\n kind: target === 'user' ? 'user_profile' : 'agent_note',\n limit: 200,\n })) {\n if (existing.content.includes(request.matchText)) {\n deleteMemoryRecord(existing.id);\n }\n }\n }\n return { success: true, message: result.message };\n }\n\n sync(event: MemorySyncEvent): void {\n if (event.type !== 'signal') return;\n appendMemorySignal({\n signal: event.signal,\n providerId: this.id,\n agentId: this.agentId,\n workspaceId: this.workspaceDir,\n sessionKey:\n typeof event.signal.metadata?.sessionKey === 'string'\n ? event.signal.metadata.sessionKey\n : undefined,\n });\n }\n\n async shutdown(): Promise<void> {}\n}\n\nfunction inferKindFromPath(path: string): MemoryRecord['kind'] {\n const normalized = path.replace(/\\\\/g, '/');\n if (normalized === 'user/MEMORY.md' || normalized.endsWith('/user/MEMORY.md')) return 'user_profile';\n if (/^memory\\/\\d{4}-\\d{2}-\\d{2}\\.md$/.test(normalized)) return 'daily_note';\n if (normalized.endsWith('MEMORY.md')) return 'agent_note';\n return 'workspace_fact';\n}\n\nfunction targetForKind(kind: MemoryRecord['kind']): 'memory' | 'user' {\n return kind === 'user_profile' || kind === 'preference' || kind === 'relationship' ||\n kind === 'routine' || kind === 'personal_logistics'\n ? 'user'\n : 'memory';\n}\n\nfunction sourcePathForTarget(target: 'memory' | 'user'): string {\n return target === 'user' ? 'user/MEMORY.md' : 'MEMORY.md';\n}\n\nfunction parseLineAddress(id: string): { path: string; lineStart?: number; lineEnd?: number } {\n const match = /^(.*)#L(\\d+)(?:-L(\\d+))?$/.exec(id);\n if (!match) return { path: id };\n const lineStart = Number.parseInt(match[2] ?? '1', 10);\n const lineEnd = Number.parseInt(match[3] ?? match[2] ?? '1', 10);\n return {\n path: match[1] ?? id,\n lineStart: Number.isFinite(lineStart) ? lineStart : undefined,\n lineEnd: Number.isFinite(lineEnd) ? lineEnd : undefined,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { AgentMessage } from '@earendil-works/pi-agent-core';
2
+ import type { MemoryManager } from '../manager.js';
3
+ import type { UserContextPlan } from './types.js';
4
+ export declare class UserContextPlanner {
5
+ plan(params: {
6
+ memoryManager: MemoryManager;
7
+ sessionKey: string;
8
+ query: string;
9
+ userMessage: AgentMessage;
10
+ }): Promise<UserContextPlan>;
11
+ }