@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
@@ -1,4 +1,4 @@
1
- import type { MemoryKind, MemoryRecord, MemorySensitivity, MemorySearchResult, MemorySignal, MemoryStatus } from '../../agent/memory/types.js';
1
+ import type { MemoryDisclosurePolicy, MemoryDurability, MemoryExplicitness, MemoryKind, MemoryRecord, MemorySensitivity, MemorySearchResult, MemorySignal, MemoryStatus } from '../../agent/memory/types.js';
2
2
  export interface UpsertMemoryRecordInput {
3
3
  id?: string;
4
4
  providerId: string;
@@ -8,14 +8,23 @@ export interface UpsertMemoryRecordInput {
8
8
  sessionKey?: string;
9
9
  projectId?: string;
10
10
  content: string;
11
+ canonicalKey?: string;
11
12
  source?: MemoryRecord['source'];
12
13
  confidence?: number;
13
14
  tags?: string[];
14
15
  status?: MemoryStatus;
15
16
  sensitivity?: MemorySensitivity;
17
+ explicitness?: MemoryExplicitness;
18
+ durability?: MemoryDurability;
19
+ importance?: number;
20
+ disclosurePolicy?: MemoryDisclosurePolicy;
16
21
  evidence?: MemoryRecord['evidence'];
22
+ validFrom?: string;
23
+ validTo?: string;
17
24
  reviewAfter?: string;
18
25
  expiresAt?: string;
26
+ supersedesRecordId?: string;
27
+ conflictGroupId?: string;
19
28
  nowMs?: number;
20
29
  }
21
30
  export interface ListMemoryRecordsOptions {
@@ -25,6 +34,7 @@ export interface ListMemoryRecordsOptions {
25
34
  projectId?: string;
26
35
  kind?: MemoryKind;
27
36
  status?: MemoryStatus;
37
+ canonicalKey?: string;
28
38
  limit?: number;
29
39
  offset?: number;
30
40
  }
@@ -70,9 +80,10 @@ export interface MemoryTraceFeedback {
70
80
  updatedAt?: string;
71
81
  }
72
82
  export interface AppendMemoryTraceEventInput {
83
+ traceId?: string;
73
84
  sessionKey?: string;
74
85
  turnId?: string;
75
- phase: 'search' | 'read' | 'write' | 'update' | 'delete' | 'sync' | 'inject' | 'test';
86
+ phase: 'search' | 'read' | 'write' | 'update' | 'delete' | 'sync' | 'inject' | 'test' | 'understanding' | 'remediation';
76
87
  providerId: string;
77
88
  request?: unknown;
78
89
  resultCount?: number;
@@ -91,6 +102,14 @@ export interface SetMemoryTraceFeedbackInput {
91
102
  };
92
103
  nowMs?: number;
93
104
  }
105
+ export interface SetLatestMemoryInjectFeedbackInput {
106
+ sessionKey: string;
107
+ beforeMs?: number;
108
+ requireSelectedRecords?: boolean;
109
+ feedback: SetMemoryTraceFeedbackInput['feedback'];
110
+ nowMs?: number;
111
+ }
112
+ export type FindLatestMemoryInjectTraceInput = Pick<SetLatestMemoryInjectFeedbackInput, 'sessionKey' | 'beforeMs' | 'requireSelectedRecords'>;
94
113
  export interface MemoryTraceEventPayload {
95
114
  traceId: string;
96
115
  sessionKey?: string;
@@ -103,9 +122,19 @@ export interface MemoryTraceEventPayload {
103
122
  skippedReason?: string;
104
123
  error?: string;
105
124
  feedback?: MemoryTraceFeedback;
125
+ remediation?: MemoryFeedbackRemediationResult;
106
126
  durationMs: number;
107
127
  createdAt: string;
108
128
  }
129
+ export interface MemoryFeedbackRemediationResult {
130
+ triggerTraceId: string;
131
+ evaluatedRecordIds: string[];
132
+ needsReviewRecordIds: string[];
133
+ }
134
+ export declare const USER_UNDERSTANDING_REMEDIATION_POLICY: {
135
+ readonly minNotHelpful: 2;
136
+ readonly confidencePenalty: 0.2;
137
+ };
109
138
  export interface MemoryRecallFeedbackSummary {
110
139
  recordId: string;
111
140
  helpful: number;
@@ -116,6 +145,47 @@ export interface MemoryRecallFeedbackSummary {
116
145
  averageScore: number | null;
117
146
  lastFeedbackAt?: string;
118
147
  }
148
+ export interface UserUnderstandingQualityMetrics {
149
+ agentId?: string;
150
+ windowDays: number;
151
+ since: string;
152
+ attempts: {
153
+ total: number;
154
+ turn: number;
155
+ background: number;
156
+ };
157
+ candidates: {
158
+ proposed: number;
159
+ created: number;
160
+ deduplicated: number;
161
+ rejectedByPolicy: number;
162
+ };
163
+ records: {
164
+ total: number;
165
+ candidate: number;
166
+ active: number;
167
+ rejected: number;
168
+ needsReview: number;
169
+ stale: number;
170
+ archived: number;
171
+ agingCandidates: number;
172
+ explicit: number;
173
+ inferred: number;
174
+ averageConfidence: number | null;
175
+ };
176
+ decisions: {
177
+ total: number;
178
+ acceptanceRate: number | null;
179
+ };
180
+ recall: {
181
+ total: number;
182
+ helpful: number;
183
+ notHelpful: number;
184
+ mixed: number;
185
+ irrelevant: number;
186
+ helpfulRate: number | null;
187
+ };
188
+ }
119
189
  export declare function upsertMemoryRecord(input: UpsertMemoryRecordInput): MemoryRecord;
120
190
  export declare function getMemoryRecord(recordId: string): MemoryRecord | null;
121
191
  export declare function listMemoryRecords(options?: ListMemoryRecordsOptions): MemoryRecord[];
@@ -139,9 +209,17 @@ export declare function listMemoryTraceEvents(options?: {
139
209
  limit?: number;
140
210
  }): MemoryTraceEventPayload[];
141
211
  export declare function setMemoryTraceFeedback(input: SetMemoryTraceFeedbackInput): MemoryTraceEventPayload | null;
212
+ export declare function findLatestMemoryInjectTrace(input: FindLatestMemoryInjectTraceInput): MemoryTraceEventPayload | null;
213
+ export declare function setLatestMemoryInjectFeedback(input: SetLatestMemoryInjectFeedbackInput): MemoryTraceEventPayload | null;
142
214
  export declare function summarizeMemoryRecallFeedback(options?: {
143
215
  recordId?: string;
144
216
  providerId?: string;
145
217
  sessionKey?: string;
146
218
  limit?: number;
147
219
  }): MemoryRecallFeedbackSummary[];
220
+ export declare function summarizeUserUnderstandingQuality(options?: {
221
+ agentId?: string;
222
+ windowDays?: number;
223
+ agingCandidateDays?: number;
224
+ nowMs?: number;
225
+ }): UserUnderstandingQualityMetrics;
@@ -2,6 +2,10 @@ import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
2
2
  import { escapeFts5Query } from "./fts.js";
3
3
  import { randomUUID } from "node:crypto";
4
4
  //#region src/storage/sqlite/memory-records-repository.ts
5
+ const USER_UNDERSTANDING_REMEDIATION_POLICY = {
6
+ minNotHelpful: 2,
7
+ confidencePenalty: .2
8
+ };
5
9
  function parseStringArray(json) {
6
10
  try {
7
11
  const parsed = JSON.parse(json);
@@ -90,6 +94,7 @@ function rowToRecord(row) {
90
94
  id: row.record_id,
91
95
  kind: row.kind,
92
96
  status: row.status,
97
+ ...row.canonical_key ? { canonicalKey: row.canonical_key } : {},
93
98
  scope: {
94
99
  agentId: row.agent_id,
95
100
  ...row.workspace_id ? { workspaceId: row.workspace_id } : {},
@@ -100,9 +105,17 @@ function rowToRecord(row) {
100
105
  source: parseSource(row.source_json),
101
106
  ...row.confidence != null ? { confidence: row.confidence } : {},
102
107
  sensitivity: row.sensitivity,
108
+ explicitness: row.explicitness,
109
+ durability: row.durability,
110
+ importance: row.importance,
111
+ disclosurePolicy: row.disclosure_policy,
103
112
  evidence: parseEvidence(row.evidence_json),
113
+ ...timestampToIso(row.valid_from) ? { validFrom: timestampToIso(row.valid_from) } : {},
114
+ ...timestampToIso(row.valid_to) ? { validTo: timestampToIso(row.valid_to) } : {},
104
115
  ...timestampToIso(row.review_after) ? { reviewAfter: timestampToIso(row.review_after) } : {},
105
116
  ...timestampToIso(row.expires_at) ? { expiresAt: timestampToIso(row.expires_at) } : {},
117
+ ...row.supersedes_record_id ? { supersedesRecordId: row.supersedes_record_id } : {},
118
+ ...row.conflict_group_id ? { conflictGroupId: row.conflict_group_id } : {},
106
119
  createdAt: new Date(row.created_at).toISOString(),
107
120
  updatedAt: new Date(row.updated_at).toISOString(),
108
121
  tags: parseStringArray(row.tags_json)
@@ -123,6 +136,12 @@ function upsertMemoryRecord(input) {
123
136
  const now = input.nowMs ?? Date.now();
124
137
  const status = input.status ?? "active";
125
138
  const sensitivity = input.sensitivity ?? "normal";
139
+ const explicitness = input.explicitness ?? "inferred";
140
+ const durability = input.durability ?? "durable";
141
+ const importance = Math.max(0, Math.min(1, input.importance ?? .5));
142
+ const disclosurePolicy = input.disclosurePolicy ?? "referenceable";
143
+ const validFrom = parseOptionalTimestamp(input.validFrom);
144
+ const validTo = parseOptionalTimestamp(input.validTo);
126
145
  const reviewAfter = parseOptionalTimestamp(input.reviewAfter);
127
146
  const expiresAt = parseOptionalTimestamp(input.expiresAt);
128
147
  const source = {
@@ -133,8 +152,10 @@ function upsertMemoryRecord(input) {
133
152
  db.prepare(`INSERT INTO memory_records (
134
153
  record_id, provider_id, kind, agent_id, workspace_id, session_key, project_id,
135
154
  content, source_json, confidence, tags_json, status, sensitivity,
136
- evidence_json, review_after, expires_at, created_at, updated_at
137
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
155
+ evidence_json, canonical_key, explicitness, durability, importance,
156
+ disclosure_policy, valid_from, valid_to, review_after, expires_at,
157
+ supersedes_record_id, conflict_group_id, created_at, updated_at
158
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
138
159
  ON CONFLICT(record_id) DO UPDATE SET
139
160
  provider_id = excluded.provider_id,
140
161
  kind = excluded.kind,
@@ -149,18 +170,44 @@ function upsertMemoryRecord(input) {
149
170
  status = excluded.status,
150
171
  sensitivity = excluded.sensitivity,
151
172
  evidence_json = excluded.evidence_json,
173
+ canonical_key = excluded.canonical_key,
174
+ explicitness = excluded.explicitness,
175
+ durability = excluded.durability,
176
+ importance = excluded.importance,
177
+ disclosure_policy = excluded.disclosure_policy,
178
+ valid_from = excluded.valid_from,
179
+ valid_to = excluded.valid_to,
152
180
  review_after = excluded.review_after,
153
181
  expires_at = excluded.expires_at,
154
- updated_at = excluded.updated_at`).run(id, input.providerId, input.kind, input.agentId, input.workspaceId ?? null, input.sessionKey ?? null, input.projectId ?? null, input.content, JSON.stringify(source), input.confidence ?? null, JSON.stringify(input.tags ?? []), status, sensitivity, JSON.stringify(input.evidence ?? []), reviewAfter, expiresAt, now, now);
182
+ supersedes_record_id = excluded.supersedes_record_id,
183
+ conflict_group_id = excluded.conflict_group_id,
184
+ updated_at = excluded.updated_at`).run(id, input.providerId, input.kind, input.agentId, input.workspaceId ?? null, input.sessionKey ?? null, input.projectId ?? null, input.content, JSON.stringify(source), input.confidence ?? null, JSON.stringify(input.tags ?? []), status, sensitivity, JSON.stringify(input.evidence ?? []), input.canonicalKey ?? null, explicitness, durability, importance, disclosurePolicy, validFrom, validTo, reviewAfter, expiresAt, input.supersedesRecordId ?? null, input.conflictGroupId ?? null, now, now);
155
185
  upsertMemoryRecordFts(db, {
156
186
  ...input,
157
187
  id
158
188
  });
189
+ if (input.supersedesRecordId && input.supersedesRecordId !== id) {
190
+ if (db.prepare(`SELECT 1 FROM memory_records WHERE record_id = ?`).get(input.supersedesRecordId)) {
191
+ db.prepare(`INSERT INTO memory_relations (
192
+ relation_id, from_record_id, relation_type, to_record_id,
193
+ confidence, valid_from, valid_to, created_at, updated_at
194
+ ) VALUES (?, ?, 'supersedes', ?, ?, ?, NULL, ?, ?)
195
+ ON CONFLICT(from_record_id, relation_type, to_record_id) DO UPDATE SET
196
+ confidence = excluded.confidence,
197
+ valid_from = excluded.valid_from,
198
+ valid_to = NULL,
199
+ updated_at = excluded.updated_at`).run(randomUUID(), id, input.supersedesRecordId, input.confidence ?? 1, validFrom ?? now, now, now);
200
+ if (status === "active") db.prepare(`UPDATE memory_records
201
+ SET status = 'archived', valid_to = COALESCE(valid_to, ?), updated_at = ?
202
+ WHERE record_id = ? AND status IN ('active', 'needs_review', 'stale')`).run(now, now, input.supersedesRecordId);
203
+ }
204
+ }
159
205
  });
160
206
  return {
161
207
  id,
162
208
  kind: input.kind,
163
209
  status,
210
+ ...input.canonicalKey ? { canonicalKey: input.canonicalKey } : {},
164
211
  scope: {
165
212
  agentId: input.agentId,
166
213
  ...input.workspaceId ? { workspaceId: input.workspaceId } : {},
@@ -171,9 +218,17 @@ function upsertMemoryRecord(input) {
171
218
  source,
172
219
  ...input.confidence != null ? { confidence: input.confidence } : {},
173
220
  sensitivity,
221
+ explicitness,
222
+ durability,
223
+ importance,
224
+ disclosurePolicy,
174
225
  evidence: input.evidence ?? [],
226
+ ...validFrom != null ? { validFrom: new Date(validFrom).toISOString() } : {},
227
+ ...validTo != null ? { validTo: new Date(validTo).toISOString() } : {},
175
228
  ...reviewAfter != null ? { reviewAfter: new Date(reviewAfter).toISOString() } : {},
176
229
  ...expiresAt != null ? { expiresAt: new Date(expiresAt).toISOString() } : {},
230
+ ...input.supersedesRecordId ? { supersedesRecordId: input.supersedesRecordId } : {},
231
+ ...input.conflictGroupId ? { conflictGroupId: input.conflictGroupId } : {},
177
232
  createdAt: new Date(now).toISOString(),
178
233
  updatedAt: new Date(now).toISOString(),
179
234
  tags: input.tags ?? []
@@ -210,6 +265,10 @@ function listMemoryRecords(options = {}) {
210
265
  where.push("status = ?");
211
266
  params.push(options.status);
212
267
  }
268
+ if (options.canonicalKey) {
269
+ where.push("canonical_key = ?");
270
+ params.push(options.canonicalKey);
271
+ }
213
272
  const limit = Math.max(1, Math.min(500, options.limit ?? 100));
214
273
  const offset = Math.max(0, options.offset ?? 0);
215
274
  return getSqliteDatabase().prepare(`SELECT * FROM memory_records
@@ -357,7 +416,7 @@ function setMemoryProviderState(providerId, scopeKey, state) {
357
416
  });
358
417
  }
359
418
  function appendMemoryTraceEvent(input) {
360
- const id = randomUUID();
419
+ const id = input.traceId ?? randomUUID();
361
420
  const now = input.nowMs ?? Date.now();
362
421
  const feedback = input.feedback ? normalizeMemoryTraceFeedback(input.feedback, now) : void 0;
363
422
  runSqliteWriteTransaction((db) => {
@@ -392,13 +451,100 @@ function listMemoryTraceEvents(options = {}) {
392
451
  function setMemoryTraceFeedback(input) {
393
452
  const existing = getSqliteDatabase().prepare(`SELECT * FROM memory_trace_events WHERE trace_id = ?`).get(input.traceId);
394
453
  if (!existing) return null;
395
- const feedback = normalizeMemoryTraceFeedback(input.feedback, input.nowMs, parseMemoryTraceFeedback(existing.feedback_json));
454
+ const nowMs = input.nowMs ?? Date.now();
455
+ const feedback = normalizeMemoryTraceFeedback(input.feedback, nowMs, parseMemoryTraceFeedback(existing.feedback_json));
456
+ let remediation;
396
457
  runSqliteWriteTransaction((db) => {
397
458
  db.prepare(`UPDATE memory_trace_events SET feedback_json = ? WHERE trace_id = ?`).run(JSON.stringify(feedback), input.traceId);
459
+ remediation = reconcileUserUnderstandingFeedback(db, existing, feedback, nowMs);
398
460
  });
399
- return memoryTraceRowToPayload({
400
- ...existing,
401
- feedback_json: JSON.stringify(feedback)
461
+ return {
462
+ ...memoryTraceRowToPayload({
463
+ ...existing,
464
+ feedback_json: JSON.stringify(feedback)
465
+ }),
466
+ ...remediation ? { remediation } : {}
467
+ };
468
+ }
469
+ function reconcileUserUnderstandingFeedback(db, trace, feedback, nowMs) {
470
+ if (trace.phase !== "inject" || feedback.outcome !== "not_helpful") return void 0;
471
+ const explicitCorrection = feedback.source === "system" && feedback.reason === "detected_explicit_user_correction";
472
+ const evaluatedRecordIds = [];
473
+ const needsReviewRecordIds = [];
474
+ const actions = [];
475
+ for (const recordId of new Set(parseStringArray(trace.selected_record_ids_json))) {
476
+ const record = db.prepare(`SELECT * FROM memory_records
477
+ WHERE record_id = ?
478
+ AND status = 'active'
479
+ AND tags_json LIKE '%\"user-understanding\"%'`).get(recordId);
480
+ if (!record) continue;
481
+ evaluatedRecordIds.push(recordId);
482
+ const feedbackRows = db.prepare(`SELECT trace.feedback_json
483
+ FROM memory_trace_events AS trace
484
+ JOIN json_each(trace.selected_record_ids_json) AS selected
485
+ ON selected.value = ?
486
+ WHERE trace.phase = 'inject'`).all(recordId);
487
+ let helpful = 0;
488
+ let notHelpful = 0;
489
+ for (const row of feedbackRows) {
490
+ const recordFeedback = parseMemoryTraceFeedback(row.feedback_json);
491
+ if (recordFeedback?.outcome === "helpful") helpful += 1;
492
+ if (recordFeedback?.outcome === "not_helpful") notHelpful += 1;
493
+ }
494
+ if (!explicitCorrection && (notHelpful < USER_UNDERSTANDING_REMEDIATION_POLICY.minNotHelpful || notHelpful <= helpful)) continue;
495
+ const nextConfidence = record.confidence == null ? null : Math.round(Math.max(.1, record.confidence - USER_UNDERSTANDING_REMEDIATION_POLICY.confidencePenalty) * 1e3) / 1e3;
496
+ if (db.prepare(`UPDATE memory_records
497
+ SET status = 'needs_review', confidence = ?, review_after = ?, updated_at = ?
498
+ WHERE record_id = ? AND status = 'active'`).run(nextConfidence, nowMs, nowMs, recordId).changes === 0) continue;
499
+ needsReviewRecordIds.push(recordId);
500
+ actions.push({
501
+ recordId,
502
+ previousStatus: record.status,
503
+ nextStatus: "needs_review",
504
+ previousConfidence: record.confidence,
505
+ nextConfidence,
506
+ helpful,
507
+ notHelpful
508
+ });
509
+ }
510
+ const result = {
511
+ triggerTraceId: trace.trace_id,
512
+ evaluatedRecordIds,
513
+ needsReviewRecordIds
514
+ };
515
+ if (needsReviewRecordIds.length > 0) db.prepare(`INSERT INTO memory_trace_events (
516
+ trace_id, session_key, turn_id, phase, provider_id, request_json,
517
+ result_count, selected_record_ids_json, skipped_reason, error,
518
+ feedback_json, duration_ms, created_at
519
+ ) VALUES (?, ?, ?, 'remediation', 'user-understanding', ?, ?, ?, NULL, NULL, '{}', 0, ?)`).run(randomUUID(), trace.session_key, trace.turn_id, JSON.stringify({
520
+ triggerTraceId: trace.trace_id,
521
+ reason: explicitCorrection ? "explicit_user_correction" : "repeated_not_helpful_feedback",
522
+ policy: USER_UNDERSTANDING_REMEDIATION_POLICY,
523
+ actions
524
+ }), needsReviewRecordIds.length, JSON.stringify(needsReviewRecordIds), nowMs);
525
+ return result;
526
+ }
527
+ function findLatestMemoryInjectTrace(input) {
528
+ const row = getSqliteDatabase().prepare(`SELECT * FROM memory_trace_events
529
+ WHERE ${[
530
+ `session_key = ?`,
531
+ `phase = 'inject'`,
532
+ `created_at <= ?`
533
+ ].join(" AND ")}
534
+ ORDER BY created_at DESC
535
+ LIMIT 1`).get(input.sessionKey, input.beforeMs ?? Date.now());
536
+ if (!row) return null;
537
+ const trace = memoryTraceRowToPayload(row);
538
+ if (input.requireSelectedRecords && trace.selectedRecordIds.length === 0) return null;
539
+ return trace;
540
+ }
541
+ function setLatestMemoryInjectFeedback(input) {
542
+ const row = findLatestMemoryInjectTrace(input);
543
+ if (!row) return null;
544
+ return setMemoryTraceFeedback({
545
+ traceId: row.traceId,
546
+ feedback: input.feedback,
547
+ nowMs: input.nowMs
402
548
  });
403
549
  }
404
550
  function summarizeMemoryRecallFeedback(options = {}) {
@@ -451,6 +597,122 @@ function summarizeMemoryRecallFeedback(options = {}) {
451
597
  }
452
598
  return [...summaries.values()].map(({ scoreTotal: _scoreTotal, scoreCount: _scoreCount, ...summary }) => summary).sort((a, b) => b.total - a.total);
453
599
  }
600
+ function boundedMetricCount(value) {
601
+ return typeof value === "number" && Number.isFinite(value) ? Math.max(0, Math.floor(value)) : 0;
602
+ }
603
+ function metricRate(numerator, denominator) {
604
+ return denominator > 0 ? Math.round(numerator / denominator * 1e4) / 1e4 : null;
605
+ }
606
+ function summarizeUserUnderstandingQuality(options = {}) {
607
+ const nowMs = options.nowMs ?? Date.now();
608
+ const windowDays = Math.max(1, Math.min(365, Math.floor(options.windowDays ?? 30)));
609
+ const sinceMs = nowMs - windowDays * 24 * 60 * 60 * 1e3;
610
+ const agingCutoffMs = nowMs - Math.max(1, Math.min(windowDays, Math.floor(options.agingCandidateDays ?? 7))) * 24 * 60 * 60 * 1e3;
611
+ const db = getSqliteDatabase();
612
+ const agentWhere = options.agentId ? "AND agent_id = ?" : "";
613
+ const recordRows = db.prepare(`SELECT record_id, status, explicitness, confidence, created_at, updated_at
614
+ FROM memory_records
615
+ WHERE tags_json LIKE '%"user-understanding"%'
616
+ ${agentWhere}`).all(...options.agentId ? [options.agentId] : []);
617
+ const records = {
618
+ total: recordRows.length,
619
+ candidate: 0,
620
+ active: 0,
621
+ rejected: 0,
622
+ needsReview: 0,
623
+ stale: 0,
624
+ archived: 0,
625
+ agingCandidates: 0,
626
+ explicit: 0,
627
+ inferred: 0,
628
+ averageConfidence: null
629
+ };
630
+ let confidenceTotal = 0;
631
+ let confidenceCount = 0;
632
+ const understandingRecordIds = /* @__PURE__ */ new Set();
633
+ for (const row of recordRows) {
634
+ understandingRecordIds.add(row.record_id);
635
+ if (row.status === "candidate") records.candidate += 1;
636
+ if (row.status === "active") records.active += 1;
637
+ if (row.status === "rejected") records.rejected += 1;
638
+ if (row.status === "needs_review") records.needsReview += 1;
639
+ if (row.status === "stale") records.stale += 1;
640
+ if (row.status === "archived") records.archived += 1;
641
+ if (row.status === "candidate" && row.created_at <= agingCutoffMs) records.agingCandidates += 1;
642
+ if (row.explicitness === "explicit") records.explicit += 1;
643
+ if (row.explicitness === "inferred") records.inferred += 1;
644
+ if (typeof row.confidence === "number") {
645
+ confidenceTotal += row.confidence;
646
+ confidenceCount += 1;
647
+ }
648
+ }
649
+ records.averageConfidence = confidenceCount > 0 ? Math.round(confidenceTotal / confidenceCount * 1e4) / 1e4 : null;
650
+ const attempts = {
651
+ total: 0,
652
+ turn: 0,
653
+ background: 0
654
+ };
655
+ const candidates = {
656
+ proposed: 0,
657
+ created: 0,
658
+ deduplicated: 0,
659
+ rejectedByPolicy: 0
660
+ };
661
+ const understandingTraces = db.prepare(`SELECT request_json FROM memory_trace_events
662
+ WHERE phase = 'understanding' AND created_at >= ?`).all(sinceMs);
663
+ for (const row of understandingTraces) {
664
+ const parsed = parseJsonValue(row.request_json, {});
665
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) continue;
666
+ const request = parsed;
667
+ if (options.agentId && request.agentId !== options.agentId) continue;
668
+ attempts.total += 1;
669
+ if (request.source === "turn") attempts.turn += 1;
670
+ if (request.source === "background") attempts.background += 1;
671
+ candidates.proposed += boundedMetricCount(request.proposed);
672
+ candidates.created += boundedMetricCount(request.created);
673
+ candidates.deduplicated += boundedMetricCount(request.deduplicated);
674
+ candidates.rejectedByPolicy += boundedMetricCount(request.rejected);
675
+ }
676
+ const recall = {
677
+ total: 0,
678
+ helpful: 0,
679
+ notHelpful: 0,
680
+ mixed: 0,
681
+ irrelevant: 0,
682
+ helpfulRate: null
683
+ };
684
+ if (understandingRecordIds.size > 0) {
685
+ const recallRows = db.prepare(`SELECT selected_record_ids_json, feedback_json FROM memory_trace_events
686
+ WHERE phase IN ('search', 'inject') AND created_at >= ?`).all(sinceMs);
687
+ for (const row of recallRows) {
688
+ const feedback = parseMemoryTraceFeedback(row.feedback_json);
689
+ if (!feedback) continue;
690
+ if (!parseStringArray(row.selected_record_ids_json).some((recordId) => understandingRecordIds.has(recordId))) continue;
691
+ recall.total += 1;
692
+ if (feedback.outcome === "helpful") recall.helpful += 1;
693
+ if (feedback.outcome === "not_helpful") recall.notHelpful += 1;
694
+ if (feedback.outcome === "mixed") recall.mixed += 1;
695
+ if (feedback.outcome === "irrelevant") recall.irrelevant += 1;
696
+ }
697
+ }
698
+ recall.helpfulRate = metricRate(recall.helpful, recall.total);
699
+ const recentDecisions = recordRows.filter((row) => (row.status === "active" || row.status === "rejected") && row.updated_at >= sinceMs);
700
+ const acceptedDecisions = recentDecisions.filter((row) => row.status === "active").length;
701
+ const decisionTotal = recentDecisions.length;
702
+ return {
703
+ ...options.agentId ? { agentId: options.agentId } : {},
704
+ windowDays,
705
+ since: new Date(sinceMs).toISOString(),
706
+ attempts,
707
+ candidates,
708
+ records,
709
+ decisions: {
710
+ total: decisionTotal,
711
+ acceptanceRate: metricRate(acceptedDecisions, decisionTotal)
712
+ },
713
+ recall
714
+ };
715
+ }
454
716
  function parseJsonValue(json, fallback) {
455
717
  try {
456
718
  return JSON.parse(json);
@@ -459,6 +721,6 @@ function parseJsonValue(json, fallback) {
459
721
  }
460
722
  }
461
723
  //#endregion
462
- export { appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, getMemoryProviderState, getMemoryRecord, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, searchMemoryRecords, setMemoryProviderState, setMemoryTraceFeedback, summarizeMemoryRecallFeedback, upsertMemoryRecord };
724
+ export { USER_UNDERSTANDING_REMEDIATION_POLICY, appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, findLatestMemoryInjectTrace, getMemoryProviderState, getMemoryRecord, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, searchMemoryRecords, setLatestMemoryInjectFeedback, setMemoryProviderState, setMemoryTraceFeedback, summarizeMemoryRecallFeedback, summarizeUserUnderstandingQuality, upsertMemoryRecord };
463
725
 
464
726
  //# sourceMappingURL=memory-records-repository.js.map