@xopcai/xopc 0.0.144 → 0.0.145
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/feishu/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
- package/dist/extensions/telegram/src/inbound-processor.js +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +1 -1
- package/dist/gateway/static/root/assets/Combination-DolwnuKi.js +41 -0
- package/dist/gateway/static/root/assets/{activity-center-store-jITiX2vJ.js → activity-center-store-3l9ahUqb.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-EAVnrCAs.js → agent-avatar-dicebear-BEUxdhZx.js} +1 -1
- package/dist/gateway/static/root/assets/agents-1bpT0xRO.js +2 -0
- package/dist/gateway/static/root/assets/app-management-settings-panel-CRHSZJWi.js +1 -0
- package/dist/gateway/static/root/assets/{appearance-settings-DSkm9bp_.js → appearance-settings-BunADYJb.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-Cc4JgVUQ.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-C99N0vV6.js → archive-plugin-B6vTkH2A.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-CHTDqME5.js → attachment-load-BjZXzaNv.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-suggestion-card-CBt6U3-S.js → automation-suggestion-card-ZDA-Stg1.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-mb0fdVpq.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-BRtxOLlM.js → binary-plugins-DYZfLvPz.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-CUlXfgXd.js → block-editor-C3MUlYC9.js} +46 -46
- package/dist/gateway/static/root/assets/browser-settings-page-Bb0xhaMN.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-BV76yN9a.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CUcGKZqC.js +2 -0
- package/dist/gateway/static/root/assets/channel-recipient-api-fTlTnWB4.js +1 -0
- package/dist/gateway/static/root/assets/channels-settings-BlSDMGdy.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-CJauF1CW.js +1 -0
- package/dist/gateway/static/root/assets/{code-editor--tMO38Tr.js → code-editor-D4_k-6QN.js} +1 -1
- package/dist/gateway/static/root/assets/connector-logo-BVFNT2zW.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-CMgAFGvb.js +2 -0
- package/dist/gateway/static/root/assets/copy-to-clipboard-HOJ79TWv.js +1 -0
- package/dist/gateway/static/root/assets/{desktop-pet-C-Drhqyk.js → desktop-pet-_jUmoXd3.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-CRGiolqF.js → desktop-pet-settings-DwGOy4AQ.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-Dw1L3M84.js → directory-picker-path-field-akvF0F-u.js} +1 -1
- package/dist/gateway/static/root/assets/{dist-SwiI0Xu3.js → dist-C99RGfAH.js} +1 -1
- package/dist/gateway/static/root/assets/dreaming-settings-BLetQiYY.js +3 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-Dcl8LJG_.js → extension-debug-page-Cof2ncxE.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-i_BXmO_x.js → extension-page-CwWktRNz.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-CuggWOIl.js +1 -0
- package/dist/gateway/static/root/assets/gateway-config-api-B7sxIbza.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-DIv0eKMf.js +1 -0
- package/dist/gateway/static/root/assets/gateway-startup-retry-DtoLihQE.js +1 -0
- package/dist/gateway/static/root/assets/goal-create-dialog-C4Kw0mfS.js +1 -0
- package/dist/gateway/static/root/assets/goal-detail-page-BMmzYpZL.js +4 -0
- package/dist/gateway/static/root/assets/goals-config-api-B0jm5JaA.js +1 -0
- package/dist/gateway/static/root/assets/goals-page-CGeT77PC.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-N5_iL7es.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-settings-XzH3lbRR.js +1 -0
- package/dist/gateway/static/root/assets/{html-workspace-editor-COqmtESs.js → html-workspace-editor-C3DKAkMc.js} +1 -1
- package/dist/gateway/static/root/assets/index-CSLF84-Q.css +1 -0
- package/dist/gateway/static/root/assets/index-I-ZCenVw.js +259 -0
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-x_v0nrIi.js +1 -0
- package/dist/gateway/static/root/assets/locale-store-CiM-D9jA.js +1 -0
- package/dist/gateway/static/root/assets/logs-page-BSh1t8cD.js +7 -0
- package/dist/gateway/static/root/assets/markdown-editor-BvUebh3C.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-split-BTRFTK0w.js → markdown-split-5rJx5flj.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-BABfIZPU.js → media-plugins-DYXccwAd.js} +1 -1
- package/dist/gateway/static/root/assets/messages-Cb1VMeqP.js +5 -0
- package/dist/gateway/static/root/assets/models-hub-panel-BNpTenAI.js +2 -0
- package/dist/gateway/static/root/assets/{notes-page-88QBHW9a.js → notes-page-BgLyndCO.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-teklkhcE.js +4 -0
- package/dist/gateway/static/root/assets/{page-tabs-je95DZOf.js → page-tabs-6Al9_sGz.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-BJbwi7Rc.js → preview-open-alternatives-Cm3G72Hv.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-CCB_dKoh.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-VOAFAHYj.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-USYu64Ru.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-qWMQ9mod.js → save-bar-controls-BYtfzu_F.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-kxd270Gs.js → schedule-field-CvIRc6yK.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-DLnD-MuD.js → schema-form-CQuKx0n7.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-oGC8O5h_.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-D4rP66R1.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-DQprvu5J.js → settings-collapsible-section-CF3HHM-t.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-Cqq7Y98y.js → settings-form-section-CwWjoRN6.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-b6rXULL5.js → settings-loading-skeleton-aUFmJa13.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-BtBVz3cX.js → settings-page-B2UUU9TF.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-BNJbtklV.js → settings-page-layout-DqpbTWqI.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Ck9keROI.js +1 -0
- package/dist/gateway/static/root/assets/share-preview-page-BOhlPsS1.js +2 -0
- package/dist/gateway/static/root/assets/shares-settings-BYLsCuqj.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-BNHUyVML.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-CpXbQH4n.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-Cq9J7i7v.js → system-settings-panel-CWxSvuwD.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-Bt6vAkSB.js → theme-store-C9Dxcppm.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-CdSwi1gT.js → typed-models-lib-qROAvqTw.js} +1 -1
- package/dist/gateway/static/root/assets/use-channel-catalog-DE9cpn4G.js +1 -0
- package/dist/gateway/static/root/assets/user-context-page-DbNEK4Yp.js +1 -0
- package/dist/gateway/static/root/assets/user-profile-fields-editor-CWxc0ghP.js +1 -0
- package/dist/gateway/static/root/assets/{user-profile-settings-panel-B8hlamVB.js → user-profile-settings-panel-DW-Up6vt.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-Dx01V8qF.js → utils-D53uRXVr.js} +1 -1
- package/dist/gateway/static/root/assets/{vendor-codemirror-C1WKjCk5.js → vendor-codemirror--gTq3YAI.js} +17 -17
- package/dist/gateway/static/root/assets/voice-api-key-field-Cs7MOrg0.js +1 -0
- package/dist/gateway/static/root/assets/work-item-detail-page-D1ziG1Pp.js +1 -0
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-D_x9ELJp.js +3 -0
- package/dist/gateway/static/root/assets/workflows-page-DHGV_n6i.js +11 -0
- package/dist/gateway/static/root/index.html +10 -10
- package/dist/package.js +1 -1
- package/dist/src/activity/emitter.js +1 -1
- package/dist/src/agent/agent-manager.js +4 -4
- package/dist/src/agent/code-intelligence/binary.js +1 -1
- package/dist/src/agent/context/project-context.js +2 -2
- package/dist/src/agent/context/workspace-seed.js +2 -2
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/embedded/session-runner.js +3 -3
- package/dist/src/agent/embedded/session-runner.js.map +1 -1
- package/dist/src/agent/embedded/xopc-auth-storage.d.ts +3 -1
- package/dist/src/agent/embedded/xopc-auth-storage.js +11 -1
- package/dist/src/agent/embedded/xopc-auth-storage.js.map +1 -1
- package/dist/src/agent/goals/post-turn.js +2 -2
- package/dist/src/agent/ipc/bus.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
- package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +1 -1
- package/dist/src/agent/memory/dreaming/config.js +1 -1
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
- package/dist/src/agent/service.js +3 -3
- package/dist/src/agent/session/session-inspector.js +2 -2
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/tools/composio-tool.js +1 -1
- package/dist/src/agent/tools/goal-tool.js +2 -2
- package/dist/src/agent/tools/workflow-tool.js +1 -1
- package/dist/src/agent/tools/xopc-use-tool.js +1 -1
- package/dist/src/agent/workspace-runtime/registry.js +2 -2
- package/dist/src/agent-runtime/index.js +1 -1
- package/dist/src/agent-runtime/runtime-profile.js +1 -1
- package/dist/src/automations/api/routes.js +1 -1
- package/dist/src/automations/service/action-executor.js +2 -2
- package/dist/src/browser/cdp-local-launcher.js +1 -1
- package/dist/src/browser/providers/browser-ext-install.js +3 -3
- package/dist/src/browser/providers/cloakbrowser.js +2 -2
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/capabilities/store-connector.js +1 -1
- package/dist/src/chat-commands/agent-edit.js +1 -1
- package/dist/src/chat-commands/builtins/config.js +1 -1
- package/dist/src/chat-commands/builtins/goal.js +2 -2
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/cli/commands/agent.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +2 -2
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +1 -1
- package/dist/src/cli/commands/extension-pack.js +1 -1
- package/dist/src/cli/commands/goal.js +2 -2
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/cli/commands/project.js +3 -3
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/loader.js +1 -1
- package/dist/src/config/models-json.js +1 -1
- package/dist/src/config/schema.d.ts +60 -5
- package/dist/src/config/schema.js +30 -9
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/connectors/composio-catalog.js +11 -2
- package/dist/src/connectors/composio-catalog.js.map +1 -1
- package/dist/src/connectors/composio-sessions.js +1 -1
- package/dist/src/connectors/composio.js +1 -1
- package/dist/src/connectors/connector-memory-sync.js +135 -26
- package/dist/src/connectors/connector-memory-sync.js.map +1 -1
- package/dist/src/daemon/launchd.js +1 -1
- package/dist/src/daemon/systemd.js +1 -1
- package/dist/src/extensions/discover-extensions.js +1 -1
- package/dist/src/extensions/loader.js +2 -2
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/app.js +1 -1
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +11 -0
- package/dist/src/gateway/hono/lib/config-payload.js +1 -0
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/lib/static-ui.js +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +6 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
- package/dist/src/gateway/hono/routes/home.js +2 -2
- package/dist/src/gateway/hono/routes/memory.js +13 -3
- package/dist/src/gateway/hono/routes/memory.js.map +1 -1
- package/dist/src/gateway/hono/routes/projects.js +5 -5
- package/dist/src/gateway/hono/routes/status.js +3 -0
- package/dist/src/gateway/hono/routes/status.js.map +1 -1
- package/dist/src/gateway/hono/routes/voice.d.ts +5 -5
- package/dist/src/gateway/hono/routes/voice.js +288 -62
- package/dist/src/gateway/hono/routes/voice.js.map +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +1 -1
- package/dist/src/gateway/hono/routes/you.js +11 -7
- package/dist/src/gateway/hono/routes/you.js.map +1 -1
- package/dist/src/gateway/lock.js +1 -1
- package/dist/src/gateway/ports.js +1 -1
- package/dist/src/gateway/service.d.ts +8 -0
- package/dist/src/gateway/service.js +47 -17
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/goals/goal-workflow-judge.js +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/infra/ports.js +1 -1
- package/dist/src/infra/ssh-tunnel.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/knowledge/connected-knowledge-pipeline.d.ts +21 -0
- package/dist/src/knowledge/connected-knowledge-pipeline.js +267 -0
- package/dist/src/knowledge/connected-knowledge-pipeline.js.map +1 -0
- package/dist/src/knowledge/coordinator.d.ts +10 -0
- package/dist/src/knowledge/coordinator.js +52 -0
- package/dist/src/knowledge/coordinator.js.map +1 -0
- package/dist/src/knowledge/index.d.ts +2 -0
- package/dist/src/knowledge/index.js +3 -1
- package/dist/src/knowledge/ingestion-service.d.ts +7 -1
- package/dist/src/knowledge/ingestion-service.js +28 -0
- package/dist/src/knowledge/ingestion-service.js.map +1 -1
- package/dist/src/knowledge/types.d.ts +18 -0
- package/dist/src/media-understanding/audio-transcription-runner.js +5 -3
- package/dist/src/media-understanding/audio-transcription-runner.js.map +1 -1
- package/dist/src/media-understanding/runner.js +8 -3
- package/dist/src/media-understanding/runner.js.map +1 -1
- package/dist/src/media-understanding/types.d.ts +7 -0
- package/dist/src/migrations/runner.js +1 -1
- package/dist/src/notes/service.js +3 -3
- package/dist/src/notes/store.js +1 -1
- package/dist/src/projects/project-service.js +1 -1
- package/dist/src/projects/workspace.js +1 -1
- package/dist/src/routing/agent-session-key.js +1 -1
- package/dist/src/routing/resolve-route.js +1 -1
- package/dist/src/routing/resolve-tui-session-key.js +1 -1
- package/dist/src/session/init-session-turn.js +1 -1
- package/dist/src/session/resolve-session.js +1 -1
- package/dist/src/session/session-title.js +2 -2
- package/dist/src/session/store.js +1 -1
- package/dist/src/storage/sqlite/connection.js +1 -1
- package/dist/src/storage/sqlite/index.d.ts +1 -1
- package/dist/src/storage/sqlite/index.js +2 -2
- package/dist/src/storage/sqlite/knowledge-repository.d.ts +26 -1
- package/dist/src/storage/sqlite/knowledge-repository.js +120 -6
- package/dist/src/storage/sqlite/knowledge-repository.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/037_connected_knowledge_pipeline.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.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/row-mappers.js +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/tui/backends/embedded-backend.js +4 -4
- package/dist/src/tui/clipboard-image.js +1 -1
- package/dist/src/tui/tui-command-formatters.js +2 -2
- package/dist/src/tui/tui-commands.js +3 -3
- package/dist/src/tui/tui.js +1 -1
- package/dist/src/user-context/projection.d.ts +13 -4
- package/dist/src/user-context/projection.js +19 -7
- package/dist/src/user-context/projection.js.map +1 -1
- package/dist/src/utils/index.js +1 -1
- package/dist/src/utils/logger/index.js +1 -1
- package/dist/src/utils/logger.js +1 -1
- package/dist/src/voice/language-profile.d.ts +20 -0
- package/dist/src/voice/language-profile.js +156 -0
- package/dist/src/voice/language-profile.js.map +1 -0
- package/dist/src/voice/local/model-files.d.ts +14 -0
- package/dist/src/voice/local/model-files.js +94 -0
- package/dist/src/voice/local/model-files.js.map +1 -0
- package/dist/src/voice/local/model-manager.d.ts +18 -0
- package/dist/src/voice/local/model-manager.js +135 -0
- package/dist/src/voice/local/model-manager.js.map +1 -0
- package/dist/src/voice/local/models.d.ts +28 -0
- package/dist/src/voice/local/models.js +101 -0
- package/dist/src/voice/local/models.js.map +1 -0
- package/dist/src/voice/local/runtime-client.d.ts +26 -0
- package/dist/src/voice/local/runtime-client.js +166 -0
- package/dist/src/voice/local/runtime-client.js.map +1 -0
- package/dist/src/voice/local/runtime-dispatcher.d.ts +9 -0
- package/dist/src/voice/local/runtime-dispatcher.js +22 -0
- package/dist/src/voice/local/runtime-dispatcher.js.map +1 -0
- package/dist/src/voice/local/runtime-worker.d.ts +1 -0
- package/dist/src/voice/local/runtime-worker.js +249 -0
- package/dist/src/voice/local/runtime-worker.js.map +1 -0
- package/dist/src/voice/local/wav.d.ts +6 -0
- package/dist/src/voice/local/wav.js +69 -0
- package/dist/src/voice/local/wav.js.map +1 -0
- package/dist/src/voice/metadata/builtin.js +46 -0
- package/dist/src/voice/metadata/builtin.js.map +1 -1
- package/dist/src/voice/stt/factory.js +8 -2
- package/dist/src/voice/stt/factory.js.map +1 -1
- package/dist/src/voice/stt/providers/alibaba-transcription.js +14 -8
- package/dist/src/voice/stt/providers/alibaba-transcription.js.map +1 -1
- package/dist/src/voice/stt/providers/index.d.ts +1 -0
- package/dist/src/voice/stt/providers/index.js +2 -1
- package/dist/src/voice/stt/providers/local-transcription.d.ts +2 -0
- package/dist/src/voice/stt/providers/local-transcription.js +51 -0
- package/dist/src/voice/stt/providers/local-transcription.js.map +1 -0
- package/dist/src/voice/stt/providers/openai-transcription.js +5 -3
- package/dist/src/voice/stt/providers/openai-transcription.js.map +1 -1
- package/dist/src/voice/stt/transcribe-core.js +5 -4
- package/dist/src/voice/stt/transcribe-core.js.map +1 -1
- package/dist/src/voice/stt/types.d.ts +4 -0
- package/dist/src/voice/stt/types.js +5 -4
- package/dist/src/voice/stt/types.js.map +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +2 -2
- package/dist/src/voice/tts/providers/edge-speech.js.map +1 -1
- package/dist/src/voice/tts/types.js +3 -3
- package/dist/src/voice/tts/types.js.map +1 -1
- package/dist/src/work-items/work-item-service.js +1 -1
- package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +3 -3
- package/package.json +3 -1
- package/dist/gateway/static/root/assets/Combination-HAlzriaz.js +0 -41
- package/dist/gateway/static/root/assets/agents-5rTuJOtT.js +0 -2
- package/dist/gateway/static/root/assets/app-management-settings-panel-Bu568NpC.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-DWetalKp.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-ICUfxeOz.js +0 -4
- package/dist/gateway/static/root/assets/browser-settings-page-D7Bj4MKi.js +0 -8
- package/dist/gateway/static/root/assets/capability-presets-api-Bg1ntFSD.js +0 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-C-8I-Ktn.js +0 -2
- package/dist/gateway/static/root/assets/channel-recipient-api-DuulnhIj.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-Dm5EqQyK.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-B5lVrUsN.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-BOzjh-OK.js +0 -2
- package/dist/gateway/static/root/assets/dreaming-settings-CF21cbjo.js +0 -3
- package/dist/gateway/static/root/assets/extension-settings-page-CWIi7xsn.js +0 -1
- package/dist/gateway/static/root/assets/fetch-8QNN25Sh.js +0 -1
- package/dist/gateway/static/root/assets/gateway-config-api-2sLP2kkA.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-DMHiZc-2.js +0 -1
- package/dist/gateway/static/root/assets/gateway-startup-retry-5YBnS9Fj.js +0 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-CAODVDiA.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-_d4DjmeX.js +0 -4
- package/dist/gateway/static/root/assets/goals-config-api-B4qeLKQS.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-lgsop664.js +0 -2
- package/dist/gateway/static/root/assets/goals-settings-Dx_1ZNgb.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-DeTseEk_.js +0 -1
- package/dist/gateway/static/root/assets/index-CphxClbs.css +0 -1
- package/dist/gateway/static/root/assets/index-VWvztcst.js +0 -257
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-BpwpMmlk.js +0 -1
- package/dist/gateway/static/root/assets/locale-store-Ba72bFmP.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-9_hbTg3j.js +0 -7
- package/dist/gateway/static/root/assets/markdown-editor-jD1LPiP-.js +0 -2
- package/dist/gateway/static/root/assets/messages-CzKxM6I4.js +0 -5
- package/dist/gateway/static/root/assets/models-hub-panel-B1CUvZxh.js +0 -2
- package/dist/gateway/static/root/assets/notes-workbench-CerZOeLW.js +0 -2
- package/dist/gateway/static/root/assets/project-detail-page-BmrApldl.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-tTn-k76N.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-DeA2-pOi.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-D4kvvcL1.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-CI1OG4gq.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-cmclUJzS.js +0 -1
- package/dist/gateway/static/root/assets/share-preview-page--zO-A1W1.js +0 -2
- package/dist/gateway/static/root/assets/shares-settings-DNJvqA67.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DWr_0Xgn.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-DEGsTbJx.js +0 -2
- package/dist/gateway/static/root/assets/use-channel-catalog-COXIfXcl.js +0 -1
- package/dist/gateway/static/root/assets/user-context-page-C-V73ZaJ.js +0 -1
- package/dist/gateway/static/root/assets/user-profile-fields-editor-B1cxoGkh.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DGpIUelZ.js +0 -1
- package/dist/gateway/static/root/assets/work-item-detail-page-fzWTxF26.js +0 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-Dt_x8LGg.js +0 -3
- package/dist/gateway/static/root/assets/workflows-page-Bg02zEUh.js +0 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge-repository.js","names":[],"sources":["../../../../src/storage/sqlite/knowledge-repository.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type {\n KnowledgeSourceItem,\n KnowledgeSourceItemInput,\n KnowledgeSyncRun,\n KnowledgeSyncRunStatus,\n KnowledgeSynthesisStatus,\n} from '../../knowledge/types.js';\nimport type { MemoryEvidence, MemoryEvidenceRelation } from '../../agent/memory/types.js';\nimport { getSqliteDatabase, runSqliteWriteTransaction } from './transaction.js';\n\ntype KnowledgeSourceItemRow = {\n item_id: string;\n source_instance_id: string;\n external_id: string;\n item_type: string;\n author_role: string | null;\n occurred_at: number | null;\n source_updated_at: number | null;\n content_hash: string;\n normalized_text: string | null;\n payload_ref: string | null;\n metadata_json: string;\n sensitivity: string;\n retention_class: string;\n synthesis_status: string;\n deleted_at: number | null;\n created_at: number;\n updated_at: number;\n};\n\ntype KnowledgeSyncRunRow = {\n run_id: string;\n source_instance_id: string;\n status: string;\n cursor_before: string | null;\n cursor_after: string | null;\n items_seen: number;\n items_created: number;\n items_updated: number;\n warnings_json: string;\n error: string | null;\n started_at: number;\n finished_at: number | null;\n};\n\ntype MemoryEvidenceRow = {\n evidence_id: string;\n record_id: string;\n source_item_id: string | null;\n relation: string;\n excerpt: string | null;\n confidence: number | null;\n observed_at: number | null;\n created_at: number;\n};\n\nfunction parseTimestamp(value: string | undefined): number | null {\n if (!value) return null;\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction timestampToIso(value: number | null): string | undefined {\n return value == null ? undefined : new Date(value).toISOString();\n}\n\nfunction parseRecord(json: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(json) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : {};\n } catch {\n return {};\n }\n}\n\nfunction parseStrings(json: string): string[] {\n try {\n const parsed = JSON.parse(json) as unknown;\n return Array.isArray(parsed) ? parsed.filter((item): item is string => typeof item === 'string') : [];\n } catch {\n return [];\n }\n}\n\nfunction sourceItemFromRow(row: KnowledgeSourceItemRow): KnowledgeSourceItem {\n return {\n id: row.item_id,\n sourceInstanceId: row.source_instance_id,\n externalId: row.external_id,\n itemType: row.item_type,\n ...(row.author_role ? { authorRole: row.author_role as KnowledgeSourceItem['authorRole'] } : {}),\n ...(timestampToIso(row.occurred_at) ? { occurredAt: timestampToIso(row.occurred_at) } : {}),\n ...(timestampToIso(row.source_updated_at) ? { sourceUpdatedAt: timestampToIso(row.source_updated_at) } : {}),\n contentHash: row.content_hash,\n ...(row.normalized_text ? { normalizedText: row.normalized_text } : {}),\n ...(row.payload_ref ? { payloadRef: row.payload_ref } : {}),\n metadata: parseRecord(row.metadata_json),\n sensitivity: row.sensitivity as KnowledgeSourceItem['sensitivity'],\n retentionClass: row.retention_class as KnowledgeSourceItem['retentionClass'],\n synthesisStatus: row.synthesis_status as KnowledgeSourceItem['synthesisStatus'],\n ...(timestampToIso(row.deleted_at) ? { deletedAt: timestampToIso(row.deleted_at) } : {}),\n createdAt: new Date(row.created_at).toISOString(),\n updatedAt: new Date(row.updated_at).toISOString(),\n };\n}\n\nfunction syncRunFromRow(row: KnowledgeSyncRunRow): KnowledgeSyncRun {\n return {\n id: row.run_id,\n sourceInstanceId: row.source_instance_id,\n status: row.status as KnowledgeSyncRunStatus,\n ...(row.cursor_before ? { cursorBefore: row.cursor_before } : {}),\n ...(row.cursor_after ? { cursorAfter: row.cursor_after } : {}),\n itemsSeen: row.items_seen,\n itemsCreated: row.items_created,\n itemsUpdated: row.items_updated,\n warnings: parseStrings(row.warnings_json),\n ...(row.error ? { error: row.error } : {}),\n startedAt: new Date(row.started_at).toISOString(),\n ...(timestampToIso(row.finished_at) ? { finishedAt: timestampToIso(row.finished_at) } : {}),\n };\n}\n\nexport function startKnowledgeSyncRun(input: {\n sourceInstanceId: string;\n cursorBefore?: string;\n nowMs?: number;\n}): KnowledgeSyncRun {\n const id = randomUUID();\n const now = input.nowMs ?? Date.now();\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO knowledge_sync_runs (\n run_id, source_instance_id, status, cursor_before, started_at\n ) VALUES (?, ?, 'running', ?, ?)`,\n ).run(id, input.sourceInstanceId, input.cursorBefore ?? null, now);\n });\n return {\n id,\n sourceInstanceId: input.sourceInstanceId,\n status: 'running',\n ...(input.cursorBefore ? { cursorBefore: input.cursorBefore } : {}),\n itemsSeen: 0,\n itemsCreated: 0,\n itemsUpdated: 0,\n warnings: [],\n startedAt: new Date(now).toISOString(),\n };\n}\n\nexport function finishKnowledgeSyncRun(input: {\n runId: string;\n status: Exclude<KnowledgeSyncRunStatus, 'running'>;\n cursorAfter?: string;\n itemsSeen?: number;\n itemsCreated?: number;\n itemsUpdated?: number;\n warnings?: string[];\n error?: string;\n nowMs?: number;\n}): KnowledgeSyncRun {\n const now = input.nowMs ?? Date.now();\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `UPDATE knowledge_sync_runs SET\n status = ?, cursor_after = ?, items_seen = ?, items_created = ?,\n items_updated = ?, warnings_json = ?, error = ?, finished_at = ?\n WHERE run_id = ?`,\n ).run(\n input.status,\n input.cursorAfter ?? null,\n input.itemsSeen ?? 0,\n input.itemsCreated ?? 0,\n input.itemsUpdated ?? 0,\n JSON.stringify(input.warnings ?? []),\n input.error ?? null,\n now,\n input.runId,\n );\n });\n const row = getSqliteDatabase()\n .prepare(`SELECT * FROM knowledge_sync_runs WHERE run_id = ?`)\n .get(input.runId) as KnowledgeSyncRunRow | undefined;\n if (!row) throw new Error(`Knowledge sync run not found: ${input.runId}`);\n return syncRunFromRow(row);\n}\n\nexport function listKnowledgeSyncRuns(options: {\n sourceInstanceId?: string;\n status?: KnowledgeSyncRunStatus;\n limit?: number;\n} = {}): KnowledgeSyncRun[] {\n const where: string[] = [];\n const params: Array<string | number> = [];\n if (options.sourceInstanceId) {\n where.push('source_instance_id = ?');\n params.push(options.sourceInstanceId);\n }\n if (options.status) {\n where.push('status = ?');\n params.push(options.status);\n }\n const limit = Math.max(1, Math.min(500, options.limit ?? 100));\n const rows = getSqliteDatabase()\n .prepare(\n `SELECT * FROM knowledge_sync_runs\n ${where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''}\n ORDER BY started_at DESC LIMIT ?`,\n )\n .all(...params, limit) as KnowledgeSyncRunRow[];\n return rows.map(syncRunFromRow);\n}\n\nexport function getKnowledgeSourceCursor(sourceInstanceId: string): string | undefined {\n const row = getSqliteDatabase()\n .prepare(`SELECT cursor FROM knowledge_source_state WHERE source_instance_id = ?`)\n .get(sourceInstanceId) as { cursor: string | null } | undefined;\n return row?.cursor ?? undefined;\n}\n\nexport function setKnowledgeSourceCursor(sourceInstanceId: string, cursor: string | undefined): void {\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO knowledge_source_state (source_instance_id, cursor, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(source_instance_id) DO UPDATE SET\n cursor = excluded.cursor,\n updated_at = excluded.updated_at`,\n ).run(sourceInstanceId, cursor ?? null, Date.now());\n });\n}\n\nexport function upsertKnowledgeSourceItems(\n inputs: KnowledgeSourceItemInput[],\n nowMs = Date.now(),\n): { items: KnowledgeSourceItem[]; created: number; updated: number; unchanged: number } {\n return runSqliteWriteTransaction((db) => {\n const items: KnowledgeSourceItem[] = [];\n let created = 0;\n let updated = 0;\n let unchanged = 0;\n for (const input of inputs) {\n const existing = db.prepare(\n `SELECT * FROM knowledge_source_items\n WHERE source_instance_id = ? AND external_id = ?`,\n ).get(input.sourceInstanceId, input.externalId) as KnowledgeSourceItemRow | undefined;\n const id = existing?.item_id ?? input.id ?? randomUUID();\n if (existing?.content_hash === input.contentHash && existing.deleted_at === parseTimestamp(input.deletedAt)) {\n unchanged += 1;\n items.push(sourceItemFromRow(existing));\n continue;\n }\n db.prepare(\n `INSERT INTO knowledge_source_items (\n item_id, source_instance_id, external_id, item_type, author_role,\n occurred_at, source_updated_at, content_hash, normalized_text,\n payload_ref, metadata_json, sensitivity, retention_class,\n synthesis_status, deleted_at, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(source_instance_id, external_id) DO UPDATE SET\n item_type = excluded.item_type,\n author_role = excluded.author_role,\n occurred_at = excluded.occurred_at,\n source_updated_at = excluded.source_updated_at,\n content_hash = excluded.content_hash,\n normalized_text = excluded.normalized_text,\n payload_ref = excluded.payload_ref,\n metadata_json = excluded.metadata_json,\n sensitivity = excluded.sensitivity,\n retention_class = excluded.retention_class,\n synthesis_status = excluded.synthesis_status,\n deleted_at = excluded.deleted_at,\n updated_at = excluded.updated_at`,\n ).run(\n id,\n input.sourceInstanceId,\n input.externalId,\n input.itemType,\n input.authorRole ?? null,\n parseTimestamp(input.occurredAt),\n parseTimestamp(input.sourceUpdatedAt),\n input.contentHash,\n input.normalizedText ?? null,\n input.payloadRef ?? null,\n JSON.stringify(input.metadata ?? {}),\n input.sensitivity ?? 'normal',\n input.retentionClass ?? 'bounded',\n input.synthesisStatus ?? 'pending',\n parseTimestamp(input.deletedAt),\n existing?.created_at ?? nowMs,\n nowMs,\n );\n const row = db.prepare(`SELECT * FROM knowledge_source_items WHERE item_id = ?`).get(id) as KnowledgeSourceItemRow;\n items.push(sourceItemFromRow(row));\n if (existing) updated += 1;\n else created += 1;\n }\n return { items, created, updated, unchanged };\n });\n}\n\nexport function getKnowledgeSourceItem(itemId: string): KnowledgeSourceItem | null {\n const row = getSqliteDatabase()\n .prepare(`SELECT * FROM knowledge_source_items WHERE item_id = ?`)\n .get(itemId) as KnowledgeSourceItemRow | undefined;\n return row ? sourceItemFromRow(row) : null;\n}\n\nexport function listKnowledgeSourceItems(options: {\n sourceInstanceId?: string;\n synthesisStatus?: KnowledgeSynthesisStatus;\n includeDeleted?: boolean;\n limit?: number;\n offset?: number;\n} = {}): KnowledgeSourceItem[] {\n const where: string[] = [];\n const params: Array<string | number> = [];\n if (options.sourceInstanceId) {\n where.push('source_instance_id = ?');\n params.push(options.sourceInstanceId);\n }\n if (options.synthesisStatus) {\n where.push('synthesis_status = ?');\n params.push(options.synthesisStatus);\n }\n if (!options.includeDeleted) where.push('deleted_at IS NULL');\n const limit = Math.max(1, Math.min(500, options.limit ?? 100));\n const offset = Math.max(0, options.offset ?? 0);\n const rows = getSqliteDatabase()\n .prepare(\n `SELECT * FROM knowledge_source_items\n ${where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''}\n ORDER BY COALESCE(source_updated_at, occurred_at, updated_at) DESC\n LIMIT ? OFFSET ?`,\n )\n .all(...params, limit, offset) as KnowledgeSourceItemRow[];\n return rows.map(sourceItemFromRow);\n}\n\nexport function setKnowledgeSourceItemSynthesisStatus(\n itemIds: string[],\n status: KnowledgeSynthesisStatus,\n nowMs = Date.now(),\n): number {\n if (itemIds.length === 0) return 0;\n return runSqliteWriteTransaction((db) => {\n const placeholders = itemIds.map(() => '?').join(', ');\n const result = db.prepare(\n `UPDATE knowledge_source_items SET synthesis_status = ?, updated_at = ?\n WHERE item_id IN (${placeholders})`,\n ).run(status, nowMs, ...itemIds);\n return Number(result.changes);\n });\n}\n\nexport function attachMemoryEvidence(input: {\n recordId: string;\n sourceItemId?: string;\n relation?: MemoryEvidenceRelation;\n excerpt?: string;\n confidence?: number;\n observedAt?: string;\n nowMs?: number;\n}): MemoryEvidence {\n const evidenceId = randomUUID();\n const now = input.nowMs ?? Date.now();\n const observedAt = parseTimestamp(input.observedAt);\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO memory_evidence (\n evidence_id, record_id, source_item_id, relation, excerpt,\n confidence, observed_at, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n evidenceId,\n input.recordId,\n input.sourceItemId ?? null,\n input.relation ?? 'supports',\n input.excerpt ?? null,\n input.confidence ?? null,\n observedAt,\n now,\n );\n });\n return {\n evidenceId,\n ...(input.sourceItemId ? { sourceItemId: input.sourceItemId } : {}),\n relation: input.relation ?? 'supports',\n ...(input.excerpt ? { sourceText: input.excerpt } : {}),\n ...(input.confidence != null ? { confidence: input.confidence } : {}),\n ...(observedAt != null ? { observedAt: new Date(observedAt).toISOString() } : {}),\n };\n}\n\nexport function listMemoryEvidence(recordId: string): MemoryEvidence[] {\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM memory_evidence WHERE record_id = ? ORDER BY created_at ASC`)\n .all(recordId) as MemoryEvidenceRow[];\n return rows.map((row) => ({\n evidenceId: row.evidence_id,\n ...(row.source_item_id ? { sourceItemId: row.source_item_id } : {}),\n relation: row.relation as MemoryEvidenceRelation,\n ...(row.excerpt ? { sourceText: row.excerpt } : {}),\n ...(row.confidence != null ? { confidence: row.confidence } : {}),\n ...(timestampToIso(row.observed_at) ? { observedAt: timestampToIso(row.observed_at) } : {}),\n }));\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"knowledge-repository.js","names":[],"sources":["../../../../src/storage/sqlite/knowledge-repository.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type {\n KnowledgeSourceChange,\n KnowledgeSourceItem,\n KnowledgeSourceItemInput,\n KnowledgeSyncRun,\n KnowledgeSyncRunStatus,\n KnowledgeSynthesisPipeline,\n KnowledgeSynthesisStatus,\n} from '../../knowledge/types.js';\nimport type { MemoryEvidence, MemoryEvidenceRelation } from '../../agent/memory/types.js';\nimport { getSqliteDatabase, runSqliteWriteTransaction } from './transaction.js';\n\ntype KnowledgeSourceItemRow = {\n item_id: string;\n source_instance_id: string;\n external_id: string;\n item_type: string;\n author_role: string | null;\n occurred_at: number | null;\n source_updated_at: number | null;\n content_hash: string;\n normalized_text: string | null;\n payload_ref: string | null;\n metadata_json: string;\n sensitivity: string;\n retention_class: string;\n synthesis_pipeline: string;\n synthesis_status: string;\n synthesis_attempts: number;\n synthesis_claimed_at: number | null;\n synthesis_claimed_by: string | null;\n synthesis_error: string | null;\n deleted_at: number | null;\n created_at: number;\n updated_at: number;\n};\n\ntype KnowledgeSourceChangeRow = {\n sequence: number;\n change_id: string;\n source_instance_id: string;\n source_item_id: string;\n change_kind: string;\n old_hash: string | null;\n new_hash: string | null;\n changed_at: number;\n};\n\ntype KnowledgeSyncRunRow = {\n run_id: string;\n source_instance_id: string;\n status: string;\n cursor_before: string | null;\n cursor_after: string | null;\n items_seen: number;\n items_created: number;\n items_updated: number;\n warnings_json: string;\n error: string | null;\n started_at: number;\n finished_at: number | null;\n};\n\ntype MemoryEvidenceRow = {\n evidence_id: string;\n record_id: string;\n source_item_id: string | null;\n relation: string;\n excerpt: string | null;\n confidence: number | null;\n observed_at: number | null;\n created_at: number;\n};\n\nfunction parseTimestamp(value: string | undefined): number | null {\n if (!value) return null;\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction timestampToIso(value: number | null): string | undefined {\n return value == null ? undefined : new Date(value).toISOString();\n}\n\nfunction parseRecord(json: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(json) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : {};\n } catch {\n return {};\n }\n}\n\nfunction parseStrings(json: string): string[] {\n try {\n const parsed = JSON.parse(json) as unknown;\n return Array.isArray(parsed) ? parsed.filter((item): item is string => typeof item === 'string') : [];\n } catch {\n return [];\n }\n}\n\nfunction sourceItemFromRow(row: KnowledgeSourceItemRow): KnowledgeSourceItem {\n return {\n id: row.item_id,\n sourceInstanceId: row.source_instance_id,\n externalId: row.external_id,\n itemType: row.item_type,\n ...(row.author_role ? { authorRole: row.author_role as KnowledgeSourceItem['authorRole'] } : {}),\n ...(timestampToIso(row.occurred_at) ? { occurredAt: timestampToIso(row.occurred_at) } : {}),\n ...(timestampToIso(row.source_updated_at) ? { sourceUpdatedAt: timestampToIso(row.source_updated_at) } : {}),\n contentHash: row.content_hash,\n ...(row.normalized_text ? { normalizedText: row.normalized_text } : {}),\n ...(row.payload_ref ? { payloadRef: row.payload_ref } : {}),\n metadata: parseRecord(row.metadata_json),\n sensitivity: row.sensitivity as KnowledgeSourceItem['sensitivity'],\n retentionClass: row.retention_class as KnowledgeSourceItem['retentionClass'],\n synthesisPipeline: row.synthesis_pipeline as KnowledgeSourceItem['synthesisPipeline'],\n synthesisStatus: row.synthesis_status as KnowledgeSourceItem['synthesisStatus'],\n synthesisAttempts: row.synthesis_attempts,\n ...(timestampToIso(row.synthesis_claimed_at) ? { synthesisClaimedAt: timestampToIso(row.synthesis_claimed_at) } : {}),\n ...(row.synthesis_claimed_by ? { synthesisClaimedBy: row.synthesis_claimed_by } : {}),\n ...(row.synthesis_error ? { synthesisError: row.synthesis_error } : {}),\n ...(timestampToIso(row.deleted_at) ? { deletedAt: timestampToIso(row.deleted_at) } : {}),\n createdAt: new Date(row.created_at).toISOString(),\n updatedAt: new Date(row.updated_at).toISOString(),\n };\n}\n\nfunction sourceChangeFromRow(row: KnowledgeSourceChangeRow): KnowledgeSourceChange {\n return {\n sequence: row.sequence,\n id: row.change_id,\n sourceInstanceId: row.source_instance_id,\n sourceItemId: row.source_item_id,\n kind: row.change_kind as KnowledgeSourceChange['kind'],\n ...(row.old_hash ? { oldHash: row.old_hash } : {}),\n ...(row.new_hash ? { newHash: row.new_hash } : {}),\n changedAt: new Date(row.changed_at).toISOString(),\n };\n}\n\nfunction syncRunFromRow(row: KnowledgeSyncRunRow): KnowledgeSyncRun {\n return {\n id: row.run_id,\n sourceInstanceId: row.source_instance_id,\n status: row.status as KnowledgeSyncRunStatus,\n ...(row.cursor_before ? { cursorBefore: row.cursor_before } : {}),\n ...(row.cursor_after ? { cursorAfter: row.cursor_after } : {}),\n itemsSeen: row.items_seen,\n itemsCreated: row.items_created,\n itemsUpdated: row.items_updated,\n warnings: parseStrings(row.warnings_json),\n ...(row.error ? { error: row.error } : {}),\n startedAt: new Date(row.started_at).toISOString(),\n ...(timestampToIso(row.finished_at) ? { finishedAt: timestampToIso(row.finished_at) } : {}),\n };\n}\n\nexport function startKnowledgeSyncRun(input: {\n sourceInstanceId: string;\n cursorBefore?: string;\n nowMs?: number;\n}): KnowledgeSyncRun {\n const id = randomUUID();\n const now = input.nowMs ?? Date.now();\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO knowledge_sync_runs (\n run_id, source_instance_id, status, cursor_before, started_at\n ) VALUES (?, ?, 'running', ?, ?)`,\n ).run(id, input.sourceInstanceId, input.cursorBefore ?? null, now);\n });\n return {\n id,\n sourceInstanceId: input.sourceInstanceId,\n status: 'running',\n ...(input.cursorBefore ? { cursorBefore: input.cursorBefore } : {}),\n itemsSeen: 0,\n itemsCreated: 0,\n itemsUpdated: 0,\n warnings: [],\n startedAt: new Date(now).toISOString(),\n };\n}\n\nexport function finishKnowledgeSyncRun(input: {\n runId: string;\n status: Exclude<KnowledgeSyncRunStatus, 'running'>;\n cursorAfter?: string;\n itemsSeen?: number;\n itemsCreated?: number;\n itemsUpdated?: number;\n warnings?: string[];\n error?: string;\n nowMs?: number;\n}): KnowledgeSyncRun {\n const now = input.nowMs ?? Date.now();\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `UPDATE knowledge_sync_runs SET\n status = ?, cursor_after = ?, items_seen = ?, items_created = ?,\n items_updated = ?, warnings_json = ?, error = ?, finished_at = ?\n WHERE run_id = ?`,\n ).run(\n input.status,\n input.cursorAfter ?? null,\n input.itemsSeen ?? 0,\n input.itemsCreated ?? 0,\n input.itemsUpdated ?? 0,\n JSON.stringify(input.warnings ?? []),\n input.error ?? null,\n now,\n input.runId,\n );\n });\n const row = getSqliteDatabase()\n .prepare(`SELECT * FROM knowledge_sync_runs WHERE run_id = ?`)\n .get(input.runId) as KnowledgeSyncRunRow | undefined;\n if (!row) throw new Error(`Knowledge sync run not found: ${input.runId}`);\n return syncRunFromRow(row);\n}\n\nexport function listKnowledgeSyncRuns(options: {\n sourceInstanceId?: string;\n status?: KnowledgeSyncRunStatus;\n limit?: number;\n} = {}): KnowledgeSyncRun[] {\n const where: string[] = [];\n const params: Array<string | number> = [];\n if (options.sourceInstanceId) {\n where.push('source_instance_id = ?');\n params.push(options.sourceInstanceId);\n }\n if (options.status) {\n where.push('status = ?');\n params.push(options.status);\n }\n const limit = Math.max(1, Math.min(500, options.limit ?? 100));\n const rows = getSqliteDatabase()\n .prepare(\n `SELECT * FROM knowledge_sync_runs\n ${where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''}\n ORDER BY started_at DESC LIMIT ?`,\n )\n .all(...params, limit) as KnowledgeSyncRunRow[];\n return rows.map(syncRunFromRow);\n}\n\nexport function getKnowledgeSourceCursor(sourceInstanceId: string): string | undefined {\n const row = getSqliteDatabase()\n .prepare(`SELECT cursor FROM knowledge_source_state WHERE source_instance_id = ?`)\n .get(sourceInstanceId) as { cursor: string | null } | undefined;\n return row?.cursor ?? undefined;\n}\n\nexport function setKnowledgeSourceCursor(sourceInstanceId: string, cursor: string | undefined): void {\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO knowledge_source_state (source_instance_id, cursor, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(source_instance_id) DO UPDATE SET\n cursor = excluded.cursor,\n updated_at = excluded.updated_at`,\n ).run(sourceInstanceId, cursor ?? null, Date.now());\n });\n}\n\nexport function upsertKnowledgeSourceItems(\n inputs: KnowledgeSourceItemInput[],\n nowMs = Date.now(),\n): { items: KnowledgeSourceItem[]; created: number; updated: number; unchanged: number } {\n return runSqliteWriteTransaction((db) => {\n const items: KnowledgeSourceItem[] = [];\n let created = 0;\n let updated = 0;\n let unchanged = 0;\n for (const input of inputs) {\n const existing = db.prepare(\n `SELECT * FROM knowledge_source_items\n WHERE source_instance_id = ? AND external_id = ?`,\n ).get(input.sourceInstanceId, input.externalId) as KnowledgeSourceItemRow | undefined;\n const id = existing?.item_id ?? input.id ?? randomUUID();\n if (existing?.content_hash === input.contentHash && existing.deleted_at === parseTimestamp(input.deletedAt)) {\n unchanged += 1;\n items.push(sourceItemFromRow(existing));\n continue;\n }\n db.prepare(\n `INSERT INTO knowledge_source_items (\n item_id, source_instance_id, external_id, item_type, author_role,\n occurred_at, source_updated_at, content_hash, normalized_text,\n payload_ref, metadata_json, sensitivity, retention_class,\n synthesis_pipeline, synthesis_status, deleted_at, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(source_instance_id, external_id) DO UPDATE SET\n item_type = excluded.item_type,\n author_role = excluded.author_role,\n occurred_at = excluded.occurred_at,\n source_updated_at = excluded.source_updated_at,\n content_hash = excluded.content_hash,\n normalized_text = excluded.normalized_text,\n payload_ref = excluded.payload_ref,\n metadata_json = excluded.metadata_json,\n sensitivity = excluded.sensitivity,\n retention_class = excluded.retention_class,\n synthesis_pipeline = excluded.synthesis_pipeline,\n synthesis_status = excluded.synthesis_status,\n synthesis_attempts = 0,\n synthesis_claimed_at = NULL,\n synthesis_claimed_by = NULL,\n synthesis_error = NULL,\n deleted_at = excluded.deleted_at,\n updated_at = excluded.updated_at`,\n ).run(\n id,\n input.sourceInstanceId,\n input.externalId,\n input.itemType,\n input.authorRole ?? null,\n parseTimestamp(input.occurredAt),\n parseTimestamp(input.sourceUpdatedAt),\n input.contentHash,\n input.normalizedText ?? null,\n input.payloadRef ?? null,\n JSON.stringify(input.metadata ?? {}),\n input.sensitivity ?? 'normal',\n input.retentionClass ?? 'bounded',\n input.synthesisPipeline ?? 'user_understanding',\n input.synthesisStatus ?? 'pending',\n parseTimestamp(input.deletedAt),\n existing?.created_at ?? nowMs,\n nowMs,\n );\n const row = db.prepare(`SELECT * FROM knowledge_source_items WHERE item_id = ?`).get(id) as KnowledgeSourceItemRow;\n items.push(sourceItemFromRow(row));\n const changeKind = input.deletedAt ? 'deleted' : existing ? 'modified' : 'added';\n db.prepare(\n `INSERT INTO knowledge_source_changes (\n change_id, source_instance_id, source_item_id, change_kind,\n old_hash, new_hash, changed_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n randomUUID(),\n input.sourceInstanceId,\n id,\n changeKind,\n existing?.content_hash ?? null,\n input.deletedAt ? null : input.contentHash,\n nowMs,\n );\n if (existing) updated += 1;\n else created += 1;\n }\n return { items, created, updated, unchanged };\n });\n}\n\nexport function getKnowledgeSourceItem(itemId: string): KnowledgeSourceItem | null {\n const row = getSqliteDatabase()\n .prepare(`SELECT * FROM knowledge_source_items WHERE item_id = ?`)\n .get(itemId) as KnowledgeSourceItemRow | undefined;\n return row ? sourceItemFromRow(row) : null;\n}\n\nexport function listKnowledgeSourceChanges(options: {\n sourceInstanceId?: string;\n afterSequence?: number;\n limit?: number;\n} = {}): KnowledgeSourceChange[] {\n const where: string[] = [];\n const params: Array<string | number> = [];\n if (options.sourceInstanceId) {\n where.push('source_instance_id = ?');\n params.push(options.sourceInstanceId);\n }\n if (options.afterSequence != null) {\n where.push('sequence > ?');\n params.push(Math.max(0, options.afterSequence));\n }\n const limit = Math.max(1, Math.min(1_000, options.limit ?? 100));\n const rows = getSqliteDatabase().prepare(\n `SELECT * FROM knowledge_source_changes\n ${where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''}\n ORDER BY sequence ASC LIMIT ?`,\n ).all(...params, limit) as KnowledgeSourceChangeRow[];\n return rows.map(sourceChangeFromRow);\n}\n\nexport function getKnowledgeConsumerWatermark(consumerId: string, sourceInstanceId: string): number {\n const row = getSqliteDatabase().prepare(\n `SELECT last_sequence FROM knowledge_consumer_watermarks\n WHERE consumer_id = ? AND source_instance_id = ?`,\n ).get(consumerId, sourceInstanceId) as { last_sequence: number } | undefined;\n return row?.last_sequence ?? 0;\n}\n\nexport function setKnowledgeConsumerWatermark(\n consumerId: string,\n sourceInstanceId: string,\n sequence: number,\n nowMs = Date.now(),\n): void {\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO knowledge_consumer_watermarks (\n consumer_id, source_instance_id, last_sequence, updated_at\n ) VALUES (?, ?, ?, ?)\n ON CONFLICT(consumer_id, source_instance_id) DO UPDATE SET\n last_sequence = MAX(last_sequence, excluded.last_sequence),\n updated_at = excluded.updated_at`,\n ).run(consumerId, sourceInstanceId, Math.max(0, sequence), nowMs);\n });\n}\n\nexport function listKnowledgeSourceItems(options: {\n sourceInstanceId?: string;\n synthesisStatus?: KnowledgeSynthesisStatus;\n includeDeleted?: boolean;\n limit?: number;\n offset?: number;\n} = {}): KnowledgeSourceItem[] {\n const where: string[] = [];\n const params: Array<string | number> = [];\n if (options.sourceInstanceId) {\n where.push('source_instance_id = ?');\n params.push(options.sourceInstanceId);\n }\n if (options.synthesisStatus) {\n where.push('synthesis_status = ?');\n params.push(options.synthesisStatus);\n }\n if (!options.includeDeleted) where.push('deleted_at IS NULL');\n const limit = Math.max(1, Math.min(500, options.limit ?? 100));\n const offset = Math.max(0, options.offset ?? 0);\n const rows = getSqliteDatabase()\n .prepare(\n `SELECT * FROM knowledge_source_items\n ${where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''}\n ORDER BY COALESCE(source_updated_at, occurred_at, updated_at) DESC\n LIMIT ? OFFSET ?`,\n )\n .all(...params, limit, offset) as KnowledgeSourceItemRow[];\n return rows.map(sourceItemFromRow);\n}\n\nexport function setKnowledgeSourceItemSynthesisStatus(\n itemIds: string[],\n status: KnowledgeSynthesisStatus,\n nowMs = Date.now(),\n): number {\n if (itemIds.length === 0) return 0;\n return runSqliteWriteTransaction((db) => {\n const placeholders = itemIds.map(() => '?').join(', ');\n const result = db.prepare(\n `UPDATE knowledge_source_items SET synthesis_status = ?, updated_at = ?\n WHERE item_id IN (${placeholders})`,\n ).run(status, nowMs, ...itemIds);\n return Number(result.changes);\n });\n}\n\nexport function claimKnowledgeSourceItems(options: {\n workerId: string;\n sourceInstanceId?: string;\n synthesisPipeline?: KnowledgeSynthesisPipeline;\n limit?: number;\n leaseMs?: number;\n retryDelayMs?: number;\n maxAttempts?: number;\n nowMs?: number;\n}): KnowledgeSourceItem[] {\n const now = options.nowMs ?? Date.now();\n const leaseCutoff = now - Math.max(1_000, options.leaseMs ?? 5 * 60_000);\n const retryCutoff = now - Math.max(1_000, options.retryDelayMs ?? 30_000);\n const limit = Math.max(1, Math.min(100, options.limit ?? 20));\n const maxAttempts = Math.max(1, options.maxAttempts ?? 3);\n return runSqliteWriteTransaction((db) => {\n const rows = db.prepare(\n `SELECT * FROM knowledge_source_items\n WHERE synthesis_attempts < ?\n ${options.sourceInstanceId ? 'AND source_instance_id = ?' : ''}\n ${options.synthesisPipeline ? 'AND synthesis_pipeline = ?' : ''}\n AND (\n synthesis_status = 'pending'\n OR (synthesis_status = 'failed' AND updated_at < ?)\n OR (synthesis_status = 'processing' AND synthesis_claimed_at < ?)\n )\n ORDER BY COALESCE(source_updated_at, occurred_at, updated_at) ASC\n LIMIT ?`,\n ).all(\n maxAttempts,\n ...(options.sourceInstanceId ? [options.sourceInstanceId] : []),\n ...(options.synthesisPipeline ? [options.synthesisPipeline] : []),\n retryCutoff,\n leaseCutoff,\n limit,\n ) as KnowledgeSourceItemRow[];\n if (rows.length === 0) return [];\n const ids = rows.map((row) => row.item_id);\n const placeholders = ids.map(() => '?').join(', ');\n db.prepare(\n `UPDATE knowledge_source_items SET\n synthesis_status = 'processing',\n synthesis_attempts = synthesis_attempts + 1,\n synthesis_claimed_at = ?,\n synthesis_claimed_by = ?,\n synthesis_error = NULL,\n updated_at = ?\n WHERE item_id IN (${placeholders})`,\n ).run(now, options.workerId, now, ...ids);\n const claimed = db.prepare(\n `SELECT * FROM knowledge_source_items WHERE item_id IN (${placeholders})`,\n ).all(...ids) as KnowledgeSourceItemRow[];\n return claimed.map(sourceItemFromRow);\n });\n}\n\nexport function completeKnowledgeSourceItemSynthesis(input: {\n itemId: string;\n workerId: string;\n status: 'completed' | 'failed' | 'ignored';\n error?: string;\n nowMs?: number;\n}): boolean {\n const now = input.nowMs ?? Date.now();\n return runSqliteWriteTransaction((db) => {\n const result = db.prepare(\n `UPDATE knowledge_source_items SET\n synthesis_status = ?,\n synthesis_claimed_at = NULL,\n synthesis_claimed_by = NULL,\n synthesis_error = ?,\n updated_at = ?\n WHERE item_id = ? AND synthesis_status = 'processing' AND synthesis_claimed_by = ?`,\n ).run(input.status, input.error ?? null, now, input.itemId, input.workerId);\n return Number(result.changes) > 0;\n });\n}\n\nexport function attachMemoryEvidence(input: {\n recordId: string;\n sourceItemId?: string;\n relation?: MemoryEvidenceRelation;\n excerpt?: string;\n confidence?: number;\n observedAt?: string;\n nowMs?: number;\n}): MemoryEvidence {\n let evidenceId: string = randomUUID();\n const now = input.nowMs ?? Date.now();\n const observedAt = parseTimestamp(input.observedAt);\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO memory_evidence (\n evidence_id, record_id, source_item_id, relation, excerpt,\n confidence, observed_at, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT DO UPDATE SET\n excerpt = COALESCE(excluded.excerpt, memory_evidence.excerpt),\n confidence = MAX(COALESCE(memory_evidence.confidence, 0), COALESCE(excluded.confidence, 0)),\n observed_at = MAX(COALESCE(memory_evidence.observed_at, 0), COALESCE(excluded.observed_at, 0))`,\n ).run(\n evidenceId,\n input.recordId,\n input.sourceItemId ?? null,\n input.relation ?? 'supports',\n input.excerpt ?? null,\n input.confidence ?? null,\n observedAt,\n now,\n );\n if (input.sourceItemId) {\n const stored = db.prepare(\n `SELECT evidence_id FROM memory_evidence\n WHERE record_id = ? AND source_item_id = ? AND relation = ?`,\n ).get(input.recordId, input.sourceItemId, input.relation ?? 'supports') as { evidence_id: string } | undefined;\n evidenceId = stored?.evidence_id ?? evidenceId;\n }\n });\n return {\n evidenceId,\n ...(input.sourceItemId ? { sourceItemId: input.sourceItemId } : {}),\n relation: input.relation ?? 'supports',\n ...(input.excerpt ? { sourceText: input.excerpt } : {}),\n ...(input.confidence != null ? { confidence: input.confidence } : {}),\n ...(observedAt != null ? { observedAt: new Date(observedAt).toISOString() } : {}),\n };\n}\n\nexport function deleteMemoryEvidenceForRecord(\n recordId: string,\n relation?: MemoryEvidenceRelation,\n): number {\n return runSqliteWriteTransaction((db) => {\n const result = relation\n ? db.prepare(`DELETE FROM memory_evidence WHERE record_id = ? AND relation = ?`).run(recordId, relation)\n : db.prepare(`DELETE FROM memory_evidence WHERE record_id = ?`).run(recordId);\n return Number(result.changes);\n });\n}\n\nexport function listMemoryEvidence(recordId: string): MemoryEvidence[] {\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM memory_evidence WHERE record_id = ? ORDER BY created_at ASC`)\n .all(recordId) as MemoryEvidenceRow[];\n return rows.map((row) => ({\n evidenceId: row.evidence_id,\n ...(row.source_item_id ? { sourceItemId: row.source_item_id } : {}),\n relation: row.relation as MemoryEvidenceRelation,\n ...(row.excerpt ? { sourceText: row.excerpt } : {}),\n ...(row.confidence != null ? { confidence: row.confidence } : {}),\n ...(timestampToIso(row.observed_at) ? { observedAt: timestampToIso(row.observed_at) } : {}),\n }));\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS knowledge_source_changes (
|
|
2
|
+
sequence INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
3
|
+
change_id TEXT NOT NULL UNIQUE,
|
|
4
|
+
source_instance_id TEXT NOT NULL,
|
|
5
|
+
source_item_id TEXT NOT NULL,
|
|
6
|
+
change_kind TEXT NOT NULL CHECK(change_kind IN ('added', 'modified', 'deleted')),
|
|
7
|
+
old_hash TEXT,
|
|
8
|
+
new_hash TEXT,
|
|
9
|
+
changed_at INTEGER NOT NULL,
|
|
10
|
+
FOREIGN KEY(source_item_id) REFERENCES knowledge_source_items(item_id) ON DELETE CASCADE
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
CREATE INDEX IF NOT EXISTS idx_knowledge_source_changes_source_sequence
|
|
14
|
+
ON knowledge_source_changes(source_instance_id, sequence);
|
|
15
|
+
CREATE INDEX IF NOT EXISTS idx_knowledge_source_changes_changed_at
|
|
16
|
+
ON knowledge_source_changes(changed_at DESC);
|
|
17
|
+
|
|
18
|
+
CREATE TABLE IF NOT EXISTS knowledge_consumer_watermarks (
|
|
19
|
+
consumer_id TEXT NOT NULL,
|
|
20
|
+
source_instance_id TEXT NOT NULL,
|
|
21
|
+
last_sequence INTEGER NOT NULL DEFAULT 0,
|
|
22
|
+
updated_at INTEGER NOT NULL,
|
|
23
|
+
PRIMARY KEY(consumer_id, source_instance_id)
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
ALTER TABLE knowledge_source_items ADD COLUMN synthesis_pipeline TEXT NOT NULL DEFAULT 'user_understanding'
|
|
27
|
+
CHECK(synthesis_pipeline IN ('user_understanding', 'connected_knowledge'));
|
|
28
|
+
ALTER TABLE knowledge_source_items ADD COLUMN synthesis_attempts INTEGER NOT NULL DEFAULT 0;
|
|
29
|
+
ALTER TABLE knowledge_source_items ADD COLUMN synthesis_claimed_at INTEGER;
|
|
30
|
+
ALTER TABLE knowledge_source_items ADD COLUMN synthesis_claimed_by TEXT;
|
|
31
|
+
ALTER TABLE knowledge_source_items ADD COLUMN synthesis_error TEXT;
|
|
32
|
+
|
|
33
|
+
CREATE INDEX IF NOT EXISTS idx_knowledge_source_items_synthesis_lease
|
|
34
|
+
ON knowledge_source_items(synthesis_pipeline, synthesis_status, synthesis_claimed_at, updated_at);
|
|
35
|
+
|
|
36
|
+
DELETE FROM memory_evidence
|
|
37
|
+
WHERE source_item_id IS NOT NULL
|
|
38
|
+
AND rowid NOT IN (
|
|
39
|
+
SELECT MIN(rowid)
|
|
40
|
+
FROM memory_evidence
|
|
41
|
+
WHERE source_item_id IS NOT NULL
|
|
42
|
+
GROUP BY record_id, source_item_id, relation
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_memory_evidence_record_source_relation
|
|
46
|
+
ON memory_evidence(record_id, source_item_id, relation)
|
|
47
|
+
WHERE source_item_id IS NOT NULL;
|
|
@@ -3,7 +3,7 @@ import type { ApplyMigrationsOptions } from './types.js';
|
|
|
3
3
|
/** Baseline schema version applied from schema.sql on first open. */
|
|
4
4
|
export declare const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;
|
|
5
5
|
/** Latest schema version this release supports (increment when adding migrations). */
|
|
6
|
-
export declare const XOPC_DB_SCHEMA_VERSION =
|
|
6
|
+
export declare const XOPC_DB_SCHEMA_VERSION = 37;
|
|
7
7
|
export declare function resolveMigrationsDir(override?: string): string;
|
|
8
8
|
/**
|
|
9
9
|
* Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.
|
|
@@ -12,7 +12,7 @@ const log = createLogger("Sqlite:Migrations");
|
|
|
12
12
|
/** Baseline schema version applied from schema.sql on first open. */
|
|
13
13
|
const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;
|
|
14
14
|
/** Latest schema version this release supports (increment when adding migrations). */
|
|
15
|
-
const XOPC_DB_SCHEMA_VERSION =
|
|
15
|
+
const XOPC_DB_SCHEMA_VERSION = 37;
|
|
16
16
|
const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
|
|
17
17
|
function resolveMigrationsDir(override) {
|
|
18
18
|
if (override) return override;
|
|
@@ -46,7 +46,7 @@ function applySingleMigration(db, migration) {
|
|
|
46
46
|
* Each step runs in its own transaction and updates schema_meta on success.
|
|
47
47
|
*/
|
|
48
48
|
function applyPendingMigrations(db, options = {}) {
|
|
49
|
-
const targetVersion = options.targetVersion ??
|
|
49
|
+
const targetVersion = options.targetVersion ?? 37;
|
|
50
50
|
let currentVersion = readSchemaVersion(db);
|
|
51
51
|
if (currentVersion > targetVersion) throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);
|
|
52
52
|
if (currentVersion >= targetVersion) return currentVersion;
|
|
@@ -62,7 +62,7 @@ function applyPendingMigrations(db, options = {}) {
|
|
|
62
62
|
}
|
|
63
63
|
/** Inspect schema version without mutating the database. */
|
|
64
64
|
function inspectSchemaMigrationStatus(db, options = {}) {
|
|
65
|
-
const appVersion = options.targetVersion ??
|
|
65
|
+
const appVersion = options.targetVersion ?? 37;
|
|
66
66
|
const dbVersion = readSchemaVersion(db);
|
|
67
67
|
if (dbVersion > appVersion) return {
|
|
68
68
|
dbVersion,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","names":[],"sources":["../../../../../src/storage/sqlite/migrations/runner.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { DatabaseSync } from 'node:sqlite';\n\nimport { createLogger } from '../../../utils/logger.js';\nimport { readSchemaVersion, setSchemaVersion } from '../schema-version.js';\nimport { discoverSqlMigrations } from './discover.js';\nimport {\n DatabaseSchemaMigrationGapError,\n DatabaseSchemaTooNewError,\n} from './errors.js';\nimport type { ApplyMigrationsOptions, SqlMigration } from './types.js';\n\nconst log = createLogger('Sqlite:Migrations');\n\n/** Baseline schema version applied from schema.sql on first open. */\nexport const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;\n\n/** Latest schema version this release supports (increment when adding migrations). */\nexport const XOPC_DB_SCHEMA_VERSION =
|
|
1
|
+
{"version":3,"file":"runner.js","names":[],"sources":["../../../../../src/storage/sqlite/migrations/runner.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { DatabaseSync } from 'node:sqlite';\n\nimport { createLogger } from '../../../utils/logger.js';\nimport { readSchemaVersion, setSchemaVersion } from '../schema-version.js';\nimport { discoverSqlMigrations } from './discover.js';\nimport {\n DatabaseSchemaMigrationGapError,\n DatabaseSchemaTooNewError,\n} from './errors.js';\nimport type { ApplyMigrationsOptions, SqlMigration } from './types.js';\n\nconst log = createLogger('Sqlite:Migrations');\n\n/** Baseline schema version applied from schema.sql on first open. */\nexport const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;\n\n/** Latest schema version this release supports (increment when adding migrations). */\nexport const XOPC_DB_SCHEMA_VERSION = 37;\n\nconst MODULE_DIR = dirname(fileURLToPath(import.meta.url));\n\nexport function resolveMigrationsDir(override?: string): string {\n if (override) {\n return override;\n }\n // Packaged Electron gateway bundle: `out/server/index.js` + `out/server/migrations/`.\n const siblingDir = join(MODULE_DIR, 'migrations');\n if (existsSync(siblingDir)) {\n return siblingDir;\n }\n // Dev / dist: SQL files live next to `migrations/runner.js`.\n return MODULE_DIR;\n}\n\nfunction migrationByTarget(\n migrations: SqlMigration[],\n targetVersion: number,\n): SqlMigration | undefined {\n return migrations.find((migration) => migration.targetVersion === targetVersion);\n}\n\nfunction applySingleMigration(db: DatabaseSync, migration: SqlMigration): void {\n log.info({ targetVersion: migration.targetVersion, file: migration.filename }, 'Applying SQLite migration');\n db.exec('BEGIN IMMEDIATE');\n try {\n db.exec(migration.sql);\n setSchemaVersion(db, migration.targetVersion);\n db.exec('COMMIT');\n } catch (error) {\n try {\n db.exec('ROLLBACK');\n } catch {\n /* preserve original error */\n }\n const em = error instanceof Error ? error.message : String(error);\n throw new Error(\n `SQLite migration to v${migration.targetVersion} (${migration.filename}) failed: ${em}`,\n { cause: error },\n );\n }\n}\n\n/**\n * Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.\n * Each step runs in its own transaction and updates schema_meta on success.\n */\nexport function applyPendingMigrations(\n db: DatabaseSync,\n options: ApplyMigrationsOptions = {},\n): number {\n const targetVersion = options.targetVersion ?? XOPC_DB_SCHEMA_VERSION;\n let currentVersion = readSchemaVersion(db);\n\n if (currentVersion > targetVersion) {\n throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);\n }\n\n if (currentVersion >= targetVersion) {\n return currentVersion;\n }\n\n const migrations = discoverSqlMigrations(resolveMigrationsDir(options.migrationsDir));\n\n while (currentVersion < targetVersion) {\n const nextVersion = currentVersion + 1;\n const migration = migrationByTarget(migrations, nextVersion);\n if (!migration) {\n throw new DatabaseSchemaMigrationGapError(currentVersion, targetVersion, nextVersion);\n }\n applySingleMigration(db, migration);\n currentVersion = nextVersion;\n }\n\n return currentVersion;\n}\n\nexport type SchemaMigrationStatus = {\n dbVersion: number;\n appVersion: number;\n pendingVersions: number[];\n isTooNew: boolean;\n hasMigrationGap: boolean;\n missingVersion: number | null;\n};\n\n/** Inspect schema version without mutating the database. */\nexport function inspectSchemaMigrationStatus(\n db: DatabaseSync,\n options: Pick<ApplyMigrationsOptions, 'migrationsDir' | 'targetVersion'> = {},\n): SchemaMigrationStatus {\n const appVersion = options.targetVersion ?? XOPC_DB_SCHEMA_VERSION;\n const dbVersion = readSchemaVersion(db);\n const isTooNew = dbVersion > appVersion;\n\n if (isTooNew) {\n return {\n dbVersion,\n appVersion,\n pendingVersions: [],\n isTooNew: true,\n hasMigrationGap: false,\n missingVersion: null,\n };\n }\n\n const migrations = discoverSqlMigrations(resolveMigrationsDir(options.migrationsDir));\n const pendingVersions: number[] = [];\n let hasMigrationGap = false;\n let missingVersion: number | null = null;\n\n for (let version = dbVersion + 1; version <= appVersion; version++) {\n if (migrationByTarget(migrations, version)) {\n pendingVersions.push(version);\n } else {\n hasMigrationGap = true;\n missingVersion = version;\n break;\n }\n }\n\n return {\n dbVersion,\n appVersion,\n pendingVersions,\n isTooNew: false,\n hasMigrationGap,\n missingVersion,\n };\n}\n"],"mappings":";;;;;;;;;aAMwD;AASxD,MAAM,MAAM,aAAa,oBAAoB;;AAG7C,MAAa,kCAAkC;;AAG/C,MAAa,yBAAyB;AAEtC,MAAM,aAAa,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;AAE1D,SAAgB,qBAAqB,UAA2B;AAC9D,KAAI,SACF,QAAO;CAGT,MAAM,aAAa,KAAK,YAAY,aAAa;AACjD,KAAI,WAAW,WAAW,CACxB,QAAO;AAGT,QAAO;;AAGT,SAAS,kBACP,YACA,eAC0B;AAC1B,QAAO,WAAW,MAAM,cAAc,UAAU,kBAAkB,cAAc;;AAGlF,SAAS,qBAAqB,IAAkB,WAA+B;AAC7E,KAAI,KAAK;EAAE,eAAe,UAAU;EAAe,MAAM,UAAU;EAAU,EAAE,4BAA4B;AAC3G,IAAG,KAAK,kBAAkB;AAC1B,KAAI;AACF,KAAG,KAAK,UAAU,IAAI;AACtB,mBAAiB,IAAI,UAAU,cAAc;AAC7C,KAAG,KAAK,SAAS;UACV,OAAO;AACd,MAAI;AACF,MAAG,KAAK,WAAW;UACb;EAGR,MAAM,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACjE,QAAM,IAAI,MACR,wBAAwB,UAAU,cAAc,IAAI,UAAU,SAAS,YAAY,MACnF,EAAE,OAAO,OAAO,CACjB;;;;;;;AAQL,SAAgB,uBACd,IACA,UAAkC,EAAE,EAC5B;CACR,MAAM,gBAAgB,QAAQ,iBAAA;CAC9B,IAAI,iBAAiB,kBAAkB,GAAG;AAE1C,KAAI,iBAAiB,cACnB,OAAM,IAAI,0BAA0B,gBAAgB,cAAc;AAGpE,KAAI,kBAAkB,cACpB,QAAO;CAGT,MAAM,aAAa,sBAAsB,qBAAqB,QAAQ,cAAc,CAAC;AAErF,QAAO,iBAAiB,eAAe;EACrC,MAAM,cAAc,iBAAiB;EACrC,MAAM,YAAY,kBAAkB,YAAY,YAAY;AAC5D,MAAI,CAAC,UACH,OAAM,IAAI,gCAAgC,gBAAgB,eAAe,YAAY;AAEvF,uBAAqB,IAAI,UAAU;AACnC,mBAAiB;;AAGnB,QAAO;;;AAaT,SAAgB,6BACd,IACA,UAA2E,EAAE,EACtD;CACvB,MAAM,aAAa,QAAQ,iBAAA;CAC3B,MAAM,YAAY,kBAAkB,GAAG;AAGvC,KAFiB,YAAY,WAG3B,QAAO;EACL;EACA;EACA,iBAAiB,EAAE;EACnB,UAAU;EACV,iBAAiB;EACjB,gBAAgB;EACjB;CAGH,MAAM,aAAa,sBAAsB,qBAAqB,QAAQ,cAAc,CAAC;CACrF,MAAM,kBAA4B,EAAE;CACpC,IAAI,kBAAkB;CACtB,IAAI,iBAAgC;AAEpC,MAAK,IAAI,UAAU,YAAY,GAAG,WAAW,YAAY,UACvD,KAAI,kBAAkB,YAAY,QAAQ,CACxC,iBAAgB,KAAK,QAAQ;MACxB;AACL,oBAAkB;AAClB,mBAAiB;AACjB;;AAIJ,QAAO;EACL;EACA;EACA;EACA,UAAU;EACV;EACA;EACD"}
|
|
@@ -19,7 +19,7 @@ const log = createLogger('Sqlite:Migrations');
|
|
|
19
19
|
export const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;
|
|
20
20
|
|
|
21
21
|
/** Latest schema version this release supports (increment when adding migrations). */
|
|
22
|
-
export const XOPC_DB_SCHEMA_VERSION =
|
|
22
|
+
export const XOPC_DB_SCHEMA_VERSION = 37;
|
|
23
23
|
|
|
24
24
|
const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
|
|
25
25
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { init_agent_session_key, resolveAgentIdFromSessionKey } from "../../routing/agent-session-key.js";
|
|
2
1
|
import "../../session/types.js";
|
|
3
2
|
import { buildDefaultSessionMetadata } from "./session-metadata.js";
|
|
4
3
|
import { isTranscriptContextEntry } from "../../session/session-context-for-llm.js";
|
|
4
|
+
import { init_agent_session_key, resolveAgentIdFromSessionKey } from "../../routing/agent-session-key.js";
|
|
5
5
|
//#region src/storage/sqlite/row-mappers.ts
|
|
6
6
|
init_agent_session_key();
|
|
7
7
|
function parseJson(raw) {
|
|
@@ -31,7 +31,7 @@ function ensureXopcDatabaseSchema(db) {
|
|
|
31
31
|
bootstrapFreshDatabase(db);
|
|
32
32
|
currentVersion = 11;
|
|
33
33
|
}
|
|
34
|
-
applyPendingMigrations(db, { targetVersion:
|
|
34
|
+
applyPendingMigrations(db, { targetVersion: 37 });
|
|
35
35
|
}
|
|
36
36
|
//#endregion
|
|
37
37
|
export { SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_SCHEMA_VERSION, ensureSchemaMetaTable, ensureXopcDatabaseSchema, readSchemaVersion, readSchemaVersionForTest, setSchemaVersion };
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
|
|
2
|
-
import { init_agent_scope, listAgentEntries, normalizeAgentId } from "../../agent/agent-scope.js";
|
|
3
|
-
import { init_agent_session_key, resolveAgentIdFromSessionKey } from "../../routing/agent-session-key.js";
|
|
4
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
5
2
|
import { init_logger } from "../../utils/logger.js";
|
|
6
|
-
import { loadConfig, saveConfig } from "../../config/loader.js";
|
|
7
3
|
import { openXopcDatabase } from "../../storage/sqlite/connection.js";
|
|
4
|
+
import { init_agent_session_key, resolveAgentIdFromSessionKey } from "../../routing/agent-session-key.js";
|
|
8
5
|
import { getSessionMetadata } from "../../storage/sqlite/session-repository.js";
|
|
9
6
|
import "../../storage/sqlite/index.js";
|
|
7
|
+
import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
|
|
8
|
+
import { init_agent_scope, listAgentEntries, normalizeAgentId } from "../../agent/agent-scope.js";
|
|
9
|
+
import { loadConfig, saveConfig } from "../../config/loader.js";
|
|
10
10
|
import { effectiveWorkspacePathForSession } from "../../session/session-workspace.js";
|
|
11
11
|
import { createCreateShareTool, isShareToolAvailable } from "../../agent/tools/create-share-tool.js";
|
|
12
12
|
import { ProjectService } from "../../projects/project-service.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { tmpdir } from "node:os";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
4
|
-
import { randomUUID } from "node:crypto";
|
|
5
4
|
import { spawnSync } from "node:child_process";
|
|
5
|
+
import { randomUUID } from "node:crypto";
|
|
6
6
|
//#region src/tui/clipboard-image.ts
|
|
7
7
|
const SUPPORTED_IMAGE_MIME_TYPES = [
|
|
8
8
|
"image/png",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { parseAgentSessionKey } from "../routing/session-key-utils.js";
|
|
2
|
-
import { init_agent_session_key } from "../routing/agent-session-key.js";
|
|
3
1
|
import { getLogDir } from "../utils/logger/config.js";
|
|
4
2
|
import { getRuntimeLogStats } from "../utils/logger/stats.js";
|
|
5
3
|
import { init_logger } from "../utils/logger.js";
|
|
4
|
+
import { parseAgentSessionKey } from "../routing/session-key-utils.js";
|
|
5
|
+
import { init_agent_session_key } from "../routing/agent-session-key.js";
|
|
6
6
|
import { resolveConfigPath } from "../config/paths.js";
|
|
7
7
|
import { getProviderDisplayName, getSortedProviders, init_providers, providerSupportsApiKey, providerSupportsOAuth } from "../providers/index.js";
|
|
8
8
|
import { createWorkflowCatalog } from "../agent/workflow/catalog.js";
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
+
import { closeXopcDatabase, isXopcDatabaseOpen, openXopcDatabase } from "../storage/sqlite/connection.js";
|
|
1
2
|
import { parseAgentSessionKey } from "../routing/session-key-utils.js";
|
|
2
3
|
import { init_agent_session_key, isValidAgentId, normalizeAgentId } from "../routing/agent-session-key.js";
|
|
4
|
+
import { getSessionMetadata } from "../storage/sqlite/session-repository.js";
|
|
5
|
+
import "../storage/sqlite/index.js";
|
|
3
6
|
import { resolveConfigPath } from "../config/paths.js";
|
|
4
7
|
import { loadConfig } from "../config/loader.js";
|
|
5
8
|
import { init_providers, providerSupportsOAuth } from "../providers/index.js";
|
|
6
|
-
import { closeXopcDatabase, isXopcDatabaseOpen, openXopcDatabase } from "../storage/sqlite/connection.js";
|
|
7
9
|
import { GoalService } from "../goals/goal-service.js";
|
|
8
10
|
import "../goals/index.js";
|
|
9
|
-
import { getSessionMetadata } from "../storage/sqlite/session-repository.js";
|
|
10
|
-
import "../storage/sqlite/index.js";
|
|
11
11
|
import { ProjectService } from "../projects/project-service.js";
|
|
12
12
|
import { isValidProjectAgentId, normalizeProjectAgentId } from "../projects/project-agent.js";
|
|
13
13
|
import { inferSuggestedProjectDefaultAgentId } from "../projects/project-agent-suggestion.js";
|
package/dist/src/tui/tui.js
CHANGED
|
@@ -56,8 +56,8 @@ import { createTuiExtensionRuntime } from "./extension-host/runtime.js";
|
|
|
56
56
|
import { tmpdir } from "node:os";
|
|
57
57
|
import { dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
58
58
|
import { mkdirSync, mkdtempSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
59
|
-
import { randomUUID } from "node:crypto";
|
|
60
59
|
import { spawnSync } from "node:child_process";
|
|
60
|
+
import { randomUUID } from "node:crypto";
|
|
61
61
|
import { Container, Loader, ProcessTerminal, TUI, setKeybindings } from "@earendil-works/pi-tui";
|
|
62
62
|
import { Buffer } from "node:buffer";
|
|
63
63
|
//#region src/tui/tui.ts
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { MemoryKind, MemoryRecord } from '../agent/memory/types.js';
|
|
2
2
|
import type { ConnectorDefinition, ConnectorInstance } from '../connectors/types.js';
|
|
3
|
+
import type { KnowledgeSourceItem, KnowledgeSyncRun } from '../knowledge/types.js';
|
|
3
4
|
export type UserContextFacet = 'basics' | 'collaboration' | 'boundaries' | 'priorities' | 'people' | 'current';
|
|
4
5
|
export type UserContextOrigin = 'told_by_you' | 'observed' | 'inferred' | 'connected_source';
|
|
5
6
|
export declare function isUserContextRecord(record: MemoryRecord): boolean;
|
|
@@ -29,10 +30,10 @@ export declare function projectUserContextRecord(record: MemoryRecord): {
|
|
|
29
30
|
};
|
|
30
31
|
export declare function isPersonalContextConnector(definition: ConnectorDefinition): boolean;
|
|
31
32
|
export declare function recordsDerivedFromPersonalContextSource(records: MemoryRecord[], agentId: string, connectorId: string): MemoryRecord[];
|
|
32
|
-
export declare function projectPersonalContextSources(definitions: ConnectorDefinition[], instances: ConnectorInstance[], records?: MemoryRecord[]
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
export declare function projectPersonalContextSources(definitions: ConnectorDefinition[], instances: ConnectorInstance[], records?: MemoryRecord[], knowledge?: {
|
|
34
|
+
sourceItems?: KnowledgeSourceItem[];
|
|
35
|
+
syncRuns?: KnowledgeSyncRun[];
|
|
36
|
+
}): {
|
|
36
37
|
category: import("../connectors/types.js").ConnectorCategory;
|
|
37
38
|
capabilities: ("context" | "tools" | "events" | "memory_source")[];
|
|
38
39
|
access: {
|
|
@@ -51,4 +52,12 @@ export declare function projectPersonalContextSources(definitions: ConnectorDefi
|
|
|
51
52
|
lastHealthStatus: import("../connectors/types.js").ConnectorHealthStatus;
|
|
52
53
|
lastActivityAt: string;
|
|
53
54
|
derivedUnderstandingCount: number;
|
|
55
|
+
knowledgeItemCount: number;
|
|
56
|
+
lastSyncAt: string;
|
|
57
|
+
lastSyncStatus: import("../knowledge/types.js").KnowledgeSyncRunStatus;
|
|
58
|
+
lastSyncError: string;
|
|
59
|
+
branding?: import("../connectors/types.js").ConnectorBranding;
|
|
60
|
+
id: string;
|
|
61
|
+
displayName: string;
|
|
62
|
+
description: string;
|
|
54
63
|
}[];
|
|
@@ -70,7 +70,7 @@ function isPersonalContextConnector(definition) {
|
|
|
70
70
|
function recordsDerivedFromPersonalContextSource(records, agentId, connectorId) {
|
|
71
71
|
return records.filter((record) => record.scope.agentId === agentId && record.source.provider === connectorId && isUserContextRecord(record));
|
|
72
72
|
}
|
|
73
|
-
function projectPersonalContextSources(definitions, instances, records = []) {
|
|
73
|
+
function projectPersonalContextSources(definitions, instances, records = [], knowledge = {}) {
|
|
74
74
|
const instanceByConnector = /* @__PURE__ */ new Map();
|
|
75
75
|
for (const instance of instances) {
|
|
76
76
|
const current = instanceByConnector.get(instance.connectorId) ?? [];
|
|
@@ -80,6 +80,9 @@ function projectPersonalContextSources(definitions, instances, records = []) {
|
|
|
80
80
|
return definitions.filter(isPersonalContextConnector).map((definition) => {
|
|
81
81
|
const connected = instanceByConnector.get(definition.id) ?? [];
|
|
82
82
|
const relatedRecords = records.filter((record) => record.source.provider === definition.id);
|
|
83
|
+
const sourceItems = (knowledge.sourceItems ?? []).filter((item) => item.metadata.connectorId === definition.id);
|
|
84
|
+
const sourceInstanceIds = new Set(sourceItems.map((item) => item.sourceInstanceId));
|
|
85
|
+
const latestSync = (knowledge.syncRuns ?? []).filter((run) => sourceInstanceIds.has(run.sourceInstanceId) || run.sourceInstanceId.startsWith(`composio:${definition.id}:`) || run.sourceInstanceId.startsWith(`${definition.id}:`)).sort((left, right) => Date.parse(right.startedAt) - Date.parse(left.startedAt))[0];
|
|
83
86
|
const latestHealth = connected.filter((instance) => instance.usage.lastHealthCheckAt && instance.usage.lastHealthStatus).sort((left, right) => Date.parse(right.usage.lastHealthCheckAt) - Date.parse(left.usage.lastHealthCheckAt))[0]?.usage;
|
|
84
87
|
const permissionDetails = definition.permissions?.data ?? [];
|
|
85
88
|
const canWrite = permissionDetails.some((permission) => /(?:^|[.:/_-])(write|create|update|delete|manage|send|admin)(?:$|[.:/_-])/i.test(permission));
|
|
@@ -87,6 +90,7 @@ function projectPersonalContextSources(definitions, instances, records = []) {
|
|
|
87
90
|
id: definition.id,
|
|
88
91
|
displayName: definition.displayName,
|
|
89
92
|
description: definition.description,
|
|
93
|
+
...definition.branding ? { branding: definition.branding } : {},
|
|
90
94
|
category: definition.category,
|
|
91
95
|
capabilities: definition.capabilities.filter((capability) => capability === "context" || capability === "memory_source" || capability === "tools" || capability === "events"),
|
|
92
96
|
access: {
|
|
@@ -103,12 +107,20 @@ function projectPersonalContextSources(definitions, instances, records = []) {
|
|
|
103
107
|
lastConnectedAt: connected.map((instance) => instance.lastConnectedAt).filter((value) => Boolean(value)).sort().at(-1),
|
|
104
108
|
lastHealthCheckAt: latestHealth?.lastHealthCheckAt,
|
|
105
109
|
lastHealthStatus: latestHealth?.lastHealthStatus,
|
|
106
|
-
lastActivityAt:
|
|
107
|
-
instance
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
lastActivityAt: [
|
|
111
|
+
...connected.flatMap((instance) => [
|
|
112
|
+
instance.lastConnectedAt,
|
|
113
|
+
instance.usage.lastHealthCheckAt,
|
|
114
|
+
...instance.audit.map((entry) => entry.at)
|
|
115
|
+
]),
|
|
116
|
+
latestSync?.finishedAt,
|
|
117
|
+
latestSync?.startedAt
|
|
118
|
+
].filter((value) => Boolean(value)).sort().at(-1),
|
|
119
|
+
derivedUnderstandingCount: relatedRecords.length,
|
|
120
|
+
knowledgeItemCount: sourceItems.filter((item) => !item.deletedAt).length,
|
|
121
|
+
lastSyncAt: latestSync?.finishedAt ?? latestSync?.startedAt,
|
|
122
|
+
lastSyncStatus: latestSync?.status,
|
|
123
|
+
lastSyncError: latestSync?.error
|
|
112
124
|
};
|
|
113
125
|
}).sort((left, right) => {
|
|
114
126
|
if (left.installed !== right.installed) return left.installed ? -1 : 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projection.js","names":[],"sources":["../../../src/user-context/projection.ts"],"sourcesContent":["import type { MemoryKind, MemoryRecord } from '../agent/memory/types.js';\nimport { effectiveMemoryStatus, resolveMemoryStability } from '../agent/memory/lifecycle.js';\nimport { classifyMemoryContextOrigin } from '../agent/memory/source-origin.js';\nimport type { ConnectorDefinition, ConnectorInstance } from '../connectors/types.js';\n\nexport type UserContextFacet =\n | 'basics'\n | 'collaboration'\n | 'boundaries'\n | 'priorities'\n | 'people'\n | 'current';\n\nexport type UserContextOrigin = 'told_by_you' | 'observed' | 'inferred' | 'connected_source';\n\nconst ALWAYS_PERSONAL_KINDS = new Set<MemoryKind>([\n 'user_profile',\n 'preference',\n 'boundary',\n 'relationship',\n 'commitment',\n 'routine',\n 'personal_logistics',\n 'current_state',\n 'tool_preference',\n 'long_term_goal',\n]);\n\nconst CONTEXTUAL_USER_KINDS = new Set<MemoryKind>([\n 'project_context',\n 'open_question',\n 'milestone',\n 'derived_insight',\n 'task_lesson',\n]);\n\nexport function isUserContextRecord(record: MemoryRecord): boolean {\n if (ALWAYS_PERSONAL_KINDS.has(record.kind)) return true;\n return CONTEXTUAL_USER_KINDS.has(record.kind) && record.tags?.includes('user-understanding') === true;\n}\n\nexport function isUserContextMemoryKind(value: unknown): value is MemoryKind {\n return typeof value === 'string'\n && (ALWAYS_PERSONAL_KINDS.has(value as MemoryKind) || CONTEXTUAL_USER_KINDS.has(value as MemoryKind));\n}\n\nexport function facetForMemoryKind(kind: MemoryKind): UserContextFacet {\n if (kind === 'user_profile' || kind === 'personal_logistics') return 'basics';\n if (kind === 'preference' || kind === 'routine' || kind === 'tool_preference' || kind === 'task_lesson') {\n return 'collaboration';\n }\n if (kind === 'boundary') return 'boundaries';\n if (kind === 'relationship') return 'people';\n if (kind === 'current_state' || kind === 'open_question') return 'current';\n return 'priorities';\n}\n\nexport function originForMemoryRecord(record: MemoryRecord): UserContextOrigin {\n const origin = classifyMemoryContextOrigin(record);\n return origin === 'told_by_user' ? 'told_by_you' : origin;\n}\n\nexport function projectUserContextRecord(record: MemoryRecord) {\n const lifecycle = resolveMemoryStability(record);\n const latestEvidenceAt = record.evidence\n ?.map((evidence) => evidence.observedAt)\n .filter((value): value is string => Boolean(value))\n .sort()\n .at(-1);\n return {\n id: record.id,\n statement: record.content,\n facet: facetForMemoryKind(record.kind),\n kind: record.kind,\n status: effectiveMemoryStatus(record),\n origin: originForMemoryRecord(record),\n sourceName: record.source.provider ?? 'local',\n updatedAt: record.updatedAt,\n sensitivity: record.sensitivity ?? 'normal',\n explicitness: record.explicitness,\n durability: record.durability,\n canReference: record.disclosurePolicy !== 'silent',\n stability: lifecycle.band,\n stabilityScore: lifecycle.score,\n reviewAt: lifecycle.reviewAt,\n reviewDue: lifecycle.reviewDue,\n evidenceCount: record.evidence?.length ?? 0,\n sourcePath: record.source.path,\n latestEvidenceAt,\n };\n}\n\nexport function isPersonalContextConnector(definition: ConnectorDefinition): boolean {\n return definition.capabilities.includes('context') || definition.capabilities.includes('memory_source');\n}\n\nexport function recordsDerivedFromPersonalContextSource(\n records: MemoryRecord[],\n agentId: string,\n connectorId: string,\n): MemoryRecord[] {\n return records.filter((record) => (\n record.scope.agentId === agentId\n && record.source.provider === connectorId\n && isUserContextRecord(record)\n ));\n}\n\nexport function projectPersonalContextSources(\n definitions: ConnectorDefinition[],\n instances: ConnectorInstance[],\n records: MemoryRecord[] = [],\n) {\n const instanceByConnector = new Map<string, ConnectorInstance[]>();\n for (const instance of instances) {\n const current = instanceByConnector.get(instance.connectorId) ?? [];\n current.push(instance);\n instanceByConnector.set(instance.connectorId, current);\n }\n return definitions\n .filter(isPersonalContextConnector)\n .map((definition) => {\n const connected = instanceByConnector.get(definition.id) ?? [];\n const relatedRecords = records.filter((record) => record.source.provider === definition.id);\n const latestHealth = connected\n .filter((instance) => instance.usage.lastHealthCheckAt && instance.usage.lastHealthStatus)\n .sort((left, right) => (\n Date.parse(right.usage.lastHealthCheckAt!) - Date.parse(left.usage.lastHealthCheckAt!)\n ))[0]?.usage;\n const permissionDetails = definition.permissions?.data ?? [];\n const canWrite = permissionDetails.some((permission) => (\n /(?:^|[.:/_-])(write|create|update|delete|manage|send|admin)(?:$|[.:/_-])/i.test(permission)\n ));\n return {\n id: definition.id,\n displayName: definition.displayName,\n description: definition.description,\n category: definition.category,\n capabilities: definition.capabilities.filter((capability) => (\n capability === 'context' || capability === 'memory_source' || capability === 'tools' || capability === 'events'\n )),\n access: {\n context: definition.capabilities.includes('context'),\n memory: definition.capabilities.includes('memory_source'),\n read: definition.capabilities.includes('context')\n || definition.capabilities.includes('resources')\n || definition.capabilities.includes('tools'),\n write: canWrite,\n },\n permissionDetails,\n installed: connected.length > 0,\n enabled: connected.some((instance) => instance.enabled),\n status: connected[0]?.status ?? 'not_installed',\n instanceId: connected[0]?.instanceId,\n lastConnectedAt: connected\n .map((instance) => instance.lastConnectedAt)\n .filter((value): value is string => Boolean(value))\n .sort()\n .at(-1),\n lastHealthCheckAt: latestHealth?.lastHealthCheckAt,\n lastHealthStatus: latestHealth?.lastHealthStatus,\n lastActivityAt: connected\n .flatMap((instance) => [\n instance.lastConnectedAt,\n instance.usage.lastHealthCheckAt,\n ...instance.audit.map((entry) => entry.at),\n ])\n .filter((value): value is string => Boolean(value))\n .sort()\n .at(-1),\n derivedUnderstandingCount: relatedRecords.length,\n };\n })\n .sort((left, right) => {\n if (left.installed !== right.installed) return left.installed ? -1 : 1;\n return left.displayName.localeCompare(right.displayName);\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"projection.js","names":[],"sources":["../../../src/user-context/projection.ts"],"sourcesContent":["import type { MemoryKind, MemoryRecord } from '../agent/memory/types.js';\nimport { effectiveMemoryStatus, resolveMemoryStability } from '../agent/memory/lifecycle.js';\nimport { classifyMemoryContextOrigin } from '../agent/memory/source-origin.js';\nimport type { ConnectorDefinition, ConnectorInstance } from '../connectors/types.js';\nimport type { KnowledgeSourceItem, KnowledgeSyncRun } from '../knowledge/types.js';\n\nexport type UserContextFacet =\n | 'basics'\n | 'collaboration'\n | 'boundaries'\n | 'priorities'\n | 'people'\n | 'current';\n\nexport type UserContextOrigin = 'told_by_you' | 'observed' | 'inferred' | 'connected_source';\n\nconst ALWAYS_PERSONAL_KINDS = new Set<MemoryKind>([\n 'user_profile',\n 'preference',\n 'boundary',\n 'relationship',\n 'commitment',\n 'routine',\n 'personal_logistics',\n 'current_state',\n 'tool_preference',\n 'long_term_goal',\n]);\n\nconst CONTEXTUAL_USER_KINDS = new Set<MemoryKind>([\n 'project_context',\n 'open_question',\n 'milestone',\n 'derived_insight',\n 'task_lesson',\n]);\n\nexport function isUserContextRecord(record: MemoryRecord): boolean {\n if (ALWAYS_PERSONAL_KINDS.has(record.kind)) return true;\n return CONTEXTUAL_USER_KINDS.has(record.kind) && record.tags?.includes('user-understanding') === true;\n}\n\nexport function isUserContextMemoryKind(value: unknown): value is MemoryKind {\n return typeof value === 'string'\n && (ALWAYS_PERSONAL_KINDS.has(value as MemoryKind) || CONTEXTUAL_USER_KINDS.has(value as MemoryKind));\n}\n\nexport function facetForMemoryKind(kind: MemoryKind): UserContextFacet {\n if (kind === 'user_profile' || kind === 'personal_logistics') return 'basics';\n if (kind === 'preference' || kind === 'routine' || kind === 'tool_preference' || kind === 'task_lesson') {\n return 'collaboration';\n }\n if (kind === 'boundary') return 'boundaries';\n if (kind === 'relationship') return 'people';\n if (kind === 'current_state' || kind === 'open_question') return 'current';\n return 'priorities';\n}\n\nexport function originForMemoryRecord(record: MemoryRecord): UserContextOrigin {\n const origin = classifyMemoryContextOrigin(record);\n return origin === 'told_by_user' ? 'told_by_you' : origin;\n}\n\nexport function projectUserContextRecord(record: MemoryRecord) {\n const lifecycle = resolveMemoryStability(record);\n const latestEvidenceAt = record.evidence\n ?.map((evidence) => evidence.observedAt)\n .filter((value): value is string => Boolean(value))\n .sort()\n .at(-1);\n return {\n id: record.id,\n statement: record.content,\n facet: facetForMemoryKind(record.kind),\n kind: record.kind,\n status: effectiveMemoryStatus(record),\n origin: originForMemoryRecord(record),\n sourceName: record.source.provider ?? 'local',\n updatedAt: record.updatedAt,\n sensitivity: record.sensitivity ?? 'normal',\n explicitness: record.explicitness,\n durability: record.durability,\n canReference: record.disclosurePolicy !== 'silent',\n stability: lifecycle.band,\n stabilityScore: lifecycle.score,\n reviewAt: lifecycle.reviewAt,\n reviewDue: lifecycle.reviewDue,\n evidenceCount: record.evidence?.length ?? 0,\n sourcePath: record.source.path,\n latestEvidenceAt,\n };\n}\n\nexport function isPersonalContextConnector(definition: ConnectorDefinition): boolean {\n return definition.capabilities.includes('context') || definition.capabilities.includes('memory_source');\n}\n\nexport function recordsDerivedFromPersonalContextSource(\n records: MemoryRecord[],\n agentId: string,\n connectorId: string,\n): MemoryRecord[] {\n return records.filter((record) => (\n record.scope.agentId === agentId\n && record.source.provider === connectorId\n && isUserContextRecord(record)\n ));\n}\n\nexport function projectPersonalContextSources(\n definitions: ConnectorDefinition[],\n instances: ConnectorInstance[],\n records: MemoryRecord[] = [],\n knowledge: { sourceItems?: KnowledgeSourceItem[]; syncRuns?: KnowledgeSyncRun[] } = {},\n) {\n const instanceByConnector = new Map<string, ConnectorInstance[]>();\n for (const instance of instances) {\n const current = instanceByConnector.get(instance.connectorId) ?? [];\n current.push(instance);\n instanceByConnector.set(instance.connectorId, current);\n }\n return definitions\n .filter(isPersonalContextConnector)\n .map((definition) => {\n const connected = instanceByConnector.get(definition.id) ?? [];\n const relatedRecords = records.filter((record) => record.source.provider === definition.id);\n const sourceItems = (knowledge.sourceItems ?? []).filter((item) => item.metadata.connectorId === definition.id);\n const sourceInstanceIds = new Set(sourceItems.map((item) => item.sourceInstanceId));\n const latestSync = (knowledge.syncRuns ?? [])\n .filter((run) => (\n sourceInstanceIds.has(run.sourceInstanceId)\n || run.sourceInstanceId.startsWith(`composio:${definition.id}:`)\n || run.sourceInstanceId.startsWith(`${definition.id}:`)\n ))\n .sort((left, right) => Date.parse(right.startedAt) - Date.parse(left.startedAt))[0];\n const latestHealth = connected\n .filter((instance) => instance.usage.lastHealthCheckAt && instance.usage.lastHealthStatus)\n .sort((left, right) => (\n Date.parse(right.usage.lastHealthCheckAt!) - Date.parse(left.usage.lastHealthCheckAt!)\n ))[0]?.usage;\n const permissionDetails = definition.permissions?.data ?? [];\n const canWrite = permissionDetails.some((permission) => (\n /(?:^|[.:/_-])(write|create|update|delete|manage|send|admin)(?:$|[.:/_-])/i.test(permission)\n ));\n return {\n id: definition.id,\n displayName: definition.displayName,\n description: definition.description,\n ...(definition.branding ? { branding: definition.branding } : {}),\n category: definition.category,\n capabilities: definition.capabilities.filter((capability) => (\n capability === 'context' || capability === 'memory_source' || capability === 'tools' || capability === 'events'\n )),\n access: {\n context: definition.capabilities.includes('context'),\n memory: definition.capabilities.includes('memory_source'),\n read: definition.capabilities.includes('context')\n || definition.capabilities.includes('resources')\n || definition.capabilities.includes('tools'),\n write: canWrite,\n },\n permissionDetails,\n installed: connected.length > 0,\n enabled: connected.some((instance) => instance.enabled),\n status: connected[0]?.status ?? 'not_installed',\n instanceId: connected[0]?.instanceId,\n lastConnectedAt: connected\n .map((instance) => instance.lastConnectedAt)\n .filter((value): value is string => Boolean(value))\n .sort()\n .at(-1),\n lastHealthCheckAt: latestHealth?.lastHealthCheckAt,\n lastHealthStatus: latestHealth?.lastHealthStatus,\n lastActivityAt: [\n ...connected.flatMap((instance) => [\n instance.lastConnectedAt,\n instance.usage.lastHealthCheckAt,\n ...instance.audit.map((entry) => entry.at),\n ]),\n latestSync?.finishedAt,\n latestSync?.startedAt,\n ]\n .filter((value): value is string => Boolean(value))\n .sort()\n .at(-1),\n derivedUnderstandingCount: relatedRecords.length,\n knowledgeItemCount: sourceItems.filter((item) => !item.deletedAt).length,\n lastSyncAt: latestSync?.finishedAt ?? latestSync?.startedAt,\n lastSyncStatus: latestSync?.status,\n lastSyncError: latestSync?.error,\n };\n })\n .sort((left, right) => {\n if (left.installed !== right.installed) return left.installed ? -1 : 1;\n return left.displayName.localeCompare(right.displayName);\n });\n}\n"],"mappings":"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"}
|
package/dist/src/utils/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import { getAsyncLogContext, inboundCorrelationMetadataFromAsyncLogContext, runWithLogContext, updateAsyncLogContext } from "./logger/context.js";
|
|
1
2
|
import { getLogDir, getLoggerConfig } from "./logger/config.js";
|
|
2
3
|
import { getRuntimeLogStats } from "./logger/stats.js";
|
|
3
4
|
import { flushAndClose, isLoggerShuttingDown, setShuttingDown } from "./logger/shutdown.js";
|
|
4
5
|
import { cleanOldLogs, rotateLogs } from "./logger/rotation.js";
|
|
5
|
-
import { getAsyncLogContext, inboundCorrelationMetadataFromAsyncLogContext, runWithLogContext, updateAsyncLogContext } from "./logger/context.js";
|
|
6
6
|
import { isLogRedactionEnabled, redactObject, redactPemBlock, redactSecret, redactSensitiveInfo } from "./logger/redact.js";
|
|
7
7
|
import { exportLog, flushExporters, getExporters, initializeExporters } from "./logger/exporters.js";
|
|
8
8
|
import { configureAuditLog, getAuditConfig, logAuditEvent, logAuthEvent, logConfigChange, logDataAccess, logPermissionChange } from "./logger/audit.js";
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { PACKAGE_VERSION, init_package_version } from "../../package-version.js";
|
|
3
|
+
import { getAsyncLogContext, getAsyncLogCorrelationKeys, inboundCorrelationMetadataFromAsyncLogContext, init_context, mergeContext, runWithLogContext, updateAsyncLogContext } from "./context.js";
|
|
3
4
|
import { config, getLogDir, getLoggerConfig, init_config } from "./config.js";
|
|
4
5
|
import { init_streams, initializeStreams } from "./streams.js";
|
|
5
6
|
import { getRuntimeLogStats, incrementStats, init_stats } from "./stats.js";
|
|
6
7
|
import { flushAndClose, init_shutdown, isLoggerShuttingDown, setShuttingDown } from "./shutdown.js";
|
|
7
8
|
import { cleanOldLogs, init_rotation, rotateLogs } from "./rotation.js";
|
|
8
|
-
import { getAsyncLogContext, getAsyncLogCorrelationKeys, inboundCorrelationMetadataFromAsyncLogContext, init_context, mergeContext, runWithLogContext, updateAsyncLogContext } from "./context.js";
|
|
9
9
|
import { init_redact, isLogRedactionEnabled, redactLogRecord, redactObject, redactPemBlock, redactSecret, redactSensitiveInfo } from "./redact.js";
|
|
10
10
|
import { exportLog, flushExporters, getExporters, init_exporters, initializeExporters } from "./exporters.js";
|
|
11
11
|
import { configureAuditLog, getAuditConfig, init_audit, logAuditEvent, logAuthEvent, logConfigChange, logDataAccess, logPermissionChange } from "./audit.js";
|
package/dist/src/utils/logger.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { getAsyncLogContext, inboundCorrelationMetadataFromAsyncLogContext, runWithLogContext, updateAsyncLogContext } from "./logger/context.js";
|
|
2
3
|
import { getLogDir, getLoggerConfig } from "./logger/config.js";
|
|
3
4
|
import { getRuntimeLogStats } from "./logger/stats.js";
|
|
4
5
|
import { flushAndClose, isLoggerShuttingDown, setShuttingDown } from "./logger/shutdown.js";
|
|
5
6
|
import { cleanOldLogs, rotateLogs } from "./logger/rotation.js";
|
|
6
|
-
import { getAsyncLogContext, inboundCorrelationMetadataFromAsyncLogContext, runWithLogContext, updateAsyncLogContext } from "./logger/context.js";
|
|
7
7
|
import { isLogRedactionEnabled, redactObject, redactPemBlock, redactSecret, redactSensitiveInfo } from "./logger/redact.js";
|
|
8
8
|
import { exportLog, flushExporters, getExporters, initializeExporters } from "./logger/exporters.js";
|
|
9
9
|
import { configureAuditLog, getAuditConfig, logAuditEvent, logAuthEvent, logConfigChange, logDataAccess, logPermissionChange } from "./logger/audit.js";
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Config } from '../config/schema.js';
|
|
2
|
+
export type ProductLanguage = 'en' | 'zh';
|
|
3
|
+
export type VoiceLanguageMode = 'auto' | 'manual';
|
|
4
|
+
export interface VoiceLanguageProfile {
|
|
5
|
+
language: ProductLanguage;
|
|
6
|
+
sttLanguage: 'auto' | 'en';
|
|
7
|
+
edgeLanguage: 'en-US' | 'zh-CN';
|
|
8
|
+
edgeVoice: 'en-US-MichelleNeural' | 'zh-CN-XiaoxiaoNeural';
|
|
9
|
+
}
|
|
10
|
+
export declare function resolveVoiceLanguageProfile(language: ProductLanguage): VoiceLanguageProfile;
|
|
11
|
+
export declare function inferProductLanguageFromEnvironment(): ProductLanguage;
|
|
12
|
+
/**
|
|
13
|
+
* Install safe product defaults while preserving every explicit on/off choice.
|
|
14
|
+
* Older configs with a persisted language or Edge voice are treated as manual.
|
|
15
|
+
*/
|
|
16
|
+
export declare function initializeVoiceDefaults(config: Config, language?: ProductLanguage): boolean;
|
|
17
|
+
/** Apply product language only to providers whose language mapping is known. */
|
|
18
|
+
export declare function applyAutomaticVoiceLanguage(config: Config, language: ProductLanguage): boolean;
|
|
19
|
+
/** Start the model download without delaying gateway readiness. */
|
|
20
|
+
export declare function prepareConfiguredLocalVoiceModel(config: Config): void;
|