@xopcai/xopc 0.0.85 → 0.0.87
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/adapters/cli-login.js +3 -3
- package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
- package/dist/extensions/telegram/src/delivery-chat-id.d.ts +1 -1
- package/dist/extensions/telegram/src/delivery-chat-id.js +1 -1
- package/dist/extensions/telegram/src/delivery-chat-id.js.map +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +1 -0
- package/dist/extensions/telegram/src/routing-integration.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +2 -2
- package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +1 -1
- package/dist/extensions/weixin/src/api/api.js +2 -2
- package/dist/extensions/weixin/src/api/api.js.map +1 -1
- package/dist/extensions/weixin/src/auth/accounts.js +12 -12
- package/dist/extensions/weixin/src/auth/accounts.js.map +1 -1
- package/dist/extensions/weixin/src/delivery-to.js +2 -2
- package/dist/extensions/weixin/src/delivery-to.js.map +1 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js +5 -5
- package/dist/extensions/weixin/src/messaging/debug-mode.js.map +1 -1
- package/dist/extensions/weixin/src/messaging/inbound.js +11 -11
- package/dist/extensions/weixin/src/messaging/inbound.js.map +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +4 -4
- package/dist/extensions/weixin/src/storage/sync-buf.js.map +1 -1
- package/dist/extensions/weixin/src/workflow-progress.d.ts +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js.map +1 -1
- package/dist/gateway/static/root/assets/agents-BEAbXpuP.js +222 -0
- package/dist/gateway/static/root/assets/{apps-page-D7v7649T.js → apps-page-Dg8R-Szf.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-nCaMb0a7.js → channels-settings-yohw9YSu.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-status-swr-C1gZBcJV.js → channels-status-swr-BSHqqCF1.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-api-CoYK0hlm.js → cron-api-0h_QT8U3.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-DeGo-Vjc.js → cron-page-BkfKFfFk.js} +1 -1
- package/dist/gateway/static/root/assets/{dist-DaK4dsss.js → dist-Cmjp2APP.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-BZngZWbO.js → extension-debug-page-CFa9z_1N.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-D6JSyV27.js → extension-page-BI8eaTPq.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-x4BB7q1X.js +1 -0
- package/dist/gateway/static/root/assets/{fetch-B2MYHbWg.js → fetch-DRqwef_Q.js} +1 -1
- package/dist/gateway/static/root/assets/{field-primitives-Zzl22MvN.js → field-primitives-BiNHBo2Y.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-BtIcpG0O.js → heartbeat-config-api-ZRb8qhuz.js} +1 -1
- package/dist/gateway/static/root/assets/{index-D4vM3-P7.js → index-Cu7bKuUi.js} +96 -94
- package/dist/gateway/static/root/assets/index-a5gWIdZQ.css +1 -0
- package/dist/gateway/static/root/assets/{logs-page-_d4UJ-qQ.js → logs-page-BFZ8GgCv.js} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-5N4aF2Wk.js → sessions-page-CD7AfB-2.js} +1 -1
- package/dist/gateway/static/root/assets/settings-form-section-DiqqVs6m.js +1 -0
- package/dist/gateway/static/root/assets/settings-page-BBOjEQW3.js +3 -0
- package/dist/gateway/static/root/assets/{share-preview-page-D4EG_vM1.js → share-preview-page-n1Gprylk.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-sPAXhh8w.js → skills-page-CcN_gj--.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-DryYl3qD.js → theme-store-CZOh1nT3.js} +1 -1
- package/dist/gateway/static/root/assets/url-Dd8Q7kZZ.js +3 -0
- package/dist/gateway/static/root/assets/{utils-CYO9eTCM.js → utils-CkWBfxs4.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-Ds51havm.js → voice-api-key-field-O6awz9hi.js} +1 -1
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-scope.d.ts +4 -0
- package/dist/src/agent/agent-scope.js +53 -10
- package/dist/src/agent/agent-scope.js.map +1 -1
- package/dist/src/agent/bootstrap/filter-bootstrap-files.js +2 -1
- package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js +2 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
- package/dist/src/agent/embedded/tool-result-truncation.js +2 -1
- package/dist/src/agent/embedded/tool-result-truncation.js.map +1 -1
- package/dist/src/agent/fallback/candidates.js +2 -2
- package/dist/src/agent/fallback/candidates.js.map +1 -1
- package/dist/src/agent/goals/persistent-goal-apis.d.ts +0 -2
- package/dist/src/agent/goals/persistent-goal-service.js +0 -1
- package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
- package/dist/src/agent/image/generation/normalization.js +2 -12
- package/dist/src/agent/image/generation/normalization.js.map +1 -1
- package/dist/src/agent/image/generation/provider-registry.d.ts +4 -8
- package/dist/src/agent/image/generation/provider-registry.js.map +1 -1
- package/dist/src/agent/image/generation/runtime.d.ts +2 -2
- package/dist/src/agent/image/generation/runtime.js.map +1 -1
- package/dist/src/agent/image/generation/types.d.ts +0 -18
- package/dist/src/agent/image/image-helpers.js +6 -1
- package/dist/src/agent/image/image-helpers.js.map +1 -1
- package/dist/src/agent/image/index.d.ts +1 -1
- package/dist/src/agent/inbound/inbound-loop.d.ts +5 -0
- package/dist/src/agent/inbound/inbound-loop.js +41 -10
- package/dist/src/agent/inbound/inbound-loop.js.map +1 -1
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +4 -0
- package/dist/src/agent/inbound/turn-dispatcher.js +6 -4
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +2 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-names.js +2 -1
- package/dist/src/agent/mcp/bundle-mcp-names.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +2 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +1 -1
- package/dist/src/agent/mcp/mcp-transport-config.js +2 -1
- package/dist/src/agent/mcp/mcp-transport-config.js.map +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +2 -1
- package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
- package/dist/src/agent/media-generation/runtime-shared.js +2 -9
- package/dist/src/agent/media-generation/runtime-shared.js.map +1 -1
- package/dist/src/agent/messaging/command-handler.d.ts +6 -0
- package/dist/src/agent/messaging/command-handler.js +5 -0
- package/dist/src/agent/messaging/command-handler.js.map +1 -1
- package/dist/src/agent/prompt/safety.d.ts +0 -7
- package/dist/src/agent/prompt/safety.js +1 -20
- package/dist/src/agent/prompt/safety.js.map +1 -1
- package/dist/src/agent/service/build-direct-message-content.js +1 -1
- package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
- package/dist/src/agent/service/direct-turn-helpers.d.ts +3 -1
- package/dist/src/agent/service/direct-turn-helpers.js +6 -1
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
- package/dist/src/agent/service/process-direct-one-shot.d.ts +4 -0
- package/dist/src/agent/service/process-direct-one-shot.js +15 -2
- package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.d.ts +4 -0
- package/dist/src/agent/service/process-direct-streaming.js +34 -4
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/webchat-tts.js +1 -1
- package/dist/src/agent/service/webchat-tts.js.map +1 -1
- package/dist/src/agent/service.d.ts +8 -0
- package/dist/src/agent/service.js +21 -1
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/tools/create-share-tool.js +27 -20
- package/dist/src/agent/tools/create-share-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.js +1 -1
- package/dist/src/agent/tools/index.d.ts +0 -1
- package/dist/src/agent/tools/index.js +4 -5
- package/dist/src/agent/tools/shell.js +0 -13
- package/dist/src/agent/tools/shell.js.map +1 -1
- package/dist/src/agent/tools/workflow-tool.js +10 -4
- package/dist/src/agent/tools/workflow-tool.js.map +1 -1
- package/dist/src/agent/workflow/builtins/audit-repo.d.ts +5 -1
- package/dist/src/agent/workflow/builtins/audit-repo.js +52 -11
- package/dist/src/agent/workflow/builtins/audit-repo.js.map +1 -1
- package/dist/src/agent/workflow/builtins/debug-incident.d.ts +13 -0
- package/dist/src/agent/workflow/builtins/debug-incident.js +155 -0
- package/dist/src/agent/workflow/builtins/debug-incident.js.map +1 -0
- package/dist/src/agent/workflow/builtins/index.d.ts +3 -1
- package/dist/src/agent/workflow/builtins/index.js +11 -1
- package/dist/src/agent/workflow/builtins/index.js.map +1 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +6 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js +66 -30
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +1 -1
- package/dist/src/agent/workflow/builtins/pr-review.d.ts +12 -0
- package/dist/src/agent/workflow/builtins/pr-review.js +156 -0
- package/dist/src/agent/workflow/builtins/pr-review.js.map +1 -0
- package/dist/src/agent/workflow/builtins/research.d.ts +5 -1
- package/dist/src/agent/workflow/builtins/research.js +37 -6
- package/dist/src/agent/workflow/builtins/research.js.map +1 -1
- package/dist/src/agent/workflow/catalog.d.ts +5 -0
- package/dist/src/agent/workflow/catalog.js +6 -2
- package/dist/src/agent/workflow/catalog.js.map +1 -1
- package/dist/src/agent/workflow/channel-capability.d.ts +3 -3
- package/dist/src/agent/workflow/index.d.ts +1 -1
- package/dist/src/agent/workflow/lint.d.ts +38 -0
- package/dist/src/agent/workflow/lint.js +74 -0
- package/dist/src/agent/workflow/lint.js.map +1 -0
- package/dist/src/agent/workflow/parser.js +13 -1
- package/dist/src/agent/workflow/parser.js.map +1 -1
- package/dist/src/agent/workflow/runtime.d.ts +3 -0
- package/dist/src/agent/workflow/runtime.js +76 -3
- package/dist/src/agent/workflow/runtime.js.map +1 -1
- package/dist/src/agent/workflow/types.d.ts +11 -1
- package/dist/src/browser/index.js +4 -4
- package/dist/src/browser/manager.d.ts +1 -3
- package/dist/src/browser/manager.js +0 -6
- package/dist/src/browser/manager.js.map +1 -1
- package/dist/src/browser/providers/browser-ext-install.d.ts +4 -4
- package/dist/src/browser/providers/browser-ext-install.js +38 -85
- package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
- package/dist/src/browser/providers/cloakbrowser.d.ts +0 -5
- package/dist/src/browser/providers/cloakbrowser.js +2 -55
- package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
- package/dist/src/channels/attachments/voice-stt-webchat.js +10 -8
- package/dist/src/channels/attachments/voice-stt-webchat.js.map +1 -1
- package/dist/src/channels/pairing/allow-from-file.js +9 -9
- package/dist/src/channels/pairing/allow-from-file.js.map +1 -1
- package/dist/src/channels/pairing/pairing-store.js +6 -6
- package/dist/src/channels/pairing/pairing-store.js.map +1 -1
- package/dist/src/chat-commands/builtins/session.js +1 -1
- package/dist/src/chat-commands/builtins/session.js.map +1 -1
- package/dist/src/chat-commands/builtins/tts.js +2 -2
- package/dist/src/chat-commands/builtins/tts.js.map +1 -1
- package/dist/src/chat-commands/builtins/workflow.js +7 -2
- package/dist/src/chat-commands/builtins/workflow.js.map +1 -1
- package/dist/src/chat-commands/context.d.ts +3 -0
- package/dist/src/chat-commands/context.js +21 -3
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/chat-commands/session-key.d.ts +4 -37
- package/dist/src/chat-commands/session-key.js +49 -85
- package/dist/src/chat-commands/session-key.js.map +1 -1
- package/dist/src/chat-commands/types.d.ts +2 -0
- package/dist/src/cli/commands/agent/interactive.js +2 -2
- package/dist/src/cli/commands/agent/interactive.js.map +1 -1
- package/dist/src/cli/commands/agent/sessions.js +2 -2
- package/dist/src/cli/commands/agent/sessions.js.map +1 -1
- package/dist/src/cli/commands/agent.js +4 -5
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/channels.js +1 -5
- package/dist/src/cli/commands/channels.js.map +1 -1
- package/dist/src/cli/commands/gateway/lifecycle-core.js +1 -1
- package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
- package/dist/src/cli/commands/gateway/logs.d.ts +9 -0
- package/dist/src/cli/commands/gateway/logs.js +50 -17
- package/dist/src/cli/commands/gateway/logs.js.map +1 -1
- package/dist/src/cli/commands/image.js +22 -21
- package/dist/src/cli/commands/image.js.map +1 -1
- package/dist/src/cli/commands/session/utils.js +2 -2
- package/dist/src/cli/commands/session/utils.js.map +1 -1
- package/dist/src/cli/commands/update.js +26 -46
- package/dist/src/cli/commands/update.js.map +1 -1
- package/dist/src/cli/utils/session.d.ts +0 -5
- package/dist/src/cli/utils/session.js +1 -6
- package/dist/src/cli/utils/session.js.map +1 -1
- package/dist/src/commands/agents.config.js +1 -1
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.js +5 -27
- package/dist/src/config/agent-profile.js.map +1 -1
- package/dist/src/config/index.js +2 -2
- package/dist/src/config/model-input.js +2 -5
- package/dist/src/config/model-input.js.map +1 -1
- package/dist/src/config/schema.d.ts +201 -217
- package/dist/src/config/schema.js +54 -39
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/workspace-path-helpers.d.ts +1 -2
- package/dist/src/config/workspace-path-helpers.js.map +1 -1
- package/dist/src/daemon/install-plan.js +25 -1
- package/dist/src/daemon/install-plan.js.map +1 -1
- package/dist/src/daemon/launchd.d.ts +8 -0
- package/dist/src/daemon/launchd.js +5 -12
- package/dist/src/daemon/launchd.js.map +1 -1
- package/dist/src/daemon/schtasks.d.ts +25 -0
- package/dist/src/daemon/schtasks.js +166 -46
- package/dist/src/daemon/schtasks.js.map +1 -1
- package/dist/src/daemon/service.js +5 -4
- package/dist/src/daemon/service.js.map +1 -1
- package/dist/src/daemon/systemd.d.ts +6 -0
- package/dist/src/daemon/systemd.js +18 -3
- package/dist/src/daemon/systemd.js.map +1 -1
- package/dist/src/extensions/activation-context.js +0 -1
- package/dist/src/extensions/activation-context.js.map +1 -1
- package/dist/src/extensions/normalize-manifest.js +0 -1
- package/dist/src/extensions/normalize-manifest.js.map +1 -1
- package/dist/src/extensions/types/manifest.d.ts +0 -2
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/agent-builtin-tools.js +1 -0
- package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
- package/dist/src/gateway/agents-admin.js +10 -2
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/heartbeat/service.js.map +1 -1
- package/dist/src/gateway/hono/app.js +1 -1
- package/dist/src/gateway/hono/lib/agent-model.d.ts +18 -10
- package/dist/src/gateway/hono/lib/agent-model.js +24 -35
- package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.js +1 -1
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/lib/safe-voice-config.js +14 -53
- package/dist/src/gateway/hono/lib/safe-voice-config.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/agents.js +17 -5
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/channels.js +0 -11
- package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/goals.js +1 -1
- package/dist/src/gateway/hono/routes/goals.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +28 -7
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/shares.js +14 -12
- package/dist/src/gateway/hono/routes/shares.js.map +1 -1
- package/dist/src/gateway/hono/routes/tunnel.js +1 -1
- package/dist/src/gateway/hono/routes/update.js +4 -2
- package/dist/src/gateway/hono/routes/update.js.map +1 -1
- package/dist/src/gateway/hono/sse.js +16 -33
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/lock.js +10 -10
- package/dist/src/gateway/lock.js.map +1 -1
- package/dist/src/gateway/ports.js +6 -6
- package/dist/src/gateway/ports.js.map +1 -1
- package/dist/src/gateway/resolve-webchat-session-key.d.ts +19 -0
- package/dist/src/gateway/resolve-webchat-session-key.js +46 -0
- package/dist/src/gateway/resolve-webchat-session-key.js.map +1 -0
- package/dist/src/gateway/service/run-gateway-agent.js +27 -11
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +3 -0
- package/dist/src/gateway/service/sessions-api.js +8 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.d.ts +0 -2
- package/dist/src/gateway/service.js +2 -7
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/session-reset-service.d.ts +20 -0
- package/dist/src/gateway/session-reset-service.js +54 -0
- package/dist/src/gateway/session-reset-service.js.map +1 -0
- package/dist/src/gateway/startup-readiness.d.ts +1 -1
- package/dist/src/gateway/startup-readiness.js +1 -0
- package/dist/src/gateway/startup-readiness.js.map +1 -1
- package/dist/src/infra/gateway-processes.js +2 -2
- package/dist/src/infra/gateway-processes.js.map +1 -1
- package/dist/src/infra/run-command.d.ts +16 -0
- package/dist/src/infra/run-command.js +67 -0
- package/dist/src/infra/run-command.js.map +1 -0
- package/dist/src/infra/update-global.d.ts +45 -0
- package/dist/src/infra/update-global.js +224 -0
- package/dist/src/infra/update-global.js.map +1 -0
- package/dist/src/mcp/channel-bridge.js +1 -1
- package/dist/src/mcp/channel-shared.js +2 -1
- package/dist/src/mcp/channel-shared.js.map +1 -1
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/auth-runtime/auth-profile-store.js.map +1 -1
- package/dist/src/providers/auth-runtime/resolve-auth.js +1 -12
- package/dist/src/providers/auth-runtime/resolve-auth.js.map +1 -1
- package/dist/src/providers/auth-runtime/types.d.ts +6 -12
- package/dist/src/routing/agent-session-key.d.ts +58 -0
- package/dist/src/routing/agent-session-key.js +164 -0
- package/dist/src/routing/agent-session-key.js.map +1 -0
- package/dist/src/routing/index.d.ts +1 -1
- package/dist/src/routing/index.js +4 -2
- package/dist/src/routing/index.js.map +1 -1
- package/dist/src/routing/resolve-route.d.ts +15 -0
- package/dist/src/routing/resolve-route.js +41 -20
- package/dist/src/routing/resolve-route.js.map +1 -1
- package/dist/src/routing/resolve-tui-session-key.d.ts +25 -0
- package/dist/src/routing/resolve-tui-session-key.js +54 -0
- package/dist/src/routing/resolve-tui-session-key.js.map +1 -0
- package/dist/src/routing/session-key-utils.d.ts +24 -0
- package/dist/src/routing/session-key-utils.js +92 -0
- package/dist/src/routing/session-key-utils.js.map +1 -0
- package/dist/src/routing/session-key.d.ts +19 -49
- package/dist/src/routing/session-key.js +143 -116
- package/dist/src/routing/session-key.js.map +1 -1
- package/dist/src/session/index.d.ts +6 -0
- package/dist/src/session/index.js +7 -1
- package/dist/src/session/init-session-turn.d.ts +30 -0
- package/dist/src/session/init-session-turn.js +102 -0
- package/dist/src/session/init-session-turn.js.map +1 -0
- package/dist/src/session/lifecycle-timestamps.d.ts +8 -0
- package/dist/src/session/lifecycle-timestamps.js +16 -0
- package/dist/src/session/lifecycle-timestamps.js.map +1 -0
- package/dist/src/session/manager.d.ts +7 -1
- package/dist/src/session/manager.js +8 -1
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/parity/transcript-paths.js +2 -2
- package/dist/src/session/parity/transcript-paths.js.map +1 -1
- package/dist/src/session/parity/xopc-session-disk-entry.d.ts +6 -0
- package/dist/src/session/reset-policy.d.ts +32 -0
- package/dist/src/session/reset-policy.js +65 -0
- package/dist/src/session/reset-policy.js.map +1 -0
- package/dist/src/session/reset-triggers.d.ts +20 -0
- package/dist/src/session/reset-triggers.js +63 -0
- package/dist/src/session/reset-triggers.js.map +1 -0
- package/dist/src/session/reset-type.d.ts +12 -0
- package/dist/src/session/reset-type.js +25 -0
- package/dist/src/session/reset-type.js.map +1 -0
- package/dist/src/session/resolve-session.d.ts +30 -0
- package/dist/src/session/resolve-session.js +93 -0
- package/dist/src/session/resolve-session.js.map +1 -0
- package/dist/src/session/session-title.js +3 -2
- package/dist/src/session/session-title.js.map +1 -1
- package/dist/src/session/store.d.ts +11 -4
- package/dist/src/session/store.js +57 -6
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/transcript-events.js +2 -1
- package/dist/src/session/transcript-events.js.map +1 -1
- package/dist/src/share/share-url.d.ts +33 -0
- package/dist/src/share/share-url.js +56 -14
- package/dist/src/share/share-url.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.js +4 -9
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.js +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/components/chat-log.js +3 -3
- package/dist/src/tui/components/chat-log.js.map +1 -1
- package/dist/src/tui/theme.d.ts +0 -2
- package/dist/src/tui/theme.js +1 -3
- package/dist/src/tui/theme.js.map +1 -1
- package/dist/src/tui/tui-commands.d.ts +3 -0
- package/dist/src/tui/tui-commands.js +45 -10
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-keybindings-file.js +1 -21
- package/dist/src/tui/tui-keybindings-file.js.map +1 -1
- package/dist/src/tui/tui-session-actions.d.ts +28 -0
- package/dist/src/tui/tui-session-actions.js +88 -0
- package/dist/src/tui/tui-session-actions.js.map +1 -0
- package/dist/src/tui/tui.js +52 -47
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/utils/string-coerce.d.ts +2 -0
- package/dist/src/utils/string-coerce.js +10 -1
- package/dist/src/utils/string-coerce.js.map +1 -1
- package/dist/src/voice/stt/config-slice.d.ts +2 -5
- package/dist/src/voice/stt/config-slice.js +5 -26
- package/dist/src/voice/stt/config-slice.js.map +1 -1
- package/dist/src/voice/stt/types.d.ts +1 -18
- package/dist/src/voice/stt/types.js +4 -2
- package/dist/src/voice/stt/types.js.map +1 -1
- package/dist/src/voice/tts/config-slice.d.ts +3 -7
- package/dist/src/voice/tts/config-slice.js +7 -38
- package/dist/src/voice/tts/config-slice.js.map +1 -1
- package/dist/src/voice/tts/merge-config.js +2 -48
- package/dist/src/voice/tts/merge-config.js.map +1 -1
- package/dist/src/voice/tts/providers/alibaba-speech.js +1 -1
- package/dist/src/voice/tts/providers/alibaba-speech.js.map +1 -1
- package/dist/src/voice/tts/types.d.ts +1 -29
- package/dist/src/voice/tts/types.js +19 -17
- package/dist/src/voice/tts/types.js.map +1 -1
- package/package.json +1 -4
- package/dist/gateway/static/root/assets/agents-D3_-kNlZ.js +0 -222
- package/dist/gateway/static/root/assets/extension-settings-page-8PZcmWI7.js +0 -1
- package/dist/gateway/static/root/assets/index-ew_2L2We.css +0 -1
- package/dist/gateway/static/root/assets/settings-form-section-D_tgb8r2.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-C18xBt4X.js +0 -3
- package/dist/gateway/static/root/assets/url-BwNL6Rgk.js +0 -3
- package/dist/src/agent/tools/browser-legacy-tools.d.ts +0 -17
- package/dist/src/agent/tools/browser-legacy-tools.js +0 -766
- package/dist/src/agent/tools/browser-legacy-tools.js.map +0 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { init_string_coerce, normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString } from "../utils/string-coerce.js";
|
|
3
|
+
//#region src/routing/session-key-utils.ts
|
|
4
|
+
/** Parse `agent:{agentId}:{rest}` session keys (OpenClaw canonical form). */
|
|
5
|
+
function parseAgentSessionKey(sessionKey) {
|
|
6
|
+
const raw = normalizeOptionalLowercaseString(sessionKey);
|
|
7
|
+
if (!raw) return null;
|
|
8
|
+
const parts = raw.split(":").filter(Boolean);
|
|
9
|
+
if (parts.length < 3) return null;
|
|
10
|
+
if (parts[0] !== "agent") return null;
|
|
11
|
+
const agentId = normalizeOptionalString(parts[1]);
|
|
12
|
+
const rest = parts.slice(2).join(":");
|
|
13
|
+
if (!agentId || !rest) return null;
|
|
14
|
+
return {
|
|
15
|
+
agentId: agentId.toLowerCase(),
|
|
16
|
+
rest
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function isCronRunSessionKey(sessionKey) {
|
|
20
|
+
const parsed = parseAgentSessionKey(sessionKey);
|
|
21
|
+
if (!parsed) return false;
|
|
22
|
+
return /^cron:[^:]+:run:[^:]+$/.test(parsed.rest);
|
|
23
|
+
}
|
|
24
|
+
function isCronSessionKey(sessionKey) {
|
|
25
|
+
const parsed = parseAgentSessionKey(sessionKey);
|
|
26
|
+
if (!parsed) return false;
|
|
27
|
+
return normalizeOptionalLowercaseString(parsed.rest)?.startsWith("cron:") === true;
|
|
28
|
+
}
|
|
29
|
+
function isSubagentSessionKey(sessionKey) {
|
|
30
|
+
const raw = normalizeOptionalString(sessionKey);
|
|
31
|
+
if (!raw) return false;
|
|
32
|
+
if (normalizeOptionalLowercaseString(raw)?.startsWith("subagent:")) return true;
|
|
33
|
+
return normalizeOptionalLowercaseString(parseAgentSessionKey(raw)?.rest)?.startsWith("subagent:") === true;
|
|
34
|
+
}
|
|
35
|
+
function getSubagentDepth(sessionKey) {
|
|
36
|
+
const raw = normalizeOptionalLowercaseString(sessionKey);
|
|
37
|
+
if (!raw) return 0;
|
|
38
|
+
return raw.split(":subagent:").length - 1;
|
|
39
|
+
}
|
|
40
|
+
function isAcpSessionKey(sessionKey) {
|
|
41
|
+
const raw = normalizeOptionalString(sessionKey);
|
|
42
|
+
if (!raw) return false;
|
|
43
|
+
if (normalizeLowercaseStringOrEmpty(raw).startsWith("acp:")) return true;
|
|
44
|
+
return normalizeOptionalLowercaseString(parseAgentSessionKey(raw)?.rest)?.startsWith("acp:") === true;
|
|
45
|
+
}
|
|
46
|
+
function parseThreadSessionSuffix(sessionKey) {
|
|
47
|
+
const raw = normalizeOptionalString(sessionKey);
|
|
48
|
+
if (!raw) return {
|
|
49
|
+
baseSessionKey: void 0,
|
|
50
|
+
threadId: void 0
|
|
51
|
+
};
|
|
52
|
+
const threadIndex = normalizeLowercaseStringOrEmpty(raw).lastIndexOf(":thread:");
|
|
53
|
+
return {
|
|
54
|
+
baseSessionKey: threadIndex === -1 ? raw : raw.slice(0, threadIndex),
|
|
55
|
+
threadId: normalizeOptionalString(threadIndex === -1 ? void 0 : raw.slice(threadIndex + 8))
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function parseRawSessionConversationRef(sessionKey) {
|
|
59
|
+
const raw = normalizeOptionalString(sessionKey);
|
|
60
|
+
if (!raw) return null;
|
|
61
|
+
const rawParts = raw.split(":").filter(Boolean);
|
|
62
|
+
const bodyStartIndex = rawParts.length >= 3 && normalizeOptionalLowercaseString(rawParts[0]) === "agent" ? 2 : 0;
|
|
63
|
+
const parts = rawParts.slice(bodyStartIndex);
|
|
64
|
+
if (parts.length < 3) return null;
|
|
65
|
+
const channel = normalizeOptionalLowercaseString(parts[0]);
|
|
66
|
+
const kind = normalizeOptionalLowercaseString(parts[1]);
|
|
67
|
+
if (!channel || kind !== "group" && kind !== "channel") return null;
|
|
68
|
+
const rawId = normalizeOptionalString(parts.slice(2).join(":"));
|
|
69
|
+
const prefix = normalizeOptionalString(rawParts.slice(0, bodyStartIndex + 2).join(":"));
|
|
70
|
+
if (!rawId || !prefix) return null;
|
|
71
|
+
return {
|
|
72
|
+
channel,
|
|
73
|
+
kind,
|
|
74
|
+
rawId,
|
|
75
|
+
prefix
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function resolveThreadParentSessionKey(sessionKey) {
|
|
79
|
+
const { baseSessionKey, threadId } = parseThreadSessionSuffix(sessionKey);
|
|
80
|
+
if (!threadId) return null;
|
|
81
|
+
const parent = normalizeOptionalString(baseSessionKey);
|
|
82
|
+
if (!parent) return null;
|
|
83
|
+
return parent;
|
|
84
|
+
}
|
|
85
|
+
var init_session_key_utils = __esmMin((() => {
|
|
86
|
+
init_string_coerce();
|
|
87
|
+
}));
|
|
88
|
+
//#endregion
|
|
89
|
+
init_session_key_utils();
|
|
90
|
+
export { getSubagentDepth, init_session_key_utils, isAcpSessionKey, isCronRunSessionKey, isCronSessionKey, isSubagentSessionKey, parseAgentSessionKey, parseRawSessionConversationRef, parseThreadSessionSuffix, resolveThreadParentSessionKey };
|
|
91
|
+
|
|
92
|
+
//# sourceMappingURL=session-key-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-key-utils.js","names":[],"sources":["../../../src/routing/session-key-utils.ts"],"sourcesContent":["import {\n normalizeLowercaseStringOrEmpty,\n normalizeOptionalLowercaseString,\n normalizeOptionalString,\n} from '../utils/string-coerce.js';\n\nexport type ParsedAgentSessionKey = {\n agentId: string;\n rest: string;\n};\n\nexport type ParsedThreadSessionSuffix = {\n baseSessionKey: string | undefined;\n threadId: string | undefined;\n};\n\nexport type RawSessionConversationRef = {\n channel: string;\n kind: 'group' | 'channel';\n rawId: string;\n prefix: string;\n};\n\n/** Parse `agent:{agentId}:{rest}` session keys (OpenClaw canonical form). */\nexport function parseAgentSessionKey(\n sessionKey: string | undefined | null,\n): ParsedAgentSessionKey | null {\n const raw = normalizeOptionalLowercaseString(sessionKey);\n if (!raw) {\n return null;\n }\n const parts = raw.split(':').filter(Boolean);\n if (parts.length < 3) {\n return null;\n }\n if (parts[0] !== 'agent') {\n return null;\n }\n const agentId = normalizeOptionalString(parts[1]);\n const rest = parts.slice(2).join(':');\n if (!agentId || !rest) {\n return null;\n }\n return { agentId: agentId.toLowerCase(), rest };\n}\n\nexport function isCronRunSessionKey(sessionKey: string | undefined | null): boolean {\n const parsed = parseAgentSessionKey(sessionKey);\n if (!parsed) {\n return false;\n }\n return /^cron:[^:]+:run:[^:]+$/.test(parsed.rest);\n}\n\nexport function isCronSessionKey(sessionKey: string | undefined | null): boolean {\n const parsed = parseAgentSessionKey(sessionKey);\n if (!parsed) {\n return false;\n }\n return normalizeOptionalLowercaseString(parsed.rest)?.startsWith('cron:') === true;\n}\n\nexport function isSubagentSessionKey(sessionKey: string | undefined | null): boolean {\n const raw = normalizeOptionalString(sessionKey);\n if (!raw) {\n return false;\n }\n if (normalizeOptionalLowercaseString(raw)?.startsWith('subagent:')) {\n return true;\n }\n const parsed = parseAgentSessionKey(raw);\n return normalizeOptionalLowercaseString(parsed?.rest)?.startsWith('subagent:') === true;\n}\n\nexport function getSubagentDepth(sessionKey: string | undefined | null): number {\n const raw = normalizeOptionalLowercaseString(sessionKey);\n if (!raw) {\n return 0;\n }\n return raw.split(':subagent:').length - 1;\n}\n\nexport function isAcpSessionKey(sessionKey: string | undefined | null): boolean {\n const raw = normalizeOptionalString(sessionKey);\n if (!raw) {\n return false;\n }\n const normalized = normalizeLowercaseStringOrEmpty(raw);\n if (normalized.startsWith('acp:')) {\n return true;\n }\n const parsed = parseAgentSessionKey(raw);\n return normalizeOptionalLowercaseString(parsed?.rest)?.startsWith('acp:') === true;\n}\n\nexport function parseThreadSessionSuffix(\n sessionKey: string | undefined | null,\n): ParsedThreadSessionSuffix {\n const raw = normalizeOptionalString(sessionKey);\n if (!raw) {\n return { baseSessionKey: undefined, threadId: undefined };\n }\n\n const lowerRaw = normalizeLowercaseStringOrEmpty(raw);\n const threadMarker = ':thread:';\n const threadIndex = lowerRaw.lastIndexOf(threadMarker);\n const baseSessionKey = threadIndex === -1 ? raw : raw.slice(0, threadIndex);\n const threadIdRaw = threadIndex === -1 ? undefined : raw.slice(threadIndex + threadMarker.length);\n const threadId = normalizeOptionalString(threadIdRaw);\n\n return { baseSessionKey, threadId };\n}\n\nexport function parseRawSessionConversationRef(\n sessionKey: string | undefined | null,\n): RawSessionConversationRef | null {\n const raw = normalizeOptionalString(sessionKey);\n if (!raw) {\n return null;\n }\n\n const rawParts = raw.split(':').filter(Boolean);\n const bodyStartIndex =\n rawParts.length >= 3 && normalizeOptionalLowercaseString(rawParts[0]) === 'agent' ? 2 : 0;\n const parts = rawParts.slice(bodyStartIndex);\n if (parts.length < 3) {\n return null;\n }\n\n const channel = normalizeOptionalLowercaseString(parts[0]);\n const kind = normalizeOptionalLowercaseString(parts[1]);\n if (!channel || (kind !== 'group' && kind !== 'channel')) {\n return null;\n }\n\n const rawId = normalizeOptionalString(parts.slice(2).join(':'));\n const prefix = normalizeOptionalString(rawParts.slice(0, bodyStartIndex + 2).join(':'));\n if (!rawId || !prefix) {\n return null;\n }\n\n return { channel, kind, rawId, prefix };\n}\n\nexport function resolveThreadParentSessionKey(\n sessionKey: string | undefined | null,\n): string | null {\n const { baseSessionKey, threadId } = parseThreadSessionSuffix(sessionKey);\n if (!threadId) {\n return null;\n }\n const parent = normalizeOptionalString(baseSessionKey);\n if (!parent) {\n return null;\n }\n return parent;\n}\n"],"mappings":"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"}
|
|
@@ -1,74 +1,44 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Session key
|
|
2
|
+
* Session key parsing helpers for `agent:{agentId}:{rest}` keys.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* Examples:
|
|
7
|
-
* - main:telegram:acc_default:dm:123456
|
|
8
|
-
* - main:discord:acc_work:channel:987654:thread:789
|
|
9
|
-
* - subagent:main:abc123:telegram:acc_default:dm:123456
|
|
10
|
-
*/
|
|
11
|
-
/**
|
|
12
|
-
* Sanitize a segment to allowed chars a-z0-9_-
|
|
4
|
+
* Re-exports the OpenClaw-aligned builder/parser surface from agent-session-key.ts.
|
|
13
5
|
*/
|
|
6
|
+
import { defaultMainSessionKey } from './agent-session-key.js';
|
|
7
|
+
export * from './agent-session-key.js';
|
|
8
|
+
export * from './session-key-utils.js';
|
|
14
9
|
export declare function sanitizeSegment(value: string | undefined | null, options?: {
|
|
15
10
|
allowLeadingDash?: boolean;
|
|
16
11
|
}): string;
|
|
17
|
-
/**
|
|
18
|
-
* Whether the segment matches the allowed pattern and length.
|
|
19
|
-
*/
|
|
20
12
|
export declare function isValidSegment(value: string | undefined | null): boolean;
|
|
21
|
-
/**
|
|
22
|
-
|
|
23
|
-
*/
|
|
24
|
-
export interface BuildSessionKeyParams {
|
|
13
|
+
/** Structured view of an agent session key rest segment. */
|
|
14
|
+
export interface ParsedSessionKey {
|
|
25
15
|
agentId: string;
|
|
26
16
|
source: string;
|
|
27
17
|
accountId: string;
|
|
28
18
|
peerKind: string;
|
|
29
19
|
peerId: string;
|
|
30
|
-
threadId?: string
|
|
31
|
-
scopeId?: string
|
|
20
|
+
threadId?: string;
|
|
21
|
+
scopeId?: string;
|
|
32
22
|
}
|
|
33
|
-
export
|
|
34
|
-
/**
|
|
35
|
-
* Parsed session key components.
|
|
36
|
-
*/
|
|
37
|
-
export interface ParsedSessionKey {
|
|
23
|
+
export interface BuildSessionKeyParams {
|
|
38
24
|
agentId: string;
|
|
39
25
|
source: string;
|
|
40
26
|
accountId: string;
|
|
41
27
|
peerKind: string;
|
|
42
28
|
peerId: string;
|
|
43
|
-
threadId?: string;
|
|
44
|
-
scopeId?: string;
|
|
29
|
+
threadId?: string | null;
|
|
30
|
+
scopeId?: string | null;
|
|
31
|
+
mainKey?: string;
|
|
32
|
+
dmScope?: 'main' | 'per-peer' | 'per-channel-peer' | 'per-account-channel-peer';
|
|
33
|
+
identityLinks?: Record<string, string[]>;
|
|
45
34
|
}
|
|
35
|
+
/** Build an OpenClaw-style agent session key from routing segments. */
|
|
36
|
+
export declare function buildSessionKey(params: BuildSessionKeyParams): string;
|
|
37
|
+
/** Parse `agent:{agentId}:{rest}` into routing segments. Returns null for invalid keys. */
|
|
46
38
|
export declare function parseSessionKey(sessionKey: string | undefined | null): ParsedSessionKey | null;
|
|
47
|
-
/**
|
|
48
|
-
* Whether the key refers to a subagent session.
|
|
49
|
-
*/
|
|
50
|
-
export declare function isSubagentSessionKey(sessionKey: string | undefined | null): boolean;
|
|
51
|
-
/**
|
|
52
|
-
* Whether the key is a cron-driven session.
|
|
53
|
-
*/
|
|
54
|
-
export declare function isCronSessionKey(sessionKey: string | undefined | null): boolean;
|
|
55
|
-
/**
|
|
56
|
-
* Nesting depth from repeated `subagent` prefixes in the colon-separated key.
|
|
57
|
-
* e.g. `subagent:...` => 1, `subagent:subagent:...` => 2
|
|
58
|
-
*/
|
|
59
|
-
export declare function getSubagentDepth(sessionKey: string | undefined | null): number;
|
|
60
|
-
/**
|
|
61
|
-
* Parameters for building a subagent session key.
|
|
62
|
-
*/
|
|
63
39
|
export interface BuildSubagentSessionKeyParams extends BuildSessionKeyParams {
|
|
64
40
|
parentSessionKey: string;
|
|
65
41
|
}
|
|
66
42
|
export declare function buildSubagentSessionKey(params: BuildSubagentSessionKeyParams): string;
|
|
67
|
-
/**
|
|
68
|
-
* Parent session key without a :thread: suffix, if any.
|
|
69
|
-
*/
|
|
70
43
|
export declare function getParentSessionKey(sessionKey: string | undefined | null): string | null;
|
|
71
|
-
|
|
72
|
-
* Normalize a session key (trim + lowercase).
|
|
73
|
-
*/
|
|
74
|
-
export declare function normalizeSessionKey(sessionKey: string | undefined | null): string;
|
|
44
|
+
export { defaultMainSessionKey };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { DEFAULT_ACCOUNT_ID, normalizeAccountId, normalizeOptionalAccountId } from "./account-id.js";
|
|
3
|
+
import { getSubagentDepth, init_session_key_utils, isAcpSessionKey, isCronRunSessionKey, isCronSessionKey, isSubagentSessionKey, parseAgentSessionKey, parseRawSessionConversationRef, parseThreadSessionSuffix, resolveThreadParentSessionKey } from "./session-key-utils.js";
|
|
4
|
+
import { DEFAULT_AGENT_ID, DEFAULT_MAIN_KEY, assertAgentSessionKey, buildAgentMainSessionKey, buildAgentPeerSessionKey, buildGroupHistoryKey, classifySessionKeyShape, defaultMainSessionKey, init_agent_session_key, isValidAgentId, normalizeAgentId, normalizeMainKey, normalizeSessionKey, resolveAgentIdFromSessionKey, resolveThreadSessionKeys, sanitizeAgentId, scopedHeartbeatWakeOptions, toAgentRequestSessionKey, toAgentStoreSessionKey } from "./agent-session-key.js";
|
|
2
5
|
//#region src/routing/session-key.ts
|
|
3
|
-
/**
|
|
4
|
-
* Sanitize a segment to allowed chars a-z0-9_-
|
|
5
|
-
*/
|
|
6
6
|
function sanitizeSegment(value, options) {
|
|
7
7
|
const trimmed = (value ?? "").trim();
|
|
8
8
|
if (!trimmed) return "";
|
|
@@ -12,148 +12,175 @@ function sanitizeSegment(value, options) {
|
|
|
12
12
|
if (!cleaned) return "";
|
|
13
13
|
return cleaned.slice(0, 64);
|
|
14
14
|
}
|
|
15
|
-
/**
|
|
16
|
-
* Whether the segment matches the allowed pattern and length.
|
|
17
|
-
*/
|
|
18
15
|
function isValidSegment(value) {
|
|
19
16
|
const trimmed = (value ?? "").trim();
|
|
20
|
-
if (!trimmed) return false;
|
|
21
|
-
if (trimmed.length > 64) return false;
|
|
17
|
+
if (!trimmed || trimmed.length > 64) return false;
|
|
22
18
|
return VALID_SEGMENT_RE.test(trimmed);
|
|
23
19
|
}
|
|
20
|
+
/** Build an OpenClaw-style agent session key from routing segments. */
|
|
24
21
|
function buildSessionKey(params) {
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
22
|
+
const peerKind = params.peerKind === "dm" ? "direct" : params.peerKind;
|
|
23
|
+
let key = buildAgentPeerSessionKey({
|
|
24
|
+
agentId: params.agentId,
|
|
25
|
+
mainKey: params.mainKey,
|
|
26
|
+
channel: params.source,
|
|
27
|
+
accountId: params.accountId,
|
|
28
|
+
peerKind,
|
|
29
|
+
peerId: params.peerId,
|
|
30
|
+
identityLinks: params.identityLinks,
|
|
31
|
+
dmScope: params.dmScope ?? (peerKind === "direct" ? "per-account-channel-peer" : void 0)
|
|
32
|
+
});
|
|
33
|
+
if (params.threadId) key = resolveThreadSessionKeys({
|
|
34
|
+
baseSessionKey: key,
|
|
35
|
+
threadId: params.threadId
|
|
36
|
+
}).sessionKey;
|
|
37
|
+
if (params.scopeId) key = `${key}:scope:${sanitizeSegment(params.scopeId, { allowLeadingDash: true }) || "default"}`;
|
|
38
|
+
return key;
|
|
35
39
|
}
|
|
40
|
+
/** Parse `agent:{agentId}:{rest}` into routing segments. Returns null for invalid keys. */
|
|
36
41
|
function parseSessionKey(sessionKey) {
|
|
37
42
|
const raw = (sessionKey ?? "").trim();
|
|
38
43
|
if (!raw) return null;
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
44
|
+
const { baseSessionKey, threadId } = parseThreadSuffix(raw);
|
|
45
|
+
const agentParsed = parseAgentSessionKey(baseSessionKey);
|
|
46
|
+
if (!agentParsed) return null;
|
|
47
|
+
const scopeParts = parseScopeSuffix(agentParsed.rest);
|
|
48
|
+
const rest = scopeParts.rest;
|
|
49
|
+
const scopeId = scopeParts.scopeId;
|
|
50
|
+
const mainKey = normalizeMainKey(void 0);
|
|
51
|
+
if (rest === mainKey) return {
|
|
52
|
+
agentId: agentParsed.agentId,
|
|
53
|
+
source: "cli",
|
|
54
|
+
accountId: "default",
|
|
55
|
+
peerKind: "direct",
|
|
56
|
+
peerId: mainKey,
|
|
57
|
+
threadId,
|
|
58
|
+
scopeId
|
|
59
|
+
};
|
|
60
|
+
if (rest.startsWith("subagent:")) return parseSubagentRest(agentParsed.agentId, rest, threadId, scopeId);
|
|
61
|
+
if (rest.startsWith("cron:")) {
|
|
62
|
+
const parts = rest.split(":");
|
|
63
|
+
return {
|
|
64
|
+
agentId: agentParsed.agentId,
|
|
65
|
+
source: "cron",
|
|
66
|
+
accountId: "default",
|
|
67
|
+
peerKind: "direct",
|
|
68
|
+
peerId: parts.slice(1).join(":") || "cron",
|
|
69
|
+
threadId,
|
|
70
|
+
scopeId
|
|
57
71
|
};
|
|
58
|
-
let i = 0;
|
|
59
|
-
while (i < rest.length) {
|
|
60
|
-
const marker = rest[i]?.toLowerCase();
|
|
61
|
-
const value = rest[i + 1];
|
|
62
|
-
if (marker === "thread" && value) {
|
|
63
|
-
result.threadId = value.toLowerCase();
|
|
64
|
-
i += 2;
|
|
65
|
-
} else if (marker === "scope" && value) {
|
|
66
|
-
result.scopeId = value.toLowerCase();
|
|
67
|
-
i += 2;
|
|
68
|
-
} else i++;
|
|
69
|
-
}
|
|
70
|
-
return result;
|
|
71
72
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
73
|
+
const parts = rest.split(":").filter(Boolean);
|
|
74
|
+
if (parts.length >= 4 && parts[2] === "direct") return {
|
|
75
|
+
agentId: agentParsed.agentId,
|
|
76
|
+
source: parts[0],
|
|
77
|
+
accountId: parts[1],
|
|
78
|
+
peerKind: "direct",
|
|
79
|
+
peerId: parts.slice(3).join(":"),
|
|
80
|
+
threadId,
|
|
81
|
+
scopeId
|
|
82
|
+
};
|
|
83
|
+
if (parts.length >= 3 && parts[1] === "direct") return {
|
|
84
|
+
agentId: agentParsed.agentId,
|
|
85
|
+
source: parts[0],
|
|
86
|
+
accountId: "default",
|
|
87
|
+
peerKind: "direct",
|
|
88
|
+
peerId: parts.slice(2).join(":"),
|
|
89
|
+
threadId,
|
|
90
|
+
scopeId
|
|
91
|
+
};
|
|
92
|
+
if (parts.length >= 2 && parts[0] === "direct") return {
|
|
93
|
+
agentId: agentParsed.agentId,
|
|
94
|
+
source: "cli",
|
|
95
|
+
accountId: "default",
|
|
96
|
+
peerKind: "direct",
|
|
97
|
+
peerId: parts.slice(1).join(":"),
|
|
98
|
+
threadId,
|
|
99
|
+
scopeId
|
|
100
|
+
};
|
|
101
|
+
if (parts.length >= 3 && (parts[1] === "group" || parts[1] === "channel")) return {
|
|
102
|
+
agentId: agentParsed.agentId,
|
|
103
|
+
source: parts[0],
|
|
104
|
+
accountId: "default",
|
|
105
|
+
peerKind: parts[1],
|
|
106
|
+
peerId: parts.slice(2).join(":"),
|
|
107
|
+
threadId,
|
|
108
|
+
scopeId
|
|
109
|
+
};
|
|
110
|
+
return {
|
|
111
|
+
agentId: agentParsed.agentId,
|
|
112
|
+
source: "cli",
|
|
113
|
+
accountId: "default",
|
|
114
|
+
peerKind: "direct",
|
|
115
|
+
peerId: rest,
|
|
116
|
+
threadId,
|
|
117
|
+
scopeId
|
|
81
118
|
};
|
|
82
|
-
let i = 0;
|
|
83
|
-
while (i < rest.length) {
|
|
84
|
-
const marker = rest[i]?.toLowerCase();
|
|
85
|
-
const value = rest[i + 1];
|
|
86
|
-
if (marker === "thread" && value) {
|
|
87
|
-
result.threadId = value.toLowerCase();
|
|
88
|
-
i += 2;
|
|
89
|
-
} else if (marker === "scope" && value) {
|
|
90
|
-
result.scopeId = value.toLowerCase();
|
|
91
|
-
i += 2;
|
|
92
|
-
} else i++;
|
|
93
|
-
}
|
|
94
|
-
return result;
|
|
95
119
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
120
|
+
function parseThreadSuffix(raw) {
|
|
121
|
+
const idx = raw.toLowerCase().lastIndexOf(":thread:");
|
|
122
|
+
if (idx === -1) return { baseSessionKey: raw };
|
|
123
|
+
return {
|
|
124
|
+
baseSessionKey: raw.slice(0, idx),
|
|
125
|
+
threadId: raw.slice(idx + 8)
|
|
126
|
+
};
|
|
101
127
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
128
|
+
function parseScopeSuffix(rest) {
|
|
129
|
+
const idx = rest.toLowerCase().lastIndexOf(":scope:");
|
|
130
|
+
if (idx === -1) return { rest };
|
|
131
|
+
return {
|
|
132
|
+
rest: rest.slice(0, idx),
|
|
133
|
+
scopeId: rest.slice(idx + 7)
|
|
134
|
+
};
|
|
107
135
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
136
|
+
function parseSubagentRest(parentAgentId, rest, threadId, scopeId) {
|
|
137
|
+
const body = rest.replace(/^subagent:/, "");
|
|
138
|
+
const parentKey = body ? `agent:${parentAgentId}:${body}` : "";
|
|
139
|
+
const parentParsed = parentKey ? parseSessionKey(parentKey) : null;
|
|
140
|
+
if (parentParsed) return {
|
|
141
|
+
...parentParsed,
|
|
142
|
+
agentId: "subagent",
|
|
143
|
+
threadId: threadId ?? parentParsed.threadId,
|
|
144
|
+
scopeId: scopeId ?? parentParsed.scopeId
|
|
145
|
+
};
|
|
146
|
+
return {
|
|
147
|
+
agentId: "subagent",
|
|
148
|
+
source: parentAgentId,
|
|
149
|
+
accountId: "default",
|
|
150
|
+
peerKind: "direct",
|
|
151
|
+
peerId: body || "unknown",
|
|
152
|
+
threadId,
|
|
153
|
+
scopeId
|
|
154
|
+
};
|
|
120
155
|
}
|
|
121
156
|
function buildSubagentSessionKey(params) {
|
|
122
|
-
const parentParsed =
|
|
157
|
+
const parentParsed = parseAgentSessionKey(params.parentSessionKey);
|
|
123
158
|
if (!parentParsed) throw new Error(`Invalid parent session key: ${params.parentSessionKey}`);
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
scopeId: params.scopeId
|
|
132
|
-
});
|
|
159
|
+
const parentRest = parentParsed.rest;
|
|
160
|
+
let key = `agent:${normalizeAgentId(parentParsed.agentId)}:subagent:${parentRest}`;
|
|
161
|
+
if (params.threadId) key = resolveThreadSessionKeys({
|
|
162
|
+
baseSessionKey: key,
|
|
163
|
+
threadId: params.threadId
|
|
164
|
+
}).sessionKey;
|
|
165
|
+
return key;
|
|
133
166
|
}
|
|
134
|
-
/**
|
|
135
|
-
* Parent session key without a :thread: suffix, if any.
|
|
136
|
-
*/
|
|
137
167
|
function getParentSessionKey(sessionKey) {
|
|
138
168
|
const parsed = parseSessionKey(sessionKey);
|
|
139
|
-
if (!parsed) return null;
|
|
140
|
-
if (!parsed.threadId) return null;
|
|
169
|
+
if (!parsed?.threadId) return null;
|
|
141
170
|
return buildSessionKey({
|
|
142
171
|
agentId: parsed.agentId,
|
|
143
172
|
source: parsed.source,
|
|
144
173
|
accountId: parsed.accountId,
|
|
145
174
|
peerKind: parsed.peerKind,
|
|
146
|
-
peerId: parsed.peerId
|
|
175
|
+
peerId: parsed.peerId,
|
|
176
|
+
scopeId: parsed.scopeId
|
|
147
177
|
});
|
|
148
178
|
}
|
|
149
|
-
/**
|
|
150
|
-
* Normalize a session key (trim + lowercase).
|
|
151
|
-
*/
|
|
152
|
-
function normalizeSessionKey(sessionKey) {
|
|
153
|
-
return (sessionKey ?? "").trim().toLowerCase();
|
|
154
|
-
}
|
|
155
179
|
var VALID_SEGMENT_RE, INVALID_CHARS_RE, LEADING_DASH_RE, TRAILING_DASH_RE;
|
|
156
180
|
var init_session_key = __esmMin((() => {
|
|
181
|
+
init_agent_session_key();
|
|
182
|
+
init_agent_session_key();
|
|
183
|
+
init_session_key_utils();
|
|
157
184
|
VALID_SEGMENT_RE = /^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?$/i;
|
|
158
185
|
INVALID_CHARS_RE = /[^a-z0-9_-]+/g;
|
|
159
186
|
LEADING_DASH_RE = /^-+/;
|
|
@@ -161,6 +188,6 @@ var init_session_key = __esmMin((() => {
|
|
|
161
188
|
}));
|
|
162
189
|
//#endregion
|
|
163
190
|
init_session_key();
|
|
164
|
-
export { buildSessionKey, buildSubagentSessionKey, getParentSessionKey, getSubagentDepth, init_session_key, isCronSessionKey, isSubagentSessionKey, isValidSegment, normalizeSessionKey, parseSessionKey, sanitizeSegment };
|
|
191
|
+
export { DEFAULT_ACCOUNT_ID, DEFAULT_AGENT_ID, DEFAULT_MAIN_KEY, assertAgentSessionKey, buildAgentMainSessionKey, buildAgentPeerSessionKey, buildGroupHistoryKey, buildSessionKey, buildSubagentSessionKey, classifySessionKeyShape, defaultMainSessionKey, getParentSessionKey, getSubagentDepth, init_session_key, isAcpSessionKey, isCronRunSessionKey, isCronSessionKey, isSubagentSessionKey, isValidAgentId, isValidSegment, normalizeAccountId, normalizeAgentId, normalizeMainKey, normalizeOptionalAccountId, normalizeSessionKey, parseAgentSessionKey, parseRawSessionConversationRef, parseSessionKey, parseThreadSessionSuffix, resolveAgentIdFromSessionKey, resolveThreadParentSessionKey, resolveThreadSessionKeys, sanitizeAgentId, sanitizeSegment, scopedHeartbeatWakeOptions, toAgentRequestSessionKey, toAgentStoreSessionKey };
|
|
165
192
|
|
|
166
193
|
//# sourceMappingURL=session-key.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-key.js","names":[],"sources":["../../../src/routing/session-key.ts"],"sourcesContent":["/**\n * Session key construction and parsing.\n *\n * Format: {agentId}:{source}:{accountId}:{peerKind}:{peerId}[:thread:{threadId}][:scope:{scopeId}]\n *\n * Examples:\n * - main:telegram:acc_default:dm:123456\n * - main:discord:acc_work:channel:987654:thread:789\n * - subagent:main:abc123:telegram:acc_default:dm:123456\n */\n\n// Precompiled regexes for segment validation\nconst VALID_SEGMENT_RE = /^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?$/i;\nconst INVALID_CHARS_RE = /[^a-z0-9_-]+/g;\nconst LEADING_DASH_RE = /^-+/;\nconst TRAILING_DASH_RE = /-+$/;\n\n/**\n * Sanitize a segment to allowed chars a-z0-9_-\n */\nexport function sanitizeSegment(value: string | undefined | null, options?: { allowLeadingDash?: boolean }): string {\n const trimmed = (value ?? '').trim();\n if (!trimmed) {\n return '';\n }\n \n // Strip disallowed characters\n let cleaned = trimmed\n .toLowerCase()\n .replace(INVALID_CHARS_RE, '-');\n \n // Trim leading/trailing dashes unless a leading dash is allowed (e.g. negative IDs)\n if (!options?.allowLeadingDash) {\n cleaned = cleaned\n .replace(LEADING_DASH_RE, '')\n .replace(TRAILING_DASH_RE, '');\n } else {\n // When leading dash is allowed, only strip trailing dashes\n cleaned = cleaned.replace(TRAILING_DASH_RE, '');\n }\n \n if (!cleaned) {\n return '';\n }\n \n return cleaned.slice(0, 64);\n}\n\n/**\n * Whether the segment matches the allowed pattern and length.\n */\nexport function isValidSegment(value: string | undefined | null): boolean {\n const trimmed = (value ?? '').trim();\n if (!trimmed) {\n return false;\n }\n \n if (trimmed.length > 64) {\n return false;\n }\n \n return VALID_SEGMENT_RE.test(trimmed);\n}\n\n/**\n * Fields used to build a session key.\n */\nexport interface BuildSessionKeyParams {\n agentId: string;\n source: string;\n accountId: string;\n peerKind: string;\n peerId: string;\n threadId?: string | null;\n scopeId?: string | null;\n}\n\nexport function buildSessionKey(params: BuildSessionKeyParams): string {\n const segments = [\n sanitizeSegment(params.agentId) || 'main',\n sanitizeSegment(params.source) || 'unknown',\n sanitizeSegment(params.accountId) || 'default',\n sanitizeSegment(params.peerKind) || 'unknown',\n // peerId may start with '-' (e.g. Telegram supergroup id -1001234567890)\n sanitizeSegment(params.peerId, { allowLeadingDash: true }) || 'unknown',\n ];\n \n if (params.threadId) {\n segments.push('thread', sanitizeSegment(params.threadId, { allowLeadingDash: true }) || 'unknown');\n }\n \n if (params.scopeId) {\n segments.push('scope', sanitizeSegment(params.scopeId, { allowLeadingDash: true }) || 'default');\n }\n \n return segments.join(':');\n}\n\n/**\n * Parsed session key components.\n */\nexport interface ParsedSessionKey {\n agentId: string;\n source: string;\n accountId: string;\n peerKind: string;\n peerId: string;\n threadId?: string;\n scopeId?: string;\n}\n\nexport function parseSessionKey(sessionKey: string | undefined | null): ParsedSessionKey | null {\n const raw = (sessionKey ?? '').trim();\n if (!raw) {\n return null;\n }\n \n const parts = raw.split(':').filter(Boolean);\n\n /**\n * Alternate encoding used in some installs / tests: `gateway:{agentId}:{source}:{accountId}:{peerKind}:{peerId}…`\n * (distinct from normal `{agentId}:{source}:…` where the first segment is the agent id.)\n */\n if (parts.length >= 6 && parts[0]?.toLowerCase() === 'gateway') {\n const agentId = parts[1] ?? '';\n const source = parts[2] ?? '';\n const accountId = parts[3] ?? '';\n const peerKind = parts[4] ?? '';\n const peerId = parts[5] ?? '';\n const rest = parts.slice(6);\n const result: ParsedSessionKey = {\n agentId: agentId.toLowerCase(),\n source: source.toLowerCase(),\n accountId: accountId.toLowerCase(),\n peerKind: peerKind.toLowerCase(),\n peerId: peerId.toLowerCase(),\n };\n let i = 0;\n while (i < rest.length) {\n const marker = rest[i]?.toLowerCase();\n const value = rest[i + 1];\n if (marker === 'thread' && value) {\n result.threadId = value.toLowerCase();\n i += 2;\n } else if (marker === 'scope' && value) {\n result.scopeId = value.toLowerCase();\n i += 2;\n } else {\n i++;\n }\n }\n return result;\n }\n\n if (parts.length < 5) {\n return null;\n }\n \n const [agentId, source, accountId, peerKind, peerId, ...rest] = parts;\n \n if (!agentId || !source || !accountId || !peerKind || !peerId) {\n return null;\n }\n \n const result: ParsedSessionKey = {\n agentId: agentId.toLowerCase(),\n source: source.toLowerCase(),\n accountId: accountId.toLowerCase(),\n peerKind: peerKind.toLowerCase(),\n peerId: peerId.toLowerCase(),\n };\n \n // Optional :thread: and :scope: suffix segments\n let i = 0;\n while (i < rest.length) {\n const marker = rest[i]?.toLowerCase();\n const value = rest[i + 1];\n \n if (marker === 'thread' && value) {\n result.threadId = value.toLowerCase();\n i += 2;\n } else if (marker === 'scope' && value) {\n result.scopeId = value.toLowerCase();\n i += 2;\n } else {\n i++;\n }\n }\n \n return result;\n}\n\n/**\n * Whether the key refers to a subagent session.\n */\nexport function isSubagentSessionKey(sessionKey: string | undefined | null): boolean {\n const parsed = parseSessionKey(sessionKey);\n return parsed?.agentId === 'subagent';\n}\n\n/**\n * Whether the key is a cron-driven session.\n */\nexport function isCronSessionKey(sessionKey: string | undefined | null): boolean {\n const parsed = parseSessionKey(sessionKey);\n return parsed?.source === 'cron';\n}\n\n/**\n * Nesting depth from repeated `subagent` prefixes in the colon-separated key.\n * e.g. `subagent:...` => 1, `subagent:subagent:...` => 2\n */\nexport function getSubagentDepth(sessionKey: string | undefined | null): number {\n const raw = (sessionKey ?? '').trim();\n if (!raw) {\n return 0;\n }\n \n const parts = raw.split(':');\n let depth = 0;\n \n for (const part of parts) {\n if (part.toLowerCase() === 'subagent') {\n depth++;\n } else {\n break;\n }\n }\n \n return depth;\n}\n\n/**\n * Parameters for building a subagent session key.\n */\nexport interface BuildSubagentSessionKeyParams extends BuildSessionKeyParams {\n parentSessionKey: string;\n}\n\nexport function buildSubagentSessionKey(params: BuildSubagentSessionKeyParams): string {\n const parentParsed = parseSessionKey(params.parentSessionKey);\n if (!parentParsed) {\n throw new Error(`Invalid parent session key: ${params.parentSessionKey}`);\n }\n \n return buildSessionKey({\n agentId: 'subagent',\n source: parentParsed.agentId,\n accountId: parentParsed.accountId,\n peerKind: parentParsed.peerKind,\n peerId: parentParsed.peerId,\n threadId: params.threadId,\n scopeId: params.scopeId,\n });\n}\n\n/**\n * Parent session key without a :thread: suffix, if any.\n */\nexport function getParentSessionKey(sessionKey: string | undefined | null): string | null {\n const parsed = parseSessionKey(sessionKey);\n if (!parsed) {\n return null;\n }\n \n if (!parsed.threadId) {\n return null;\n }\n \n return buildSessionKey({\n agentId: parsed.agentId,\n source: parsed.source,\n accountId: parsed.accountId,\n peerKind: parsed.peerKind,\n peerId: parsed.peerId,\n });\n}\n\n/**\n * Normalize a session key (trim + lowercase).\n */\nexport function normalizeSessionKey(sessionKey: string | undefined | null): string {\n return (sessionKey ?? '').trim().toLowerCase();\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session-key.js","names":[],"sources":["../../../src/routing/session-key.ts"],"sourcesContent":["/**\n * Session key parsing helpers for `agent:{agentId}:{rest}` keys.\n *\n * Re-exports the OpenClaw-aligned builder/parser surface from agent-session-key.ts.\n */\n\nimport {\n buildAgentPeerSessionKey,\n defaultMainSessionKey,\n normalizeAgentId,\n normalizeMainKey,\n parseAgentSessionKey,\n resolveThreadSessionKeys,\n type PeerKind,\n} from './agent-session-key.js';\n\nexport * from './agent-session-key.js';\nexport * from './session-key-utils.js';\n\nconst VALID_SEGMENT_RE = /^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?$/i;\nconst INVALID_CHARS_RE = /[^a-z0-9_-]+/g;\nconst LEADING_DASH_RE = /^-+/;\nconst TRAILING_DASH_RE = /-+$/;\n\nexport function sanitizeSegment(\n value: string | undefined | null,\n options?: { allowLeadingDash?: boolean },\n): string {\n const trimmed = (value ?? '').trim();\n if (!trimmed) {\n return '';\n }\n\n let cleaned = trimmed.toLowerCase().replace(INVALID_CHARS_RE, '-');\n\n if (!options?.allowLeadingDash) {\n cleaned = cleaned.replace(LEADING_DASH_RE, '').replace(TRAILING_DASH_RE, '');\n } else {\n cleaned = cleaned.replace(TRAILING_DASH_RE, '');\n }\n\n if (!cleaned) {\n return '';\n }\n\n return cleaned.slice(0, 64);\n}\n\nexport function isValidSegment(value: string | undefined | null): boolean {\n const trimmed = (value ?? '').trim();\n if (!trimmed || trimmed.length > 64) {\n return false;\n }\n return VALID_SEGMENT_RE.test(trimmed);\n}\n\n/** Structured view of an agent session key rest segment. */\nexport interface ParsedSessionKey {\n agentId: string;\n source: string;\n accountId: string;\n peerKind: string;\n peerId: string;\n threadId?: string;\n scopeId?: string;\n}\n\nexport interface BuildSessionKeyParams {\n agentId: string;\n source: string;\n accountId: string;\n peerKind: string;\n peerId: string;\n threadId?: string | null;\n scopeId?: string | null;\n mainKey?: string;\n dmScope?: 'main' | 'per-peer' | 'per-channel-peer' | 'per-account-channel-peer';\n identityLinks?: Record<string, string[]>;\n}\n\n/** Build an OpenClaw-style agent session key from routing segments. */\nexport function buildSessionKey(params: BuildSessionKeyParams): string {\n const peerKind = (params.peerKind === 'dm' ? 'direct' : params.peerKind) as PeerKind;\n let key = buildAgentPeerSessionKey({\n agentId: params.agentId,\n mainKey: params.mainKey,\n channel: params.source,\n accountId: params.accountId,\n peerKind,\n peerId: params.peerId,\n identityLinks: params.identityLinks,\n dmScope:\n params.dmScope ??\n (peerKind === 'direct' ? 'per-account-channel-peer' : undefined),\n });\n\n if (params.threadId) {\n key = resolveThreadSessionKeys({ baseSessionKey: key, threadId: params.threadId }).sessionKey;\n }\n\n if (params.scopeId) {\n key = `${key}:scope:${sanitizeSegment(params.scopeId, { allowLeadingDash: true }) || 'default'}`;\n }\n\n return key;\n}\n\n/** Parse `agent:{agentId}:{rest}` into routing segments. Returns null for invalid keys. */\nexport function parseSessionKey(sessionKey: string | undefined | null): ParsedSessionKey | null {\n const raw = (sessionKey ?? '').trim();\n if (!raw) {\n return null;\n }\n\n const { baseSessionKey, threadId } = parseThreadSuffix(raw);\n const agentParsed = parseAgentSessionKey(baseSessionKey);\n if (!agentParsed) {\n return null;\n }\n\n const scopeParts = parseScopeSuffix(agentParsed.rest);\n const rest = scopeParts.rest;\n const scopeId = scopeParts.scopeId;\n\n const mainKey = normalizeMainKey(undefined);\n if (rest === mainKey) {\n return {\n agentId: agentParsed.agentId,\n source: 'cli',\n accountId: 'default',\n peerKind: 'direct',\n peerId: mainKey,\n threadId,\n scopeId,\n };\n }\n\n if (rest.startsWith('subagent:')) {\n return parseSubagentRest(agentParsed.agentId, rest, threadId, scopeId);\n }\n\n if (rest.startsWith('cron:')) {\n const parts = rest.split(':');\n return {\n agentId: agentParsed.agentId,\n source: 'cron',\n accountId: 'default',\n peerKind: 'direct',\n peerId: parts.slice(1).join(':') || 'cron',\n threadId,\n scopeId,\n };\n }\n\n const parts = rest.split(':').filter(Boolean);\n\n // channel:account:direct:peer\n if (parts.length >= 4 && parts[2] === 'direct') {\n return {\n agentId: agentParsed.agentId,\n source: parts[0]!,\n accountId: parts[1]!,\n peerKind: 'direct',\n peerId: parts.slice(3).join(':'),\n threadId,\n scopeId,\n };\n }\n\n // channel:direct:peer\n if (parts.length >= 3 && parts[1] === 'direct') {\n return {\n agentId: agentParsed.agentId,\n source: parts[0]!,\n accountId: 'default',\n peerKind: 'direct',\n peerId: parts.slice(2).join(':'),\n threadId,\n scopeId,\n };\n }\n\n // direct:peer\n if (parts.length >= 2 && parts[0] === 'direct') {\n return {\n agentId: agentParsed.agentId,\n source: 'cli',\n accountId: 'default',\n peerKind: 'direct',\n peerId: parts.slice(1).join(':'),\n threadId,\n scopeId,\n };\n }\n\n // channel:group|channel:peer\n if (parts.length >= 3 && (parts[1] === 'group' || parts[1] === 'channel')) {\n return {\n agentId: agentParsed.agentId,\n source: parts[0]!,\n accountId: 'default',\n peerKind: parts[1]!,\n peerId: parts.slice(2).join(':'),\n threadId,\n scopeId,\n };\n }\n\n // Custom rest (e.g. tui-uuid)\n return {\n agentId: agentParsed.agentId,\n source: 'cli',\n accountId: 'default',\n peerKind: 'direct',\n peerId: rest,\n threadId,\n scopeId,\n };\n}\n\nfunction parseThreadSuffix(raw: string): { baseSessionKey: string; threadId?: string } {\n const lower = raw.toLowerCase();\n const idx = lower.lastIndexOf(':thread:');\n if (idx === -1) {\n return { baseSessionKey: raw };\n }\n return {\n baseSessionKey: raw.slice(0, idx),\n threadId: raw.slice(idx + ':thread:'.length),\n };\n}\n\nfunction parseScopeSuffix(rest: string): { rest: string; scopeId?: string } {\n const lower = rest.toLowerCase();\n const idx = lower.lastIndexOf(':scope:');\n if (idx === -1) {\n return { rest };\n }\n return {\n rest: rest.slice(0, idx),\n scopeId: rest.slice(idx + ':scope:'.length),\n };\n}\n\nfunction parseSubagentRest(\n parentAgentId: string,\n rest: string,\n threadId?: string,\n scopeId?: string,\n): ParsedSessionKey {\n const body = rest.replace(/^subagent:/, '');\n const parentKey = body ? `agent:${parentAgentId}:${body}` : '';\n const parentParsed = parentKey ? parseSessionKey(parentKey) : null;\n if (parentParsed) {\n return {\n ...parentParsed,\n agentId: 'subagent',\n threadId: threadId ?? parentParsed.threadId,\n scopeId: scopeId ?? parentParsed.scopeId,\n };\n }\n return {\n agentId: 'subagent',\n source: parentAgentId,\n accountId: 'default',\n peerKind: 'direct',\n peerId: body || 'unknown',\n threadId,\n scopeId,\n };\n}\n\nexport interface BuildSubagentSessionKeyParams extends BuildSessionKeyParams {\n parentSessionKey: string;\n}\n\nexport function buildSubagentSessionKey(params: BuildSubagentSessionKeyParams): string {\n const parentParsed = parseAgentSessionKey(params.parentSessionKey);\n if (!parentParsed) {\n throw new Error(`Invalid parent session key: ${params.parentSessionKey}`);\n }\n const parentRest = parentParsed.rest;\n let key = `agent:${normalizeAgentId(parentParsed.agentId)}:subagent:${parentRest}`;\n if (params.threadId) {\n key = resolveThreadSessionKeys({ baseSessionKey: key, threadId: params.threadId }).sessionKey;\n }\n return key;\n}\n\nexport function getParentSessionKey(sessionKey: string | undefined | null): string | null {\n const parsed = parseSessionKey(sessionKey);\n if (!parsed?.threadId) {\n return null;\n }\n return buildSessionKey({\n agentId: parsed.agentId,\n source: parsed.source,\n accountId: parsed.accountId,\n peerKind: parsed.peerKind,\n peerId: parsed.peerId,\n scopeId: parsed.scopeId,\n });\n}\n\nexport { defaultMainSessionKey };\n"],"mappings":"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"}
|
|
@@ -11,6 +11,12 @@ export { normalizeWorkingDirectoryInput, effectiveWorkspacePathForSession, } fro
|
|
|
11
11
|
export { SessionStatus, type SessionMetadata, type SessionDetail, type SessionListQuery, type PaginatedResult, type SessionStats, type ExportFormat, type SessionExport, type SessionTranscriptSummary, type CompactionCheckpointSummary, type CompactionCheckpointDetail, } from './types.js';
|
|
12
12
|
export { normalizeCompactionCheckpointId } from './compaction-checkpoints.js';
|
|
13
13
|
export { shouldSkipWebchatInboundByAbortCutoff } from './abort-cutoff.js';
|
|
14
|
+
export { DEFAULT_RESET_AT_HOUR, DEFAULT_RESET_MODE, DEFAULT_IDLE_MINUTES, evaluateSessionFreshness, resolveDailyResetAtMs, resolveSessionResetPolicy, type SessionFreshness, type SessionResetConfig, type SessionResetMode, type SessionResetPolicy, type SessionResetType, } from './reset-policy.js';
|
|
15
|
+
export { isThreadSessionKey, resolveChannelResetConfig, resolveSessionResetType, } from './reset-type.js';
|
|
16
|
+
export { resolveSessionLifecycleTimestamps, type SessionLifecycleEntry } from './lifecycle-timestamps.js';
|
|
17
|
+
export { resolveSession, resolveSessionKeyForRequest, type SessionKeyResolution, type SessionResolution, } from './resolve-session.js';
|
|
18
|
+
export { initSessionTurn, type InitSessionTurnOptions, type InitSessionTurnResult, type SessionResetFn, } from './init-session-turn.js';
|
|
19
|
+
export { DEFAULT_RESET_TRIGGERS, RESET_OVERLAP_COMMANDS, bareResetAckMessage, matchResetTriggers, resolveResetTriggers, shouldSkipResetOverlapCommand, stripLeadingEnvelopeTimestamp, type ResetTriggerMatch, } from './reset-triggers.js';
|
|
14
20
|
export type { CompactionConfig, CompactionResult } from '../agent/memory/compaction.js';
|
|
15
21
|
export type { WindowConfig } from '../agent/memory/window.js';
|
|
16
22
|
export { maybeAutoTitleSessionStore, generateSessionTitleFromMessages, sanitizeSessionTitle, fallbackTitleFromMessages, isWebchatSessionKey, shouldAutoTitleSessionKey, } from './session-title.js';
|
|
@@ -12,6 +12,12 @@ import { SessionConfigStore, resolveReasoningLevel, resolveThinkingLevel, resolv
|
|
|
12
12
|
import { resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel } from "./thinking-resolve.js";
|
|
13
13
|
import { effectiveWorkspacePathForSession, normalizeWorkingDirectoryInput } from "./session-workspace.js";
|
|
14
14
|
import { shouldSkipWebchatInboundByAbortCutoff } from "./abort-cutoff.js";
|
|
15
|
+
import { DEFAULT_IDLE_MINUTES, DEFAULT_RESET_AT_HOUR, DEFAULT_RESET_MODE, evaluateSessionFreshness, resolveDailyResetAtMs, resolveSessionResetPolicy } from "./reset-policy.js";
|
|
16
|
+
import { isThreadSessionKey, resolveChannelResetConfig, resolveSessionResetType } from "./reset-type.js";
|
|
17
|
+
import { resolveSessionLifecycleTimestamps } from "./lifecycle-timestamps.js";
|
|
18
|
+
import { resolveSession, resolveSessionKeyForRequest } from "./resolve-session.js";
|
|
19
|
+
import { DEFAULT_RESET_TRIGGERS, RESET_OVERLAP_COMMANDS, bareResetAckMessage, matchResetTriggers, resolveResetTriggers, shouldSkipResetOverlapCommand, stripLeadingEnvelopeTimestamp } from "./reset-triggers.js";
|
|
20
|
+
import { initSessionTurn } from "./init-session-turn.js";
|
|
15
21
|
import { flattenMessageContent, messagesToClientHistory } from "./client-history.js";
|
|
16
22
|
import { CURRENT_SESSION_TRANSCRIPT_VERSION, XOPC_SESSION_TRANSCRIPT_TYPE } from "./transcript-format.js";
|
|
17
|
-
export { CURRENT_SESSION_TRANSCRIPT_VERSION, SessionConfigStore, SessionIndex, SessionSearchIndex, SessionStatus, SessionStore, XOPC_SESSION_TRANSCRIPT_TYPE, applySessionPatchToMetadata, buildSessionContextForLlm, effectiveWorkspacePathForSession, emitSessionTranscriptUpdate, fallbackTitleFromMessages, flattenMessageContent, generateSessionTitleFromMessages, getOrLoadSessionSearchIndex, invalidateSessionSearchIndexCache, isTranscriptContextEntry, isWebchatSessionKey, maybeAutoTitleSessionStore, mergeLlmMessagesPreservingContextRows, messagesToClientHistory, normalizeCompactionCheckpointId, normalizeWorkingDirectoryInput, onSessionTranscriptUpdate, resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel, resolveReasoningLevel, resolveThinkingLevel, resolveVerboseLevel, sanitizeSessionTitle, shouldAutoTitleSessionKey, shouldSkipWebchatInboundByAbortCutoff, transcriptRowsFromJsonArray };
|
|
23
|
+
export { CURRENT_SESSION_TRANSCRIPT_VERSION, DEFAULT_IDLE_MINUTES, DEFAULT_RESET_AT_HOUR, DEFAULT_RESET_MODE, DEFAULT_RESET_TRIGGERS, RESET_OVERLAP_COMMANDS, SessionConfigStore, SessionIndex, SessionSearchIndex, SessionStatus, SessionStore, XOPC_SESSION_TRANSCRIPT_TYPE, applySessionPatchToMetadata, bareResetAckMessage, buildSessionContextForLlm, effectiveWorkspacePathForSession, emitSessionTranscriptUpdate, evaluateSessionFreshness, fallbackTitleFromMessages, flattenMessageContent, generateSessionTitleFromMessages, getOrLoadSessionSearchIndex, initSessionTurn, invalidateSessionSearchIndexCache, isThreadSessionKey, isTranscriptContextEntry, isWebchatSessionKey, matchResetTriggers, maybeAutoTitleSessionStore, mergeLlmMessagesPreservingContextRows, messagesToClientHistory, normalizeCompactionCheckpointId, normalizeWorkingDirectoryInput, onSessionTranscriptUpdate, resolveChannelResetConfig, resolveDailyResetAtMs, resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel, resolveReasoningLevel, resolveResetTriggers, resolveSession, resolveSessionKeyForRequest, resolveSessionLifecycleTimestamps, resolveSessionResetPolicy, resolveSessionResetType, resolveThinkingLevel, resolveVerboseLevel, sanitizeSessionTitle, shouldAutoTitleSessionKey, shouldSkipResetOverlapCommand, shouldSkipWebchatInboundByAbortCutoff, stripLeadingEnvelopeTimestamp, transcriptRowsFromJsonArray };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type Config } from '../config/schema.js';
|
|
2
|
+
export type SessionResetFn = (sessionKey: string) => Promise<{
|
|
3
|
+
sessionId: string;
|
|
4
|
+
previousSessionId: string;
|
|
5
|
+
} | null>;
|
|
6
|
+
export type InitSessionTurnResult = {
|
|
7
|
+
sessionKey: string;
|
|
8
|
+
sessionId?: string;
|
|
9
|
+
previousSessionId?: string;
|
|
10
|
+
isNewSession: boolean;
|
|
11
|
+
resetTriggered: boolean;
|
|
12
|
+
staleRollover: boolean;
|
|
13
|
+
bodyStripped: string;
|
|
14
|
+
bareReset: boolean;
|
|
15
|
+
ackMessage?: string;
|
|
16
|
+
};
|
|
17
|
+
export type InitSessionTurnOptions = {
|
|
18
|
+
cfg: Config;
|
|
19
|
+
sessionKey: string;
|
|
20
|
+
body?: string;
|
|
21
|
+
resetSession: SessionResetFn;
|
|
22
|
+
/** When true, skip idle/daily implicit rollover (provider-owned CLI sessions). */
|
|
23
|
+
skipImplicitExpiry?: boolean;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Turn-start session init: match `resetTriggers`, evaluate freshness, archive +
|
|
27
|
+
* assign new `sessionId` when stale or explicitly reset. OpenClaw `initSessionState`
|
|
28
|
+
* equivalent for xopc direct + channel paths.
|
|
29
|
+
*/
|
|
30
|
+
export declare function initSessionTurn(opts: InitSessionTurnOptions): Promise<InitSessionTurnResult>;
|