@xopcai/xopc 0.0.113 → 0.0.115
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/outbound/media-load.js +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/update-offset-store.js +1 -1
- 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 +2 -2
- package/dist/extensions/weixin/src/auth/accounts.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
- package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CBlklyNr.js → agent-avatar-dicebear-DVnBfANm.js} +1 -1
- package/dist/gateway/static/root/assets/agent-browser-settings-page-DPXc4hz8.js +6 -0
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CTJ0YnRQ.js +1 -0
- package/dist/gateway/static/root/assets/agents-zJXQfJ_W.js +71 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-28E_WfMe.js → app-management-settings-panel-DzGbdr04.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-Do1z0XgJ.js → appearance-settings-BQpPSTHD.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-CPjfyzSD.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-BAFlsov_.js → archive-plugin-CXu-Csep.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-V3qGPC3x.js → attachment-load-BAjgOoGY.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-DT8NvA6W.js → binary-plugins-BSBgB2hO.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-CdLMEcHd.js → block-editor-BpXw9TTR.js} +3 -3
- package/dist/gateway/static/root/assets/channels-settings-BbPUpzWB.js +1 -0
- package/dist/gateway/static/root/assets/{config-api-Bf5mjpu7.js → config-api-NOoPiIYz.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-settings-CAXYMOdp.js +2 -0
- package/dist/gateway/static/root/assets/{cron-api--pAB_rps.js → cron-api-C9BOqAXd.js} +1 -1
- package/dist/gateway/static/root/assets/cron-page-DuUbBeKI.js +3 -0
- package/dist/gateway/static/root/assets/{dreaming-settings-6UZE1FSK.js → dreaming-settings-DQ4DtiK1.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-BGhE7msg.js → extension-debug-page-D9kgUHCc.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CvpI45WG.js → extension-page-CGyhXqzR.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DAmR5FUe.js → extension-settings-page-DL8Xquqd.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-NZmjSXLl.js → fetch-D0VXA932.js} +1 -1
- package/dist/gateway/static/root/assets/{format-interval-label-qhth3BMV.js → format-interval-label-Be8SmgUw.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-CaXBt-9R.js → gateway-config-api-C-xjn__h.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-DphpbLBc.js → gateway-settings-BMPwIjKI.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-Be1omjh3.js → gateway-startup-retry-DERUH61L.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-BJsyjJnF.js +1 -0
- package/dist/gateway/static/root/assets/goals-config-api-BPmqWk90.js +1 -0
- package/dist/gateway/static/root/assets/goals-page-BerDgIhw.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-ByTjeAto.js +1 -0
- package/dist/gateway/static/root/assets/{heartbeat-config-api-BzO6G4fD.js → heartbeat-config-api-Bfdzr8oV.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-DCST9-du.js → heartbeat-settings-TbHgcjTn.js} +1 -1
- package/dist/gateway/static/root/assets/index-AkTrf6Pb.js +122 -0
- package/dist/gateway/static/root/assets/index-fh5sXTj9.css +1 -0
- package/dist/gateway/static/root/assets/{interval-presets-DJmshV8n.js → interval-presets-utKbuCRY.js} +1 -1
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-9AUUlQ5Q.js → keyboard-shortcuts-settings-CjqS6c6V.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-DGXuPf5B.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-split-CYYELqAr.js → markdown-split-DW8C47iB.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-BEcMR2M8.js → media-plugins-D6HwDhDT.js} +1 -1
- package/dist/gateway/static/root/assets/messages-upgxw6Ub.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-Bot16nn7.js +2 -0
- package/dist/gateway/static/root/assets/note-detail-page-Brlyou8M.js +2 -0
- package/dist/gateway/static/root/assets/{note-image-lightbox-DNAoPcmm.js → note-image-lightbox-pJM35Pz5.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-DvZ4pwc-.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-BPLz0AIv.js → preview-open-alternatives-CVwHuyN6.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BZEDmxbZ.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-CrWwWRVK.js → save-bar-controls-Ba-UEk7x.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-CF2sadvN.js → schedule-field-CNN9595U.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-Di5cKjYE.js → schema-form-DnNMmtD5.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-DdGGlsfn.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DlkEkPf9.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-Chh282jW.js → settings-collapsible-section-CmOz80i5.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-Dq-83cQd.js → settings-form-section-BmK7JJOV.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-DFPTrsPF.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-CYCCfgh4.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-0FXYnSUA.js → share-preview-page-Dp2qGrHC.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-Bff1pGd0.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-CJGKpBur.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-C6ocduTD.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-W1pTcojB.js → system-settings-panel-5jrIEr5b.js} +1 -1
- package/dist/gateway/static/root/assets/{use-agent-defaults-form-BVRvkK7m.js → use-agent-defaults-form-BuiXLIs5.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-CgJibfMM.js → use-channel-catalog-CHlO8J9G.js} +1 -1
- package/dist/gateway/static/root/assets/{use-settings-tab-guard-Bw_qkRQE.js → use-settings-tab-guard-CW5JORnl.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DDoQyghO.js +1 -0
- package/dist/gateway/static/root/assets/{voice-player-store-C7lziaAx.js → voice-player-store-DDDWYHvg.js} +1 -1
- package/dist/gateway/static/root/assets/workflow-page.utils-CKjeEGqx.js +1 -0
- package/dist/gateway/static/root/assets/workflows-page-B604ehHG.js +18 -0
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/gateway/static/root/logo.svg +4 -3
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +8 -0
- package/dist/src/agent/agent-manager.js +63 -28
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/agent-scope.js +1 -1
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
- package/dist/src/agent/bootstrap/project-agents-context.d.ts +2 -0
- package/dist/src/agent/bootstrap/project-agents-context.js +32 -0
- package/dist/src/agent/bootstrap/project-agents-context.js.map +1 -0
- package/dist/src/agent/context/workspace-seed.js +2 -2
- package/dist/src/agent/context/workspace-state.js +1 -1
- package/dist/src/agent/context/workspace.js +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js +8 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
- package/dist/src/agent/goals/checklist-judge.d.ts +1 -0
- package/dist/src/agent/goals/checklist-judge.js +3 -2
- package/dist/src/agent/goals/checklist-judge.js.map +1 -1
- package/dist/src/agent/goals/evaluate-turn.d.ts +1 -1
- package/dist/src/agent/goals/evaluate-turn.js +1 -0
- package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
- package/dist/src/agent/goals/goal-locale.js +2 -2
- package/dist/src/agent/goals/persistent-goal-service.js +2 -4
- package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
- package/dist/src/agent/goals/post-turn.d.ts +6 -1
- package/dist/src/agent/goals/post-turn.js +15 -6
- package/dist/src/agent/goals/post-turn.js.map +1 -1
- package/dist/src/agent/image/load-image-media.js +2 -2
- package/dist/src/agent/inbound/inbound-loop.js +5 -1
- package/dist/src/agent/inbound/inbound-loop.js.map +1 -1
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +2 -2
- package/dist/src/agent/inbound/turn-dispatcher.js +2 -2
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
- package/dist/src/agent/ipc/inbox.js +3 -3
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.d.ts +27 -0
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +50 -2
- package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +79 -4
- package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-types.d.ts +19 -0
- 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/builtin-memory-store.js +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
- package/dist/src/agent/memory/dreaming/events.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
- package/dist/src/agent/memory/dreaming/preview.js +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/memory/memory-flush.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/prompt/memory/index.js +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
- package/dist/src/agent/reply/post-compaction-context.js +1 -1
- package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
- package/dist/src/agent/sandbox/path-policy.js +2 -2
- package/dist/src/agent/service/btw-query.js +11 -3
- package/dist/src/agent/service/btw-query.js.map +1 -1
- package/dist/src/agent/service/parse-outbound-session-key.js +13 -8
- package/dist/src/agent/service/parse-outbound-session-key.js.map +1 -1
- package/dist/src/agent/service/process-direct-one-shot.d.ts +2 -2
- package/dist/src/agent/service/process-direct-one-shot.js +1 -1
- package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
- package/dist/src/agent/service/process-direct-streaming.js +1 -1
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service.d.ts +1 -1
- package/dist/src/agent/service.js +13 -9
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +5 -0
- package/dist/src/agent/session/session-inspector.js +1 -1
- package/dist/src/agent/skills/config.js +2 -2
- package/dist/src/agent/skills/filesystem-watcher.js +5 -4
- package/dist/src/agent/skills/filesystem-watcher.js.map +1 -1
- package/dist/src/agent/skills/hub-hash.js +2 -2
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +2 -2
- package/dist/src/agent/skills/index.js +4 -3
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/installer.js +2 -2
- package/dist/src/agent/skills/managed-store.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +3 -2
- package/dist/src/agent/skills/skill-manage-ops.js.map +1 -1
- package/dist/src/agent/skills/skill-manager.js +1 -1
- package/dist/src/agent/skills/skill-view-path.js +1 -1
- package/dist/src/agent/skills/test-framework.js +1 -1
- package/dist/src/agent/skills/types.d.ts +1 -1
- package/dist/src/agent/skills/watcher.js +2 -5
- package/dist/src/agent/skills/watcher.js.map +1 -1
- package/dist/src/agent/skills/workspace-skills-dir.d.ts +1 -0
- package/dist/src/agent/skills/workspace-skills-dir.js +11 -0
- package/dist/src/agent/skills/workspace-skills-dir.js.map +1 -0
- package/dist/src/agent/starter-agents.js +1 -1
- package/dist/src/agent/tool-manuals/browser.d.ts +1 -1
- package/dist/src/agent/tool-manuals/browser.js +62 -3
- package/dist/src/agent/tool-manuals/browser.js.map +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +4 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +13 -4
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/browser/tool/schemas.d.ts +0 -2
- package/dist/src/agent/tools/browser/tool/schemas.js +1 -2
- package/dist/src/agent/tools/browser/tool/schemas.js.map +1 -1
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/factory.js +1 -10
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/find.js +1 -1
- package/dist/src/agent/tools/grep.js +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +2 -2
- package/dist/src/agent/tools/skill-manage-tool.js.map +1 -1
- package/dist/src/agent/tools/workflow-tool.js +1 -1
- package/dist/src/agent/workflow/catalog.js +1 -1
- package/dist/src/agent/workflow/snapshot.d.ts +10 -0
- package/dist/src/agent/workflow/snapshot.js +136 -1
- package/dist/src/agent/workflow/snapshot.js.map +1 -1
- package/dist/src/agent/workflow/subagent-runner.js +18 -1
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/ai-assist/text-assist.js +1 -1
- package/dist/src/auth/credentials.js +2 -2
- package/dist/src/auth/profiles/store.js +2 -2
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/browser/actions/extension-registry-bridge.js +91 -7
- package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
- package/dist/src/browser/actions/registry.js +383 -7
- package/dist/src/browser/actions/registry.js.map +1 -1
- package/dist/src/browser/actions/types.d.ts +11 -3
- package/dist/src/browser/cache-dir-policy.js +1 -1
- package/dist/src/browser/cdp-local-launcher.js +2 -2
- package/dist/src/browser/index.js +2 -2
- package/dist/src/browser/pipeline/output.d.ts +18 -16
- package/dist/src/browser/pipeline/output.js +28 -20
- package/dist/src/browser/pipeline/output.js.map +1 -1
- package/dist/src/browser/pipeline/runner.d.ts +7 -14
- package/dist/src/browser/pipeline/runner.js +349 -102
- package/dist/src/browser/pipeline/runner.js.map +1 -1
- package/dist/src/browser/pipeline/schema.d.ts +1 -0
- package/dist/src/browser/pipeline/schema.js +35 -58
- package/dist/src/browser/pipeline/schema.js.map +1 -1
- package/dist/src/browser/pipeline/source.d.ts +2 -0
- package/dist/src/browser/pipeline/source.js +10 -1
- package/dist/src/browser/pipeline/source.js.map +1 -1
- package/dist/src/browser/pipeline/template.d.ts +10 -2
- package/dist/src/browser/pipeline/template.js +50 -8
- package/dist/src/browser/pipeline/template.js.map +1 -1
- package/dist/src/browser/providers/browser-ext-install.js +4 -4
- package/dist/src/browser/providers/cloakbrowser.js +5 -5
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/channels/catalog/channel-catalog-service.d.ts +2 -1
- package/dist/src/channels/catalog/channel-catalog-service.js +133 -16
- package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -1
- package/dist/src/channels/catalog/channel-catalog-types.d.ts +13 -0
- package/dist/src/channels/outbound/persist-store.js +1 -1
- package/dist/src/channels/pairing/allow-from-file.js +1 -1
- package/dist/src/channels/pairing/pairing-store.js +2 -2
- package/dist/src/chat-commands/agent-edit.js +2 -2
- package/dist/src/chat-commands/builtins/config.js +5 -7
- package/dist/src/chat-commands/builtins/config.js.map +1 -1
- package/dist/src/chat-commands/context.d.ts +5 -0
- package/dist/src/chat-commands/context.js +18 -9
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/chat-commands/index.d.ts +1 -1
- package/dist/src/chat-commands/index.js +2 -2
- package/dist/src/chat-commands/index.js.map +1 -1
- package/dist/src/chat-commands/processor.js +22 -21
- package/dist/src/chat-commands/processor.js.map +1 -1
- package/dist/src/chat-commands/session-key.d.ts +3 -15
- package/dist/src/chat-commands/session-key.js +3 -49
- package/dist/src/chat-commands/session-key.js.map +1 -1
- package/dist/src/chat-commands/types.d.ts +4 -0
- package/dist/src/cli/commands/browser-cli-helpers.js +11 -5
- package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
- package/dist/src/cli/commands/config.js +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js +14 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +8 -8
- package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
- package/dist/src/cli/commands/extension-create.js +1 -1
- package/dist/src/cli/commands/extension-dev.js +2 -2
- package/dist/src/cli/commands/extension-marketplace.js +2 -2
- package/dist/src/cli/commands/extension-pack.js +2 -2
- package/dist/src/cli/commands/extension.js +3 -3
- package/dist/src/cli/commands/gateway/logs.js +1 -1
- package/dist/src/cli/commands/image.js +1 -1
- package/dist/src/cli/commands/init.js +2 -2
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/skills-test.js +1 -1
- package/dist/src/cli/templates.js +1 -1
- package/dist/src/cli/utils/gateway-client.js +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +2 -2
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/agent-typed-models.js +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +7 -7
- package/dist/src/config/loader.js +4 -4
- package/dist/src/config/models-json.js +2 -2
- package/dist/src/config/paths-state.js +1 -1
- package/dist/src/config/paths.js +1 -1
- package/dist/src/config/profile.js +1 -1
- package/dist/src/config/reload.js +1 -1
- package/dist/src/config/rules.js +5 -0
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +8 -0
- package/dist/src/config/schema.js +7 -0
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/web-patch.d.ts +1 -0
- package/dist/src/config/web-patch.js +1 -0
- package/dist/src/config/web-patch.js.map +1 -1
- package/dist/src/config/workspace-path.js +1 -1
- package/dist/src/connectors/builtin-catalog.js +180 -1
- package/dist/src/connectors/builtin-catalog.js.map +1 -1
- package/dist/src/connectors/health.js +18 -9
- package/dist/src/connectors/health.js.map +1 -1
- package/dist/src/connectors/types.d.ts +19 -0
- package/dist/src/connectors/usage.js +12 -4
- package/dist/src/connectors/usage.js.map +1 -1
- package/dist/src/cron/executor.js +1 -1
- package/dist/src/cron/service.js +1 -1
- package/dist/src/daemon/constants.js +1 -1
- package/dist/src/daemon/install-plan.js +2 -2
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/schtasks.js +2 -2
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/extensions/bundle-mcp.js +1 -1
- package/dist/src/extensions/discover-extensions.js +2 -2
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/install.js +2 -2
- package/dist/src/extensions/loader.js +2 -2
- package/dist/src/extensions/lockfile.js +3 -3
- package/dist/src/extensions/security.js +1 -1
- package/dist/src/extensions/types/tui.d.ts +2 -0
- package/dist/src/extensions/update.js +2 -2
- package/dist/src/gateway/agents-admin.js +2 -2
- package/dist/src/gateway/file-path-classifier.js +2 -2
- package/dist/src/gateway/heartbeat/service.js +13 -1
- package/dist/src/gateway/heartbeat/service.js.map +1 -1
- package/dist/src/gateway/hono/app.js +18 -5
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -1
- package/dist/src/gateway/hono/lib/config-payload.js +7 -4
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +2 -2
- package/dist/src/gateway/hono/lib/static-ui.js +2 -2
- package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js +19 -5
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -1
- package/dist/src/gateway/hono/oauth-async.js +1 -1
- package/dist/src/gateway/hono/routes/agent-stream.js +6 -6
- package/dist/src/gateway/hono/routes/agent-stream.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/channels.js +18 -14
- package/dist/src/gateway/hono/routes/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +1 -1
- package/dist/src/gateway/hono/routes/config-patch/gateway.js +6 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
- package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
- package/dist/src/gateway/hono/routes/dreaming.js +1 -1
- package/dist/src/gateway/hono/routes/goals.js +16 -3
- package/dist/src/gateway/hono/routes/goals.js.map +1 -1
- package/dist/src/gateway/hono/routes/host-fs.js +2 -2
- package/dist/src/gateway/hono/routes/logs.js +1 -0
- package/dist/src/gateway/hono/routes/logs.js.map +1 -1
- package/dist/src/gateway/hono/routes/mcp.js +27 -8
- package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/notes.js +14 -2
- package/dist/src/gateway/hono/routes/notes.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +62 -4
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/shares.js +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +5 -68
- package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
- package/dist/src/gateway/hono/sse.d.ts +2 -2
- package/dist/src/gateway/hono/sse.js +7 -15
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/lock.js +3 -3
- package/dist/src/gateway/ports.js +1 -1
- package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
- package/dist/src/gateway/rate-limit/buckets.js +12 -0
- package/dist/src/gateway/rate-limit/buckets.js.map +1 -1
- package/dist/src/gateway/resolve-webchat-session-key.d.ts +2 -6
- package/dist/src/gateway/resolve-webchat-session-key.js +5 -31
- package/dist/src/gateway/resolve-webchat-session-key.js.map +1 -1
- package/dist/src/gateway/service/agent-runner.d.ts +2 -3
- package/dist/src/gateway/service/agent-runner.js +9 -22
- package/dist/src/gateway/service/agent-runner.js.map +1 -1
- package/dist/src/gateway/service/config-coordinator.js +1 -1
- package/dist/src/gateway/service/marketplace-service.js +2 -2
- package/dist/src/gateway/service/run-gateway-agent.js +9 -7
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +9 -0
- package/dist/src/gateway/service/sessions-api.js +11 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.d.ts +1 -1
- package/dist/src/gateway/service.js +23 -9
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/workspace-file-search.d.ts +9 -0
- package/dist/src/gateway/workspace-file-search.js +76 -0
- package/dist/src/gateway/workspace-file-search.js.map +1 -0
- package/dist/src/gateway/workspace-fs-file-list.js +1 -1
- package/dist/src/goals/goal-notifications.d.ts +2 -0
- package/dist/src/goals/goal-notifications.js +16 -11
- package/dist/src/goals/goal-notifications.js.map +1 -1
- package/dist/src/goals/goal-service.js +1 -6
- package/dist/src/goals/goal-service.js.map +1 -1
- package/dist/src/goals/goal-workflow-judge.js +2 -2
- package/dist/src/i18n/goals-bundle.js +1 -1
- package/dist/src/i18n/index.js +1 -1
- package/dist/src/i18n/share-tool-bundle.js +2 -2
- package/dist/src/infra/brew.js +1 -1
- package/dist/src/infra/package-json.js +1 -1
- package/dist/src/infra/package-update-steps.js +1 -1
- package/dist/src/infra/path-env.js +2 -2
- package/dist/src/infra/restart.js +1 -1
- package/dist/src/infra/stable-node-path.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-global.js +1 -1
- package/dist/src/infra/update-lock.js +2 -2
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/infra/update-startup.js +1 -1
- package/dist/src/infra/write-file-atomic.js +2 -2
- package/dist/src/media/store.js +1 -1
- package/dist/src/notes/agent-context.js +1 -1
- package/dist/src/notes/service.js +1 -1
- package/dist/src/notes/store.js +2 -2
- package/dist/src/project-trust/trust-store.js +4 -2
- package/dist/src/project-trust/trust-store.js.map +1 -1
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/index.js +1 -1
- package/dist/src/providers/model-registry.js +4 -4
- package/dist/src/session/index.d.ts +1 -1
- package/dist/src/session/index.js +2 -2
- package/dist/src/session/init-session-turn.js +7 -10
- package/dist/src/session/init-session-turn.js.map +1 -1
- package/dist/src/session/manager.d.ts +5 -1
- package/dist/src/session/manager.js +5 -2
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/reset-type.d.ts +0 -2
- package/dist/src/session/reset-type.js +3 -9
- package/dist/src/session/reset-type.js.map +1 -1
- package/dist/src/session/resolve-session.js +10 -21
- package/dist/src/session/resolve-session.js.map +1 -1
- package/dist/src/session/session-title.js +2 -2
- package/dist/src/session/store.d.ts +11 -3
- package/dist/src/session/store.js +30 -14
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/types.d.ts +2 -4
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/share/share-auto.js +2 -2
- package/dist/src/share/share-store.js +3 -3
- package/dist/src/share/share-thumbnail.js +2 -2
- package/dist/src/share/share-zip.js +1 -1
- package/dist/src/share/site-share-store.js +3 -3
- package/dist/src/share/site-static-serve.js +1 -1
- package/dist/src/storage/sqlite/connection.js +1 -1
- package/dist/src/storage/sqlite/index.d.ts +2 -2
- package/dist/src/storage/sqlite/index.js +3 -3
- package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
- package/dist/src/storage/sqlite/migrations/010_session_id_identity.sql +30 -0
- package/dist/src/storage/sqlite/migrations/discover.js +1 -1
- package/dist/src/storage/sqlite/migrations/runner.d.ts +2 -2
- package/dist/src/storage/sqlite/migrations/runner.js +5 -5
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +2 -2
- package/dist/src/storage/sqlite/row-mappers.d.ts +4 -4
- package/dist/src/storage/sqlite/row-mappers.js +11 -14
- package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
- package/dist/src/storage/sqlite/schema.js +4 -4
- package/dist/src/storage/sqlite/schema.js.map +1 -1
- package/dist/src/storage/sqlite/schema.sql +37 -10
- package/dist/src/storage/sqlite/session-metadata.d.ts +2 -7
- package/dist/src/storage/sqlite/session-metadata.js +18 -72
- package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
- package/dist/src/storage/sqlite/session-repository.d.ts +6 -5
- package/dist/src/storage/sqlite/session-repository.js +34 -40
- package/dist/src/storage/sqlite/session-repository.js.map +1 -1
- package/dist/src/storage/sqlite/transcript-repository.d.ts +2 -2
- package/dist/src/storage/sqlite/transcript-repository.js +52 -52
- package/dist/src/storage/sqlite/transcript-repository.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +18 -4
- package/dist/src/tui/backends/embedded-backend.js +100 -1
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +5 -1
- package/dist/src/tui/backends/gateway-sse-backend.js +45 -2
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/clipboard-image.js +3 -3
- package/dist/src/tui/components/chat-log.d.ts +2 -0
- package/dist/src/tui/components/chat-log.js +19 -0
- package/dist/src/tui/components/chat-log.js.map +1 -1
- package/dist/src/tui/extension-host/autocomplete.d.ts +3 -2
- package/dist/src/tui/extension-host/autocomplete.js +29 -12
- package/dist/src/tui/extension-host/autocomplete.js.map +1 -1
- package/dist/src/tui/extension-host/load-extensions.js +1 -1
- package/dist/src/tui/extension-host/runtime.d.ts +12 -0
- package/dist/src/tui/extension-host/runtime.js +6 -4
- package/dist/src/tui/extension-host/runtime.js.map +1 -1
- package/dist/src/tui/theme-manager.js +1 -1
- package/dist/src/tui/tui-backend.d.ts +23 -0
- package/dist/src/tui/tui-command-formatters.js +4 -4
- package/dist/src/tui/tui-commands.d.ts +16 -3
- package/dist/src/tui/tui-commands.js +134 -27
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-file-autocomplete.d.ts +5 -0
- package/dist/src/tui/tui-file-autocomplete.js +26 -0
- package/dist/src/tui/tui-file-autocomplete.js.map +1 -0
- package/dist/src/tui/tui-keybindings-file.js +1 -1
- package/dist/src/tui/tui-picker-overlay.js +1 -1
- package/dist/src/tui/tui-scoped-models.js +2 -2
- package/dist/src/tui/tui-settings.js +1 -1
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui-startup-text.js +1 -1
- package/dist/src/tui/tui-startup-text.js.map +1 -1
- package/dist/src/tui/tui.js +106 -17
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/tunnel/frpc-binary.js +4 -4
- package/dist/src/tunnel/frpc-config.js +1 -1
- package/dist/src/tunnel/frpc-extract.js +1 -1
- package/dist/src/tunnel/tunnel-state.js +1 -1
- package/dist/src/utils/logger/audit.js +1 -1
- package/dist/src/utils/logger/context.d.ts +2 -2
- package/dist/src/utils/logger/context.js +2 -1
- package/dist/src/utils/logger/context.js.map +1 -1
- package/dist/src/utils/logger/log-store.js +2 -1
- package/dist/src/utils/logger/log-store.js.map +1 -1
- package/dist/src/utils/logger/pino-record.js +3 -0
- package/dist/src/utils/logger/pino-record.js.map +1 -1
- package/dist/src/utils/logger/rotation.js +1 -1
- package/dist/src/utils/logger/streams.js +1 -1
- package/dist/src/utils/logger/types.d.ts +5 -0
- package/dist/src/utils/logger/types.js.map +1 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +2 -2
- package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +13 -1
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/dist/src/workflows/store/event-store.js +1 -1
- package/dist/src/workflows/store/run-store.js +1 -1
- package/package.json +1 -1
- package/dist/gateway/static/root/assets/agent-browser-settings-page-rGbKc2Hh.js +0 -6
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CtwVbjOA.js +0 -1
- package/dist/gateway/static/root/assets/agents-CCBmGcwc.js +0 -71
- package/dist/gateway/static/root/assets/apps-page-xwCsJS15.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-C044DcYk.js +0 -1
- package/dist/gateway/static/root/assets/connectors-settings-8VEWUOTj.js +0 -2
- package/dist/gateway/static/root/assets/cron-page-DqmNGNOy.js +0 -3
- package/dist/gateway/static/root/assets/goal-detail-page-bv0VRDaf.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-1Ywnt4Cb.js +0 -2
- package/dist/gateway/static/root/assets/goals-settings-ceEBjnfc.js +0 -1
- package/dist/gateway/static/root/assets/index-Cxm6xsps.js +0 -122
- package/dist/gateway/static/root/assets/index-b_R4tKqt.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-B_wrxhee.js +0 -2
- package/dist/gateway/static/root/assets/messages-CkT-lcgP.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-D0JDSbNu.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-page-DpFV-EO6.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-CdkjTch8.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-DSYVAi96.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-CenkcVjF.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-D9sva86V.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-DL35U0x0.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Ctwbp9Er.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-DIM3JNsr.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DAlNaNzL.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-CLrHVzAt.js +0 -2
- package/dist/gateway/static/root/assets/voice-api-key-field-vYAO71Gn.js +0 -1
- package/dist/gateway/static/root/assets/workflow-page.utils-sgHjOXOm.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-DYyOTmFx.js +0 -18
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "../../session/types.js";
|
|
2
|
-
import { buildDefaultSessionMetadata
|
|
2
|
+
import { buildDefaultSessionMetadata } from "./session-metadata.js";
|
|
3
3
|
import { isTranscriptContextEntry } from "../../session/session-context-for-llm.js";
|
|
4
4
|
//#region src/storage/sqlite/row-mappers.ts
|
|
5
5
|
function parseJson(raw) {
|
|
@@ -16,15 +16,12 @@ function isoFromMs(ms) {
|
|
|
16
16
|
}
|
|
17
17
|
function sessionRowToMetadata(sessionKey, row) {
|
|
18
18
|
const defaults = buildDefaultSessionMetadata(sessionKey);
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const customData = parseJson(row.custom_data_json) ?? defaults.customData;
|
|
19
|
+
const routing = parseJson(row.routing_json);
|
|
20
|
+
const customData = parseJson(row.custom_data_json);
|
|
22
21
|
const tags = parseJson(row.tags_json) ?? [];
|
|
23
22
|
const createdAt = isoFromMs(row.created_at) ?? defaults.createdAt;
|
|
24
23
|
const updatedAt = isoFromMs(row.updated_at) ?? defaults.updatedAt;
|
|
25
24
|
const lastAccessedAt = isoFromMs(row.last_accessed_at) ?? defaults.lastAccessedAt;
|
|
26
|
-
const diskSc = row.source_channel?.trim() ?? "";
|
|
27
|
-
const diskChat = row.source_chat_id?.trim() ?? "";
|
|
28
25
|
return {
|
|
29
26
|
...defaults,
|
|
30
27
|
key: sessionKey,
|
|
@@ -36,8 +33,8 @@ function sessionRowToMetadata(sessionKey, row) {
|
|
|
36
33
|
lastAccessedAt,
|
|
37
34
|
sessionStartedAt: isoFromMs(row.session_started_at),
|
|
38
35
|
lastInteractionAt: isoFromMs(row.last_interaction_at),
|
|
39
|
-
sourceChannel:
|
|
40
|
-
sourceChatId:
|
|
36
|
+
sourceChannel: row.source_channel,
|
|
37
|
+
sourceChatId: row.source_chat_id,
|
|
41
38
|
sessionType: row.session_type ?? defaults.sessionType,
|
|
42
39
|
hiddenFromSessionList: Boolean(row.hidden_from_session_list),
|
|
43
40
|
parentSessionKey: row.parent_session_key ?? void 0,
|
|
@@ -45,15 +42,15 @@ function sessionRowToMetadata(sessionKey, row) {
|
|
|
45
42
|
workflowDefinitionId: row.workflow_definition_id ?? void 0,
|
|
46
43
|
workflowAgentId: row.workflow_agent_id ?? void 0,
|
|
47
44
|
workflowAgentLabel: row.workflow_agent_label ?? void 0,
|
|
48
|
-
routing,
|
|
49
|
-
customData,
|
|
45
|
+
...routing ? { routing } : {},
|
|
46
|
+
...customData ? { customData } : {},
|
|
50
47
|
abortCutoffTimestamp: row.abort_cutoff_timestamp ?? void 0,
|
|
51
48
|
messageCount: row.message_count,
|
|
52
49
|
estimatedTokens: row.estimated_tokens,
|
|
53
50
|
compactedCount: row.compacted_count,
|
|
54
51
|
lastFlushedAt: row.last_flushed_at ?? void 0,
|
|
55
52
|
flushCount: row.flush_count,
|
|
56
|
-
|
|
53
|
+
sessionId: row.session_id,
|
|
57
54
|
cwd: row.cwd ?? void 0,
|
|
58
55
|
stats: {
|
|
59
56
|
messageCount: row.message_count,
|
|
@@ -62,12 +59,12 @@ function sessionRowToMetadata(sessionKey, row) {
|
|
|
62
59
|
}
|
|
63
60
|
};
|
|
64
61
|
}
|
|
65
|
-
function metadataToSessionInsert(sessionKey,
|
|
62
|
+
function metadataToSessionInsert(sessionKey, sessionId, metadata, thinkingLevel, verboseLevel) {
|
|
66
63
|
const now = Date.now();
|
|
67
64
|
return {
|
|
68
65
|
sessionKey,
|
|
69
|
-
agentId:
|
|
70
|
-
|
|
66
|
+
agentId: metadata.routing?.agentId?.trim().toLowerCase() || "main",
|
|
67
|
+
sessionId,
|
|
71
68
|
status: metadata.status,
|
|
72
69
|
name: metadata.name ?? null,
|
|
73
70
|
tagsJson: JSON.stringify(metadata.tags ?? []),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"row-mappers.js","names":["msg"],"sources":["../../../../src/storage/sqlite/row-mappers.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\n\nimport type { SessionAgentConfig } from '../../session/config-types.js';\nimport {\n isTranscriptContextEntry,\n type TranscriptStoredRow,\n type XopcTranscriptContextEntry,\n} from '../../session/session-context-for-llm.js';\nimport { SessionStatus, type GlobalSessionStats, type SessionMetadata } from '../../session/types.js';\nimport {\n buildDefaultSessionMetadata,\n parseSessionKeySource,\n resolveAgentIdFromSessionKey,\n} from './session-metadata.js';\n\nexport type SessionRow = {\n session_key: string;\n agent_id: string;\n current_transcript_id: string;\n status: string;\n name: string | null;\n tags_json: string;\n created_at: number;\n updated_at: number;\n last_accessed_at: number;\n session_started_at: number | null;\n last_interaction_at: number | null;\n source_channel: string;\n source_chat_id: string;\n session_type: string | null;\n hidden_from_session_list: number | null;\n parent_session_key: string | null;\n workflow_run_id: string | null;\n workflow_definition_id: string | null;\n workflow_agent_id: string | null;\n workflow_agent_label: string | null;\n routing_json: string | null;\n custom_data_json: string | null;\n abort_cutoff_timestamp: number | null;\n message_count: number;\n estimated_tokens: number;\n compacted_count: number;\n last_flushed_at: string | null;\n flush_count: number;\n thinking_level: string | null;\n verbose_level: string | null;\n cwd?: string | null;\n};\n\nexport type TranscriptEntryRow = {\n entry_id: string;\n transcript_id: string;\n seq: number;\n entry_kind: string;\n role: string | null;\n payload_json: string;\n created_at: number;\n};\n\nexport type SessionConfigRow = {\n session_key: string;\n thinking_level: string | null;\n reasoning_level: string | null;\n verbose_level: string | null;\n elevated_mode: string | null;\n model_override: string | null;\n provider_override: string | null;\n working_directory_override: string | null;\n updated_at: number;\n};\n\nfunction parseJson<T>(raw: string | null | undefined): T | undefined {\n if (!raw?.trim()) {\n return undefined;\n }\n try {\n return JSON.parse(raw) as T;\n } catch {\n return undefined;\n }\n}\n\nfunction isoFromMs(ms: number | null | undefined): string | undefined {\n if (ms == null || !Number.isFinite(ms)) {\n return undefined;\n }\n return new Date(ms).toISOString();\n}\n\nexport function sessionRowToMetadata(sessionKey: string, row: SessionRow): SessionMetadata {\n const defaults = buildDefaultSessionMetadata(sessionKey);\n const { channel: keySource, chatId: keyChatId } = parseSessionKeySource(sessionKey);\n const routing = parseJson<SessionMetadata['routing']>(row.routing_json) ?? defaults.routing;\n const customData = parseJson<Record<string, unknown>>(row.custom_data_json) ?? defaults.customData;\n const tags = parseJson<string[]>(row.tags_json) ?? [];\n const createdAt = isoFromMs(row.created_at) ?? defaults.createdAt;\n const updatedAt = isoFromMs(row.updated_at) ?? defaults.updatedAt;\n const lastAccessedAt = isoFromMs(row.last_accessed_at) ?? defaults.lastAccessedAt;\n const diskSc = row.source_channel?.trim() ?? '';\n const diskChat = row.source_chat_id?.trim() ?? '';\n\n return {\n ...defaults,\n key: sessionKey,\n status: row.status as SessionStatus,\n name: row.name ?? undefined,\n tags,\n createdAt,\n updatedAt,\n lastAccessedAt,\n sessionStartedAt: isoFromMs(row.session_started_at),\n lastInteractionAt: isoFromMs(row.last_interaction_at),\n sourceChannel: diskSc || keySource,\n sourceChatId: diskChat || keyChatId,\n sessionType: (row.session_type ?? defaults.sessionType) as SessionMetadata['sessionType'],\n hiddenFromSessionList: Boolean(row.hidden_from_session_list),\n parentSessionKey: row.parent_session_key ?? undefined,\n workflowRunId: row.workflow_run_id ?? undefined,\n workflowDefinitionId: row.workflow_definition_id ?? undefined,\n workflowAgentId: row.workflow_agent_id ?? undefined,\n workflowAgentLabel: row.workflow_agent_label ?? undefined,\n routing,\n customData,\n abortCutoffTimestamp: row.abort_cutoff_timestamp ?? undefined,\n messageCount: row.message_count,\n estimatedTokens: row.estimated_tokens,\n compactedCount: row.compacted_count,\n lastFlushedAt: row.last_flushed_at ?? undefined,\n flushCount: row.flush_count,\n transcriptId: row.current_transcript_id,\n cwd: row.cwd ?? undefined,\n stats: {\n messageCount: row.message_count,\n tokenCount: row.estimated_tokens,\n lastTurnAt: row.last_interaction_at ?? undefined,\n },\n };\n}\n\nexport function metadataToSessionInsert(\n sessionKey: string,\n transcriptId: string,\n metadata: SessionMetadata,\n thinkingLevel?: string | null,\n verboseLevel?: string | null,\n): {\n sessionKey: string;\n agentId: string;\n transcriptId: string;\n status: string;\n name: string | null;\n tagsJson: string;\n createdAt: number;\n updatedAt: number;\n lastAccessedAt: number;\n sessionStartedAt: number | null;\n lastInteractionAt: number | null;\n sourceChannel: string;\n sourceChatId: string;\n sessionType: string;\n hiddenFromSessionList: number;\n parentSessionKey: string | null;\n workflowRunId: string | null;\n workflowDefinitionId: string | null;\n workflowAgentId: string | null;\n workflowAgentLabel: string | null;\n routingJson: string | null;\n customDataJson: string | null;\n abortCutoffTimestamp: number | null;\n messageCount: number;\n estimatedTokens: number;\n compactedCount: number;\n lastFlushedAt: string | null;\n flushCount: number;\n thinkingLevel: string | null;\n verboseLevel: string | null;\n} {\n const now = Date.now();\n return {\n sessionKey,\n agentId: resolveAgentIdFromSessionKey(sessionKey),\n transcriptId,\n status: metadata.status,\n name: metadata.name ?? null,\n tagsJson: JSON.stringify(metadata.tags ?? []),\n createdAt: Date.parse(metadata.createdAt) || now,\n updatedAt: Date.parse(metadata.updatedAt) || now,\n lastAccessedAt: Date.parse(metadata.lastAccessedAt) || now,\n sessionStartedAt: metadata.sessionStartedAt ? Date.parse(metadata.sessionStartedAt) : now,\n lastInteractionAt: metadata.lastInteractionAt ? Date.parse(metadata.lastInteractionAt) : null,\n sourceChannel: metadata.sourceChannel,\n sourceChatId: metadata.sourceChatId,\n sessionType: metadata.sessionType,\n hiddenFromSessionList: metadata.hiddenFromSessionList ? 1 : 0,\n parentSessionKey: metadata.parentSessionKey ?? null,\n workflowRunId: metadata.workflowRunId ?? null,\n workflowDefinitionId: metadata.workflowDefinitionId ?? null,\n workflowAgentId: metadata.workflowAgentId ?? null,\n workflowAgentLabel: metadata.workflowAgentLabel ?? null,\n routingJson: metadata.routing ? JSON.stringify(metadata.routing) : null,\n customDataJson: metadata.customData ? JSON.stringify(metadata.customData) : null,\n abortCutoffTimestamp: metadata.abortCutoffTimestamp ?? null,\n messageCount: metadata.messageCount,\n estimatedTokens: metadata.estimatedTokens,\n compactedCount: metadata.compactedCount,\n lastFlushedAt: metadata.lastFlushedAt ?? null,\n flushCount: metadata.flushCount ?? 0,\n thinkingLevel: thinkingLevel ?? null,\n verboseLevel: verboseLevel ?? null,\n };\n}\n\nexport function sessionConfigRowToConfig(row: SessionConfigRow): SessionAgentConfig {\n return {\n ...(row.thinking_level ? { thinkingLevel: row.thinking_level as SessionAgentConfig['thinkingLevel'] } : {}),\n ...(row.reasoning_level ? { reasoningLevel: row.reasoning_level as SessionAgentConfig['reasoningLevel'] } : {}),\n ...(row.verbose_level ? { verboseLevel: row.verbose_level as SessionAgentConfig['verboseLevel'] } : {}),\n ...(row.elevated_mode ? { elevatedMode: row.elevated_mode as SessionAgentConfig['elevatedMode'] } : {}),\n ...(row.model_override ? { modelOverride: row.model_override } : {}),\n ...(row.provider_override ? { providerOverride: row.provider_override } : {}),\n ...(row.working_directory_override ? { workingDirectoryOverride: row.working_directory_override } : {}),\n updatedAt: row.updated_at,\n };\n}\n\nexport function transcriptEntryRowToStoredRow(row: TranscriptEntryRow): TranscriptStoredRow {\n const payload = JSON.parse(row.payload_json) as TranscriptStoredRow;\n return payload;\n}\n\nexport function classifyStoredRow(row: TranscriptStoredRow): {\n entryKind: 'message' | 'context' | 'compaction';\n role: string | null;\n} {\n if (isTranscriptContextEntry(row)) {\n return { entryKind: 'context', role: null };\n }\n const record = row as AgentMessage & { type?: string };\n if (record.type === 'compaction' || (row as { kind?: string }).kind === 'compaction') {\n return { entryKind: 'compaction', role: null };\n }\n return { entryKind: 'message', role: record.role ?? null };\n}\n\nexport function extractFtsContent(row: TranscriptStoredRow): string {\n if (isTranscriptContextEntry(row)) {\n const ctx = row as XopcTranscriptContextEntry;\n return [ctx.text, ctx.id].filter(Boolean).join(' ');\n }\n const msg = row as AgentMessage;\n return extractTextFromMessageContent((msg as { content?: unknown }).content);\n}\n\nfunction extractTextFromMessageContent(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n if (!Array.isArray(content)) {\n return '';\n }\n const parts: string[] = [];\n for (const block of content) {\n if (!block || typeof block !== 'object') {\n continue;\n }\n const type = (block as { type?: string }).type;\n if (type === 'text' && typeof (block as { text?: string }).text === 'string') {\n parts.push((block as { text: string }).text);\n }\n }\n return parts.join('\\n');\n}\n\nexport function estimateTokensFromMessages(messages: AgentMessage[]): number {\n let total = 0;\n for (const msg of messages) {\n const content = (msg as { content?: unknown }).content;\n const text = extractTextFromMessageContent(content);\n total += Math.ceil(text.length / 4);\n }\n return total;\n}\n\nexport function buildGlobalSessionStats(sessions: SessionMetadata[]): GlobalSessionStats {\n const byChannel: Record<string, number> = {};\n for (const session of sessions) {\n byChannel[session.sourceChannel] = (byChannel[session.sourceChannel] || 0) + 1;\n }\n let oldestSession: string | undefined;\n let newestSession: string | undefined;\n if (sessions.length > 0) {\n const sorted = [...sessions].sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n oldestSession = sorted[0]!.createdAt;\n newestSession = sorted[sorted.length - 1]!.createdAt;\n }\n return {\n totalSessions: sessions.length,\n activeSessions: sessions.filter(\n (s) => s.status === SessionStatus.ACTIVE || s.status === SessionStatus.IDLE,\n ).length,\n archivedSessions: sessions.filter((s) => s.status === SessionStatus.ARCHIVED).length,\n pinnedSessions: sessions.filter((s) => s.status === SessionStatus.PINNED).length,\n totalMessages: sessions.reduce((sum, s) => sum + s.messageCount, 0),\n totalTokens: sessions.reduce((sum, s) => sum + s.estimatedTokens, 0),\n oldestSession,\n newestSession,\n byChannel,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"row-mappers.js","names":["msg"],"sources":["../../../../src/storage/sqlite/row-mappers.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\n\nimport type { SessionAgentConfig } from '../../session/config-types.js';\nimport {\n isTranscriptContextEntry,\n type TranscriptStoredRow,\n type XopcTranscriptContextEntry,\n} from '../../session/session-context-for-llm.js';\nimport { SessionStatus, type GlobalSessionStats, type SessionMetadata } from '../../session/types.js';\nimport { buildDefaultSessionMetadata } from './session-metadata.js';\n\nexport type SessionRow = {\n session_key: string;\n agent_id: string;\n session_id: string;\n status: string;\n name: string | null;\n tags_json: string;\n created_at: number;\n updated_at: number;\n last_accessed_at: number;\n session_started_at: number | null;\n last_interaction_at: number | null;\n source_channel: string;\n source_chat_id: string;\n session_type: string | null;\n hidden_from_session_list: number | null;\n parent_session_key: string | null;\n workflow_run_id: string | null;\n workflow_definition_id: string | null;\n workflow_agent_id: string | null;\n workflow_agent_label: string | null;\n routing_json: string | null;\n custom_data_json: string | null;\n abort_cutoff_timestamp: number | null;\n message_count: number;\n estimated_tokens: number;\n compacted_count: number;\n last_flushed_at: string | null;\n flush_count: number;\n thinking_level: string | null;\n verbose_level: string | null;\n cwd?: string | null;\n};\n\nexport type TranscriptEntryRow = {\n entry_id: string;\n session_id: string;\n seq: number;\n entry_kind: string;\n role: string | null;\n payload_json: string;\n created_at: number;\n};\n\nexport type SessionConfigRow = {\n session_key: string;\n thinking_level: string | null;\n reasoning_level: string | null;\n verbose_level: string | null;\n elevated_mode: string | null;\n model_override: string | null;\n provider_override: string | null;\n working_directory_override: string | null;\n updated_at: number;\n};\n\nfunction parseJson<T>(raw: string | null | undefined): T | undefined {\n if (!raw?.trim()) {\n return undefined;\n }\n try {\n return JSON.parse(raw) as T;\n } catch {\n return undefined;\n }\n}\n\nfunction isoFromMs(ms: number | null | undefined): string | undefined {\n if (ms == null || !Number.isFinite(ms)) {\n return undefined;\n }\n return new Date(ms).toISOString();\n}\n\nexport function sessionRowToMetadata(sessionKey: string, row: SessionRow): SessionMetadata {\n const defaults = buildDefaultSessionMetadata(sessionKey);\n const routing = parseJson<SessionMetadata['routing']>(row.routing_json);\n const customData = parseJson<Record<string, unknown>>(row.custom_data_json);\n const tags = parseJson<string[]>(row.tags_json) ?? [];\n const createdAt = isoFromMs(row.created_at) ?? defaults.createdAt;\n const updatedAt = isoFromMs(row.updated_at) ?? defaults.updatedAt;\n const lastAccessedAt = isoFromMs(row.last_accessed_at) ?? defaults.lastAccessedAt;\n\n return {\n ...defaults,\n key: sessionKey,\n status: row.status as SessionStatus,\n name: row.name ?? undefined,\n tags,\n createdAt,\n updatedAt,\n lastAccessedAt,\n sessionStartedAt: isoFromMs(row.session_started_at),\n lastInteractionAt: isoFromMs(row.last_interaction_at),\n sourceChannel: row.source_channel,\n sourceChatId: row.source_chat_id,\n sessionType: (row.session_type ?? defaults.sessionType) as SessionMetadata['sessionType'],\n hiddenFromSessionList: Boolean(row.hidden_from_session_list),\n parentSessionKey: row.parent_session_key ?? undefined,\n workflowRunId: row.workflow_run_id ?? undefined,\n workflowDefinitionId: row.workflow_definition_id ?? undefined,\n workflowAgentId: row.workflow_agent_id ?? undefined,\n workflowAgentLabel: row.workflow_agent_label ?? undefined,\n ...(routing ? { routing } : {}),\n ...(customData ? { customData } : {}),\n abortCutoffTimestamp: row.abort_cutoff_timestamp ?? undefined,\n messageCount: row.message_count,\n estimatedTokens: row.estimated_tokens,\n compactedCount: row.compacted_count,\n lastFlushedAt: row.last_flushed_at ?? undefined,\n flushCount: row.flush_count,\n sessionId: row.session_id,\n cwd: row.cwd ?? undefined,\n stats: {\n messageCount: row.message_count,\n tokenCount: row.estimated_tokens,\n lastTurnAt: row.last_interaction_at ?? undefined,\n },\n };\n}\n\nexport function metadataToSessionInsert(\n sessionKey: string,\n sessionId: string,\n metadata: SessionMetadata,\n thinkingLevel?: string | null,\n verboseLevel?: string | null,\n): {\n sessionKey: string;\n agentId: string;\n sessionId: string;\n status: string;\n name: string | null;\n tagsJson: string;\n createdAt: number;\n updatedAt: number;\n lastAccessedAt: number;\n sessionStartedAt: number | null;\n lastInteractionAt: number | null;\n sourceChannel: string;\n sourceChatId: string;\n sessionType: string;\n hiddenFromSessionList: number;\n parentSessionKey: string | null;\n workflowRunId: string | null;\n workflowDefinitionId: string | null;\n workflowAgentId: string | null;\n workflowAgentLabel: string | null;\n routingJson: string | null;\n customDataJson: string | null;\n abortCutoffTimestamp: number | null;\n messageCount: number;\n estimatedTokens: number;\n compactedCount: number;\n lastFlushedAt: string | null;\n flushCount: number;\n thinkingLevel: string | null;\n verboseLevel: string | null;\n} {\n const now = Date.now();\n const agentId = metadata.routing?.agentId?.trim().toLowerCase() || 'main';\n return {\n sessionKey,\n agentId,\n sessionId,\n status: metadata.status,\n name: metadata.name ?? null,\n tagsJson: JSON.stringify(metadata.tags ?? []),\n createdAt: Date.parse(metadata.createdAt) || now,\n updatedAt: Date.parse(metadata.updatedAt) || now,\n lastAccessedAt: Date.parse(metadata.lastAccessedAt) || now,\n sessionStartedAt: metadata.sessionStartedAt ? Date.parse(metadata.sessionStartedAt) : now,\n lastInteractionAt: metadata.lastInteractionAt ? Date.parse(metadata.lastInteractionAt) : null,\n sourceChannel: metadata.sourceChannel,\n sourceChatId: metadata.sourceChatId,\n sessionType: metadata.sessionType,\n hiddenFromSessionList: metadata.hiddenFromSessionList ? 1 : 0,\n parentSessionKey: metadata.parentSessionKey ?? null,\n workflowRunId: metadata.workflowRunId ?? null,\n workflowDefinitionId: metadata.workflowDefinitionId ?? null,\n workflowAgentId: metadata.workflowAgentId ?? null,\n workflowAgentLabel: metadata.workflowAgentLabel ?? null,\n routingJson: metadata.routing ? JSON.stringify(metadata.routing) : null,\n customDataJson: metadata.customData ? JSON.stringify(metadata.customData) : null,\n abortCutoffTimestamp: metadata.abortCutoffTimestamp ?? null,\n messageCount: metadata.messageCount,\n estimatedTokens: metadata.estimatedTokens,\n compactedCount: metadata.compactedCount,\n lastFlushedAt: metadata.lastFlushedAt ?? null,\n flushCount: metadata.flushCount ?? 0,\n thinkingLevel: thinkingLevel ?? null,\n verboseLevel: verboseLevel ?? null,\n };\n}\n\nexport function sessionConfigRowToConfig(row: SessionConfigRow): SessionAgentConfig {\n return {\n ...(row.thinking_level ? { thinkingLevel: row.thinking_level as SessionAgentConfig['thinkingLevel'] } : {}),\n ...(row.reasoning_level ? { reasoningLevel: row.reasoning_level as SessionAgentConfig['reasoningLevel'] } : {}),\n ...(row.verbose_level ? { verboseLevel: row.verbose_level as SessionAgentConfig['verboseLevel'] } : {}),\n ...(row.elevated_mode ? { elevatedMode: row.elevated_mode as SessionAgentConfig['elevatedMode'] } : {}),\n ...(row.model_override ? { modelOverride: row.model_override } : {}),\n ...(row.provider_override ? { providerOverride: row.provider_override } : {}),\n ...(row.working_directory_override ? { workingDirectoryOverride: row.working_directory_override } : {}),\n updatedAt: row.updated_at,\n };\n}\n\nexport function transcriptEntryRowToStoredRow(row: TranscriptEntryRow): TranscriptStoredRow {\n const payload = JSON.parse(row.payload_json) as TranscriptStoredRow;\n return payload;\n}\n\nexport function classifyStoredRow(row: TranscriptStoredRow): {\n entryKind: 'message' | 'context' | 'compaction';\n role: string | null;\n} {\n if (isTranscriptContextEntry(row)) {\n return { entryKind: 'context', role: null };\n }\n const record = row as AgentMessage & { type?: string };\n if (record.type === 'compaction' || (row as { kind?: string }).kind === 'compaction') {\n return { entryKind: 'compaction', role: null };\n }\n return { entryKind: 'message', role: record.role ?? null };\n}\n\nexport function extractFtsContent(row: TranscriptStoredRow): string {\n if (isTranscriptContextEntry(row)) {\n const ctx = row as XopcTranscriptContextEntry;\n return [ctx.text, ctx.id].filter(Boolean).join(' ');\n }\n const msg = row as AgentMessage;\n return extractTextFromMessageContent((msg as { content?: unknown }).content);\n}\n\nfunction extractTextFromMessageContent(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n if (!Array.isArray(content)) {\n return '';\n }\n const parts: string[] = [];\n for (const block of content) {\n if (!block || typeof block !== 'object') {\n continue;\n }\n const type = (block as { type?: string }).type;\n if (type === 'text' && typeof (block as { text?: string }).text === 'string') {\n parts.push((block as { text: string }).text);\n }\n }\n return parts.join('\\n');\n}\n\nexport function estimateTokensFromMessages(messages: AgentMessage[]): number {\n let total = 0;\n for (const msg of messages) {\n const content = (msg as { content?: unknown }).content;\n const text = extractTextFromMessageContent(content);\n total += Math.ceil(text.length / 4);\n }\n return total;\n}\n\nexport function buildGlobalSessionStats(sessions: SessionMetadata[]): GlobalSessionStats {\n const byChannel: Record<string, number> = {};\n for (const session of sessions) {\n byChannel[session.sourceChannel] = (byChannel[session.sourceChannel] || 0) + 1;\n }\n let oldestSession: string | undefined;\n let newestSession: string | undefined;\n if (sessions.length > 0) {\n const sorted = [...sessions].sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n oldestSession = sorted[0]!.createdAt;\n newestSession = sorted[sorted.length - 1]!.createdAt;\n }\n return {\n totalSessions: sessions.length,\n activeSessions: sessions.filter(\n (s) => s.status === SessionStatus.ACTIVE || s.status === SessionStatus.IDLE,\n ).length,\n archivedSessions: sessions.filter((s) => s.status === SessionStatus.ARCHIVED).length,\n pinnedSessions: sessions.filter((s) => s.status === SessionStatus.PINNED).length,\n totalMessages: sessions.reduce((sum, s) => sum + s.messageCount, 0),\n totalTokens: sessions.reduce((sum, s) => sum + s.estimatedTokens, 0),\n oldestSession,\n newestSession,\n byChannel,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SCHEMA_META_SCHEMA_VERSION_KEY, ensureSchemaMetaTable, readSchemaVersion, readSchemaVersionForTest, setSchemaVersion } from "./schema-version.js";
|
|
2
2
|
import { XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_SCHEMA_VERSION, applyPendingMigrations } from "./migrations/runner.js";
|
|
3
|
-
import { readFileSync } from "node:fs";
|
|
4
3
|
import { dirname, join } from "node:path";
|
|
4
|
+
import { readFileSync } from "node:fs";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
6
|
//#region src/storage/sqlite/schema.ts
|
|
7
7
|
const SCHEMA_DIR = dirname(fileURLToPath(import.meta.url));
|
|
@@ -12,7 +12,7 @@ function bootstrapFreshDatabase(db) {
|
|
|
12
12
|
db.exec("BEGIN IMMEDIATE");
|
|
13
13
|
try {
|
|
14
14
|
db.exec(readSchemaSql());
|
|
15
|
-
setSchemaVersion(db,
|
|
15
|
+
setSchemaVersion(db, 10);
|
|
16
16
|
db.exec("COMMIT");
|
|
17
17
|
} catch (error) {
|
|
18
18
|
try {
|
|
@@ -29,9 +29,9 @@ function ensureXopcDatabaseSchema(db) {
|
|
|
29
29
|
let currentVersion = readSchemaVersion(db);
|
|
30
30
|
if (currentVersion === 0) {
|
|
31
31
|
bootstrapFreshDatabase(db);
|
|
32
|
-
currentVersion =
|
|
32
|
+
currentVersion = 10;
|
|
33
33
|
}
|
|
34
|
-
applyPendingMigrations(db, { targetVersion:
|
|
34
|
+
applyPendingMigrations(db, { targetVersion: 10 });
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../../../src/storage/sqlite/schema.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { DatabaseSync } from 'node:sqlite';\n\nimport {\n applyPendingMigrations,\n XOPC_DB_BASELINE_SCHEMA_VERSION,\n XOPC_DB_SCHEMA_VERSION,\n} from './migrations/runner.js';\nimport {\n ensureSchemaMetaTable,\n readSchemaVersion,\n setSchemaVersion,\n} from './schema-version.js';\n\nexport {\n SCHEMA_META_SCHEMA_VERSION_KEY,\n readSchemaVersionForTest,\n readSchemaVersion,\n setSchemaVersion,\n ensureSchemaMetaTable,\n} from './schema-version.js';\nexport {\n XOPC_DB_BASELINE_SCHEMA_VERSION,\n XOPC_DB_SCHEMA_VERSION,\n} from './migrations/runner.js';\n\nconst SCHEMA_DIR = dirname(fileURLToPath(import.meta.url));\n\nfunction readSchemaSql(): string {\n return readFileSync(join(SCHEMA_DIR, 'schema.sql'), 'utf8');\n}\n\nfunction bootstrapFreshDatabase(db: DatabaseSync): void {\n db.exec('BEGIN IMMEDIATE');\n try {\n db.exec(readSchemaSql());\n setSchemaVersion(db, XOPC_DB_BASELINE_SCHEMA_VERSION);\n db.exec('COMMIT');\n } catch (error) {\n try {\n db.exec('ROLLBACK');\n } catch {\n /* preserve original error */\n }\n throw error;\n }\n}\n\n/**\n * Ensure schema_meta exists, apply baseline schema.sql on first open, then run pending migrations.\n */\nexport function ensureXopcDatabaseSchema(db: DatabaseSync): void {\n ensureSchemaMetaTable(db);\n\n let currentVersion = readSchemaVersion(db);\n if (currentVersion === 0) {\n bootstrapFreshDatabase(db);\n currentVersion = XOPC_DB_BASELINE_SCHEMA_VERSION;\n }\n\n applyPendingMigrations(db, { targetVersion: XOPC_DB_SCHEMA_VERSION });\n}\n"],"mappings":";;;;;;AA6BA,MAAM,aAAa,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;AAE1D,SAAS,gBAAwB;AAC/B,QAAO,aAAa,KAAK,YAAY,aAAa,EAAE,OAAO;;AAG7D,SAAS,uBAAuB,IAAwB;AACtD,IAAG,KAAK,kBAAkB;AAC1B,KAAI;AACF,KAAG,KAAK,eAAe,CAAC;AACxB,mBAAiB,IAAA,
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../../../src/storage/sqlite/schema.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { DatabaseSync } from 'node:sqlite';\n\nimport {\n applyPendingMigrations,\n XOPC_DB_BASELINE_SCHEMA_VERSION,\n XOPC_DB_SCHEMA_VERSION,\n} from './migrations/runner.js';\nimport {\n ensureSchemaMetaTable,\n readSchemaVersion,\n setSchemaVersion,\n} from './schema-version.js';\n\nexport {\n SCHEMA_META_SCHEMA_VERSION_KEY,\n readSchemaVersionForTest,\n readSchemaVersion,\n setSchemaVersion,\n ensureSchemaMetaTable,\n} from './schema-version.js';\nexport {\n XOPC_DB_BASELINE_SCHEMA_VERSION,\n XOPC_DB_SCHEMA_VERSION,\n} from './migrations/runner.js';\n\nconst SCHEMA_DIR = dirname(fileURLToPath(import.meta.url));\n\nfunction readSchemaSql(): string {\n return readFileSync(join(SCHEMA_DIR, 'schema.sql'), 'utf8');\n}\n\nfunction bootstrapFreshDatabase(db: DatabaseSync): void {\n db.exec('BEGIN IMMEDIATE');\n try {\n db.exec(readSchemaSql());\n setSchemaVersion(db, XOPC_DB_BASELINE_SCHEMA_VERSION);\n db.exec('COMMIT');\n } catch (error) {\n try {\n db.exec('ROLLBACK');\n } catch {\n /* preserve original error */\n }\n throw error;\n }\n}\n\n/**\n * Ensure schema_meta exists, apply baseline schema.sql on first open, then run pending migrations.\n */\nexport function ensureXopcDatabaseSchema(db: DatabaseSync): void {\n ensureSchemaMetaTable(db);\n\n let currentVersion = readSchemaVersion(db);\n if (currentVersion === 0) {\n bootstrapFreshDatabase(db);\n currentVersion = XOPC_DB_BASELINE_SCHEMA_VERSION;\n }\n\n applyPendingMigrations(db, { targetVersion: XOPC_DB_SCHEMA_VERSION });\n}\n"],"mappings":";;;;;;AA6BA,MAAM,aAAa,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;AAE1D,SAAS,gBAAwB;AAC/B,QAAO,aAAa,KAAK,YAAY,aAAa,EAAE,OAAO;;AAG7D,SAAS,uBAAuB,IAAwB;AACtD,IAAG,KAAK,kBAAkB;AAC1B,KAAI;AACF,KAAG,KAAK,eAAe,CAAC;AACxB,mBAAiB,IAAA,GAAoC;AACrD,KAAG,KAAK,SAAS;UACV,OAAO;AACd,MAAI;AACF,MAAG,KAAK,WAAW;UACb;AAGR,QAAM;;;;;;AAOV,SAAgB,yBAAyB,IAAwB;AAC/D,uBAAsB,GAAG;CAEzB,IAAI,iBAAiB,kBAAkB,GAAG;AAC1C,KAAI,mBAAmB,GAAG;AACxB,yBAAuB,GAAG;AAC1B,mBAAA;;AAGF,wBAAuB,IAAI,EAAE,eAAA,IAAuC,CAAC"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
CREATE TABLE IF NOT EXISTS sessions (
|
|
4
4
|
session_key TEXT PRIMARY KEY,
|
|
5
5
|
agent_id TEXT NOT NULL,
|
|
6
|
-
|
|
6
|
+
session_id TEXT NOT NULL UNIQUE,
|
|
7
7
|
status TEXT NOT NULL DEFAULT 'active',
|
|
8
8
|
name TEXT,
|
|
9
9
|
tags_json TEXT NOT NULL DEFAULT '[]',
|
|
@@ -15,6 +15,12 @@ CREATE TABLE IF NOT EXISTS sessions (
|
|
|
15
15
|
source_channel TEXT NOT NULL DEFAULT '',
|
|
16
16
|
source_chat_id TEXT NOT NULL DEFAULT '',
|
|
17
17
|
session_type TEXT,
|
|
18
|
+
hidden_from_session_list INTEGER NOT NULL DEFAULT 0,
|
|
19
|
+
parent_session_key TEXT,
|
|
20
|
+
workflow_run_id TEXT,
|
|
21
|
+
workflow_definition_id TEXT,
|
|
22
|
+
workflow_agent_id TEXT,
|
|
23
|
+
workflow_agent_label TEXT,
|
|
18
24
|
routing_json TEXT,
|
|
19
25
|
custom_data_json TEXT,
|
|
20
26
|
abort_cutoff_timestamp INTEGER,
|
|
@@ -35,6 +41,12 @@ CREATE INDEX IF NOT EXISTS idx_sessions_source_channel
|
|
|
35
41
|
ON sessions(source_channel);
|
|
36
42
|
CREATE INDEX IF NOT EXISTS idx_sessions_last_interaction
|
|
37
43
|
ON sessions(last_interaction_at DESC);
|
|
44
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_type
|
|
45
|
+
ON sessions(session_type);
|
|
46
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_workflow_run
|
|
47
|
+
ON sessions(workflow_run_id);
|
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_parent
|
|
49
|
+
ON sessions(parent_session_key);
|
|
38
50
|
|
|
39
51
|
CREATE TABLE IF NOT EXISTS session_config (
|
|
40
52
|
session_key TEXT PRIMARY KEY,
|
|
@@ -50,7 +62,7 @@ CREATE TABLE IF NOT EXISTS session_config (
|
|
|
50
62
|
);
|
|
51
63
|
|
|
52
64
|
CREATE TABLE IF NOT EXISTS transcripts (
|
|
53
|
-
|
|
65
|
+
session_id TEXT PRIMARY KEY,
|
|
54
66
|
session_key TEXT NOT NULL,
|
|
55
67
|
status TEXT NOT NULL DEFAULT 'active',
|
|
56
68
|
archive_reason TEXT,
|
|
@@ -64,24 +76,24 @@ CREATE INDEX IF NOT EXISTS idx_transcripts_session
|
|
|
64
76
|
|
|
65
77
|
CREATE TABLE IF NOT EXISTS transcript_entries (
|
|
66
78
|
entry_id TEXT PRIMARY KEY,
|
|
67
|
-
|
|
79
|
+
session_id TEXT NOT NULL,
|
|
68
80
|
seq INTEGER NOT NULL,
|
|
69
81
|
entry_kind TEXT NOT NULL,
|
|
70
82
|
role TEXT,
|
|
71
83
|
payload_json TEXT NOT NULL,
|
|
72
84
|
created_at INTEGER NOT NULL,
|
|
73
|
-
UNIQUE(
|
|
74
|
-
FOREIGN KEY (
|
|
85
|
+
UNIQUE(session_id, seq),
|
|
86
|
+
FOREIGN KEY (session_id) REFERENCES transcripts(session_id)
|
|
75
87
|
);
|
|
76
88
|
|
|
77
|
-
CREATE INDEX IF NOT EXISTS
|
|
78
|
-
ON transcript_entries(
|
|
89
|
+
CREATE INDEX IF NOT EXISTS idx_entries_session_seq
|
|
90
|
+
ON transcript_entries(session_id, seq);
|
|
79
91
|
CREATE INDEX IF NOT EXISTS idx_entries_kind
|
|
80
|
-
ON transcript_entries(
|
|
92
|
+
ON transcript_entries(session_id, entry_kind);
|
|
81
93
|
|
|
82
94
|
CREATE TABLE IF NOT EXISTS compaction_checkpoints (
|
|
83
95
|
checkpoint_id TEXT PRIMARY KEY,
|
|
84
|
-
|
|
96
|
+
session_id TEXT NOT NULL,
|
|
85
97
|
session_key TEXT NOT NULL,
|
|
86
98
|
created_at INTEGER NOT NULL,
|
|
87
99
|
message_count INTEGER NOT NULL,
|
|
@@ -101,7 +113,7 @@ CREATE TABLE IF NOT EXISTS checkpoint_entries (
|
|
|
101
113
|
CREATE VIRTUAL TABLE IF NOT EXISTS transcript_fts USING fts5(
|
|
102
114
|
content,
|
|
103
115
|
session_key UNINDEXED,
|
|
104
|
-
|
|
116
|
+
session_id UNINDEXED,
|
|
105
117
|
entry_id UNINDEXED,
|
|
106
118
|
tokenize='unicode61'
|
|
107
119
|
);
|
|
@@ -218,6 +230,17 @@ CREATE INDEX IF NOT EXISTS idx_notes_kind
|
|
|
218
230
|
CREATE INDEX IF NOT EXISTS idx_notes_group
|
|
219
231
|
ON notes(group_id);
|
|
220
232
|
|
|
233
|
+
CREATE TABLE IF NOT EXISTS note_agent_contexts (
|
|
234
|
+
note_id TEXT PRIMARY KEY,
|
|
235
|
+
note_updated_at INTEGER NOT NULL,
|
|
236
|
+
context_version TEXT NOT NULL,
|
|
237
|
+
generated_at INTEGER NOT NULL,
|
|
238
|
+
payload_json TEXT NOT NULL
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
CREATE INDEX IF NOT EXISTS idx_note_agent_contexts_generated
|
|
242
|
+
ON note_agent_contexts(generated_at DESC);
|
|
243
|
+
|
|
221
244
|
CREATE TABLE IF NOT EXISTS memory_files (
|
|
222
245
|
file_id TEXT PRIMARY KEY,
|
|
223
246
|
agent_id TEXT NOT NULL,
|
|
@@ -339,6 +362,10 @@ CREATE TABLE IF NOT EXISTS goal_runs (
|
|
|
339
362
|
assistant_preview TEXT,
|
|
340
363
|
checklist_done INTEGER,
|
|
341
364
|
checklist_total INTEGER,
|
|
365
|
+
confidence REAL,
|
|
366
|
+
missing_evidence_json TEXT,
|
|
367
|
+
user_question TEXT,
|
|
368
|
+
completed_checklist_item_ids_json TEXT,
|
|
342
369
|
FOREIGN KEY (goal_id) REFERENCES goals(goal_id) ON DELETE CASCADE
|
|
343
370
|
);
|
|
344
371
|
|
|
@@ -1,8 +1,3 @@
|
|
|
1
1
|
import { type SessionMetadata } from '../../session/types.js';
|
|
2
|
-
export
|
|
3
|
-
export declare function
|
|
4
|
-
channel: string;
|
|
5
|
-
chatId: string;
|
|
6
|
-
};
|
|
7
|
-
export declare function extractRoutingFromSessionKey(key: string): SessionMetadata['routing'];
|
|
8
|
-
export declare function buildDefaultSessionMetadata(sessionKey: string): SessionMetadata;
|
|
2
|
+
export type SessionMetadataSeed = Partial<Omit<SessionMetadata, 'key' | 'sessionId'>>;
|
|
3
|
+
export declare function buildDefaultSessionMetadata(sessionKey: string, seed?: SessionMetadataSeed): SessionMetadata;
|
|
@@ -1,85 +1,31 @@
|
|
|
1
|
-
import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
|
|
2
1
|
import "../../session/types.js";
|
|
3
2
|
//#region src/storage/sqlite/session-metadata.ts
|
|
4
|
-
|
|
5
|
-
function resolveAgentIdFromSessionKey(sessionKey) {
|
|
6
|
-
return parseSessionKey(sessionKey)?.agentId?.toLowerCase() || "main";
|
|
7
|
-
}
|
|
8
|
-
function parseSessionKeySource(key) {
|
|
9
|
-
const parts = key.split(":");
|
|
10
|
-
if (parts.length >= 2 && parts[0] === "heartbeat") return {
|
|
11
|
-
channel: "heartbeat",
|
|
12
|
-
chatId: parts.slice(1).join(":")
|
|
13
|
-
};
|
|
14
|
-
const parsed = parseSessionKey(key);
|
|
15
|
-
if (parsed) {
|
|
16
|
-
if (parsed.source === "cron") return {
|
|
17
|
-
channel: "cron",
|
|
18
|
-
chatId: parsed.peerId
|
|
19
|
-
};
|
|
20
|
-
return {
|
|
21
|
-
channel: parsed.source,
|
|
22
|
-
chatId: [
|
|
23
|
-
parsed.accountId,
|
|
24
|
-
parsed.peerKind,
|
|
25
|
-
parsed.peerId
|
|
26
|
-
].join(":")
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
return {
|
|
30
|
-
channel: "unknown",
|
|
31
|
-
chatId: key
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
function extractRoutingFromSessionKey(key) {
|
|
35
|
-
const parsed = parseSessionKey(key);
|
|
36
|
-
if (!parsed) return;
|
|
37
|
-
return {
|
|
38
|
-
agentId: parsed.agentId?.toLowerCase() || "main",
|
|
39
|
-
source: parsed.source?.toLowerCase() || "unknown",
|
|
40
|
-
accountId: parsed.accountId?.toLowerCase() || "default",
|
|
41
|
-
peerKind: parsed.peerKind?.toLowerCase() || "dm",
|
|
42
|
-
peerId: parsed.peerId?.toLowerCase() || "unknown",
|
|
43
|
-
threadId: parsed.threadId,
|
|
44
|
-
scopeId: parsed.scopeId
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
function buildDefaultSessionMetadata(sessionKey) {
|
|
48
|
-
const { channel, chatId } = parseSessionKeySource(sessionKey);
|
|
49
|
-
const routing = extractRoutingFromSessionKey(sessionKey);
|
|
50
|
-
const isCronSession = channel === "cron";
|
|
51
|
-
const isHeartbeatSession = channel === "heartbeat";
|
|
3
|
+
function buildDefaultSessionMetadata(sessionKey, seed = {}) {
|
|
52
4
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
53
5
|
return {
|
|
6
|
+
...seed,
|
|
54
7
|
key: sessionKey,
|
|
55
|
-
status: "active",
|
|
56
|
-
tags: [],
|
|
57
|
-
createdAt: now,
|
|
58
|
-
updatedAt: now,
|
|
59
|
-
lastAccessedAt: now,
|
|
60
|
-
messageCount: 0,
|
|
61
|
-
estimatedTokens: 0,
|
|
62
|
-
compactedCount: 0,
|
|
63
|
-
flushCount: 0,
|
|
64
|
-
sourceChannel:
|
|
65
|
-
sourceChatId:
|
|
66
|
-
sessionType: "chat",
|
|
67
|
-
routing,
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
customData: { cronJobId: chatId }
|
|
71
|
-
} : {},
|
|
72
|
-
...isHeartbeatSession ? {
|
|
73
|
-
sessionType: "heartbeat",
|
|
74
|
-
customData: { heartbeatTarget: chatId }
|
|
75
|
-
} : {},
|
|
76
|
-
stats: {
|
|
8
|
+
status: seed.status ?? "active",
|
|
9
|
+
tags: seed.tags ?? [],
|
|
10
|
+
createdAt: seed.createdAt ?? now,
|
|
11
|
+
updatedAt: seed.updatedAt ?? now,
|
|
12
|
+
lastAccessedAt: seed.lastAccessedAt ?? now,
|
|
13
|
+
messageCount: seed.messageCount ?? 0,
|
|
14
|
+
estimatedTokens: seed.estimatedTokens ?? 0,
|
|
15
|
+
compactedCount: seed.compactedCount ?? 0,
|
|
16
|
+
flushCount: seed.flushCount ?? 0,
|
|
17
|
+
sourceChannel: seed.sourceChannel ?? "",
|
|
18
|
+
sourceChatId: seed.sourceChatId ?? "",
|
|
19
|
+
sessionType: seed.sessionType ?? "chat",
|
|
20
|
+
routing: seed.routing,
|
|
21
|
+
customData: seed.customData,
|
|
22
|
+
stats: seed.stats ?? {
|
|
77
23
|
messageCount: 0,
|
|
78
24
|
tokenCount: 0
|
|
79
25
|
}
|
|
80
26
|
};
|
|
81
27
|
}
|
|
82
28
|
//#endregion
|
|
83
|
-
export { buildDefaultSessionMetadata
|
|
29
|
+
export { buildDefaultSessionMetadata };
|
|
84
30
|
|
|
85
31
|
//# sourceMappingURL=session-metadata.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-metadata.js","names":[
|
|
1
|
+
{"version":3,"file":"session-metadata.js","names":[],"sources":["../../../../src/storage/sqlite/session-metadata.ts"],"sourcesContent":["import { SessionStatus, type SessionMetadata } from '../../session/types.js';\n\nexport type SessionMetadataSeed = Partial<Omit<SessionMetadata, 'key' | 'sessionId'>>;\n\nexport function buildDefaultSessionMetadata(\n sessionKey: string,\n seed: SessionMetadataSeed = {},\n): SessionMetadata {\n const now = new Date().toISOString();\n return {\n ...seed,\n key: sessionKey,\n status: seed.status ?? SessionStatus.ACTIVE,\n tags: seed.tags ?? [],\n createdAt: seed.createdAt ?? now,\n updatedAt: seed.updatedAt ?? now,\n lastAccessedAt: seed.lastAccessedAt ?? now,\n messageCount: seed.messageCount ?? 0,\n estimatedTokens: seed.estimatedTokens ?? 0,\n compactedCount: seed.compactedCount ?? 0,\n flushCount: seed.flushCount ?? 0,\n sourceChannel: seed.sourceChannel ?? '',\n sourceChatId: seed.sourceChatId ?? '',\n sessionType: seed.sessionType ?? 'chat',\n routing: seed.routing,\n customData: seed.customData,\n stats: seed.stats ?? { messageCount: 0, tokenCount: 0 },\n };\n}\n"],"mappings":";;AAIA,SAAgB,4BACd,YACA,OAA4B,EAAE,EACb;CACjB,MAAM,uBAAM,IAAI,MAAM,EAAC,aAAa;AACpC,QAAO;EACL,GAAG;EACH,KAAK;EACL,QAAQ,KAAK,UAAA;EACb,MAAM,KAAK,QAAQ,EAAE;EACrB,WAAW,KAAK,aAAa;EAC7B,WAAW,KAAK,aAAa;EAC7B,gBAAgB,KAAK,kBAAkB;EACvC,cAAc,KAAK,gBAAgB;EACnC,iBAAiB,KAAK,mBAAmB;EACzC,gBAAgB,KAAK,kBAAkB;EACvC,YAAY,KAAK,cAAc;EAC/B,eAAe,KAAK,iBAAiB;EACrC,cAAc,KAAK,gBAAgB;EACnC,aAAa,KAAK,eAAe;EACjC,SAAS,KAAK;EACd,YAAY,KAAK;EACjB,OAAO,KAAK,SAAS;GAAE,cAAc;GAAG,YAAY;GAAG;EACxD"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type { DatabaseSync } from 'node:sqlite';
|
|
2
2
|
import type { SessionListQuery, SessionMetadata, PaginatedResult } from '../../session/types.js';
|
|
3
|
+
import { type SessionMetadataSeed } from './session-metadata.js';
|
|
3
4
|
import { buildGlobalSessionStats } from './row-mappers.js';
|
|
4
|
-
export declare function ensureSessionInTransaction(db: DatabaseSync, sessionKey: string, cwd: string): SessionMetadata;
|
|
5
|
-
export declare function ensureSessionRecord(sessionKey: string, cwd: string): SessionMetadata;
|
|
6
|
-
export declare function
|
|
5
|
+
export declare function ensureSessionInTransaction(db: DatabaseSync, sessionKey: string, cwd: string, seed?: SessionMetadataSeed): SessionMetadata;
|
|
6
|
+
export declare function ensureSessionRecord(sessionKey: string, cwd: string, seed?: SessionMetadataSeed): SessionMetadata;
|
|
7
|
+
export declare function readCurrentSessionId(db: DatabaseSync, sessionKey: string): string | null;
|
|
7
8
|
export declare function getSessionMetadata(sessionKey: string): SessionMetadata | null;
|
|
8
|
-
export declare function
|
|
9
|
+
export declare function getCurrentSessionId(sessionKey: string): string | null;
|
|
9
10
|
export declare function listSessionMetadata(query?: SessionListQuery): PaginatedResult<SessionMetadata>;
|
|
10
11
|
export declare function patchSessionMetadata(sessionKey: string, updates: Partial<SessionMetadata>): SessionMetadata;
|
|
11
12
|
export declare function updateSessionStats(sessionKey: string, stats: {
|
|
@@ -24,6 +25,6 @@ export declare function getSessionPersistedLevels(sessionKey: string): {
|
|
|
24
25
|
thinkingLevel: string | null;
|
|
25
26
|
verboseLevel: string | null;
|
|
26
27
|
} | null;
|
|
27
|
-
export declare function
|
|
28
|
+
export declare function findSessionKeyBySessionId(sessionId: string): string | null;
|
|
28
29
|
export declare function getGlobalSessionStats(): ReturnType<typeof buildGlobalSessionStats>;
|
|
29
30
|
export declare function resolveSessionAgentId(sessionKey: string): string;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
|
|
2
|
-
import { buildDefaultSessionMetadata
|
|
2
|
+
import { buildDefaultSessionMetadata } from "./session-metadata.js";
|
|
3
3
|
import { buildGlobalSessionStats, metadataToSessionInsert, sessionRowToMetadata } from "./row-mappers.js";
|
|
4
4
|
import { validateSessionId } from "../../session/session-id.js";
|
|
5
5
|
import { escapeFts5Query } from "./fts.js";
|
|
6
6
|
import { randomUUID } from "node:crypto";
|
|
7
7
|
//#region src/storage/sqlite/session-repository.ts
|
|
8
8
|
const SESSION_COLUMNS = `
|
|
9
|
-
s.session_key, s.agent_id, s.
|
|
9
|
+
s.session_key, s.agent_id, s.session_id, s.status, s.name, s.tags_json,
|
|
10
10
|
s.created_at, s.updated_at, s.last_accessed_at, s.session_started_at, s.last_interaction_at,
|
|
11
11
|
s.source_channel, s.source_chat_id, s.session_type, s.hidden_from_session_list,
|
|
12
12
|
s.parent_session_key, s.workflow_run_id, s.workflow_definition_id, s.workflow_agent_id, s.workflow_agent_label,
|
|
@@ -18,16 +18,16 @@ const SESSION_COLUMNS = `
|
|
|
18
18
|
`;
|
|
19
19
|
const SESSION_FROM_JOIN = `
|
|
20
20
|
FROM sessions s
|
|
21
|
-
LEFT JOIN transcripts t ON t.
|
|
21
|
+
LEFT JOIN transcripts t ON t.session_id = s.session_id
|
|
22
22
|
`;
|
|
23
23
|
const SELECT_SESSION = `SELECT ${SESSION_COLUMNS} ${SESSION_FROM_JOIN} WHERE s.session_key = ?`;
|
|
24
24
|
function readSessionRow(db, sessionKey) {
|
|
25
25
|
return db.prepare(SELECT_SESSION).get(sessionKey);
|
|
26
26
|
}
|
|
27
|
-
function insertSessionAndTranscript(db, sessionKey,
|
|
28
|
-
const row = metadataToSessionInsert(sessionKey,
|
|
27
|
+
function insertSessionAndTranscript(db, sessionKey, sessionId, cwd, metadata) {
|
|
28
|
+
const row = metadataToSessionInsert(sessionKey, sessionId, metadata);
|
|
29
29
|
db.prepare(`INSERT INTO sessions (
|
|
30
|
-
session_key, agent_id,
|
|
30
|
+
session_key, agent_id, session_id, status, name, tags_json,
|
|
31
31
|
created_at, updated_at, last_accessed_at, session_started_at, last_interaction_at,
|
|
32
32
|
source_channel, source_chat_id, session_type, hidden_from_session_list,
|
|
33
33
|
parent_session_key, workflow_run_id, workflow_definition_id, workflow_agent_id, workflow_agent_label,
|
|
@@ -43,35 +43,35 @@ function insertSessionAndTranscript(db, sessionKey, transcriptId, cwd, metadata)
|
|
|
43
43
|
?, ?,
|
|
44
44
|
?, ?, ?, ?, ?, ?,
|
|
45
45
|
?, ?
|
|
46
|
-
)`).run(row.sessionKey, row.agentId, row.
|
|
46
|
+
)`).run(row.sessionKey, row.agentId, row.sessionId, row.status, row.name, row.tagsJson, row.createdAt, row.updatedAt, row.lastAccessedAt, row.sessionStartedAt, row.lastInteractionAt, row.sourceChannel, row.sourceChatId, row.sessionType, row.hiddenFromSessionList, row.parentSessionKey, row.workflowRunId, row.workflowDefinitionId, row.workflowAgentId, row.workflowAgentLabel, row.routingJson, row.customDataJson, row.abortCutoffTimestamp, row.messageCount, row.estimatedTokens, row.compactedCount, row.lastFlushedAt, row.flushCount, row.thinkingLevel, row.verboseLevel);
|
|
47
47
|
const now = Date.now();
|
|
48
|
-
db.prepare(`INSERT INTO transcripts (
|
|
49
|
-
VALUES (?, ?, 'active', ?, ?)`).run(
|
|
48
|
+
db.prepare(`INSERT INTO transcripts (session_id, session_key, status, created_at, cwd)
|
|
49
|
+
VALUES (?, ?, 'active', ?, ?)`).run(sessionId, sessionKey, now, cwd);
|
|
50
50
|
}
|
|
51
|
-
function ensureSessionInTransaction(db, sessionKey, cwd) {
|
|
51
|
+
function ensureSessionInTransaction(db, sessionKey, cwd, seed) {
|
|
52
52
|
const existing = readSessionRow(db, sessionKey);
|
|
53
53
|
if (existing) return sessionRowToMetadata(sessionKey, existing);
|
|
54
|
-
const
|
|
55
|
-
const metadata = buildDefaultSessionMetadata(sessionKey);
|
|
56
|
-
metadata.
|
|
57
|
-
insertSessionAndTranscript(db, sessionKey,
|
|
54
|
+
const sessionId = validateSessionId(randomUUID());
|
|
55
|
+
const metadata = buildDefaultSessionMetadata(sessionKey, seed);
|
|
56
|
+
metadata.sessionId = sessionId;
|
|
57
|
+
insertSessionAndTranscript(db, sessionKey, sessionId, cwd, metadata);
|
|
58
58
|
const row = readSessionRow(db, sessionKey);
|
|
59
59
|
if (!row) throw new Error(`Failed to create session: ${sessionKey}`);
|
|
60
60
|
return sessionRowToMetadata(sessionKey, row);
|
|
61
61
|
}
|
|
62
|
-
function ensureSessionRecord(sessionKey, cwd) {
|
|
63
|
-
return runSqliteWriteTransaction((db) => ensureSessionInTransaction(db, sessionKey, cwd));
|
|
62
|
+
function ensureSessionRecord(sessionKey, cwd, seed) {
|
|
63
|
+
return runSqliteWriteTransaction((db) => ensureSessionInTransaction(db, sessionKey, cwd, seed));
|
|
64
64
|
}
|
|
65
|
-
function
|
|
66
|
-
return db.prepare(`SELECT
|
|
65
|
+
function readCurrentSessionId(db, sessionKey) {
|
|
66
|
+
return db.prepare(`SELECT session_id FROM sessions WHERE session_key = ?`).get(sessionKey)?.session_id ?? null;
|
|
67
67
|
}
|
|
68
68
|
function getSessionMetadata(sessionKey) {
|
|
69
69
|
const row = readSessionRow(getSqliteDatabase(), sessionKey);
|
|
70
70
|
if (!row) return null;
|
|
71
71
|
return sessionRowToMetadata(sessionKey, row);
|
|
72
72
|
}
|
|
73
|
-
function
|
|
74
|
-
return
|
|
73
|
+
function getCurrentSessionId(sessionKey) {
|
|
74
|
+
return readCurrentSessionId(getSqliteDatabase(), sessionKey);
|
|
75
75
|
}
|
|
76
76
|
function listSessionMetadata(query = {}) {
|
|
77
77
|
const db = getSqliteDatabase();
|
|
@@ -104,13 +104,7 @@ function listSessionMetadata(query = {}) {
|
|
|
104
104
|
offset: query.offset ?? 0,
|
|
105
105
|
hasMore: false
|
|
106
106
|
};
|
|
107
|
-
|
|
108
|
-
const keyPatterns = /* @__PURE__ */ new Set();
|
|
109
|
-
for (const c of channels) if (c === "webchat" || c === "ui") keyPatterns.add(`s.session_key LIKE 'agent:%:webchat:%'`);
|
|
110
|
-
else if (c === "gateway" || c === "webui") keyPatterns.add(`s.session_key LIKE 'agent:%:gateway:%'`);
|
|
111
|
-
else keyPatterns.add(`s.session_key LIKE 'agent:%:${c.replace(/'/g, "''")}:%'`);
|
|
112
|
-
const keyFallback = keyPatterns.size > 0 ? `(TRIM(COALESCE(s.source_channel, '')) = '' AND (${[...keyPatterns].join(" OR ")}))` : "";
|
|
113
|
-
conditions.push(keyFallback ? `(${directMatch} OR ${keyFallback})` : directMatch);
|
|
107
|
+
conditions.push(`LOWER(s.source_channel) IN (${channels.map(() => "?").join(", ")})`);
|
|
114
108
|
params.push(...channels);
|
|
115
109
|
}
|
|
116
110
|
if (query.tags?.length) for (const tag of query.tags) {
|
|
@@ -236,23 +230,23 @@ function resetSessionRecord(sessionKey, cwd) {
|
|
|
236
230
|
return runSqliteWriteTransaction((db) => {
|
|
237
231
|
const existing = readSessionRow(db, sessionKey);
|
|
238
232
|
if (!existing) return null;
|
|
239
|
-
const previousSessionId = existing.
|
|
233
|
+
const previousSessionId = existing.session_id;
|
|
240
234
|
const now = Date.now();
|
|
241
235
|
db.prepare(`UPDATE transcripts SET status = 'archived', archive_reason = 'reset', archived_at = ?
|
|
242
|
-
WHERE
|
|
243
|
-
const
|
|
244
|
-
db.prepare(`INSERT INTO transcripts (
|
|
245
|
-
VALUES (?, ?, 'active', ?, ?)`).run(
|
|
236
|
+
WHERE session_id = ?`).run(now, previousSessionId);
|
|
237
|
+
const newSessionId = validateSessionId(randomUUID());
|
|
238
|
+
db.prepare(`INSERT INTO transcripts (session_id, session_key, status, created_at, cwd)
|
|
239
|
+
VALUES (?, ?, 'active', ?, ?)`).run(newSessionId, sessionKey, now, cwd);
|
|
246
240
|
db.prepare(`UPDATE sessions SET
|
|
247
|
-
|
|
241
|
+
session_id = ?,
|
|
248
242
|
updated_at = ?,
|
|
249
243
|
session_started_at = ?,
|
|
250
244
|
last_interaction_at = NULL,
|
|
251
245
|
message_count = 0,
|
|
252
246
|
estimated_tokens = 0
|
|
253
|
-
WHERE session_key = ?`).run(
|
|
247
|
+
WHERE session_key = ?`).run(newSessionId, now, now, sessionKey);
|
|
254
248
|
return {
|
|
255
|
-
sessionId:
|
|
249
|
+
sessionId: newSessionId,
|
|
256
250
|
previousSessionId
|
|
257
251
|
};
|
|
258
252
|
});
|
|
@@ -263,7 +257,7 @@ function deleteSessionRecord(sessionKey) {
|
|
|
263
257
|
if (!existing) return false;
|
|
264
258
|
const now = Date.now();
|
|
265
259
|
db.prepare(`UPDATE transcripts SET status = 'archived', archive_reason = 'delete', archived_at = ?
|
|
266
|
-
WHERE
|
|
260
|
+
WHERE session_id = ?`).run(now, existing.session_id);
|
|
267
261
|
db.prepare(`DELETE FROM sessions WHERE session_key = ?`).run(sessionKey);
|
|
268
262
|
return true;
|
|
269
263
|
});
|
|
@@ -281,8 +275,8 @@ function getSessionPersistedLevels(sessionKey) {
|
|
|
281
275
|
verboseLevel: row.verbose_level
|
|
282
276
|
};
|
|
283
277
|
}
|
|
284
|
-
function
|
|
285
|
-
return getSqliteDatabase().prepare(`SELECT session_key FROM sessions WHERE
|
|
278
|
+
function findSessionKeyBySessionId(sessionId) {
|
|
279
|
+
return getSqliteDatabase().prepare(`SELECT session_key FROM sessions WHERE session_id = ?`).get(sessionId)?.session_key ?? null;
|
|
286
280
|
}
|
|
287
281
|
function getGlobalSessionStats() {
|
|
288
282
|
return buildGlobalSessionStats(listSessionMetadata({
|
|
@@ -291,9 +285,9 @@ function getGlobalSessionStats() {
|
|
|
291
285
|
}).items);
|
|
292
286
|
}
|
|
293
287
|
function resolveSessionAgentId(sessionKey) {
|
|
294
|
-
return
|
|
288
|
+
return getSessionMetadata(sessionKey)?.routing?.agentId ?? "main";
|
|
295
289
|
}
|
|
296
290
|
//#endregion
|
|
297
|
-
export { deleteSessionRecord, ensureSessionInTransaction, ensureSessionRecord,
|
|
291
|
+
export { deleteSessionRecord, ensureSessionInTransaction, ensureSessionRecord, findSessionKeyBySessionId, getCurrentSessionId, getGlobalSessionStats, getSessionMetadata, getSessionPersistedLevels, incrementSessionStatsOnAppend, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, readCurrentSessionId, resetSessionRecord, resolveSessionAgentId, updateSessionStats };
|
|
298
292
|
|
|
299
293
|
//# sourceMappingURL=session-repository.js.map
|