@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.
- package/README.md +4 -0
- package/README.zh-CN.md +4 -0
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/demo-memory/src/index.js +4 -0
- package/dist/extensions/demo-memory/src/index.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CER17NHM.js → agent-avatar-dicebear-CIsGDJzd.js} +1 -1
- package/dist/gateway/static/root/assets/agents-fX97A6iN.js +2 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-B3Ap_wpX.js → app-management-settings-panel-ByM4Bzwm.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-3kBO22Xd.js → appearance-settings-BF_poRd3.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-BHYbGQcZ.js → apps-page-BssdA5Qc.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-D_vGeNB8.js → archive-plugin-DJaYoyGn.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-hWV_8pHL.js → attachment-load-xx6dBaZU.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-suggestion-card-DVKmVTIo.js → automation-suggestion-card-BMvGqYob.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-BCTXpOBp.js → automations-page-Dip8ZFmx.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-BuXIeSPc.js → binary-plugins-CuPLWibr.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-C1m0u-UU.js → block-editor-bzfvlJnh.js} +58 -54
- package/dist/gateway/static/root/assets/{browser-settings-page-ChUF08V5.js → browser-settings-page-lbx_8Dku.js} +4 -4
- package/dist/gateway/static/root/assets/{capability-presets-api-B7WWYaEh.js → capability-presets-api-X4Imbf8n.js} +1 -1
- package/dist/gateway/static/root/assets/{capability-presets-settings-panel-D_Bh1PnA.js → capability-presets-settings-panel-v9JgKjJu.js} +1 -1
- package/dist/gateway/static/root/assets/{channel-recipient-api-sV06LCht.js → channel-recipient-api-DllrPmp-.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-BI2ChQc7.js → channels-settings-CED7Oy5Y.js} +1 -1
- package/dist/gateway/static/root/assets/channels-status-swr-EUwWYx8l.js +1 -0
- package/dist/gateway/static/root/assets/{connectors-page-qgvEp09M.js → connectors-page-BMfp0jWL.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-BxMJlvb-.js → desktop-pet-oTig6qFO.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-DCvpDImn.js → desktop-pet-settings-DXJiPL_H.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-D1nxs9PA.js → directory-picker-path-field-CltkXSR2.js} +1 -1
- package/dist/gateway/static/root/assets/{dreaming-settings-EAWkpOgw.js → dreaming-settings-CYrZQxoL.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-LUQ8dE8z.js → extension-debug-page-C-4BOy1R.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-B_mnhoRd.js → extension-page-C8nMpXqh.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-BWQsGmvW.js → extension-settings-page-CXWYOwka.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-BWXmBizE.js → fetch-BID89uCH.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-M9bzPASf.js → gateway-config-api-B3TGdim5.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-CbgtpprN.js → gateway-settings-D7tOnGAJ.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-BALL91S7.js → gateway-startup-retry-BkrLLlpE.js} +1 -1
- package/dist/gateway/static/root/assets/{goal-create-dialog-CbP4t9aM.js → goal-create-dialog-BL_cRshf.js} +1 -1
- package/dist/gateway/static/root/assets/{goal-detail-page-DlwI-MZZ.js → goal-detail-page-T1vg6Ng_.js} +1 -1
- package/dist/gateway/static/root/assets/{goals-config-api-BBhFVzBS.js → goals-config-api-D-WZWhP2.js} +1 -1
- package/dist/gateway/static/root/assets/{goals-page-D26r7knp.js → goals-page-1vzWXl5W.js} +1 -1
- package/dist/gateway/static/root/assets/{goals-settings-DdmVG_TR.js → goals-settings-DgGwvLVC.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-DZW2Xq-U.js → heartbeat-settings-yh0bEIwQ.js} +1 -1
- package/dist/gateway/static/root/assets/index-B8s8Pq5U.css +1 -0
- package/dist/gateway/static/root/assets/index-NwiCnzI-.js +262 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-1IWd88-T.js → keyboard-shortcuts-settings-CnxRFbgA.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-DxoKJO7-.js → logs-page-DebnvTpD.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-split-BtdBj32h.js → markdown-split-BU69Nof8.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-CpoPj3s8.js → media-plugins-CDs7OvWt.js} +1 -1
- package/dist/gateway/static/root/assets/messages-DbNQuFdA.js +3 -0
- package/dist/gateway/static/root/assets/{models-hub-panel-D1Rp__dV.js → models-hub-panel-Ca_jy26S.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-CgR1bO2W.js → notes-page-DTpeaI65.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-workbench-ozsnmDTV.js → notes-workbench-uKMYsjUU.js} +2 -2
- package/dist/gateway/static/root/assets/{page-tabs-CVLqCfQB.js → page-tabs-CROo8Vgz.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-CKUXJk2t.js → preview-open-alternatives-BxsS9i1G.js} +1 -1
- package/dist/gateway/static/root/assets/{project-detail-page-B4dqFAQF.js → project-detail-page-BWKOhshy.js} +1 -1
- package/dist/gateway/static/root/assets/{projects-page-DlRGXv4a.js → projects-page-CoowiCLe.js} +1 -1
- package/dist/gateway/static/root/assets/{remote-access-hub-rZEYQMZV.js → remote-access-hub-CiOaX1wd.js} +1 -1
- package/dist/gateway/static/root/assets/{save-bar-controls-BtGni268.js → save-bar-controls-B4N17dMG.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-BDGzKVWn.js → schedule-field-ClJzQ2vz.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-DQJsKMCE.js → schema-form-oZvQUfDg.js} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-DxGoCGU8.js → sessions-page-Sx9Gc0cv.js} +1 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-CnbVdze4.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-c8XGd4-8.js → settings-collapsible-section-B0kOLXUf.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-By0YiDWo.js → settings-form-section-DoVPlVFd.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-SYCPY-WM.js → settings-loading-skeleton-C7J96bLc.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-D9NwvnBt.js → settings-page-CXiAByF0.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-CrICyGob.js → settings-page-layout-R-6ArlMI.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-IjK-hDxf.js → setup-status-panel-Drz23n9l.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-Dfnk9M_m.js → share-preview-page-Bn1umseg.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-settings-vQiRBra7.js → shares-settings-Bb-pcMWg.js} +1 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DE9HCHct.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-CruV215G.js → skills-page-B6cDPqkk.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-BBVbSDFD.js → system-settings-panel-CtEddAy-.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-CwFayhxu.js → typed-models-lib-BkhSnYq7.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-BKtHOM50.js → use-channel-catalog-EA4hfbsP.js} +1 -1
- package/dist/gateway/static/root/assets/{user-profile-settings-panel-_KDWzagh.js → user-profile-settings-panel-BssTVOBS.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-BiUjIHb4.js → utils-CI3ywKLT.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-agJqlm4o.js → voice-api-key-field-DXMEGw9O.js} +1 -1
- package/dist/gateway/static/root/assets/{work-item-detail-page-Bdw4ATCb.js → work-item-detail-page-DsFqU0tK.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-D-Dy6mTy.js → workflow-run-setup-panel-DImBi-m6.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-start-dialog-GammZ2GK.js → workflow-start-dialog-DuPpKAAc.js} +1 -1
- package/dist/gateway/static/root/assets/{workflows-page-Cw5zrqti.js → workflows-page-DfTVzTNY.js} +1 -1
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-instance-gateway.d.ts +3 -3
- package/dist/src/agent/agent-manager.d.ts +7 -8
- package/dist/src/agent/agent-manager.js +24 -25
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/background-review/coordinator.d.ts +9 -23
- package/dist/src/agent/background-review/coordinator.js +45 -54
- package/dist/src/agent/background-review/coordinator.js.map +1 -1
- package/dist/src/agent/background-review/prompts.d.ts +2 -4
- package/dist/src/agent/background-review/prompts.js +7 -19
- package/dist/src/agent/background-review/prompts.js.map +1 -1
- package/dist/src/agent/background-review/run-background-review.d.ts +0 -8
- package/dist/src/agent/background-review/run-background-review.js +87 -72
- package/dist/src/agent/background-review/run-background-review.js.map +1 -1
- package/dist/src/agent/background-review/settings.d.ts +4 -4
- package/dist/src/agent/background-review/settings.js +25 -10
- package/dist/src/agent/background-review/settings.js.map +1 -1
- package/dist/src/agent/code-intelligence/binary.d.ts +1 -0
- package/dist/src/agent/code-intelligence/binary.js +42 -0
- package/dist/src/agent/code-intelligence/binary.js.map +1 -0
- package/dist/src/agent/code-intelligence/index.d.ts +4 -0
- package/dist/src/agent/code-intelligence/index.js +4 -0
- package/dist/src/agent/code-intelligence/runtime.d.ts +34 -0
- package/dist/src/agent/code-intelligence/runtime.js +282 -0
- package/dist/src/agent/code-intelligence/runtime.js.map +1 -0
- package/dist/src/agent/code-intelligence/tools.d.ts +6 -0
- package/dist/src/agent/code-intelligence/tools.js +268 -0
- package/dist/src/agent/code-intelligence/tools.js.map +1 -0
- package/dist/src/agent/code-intelligence/types.d.ts +22 -0
- package/dist/src/agent/code-intelligence/types.js +1 -0
- package/dist/src/agent/memory/builtin-provider.d.ts +1 -2
- package/dist/src/agent/memory/builtin-provider.js +31 -12
- package/dist/src/agent/memory/builtin-provider.js.map +1 -1
- package/dist/src/agent/memory/context/planner.d.ts +11 -0
- package/dist/src/agent/memory/context/planner.js +163 -0
- package/dist/src/agent/memory/context/planner.js.map +1 -0
- package/dist/src/agent/memory/context/types.d.ts +19 -0
- package/dist/src/agent/memory/context/types.js +1 -0
- package/dist/src/agent/memory/context-fence.d.ts +3 -3
- package/dist/src/agent/memory/context-fence.js +9 -9
- package/dist/src/agent/memory/context-fence.js.map +1 -1
- package/dist/src/agent/memory/index.d.ts +6 -4
- package/dist/src/agent/memory/index.js +5 -5
- package/dist/src/agent/memory/manager.d.ts +16 -4
- package/dist/src/agent/memory/manager.js +32 -34
- package/dist/src/agent/memory/manager.js.map +1 -1
- package/dist/src/agent/memory/memory-config.d.ts +1 -1
- package/dist/src/agent/memory/memory-config.js +2 -2
- package/dist/src/agent/memory/memory-config.js.map +1 -1
- package/dist/src/agent/memory/provider.d.ts +1 -3
- package/dist/src/agent/memory/stub-memory-provider.d.ts +0 -1
- package/dist/src/agent/memory/stub-memory-provider.js +0 -5
- package/dist/src/agent/memory/stub-memory-provider.js.map +1 -1
- package/dist/src/agent/memory/types.d.ts +31 -2
- package/dist/src/agent/memory/understanding/correction.d.ts +3 -0
- package/dist/src/agent/memory/understanding/correction.js +41 -0
- package/dist/src/agent/memory/understanding/correction.js.map +1 -0
- package/dist/src/agent/memory/understanding/quality.d.ts +8 -0
- package/dist/src/agent/memory/understanding/quality.js +20 -0
- package/dist/src/agent/memory/understanding/quality.js.map +1 -0
- package/dist/src/agent/memory/understanding/service.d.ts +26 -0
- package/dist/src/agent/memory/understanding/service.js +233 -0
- package/dist/src/agent/memory/understanding/service.js.map +1 -0
- package/dist/src/agent/memory/understanding/types.d.ts +22 -0
- package/dist/src/agent/memory/understanding/types.js +1 -0
- package/dist/src/agent/memory/user-context-coordinator.d.ts +21 -0
- package/dist/src/agent/memory/user-context-coordinator.js +90 -0
- package/dist/src/agent/memory/user-context-coordinator.js.map +1 -0
- package/dist/src/agent/orchestration/agent-event-handler.d.ts +1 -0
- package/dist/src/agent/orchestration/agent-event-handler.js +1 -1
- package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +2 -2
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/orchestration/index.d.ts +1 -1
- package/dist/src/agent/orchestration/index.js +2 -2
- package/dist/src/agent/prompt/sections/tooling.js +10 -0
- package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
- package/dist/src/agent/prompt/system-prompt.js +2 -0
- package/dist/src/agent/prompt/system-prompt.js.map +1 -1
- package/dist/src/agent/service/direct-turn-helpers.js +2 -2
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
- package/dist/src/agent/service.js +7 -1
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/session-inspector.d.ts +1 -0
- package/dist/src/agent/session/session-inspector.js +8 -2
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +3 -0
- package/dist/src/agent/tools/factory.js +17 -10
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -0
- package/dist/src/agent/tools/index.js +2 -1
- package/dist/src/agent/workspace-runtime/registry.d.ts +2 -0
- package/dist/src/agent/workspace-runtime/registry.js +11 -3
- package/dist/src/agent/workspace-runtime/registry.js.map +1 -1
- package/dist/src/agent-manifest/index.js +2 -2
- package/dist/src/agent-manifest/schema.d.ts +91 -0
- package/dist/src/agent-manifest/schema.js +27 -5
- package/dist/src/agent-manifest/schema.js.map +1 -1
- package/dist/src/agent-runtime/memory-runtime.d.ts +1 -1
- package/dist/src/agent-runtime/memory-runtime.js.map +1 -1
- package/dist/src/automations/domain/validation.d.ts +22 -22
- package/dist/src/automations/draft/automation-draft-validator.d.ts +4 -4
- package/dist/src/cli/command-loaders.js +1 -0
- package/dist/src/cli/command-loaders.js.map +1 -1
- package/dist/src/cli/command-manifest.js +4 -0
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/resume.d.ts +1 -0
- package/dist/src/cli/commands/resume.js +31 -0
- package/dist/src/cli/commands/resume.js.map +1 -0
- package/dist/src/cli/commands/tui-runner.d.ts +9 -0
- package/dist/src/cli/commands/tui-runner.js +40 -0
- package/dist/src/cli/commands/tui-runner.js.map +1 -0
- package/dist/src/cli/commands/tui.js +4 -28
- package/dist/src/cli/commands/tui.js.map +1 -1
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/index.js +2 -2
- package/dist/src/config/schema.d.ts +115 -0
- package/dist/src/config/schema.js +53 -4
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/agent-builtin-tools.js +5 -0
- package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +18 -4
- package/dist/src/gateway/hono/routes/home.js +37 -2
- package/dist/src/gateway/hono/routes/home.js.map +1 -1
- package/dist/src/gateway/hono/routes/memory.js +129 -4
- package/dist/src/gateway/hono/routes/memory.js.map +1 -1
- package/dist/src/gateway/hono/routes/projects.js +16 -0
- package/dist/src/gateway/hono/routes/projects.js.map +1 -1
- package/dist/src/knowledge/index.d.ts +2 -0
- package/dist/src/knowledge/index.js +2 -0
- package/dist/src/knowledge/ingestion-service.d.ts +20 -0
- package/dist/src/knowledge/ingestion-service.js +75 -0
- package/dist/src/knowledge/ingestion-service.js.map +1 -0
- package/dist/src/knowledge/types.d.ts +70 -0
- package/dist/src/knowledge/types.js +1 -0
- package/dist/src/projects/project-kind.js +0 -1
- package/dist/src/projects/project-kind.js.map +1 -1
- package/dist/src/providers/presentation.js +1 -1
- package/dist/src/providers/presentation.js.map +1 -1
- package/dist/src/storage/sqlite/index.d.ts +2 -1
- package/dist/src/storage/sqlite/index.js +3 -2
- package/dist/src/storage/sqlite/knowledge-repository.d.ts +50 -0
- package/dist/src/storage/sqlite/knowledge-repository.js +237 -0
- package/dist/src/storage/sqlite/knowledge-repository.js.map +1 -0
- package/dist/src/storage/sqlite/memory-records-repository.d.ts +80 -2
- package/dist/src/storage/sqlite/memory-records-repository.js +271 -9
- package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/029_user_understanding.sql +133 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/tui/tui-picker-overlay.d.ts +6 -1
- package/dist/src/tui/tui-picker-overlay.js +4 -1
- package/dist/src/tui/tui-picker-overlay.js.map +1 -1
- package/dist/src/tui/tui-types.d.ts +2 -0
- package/dist/src/tui/tui-types.js.map +1 -1
- package/dist/src/tui/tui.js +17 -2
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/work-items/work-item-service.d.ts +1 -0
- package/dist/src/work-items/work-item-service.js +3 -0
- package/dist/src/work-items/work-item-service.js.map +1 -1
- package/dist/src/work-items/work-item-store.d.ts +1 -0
- package/dist/src/work-items/work-item-store.js +13 -0
- package/dist/src/work-items/work-item-store.js.map +1 -1
- package/package.json +2 -1
- package/dist/gateway/static/root/assets/agents-Bv5R-N8Q.js +0 -2
- package/dist/gateway/static/root/assets/channels-status-swr-MY4Xh4fM.js +0 -1
- package/dist/gateway/static/root/assets/index-CPwVzi9x.css +0 -1
- package/dist/gateway/static/root/assets/index-DZOm5_ex.js +0 -262
- package/dist/gateway/static/root/assets/messages-CQ_k8RHj.js +0 -3
- package/dist/gateway/static/root/assets/settings-advanced-gate-4e8ZQwxr.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-BIWv778A.js +0 -1
- package/dist/src/agent/memory/candidate-extractor.d.ts +0 -6
- package/dist/src/agent/memory/candidate-extractor.js +0 -60
- package/dist/src/agent/memory/candidate-extractor.js.map +0 -1
- package/dist/src/agent/memory/context-assembler.d.ts +0 -10
- package/dist/src/agent/memory/context-assembler.js +0 -26
- package/dist/src/agent/memory/context-assembler.js.map +0 -1
- package/dist/src/agent/memory/inject-prefetch.d.ts +0 -6
- package/dist/src/agent/memory/inject-prefetch.js +0 -48
- package/dist/src/agent/memory/inject-prefetch.js.map +0 -1
- package/dist/src/agent/memory/prefetch-coordinator.d.ts +0 -37
- package/dist/src/agent/memory/prefetch-coordinator.js +0 -45
- 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,
|
|
137
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
400
|
-
...
|
|
401
|
-
|
|
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
|