@xopcai/xopc 0.0.145 → 0.0.147
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 +2 -2
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/demo-memory/src/index.js +6 -4
- 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/Combination-14nmIgxH.js +41 -0
- package/dist/gateway/static/root/assets/activity-store-DXeSSlw1.js +1 -0
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BEUxdhZx.js → agent-avatar-dicebear-CFdJKSjY.js} +1 -1
- package/dist/gateway/static/root/assets/agents-DKjbRpbA.js +2 -0
- package/dist/gateway/static/root/assets/api-Bs69B5zA.js +1 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-CRHSZJWi.js → app-management-settings-panel-ag1ViXT_.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-BunADYJb.js → appearance-settings-C6iMpwOM.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-CpX3lBFF.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-B6vTkH2A.js → archive-plugin-Dwi3mIBy.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-BjZXzaNv.js → attachment-load-BaCDoq40.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-suggestion-card-ZDA-Stg1.js → automation-suggestion-card-CwqtFgnw.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-DlupOxFQ.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-DYZfLvPz.js → binary-plugins-DoAYhsxa.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-C3MUlYC9.js → block-editor-Bw72pO7S.js} +31 -31
- package/dist/gateway/static/root/assets/browser-settings-page-BwLoUBcZ.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-vdbAR65Q.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-BAsKbJgm.js +2 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-fTlTnWB4.js → channel-recipient-api-rTG26jpV.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-CxFWy0cE.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-OKlqTtKJ.js +1 -0
- package/dist/gateway/static/root/assets/{connector-logo-BVFNT2zW.js → connector-logo-DIMP4NWY.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-BjQQwX62.js +2 -0
- package/dist/gateway/static/root/assets/{desktop-pet-_jUmoXd3.js → desktop-pet-kQq2e0BN.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-DwGOy4AQ.js → desktop-pet-settings-B6vtozMY.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-akvF0F-u.js → directory-picker-path-field-Dn5-e3v4.js} +1 -1
- package/dist/gateway/static/root/assets/dist-C230izr8.js +1 -0
- package/dist/gateway/static/root/assets/dist-CxGUk8J-.js +1 -0
- package/dist/gateway/static/root/assets/dreaming-settings-BzwIujPG.js +3 -0
- package/dist/gateway/static/root/assets/extension-debug-page-D_e_hsEy.js +1 -0
- package/dist/gateway/static/root/assets/{extension-page-CwWktRNz.js → extension-page-D15CWHBd.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-CuggWOIl.js → extension-settings-page-D4P0n1om.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-B7sxIbza.js → gateway-config-api-B4qZctjG.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-DIv0eKMf.js → gateway-settings-BvndV7TP.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-DtoLihQE.js → gateway-startup-retry-BpgMunEb.js} +1 -1
- package/dist/gateway/static/root/assets/{goal-create-dialog-C4Kw0mfS.js → goal-create-dialog-DrVHKXHq.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-PHlCwv68.js +4 -0
- package/dist/gateway/static/root/assets/{goals-config-api-B0jm5JaA.js → goals-config-api-B6YJB_ct.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-Hg9uyO6e.js +2 -0
- package/dist/gateway/static/root/assets/{goals-settings-N5_iL7es.js → goals-settings-BROWCIcL.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-XzH3lbRR.js → heartbeat-settings-CoCwIOIg.js} +1 -1
- package/dist/gateway/static/root/assets/index-CxkNzw3e.js +259 -0
- package/dist/gateway/static/root/assets/index-DjCSOyaN.css +1 -0
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-Bm_AIYQ7.js +1 -0
- package/dist/gateway/static/root/assets/local-app-workbench-page-BJWFcxwG.js +2 -0
- package/dist/gateway/static/root/assets/local-apps-page-BsiZMrEf.js +1 -0
- package/dist/gateway/static/root/assets/{locale-store-CiM-D9jA.js → locale-store-Bp8joZck.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-DOmK61ey.js +7 -0
- package/dist/gateway/static/root/assets/{markdown-split-5rJx5flj.js → markdown-split-Dy7QpaAz.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-DYXccwAd.js → media-plugins-3Lxliy9D.js} +1 -1
- package/dist/gateway/static/root/assets/messages-CQGpD-dC.js +5 -0
- package/dist/gateway/static/root/assets/models-hub-panel-DGCZom4o.js +2 -0
- package/dist/gateway/static/root/assets/{notes-page-BgLyndCO.js → notes-page-BJtT4vSf.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-B_bN7cOR.js +4 -0
- package/dist/gateway/static/root/assets/{page-tabs-6Al9_sGz.js → page-tabs-DKB6RDre.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-Cm3G72Hv.js → preview-open-alternatives-Br_YhYHp.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-Dq8JouJj.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-DvfL7fSe.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-DqwMXSXP.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-BYtfzu_F.js → save-bar-controls-BgIE9BBh.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-CvIRc6yK.js → schedule-field-BXDP-oMz.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-CQuKx0n7.js → schema-form-Dhv-SmjG.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-B_mOZkQk.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BHGmH6YS.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-CF3HHM-t.js → settings-collapsible-section-CUTExnlK.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-CwWjoRN6.js → settings-form-section-CmnDhsf0.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-aUFmJa13.js → settings-loading-skeleton-B79dq-XY.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-B2UUU9TF.js → settings-page-Db8uAv3X.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-DqpbTWqI.js → settings-page-layout-DaFwstQw.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-BUSEj0KK.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-BOhlPsS1.js → share-preview-page-Bi00uXzV.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-DzsTYfuX.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DSsdU081.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-DeB1tQZL.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-CWxSvuwD.js → system-settings-panel-Cxaph7hW.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-C9Dxcppm.js → theme-store-eCTN1RpG.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-qROAvqTw.js → typed-models-lib-CcZ_tyFY.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-DE9cpn4G.js → use-channel-catalog-C4PWbNoi.js} +1 -1
- package/dist/gateway/static/root/assets/user-context-page-QTVMx_hG.js +1 -0
- package/dist/gateway/static/root/assets/{user-profile-fields-editor-CWxc0ghP.js → user-profile-fields-editor-CPOO9Jz5.js} +1 -1
- package/dist/gateway/static/root/assets/{user-profile-settings-panel-DW-Up6vt.js → user-profile-settings-panel-C8cgtSF7.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-D53uRXVr.js → utils-CiZK2KwH.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-b-YZtvUu.js +1 -0
- package/dist/gateway/static/root/assets/work-discovery-page-4zVDOl2G.js +1 -0
- package/dist/gateway/static/root/assets/work-item-detail-page-CHe2tfkc.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-D_x9ELJp.js → workflow-run-setup-panel-8SLCYeXE.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-DEOFqiWn.js +11 -0
- package/dist/gateway/static/root/index.html +10 -9
- package/dist/package.js +1 -1
- package/dist/src/activity/types.d.ts +1 -1
- package/dist/src/agent/agent-instance-gateway.d.ts +1 -1
- package/dist/src/agent/agent-manager.d.ts +1 -1
- package/dist/src/agent/agent-manager.js +5 -4
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/background-review/coordinator.js +0 -1
- package/dist/src/agent/background-review/coordinator.js.map +1 -1
- package/dist/src/agent/background-review/settings.d.ts +1 -1
- package/dist/src/agent/background-review/settings.js +10 -17
- package/dist/src/agent/background-review/settings.js.map +1 -1
- package/dist/src/agent/bootstrap/filter-bootstrap-files.d.ts +1 -1
- package/dist/src/agent/bootstrap/filter-bootstrap-files.js +1 -1
- package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +2 -3
- package/dist/src/agent/bootstrap/load-bootstrap-files.js.map +1 -1
- package/dist/src/agent/code-intelligence/binary.js +1 -1
- package/dist/src/agent/context/project-context.d.ts +14 -0
- package/dist/src/agent/context/project-context.js +23 -1
- package/dist/src/agent/context/project-context.js.map +1 -1
- package/dist/src/agent/context/workspace-templates/AGENTS.md +1 -1
- package/dist/src/agent/context/workspace.d.ts +1 -2
- package/dist/src/agent/context/workspace.js +2 -4
- package/dist/src/agent/context/workspace.js.map +1 -1
- package/dist/src/agent/embedded/run-for-session.js +1 -2
- package/dist/src/agent/embedded/run-for-session.js.map +1 -1
- package/dist/src/agent/embedded/run-turn.js +6 -1
- package/dist/src/agent/embedded/run-turn.js.map +1 -1
- package/dist/src/agent/embedded/types.d.ts +17 -0
- package/dist/src/agent/memory/builtin-memory-store.d.ts +2 -2
- package/dist/src/agent/memory/builtin-memory-store.js +2 -2
- package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
- package/dist/src/agent/memory/builtin-provider.d.ts +1 -3
- package/dist/src/agent/memory/builtin-provider.js +21 -48
- package/dist/src/agent/memory/builtin-provider.js.map +1 -1
- package/dist/src/agent/memory/context/planner.js +48 -9
- package/dist/src/agent/memory/context/planner.js.map +1 -1
- package/dist/src/agent/memory/context/types.d.ts +7 -1
- package/dist/src/agent/memory/context-fence.js +1 -1
- package/dist/src/agent/memory/context-fence.js.map +1 -1
- package/dist/src/agent/memory/create-memory-manager.js +2 -9
- package/dist/src/agent/memory/create-memory-manager.js.map +1 -1
- package/dist/src/agent/memory/dreaming/config.js +5 -10
- package/dist/src/agent/memory/dreaming/config.js.map +1 -1
- package/dist/src/agent/memory/dreaming/promotion-lifecycle.js +2 -2
- package/dist/src/agent/memory/dreaming/promotion-lifecycle.js.map +1 -1
- package/dist/src/agent/memory/dreaming/scope.d.ts +2 -3
- package/dist/src/agent/memory/dreaming/scope.js +8 -8
- package/dist/src/agent/memory/dreaming/scope.js.map +1 -1
- package/dist/src/agent/memory/manager.d.ts +1 -5
- package/dist/src/agent/memory/manager.js +2 -23
- package/dist/src/agent/memory/manager.js.map +1 -1
- package/dist/src/agent/memory/memory-config.d.ts +3 -3
- package/dist/src/agent/memory/memory-config.js +9 -14
- package/dist/src/agent/memory/memory-config.js.map +1 -1
- package/dist/src/agent/memory/types.d.ts +9 -5
- package/dist/src/agent/memory/understanding/service.js +21 -8
- package/dist/src/agent/memory/understanding/service.js.map +1 -1
- package/dist/src/agent/memory/understanding/types.d.ts +5 -0
- package/dist/src/agent/memory/user-context-coordinator.d.ts +1 -1
- package/dist/src/agent/memory/user-context-coordinator.js +6 -2
- package/dist/src/agent/memory/user-context-coordinator.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/prompt/memory/index.d.ts +1 -2
- package/dist/src/agent/prompt/memory/index.js +6 -7
- package/dist/src/agent/prompt/memory/index.js.map +1 -1
- package/dist/src/agent/prompt/sections/tooling.js +1 -1
- package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
- package/dist/src/agent/service/direct-turn-helpers.js +13 -2
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
- package/dist/src/agent/tools/curated-memory-tool.js +4 -4
- package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +1 -1
- package/dist/src/agent/tools/factory.js +2 -2
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/memory-tool.js +1 -1
- package/dist/src/agent/tools/memory-tool.js.map +1 -1
- package/dist/src/agent/workflow/workflow-child-tools.js +2 -3
- package/dist/src/agent/workflow/workflow-child-tools.js.map +1 -1
- package/dist/src/agent/workspace-runtime/registry.d.ts +5 -5
- package/dist/src/agent/workspace-runtime/registry.js +6 -11
- 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/prompt.js +1 -7
- package/dist/src/agent-manifest/prompt.js.map +1 -1
- package/dist/src/agent-manifest/schema.d.ts +0 -598
- package/dist/src/agent-manifest/schema.js +2 -143
- package/dist/src/agent-manifest/schema.js.map +1 -1
- package/dist/src/agent-manifest/validator.js +0 -12
- package/dist/src/agent-manifest/validator.js.map +1 -1
- package/dist/src/agent-runtime/index.js +1 -1
- package/dist/src/agent-runtime/memory-runtime.d.ts +2 -2
- package/dist/src/agent-runtime/memory-runtime.js +8 -7
- package/dist/src/agent-runtime/memory-runtime.js.map +1 -1
- package/dist/src/agent-runtime/runtime-profile.d.ts +2 -0
- package/dist/src/agent-runtime/runtime-profile.js +2 -2
- package/dist/src/agent-runtime/runtime-profile.js.map +1 -1
- package/dist/src/chat-commands/agent-edit.js +1 -2
- package/dist/src/chat-commands/agent-edit.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/init.js +0 -22
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/templates.d.ts +1 -1
- package/dist/src/cli/templates.js +1 -16
- package/dist/src/cli/templates.js.map +1 -1
- package/dist/src/commands/agents.config.js +0 -10
- package/dist/src/commands/agents.config.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/paths.d.ts +0 -1
- package/dist/src/config/paths.js +1 -2
- package/dist/src/config/paths.js.map +1 -1
- package/dist/src/config/schema.d.ts +118 -532
- package/dist/src/config/schema.js +32 -26
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/extensions/loader.js +2 -1
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +0 -2
- package/dist/src/gateway/agents-admin.js +1 -7
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/capability-presets-admin.d.ts +0 -2
- package/dist/src/gateway/capability-presets-admin.js.map +1 -1
- package/dist/src/gateway/chat-stream/mapper.js +26 -0
- package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
- package/dist/src/gateway/chat-stream/protocol.d.ts +16 -1
- package/dist/src/gateway/dreaming-automation-reconciler.d.ts +0 -1
- package/dist/src/gateway/dreaming-automation-reconciler.js +41 -63
- package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -1
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/app.js +3 -1
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +0 -130
- package/dist/src/gateway/hono/lib/config-payload.js +0 -1
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js +6 -12
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +6 -0
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
- package/dist/src/gateway/hono/routes/capability-presets.js +2 -2
- package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +9 -20
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/index.js +4 -0
- package/dist/src/gateway/hono/routes/index.js.map +1 -1
- package/dist/src/gateway/hono/routes/local-apps.d.ts +5 -0
- package/dist/src/gateway/hono/routes/local-apps.js +99 -0
- package/dist/src/gateway/hono/routes/local-apps.js.map +1 -0
- package/dist/src/gateway/hono/routes/memory.js +48 -65
- package/dist/src/gateway/hono/routes/memory.js.map +1 -1
- package/dist/src/gateway/hono/routes/projects.js +2 -2
- package/dist/src/gateway/hono/routes/projects.js.map +1 -1
- package/dist/src/gateway/hono/routes/work-discovery.d.ts +3 -0
- package/dist/src/gateway/hono/routes/work-discovery.js +150 -0
- package/dist/src/gateway/hono/routes/work-discovery.js.map +1 -0
- package/dist/src/gateway/hono/routes/you.d.ts +3 -0
- package/dist/src/gateway/hono/routes/you.js +358 -91
- package/dist/src/gateway/hono/routes/you.js.map +1 -1
- package/dist/src/gateway/service.d.ts +3 -0
- package/dist/src/gateway/service.js +12 -0
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/knowledge/connected-knowledge-pipeline.js +9 -5
- package/dist/src/knowledge/connected-knowledge-pipeline.js.map +1 -1
- package/dist/src/local-apps/acceptance.d.ts +30 -0
- package/dist/src/local-apps/acceptance.js +93 -0
- package/dist/src/local-apps/acceptance.js.map +1 -0
- package/dist/src/local-apps/index.d.ts +5 -0
- package/dist/src/local-apps/index.js +4 -0
- package/dist/src/local-apps/preview-runtime-bridge.d.ts +4 -0
- package/dist/src/local-apps/preview-runtime-bridge.js +171 -0
- package/dist/src/local-apps/preview-runtime-bridge.js.map +1 -0
- package/dist/src/local-apps/runtime-entry.d.ts +8 -0
- package/dist/src/local-apps/runtime-entry.js +25 -0
- package/dist/src/local-apps/runtime-entry.js.map +1 -0
- package/dist/src/local-apps/scaffold.d.ts +8 -0
- package/dist/src/local-apps/scaffold.js +122 -0
- package/dist/src/local-apps/scaffold.js.map +1 -0
- package/dist/src/local-apps/service.d.ts +37 -0
- package/dist/src/local-apps/service.js +553 -0
- package/dist/src/local-apps/service.js.map +1 -0
- package/dist/src/local-apps/store.d.ts +44 -0
- package/dist/src/local-apps/store.js +195 -0
- package/dist/src/local-apps/store.js.map +1 -0
- package/dist/src/local-apps/types.d.ts +105 -0
- package/dist/src/local-apps/types.js +1 -0
- package/dist/src/storage/sqlite/index.d.ts +3 -2
- package/dist/src/storage/sqlite/index.js +4 -3
- package/dist/src/storage/sqlite/memory-index-repository.d.ts +2 -3
- package/dist/src/storage/sqlite/memory-index-repository.js +16 -20
- package/dist/src/storage/sqlite/memory-index-repository.js.map +1 -1
- package/dist/src/storage/sqlite/memory-records-repository.d.ts +18 -10
- package/dist/src/storage/sqlite/memory-records-repository.js +79 -34
- package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -1
- package/dist/src/storage/sqlite/memory-reference-consent-repository.d.ts +27 -0
- package/dist/src/storage/sqlite/memory-reference-consent-repository.js +109 -0
- package/dist/src/storage/sqlite/memory-reference-consent-repository.js.map +1 -0
- package/dist/src/storage/sqlite/migrations/038_user_owned_memory.sql +68 -0
- package/dist/src/storage/sqlite/migrations/039_memory_reference_consents.sql +19 -0
- package/dist/src/storage/sqlite/migrations/040_local_apps.sql +32 -0
- package/dist/src/storage/sqlite/migrations/041_local_app_release_lifecycle.sql +17 -0
- package/dist/src/storage/sqlite/migrations/042_work_discovery.sql +41 -0
- package/dist/src/storage/sqlite/migrations/043_local_app_acceptance_runs.sql +16 -0
- package/dist/src/storage/sqlite/migrations/044_repair_work_discovery_foreign_keys.sql +75 -0
- package/dist/src/storage/sqlite/migrations/045_extension_ui_grants.sql +13 -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/storage/sqlite/schema.sql +20 -0
- package/dist/src/user-context/config.d.ts +227 -0
- package/dist/src/user-context/config.js +158 -0
- package/dist/src/user-context/config.js.map +1 -0
- package/dist/src/user-context/import.d.ts +1 -1
- package/dist/src/user-context/import.js +6 -1
- package/dist/src/user-context/import.js.map +1 -1
- package/dist/src/user-context/owner.d.ts +5 -0
- package/dist/src/user-context/owner.js +9 -0
- package/dist/src/user-context/owner.js.map +1 -0
- package/dist/src/user-context/projection.d.ts +11 -9
- package/dist/src/user-context/projection.js +74 -47
- package/dist/src/user-context/projection.js.map +1 -1
- package/dist/src/user-context/runtime.d.ts +13 -0
- package/dist/src/user-context/runtime.js +36 -0
- package/dist/src/user-context/runtime.js.map +1 -0
- package/dist/src/work-discovery/analyzer.d.ts +11 -0
- package/dist/src/work-discovery/analyzer.js +171 -0
- package/dist/src/work-discovery/analyzer.js.map +1 -0
- package/dist/src/work-discovery/index.d.ts +5 -0
- package/dist/src/work-discovery/index.js +5 -0
- package/dist/src/work-discovery/probe.d.ts +12 -0
- package/dist/src/work-discovery/probe.js +335 -0
- package/dist/src/work-discovery/probe.js.map +1 -0
- package/dist/src/work-discovery/repository.d.ts +11 -0
- package/dist/src/work-discovery/repository.js +100 -0
- package/dist/src/work-discovery/repository.js.map +1 -0
- package/dist/src/work-discovery/service.d.ts +30 -0
- package/dist/src/work-discovery/service.js +387 -0
- package/dist/src/work-discovery/service.js.map +1 -0
- package/dist/src/work-discovery/types.d.ts +114 -0
- package/dist/src/work-discovery/types.js +1 -0
- package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/package.json +5 -3
- package/skills/engineering/build-xopc-local-app/SKILL.md +45 -0
- package/skills/engineering/build-xopc-local-app/references/app-contract.md +33 -0
- package/skills/engineering/build-xopc-local-app/scripts/validate-local-app.mjs +72 -0
- package/dist/gateway/static/root/assets/Combination-DolwnuKi.js +0 -41
- package/dist/gateway/static/root/assets/activity-center-store-3l9ahUqb.js +0 -1
- package/dist/gateway/static/root/assets/agents-1bpT0xRO.js +0 -2
- package/dist/gateway/static/root/assets/apps-page-Cc4JgVUQ.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-mb0fdVpq.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-Bb0xhaMN.js +0 -8
- package/dist/gateway/static/root/assets/capability-presets-api-BV76yN9a.js +0 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CUcGKZqC.js +0 -2
- package/dist/gateway/static/root/assets/channels-settings-BlSDMGdy.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-CJauF1CW.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-CMgAFGvb.js +0 -2
- package/dist/gateway/static/root/assets/dist-C99RGfAH.js +0 -1
- package/dist/gateway/static/root/assets/dreaming-settings-BLetQiYY.js +0 -3
- package/dist/gateway/static/root/assets/extension-debug-page-Cof2ncxE.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-BMmzYpZL.js +0 -4
- package/dist/gateway/static/root/assets/goals-page-CGeT77PC.js +0 -2
- package/dist/gateway/static/root/assets/index-CSLF84-Q.css +0 -1
- package/dist/gateway/static/root/assets/index-I-ZCenVw.js +0 -259
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-x_v0nrIi.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-BSh1t8cD.js +0 -7
- package/dist/gateway/static/root/assets/messages-Cb1VMeqP.js +0 -5
- package/dist/gateway/static/root/assets/models-hub-panel-BNpTenAI.js +0 -2
- package/dist/gateway/static/root/assets/notes-workbench-teklkhcE.js +0 -4
- package/dist/gateway/static/root/assets/project-detail-page-CCB_dKoh.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-VOAFAHYj.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-USYu64Ru.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-oGC8O5h_.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-D4rP66R1.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Ck9keROI.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-BYLsCuqj.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-BNHUyVML.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-CpXbQH4n.js +0 -2
- package/dist/gateway/static/root/assets/user-context-page-DbNEK4Yp.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-Cs7MOrg0.js +0 -1
- package/dist/gateway/static/root/assets/work-item-detail-page-D1ziG1Pp.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-DHGV_n6i.js +0 -11
- package/dist/src/agent/context/workspace-templates/MEMORY.md +0 -33
- package/dist/src/agent/memory/access-policy.d.ts +0 -12
- package/dist/src/agent/memory/access-policy.js +0 -44
- package/dist/src/agent/memory/access-policy.js.map +0 -1
|
@@ -1,19 +1,18 @@
|
|
|
1
|
+
import { LOCAL_USER_ID } from "../../../user-context/owner.js";
|
|
1
2
|
import { appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, findLatestMemoryInjectTrace, getMemoryRecord, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, searchMemoryRecords, setLatestMemoryInjectFeedback, setMemoryTraceFeedback, summarizeMemoryRecallFeedback, summarizeUserUnderstandingQuality, upsertMemoryRecord } from "../../../storage/sqlite/memory-records-repository.js";
|
|
2
3
|
import { listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns } from "../../../storage/sqlite/knowledge-repository.js";
|
|
3
4
|
import "../../../storage/sqlite/index.js";
|
|
4
|
-
import {
|
|
5
|
+
import { UserContextConfigSchema, init_config } from "../../../user-context/config.js";
|
|
5
6
|
import { init_agent_scope, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
|
|
6
|
-
import { resolveEffectiveAgentManifestForAgent } from "../../../config/agent-profile.js";
|
|
7
7
|
import { resolveBuiltinMemoryStoreConfig } from "../../../agent/memory/memory-config.js";
|
|
8
8
|
import { BuiltinMemoryStore } from "../../../agent/memory/builtin-memory-store.js";
|
|
9
9
|
import { discoverMemoryPlugins } from "../../../agent/memory/plugin-discovery.js";
|
|
10
10
|
import { createMemoryManagerFromConfig } from "../../../agent/memory/create-memory-manager.js";
|
|
11
11
|
import { resolveAdaptiveUnderstandingCadence } from "../../../agent/memory/understanding/quality.js";
|
|
12
|
-
import { prepareUpdateAgent } from "../../agents-admin.js";
|
|
13
12
|
import { isUserContextRecord, projectUserContextRecord } from "../../../user-context/projection.js";
|
|
14
13
|
//#region src/gateway/hono/routes/memory.ts
|
|
15
|
-
init_schema();
|
|
16
14
|
init_agent_scope();
|
|
15
|
+
init_config();
|
|
17
16
|
const MEMORY_KINDS = new Set([
|
|
18
17
|
"user_profile",
|
|
19
18
|
"preference",
|
|
@@ -26,7 +25,7 @@ const MEMORY_KINDS = new Set([
|
|
|
26
25
|
"open_question",
|
|
27
26
|
"milestone",
|
|
28
27
|
"current_state",
|
|
29
|
-
"
|
|
28
|
+
"curated_note",
|
|
30
29
|
"workspace_fact",
|
|
31
30
|
"daily_note",
|
|
32
31
|
"session_summary",
|
|
@@ -111,7 +110,7 @@ function personalContextForTrace(trace) {
|
|
|
111
110
|
}));
|
|
112
111
|
}
|
|
113
112
|
function registerMemoryRoutes(authenticated, deps) {
|
|
114
|
-
authenticated.get("/api/
|
|
113
|
+
authenticated.get("/api/user-context/providers", async (c) => {
|
|
115
114
|
const cfg = deps.service.currentConfig;
|
|
116
115
|
const plugins = await discoverMemoryPlugins(cfg);
|
|
117
116
|
return c.json({ providers: [{
|
|
@@ -140,35 +139,27 @@ function registerMemoryRoutes(authenticated, deps) {
|
|
|
140
139
|
capabilities: plugin.manifest?.capabilities ?? {}
|
|
141
140
|
}))] });
|
|
142
141
|
});
|
|
143
|
-
authenticated.get("/api/
|
|
142
|
+
authenticated.get("/api/user-context/config", (c) => {
|
|
144
143
|
const cfg = deps.service.currentConfig;
|
|
145
|
-
|
|
146
|
-
return c.json({
|
|
147
|
-
agentId: manifest.id,
|
|
148
|
-
memory: manifest.memory
|
|
149
|
-
});
|
|
144
|
+
return c.json({ userContext: cfg.userContext });
|
|
150
145
|
});
|
|
151
|
-
authenticated.
|
|
146
|
+
authenticated.put("/api/user-context/config", deps.strictRateLimitMiddleware, async (c) => {
|
|
152
147
|
const cfg = deps.service.currentConfig;
|
|
153
148
|
const body = await c.req.json().catch(() => ({}));
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
const save = await deps.service.saveConfig(prep.data.nextConfig);
|
|
160
|
-
if (!save.saved) return c.json({ error: save.error ?? "save failed" }, 500);
|
|
161
|
-
const manifest = resolveEffectiveAgentManifestForAgent(deps.service.currentConfig, agentId);
|
|
162
|
-
return c.json({
|
|
163
|
-
agentId: manifest.id,
|
|
164
|
-
memory: manifest.memory
|
|
149
|
+
const parsed = UserContextConfigSchema.safeParse(body);
|
|
150
|
+
if (!parsed.success) return c.json({ error: `userContext ${parsed.error.issues[0]?.message ?? "is invalid"}` }, 400);
|
|
151
|
+
const save = await deps.service.saveConfig({
|
|
152
|
+
...cfg,
|
|
153
|
+
userContext: parsed.data
|
|
165
154
|
});
|
|
155
|
+
if (!save.saved) return c.json({ error: save.error ?? "save failed" }, 500);
|
|
156
|
+
return c.json({ userContext: deps.service.currentConfig.userContext });
|
|
166
157
|
});
|
|
167
|
-
authenticated.get("/api/
|
|
168
|
-
|
|
158
|
+
authenticated.get("/api/user-context/memories", (c) => {
|
|
159
|
+
if (c.req.query("agentId")) return c.json({ error: "agentId is not supported" }, 400);
|
|
169
160
|
const records = listMemoryRecords({
|
|
170
161
|
providerId: c.req.query("providerId") || void 0,
|
|
171
|
-
|
|
162
|
+
userId: LOCAL_USER_ID,
|
|
172
163
|
workspaceId: c.req.query("workspaceId") || void 0,
|
|
173
164
|
projectId: c.req.query("projectId") || void 0,
|
|
174
165
|
kind: parseKind(c.req.query("kind")),
|
|
@@ -178,15 +169,15 @@ function registerMemoryRoutes(authenticated, deps) {
|
|
|
178
169
|
});
|
|
179
170
|
return c.json({ records });
|
|
180
171
|
});
|
|
181
|
-
authenticated.post("/api/
|
|
172
|
+
authenticated.post("/api/user-context/memories/search", async (c) => {
|
|
182
173
|
const body = await c.req.json().catch(() => ({}));
|
|
183
174
|
const query = typeof body.query === "string" ? body.query.trim() : "";
|
|
184
175
|
if (!query) return c.json({ error: "Missing required field: query" }, 400);
|
|
185
|
-
|
|
176
|
+
if (Object.hasOwn(body, "agentId") || Object.hasOwn(body, "userId")) return c.json({ error: "agentId and userId are not accepted" }, 400);
|
|
186
177
|
const records = searchMemoryRecords({
|
|
187
178
|
query,
|
|
188
179
|
providerId: typeof body.providerId === "string" ? body.providerId : void 0,
|
|
189
|
-
|
|
180
|
+
userId: LOCAL_USER_ID,
|
|
190
181
|
workspaceId: typeof body.workspaceId === "string" ? body.workspaceId : void 0,
|
|
191
182
|
projectId: typeof body.projectId === "string" ? body.projectId : void 0,
|
|
192
183
|
kinds: Array.isArray(body.kinds) ? body.kinds.map(parseKind).filter((v) => Boolean(v)) : void 0,
|
|
@@ -196,17 +187,17 @@ function registerMemoryRoutes(authenticated, deps) {
|
|
|
196
187
|
});
|
|
197
188
|
return c.json({ results: records });
|
|
198
189
|
});
|
|
199
|
-
authenticated.post("/api/
|
|
190
|
+
authenticated.post("/api/user-context/memories", async (c) => {
|
|
200
191
|
const body = await c.req.json().catch(() => ({}));
|
|
201
192
|
const kind = parseKind(body.kind);
|
|
202
193
|
const content = typeof body.content === "string" ? body.content.trim() : "";
|
|
203
|
-
|
|
194
|
+
if (Object.hasOwn(body, "agentId") || Object.hasOwn(body, "userId")) return c.json({ error: "agentId and userId are not accepted" }, 400);
|
|
204
195
|
if (!kind || !content) return c.json({ error: "Missing required fields: kind, content" }, 400);
|
|
205
196
|
const record = upsertMemoryRecord({
|
|
206
197
|
id: typeof body.id === "string" && body.id.trim() ? body.id.trim() : void 0,
|
|
207
198
|
providerId: typeof body.providerId === "string" && body.providerId.trim() ? body.providerId.trim() : "local",
|
|
208
199
|
kind,
|
|
209
|
-
|
|
200
|
+
sourceAgentId: resolveDefaultAgentId(deps.service.currentConfig),
|
|
210
201
|
workspaceId: typeof body.workspaceId === "string" ? body.workspaceId : deps.service.currentWorkspacePath,
|
|
211
202
|
sessionKey: typeof body.sessionKey === "string" ? body.sessionKey : void 0,
|
|
212
203
|
projectId: typeof body.projectId === "string" ? body.projectId : void 0,
|
|
@@ -231,17 +222,16 @@ function registerMemoryRoutes(authenticated, deps) {
|
|
|
231
222
|
});
|
|
232
223
|
return c.json({ record }, 201);
|
|
233
224
|
});
|
|
234
|
-
authenticated.
|
|
225
|
+
authenticated.put("/api/user-context/memories/:id", async (c) => {
|
|
235
226
|
const existing = getMemoryRecord(c.req.param("id"));
|
|
236
227
|
if (!existing) return c.json({ error: "Memory record not found" }, 404);
|
|
237
|
-
|
|
238
|
-
if (existing.scope.agentId !== selectedAgentId) return c.json({ error: "Memory record not found for selected agent" }, 404);
|
|
228
|
+
if (c.req.query("agentId")) return c.json({ error: "agentId is not supported" }, 400);
|
|
239
229
|
const body = await c.req.json().catch(() => ({}));
|
|
240
230
|
const record = upsertMemoryRecord({
|
|
241
231
|
id: existing.id,
|
|
242
232
|
providerId: existing.source.provider ?? "local",
|
|
243
233
|
kind: parseKind(body.kind) ?? existing.kind,
|
|
244
|
-
|
|
234
|
+
sourceAgentId: existing.provenance.sourceAgentId,
|
|
245
235
|
workspaceId: existing.scope.workspaceId,
|
|
246
236
|
sessionKey: existing.scope.sessionKey,
|
|
247
237
|
projectId: typeof body.projectId === "string" ? body.projectId : existing.scope.projectId,
|
|
@@ -266,19 +256,19 @@ function registerMemoryRoutes(authenticated, deps) {
|
|
|
266
256
|
});
|
|
267
257
|
return c.json({ record });
|
|
268
258
|
});
|
|
269
|
-
authenticated.delete("/api/
|
|
259
|
+
authenticated.delete("/api/user-context/memories/:id", (c) => {
|
|
270
260
|
const existing = getMemoryRecord(c.req.param("id"));
|
|
271
|
-
|
|
272
|
-
if (!existing || existing.scope.
|
|
261
|
+
if (c.req.query("agentId")) return c.json({ error: "agentId is not supported" }, 400);
|
|
262
|
+
if (!existing || existing.scope.userId !== "local-owner") return c.json({ error: "Memory record not found" }, 404);
|
|
273
263
|
if (!deleteMemoryRecord(c.req.param("id"))) return c.json({ error: "Memory record not found" }, 404);
|
|
274
264
|
return c.json({ ok: true });
|
|
275
265
|
});
|
|
276
|
-
authenticated.get("/api/
|
|
277
|
-
|
|
266
|
+
authenticated.get("/api/user-context/signals", (c) => {
|
|
267
|
+
if (c.req.query("agentId")) return c.json({ error: "agentId is not supported" }, 400);
|
|
278
268
|
const signals = listMemorySignals({
|
|
279
269
|
recordId: c.req.query("recordId") || void 0,
|
|
280
270
|
providerId: c.req.query("providerId") || void 0,
|
|
281
|
-
|
|
271
|
+
userId: LOCAL_USER_ID,
|
|
282
272
|
workspaceId: c.req.query("workspaceId") || void 0,
|
|
283
273
|
limit: parseLimit(c.req.query("limit"))
|
|
284
274
|
});
|
|
@@ -311,18 +301,16 @@ function registerMemoryRoutes(authenticated, deps) {
|
|
|
311
301
|
});
|
|
312
302
|
return c.json({ syncRuns });
|
|
313
303
|
});
|
|
314
|
-
authenticated.get("/api/
|
|
315
|
-
const agentId = c.req.query("agentId") || resolveDefaultAgentId(deps.service.currentConfig);
|
|
304
|
+
authenticated.get("/api/user-context/traces", (c) => {
|
|
316
305
|
const traces = listMemoryTraceEvents({
|
|
317
306
|
providerId: c.req.query("providerId") || void 0,
|
|
318
|
-
agentId,
|
|
319
307
|
sessionKey: c.req.query("sessionKey") || void 0,
|
|
320
308
|
phase: c.req.query("phase") || void 0,
|
|
321
309
|
limit: parseLimit(c.req.query("limit"))
|
|
322
310
|
});
|
|
323
311
|
return c.json({ traces });
|
|
324
312
|
});
|
|
325
|
-
authenticated.patch("/api/
|
|
313
|
+
authenticated.patch("/api/user-context/traces/:traceId/feedback", async (c) => {
|
|
326
314
|
const body = await c.req.json().catch(() => ({}));
|
|
327
315
|
const outcome = typeof body.outcome === "string" && MEMORY_TRACE_FEEDBACK_OUTCOMES.has(body.outcome) ? body.outcome : void 0;
|
|
328
316
|
if (!outcome) return c.json({ error: "Missing or invalid required field: outcome" }, 400);
|
|
@@ -339,31 +327,26 @@ function registerMemoryRoutes(authenticated, deps) {
|
|
|
339
327
|
if (!trace) return c.json({ error: "Memory trace not found" }, 404);
|
|
340
328
|
return c.json({ trace });
|
|
341
329
|
});
|
|
342
|
-
authenticated.get("/api/
|
|
343
|
-
const agentId = c.req.query("agentId") || resolveDefaultAgentId(deps.service.currentConfig);
|
|
330
|
+
authenticated.get("/api/user-context/feedback-summary", (c) => {
|
|
344
331
|
const summaries = summarizeMemoryRecallFeedback({
|
|
345
332
|
recordId: c.req.query("recordId") || void 0,
|
|
346
333
|
providerId: c.req.query("providerId") || void 0,
|
|
347
|
-
agentId,
|
|
348
334
|
sessionKey: c.req.query("sessionKey") || void 0,
|
|
349
335
|
limit: parseFeedbackSummaryLimit(c.req.query("limit"))
|
|
350
336
|
});
|
|
351
337
|
return c.json({ summaries });
|
|
352
338
|
});
|
|
353
|
-
authenticated.get("/api/
|
|
339
|
+
authenticated.get("/api/user-context/quality", (c) => {
|
|
354
340
|
const cfg = deps.service.currentConfig;
|
|
355
|
-
const
|
|
356
|
-
const
|
|
357
|
-
|
|
358
|
-
windowDays: parseWindowDays(c.req.query("windowDays"))
|
|
359
|
-
});
|
|
360
|
-
const cadence = resolveAdaptiveUnderstandingCadence(manifest.memory.understanding?.reviewIntervalTurns ?? 10, metrics, manifest.memory.understanding?.adaptiveCadence ?? true);
|
|
341
|
+
const metrics = summarizeUserUnderstandingQuality({ windowDays: parseWindowDays(c.req.query("windowDays")) });
|
|
342
|
+
const baseIntervalTurns = cfg.userContext.understanding.reviewIntervalTurns;
|
|
343
|
+
const cadence = resolveAdaptiveUnderstandingCadence(baseIntervalTurns, metrics, cfg.userContext.understanding.adaptiveCadence);
|
|
361
344
|
return c.json({
|
|
362
345
|
metrics,
|
|
363
346
|
cadence
|
|
364
347
|
});
|
|
365
348
|
});
|
|
366
|
-
authenticated.patch("/api/
|
|
349
|
+
authenticated.patch("/api/user-context/understanding/response-feedback", deps.strictRateLimitMiddleware, async (c) => {
|
|
367
350
|
const body = await c.req.json().catch(() => ({}));
|
|
368
351
|
const sessionKey = typeof body.sessionKey === "string" ? body.sessionKey.trim() : "";
|
|
369
352
|
const assistantTimestamp = typeof body.assistantTimestamp === "number" ? body.assistantTimestamp : NaN;
|
|
@@ -387,7 +370,7 @@ function registerMemoryRoutes(authenticated, deps) {
|
|
|
387
370
|
remediation: trace?.remediation ?? null
|
|
388
371
|
});
|
|
389
372
|
});
|
|
390
|
-
authenticated.get("/api/
|
|
373
|
+
authenticated.get("/api/user-context/understanding/response-feedback", (c) => {
|
|
391
374
|
const sessionKey = c.req.query("sessionKey")?.trim() ?? "";
|
|
392
375
|
const assistantTimestamp = Number(c.req.query("assistantTimestamp"));
|
|
393
376
|
if (!sessionKey || !Number.isFinite(assistantTimestamp) || assistantTimestamp <= 0) return c.json({ error: "sessionKey and assistantTimestamp are required" }, 400);
|
|
@@ -402,13 +385,13 @@ function registerMemoryRoutes(authenticated, deps) {
|
|
|
402
385
|
feedback: trace?.feedback ?? null
|
|
403
386
|
});
|
|
404
387
|
});
|
|
405
|
-
authenticated.post("/api/
|
|
388
|
+
authenticated.post("/api/user-context/signals", async (c) => {
|
|
406
389
|
const body = await c.req.json().catch(() => ({}));
|
|
407
390
|
const source = typeof body.source === "string" ? body.source : "";
|
|
408
391
|
if (!source) return c.json({ error: "Missing required field: source" }, 400);
|
|
409
392
|
const signalId = appendMemorySignal({
|
|
410
393
|
providerId: typeof body.providerId === "string" ? body.providerId : void 0,
|
|
411
|
-
|
|
394
|
+
sourceAgentId: resolveDefaultAgentId(deps.service.currentConfig),
|
|
412
395
|
workspaceId: typeof body.workspaceId === "string" ? body.workspaceId : void 0,
|
|
413
396
|
sessionKey: typeof body.sessionKey === "string" ? body.sessionKey : void 0,
|
|
414
397
|
signal: {
|
|
@@ -421,7 +404,7 @@ function registerMemoryRoutes(authenticated, deps) {
|
|
|
421
404
|
});
|
|
422
405
|
return c.json({ signalId }, 201);
|
|
423
406
|
});
|
|
424
|
-
authenticated.post("/api/
|
|
407
|
+
authenticated.post("/api/user-context/providers/:id/test", deps.strictRateLimitMiddleware, async (c) => {
|
|
425
408
|
const providerId = c.req.param("id");
|
|
426
409
|
const cfg = deps.service.currentConfig;
|
|
427
410
|
const workspace = deps.service.currentWorkspacePath;
|
|
@@ -453,7 +436,7 @@ function registerMemoryRoutes(authenticated, deps) {
|
|
|
453
436
|
const write = await manager.write({
|
|
454
437
|
kind: "workspace_fact",
|
|
455
438
|
content: `Smoke test record for ${providerId}: ${token}`,
|
|
456
|
-
scope: {
|
|
439
|
+
scope: { userId: LOCAL_USER_ID },
|
|
457
440
|
tags: ["xopc-smoke-test"]
|
|
458
441
|
});
|
|
459
442
|
checks.push({
|
|
@@ -463,7 +446,7 @@ function registerMemoryRoutes(authenticated, deps) {
|
|
|
463
446
|
});
|
|
464
447
|
const ownResults = (await manager.search({
|
|
465
448
|
query: token,
|
|
466
|
-
scope: {
|
|
449
|
+
scope: { userId: LOCAL_USER_ID },
|
|
467
450
|
maxResults: 10
|
|
468
451
|
})).filter((result) => result.citation.providerId === providerId);
|
|
469
452
|
checks.push({
|
|
@@ -475,7 +458,7 @@ function registerMemoryRoutes(authenticated, deps) {
|
|
|
475
458
|
if (recordId) {
|
|
476
459
|
const read = await manager.read({
|
|
477
460
|
id: recordId,
|
|
478
|
-
scope: {
|
|
461
|
+
scope: { userId: LOCAL_USER_ID }
|
|
479
462
|
});
|
|
480
463
|
checks.push({
|
|
481
464
|
name: "read",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","names":[],"sources":["../../../../../src/gateway/hono/routes/memory.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { BuiltinMemoryStore } from '../../../agent/memory/builtin-memory-store.js';\nimport { createMemoryManagerFromConfig } from '../../../agent/memory/create-memory-manager.js';\nimport { resolveBuiltinMemoryStoreConfig } from '../../../agent/memory/memory-config.js';\nimport { discoverMemoryPlugins } from '../../../agent/memory/plugin-discovery.js';\nimport { resolveAdaptiveUnderstandingCadence } from '../../../agent/memory/understanding/quality.js';\nimport type {\n MemoryDisclosurePolicy,\n MemoryDurability,\n MemoryExplicitness,\n MemoryKind,\n MemorySensitivity,\n MemoryStatus,\n} from '../../../agent/memory/types.js';\nimport { MemoryPolicySchema } from '../../../agent-manifest/schema.js';\nimport { resolveDefaultAgentId } from '../../../agent/agent-scope.js';\nimport { resolveEffectiveAgentManifestForAgent } from '../../../config/agent-profile.js';\nimport type { Config } from '../../../config/schema.js';\nimport type { KnowledgeSynthesisStatus } from '../../../knowledge/types.js';\nimport { prepareUpdateAgent } from '../../agents-admin.js';\nimport {\n appendMemorySignal,\n appendMemoryTraceEvent,\n deleteMemoryRecord,\n findLatestMemoryInjectTrace,\n getMemoryRecord,\n listKnowledgeSourceChanges,\n listKnowledgeSourceItems,\n listKnowledgeSyncRuns,\n listMemoryRecords,\n listMemorySignals,\n listMemoryTraceEvents,\n searchMemoryRecords,\n setMemoryTraceFeedback,\n setLatestMemoryInjectFeedback,\n summarizeMemoryRecallFeedback,\n summarizeUserUnderstandingQuality,\n upsertMemoryRecord,\n} from '../../../storage/sqlite/index.js';\nimport { isUserContextRecord, projectUserContextRecord } from '../../../user-context/projection.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nconst MEMORY_KINDS = new Set<MemoryKind>([\n 'user_profile',\n 'preference',\n 'boundary',\n 'relationship',\n 'project_context',\n 'commitment',\n 'routine',\n 'personal_logistics',\n 'open_question',\n 'milestone',\n 'current_state',\n 'agent_note',\n 'workspace_fact',\n 'daily_note',\n 'session_summary',\n 'derived_insight',\n 'task_lesson',\n 'tool_preference',\n 'long_term_goal',\n]);\n\nconst MEMORY_EXPLICITNESS = new Set<MemoryExplicitness>(['explicit', 'observed', 'inferred']);\nconst MEMORY_DURABILITY = new Set<MemoryDurability>(['ephemeral', 'durable', 'recurring']);\nconst MEMORY_DISCLOSURE_POLICIES = new Set<MemoryDisclosurePolicy>([\n 'silent', 'referenceable', 'ask_before_reference',\n]);\n\nconst MEMORY_STATUSES = new Set<MemoryStatus>([\n 'candidate',\n 'active',\n 'needs_review',\n 'stale',\n 'archived',\n 'rejected',\n]);\n\nconst MEMORY_SENSITIVITIES = new Set<MemorySensitivity>([\n 'normal',\n 'personal',\n 'secret',\n 'regulated',\n]);\n\nconst MEMORY_TRACE_FEEDBACK_OUTCOMES = new Set([\n 'helpful',\n 'not_helpful',\n 'mixed',\n 'irrelevant',\n]);\n\nconst KNOWLEDGE_SYNTHESIS_STATUSES = new Set<KnowledgeSynthesisStatus>([\n 'pending', 'processing', 'completed', 'failed', 'ignored',\n]);\n\nfunction parseLimit(raw: string | undefined, fallback = 100): number {\n const parsed = raw ? Number.parseInt(raw, 10) : fallback;\n return Number.isFinite(parsed) ? Math.max(1, Math.min(500, parsed)) : fallback;\n}\n\nfunction parseFeedbackSummaryLimit(raw: string | undefined): number {\n const parsed = raw ? Number.parseInt(raw, 10) : 1000;\n return Number.isFinite(parsed) ? Math.max(1, Math.min(5000, parsed)) : 1000;\n}\n\nfunction parseWindowDays(raw: string | undefined): number {\n const parsed = raw ? Number.parseInt(raw, 10) : 30;\n return Number.isFinite(parsed) ? Math.max(1, Math.min(365, parsed)) : 30;\n}\n\nfunction parseKind(raw: unknown): MemoryKind | undefined {\n return typeof raw === 'string' && MEMORY_KINDS.has(raw as MemoryKind)\n ? (raw as MemoryKind)\n : undefined;\n}\n\nfunction parseStatus(raw: unknown): MemoryStatus | undefined {\n return typeof raw === 'string' && MEMORY_STATUSES.has(raw as MemoryStatus)\n ? (raw as MemoryStatus)\n : undefined;\n}\n\nfunction parseSensitivity(raw: unknown): MemorySensitivity | undefined {\n return typeof raw === 'string' && MEMORY_SENSITIVITIES.has(raw as MemorySensitivity)\n ? (raw as MemorySensitivity)\n : undefined;\n}\n\nfunction parseEnum<T extends string>(raw: unknown, allowed: Set<T>): T | undefined {\n return typeof raw === 'string' && allowed.has(raw as T) ? raw as T : undefined;\n}\n\nfunction personalContextForTrace(trace: { selectedRecordIds: string[] } | null | undefined) {\n return (trace?.selectedRecordIds ?? [])\n .map((recordId) => getMemoryRecord(recordId))\n .filter((record): record is NonNullable<typeof record> => Boolean(record) && isUserContextRecord(record))\n .filter((record) => record.sensitivity !== 'secret' && record.sensitivity !== 'regulated')\n .filter((record) => record.disclosurePolicy !== 'silent')\n .map(projectUserContextRecord)\n .map(({ id, statement, facet, origin, sourceName }) => ({ id, statement, facet, origin, sourceName }));\n}\n\nexport function registerMemoryRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n authenticated.get('/api/memory/providers', async (c) => {\n const cfg = deps.service.currentConfig as Config;\n const plugins = await discoverMemoryPlugins(cfg);\n return c.json({\n providers: [\n {\n id: 'local',\n displayName: 'Local Knowledge Store',\n available: true,\n configured: true,\n capabilities: {\n search: true,\n read: true,\n write: true,\n update: true,\n delete: true,\n keywordSearch: true,\n semanticSearch: false,\n hybridSearch: false,\n citations: true,\n sync: false,\n local: true,\n },\n },\n ...plugins.map((plugin) => ({\n id: plugin.manifest?.id ?? plugin.name,\n displayName: plugin.manifest?.displayName ?? plugin.name,\n available: plugin.available,\n configured: false,\n capabilities: plugin.manifest?.capabilities ?? {},\n })),\n ],\n });\n });\n\n authenticated.get('/api/memory/config', (c) => {\n const cfg = deps.service.currentConfig as Config;\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(cfg);\n const manifest = resolveEffectiveAgentManifestForAgent(cfg, agentId);\n return c.json({ agentId: manifest.id, memory: manifest.memory });\n });\n\n authenticated.patch('/api/memory/config', deps.strictRateLimitMiddleware, async (c) => {\n const cfg = deps.service.currentConfig as Config;\n const body = await c.req.json().catch(() => ({}));\n const agentId = typeof body.agentId === 'string' && body.agentId.trim()\n ? body.agentId.trim()\n : resolveDefaultAgentId(cfg);\n const parsed = MemoryPolicySchema.safeParse(body.memory);\n if (!parsed.success) {\n return c.json({ error: `memory ${parsed.error.issues[0]?.message ?? 'is invalid'}` }, 400);\n }\n const prep = prepareUpdateAgent(cfg, agentId, { memory: parsed.data });\n if (prep.ok === false) {\n return c.json({ error: prep.error }, prep.status ?? 400);\n }\n const save = await deps.service.saveConfig(prep.data.nextConfig);\n if (!save.saved) return c.json({ error: save.error ?? 'save failed' }, 500);\n const manifest = resolveEffectiveAgentManifestForAgent(deps.service.currentConfig as Config, agentId);\n return c.json({ agentId: manifest.id, memory: manifest.memory });\n });\n\n authenticated.get('/api/memory/records', (c) => {\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(deps.service.currentConfig as Config);\n const records = listMemoryRecords({\n providerId: c.req.query('providerId') || undefined,\n agentId,\n workspaceId: c.req.query('workspaceId') || undefined,\n projectId: c.req.query('projectId') || undefined,\n kind: parseKind(c.req.query('kind')),\n status: parseStatus(c.req.query('status')),\n limit: parseLimit(c.req.query('limit')),\n offset: c.req.query('offset') ? Number.parseInt(c.req.query('offset')!, 10) : 0,\n });\n return c.json({ records });\n });\n\n authenticated.post('/api/memory/search', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const query = typeof body.query === 'string' ? body.query.trim() : '';\n if (!query) {\n return c.json({ error: 'Missing required field: query' }, 400);\n }\n const agentId = typeof body.agentId === 'string' && body.agentId.trim()\n ? body.agentId.trim()\n : resolveDefaultAgentId(deps.service.currentConfig as Config);\n const records = searchMemoryRecords({\n query,\n providerId: typeof body.providerId === 'string' ? body.providerId : undefined,\n agentId,\n workspaceId: typeof body.workspaceId === 'string' ? body.workspaceId : undefined,\n projectId: typeof body.projectId === 'string' ? body.projectId : undefined,\n kinds: Array.isArray(body.kinds)\n ? body.kinds.map(parseKind).filter((v): v is MemoryKind => Boolean(v))\n : undefined,\n statuses: Array.isArray(body.statuses)\n ? body.statuses.map(parseStatus).filter((v): v is MemoryStatus => Boolean(v))\n : undefined,\n maxResults: typeof body.maxResults === 'number' ? body.maxResults : undefined,\n minScore: typeof body.minScore === 'number' ? body.minScore : undefined,\n });\n return c.json({ results: records });\n });\n\n authenticated.post('/api/memory/records', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const kind = parseKind(body.kind);\n const content = typeof body.content === 'string' ? body.content.trim() : '';\n const agentId = typeof body.agentId === 'string' && body.agentId.trim()\n ? body.agentId.trim()\n : resolveDefaultAgentId(deps.service.currentConfig as Config);\n if (!kind || !content) {\n return c.json({ error: 'Missing required fields: kind, content' }, 400);\n }\n const record = upsertMemoryRecord({\n id: typeof body.id === 'string' && body.id.trim() ? body.id.trim() : undefined,\n providerId: typeof body.providerId === 'string' && body.providerId.trim() ? body.providerId.trim() : 'local',\n kind,\n agentId,\n workspaceId: typeof body.workspaceId === 'string' ? body.workspaceId : deps.service.currentWorkspacePath,\n sessionKey: typeof body.sessionKey === 'string' ? body.sessionKey : undefined,\n projectId: typeof body.projectId === 'string' ? body.projectId : undefined,\n content,\n source: body.source && typeof body.source === 'object' ? body.source : undefined,\n confidence: typeof body.confidence === 'number' ? body.confidence : undefined,\n tags: Array.isArray(body.tags) ? body.tags.filter((tag): tag is string => typeof tag === 'string') : undefined,\n status: parseStatus(body.status),\n sensitivity: parseSensitivity(body.sensitivity),\n canonicalKey: typeof body.canonicalKey === 'string' ? body.canonicalKey : undefined,\n explicitness: parseEnum(body.explicitness, MEMORY_EXPLICITNESS),\n durability: parseEnum(body.durability, MEMORY_DURABILITY),\n importance: typeof body.importance === 'number' ? body.importance : undefined,\n disclosurePolicy: parseEnum(body.disclosurePolicy, MEMORY_DISCLOSURE_POLICIES),\n evidence: Array.isArray(body.evidence)\n ? body.evidence.filter((item: unknown): item is NonNullable<Parameters<typeof upsertMemoryRecord>[0]['evidence']>[number] =>\n Boolean(item) && typeof item === 'object',\n )\n : undefined,\n reviewAfter: typeof body.reviewAfter === 'string' ? body.reviewAfter : undefined,\n expiresAt: typeof body.expiresAt === 'string' ? body.expiresAt : undefined,\n validFrom: typeof body.validFrom === 'string' ? body.validFrom : undefined,\n validTo: typeof body.validTo === 'string' ? body.validTo : undefined,\n supersedesRecordId: typeof body.supersedesRecordId === 'string' ? body.supersedesRecordId : undefined,\n conflictGroupId: typeof body.conflictGroupId === 'string' ? body.conflictGroupId : undefined,\n });\n return c.json({ record }, 201);\n });\n\n authenticated.patch('/api/memory/records/:id', async (c) => {\n const existing = getMemoryRecord(c.req.param('id'));\n if (!existing) return c.json({ error: 'Memory record not found' }, 404);\n const selectedAgentId = c.req.query('agentId') || resolveDefaultAgentId(deps.service.currentConfig as Config);\n if (existing.scope.agentId !== selectedAgentId) {\n return c.json({ error: 'Memory record not found for selected agent' }, 404);\n }\n const body = await c.req.json().catch(() => ({}));\n const record = upsertMemoryRecord({\n id: existing.id,\n providerId: existing.source.provider ?? 'local',\n kind: parseKind(body.kind) ?? existing.kind,\n agentId: existing.scope.agentId,\n workspaceId: existing.scope.workspaceId,\n sessionKey: existing.scope.sessionKey,\n projectId: typeof body.projectId === 'string' ? body.projectId : existing.scope.projectId,\n content: typeof body.content === 'string' ? body.content : existing.content,\n source: body.source && typeof body.source === 'object' ? body.source : existing.source,\n confidence: typeof body.confidence === 'number' ? body.confidence : existing.confidence,\n tags: Array.isArray(body.tags) ? body.tags.filter((tag): tag is string => typeof tag === 'string') : existing.tags,\n status: parseStatus(body.status) ?? existing.status,\n sensitivity: parseSensitivity(body.sensitivity) ?? existing.sensitivity,\n canonicalKey: typeof body.canonicalKey === 'string' ? body.canonicalKey : existing.canonicalKey,\n explicitness: parseEnum(body.explicitness, MEMORY_EXPLICITNESS) ?? existing.explicitness,\n durability: parseEnum(body.durability, MEMORY_DURABILITY) ?? existing.durability,\n importance: typeof body.importance === 'number' ? body.importance : existing.importance,\n disclosurePolicy: parseEnum(body.disclosurePolicy, MEMORY_DISCLOSURE_POLICIES) ?? existing.disclosurePolicy,\n evidence: Array.isArray(body.evidence)\n ? body.evidence.filter((item: unknown): item is NonNullable<Parameters<typeof upsertMemoryRecord>[0]['evidence']>[number] =>\n Boolean(item) && typeof item === 'object',\n )\n : existing.evidence,\n reviewAfter: typeof body.reviewAfter === 'string' ? body.reviewAfter : existing.reviewAfter,\n expiresAt: typeof body.expiresAt === 'string' ? body.expiresAt : existing.expiresAt,\n validFrom: typeof body.validFrom === 'string' ? body.validFrom : existing.validFrom,\n validTo: typeof body.validTo === 'string' ? body.validTo : existing.validTo,\n supersedesRecordId: typeof body.supersedesRecordId === 'string' ? body.supersedesRecordId : existing.supersedesRecordId,\n conflictGroupId: typeof body.conflictGroupId === 'string' ? body.conflictGroupId : existing.conflictGroupId,\n });\n return c.json({ record });\n });\n\n authenticated.delete('/api/memory/records/:id', (c) => {\n const existing = getMemoryRecord(c.req.param('id'));\n const selectedAgentId = c.req.query('agentId') || resolveDefaultAgentId(deps.service.currentConfig as Config);\n if (!existing || existing.scope.agentId !== selectedAgentId) {\n return c.json({ error: 'Memory record not found for selected agent' }, 404);\n }\n const deleted = deleteMemoryRecord(c.req.param('id'));\n if (!deleted) return c.json({ error: 'Memory record not found' }, 404);\n return c.json({ ok: true });\n });\n\n authenticated.get('/api/memory/signals', (c) => {\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(deps.service.currentConfig as Config);\n const signals = listMemorySignals({\n recordId: c.req.query('recordId') || undefined,\n providerId: c.req.query('providerId') || undefined,\n agentId,\n workspaceId: c.req.query('workspaceId') || undefined,\n limit: parseLimit(c.req.query('limit')),\n });\n return c.json({ signals });\n });\n\n authenticated.get('/api/knowledge/source-items', (c) => {\n const sourceItems = listKnowledgeSourceItems({\n sourceInstanceId: c.req.query('sourceInstanceId') || undefined,\n synthesisStatus: parseEnum(c.req.query('synthesisStatus'), KNOWLEDGE_SYNTHESIS_STATUSES),\n includeDeleted: c.req.query('includeDeleted') === 'true',\n limit: parseLimit(c.req.query('limit')),\n offset: c.req.query('offset') ? Number.parseInt(c.req.query('offset')!, 10) : 0,\n });\n return c.json({ sourceItems });\n });\n\n authenticated.get('/api/knowledge/source-changes', (c) => {\n const afterSequenceQuery = c.req.query('afterSequence');\n const afterSequence = afterSequenceQuery ? Number.parseInt(afterSequenceQuery, 10) : undefined;\n const sourceChanges = listKnowledgeSourceChanges({\n sourceInstanceId: c.req.query('sourceInstanceId') || undefined,\n afterSequence: Number.isFinite(afterSequence) ? afterSequence : undefined,\n limit: parseLimit(c.req.query('limit')),\n });\n return c.json({ sourceChanges });\n });\n\n authenticated.get('/api/knowledge/sync-runs', (c) => {\n const syncRuns = listKnowledgeSyncRuns({\n sourceInstanceId: c.req.query('sourceInstanceId') || undefined,\n limit: parseLimit(c.req.query('limit')),\n });\n return c.json({ syncRuns });\n });\n\n authenticated.get('/api/memory/traces', (c) => {\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(deps.service.currentConfig as Config);\n const traces = listMemoryTraceEvents({\n providerId: c.req.query('providerId') || undefined,\n agentId,\n sessionKey: c.req.query('sessionKey') || undefined,\n phase: c.req.query('phase') || undefined,\n limit: parseLimit(c.req.query('limit')),\n });\n return c.json({ traces });\n });\n\n authenticated.patch('/api/memory/traces/:traceId/feedback', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const outcome = typeof body.outcome === 'string' && MEMORY_TRACE_FEEDBACK_OUTCOMES.has(body.outcome)\n ? body.outcome\n : undefined;\n if (!outcome) {\n return c.json({ error: 'Missing or invalid required field: outcome' }, 400);\n }\n const source = body.source === 'user' || body.source === 'evaluator' || body.source === 'system'\n ? body.source\n : undefined;\n const trace = setMemoryTraceFeedback({\n traceId: c.req.param('traceId'),\n feedback: {\n outcome,\n ...(typeof body.score === 'number' ? { score: body.score } : {}),\n ...(typeof body.reason === 'string' ? { reason: body.reason } : {}),\n ...(source ? { source } : {}),\n },\n });\n if (!trace) return c.json({ error: 'Memory trace not found' }, 404);\n return c.json({ trace });\n });\n\n authenticated.get('/api/memory/feedback-summary', (c) => {\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(deps.service.currentConfig as Config);\n const summaries = summarizeMemoryRecallFeedback({\n recordId: c.req.query('recordId') || undefined,\n providerId: c.req.query('providerId') || undefined,\n agentId,\n sessionKey: c.req.query('sessionKey') || undefined,\n limit: parseFeedbackSummaryLimit(c.req.query('limit')),\n });\n return c.json({ summaries });\n });\n\n authenticated.get('/api/memory/understanding/quality', (c) => {\n const cfg = deps.service.currentConfig as Config;\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(cfg);\n const manifest = resolveEffectiveAgentManifestForAgent(cfg, agentId);\n const metrics = summarizeUserUnderstandingQuality({\n agentId: manifest.id,\n windowDays: parseWindowDays(c.req.query('windowDays')),\n });\n const baseIntervalTurns = manifest.memory.understanding?.reviewIntervalTurns ?? 10;\n const cadence = resolveAdaptiveUnderstandingCadence(\n baseIntervalTurns,\n metrics,\n manifest.memory.understanding?.adaptiveCadence ?? true,\n );\n return c.json({ metrics, cadence });\n });\n\n authenticated.patch(\n '/api/memory/understanding/response-feedback',\n deps.strictRateLimitMiddleware,\n async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const sessionKey = typeof body.sessionKey === 'string' ? body.sessionKey.trim() : '';\n const assistantTimestamp = typeof body.assistantTimestamp === 'number'\n ? body.assistantTimestamp\n : Number.NaN;\n const outcome = body.outcome === 'helpful' || body.outcome === 'not_helpful'\n ? body.outcome\n : undefined;\n const reason = typeof body.reason === 'string'\n ? body.reason.trim().slice(0, 160)\n : '';\n if (!sessionKey || !Number.isFinite(assistantTimestamp) || assistantTimestamp <= 0 || !outcome) {\n return c.json({ error: 'sessionKey, assistantTimestamp, and a valid outcome are required' }, 400);\n }\n const trace = setLatestMemoryInjectFeedback({\n sessionKey,\n beforeMs: assistantTimestamp,\n feedback: {\n outcome,\n source: 'user',\n reason: reason || 'assistant_response_feedback',\n },\n });\n return c.json({\n matched: Boolean(trace),\n attributedRecordCount: trace?.selectedRecordIds.length ?? 0,\n personalContext: personalContextForTrace(trace),\n feedback: trace?.feedback ?? null,\n remediation: trace?.remediation ?? null,\n });\n },\n );\n\n authenticated.get('/api/memory/understanding/response-feedback', (c) => {\n const sessionKey = c.req.query('sessionKey')?.trim() ?? '';\n const assistantTimestamp = Number(c.req.query('assistantTimestamp'));\n if (!sessionKey || !Number.isFinite(assistantTimestamp) || assistantTimestamp <= 0) {\n return c.json({ error: 'sessionKey and assistantTimestamp are required' }, 400);\n }\n const trace = findLatestMemoryInjectTrace({\n sessionKey,\n beforeMs: assistantTimestamp,\n });\n return c.json({\n matched: Boolean(trace),\n attributedRecordCount: trace?.selectedRecordIds.length ?? 0,\n personalContext: personalContextForTrace(trace),\n feedback: trace?.feedback ?? null,\n });\n });\n\n authenticated.post('/api/memory/signals', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const source = typeof body.source === 'string' ? body.source : '';\n if (!source) return c.json({ error: 'Missing required field: source' }, 400);\n const signalId = appendMemorySignal({\n providerId: typeof body.providerId === 'string' ? body.providerId : undefined,\n agentId: typeof body.agentId === 'string' ? body.agentId : undefined,\n workspaceId: typeof body.workspaceId === 'string' ? body.workspaceId : undefined,\n sessionKey: typeof body.sessionKey === 'string' ? body.sessionKey : undefined,\n signal: {\n source: source as never,\n recordId: typeof body.recordId === 'string' ? body.recordId : undefined,\n score: typeof body.score === 'number' ? body.score : undefined,\n content: typeof body.content === 'string' ? body.content : undefined,\n metadata: body.metadata && typeof body.metadata === 'object' ? body.metadata : undefined,\n },\n });\n return c.json({ signalId }, 201);\n });\n\n authenticated.post('/api/memory/providers/:id/test', deps.strictRateLimitMiddleware, async (c) => {\n const providerId = c.req.param('id');\n const cfg = deps.service.currentConfig as Config;\n const workspace = deps.service.currentWorkspacePath;\n const store = new BuiltinMemoryStore(resolveBuiltinMemoryStoreConfig(workspace, cfg));\n const manager = createMemoryManagerFromConfig(workspace, store, cfg);\n await manager.initializeAll(`memory-provider-test-${Date.now()}`, { workspace, agentId: resolveDefaultAgentId(cfg) });\n const provider = manager.providersList.find((p) => p.id === providerId);\n if (!provider) return c.json({ providerId, available: false, checks: [{ name: 'load', ok: false, message: 'Provider not loaded' }] }, 404);\n\n const token = `xopc-memory-smoke-${Date.now()}`;\n const checks: Array<{ name: string; ok: boolean; message?: string; resultCount?: number }> = [\n { name: 'load', ok: true },\n { name: 'available', ok: provider.isAvailable() },\n ];\n const started = Date.now();\n try {\n const write = await manager.write({\n kind: 'workspace_fact',\n content: `Smoke test record for ${providerId}: ${token}`,\n scope: { agentId: resolveDefaultAgentId(cfg) },\n tags: ['xopc-smoke-test'],\n });\n checks.push({ name: 'write', ok: write.success, message: write.error ?? write.message });\n const results = await manager.search({ query: token, scope: { agentId: resolveDefaultAgentId(cfg) }, maxResults: 10 });\n const ownResults = results.filter((result) => result.citation.providerId === providerId);\n checks.push({ name: 'search', ok: ownResults.length > 0, resultCount: ownResults.length });\n const recordId = ownResults[0]?.record.id ?? write.record?.id;\n if (recordId) {\n const read = await manager.read({ id: recordId, scope: { agentId: resolveDefaultAgentId(cfg) } });\n checks.push({ name: 'read', ok: Boolean(read), message: read ? undefined : 'Record was not readable' });\n } else {\n checks.push({ name: 'read', ok: false, message: 'No record id available' });\n }\n manager.recordSignal({ source: 'search_recall', content: `Smoke signal for ${providerId}: ${token}` });\n checks.push({ name: 'sync', ok: true });\n } catch (err) {\n checks.push({ name: 'error', ok: false, message: err instanceof Error ? err.message : String(err) });\n } finally {\n appendMemoryTraceEvent({\n phase: 'test',\n providerId,\n request: { token },\n resultCount: checks.filter((check) => check.ok).length,\n error: checks.some((check) => !check.ok) ? 'one or more checks failed' : undefined,\n durationMs: Date.now() - started,\n });\n await manager.shutdownAll();\n }\n return c.json({ providerId, available: provider.isAvailable(), checks });\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"memory.js","names":[],"sources":["../../../../../src/gateway/hono/routes/memory.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { BuiltinMemoryStore } from '../../../agent/memory/builtin-memory-store.js';\nimport { createMemoryManagerFromConfig } from '../../../agent/memory/create-memory-manager.js';\nimport { resolveBuiltinMemoryStoreConfig } from '../../../agent/memory/memory-config.js';\nimport { discoverMemoryPlugins } from '../../../agent/memory/plugin-discovery.js';\nimport { resolveAdaptiveUnderstandingCadence } from '../../../agent/memory/understanding/quality.js';\nimport type {\n MemoryDisclosurePolicy,\n MemoryDurability,\n MemoryExplicitness,\n MemoryKind,\n MemorySensitivity,\n MemoryStatus,\n} from '../../../agent/memory/types.js';\nimport { resolveDefaultAgentId } from '../../../agent/agent-scope.js';\nimport type { Config } from '../../../config/schema.js';\nimport { UserContextConfigSchema } from '../../../user-context/config.js';\nimport { LOCAL_USER_ID } from '../../../user-context/owner.js';\nimport type { KnowledgeSynthesisStatus } from '../../../knowledge/types.js';\nimport {\n appendMemorySignal,\n appendMemoryTraceEvent,\n deleteMemoryRecord,\n findLatestMemoryInjectTrace,\n getMemoryRecord,\n listKnowledgeSourceChanges,\n listKnowledgeSourceItems,\n listKnowledgeSyncRuns,\n listMemoryRecords,\n listMemorySignals,\n listMemoryTraceEvents,\n searchMemoryRecords,\n setMemoryTraceFeedback,\n setLatestMemoryInjectFeedback,\n summarizeMemoryRecallFeedback,\n summarizeUserUnderstandingQuality,\n upsertMemoryRecord,\n} from '../../../storage/sqlite/index.js';\nimport { isUserContextRecord, projectUserContextRecord } from '../../../user-context/projection.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nconst MEMORY_KINDS = new Set<MemoryKind>([\n 'user_profile',\n 'preference',\n 'boundary',\n 'relationship',\n 'project_context',\n 'commitment',\n 'routine',\n 'personal_logistics',\n 'open_question',\n 'milestone',\n 'current_state',\n 'curated_note',\n 'workspace_fact',\n 'daily_note',\n 'session_summary',\n 'derived_insight',\n 'task_lesson',\n 'tool_preference',\n 'long_term_goal',\n]);\n\nconst MEMORY_EXPLICITNESS = new Set<MemoryExplicitness>(['explicit', 'observed', 'inferred']);\nconst MEMORY_DURABILITY = new Set<MemoryDurability>(['ephemeral', 'durable', 'recurring']);\nconst MEMORY_DISCLOSURE_POLICIES = new Set<MemoryDisclosurePolicy>([\n 'silent', 'referenceable', 'ask_before_reference',\n]);\n\nconst MEMORY_STATUSES = new Set<MemoryStatus>([\n 'candidate',\n 'active',\n 'needs_review',\n 'stale',\n 'archived',\n 'rejected',\n]);\n\nconst MEMORY_SENSITIVITIES = new Set<MemorySensitivity>([\n 'normal',\n 'personal',\n 'secret',\n 'regulated',\n]);\n\nconst MEMORY_TRACE_FEEDBACK_OUTCOMES = new Set([\n 'helpful',\n 'not_helpful',\n 'mixed',\n 'irrelevant',\n]);\n\nconst KNOWLEDGE_SYNTHESIS_STATUSES = new Set<KnowledgeSynthesisStatus>([\n 'pending', 'processing', 'completed', 'failed', 'ignored',\n]);\n\nfunction parseLimit(raw: string | undefined, fallback = 100): number {\n const parsed = raw ? Number.parseInt(raw, 10) : fallback;\n return Number.isFinite(parsed) ? Math.max(1, Math.min(500, parsed)) : fallback;\n}\n\nfunction parseFeedbackSummaryLimit(raw: string | undefined): number {\n const parsed = raw ? Number.parseInt(raw, 10) : 1000;\n return Number.isFinite(parsed) ? Math.max(1, Math.min(5000, parsed)) : 1000;\n}\n\nfunction parseWindowDays(raw: string | undefined): number {\n const parsed = raw ? Number.parseInt(raw, 10) : 30;\n return Number.isFinite(parsed) ? Math.max(1, Math.min(365, parsed)) : 30;\n}\n\nfunction parseKind(raw: unknown): MemoryKind | undefined {\n return typeof raw === 'string' && MEMORY_KINDS.has(raw as MemoryKind)\n ? (raw as MemoryKind)\n : undefined;\n}\n\nfunction parseStatus(raw: unknown): MemoryStatus | undefined {\n return typeof raw === 'string' && MEMORY_STATUSES.has(raw as MemoryStatus)\n ? (raw as MemoryStatus)\n : undefined;\n}\n\nfunction parseSensitivity(raw: unknown): MemorySensitivity | undefined {\n return typeof raw === 'string' && MEMORY_SENSITIVITIES.has(raw as MemorySensitivity)\n ? (raw as MemorySensitivity)\n : undefined;\n}\n\nfunction parseEnum<T extends string>(raw: unknown, allowed: Set<T>): T | undefined {\n return typeof raw === 'string' && allowed.has(raw as T) ? raw as T : undefined;\n}\n\nfunction personalContextForTrace(trace: { selectedRecordIds: string[] } | null | undefined) {\n return (trace?.selectedRecordIds ?? [])\n .map((recordId) => getMemoryRecord(recordId))\n .filter((record): record is NonNullable<typeof record> => Boolean(record) && isUserContextRecord(record))\n .filter((record) => record.sensitivity !== 'secret' && record.sensitivity !== 'regulated')\n .filter((record) => record.disclosurePolicy !== 'silent')\n .map(projectUserContextRecord)\n .map(({ id, statement, facet, origin, sourceName }) => ({ id, statement, facet, origin, sourceName }));\n}\n\nexport function registerMemoryRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n authenticated.get('/api/user-context/providers', async (c) => {\n const cfg = deps.service.currentConfig as Config;\n const plugins = await discoverMemoryPlugins(cfg);\n return c.json({\n providers: [\n {\n id: 'local',\n displayName: 'Local Knowledge Store',\n available: true,\n configured: true,\n capabilities: {\n search: true,\n read: true,\n write: true,\n update: true,\n delete: true,\n keywordSearch: true,\n semanticSearch: false,\n hybridSearch: false,\n citations: true,\n sync: false,\n local: true,\n },\n },\n ...plugins.map((plugin) => ({\n id: plugin.manifest?.id ?? plugin.name,\n displayName: plugin.manifest?.displayName ?? plugin.name,\n available: plugin.available,\n configured: false,\n capabilities: plugin.manifest?.capabilities ?? {},\n })),\n ],\n });\n });\n\n authenticated.get('/api/user-context/config', (c) => {\n const cfg = deps.service.currentConfig as Config;\n return c.json({ userContext: cfg.userContext });\n });\n\n authenticated.put('/api/user-context/config', deps.strictRateLimitMiddleware, async (c) => {\n const cfg = deps.service.currentConfig as Config;\n const body = await c.req.json().catch(() => ({}));\n const parsed = UserContextConfigSchema.safeParse(body);\n if (!parsed.success) {\n return c.json({ error: `userContext ${parsed.error.issues[0]?.message ?? 'is invalid'}` }, 400);\n }\n const save = await deps.service.saveConfig({ ...cfg, userContext: parsed.data });\n if (!save.saved) return c.json({ error: save.error ?? 'save failed' }, 500);\n return c.json({ userContext: (deps.service.currentConfig as Config).userContext });\n });\n\n authenticated.get('/api/user-context/memories', (c) => {\n if (c.req.query('agentId')) return c.json({ error: 'agentId is not supported' }, 400);\n const records = listMemoryRecords({\n providerId: c.req.query('providerId') || undefined,\n userId: LOCAL_USER_ID,\n workspaceId: c.req.query('workspaceId') || undefined,\n projectId: c.req.query('projectId') || undefined,\n kind: parseKind(c.req.query('kind')),\n status: parseStatus(c.req.query('status')),\n limit: parseLimit(c.req.query('limit')),\n offset: c.req.query('offset') ? Number.parseInt(c.req.query('offset')!, 10) : 0,\n });\n return c.json({ records });\n });\n\n authenticated.post('/api/user-context/memories/search', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const query = typeof body.query === 'string' ? body.query.trim() : '';\n if (!query) {\n return c.json({ error: 'Missing required field: query' }, 400);\n }\n if (Object.hasOwn(body, 'agentId') || Object.hasOwn(body, 'userId')) {\n return c.json({ error: 'agentId and userId are not accepted' }, 400);\n }\n const records = searchMemoryRecords({\n query,\n providerId: typeof body.providerId === 'string' ? body.providerId : undefined,\n userId: LOCAL_USER_ID,\n workspaceId: typeof body.workspaceId === 'string' ? body.workspaceId : undefined,\n projectId: typeof body.projectId === 'string' ? body.projectId : undefined,\n kinds: Array.isArray(body.kinds)\n ? body.kinds.map(parseKind).filter((v): v is MemoryKind => Boolean(v))\n : undefined,\n statuses: Array.isArray(body.statuses)\n ? body.statuses.map(parseStatus).filter((v): v is MemoryStatus => Boolean(v))\n : undefined,\n maxResults: typeof body.maxResults === 'number' ? body.maxResults : undefined,\n minScore: typeof body.minScore === 'number' ? body.minScore : undefined,\n });\n return c.json({ results: records });\n });\n\n authenticated.post('/api/user-context/memories', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const kind = parseKind(body.kind);\n const content = typeof body.content === 'string' ? body.content.trim() : '';\n if (Object.hasOwn(body, 'agentId') || Object.hasOwn(body, 'userId')) {\n return c.json({ error: 'agentId and userId are not accepted' }, 400);\n }\n if (!kind || !content) {\n return c.json({ error: 'Missing required fields: kind, content' }, 400);\n }\n const record = upsertMemoryRecord({\n id: typeof body.id === 'string' && body.id.trim() ? body.id.trim() : undefined,\n providerId: typeof body.providerId === 'string' && body.providerId.trim() ? body.providerId.trim() : 'local',\n kind,\n sourceAgentId: resolveDefaultAgentId(deps.service.currentConfig as Config),\n workspaceId: typeof body.workspaceId === 'string' ? body.workspaceId : deps.service.currentWorkspacePath,\n sessionKey: typeof body.sessionKey === 'string' ? body.sessionKey : undefined,\n projectId: typeof body.projectId === 'string' ? body.projectId : undefined,\n content,\n source: body.source && typeof body.source === 'object' ? body.source : undefined,\n confidence: typeof body.confidence === 'number' ? body.confidence : undefined,\n tags: Array.isArray(body.tags) ? body.tags.filter((tag): tag is string => typeof tag === 'string') : undefined,\n status: parseStatus(body.status),\n sensitivity: parseSensitivity(body.sensitivity),\n canonicalKey: typeof body.canonicalKey === 'string' ? body.canonicalKey : undefined,\n explicitness: parseEnum(body.explicitness, MEMORY_EXPLICITNESS),\n durability: parseEnum(body.durability, MEMORY_DURABILITY),\n importance: typeof body.importance === 'number' ? body.importance : undefined,\n disclosurePolicy: parseEnum(body.disclosurePolicy, MEMORY_DISCLOSURE_POLICIES),\n evidence: Array.isArray(body.evidence)\n ? body.evidence.filter((item: unknown): item is NonNullable<Parameters<typeof upsertMemoryRecord>[0]['evidence']>[number] =>\n Boolean(item) && typeof item === 'object',\n )\n : undefined,\n reviewAfter: typeof body.reviewAfter === 'string' ? body.reviewAfter : undefined,\n expiresAt: typeof body.expiresAt === 'string' ? body.expiresAt : undefined,\n validFrom: typeof body.validFrom === 'string' ? body.validFrom : undefined,\n validTo: typeof body.validTo === 'string' ? body.validTo : undefined,\n supersedesRecordId: typeof body.supersedesRecordId === 'string' ? body.supersedesRecordId : undefined,\n conflictGroupId: typeof body.conflictGroupId === 'string' ? body.conflictGroupId : undefined,\n });\n return c.json({ record }, 201);\n });\n\n authenticated.put('/api/user-context/memories/:id', async (c) => {\n const existing = getMemoryRecord(c.req.param('id'));\n if (!existing) return c.json({ error: 'Memory record not found' }, 404);\n if (c.req.query('agentId')) return c.json({ error: 'agentId is not supported' }, 400);\n const body = await c.req.json().catch(() => ({}));\n const record = upsertMemoryRecord({\n id: existing.id,\n providerId: existing.source.provider ?? 'local',\n kind: parseKind(body.kind) ?? existing.kind,\n sourceAgentId: existing.provenance.sourceAgentId,\n workspaceId: existing.scope.workspaceId,\n sessionKey: existing.scope.sessionKey,\n projectId: typeof body.projectId === 'string' ? body.projectId : existing.scope.projectId,\n content: typeof body.content === 'string' ? body.content : existing.content,\n source: body.source && typeof body.source === 'object' ? body.source : existing.source,\n confidence: typeof body.confidence === 'number' ? body.confidence : existing.confidence,\n tags: Array.isArray(body.tags) ? body.tags.filter((tag): tag is string => typeof tag === 'string') : existing.tags,\n status: parseStatus(body.status) ?? existing.status,\n sensitivity: parseSensitivity(body.sensitivity) ?? existing.sensitivity,\n canonicalKey: typeof body.canonicalKey === 'string' ? body.canonicalKey : existing.canonicalKey,\n explicitness: parseEnum(body.explicitness, MEMORY_EXPLICITNESS) ?? existing.explicitness,\n durability: parseEnum(body.durability, MEMORY_DURABILITY) ?? existing.durability,\n importance: typeof body.importance === 'number' ? body.importance : existing.importance,\n disclosurePolicy: parseEnum(body.disclosurePolicy, MEMORY_DISCLOSURE_POLICIES) ?? existing.disclosurePolicy,\n evidence: Array.isArray(body.evidence)\n ? body.evidence.filter((item: unknown): item is NonNullable<Parameters<typeof upsertMemoryRecord>[0]['evidence']>[number] =>\n Boolean(item) && typeof item === 'object',\n )\n : existing.evidence,\n reviewAfter: typeof body.reviewAfter === 'string' ? body.reviewAfter : existing.reviewAfter,\n expiresAt: typeof body.expiresAt === 'string' ? body.expiresAt : existing.expiresAt,\n validFrom: typeof body.validFrom === 'string' ? body.validFrom : existing.validFrom,\n validTo: typeof body.validTo === 'string' ? body.validTo : existing.validTo,\n supersedesRecordId: typeof body.supersedesRecordId === 'string' ? body.supersedesRecordId : existing.supersedesRecordId,\n conflictGroupId: typeof body.conflictGroupId === 'string' ? body.conflictGroupId : existing.conflictGroupId,\n });\n return c.json({ record });\n });\n\n authenticated.delete('/api/user-context/memories/:id', (c) => {\n const existing = getMemoryRecord(c.req.param('id'));\n if (c.req.query('agentId')) return c.json({ error: 'agentId is not supported' }, 400);\n if (!existing || existing.scope.userId !== LOCAL_USER_ID) return c.json({ error: 'Memory record not found' }, 404);\n const deleted = deleteMemoryRecord(c.req.param('id'));\n if (!deleted) return c.json({ error: 'Memory record not found' }, 404);\n return c.json({ ok: true });\n });\n\n authenticated.get('/api/user-context/signals', (c) => {\n if (c.req.query('agentId')) return c.json({ error: 'agentId is not supported' }, 400);\n const signals = listMemorySignals({\n recordId: c.req.query('recordId') || undefined,\n providerId: c.req.query('providerId') || undefined,\n userId: LOCAL_USER_ID,\n workspaceId: c.req.query('workspaceId') || undefined,\n limit: parseLimit(c.req.query('limit')),\n });\n return c.json({ signals });\n });\n\n authenticated.get('/api/knowledge/source-items', (c) => {\n const sourceItems = listKnowledgeSourceItems({\n sourceInstanceId: c.req.query('sourceInstanceId') || undefined,\n synthesisStatus: parseEnum(c.req.query('synthesisStatus'), KNOWLEDGE_SYNTHESIS_STATUSES),\n includeDeleted: c.req.query('includeDeleted') === 'true',\n limit: parseLimit(c.req.query('limit')),\n offset: c.req.query('offset') ? Number.parseInt(c.req.query('offset')!, 10) : 0,\n });\n return c.json({ sourceItems });\n });\n\n authenticated.get('/api/knowledge/source-changes', (c) => {\n const afterSequenceQuery = c.req.query('afterSequence');\n const afterSequence = afterSequenceQuery ? Number.parseInt(afterSequenceQuery, 10) : undefined;\n const sourceChanges = listKnowledgeSourceChanges({\n sourceInstanceId: c.req.query('sourceInstanceId') || undefined,\n afterSequence: Number.isFinite(afterSequence) ? afterSequence : undefined,\n limit: parseLimit(c.req.query('limit')),\n });\n return c.json({ sourceChanges });\n });\n\n authenticated.get('/api/knowledge/sync-runs', (c) => {\n const syncRuns = listKnowledgeSyncRuns({\n sourceInstanceId: c.req.query('sourceInstanceId') || undefined,\n limit: parseLimit(c.req.query('limit')),\n });\n return c.json({ syncRuns });\n });\n\n authenticated.get('/api/user-context/traces', (c) => {\n const traces = listMemoryTraceEvents({\n providerId: c.req.query('providerId') || undefined,\n sessionKey: c.req.query('sessionKey') || undefined,\n phase: c.req.query('phase') || undefined,\n limit: parseLimit(c.req.query('limit')),\n });\n return c.json({ traces });\n });\n\n authenticated.patch('/api/user-context/traces/:traceId/feedback', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const outcome = typeof body.outcome === 'string' && MEMORY_TRACE_FEEDBACK_OUTCOMES.has(body.outcome)\n ? body.outcome\n : undefined;\n if (!outcome) {\n return c.json({ error: 'Missing or invalid required field: outcome' }, 400);\n }\n const source = body.source === 'user' || body.source === 'evaluator' || body.source === 'system'\n ? body.source\n : undefined;\n const trace = setMemoryTraceFeedback({\n traceId: c.req.param('traceId'),\n feedback: {\n outcome,\n ...(typeof body.score === 'number' ? { score: body.score } : {}),\n ...(typeof body.reason === 'string' ? { reason: body.reason } : {}),\n ...(source ? { source } : {}),\n },\n });\n if (!trace) return c.json({ error: 'Memory trace not found' }, 404);\n return c.json({ trace });\n });\n\n authenticated.get('/api/user-context/feedback-summary', (c) => {\n const summaries = summarizeMemoryRecallFeedback({\n recordId: c.req.query('recordId') || undefined,\n providerId: c.req.query('providerId') || undefined,\n sessionKey: c.req.query('sessionKey') || undefined,\n limit: parseFeedbackSummaryLimit(c.req.query('limit')),\n });\n return c.json({ summaries });\n });\n\n authenticated.get('/api/user-context/quality', (c) => {\n const cfg = deps.service.currentConfig as Config;\n const metrics = summarizeUserUnderstandingQuality({\n windowDays: parseWindowDays(c.req.query('windowDays')),\n });\n const baseIntervalTurns = cfg.userContext.understanding.reviewIntervalTurns;\n const cadence = resolveAdaptiveUnderstandingCadence(\n baseIntervalTurns,\n metrics,\n cfg.userContext.understanding.adaptiveCadence,\n );\n return c.json({ metrics, cadence });\n });\n\n authenticated.patch(\n '/api/user-context/understanding/response-feedback',\n deps.strictRateLimitMiddleware,\n async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const sessionKey = typeof body.sessionKey === 'string' ? body.sessionKey.trim() : '';\n const assistantTimestamp = typeof body.assistantTimestamp === 'number'\n ? body.assistantTimestamp\n : Number.NaN;\n const outcome = body.outcome === 'helpful' || body.outcome === 'not_helpful'\n ? body.outcome\n : undefined;\n const reason = typeof body.reason === 'string'\n ? body.reason.trim().slice(0, 160)\n : '';\n if (!sessionKey || !Number.isFinite(assistantTimestamp) || assistantTimestamp <= 0 || !outcome) {\n return c.json({ error: 'sessionKey, assistantTimestamp, and a valid outcome are required' }, 400);\n }\n const trace = setLatestMemoryInjectFeedback({\n sessionKey,\n beforeMs: assistantTimestamp,\n feedback: {\n outcome,\n source: 'user',\n reason: reason || 'assistant_response_feedback',\n },\n });\n return c.json({\n matched: Boolean(trace),\n attributedRecordCount: trace?.selectedRecordIds.length ?? 0,\n personalContext: personalContextForTrace(trace),\n feedback: trace?.feedback ?? null,\n remediation: trace?.remediation ?? null,\n });\n },\n );\n\n authenticated.get('/api/user-context/understanding/response-feedback', (c) => {\n const sessionKey = c.req.query('sessionKey')?.trim() ?? '';\n const assistantTimestamp = Number(c.req.query('assistantTimestamp'));\n if (!sessionKey || !Number.isFinite(assistantTimestamp) || assistantTimestamp <= 0) {\n return c.json({ error: 'sessionKey and assistantTimestamp are required' }, 400);\n }\n const trace = findLatestMemoryInjectTrace({\n sessionKey,\n beforeMs: assistantTimestamp,\n });\n return c.json({\n matched: Boolean(trace),\n attributedRecordCount: trace?.selectedRecordIds.length ?? 0,\n personalContext: personalContextForTrace(trace),\n feedback: trace?.feedback ?? null,\n });\n });\n\n authenticated.post('/api/user-context/signals', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const source = typeof body.source === 'string' ? body.source : '';\n if (!source) return c.json({ error: 'Missing required field: source' }, 400);\n const signalId = appendMemorySignal({\n providerId: typeof body.providerId === 'string' ? body.providerId : undefined,\n sourceAgentId: resolveDefaultAgentId(deps.service.currentConfig as Config),\n workspaceId: typeof body.workspaceId === 'string' ? body.workspaceId : undefined,\n sessionKey: typeof body.sessionKey === 'string' ? body.sessionKey : undefined,\n signal: {\n source: source as never,\n recordId: typeof body.recordId === 'string' ? body.recordId : undefined,\n score: typeof body.score === 'number' ? body.score : undefined,\n content: typeof body.content === 'string' ? body.content : undefined,\n metadata: body.metadata && typeof body.metadata === 'object' ? body.metadata : undefined,\n },\n });\n return c.json({ signalId }, 201);\n });\n\n authenticated.post('/api/user-context/providers/:id/test', deps.strictRateLimitMiddleware, async (c) => {\n const providerId = c.req.param('id');\n const cfg = deps.service.currentConfig as Config;\n const workspace = deps.service.currentWorkspacePath;\n const store = new BuiltinMemoryStore(resolveBuiltinMemoryStoreConfig(workspace, cfg));\n const manager = createMemoryManagerFromConfig(workspace, store, cfg);\n await manager.initializeAll(`memory-provider-test-${Date.now()}`, { workspace, agentId: resolveDefaultAgentId(cfg) });\n const provider = manager.providersList.find((p) => p.id === providerId);\n if (!provider) return c.json({ providerId, available: false, checks: [{ name: 'load', ok: false, message: 'Provider not loaded' }] }, 404);\n\n const token = `xopc-memory-smoke-${Date.now()}`;\n const checks: Array<{ name: string; ok: boolean; message?: string; resultCount?: number }> = [\n { name: 'load', ok: true },\n { name: 'available', ok: provider.isAvailable() },\n ];\n const started = Date.now();\n try {\n const write = await manager.write({\n kind: 'workspace_fact',\n content: `Smoke test record for ${providerId}: ${token}`,\n scope: { userId: LOCAL_USER_ID },\n tags: ['xopc-smoke-test'],\n });\n checks.push({ name: 'write', ok: write.success, message: write.error ?? write.message });\n const results = await manager.search({ query: token, scope: { userId: LOCAL_USER_ID }, maxResults: 10 });\n const ownResults = results.filter((result) => result.citation.providerId === providerId);\n checks.push({ name: 'search', ok: ownResults.length > 0, resultCount: ownResults.length });\n const recordId = ownResults[0]?.record.id ?? write.record?.id;\n if (recordId) {\n const read = await manager.read({ id: recordId, scope: { userId: LOCAL_USER_ID } });\n checks.push({ name: 'read', ok: Boolean(read), message: read ? undefined : 'Record was not readable' });\n } else {\n checks.push({ name: 'read', ok: false, message: 'No record id available' });\n }\n manager.recordSignal({ source: 'search_recall', content: `Smoke signal for ${providerId}: ${token}` });\n checks.push({ name: 'sync', ok: true });\n } catch (err) {\n checks.push({ name: 'error', ok: false, message: err instanceof Error ? err.message : String(err) });\n } finally {\n appendMemoryTraceEvent({\n phase: 'test',\n providerId,\n request: { token },\n resultCount: checks.filter((check) => check.ok).length,\n error: checks.some((check) => !check.ok) ? 'one or more checks failed' : undefined,\n durationMs: Date.now() - started,\n });\n await manager.shutdownAll();\n }\n return c.json({ providerId, available: provider.isAvailable(), checks });\n });\n}\n"],"mappings":"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"}
|
|
@@ -1231,7 +1231,7 @@ function registerProjectsRoutes(authenticated, deps) {
|
|
|
1231
1231
|
id: projectDigestMemoryRecordId(project.id),
|
|
1232
1232
|
providerId: "local",
|
|
1233
1233
|
kind: "daily_note",
|
|
1234
|
-
|
|
1234
|
+
sourceAgentId: resolveProjectAgentId({
|
|
1235
1235
|
config: service.currentConfig,
|
|
1236
1236
|
projects: service.projects,
|
|
1237
1237
|
projectId: project.id
|
|
@@ -1732,7 +1732,7 @@ function registerProjectsRoutes(authenticated, deps) {
|
|
|
1732
1732
|
const record = upsertMemoryRecord({
|
|
1733
1733
|
providerId: "local",
|
|
1734
1734
|
kind: "session_summary",
|
|
1735
|
-
|
|
1735
|
+
sourceAgentId: session.routing?.agentId ?? "main",
|
|
1736
1736
|
workspaceId: session.cwd,
|
|
1737
1737
|
sessionKey,
|
|
1738
1738
|
projectId,
|