@xopcai/xopc 0.0.247 → 0.0.249
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/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/src/update-offset-store.js +17 -54
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/auth/accounts.js +3 -5
- package/dist/extensions/weixin/src/monitor/monitor.js +3 -5
- package/dist/extensions/weixin/src/storage/sync-buf.d.ts +3 -6
- package/dist/extensions/weixin/src/storage/sync-buf.js +9 -22
- package/dist/gateway/static/root/assets/{activity-store-BlxqErph.js → activity-store-B759R_qf.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DmaFeojS.js → agent-avatar-dicebear-BUu7EnwM.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-C1rXNUAG.js +1 -0
- package/dist/gateway/static/root/assets/agents-DK9HjHO0.js +1 -0
- package/dist/gateway/static/root/assets/{api-BbXzyQMj.js → api-Cg0v7Lpn.js} +1 -1
- package/dist/gateway/static/root/assets/app-management-settings-panel-C9DkCW_d.js +1 -0
- package/dist/gateway/static/root/assets/appearance-settings-CFggS95Y.js +1 -0
- package/dist/gateway/static/root/assets/apps-page-jOvT-fzU.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-DD2SweEH.js → archive-plugin-BQrilVVv.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-BG82bNBQ.js → attachment-load-BG0BliqV.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-CqBZ89He.js → automations-page-Bo4RiTkh.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-BKjKTlW8.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-B6LKm5Zv.js → binary-plugins-BCnyNU0C.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-BJKvGVXd.js → block-editor-Db8DlVvg.js} +50 -50
- package/dist/gateway/static/root/assets/browser-settings-page-Dzq18pO1.js +8 -0
- package/dist/gateway/static/root/assets/{browser-workflow-inputs-BAAc151l.js → browser-workflow-inputs-C71vfl0b.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-workflows-page-DoE4Uuns.js → browser-workflows-page-vvmSYKsO.js} +2 -2
- package/dist/gateway/static/root/assets/capabilities-settings-panel-DW4SBQf4.js +7 -0
- package/dist/gateway/static/root/assets/channels-settings-57OGuewD.js +1 -0
- package/dist/gateway/static/root/assets/{channels-status-swr-CCBCtLDg.js → channels-status-swr-CKyV3jY5.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-terminal-dock-BsRWnz7M.js → chat-terminal-dock-B1Xd6OFB.js} +2 -2
- package/dist/gateway/static/root/assets/connectors-page-CT_I3kbR.js +2 -0
- package/dist/gateway/static/root/assets/{cron-expression-DdCgsH2c.js → cron-expression-D-F9vjtE.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-dt37Lt8e.js → date-picker-B2OoYvic.js} +1 -1
- package/dist/gateway/static/root/assets/dependency-picker-BiGx9Sbj.js +1 -0
- package/dist/gateway/static/root/assets/{desktop-pet-Nw_Pgkk3.js → desktop-pet-BNMRqipe.js} +1 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-DeYbIV7A.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-BHSst0WN.js → extension-debug-page-COyn05ub.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DXbL4cQZ.js → extension-page-oH43chS2.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-BMO59994.js +1 -0
- package/dist/gateway/static/root/assets/gateway-config-api-cimpViGk.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-config-swr-826dipyU.js → gateway-config-swr-BGdHwT4e.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-BHJtnSic.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-DyvcAIMm.js → gateway-startup-retry-CuaM3b4c.js} +1 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-DNhrZHqx.js +1 -0
- package/dist/gateway/static/root/assets/home-page-BiHwiBnQ.js +1 -0
- package/dist/gateway/static/root/assets/{image-generation-api-D7cyfks6.js → image-generation-api-D7duj7Uj.js} +1 -1
- package/dist/gateway/static/root/assets/index-DGeGmj4k.css +2 -0
- package/dist/gateway/static/root/assets/index-aBs0EfQB.js +72 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-EY4cu-6W.js → keyboard-shortcuts-settings-D8Zw_lYd.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-eBFVWmtH.js +2 -0
- package/dist/gateway/static/root/assets/{local-apps-page-Dh7OxX0S.js → local-apps-page-CvPDPRwb.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-CBoCuIMx.js → locale-store-zEL8bkwx.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-ClvcWlL6.js +2 -0
- package/dist/gateway/static/root/assets/{management-settings-ZjiL3A-S.js → management-settings-D8moh99U.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-split-B4BxkTpU.js → markdown-split-D7V3j0vE.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-BXsHghJd.js → markdown-view-DGRN-8wP.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-D15XBiEo.js → media-plugins-BLaE5b1Y.js} +1 -1
- package/dist/gateway/static/root/assets/messages-W5P19VTF.js +11 -0
- package/dist/gateway/static/root/assets/mobile-pairing-wizard-DiVDuCxl.js +1 -0
- package/dist/gateway/static/root/assets/note-detail-panel-CEEvR-fV.js +5 -0
- package/dist/gateway/static/root/assets/notes-page-BLqgXNCx.js +8 -0
- package/dist/gateway/static/root/assets/page-tabs-BFMGjA60.js +1 -0
- package/dist/gateway/static/root/assets/preview-open-alternatives-DNEWZN7H.js +1 -0
- package/dist/gateway/static/root/assets/{product-open-page-CAJeUXeU.js → product-open-page-Co5u7asH.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-CIiFJ5tk.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-B3UF-Pfm.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-BhGKnvLP.js → registry-api-Cg92zSod.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BUtpkJPG.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-BhKcyEId.js → runtime-tools-settings-panel-C0ByNmlV.js} +2 -2
- package/dist/gateway/static/root/assets/{schema-form-L0s7RWCi.js → schema-form-Dq_VQpuY.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-UgJmG-V4.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DDCzpdkl.js +1 -0
- package/dist/gateway/static/root/assets/settings-form-section-CZu6FX4k.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-CTKoztlF.js → settings-page-S8ekeUZd.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-BdVmwXMv.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-CiiLLz5A.js → share-preview-page-D2fEidbn.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-BdsqnCYj.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-ghzAQKna.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-AYiPlgZE.js +2 -0
- package/dist/gateway/static/root/assets/{skills-page.utils-CwRekJSJ.js → skills-page.utils-DGzl-ib-.js} +1 -1
- package/dist/gateway/static/root/assets/system-settings-panel-5Xd5mIiR.js +1 -0
- package/dist/gateway/static/root/assets/task-detail-page-BQAUaCDD.js +1 -0
- package/dist/gateway/static/root/assets/{theme-store-hybK3oC9.js → theme-store-ZVClZKQ0.js} +1 -1
- package/dist/gateway/static/root/assets/tunnel-api-CdZN1Jin.js +1 -0
- package/dist/gateway/static/root/assets/{use-autosave-DX5YZ3Nn.js → use-autosave-czRI0NBc.js} +1 -1
- package/dist/gateway/static/root/assets/user-model-page-W3GTm6nA.js +2 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-ocnZbAyi.js → voice-api-key-field-8YEvA3cU.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-CBbiF1T3.js → voice-config-api-CopF64lY.js} +1 -1
- package/dist/gateway/static/root/assets/work-discovery-overlay-keLtqYYJ.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-DaErGvxO.js → workflow-run-setup-panel-Dy5WgYMO.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-BbAV3h7n.js +5 -0
- package/dist/gateway/static/root/index.html +10 -26
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-instance-gateway.d.ts +2 -2
- package/dist/src/agent/agent-manager.d.ts +4 -4
- package/dist/src/agent/agent-manager.js +31 -15
- package/dist/src/agent/background-review/coordinator.d.ts +2 -4
- package/dist/src/agent/background-review/coordinator.js +5 -30
- package/dist/src/agent/background-review/prompts.d.ts +4 -2
- package/dist/src/agent/background-review/prompts.js +24 -19
- package/dist/src/agent/background-review/run-background-review.d.ts +6 -7
- package/dist/src/agent/background-review/run-background-review.js +47 -41
- package/dist/src/agent/background-review/settings.d.ts +0 -1
- package/dist/src/agent/background-review/settings.js +6 -7
- package/dist/src/agent/commands/command-registry.d.ts +1 -0
- package/dist/src/agent/commands/command-registry.js +12 -22
- package/dist/src/agent/context/audit.d.ts +36 -0
- package/dist/src/agent/context/audit.js +97 -0
- package/dist/src/agent/context/coordinator.d.ts +26 -0
- package/dist/src/agent/context/coordinator.js +72 -0
- package/dist/src/agent/context/execution-context.d.ts +54 -0
- package/dist/src/agent/context/execution-context.js +147 -0
- package/dist/src/agent/context/execution-scope.js +1 -1
- package/dist/src/agent/context/prepend.d.ts +2 -0
- package/dist/src/agent/context/prepend.js +28 -0
- package/dist/src/agent/context/project-context.d.ts +3 -3
- package/dist/src/agent/context/project-context.js +26 -23
- package/dist/src/agent/embedded/index.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js +1 -0
- package/dist/src/agent/embedded/run-turn.js +22 -2
- package/dist/src/agent/embedded/types.d.ts +1 -25
- package/dist/src/agent/external-tools/composio-provider.js +87 -92
- package/dist/src/agent/external-tools/gateway-tools.d.ts +4 -1
- package/dist/src/agent/external-tools/gateway-tools.js +153 -41
- package/dist/src/agent/external-tools/index.js +1 -1
- package/dist/src/agent/external-tools/search-error.d.ts +12 -0
- package/dist/src/agent/external-tools/search-error.js +29 -0
- package/dist/src/agent/external-tools/service.d.ts +4 -0
- package/dist/src/agent/external-tools/service.js +22 -2
- package/dist/src/agent/ipc/inbox.d.ts +8 -31
- package/dist/src/agent/ipc/inbox.js +64 -133
- package/dist/src/agent/memory/compaction-policy.js +1 -1
- package/dist/src/agent/memory/compaction-promotion.js +45 -77
- package/dist/src/agent/memory/create-memory-manager.js +1 -3
- package/dist/src/agent/memory/index.d.ts +0 -5
- package/dist/src/agent/memory/index.js +2 -5
- package/dist/src/agent/memory/manager.d.ts +0 -16
- package/dist/src/agent/memory/manager.js +11 -40
- package/dist/src/agent/memory/memory-config.js +1 -1
- package/dist/src/agent/memory/runtime.d.ts +2 -2
- package/dist/src/agent/memory/runtime.js +9 -19
- package/dist/src/agent/memory/types.d.ts +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +13 -21
- package/dist/src/agent/prompt/sections/memory-skills.js +25 -36
- package/dist/src/agent/prompt/sections/tooling.js +10 -4
- package/dist/src/agent/prompt/service-prompt-builder.js +4 -3
- package/dist/src/agent/service/direct-turn-helpers.js +6 -23
- package/dist/src/agent/service/process-direct-one-shot.js +15 -10
- package/dist/src/agent/service/process-direct-streaming.js +5 -3
- package/dist/src/agent/service.js +4 -3
- package/dist/src/agent/tasks/task-judge-service.js +1 -1
- package/dist/src/agent/tools/clarify-tool.d.ts +1 -0
- package/dist/src/agent/tools/delegate-tool.js +5 -2
- package/dist/src/agent/tools/factory.js +36 -19
- package/dist/src/agent/tools/index.d.ts +3 -2
- package/dist/src/agent/tools/index.js +4 -3
- package/dist/src/agent/tools/knowledge-memory-tool.d.ts +9 -0
- package/dist/src/agent/tools/knowledge-memory-tool.js +129 -0
- package/dist/src/agent/tools/{dreaming-tool.d.ts → memory-maintenance-tool.d.ts} +2 -2
- package/dist/src/agent/tools/memory-maintenance-tool.js +31 -0
- package/dist/src/agent/tools/user-context-tool.d.ts +8 -0
- package/dist/src/agent/tools/user-context-tool.js +81 -0
- package/dist/src/agent/tools/xopc-use-tool.js +2 -2
- package/dist/src/agent/workflow/catalog.d.ts +1 -8
- package/dist/src/agent/workflow/catalog.js +44 -102
- package/dist/src/agent/workflow/index.d.ts +1 -1
- package/dist/src/agent/workflow/index.js +2 -2
- package/dist/src/automations/domain/types.d.ts +1 -0
- package/dist/src/automations/service/action-executor.js +2 -2
- package/dist/src/automations/service/automation-service.js +2 -2
- package/dist/src/channels/manager.d.ts +1 -1
- package/dist/src/channels/manager.js +2 -2
- package/dist/src/channels/outbound/persist-store.d.ts +2 -8
- package/dist/src/channels/outbound/persist-store.js +11 -38
- package/dist/src/channels/outbound-sender.d.ts +1 -1
- package/dist/src/channels/outbound-sender.js +2 -2
- package/dist/src/chat-commands/builtins/understanding.js +24 -6
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/config/schema.d.ts +68 -75
- package/dist/src/config/schema.js +31 -20
- package/dist/src/config/web-patch.d.ts +1 -1
- package/dist/src/connectors/composio-managed-client.js +6 -2
- package/dist/src/connectors/composio-triggers.d.ts +2 -2
- package/dist/src/connectors/composio-triggers.js +8 -15
- package/dist/src/connectors/connected-source-understanding.d.ts +1 -3
- package/dist/src/connectors/connected-source-understanding.js +86 -99
- package/dist/src/connectors/connection-candidates.d.ts +11 -0
- package/dist/src/connectors/connection-candidates.js +58 -0
- package/dist/src/connectors/connection-capabilities.d.ts +4 -0
- package/dist/src/connectors/connection-capabilities.js +37 -0
- package/dist/src/connectors/connection-recovery-service.d.ts +42 -0
- package/dist/src/connectors/connection-recovery-service.js +396 -0
- package/dist/src/connectors/learning-coordinator.d.ts +0 -2
- package/dist/src/connectors/learning-coordinator.js +6 -7
- package/dist/src/connectors/principal.d.ts +5 -0
- package/dist/src/connectors/principal.js +18 -0
- package/dist/src/gateway/agent-builtin-tools.d.ts +28 -10
- package/dist/src/gateway/agent-builtin-tools.js +30 -9
- package/dist/src/gateway/automation-agent-session.js +3 -0
- package/dist/src/gateway/chat-stream/mapper.js +1 -28
- package/dist/src/gateway/chat-stream/protocol.d.ts +2 -24
- package/dist/src/gateway/clarify-bridge.d.ts +4 -0
- package/dist/src/gateway/clarify-bridge.js +9 -4
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +52 -30
- package/dist/src/gateway/hono/lib/config-payload.js +4 -4
- package/dist/src/gateway/hono/lib/extension-store.js +8 -25
- package/dist/src/gateway/hono/middleware/auth.js +1 -2
- package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +72 -28
- package/dist/src/gateway/hono/routes/connection-waits.d.ts +3 -0
- package/dist/src/gateway/hono/routes/connection-waits.js +58 -0
- package/dist/src/gateway/hono/routes/connectors.js +4 -12
- package/dist/src/gateway/hono/routes/context-sources.d.ts +4 -0
- package/dist/src/gateway/hono/routes/context-sources.js +159 -0
- package/dist/src/gateway/hono/routes/index.js +4 -2
- package/dist/src/gateway/hono/routes/lazy-bundles.js +9 -4
- package/dist/src/gateway/hono/routes/notes.js +22 -7
- package/dist/src/gateway/hono/routes/projects.js +37 -45
- package/dist/src/gateway/hono/routes/session-input-handler.d.ts +15 -1
- package/dist/src/gateway/hono/routes/side-chats.js +13 -2
- package/dist/src/gateway/hono/routes/tasks.js +2 -2
- package/dist/src/gateway/hono/routes/user-model.d.ts +3 -0
- package/dist/src/gateway/hono/routes/user-model.js +480 -0
- package/dist/src/gateway/hono/routes/workflows.js +2 -2
- package/dist/src/gateway/memory-maintenance-automation-reconciler.d.ts +11 -0
- package/dist/src/gateway/memory-maintenance-automation-reconciler.js +72 -0
- package/dist/src/gateway/service/agent-runner.d.ts +9 -1
- package/dist/src/gateway/service/agent-runner.js +25 -1
- package/dist/src/gateway/service/config-coordinator.d.ts +2 -2
- package/dist/src/gateway/service/config-coordinator.js +4 -4
- package/dist/src/gateway/service/run-gateway-agent.d.ts +1 -0
- package/dist/src/gateway/service/run-gateway-agent.js +18 -14
- package/dist/src/gateway/service/session-input-coordinator.d.ts +3 -0
- package/dist/src/gateway/service/session-input-coordinator.js +12 -2
- package/dist/src/gateway/service.d.ts +3 -1
- package/dist/src/gateway/service.js +49 -19
- package/dist/src/gateway/side-chat/manager.d.ts +16 -3
- package/dist/src/gateway/side-chat/manager.js +117 -28
- package/dist/src/gateway/side-chat/run-service.d.ts +2 -0
- package/dist/src/gateway/side-chat/run-service.js +28 -5
- package/dist/src/gateway/side-chat/types.d.ts +9 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/knowledge/connected-knowledge-pipeline.d.ts +0 -2
- package/dist/src/knowledge/connected-knowledge-pipeline.js +46 -217
- package/dist/src/knowledge-memory/domain.d.ts +35 -0
- package/dist/src/knowledge-memory/index.d.ts +2 -0
- package/dist/src/knowledge-memory/index.js +2 -0
- package/dist/src/knowledge-memory/repository.d.ts +45 -0
- package/dist/src/knowledge-memory/repository.js +154 -0
- package/dist/src/memory-maintenance/index.d.ts +2 -0
- package/dist/src/memory-maintenance/index.js +3 -0
- package/dist/src/memory-maintenance/schedule.d.ts +13 -0
- package/dist/src/memory-maintenance/schedule.js +51 -0
- package/dist/src/memory-maintenance/service.d.ts +28 -0
- package/dist/src/memory-maintenance/service.js +216 -0
- package/dist/src/notes/index.d.ts +1 -1
- package/dist/src/notes/index.js +2 -2
- package/dist/src/notes/paths.d.ts +0 -3
- package/dist/src/notes/paths.js +1 -10
- package/dist/src/notes/service.d.ts +1 -1
- package/dist/src/notes/service.js +7 -4
- package/dist/src/notes/store.d.ts +0 -2
- package/dist/src/notes/store.js +33 -80
- package/dist/src/notes/types.d.ts +16 -0
- package/dist/src/proactive/execution/context.d.ts +2 -2
- package/dist/src/proactive/execution/context.js +16 -11
- package/dist/src/proactive/index.d.ts +1 -1
- package/dist/src/proactive/index.js +2 -2
- package/dist/src/projects/index.d.ts +1 -1
- package/dist/src/projects/index.js +2 -2
- package/dist/src/projects/knowledge-bind.d.ts +1 -0
- package/dist/src/projects/knowledge-bind.js +15 -0
- package/dist/src/projects/project-loop.d.ts +3 -3
- package/dist/src/projects/project-loop.js +4 -4
- package/dist/src/projects/project-store.js +2 -1
- package/dist/src/realtime/runtime.js +1 -0
- package/dist/src/runtime-tools/manager.js +1 -1
- package/dist/src/share/hosted-session-share.d.ts +1 -4
- package/dist/src/share/hosted-session-share.js +14 -47
- package/dist/src/share/share-auto.d.ts +1 -1
- package/dist/src/share/share-auto.js +2 -2
- package/dist/src/share/share-store.d.ts +2 -7
- package/dist/src/share/share-store.js +153 -195
- package/dist/src/share/share-types.d.ts +0 -4
- package/dist/src/share/site-share-store.d.ts +3 -8
- package/dist/src/share/site-share-store.js +94 -153
- package/dist/src/share/site-share-types.d.ts +0 -4
- package/dist/src/storage/sqlite/collaboration-rule-repository.d.ts +17 -0
- package/dist/src/storage/sqlite/collaboration-rule-repository.js +54 -0
- package/dist/src/storage/sqlite/connection-wait-repository.d.ts +30 -0
- package/dist/src/storage/sqlite/connection-wait-repository.js +338 -0
- package/dist/src/storage/sqlite/connection.d.ts +1 -2
- package/dist/src/storage/sqlite/connection.js +50 -47
- package/dist/src/storage/sqlite/connector-account-repository.js +1 -1
- package/dist/src/storage/sqlite/context-evidence-repository.d.ts +24 -0
- package/dist/src/storage/sqlite/context-evidence-repository.js +52 -0
- package/dist/src/storage/sqlite/durable-queue.d.ts +16 -0
- package/dist/src/storage/sqlite/durable-queue.js +52 -0
- package/dist/src/storage/sqlite/durable-state.d.ts +16 -0
- package/dist/src/storage/sqlite/durable-state.js +43 -0
- package/dist/src/storage/sqlite/index.d.ts +3 -5
- package/dist/src/storage/sqlite/index.js +4 -6
- package/dist/src/storage/sqlite/knowledge-repository.d.ts +0 -19
- package/dist/src/storage/sqlite/knowledge-repository.js +1 -90
- package/dist/src/storage/sqlite/migrations/146_understanding_focus_exclusions.sql +9 -0
- package/dist/src/storage/sqlite/migrations/147_durable_application_state.sql +39 -0
- package/dist/src/storage/sqlite/migrations/148_user_model_foundation.sql +554 -0
- package/dist/src/storage/sqlite/migrations/149_separate_source_index_from_memory.sql +18 -0
- package/dist/src/storage/sqlite/migrations/150_session_connection_waits.sql +47 -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.ts +1 -1
- package/dist/src/storage/sqlite/notes-repository.d.ts +2 -1
- package/dist/src/storage/sqlite/notes-repository.js +37 -3
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/session-input-repository.d.ts +14 -2
- package/dist/src/storage/sqlite/session-input-repository.js +16 -13
- package/dist/src/storage/sqlite/session-repository.js +4 -1
- package/dist/src/storage/sqlite/transcript-repository.js +1 -1
- package/dist/src/tasks/index.js +2 -2
- package/dist/src/tasks/project-operating-view-service.js +1 -1
- package/dist/src/tasks/task-application-service.js +6 -1
- package/dist/src/tasks/task-context-assembler.js +1 -1
- package/dist/src/tasks/task-context-repository.d.ts +0 -1
- package/dist/src/tasks/task-context-repository.js +1 -1
- package/dist/src/tasks/task-deletion-service.js +1 -1
- package/dist/src/tasks/task-handoff-service.js +1 -1
- package/dist/src/tasks/task-read-model-projector.js +1 -1
- package/dist/src/tasks/task-run-coordinator.js +1 -1
- package/dist/src/tasks/task-run-dispatcher.js +1 -1
- package/dist/src/tasks/task-run-repository.js +1 -0
- package/dist/src/tasks/task-signal-service.js +1 -1
- package/dist/src/tui/tool-summary.js +2 -1
- package/dist/src/tui/tui-scoped-models.js +9 -6
- package/dist/src/user-context/changes.d.ts +1 -1
- package/dist/src/user-context/config.d.ts +135 -153
- package/dist/src/user-context/config.js +94 -99
- package/dist/src/user-context/relationship-continuity.d.ts +2 -2
- package/dist/src/user-context/relationship-continuity.js +34 -24
- package/dist/src/user-context/sources/activity-clustering.d.ts +9 -3
- package/dist/src/user-context/sources/index.js +2 -2
- package/dist/src/user-context/sources/repository.d.ts +1 -21
- package/dist/src/user-context/sources/repository.js +1 -183
- package/dist/src/user-context/sources/types.d.ts +0 -23
- package/dist/src/user-model/capture/executor.d.ts +40 -0
- package/dist/src/user-model/capture/executor.js +134 -0
- package/dist/src/user-model/capture/index.d.ts +2 -0
- package/dist/src/user-model/capture/index.js +3 -0
- package/dist/src/user-model/capture/semantic.d.ts +21 -0
- package/dist/src/user-model/capture/semantic.js +197 -0
- package/dist/src/user-model/domain.d.ts +93 -0
- package/dist/src/user-model/domain.js +33 -0
- package/dist/src/user-model/goals.d.ts +58 -0
- package/dist/src/user-model/goals.js +89 -0
- package/dist/src/user-model/importance.d.ts +11 -0
- package/dist/src/user-model/importance.js +17 -0
- package/dist/src/user-model/index.d.ts +5 -0
- package/dist/src/user-model/index.js +6 -0
- package/dist/src/user-model/repository.d.ts +23 -0
- package/dist/src/user-model/repository.js +268 -0
- package/dist/src/user-model/temporal.d.ts +10 -0
- package/dist/src/user-model/temporal.js +44 -0
- package/dist/src/voice/realtime/agentEngine.js +63 -18
- package/dist/src/voice/realtime/conversationTurn.d.ts +20 -0
- package/dist/src/voice/realtime/conversationTurn.js +83 -0
- package/dist/src/voice/realtime/memory-context.d.ts +7 -2
- package/dist/src/voice/realtime/memory-context.js +39 -51
- package/dist/src/voice/realtime/omniEngine.js +72 -18
- package/dist/src/work-discovery/service.d.ts +3 -14
- package/dist/src/work-discovery/service.js +138 -99
- package/dist/src/work-discovery/types.d.ts +3 -3
- package/dist/src/workflows/authoring/workflow-draft-store.d.ts +1 -5
- package/dist/src/workflows/authoring/workflow-draft-store.js +23 -43
- package/dist/src/workflows/index.js +2 -2
- package/dist/src/workflows/service/workflow-run-service.js +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +12 -20
- package/dist/src/workflows/store/event-store.d.ts +1 -2
- package/dist/src/workflows/store/event-store.js +19 -64
- package/dist/src/workflows/store/paths.d.ts +0 -2
- package/dist/src/workflows/store/paths.js +1 -7
- package/dist/src/workflows/store/run-store.d.ts +0 -1
- package/dist/src/workflows/store/run-store.js +1 -24
- package/package.json +3 -3
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-eG49pM-z.js +0 -1
- package/dist/gateway/static/root/assets/agents-CZwf1mgZ.js +0 -1
- package/dist/gateway/static/root/assets/app-management-settings-panel-BODskFTb.js +0 -1
- package/dist/gateway/static/root/assets/appearance-settings-DeaVvaYZ.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-BZG3BK7f.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-CB7Yl2_B.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-Bu42Ljfw.js +0 -8
- package/dist/gateway/static/root/assets/capabilities-settings-panel-Cg7zCxEH.js +0 -7
- package/dist/gateway/static/root/assets/channels-settings-EDTZ8P3y.js +0 -1
- package/dist/gateway/static/root/assets/cloud-C4-yfnnk.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-kh7PEkSS.js +0 -2
- package/dist/gateway/static/root/assets/dependency-picker-oi7cdv2C.js +0 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-D9OO-exo.js +0 -1
- package/dist/gateway/static/root/assets/ellipsis-0k4rZLoy.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-FTD7nE8v.js +0 -1
- package/dist/gateway/static/root/assets/eye-CABVeTq0.js +0 -1
- package/dist/gateway/static/root/assets/eye-off-DEAzt3g1.js +0 -1
- package/dist/gateway/static/root/assets/folder-open-CyzJ19I9.js +0 -1
- package/dist/gateway/static/root/assets/form-field-width-DJw_jULe.js +0 -1
- package/dist/gateway/static/root/assets/gateway-config-api-c-8ENciH.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-BxvyTRl0.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-C1S2Ccui.js +0 -1
- package/dist/gateway/static/root/assets/home-page-Bqx-SMWV.js +0 -1
- package/dist/gateway/static/root/assets/index-Cif1_3Jx.js +0 -71
- package/dist/gateway/static/root/assets/index-Dbh5SXyV.css +0 -2
- package/dist/gateway/static/root/assets/interaction-BmQogeqz.js +0 -1
- package/dist/gateway/static/root/assets/is-masked-secret-DOkL5b_X.js +0 -1
- package/dist/gateway/static/root/assets/link-2-D_ZKYUW7.js +0 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-sDdw7Y3Q.js +0 -2
- package/dist/gateway/static/root/assets/logs-page-DUsxXdDp.js +0 -2
- package/dist/gateway/static/root/assets/message-square-plus-XP0tGdlV.js +0 -1
- package/dist/gateway/static/root/assets/messages-BbdwoxVo.js +0 -3
- package/dist/gateway/static/root/assets/minimize-2-DtOGrlpo.js +0 -1
- package/dist/gateway/static/root/assets/mobile-pairing-wizard-Dv87XewB.js +0 -1
- package/dist/gateway/static/root/assets/models-hub-cache-88f4fzYS.js +0 -1
- package/dist/gateway/static/root/assets/notes-page-DOe0lOcQ.js +0 -1
- package/dist/gateway/static/root/assets/notes-workbench-Cy0oYbWP.js +0 -4
- package/dist/gateway/static/root/assets/oauth-api-BjSUDIgq.js +0 -1
- package/dist/gateway/static/root/assets/oauth-authorization-window-Cdolr2wE.js +0 -1
- package/dist/gateway/static/root/assets/page-tabs-BaEQMYm_.js +0 -1
- package/dist/gateway/static/root/assets/pencil-DmIY3Oa-.js +0 -1
- package/dist/gateway/static/root/assets/preview-open-alternatives-CsNVTKC0.js +0 -1
- package/dist/gateway/static/root/assets/project-detail-page-fgD1xc4O.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-CiTiEcOc.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-Dc0GrNSp.js +0 -1
- package/dist/gateway/static/root/assets/rotate-cw-LIg3Am9S.js +0 -1
- package/dist/gateway/static/root/assets/search-DA7gz22f.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BPOW3yaM.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-Bz4s9BBY.js +0 -1
- package/dist/gateway/static/root/assets/settings-form-section-DjWzRk4z.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-rllj-j7k.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-DMj7onCX.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DRB366nS.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-cBT9jCof.js +0 -2
- package/dist/gateway/static/root/assets/system-settings-panel-Byrk4DQy.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-CheX3zmK.js +0 -1
- package/dist/gateway/static/root/assets/tunnel-api-jKzujxFU.js +0 -1
- package/dist/gateway/static/root/assets/user-context-page-CWy3Pqtk.js +0 -1
- package/dist/gateway/static/root/assets/work-discovery-overlay-DE4_YpDn.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-y4O9-BTf.js +0 -5
- package/dist/src/agent/memory/builtin-provider.d.ts +0 -37
- package/dist/src/agent/memory/builtin-provider.js +0 -225
- package/dist/src/agent/memory/context/types.d.ts +0 -40
- package/dist/src/agent/memory/understanding/quality.d.ts +0 -8
- package/dist/src/agent/memory/understanding/quality.js +0 -18
- package/dist/src/agent/memory/understanding/service.d.ts +0 -19
- package/dist/src/agent/memory/understanding/service.js +0 -209
- package/dist/src/agent/memory/understanding/types.d.ts +0 -34
- package/dist/src/agent/memory/understanding/types.js +0 -1
- package/dist/src/agent/memory/user-context-coordinator.d.ts +0 -23
- package/dist/src/agent/memory/user-context-coordinator.js +0 -113
- package/dist/src/agent/tools/dreaming-tool.js +0 -37
- package/dist/src/agent/tools/memory-tool.d.ts +0 -9
- package/dist/src/agent/tools/memory-tool.js +0 -119
- package/dist/src/gateway/dreaming-automation-reconciler.d.ts +0 -11
- package/dist/src/gateway/dreaming-automation-reconciler.js +0 -63
- package/dist/src/gateway/hono/routes/understanding-sources.d.ts +0 -21
- package/dist/src/gateway/hono/routes/understanding-sources.js +0 -387
- package/dist/src/gateway/hono/routes/you.d.ts +0 -3
- package/dist/src/gateway/hono/routes/you.js +0 -443
- package/dist/src/projects/memory-bind.d.ts +0 -1
- package/dist/src/projects/memory-bind.js +0 -14
- package/dist/src/storage/sqlite/context-consolidation-repository.d.ts +0 -37
- package/dist/src/storage/sqlite/context-consolidation-repository.js +0 -64
- package/dist/src/storage/sqlite/memory-records-repository.d.ts +0 -217
- package/dist/src/storage/sqlite/memory-records-repository.js +0 -715
- package/dist/src/storage/sqlite/remote-context-repository.d.ts +0 -3
- package/dist/src/storage/sqlite/remote-context-repository.js +0 -40
- package/dist/src/storage/sqlite/user-context-quality-repository.d.ts +0 -49
- package/dist/src/storage/sqlite/user-context-quality-repository.js +0 -118
- package/dist/src/storage/sqlite/user-context-repository.d.ts +0 -85
- package/dist/src/storage/sqlite/user-context-repository.js +0 -535
- package/dist/src/user-context/automatic-context.d.ts +0 -17
- package/dist/src/user-context/automatic-context.js +0 -85
- package/dist/src/user-context/consolidation.d.ts +0 -27
- package/dist/src/user-context/consolidation.js +0 -187
- package/dist/src/user-context/context-objects.d.ts +0 -17
- package/dist/src/user-context/context-objects.js +0 -99
- package/dist/src/user-context/evaluation/harness.d.ts +0 -13
- package/dist/src/user-context/evaluation/harness.js +0 -31
- package/dist/src/user-context/extraction/executor.d.ts +0 -22
- package/dist/src/user-context/extraction/executor.js +0 -142
- package/dist/src/user-context/extraction/repair.d.ts +0 -19
- package/dist/src/user-context/extraction/repair.js +0 -71
- package/dist/src/user-context/extraction/semantic.d.ts +0 -18
- package/dist/src/user-context/extraction/semantic.js +0 -148
- package/dist/src/user-context/focus-lifecycle.d.ts +0 -2
- package/dist/src/user-context/focus-lifecycle.js +0 -26
- package/dist/src/user-context/manual-understanding.d.ts +0 -12
- package/dist/src/user-context/manual-understanding.js +0 -37
- package/dist/src/user-context/planner.d.ts +0 -17
- package/dist/src/user-context/planner.js +0 -465
- package/dist/src/user-context/relationships/indexer.d.ts +0 -13
- package/dist/src/user-context/relationships/indexer.js +0 -185
- package/dist/src/user-context/relationships/service.d.ts +0 -22
- package/dist/src/user-context/relationships/service.js +0 -50
- package/dist/src/user-context/retriever.d.ts +0 -15
- package/dist/src/user-context/retriever.js +0 -124
- package/dist/src/user-context/scope.d.ts +0 -7
- package/dist/src/user-context/scope.js +0 -9
- package/dist/src/user-context/selection-policy.d.ts +0 -20
- package/dist/src/user-context/selection-policy.js +0 -33
- package/dist/src/user-context/understanding.d.ts +0 -15
- package/dist/src/user-context/understanding.js +0 -24
- package/dist/src/user-context/understandingQuality.d.ts +0 -5
- package/dist/src/user-context/understandingQuality.js +0 -48
- /package/dist/src/{agent/memory/context/types.js → knowledge-memory/domain.js} +0 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type MemoryMaintenanceJob = 'temporal_sweep' | 'daily_reconciliation' | 'weekly_knowledge' | 'manual_repair';
|
|
2
|
+
export interface MemoryMaintenanceMetrics {
|
|
3
|
+
scanned: number;
|
|
4
|
+
stale: number;
|
|
5
|
+
needsReview: number;
|
|
6
|
+
activated: number;
|
|
7
|
+
expiredPriorities: number;
|
|
8
|
+
archived: number;
|
|
9
|
+
repairedIndexes: number;
|
|
10
|
+
}
|
|
11
|
+
export interface MemoryMaintenanceResult {
|
|
12
|
+
runId: string;
|
|
13
|
+
jobType: MemoryMaintenanceJob;
|
|
14
|
+
status: 'running' | 'completed' | 'failed';
|
|
15
|
+
skipped: boolean;
|
|
16
|
+
metrics: MemoryMaintenanceMetrics;
|
|
17
|
+
}
|
|
18
|
+
export interface RunMemoryMaintenanceInput {
|
|
19
|
+
jobType: MemoryMaintenanceJob;
|
|
20
|
+
principalId?: string;
|
|
21
|
+
now?: number;
|
|
22
|
+
idempotencyKey?: string;
|
|
23
|
+
limit?: number;
|
|
24
|
+
staleRetentionDays?: number;
|
|
25
|
+
evidenceThreshold?: number;
|
|
26
|
+
}
|
|
27
|
+
export declare function runMemoryMaintenance(input: RunMemoryMaintenanceInput): MemoryMaintenanceResult;
|
|
28
|
+
export declare function listMemoryMaintenanceRuns(limit?: number): Array<Record<string, unknown>>;
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { getSqliteDatabase, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
|
|
2
|
+
import "../user-model/domain.js";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
//#region src/memory-maintenance/service.ts
|
|
5
|
+
const ALGORITHM_VERSION = "user-model-maintenance-v1";
|
|
6
|
+
function emptyMetrics() {
|
|
7
|
+
return {
|
|
8
|
+
scanned: 0,
|
|
9
|
+
stale: 0,
|
|
10
|
+
needsReview: 0,
|
|
11
|
+
activated: 0,
|
|
12
|
+
expiredPriorities: 0,
|
|
13
|
+
archived: 0,
|
|
14
|
+
repairedIndexes: 0
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function periodKey(job, now) {
|
|
18
|
+
const date = new Date(now);
|
|
19
|
+
if (job === "temporal_sweep") return date.toISOString().slice(0, 13);
|
|
20
|
+
if (job === "daily_reconciliation") return date.toISOString().slice(0, 10);
|
|
21
|
+
if (job === "weekly_knowledge") {
|
|
22
|
+
const monday = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));
|
|
23
|
+
const day = monday.getUTCDay() || 7;
|
|
24
|
+
monday.setUTCDate(monday.getUTCDate() - day + 1);
|
|
25
|
+
return monday.toISOString().slice(0, 10);
|
|
26
|
+
}
|
|
27
|
+
return String(now);
|
|
28
|
+
}
|
|
29
|
+
function addDecision(db, runId, objectType, objectId, action, reason, before, after, now) {
|
|
30
|
+
db.prepare(`INSERT INTO memory_maintenance_decisions (
|
|
31
|
+
decision_id, run_id, object_type, object_id, action, reason, before_json, after_json, created_at
|
|
32
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(randomUUID(), runId, objectType, objectId, action, reason, before === void 0 ? null : JSON.stringify(before), after === void 0 ? null : JSON.stringify(after), now);
|
|
33
|
+
}
|
|
34
|
+
function transitionAssertions(db, runId, now, limit, metrics) {
|
|
35
|
+
const expired = db.prepare(`SELECT assertion_id, status, valid_to FROM user_assertions
|
|
36
|
+
WHERE status = 'active' AND valid_to IS NOT NULL AND valid_to < ? LIMIT ?`).all(now, limit);
|
|
37
|
+
metrics.scanned += expired.length;
|
|
38
|
+
for (const row of expired) {
|
|
39
|
+
db.prepare("UPDATE user_assertions SET status = 'stale' WHERE assertion_id = ? AND status = 'active'").run(row.assertion_id);
|
|
40
|
+
db.prepare(`INSERT INTO user_assertion_status_events (
|
|
41
|
+
event_id, assertion_id, from_status, to_status, actor_type, reason, source_run_id, created_at
|
|
42
|
+
) VALUES (?, ?, 'active', 'stale', 'maintenance', 'Validity interval ended.', ?, ?)`).run(randomUUID(), row.assertion_id, runId, now);
|
|
43
|
+
addDecision(db, runId, "assertion", row.assertion_id, "stale", "validity_ended", row, { status: "stale" }, now);
|
|
44
|
+
metrics.stale += 1;
|
|
45
|
+
}
|
|
46
|
+
const reviewDue = db.prepare(`SELECT assertion_id, status, review_at FROM user_assertions
|
|
47
|
+
WHERE status = 'active' AND review_at IS NOT NULL AND review_at <= ? LIMIT ?`).all(now, Math.max(0, limit - expired.length));
|
|
48
|
+
metrics.scanned += reviewDue.length;
|
|
49
|
+
for (const row of reviewDue) {
|
|
50
|
+
db.prepare("UPDATE user_assertions SET status = 'needs_review' WHERE assertion_id = ? AND status = 'active'").run(row.assertion_id);
|
|
51
|
+
db.prepare(`INSERT INTO user_assertion_status_events (
|
|
52
|
+
event_id, assertion_id, from_status, to_status, actor_type, reason, source_run_id, created_at
|
|
53
|
+
) VALUES (?, ?, 'active', 'needs_review', 'maintenance', 'Scheduled review became due.', ?, ?)`).run(randomUUID(), row.assertion_id, runId, now);
|
|
54
|
+
addDecision(db, runId, "assertion", row.assertion_id, "needs_review", "review_due", row, { status: "needs_review" }, now);
|
|
55
|
+
metrics.needsReview += 1;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function transitionPriorities(db, runId, principalId, now, limit, metrics) {
|
|
59
|
+
const rows = db.prepare(`SELECT priority_id, status, valid_to FROM user_priority_windows
|
|
60
|
+
WHERE principal_id = ? AND status = 'active' AND valid_to < ? LIMIT ?`).all(principalId, now, limit);
|
|
61
|
+
metrics.scanned += rows.length;
|
|
62
|
+
for (const row of rows) {
|
|
63
|
+
db.prepare("UPDATE user_priority_windows SET status = 'expired', updated_at = ? WHERE priority_id = ?").run(now, row.priority_id);
|
|
64
|
+
addDecision(db, runId, "priority", row.priority_id, "expired", "priority_window_ended", row, { status: "expired" }, now);
|
|
65
|
+
metrics.expiredPriorities += 1;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function transitionKnowledge(db, runId, principalId, now, limit, metrics) {
|
|
69
|
+
const expired = db.prepare(`SELECT knowledge_id, status, expires_at FROM knowledge_items
|
|
70
|
+
WHERE principal_id = ? AND status = 'active' AND expires_at IS NOT NULL AND expires_at < ? LIMIT ?`).all(principalId, now, limit);
|
|
71
|
+
metrics.scanned += expired.length;
|
|
72
|
+
for (const row of expired) {
|
|
73
|
+
db.prepare("UPDATE knowledge_items SET status = 'stale', updated_at = ? WHERE knowledge_id = ?").run(now, row.knowledge_id);
|
|
74
|
+
addDecision(db, runId, "knowledge", row.knowledge_id, "stale", "retention_expired", row, { status: "stale" }, now);
|
|
75
|
+
metrics.stale += 1;
|
|
76
|
+
}
|
|
77
|
+
const reviewDue = db.prepare(`SELECT knowledge_id, status, review_at FROM knowledge_items
|
|
78
|
+
WHERE principal_id = ? AND status = 'active' AND review_at IS NOT NULL AND review_at <= ? LIMIT ?`).all(principalId, now, Math.max(0, limit - expired.length));
|
|
79
|
+
metrics.scanned += reviewDue.length;
|
|
80
|
+
for (const row of reviewDue) {
|
|
81
|
+
db.prepare("UPDATE knowledge_items SET status = 'needs_review', updated_at = ? WHERE knowledge_id = ?").run(now, row.knowledge_id);
|
|
82
|
+
addDecision(db, runId, "knowledge", row.knowledge_id, "needs_review", "review_due", row, { status: "needs_review" }, now);
|
|
83
|
+
metrics.needsReview += 1;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function reconcileEvidence(db, runId, principalId, now, limit, evidenceThreshold, metrics) {
|
|
87
|
+
const contradicted = db.prepare(`SELECT DISTINCT a.assertion_id, a.status
|
|
88
|
+
FROM user_assertions a
|
|
89
|
+
JOIN user_assertion_slots s ON s.slot_id = a.slot_id
|
|
90
|
+
JOIN user_assertion_evidence ae ON ae.assertion_id = a.assertion_id AND ae.relation = 'contradicts'
|
|
91
|
+
WHERE s.principal_id = ? AND a.status = 'active' LIMIT ?`).all(principalId, limit);
|
|
92
|
+
metrics.scanned += contradicted.length;
|
|
93
|
+
for (const row of contradicted) {
|
|
94
|
+
db.prepare("UPDATE user_assertions SET status = 'needs_review' WHERE assertion_id = ?").run(row.assertion_id);
|
|
95
|
+
db.prepare(`INSERT INTO user_assertion_status_events (
|
|
96
|
+
event_id, assertion_id, from_status, to_status, actor_type, reason, source_run_id, created_at
|
|
97
|
+
) VALUES (?, ?, 'active', 'needs_review', 'maintenance', 'Contradictory evidence exists.', ?, ?)`).run(randomUUID(), row.assertion_id, runId, now);
|
|
98
|
+
addDecision(db, runId, "assertion", row.assertion_id, "needs_review", "contradictory_evidence", row, { status: "needs_review" }, now);
|
|
99
|
+
metrics.needsReview += 1;
|
|
100
|
+
}
|
|
101
|
+
const candidates = db.prepare(`SELECT a.assertion_id, a.status, COUNT(DISTINCT
|
|
102
|
+
e.source_type || ':' || COALESCE(e.source_instance_id, '') || ':' || e.source_ref
|
|
103
|
+
) AS evidence_count
|
|
104
|
+
FROM user_assertions a
|
|
105
|
+
JOIN user_assertion_slots s ON s.slot_id = a.slot_id
|
|
106
|
+
JOIN user_assertion_evidence ae ON ae.assertion_id = a.assertion_id AND ae.relation = 'supports'
|
|
107
|
+
JOIN context_evidence e ON e.evidence_id = ae.evidence_id AND e.trust_level = 'owner'
|
|
108
|
+
WHERE s.principal_id = ? AND a.status = 'candidate'
|
|
109
|
+
AND a.authority IN ('user_observed', 'system_inferred')
|
|
110
|
+
GROUP BY a.assertion_id HAVING evidence_count >= ? LIMIT ?`).all(principalId, evidenceThreshold, limit);
|
|
111
|
+
metrics.scanned += candidates.length;
|
|
112
|
+
for (const row of candidates) {
|
|
113
|
+
db.prepare("UPDATE user_assertions SET status = 'active' WHERE assertion_id = ? AND status = 'candidate'").run(row.assertion_id);
|
|
114
|
+
db.prepare(`INSERT INTO user_assertion_status_events (
|
|
115
|
+
event_id, assertion_id, from_status, to_status, actor_type, reason, source_run_id, created_at
|
|
116
|
+
) VALUES (?, ?, 'candidate', 'active', 'maintenance', 'Independent owner evidence threshold met.', ?, ?)`).run(randomUUID(), row.assertion_id, runId, now);
|
|
117
|
+
addDecision(db, runId, "assertion", row.assertion_id, "activated", "owner_evidence_threshold", row, { status: "active" }, now);
|
|
118
|
+
metrics.activated += 1;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function repairIndexes(db, runId, now, metrics) {
|
|
122
|
+
const assertionMissing = db.prepare(`SELECT COUNT(*) AS count FROM user_assertions a
|
|
123
|
+
LEFT JOIN user_assertions_fts f ON f.assertion_id = a.assertion_id
|
|
124
|
+
WHERE f.assertion_id IS NULL`).get();
|
|
125
|
+
const knowledgeMissing = db.prepare(`SELECT COUNT(*) AS count FROM knowledge_items k
|
|
126
|
+
LEFT JOIN knowledge_items_fts f ON f.knowledge_id = k.knowledge_id
|
|
127
|
+
WHERE f.knowledge_id IS NULL`).get();
|
|
128
|
+
if (assertionMissing.count) db.prepare(`INSERT INTO user_assertions_fts(statement, assertion_id, slot_id)
|
|
129
|
+
SELECT a.statement, a.assertion_id, a.slot_id FROM user_assertions a
|
|
130
|
+
LEFT JOIN user_assertions_fts f ON f.assertion_id = a.assertion_id WHERE f.assertion_id IS NULL`).run();
|
|
131
|
+
if (knowledgeMissing.count) db.prepare(`INSERT INTO knowledge_items_fts(content, knowledge_id)
|
|
132
|
+
SELECT k.content, k.knowledge_id FROM knowledge_items k
|
|
133
|
+
LEFT JOIN knowledge_items_fts f ON f.knowledge_id = k.knowledge_id WHERE f.knowledge_id IS NULL`).run();
|
|
134
|
+
metrics.repairedIndexes = assertionMissing.count + knowledgeMissing.count;
|
|
135
|
+
if (metrics.repairedIndexes) addDecision(db, runId, "index", "fts", "repair", "missing_index_rows", { missing: metrics.repairedIndexes }, { missing: 0 }, now);
|
|
136
|
+
}
|
|
137
|
+
function archiveOldKnowledge(db, runId, principalId, cutoff, now, limit, metrics) {
|
|
138
|
+
const rows = db.prepare(`SELECT knowledge_id, status, updated_at FROM knowledge_items
|
|
139
|
+
WHERE principal_id = ? AND status = 'stale' AND updated_at < ? LIMIT ?`).all(principalId, cutoff, limit);
|
|
140
|
+
metrics.scanned += rows.length;
|
|
141
|
+
for (const row of rows) {
|
|
142
|
+
db.prepare("UPDATE knowledge_items SET status = 'archived', updated_at = ? WHERE knowledge_id = ?").run(now, row.knowledge_id);
|
|
143
|
+
addDecision(db, runId, "knowledge", row.knowledge_id, "archived", "stale_retention_elapsed", row, { status: "archived" }, now);
|
|
144
|
+
metrics.archived += 1;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function runMemoryMaintenance(input) {
|
|
148
|
+
const now = input.now ?? Date.now();
|
|
149
|
+
const principalId = input.principalId ?? "local-owner";
|
|
150
|
+
const limit = Math.max(1, Math.min(1e4, input.limit ?? 1e3));
|
|
151
|
+
const evidenceThreshold = Math.max(2, Math.min(10, input.evidenceThreshold ?? 2));
|
|
152
|
+
const idempotencyKey = input.idempotencyKey ?? `${principalId}:${input.jobType}:${periodKey(input.jobType, now)}`;
|
|
153
|
+
const existing = getSqliteDatabase().prepare(`SELECT run_id, status, metrics_json
|
|
154
|
+
FROM memory_maintenance_runs WHERE idempotency_key = ?`).get(idempotencyKey);
|
|
155
|
+
if (existing && existing.status !== "failed") return {
|
|
156
|
+
runId: existing.run_id,
|
|
157
|
+
jobType: input.jobType,
|
|
158
|
+
status: existing.status,
|
|
159
|
+
skipped: true,
|
|
160
|
+
metrics: JSON.parse(existing.metrics_json)
|
|
161
|
+
};
|
|
162
|
+
const runId = existing?.run_id ?? randomUUID();
|
|
163
|
+
const metrics = emptyMetrics();
|
|
164
|
+
const snapshot = JSON.stringify({
|
|
165
|
+
limit,
|
|
166
|
+
staleRetentionDays: input.staleRetentionDays ?? 30,
|
|
167
|
+
evidenceThreshold
|
|
168
|
+
});
|
|
169
|
+
runSqliteWriteTransaction((db) => {
|
|
170
|
+
if (existing) db.prepare(`UPDATE memory_maintenance_runs SET status = 'running', config_snapshot_json = ?,
|
|
171
|
+
cursor_json = '{}', metrics_json = '{}', error_message = NULL, started_at = ?, finished_at = NULL
|
|
172
|
+
WHERE run_id = ?`).run(snapshot, now, runId);
|
|
173
|
+
else db.prepare(`INSERT INTO memory_maintenance_runs (
|
|
174
|
+
run_id, principal_id, job_type, idempotency_key, algorithm_version,
|
|
175
|
+
config_snapshot_json, status, started_at
|
|
176
|
+
) VALUES (?, ?, ?, ?, ?, ?, 'running', ?)`).run(runId, principalId, input.jobType, idempotencyKey, ALGORITHM_VERSION, snapshot, now);
|
|
177
|
+
});
|
|
178
|
+
try {
|
|
179
|
+
runSqliteWriteTransaction((db) => {
|
|
180
|
+
transitionAssertions(db, runId, now, limit, metrics);
|
|
181
|
+
transitionPriorities(db, runId, principalId, now, limit, metrics);
|
|
182
|
+
transitionKnowledge(db, runId, principalId, now, limit, metrics);
|
|
183
|
+
if (input.jobType === "daily_reconciliation" || input.jobType === "manual_repair") {
|
|
184
|
+
reconcileEvidence(db, runId, principalId, now, limit, evidenceThreshold, metrics);
|
|
185
|
+
repairIndexes(db, runId, now, metrics);
|
|
186
|
+
}
|
|
187
|
+
if (input.jobType === "weekly_knowledge" || input.jobType === "manual_repair") archiveOldKnowledge(db, runId, principalId, now - (input.staleRetentionDays ?? 30) * 24 * 60 * 60 * 1e3, now, limit, metrics);
|
|
188
|
+
db.prepare(`UPDATE memory_maintenance_runs SET status = 'completed', metrics_json = ?, finished_at = ?
|
|
189
|
+
WHERE run_id = ?`).run(JSON.stringify(metrics), now, runId);
|
|
190
|
+
});
|
|
191
|
+
return {
|
|
192
|
+
runId,
|
|
193
|
+
jobType: input.jobType,
|
|
194
|
+
status: "completed",
|
|
195
|
+
skipped: false,
|
|
196
|
+
metrics
|
|
197
|
+
};
|
|
198
|
+
} catch (error) {
|
|
199
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
200
|
+
getSqliteDatabase().prepare(`UPDATE memory_maintenance_runs SET status = 'failed',
|
|
201
|
+
metrics_json = ?, error_message = ?, finished_at = ? WHERE run_id = ?`).run(JSON.stringify(metrics), message, now, runId);
|
|
202
|
+
throw error;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function listMemoryMaintenanceRuns(limit = 20) {
|
|
206
|
+
return getSqliteDatabase().prepare(`SELECT run_id AS runId, principal_id AS principalId,
|
|
207
|
+
job_type AS jobType, idempotency_key AS idempotencyKey, algorithm_version AS algorithmVersion,
|
|
208
|
+
status, metrics_json AS metricsJson, error_message AS errorMessage,
|
|
209
|
+
started_at AS startedAt, finished_at AS finishedAt
|
|
210
|
+
FROM memory_maintenance_runs ORDER BY started_at DESC LIMIT ?`).all(Math.max(1, Math.min(100, limit))).map(({ metricsJson, ...row }) => ({
|
|
211
|
+
...row,
|
|
212
|
+
metrics: typeof metricsJson === "string" ? JSON.parse(metricsJson) : {}
|
|
213
|
+
}));
|
|
214
|
+
}
|
|
215
|
+
//#endregion
|
|
216
|
+
export { listMemoryMaintenanceRuns, runMemoryMaintenance };
|
|
@@ -2,5 +2,5 @@ export { NotesStore } from './store.js';
|
|
|
2
2
|
export { NotesService } from './service.js';
|
|
3
3
|
export { buildNoteAgentContext, buildNoteAgentContextArtifact, getCachedNoteAgentContextArtifact } from './agent-context.js';
|
|
4
4
|
export type { NoteAgentContextArtifact, NoteAgentAttachmentContext } from './agent-context.js';
|
|
5
|
-
export { resolveNotesDir,
|
|
5
|
+
export { resolveNotesDir, resolveNoteMediaDir } from './paths.js';
|
|
6
6
|
export type { Note, NoteKind, NoteStatus, NoteAttachment, NoteAiMeta, NoteAiDeepMeta, NoteIndexEntry, NoteSnapshot, NoteSnapshotEntry, NotesIndexFile, NotesListQuery, CaptureSource, CaptureChannel, CreateNoteParams, SnapshotTrigger, NoteTaskMeta, NoteGroup, } from './types.js';
|
package/dist/src/notes/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveNoteMediaDir, resolveNotesDir } from "./paths.js";
|
|
2
2
|
import { NotesStore } from "./store.js";
|
|
3
3
|
import { buildNoteAgentContext, buildNoteAgentContextArtifact, getCachedNoteAgentContextArtifact } from "./agent-context.js";
|
|
4
4
|
import { NotesService } from "./service.js";
|
|
5
|
-
export { NotesService, NotesStore, buildNoteAgentContext, buildNoteAgentContextArtifact, getCachedNoteAgentContextArtifact,
|
|
5
|
+
export { NotesService, NotesStore, buildNoteAgentContext, buildNoteAgentContextArtifact, getCachedNoteAgentContextArtifact, resolveNoteMediaDir, resolveNotesDir };
|
|
@@ -1,5 +1,2 @@
|
|
|
1
1
|
export declare function resolveNotesDir(): string;
|
|
2
|
-
export declare function resolveNotesIndexPath(): string;
|
|
3
|
-
export declare function resolveNoteItemPath(noteId: string): string;
|
|
4
2
|
export declare function resolveNoteMediaDir(noteId: string): string;
|
|
5
|
-
export declare function resolveNoteHistoryDir(noteId: string): string;
|
package/dist/src/notes/paths.js
CHANGED
|
@@ -5,17 +5,8 @@ init_paths_state();
|
|
|
5
5
|
function resolveNotesDir() {
|
|
6
6
|
return join(resolveStateDir(), "notes");
|
|
7
7
|
}
|
|
8
|
-
function resolveNotesIndexPath() {
|
|
9
|
-
return join(resolveNotesDir(), "index.json");
|
|
10
|
-
}
|
|
11
|
-
function resolveNoteItemPath(noteId) {
|
|
12
|
-
return join(resolveNotesDir(), "items", `${noteId}.json`);
|
|
13
|
-
}
|
|
14
8
|
function resolveNoteMediaDir(noteId) {
|
|
15
9
|
return join(resolveNotesDir(), "media", noteId);
|
|
16
10
|
}
|
|
17
|
-
function resolveNoteHistoryDir(noteId) {
|
|
18
|
-
return join(resolveNotesDir(), "history", noteId);
|
|
19
|
-
}
|
|
20
11
|
//#endregion
|
|
21
|
-
export {
|
|
12
|
+
export { resolveNoteMediaDir, resolveNotesDir };
|
|
@@ -46,6 +46,7 @@ export declare class NotesService {
|
|
|
46
46
|
offset: number;
|
|
47
47
|
hasMore: boolean;
|
|
48
48
|
}>;
|
|
49
|
+
listProjectSummaries(): import("./types.js").NoteProjectSummary[];
|
|
49
50
|
addAttachment(noteId: string, file: {
|
|
50
51
|
name: string;
|
|
51
52
|
buffer: Buffer;
|
|
@@ -63,7 +64,6 @@ export declare class NotesService {
|
|
|
63
64
|
listNoteHistory(noteId: string): Promise<NoteSnapshotEntry[]>;
|
|
64
65
|
getNoteSnapshot(noteId: string, timestamp: number): Promise<NoteSnapshot | null>;
|
|
65
66
|
restoreNoteSnapshot(noteId: string, timestamp: number): Promise<Note | null>;
|
|
66
|
-
flush(): Promise<void>;
|
|
67
67
|
moveToGroup(noteId: string, groupId: string | null): Promise<Note | null>;
|
|
68
68
|
createTask(title: string, source: CaptureSource, opts?: {
|
|
69
69
|
dueAt?: number;
|
|
@@ -2,6 +2,7 @@ import { createLogger } from "../utils/logger/index.js";
|
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
3
|
import { buildNoteAttachmentRef } from "./attachment-ref.js";
|
|
4
4
|
import { parseNoteMarkdown } from "./note-markdown.js";
|
|
5
|
+
import { listNoteProjectSummaries } from "../storage/sqlite/notes-repository.js";
|
|
5
6
|
import { changedFieldsFromPatch, emitActivity, previewText, systemActivityActor, systemActivitySource } from "../activity/emitter.js";
|
|
6
7
|
import { getDefaultModelSync, init_providers, resolveModel } from "../providers/index.js";
|
|
7
8
|
import { completeWithResolvedCredentials } from "../providers/model-call.js";
|
|
@@ -280,6 +281,7 @@ var NotesService = class {
|
|
|
280
281
|
const contentTouched = patch.markdown !== void 0 || patch.title !== void 0;
|
|
281
282
|
if (contentTouched) await this.maybeSaveSnapshot(existing, trigger);
|
|
282
283
|
const normalizedPatch = { ...patch };
|
|
284
|
+
if (contentTouched) normalizedPatch.lastEditTrigger = trigger;
|
|
283
285
|
if (patch.markdown !== void 0) normalizedPatch.kind = patch.kind ?? inferKind(patch.markdown, Boolean(existing.attachments?.length), existing.attachments);
|
|
284
286
|
if (contentTouched || patch.attachments) {
|
|
285
287
|
normalizedPatch.remoteVersion = (existing.remoteVersion ?? 1) + 1;
|
|
@@ -483,6 +485,9 @@ var NotesService = class {
|
|
|
483
485
|
async listNotes(query = {}) {
|
|
484
486
|
return this.store.listNotes(query);
|
|
485
487
|
}
|
|
488
|
+
listProjectSummaries() {
|
|
489
|
+
return listNoteProjectSummaries();
|
|
490
|
+
}
|
|
486
491
|
async addAttachment(noteId, file, idempotencyKey) {
|
|
487
492
|
if (!idempotencyKey) return this.addAttachmentWithId(noteId, file, randomUUID());
|
|
488
493
|
const attachmentId = noteAttachmentId(noteId, idempotencyKey);
|
|
@@ -555,12 +560,10 @@ var NotesService = class {
|
|
|
555
560
|
markdown: snapshot.markdown,
|
|
556
561
|
tags: snapshot.tags,
|
|
557
562
|
kind: snapshot.kind,
|
|
558
|
-
status: snapshot.status
|
|
563
|
+
status: snapshot.status,
|
|
564
|
+
lastEditTrigger: "restore"
|
|
559
565
|
});
|
|
560
566
|
}
|
|
561
|
-
async flush() {
|
|
562
|
-
await this.store.flush();
|
|
563
|
-
}
|
|
564
567
|
async moveToGroup(noteId, groupId) {
|
|
565
568
|
return this.updateNote(noteId, { groupId: groupId ?? void 0 });
|
|
566
569
|
}
|
|
@@ -25,7 +25,5 @@ export declare class NotesStore {
|
|
|
25
25
|
getSnapshot(noteId: string, timestamp: number): Promise<NoteSnapshot | null>;
|
|
26
26
|
pruneSnapshots(noteId: string, maxCount: number): Promise<void>;
|
|
27
27
|
deleteAllSnapshots(noteId: string): Promise<void>;
|
|
28
|
-
/** No-op: SQLite writes are synchronous. Kept for API compatibility with tests. */
|
|
29
|
-
flush(): Promise<void>;
|
|
30
28
|
}
|
|
31
29
|
export { buildNoteIndexMeta };
|
package/dist/src/notes/store.js
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
3
|
import { requireXopcDatabase } from "../storage/sqlite/connection.js";
|
|
4
|
+
import { runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
|
|
4
5
|
import { buildNoteIndexMeta } from "./note-index-meta.js";
|
|
5
6
|
import { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord } from "../storage/sqlite/notes-repository.js";
|
|
6
7
|
import { deleteNoteAgentContextRecord } from "../storage/sqlite/note-agent-context-repository.js";
|
|
7
8
|
import "../storage/sqlite/index.js";
|
|
8
|
-
import {
|
|
9
|
-
import { resolveNoteHistoryDir, resolveNoteMediaDir } from "./paths.js";
|
|
9
|
+
import { resolveNoteMediaDir } from "./paths.js";
|
|
10
10
|
import { join } from "node:path";
|
|
11
11
|
import { randomUUID } from "node:crypto";
|
|
12
|
-
import { mkdir,
|
|
12
|
+
import { mkdir, rm, writeFile } from "node:fs/promises";
|
|
13
13
|
//#region src/notes/store.ts
|
|
14
|
-
init_write_file_atomic();
|
|
15
14
|
init_logger();
|
|
16
15
|
const log = createLogger("NotesStore");
|
|
17
16
|
var NotesStore = class {
|
|
@@ -81,91 +80,45 @@ var NotesStore = class {
|
|
|
81
80
|
});
|
|
82
81
|
}
|
|
83
82
|
async saveSnapshot(note, trigger) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
trigger,
|
|
100
|
-
timestamp: snapshot.timestamp
|
|
101
|
-
}, "Snapshot saved");
|
|
83
|
+
requireXopcDatabase();
|
|
84
|
+
runSqliteWriteTransaction((db) => {
|
|
85
|
+
const row = db.prepare("SELECT MAX(timestamp) AS timestamp FROM note_snapshots WHERE note_id = ?").get(note.id);
|
|
86
|
+
const snapshot = {
|
|
87
|
+
noteId: note.id,
|
|
88
|
+
timestamp: Math.max(Date.now(), (row.timestamp ?? 0) + 1),
|
|
89
|
+
trigger,
|
|
90
|
+
title: note.title,
|
|
91
|
+
markdown: note.markdown,
|
|
92
|
+
tags: note.tags,
|
|
93
|
+
kind: note.kind,
|
|
94
|
+
status: note.status
|
|
95
|
+
};
|
|
96
|
+
db.prepare("INSERT INTO note_snapshots(note_id, timestamp, payload) VALUES (?, ?, ?)").run(note.id, snapshot.timestamp, JSON.stringify(snapshot));
|
|
97
|
+
});
|
|
102
98
|
}
|
|
103
99
|
async listSnapshots(noteId) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
for (const file of files) {
|
|
113
|
-
if (!file.endsWith(".json")) continue;
|
|
114
|
-
const timestamp = parseInt(file.slice(0, -5), 10);
|
|
115
|
-
if (!Number.isFinite(timestamp)) continue;
|
|
116
|
-
try {
|
|
117
|
-
const content = await readFile(join(historyDir, file), "utf-8");
|
|
118
|
-
const snapshot = JSON.parse(content);
|
|
119
|
-
const rawText = snapshot.markdown ?? "";
|
|
120
|
-
entries.push({
|
|
121
|
-
timestamp: snapshot.timestamp,
|
|
122
|
-
trigger: snapshot.trigger,
|
|
123
|
-
snippet: rawText.slice(0, 80) || void 0
|
|
124
|
-
});
|
|
125
|
-
} catch {
|
|
126
|
-
log.debug({
|
|
127
|
-
noteId,
|
|
128
|
-
file
|
|
129
|
-
}, "Skipped unreadable snapshot");
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
entries.sort((a, b) => b.timestamp - a.timestamp);
|
|
133
|
-
return entries;
|
|
100
|
+
return requireXopcDatabase().db.prepare("SELECT payload FROM note_snapshots WHERE note_id = ? ORDER BY timestamp DESC").all(noteId).map((row) => {
|
|
101
|
+
const snapshot = JSON.parse(row.payload);
|
|
102
|
+
return {
|
|
103
|
+
timestamp: snapshot.timestamp,
|
|
104
|
+
trigger: snapshot.trigger,
|
|
105
|
+
snippet: snapshot.markdown?.slice(0, 80) || void 0
|
|
106
|
+
};
|
|
107
|
+
});
|
|
134
108
|
}
|
|
135
109
|
async getSnapshot(noteId, timestamp) {
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
const content = await readFile(filePath, "utf-8");
|
|
139
|
-
return JSON.parse(content);
|
|
140
|
-
} catch {
|
|
141
|
-
return null;
|
|
142
|
-
}
|
|
110
|
+
const row = requireXopcDatabase().db.prepare("SELECT payload FROM note_snapshots WHERE note_id = ? AND timestamp = ?").get(noteId, timestamp);
|
|
111
|
+
return row ? JSON.parse(row.payload) : null;
|
|
143
112
|
}
|
|
144
113
|
async pruneSnapshots(noteId, maxCount) {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
} catch {
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
const jsonFiles = files.filter((f) => f.endsWith(".json")).sort();
|
|
153
|
-
if (jsonFiles.length <= maxCount) return;
|
|
154
|
-
const toDelete = jsonFiles.slice(0, jsonFiles.length - maxCount);
|
|
155
|
-
for (const file of toDelete) await rm(join(historyDir, file), { force: true }).catch(() => void 0);
|
|
156
|
-
log.debug({
|
|
157
|
-
noteId,
|
|
158
|
-
deleted: toDelete.length
|
|
159
|
-
}, "Pruned old snapshots");
|
|
114
|
+
if (!Number.isSafeInteger(maxCount) || maxCount < 0) throw new Error("Invalid snapshot retention count");
|
|
115
|
+
requireXopcDatabase().db.prepare(`DELETE FROM note_snapshots WHERE note_id = ? AND timestamp NOT IN (
|
|
116
|
+
SELECT timestamp FROM note_snapshots WHERE note_id = ? ORDER BY timestamp DESC LIMIT ?
|
|
117
|
+
)`).run(noteId, noteId, maxCount);
|
|
160
118
|
}
|
|
161
119
|
async deleteAllSnapshots(noteId) {
|
|
162
|
-
|
|
163
|
-
recursive: true,
|
|
164
|
-
force: true
|
|
165
|
-
}).catch(() => void 0);
|
|
120
|
+
requireXopcDatabase().db.prepare("DELETE FROM note_snapshots WHERE note_id = ?").run(noteId);
|
|
166
121
|
}
|
|
167
|
-
/** No-op: SQLite writes are synchronous. Kept for API compatibility with tests. */
|
|
168
|
-
async flush() {}
|
|
169
122
|
};
|
|
170
123
|
//#endregion
|
|
171
124
|
export { NotesStore, buildNoteIndexMeta };
|
|
@@ -113,6 +113,8 @@ export interface Note {
|
|
|
113
113
|
status: NoteStatus;
|
|
114
114
|
/** Canonical note body. Markdown is the only content truth. */
|
|
115
115
|
markdown: string;
|
|
116
|
+
/** Provenance of the latest content edit, independent of snapshot throttling. */
|
|
117
|
+
lastEditTrigger?: SnapshotTrigger;
|
|
116
118
|
attachments?: NoteAttachment[];
|
|
117
119
|
createdAt: number;
|
|
118
120
|
updatedAt: number;
|
|
@@ -149,6 +151,18 @@ export interface NoteIndexEntry {
|
|
|
149
151
|
taskCount?: number;
|
|
150
152
|
uncheckedTaskCount?: number;
|
|
151
153
|
linkCount?: number;
|
|
154
|
+
projects?: Array<{
|
|
155
|
+
id: string;
|
|
156
|
+
name: string;
|
|
157
|
+
}>;
|
|
158
|
+
lastEditTrigger?: SnapshotTrigger;
|
|
159
|
+
}
|
|
160
|
+
export interface NoteProjectSummary {
|
|
161
|
+
id: string;
|
|
162
|
+
name: string;
|
|
163
|
+
description?: string;
|
|
164
|
+
noteCount: number;
|
|
165
|
+
updatedAt?: number;
|
|
152
166
|
}
|
|
153
167
|
export interface NotesIndexFile {
|
|
154
168
|
version: number;
|
|
@@ -175,6 +189,8 @@ export interface NotesListQuery {
|
|
|
175
189
|
kind?: NoteKind;
|
|
176
190
|
tag?: string;
|
|
177
191
|
projectId?: string;
|
|
192
|
+
unassigned?: boolean;
|
|
193
|
+
agentEdited?: boolean;
|
|
178
194
|
pinned?: boolean;
|
|
179
195
|
search?: string;
|
|
180
196
|
limit?: number;
|
|
@@ -15,8 +15,8 @@ export declare class InternalObjectContextProvider implements ContextProvider {
|
|
|
15
15
|
supports(): boolean;
|
|
16
16
|
collect(input: ContextInput): Promise<ResolvedContext>;
|
|
17
17
|
}
|
|
18
|
-
export declare class
|
|
19
|
-
readonly id = "
|
|
18
|
+
export declare class UserModelContextProvider implements ContextProvider {
|
|
19
|
+
readonly id = "user_model";
|
|
20
20
|
supports(): boolean;
|
|
21
21
|
collect(input: ContextInput): Promise<ResolvedContext>;
|
|
22
22
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { getSqliteDatabase } from "../../storage/sqlite/transaction.js";
|
|
2
|
-
import { listUnderstandings } from "../../storage/sqlite/user-context-repository.js";
|
|
3
2
|
import { getKnowledgeSourceItem } from "../../storage/sqlite/knowledge-repository.js";
|
|
4
3
|
import { getConnectorSyncPolicyForConnection } from "../../storage/sqlite/connector-sync-policy-repository.js";
|
|
4
|
+
import { getAssertionSlot, listUserAssertions } from "../../user-model/repository.js";
|
|
5
|
+
import "../../user-model/index.js";
|
|
5
6
|
import { wrapExternalContent } from "../../gateway/security/external-content.js";
|
|
6
7
|
//#region src/proactive/execution/context.ts
|
|
7
8
|
const MAX_EVENT_COUNT = 50;
|
|
@@ -154,28 +155,32 @@ var InternalObjectContextProvider = class {
|
|
|
154
155
|
};
|
|
155
156
|
}
|
|
156
157
|
};
|
|
157
|
-
var
|
|
158
|
-
id = "
|
|
158
|
+
var UserModelContextProvider = class {
|
|
159
|
+
id = "user_model";
|
|
159
160
|
supports() {
|
|
160
161
|
return true;
|
|
161
162
|
}
|
|
162
163
|
async collect(input) {
|
|
163
164
|
const scope = eventRows(input.eventIds).at(-1);
|
|
164
165
|
if (!scope) return emptyContext();
|
|
165
|
-
const records =
|
|
166
|
+
const records = listUserAssertions({
|
|
167
|
+
statuses: ["active"],
|
|
168
|
+
limit: 500
|
|
169
|
+
}).filter((record) => {
|
|
166
170
|
const now = Date.now();
|
|
167
|
-
const
|
|
168
|
-
|
|
171
|
+
const assertionScope = getAssertionSlot(record.slotId)?.scope;
|
|
172
|
+
const scopeMatches = assertionScope?.type === "global" || assertionScope?.type === "workspace" && assertionScope.id === scope.workspace_id || assertionScope?.type === "project" && assertionScope.id === scope.project_id || assertionScope?.type === "agent" && assertionScope.id === scope.agent_id;
|
|
173
|
+
return record.disclosurePolicy === "referenceable" && record.sensitivity !== "secret" && record.sensitivity !== "regulated" && scopeMatches && (!record.validFrom || record.validFrom <= now) && (!record.validTo || record.validTo >= now) && (record.authority === "user_explicit" || record.confidence >= .7);
|
|
169
174
|
}).slice(0, 20);
|
|
170
175
|
return {
|
|
171
176
|
content: { records: records.map((record) => ({
|
|
172
|
-
evidenceId: `
|
|
177
|
+
evidenceId: `assertion:${record.id}`,
|
|
173
178
|
kind: record.kind,
|
|
174
179
|
content: boundedText(record.statement, 1e3),
|
|
175
180
|
confidence: record.confidence,
|
|
176
|
-
|
|
181
|
+
recordedAt: record.recordedAt
|
|
177
182
|
})) },
|
|
178
|
-
evidenceIds: records.map((record) => `
|
|
183
|
+
evidenceIds: records.map((record) => `assertion:${record.id}`)
|
|
179
184
|
};
|
|
180
185
|
}
|
|
181
186
|
};
|
|
@@ -295,7 +300,7 @@ var ContextProviderRegistry = class {
|
|
|
295
300
|
new EventBatchContextProvider(),
|
|
296
301
|
new ConnectedSourceContextProvider(),
|
|
297
302
|
new InternalObjectContextProvider(),
|
|
298
|
-
new
|
|
303
|
+
new UserModelContextProvider(),
|
|
299
304
|
new MeetingWorkspaceContextProvider(),
|
|
300
305
|
new ProjectStateContextProvider(),
|
|
301
306
|
new AutomationStateContextProvider()
|
|
@@ -315,4 +320,4 @@ var ContextProviderRegistry = class {
|
|
|
315
320
|
}
|
|
316
321
|
};
|
|
317
322
|
//#endregion
|
|
318
|
-
export { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProjectStateContextProvider,
|
|
323
|
+
export { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProjectStateContextProvider, UserModelContextProvider };
|
|
@@ -8,7 +8,7 @@ export type { SignalBatch } from './routing/batch-repository.js';
|
|
|
8
8
|
export { ProactiveEventService } from './service.js';
|
|
9
9
|
export { ProactiveScenarioService } from './scenarios/service.js';
|
|
10
10
|
export type { PromptRevision, ScenarioDefinition, ScenarioSubscription } from './scenarios/types.js';
|
|
11
|
-
export { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProjectStateContextProvider,
|
|
11
|
+
export { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProjectStateContextProvider, UserModelContextProvider, } from './execution/context.js';
|
|
12
12
|
export { ReadonlyProactiveAgentExecutor } from './execution/agent-executor.js';
|
|
13
13
|
export { listInsights } from './execution/repository.js';
|
|
14
14
|
export { ProactiveWorker } from './execution/worker.js';
|
|
@@ -3,11 +3,11 @@ import { normalizeEventEnvelope } from "./events/envelope.js";
|
|
|
3
3
|
import { mapProductEventToProactive } from "./events/product-event-bridge.js";
|
|
4
4
|
import { matchScenario, matchesCondition } from "./routing/matcher.js";
|
|
5
5
|
import { ProactiveEventService } from "./service.js";
|
|
6
|
-
import { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProjectStateContextProvider,
|
|
6
|
+
import { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProjectStateContextProvider, UserModelContextProvider } from "./execution/context.js";
|
|
7
7
|
import { ReadonlyProactiveAgentExecutor } from "./execution/agent-executor.js";
|
|
8
8
|
import { listInsights } from "./execution/repository.js";
|
|
9
9
|
import { ProactiveWorker } from "./execution/worker.js";
|
|
10
10
|
import { ProactiveTemporalWorker } from "./temporal/worker.js";
|
|
11
11
|
import { ProactiveInboxService } from "./inbox/service.js";
|
|
12
12
|
import { ProactiveInboxWorker } from "./inbox/worker.js";
|
|
13
|
-
export { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProactiveEventService, ProactiveInboxService, ProactiveInboxWorker, ProactiveScenarioService, ProactiveTemporalWorker, ProactiveWorker, ProjectStateContextProvider, ReadonlyProactiveAgentExecutor,
|
|
13
|
+
export { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProactiveEventService, ProactiveInboxService, ProactiveInboxWorker, ProactiveScenarioService, ProactiveTemporalWorker, ProactiveWorker, ProjectStateContextProvider, ReadonlyProactiveAgentExecutor, UserModelContextProvider, listInsights, mapProductEventToProactive, matchScenario, matchesCondition, normalizeEventEnvelope };
|