@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planner.js","names":[],"sources":["../../../../../src/agent/memory/context/planner.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\n\nimport { appendMemoryTraceEvent } from '../../../storage/sqlite/index.js';\nimport { createLogger } from '../../../utils/logger.js';\nimport { readAgentMessageContent } from '../agent-message-access.js';\nimport { buildUserContextBlock } from '../context-fence.js';\nimport type { MemoryManager } from '../manager.js';\nimport { resolveMemoryStability } from '../lifecycle.js';\nimport { classifyMemoryContextOrigin } from '../source-origin.js';\nimport type { MemoryRecord, MemorySearchResult } from '../types.js';\nimport type {\n PlannedUserContextItem,\n UserContextPlan,\n UserContextRejectionReason,\n} from './types.js';\n\nconst MAX_CONTEXT_CHARS = 6_000;\nconst MAX_RESULTS = 8;\nconst BASELINE_KINDS = [\n 'boundary',\n 'preference',\n 'tool_preference',\n 'routine',\n 'user_profile',\n 'personal_logistics',\n] as const;\nconst log = createLogger('UserContextPlanner');\n\nfunction sectionFor(record: MemoryRecord): PlannedUserContextItem['section'] {\n if (record.kind === 'boundary') return 'safety';\n if (\n record.kind === 'preference' ||\n record.kind === 'user_profile' ||\n record.kind === 'relationship' ||\n record.kind === 'routine' ||\n record.kind === 'personal_logistics' ||\n record.kind === 'tool_preference'\n ) return 'interaction';\n return 'task';\n}\n\nfunction rejectReason(record: MemoryRecord, now: number): UserContextRejectionReason | undefined {\n if (record.validFrom && Date.parse(record.validFrom) > now) return 'not_yet_valid';\n if (\n (record.validTo && Date.parse(record.validTo) < now) ||\n (record.expiresAt && Date.parse(record.expiresAt) < now)\n ) return 'expired';\n if (record.sensitivity === 'secret' || record.sensitivity === 'regulated') return 'sensitive';\n if (record.disclosurePolicy === 'ask_before_reference') return 'requires_consent';\n if (record.status === 'needs_review' || record.status === 'stale' || resolveMemoryStability(record, now).reviewDue) return 'needs_review';\n return undefined;\n}\n\nfunction scoreResult(result: MemorySearchResult, now: number): number {\n const confidence = result.record.confidence ?? 0.5;\n const explicitness = result.record.explicitness === 'explicit'\n ? 1\n : result.record.explicitness === 'observed' ? 0.65 : 0.4;\n const stability = resolveMemoryStability(result.record, now).score;\n return Math.max(0, Math.min(1,\n result.score * 0.45 + confidence * 0.1 + result.record.importance * 0.2 + explicitness * 0.1 + stability * 0.15,\n ));\n}\n\nfunction citationFor(result: MemorySearchResult, requesterAgentId: string): string {\n const base = result.citation.path ?? `${result.citation.providerId}:${result.citation.recordId}`;\n const ownerPrefix = result.record.scope.agentId !== requesterAgentId\n ? `shared-from-agent:${result.record.scope.agentId} `\n : '';\n if (result.citation.lineStart == null) return `${ownerPrefix}${base}`;\n const end = result.citation.lineEnd && result.citation.lineEnd !== result.citation.lineStart\n ? `-L${result.citation.lineEnd}`\n : '';\n return `${ownerPrefix}${base}#L${result.citation.lineStart}${end}`;\n}\n\nfunction evidenceLabel(item: PlannedUserContextItem): string {\n if (item.origin === 'told_by_user') return 'The user explicitly shared this';\n if (item.origin === 'observed') return 'Observed across prior work';\n if (item.origin === 'connected_source') return 'A connected source provided this';\n return 'An inference that may be wrong';\n}\n\nfunction prependContext(message: AgentMessage, block: string): AgentMessage {\n if (!block) return message;\n const prefix = `${block}\\n\\n`;\n const content = readAgentMessageContent(message);\n if (typeof content === 'string') return { ...message, content: prefix + content } as AgentMessage;\n if (Array.isArray(content) && content.length > 0) {\n const first = content[0] as { type?: string; text?: string };\n if (first.type === 'text' && typeof first.text === 'string') {\n const copy = [...content];\n copy[0] = { type: 'text', text: prefix + first.text };\n return { ...message, content: copy } as AgentMessage;\n }\n return { ...message, content: [{ type: 'text' as const, text: prefix }, ...content] } as AgentMessage;\n }\n return message;\n}\n\nexport class UserContextPlanner {\n async plan(params: {\n memoryManager: MemoryManager;\n agentId: string;\n sessionKey: string;\n query: string;\n userMessage: AgentMessage;\n excludedRecordIds?: string[];\n }): Promise<UserContextPlan> {\n const traceId = randomUUID();\n const query = params.query.trim();\n if (!query) {\n return { traceId, modelMessage: params.userMessage, items: [], rejected: [], estimatedTokens: 0 };\n }\n const started = Date.now();\n const scope = { agentId: params.agentId, sessionKey: params.sessionKey };\n const [taskResults, baselineLists] = await Promise.all([\n params.memoryManager.search({\n query,\n scope,\n maxResults: MAX_RESULTS,\n minScore: 0.15,\n }).catch(() => []),\n Promise.all(BASELINE_KINDS.map((kind) => (\n params.memoryManager.list({ kind, status: 'active', scope }).catch(() => [])\n ))),\n ]);\n const taskIds = new Set(taskResults.map((result) => result.record.id));\n const baselineResults: MemorySearchResult[] = baselineLists\n .flat()\n .filter((record) => !taskIds.has(record.id))\n .filter((record) => record.kind === 'boundary' || record.explicitness === 'explicit' || record.importance >= 0.7)\n .map((record) => ({\n record,\n score: record.kind === 'boundary' ? 0.7 : 0.42,\n snippet: record.content,\n citation: {\n providerId: record.source.provider ?? 'local',\n recordId: record.id,\n path: record.source.path,\n lineStart: record.source.lineStart,\n lineEnd: record.source.lineEnd,\n createdAt: record.createdAt,\n },\n }));\n const results = [...taskResults, ...baselineResults];\n const now = Date.now();\n const excluded = new Set(params.excludedRecordIds ?? []);\n const rejected: UserContextPlan['rejected'] = [];\n const ranked = results\n .filter((result) => !excluded.has(result.record.id))\n .map((result) => ({ result, score: scoreResult(result, now) }))\n .sort((a, b) => b.score - a.score)\n .filter((entry, index, all) => all.findIndex((candidate) => candidate.result.record.id === entry.result.record.id) === index)\n .slice(0, MAX_RESULTS);\n const items: PlannedUserContextItem[] = [];\n let usedChars = 0;\n for (const { result, score } of ranked) {\n const reason = rejectReason(result.record, now) ?? (score < 0.25 ? 'low_score' : undefined);\n if (reason) {\n rejected.push({ recordId: result.record.id, reason });\n continue;\n }\n const content = result.snippet.trim();\n if (usedChars + content.length > MAX_CONTEXT_CHARS) {\n rejected.push({ recordId: result.record.id, reason: 'budget' });\n continue;\n }\n usedChars += content.length;\n items.push({\n recordId: result.record.id,\n content,\n score,\n section: sectionFor(result.record),\n citation: citationFor(result, params.agentId),\n origin: classifyMemoryContextOrigin(result.record),\n stability: resolveMemoryStability(result.record, now).score,\n });\n }\n const sections: string[] = [];\n for (const [section, title] of [['safety', 'Boundaries'], ['task', 'Relevant facts'], ['interaction', 'Interaction preferences']] as const) {\n const sectionItems = items.filter((item) => item.section === section);\n if (sectionItems.length > 0) {\n sections.push(`${title}:\\n${sectionItems.map((item) => `- ${item.content}\\n Evidence: ${evidenceLabel(item)}`).join('\\n')}`);\n }\n }\n const block = buildUserContextBlock(sections.join('\\n\\n'));\n try {\n appendMemoryTraceEvent({\n traceId,\n phase: 'inject',\n providerId: 'user-understanding',\n sessionKey: params.sessionKey,\n request: {\n query,\n rejected,\n contextItems: items.map((item) => ({\n recordId: item.recordId,\n section: item.section,\n origin: item.origin,\n stability: item.stability,\n citation: item.citation,\n })),\n },\n resultCount: items.length,\n selectedRecordIds: items.map((item) => item.recordId),\n durationMs: Date.now() - started,\n });\n } catch (err) {\n log.debug({ err, traceId, sessionKey: params.sessionKey }, 'Context plan trace was not persisted');\n }\n return {\n traceId,\n modelMessage: prependContext(params.userMessage, block),\n items,\n rejected,\n estimatedTokens: Math.ceil(block.length / 4),\n };\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"planner.js","names":[],"sources":["../../../../../src/agent/memory/context/planner.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\n\nimport {\n appendMemoryTraceEvent,\n consumeMemoryReferenceConsent,\n ensureMemoryReferenceConsentRequest,\n hasMemoryReferenceConsent,\n hasUnresolvedMemoryConflict,\n} from '../../../storage/sqlite/index.js';\nimport { createLogger } from '../../../utils/logger.js';\nimport { readAgentMessageContent } from '../agent-message-access.js';\nimport { buildUserContextBlock } from '../context-fence.js';\nimport type { MemoryManager } from '../manager.js';\nimport { resolveMemoryStability } from '../lifecycle.js';\nimport { classifyMemoryContextOrigin } from '../source-origin.js';\nimport type { MemoryRecord, MemorySearchResult } from '../types.js';\nimport type {\n PlannedUserContextItem,\n UserContextPlan,\n UserContextRejectionReason,\n} from './types.js';\n\nconst MAX_CONTEXT_CHARS = 6_000;\nconst MAX_RESULTS = 8;\nconst BASELINE_KINDS = [\n 'boundary',\n 'preference',\n 'tool_preference',\n 'routine',\n 'user_profile',\n 'personal_logistics',\n] as const;\nconst log = createLogger('UserContextPlanner');\n\nfunction sectionFor(record: MemoryRecord): PlannedUserContextItem['section'] {\n if (record.kind === 'boundary') return 'safety';\n if (\n record.kind === 'preference' ||\n record.kind === 'user_profile' ||\n record.kind === 'relationship' ||\n record.kind === 'routine' ||\n record.kind === 'personal_logistics' ||\n record.kind === 'tool_preference'\n ) return 'interaction';\n return 'task';\n}\n\nfunction rejectReason(record: MemoryRecord, now: number, hasReferenceConsent: boolean): UserContextRejectionReason | undefined {\n if (record.tags?.includes('playbook:disabled')) return 'disabled';\n if (record.conflictGroupId && hasUnresolvedMemoryConflict(record.conflictGroupId)) return 'conflict';\n if (record.validFrom && Date.parse(record.validFrom) > now) return 'not_yet_valid';\n if (\n (record.validTo && Date.parse(record.validTo) < now) ||\n (record.expiresAt && Date.parse(record.expiresAt) < now)\n ) return 'expired';\n if (record.sensitivity === 'secret' || record.sensitivity === 'regulated') return 'sensitive';\n if (record.disclosurePolicy === 'ask_before_reference' && !hasReferenceConsent) return 'requires_consent';\n if (record.status === 'needs_review' || record.status === 'stale' || resolveMemoryStability(record, now).reviewDue) return 'needs_review';\n return undefined;\n}\n\nfunction scoreResult(result: MemorySearchResult, now: number): number {\n const confidence = result.record.confidence ?? 0.5;\n const explicitness = result.record.explicitness === 'explicit'\n ? 1\n : result.record.explicitness === 'observed' ? 0.65 : 0.4;\n const stability = resolveMemoryStability(result.record, now).score;\n return Math.max(0, Math.min(1,\n result.score * 0.45 + confidence * 0.1 + result.record.importance * 0.2 + explicitness * 0.1 + stability * 0.15,\n ));\n}\n\nfunction citationFor(result: MemorySearchResult, requesterAgentId: string): string {\n void requesterAgentId;\n const base = result.citation.path ?? `${result.citation.providerId}:${result.citation.recordId}`;\n if (result.citation.lineStart == null) return base;\n const end = result.citation.lineEnd && result.citation.lineEnd !== result.citation.lineStart\n ? `-L${result.citation.lineEnd}`\n : '';\n return `${base}#L${result.citation.lineStart}${end}`;\n}\n\nfunction evidenceLabel(item: PlannedUserContextItem): string {\n if (item.origin === 'told_by_user') return 'The user explicitly shared this';\n if (item.origin === 'observed') return 'Observed across prior work';\n if (item.origin === 'connected_source') return 'A connected source provided this';\n return 'An inference that may be wrong';\n}\n\nfunction prependContext(message: AgentMessage, block: string): AgentMessage {\n if (!block) return message;\n const prefix = `${block}\\n\\n`;\n const content = readAgentMessageContent(message);\n if (typeof content === 'string') return { ...message, content: prefix + content } as AgentMessage;\n if (Array.isArray(content) && content.length > 0) {\n const first = content[0] as { type?: string; text?: string };\n if (first.type === 'text' && typeof first.text === 'string') {\n const copy = [...content];\n copy[0] = { type: 'text', text: prefix + first.text };\n return { ...message, content: copy } as AgentMessage;\n }\n return { ...message, content: [{ type: 'text' as const, text: prefix }, ...content] } as AgentMessage;\n }\n return message;\n}\n\nexport class UserContextPlanner {\n async plan(params: {\n memoryManager: MemoryManager;\n agentId: string;\n sessionKey: string;\n query: string;\n userMessage: AgentMessage;\n excludedRecordIds?: string[];\n }): Promise<UserContextPlan> {\n const traceId = randomUUID();\n const query = params.query.trim();\n if (!query) {\n return { traceId, modelMessage: params.userMessage, items: [], rejected: [], consentRequests: [], estimatedTokens: 0 };\n }\n const started = Date.now();\n const scope = { userId: 'local-owner', sessionKey: params.sessionKey };\n const [taskResults, baselineLists] = await Promise.all([\n params.memoryManager.search({\n query,\n scope,\n maxResults: MAX_RESULTS,\n minScore: 0.15,\n }).catch(() => []),\n Promise.all(BASELINE_KINDS.map((kind) => (\n params.memoryManager.list({ kind, status: 'active', scope }).catch(() => [])\n ))),\n ]);\n const taskIds = new Set(taskResults.map((result) => result.record.id));\n const baselineResults: MemorySearchResult[] = baselineLists\n .flat()\n .filter((record) => !taskIds.has(record.id))\n .filter((record) => record.kind === 'boundary' || record.explicitness === 'explicit' || record.importance >= 0.7)\n .map((record) => ({\n record,\n score: record.kind === 'boundary' ? 0.7 : 0.42,\n snippet: record.content,\n citation: {\n providerId: record.source.provider ?? 'local',\n recordId: record.id,\n path: record.source.path,\n lineStart: record.source.lineStart,\n lineEnd: record.source.lineEnd,\n createdAt: record.createdAt,\n },\n }));\n const results = [...taskResults, ...baselineResults];\n const now = Date.now();\n const excluded = new Set(params.excludedRecordIds ?? []);\n const rejected: UserContextPlan['rejected'] = [];\n const consentRequests: UserContextPlan['consentRequests'] = [];\n const ranked = results\n .filter((result) => !excluded.has(result.record.id))\n .map((result) => ({ result, score: scoreResult(result, now) }))\n .sort((a, b) => b.score - a.score)\n .filter((entry, index, all) => all.findIndex((candidate) => candidate.result.record.id === entry.result.record.id) === index)\n .slice(0, MAX_RESULTS);\n const items: PlannedUserContextItem[] = [];\n let usedChars = 0;\n for (const { result, score } of ranked) {\n const needsConsent = result.record.disclosurePolicy === 'ask_before_reference'\n && result.record.sensitivity !== 'secret'\n && result.record.sensitivity !== 'regulated';\n const hasReferenceConsent = needsConsent\n ? hasMemoryReferenceConsent(result.record.id, params.sessionKey)\n : false;\n const reason = rejectReason(result.record, now, hasReferenceConsent) ?? (score < 0.25 ? 'low_score' : undefined);\n if (reason) {\n rejected.push({ recordId: result.record.id, reason });\n if (reason === 'requires_consent') {\n const request = ensureMemoryReferenceConsentRequest({\n recordId: result.record.id,\n sessionKey: params.sessionKey,\n purpose: query,\n });\n consentRequests.push({ id: request.id, recordId: request.recordId, statement: result.record.content, purpose: request.purpose });\n }\n continue;\n }\n const content = result.snippet.trim();\n if (usedChars + content.length > MAX_CONTEXT_CHARS) {\n rejected.push({ recordId: result.record.id, reason: 'budget' });\n continue;\n }\n if (needsConsent && !consumeMemoryReferenceConsent(result.record.id, params.sessionKey)) {\n rejected.push({ recordId: result.record.id, reason: 'requires_consent' });\n const request = ensureMemoryReferenceConsentRequest({\n recordId: result.record.id,\n sessionKey: params.sessionKey,\n purpose: query,\n });\n consentRequests.push({ id: request.id, recordId: request.recordId, statement: result.record.content, purpose: request.purpose });\n continue;\n }\n usedChars += content.length;\n items.push({\n recordId: result.record.id,\n content,\n score,\n section: sectionFor(result.record),\n citation: citationFor(result, params.agentId),\n origin: classifyMemoryContextOrigin(result.record),\n stability: resolveMemoryStability(result.record, now).score,\n });\n }\n const sections: string[] = [];\n for (const [section, title] of [['safety', 'Boundaries'], ['task', 'Relevant facts'], ['interaction', 'Interaction preferences']] as const) {\n const sectionItems = items.filter((item) => item.section === section);\n if (sectionItems.length > 0) {\n sections.push(`${title}:\\n${sectionItems.map((item) => `- ${item.content}\\n Evidence: ${evidenceLabel(item)}`).join('\\n')}`);\n }\n }\n const consentNotice = consentRequests.length > 0\n ? 'A relevant saved understanding requires the user’s explicit permission before it can be referenced. Do not infer or reveal its contents. Briefly ask the user to approve the pending item in You > Understanding, then continue without it.'\n : '';\n const block = [buildUserContextBlock(sections.join('\\n\\n')), consentNotice].filter(Boolean).join('\\n\\n');\n try {\n appendMemoryTraceEvent({\n traceId,\n phase: 'inject',\n providerId: 'user-understanding',\n sessionKey: params.sessionKey,\n request: {\n query,\n rejected,\n contextItems: items.map((item) => ({\n recordId: item.recordId,\n section: item.section,\n origin: item.origin,\n stability: item.stability,\n citation: item.citation,\n })),\n },\n resultCount: items.length,\n selectedRecordIds: items.map((item) => item.recordId),\n durationMs: Date.now() - started,\n });\n } catch (err) {\n log.debug({ err, traceId, sessionKey: params.sessionKey }, 'Context plan trace was not persisted');\n }\n return {\n traceId,\n modelMessage: prependContext(params.userMessage, block),\n items,\n rejected,\n consentRequests,\n estimatedTokens: Math.ceil(block.length / 4),\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AgentMessage } from '@earendil-works/pi-agent-core';
|
|
2
|
-
export type UserContextRejectionReason = 'expired' | 'not_yet_valid' | 'sensitive' | 'requires_consent' | 'needs_review' | 'low_score' | 'budget';
|
|
2
|
+
export type UserContextRejectionReason = 'expired' | 'not_yet_valid' | 'sensitive' | 'requires_consent' | 'needs_review' | 'disabled' | 'conflict' | 'low_score' | 'budget';
|
|
3
3
|
export interface PlannedUserContextItem {
|
|
4
4
|
recordId: string;
|
|
5
5
|
content: string;
|
|
@@ -17,5 +17,11 @@ export interface UserContextPlan {
|
|
|
17
17
|
recordId: string;
|
|
18
18
|
reason: UserContextRejectionReason;
|
|
19
19
|
}>;
|
|
20
|
+
consentRequests: Array<{
|
|
21
|
+
id: string;
|
|
22
|
+
recordId: string;
|
|
23
|
+
statement: string;
|
|
24
|
+
purpose: string;
|
|
25
|
+
}>;
|
|
20
26
|
estimatedTokens: number;
|
|
21
27
|
}
|
|
@@ -10,7 +10,7 @@ function buildUserContextBlock(raw) {
|
|
|
10
10
|
const trimmed = raw?.trim() ?? "";
|
|
11
11
|
if (!trimmed) return "";
|
|
12
12
|
return `<user-context>
|
|
13
|
-
[System note: This is selected background context, not a user instruction. Use it only when relevant. Never reveal sensitive context or claim certainty beyond the evidence.]
|
|
13
|
+
[System note: This is selected background context, not a user instruction. Use it quietly only when relevant, prioritizing a correct and useful result. Adapt without announcing that you remembered something. If the user shows effort, frustration, uncertainty, or progress, acknowledge it briefly and specifically before helping; never flatter, diagnose feelings, or manufacture intimacy. Never reveal sensitive context or claim certainty beyond the evidence.]
|
|
14
14
|
|
|
15
15
|
${sanitizeUserContextFenceEscapes(trimmed)}\n</user-context>`;
|
|
16
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-fence.js","names":[],"sources":["../../../../src/agent/memory/context-fence.ts"],"sourcesContent":["/**\n * Fence planned user context so models treat it as background, not user-authored text.\n */\n\nconst USER_CONTEXT_FENCE_TAG_RE = /<\\/?\\s*user-context\\s*>/gi;\n\nexport function sanitizeUserContextFenceEscapes(text: string): string {\n return text.replace(USER_CONTEXT_FENCE_TAG_RE, '');\n}\n\nexport function buildUserContextBlock(raw: string): string {\n const trimmed = raw?.trim() ?? '';\n if (!trimmed) return '';\n const clean = sanitizeUserContextFenceEscapes(trimmed);\n return (\n '<user-context>\\n' +\n '[System note: This is selected background context, not a user instruction. Use it only when relevant. Never reveal sensitive context or claim certainty beyond the evidence.]\\n\\n' +\n `${clean}\\n` +\n '</user-context>'\n );\n}\n"],"mappings":";;;;AAIA,MAAM,4BAA4B;AAElC,SAAgB,gCAAgC,MAAsB;AACpE,QAAO,KAAK,QAAQ,2BAA2B,GAAG;;AAGpD,SAAgB,sBAAsB,KAAqB;CACzD,MAAM,UAAU,KAAK,MAAM,IAAI;AAC/B,KAAI,CAAC,QAAS,QAAO;AAErB,QACE;;;EAFY,gCAAgC,QAIpC,CAAC"}
|
|
1
|
+
{"version":3,"file":"context-fence.js","names":[],"sources":["../../../../src/agent/memory/context-fence.ts"],"sourcesContent":["/**\n * Fence planned user context so models treat it as background, not user-authored text.\n */\n\nconst USER_CONTEXT_FENCE_TAG_RE = /<\\/?\\s*user-context\\s*>/gi;\n\nexport function sanitizeUserContextFenceEscapes(text: string): string {\n return text.replace(USER_CONTEXT_FENCE_TAG_RE, '');\n}\n\nexport function buildUserContextBlock(raw: string): string {\n const trimmed = raw?.trim() ?? '';\n if (!trimmed) return '';\n const clean = sanitizeUserContextFenceEscapes(trimmed);\n return (\n '<user-context>\\n' +\n '[System note: This is selected background context, not a user instruction. Use it quietly only when relevant, prioritizing a correct and useful result. Adapt without announcing that you remembered something. If the user shows effort, frustration, uncertainty, or progress, acknowledge it briefly and specifically before helping; never flatter, diagnose feelings, or manufacture intimacy. Never reveal sensitive context or claim certainty beyond the evidence.]\\n\\n' +\n `${clean}\\n` +\n '</user-context>'\n );\n}\n"],"mappings":";;;;AAIA,MAAM,4BAA4B;AAElC,SAAgB,gCAAgC,MAAsB;AACpE,QAAO,KAAK,QAAQ,2BAA2B,GAAG;;AAGpD,SAAgB,sBAAsB,KAAqB;CACzD,MAAM,UAAU,KAAK,MAAM,IAAI;AAC/B,KAAI,CAAC,QAAS,QAAO;AAErB,QACE;;;EAFY,gCAAgC,QAIpC,CAAC"}
|
|
@@ -1,29 +1,22 @@
|
|
|
1
|
-
import { init_agent_scope, resolveAgentIdForWorkspacePath } from "../agent-scope.js";
|
|
2
|
-
import { resolveEffectiveAgentManifestForAgent } from "../../config/agent-profile.js";
|
|
3
1
|
import { isMemorySubsystemEnabled } from "./memory-config.js";
|
|
4
|
-
import { resolveMemoryAccessPolicy } from "./access-policy.js";
|
|
5
2
|
import { BuiltinMemoryProvider } from "./builtin-provider.js";
|
|
6
3
|
import { MemoryManager } from "./manager.js";
|
|
7
4
|
import { loadMemoryPluginProviders } from "./plugin-discovery.js";
|
|
8
5
|
//#region src/agent/memory/create-memory-manager.ts
|
|
9
|
-
init_agent_scope();
|
|
10
6
|
function createMemoryManagerFromConfig(workspaceDir, store, config, agentId) {
|
|
11
7
|
const routing = resolveMemoryManagerOptions(workspaceDir, config, agentId);
|
|
12
|
-
const accessPolicy = config && agentId ? resolveMemoryAccessPolicy(config, agentId) : void 0;
|
|
13
8
|
const enabled = isMemorySubsystemEnabled(config);
|
|
14
9
|
const mgr = new MemoryManager({
|
|
15
10
|
...routing,
|
|
16
|
-
accessPolicy,
|
|
17
11
|
...enabled ? { loadProviders: () => loadMemoryPluginProviders({ config }) } : {}
|
|
18
12
|
});
|
|
19
|
-
mgr.addProvider(new BuiltinMemoryProvider(store
|
|
13
|
+
mgr.addProvider(new BuiltinMemoryProvider(store));
|
|
20
14
|
if (!enabled) return mgr;
|
|
21
15
|
return mgr;
|
|
22
16
|
}
|
|
23
17
|
function resolveMemoryManagerOptions(workspaceDir, config, requestedAgentId) {
|
|
24
18
|
if (!config) return {};
|
|
25
|
-
const providerRouting =
|
|
26
|
-
if (!providerRouting) return {};
|
|
19
|
+
const providerRouting = config.userContext.providerRouting;
|
|
27
20
|
return {
|
|
28
21
|
searchStrategy: providerRouting.searchStrategy,
|
|
29
22
|
writeStrategy: providerRouting.writeStrategy,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-memory-manager.js","names":[],"sources":["../../../../src/agent/memory/create-memory-manager.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport {
|
|
1
|
+
{"version":3,"file":"create-memory-manager.js","names":[],"sources":["../../../../src/agent/memory/create-memory-manager.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { BuiltinMemoryStore } from './builtin-memory-store.js';\nimport { BuiltinMemoryProvider } from './builtin-provider.js';\nimport { isMemorySubsystemEnabled } from './memory-config.js';\nimport { MemoryManager, type MemoryManagerOptions } from './manager.js';\nimport type { MemoryKind } from './types.js';\nimport { loadMemoryPluginProviders } from './plugin-discovery.js';\n\nexport type MemoryProviderId = 'none' | 'stub';\n\nexport function createMemoryManagerFromConfig(\n workspaceDir: string,\n store: BuiltinMemoryStore,\n config: Config | undefined,\n agentId?: string,\n): MemoryManager {\n const routing = resolveMemoryManagerOptions(workspaceDir, config, agentId);\n const enabled = isMemorySubsystemEnabled(config);\n const mgr = new MemoryManager({\n ...routing,\n ...(enabled ? { loadProviders: () => loadMemoryPluginProviders({ config }) } : {}),\n });\n mgr.addProvider(new BuiltinMemoryProvider(store));\n\n if (!enabled) {\n return mgr;\n }\n\n return mgr;\n}\n\nfunction resolveMemoryManagerOptions(\n workspaceDir: string,\n config: Config | undefined,\n requestedAgentId?: string,\n): Omit<MemoryManagerOptions, 'loadProviders'> {\n if (!config) return {};\n void workspaceDir;\n void requestedAgentId;\n const providerRouting = config.userContext.providerRouting;\n return {\n searchStrategy: providerRouting.searchStrategy,\n writeStrategy: providerRouting.writeStrategy,\n writePolicy: {\n allowExternalWrites: providerRouting.allowExternalWrites,\n allowedProviderIds: providerRouting.allowedProviderIds,\n autoWriteKinds: providerRouting.autoWriteKinds as MemoryKind[] | undefined,\n },\n };\n}\n"],"mappings":";;;;;AAUA,SAAgB,8BACd,cACA,OACA,QACA,SACe;CACf,MAAM,UAAU,4BAA4B,cAAc,QAAQ,QAAQ;CAC1E,MAAM,UAAU,yBAAyB,OAAO;CAChD,MAAM,MAAM,IAAI,cAAc;EAC5B,GAAG;EACH,GAAI,UAAU,EAAE,qBAAqB,0BAA0B,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE;EAClF,CAAC;AACF,KAAI,YAAY,IAAI,sBAAsB,MAAM,CAAC;AAEjD,KAAI,CAAC,QACH,QAAO;AAGT,QAAO;;AAGT,SAAS,4BACP,cACA,QACA,kBAC6C;AAC7C,KAAI,CAAC,OAAQ,QAAO,EAAE;CAGtB,MAAM,kBAAkB,OAAO,YAAY;AAC3C,QAAO;EACL,gBAAgB,gBAAgB;EAChC,eAAe,gBAAgB;EAC/B,aAAa;GACX,qBAAqB,gBAAgB;GACrC,oBAAoB,gBAAgB;GACpC,gBAAgB,gBAAgB;GACjC;EACF"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import { buildMemoryRuntime } from "../../../agent-runtime/memory-runtime.js";
|
|
2
|
-
import { init_agent_scope, resolveDefaultAgentId } from "../../agent-scope.js";
|
|
3
|
-
import { resolveEffectiveAgentManifestForAgent } from "../../../config/agent-profile.js";
|
|
4
1
|
import { DEFAULT_DEEP_CRON, DEFAULT_LIGHT_CRON, DEFAULT_REM_CRON } from "./constants.js";
|
|
2
|
+
import { buildMemoryRuntime } from "../../../agent-runtime/memory-runtime.js";
|
|
5
3
|
//#region src/agent/memory/dreaming/config.ts
|
|
6
|
-
init_agent_scope();
|
|
7
4
|
function clampScore(value, fallback) {
|
|
8
5
|
if (!Number.isFinite(value)) return fallback;
|
|
9
6
|
return Math.max(0, Math.min(1, value));
|
|
@@ -28,11 +25,9 @@ function optionalTrimmedString(value) {
|
|
|
28
25
|
}
|
|
29
26
|
/** Resolve the full three-phase dreaming config from an agent manifest. */
|
|
30
27
|
function resolveDreamingConfig(cfg, requestedAgentId) {
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const enabled = dreaming?.enabled === true && manifest?.memory.mode !== "off";
|
|
35
|
-
const promotionWritePolicy = manifest ? buildMemoryRuntime(manifest).checkWrite({
|
|
28
|
+
const dreaming = cfg?.userContext.dreaming;
|
|
29
|
+
const enabled = dreaming?.enabled === true && cfg?.userContext.enabled === true && cfg.userContext.memory.mode !== "off";
|
|
30
|
+
const promotionWritePolicy = cfg ? buildMemoryRuntime(cfg.userContext).checkWrite({
|
|
36
31
|
target: "curated",
|
|
37
32
|
content: "Dreaming automatic memory promotion",
|
|
38
33
|
source: "dreaming",
|
|
@@ -40,7 +35,7 @@ function resolveDreamingConfig(cfg, requestedAgentId) {
|
|
|
40
35
|
sensitive: false
|
|
41
36
|
}) : {
|
|
42
37
|
decision: "deny",
|
|
43
|
-
reason: "
|
|
38
|
+
reason: "user context configuration is unavailable"
|
|
44
39
|
};
|
|
45
40
|
const frequency = trimmedStringOr(dreaming?.frequency, DEFAULT_DEEP_CRON);
|
|
46
41
|
const timezone = optionalTrimmedString(dreaming?.timezone);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","names":[],"sources":["../../../../../src/agent/memory/dreaming/config.ts"],"sourcesContent":["import type { Config } from '../../../config/schema.js';\nimport { buildMemoryRuntime, type MemoryWriteCheckResult } from '../../../agent-runtime/memory-runtime.js';\nimport {
|
|
1
|
+
{"version":3,"file":"config.js","names":[],"sources":["../../../../../src/agent/memory/dreaming/config.ts"],"sourcesContent":["import type { Config } from '../../../config/schema.js';\nimport { buildMemoryRuntime, type MemoryWriteCheckResult } from '../../../agent-runtime/memory-runtime.js';\nimport {\n DEFAULT_DEEP_CRON,\n DEFAULT_LIGHT_CRON,\n DEFAULT_MAX_AGE_DAYS,\n DEFAULT_RECENCY_HALF_LIFE_DAYS,\n DEFAULT_REM_CRON,\n type DreamingPhaseId,\n} from './constants.js';\n\n// ── Phase config types ─────────────────────────────────────────────────\n\nexport type DreamingLightConfig = {\n enabled: boolean;\n cron: string;\n lookbackDays: number;\n limit: number;\n dedupeSimilarity: number;\n};\n\nexport type DreamingDeepConfig = {\n enabled: boolean;\n cron: string;\n minScore: number;\n minRecallCount: number;\n minUniqueQueries: number;\n limit: number;\n recencyHalfLifeDays: number;\n maxAgeDays: number;\n};\n\nexport type DreamingRemConfig = {\n enabled: boolean;\n cron: string;\n lookbackDays: number;\n limit: number;\n minPatternStrength: number;\n};\n\nexport type DreamingResolvedConfig = {\n enabled: boolean;\n promotionWritePolicy: MemoryWriteCheckResult;\n frequency: string;\n timezone?: string;\n phases: {\n light: DreamingLightConfig;\n deep: DreamingDeepConfig;\n rem: DreamingRemConfig;\n };\n deep: DreamingDeepConfig;\n};\n\n// ── Helpers ────────────────────────────────────────────────────────────\n\nfunction clampScore(value: number, fallback: number): number {\n if (!Number.isFinite(value)) return fallback;\n return Math.max(0, Math.min(1, value));\n}\n\nfunction toPositiveInt(value: unknown, fallback: number): number {\n const num = typeof value === 'string' ? Number(value) : Number(value);\n if (!Number.isFinite(num)) return fallback;\n const floored = Math.floor(num);\n return floored > 0 ? floored : fallback;\n}\n\nfunction toNonNegInt(value: unknown, fallback: number): number {\n const num = typeof value === 'string' ? Number(value) : Number(value);\n if (!Number.isFinite(num)) return fallback;\n const floored = Math.floor(num);\n return floored >= 0 ? floored : fallback;\n}\n\nfunction trimmedStringOr(value: unknown, fallback: string): string {\n return typeof value === 'string' && value.trim() ? value.trim() : fallback;\n}\n\nfunction optionalTrimmedString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\n// ── Resolver ───────────────────────────────────────────────────────────\n\n/** Resolve the full three-phase dreaming config from an agent manifest. */\nexport function resolveDreamingConfig(cfg: Config | undefined, requestedAgentId?: string | null): DreamingResolvedConfig {\n void requestedAgentId;\n const dreaming = cfg?.userContext.dreaming;\n const enabled = dreaming?.enabled === true && cfg?.userContext.enabled === true && cfg.userContext.memory.mode !== 'off';\n const promotionWritePolicy = cfg\n ? buildMemoryRuntime(cfg.userContext).checkWrite({\n target: 'curated',\n content: 'Dreaming automatic memory promotion',\n source: 'dreaming',\n confidence: 1,\n sensitive: false,\n })\n : { decision: 'deny' as const, reason: 'user context configuration is unavailable' };\n\n const frequency = trimmedStringOr(dreaming?.frequency, DEFAULT_DEEP_CRON);\n const timezone = optionalTrimmedString(dreaming?.timezone);\n\n // ── Light phase ────────────────────────────────────────────────────\n const lightRaw = dreaming?.phases?.light ?? {};\n const light: DreamingLightConfig = {\n enabled: enabled && lightRaw?.enabled !== false,\n cron: trimmedStringOr(lightRaw?.cron, DEFAULT_LIGHT_CRON),\n lookbackDays: toPositiveInt(lightRaw?.lookbackDays, 2),\n limit: toNonNegInt(lightRaw?.limit, 100),\n dedupeSimilarity: clampScore(Number(lightRaw?.dedupeSimilarity), 0.9),\n };\n\n // ── Deep phase ─────────────────────────────────────────────────────\n const deepRaw = dreaming?.phases?.deep ?? {};\n const deep: DreamingDeepConfig = {\n enabled: enabled && deepRaw?.enabled !== false && promotionWritePolicy.decision === 'allow',\n cron: trimmedStringOr(deepRaw?.cron, frequency),\n minScore: clampScore(Number(deepRaw?.minScore), 0.8),\n minRecallCount: toPositiveInt(deepRaw?.minRecallCount, 3),\n minUniqueQueries: toPositiveInt(deepRaw?.minUniqueQueries, 3),\n limit: toNonNegInt(deepRaw?.limit, 10),\n recencyHalfLifeDays: toPositiveInt(deepRaw?.recencyHalfLifeDays, DEFAULT_RECENCY_HALF_LIFE_DAYS),\n maxAgeDays: toPositiveInt(deepRaw?.maxAgeDays, DEFAULT_MAX_AGE_DAYS),\n };\n\n // ── REM phase ──────────────────────────────────────────────────────\n const remRaw = dreaming?.phases?.rem ?? {};\n const rem: DreamingRemConfig = {\n enabled: enabled && remRaw?.enabled !== false,\n cron: trimmedStringOr(remRaw?.cron, DEFAULT_REM_CRON),\n lookbackDays: toPositiveInt(remRaw?.lookbackDays, 7),\n limit: toNonNegInt(remRaw?.limit, 10),\n minPatternStrength: clampScore(Number(remRaw?.minPatternStrength), 0.75),\n };\n\n return {\n enabled,\n promotionWritePolicy,\n frequency,\n ...(timezone ? { timezone } : {}),\n phases: { light, deep, rem },\n deep,\n };\n}\n\n/** Get the cron expression for a specific phase from resolved config. */\nexport function getPhaseCron(config: DreamingResolvedConfig, phase: DreamingPhaseId): string {\n return config.phases[phase].cron;\n}\n\n/** Check if a specific phase is enabled (global + phase-level). */\nexport function isPhaseEnabled(config: DreamingResolvedConfig, phase: DreamingPhaseId): boolean {\n return config.enabled && config.phases[phase].enabled;\n}\n"],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ function activateDreamingPromotion(input) {
|
|
|
8
8
|
id: `dreaming:${createHash("sha256").update(`${input.agentId}\0${input.candidateKey}`).digest("hex").slice(0, 32)}`,
|
|
9
9
|
providerId: "local",
|
|
10
10
|
kind: "project_context",
|
|
11
|
-
|
|
11
|
+
sourceAgentId: input.agentId,
|
|
12
12
|
workspaceId: input.workspaceId,
|
|
13
13
|
content: input.content,
|
|
14
14
|
source: {
|
|
@@ -49,7 +49,7 @@ function activateRemInsight(input) {
|
|
|
49
49
|
id: `dreaming-rem:${input.agentId}:${patternKey}`,
|
|
50
50
|
providerId: "local",
|
|
51
51
|
kind: "derived_insight",
|
|
52
|
-
|
|
52
|
+
sourceAgentId: input.agentId,
|
|
53
53
|
workspaceId: input.workspaceId,
|
|
54
54
|
content,
|
|
55
55
|
source: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promotion-lifecycle.js","names":[],"sources":["../../../../../src/agent/memory/dreaming/promotion-lifecycle.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\n\nimport { upsertMemoryRecord } from '../../../storage/sqlite/index.js';\nimport type { MemoryRecord, MemorySensitivity } from '../types.js';\n\nexport interface DreamingPromotionInput {\n agentId: string;\n workspaceId: string;\n candidateKey: string;\n content: string;\n sourcePath: string;\n lineStart: number;\n lineEnd: number;\n score: number;\n recallCount: number;\n observedAt: string;\n sensitivity: MemorySensitivity;\n}\n\n/** Persist a promoted Dreaming insight as the authoritative structured record. */\nexport function activateDreamingPromotion(input: DreamingPromotionInput): MemoryRecord {\n const stableId = createHash('sha256')\n .update(`${input.agentId}\\0${input.candidateKey}`)\n .digest('hex')\n .slice(0, 32);\n return upsertMemoryRecord({\n id: `dreaming:${stableId}`,\n providerId: 'local',\n kind: 'project_context',\n
|
|
1
|
+
{"version":3,"file":"promotion-lifecycle.js","names":[],"sources":["../../../../../src/agent/memory/dreaming/promotion-lifecycle.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\n\nimport { upsertMemoryRecord } from '../../../storage/sqlite/index.js';\nimport type { MemoryRecord, MemorySensitivity } from '../types.js';\n\nexport interface DreamingPromotionInput {\n agentId: string;\n workspaceId: string;\n candidateKey: string;\n content: string;\n sourcePath: string;\n lineStart: number;\n lineEnd: number;\n score: number;\n recallCount: number;\n observedAt: string;\n sensitivity: MemorySensitivity;\n}\n\n/** Persist a promoted Dreaming insight as the authoritative structured record. */\nexport function activateDreamingPromotion(input: DreamingPromotionInput): MemoryRecord {\n const stableId = createHash('sha256')\n .update(`${input.agentId}\\0${input.candidateKey}`)\n .digest('hex')\n .slice(0, 32);\n return upsertMemoryRecord({\n id: `dreaming:${stableId}`,\n providerId: 'local',\n kind: 'project_context',\n sourceAgentId: input.agentId,\n workspaceId: input.workspaceId,\n content: input.content,\n source: {\n provider: 'dreaming',\n path: input.sourcePath,\n lineStart: input.lineStart,\n lineEnd: input.lineEnd,\n },\n confidence: input.score,\n status: 'active',\n sensitivity: input.sensitivity,\n canonicalKey: `dreaming:${input.candidateKey}`,\n explicitness: 'observed',\n durability: 'durable',\n importance: input.score,\n disclosurePolicy: 'referenceable',\n evidence: [{\n relation: 'derived_from',\n sourceText: input.content,\n observedAt: input.observedAt,\n confidence: input.score,\n }],\n tags: ['dreaming', 'promoted', `recalls:${input.recallCount}`],\n });\n}\n\nexport interface RemInsightInput {\n agentId: string;\n workspaceId: string;\n memberKeys: string[];\n representative: string;\n distinctPaths: string[];\n strength: number;\n observedAt: string;\n evidence: string[];\n sensitivity: MemorySensitivity;\n}\n\nexport function remPatternKey(memberKeys: string[]): string {\n return createHash('sha256').update([...memberKeys].sort().join('\\0')).digest('hex').slice(0, 24);\n}\n\n/** Persist a REM cluster as a stable, recallable derived insight. */\nexport function activateRemInsight(input: RemInsightInput): MemoryRecord {\n const patternKey = remPatternKey(input.memberKeys);\n const content = `Recurring context across ${input.distinctPaths.length} memory sources: ${input.representative}`;\n return upsertMemoryRecord({\n id: `dreaming-rem:${input.agentId}:${patternKey}`,\n providerId: 'local',\n kind: 'derived_insight',\n sourceAgentId: input.agentId,\n workspaceId: input.workspaceId,\n content,\n source: { provider: 'dreaming', path: 'DREAMS.md' },\n confidence: input.strength,\n status: 'active',\n sensitivity: input.sensitivity,\n canonicalKey: `dreaming-rem:${patternKey}`,\n explicitness: 'inferred',\n durability: 'recurring',\n importance: input.strength,\n disclosurePolicy: 'referenceable',\n evidence: input.evidence.slice(0, 8).map((sourceText) => ({\n relation: 'derived_from',\n sourceText,\n observedAt: input.observedAt,\n confidence: input.strength,\n })),\n tags: [\n 'dreaming',\n 'rem',\n 'derived-insight',\n `strength:${input.strength.toFixed(2)}`,\n `sources:${input.distinctPaths.length}`,\n ],\n });\n}\n"],"mappings":";;;;;AAoBA,SAAgB,0BAA0B,OAA6C;AAKrF,QAAO,mBAAmB;EACxB,IAAI,YALW,WAAW,SAAS,CAClC,OAAO,GAAG,MAAM,QAAQ,IAAI,MAAM,eAAe,CACjD,OAAO,MAAM,CACb,MAAM,GAAG,GAEc;EACxB,YAAY;EACZ,MAAM;EACN,eAAe,MAAM;EACrB,aAAa,MAAM;EACnB,SAAS,MAAM;EACf,QAAQ;GACN,UAAU;GACV,MAAM,MAAM;GACZ,WAAW,MAAM;GACjB,SAAS,MAAM;GAChB;EACD,YAAY,MAAM;EAClB,QAAQ;EACR,aAAa,MAAM;EACnB,cAAc,YAAY,MAAM;EAChC,cAAc;EACd,YAAY;EACZ,YAAY,MAAM;EAClB,kBAAkB;EAClB,UAAU,CAAC;GACT,UAAU;GACV,YAAY,MAAM;GAClB,YAAY,MAAM;GAClB,YAAY,MAAM;GACnB,CAAC;EACF,MAAM;GAAC;GAAY;GAAY,WAAW,MAAM;GAAc;EAC/D,CAAC;;AAeJ,SAAgB,cAAc,YAA8B;AAC1D,QAAO,WAAW,SAAS,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,MAAM,GAAG,GAAG;;;AAIlG,SAAgB,mBAAmB,OAAsC;CACvE,MAAM,aAAa,cAAc,MAAM,WAAW;CAClD,MAAM,UAAU,4BAA4B,MAAM,cAAc,OAAO,mBAAmB,MAAM;AAChG,QAAO,mBAAmB;EACxB,IAAI,gBAAgB,MAAM,QAAQ,GAAG;EACrC,YAAY;EACZ,MAAM;EACN,eAAe,MAAM;EACrB,aAAa,MAAM;EACnB;EACA,QAAQ;GAAE,UAAU;GAAY,MAAM;GAAa;EACnD,YAAY,MAAM;EAClB,QAAQ;EACR,aAAa,MAAM;EACnB,cAAc,gBAAgB;EAC9B,cAAc;EACd,YAAY;EACZ,YAAY,MAAM;EAClB,kBAAkB;EAClB,UAAU,MAAM,SAAS,MAAM,GAAG,EAAE,CAAC,KAAK,gBAAgB;GACxD,UAAU;GACV;GACA,YAAY,MAAM;GAClB,YAAY,MAAM;GACnB,EAAE;EACH,MAAM;GACJ;GACA;GACA;GACA,YAAY,MAAM,SAAS,QAAQ,EAAE;GACrC,WAAW,MAAM,cAAc;GAChC;EACF,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { Config } from '../../../config/schema.js';
|
|
2
|
-
import { resolveEffectiveAgentManifestForAgent } from '../../../config/agent-profile.js';
|
|
3
2
|
import type { DreamingResolvedConfig } from './config.js';
|
|
4
3
|
export type DreamingAgentScope = {
|
|
5
4
|
agentId: string;
|
|
@@ -8,7 +7,7 @@ export type DreamingAgentScope = {
|
|
|
8
7
|
memoryPath: string;
|
|
9
8
|
dreamsPath: string;
|
|
10
9
|
config: DreamingResolvedConfig;
|
|
11
|
-
memory:
|
|
10
|
+
memory: Config['userContext']['memory'];
|
|
12
11
|
};
|
|
13
|
-
export declare function
|
|
12
|
+
export declare function resolveDreamingRoot(): string;
|
|
14
13
|
export declare function resolveDreamingAgentScope(config: Config, requestedAgentId?: string | null): DreamingAgentScope;
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { init_agent_scope, normalizeAgentId,
|
|
2
|
-
import {
|
|
1
|
+
import { init_agent_scope, normalizeAgentId, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../../agent-scope.js";
|
|
2
|
+
import { init_paths, resolveUserDir } from "../../../config/paths.js";
|
|
3
3
|
import { resolveDreamingConfig } from "./config.js";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
//#region src/agent/memory/dreaming/scope.ts
|
|
6
6
|
init_agent_scope();
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
init_paths();
|
|
8
|
+
function resolveDreamingRoot() {
|
|
9
|
+
return path.join(resolveUserDir(), "memories");
|
|
9
10
|
}
|
|
10
11
|
function resolveDreamingAgentScope(config, requestedAgentId) {
|
|
11
12
|
const agentId = normalizeAgentId(requestedAgentId || resolveDefaultAgentId(config));
|
|
12
|
-
const
|
|
13
|
-
const memoriesDir = resolveDreamingRootForAgent(config, agentId);
|
|
13
|
+
const memoriesDir = resolveDreamingRoot();
|
|
14
14
|
return {
|
|
15
15
|
agentId,
|
|
16
16
|
workspaceDir: resolveAgentWorkspaceDir(config, agentId),
|
|
@@ -18,10 +18,10 @@ function resolveDreamingAgentScope(config, requestedAgentId) {
|
|
|
18
18
|
memoryPath: path.join(memoriesDir, "MEMORY.md"),
|
|
19
19
|
dreamsPath: path.join(memoriesDir, "DREAMS.md"),
|
|
20
20
|
config: resolveDreamingConfig(config, agentId),
|
|
21
|
-
memory:
|
|
21
|
+
memory: config.userContext.memory
|
|
22
22
|
};
|
|
23
23
|
}
|
|
24
24
|
//#endregion
|
|
25
|
-
export { resolveDreamingAgentScope,
|
|
25
|
+
export { resolveDreamingAgentScope, resolveDreamingRoot };
|
|
26
26
|
|
|
27
27
|
//# sourceMappingURL=scope.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.js","names":[],"sources":["../../../../../src/agent/memory/dreaming/scope.ts"],"sourcesContent":["import path from 'node:path';\n\nimport type { Config } from '../../../config/schema.js';\nimport {\n normalizeAgentId,\n
|
|
1
|
+
{"version":3,"file":"scope.js","names":[],"sources":["../../../../../src/agent/memory/dreaming/scope.ts"],"sourcesContent":["import path from 'node:path';\n\nimport type { Config } from '../../../config/schema.js';\nimport {\n normalizeAgentId,\n resolveAgentWorkspaceDir,\n resolveDefaultAgentId,\n} from '../../agent-scope.js';\nimport { resolveUserDir } from '../../../config/paths.js';\nimport type { DreamingResolvedConfig } from './config.js';\nimport { resolveDreamingConfig } from './config.js';\n\nexport type DreamingAgentScope = {\n agentId: string;\n workspaceDir: string;\n memoriesDir: string;\n memoryPath: string;\n dreamsPath: string;\n config: DreamingResolvedConfig;\n memory: Config['userContext']['memory'];\n};\n\nexport function resolveDreamingRoot(): string {\n return path.join(resolveUserDir(), 'memories');\n}\n\nexport function resolveDreamingAgentScope(config: Config, requestedAgentId?: string | null): DreamingAgentScope {\n const agentId = normalizeAgentId(requestedAgentId || resolveDefaultAgentId(config));\n const memoriesDir = resolveDreamingRoot();\n return {\n agentId,\n workspaceDir: resolveAgentWorkspaceDir(config, agentId),\n memoriesDir,\n memoryPath: path.join(memoriesDir, 'MEMORY.md'),\n dreamsPath: path.join(memoriesDir, 'DREAMS.md'),\n config: resolveDreamingConfig(config, agentId),\n memory: config.userContext.memory,\n };\n}\n"],"mappings":";;;;;kBAO8B;YAC4B;AAc1D,SAAgB,sBAA8B;AAC5C,QAAO,KAAK,KAAK,gBAAgB,EAAE,WAAW;;AAGhD,SAAgB,0BAA0B,QAAgB,kBAAsD;CAC9G,MAAM,UAAU,iBAAiB,oBAAoB,sBAAsB,OAAO,CAAC;CACnF,MAAM,cAAc,qBAAqB;AACzC,QAAO;EACL;EACA,cAAc,yBAAyB,QAAQ,QAAQ;EACvD;EACA,YAAY,KAAK,KAAK,aAAa,YAAY;EAC/C,YAAY,KAAK,KAAK,aAAa,YAAY;EAC/C,QAAQ,sBAAsB,QAAQ,QAAQ;EAC9C,QAAQ,OAAO,YAAY;EAC5B"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { AgentTool } from '@earendil-works/pi-agent-core';
|
|
2
2
|
import type { MemoryProvider, MemoryProviderInitOptions } from './provider.js';
|
|
3
3
|
import type { UnderstandingCandidate } from './understanding/types.js';
|
|
4
|
-
import type { MemoryAccessPolicy } from './access-policy.js';
|
|
5
4
|
import type { MemoryDeleteRequest, MemoryListRequest, MemoryReadRequest, MemoryReadResult, MemorySearchRequest, MemorySearchResult, MemoryUpdateRequest, MemoryWriteRequest, MemoryWriteResult, MemoryRecord, MemorySignal, MemoryKind } from './types.js';
|
|
6
5
|
export type MemorySearchStrategy = 'local-first' | 'external-first' | 'fanout' | 'local-only' | 'external-only';
|
|
7
6
|
export type MemoryWriteStrategy = 'local-first' | 'external-first' | 'write-through' | 'local-only' | 'external-only';
|
|
@@ -13,7 +12,6 @@ export interface MemoryRoutingOptions {
|
|
|
13
12
|
export interface MemoryManagerOptions extends MemoryRoutingOptions {
|
|
14
13
|
loadProviders?: () => Promise<MemoryProvider[]>;
|
|
15
14
|
writePolicy?: MemoryWritePolicy;
|
|
16
|
-
accessPolicy?: MemoryAccessPolicy;
|
|
17
15
|
}
|
|
18
16
|
export interface MemoryWritePolicy {
|
|
19
17
|
allowExternalWrites?: boolean;
|
|
@@ -31,7 +29,6 @@ export declare class MemoryManager {
|
|
|
31
29
|
private readonly understanding;
|
|
32
30
|
private readonly lastTurnSourceItem;
|
|
33
31
|
private understandingAgentId;
|
|
34
|
-
private readonly accessPolicy?;
|
|
35
32
|
constructor(options?: MemoryManagerOptions);
|
|
36
33
|
addProvider(provider: MemoryProvider): void;
|
|
37
34
|
get providersList(): MemoryProvider[];
|
|
@@ -49,7 +46,7 @@ export declare class MemoryManager {
|
|
|
49
46
|
agentId?: string;
|
|
50
47
|
sessionId?: string;
|
|
51
48
|
correctionTargetRecordIds?: string[];
|
|
52
|
-
}): Promise<
|
|
49
|
+
}): Promise<import('./understanding/types.js').UnderstandingReviewResult>;
|
|
53
50
|
syncProvidersForTurn(userContent: string, assistantContent: string, options?: {
|
|
54
51
|
sessionId?: string;
|
|
55
52
|
}): Promise<void>;
|
|
@@ -69,7 +66,6 @@ export declare class MemoryManager {
|
|
|
69
66
|
update(request: MemoryUpdateRequest): Promise<MemoryWriteResult>;
|
|
70
67
|
delete(request: MemoryDeleteRequest): Promise<MemoryWriteResult>;
|
|
71
68
|
private canReadRecord;
|
|
72
|
-
private crossAgentWriteDenied;
|
|
73
69
|
onMemoryWrite(action: 'add' | 'replace' | 'remove', target: 'memory' | 'user', content: string): void;
|
|
74
70
|
recordSignal(signal: MemorySignal): void;
|
|
75
71
|
initializeAll(sessionId: string, options?: MemoryProviderInitOptions): Promise<void>;
|
|
@@ -17,7 +17,6 @@ var MemoryManager = class {
|
|
|
17
17
|
understanding;
|
|
18
18
|
lastTurnSourceItem = /* @__PURE__ */ new Map();
|
|
19
19
|
understandingAgentId;
|
|
20
|
-
accessPolicy;
|
|
21
20
|
constructor(options = {}) {
|
|
22
21
|
this.routing = {
|
|
23
22
|
searchStrategy: options.searchStrategy ?? "fanout",
|
|
@@ -25,7 +24,6 @@ var MemoryManager = class {
|
|
|
25
24
|
replicateTo: options.replicateTo ?? []
|
|
26
25
|
};
|
|
27
26
|
this.loadProviders = options.loadProviders;
|
|
28
|
-
this.accessPolicy = options.accessPolicy;
|
|
29
27
|
this.writePolicy = {
|
|
30
28
|
allowExternalWrites: options.writePolicy?.allowExternalWrites ?? false,
|
|
31
29
|
requireUserProfileApproval: options.writePolicy?.requireUserProfileApproval ?? false,
|
|
@@ -100,6 +98,7 @@ var MemoryManager = class {
|
|
|
100
98
|
correctionTargetRecordIds: options?.correctionTargetRecordIds
|
|
101
99
|
});
|
|
102
100
|
if (options?.sessionId && review.sourceItemId) this.lastTurnSourceItem.set(options.sessionId, review.sourceItemId);
|
|
101
|
+
return review;
|
|
103
102
|
}
|
|
104
103
|
async syncProvidersForTurn(userContent, assistantContent, options) {
|
|
105
104
|
const event = {
|
|
@@ -259,36 +258,16 @@ var MemoryManager = class {
|
|
|
259
258
|
return out;
|
|
260
259
|
}
|
|
261
260
|
async write(request) {
|
|
262
|
-
const denied = this.crossAgentWriteDenied("write", request);
|
|
263
|
-
if (denied) return denied;
|
|
264
261
|
return this.writeWithStrategy("write", request);
|
|
265
262
|
}
|
|
266
263
|
async update(request) {
|
|
267
|
-
const denied = this.crossAgentWriteDenied("update", request);
|
|
268
|
-
if (denied) return denied;
|
|
269
264
|
return this.writeWithStrategy("update", request);
|
|
270
265
|
}
|
|
271
266
|
async delete(request) {
|
|
272
|
-
const denied = this.crossAgentWriteDenied("delete", request);
|
|
273
|
-
if (denied) return denied;
|
|
274
267
|
return this.writeWithStrategy("delete", request);
|
|
275
268
|
}
|
|
276
269
|
canReadRecord(record, scope) {
|
|
277
|
-
return
|
|
278
|
-
}
|
|
279
|
-
crossAgentWriteDenied(action, request) {
|
|
280
|
-
if (!this.accessPolicy) return null;
|
|
281
|
-
const ownerAgentId = request.scope?.agentId ?? this.accessPolicy.requesterAgentId;
|
|
282
|
-
if (ownerAgentId === this.accessPolicy.requesterAgentId) return null;
|
|
283
|
-
if (action !== "write" || !("status" in request) || request.status !== "candidate") return {
|
|
284
|
-
success: false,
|
|
285
|
-
error: "Cross-agent changes must be submitted as memory candidates"
|
|
286
|
-
};
|
|
287
|
-
if (!this.accessPolicy.canSubmitCandidate(ownerAgentId)) return {
|
|
288
|
-
success: false,
|
|
289
|
-
error: "Cross-agent candidate submission is not allowed"
|
|
290
|
-
};
|
|
291
|
-
return null;
|
|
270
|
+
return true;
|
|
292
271
|
}
|
|
293
272
|
onMemoryWrite(action, target, content) {
|
|
294
273
|
for (const p of this.providers) {
|