@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
|
@@ -11,11 +11,11 @@ import { resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel } from ".
|
|
|
11
11
|
import { effectiveWorkspacePathForSession, normalizeWorkingDirectoryInput } from "./session-workspace.js";
|
|
12
12
|
import { shouldSkipWebchatInboundByAbortCutoff } from "./abort-cutoff.js";
|
|
13
13
|
import { DEFAULT_IDLE_MINUTES, DEFAULT_RESET_AT_HOUR, DEFAULT_RESET_MODE, evaluateSessionFreshness, resolveDailyResetAtMs, resolveSessionResetPolicy } from "./reset-policy.js";
|
|
14
|
-
import {
|
|
14
|
+
import { resolveChannelResetConfig, resolveSessionResetType } from "./reset-type.js";
|
|
15
15
|
import { resolveSessionLifecycleTimestamps } from "./lifecycle-timestamps.js";
|
|
16
16
|
import { resolveSession, resolveSessionKeyForRequest } from "./resolve-session.js";
|
|
17
17
|
import { DEFAULT_RESET_TRIGGERS, RESET_OVERLAP_COMMANDS, bareResetAckMessage, matchResetTriggers, resolveResetTriggers, shouldSkipResetOverlapCommand, stripLeadingEnvelopeTimestamp } from "./reset-triggers.js";
|
|
18
18
|
import { initSessionTurn } from "./init-session-turn.js";
|
|
19
19
|
import { flattenMessageContent, messagesToClientHistory } from "./client-history.js";
|
|
20
20
|
import { CURRENT_SESSION_TRANSCRIPT_VERSION, XOPC_SESSION_TRANSCRIPT_TYPE } from "./transcript-format.js";
|
|
21
|
-
export { CURRENT_SESSION_TRANSCRIPT_VERSION, DEFAULT_IDLE_MINUTES, DEFAULT_RESET_AT_HOUR, DEFAULT_RESET_MODE, DEFAULT_RESET_TRIGGERS, RESET_OVERLAP_COMMANDS, SessionConfigStore, SessionIndex, SessionStatus, SessionStore, XOPC_SESSION_TRANSCRIPT_TYPE, applySessionPatchToMetadata, bareResetAckMessage, buildSessionContextForLlm, effectiveWorkspacePathForSession, emitSessionTranscriptUpdate, evaluateSessionFreshness, fallbackTitleFromMessages, flattenMessageContent, generateSessionTitleFromMessages, getSessionTitleSource, initSessionTurn,
|
|
21
|
+
export { CURRENT_SESSION_TRANSCRIPT_VERSION, DEFAULT_IDLE_MINUTES, DEFAULT_RESET_AT_HOUR, DEFAULT_RESET_MODE, DEFAULT_RESET_TRIGGERS, RESET_OVERLAP_COMMANDS, SessionConfigStore, SessionIndex, SessionStatus, SessionStore, XOPC_SESSION_TRANSCRIPT_TYPE, applySessionPatchToMetadata, bareResetAckMessage, buildSessionContextForLlm, effectiveWorkspacePathForSession, emitSessionTranscriptUpdate, evaluateSessionFreshness, fallbackTitleFromMessages, flattenMessageContent, generateSessionTitleFromMessages, getSessionTitleSource, initSessionTurn, isTranscriptContextEntry, isWebchatSessionKey, matchResetTriggers, maybeRefineSessionTitleWithLlm, maybeSetProvisionalSessionTitle, mergeLlmMessagesPreservingContextRows, messagesToClientHistory, normalizeCompactionCheckpointId, normalizeWorkingDirectoryInput, onSessionTranscriptUpdate, provisionalTitleFromUserText, resolveChannelResetConfig, resolveDailyResetAtMs, resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel, resolveReasoningLevel, resolveResetTriggers, resolveSession, resolveSessionKeyForRequest, resolveSessionLifecycleTimestamps, resolveSessionResetPolicy, resolveSessionResetType, resolveThinkingLevel, resolveVerboseLevel, sanitizeSessionTitle, shouldAutoTitleSessionKey, shouldRefineSessionTitleWithLlm, shouldSkipResetOverlapCommand, shouldSkipWebchatInboundByAbortCutoff, stripLeadingEnvelopeTimestamp, transcriptRowsFromJsonArray };
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
+
import { SessionConfigSchema, init_schema } from "../config/schema.js";
|
|
1
2
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
-
import { SessionConfigSchema, init_schema } from "../config/schema.js";
|
|
4
|
-
import { init_session_key, parseSessionKey } from "../routing/session-key.js";
|
|
5
4
|
import { requireXopcDatabase } from "../storage/sqlite/connection.js";
|
|
6
5
|
import "../storage/sqlite/index.js";
|
|
7
6
|
import { evaluateSessionFreshness, resolveSessionResetPolicy } from "./reset-policy.js";
|
|
@@ -12,7 +11,6 @@ import { bareResetAckMessage, matchResetTriggers, resolveResetTriggers } from ".
|
|
|
12
11
|
import { randomUUID } from "node:crypto";
|
|
13
12
|
//#region src/session/init-session-turn.ts
|
|
14
13
|
init_schema();
|
|
15
|
-
init_session_key();
|
|
16
14
|
init_logger();
|
|
17
15
|
const log = createLogger("InitSessionTurn");
|
|
18
16
|
async function initSessionTurn(opts) {
|
|
@@ -26,19 +24,18 @@ async function initSessionTurn(opts) {
|
|
|
26
24
|
sessionKey: opts.sessionKey
|
|
27
25
|
});
|
|
28
26
|
const key = sessionKey?.trim() ?? opts.sessionKey.trim();
|
|
29
|
-
const
|
|
30
|
-
const peerKind =
|
|
27
|
+
const routing = sessionMetadata?.routing;
|
|
28
|
+
const peerKind = routing?.peerKind;
|
|
31
29
|
const resetType = resolveSessionResetType({
|
|
32
|
-
sessionKey: key,
|
|
33
30
|
isGroup: peerKind === "group" || peerKind === "channel",
|
|
34
|
-
isThread: Boolean(
|
|
31
|
+
isThread: Boolean(routing?.threadId)
|
|
35
32
|
});
|
|
36
33
|
const resetPolicy = resolveSessionResetPolicy({
|
|
37
34
|
sessionCfg,
|
|
38
35
|
resetType,
|
|
39
36
|
resetOverride: resolveChannelResetConfig({
|
|
40
37
|
sessionCfg,
|
|
41
|
-
channel:
|
|
38
|
+
channel: routing?.source ?? sessionMetadata?.sourceChannel
|
|
42
39
|
})
|
|
43
40
|
});
|
|
44
41
|
const lifecycle = resolveSessionLifecycleTimestamps({ entry: sessionMetadata ? {
|
|
@@ -56,10 +53,10 @@ async function initSessionTurn(opts) {
|
|
|
56
53
|
const skipImplicit = opts.skipImplicitExpiry ?? false;
|
|
57
54
|
const staleRollover = Boolean(sessionMetadata && !skipImplicit && !freshness.fresh);
|
|
58
55
|
const needsRollover = triggerMatch.resetTriggered || staleRollover;
|
|
59
|
-
let sessionId = sessionMetadata?.
|
|
56
|
+
let sessionId = sessionMetadata?.sessionId;
|
|
60
57
|
let previousSessionId;
|
|
61
58
|
let isNewSession = false;
|
|
62
|
-
if (needsRollover && sessionMetadata?.
|
|
59
|
+
if (needsRollover && sessionMetadata?.sessionId) {
|
|
63
60
|
const outcome = await opts.resetSession(key);
|
|
64
61
|
if (outcome) {
|
|
65
62
|
previousSessionId = outcome.previousSessionId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-session-turn.js","names":[],"sources":["../../../src/session/init-session-turn.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { SessionConfigSchema, type Config } from '../config/schema.js';\nimport {
|
|
1
|
+
{"version":3,"file":"init-session-turn.js","names":[],"sources":["../../../src/session/init-session-turn.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { SessionConfigSchema, type Config } from '../config/schema.js';\nimport { createLogger } from '../utils/logger.js';\nimport { requireXopcDatabase } from '../storage/sqlite/index.js';\nimport { resolveSessionLifecycleTimestamps } from './lifecycle-timestamps.js';\nimport {\n evaluateSessionFreshness,\n resolveSessionResetPolicy,\n} from './reset-policy.js';\nimport {\n bareResetAckMessage,\n matchResetTriggers,\n resolveResetTriggers,\n} from './reset-triggers.js';\nimport { resolveChannelResetConfig, resolveSessionResetType } from './reset-type.js';\nimport { resolveSessionKeyForRequest } from './resolve-session.js';\n\nconst log = createLogger('InitSessionTurn');\n\nexport type SessionResetFn = (\n sessionKey: string,\n) => Promise<{ sessionId: string; previousSessionId: string } | null>;\n\nexport type InitSessionTurnResult = {\n sessionKey: string;\n sessionId?: string;\n previousSessionId?: string;\n isNewSession: boolean;\n resetTriggered: boolean;\n staleRollover: boolean;\n bodyStripped: string;\n bareReset: boolean;\n ackMessage?: string;\n};\n\nexport type InitSessionTurnOptions = {\n cfg: Config;\n sessionKey: string;\n body?: string;\n resetSession: SessionResetFn;\n skipImplicitExpiry?: boolean;\n};\n\nexport async function initSessionTurn(\n opts: InitSessionTurnOptions,\n): Promise<InitSessionTurnResult> {\n requireXopcDatabase();\n\n const sessionCfg = opts.cfg.session ?? SessionConfigSchema.parse({});\n const triggers = resolveResetTriggers(sessionCfg.resetTriggers);\n const rawBody = opts.body ?? '';\n const triggerMatch = matchResetTriggers(rawBody, triggers);\n\n const { sessionKey, sessionMetadata } = await resolveSessionKeyForRequest({\n cfg: opts.cfg,\n sessionKey: opts.sessionKey,\n });\n const key = sessionKey?.trim() ?? opts.sessionKey.trim();\n\n const routing = sessionMetadata?.routing;\n const peerKind = routing?.peerKind;\n const resetType = resolveSessionResetType({\n isGroup: peerKind === 'group' || peerKind === 'channel',\n isThread: Boolean(routing?.threadId),\n });\n const channelReset = resolveChannelResetConfig({\n sessionCfg,\n channel: routing?.source ?? sessionMetadata?.sourceChannel,\n });\n const resetPolicy = resolveSessionResetPolicy({\n sessionCfg,\n resetType,\n resetOverride: channelReset,\n });\n const lifecycle = resolveSessionLifecycleTimestamps({\n entry: sessionMetadata\n ? {\n updatedAt: Date.parse(sessionMetadata.updatedAt),\n sessionStartedAt: sessionMetadata.sessionStartedAt\n ? Date.parse(sessionMetadata.sessionStartedAt)\n : undefined,\n lastInteractionAt: sessionMetadata.lastInteractionAt\n ? Date.parse(sessionMetadata.lastInteractionAt)\n : undefined,\n }\n : undefined,\n });\n const now = Date.now();\n const freshness = sessionMetadata\n ? evaluateSessionFreshness({\n updatedAt: Date.parse(sessionMetadata.updatedAt),\n ...lifecycle,\n now,\n policy: resetPolicy,\n })\n : { fresh: false };\n\n const skipImplicit = opts.skipImplicitExpiry ?? false;\n const staleRollover = Boolean(sessionMetadata && !skipImplicit && !freshness.fresh);\n const needsRollover = triggerMatch.resetTriggered || staleRollover;\n\n let sessionId = sessionMetadata?.sessionId;\n let previousSessionId: string | undefined;\n let isNewSession = false;\n\n if (needsRollover && sessionMetadata?.sessionId) {\n const outcome = await opts.resetSession(key);\n if (outcome) {\n previousSessionId = outcome.previousSessionId;\n sessionId = outcome.sessionId;\n isNewSession = true;\n log.info(\n {\n sessionKey: key,\n sessionId: outcome.sessionId,\n previousSessionId: outcome.previousSessionId,\n resetTriggered: triggerMatch.resetTriggered,\n staleRollover,\n resetType,\n },\n triggerMatch.resetTriggered\n ? 'Session reset via reset trigger'\n : 'Session rolled over (stale freshness)',\n );\n } else {\n log.warn({ sessionKey: key }, 'Session rollover requested but resetSession returned null');\n sessionId = randomUUID();\n isNewSession = true;\n }\n } else if (!sessionMetadata) {\n isNewSession = true;\n sessionId = randomUUID();\n }\n\n const bareReset = triggerMatch.resetTriggered && triggerMatch.bareReset;\n const ackMessage = bareReset ? bareResetAckMessage(triggerMatch.matchedTrigger) : undefined;\n\n return {\n sessionKey: key,\n sessionId,\n previousSessionId,\n isNewSession,\n resetTriggered: triggerMatch.resetTriggered,\n staleRollover,\n bodyStripped: triggerMatch.resetTriggered ? triggerMatch.bodyStripped : rawBody,\n bareReset,\n ackMessage,\n };\n}\n"],"mappings":";;;;;;;;;;;;aAEuE;aACrB;AAelD,MAAM,MAAM,aAAa,kBAAkB;AA0B3C,eAAsB,gBACpB,MACgC;AAChC,sBAAqB;CAErB,MAAM,aAAa,KAAK,IAAI,WAAW,oBAAoB,MAAM,EAAE,CAAC;CACpE,MAAM,WAAW,qBAAqB,WAAW,cAAc;CAC/D,MAAM,UAAU,KAAK,QAAQ;CAC7B,MAAM,eAAe,mBAAmB,SAAS,SAAS;CAE1D,MAAM,EAAE,YAAY,oBAAoB,MAAM,4BAA4B;EACxE,KAAK,KAAK;EACV,YAAY,KAAK;EAClB,CAAC;CACF,MAAM,MAAM,YAAY,MAAM,IAAI,KAAK,WAAW,MAAM;CAExD,MAAM,UAAU,iBAAiB;CACjC,MAAM,WAAW,SAAS;CAC1B,MAAM,YAAY,wBAAwB;EACxC,SAAS,aAAa,WAAW,aAAa;EAC9C,UAAU,QAAQ,SAAS,SAAS;EACrC,CAAC;CAKF,MAAM,cAAc,0BAA0B;EAC5C;EACA;EACA,eAPmB,0BAA0B;GAC7C;GACA,SAAS,SAAS,UAAU,iBAAiB;GAC9C,CAI4B;EAC5B,CAAC;CACF,MAAM,YAAY,kCAAkC,EAClD,OAAO,kBACH;EACE,WAAW,KAAK,MAAM,gBAAgB,UAAU;EAChD,kBAAkB,gBAAgB,mBAC9B,KAAK,MAAM,gBAAgB,iBAAiB,GAC5C,KAAA;EACJ,mBAAmB,gBAAgB,oBAC/B,KAAK,MAAM,gBAAgB,kBAAkB,GAC7C,KAAA;EACL,GACD,KAAA,GACL,CAAC;CACF,MAAM,MAAM,KAAK,KAAK;CACtB,MAAM,YAAY,kBACd,yBAAyB;EACvB,WAAW,KAAK,MAAM,gBAAgB,UAAU;EAChD,GAAG;EACH;EACA,QAAQ;EACT,CAAC,GACF,EAAE,OAAO,OAAO;CAEpB,MAAM,eAAe,KAAK,sBAAsB;CAChD,MAAM,gBAAgB,QAAQ,mBAAmB,CAAC,gBAAgB,CAAC,UAAU,MAAM;CACnF,MAAM,gBAAgB,aAAa,kBAAkB;CAErD,IAAI,YAAY,iBAAiB;CACjC,IAAI;CACJ,IAAI,eAAe;AAEnB,KAAI,iBAAiB,iBAAiB,WAAW;EAC/C,MAAM,UAAU,MAAM,KAAK,aAAa,IAAI;AAC5C,MAAI,SAAS;AACX,uBAAoB,QAAQ;AAC5B,eAAY,QAAQ;AACpB,kBAAe;AACf,OAAI,KACF;IACE,YAAY;IACZ,WAAW,QAAQ;IACnB,mBAAmB,QAAQ;IAC3B,gBAAgB,aAAa;IAC7B;IACA;IACD,EACD,aAAa,iBACT,oCACA,wCACL;SACI;AACL,OAAI,KAAK,EAAE,YAAY,KAAK,EAAE,4DAA4D;AAC1F,eAAY,YAAY;AACxB,kBAAe;;YAER,CAAC,iBAAiB;AAC3B,iBAAe;AACf,cAAY,YAAY;;CAG1B,MAAM,YAAY,aAAa,kBAAkB,aAAa;CAC9D,MAAM,aAAa,YAAY,oBAAoB,aAAa,eAAe,GAAG,KAAA;AAElF,QAAO;EACL,YAAY;EACZ;EACA;EACA;EACA,gBAAgB,aAAa;EAC7B;EACA,cAAc,aAAa,iBAAiB,aAAa,eAAe;EACxE;EACA;EACD"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import EventEmitter from 'events';
|
|
2
2
|
import { SessionStore } from './store.js';
|
|
3
3
|
import type { SessionMetadata, SessionDetail, SessionListQuery, PaginatedResult, GlobalSessionStats, ExportFormat, SessionStatus } from './types.js';
|
|
4
|
+
import type { SessionMetadataSeed } from '../storage/sqlite/index.js';
|
|
4
5
|
import type { Message } from './types.js';
|
|
5
6
|
import type { CompactionConfig, CompactionResult } from '../agent/memory/compaction.js';
|
|
6
7
|
import type { XopcSessionTranscriptV1 } from './transcript-format.js';
|
|
@@ -52,6 +53,7 @@ export declare class SessionIndex extends EventEmitter {
|
|
|
52
53
|
error: string;
|
|
53
54
|
}>;
|
|
54
55
|
getSessionMetadata(key: string): Promise<SessionMetadata | null>;
|
|
56
|
+
resolveSessionKeyBySessionId(sessionId: string): Promise<string | null>;
|
|
55
57
|
deleteSession(key: string): Promise<boolean>;
|
|
56
58
|
deleteSessions(keys: string[]): Promise<{
|
|
57
59
|
success: string[];
|
|
@@ -123,7 +125,9 @@ export declare class SessionIndex extends EventEmitter {
|
|
|
123
125
|
* Runtime turns must use PiTranscriptManager.appendMessage; this entry point
|
|
124
126
|
* is reserved for compaction, tests, and admin tools.
|
|
125
127
|
*/
|
|
126
|
-
saveMessages(key: string, messages: any[]
|
|
128
|
+
saveMessages(key: string, messages: any[], options?: {
|
|
129
|
+
metadata?: SessionMetadataSeed;
|
|
130
|
+
}): Promise<void>;
|
|
127
131
|
/**
|
|
128
132
|
* Append `kind: 'context'` transcript row (persisted, excluded from {@link loadMessages} / LLM).
|
|
129
133
|
*/
|
|
@@ -58,6 +58,9 @@ var SessionIndex = class extends EventEmitter$1 {
|
|
|
58
58
|
async getSessionMetadata(key) {
|
|
59
59
|
return this.store.getMetadata(key);
|
|
60
60
|
}
|
|
61
|
+
async resolveSessionKeyBySessionId(sessionId) {
|
|
62
|
+
return this.store.resolveKeyBySessionId(sessionId);
|
|
63
|
+
}
|
|
61
64
|
async deleteSession(key) {
|
|
62
65
|
const result = await this.store.delete(key);
|
|
63
66
|
if (result) this.emit("sessionDeleted", { key });
|
|
@@ -218,8 +221,8 @@ var SessionIndex = class extends EventEmitter$1 {
|
|
|
218
221
|
* Runtime turns must use PiTranscriptManager.appendMessage; this entry point
|
|
219
222
|
* is reserved for compaction, tests, and admin tools.
|
|
220
223
|
*/
|
|
221
|
-
async saveMessages(key, messages) {
|
|
222
|
-
return this.store.saveMessages(key, messages);
|
|
224
|
+
async saveMessages(key, messages, options) {
|
|
225
|
+
return this.store.saveMessages(key, messages, options);
|
|
223
226
|
}
|
|
224
227
|
/**
|
|
225
228
|
* Append `kind: 'context'` transcript row (persisted, excluded from {@link loadMessages} / LLM).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","names":["EventEmitter"],"sources":["../../../src/session/manager.ts"],"sourcesContent":["// Session manager - high-level session management service\n\nimport EventEmitter from 'events';\nimport { createLogger } from '../utils/logger.js';\nimport { SessionStore } from './store.js';\nimport type {\n SessionMetadata,\n SessionDetail,\n SessionListQuery,\n PaginatedResult,\n GlobalSessionStats,\n ExportFormat,\n SessionStatus,\n} from './types.js';\nimport type { Message } from './types.js';\nimport type { CompactionConfig, CompactionResult } from '../agent/memory/compaction.js';\nimport type { XopcSessionTranscriptV1 } from './transcript-format.js';\nimport type { XopcTranscriptContextEntry } from './session-context-for-llm.js';\nimport { applySessionPatchToMetadata, type SessionPatchBody } from './patch-metadata.js';\nimport type { WindowConfig } from '../agent/memory/window.js';\nimport type { Config } from '../config/schema.js';\n\nconst log = createLogger('SessionIndex');\n\nexport interface SessionIndexConfig {\n config: Config;\n windowConfig?: Partial<WindowConfig>;\n compactionConfig?: Partial<CompactionConfig>;\n}\n\nexport class SessionIndex extends EventEmitter {\n private store: SessionStore;\n\n constructor(config: SessionIndexConfig) {\n super();\n this.store = new SessionStore(\n {\n config: config.config,\n },\n config.windowConfig,\n config.compactionConfig\n );\n }\n\n async initialize(): Promise<void> {\n await this.store.initialize();\n this.emit('ready');\n }\n\n /** Low-level store (e.g. cron resolving weixin delivery from session index). */\n getStore(): SessionStore {\n return this.store;\n }\n\n // ========== CRUD Operations ==========\n\n async listSessions(query?: SessionListQuery): Promise<PaginatedResult<SessionMetadata>> {\n return this.store.list(query);\n }\n\n async listSubagents(query: SessionListQuery = {}): Promise<PaginatedResult<SessionMetadata>> {\n return this.store.list({\n ...query,\n sessionTypes: ['workflow-subagent'],\n includeHidden: true,\n });\n }\n\n async getSession(\n key: string,\n options?: { includeTranscriptSummary?: boolean; includeTranscriptRows?: boolean },\n ): Promise<SessionDetail | null> {\n const session = await this.store.get(key, options);\n if (session) {\n this.emit('sessionAccessed', { key });\n }\n return session;\n }\n\n async getSessionMessagePage(\n key: string,\n options?: {\n offset?: number;\n limit?: number;\n before?: string;\n includeTranscriptSummary?: boolean;\n includeTranscriptRows?: boolean;\n },\n ): Promise<{\n session: SessionDetail;\n pagination: {\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n before?: string;\n nextBeforeCursor?: string;\n };\n } | null> {\n const result = await this.store.getMessagePage(key, options);\n if (result) {\n this.emit('sessionAccessed', { key });\n }\n return result;\n }\n\n /**\n * OpenClaw-style `sessions.patch`: partial metadata (name, tags, customData shallow merge).\n */\n async patchSession(\n key: string,\n patch: SessionPatchBody,\n ): Promise<{ ok: true } | { ok: false; error: string }> {\n const meta = await this.store.getMetadata(key);\n if (!meta) {\n return { ok: false, error: 'Session not found' };\n }\n const updates = applySessionPatchToMetadata(meta, patch);\n if (Object.keys(updates).length === 0) {\n return { ok: true };\n }\n await this.store.updateMetadata(key, updates);\n this.emit('sessionUpdated', { key });\n return { ok: true };\n }\n\n async getSessionMetadata(key: string): Promise<SessionMetadata | null> {\n return this.store.getMetadata(key);\n }\n\n async deleteSession(key: string): Promise<boolean> {\n const result = await this.store.delete(key);\n if (result) {\n this.emit('sessionDeleted', { key });\n }\n return result;\n }\n\n async deleteSessions(keys: string[]): Promise<{ success: string[]; failed: string[] }> {\n const result = await this.store.deleteMany(keys);\n for (const key of result.success) {\n this.emit('sessionDeleted', { key });\n }\n return result;\n }\n\n // ========== Metadata Updates ==========\n\n async renameSession(key: string, name: string): Promise<void> {\n const existing = await this.store.getMetadata(key);\n await this.store.updateMetadata(key, {\n name,\n customData: { ...(existing?.customData ?? {}), titleSource: 'user' },\n });\n this.emit('sessionUpdated', { key, name });\n }\n\n /** Partial metadata update (caller merges nested fields like `customData` when needed). */\n async updateSessionMetadata(key: string, updates: Partial<SessionMetadata>): Promise<void> {\n await this.store.updateMetadata(key, updates);\n this.emit('sessionUpdated', { key });\n }\n\n async tagSession(key: string, tags: string[]): Promise<void> {\n const existing = await this.store.getMetadata(key);\n if (!existing) {\n throw new Error(`Session not found: ${key}`);\n }\n\n // Merge tags, remove duplicates\n const mergedTags = [...new Set([...existing.tags, ...tags])];\n await this.store.updateMetadata(key, { tags: mergedTags });\n this.emit('sessionUpdated', { key, tags: mergedTags });\n }\n\n async untagSession(key: string, tags: string[]): Promise<void> {\n const existing = await this.store.getMetadata(key);\n if (!existing) {\n throw new Error(`Session not found: ${key}`);\n }\n\n const filteredTags = existing.tags.filter((t) => !tags.includes(t));\n await this.store.updateMetadata(key, { tags: filteredTags });\n this.emit('sessionUpdated', { key, tags: filteredTags });\n }\n\n async setSessionTags(key: string, tags: string[]): Promise<void> {\n await this.store.updateMetadata(key, { tags: [...new Set(tags)] });\n this.emit('sessionUpdated', { key, tags });\n }\n\n // ========== Status Management ==========\n\n async archiveSession(key: string): Promise<void> {\n await this.store.archive(key);\n this.emit('sessionArchived', { key });\n }\n\n async unarchiveSession(key: string): Promise<void> {\n await this.store.unarchive(key);\n this.emit('sessionRestored', { key });\n }\n\n async pinSession(key: string): Promise<void> {\n await this.store.pin(key);\n this.emit('sessionPinned', { key });\n }\n\n async unpinSession(key: string): Promise<void> {\n await this.store.unpin(key);\n this.emit('sessionUnpinned', { key });\n }\n\n async setSessionStatus(key: string, status: SessionStatus): Promise<void> {\n await this.store.setStatus(key, status);\n this.emit('sessionStatusChanged', { key, status });\n }\n\n // ========== Search ==========\n\n async searchSessions(query: string): Promise<SessionMetadata[]> {\n const result = await this.store.list({ search: query, sessionTypes: ['chat'], limit: 100 });\n return result.items;\n }\n\n async searchInSession(key: string, keyword: string): Promise<Message[]> {\n return this.store.searchInSession(key, keyword);\n }\n\n // ========== Export/Import ==========\n\n async exportSession(key: string, format: ExportFormat): Promise<string> {\n return this.store.exportSession(key, format);\n }\n\n async importSessionExport(\n targetKey: string,\n jsonContent: string,\n ): Promise<{ sessionKey: string; rowCount: number }> {\n const result = await this.store.importSessionExport(targetKey, jsonContent);\n const metadata = await this.store.getMetadata(result.sessionKey);\n if (metadata) {\n this.emit('sessionCreated', metadata);\n }\n return result;\n }\n\n async forkSession(\n sourceKey: string,\n targetKey: string,\n ): Promise<{ sessionKey: string; rowCount: number }> {\n const result = await this.store.forkSession(sourceKey, targetKey);\n const metadata = await this.store.getMetadata(result.sessionKey);\n if (metadata) {\n this.emit('sessionCreated', metadata);\n }\n return result;\n }\n\n async forkSessionRows(\n sourceKey: string,\n targetKey: string,\n options: { throughRow?: number } = {},\n ): Promise<{ sessionKey: string; rowCount: number }> {\n const result = await this.store.forkSessionRows(sourceKey, targetKey, options);\n const metadata = await this.store.getMetadata(result.sessionKey);\n if (metadata) {\n this.emit('sessionCreated', metadata);\n }\n return result;\n }\n\n // ========== Statistics ==========\n\n async getStats(): Promise<GlobalSessionStats> {\n return this.store.getStats();\n }\n\n // ========== Maintenance ==========\n\n async archiveOldSessions(olderThanDays: number): Promise<number> {\n const count = await this.store.archiveOld(olderThanDays);\n log.info({ count, olderThanDays }, 'Archived old sessions');\n return count;\n }\n\n // ========== Event Helpers ==========\n\n onSessionCreated(callback: (metadata: SessionMetadata) => void): void {\n this.on('sessionCreated', callback);\n }\n\n onSessionUpdated(callback: (data: { key: string; name?: string; tags?: string[] }) => void): void {\n this.on('sessionUpdated', callback);\n }\n\n onSessionDeleted(callback: (data: { key: string }) => void): void {\n this.on('sessionDeleted', callback);\n }\n\n onSessionArchived(callback: (data: { key: string }) => void): void {\n this.on('sessionArchived', callback);\n }\n\n onSessionRestored(callback: (data: { key: string }) => void): void {\n this.on('sessionRestored', callback);\n }\n\n onSessionPinned(callback: (data: { key: string }) => void): void {\n this.on('sessionPinned', callback);\n }\n\n onSessionUnpinned(callback: (data: { key: string }) => void): void {\n this.on('sessionUnpinned', callback);\n }\n\n onSessionStatusChanged(callback: (data: { key: string; status: SessionStatus }) => void): void {\n this.on('sessionStatusChanged', callback);\n }\n\n onSessionAccessed(callback: (data: { key: string }) => void): void {\n this.on('sessionAccessed', callback);\n }\n\n // ========== Store delegation (messages, compaction) ==========\n\n /** Load messages for a session key */\n async loadMessages(key: string) {\n return this.store.loadMessages(key);\n }\n\n /** Wrapped transcript document (stable id, compaction history); null if missing or not a valid envelope. */\n async loadTranscriptDocument(key: string): Promise<XopcSessionTranscriptV1 | null> {\n return this.store.loadTranscriptDocument(key);\n }\n\n /**\n * Runtime turns must use PiTranscriptManager.appendMessage; this entry point\n * is reserved for compaction, tests, and admin tools.\n */\n async saveMessages(key: string, messages: any[]) {\n return this.store.saveMessages(key, messages);\n }\n\n /**\n * Append `kind: 'context'` transcript row (persisted, excluded from {@link loadMessages} / LLM).\n */\n async appendTranscriptContextEntry(\n key: string,\n entry: Omit<XopcTranscriptContextEntry, 'kind'> & Partial<Pick<XopcTranscriptContextEntry, 'kind'>>,\n ): Promise<void> {\n await this.store.appendTranscriptContextEntry(key, entry);\n this.emit('sessionUpdated', { key });\n }\n\n async appendTranscriptLabelEntry(\n key: string,\n entry: { targetId: string; label?: string },\n ): Promise<void> {\n await this.store.appendTranscriptLabelEntry(key, entry);\n this.emit('sessionUpdated', { key });\n }\n\n async appendTranscriptCustomEntry(\n key: string,\n entry: { customType: string; data?: unknown },\n ): Promise<void> {\n await this.store.appendTranscriptCustomEntry(key, entry);\n this.emit('sessionUpdated', { key });\n }\n\n async appendTranscriptCustomMessageEntry(\n key: string,\n entry: {\n customType: string;\n content?: string | unknown[];\n display?: boolean;\n details?: unknown;\n },\n ): Promise<void> {\n await this.store.appendTranscriptCustomMessageEntry(key, entry);\n this.emit('sessionUpdated', { key });\n }\n\n async appendTranscriptBashExecutionEntry(\n key: string,\n entry: {\n command: string;\n output?: string;\n exitCode?: number | null;\n signal?: string | null;\n excludeFromContext?: boolean;\n truncated?: boolean;\n fullOutputPath?: string;\n },\n ): Promise<void> {\n await this.store.appendTranscriptBashExecutionEntry(key, entry);\n this.emit('sessionUpdated', { key });\n }\n\n /** Delete session data */\n async delete(key: string): Promise<void> {\n await this.store.delete(key);\n }\n\n /** Archive transcript and start a new session id for the same key. */\n async resetSession(\n key: string,\n ): Promise<{ sessionId: string; previousSessionId: string } | null> {\n const result = await this.store.reset(key);\n if (result) {\n this.emit('sessionUpdated', { key });\n }\n return result;\n }\n\n /** Token/window stats for a message list */\n getWindowStats(messages: any[]) {\n return this.store.getWindowStats(messages);\n }\n\n /** Prepare compaction run */\n prepareCompaction(key: string, messages: any[], contextWindow: number) {\n return this.store.prepareCompaction(key, messages, contextWindow);\n }\n\n /** Compact session messages */\n compact(\n key: string,\n messages: any[],\n contextWindow: number,\n instructions?: string,\n force?: boolean,\n ): Promise<CompactionResult> {\n return this.store.compact(key, messages, contextWindow, instructions, force);\n }\n\n /** Compaction stats for a session */\n async getCompactionStats(key: string) {\n return this.store.getCompactionStats(key);\n }\n\n /** List pre-compaction transcript snapshots (newest first). */\n listCompactionCheckpoints(key: string) {\n return this.store.listCompactionCheckpoints(key);\n }\n\n getCompactionCheckpointDetail(key: string, checkpointId: string) {\n return this.store.getCompactionCheckpointDetail(key, checkpointId);\n }\n\n restoreCompactionCheckpoint(key: string, checkpointId: string) {\n return this.store.restoreCompactionCheckpoint(key, checkpointId);\n }\n\n /** Estimate token usage for messages */\n async estimateTokenUsage(key: string, messages: any[]): Promise<number> {\n return this.store.estimateTokens(messages);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"manager.js","names":["EventEmitter"],"sources":["../../../src/session/manager.ts"],"sourcesContent":["// Session manager - high-level session management service\n\nimport EventEmitter from 'events';\nimport { createLogger } from '../utils/logger.js';\nimport { SessionStore } from './store.js';\nimport type {\n SessionMetadata,\n SessionDetail,\n SessionListQuery,\n PaginatedResult,\n GlobalSessionStats,\n ExportFormat,\n SessionStatus,\n} from './types.js';\nimport type { SessionMetadataSeed } from '../storage/sqlite/index.js';\nimport type { Message } from './types.js';\nimport type { CompactionConfig, CompactionResult } from '../agent/memory/compaction.js';\nimport type { XopcSessionTranscriptV1 } from './transcript-format.js';\nimport type { XopcTranscriptContextEntry } from './session-context-for-llm.js';\nimport { applySessionPatchToMetadata, type SessionPatchBody } from './patch-metadata.js';\nimport type { WindowConfig } from '../agent/memory/window.js';\nimport type { Config } from '../config/schema.js';\n\nconst log = createLogger('SessionIndex');\n\nexport interface SessionIndexConfig {\n config: Config;\n windowConfig?: Partial<WindowConfig>;\n compactionConfig?: Partial<CompactionConfig>;\n}\n\nexport class SessionIndex extends EventEmitter {\n private store: SessionStore;\n\n constructor(config: SessionIndexConfig) {\n super();\n this.store = new SessionStore(\n {\n config: config.config,\n },\n config.windowConfig,\n config.compactionConfig\n );\n }\n\n async initialize(): Promise<void> {\n await this.store.initialize();\n this.emit('ready');\n }\n\n /** Low-level store (e.g. cron resolving weixin delivery from session index). */\n getStore(): SessionStore {\n return this.store;\n }\n\n // ========== CRUD Operations ==========\n\n async listSessions(query?: SessionListQuery): Promise<PaginatedResult<SessionMetadata>> {\n return this.store.list(query);\n }\n\n async listSubagents(query: SessionListQuery = {}): Promise<PaginatedResult<SessionMetadata>> {\n return this.store.list({\n ...query,\n sessionTypes: ['workflow-subagent'],\n includeHidden: true,\n });\n }\n\n async getSession(\n key: string,\n options?: { includeTranscriptSummary?: boolean; includeTranscriptRows?: boolean },\n ): Promise<SessionDetail | null> {\n const session = await this.store.get(key, options);\n if (session) {\n this.emit('sessionAccessed', { key });\n }\n return session;\n }\n\n async getSessionMessagePage(\n key: string,\n options?: {\n offset?: number;\n limit?: number;\n before?: string;\n includeTranscriptSummary?: boolean;\n includeTranscriptRows?: boolean;\n },\n ): Promise<{\n session: SessionDetail;\n pagination: {\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n before?: string;\n nextBeforeCursor?: string;\n };\n } | null> {\n const result = await this.store.getMessagePage(key, options);\n if (result) {\n this.emit('sessionAccessed', { key });\n }\n return result;\n }\n\n /**\n * OpenClaw-style `sessions.patch`: partial metadata (name, tags, customData shallow merge).\n */\n async patchSession(\n key: string,\n patch: SessionPatchBody,\n ): Promise<{ ok: true } | { ok: false; error: string }> {\n const meta = await this.store.getMetadata(key);\n if (!meta) {\n return { ok: false, error: 'Session not found' };\n }\n const updates = applySessionPatchToMetadata(meta, patch);\n if (Object.keys(updates).length === 0) {\n return { ok: true };\n }\n await this.store.updateMetadata(key, updates);\n this.emit('sessionUpdated', { key });\n return { ok: true };\n }\n\n async getSessionMetadata(key: string): Promise<SessionMetadata | null> {\n return this.store.getMetadata(key);\n }\n\n async resolveSessionKeyBySessionId(sessionId: string): Promise<string | null> {\n return this.store.resolveKeyBySessionId(sessionId);\n }\n\n async deleteSession(key: string): Promise<boolean> {\n const result = await this.store.delete(key);\n if (result) {\n this.emit('sessionDeleted', { key });\n }\n return result;\n }\n\n async deleteSessions(keys: string[]): Promise<{ success: string[]; failed: string[] }> {\n const result = await this.store.deleteMany(keys);\n for (const key of result.success) {\n this.emit('sessionDeleted', { key });\n }\n return result;\n }\n\n // ========== Metadata Updates ==========\n\n async renameSession(key: string, name: string): Promise<void> {\n const existing = await this.store.getMetadata(key);\n await this.store.updateMetadata(key, {\n name,\n customData: { ...(existing?.customData ?? {}), titleSource: 'user' },\n });\n this.emit('sessionUpdated', { key, name });\n }\n\n /** Partial metadata update (caller merges nested fields like `customData` when needed). */\n async updateSessionMetadata(key: string, updates: Partial<SessionMetadata>): Promise<void> {\n await this.store.updateMetadata(key, updates);\n this.emit('sessionUpdated', { key });\n }\n\n async tagSession(key: string, tags: string[]): Promise<void> {\n const existing = await this.store.getMetadata(key);\n if (!existing) {\n throw new Error(`Session not found: ${key}`);\n }\n\n // Merge tags, remove duplicates\n const mergedTags = [...new Set([...existing.tags, ...tags])];\n await this.store.updateMetadata(key, { tags: mergedTags });\n this.emit('sessionUpdated', { key, tags: mergedTags });\n }\n\n async untagSession(key: string, tags: string[]): Promise<void> {\n const existing = await this.store.getMetadata(key);\n if (!existing) {\n throw new Error(`Session not found: ${key}`);\n }\n\n const filteredTags = existing.tags.filter((t) => !tags.includes(t));\n await this.store.updateMetadata(key, { tags: filteredTags });\n this.emit('sessionUpdated', { key, tags: filteredTags });\n }\n\n async setSessionTags(key: string, tags: string[]): Promise<void> {\n await this.store.updateMetadata(key, { tags: [...new Set(tags)] });\n this.emit('sessionUpdated', { key, tags });\n }\n\n // ========== Status Management ==========\n\n async archiveSession(key: string): Promise<void> {\n await this.store.archive(key);\n this.emit('sessionArchived', { key });\n }\n\n async unarchiveSession(key: string): Promise<void> {\n await this.store.unarchive(key);\n this.emit('sessionRestored', { key });\n }\n\n async pinSession(key: string): Promise<void> {\n await this.store.pin(key);\n this.emit('sessionPinned', { key });\n }\n\n async unpinSession(key: string): Promise<void> {\n await this.store.unpin(key);\n this.emit('sessionUnpinned', { key });\n }\n\n async setSessionStatus(key: string, status: SessionStatus): Promise<void> {\n await this.store.setStatus(key, status);\n this.emit('sessionStatusChanged', { key, status });\n }\n\n // ========== Search ==========\n\n async searchSessions(query: string): Promise<SessionMetadata[]> {\n const result = await this.store.list({ search: query, sessionTypes: ['chat'], limit: 100 });\n return result.items;\n }\n\n async searchInSession(key: string, keyword: string): Promise<Message[]> {\n return this.store.searchInSession(key, keyword);\n }\n\n // ========== Export/Import ==========\n\n async exportSession(key: string, format: ExportFormat): Promise<string> {\n return this.store.exportSession(key, format);\n }\n\n async importSessionExport(\n targetKey: string,\n jsonContent: string,\n ): Promise<{ sessionKey: string; rowCount: number }> {\n const result = await this.store.importSessionExport(targetKey, jsonContent);\n const metadata = await this.store.getMetadata(result.sessionKey);\n if (metadata) {\n this.emit('sessionCreated', metadata);\n }\n return result;\n }\n\n async forkSession(\n sourceKey: string,\n targetKey: string,\n ): Promise<{ sessionKey: string; rowCount: number }> {\n const result = await this.store.forkSession(sourceKey, targetKey);\n const metadata = await this.store.getMetadata(result.sessionKey);\n if (metadata) {\n this.emit('sessionCreated', metadata);\n }\n return result;\n }\n\n async forkSessionRows(\n sourceKey: string,\n targetKey: string,\n options: { throughRow?: number } = {},\n ): Promise<{ sessionKey: string; rowCount: number }> {\n const result = await this.store.forkSessionRows(sourceKey, targetKey, options);\n const metadata = await this.store.getMetadata(result.sessionKey);\n if (metadata) {\n this.emit('sessionCreated', metadata);\n }\n return result;\n }\n\n // ========== Statistics ==========\n\n async getStats(): Promise<GlobalSessionStats> {\n return this.store.getStats();\n }\n\n // ========== Maintenance ==========\n\n async archiveOldSessions(olderThanDays: number): Promise<number> {\n const count = await this.store.archiveOld(olderThanDays);\n log.info({ count, olderThanDays }, 'Archived old sessions');\n return count;\n }\n\n // ========== Event Helpers ==========\n\n onSessionCreated(callback: (metadata: SessionMetadata) => void): void {\n this.on('sessionCreated', callback);\n }\n\n onSessionUpdated(callback: (data: { key: string; name?: string; tags?: string[] }) => void): void {\n this.on('sessionUpdated', callback);\n }\n\n onSessionDeleted(callback: (data: { key: string }) => void): void {\n this.on('sessionDeleted', callback);\n }\n\n onSessionArchived(callback: (data: { key: string }) => void): void {\n this.on('sessionArchived', callback);\n }\n\n onSessionRestored(callback: (data: { key: string }) => void): void {\n this.on('sessionRestored', callback);\n }\n\n onSessionPinned(callback: (data: { key: string }) => void): void {\n this.on('sessionPinned', callback);\n }\n\n onSessionUnpinned(callback: (data: { key: string }) => void): void {\n this.on('sessionUnpinned', callback);\n }\n\n onSessionStatusChanged(callback: (data: { key: string; status: SessionStatus }) => void): void {\n this.on('sessionStatusChanged', callback);\n }\n\n onSessionAccessed(callback: (data: { key: string }) => void): void {\n this.on('sessionAccessed', callback);\n }\n\n // ========== Store delegation (messages, compaction) ==========\n\n /** Load messages for a session key */\n async loadMessages(key: string) {\n return this.store.loadMessages(key);\n }\n\n /** Wrapped transcript document (stable id, compaction history); null if missing or not a valid envelope. */\n async loadTranscriptDocument(key: string): Promise<XopcSessionTranscriptV1 | null> {\n return this.store.loadTranscriptDocument(key);\n }\n\n /**\n * Runtime turns must use PiTranscriptManager.appendMessage; this entry point\n * is reserved for compaction, tests, and admin tools.\n */\n async saveMessages(\n key: string,\n messages: any[],\n options?: { metadata?: SessionMetadataSeed },\n ) {\n return this.store.saveMessages(key, messages, options);\n }\n\n /**\n * Append `kind: 'context'` transcript row (persisted, excluded from {@link loadMessages} / LLM).\n */\n async appendTranscriptContextEntry(\n key: string,\n entry: Omit<XopcTranscriptContextEntry, 'kind'> & Partial<Pick<XopcTranscriptContextEntry, 'kind'>>,\n ): Promise<void> {\n await this.store.appendTranscriptContextEntry(key, entry);\n this.emit('sessionUpdated', { key });\n }\n\n async appendTranscriptLabelEntry(\n key: string,\n entry: { targetId: string; label?: string },\n ): Promise<void> {\n await this.store.appendTranscriptLabelEntry(key, entry);\n this.emit('sessionUpdated', { key });\n }\n\n async appendTranscriptCustomEntry(\n key: string,\n entry: { customType: string; data?: unknown },\n ): Promise<void> {\n await this.store.appendTranscriptCustomEntry(key, entry);\n this.emit('sessionUpdated', { key });\n }\n\n async appendTranscriptCustomMessageEntry(\n key: string,\n entry: {\n customType: string;\n content?: string | unknown[];\n display?: boolean;\n details?: unknown;\n },\n ): Promise<void> {\n await this.store.appendTranscriptCustomMessageEntry(key, entry);\n this.emit('sessionUpdated', { key });\n }\n\n async appendTranscriptBashExecutionEntry(\n key: string,\n entry: {\n command: string;\n output?: string;\n exitCode?: number | null;\n signal?: string | null;\n excludeFromContext?: boolean;\n truncated?: boolean;\n fullOutputPath?: string;\n },\n ): Promise<void> {\n await this.store.appendTranscriptBashExecutionEntry(key, entry);\n this.emit('sessionUpdated', { key });\n }\n\n /** Delete session data */\n async delete(key: string): Promise<void> {\n await this.store.delete(key);\n }\n\n /** Archive transcript and start a new session id for the same key. */\n async resetSession(\n key: string,\n ): Promise<{ sessionId: string; previousSessionId: string } | null> {\n const result = await this.store.reset(key);\n if (result) {\n this.emit('sessionUpdated', { key });\n }\n return result;\n }\n\n /** Token/window stats for a message list */\n getWindowStats(messages: any[]) {\n return this.store.getWindowStats(messages);\n }\n\n /** Prepare compaction run */\n prepareCompaction(key: string, messages: any[], contextWindow: number) {\n return this.store.prepareCompaction(key, messages, contextWindow);\n }\n\n /** Compact session messages */\n compact(\n key: string,\n messages: any[],\n contextWindow: number,\n instructions?: string,\n force?: boolean,\n ): Promise<CompactionResult> {\n return this.store.compact(key, messages, contextWindow, instructions, force);\n }\n\n /** Compaction stats for a session */\n async getCompactionStats(key: string) {\n return this.store.getCompactionStats(key);\n }\n\n /** List pre-compaction transcript snapshots (newest first). */\n listCompactionCheckpoints(key: string) {\n return this.store.listCompactionCheckpoints(key);\n }\n\n getCompactionCheckpointDetail(key: string, checkpointId: string) {\n return this.store.getCompactionCheckpointDetail(key, checkpointId);\n }\n\n restoreCompactionCheckpoint(key: string, checkpointId: string) {\n return this.store.restoreCompactionCheckpoint(key, checkpointId);\n }\n\n /** Estimate token usage for messages */\n async estimateTokenUsage(key: string, messages: any[]): Promise<number> {\n return this.store.estimateTokens(messages);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import type { Config } from '../config/schema.js';
|
|
2
2
|
import type { SessionResetConfig, SessionResetType } from './reset-policy.js';
|
|
3
|
-
export declare function isThreadSessionKey(sessionKey?: string | null): boolean;
|
|
4
3
|
export declare function resolveSessionResetType(params: {
|
|
5
|
-
sessionKey?: string | null;
|
|
6
4
|
isGroup?: boolean;
|
|
7
5
|
isThread?: boolean;
|
|
8
6
|
}): SessionResetType;
|
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
import { init_string_coerce,
|
|
1
|
+
import { init_string_coerce, normalizeOptionalLowercaseString } from "../utils/string-coerce.js";
|
|
2
2
|
//#region src/session/reset-type.ts
|
|
3
3
|
init_string_coerce();
|
|
4
|
-
const GROUP_SESSION_MARKERS = [":group:", ":channel:"];
|
|
5
|
-
function isThreadSessionKey(sessionKey) {
|
|
6
|
-
return (sessionKey ?? "").trim().includes(":thread:");
|
|
7
|
-
}
|
|
8
4
|
function resolveSessionResetType(params) {
|
|
9
|
-
if (params.isThread
|
|
5
|
+
if (params.isThread) return "thread";
|
|
10
6
|
if (params.isGroup) return "group";
|
|
11
|
-
const normalized = normalizeLowercaseStringOrEmpty(params.sessionKey);
|
|
12
|
-
if (GROUP_SESSION_MARKERS.some((marker) => normalized.includes(marker))) return "group";
|
|
13
7
|
return "direct";
|
|
14
8
|
}
|
|
15
9
|
function resolveChannelResetConfig(params) {
|
|
@@ -20,6 +14,6 @@ function resolveChannelResetConfig(params) {
|
|
|
20
14
|
return resetByChannel[key];
|
|
21
15
|
}
|
|
22
16
|
//#endregion
|
|
23
|
-
export {
|
|
17
|
+
export { resolveChannelResetConfig, resolveSessionResetType };
|
|
24
18
|
|
|
25
19
|
//# sourceMappingURL=reset-type.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reset-type.js","names":[],"sources":["../../../src/session/reset-type.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport {
|
|
1
|
+
{"version":3,"file":"reset-type.js","names":[],"sources":["../../../src/session/reset-type.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { normalizeOptionalLowercaseString } from '../utils/string-coerce.js';\n\nimport type { SessionResetConfig, SessionResetType } from './reset-policy.js';\n\nexport function resolveSessionResetType(params: {\n isGroup?: boolean;\n isThread?: boolean;\n}): SessionResetType {\n if (params.isThread) {\n return 'thread';\n }\n if (params.isGroup) {\n return 'group';\n }\n return 'direct';\n}\n\nexport function resolveChannelResetConfig(params: {\n sessionCfg?: Config['session'];\n channel?: string | null;\n}): SessionResetConfig | undefined {\n const resetByChannel = params.sessionCfg?.resetByChannel;\n if (!resetByChannel) {\n return undefined;\n }\n const key = normalizeOptionalLowercaseString(params.channel);\n if (!key) {\n return undefined;\n }\n return resetByChannel[key];\n}\n"],"mappings":";;oBAC6E;AAI7E,SAAgB,wBAAwB,QAGnB;AACnB,KAAI,OAAO,SACT,QAAO;AAET,KAAI,OAAO,QACT,QAAO;AAET,QAAO;;AAGT,SAAgB,0BAA0B,QAGP;CACjC,MAAM,iBAAiB,OAAO,YAAY;AAC1C,KAAI,CAAC,eACH;CAEF,MAAM,MAAM,iCAAiC,OAAO,QAAQ;AAC5D,KAAI,CAAC,IACH;AAEF,QAAO,eAAe"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SessionConfigSchema, init_schema } from "../config/schema.js";
|
|
2
2
|
import { createLogger } from "../utils/logger/index.js";
|
|
3
3
|
import { init_logger } from "../utils/logger.js";
|
|
4
|
-
import { SessionConfigSchema, init_schema } from "../config/schema.js";
|
|
5
|
-
import { init_agent_session_key, normalizeAgentId, resolveAgentIdFromSessionKey } from "../routing/agent-session-key.js";
|
|
6
|
-
import { init_session_key, parseSessionKey } from "../routing/session-key.js";
|
|
7
4
|
import { requireXopcDatabase } from "../storage/sqlite/connection.js";
|
|
8
|
-
import {
|
|
5
|
+
import { findSessionKeyBySessionId, getSessionMetadata, getSessionPersistedLevels } from "../storage/sqlite/session-repository.js";
|
|
9
6
|
import "../storage/sqlite/index.js";
|
|
10
7
|
import { normalizeThinkLevel, normalizeVerboseLevel } from "../agent/transcript/thinking-types.js";
|
|
11
8
|
import { evaluateSessionFreshness, resolveSessionResetPolicy } from "./reset-policy.js";
|
|
@@ -14,9 +11,6 @@ import { resolveSessionLifecycleTimestamps } from "./lifecycle-timestamps.js";
|
|
|
14
11
|
import { randomUUID } from "node:crypto";
|
|
15
12
|
//#region src/session/resolve-session.ts
|
|
16
13
|
init_schema();
|
|
17
|
-
init_agent_scope();
|
|
18
|
-
init_agent_session_key();
|
|
19
|
-
init_session_key();
|
|
20
14
|
init_logger();
|
|
21
15
|
const log = createLogger("ResolveSession");
|
|
22
16
|
async function resolveSessionKeyForRequest(opts) {
|
|
@@ -24,11 +18,7 @@ async function resolveSessionKeyForRequest(opts) {
|
|
|
24
18
|
const explicitKey = opts.sessionKey?.trim();
|
|
25
19
|
const requestedSessionId = opts.sessionId?.trim();
|
|
26
20
|
let sessionKey = explicitKey;
|
|
27
|
-
if (requestedSessionId && !sessionKey) sessionKey =
|
|
28
|
-
if (requestedSessionId && !sessionKey) {
|
|
29
|
-
const storeAgentId = explicitKey ? resolveAgentIdFromSessionKey(explicitKey) : opts.agentId?.trim() ? normalizeAgentId(opts.agentId) : resolveDefaultAgentId(opts.cfg);
|
|
30
|
-
sessionKey = `agent:${normalizeAgentId(opts.agentId ?? storeAgentId)}:explicit:${requestedSessionId}`;
|
|
31
|
-
}
|
|
21
|
+
if (requestedSessionId && !sessionKey) sessionKey = findSessionKeyBySessionId(requestedSessionId) ?? void 0;
|
|
32
22
|
const sessionMetadata = sessionKey ? getSessionMetadata(sessionKey) : null;
|
|
33
23
|
return {
|
|
34
24
|
sessionKey,
|
|
@@ -39,19 +29,18 @@ async function resolveSession(opts) {
|
|
|
39
29
|
const sessionCfg = opts.cfg.session ?? SessionConfigSchema.parse({});
|
|
40
30
|
const { sessionKey, sessionMetadata } = await resolveSessionKeyForRequest(opts);
|
|
41
31
|
const now = Date.now();
|
|
42
|
-
const
|
|
43
|
-
const peerKind =
|
|
32
|
+
const routing = sessionMetadata?.routing;
|
|
33
|
+
const peerKind = routing?.peerKind;
|
|
44
34
|
const resetType = resolveSessionResetType({
|
|
45
|
-
sessionKey,
|
|
46
35
|
isGroup: peerKind === "group" || peerKind === "channel",
|
|
47
|
-
isThread: Boolean(
|
|
36
|
+
isThread: Boolean(routing?.threadId)
|
|
48
37
|
});
|
|
49
38
|
const resetPolicy = resolveSessionResetPolicy({
|
|
50
39
|
sessionCfg,
|
|
51
40
|
resetType,
|
|
52
41
|
resetOverride: resolveChannelResetConfig({
|
|
53
42
|
sessionCfg,
|
|
54
|
-
channel:
|
|
43
|
+
channel: routing?.source ?? sessionMetadata?.sourceChannel
|
|
55
44
|
})
|
|
56
45
|
});
|
|
57
46
|
const lifecycle = resolveSessionLifecycleTimestamps({ entry: sessionMetadata ? {
|
|
@@ -65,14 +54,14 @@ async function resolveSession(opts) {
|
|
|
65
54
|
now,
|
|
66
55
|
policy: resetPolicy
|
|
67
56
|
}) : { fresh: false }).fresh;
|
|
68
|
-
const sessionId = opts.sessionId?.trim() || (fresh ? sessionMetadata?.
|
|
57
|
+
const sessionId = opts.sessionId?.trim() || (fresh ? sessionMetadata?.sessionId : void 0) || randomUUID();
|
|
69
58
|
const isNewSession = !fresh && !opts.sessionId?.trim();
|
|
70
59
|
if (isNewSession && sessionKey) log.debug({
|
|
71
60
|
sessionKey,
|
|
72
|
-
previousSessionId: sessionMetadata?.
|
|
61
|
+
previousSessionId: sessionMetadata?.sessionId,
|
|
73
62
|
sessionId,
|
|
74
63
|
resetType
|
|
75
|
-
}, "Session reset boundary
|
|
64
|
+
}, "Session reset boundary: new session id for turn");
|
|
76
65
|
return {
|
|
77
66
|
sessionId,
|
|
78
67
|
sessionKey,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-session.js","names":[],"sources":["../../../src/session/resolve-session.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { SessionConfigSchema, type Config } from '../config/schema.js';\nimport {
|
|
1
|
+
{"version":3,"file":"resolve-session.js","names":[],"sources":["../../../src/session/resolve-session.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { SessionConfigSchema, type Config } from '../config/schema.js';\nimport {\n normalizeThinkLevel,\n normalizeVerboseLevel,\n type ThinkLevel,\n type VerboseLevel,\n} from '../agent/transcript/thinking-types.js';\nimport { createLogger } from '../utils/logger.js';\nimport {\n findSessionKeyBySessionId,\n getSessionMetadata,\n getSessionPersistedLevels,\n requireXopcDatabase,\n} from '../storage/sqlite/index.js';\n\nimport { resolveSessionLifecycleTimestamps } from './lifecycle-timestamps.js';\nimport {\n evaluateSessionFreshness,\n resolveSessionResetPolicy,\n} from './reset-policy.js';\nimport { resolveChannelResetConfig, resolveSessionResetType } from './reset-type.js';\nimport type { SessionMetadata } from './types.js';\n\nconst log = createLogger('ResolveSession');\n\nexport type SessionResolution = {\n sessionId: string;\n sessionKey?: string;\n sessionMetadata?: SessionMetadata | null;\n isNewSession: boolean;\n persistedThinking?: ThinkLevel;\n persistedVerbose?: VerboseLevel;\n};\n\nexport type SessionKeyResolution = {\n sessionKey?: string;\n sessionMetadata?: SessionMetadata | null;\n};\n\nexport async function resolveSessionKeyForRequest(opts: {\n cfg: Config;\n sessionKey?: string;\n sessionId?: string;\n agentId?: string;\n}): Promise<SessionKeyResolution> {\n requireXopcDatabase();\n const explicitKey = opts.sessionKey?.trim();\n const requestedSessionId = opts.sessionId?.trim();\n\n let sessionKey = explicitKey;\n if (requestedSessionId && !sessionKey) {\n sessionKey = findSessionKeyBySessionId(requestedSessionId) ?? undefined;\n }\n\n const sessionMetadata = sessionKey ? getSessionMetadata(sessionKey) : null;\n return { sessionKey, sessionMetadata };\n}\n\nexport async function resolveSession(opts: {\n cfg: Config;\n sessionKey?: string;\n sessionId?: string;\n agentId?: string;\n}): Promise<SessionResolution> {\n const sessionCfg = opts.cfg.session ?? SessionConfigSchema.parse({});\n const { sessionKey, sessionMetadata } = await resolveSessionKeyForRequest(opts);\n const now = Date.now();\n\n const routing = sessionMetadata?.routing;\n const peerKind = routing?.peerKind;\n const resetType = resolveSessionResetType({\n isGroup: peerKind === 'group' || peerKind === 'channel',\n isThread: Boolean(routing?.threadId),\n });\n const channelReset = resolveChannelResetConfig({\n sessionCfg,\n channel: routing?.source ?? sessionMetadata?.sourceChannel,\n });\n const resetPolicy = resolveSessionResetPolicy({\n sessionCfg,\n resetType,\n resetOverride: channelReset,\n });\n const lifecycle = resolveSessionLifecycleTimestamps({\n entry: sessionMetadata\n ? {\n updatedAt: Date.parse(sessionMetadata.updatedAt),\n sessionStartedAt: sessionMetadata.sessionStartedAt\n ? Date.parse(sessionMetadata.sessionStartedAt)\n : undefined,\n lastInteractionAt: sessionMetadata.lastInteractionAt\n ? Date.parse(sessionMetadata.lastInteractionAt)\n : undefined,\n }\n : undefined,\n });\n const freshness = sessionMetadata\n ? evaluateSessionFreshness({\n updatedAt: Date.parse(sessionMetadata.updatedAt),\n ...lifecycle,\n now,\n policy: resetPolicy,\n })\n : { fresh: false };\n const fresh = freshness.fresh;\n const sessionId =\n opts.sessionId?.trim() || (fresh ? sessionMetadata?.sessionId : undefined) || randomUUID();\n const isNewSession = !fresh && !opts.sessionId?.trim();\n\n if (isNewSession && sessionKey) {\n log.debug(\n { sessionKey, previousSessionId: sessionMetadata?.sessionId, sessionId, resetType },\n 'Session reset boundary: new session id for turn',\n );\n }\n\n const persistedThinking =\n fresh && sessionKey\n ? normalizeThinkLevel(getSessionPersistedLevels(sessionKey)?.thinkingLevel ?? undefined)\n : undefined;\n const persistedVerbose =\n fresh && sessionKey\n ? normalizeVerboseLevel(getSessionPersistedLevels(sessionKey)?.verboseLevel ?? undefined)\n : undefined;\n\n return {\n sessionId,\n sessionKey,\n sessionMetadata,\n isNewSession,\n persistedThinking,\n persistedVerbose,\n };\n}\n"],"mappings":";;;;;;;;;;;;aAEuE;aAOrB;AAgBlD,MAAM,MAAM,aAAa,iBAAiB;AAgB1C,eAAsB,4BAA4B,MAKhB;AAChC,sBAAqB;CACrB,MAAM,cAAc,KAAK,YAAY,MAAM;CAC3C,MAAM,qBAAqB,KAAK,WAAW,MAAM;CAEjD,IAAI,aAAa;AACjB,KAAI,sBAAsB,CAAC,WACzB,cAAa,0BAA0B,mBAAmB,IAAI,KAAA;CAGhE,MAAM,kBAAkB,aAAa,mBAAmB,WAAW,GAAG;AACtE,QAAO;EAAE;EAAY;EAAiB;;AAGxC,eAAsB,eAAe,MAKN;CAC7B,MAAM,aAAa,KAAK,IAAI,WAAW,oBAAoB,MAAM,EAAE,CAAC;CACpE,MAAM,EAAE,YAAY,oBAAoB,MAAM,4BAA4B,KAAK;CAC/E,MAAM,MAAM,KAAK,KAAK;CAEtB,MAAM,UAAU,iBAAiB;CACjC,MAAM,WAAW,SAAS;CAC1B,MAAM,YAAY,wBAAwB;EACxC,SAAS,aAAa,WAAW,aAAa;EAC9C,UAAU,QAAQ,SAAS,SAAS;EACrC,CAAC;CAKF,MAAM,cAAc,0BAA0B;EAC5C;EACA;EACA,eAPmB,0BAA0B;GAC7C;GACA,SAAS,SAAS,UAAU,iBAAiB;GAC9C,CAI4B;EAC5B,CAAC;CACF,MAAM,YAAY,kCAAkC,EAClD,OAAO,kBACH;EACE,WAAW,KAAK,MAAM,gBAAgB,UAAU;EAChD,kBAAkB,gBAAgB,mBAC9B,KAAK,MAAM,gBAAgB,iBAAiB,GAC5C,KAAA;EACJ,mBAAmB,gBAAgB,oBAC/B,KAAK,MAAM,gBAAgB,kBAAkB,GAC7C,KAAA;EACL,GACD,KAAA,GACL,CAAC;CASF,MAAM,SARY,kBACd,yBAAyB;EACvB,WAAW,KAAK,MAAM,gBAAgB,UAAU;EAChD,GAAG;EACH;EACA,QAAQ;EACT,CAAC,GACF,EAAE,OAAO,OAAO,EACI;CACxB,MAAM,YACJ,KAAK,WAAW,MAAM,KAAK,QAAQ,iBAAiB,YAAY,KAAA,MAAc,YAAY;CAC5F,MAAM,eAAe,CAAC,SAAS,CAAC,KAAK,WAAW,MAAM;AAEtD,KAAI,gBAAgB,WAClB,KAAI,MACF;EAAE;EAAY,mBAAmB,iBAAiB;EAAW;EAAW;EAAW,EACnF,kDACD;AAYH,QAAO;EACL;EACA;EACA;EACA;EACA,mBAbA,SAAS,aACL,oBAAoB,0BAA0B,WAAW,EAAE,iBAAiB,KAAA,EAAU,GACtF,KAAA;EAYJ,kBAVA,SAAS,aACL,sBAAsB,0BAA0B,WAAW,EAAE,gBAAgB,KAAA,EAAU,GACvF,KAAA;EASL"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { createLogger } from "../utils/logger/index.js";
|
|
2
|
-
import { init_logger } from "../utils/logger.js";
|
|
3
1
|
import { isCronSessionKey } from "../routing/session-key-utils.js";
|
|
4
2
|
import { init_session_key, parseSessionKey } from "../routing/session-key.js";
|
|
3
|
+
import { createLogger } from "../utils/logger/index.js";
|
|
4
|
+
import { init_logger } from "../utils/logger.js";
|
|
5
5
|
import { init_providers, resolveModel } from "../providers/index.js";
|
|
6
6
|
import { readAgentMessageContent } from "../agent/memory/agent-message-access.js";
|
|
7
7
|
import { stripSessionStartupContextFromUserText } from "../agent/reply/startup-context.js";
|
|
@@ -2,6 +2,7 @@ import type { AgentMessage } from '@earendil-works/pi-agent-core';
|
|
|
2
2
|
import type { Config } from '../config/schema.js';
|
|
3
3
|
import { type CompactionConfig, type CompactionResult } from '../agent/memory/compaction.js';
|
|
4
4
|
import { type WindowConfig } from '../agent/memory/window.js';
|
|
5
|
+
import { type SessionMetadataSeed } from '../storage/sqlite/index.js';
|
|
5
6
|
import type { XopcSessionTranscriptV1 } from './transcript-format.js';
|
|
6
7
|
import { type TranscriptStoredRow, type XopcTranscriptContextEntry } from './session-context-for-llm.js';
|
|
7
8
|
import type { SessionMetadata, SessionDetail, SessionListQuery, PaginatedResult, GlobalSessionStats, ExportFormat, CompactionCheckpointSummary, CompactionCheckpointDetail } from './types.js';
|
|
@@ -20,11 +21,15 @@ export declare class SessionStore {
|
|
|
20
21
|
private runStoreMutation;
|
|
21
22
|
initialize(): Promise<void>;
|
|
22
23
|
getSessionsRoot(): string;
|
|
23
|
-
resolveTranscriptPath(sessionKey: string
|
|
24
|
+
resolveTranscriptPath(sessionKey: string, options?: {
|
|
25
|
+
metadata?: SessionMetadataSeed;
|
|
26
|
+
}): Promise<{
|
|
24
27
|
sessionId: string;
|
|
25
28
|
sessionKey: string;
|
|
26
29
|
}>;
|
|
27
|
-
appendTranscriptMessage(sessionKey: string, message: AgentMessage
|
|
30
|
+
appendTranscriptMessage(sessionKey: string, message: AgentMessage, options?: {
|
|
31
|
+
metadata?: SessionMetadataSeed;
|
|
32
|
+
}): Promise<void>;
|
|
28
33
|
getByAgent(agentId: string): Promise<SessionMetadata[]>;
|
|
29
34
|
getByAccount(accountId: string): Promise<SessionMetadata[]>;
|
|
30
35
|
getByPeer(peerKind: string, peerId: string): Promise<SessionMetadata[]>;
|
|
@@ -55,6 +60,7 @@ export declare class SessionStore {
|
|
|
55
60
|
private buildSessionDetail;
|
|
56
61
|
loadTranscriptRows(key: string): Promise<TranscriptStoredRow[]>;
|
|
57
62
|
getMetadata(key: string): Promise<SessionMetadata | null>;
|
|
63
|
+
resolveKeyBySessionId(sessionId: string): Promise<string | null>;
|
|
58
64
|
updateMetadata(key: string, updates: Partial<SessionMetadata>): Promise<void>;
|
|
59
65
|
reset(key: string): Promise<{
|
|
60
66
|
sessionId: string;
|
|
@@ -99,7 +105,9 @@ export declare class SessionStore {
|
|
|
99
105
|
truncated?: boolean;
|
|
100
106
|
fullOutputPath?: string;
|
|
101
107
|
}): Promise<void>;
|
|
102
|
-
saveMessages(key: string, messages: AgentMessage[]
|
|
108
|
+
saveMessages(key: string, messages: AgentMessage[], options?: {
|
|
109
|
+
metadata?: SessionMetadataSeed;
|
|
110
|
+
}): Promise<void>;
|
|
103
111
|
getWindowStats(messages: AgentMessage[]): {
|
|
104
112
|
total: number;
|
|
105
113
|
system: number;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { init_paths_state, resolveStateDir } from "../config/paths-state.js";
|
|
2
|
+
import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
|
|
2
3
|
import { createLogger } from "../utils/logger/index.js";
|
|
3
4
|
import { init_logger } from "../utils/logger.js";
|
|
4
|
-
import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
|
|
5
5
|
import { requireXopcDatabase } from "../storage/sqlite/connection.js";
|
|
6
6
|
import "./types.js";
|
|
7
7
|
import { buildSessionContextForLlm, mergeLlmMessagesPreservingContextRows, transcriptRowsFromJsonArray } from "./session-context-for-llm.js";
|
|
8
8
|
import { estimateTokensFromMessages } from "../storage/sqlite/row-mappers.js";
|
|
9
|
-
import { deleteSessionRecord, ensureSessionRecord, getGlobalSessionStats, getSessionMetadata, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord } from "../storage/sqlite/session-repository.js";
|
|
9
|
+
import { deleteSessionRecord, ensureSessionRecord, findSessionKeyBySessionId, getGlobalSessionStats, getSessionMetadata, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord } from "../storage/sqlite/session-repository.js";
|
|
10
10
|
import { appendTranscriptEntry, captureCompactionCheckpoint, getCompactionCheckpointDetail, listCompactionCheckpoints, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRowsForSession, replaceTranscriptRows, restoreCompactionCheckpoint } from "../storage/sqlite/transcript-repository.js";
|
|
11
11
|
import "../storage/sqlite/index.js";
|
|
12
12
|
import { readPostCompactionContext } from "../agent/reply/post-compaction-context.js";
|
|
@@ -40,17 +40,17 @@ var SessionStore = class {
|
|
|
40
40
|
getSessionsRoot() {
|
|
41
41
|
return resolveStateDir();
|
|
42
42
|
}
|
|
43
|
-
async resolveTranscriptPath(sessionKey) {
|
|
43
|
+
async resolveTranscriptPath(sessionKey, options) {
|
|
44
44
|
requireXopcDatabase();
|
|
45
45
|
return {
|
|
46
|
-
sessionId: ensureSessionRecord(sessionKey, this.resolveWorkspaceCwd(sessionKey)).
|
|
46
|
+
sessionId: ensureSessionRecord(sessionKey, this.resolveWorkspaceCwd(sessionKey), options?.metadata).sessionId,
|
|
47
47
|
sessionKey
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
|
-
async appendTranscriptMessage(sessionKey, message) {
|
|
50
|
+
async appendTranscriptMessage(sessionKey, message, options) {
|
|
51
51
|
return this.runStoreMutation(async () => {
|
|
52
52
|
requireXopcDatabase();
|
|
53
|
-
ensureSessionRecord(sessionKey, this.resolveWorkspaceCwd(sessionKey));
|
|
53
|
+
ensureSessionRecord(sessionKey, this.resolveWorkspaceCwd(sessionKey), options?.metadata);
|
|
54
54
|
appendTranscriptEntry(sessionKey, message);
|
|
55
55
|
});
|
|
56
56
|
}
|
|
@@ -137,6 +137,10 @@ var SessionStore = class {
|
|
|
137
137
|
requireXopcDatabase();
|
|
138
138
|
return getSessionMetadata(key);
|
|
139
139
|
}
|
|
140
|
+
async resolveKeyBySessionId(sessionId) {
|
|
141
|
+
requireXopcDatabase();
|
|
142
|
+
return findSessionKeyBySessionId(sessionId);
|
|
143
|
+
}
|
|
140
144
|
async updateMetadata(key, updates) {
|
|
141
145
|
return this.runStoreMutation(async () => {
|
|
142
146
|
requireXopcDatabase();
|
|
@@ -201,7 +205,7 @@ var SessionStore = class {
|
|
|
201
205
|
}
|
|
202
206
|
async loadTranscriptDocument(key) {
|
|
203
207
|
const metadata = await this.getMetadata(key);
|
|
204
|
-
if (!metadata?.
|
|
208
|
+
if (!metadata?.sessionId) return null;
|
|
205
209
|
const rows = await this.loadTranscriptRows(key);
|
|
206
210
|
const compactions = [];
|
|
207
211
|
for (const row of rows) if (row.type === "compaction") {
|
|
@@ -217,7 +221,7 @@ var SessionStore = class {
|
|
|
217
221
|
return {
|
|
218
222
|
type: "xopc_session_transcript",
|
|
219
223
|
version: 1,
|
|
220
|
-
id: metadata.
|
|
224
|
+
id: metadata.sessionId,
|
|
221
225
|
createdAt: metadata.createdAt,
|
|
222
226
|
updatedAt: metadata.updatedAt,
|
|
223
227
|
messages: rows,
|
|
@@ -301,10 +305,10 @@ var SessionStore = class {
|
|
|
301
305
|
});
|
|
302
306
|
});
|
|
303
307
|
}
|
|
304
|
-
async saveMessages(key, messages) {
|
|
308
|
+
async saveMessages(key, messages, options) {
|
|
305
309
|
return this.runStoreMutation(async () => {
|
|
306
310
|
requireXopcDatabase();
|
|
307
|
-
ensureSessionRecord(key, this.resolveWorkspaceCwd(key));
|
|
311
|
+
ensureSessionRecord(key, this.resolveWorkspaceCwd(key), options?.metadata);
|
|
308
312
|
replaceTranscriptRows(key, mergeLlmMessagesPreservingContextRows(await this.loadTranscriptRows(key), messages));
|
|
309
313
|
});
|
|
310
314
|
}
|
|
@@ -430,9 +434,15 @@ var SessionStore = class {
|
|
|
430
434
|
const rowsSource = Array.isArray(record.transcriptRows) ? record.transcriptRows : void 0;
|
|
431
435
|
const rows = rowsSource ? transcriptRowsFromJsonArray(rowsSource) : [];
|
|
432
436
|
if (rows.length === 0) throw new Error("Session export contains no importable transcript rows");
|
|
433
|
-
ensureSessionRecord(targetKey, this.resolveWorkspaceCwd(targetKey));
|
|
434
|
-
replaceTranscriptRows(targetKey, rows);
|
|
435
437
|
const metadata = record.metadata && typeof record.metadata === "object" ? record.metadata : {};
|
|
438
|
+
ensureSessionRecord(targetKey, this.resolveWorkspaceCwd(targetKey), {
|
|
439
|
+
sourceChannel: metadata.sourceChannel,
|
|
440
|
+
sourceChatId: metadata.sourceChatId,
|
|
441
|
+
sessionType: metadata.sessionType,
|
|
442
|
+
routing: metadata.routing,
|
|
443
|
+
customData: metadata.customData
|
|
444
|
+
});
|
|
445
|
+
replaceTranscriptRows(targetKey, rows);
|
|
436
446
|
const sourceKey = typeof metadata.key === "string" ? metadata.key : void 0;
|
|
437
447
|
const sourceName = typeof metadata.name === "string" ? metadata.name.trim() : "";
|
|
438
448
|
patchSessionMetadata(targetKey, {
|
|
@@ -462,7 +472,13 @@ var SessionStore = class {
|
|
|
462
472
|
const rows = await this.loadTranscriptRows(sourceKey);
|
|
463
473
|
if (options.throughRow !== void 0 && (options.throughRow < 1 || options.throughRow > rows.length)) throw new Error(`Invalid fork row: ${options.throughRow}`);
|
|
464
474
|
const selectedRows = options.throughRow === void 0 ? rows : rows.slice(0, Math.max(0, Math.trunc(options.throughRow)));
|
|
465
|
-
ensureSessionRecord(targetKey, this.resolveWorkspaceCwd(targetKey)
|
|
475
|
+
ensureSessionRecord(targetKey, this.resolveWorkspaceCwd(targetKey), {
|
|
476
|
+
sourceChannel: sourceMetadata.sourceChannel,
|
|
477
|
+
sourceChatId: sourceMetadata.sourceChatId,
|
|
478
|
+
sessionType: sourceMetadata.sessionType,
|
|
479
|
+
routing: sourceMetadata.routing,
|
|
480
|
+
customData: sourceMetadata.customData
|
|
481
|
+
});
|
|
466
482
|
replaceTranscriptRows(targetKey, selectedRows);
|
|
467
483
|
patchSessionMetadata(targetKey, {
|
|
468
484
|
name: `Fork of ${sourceMetadata.name?.trim() || sourceKey}`,
|
|
@@ -470,7 +486,7 @@ var SessionStore = class {
|
|
|
470
486
|
customData: {
|
|
471
487
|
...sourceMetadata.customData ?? {},
|
|
472
488
|
forkedFromSessionKey: sourceKey,
|
|
473
|
-
|
|
489
|
+
forkedFromSessionId: sourceMetadata.sessionId,
|
|
474
490
|
...options.throughRow !== void 0 ? { forkedFromRow: selectedRows.length } : {},
|
|
475
491
|
forkedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
476
492
|
}
|