@xopcai/xopc 0.0.148 → 0.0.150
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/README.md +10 -0
- package/README.zh-CN.md +10 -0
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/dashscope/src/image-generation-provider.js +0 -2
- package/dist/extensions/demo-memory/src/index.js +0 -2
- package/dist/extensions/fal/src/image-generation-provider.js +0 -2
- package/dist/extensions/feishu/src/actions/message-action-handler.js +0 -2
- package/dist/extensions/feishu/src/adapters/cli-login.js +0 -2
- package/dist/extensions/feishu/src/adapters/gateway-setup.js +0 -2
- package/dist/extensions/feishu/src/adapters/onboard-cli.js +0 -2
- package/dist/extensions/feishu/src/auth/app-registration.js +0 -2
- package/dist/extensions/feishu/src/auth/pairing.js +0 -2
- package/dist/extensions/feishu/src/auth/paths.js +0 -2
- package/dist/extensions/feishu/src/directory/directory-adapter.js +0 -2
- package/dist/extensions/feishu/src/format.js +0 -2
- package/dist/extensions/feishu/src/index.js +0 -2
- package/dist/extensions/feishu/src/outbound/actions.js +0 -2
- package/dist/extensions/feishu/src/outbound/media-load.js +0 -2
- package/dist/extensions/feishu/src/outbound/outbound-adapter.js +0 -2
- package/dist/extensions/feishu/src/pairing/feishu-pairing-prompt.js +0 -2
- package/dist/extensions/feishu/src/pairing-config-resolver.js +0 -2
- package/dist/extensions/feishu/src/plugin.js +0 -2
- package/dist/extensions/feishu/src/schema/config-schema.js +0 -2
- package/dist/extensions/feishu/src/state/accounts.js +0 -2
- package/dist/extensions/feishu/src/state/message-bindings.js +0 -2
- package/dist/extensions/feishu/src/state/thread-bindings.js +0 -2
- package/dist/extensions/feishu/src/status/doctor.js +0 -2
- package/dist/extensions/feishu/src/status/status-adapter.js +0 -2
- package/dist/extensions/feishu/src/streaming/streaming-adapter.js +0 -2
- package/dist/extensions/feishu/src/subagent-hooks.js +0 -2
- package/dist/extensions/feishu/src/tools/docx/docx-batch-insert.js +0 -2
- package/dist/extensions/feishu/src/tools/docx/docx-color-text.d.ts +6 -3386
- package/dist/extensions/feishu/src/tools/docx/docx-color-text.js +0 -2
- package/dist/extensions/feishu/src/tools/docx/docx-table-ops.d.ts +16 -16927
- package/dist/extensions/feishu/src/tools/docx/docx-table-ops.js +0 -2
- package/dist/extensions/feishu/src/tools/tools.js +0 -2
- package/dist/extensions/feishu/src/transport/client/client.js +2 -4
- package/dist/extensions/feishu/src/transport/client/lark-sdk-logger.js +0 -2
- package/dist/extensions/feishu/src/transport/client/lark-sdk.d.ts +3 -0
- package/dist/extensions/feishu/src/transport/client/lark-sdk.js +14 -0
- package/dist/extensions/feishu/src/transport/reliability/dedupe.js +0 -2
- package/dist/extensions/feishu/src/transport/reliability/inbound-pipeline.js +0 -2
- package/dist/extensions/feishu/src/transport/socket-mode/monitor.js +0 -2
- package/dist/extensions/feishu/src/transport/socket-mode/retry.js +0 -2
- package/dist/extensions/feishu/src/transport/text/mentions.js +0 -2
- package/dist/extensions/feishu/src/transport/webhook/monitor.js +3 -5
- package/dist/extensions/feishu/src/ui/config-surface.js +0 -2
- package/dist/extensions/feishu/src/workflow-progress.js +0 -2
- package/dist/extensions/google/src/image-generation-provider.js +0 -2
- package/dist/extensions/minimax/src/image-generation-provider.js +0 -2
- package/dist/extensions/openai/src/image-generation-provider.js +0 -2
- package/dist/extensions/telegram/src/access-control.js +0 -2
- package/dist/extensions/telegram/src/account-manager.js +0 -2
- package/dist/extensions/telegram/src/actions/message-actions.js +0 -2
- package/dist/extensions/telegram/src/adapters/command-adapter.js +0 -2
- package/dist/extensions/telegram/src/adapters/config-adapter.js +0 -2
- package/dist/extensions/telegram/src/adapters/debounce-keys.js +0 -2
- package/dist/extensions/telegram/src/adapters/gateway-adapter.js +0 -2
- package/dist/extensions/telegram/src/adapters/gateway-setup.js +0 -2
- package/dist/extensions/telegram/src/adapters/inbound-access.js +0 -2
- package/dist/extensions/telegram/src/adapters/index.js +0 -2
- package/dist/extensions/telegram/src/adapters/onboard-cli.js +0 -2
- package/dist/extensions/telegram/src/adapters/outbound-adapter.js +0 -2
- package/dist/extensions/telegram/src/adapters/security-adapter.js +0 -2
- package/dist/extensions/telegram/src/adapters/setup-wizard.js +0 -2
- package/dist/extensions/telegram/src/adapters/status-adapter.js +0 -2
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js +0 -2
- package/dist/extensions/telegram/src/api-root.js +0 -2
- package/dist/extensions/telegram/src/approval-delivery.js +0 -2
- package/dist/extensions/telegram/src/approval-store.js +0 -2
- package/dist/extensions/telegram/src/caption.js +0 -2
- package/dist/extensions/telegram/src/command-handler.js +0 -2
- package/dist/extensions/telegram/src/config-schema.js +0 -2
- package/dist/extensions/telegram/src/conversation-id.js +0 -2
- package/dist/extensions/telegram/src/dedupe.js +0 -2
- package/dist/extensions/telegram/src/delivery-chat-id.js +0 -2
- package/dist/extensions/telegram/src/doctor.js +0 -2
- package/dist/extensions/telegram/src/draft-stream-lifecycle.js +0 -2
- package/dist/extensions/telegram/src/draft-stream-loop.js +0 -2
- package/dist/extensions/telegram/src/draft-stream.js +0 -2
- package/dist/extensions/telegram/src/errors.js +0 -2
- package/dist/extensions/telegram/src/exec-approval-handler.js +0 -2
- package/dist/extensions/telegram/src/exec-approvals.js +0 -2
- package/dist/extensions/telegram/src/focus-handler.js +0 -2
- package/dist/extensions/telegram/src/format.js +0 -2
- package/dist/extensions/telegram/src/group-config-resolver.js +0 -2
- package/dist/extensions/telegram/src/inbound-coalescer.js +0 -2
- package/dist/extensions/telegram/src/inbound-processor.js +0 -2
- package/dist/extensions/telegram/src/index.js +0 -2
- package/dist/extensions/telegram/src/inline-keyboards.js +0 -2
- package/dist/extensions/telegram/src/network-errors.js +0 -2
- package/dist/extensions/telegram/src/outbound-sender.js +0 -2
- package/dist/extensions/telegram/src/pairing-config-resolver.js +0 -2
- package/dist/extensions/telegram/src/plugin-defaults.js +0 -2
- package/dist/extensions/telegram/src/plugin.js +0 -2
- package/dist/extensions/telegram/src/polling-session.js +0 -2
- package/dist/extensions/telegram/src/proxy-fetch.js +0 -2
- package/dist/extensions/telegram/src/reactions.js +0 -2
- package/dist/extensions/telegram/src/reply-params.js +0 -2
- package/dist/extensions/telegram/src/routing-integration.js +0 -2
- package/dist/extensions/telegram/src/send-options.js +0 -2
- package/dist/extensions/telegram/src/sent-cache.js +0 -2
- package/dist/extensions/telegram/src/startup-errors.js +0 -2
- package/dist/extensions/telegram/src/telegram-actions.js +0 -2
- package/dist/extensions/telegram/src/telegram-draft-errors.js +0 -2
- package/dist/extensions/telegram/src/thread-bindings.js +0 -2
- package/dist/extensions/telegram/src/timeout-abort.js +0 -2
- package/dist/extensions/telegram/src/token-resolver.js +0 -2
- package/dist/extensions/telegram/src/update-offset-store.js +0 -2
- package/dist/extensions/telegram/src/workflow-progress.js +0 -2
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/adapters/onboard-cli.js +0 -2
- package/dist/extensions/weixin/src/api/api.js +0 -2
- package/dist/extensions/weixin/src/api/config-cache.js +0 -2
- package/dist/extensions/weixin/src/api/session-guard.js +0 -2
- package/dist/extensions/weixin/src/api/types.js +0 -2
- package/dist/extensions/weixin/src/auth/accounts.js +0 -2
- package/dist/extensions/weixin/src/auth/login-qr.js +0 -2
- package/dist/extensions/weixin/src/auth/pairing.js +0 -2
- package/dist/extensions/weixin/src/auth/weixin-account-id.js +0 -2
- package/dist/extensions/weixin/src/cdn/aes-ecb.js +0 -2
- package/dist/extensions/weixin/src/cdn/cdn-upload.js +0 -2
- package/dist/extensions/weixin/src/cdn/cdn-url.js +0 -2
- package/dist/extensions/weixin/src/cdn/pic-decrypt.js +0 -2
- package/dist/extensions/weixin/src/cdn/upload.js +0 -2
- package/dist/extensions/weixin/src/cli/gateway-qr-login.js +0 -2
- package/dist/extensions/weixin/src/cli/qr-login.js +0 -2
- package/dist/extensions/weixin/src/config-schema.js +0 -2
- package/dist/extensions/weixin/src/config-surface.js +0 -2
- package/dist/extensions/weixin/src/delivery-to.js +0 -2
- package/dist/extensions/weixin/src/index.js +0 -2
- package/dist/extensions/weixin/src/media/data-url.js +0 -2
- package/dist/extensions/weixin/src/media/media-download.js +0 -2
- package/dist/extensions/weixin/src/media/mime.js +0 -2
- package/dist/extensions/weixin/src/media/silk-transcode.js +0 -2
- package/dist/extensions/weixin/src/messaging/context-token-init.js +0 -2
- package/dist/extensions/weixin/src/messaging/debug-mode.js +0 -2
- package/dist/extensions/weixin/src/messaging/error-notice.js +0 -2
- package/dist/extensions/weixin/src/messaging/inbound.js +0 -2
- package/dist/extensions/weixin/src/messaging/markdown-filter.js +0 -2
- package/dist/extensions/weixin/src/messaging/process-message.js +0 -2
- package/dist/extensions/weixin/src/messaging/send-media.js +0 -2
- package/dist/extensions/weixin/src/messaging/send.js +0 -2
- package/dist/extensions/weixin/src/messaging/slash-commands.js +0 -2
- package/dist/extensions/weixin/src/messaging/typing-ticket-store.js +0 -2
- package/dist/extensions/weixin/src/monitor/monitor.js +0 -2
- package/dist/extensions/weixin/src/outbound-send.js +0 -2
- package/dist/extensions/weixin/src/pairing-config-resolver.js +0 -2
- package/dist/extensions/weixin/src/plugin.js +0 -2
- package/dist/extensions/weixin/src/routing-integration.js +0 -2
- package/dist/extensions/weixin/src/storage/state-dir.js +0 -2
- package/dist/extensions/weixin/src/storage/sync-buf.js +0 -2
- package/dist/extensions/weixin/src/util/logger.js +0 -2
- package/dist/extensions/weixin/src/util/random.js +0 -2
- package/dist/extensions/weixin/src/util/redact.js +0 -2
- package/dist/extensions/weixin/src/workflow-progress.js +0 -2
- package/dist/gateway/static/root/assets/{activity-store-B5h0UGWn.js → activity-store-B3YP7y9d.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Dy5VvLUq.js → agent-avatar-dicebear-BaP05tRU.js} +1 -1
- package/dist/gateway/static/root/assets/agents-QArUBYV7.js +2 -0
- package/dist/gateway/static/root/assets/{api-B3J2AmQW.js → api-BirUfJgj.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-BbSLDubO.js → app-management-settings-panel-D5Cg_a6I.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-D9wK0UKA.js → appearance-settings-BBsAkJ56.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-D1uAUndU.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-DaDK-FYa.js → archive-plugin-D3OmrvFx.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-CKiBdU_s.js → attachment-load-Cgkm_5mb.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-suggestion-card-8Qbnxq-p.js → automation-suggestion-card-CHvxSz-t.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-BWQk03Vu.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-ByZbwN2A.js → binary-plugins-dJR5UuzL.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-DGaI2ucU.js → block-editor-v4_7o92L.js} +5 -5
- package/dist/gateway/static/root/assets/browser-settings-page-SruFGuBP.js +8 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-DaPf3b5d.js → capability-presets-api-BcTjPLiD.js} +1 -1
- package/dist/gateway/static/root/assets/{capability-presets-settings-panel-C0iHFbY9.js → capability-presets-settings-panel-CddBf58y.js} +2 -2
- package/dist/gateway/static/root/assets/{channel-recipient-api-DrbkoYyF.js → channel-recipient-api-BbDlMRm5.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-WI5tQ5tn.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-Dt2EROlf.js +1 -0
- package/dist/gateway/static/root/assets/{connector-logo-CiHea96v.js → connector-logo-BNthqff-.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-DavHJ6rR.js +2 -0
- package/dist/gateway/static/root/assets/desktop-pet-CVajXkdj.js +1 -0
- package/dist/gateway/static/root/assets/desktop-pet-settings-SHI66eIi.js +1 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-g_N_ROC-.js → directory-picker-path-field-BdWd7m-p.js} +1 -1
- package/dist/gateway/static/root/assets/{dreaming-settings-DnEe0Mxg.js → dreaming-settings-CXDhu3Me.js} +3 -3
- package/dist/gateway/static/root/assets/{extension-debug-page-DPkoOQED.js → extension-debug-page-CLJTGozU.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-Cf_gDelx.js → extension-page-ClxpGfzA.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-YlXpJV9k.js → extension-settings-page-CDA3ZJ8k.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-BxHgXB-I.js → gateway-config-api-DpXL78pS.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-Co-mXFP_.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-ChI88pp7.js → gateway-startup-retry-D0SU7dte.js} +1 -1
- package/dist/gateway/static/root/assets/{goal-create-dialog-ClzciTH5.js → goal-create-dialog-BO6G--Ec.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-DK8eog4h.js +4 -0
- package/dist/gateway/static/root/assets/{goals-config-api-NoJKU8UZ.js → goals-config-api-r71aDqix.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-AcROW97U.js +2 -0
- package/dist/gateway/static/root/assets/{goals-settings-kQ1pBOM9.js → goals-settings-CZOLhkTH.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-C6jSQCXQ.js → heartbeat-settings-F9S1gIFo.js} +1 -1
- package/dist/gateway/static/root/assets/index-C46C7Xee.css +1 -0
- package/dist/gateway/static/root/assets/{index-twNrYC3D.js → index-IPmCli0N.js} +70 -70
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CIQ6wLqH.js → keyboard-shortcuts-settings-B3CUVfZ8.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-HVq6NUvQ.js +2 -0
- package/dist/gateway/static/root/assets/{local-apps-page-BO6odwNn.js → local-apps-page-n7YJfRkU.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-BP67jtYG.js → locale-store-BvcHGPHU.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-Dgko6r04.js +7 -0
- package/dist/gateway/static/root/assets/{markdown-split-DbJZwtmM.js → markdown-split-1mnXr-JA.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-B0WH561o.js → media-plugins-D2bcxXrT.js} +1 -1
- package/dist/gateway/static/root/assets/messages-BH7paqYt.js +5 -0
- package/dist/gateway/static/root/assets/models-hub-panel-DD0cEfmR.js +2 -0
- package/dist/gateway/static/root/assets/{notes-page-B72S7M1Z.js → notes-page-Wjc2utlj.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-BkA2yg9K.js +4 -0
- package/dist/gateway/static/root/assets/{page-tabs-LjSEtOvG.js → page-tabs-vdljrKuG.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-Cn8Jp9jw.js → preview-open-alternatives-BHki0l-E.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-CXwVNLgg.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-DlfvNcLh.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-BQyEX2Ui.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-BDUPII5R.js → save-bar-controls-Vy4EmvEh.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-B1NY9MNs.js → schedule-field-CVcwC7k_.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-CnsFMun1.js → schema-form-DhMA1vkR.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-CqQEW8oT.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-M8fleFSc.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-D9jJ6KlR.js → settings-collapsible-section-C0xcL0vB.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-36IjMuUY.js → settings-form-section-Cgj4iVpx.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-DyYMmawg.js → settings-loading-skeleton-CC_NmD69.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-yv4TeHfF.js → settings-page-B7_JZ2rM.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-BAP5LguT.js → settings-page-layout-CKuQT4SG.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-DvR8Y5YN.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-BBxZ9lX5.js → share-preview-page-BmVw-6SJ.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-C0JYYhGx.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DBFBczqN.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-KAI9qBDD.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-B3ceUo4i.js → system-settings-panel-D6d8VAk8.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-_efiWyB8.js → theme-store-EbMQ3TYi.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-Dp1PvxGZ.js → typed-models-lib-D63hJX-S.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-XHelnCa_.js → use-channel-catalog-D-I-qki9.js} +1 -1
- package/dist/gateway/static/root/assets/user-context-page-Cuft-EbR.js +1 -0
- package/dist/gateway/static/root/assets/{user-profile-fields-editor-nOOg0uBi.js → user-profile-fields-editor-CPaoS8Zl.js} +1 -1
- package/dist/gateway/static/root/assets/{user-profile-settings-panel-9fBPCoA9.js → user-profile-settings-panel-Bs13qcx1.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-3AORlPIm.js → utils-3mnkFvPw.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-C716UEi9.js +1 -0
- package/dist/gateway/static/root/assets/work-discovery-page-CFSkHa0v.js +1 -0
- package/dist/gateway/static/root/assets/work-item-detail-page-DaapBdoZ.js +1 -0
- package/dist/gateway/static/root/assets/work-page-DMtX92vs.js +1 -0
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-B9FnZNWZ.js +3 -0
- package/dist/gateway/static/root/assets/workflows-page-BgvE0_Iv.js +11 -0
- package/dist/gateway/static/root/favicon.svg +1 -187
- package/dist/gateway/static/root/index.html +7 -7
- package/dist/gateway/static/root/logo-dark.svg +1 -185
- package/dist/gateway/static/root/logo.svg +1 -185
- package/dist/package.js +1 -3
- package/dist/src/activity/context.js +0 -2
- package/dist/src/activity/emitter.js +0 -2
- package/dist/src/activity/service.js +0 -2
- package/dist/src/agent/agent-manager.js +0 -2
- package/dist/src/agent/agent-scope.js +0 -2
- package/dist/src/agent/background-review/coordinator.js +0 -2
- package/dist/src/agent/background-review/prompts.js +0 -2
- package/dist/src/agent/background-review/run-background-review.js +0 -2
- package/dist/src/agent/background-review/settings.js +0 -2
- package/dist/src/agent/bootstrap/bootstrap-cache.js +0 -2
- package/dist/src/agent/bootstrap/bootstrap-context.js +0 -2
- package/dist/src/agent/bootstrap/bootstrap-files.js +0 -2
- package/dist/src/agent/bootstrap/filter-bootstrap-files.js +0 -2
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +0 -2
- package/dist/src/agent/bootstrap/project-agents-context.js +0 -2
- package/dist/src/agent/capabilities/definitions.js +0 -2
- package/dist/src/agent/capabilities/registry.js +0 -2
- package/dist/src/agent/child-agent-factory.js +0 -2
- package/dist/src/agent/client-error-format.js +0 -2
- package/dist/src/agent/code-intelligence/binary.js +0 -2
- package/dist/src/agent/code-intelligence/runtime.js +0 -2
- package/dist/src/agent/code-intelligence/tools.js +0 -2
- package/dist/src/agent/coding/turn-diff-tracker.js +0 -2
- package/dist/src/agent/context/expand-at-file-mentions.js +0 -2
- package/dist/src/agent/context/project-context.js +0 -2
- package/dist/src/agent/context/workspace-seed.js +0 -2
- package/dist/src/agent/context/workspace-state.js +0 -2
- package/dist/src/agent/context/workspace.js +0 -2
- package/dist/src/agent/embedded/run-for-session.js +0 -2
- package/dist/src/agent/embedded/run-turn.js +0 -2
- package/dist/src/agent/embedded/runs.js +0 -2
- package/dist/src/agent/embedded/session-manager-init.js +0 -2
- package/dist/src/agent/embedded/session-runner.js +0 -2
- package/dist/src/agent/embedded/session-tool-result-guard.js +0 -2
- package/dist/src/agent/embedded/sqlite-hydrating-session-manager.js +0 -2
- package/dist/src/agent/embedded/subscribe-session.js +0 -2
- package/dist/src/agent/embedded/system-prompt-override.js +0 -2
- package/dist/src/agent/embedded/tool-result-context-guard.js +0 -2
- package/dist/src/agent/embedded/tool-result-truncation.js +0 -2
- package/dist/src/agent/embedded/xopc-auth-storage.js +0 -2
- package/dist/src/agent/embedded/xopc-stream-bridge.js +0 -2
- package/dist/src/agent/embedded/xopc-tools-bridge.js +0 -2
- package/dist/src/agent/failover-error.js +0 -2
- package/dist/src/agent/fallback/candidates.js +0 -2
- package/dist/src/agent/fallback/reason.js +0 -2
- package/dist/src/agent/feedback/feedback-coordinator.js +0 -2
- package/dist/src/agent/goals/checklist-judge.js +0 -2
- package/dist/src/agent/goals/checklist-types.js +0 -2
- package/dist/src/agent/goals/evaluate-turn.js +0 -2
- package/dist/src/agent/goals/goal-locale.js +0 -2
- package/dist/src/agent/goals/judge.js +0 -2
- package/dist/src/agent/goals/persistent-goal-service.js +0 -2
- package/dist/src/agent/goals/post-turn.js +0 -2
- package/dist/src/agent/goals/state.js +0 -2
- package/dist/src/agent/image/generation/bundled-registry.js +0 -2
- package/dist/src/agent/image/generation/bundled.js +0 -2
- package/dist/src/agent/image/generation/image-assets.js +0 -2
- package/dist/src/agent/image/generation/model-ref.js +0 -2
- package/dist/src/agent/image/generation/normalization.js +0 -2
- package/dist/src/agent/image/generation/openai-compatible-image-provider.js +0 -2
- package/dist/src/agent/image/generation/provider-registry.js +0 -2
- package/dist/src/agent/image/generation/runtime.js +0 -2
- package/dist/src/agent/image/image-helpers.js +0 -2
- package/dist/src/agent/image/image-model-fallback.js +0 -2
- package/dist/src/agent/image/inbound-image-handling.js +0 -2
- package/dist/src/agent/image/load-image-media.js +0 -2
- package/dist/src/agent/image/tool-model-config.js +0 -2
- package/dist/src/agent/image/understanding/pi-ai-provider.js +0 -2
- package/dist/src/agent/image/understanding/provider-registry.js +0 -2
- package/dist/src/agent/image/understanding/runtime.js +0 -2
- package/dist/src/agent/image/vision-detection.js +0 -2
- package/dist/src/agent/inbound/attachment-pipeline.js +0 -2
- package/dist/src/agent/inbound/inbound-loop.js +0 -2
- package/dist/src/agent/inbound/turn-dispatcher.js +0 -2
- package/dist/src/agent/ipc/bus.js +0 -2
- package/dist/src/agent/ipc/inbox.js +0 -2
- package/dist/src/agent/ipc/socket.js +0 -2
- package/dist/src/agent/ipc/types.js +0 -2
- package/dist/src/agent/lifecycle/handlers/compaction.js +0 -2
- package/dist/src/agent/lifecycle/hook-handler.js +0 -2
- package/dist/src/agent/lifecycle/manager.js +0 -2
- package/dist/src/agent/lifecycle/progress.js +0 -2
- package/dist/src/agent/lifecycle/timeout-wrapper.js +0 -2
- package/dist/src/agent/lifecycle/typing.js +0 -2
- package/dist/src/agent/mcp/bundle-mcp-config.js +0 -2
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +0 -2
- package/dist/src/agent/mcp/bundle-mcp-names.js +0 -2
- package/dist/src/agent/mcp/bundle-mcp-policy.js +0 -2
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +0 -2
- package/dist/src/agent/mcp/embedded-mcp.js +0 -2
- package/dist/src/agent/mcp/mcp-config-shared.js +0 -2
- package/dist/src/agent/mcp/mcp-http.js +0 -2
- package/dist/src/agent/mcp/mcp-stdio-transport.js +0 -2
- package/dist/src/agent/mcp/mcp-stdio.js +0 -2
- package/dist/src/agent/mcp/mcp-tool-meta.js +0 -2
- package/dist/src/agent/mcp/mcp-transport-config.js +0 -2
- package/dist/src/agent/mcp/mcp-transport.js +0 -2
- package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js +0 -2
- package/dist/src/agent/media-generation/model-ref.js +0 -2
- package/dist/src/agent/media-generation/normalization.types.js +0 -2
- package/dist/src/agent/media-generation/runtime-shared.js +0 -2
- package/dist/src/agent/memory/agent-message-access.js +0 -2
- package/dist/src/agent/memory/builtin-memory-store.js +0 -2
- package/dist/src/agent/memory/builtin-provider.js +0 -2
- package/dist/src/agent/memory/compaction.js +0 -2
- package/dist/src/agent/memory/context/planner.js +0 -2
- package/dist/src/agent/memory/context-fence.js +0 -2
- package/dist/src/agent/memory/create-memory-manager.js +0 -2
- package/dist/src/agent/memory/dreaming/config.js +0 -2
- package/dist/src/agent/memory/dreaming/constants.js +0 -2
- package/dist/src/agent/memory/dreaming/deep-promotion.js +0 -2
- package/dist/src/agent/memory/dreaming/events.js +0 -2
- package/dist/src/agent/memory/dreaming/last-run.js +0 -2
- package/dist/src/agent/memory/dreaming/light-sweep.js +0 -2
- package/dist/src/agent/memory/dreaming/preview.js +0 -2
- package/dist/src/agent/memory/dreaming/promotion-lifecycle.js +0 -2
- package/dist/src/agent/memory/dreaming/rem-patterns.js +0 -2
- package/dist/src/agent/memory/dreaming/scope.js +0 -2
- package/dist/src/agent/memory/dreaming/short-term-store.js +0 -2
- package/dist/src/agent/memory/dreaming/utils.js +0 -2
- package/dist/src/agent/memory/lifecycle.js +0 -2
- package/dist/src/agent/memory/manager.js +0 -2
- package/dist/src/agent/memory/memory-config.js +0 -2
- package/dist/src/agent/memory/message-sanitizer.js +0 -2
- package/dist/src/agent/memory/plugin-discovery.js +0 -2
- package/dist/src/agent/memory/sensitivity.js +0 -2
- package/dist/src/agent/memory/source-origin.js +0 -2
- package/dist/src/agent/memory/stub-memory-provider.js +0 -2
- package/dist/src/agent/memory/summary-generator.js +0 -2
- package/dist/src/agent/memory/understanding/correction.js +0 -2
- package/dist/src/agent/memory/understanding/quality.js +0 -2
- package/dist/src/agent/memory/understanding/service.js +0 -2
- package/dist/src/agent/memory/user-context-coordinator.js +0 -2
- package/dist/src/agent/memory/user-message-text.js +0 -2
- package/dist/src/agent/memory/window.js +0 -2
- package/dist/src/agent/messaging/command-handler.js +0 -2
- package/dist/src/agent/messaging/message-router.js +0 -2
- package/dist/src/agent/messaging/outbound-coordinator.js +0 -2
- package/dist/src/agent/messaging/stream-manager.js +0 -2
- package/dist/src/agent/middleware/context.js +0 -2
- package/dist/src/agent/middleware/self-verify.js +0 -2
- package/dist/src/agent/models/manager.js +0 -2
- package/dist/src/agent/models/request-limiter.js +0 -2
- package/dist/src/agent/models/selection.js +0 -2
- package/dist/src/agent/orchestration/agent-event-handler.js +0 -2
- package/dist/src/agent/orchestration/agent-orchestrator.js +0 -2
- package/dist/src/agent/orchestration/llm-turn-retry.js +0 -2
- package/dist/src/agent/orchestration/loop-guard.js +0 -2
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +0 -2
- package/dist/src/agent/prompt/cache-boundary.js +0 -2
- package/dist/src/agent/prompt/memory/index.js +0 -2
- package/dist/src/agent/prompt/safety.js +0 -2
- package/dist/src/agent/prompt/sanitize-for-prompt.js +0 -2
- package/dist/src/agent/prompt/sections/behavior.js +0 -2
- package/dist/src/agent/prompt/sections/memory-skills.js +0 -2
- package/dist/src/agent/prompt/sections/messaging-runtime.js +0 -2
- package/dist/src/agent/prompt/sections/project-context.js +0 -2
- package/dist/src/agent/prompt/sections/tooling.js +0 -2
- package/dist/src/agent/prompt/sections/workspace-runtime.js +0 -2
- package/dist/src/agent/prompt/service-prompt-builder.js +0 -2
- package/dist/src/agent/prompt/subagent-context.js +0 -2
- package/dist/src/agent/prompt/system-prompt-params.js +0 -2
- package/dist/src/agent/prompt/system-prompt.js +0 -2
- package/dist/src/agent/prompt/system-reminder.js +0 -2
- package/dist/src/agent/reply/apply-turn-user-enrichment.js +0 -2
- package/dist/src/agent/reply/post-compaction-context.js +0 -2
- package/dist/src/agent/reply/startup-context.js +0 -2
- package/dist/src/agent/reply/workspace-boundary-read.js +0 -2
- package/dist/src/agent/sandbox/command-validator.js +0 -2
- package/dist/src/agent/sandbox/exec-policy.js +0 -2
- package/dist/src/agent/sandbox/path-policy.js +0 -2
- package/dist/src/agent/sandbox/sanitize-env-vars.js +0 -2
- package/dist/src/agent/sandbox/types.js +0 -2
- package/dist/src/agent/service/async-queue.js +0 -2
- package/dist/src/agent/service/btw-query.js +0 -2
- package/dist/src/agent/service/build-direct-message-content.js +0 -2
- package/dist/src/agent/service/direct-turn-helpers.js +0 -2
- package/dist/src/agent/service/parse-outbound-session-key.js +0 -2
- package/dist/src/agent/service/process-direct-one-shot.js +0 -2
- package/dist/src/agent/service/process-direct-streaming.js +0 -2
- package/dist/src/agent/service/session-context-report.js +0 -2
- package/dist/src/agent/service/webchat-tts.js +0 -2
- package/dist/src/agent/service-inbound-utils.js +0 -2
- package/dist/src/agent/service.js +0 -2
- package/dist/src/agent/session/session-config-service.js +0 -2
- package/dist/src/agent/session/session-context.js +0 -2
- package/dist/src/agent/session/session-hydrator.js +0 -2
- package/dist/src/agent/session/session-inspector.js +0 -2
- package/dist/src/agent/session/session-lifecycle.js +0 -2
- package/dist/src/agent/session/session-state-bag.js +0 -2
- package/dist/src/agent/session/tracker.js +0 -2
- package/dist/src/agent/skills/config.js +0 -2
- package/dist/src/agent/skills/filesystem-watcher.js +0 -2
- package/dist/src/agent/skills/format-skills-prompt.js +0 -2
- package/dist/src/agent/skills/hub-hash.js +0 -2
- package/dist/src/agent/skills/hub-lock.js +0 -2
- package/dist/src/agent/skills/hub-pull.js +0 -2
- package/dist/src/agent/skills/index.js +0 -2
- package/dist/src/agent/skills/install-target.js +0 -2
- package/dist/src/agent/skills/installer.js +0 -2
- package/dist/src/agent/skills/managed-store.js +0 -2
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +0 -2
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +0 -2
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +0 -2
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +0 -2
- package/dist/src/agent/skills/marketplace/marketplace-category-order.js +0 -2
- package/dist/src/agent/skills/marketplace/registry.js +0 -2
- package/dist/src/agent/skills/marketplace/resolve-adapter.js +0 -2
- package/dist/src/agent/skills/parse-skill-metadata.js +0 -2
- package/dist/src/agent/skills/required-env-vars.js +0 -2
- package/dist/src/agent/skills/scanner.js +0 -2
- package/dist/src/agent/skills/skill-manage-ops.js +0 -2
- package/dist/src/agent/skills/skill-manager.js +0 -2
- package/dist/src/agent/skills/skill-markdown-preview-from-raw.js +0 -2
- package/dist/src/agent/skills/skill-tool-gating.js +0 -2
- package/dist/src/agent/skills/skill-view-path.js +0 -2
- package/dist/src/agent/skills/skills-marketplace.js +0 -2
- package/dist/src/agent/skills/test-framework.js +0 -2
- package/dist/src/agent/skills/watcher.js +0 -2
- package/dist/src/agent/skills/workspace-skills-dir.js +0 -2
- package/dist/src/agent/source-context/injector.js +0 -2
- package/dist/src/agent/source-context/types.js +0 -2
- package/dist/src/agent/starter-agents.js +0 -2
- package/dist/src/agent/streaming/reasoning-visibility-sse.js +0 -2
- package/dist/src/agent/tool-manuals/browser.js +0 -2
- package/dist/src/agent/tool-manuals/index.js +0 -2
- package/dist/src/agent/tool-manuals/xopc-use.js +0 -2
- package/dist/src/agent/tools/apply-patch.js +0 -2
- package/dist/src/agent/tools/automation-tool.js +0 -2
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +0 -2
- package/dist/src/agent/tools/browser/tool/schemas.js +0 -2
- package/dist/src/agent/tools/chain-tracker.js +0 -2
- package/dist/src/agent/tools/clarify-tool.js +0 -2
- package/dist/src/agent/tools/cli-clarify.js +0 -2
- package/dist/src/agent/tools/communication.js +0 -2
- package/dist/src/agent/tools/composio-tool.js +0 -2
- package/dist/src/agent/tools/concurrency.js +0 -2
- package/dist/src/agent/tools/create-share-tool.js +0 -2
- package/dist/src/agent/tools/curated-memory-tool.js +0 -2
- package/dist/src/agent/tools/delegate-tool.js +0 -2
- package/dist/src/agent/tools/desktop-pet-tool.d.ts +12 -0
- package/dist/src/agent/tools/desktop-pet-tool.js +28 -2
- package/dist/src/agent/tools/dreaming-tool.js +0 -2
- package/dist/src/agent/tools/edit-diff.js +0 -2
- package/dist/src/agent/tools/error-pattern-matcher.js +0 -2
- package/dist/src/agent/tools/error-tracker.js +0 -2
- package/dist/src/agent/tools/exec-command.js +0 -2
- package/dist/src/agent/tools/execute-code-tool.js +0 -2
- package/dist/src/agent/tools/executor.js +0 -2
- package/dist/src/agent/tools/factory.js +0 -2
- package/dist/src/agent/tools/find.js +0 -2
- package/dist/src/agent/tools/goal-evidence-recorder.js +0 -2
- package/dist/src/agent/tools/goal-tool.js +0 -2
- package/dist/src/agent/tools/grep.js +0 -2
- package/dist/src/agent/tools/image-generate-tool.js +0 -2
- package/dist/src/agent/tools/image-tool.js +0 -2
- package/dist/src/agent/tools/list-dir.js +0 -2
- package/dist/src/agent/tools/media-read-tool.js +0 -2
- package/dist/src/agent/tools/memory-tool.js +0 -2
- package/dist/src/agent/tools/metadata.js +0 -2
- package/dist/src/agent/tools/read.js +0 -2
- package/dist/src/agent/tools/search/http.js +0 -2
- package/dist/src/agent/tools/search/providers/bing-api.js +0 -2
- package/dist/src/agent/tools/search/providers/bing-html.js +0 -2
- package/dist/src/agent/tools/search/providers/brave.js +0 -2
- package/dist/src/agent/tools/search/providers/duckduckgo-html.js +0 -2
- package/dist/src/agent/tools/search/providers/searxng.js +0 -2
- package/dist/src/agent/tools/search/providers/tavily.js +0 -2
- package/dist/src/agent/tools/search/region.js +0 -2
- package/dist/src/agent/tools/search/registry.js +0 -2
- package/dist/src/agent/tools/search/resolve-config.js +0 -2
- package/dist/src/agent/tools/send-media.js +0 -2
- package/dist/src/agent/tools/session-search-tool.js +0 -2
- package/dist/src/agent/tools/session-status-tool.js +0 -2
- package/dist/src/agent/tools/skill-install-tool.js +0 -2
- package/dist/src/agent/tools/skill-manage-tool.js +0 -2
- package/dist/src/agent/tools/skills-tools.js +0 -2
- package/dist/src/agent/tools/structured-output.js +0 -2
- package/dist/src/agent/tools/todo-tool.js +0 -2
- package/dist/src/agent/tools/tool-manual-tool.js +0 -2
- package/dist/src/agent/tools/tool-paths.js +0 -2
- package/dist/src/agent/tools/truncate.js +0 -2
- package/dist/src/agent/tools/tts-tool.js +0 -2
- package/dist/src/agent/tools/update-plan-tool.js +0 -2
- package/dist/src/agent/tools/url-safety.js +0 -2
- package/dist/src/agent/tools/usage-analyzer.js +0 -2
- package/dist/src/agent/tools/web-extract.js +0 -2
- package/dist/src/agent/tools/web.js +4 -4
- package/dist/src/agent/tools/workflow-tool.js +0 -2
- package/dist/src/agent/tools/write.js +0 -2
- package/dist/src/agent/tools/xopc-use-tool.js +0 -2
- package/dist/src/agent/transcript/google-api.js +0 -2
- package/dist/src/agent/transcript/model-selection.js +0 -2
- package/dist/src/agent/transcript/provider-capabilities.js +0 -2
- package/dist/src/agent/transcript/session-transcript-repair.js +0 -2
- package/dist/src/agent/transcript/strip-tool-messages.js +0 -2
- package/dist/src/agent/transcript/thinking-types.js +0 -2
- package/dist/src/agent/transcript/thinking.js +0 -2
- package/dist/src/agent/transcript/tool-call-id.js +0 -2
- package/dist/src/agent/transcript/transcript-hygiene.js +0 -2
- package/dist/src/agent/transcript/transcript-policy.js +0 -2
- package/dist/src/agent/workflow/agent-progress.js +0 -2
- package/dist/src/agent/workflow/builtins/index.js +0 -2
- package/dist/src/agent/workflow/catalog.js +0 -2
- package/dist/src/agent/workflow/progress-broker.js +0 -2
- package/dist/src/agent/workflow/snapshot-empty.js +0 -2
- package/dist/src/agent/workflow/snapshot.js +0 -2
- package/dist/src/agent/workflow/step-labels.js +0 -2
- package/dist/src/agent/workflow/structured-output-tool.js +0 -2
- package/dist/src/agent/workflow/subagent-runner.js +0 -2
- package/dist/src/agent/workflow/workflow-child-tools.js +0 -2
- package/dist/src/agent/workspace-runtime/registry.js +0 -2
- package/dist/src/agent-manifest/index.js +0 -2
- package/dist/src/agent-manifest/preset-chain.js +0 -2
- package/dist/src/agent-manifest/prompt.js +0 -2
- package/dist/src/agent-manifest/resolver.js +0 -2
- package/dist/src/agent-manifest/schema.js +0 -2
- package/dist/src/agent-manifest/validator.js +0 -2
- package/dist/src/agent-runtime/boundary-guard.js +0 -2
- package/dist/src/agent-runtime/memory-runtime.js +0 -2
- package/dist/src/agent-runtime/model-router.js +0 -2
- package/dist/src/agent-runtime/run-trace.js +0 -2
- package/dist/src/agent-runtime/runtime-profile.js +0 -2
- package/dist/src/agent-runtime/tool-registry.js +0 -2
- package/dist/src/agent-runtime/workflow-runtime.js +0 -2
- package/dist/src/ai-assist/text-assist.js +0 -2
- package/dist/src/auth/credentials.js +0 -2
- package/dist/src/auth/index.js +0 -2
- package/dist/src/auth/oauth/anthropic.js +0 -2
- package/dist/src/auth/oauth/github-copilot.js +0 -2
- package/dist/src/auth/oauth/google-oauth/google-antigravity.js +0 -2
- package/dist/src/auth/oauth/google-oauth/google-gemini-cli.js +0 -2
- package/dist/src/auth/oauth/google-oauth/oauth-page.js +0 -2
- package/dist/src/auth/oauth/google-oauth/pkce.js +0 -2
- package/dist/src/auth/oauth/kimi-coding.js +0 -2
- package/dist/src/auth/oauth/minimax-cn.js +0 -2
- package/dist/src/auth/oauth/minimax.js +0 -2
- package/dist/src/auth/oauth/openai-codex.js +0 -2
- package/dist/src/auth/oauth/pkce.js +0 -2
- package/dist/src/auth/profiles/oauth.js +0 -2
- package/dist/src/auth/profiles/order.js +0 -2
- package/dist/src/auth/profiles/profiles.js +0 -2
- package/dist/src/auth/profiles/store.js +0 -2
- package/dist/src/auth/sync-provider-auth.js +0 -2
- package/dist/src/automations/api/routes.js +0 -2
- package/dist/src/automations/domain/schedule.js +0 -2
- package/dist/src/automations/domain/validation.js +0 -2
- package/dist/src/automations/draft/automation-draft-prompt.js +0 -2
- package/dist/src/automations/draft/automation-draft-service.js +0 -2
- package/dist/src/automations/draft/automation-draft-validator.js +0 -2
- package/dist/src/automations/product-events.js +0 -2
- package/dist/src/automations/service/action-executor.js +0 -2
- package/dist/src/automations/service/automation-service.js +0 -2
- package/dist/src/automations/storage/automation-repository.js +0 -2
- package/dist/src/automations/storage/automation-run-repository.js +0 -2
- package/dist/src/browser/actions/extension-registry-bridge.js +0 -2
- package/dist/src/browser/actions/registry.js +0 -2
- package/dist/src/browser/backend-from-config.js +0 -2
- package/dist/src/browser/browser-command-timeout.js +0 -2
- package/dist/src/browser/cache-dir-policy.js +0 -2
- package/dist/src/browser/cdp-local-launcher.js +0 -2
- package/dist/src/browser/cdp-supervisor.js +0 -2
- package/dist/src/browser/free-port.js +0 -2
- package/dist/src/browser/humanize.js +0 -2
- package/dist/src/browser/install-lock.js +0 -2
- package/dist/src/browser/manager.js +0 -2
- package/dist/src/browser/pipeline/output.js +0 -2
- package/dist/src/browser/pipeline/runner.js +0 -2
- package/dist/src/browser/pipeline/schema.js +0 -2
- package/dist/src/browser/pipeline/source.js +0 -2
- package/dist/src/browser/pipeline/template.js +0 -2
- package/dist/src/browser/providers/browser-ext-install.js +0 -2
- package/dist/src/browser/providers/browser-use.js +0 -2
- package/dist/src/browser/providers/browserbase.js +0 -2
- package/dist/src/browser/providers/cloakbrowser.js +0 -2
- package/dist/src/browser/providers/extension-ws-acquire.js +0 -2
- package/dist/src/browser/providers/extension.js +0 -2
- package/dist/src/browser/providers/playwright-doctor.js +13 -4
- package/dist/src/browser/providers/playwright-install.js +0 -2
- package/dist/src/browser/readiness.js +0 -2
- package/dist/src/browser/schemas.js +0 -2
- package/dist/src/browser/session-lifecycle.js +0 -2
- package/dist/src/browser/snapshot-helpers.js +0 -2
- package/dist/src/browser/stealth.js +0 -2
- package/dist/src/browser/url-policy.js +0 -2
- package/dist/src/capabilities/store-connector.js +0 -2
- package/dist/src/channels/attachments/attachment-classifiers.js +0 -2
- package/dist/src/channels/attachments/inbound-persist.js +0 -2
- package/dist/src/channels/attachments/inbound-types.js +0 -2
- package/dist/src/channels/attachments/outbound-tts-persist.js +0 -2
- package/dist/src/channels/attachments/voice-stt-webchat.js +0 -2
- package/dist/src/channels/catalog/channel-catalog-service.js +0 -2
- package/dist/src/channels/config-helpers.js +0 -2
- package/dist/src/channels/envelope-timestamp.js +0 -2
- package/dist/src/channels/exec-approval-runtime.js +0 -2
- package/dist/src/channels/health-monitor.js +0 -2
- package/dist/src/channels/heartbeat-scheduler.js +0 -2
- package/dist/src/channels/internal-outbound.js +0 -2
- package/dist/src/channels/lifecycle-supervisor.js +0 -2
- package/dist/src/channels/manager.js +0 -2
- package/dist/src/channels/media.js +0 -2
- package/dist/src/channels/outbound/deliver.js +0 -2
- package/dist/src/channels/outbound/normalize.js +0 -2
- package/dist/src/channels/outbound/persist-store.js +0 -2
- package/dist/src/channels/outbound/queue.js +0 -2
- package/dist/src/channels/outbound-sender.js +0 -2
- package/dist/src/channels/pairing/allow-from-file.js +0 -2
- package/dist/src/channels/pairing/approve-cli.js +0 -2
- package/dist/src/channels/pairing/pairing-challenge.js +0 -2
- package/dist/src/channels/pairing/pairing-constants.js +0 -2
- package/dist/src/channels/pairing/pairing-events.js +0 -2
- package/dist/src/channels/pairing/pairing-messages.js +0 -2
- package/dist/src/channels/pairing/pairing-service.js +0 -2
- package/dist/src/channels/pairing/pairing-store-adapter.js +0 -2
- package/dist/src/channels/pairing/pairing-store.js +0 -2
- package/dist/src/channels/pairing/paths.js +0 -2
- package/dist/src/channels/pairing/preseed-allow-from.js +0 -2
- package/dist/src/channels/pipeline.js +0 -2
- package/dist/src/channels/plugin-registry.js +0 -2
- package/dist/src/channels/plugins/registry.js +0 -2
- package/dist/src/channels/restart-policy.js +0 -2
- package/dist/src/channels/security-helpers.js +0 -2
- package/dist/src/channels/security.js +0 -2
- package/dist/src/channels/setup-wizard-discovery.js +0 -2
- package/dist/src/chat-commands/agent-edit.js +0 -2
- package/dist/src/chat-commands/builtins/config.js +0 -2
- package/dist/src/chat-commands/builtins/context.js +0 -2
- package/dist/src/chat-commands/builtins/goal.js +0 -2
- package/dist/src/chat-commands/builtins/model.js +0 -2
- package/dist/src/chat-commands/builtins/review.js +0 -2
- package/dist/src/chat-commands/builtins/session.js +0 -2
- package/dist/src/chat-commands/builtins/skill.js +0 -2
- package/dist/src/chat-commands/builtins/subgoal.js +0 -2
- package/dist/src/chat-commands/builtins/system.js +0 -2
- package/dist/src/chat-commands/builtins/thinking.js +0 -2
- package/dist/src/chat-commands/builtins/tts.js +0 -2
- package/dist/src/chat-commands/builtins/workflow.js +0 -2
- package/dist/src/chat-commands/command-parse.js +0 -2
- package/dist/src/chat-commands/config-paths.js +0 -2
- package/dist/src/chat-commands/config-value.js +0 -2
- package/dist/src/chat-commands/context.js +0 -2
- package/dist/src/chat-commands/format-output.js +0 -2
- package/dist/src/chat-commands/index.js +0 -2
- package/dist/src/chat-commands/processor.js +0 -2
- package/dist/src/chat-commands/registry.js +0 -2
- package/dist/src/chat-commands/session-key.js +0 -2
- package/dist/src/cli/argv-invocation.js +0 -2
- package/dist/src/cli/argv.js +0 -2
- package/dist/src/cli/bin.js +0 -2
- package/dist/src/cli/cli-log-level-preset.js +0 -2
- package/dist/src/cli/command-catalog.js +0 -2
- package/dist/src/cli/command-loaders.js +0 -2
- package/dist/src/cli/command-manifest.js +0 -2
- package/dist/src/cli/command-path-matches.js +0 -2
- package/dist/src/cli/command-path-policy.js +0 -2
- package/dist/src/cli/command-startup-policy.js +0 -2
- package/dist/src/cli/commands/agent/interactive.js +0 -2
- package/dist/src/cli/commands/agent/sessions.js +0 -2
- package/dist/src/cli/commands/agent/stream-renderer.js +0 -2
- package/dist/src/cli/commands/agent.js +0 -2
- package/dist/src/cli/commands/agents.js +0 -2
- package/dist/src/cli/commands/auth.js +0 -2
- package/dist/src/cli/commands/browser-cli-helpers.js +0 -2
- package/dist/src/cli/commands/browser.js +0 -2
- package/dist/src/cli/commands/channels.js +0 -2
- package/dist/src/cli/commands/config.js +0 -2
- package/dist/src/cli/commands/connectors.js +0 -2
- package/dist/src/cli/commands/doctor/checks/channel-config.js +0 -2
- package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js +0 -2
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js +0 -2
- package/dist/src/cli/commands/doctor/checks/config-health.js +0 -2
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -3
- package/dist/src/cli/commands/doctor/checks/gateway-health.js +0 -2
- package/dist/src/cli/commands/doctor/checks/gateway-service.js +0 -2
- package/dist/src/cli/commands/doctor/checks/migrations.js +0 -2
- package/dist/src/cli/commands/doctor/checks/node-version.js +0 -2
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +0 -2
- package/dist/src/cli/commands/doctor/checks/security-audit.js +0 -2
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +0 -2
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +0 -2
- package/dist/src/cli/commands/doctor/checks/version-check.js +0 -2
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +0 -2
- package/dist/src/cli/commands/doctor/flow.js +0 -2
- package/dist/src/cli/commands/doctor/format.js +0 -2
- package/dist/src/cli/commands/doctor/index.js +0 -2
- package/dist/src/cli/commands/extension-create.js +0 -2
- package/dist/src/cli/commands/extension-dev.js +0 -2
- package/dist/src/cli/commands/extension-marketplace.js +0 -2
- package/dist/src/cli/commands/extension-pack.js +0 -2
- package/dist/src/cli/commands/extension.js +0 -2
- package/dist/src/cli/commands/gateway/call.js +0 -2
- package/dist/src/cli/commands/gateway/health.js +0 -2
- package/dist/src/cli/commands/gateway/lifecycle-core.js +0 -2
- package/dist/src/cli/commands/gateway/lifecycle.js +0 -2
- package/dist/src/cli/commands/gateway/logs.js +0 -2
- package/dist/src/cli/commands/gateway/probe.js +0 -2
- package/dist/src/cli/commands/gateway/restart-health.js +0 -2
- package/dist/src/cli/commands/gateway/restart.js +0 -2
- package/dist/src/cli/commands/gateway/run-foreground.js +0 -2
- package/dist/src/cli/commands/gateway/service.js +0 -2
- package/dist/src/cli/commands/gateway/shared.js +0 -2
- package/dist/src/cli/commands/gateway/status.js +0 -2
- package/dist/src/cli/commands/gateway/stop.js +0 -2
- package/dist/src/cli/commands/gateway/subcommands.js +0 -2
- package/dist/src/cli/commands/gateway/token.js +0 -2
- package/dist/src/cli/commands/gateway-ssh-tunnel.js +0 -2
- package/dist/src/cli/commands/gateway.js +0 -2
- package/dist/src/cli/commands/goal.js +0 -2
- package/dist/src/cli/commands/image.js +0 -2
- package/dist/src/cli/commands/init.js +0 -2
- package/dist/src/cli/commands/logs.js +0 -2
- package/dist/src/cli/commands/models.js +0 -2
- package/dist/src/cli/commands/onboard/channels/index.js +0 -2
- package/dist/src/cli/commands/onboard/channels/onboard-to-configurator.js +0 -2
- package/dist/src/cli/commands/onboard/channels/registry.js +0 -2
- package/dist/src/cli/commands/onboard/channels/wizard-to-configurator.js +0 -2
- package/dist/src/cli/commands/onboard/gateway.js +0 -2
- package/dist/src/cli/commands/onboard/model.js +0 -2
- package/dist/src/cli/commands/onboard.js +0 -2
- package/dist/src/cli/commands/profile.js +0 -2
- package/dist/src/cli/commands/project.js +0 -2
- package/dist/src/cli/commands/providers.js +0 -2
- package/dist/src/cli/commands/resume.js +0 -2
- package/dist/src/cli/commands/search.js +0 -2
- package/dist/src/cli/commands/session/actions.js +0 -2
- package/dist/src/cli/commands/session/utils.js +0 -2
- package/dist/src/cli/commands/session.js +0 -2
- package/dist/src/cli/commands/setup-shared/output.js +0 -2
- package/dist/src/cli/commands/setup-shared/prompts.js +0 -2
- package/dist/src/cli/commands/setup-shared/runner.js +0 -2
- package/dist/src/cli/commands/setup-shared/types.js +0 -2
- package/dist/src/cli/commands/setup.js +0 -2
- package/dist/src/cli/commands/skills-test.js +0 -2
- package/dist/src/cli/commands/skills.js +0 -2
- package/dist/src/cli/commands/tailscale.js +0 -2
- package/dist/src/cli/commands/tui-runner.js +0 -2
- package/dist/src/cli/commands/tui.js +0 -2
- package/dist/src/cli/commands/tunnel.js +0 -2
- package/dist/src/cli/commands/update.js +0 -2
- package/dist/src/cli/commands/voice.js +0 -2
- package/dist/src/cli/context.js +0 -2
- package/dist/src/cli/extension-cli-register.js +0 -2
- package/dist/src/cli/gateway-run-argv.js +0 -2
- package/dist/src/cli/gateway-run-fast-path.js +0 -2
- package/dist/src/cli/index.js +0 -2
- package/dist/src/cli/registry.js +0 -2
- package/dist/src/cli/templates.js +0 -2
- package/dist/src/cli/utils/colors.js +0 -2
- package/dist/src/cli/utils/gateway-client-options.js +0 -2
- package/dist/src/cli/utils/gateway-client.js +0 -2
- package/dist/src/cli/utils/init-workspace-core.js +0 -2
- package/dist/src/cli/utils/init-workspace.js +0 -2
- package/dist/src/cli/utils/oauth-login.js +0 -2
- package/dist/src/cli/utils/oauth-providers.js +0 -2
- package/dist/src/cli/utils/session.js +0 -2
- package/dist/src/commands/agents.config.js +0 -2
- package/dist/src/config/agent-profile.js +1 -3
- package/dist/src/config/agent-typed-models.js +0 -2
- package/dist/src/config/commands.flags.js +0 -2
- package/dist/src/config/default-model.js +0 -2
- package/dist/src/config/diff.js +0 -2
- package/dist/src/config/gateway-bind.js +0 -2
- package/dist/src/config/index.js +0 -2
- package/dist/src/config/loader.js +0 -2
- package/dist/src/config/mcp-config-normalize.js +0 -2
- package/dist/src/config/model-input.js +0 -2
- package/dist/src/config/models-json.js +0 -2
- package/dist/src/config/paths-state.js +0 -2
- package/dist/src/config/paths.js +0 -2
- package/dist/src/config/profile.js +0 -2
- package/dist/src/config/public-url.js +0 -2
- package/dist/src/config/reload.js +0 -2
- package/dist/src/config/resolve-config-value.js +0 -2
- package/dist/src/config/rules.js +0 -2
- package/dist/src/config/runtime-overrides.js +0 -2
- package/dist/src/config/schema.js +0 -2
- package/dist/src/config/validate-channel-configs.js +0 -2
- package/dist/src/config/voice.js +0 -2
- package/dist/src/config/web-patch.js +0 -2
- package/dist/src/config/workspace-defaults.js +0 -2
- package/dist/src/config/workspace-dirs.js +0 -2
- package/dist/src/config/workspace-path-helpers.js +0 -2
- package/dist/src/config/workspace-path.js +0 -2
- package/dist/src/connectors/approval.js +0 -2
- package/dist/src/connectors/auth-provider-registry.js +0 -2
- package/dist/src/connectors/builtin-catalog.js +0 -2
- package/dist/src/connectors/catalog.js +0 -2
- package/dist/src/connectors/composio-catalog.js +0 -2
- package/dist/src/connectors/composio-logo.js +0 -2
- package/dist/src/connectors/composio-sessions.js +9 -5
- package/dist/src/connectors/composio-triggers.js +0 -2
- package/dist/src/connectors/composio.js +0 -2
- package/dist/src/connectors/connector-memory-sync.js +0 -2
- package/dist/src/connectors/health.js +0 -2
- package/dist/src/connectors/install.js +0 -2
- package/dist/src/connectors/instances.js +0 -2
- package/dist/src/connectors/integration-strategy.js +0 -2
- package/dist/src/connectors/lifecycle.js +0 -2
- package/dist/src/connectors/materialize.js +0 -2
- package/dist/src/connectors/policy.js +0 -2
- package/dist/src/connectors/providers.js +0 -2
- package/dist/src/connectors/registries/modelscope.js +0 -2
- package/dist/src/connectors/registries/official-mcp.js +0 -2
- package/dist/src/connectors/registries/search.js +0 -2
- package/dist/src/connectors/registries/smithery.js +0 -2
- package/dist/src/connectors/runtime-adapter-registry.js +0 -2
- package/dist/src/connectors/secret-store.js +0 -2
- package/dist/src/connectors/setup-secrets.js +0 -2
- package/dist/src/connectors/supervisor.js +0 -2
- package/dist/src/connectors/usage.js +0 -2
- package/dist/src/connectors/workflow-preflight.js +0 -2
- package/dist/src/daemon/constants.js +0 -2
- package/dist/src/daemon/install-plan.js +0 -2
- package/dist/src/daemon/launchd.js +0 -2
- package/dist/src/daemon/schtasks.js +0 -2
- package/dist/src/daemon/service-audit.js +0 -2
- package/dist/src/daemon/service.js +0 -2
- package/dist/src/daemon/systemd.js +0 -2
- package/dist/src/document-understanding/extract.js +0 -2
- package/dist/src/errors/index.js +0 -2
- package/dist/src/extensions/activation-context.js +0 -2
- package/dist/src/extensions/activation-planner.js +0 -2
- package/dist/src/extensions/api.js +0 -2
- package/dist/src/extensions/bundle-mcp.js +0 -2
- package/dist/src/extensions/bundled-extension-activation.js +0 -2
- package/dist/src/extensions/diagnostics.js +0 -2
- package/dist/src/extensions/discover-extensions.js +0 -2
- package/dist/src/extensions/engine-check.js +0 -2
- package/dist/src/extensions/extension-metadata-snapshot.js +0 -2
- package/dist/src/extensions/extension-registry-impl.js +0 -2
- package/dist/src/extensions/health.js +0 -2
- package/dist/src/extensions/hooks.js +0 -2
- package/dist/src/extensions/index.js +0 -2
- package/dist/src/extensions/install-transaction.js +0 -2
- package/dist/src/extensions/install.js +0 -2
- package/dist/src/extensions/loader.js +0 -2
- package/dist/src/extensions/lockfile.js +0 -2
- package/dist/src/extensions/manifest-registry.js +0 -2
- package/dist/src/extensions/marketplace.js +0 -2
- package/dist/src/extensions/media-provider-contracts.js +0 -2
- package/dist/src/extensions/normalize-manifest.js +0 -2
- package/dist/src/extensions/onboard-helpers.js +0 -2
- package/dist/src/extensions/package-contract.js +0 -2
- package/dist/src/extensions/sdk/channel-entry.js +0 -2
- package/dist/src/extensions/sdk/channel-helpers.js +0 -2
- package/dist/src/extensions/sdk/index.js +0 -2
- package/dist/src/extensions/sdk/lazy.js +0 -2
- package/dist/src/extensions/sdk/testing.js +0 -2
- package/dist/src/extensions/security.js +0 -2
- package/dist/src/extensions/slots.js +0 -2
- package/dist/src/extensions/speech-provider-contracts.js +0 -2
- package/dist/src/extensions/store-zip-limits.js +0 -2
- package/dist/src/extensions/typed-event-bus.js +0 -2
- package/dist/src/extensions/types/hooks.js +0 -2
- package/dist/src/extensions/types/providers.js +0 -2
- package/dist/src/extensions/update.js +0 -2
- package/dist/src/extensions/when-context.js +0 -2
- package/dist/src/extensions/when-expression.js +0 -2
- package/dist/src/gateway/agent-builtin-tools.js +0 -2
- package/dist/src/gateway/agent-run-relay.js +0 -2
- package/dist/src/gateway/agents-admin.js +1 -3
- package/dist/src/gateway/auth.js +0 -2
- package/dist/src/gateway/capability-presets-admin.js +0 -2
- package/dist/src/gateway/chat-limits.js +0 -2
- package/dist/src/gateway/chat-stream/mapper.js +28 -14
- package/dist/src/gateway/chat-stream/pet-feedback.d.ts +13 -0
- package/dist/src/gateway/chat-stream/pet-feedback.js +45 -0
- package/dist/src/gateway/chat-stream/protocol.d.ts +26 -0
- package/dist/src/gateway/clarify-bridge.js +3 -3
- package/dist/src/gateway/clarify-runtime.js +0 -2
- package/dist/src/gateway/client-ip.js +0 -2
- package/dist/src/gateway/config-tools-web.js +0 -2
- package/dist/src/gateway/credential.js +0 -2
- package/dist/src/gateway/discovery/mdns.js +0 -2
- package/dist/src/gateway/dreaming-automation-reconciler.js +0 -2
- package/dist/src/gateway/ensure-network-cors.js +0 -2
- package/dist/src/gateway/file-path-classifier.js +0 -2
- package/dist/src/gateway/file-reference-registry.js +0 -2
- package/dist/src/gateway/global-defaults-admin.js +0 -2
- package/dist/src/gateway/heartbeat/service.js +0 -2
- package/dist/src/gateway/hono/app.js +0 -2
- package/dist/src/gateway/hono/lib/agent-model.js +0 -2
- package/dist/src/gateway/hono/lib/config-payload.js +0 -2
- package/dist/src/gateway/hono/lib/extension-assets.js +0 -2
- package/dist/src/gateway/hono/lib/extension-store.js +0 -2
- package/dist/src/gateway/hono/lib/mask-secret-length.js +0 -2
- package/dist/src/gateway/hono/lib/route-logger.js +0 -2
- package/dist/src/gateway/hono/lib/safe-providers-config.js +0 -2
- package/dist/src/gateway/hono/lib/safe-voice-config.js +0 -2
- package/dist/src/gateway/hono/lib/startup-unavailable.js +0 -2
- package/dist/src/gateway/hono/lib/static-ui.js +0 -2
- package/dist/src/gateway/hono/middleware/auth.js +0 -2
- package/dist/src/gateway/hono/middleware/log-context.js +0 -2
- package/dist/src/gateway/hono/middleware/logger.js +0 -2
- package/dist/src/gateway/hono/middleware/route-errors.js +0 -2
- package/dist/src/gateway/hono/middleware/scopes.js +0 -2
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js +0 -2
- package/dist/src/gateway/hono/oauth-async.js +0 -2
- package/dist/src/gateway/hono/oauth.js +0 -2
- package/dist/src/gateway/hono/routes/activity.js +0 -2
- package/dist/src/gateway/hono/routes/agent-stream.js +0 -2
- package/dist/src/gateway/hono/routes/agents.js +0 -2
- package/dist/src/gateway/hono/routes/ai-assist.js +0 -2
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +0 -2
- package/dist/src/gateway/hono/routes/browser-install.js +0 -2
- package/dist/src/gateway/hono/routes/browser.js +0 -2
- package/dist/src/gateway/hono/routes/capabilities.js +0 -2
- package/dist/src/gateway/hono/routes/capability-presets.js +0 -2
- package/dist/src/gateway/hono/routes/channels.js +0 -2
- package/dist/src/gateway/hono/routes/commands-skills.js +0 -2
- package/dist/src/gateway/hono/routes/config-patch/agents.js +0 -2
- package/dist/src/gateway/hono/routes/config-patch/channels.js +0 -2
- package/dist/src/gateway/hono/routes/config-patch/gateway.js +0 -2
- package/dist/src/gateway/hono/routes/config-patch/misc.js +0 -2
- package/dist/src/gateway/hono/routes/config-patch/result.js +0 -2
- package/dist/src/gateway/hono/routes/config.js +0 -2
- package/dist/src/gateway/hono/routes/connectors.js +0 -2
- package/dist/src/gateway/hono/routes/doctor.js +0 -2
- package/dist/src/gateway/hono/routes/dreaming.js +0 -2
- package/dist/src/gateway/hono/routes/exposure.js +0 -2
- package/dist/src/gateway/hono/routes/extension-gateway.js +0 -2
- package/dist/src/gateway/hono/routes/global-defaults.js +0 -2
- package/dist/src/gateway/hono/routes/goals.js +0 -2
- package/dist/src/gateway/hono/routes/home.js +0 -2
- package/dist/src/gateway/hono/routes/host-fs.js +0 -2
- package/dist/src/gateway/hono/routes/index.js +0 -2
- package/dist/src/gateway/hono/routes/lazy-bundles.js +0 -2
- package/dist/src/gateway/hono/routes/lazy-fallback.js +0 -2
- package/dist/src/gateway/hono/routes/local-apps.js +0 -2
- package/dist/src/gateway/hono/routes/logs.js +0 -2
- package/dist/src/gateway/hono/routes/mcp.js +0 -2
- package/dist/src/gateway/hono/routes/media.js +0 -2
- package/dist/src/gateway/hono/routes/memory.js +0 -2
- package/dist/src/gateway/hono/routes/migrations.js +0 -2
- package/dist/src/gateway/hono/routes/mobile.js +0 -2
- package/dist/src/gateway/hono/routes/models.js +0 -2
- package/dist/src/gateway/hono/routes/notes.js +3 -3
- package/dist/src/gateway/hono/routes/projects.js +0 -2
- package/dist/src/gateway/hono/routes/public-gateway.js +0 -2
- package/dist/src/gateway/hono/routes/search.js +0 -2
- package/dist/src/gateway/hono/routes/sessions.js +0 -2
- package/dist/src/gateway/hono/routes/shares.js +0 -2
- package/dist/src/gateway/hono/routes/site-shares.js +0 -2
- package/dist/src/gateway/hono/routes/status.js +0 -2
- package/dist/src/gateway/hono/routes/tui.js +0 -2
- package/dist/src/gateway/hono/routes/tunnel.js +0 -2
- package/dist/src/gateway/hono/routes/update.js +0 -2
- package/dist/src/gateway/hono/routes/voice.js +0 -2
- package/dist/src/gateway/hono/routes/work-discovery.js +32 -2
- package/dist/src/gateway/hono/routes/workflows.js +0 -2
- package/dist/src/gateway/hono/routes/workspace.js +0 -2
- package/dist/src/gateway/hono/routes/you.js +0 -2
- package/dist/src/gateway/hono/sse-json.js +0 -2
- package/dist/src/gateway/hono/sse.js +0 -2
- package/dist/src/gateway/host.js +0 -2
- package/dist/src/gateway/image-capabilities.js +0 -2
- package/dist/src/gateway/listen.js +0 -2
- package/dist/src/gateway/lock.js +0 -2
- package/dist/src/gateway/ports.js +0 -2
- package/dist/src/gateway/protocol.js +0 -2
- package/dist/src/gateway/public-url.js +0 -2
- package/dist/src/gateway/rate-limit/auth-policy.js +0 -2
- package/dist/src/gateway/rate-limit/buckets.js +0 -2
- package/dist/src/gateway/rate-limit/env-flags.js +0 -2
- package/dist/src/gateway/resolve-channel-connect-defer.js +0 -2
- package/dist/src/gateway/resolve-webchat-session-key.js +0 -2
- package/dist/src/gateway/respawn.js +0 -2
- package/dist/src/gateway/run-loop.js +0 -2
- package/dist/src/gateway/runtime-config.js +0 -2
- package/dist/src/gateway/security/audit.js +0 -2
- package/dist/src/gateway/security/csp.js +0 -2
- package/dist/src/gateway/security/dangerous-tools.js +0 -2
- package/dist/src/gateway/security/external-content.js +0 -2
- package/dist/src/gateway/security/known-weak-secrets.js +0 -2
- package/dist/src/gateway/security/loopback.js +0 -2
- package/dist/src/gateway/security/operator-scopes.js +0 -2
- package/dist/src/gateway/security/origin-check.js +0 -2
- package/dist/src/gateway/security/preauth-connection-budget.js +0 -2
- package/dist/src/gateway/security/secret-equal.js +0 -2
- package/dist/src/gateway/server-tailscale.js +0 -2
- package/dist/src/gateway/server.js +0 -2
- package/dist/src/gateway/service/agent-runner.js +0 -2
- package/dist/src/gateway/service/config-coordinator.js +0 -2
- package/dist/src/gateway/service/marketplace-service.js +0 -2
- package/dist/src/gateway/service/run-gateway-agent.js +0 -2
- package/dist/src/gateway/service/session-chat-ids.js +0 -2
- package/dist/src/gateway/service/sessions-api.js +0 -2
- package/dist/src/gateway/service/sse-hub.js +0 -2
- package/dist/src/gateway/service.js +0 -2
- package/dist/src/gateway/session-reset-service.js +0 -2
- package/dist/src/gateway/startup-readiness.js +0 -2
- package/dist/src/gateway/startup-trace.js +0 -2
- package/dist/src/gateway/tailscale-auth.js +0 -2
- package/dist/src/gateway/tailscale-lifecycle.js +0 -2
- package/dist/src/gateway/tls-server.js +0 -2
- package/dist/src/gateway/trusted-proxy.js +0 -2
- package/dist/src/gateway/user-turn-input.js +0 -2
- package/dist/src/gateway/workspace-editor-path.js +0 -2
- package/dist/src/gateway/workspace-file-search.js +0 -2
- package/dist/src/gateway/workspace-fs-file-list.js +0 -2
- package/dist/src/gateway/workspace-heartbeat-path.js +0 -2
- package/dist/src/gateway/workspace-ripgrep.js +0 -2
- package/dist/src/gateway/ws-security.js +0 -2
- package/dist/src/generated/bundled-image-generation-providers.js +0 -2
- package/dist/src/goals/goal-contract-draft.js +0 -2
- package/dist/src/goals/goal-evidence-review.js +0 -2
- package/dist/src/goals/goal-notifications.js +0 -2
- package/dist/src/goals/goal-queue-store.js +0 -2
- package/dist/src/goals/goal-runner.js +0 -2
- package/dist/src/goals/goal-service.js +0 -2
- package/dist/src/goals/goal-store.js +0 -2
- package/dist/src/goals/goal-workflow-judge.js +0 -2
- package/dist/src/heartbeat/active-hours.js +0 -2
- package/dist/src/heartbeat/content-check.js +0 -2
- package/dist/src/heartbeat/event-prompt.js +0 -2
- package/dist/src/heartbeat/tokens.js +0 -2
- package/dist/src/heartbeat/wake.js +0 -2
- package/dist/src/i18n/format.js +0 -2
- package/dist/src/i18n/goals-bundle.js +0 -2
- package/dist/src/i18n/locale.js +0 -2
- package/dist/src/i18n/locales/goals.en.js +0 -2
- package/dist/src/i18n/locales/goals.zh.js +0 -2
- package/dist/src/i18n/locales/share-tool.en.js +0 -2
- package/dist/src/i18n/locales/share-tool.zh.js +0 -2
- package/dist/src/i18n/share-tool-bundle.js +0 -2
- package/dist/src/index.js +0 -2
- package/dist/src/infra/brew.js +0 -2
- package/dist/src/infra/bus/queue.js +0 -2
- package/dist/src/infra/debounce.js +0 -2
- package/dist/src/infra/exec.js +0 -2
- package/dist/src/infra/gateway-process-argv.js +0 -2
- package/dist/src/infra/gateway-processes.js +0 -2
- package/dist/src/infra/host-env-security-policy.js +0 -2
- package/dist/src/infra/host-env-security.js +0 -2
- package/dist/src/infra/http-proxy-env.js +0 -2
- package/dist/src/infra/is-main.js +0 -2
- package/dist/src/infra/json-utf8-bytes.js +0 -2
- package/dist/src/infra/node-sqlite.js +0 -2
- package/dist/src/infra/package-json.js +0 -2
- package/dist/src/infra/package-update-steps.js +0 -2
- package/dist/src/infra/path-env.js +0 -2
- package/dist/src/infra/path-prepend.js +0 -2
- package/dist/src/infra/ports.js +0 -2
- package/dist/src/infra/rate-limit/failure-limiter.js +0 -2
- package/dist/src/infra/rate-limit/keyed-store.js +0 -2
- package/dist/src/infra/rate-limit/rate-limiter.js +0 -2
- package/dist/src/infra/restart.js +0 -2
- package/dist/src/infra/retry.js +0 -2
- package/dist/src/infra/run-command.js +0 -2
- package/dist/src/infra/sqlite-errors.js +0 -2
- package/dist/src/infra/ssh-tunnel.js +0 -2
- package/dist/src/infra/stable-node-path.js +0 -2
- package/dist/src/infra/tailscale.js +0 -2
- package/dist/src/infra/undici-fetch.js +0 -2
- package/dist/src/infra/unhandled-rejections.js +0 -2
- package/dist/src/infra/update-channels.js +0 -2
- package/dist/src/infra/update-check.js +0 -2
- package/dist/src/infra/update-global.js +0 -2
- package/dist/src/infra/update-lock.js +0 -2
- package/dist/src/infra/update-log.js +0 -2
- package/dist/src/infra/update-restart.js +0 -2
- package/dist/src/infra/update-runner.js +0 -2
- package/dist/src/infra/update-startup.js +0 -2
- package/dist/src/infra/warning-filter.js +0 -2
- package/dist/src/infra/write-file-atomic.js +0 -2
- package/dist/src/knowledge/connected-knowledge-pipeline.js +0 -2
- package/dist/src/knowledge/coordinator.js +0 -2
- package/dist/src/knowledge/ingestion-service.js +0 -2
- package/dist/src/local-apps/acceptance.js +0 -2
- package/dist/src/local-apps/preview-runtime-bridge.js +0 -2
- package/dist/src/local-apps/runtime-entry.js +0 -2
- package/dist/src/local-apps/scaffold.js +0 -2
- package/dist/src/local-apps/service.js +0 -2
- package/dist/src/local-apps/store.js +0 -2
- package/dist/src/markdown/chunk.js +0 -2
- package/dist/src/markdown/code-spans.js +0 -2
- package/dist/src/markdown/fences.js +0 -2
- package/dist/src/markdown/frontmatter.js +0 -2
- package/dist/src/markdown/ir.js +0 -2
- package/dist/src/markdown/render.js +0 -2
- package/dist/src/markdown/tables.js +0 -2
- package/dist/src/mcp/channel-bridge.js +0 -2
- package/dist/src/mcp/channel-server.js +0 -2
- package/dist/src/mcp/channel-shared.js +0 -2
- package/dist/src/mcp/channel-tools.js +0 -2
- package/dist/src/mcp/gateway-http-client.js +0 -2
- package/dist/src/media/media-reference.js +0 -2
- package/dist/src/media/paths.js +0 -2
- package/dist/src/media/session-references.js +0 -2
- package/dist/src/media/store.js +0 -2
- package/dist/src/media/uri.js +0 -2
- package/dist/src/media-shared/http/api-key-rotation.js +0 -2
- package/dist/src/media-shared/http/deadline.js +0 -2
- package/dist/src/media-shared/http/private-network.js +0 -2
- package/dist/src/media-shared/http/provider-http-errors.js +0 -2
- package/dist/src/media-shared/http/provider-http.js +0 -2
- package/dist/src/media-shared/http/resolve-provider-http-request-config.js +0 -2
- package/dist/src/media-shared/http/ssrf-guard.js +0 -2
- package/dist/src/media-shared/http/test-helpers/mock-server.js +0 -2
- package/dist/src/media-understanding/audio-transcription-runner.js +0 -2
- package/dist/src/media-understanding/openai-compatible-audio.js +0 -2
- package/dist/src/media-understanding/registry.js +0 -2
- package/dist/src/media-understanding/resolve-entries.js +0 -2
- package/dist/src/media-understanding/runner.js +0 -2
- package/dist/src/migrations/config/default-capability-preset.js +0 -2
- package/dist/src/migrations/registry.js +0 -2
- package/dist/src/migrations/runner.js +0 -2
- package/dist/src/mobile/notification-service.js +0 -2
- package/dist/src/mobile/notification-store.js +0 -2
- package/dist/src/mobile/notification-types.js +0 -2
- package/dist/src/notes/agent-context.js +0 -2
- package/dist/src/notes/attachment-ref.js +0 -2
- package/dist/src/notes/note-attachment-sync.js +0 -2
- package/dist/src/notes/note-index-meta.js +0 -2
- package/dist/src/notes/note-markdown.js +0 -2
- package/dist/src/notes/paths.js +0 -2
- package/dist/src/notes/service.d.ts +3 -1
- package/dist/src/notes/service.js +19 -5
- package/dist/src/notes/store.js +0 -2
- package/dist/src/package-version.js +0 -2
- package/dist/src/pets/factory.d.ts +13 -0
- package/dist/src/pets/factory.js +23 -2
- package/dist/src/pets/manifest.js +0 -2
- package/dist/src/pets/validator.js +0 -2
- package/dist/src/process/kill-tree.js +0 -2
- package/dist/src/project-trust/trust-store.js +0 -2
- package/dist/src/projects/automation-bind.js +0 -2
- package/dist/src/projects/goal-bind.js +0 -2
- package/dist/src/projects/memory-bind.js +0 -2
- package/dist/src/projects/project-agent-suggestion.js +0 -2
- package/dist/src/projects/project-agent.js +0 -2
- package/dist/src/projects/project-kind.js +0 -2
- package/dist/src/projects/project-loop.js +0 -2
- package/dist/src/projects/project-service.js +0 -2
- package/dist/src/projects/project-store.js +0 -2
- package/dist/src/projects/session-bind.js +0 -2
- package/dist/src/projects/workflow-bind.js +0 -2
- package/dist/src/projects/workspace-project.js +0 -2
- package/dist/src/projects/workspace.js +0 -2
- package/dist/src/providers/auth-runtime/auth-profile-store.js +0 -2
- package/dist/src/providers/auth-runtime/is-configured.js +0 -2
- package/dist/src/providers/auth-runtime/oauth.js +0 -2
- package/dist/src/providers/auth-runtime/resolve-api-key.js +0 -2
- package/dist/src/providers/auth-runtime/resolve-auth.js +0 -2
- package/dist/src/providers/constants.js +0 -2
- package/dist/src/providers/domestic-presets.js +0 -2
- package/dist/src/providers/env-keys.js +0 -2
- package/dist/src/providers/extension-stream-bridge.js +0 -2
- package/dist/src/providers/index.js +0 -2
- package/dist/src/providers/model-call.js +0 -2
- package/dist/src/providers/model-discovery.js +0 -2
- package/dist/src/providers/model-registry.js +0 -2
- package/dist/src/providers/model-supplements.js +0 -2
- package/dist/src/providers/plugin-registry.js +0 -2
- package/dist/src/providers/presentation.js +0 -2
- package/dist/src/remote-access/exposure-guards.js +0 -2
- package/dist/src/remote-access/exposure-manager.js +0 -2
- package/dist/src/review/review-git.js +0 -2
- package/dist/src/review/review-types.js +0 -2
- package/dist/src/routing/account-id.js +0 -2
- package/dist/src/routing/agent-session-key.js +0 -2
- package/dist/src/routing/bindings.js +0 -2
- package/dist/src/routing/index.js +0 -2
- package/dist/src/routing/resolve-route.js +0 -2
- package/dist/src/routing/resolve-tui-session-key.js +0 -2
- package/dist/src/routing/session-key-utils.js +0 -2
- package/dist/src/routing/session-key.js +0 -2
- package/dist/src/session/abort-cutoff.js +0 -2
- package/dist/src/session/chat-export.js +0 -2
- package/dist/src/session/client-history.js +0 -2
- package/dist/src/session/compaction-checkpoints.js +0 -2
- package/dist/src/session/config-store.js +0 -2
- package/dist/src/session/init-session-turn.js +0 -2
- package/dist/src/session/lifecycle-timestamps.js +0 -2
- package/dist/src/session/load-jsonl-entries.js +0 -2
- package/dist/src/session/manager.js +0 -2
- package/dist/src/session/patch-metadata.js +0 -2
- package/dist/src/session/reset-policy.js +0 -2
- package/dist/src/session/reset-triggers.js +0 -2
- package/dist/src/session/reset-type.js +0 -2
- package/dist/src/session/resolve-session.js +0 -2
- package/dist/src/session/session-context-for-llm.js +0 -2
- package/dist/src/session/session-id.js +0 -2
- package/dist/src/session/session-title.js +0 -2
- package/dist/src/session/session-workspace.js +0 -2
- package/dist/src/session/store.js +0 -2
- package/dist/src/session/stored-rows-to-file-entries.js +0 -2
- package/dist/src/session/thinking-resolve.js +0 -2
- package/dist/src/session/transcript-events.js +0 -2
- package/dist/src/session/transcript-format.js +0 -2
- package/dist/src/session/transcript-outline.js +0 -2
- package/dist/src/session/transcript-stats.js +0 -2
- package/dist/src/session/types.js +0 -2
- package/dist/src/session/user-round-delete.js +0 -2
- package/dist/src/share/share-audit.js +0 -2
- package/dist/src/share/share-auto.js +0 -2
- package/dist/src/share/share-config.js +0 -2
- package/dist/src/share/share-landing.js +0 -2
- package/dist/src/share/share-rate-limit.js +0 -2
- package/dist/src/share/share-store.js +0 -2
- package/dist/src/share/share-thumbnail.js +0 -2
- package/dist/src/share/share-types.js +0 -2
- package/dist/src/share/share-url.js +0 -2
- package/dist/src/share/share-zip.js +0 -2
- package/dist/src/share/site-proxy.js +0 -2
- package/dist/src/share/site-share-config.js +0 -2
- package/dist/src/share/site-share-router.js +0 -2
- package/dist/src/share/site-share-store.js +0 -2
- package/dist/src/share/site-share-types.js +0 -2
- package/dist/src/share/site-static-serve.js +0 -2
- package/dist/src/storage/sqlite/activity-repository.js +0 -2
- package/dist/src/storage/sqlite/config-repository.js +0 -2
- package/dist/src/storage/sqlite/connection.js +0 -2
- package/dist/src/storage/sqlite/connector-repository.js +0 -2
- package/dist/src/storage/sqlite/fts.js +0 -2
- package/dist/src/storage/sqlite/knowledge-repository.js +0 -2
- package/dist/src/storage/sqlite/memory-index-repository.js +0 -2
- package/dist/src/storage/sqlite/memory-records-repository.js +0 -2
- package/dist/src/storage/sqlite/memory-reference-consent-repository.js +0 -2
- package/dist/src/storage/sqlite/migrations/046_work_discovery_feedback.sql +13 -0
- package/dist/src/storage/sqlite/migrations/discover.js +0 -2
- package/dist/src/storage/sqlite/migrations/errors.js +0 -2
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -5
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/note-agent-context-repository.js +0 -2
- package/dist/src/storage/sqlite/notes-repository.js +0 -2
- package/dist/src/storage/sqlite/paths.js +0 -2
- package/dist/src/storage/sqlite/row-mappers.js +0 -2
- package/dist/src/storage/sqlite/schema-version.js +0 -2
- package/dist/src/storage/sqlite/schema.js +1 -3
- package/dist/src/storage/sqlite/session-metadata.js +0 -2
- package/dist/src/storage/sqlite/session-repository.js +0 -2
- package/dist/src/storage/sqlite/transaction.js +0 -2
- package/dist/src/storage/sqlite/transcript-repository.js +0 -2
- package/dist/src/storage/sqlite/user-profile-setup-repository.js +0 -2
- package/dist/src/storage/sqlite/user-trust-repository.js +0 -2
- package/dist/src/tui/backends/embedded-backend.js +0 -2
- package/dist/src/tui/backends/gateway-sse-backend.js +0 -2
- package/dist/src/tui/chat-history.js +0 -2
- package/dist/src/tui/clipboard-image.js +0 -2
- package/dist/src/tui/clipboard-text.js +0 -2
- package/dist/src/tui/components/assistant-message.js +0 -2
- package/dist/src/tui/components/bash-execution.js +0 -2
- package/dist/src/tui/components/bash-summary.js +0 -2
- package/dist/src/tui/components/branch-message-summary.js +0 -2
- package/dist/src/tui/components/branch-summary.js +0 -2
- package/dist/src/tui/components/chat-log.js +0 -2
- package/dist/src/tui/components/compaction-summary.js +0 -2
- package/dist/src/tui/components/custom-editor.js +0 -2
- package/dist/src/tui/components/custom-message.js +0 -2
- package/dist/src/tui/components/dynamic-border.js +0 -2
- package/dist/src/tui/components/extension-dialog.js +0 -2
- package/dist/src/tui/components/fuzzy-filter.js +0 -2
- package/dist/src/tui/components/scoped-models-selector.js +0 -2
- package/dist/src/tui/components/searchable-select-list.js +0 -2
- package/dist/src/tui/components/session-selector.js +0 -2
- package/dist/src/tui/components/settings-selector.js +0 -2
- package/dist/src/tui/components/thinking-selector.js +0 -2
- package/dist/src/tui/components/tool-execution.js +0 -2
- package/dist/src/tui/components/tui-bottom-bar.js +0 -2
- package/dist/src/tui/components/tui-header.js +0 -2
- package/dist/src/tui/components/user-message.js +0 -2
- package/dist/src/tui/components/visual-truncate.js +0 -2
- package/dist/src/tui/extension-host/autocomplete.js +0 -2
- package/dist/src/tui/extension-host/host.js +0 -2
- package/dist/src/tui/extension-host/load-extensions.js +0 -2
- package/dist/src/tui/extension-host/runtime-context.js +0 -2
- package/dist/src/tui/extension-host/runtime.js +0 -2
- package/dist/src/tui/extension-host/surface.js +0 -2
- package/dist/src/tui/extension-host/tool-renderers.js +0 -2
- package/dist/src/tui/format-tui-hotkeys.js +0 -2
- package/dist/src/tui/sse-consumer.js +0 -2
- package/dist/src/tui/theme/dark.js +0 -2
- package/dist/src/tui/theme/light.js +0 -2
- package/dist/src/tui/theme-manager.js +0 -2
- package/dist/src/tui/theme.js +0 -2
- package/dist/src/tui/tool-summary.js +0 -2
- package/dist/src/tui/tui-agent-events.js +0 -2
- package/dist/src/tui/tui-command-formatters.js +0 -2
- package/dist/src/tui/tui-commands.js +0 -2
- package/dist/src/tui/tui-context-usage.js +0 -2
- package/dist/src/tui/tui-extension-user-message.js +0 -2
- package/dist/src/tui/tui-fd-path.js +0 -2
- package/dist/src/tui/tui-file-autocomplete.js +0 -2
- package/dist/src/tui/tui-follow-up-queue.js +0 -2
- package/dist/src/tui/tui-git-branch.js +0 -2
- package/dist/src/tui/tui-keybindings-file.js +0 -2
- package/dist/src/tui/tui-lifecycle.js +0 -2
- package/dist/src/tui/tui-local-shell.js +0 -2
- package/dist/src/tui/tui-model-picker.js +0 -2
- package/dist/src/tui/tui-oauth-login.js +0 -2
- package/dist/src/tui/tui-overlays.js +0 -2
- package/dist/src/tui/tui-picker-overlay.js +0 -2
- package/dist/src/tui/tui-run-state.js +0 -2
- package/dist/src/tui/tui-run-status-format.js +0 -2
- package/dist/src/tui/tui-runtime-hints.js +0 -2
- package/dist/src/tui/tui-scoped-models.js +0 -2
- package/dist/src/tui/tui-session-actions.js +0 -2
- package/dist/src/tui/tui-session-format.js +0 -2
- package/dist/src/tui/tui-session-snapshot.js +0 -2
- package/dist/src/tui/tui-session-stats.js +0 -2
- package/dist/src/tui/tui-settings.js +0 -2
- package/dist/src/tui/tui-skills-autocomplete.js +0 -2
- package/dist/src/tui/tui-startup-resources.js +0 -2
- package/dist/src/tui/tui-startup-text.js +0 -2
- package/dist/src/tui/tui-stdio-filter.js +0 -2
- package/dist/src/tui/tui-submit.js +0 -2
- package/dist/src/tui/tui-suspend.js +0 -2
- package/dist/src/tui/tui-timeline-picker.js +0 -2
- package/dist/src/tui/tui-timeline.js +0 -2
- package/dist/src/tui/tui-tool-diff.js +0 -2
- package/dist/src/tui/tui-tool-result.js +0 -2
- package/dist/src/tui/tui-transcript-tree-picker.js +0 -2
- package/dist/src/tui/tui-transcript-tree.js +0 -2
- package/dist/src/tui/tui-types.js +0 -2
- package/dist/src/tui/tui-workflow-slash.js +0 -2
- package/dist/src/tui/tui.js +0 -2
- package/dist/src/tui/xopc-tui-keybindings.js +0 -2
- package/dist/src/tunnel/broker-client.js +0 -2
- package/dist/src/tunnel/consent.js +0 -2
- package/dist/src/tunnel/enable-lan-pairing.js +0 -2
- package/dist/src/tunnel/env.js +0 -2
- package/dist/src/tunnel/frp-subdomain-host.js +0 -2
- package/dist/src/tunnel/frpc-binary.js +0 -2
- package/dist/src/tunnel/frpc-config.js +0 -2
- package/dist/src/tunnel/frpc-extract.js +0 -2
- package/dist/src/tunnel/frpc-process.js +0 -2
- package/dist/src/tunnel/gateway-lifecycle.js +0 -2
- package/dist/src/tunnel/pair-context.js +0 -2
- package/dist/src/tunnel/pair-url.js +0 -2
- package/dist/src/tunnel/pairing-rate-limit.js +0 -2
- package/dist/src/tunnel/pairing.js +0 -2
- package/dist/src/tunnel/tunnel-audit.js +0 -2
- package/dist/src/tunnel/tunnel-config.js +0 -2
- package/dist/src/tunnel/tunnel-persist.js +0 -2
- package/dist/src/tunnel/tunnel-qr.js +0 -2
- package/dist/src/tunnel/tunnel-rate-limit.js +0 -2
- package/dist/src/tunnel/tunnel-service.js +0 -2
- package/dist/src/tunnel/tunnel-state.js +0 -2
- package/dist/src/tunnel/well-known.js +0 -2
- package/dist/src/user-context/config.js +0 -2
- package/dist/src/user-context/import.js +0 -2
- package/dist/src/user-context/owner.js +0 -2
- package/dist/src/user-context/profile.js +0 -2
- package/dist/src/user-context/projection.js +0 -2
- package/dist/src/user-context/runtime.js +0 -2
- package/dist/src/user-context/source-recommendations.js +0 -2
- package/dist/src/user-context/trust-policy.js +0 -2
- package/dist/src/utils/global-singleton.js +0 -2
- package/dist/src/utils/helpers.js +0 -2
- package/dist/src/utils/index.js +0 -2
- package/dist/src/utils/is-record.js +0 -2
- package/dist/src/utils/logger/audit.js +0 -2
- package/dist/src/utils/logger/config.js +0 -2
- package/dist/src/utils/logger/context.js +0 -2
- package/dist/src/utils/logger/exporters.js +0 -2
- package/dist/src/utils/logger/index.js +0 -2
- package/dist/src/utils/logger/log-store.js +0 -2
- package/dist/src/utils/logger/log-stream.js +0 -2
- package/dist/src/utils/logger/pino-record.js +0 -2
- package/dist/src/utils/logger/redact.js +0 -2
- package/dist/src/utils/logger/rotation.js +0 -2
- package/dist/src/utils/logger/shutdown.js +0 -2
- package/dist/src/utils/logger/stats.js +0 -2
- package/dist/src/utils/logger/streams.js +0 -2
- package/dist/src/utils/logger/types.js +0 -2
- package/dist/src/utils/logger.js +0 -2
- package/dist/src/utils/redact-sensitive-url.js +0 -2
- package/dist/src/utils/sanitize-log.js +0 -2
- package/dist/src/utils/string-coerce.js +0 -2
- package/dist/src/voice/language-profile.js +0 -2
- package/dist/src/voice/local/model-files.js +0 -2
- package/dist/src/voice/local/model-manager.js +0 -2
- package/dist/src/voice/local/models.js +0 -2
- package/dist/src/voice/local/runtime-client.js +0 -2
- package/dist/src/voice/local/runtime-dispatcher.js +0 -2
- package/dist/src/voice/local/runtime-worker.js +12 -4
- package/dist/src/voice/local/wav.js +0 -2
- package/dist/src/voice/metadata/builtin.js +0 -2
- package/dist/src/voice/metadata/registry.js +0 -2
- package/dist/src/voice/stt/availability.js +0 -2
- package/dist/src/voice/stt/config-slice.js +0 -2
- package/dist/src/voice/stt/factory.js +0 -2
- package/dist/src/voice/stt/index.js +0 -2
- package/dist/src/voice/stt/list-providers.js +0 -2
- package/dist/src/voice/stt/mention.js +0 -2
- package/dist/src/voice/stt/preflight.js +0 -2
- package/dist/src/voice/stt/providers/alibaba-transcription.js +0 -2
- package/dist/src/voice/stt/providers/local-transcription.js +0 -2
- package/dist/src/voice/stt/providers/openai-transcription.js +0 -2
- package/dist/src/voice/stt/transcribe-core.js +0 -2
- package/dist/src/voice/stt/types.js +0 -2
- package/dist/src/voice/tts/audio.js +0 -2
- package/dist/src/voice/tts/config-slice.js +0 -2
- package/dist/src/voice/tts/directives.js +0 -2
- package/dist/src/voice/tts/factory.js +0 -2
- package/dist/src/voice/tts/list-providers.js +0 -2
- package/dist/src/voice/tts/merge-config.js +0 -2
- package/dist/src/voice/tts/openai-compatible-speech.js +0 -2
- package/dist/src/voice/tts/payload.js +0 -2
- package/dist/src/voice/tts/preprocess.js +0 -2
- package/dist/src/voice/tts/providers/alibaba-speech.js +0 -2
- package/dist/src/voice/tts/providers/edge-speech.js +0 -2
- package/dist/src/voice/tts/providers/minimax-speech.js +0 -2
- package/dist/src/voice/tts/providers/openai-speech.js +0 -2
- package/dist/src/voice/tts/sentence-boundary.js +0 -2
- package/dist/src/voice/tts/service.js +0 -2
- package/dist/src/voice/tts/speak-core.js +0 -2
- package/dist/src/voice/tts/speech-registry.js +0 -2
- package/dist/src/voice/tts/status-tracker.js +0 -2
- package/dist/src/voice/tts/summarize.js +0 -2
- package/dist/src/voice/tts/types.js +0 -2
- package/dist/src/work-discovery/analyzer.js +23 -6
- package/dist/src/work-discovery/index.js +2 -2
- package/dist/src/work-discovery/probe.d.ts +6 -0
- package/dist/src/work-discovery/probe.js +12 -3
- package/dist/src/work-discovery/repository.d.ts +7 -1
- package/dist/src/work-discovery/repository.js +35 -4
- package/dist/src/work-discovery/service.d.ts +6 -1
- package/dist/src/work-discovery/service.js +64 -7
- package/dist/src/work-discovery/types.d.ts +21 -0
- package/dist/src/work-items/agent-context.js +0 -2
- package/dist/src/work-items/work-item-service.js +0 -2
- package/dist/src/work-items/work-item-store.js +0 -2
- package/dist/src/work-items/work-item-workflow-judge.js +0 -2
- package/dist/src/workflows/authoring/workflow-draft-store.js +0 -2
- package/dist/src/workflows/domain/definition-utils.js +0 -2
- package/dist/src/workflows/domain/run.js +0 -2
- package/dist/src/workflows/domain/schema-validation.js +0 -2
- package/dist/src/workflows/domain/validation.js +0 -2
- package/dist/src/workflows/draft/workflow-draft-prompt.js +0 -2
- package/dist/src/workflows/draft/workflow-draft-service.js +0 -2
- package/dist/src/workflows/draft/workflow-draft-validator.js +0 -2
- package/dist/src/workflows/engine/projector.js +0 -2
- package/dist/src/workflows/engine/workflow-engine.js +0 -2
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +0 -2
- package/dist/src/workflows/runtime/graph-workflow-runtime.js +0 -2
- package/dist/src/workflows/service/run-view-to-snapshot.js +0 -2
- package/dist/src/workflows/service/workflow-run-service.js +0 -2
- package/dist/src/workflows/service/workflow-session-bridge.js +0 -2
- package/dist/src/workflows/service/workflow-session-key.js +0 -2
- package/dist/src/workflows/store/event-store.js +0 -2
- package/dist/src/workflows/store/paths.js +0 -2
- package/dist/src/workflows/store/run-index-store.js +0 -2
- package/dist/src/workflows/store/run-store.js +0 -2
- package/package.json +41 -11
- package/skills/creative/hatch-pet/SKILL.md +1 -0
- package/dist/extensions/dashscope/src/image-generation-provider.js.map +0 -1
- package/dist/extensions/demo-memory/src/index.js.map +0 -1
- package/dist/extensions/fal/src/image-generation-provider.js.map +0 -1
- package/dist/extensions/feishu/src/actions/message-action-handler.js.map +0 -1
- package/dist/extensions/feishu/src/adapters/cli-login.js.map +0 -1
- package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +0 -1
- package/dist/extensions/feishu/src/adapters/onboard-cli.js.map +0 -1
- package/dist/extensions/feishu/src/auth/app-registration.js.map +0 -1
- package/dist/extensions/feishu/src/auth/pairing.js.map +0 -1
- package/dist/extensions/feishu/src/auth/paths.js.map +0 -1
- package/dist/extensions/feishu/src/directory/directory-adapter.js.map +0 -1
- package/dist/extensions/feishu/src/format.js.map +0 -1
- package/dist/extensions/feishu/src/index.js.map +0 -1
- package/dist/extensions/feishu/src/outbound/actions.js.map +0 -1
- package/dist/extensions/feishu/src/outbound/media-load.js.map +0 -1
- package/dist/extensions/feishu/src/outbound/outbound-adapter.js.map +0 -1
- package/dist/extensions/feishu/src/pairing/feishu-pairing-prompt.js.map +0 -1
- package/dist/extensions/feishu/src/pairing-config-resolver.js.map +0 -1
- package/dist/extensions/feishu/src/plugin.js.map +0 -1
- package/dist/extensions/feishu/src/schema/config-schema.js.map +0 -1
- package/dist/extensions/feishu/src/state/accounts.js.map +0 -1
- package/dist/extensions/feishu/src/state/message-bindings.js.map +0 -1
- package/dist/extensions/feishu/src/state/thread-bindings.js.map +0 -1
- package/dist/extensions/feishu/src/status/doctor.js.map +0 -1
- package/dist/extensions/feishu/src/status/status-adapter.js.map +0 -1
- package/dist/extensions/feishu/src/streaming/streaming-adapter.js.map +0 -1
- package/dist/extensions/feishu/src/subagent-hooks.js.map +0 -1
- package/dist/extensions/feishu/src/tools/docx/docx-batch-insert.js.map +0 -1
- package/dist/extensions/feishu/src/tools/docx/docx-color-text.js.map +0 -1
- package/dist/extensions/feishu/src/tools/docx/docx-table-ops.js.map +0 -1
- package/dist/extensions/feishu/src/tools/tools.js.map +0 -1
- package/dist/extensions/feishu/src/transport/client/client.js.map +0 -1
- package/dist/extensions/feishu/src/transport/client/lark-sdk-logger.js.map +0 -1
- package/dist/extensions/feishu/src/transport/reliability/dedupe.js.map +0 -1
- package/dist/extensions/feishu/src/transport/reliability/inbound-pipeline.js.map +0 -1
- package/dist/extensions/feishu/src/transport/socket-mode/monitor.js.map +0 -1
- package/dist/extensions/feishu/src/transport/socket-mode/retry.js.map +0 -1
- package/dist/extensions/feishu/src/transport/text/mentions.js.map +0 -1
- package/dist/extensions/feishu/src/transport/webhook/monitor.js.map +0 -1
- package/dist/extensions/feishu/src/ui/config-surface.js.map +0 -1
- package/dist/extensions/feishu/src/workflow-progress.js.map +0 -1
- package/dist/extensions/google/src/image-generation-provider.js.map +0 -1
- package/dist/extensions/minimax/src/image-generation-provider.js.map +0 -1
- package/dist/extensions/openai/src/image-generation-provider.js.map +0 -1
- package/dist/extensions/telegram/src/access-control.js.map +0 -1
- package/dist/extensions/telegram/src/account-manager.js.map +0 -1
- package/dist/extensions/telegram/src/actions/message-actions.js.map +0 -1
- package/dist/extensions/telegram/src/adapters/command-adapter.js.map +0 -1
- package/dist/extensions/telegram/src/adapters/config-adapter.js.map +0 -1
- package/dist/extensions/telegram/src/adapters/debounce-keys.js.map +0 -1
- package/dist/extensions/telegram/src/adapters/gateway-adapter.js.map +0 -1
- package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +0 -1
- package/dist/extensions/telegram/src/adapters/inbound-access.js.map +0 -1
- package/dist/extensions/telegram/src/adapters/index.js.map +0 -1
- package/dist/extensions/telegram/src/adapters/onboard-cli.js.map +0 -1
- package/dist/extensions/telegram/src/adapters/outbound-adapter.js.map +0 -1
- package/dist/extensions/telegram/src/adapters/security-adapter.js.map +0 -1
- package/dist/extensions/telegram/src/adapters/setup-wizard.js.map +0 -1
- package/dist/extensions/telegram/src/adapters/status-adapter.js.map +0 -1
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js.map +0 -1
- package/dist/extensions/telegram/src/api-root.js.map +0 -1
- package/dist/extensions/telegram/src/approval-delivery.js.map +0 -1
- package/dist/extensions/telegram/src/approval-store.js.map +0 -1
- package/dist/extensions/telegram/src/caption.js.map +0 -1
- package/dist/extensions/telegram/src/command-handler.js.map +0 -1
- package/dist/extensions/telegram/src/config-schema.js.map +0 -1
- package/dist/extensions/telegram/src/conversation-id.js.map +0 -1
- package/dist/extensions/telegram/src/dedupe.js.map +0 -1
- package/dist/extensions/telegram/src/delivery-chat-id.js.map +0 -1
- package/dist/extensions/telegram/src/doctor.js.map +0 -1
- package/dist/extensions/telegram/src/draft-stream-lifecycle.js.map +0 -1
- package/dist/extensions/telegram/src/draft-stream-loop.js.map +0 -1
- package/dist/extensions/telegram/src/draft-stream.js.map +0 -1
- package/dist/extensions/telegram/src/errors.js.map +0 -1
- package/dist/extensions/telegram/src/exec-approval-handler.js.map +0 -1
- package/dist/extensions/telegram/src/exec-approvals.js.map +0 -1
- package/dist/extensions/telegram/src/focus-handler.js.map +0 -1
- package/dist/extensions/telegram/src/format.js.map +0 -1
- package/dist/extensions/telegram/src/group-config-resolver.js.map +0 -1
- package/dist/extensions/telegram/src/inbound-coalescer.js.map +0 -1
- package/dist/extensions/telegram/src/inbound-processor.js.map +0 -1
- package/dist/extensions/telegram/src/index.js.map +0 -1
- package/dist/extensions/telegram/src/inline-keyboards.js.map +0 -1
- package/dist/extensions/telegram/src/network-errors.js.map +0 -1
- package/dist/extensions/telegram/src/outbound-sender.js.map +0 -1
- package/dist/extensions/telegram/src/pairing-config-resolver.js.map +0 -1
- package/dist/extensions/telegram/src/plugin-defaults.js.map +0 -1
- package/dist/extensions/telegram/src/plugin.js.map +0 -1
- package/dist/extensions/telegram/src/polling-session.js.map +0 -1
- package/dist/extensions/telegram/src/proxy-fetch.js.map +0 -1
- package/dist/extensions/telegram/src/reactions.js.map +0 -1
- package/dist/extensions/telegram/src/reply-params.js.map +0 -1
- package/dist/extensions/telegram/src/routing-integration.js.map +0 -1
- package/dist/extensions/telegram/src/send-options.js.map +0 -1
- package/dist/extensions/telegram/src/sent-cache.js.map +0 -1
- package/dist/extensions/telegram/src/startup-errors.js.map +0 -1
- package/dist/extensions/telegram/src/telegram-actions.js.map +0 -1
- package/dist/extensions/telegram/src/telegram-draft-errors.js.map +0 -1
- package/dist/extensions/telegram/src/thread-bindings.js.map +0 -1
- package/dist/extensions/telegram/src/timeout-abort.js.map +0 -1
- package/dist/extensions/telegram/src/token-resolver.js.map +0 -1
- package/dist/extensions/telegram/src/update-offset-store.js.map +0 -1
- package/dist/extensions/telegram/src/workflow-progress.js.map +0 -1
- package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +0 -1
- package/dist/extensions/weixin/src/api/api.js.map +0 -1
- package/dist/extensions/weixin/src/api/config-cache.js.map +0 -1
- package/dist/extensions/weixin/src/api/session-guard.js.map +0 -1
- package/dist/extensions/weixin/src/api/types.js.map +0 -1
- package/dist/extensions/weixin/src/auth/accounts.js.map +0 -1
- package/dist/extensions/weixin/src/auth/login-qr.js.map +0 -1
- package/dist/extensions/weixin/src/auth/pairing.js.map +0 -1
- package/dist/extensions/weixin/src/auth/weixin-account-id.js.map +0 -1
- package/dist/extensions/weixin/src/cdn/aes-ecb.js.map +0 -1
- package/dist/extensions/weixin/src/cdn/cdn-upload.js.map +0 -1
- package/dist/extensions/weixin/src/cdn/cdn-url.js.map +0 -1
- package/dist/extensions/weixin/src/cdn/pic-decrypt.js.map +0 -1
- package/dist/extensions/weixin/src/cdn/upload.js.map +0 -1
- package/dist/extensions/weixin/src/cli/gateway-qr-login.js.map +0 -1
- package/dist/extensions/weixin/src/cli/qr-login.js.map +0 -1
- package/dist/extensions/weixin/src/config-schema.js.map +0 -1
- package/dist/extensions/weixin/src/config-surface.js.map +0 -1
- package/dist/extensions/weixin/src/delivery-to.js.map +0 -1
- package/dist/extensions/weixin/src/index.js.map +0 -1
- package/dist/extensions/weixin/src/media/data-url.js.map +0 -1
- package/dist/extensions/weixin/src/media/media-download.js.map +0 -1
- package/dist/extensions/weixin/src/media/mime.js.map +0 -1
- package/dist/extensions/weixin/src/media/silk-transcode.js.map +0 -1
- package/dist/extensions/weixin/src/messaging/context-token-init.js.map +0 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js.map +0 -1
- package/dist/extensions/weixin/src/messaging/error-notice.js.map +0 -1
- package/dist/extensions/weixin/src/messaging/inbound.js.map +0 -1
- package/dist/extensions/weixin/src/messaging/markdown-filter.js.map +0 -1
- package/dist/extensions/weixin/src/messaging/process-message.js.map +0 -1
- package/dist/extensions/weixin/src/messaging/send-media.js.map +0 -1
- package/dist/extensions/weixin/src/messaging/send.js.map +0 -1
- package/dist/extensions/weixin/src/messaging/slash-commands.js.map +0 -1
- package/dist/extensions/weixin/src/messaging/typing-ticket-store.js.map +0 -1
- package/dist/extensions/weixin/src/monitor/monitor.js.map +0 -1
- package/dist/extensions/weixin/src/outbound-send.js.map +0 -1
- package/dist/extensions/weixin/src/pairing-config-resolver.js.map +0 -1
- package/dist/extensions/weixin/src/plugin.js.map +0 -1
- package/dist/extensions/weixin/src/routing-integration.js.map +0 -1
- package/dist/extensions/weixin/src/storage/state-dir.js.map +0 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js.map +0 -1
- package/dist/extensions/weixin/src/util/logger.js.map +0 -1
- package/dist/extensions/weixin/src/util/random.js.map +0 -1
- package/dist/extensions/weixin/src/util/redact.js.map +0 -1
- package/dist/extensions/weixin/src/workflow-progress.js.map +0 -1
- package/dist/gateway/static/root/assets/agents-Ci1U96gj.js +0 -2
- package/dist/gateway/static/root/assets/apps-page-Z6cQTPS6.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-D7HmeFdr.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-BZ25v96s.js +0 -8
- package/dist/gateway/static/root/assets/channels-settings-Bc7FVeqs.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-P3J5voxb.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-oi41mE3U.js +0 -2
- package/dist/gateway/static/root/assets/desktop-pet-DzdsBRdD.js +0 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-B-URlTdB.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-CGphLe9T.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-CyaLkWhd.js +0 -4
- package/dist/gateway/static/root/assets/goals-page-C-srWhsP.js +0 -2
- package/dist/gateway/static/root/assets/index-DktduA8Z.css +0 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-DcaqgchY.js +0 -2
- package/dist/gateway/static/root/assets/logs-page-B_13EkK7.js +0 -7
- package/dist/gateway/static/root/assets/messages-BIsSVgW7.js +0 -5
- package/dist/gateway/static/root/assets/models-hub-panel-DkCTjUj_.js +0 -2
- package/dist/gateway/static/root/assets/notes-workbench-CfWQczho.js +0 -4
- package/dist/gateway/static/root/assets/project-detail-page-BWOTQX4M.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-C81dHQ5i.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-U1FQUBtJ.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-t6DzYLpM.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DggKrWED.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-DncjFopP.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-Brx1LsY9.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-C_sLcSxh.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-BPzqM78D.js +0 -2
- package/dist/gateway/static/root/assets/user-context-page-Dg_4sJJz.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-Bc-xxEHw.js +0 -1
- package/dist/gateway/static/root/assets/work-discovery-page-CCMe2E98.js +0 -1
- package/dist/gateway/static/root/assets/work-item-detail-page-CnVze8sW.js +0 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-DUKlCVcY.js +0 -3
- package/dist/gateway/static/root/assets/workflows-page-1Hh-__Ur.js +0 -11
- package/dist/gateway/static/root/favicon-icon.svg +0 -187
- package/dist/package.js.map +0 -1
- package/dist/src/activity/context.js.map +0 -1
- package/dist/src/activity/emitter.js.map +0 -1
- package/dist/src/activity/service.js.map +0 -1
- package/dist/src/agent/agent-manager.js.map +0 -1
- package/dist/src/agent/agent-scope.js.map +0 -1
- package/dist/src/agent/background-review/coordinator.js.map +0 -1
- package/dist/src/agent/background-review/prompts.js.map +0 -1
- package/dist/src/agent/background-review/run-background-review.js.map +0 -1
- package/dist/src/agent/background-review/settings.js.map +0 -1
- package/dist/src/agent/bootstrap/bootstrap-cache.js.map +0 -1
- package/dist/src/agent/bootstrap/bootstrap-context.js.map +0 -1
- package/dist/src/agent/bootstrap/bootstrap-files.js.map +0 -1
- package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +0 -1
- package/dist/src/agent/bootstrap/load-bootstrap-files.js.map +0 -1
- package/dist/src/agent/bootstrap/project-agents-context.js.map +0 -1
- package/dist/src/agent/capabilities/definitions.js.map +0 -1
- package/dist/src/agent/capabilities/registry.js.map +0 -1
- package/dist/src/agent/child-agent-factory.js.map +0 -1
- package/dist/src/agent/client-error-format.js.map +0 -1
- package/dist/src/agent/code-intelligence/binary.js.map +0 -1
- package/dist/src/agent/code-intelligence/runtime.js.map +0 -1
- package/dist/src/agent/code-intelligence/tools.js.map +0 -1
- package/dist/src/agent/coding/turn-diff-tracker.js.map +0 -1
- package/dist/src/agent/context/expand-at-file-mentions.js.map +0 -1
- package/dist/src/agent/context/project-context.js.map +0 -1
- package/dist/src/agent/context/workspace-seed.js.map +0 -1
- package/dist/src/agent/context/workspace-state.js.map +0 -1
- package/dist/src/agent/context/workspace.js.map +0 -1
- package/dist/src/agent/embedded/run-for-session.js.map +0 -1
- package/dist/src/agent/embedded/run-turn.js.map +0 -1
- package/dist/src/agent/embedded/runs.js.map +0 -1
- package/dist/src/agent/embedded/session-manager-init.js.map +0 -1
- package/dist/src/agent/embedded/session-runner.js.map +0 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js.map +0 -1
- package/dist/src/agent/embedded/sqlite-hydrating-session-manager.js.map +0 -1
- package/dist/src/agent/embedded/subscribe-session.js.map +0 -1
- package/dist/src/agent/embedded/system-prompt-override.js.map +0 -1
- package/dist/src/agent/embedded/tool-result-context-guard.js.map +0 -1
- package/dist/src/agent/embedded/tool-result-truncation.js.map +0 -1
- package/dist/src/agent/embedded/xopc-auth-storage.js.map +0 -1
- package/dist/src/agent/embedded/xopc-stream-bridge.js.map +0 -1
- package/dist/src/agent/embedded/xopc-tools-bridge.js.map +0 -1
- package/dist/src/agent/failover-error.js.map +0 -1
- package/dist/src/agent/fallback/candidates.js.map +0 -1
- package/dist/src/agent/fallback/reason.js.map +0 -1
- package/dist/src/agent/feedback/feedback-coordinator.js.map +0 -1
- package/dist/src/agent/goals/checklist-judge.js.map +0 -1
- package/dist/src/agent/goals/checklist-types.js.map +0 -1
- package/dist/src/agent/goals/evaluate-turn.js.map +0 -1
- package/dist/src/agent/goals/goal-locale.js.map +0 -1
- package/dist/src/agent/goals/judge.js.map +0 -1
- package/dist/src/agent/goals/persistent-goal-service.js.map +0 -1
- package/dist/src/agent/goals/post-turn.js.map +0 -1
- package/dist/src/agent/goals/state.js.map +0 -1
- package/dist/src/agent/image/generation/bundled-registry.js.map +0 -1
- package/dist/src/agent/image/generation/bundled.js.map +0 -1
- package/dist/src/agent/image/generation/image-assets.js.map +0 -1
- package/dist/src/agent/image/generation/model-ref.js.map +0 -1
- package/dist/src/agent/image/generation/normalization.js.map +0 -1
- package/dist/src/agent/image/generation/openai-compatible-image-provider.js.map +0 -1
- package/dist/src/agent/image/generation/provider-registry.js.map +0 -1
- package/dist/src/agent/image/generation/runtime.js.map +0 -1
- package/dist/src/agent/image/image-helpers.js.map +0 -1
- package/dist/src/agent/image/image-model-fallback.js.map +0 -1
- package/dist/src/agent/image/inbound-image-handling.js.map +0 -1
- package/dist/src/agent/image/load-image-media.js.map +0 -1
- package/dist/src/agent/image/tool-model-config.js.map +0 -1
- package/dist/src/agent/image/understanding/pi-ai-provider.js.map +0 -1
- package/dist/src/agent/image/understanding/provider-registry.js.map +0 -1
- package/dist/src/agent/image/understanding/runtime.js.map +0 -1
- package/dist/src/agent/image/vision-detection.js.map +0 -1
- package/dist/src/agent/inbound/attachment-pipeline.js.map +0 -1
- package/dist/src/agent/inbound/inbound-loop.js.map +0 -1
- package/dist/src/agent/inbound/turn-dispatcher.js.map +0 -1
- package/dist/src/agent/ipc/bus.js.map +0 -1
- package/dist/src/agent/ipc/inbox.js.map +0 -1
- package/dist/src/agent/ipc/socket.js.map +0 -1
- package/dist/src/agent/ipc/types.js.map +0 -1
- package/dist/src/agent/lifecycle/handlers/compaction.js.map +0 -1
- package/dist/src/agent/lifecycle/hook-handler.js.map +0 -1
- package/dist/src/agent/lifecycle/manager.js.map +0 -1
- package/dist/src/agent/lifecycle/progress.js.map +0 -1
- package/dist/src/agent/lifecycle/timeout-wrapper.js.map +0 -1
- package/dist/src/agent/lifecycle/typing.js.map +0 -1
- package/dist/src/agent/mcp/bundle-mcp-config.js.map +0 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +0 -1
- package/dist/src/agent/mcp/bundle-mcp-names.js.map +0 -1
- package/dist/src/agent/mcp/bundle-mcp-policy.js.map +0 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +0 -1
- package/dist/src/agent/mcp/embedded-mcp.js.map +0 -1
- package/dist/src/agent/mcp/mcp-config-shared.js.map +0 -1
- package/dist/src/agent/mcp/mcp-http.js.map +0 -1
- package/dist/src/agent/mcp/mcp-stdio-transport.js.map +0 -1
- package/dist/src/agent/mcp/mcp-stdio.js.map +0 -1
- package/dist/src/agent/mcp/mcp-tool-meta.js.map +0 -1
- package/dist/src/agent/mcp/mcp-transport-config.js.map +0 -1
- package/dist/src/agent/mcp/mcp-transport.js.map +0 -1
- package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js.map +0 -1
- package/dist/src/agent/media-generation/model-ref.js.map +0 -1
- package/dist/src/agent/media-generation/normalization.types.js.map +0 -1
- package/dist/src/agent/media-generation/runtime-shared.js.map +0 -1
- package/dist/src/agent/memory/agent-message-access.js.map +0 -1
- package/dist/src/agent/memory/builtin-memory-store.js.map +0 -1
- package/dist/src/agent/memory/builtin-provider.js.map +0 -1
- package/dist/src/agent/memory/compaction.js.map +0 -1
- package/dist/src/agent/memory/context/planner.js.map +0 -1
- package/dist/src/agent/memory/context-fence.js.map +0 -1
- package/dist/src/agent/memory/create-memory-manager.js.map +0 -1
- package/dist/src/agent/memory/dreaming/config.js.map +0 -1
- package/dist/src/agent/memory/dreaming/constants.js.map +0 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.js.map +0 -1
- package/dist/src/agent/memory/dreaming/events.js.map +0 -1
- package/dist/src/agent/memory/dreaming/last-run.js.map +0 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js.map +0 -1
- package/dist/src/agent/memory/dreaming/preview.js.map +0 -1
- package/dist/src/agent/memory/dreaming/promotion-lifecycle.js.map +0 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js.map +0 -1
- package/dist/src/agent/memory/dreaming/scope.js.map +0 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js.map +0 -1
- package/dist/src/agent/memory/dreaming/utils.js.map +0 -1
- package/dist/src/agent/memory/lifecycle.js.map +0 -1
- package/dist/src/agent/memory/manager.js.map +0 -1
- package/dist/src/agent/memory/memory-config.js.map +0 -1
- package/dist/src/agent/memory/message-sanitizer.js.map +0 -1
- package/dist/src/agent/memory/plugin-discovery.js.map +0 -1
- package/dist/src/agent/memory/sensitivity.js.map +0 -1
- package/dist/src/agent/memory/source-origin.js.map +0 -1
- package/dist/src/agent/memory/stub-memory-provider.js.map +0 -1
- package/dist/src/agent/memory/summary-generator.js.map +0 -1
- package/dist/src/agent/memory/understanding/correction.js.map +0 -1
- package/dist/src/agent/memory/understanding/quality.js.map +0 -1
- package/dist/src/agent/memory/understanding/service.js.map +0 -1
- package/dist/src/agent/memory/user-context-coordinator.js.map +0 -1
- package/dist/src/agent/memory/user-message-text.js.map +0 -1
- package/dist/src/agent/memory/window.js.map +0 -1
- package/dist/src/agent/messaging/command-handler.js.map +0 -1
- package/dist/src/agent/messaging/message-router.js.map +0 -1
- package/dist/src/agent/messaging/outbound-coordinator.js.map +0 -1
- package/dist/src/agent/messaging/stream-manager.js.map +0 -1
- package/dist/src/agent/middleware/context.js.map +0 -1
- package/dist/src/agent/middleware/self-verify.js.map +0 -1
- package/dist/src/agent/models/manager.js.map +0 -1
- package/dist/src/agent/models/request-limiter.js.map +0 -1
- package/dist/src/agent/models/selection.js.map +0 -1
- package/dist/src/agent/orchestration/agent-event-handler.js.map +0 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +0 -1
- package/dist/src/agent/orchestration/llm-turn-retry.js.map +0 -1
- package/dist/src/agent/orchestration/loop-guard.js.map +0 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js.map +0 -1
- package/dist/src/agent/prompt/cache-boundary.js.map +0 -1
- package/dist/src/agent/prompt/memory/index.js.map +0 -1
- package/dist/src/agent/prompt/safety.js.map +0 -1
- package/dist/src/agent/prompt/sanitize-for-prompt.js.map +0 -1
- package/dist/src/agent/prompt/sections/behavior.js.map +0 -1
- package/dist/src/agent/prompt/sections/memory-skills.js.map +0 -1
- package/dist/src/agent/prompt/sections/messaging-runtime.js.map +0 -1
- package/dist/src/agent/prompt/sections/project-context.js.map +0 -1
- package/dist/src/agent/prompt/sections/tooling.js.map +0 -1
- package/dist/src/agent/prompt/sections/workspace-runtime.js.map +0 -1
- package/dist/src/agent/prompt/service-prompt-builder.js.map +0 -1
- package/dist/src/agent/prompt/subagent-context.js.map +0 -1
- package/dist/src/agent/prompt/system-prompt-params.js.map +0 -1
- package/dist/src/agent/prompt/system-prompt.js.map +0 -1
- package/dist/src/agent/prompt/system-reminder.js.map +0 -1
- package/dist/src/agent/reply/apply-turn-user-enrichment.js.map +0 -1
- package/dist/src/agent/reply/post-compaction-context.js.map +0 -1
- package/dist/src/agent/reply/startup-context.js.map +0 -1
- package/dist/src/agent/reply/workspace-boundary-read.js.map +0 -1
- package/dist/src/agent/sandbox/command-validator.js.map +0 -1
- package/dist/src/agent/sandbox/exec-policy.js.map +0 -1
- package/dist/src/agent/sandbox/path-policy.js.map +0 -1
- package/dist/src/agent/sandbox/sanitize-env-vars.js.map +0 -1
- package/dist/src/agent/sandbox/types.js.map +0 -1
- package/dist/src/agent/service/async-queue.js.map +0 -1
- package/dist/src/agent/service/btw-query.js.map +0 -1
- package/dist/src/agent/service/build-direct-message-content.js.map +0 -1
- package/dist/src/agent/service/direct-turn-helpers.js.map +0 -1
- package/dist/src/agent/service/parse-outbound-session-key.js.map +0 -1
- package/dist/src/agent/service/process-direct-one-shot.js.map +0 -1
- package/dist/src/agent/service/process-direct-streaming.js.map +0 -1
- package/dist/src/agent/service/session-context-report.js.map +0 -1
- package/dist/src/agent/service/webchat-tts.js.map +0 -1
- package/dist/src/agent/service-inbound-utils.js.map +0 -1
- package/dist/src/agent/service.js.map +0 -1
- package/dist/src/agent/session/session-config-service.js.map +0 -1
- package/dist/src/agent/session/session-context.js.map +0 -1
- package/dist/src/agent/session/session-hydrator.js.map +0 -1
- package/dist/src/agent/session/session-inspector.js.map +0 -1
- package/dist/src/agent/session/session-lifecycle.js.map +0 -1
- package/dist/src/agent/session/session-state-bag.js.map +0 -1
- package/dist/src/agent/session/tracker.js.map +0 -1
- package/dist/src/agent/skills/config.js.map +0 -1
- package/dist/src/agent/skills/filesystem-watcher.js.map +0 -1
- package/dist/src/agent/skills/format-skills-prompt.js.map +0 -1
- package/dist/src/agent/skills/hub-hash.js.map +0 -1
- package/dist/src/agent/skills/hub-lock.js.map +0 -1
- package/dist/src/agent/skills/hub-pull.js.map +0 -1
- package/dist/src/agent/skills/index.js.map +0 -1
- package/dist/src/agent/skills/install-target.js.map +0 -1
- package/dist/src/agent/skills/installer.js.map +0 -1
- package/dist/src/agent/skills/managed-store.js.map +0 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +0 -1
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +0 -1
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +0 -1
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +0 -1
- package/dist/src/agent/skills/marketplace/marketplace-category-order.js.map +0 -1
- package/dist/src/agent/skills/marketplace/registry.js.map +0 -1
- package/dist/src/agent/skills/marketplace/resolve-adapter.js.map +0 -1
- package/dist/src/agent/skills/parse-skill-metadata.js.map +0 -1
- package/dist/src/agent/skills/required-env-vars.js.map +0 -1
- package/dist/src/agent/skills/scanner.js.map +0 -1
- package/dist/src/agent/skills/skill-manage-ops.js.map +0 -1
- package/dist/src/agent/skills/skill-manager.js.map +0 -1
- package/dist/src/agent/skills/skill-markdown-preview-from-raw.js.map +0 -1
- package/dist/src/agent/skills/skill-tool-gating.js.map +0 -1
- package/dist/src/agent/skills/skill-view-path.js.map +0 -1
- package/dist/src/agent/skills/skills-marketplace.js.map +0 -1
- package/dist/src/agent/skills/test-framework.js.map +0 -1
- package/dist/src/agent/skills/watcher.js.map +0 -1
- package/dist/src/agent/skills/workspace-skills-dir.js.map +0 -1
- package/dist/src/agent/source-context/injector.js.map +0 -1
- package/dist/src/agent/source-context/types.js.map +0 -1
- package/dist/src/agent/starter-agents.js.map +0 -1
- package/dist/src/agent/streaming/reasoning-visibility-sse.js.map +0 -1
- package/dist/src/agent/tool-manuals/browser.js.map +0 -1
- package/dist/src/agent/tool-manuals/index.js.map +0 -1
- package/dist/src/agent/tool-manuals/xopc-use.js.map +0 -1
- package/dist/src/agent/tools/apply-patch.js.map +0 -1
- package/dist/src/agent/tools/automation-tool.js.map +0 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +0 -1
- package/dist/src/agent/tools/browser/tool/schemas.js.map +0 -1
- package/dist/src/agent/tools/chain-tracker.js.map +0 -1
- package/dist/src/agent/tools/clarify-tool.js.map +0 -1
- package/dist/src/agent/tools/cli-clarify.js.map +0 -1
- package/dist/src/agent/tools/communication.js.map +0 -1
- package/dist/src/agent/tools/composio-tool.js.map +0 -1
- package/dist/src/agent/tools/concurrency.js.map +0 -1
- package/dist/src/agent/tools/create-share-tool.js.map +0 -1
- package/dist/src/agent/tools/curated-memory-tool.js.map +0 -1
- package/dist/src/agent/tools/delegate-tool.js.map +0 -1
- package/dist/src/agent/tools/desktop-pet-tool.js.map +0 -1
- package/dist/src/agent/tools/dreaming-tool.js.map +0 -1
- package/dist/src/agent/tools/edit-diff.js.map +0 -1
- package/dist/src/agent/tools/error-pattern-matcher.js.map +0 -1
- package/dist/src/agent/tools/error-tracker.js.map +0 -1
- package/dist/src/agent/tools/exec-command.js.map +0 -1
- package/dist/src/agent/tools/execute-code-tool.js.map +0 -1
- package/dist/src/agent/tools/executor.js.map +0 -1
- package/dist/src/agent/tools/factory.js.map +0 -1
- package/dist/src/agent/tools/find.js.map +0 -1
- package/dist/src/agent/tools/goal-evidence-recorder.js.map +0 -1
- package/dist/src/agent/tools/goal-tool.js.map +0 -1
- package/dist/src/agent/tools/grep.js.map +0 -1
- package/dist/src/agent/tools/image-generate-tool.js.map +0 -1
- package/dist/src/agent/tools/image-tool.js.map +0 -1
- package/dist/src/agent/tools/list-dir.js.map +0 -1
- package/dist/src/agent/tools/media-read-tool.js.map +0 -1
- package/dist/src/agent/tools/memory-tool.js.map +0 -1
- package/dist/src/agent/tools/metadata.js.map +0 -1
- package/dist/src/agent/tools/read.js.map +0 -1
- package/dist/src/agent/tools/search/http.js.map +0 -1
- package/dist/src/agent/tools/search/providers/bing-api.js.map +0 -1
- package/dist/src/agent/tools/search/providers/bing-html.js.map +0 -1
- package/dist/src/agent/tools/search/providers/brave.js.map +0 -1
- package/dist/src/agent/tools/search/providers/duckduckgo-html.js.map +0 -1
- package/dist/src/agent/tools/search/providers/searxng.js.map +0 -1
- package/dist/src/agent/tools/search/providers/tavily.js.map +0 -1
- package/dist/src/agent/tools/search/region.js.map +0 -1
- package/dist/src/agent/tools/search/registry.js.map +0 -1
- package/dist/src/agent/tools/search/resolve-config.js.map +0 -1
- package/dist/src/agent/tools/send-media.js.map +0 -1
- package/dist/src/agent/tools/session-search-tool.js.map +0 -1
- package/dist/src/agent/tools/session-status-tool.js.map +0 -1
- package/dist/src/agent/tools/skill-install-tool.js.map +0 -1
- package/dist/src/agent/tools/skill-manage-tool.js.map +0 -1
- package/dist/src/agent/tools/skills-tools.js.map +0 -1
- package/dist/src/agent/tools/structured-output.js.map +0 -1
- package/dist/src/agent/tools/todo-tool.js.map +0 -1
- package/dist/src/agent/tools/tool-manual-tool.js.map +0 -1
- package/dist/src/agent/tools/tool-paths.js.map +0 -1
- package/dist/src/agent/tools/truncate.js.map +0 -1
- package/dist/src/agent/tools/tts-tool.js.map +0 -1
- package/dist/src/agent/tools/update-plan-tool.js.map +0 -1
- package/dist/src/agent/tools/url-safety.js.map +0 -1
- package/dist/src/agent/tools/usage-analyzer.js.map +0 -1
- package/dist/src/agent/tools/web-extract.js.map +0 -1
- package/dist/src/agent/tools/web.js.map +0 -1
- package/dist/src/agent/tools/workflow-tool.js.map +0 -1
- package/dist/src/agent/tools/write.js.map +0 -1
- package/dist/src/agent/tools/xopc-use-tool.js.map +0 -1
- package/dist/src/agent/transcript/google-api.js.map +0 -1
- package/dist/src/agent/transcript/model-selection.js.map +0 -1
- package/dist/src/agent/transcript/provider-capabilities.js.map +0 -1
- package/dist/src/agent/transcript/session-transcript-repair.js.map +0 -1
- package/dist/src/agent/transcript/strip-tool-messages.js.map +0 -1
- package/dist/src/agent/transcript/thinking-types.js.map +0 -1
- package/dist/src/agent/transcript/thinking.js.map +0 -1
- package/dist/src/agent/transcript/tool-call-id.js.map +0 -1
- package/dist/src/agent/transcript/transcript-hygiene.js.map +0 -1
- package/dist/src/agent/transcript/transcript-policy.js.map +0 -1
- package/dist/src/agent/workflow/agent-progress.js.map +0 -1
- package/dist/src/agent/workflow/builtins/index.js.map +0 -1
- package/dist/src/agent/workflow/catalog.js.map +0 -1
- package/dist/src/agent/workflow/progress-broker.js.map +0 -1
- package/dist/src/agent/workflow/snapshot-empty.js.map +0 -1
- package/dist/src/agent/workflow/snapshot.js.map +0 -1
- package/dist/src/agent/workflow/step-labels.js.map +0 -1
- package/dist/src/agent/workflow/structured-output-tool.js.map +0 -1
- package/dist/src/agent/workflow/subagent-runner.js.map +0 -1
- package/dist/src/agent/workflow/workflow-child-tools.js.map +0 -1
- package/dist/src/agent/workspace-runtime/registry.js.map +0 -1
- package/dist/src/agent-manifest/index.js.map +0 -1
- package/dist/src/agent-manifest/preset-chain.js.map +0 -1
- package/dist/src/agent-manifest/prompt.js.map +0 -1
- package/dist/src/agent-manifest/resolver.js.map +0 -1
- package/dist/src/agent-manifest/schema.js.map +0 -1
- package/dist/src/agent-manifest/validator.js.map +0 -1
- package/dist/src/agent-runtime/boundary-guard.js.map +0 -1
- package/dist/src/agent-runtime/memory-runtime.js.map +0 -1
- package/dist/src/agent-runtime/model-router.js.map +0 -1
- package/dist/src/agent-runtime/run-trace.js.map +0 -1
- package/dist/src/agent-runtime/runtime-profile.js.map +0 -1
- package/dist/src/agent-runtime/tool-registry.js.map +0 -1
- package/dist/src/agent-runtime/workflow-runtime.js.map +0 -1
- package/dist/src/ai-assist/text-assist.js.map +0 -1
- package/dist/src/auth/credentials.js.map +0 -1
- package/dist/src/auth/index.js.map +0 -1
- package/dist/src/auth/oauth/anthropic.js.map +0 -1
- package/dist/src/auth/oauth/github-copilot.js.map +0 -1
- package/dist/src/auth/oauth/google-oauth/google-antigravity.js.map +0 -1
- package/dist/src/auth/oauth/google-oauth/google-gemini-cli.js.map +0 -1
- package/dist/src/auth/oauth/google-oauth/oauth-page.js.map +0 -1
- package/dist/src/auth/oauth/google-oauth/pkce.js.map +0 -1
- package/dist/src/auth/oauth/kimi-coding.js.map +0 -1
- package/dist/src/auth/oauth/minimax-cn.js.map +0 -1
- package/dist/src/auth/oauth/minimax.js.map +0 -1
- package/dist/src/auth/oauth/openai-codex.js.map +0 -1
- package/dist/src/auth/oauth/pkce.js.map +0 -1
- package/dist/src/auth/profiles/oauth.js.map +0 -1
- package/dist/src/auth/profiles/order.js.map +0 -1
- package/dist/src/auth/profiles/profiles.js.map +0 -1
- package/dist/src/auth/profiles/store.js.map +0 -1
- package/dist/src/auth/sync-provider-auth.js.map +0 -1
- package/dist/src/automations/api/routes.js.map +0 -1
- package/dist/src/automations/domain/schedule.js.map +0 -1
- package/dist/src/automations/domain/validation.js.map +0 -1
- package/dist/src/automations/draft/automation-draft-prompt.js.map +0 -1
- package/dist/src/automations/draft/automation-draft-service.js.map +0 -1
- package/dist/src/automations/draft/automation-draft-validator.js.map +0 -1
- package/dist/src/automations/product-events.js.map +0 -1
- package/dist/src/automations/service/action-executor.js.map +0 -1
- package/dist/src/automations/service/automation-service.js.map +0 -1
- package/dist/src/automations/storage/automation-repository.js.map +0 -1
- package/dist/src/automations/storage/automation-run-repository.js.map +0 -1
- package/dist/src/browser/actions/extension-registry-bridge.js.map +0 -1
- package/dist/src/browser/actions/registry.js.map +0 -1
- package/dist/src/browser/backend-from-config.js.map +0 -1
- package/dist/src/browser/browser-command-timeout.js.map +0 -1
- package/dist/src/browser/cache-dir-policy.js.map +0 -1
- package/dist/src/browser/cdp-local-launcher.js.map +0 -1
- package/dist/src/browser/cdp-supervisor.js.map +0 -1
- package/dist/src/browser/free-port.js.map +0 -1
- package/dist/src/browser/humanize.js.map +0 -1
- package/dist/src/browser/install-lock.js.map +0 -1
- package/dist/src/browser/manager.js.map +0 -1
- package/dist/src/browser/pipeline/output.js.map +0 -1
- package/dist/src/browser/pipeline/runner.js.map +0 -1
- package/dist/src/browser/pipeline/schema.js.map +0 -1
- package/dist/src/browser/pipeline/source.js.map +0 -1
- package/dist/src/browser/pipeline/template.js.map +0 -1
- package/dist/src/browser/providers/browser-ext-install.js.map +0 -1
- package/dist/src/browser/providers/browser-use.js.map +0 -1
- package/dist/src/browser/providers/browserbase.js.map +0 -1
- package/dist/src/browser/providers/cloakbrowser.js.map +0 -1
- package/dist/src/browser/providers/extension-ws-acquire.js.map +0 -1
- package/dist/src/browser/providers/extension.js.map +0 -1
- package/dist/src/browser/providers/playwright-doctor.js.map +0 -1
- package/dist/src/browser/providers/playwright-install.js.map +0 -1
- package/dist/src/browser/readiness.js.map +0 -1
- package/dist/src/browser/schemas.js.map +0 -1
- package/dist/src/browser/session-lifecycle.js.map +0 -1
- package/dist/src/browser/snapshot-helpers.js.map +0 -1
- package/dist/src/browser/stealth.js.map +0 -1
- package/dist/src/browser/url-policy.js.map +0 -1
- package/dist/src/capabilities/store-connector.js.map +0 -1
- package/dist/src/channels/attachments/attachment-classifiers.js.map +0 -1
- package/dist/src/channels/attachments/inbound-persist.js.map +0 -1
- package/dist/src/channels/attachments/inbound-types.js.map +0 -1
- package/dist/src/channels/attachments/outbound-tts-persist.js.map +0 -1
- package/dist/src/channels/attachments/voice-stt-webchat.js.map +0 -1
- package/dist/src/channels/catalog/channel-catalog-service.js.map +0 -1
- package/dist/src/channels/config-helpers.js.map +0 -1
- package/dist/src/channels/envelope-timestamp.js.map +0 -1
- package/dist/src/channels/exec-approval-runtime.js.map +0 -1
- package/dist/src/channels/health-monitor.js.map +0 -1
- package/dist/src/channels/heartbeat-scheduler.js.map +0 -1
- package/dist/src/channels/internal-outbound.js.map +0 -1
- package/dist/src/channels/lifecycle-supervisor.js.map +0 -1
- package/dist/src/channels/manager.js.map +0 -1
- package/dist/src/channels/media.js.map +0 -1
- package/dist/src/channels/outbound/deliver.js.map +0 -1
- package/dist/src/channels/outbound/normalize.js.map +0 -1
- package/dist/src/channels/outbound/persist-store.js.map +0 -1
- package/dist/src/channels/outbound/queue.js.map +0 -1
- package/dist/src/channels/outbound-sender.js.map +0 -1
- package/dist/src/channels/pairing/allow-from-file.js.map +0 -1
- package/dist/src/channels/pairing/approve-cli.js.map +0 -1
- package/dist/src/channels/pairing/pairing-challenge.js.map +0 -1
- package/dist/src/channels/pairing/pairing-constants.js.map +0 -1
- package/dist/src/channels/pairing/pairing-events.js.map +0 -1
- package/dist/src/channels/pairing/pairing-messages.js.map +0 -1
- package/dist/src/channels/pairing/pairing-service.js.map +0 -1
- package/dist/src/channels/pairing/pairing-store-adapter.js.map +0 -1
- package/dist/src/channels/pairing/pairing-store.js.map +0 -1
- package/dist/src/channels/pairing/paths.js.map +0 -1
- package/dist/src/channels/pairing/preseed-allow-from.js.map +0 -1
- package/dist/src/channels/pipeline.js.map +0 -1
- package/dist/src/channels/plugin-registry.js.map +0 -1
- package/dist/src/channels/plugins/registry.js.map +0 -1
- package/dist/src/channels/restart-policy.js.map +0 -1
- package/dist/src/channels/security-helpers.js.map +0 -1
- package/dist/src/channels/security.js.map +0 -1
- package/dist/src/channels/setup-wizard-discovery.js.map +0 -1
- package/dist/src/chat-commands/agent-edit.js.map +0 -1
- package/dist/src/chat-commands/builtins/config.js.map +0 -1
- package/dist/src/chat-commands/builtins/context.js.map +0 -1
- package/dist/src/chat-commands/builtins/goal.js.map +0 -1
- package/dist/src/chat-commands/builtins/model.js.map +0 -1
- package/dist/src/chat-commands/builtins/review.js.map +0 -1
- package/dist/src/chat-commands/builtins/session.js.map +0 -1
- package/dist/src/chat-commands/builtins/skill.js.map +0 -1
- package/dist/src/chat-commands/builtins/subgoal.js.map +0 -1
- package/dist/src/chat-commands/builtins/system.js.map +0 -1
- package/dist/src/chat-commands/builtins/thinking.js.map +0 -1
- package/dist/src/chat-commands/builtins/tts.js.map +0 -1
- package/dist/src/chat-commands/builtins/workflow.js.map +0 -1
- package/dist/src/chat-commands/command-parse.js.map +0 -1
- package/dist/src/chat-commands/config-paths.js.map +0 -1
- package/dist/src/chat-commands/config-value.js.map +0 -1
- package/dist/src/chat-commands/context.js.map +0 -1
- package/dist/src/chat-commands/format-output.js.map +0 -1
- package/dist/src/chat-commands/index.js.map +0 -1
- package/dist/src/chat-commands/processor.js.map +0 -1
- package/dist/src/chat-commands/registry.js.map +0 -1
- package/dist/src/chat-commands/session-key.js.map +0 -1
- package/dist/src/cli/argv-invocation.js.map +0 -1
- package/dist/src/cli/argv.js.map +0 -1
- package/dist/src/cli/bin.js.map +0 -1
- package/dist/src/cli/cli-log-level-preset.js.map +0 -1
- package/dist/src/cli/command-catalog.js.map +0 -1
- package/dist/src/cli/command-loaders.js.map +0 -1
- package/dist/src/cli/command-manifest.js.map +0 -1
- package/dist/src/cli/command-path-matches.js.map +0 -1
- package/dist/src/cli/command-path-policy.js.map +0 -1
- package/dist/src/cli/command-startup-policy.js.map +0 -1
- package/dist/src/cli/commands/agent/interactive.js.map +0 -1
- package/dist/src/cli/commands/agent/sessions.js.map +0 -1
- package/dist/src/cli/commands/agent/stream-renderer.js.map +0 -1
- package/dist/src/cli/commands/agent.js.map +0 -1
- package/dist/src/cli/commands/agents.js.map +0 -1
- package/dist/src/cli/commands/auth.js.map +0 -1
- package/dist/src/cli/commands/browser-cli-helpers.js.map +0 -1
- package/dist/src/cli/commands/browser.js.map +0 -1
- package/dist/src/cli/commands/channels.js.map +0 -1
- package/dist/src/cli/commands/config.js.map +0 -1
- package/dist/src/cli/commands/connectors.js.map +0 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +0 -1
- package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js.map +0 -1
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +0 -1
- package/dist/src/cli/commands/doctor/checks/config-health.js.map +0 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js.map +0 -1
- package/dist/src/cli/commands/doctor/checks/gateway-health.js.map +0 -1
- package/dist/src/cli/commands/doctor/checks/gateway-service.js.map +0 -1
- package/dist/src/cli/commands/doctor/checks/migrations.js.map +0 -1
- package/dist/src/cli/commands/doctor/checks/node-version.js.map +0 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +0 -1
- package/dist/src/cli/commands/doctor/checks/security-audit.js.map +0 -1
- package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +0 -1
- package/dist/src/cli/commands/doctor/checks/state-integrity.js.map +0 -1
- package/dist/src/cli/commands/doctor/checks/version-check.js.map +0 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +0 -1
- package/dist/src/cli/commands/doctor/flow.js.map +0 -1
- package/dist/src/cli/commands/doctor/format.js.map +0 -1
- package/dist/src/cli/commands/doctor/index.js.map +0 -1
- package/dist/src/cli/commands/extension-create.js.map +0 -1
- package/dist/src/cli/commands/extension-dev.js.map +0 -1
- package/dist/src/cli/commands/extension-marketplace.js.map +0 -1
- package/dist/src/cli/commands/extension-pack.js.map +0 -1
- package/dist/src/cli/commands/extension.js.map +0 -1
- package/dist/src/cli/commands/gateway/call.js.map +0 -1
- package/dist/src/cli/commands/gateway/health.js.map +0 -1
- package/dist/src/cli/commands/gateway/lifecycle-core.js.map +0 -1
- package/dist/src/cli/commands/gateway/lifecycle.js.map +0 -1
- package/dist/src/cli/commands/gateway/logs.js.map +0 -1
- package/dist/src/cli/commands/gateway/probe.js.map +0 -1
- package/dist/src/cli/commands/gateway/restart-health.js.map +0 -1
- package/dist/src/cli/commands/gateway/restart.js.map +0 -1
- package/dist/src/cli/commands/gateway/run-foreground.js.map +0 -1
- package/dist/src/cli/commands/gateway/service.js.map +0 -1
- package/dist/src/cli/commands/gateway/shared.js.map +0 -1
- package/dist/src/cli/commands/gateway/status.js.map +0 -1
- package/dist/src/cli/commands/gateway/stop.js.map +0 -1
- package/dist/src/cli/commands/gateway/subcommands.js.map +0 -1
- package/dist/src/cli/commands/gateway/token.js.map +0 -1
- package/dist/src/cli/commands/gateway-ssh-tunnel.js.map +0 -1
- package/dist/src/cli/commands/gateway.js.map +0 -1
- package/dist/src/cli/commands/goal.js.map +0 -1
- package/dist/src/cli/commands/image.js.map +0 -1
- package/dist/src/cli/commands/init.js.map +0 -1
- package/dist/src/cli/commands/logs.js.map +0 -1
- package/dist/src/cli/commands/models.js.map +0 -1
- package/dist/src/cli/commands/onboard/channels/index.js.map +0 -1
- package/dist/src/cli/commands/onboard/channels/onboard-to-configurator.js.map +0 -1
- package/dist/src/cli/commands/onboard/channels/registry.js.map +0 -1
- package/dist/src/cli/commands/onboard/channels/wizard-to-configurator.js.map +0 -1
- package/dist/src/cli/commands/onboard/gateway.js.map +0 -1
- package/dist/src/cli/commands/onboard/model.js.map +0 -1
- package/dist/src/cli/commands/onboard.js.map +0 -1
- package/dist/src/cli/commands/profile.js.map +0 -1
- package/dist/src/cli/commands/project.js.map +0 -1
- package/dist/src/cli/commands/providers.js.map +0 -1
- package/dist/src/cli/commands/resume.js.map +0 -1
- package/dist/src/cli/commands/search.js.map +0 -1
- package/dist/src/cli/commands/session/actions.js.map +0 -1
- package/dist/src/cli/commands/session/utils.js.map +0 -1
- package/dist/src/cli/commands/session.js.map +0 -1
- package/dist/src/cli/commands/setup-shared/output.js.map +0 -1
- package/dist/src/cli/commands/setup-shared/prompts.js.map +0 -1
- package/dist/src/cli/commands/setup-shared/runner.js.map +0 -1
- package/dist/src/cli/commands/setup-shared/types.js.map +0 -1
- package/dist/src/cli/commands/setup.js.map +0 -1
- package/dist/src/cli/commands/skills-test.js.map +0 -1
- package/dist/src/cli/commands/skills.js.map +0 -1
- package/dist/src/cli/commands/tailscale.js.map +0 -1
- package/dist/src/cli/commands/tui-runner.js.map +0 -1
- package/dist/src/cli/commands/tui.js.map +0 -1
- package/dist/src/cli/commands/tunnel.js.map +0 -1
- package/dist/src/cli/commands/update.js.map +0 -1
- package/dist/src/cli/commands/voice.js.map +0 -1
- package/dist/src/cli/context.js.map +0 -1
- package/dist/src/cli/extension-cli-register.js.map +0 -1
- package/dist/src/cli/gateway-run-argv.js.map +0 -1
- package/dist/src/cli/gateway-run-fast-path.js.map +0 -1
- package/dist/src/cli/index.js.map +0 -1
- package/dist/src/cli/registry.js.map +0 -1
- package/dist/src/cli/templates.js.map +0 -1
- package/dist/src/cli/utils/colors.js.map +0 -1
- package/dist/src/cli/utils/gateway-client-options.js.map +0 -1
- package/dist/src/cli/utils/gateway-client.js.map +0 -1
- package/dist/src/cli/utils/init-workspace-core.js.map +0 -1
- package/dist/src/cli/utils/init-workspace.js.map +0 -1
- package/dist/src/cli/utils/oauth-login.js.map +0 -1
- package/dist/src/cli/utils/oauth-providers.js.map +0 -1
- package/dist/src/cli/utils/session.js.map +0 -1
- package/dist/src/commands/agents.config.js.map +0 -1
- package/dist/src/config/agent-profile.js.map +0 -1
- package/dist/src/config/agent-typed-models.js.map +0 -1
- package/dist/src/config/commands.flags.js.map +0 -1
- package/dist/src/config/default-model.js.map +0 -1
- package/dist/src/config/diff.js.map +0 -1
- package/dist/src/config/gateway-bind.js.map +0 -1
- package/dist/src/config/index.js.map +0 -1
- package/dist/src/config/loader.js.map +0 -1
- package/dist/src/config/mcp-config-normalize.js.map +0 -1
- package/dist/src/config/model-input.js.map +0 -1
- package/dist/src/config/models-json.js.map +0 -1
- package/dist/src/config/paths-state.js.map +0 -1
- package/dist/src/config/paths.js.map +0 -1
- package/dist/src/config/profile.js.map +0 -1
- package/dist/src/config/public-url.js.map +0 -1
- package/dist/src/config/reload.js.map +0 -1
- package/dist/src/config/resolve-config-value.js.map +0 -1
- package/dist/src/config/rules.js.map +0 -1
- package/dist/src/config/runtime-overrides.js.map +0 -1
- package/dist/src/config/schema.js.map +0 -1
- package/dist/src/config/validate-channel-configs.js.map +0 -1
- package/dist/src/config/voice.js.map +0 -1
- package/dist/src/config/web-patch.js.map +0 -1
- package/dist/src/config/workspace-defaults.js.map +0 -1
- package/dist/src/config/workspace-dirs.js.map +0 -1
- package/dist/src/config/workspace-path-helpers.js.map +0 -1
- package/dist/src/config/workspace-path.js.map +0 -1
- package/dist/src/connectors/approval.js.map +0 -1
- package/dist/src/connectors/auth-provider-registry.js.map +0 -1
- package/dist/src/connectors/builtin-catalog.js.map +0 -1
- package/dist/src/connectors/catalog.js.map +0 -1
- package/dist/src/connectors/composio-catalog.js.map +0 -1
- package/dist/src/connectors/composio-logo.js.map +0 -1
- package/dist/src/connectors/composio-sessions.js.map +0 -1
- package/dist/src/connectors/composio-triggers.js.map +0 -1
- package/dist/src/connectors/composio.js.map +0 -1
- package/dist/src/connectors/connector-memory-sync.js.map +0 -1
- package/dist/src/connectors/health.js.map +0 -1
- package/dist/src/connectors/install.js.map +0 -1
- package/dist/src/connectors/instances.js.map +0 -1
- package/dist/src/connectors/integration-strategy.js.map +0 -1
- package/dist/src/connectors/lifecycle.js.map +0 -1
- package/dist/src/connectors/materialize.js.map +0 -1
- package/dist/src/connectors/policy.js.map +0 -1
- package/dist/src/connectors/providers.js.map +0 -1
- package/dist/src/connectors/registries/modelscope.js.map +0 -1
- package/dist/src/connectors/registries/official-mcp.js.map +0 -1
- package/dist/src/connectors/registries/search.js.map +0 -1
- package/dist/src/connectors/registries/smithery.js.map +0 -1
- package/dist/src/connectors/runtime-adapter-registry.js.map +0 -1
- package/dist/src/connectors/secret-store.js.map +0 -1
- package/dist/src/connectors/setup-secrets.js.map +0 -1
- package/dist/src/connectors/supervisor.js.map +0 -1
- package/dist/src/connectors/usage.js.map +0 -1
- package/dist/src/connectors/workflow-preflight.js.map +0 -1
- package/dist/src/daemon/constants.js.map +0 -1
- package/dist/src/daemon/install-plan.js.map +0 -1
- package/dist/src/daemon/launchd.js.map +0 -1
- package/dist/src/daemon/schtasks.js.map +0 -1
- package/dist/src/daemon/service-audit.js.map +0 -1
- package/dist/src/daemon/service.js.map +0 -1
- package/dist/src/daemon/systemd.js.map +0 -1
- package/dist/src/document-understanding/extract.js.map +0 -1
- package/dist/src/errors/index.js.map +0 -1
- package/dist/src/extensions/activation-context.js.map +0 -1
- package/dist/src/extensions/activation-planner.js.map +0 -1
- package/dist/src/extensions/api.js.map +0 -1
- package/dist/src/extensions/bundle-mcp.js.map +0 -1
- package/dist/src/extensions/bundled-extension-activation.js.map +0 -1
- package/dist/src/extensions/diagnostics.js.map +0 -1
- package/dist/src/extensions/discover-extensions.js.map +0 -1
- package/dist/src/extensions/engine-check.js.map +0 -1
- package/dist/src/extensions/extension-metadata-snapshot.js.map +0 -1
- package/dist/src/extensions/extension-registry-impl.js.map +0 -1
- package/dist/src/extensions/health.js.map +0 -1
- package/dist/src/extensions/hooks.js.map +0 -1
- package/dist/src/extensions/index.js.map +0 -1
- package/dist/src/extensions/install-transaction.js.map +0 -1
- package/dist/src/extensions/install.js.map +0 -1
- package/dist/src/extensions/loader.js.map +0 -1
- package/dist/src/extensions/lockfile.js.map +0 -1
- package/dist/src/extensions/manifest-registry.js.map +0 -1
- package/dist/src/extensions/marketplace.js.map +0 -1
- package/dist/src/extensions/media-provider-contracts.js.map +0 -1
- package/dist/src/extensions/normalize-manifest.js.map +0 -1
- package/dist/src/extensions/onboard-helpers.js.map +0 -1
- package/dist/src/extensions/package-contract.js.map +0 -1
- package/dist/src/extensions/sdk/channel-entry.js.map +0 -1
- package/dist/src/extensions/sdk/channel-helpers.js.map +0 -1
- package/dist/src/extensions/sdk/index.js.map +0 -1
- package/dist/src/extensions/sdk/lazy.js.map +0 -1
- package/dist/src/extensions/sdk/testing.js.map +0 -1
- package/dist/src/extensions/security.js.map +0 -1
- package/dist/src/extensions/slots.js.map +0 -1
- package/dist/src/extensions/speech-provider-contracts.js.map +0 -1
- package/dist/src/extensions/store-zip-limits.js.map +0 -1
- package/dist/src/extensions/typed-event-bus.js.map +0 -1
- package/dist/src/extensions/types/hooks.js.map +0 -1
- package/dist/src/extensions/types/providers.js.map +0 -1
- package/dist/src/extensions/update.js.map +0 -1
- package/dist/src/extensions/when-context.js.map +0 -1
- package/dist/src/extensions/when-expression.js.map +0 -1
- package/dist/src/gateway/agent-builtin-tools.js.map +0 -1
- package/dist/src/gateway/agent-run-relay.js.map +0 -1
- package/dist/src/gateway/agents-admin.js.map +0 -1
- package/dist/src/gateway/auth.js.map +0 -1
- package/dist/src/gateway/capability-presets-admin.js.map +0 -1
- package/dist/src/gateway/chat-limits.js.map +0 -1
- package/dist/src/gateway/chat-stream/mapper.js.map +0 -1
- package/dist/src/gateway/clarify-bridge.js.map +0 -1
- package/dist/src/gateway/clarify-runtime.js.map +0 -1
- package/dist/src/gateway/client-ip.js.map +0 -1
- package/dist/src/gateway/config-tools-web.js.map +0 -1
- package/dist/src/gateway/credential.js.map +0 -1
- package/dist/src/gateway/discovery/mdns.js.map +0 -1
- package/dist/src/gateway/dreaming-automation-reconciler.js.map +0 -1
- package/dist/src/gateway/ensure-network-cors.js.map +0 -1
- package/dist/src/gateway/file-path-classifier.js.map +0 -1
- package/dist/src/gateway/file-reference-registry.js.map +0 -1
- package/dist/src/gateway/global-defaults-admin.js.map +0 -1
- package/dist/src/gateway/heartbeat/service.js.map +0 -1
- package/dist/src/gateway/hono/app.js.map +0 -1
- package/dist/src/gateway/hono/lib/agent-model.js.map +0 -1
- package/dist/src/gateway/hono/lib/config-payload.js.map +0 -1
- package/dist/src/gateway/hono/lib/extension-assets.js.map +0 -1
- package/dist/src/gateway/hono/lib/extension-store.js.map +0 -1
- package/dist/src/gateway/hono/lib/mask-secret-length.js.map +0 -1
- package/dist/src/gateway/hono/lib/route-logger.js.map +0 -1
- package/dist/src/gateway/hono/lib/safe-providers-config.js.map +0 -1
- package/dist/src/gateway/hono/lib/safe-voice-config.js.map +0 -1
- package/dist/src/gateway/hono/lib/startup-unavailable.js.map +0 -1
- package/dist/src/gateway/hono/lib/static-ui.js.map +0 -1
- package/dist/src/gateway/hono/middleware/auth.js.map +0 -1
- package/dist/src/gateway/hono/middleware/log-context.js.map +0 -1
- package/dist/src/gateway/hono/middleware/logger.js.map +0 -1
- package/dist/src/gateway/hono/middleware/route-errors.js.map +0 -1
- package/dist/src/gateway/hono/middleware/scopes.js.map +0 -1
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +0 -1
- package/dist/src/gateway/hono/oauth-async.js.map +0 -1
- package/dist/src/gateway/hono/oauth.js.map +0 -1
- package/dist/src/gateway/hono/routes/activity.js.map +0 -1
- package/dist/src/gateway/hono/routes/agent-stream.js.map +0 -1
- package/dist/src/gateway/hono/routes/agents.js.map +0 -1
- package/dist/src/gateway/hono/routes/ai-assist.js.map +0 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +0 -1
- package/dist/src/gateway/hono/routes/browser-install.js.map +0 -1
- package/dist/src/gateway/hono/routes/browser.js.map +0 -1
- package/dist/src/gateway/hono/routes/capabilities.js.map +0 -1
- package/dist/src/gateway/hono/routes/capability-presets.js.map +0 -1
- package/dist/src/gateway/hono/routes/channels.js.map +0 -1
- package/dist/src/gateway/hono/routes/commands-skills.js.map +0 -1
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +0 -1
- package/dist/src/gateway/hono/routes/config-patch/channels.js.map +0 -1
- package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +0 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js.map +0 -1
- package/dist/src/gateway/hono/routes/config-patch/result.js.map +0 -1
- package/dist/src/gateway/hono/routes/config.js.map +0 -1
- package/dist/src/gateway/hono/routes/connectors.js.map +0 -1
- package/dist/src/gateway/hono/routes/doctor.js.map +0 -1
- package/dist/src/gateway/hono/routes/dreaming.js.map +0 -1
- package/dist/src/gateway/hono/routes/exposure.js.map +0 -1
- package/dist/src/gateway/hono/routes/extension-gateway.js.map +0 -1
- package/dist/src/gateway/hono/routes/global-defaults.js.map +0 -1
- package/dist/src/gateway/hono/routes/goals.js.map +0 -1
- package/dist/src/gateway/hono/routes/home.js.map +0 -1
- package/dist/src/gateway/hono/routes/host-fs.js.map +0 -1
- package/dist/src/gateway/hono/routes/index.js.map +0 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +0 -1
- package/dist/src/gateway/hono/routes/lazy-fallback.js.map +0 -1
- package/dist/src/gateway/hono/routes/local-apps.js.map +0 -1
- package/dist/src/gateway/hono/routes/logs.js.map +0 -1
- package/dist/src/gateway/hono/routes/mcp.js.map +0 -1
- package/dist/src/gateway/hono/routes/media.js.map +0 -1
- package/dist/src/gateway/hono/routes/memory.js.map +0 -1
- package/dist/src/gateway/hono/routes/migrations.js.map +0 -1
- package/dist/src/gateway/hono/routes/mobile.js.map +0 -1
- package/dist/src/gateway/hono/routes/models.js.map +0 -1
- package/dist/src/gateway/hono/routes/notes.js.map +0 -1
- package/dist/src/gateway/hono/routes/projects.js.map +0 -1
- package/dist/src/gateway/hono/routes/public-gateway.js.map +0 -1
- package/dist/src/gateway/hono/routes/search.js.map +0 -1
- package/dist/src/gateway/hono/routes/sessions.js.map +0 -1
- package/dist/src/gateway/hono/routes/shares.js.map +0 -1
- package/dist/src/gateway/hono/routes/site-shares.js.map +0 -1
- package/dist/src/gateway/hono/routes/status.js.map +0 -1
- package/dist/src/gateway/hono/routes/tui.js.map +0 -1
- package/dist/src/gateway/hono/routes/tunnel.js.map +0 -1
- package/dist/src/gateway/hono/routes/update.js.map +0 -1
- package/dist/src/gateway/hono/routes/voice.js.map +0 -1
- package/dist/src/gateway/hono/routes/work-discovery.js.map +0 -1
- package/dist/src/gateway/hono/routes/workflows.js.map +0 -1
- package/dist/src/gateway/hono/routes/workspace.js.map +0 -1
- package/dist/src/gateway/hono/routes/you.js.map +0 -1
- package/dist/src/gateway/hono/sse-json.js.map +0 -1
- package/dist/src/gateway/hono/sse.js.map +0 -1
- package/dist/src/gateway/host.js.map +0 -1
- package/dist/src/gateway/image-capabilities.js.map +0 -1
- package/dist/src/gateway/listen.js.map +0 -1
- package/dist/src/gateway/lock.js.map +0 -1
- package/dist/src/gateway/ports.js.map +0 -1
- package/dist/src/gateway/protocol.js.map +0 -1
- package/dist/src/gateway/public-url.js.map +0 -1
- package/dist/src/gateway/rate-limit/auth-policy.js.map +0 -1
- package/dist/src/gateway/rate-limit/buckets.js.map +0 -1
- package/dist/src/gateway/rate-limit/env-flags.js.map +0 -1
- package/dist/src/gateway/resolve-channel-connect-defer.js.map +0 -1
- package/dist/src/gateway/resolve-webchat-session-key.js.map +0 -1
- package/dist/src/gateway/respawn.js.map +0 -1
- package/dist/src/gateway/run-loop.js.map +0 -1
- package/dist/src/gateway/runtime-config.js.map +0 -1
- package/dist/src/gateway/security/audit.js.map +0 -1
- package/dist/src/gateway/security/csp.js.map +0 -1
- package/dist/src/gateway/security/dangerous-tools.js.map +0 -1
- package/dist/src/gateway/security/external-content.js.map +0 -1
- package/dist/src/gateway/security/known-weak-secrets.js.map +0 -1
- package/dist/src/gateway/security/loopback.js.map +0 -1
- package/dist/src/gateway/security/operator-scopes.js.map +0 -1
- package/dist/src/gateway/security/origin-check.js.map +0 -1
- package/dist/src/gateway/security/preauth-connection-budget.js.map +0 -1
- package/dist/src/gateway/security/secret-equal.js.map +0 -1
- package/dist/src/gateway/server-tailscale.js.map +0 -1
- package/dist/src/gateway/server.js.map +0 -1
- package/dist/src/gateway/service/agent-runner.js.map +0 -1
- package/dist/src/gateway/service/config-coordinator.js.map +0 -1
- package/dist/src/gateway/service/marketplace-service.js.map +0 -1
- package/dist/src/gateway/service/run-gateway-agent.js.map +0 -1
- package/dist/src/gateway/service/session-chat-ids.js.map +0 -1
- package/dist/src/gateway/service/sessions-api.js.map +0 -1
- package/dist/src/gateway/service/sse-hub.js.map +0 -1
- package/dist/src/gateway/service.js.map +0 -1
- package/dist/src/gateway/session-reset-service.js.map +0 -1
- package/dist/src/gateway/startup-readiness.js.map +0 -1
- package/dist/src/gateway/startup-trace.js.map +0 -1
- package/dist/src/gateway/tailscale-auth.js.map +0 -1
- package/dist/src/gateway/tailscale-lifecycle.js.map +0 -1
- package/dist/src/gateway/tls-server.js.map +0 -1
- package/dist/src/gateway/trusted-proxy.js.map +0 -1
- package/dist/src/gateway/user-turn-input.js.map +0 -1
- package/dist/src/gateway/workspace-editor-path.js.map +0 -1
- package/dist/src/gateway/workspace-file-search.js.map +0 -1
- package/dist/src/gateway/workspace-fs-file-list.js.map +0 -1
- package/dist/src/gateway/workspace-heartbeat-path.js.map +0 -1
- package/dist/src/gateway/workspace-ripgrep.js.map +0 -1
- package/dist/src/gateway/ws-security.js.map +0 -1
- package/dist/src/generated/bundled-image-generation-providers.js.map +0 -1
- package/dist/src/goals/goal-contract-draft.js.map +0 -1
- package/dist/src/goals/goal-evidence-review.js.map +0 -1
- package/dist/src/goals/goal-notifications.js.map +0 -1
- package/dist/src/goals/goal-queue-store.js.map +0 -1
- package/dist/src/goals/goal-runner.js.map +0 -1
- package/dist/src/goals/goal-service.js.map +0 -1
- package/dist/src/goals/goal-store.js.map +0 -1
- package/dist/src/goals/goal-workflow-judge.js.map +0 -1
- package/dist/src/heartbeat/active-hours.js.map +0 -1
- package/dist/src/heartbeat/content-check.js.map +0 -1
- package/dist/src/heartbeat/event-prompt.js.map +0 -1
- package/dist/src/heartbeat/tokens.js.map +0 -1
- package/dist/src/heartbeat/wake.js.map +0 -1
- package/dist/src/i18n/format.js.map +0 -1
- package/dist/src/i18n/goals-bundle.js.map +0 -1
- package/dist/src/i18n/locale.js.map +0 -1
- package/dist/src/i18n/locales/goals.en.js.map +0 -1
- package/dist/src/i18n/locales/goals.zh.js.map +0 -1
- package/dist/src/i18n/locales/share-tool.en.js.map +0 -1
- package/dist/src/i18n/locales/share-tool.zh.js.map +0 -1
- package/dist/src/i18n/share-tool-bundle.js.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/infra/brew.js.map +0 -1
- package/dist/src/infra/bus/queue.js.map +0 -1
- package/dist/src/infra/debounce.js.map +0 -1
- package/dist/src/infra/exec.js.map +0 -1
- package/dist/src/infra/gateway-process-argv.js.map +0 -1
- package/dist/src/infra/gateway-processes.js.map +0 -1
- package/dist/src/infra/host-env-security-policy.js.map +0 -1
- package/dist/src/infra/host-env-security.js.map +0 -1
- package/dist/src/infra/http-proxy-env.js.map +0 -1
- package/dist/src/infra/is-main.js.map +0 -1
- package/dist/src/infra/json-utf8-bytes.js.map +0 -1
- package/dist/src/infra/node-sqlite.js.map +0 -1
- package/dist/src/infra/package-json.js.map +0 -1
- package/dist/src/infra/package-update-steps.js.map +0 -1
- package/dist/src/infra/path-env.js.map +0 -1
- package/dist/src/infra/path-prepend.js.map +0 -1
- package/dist/src/infra/ports.js.map +0 -1
- package/dist/src/infra/rate-limit/failure-limiter.js.map +0 -1
- package/dist/src/infra/rate-limit/keyed-store.js.map +0 -1
- package/dist/src/infra/rate-limit/rate-limiter.js.map +0 -1
- package/dist/src/infra/restart.js.map +0 -1
- package/dist/src/infra/retry.js.map +0 -1
- package/dist/src/infra/run-command.js.map +0 -1
- package/dist/src/infra/sqlite-errors.js.map +0 -1
- package/dist/src/infra/ssh-tunnel.js.map +0 -1
- package/dist/src/infra/stable-node-path.js.map +0 -1
- package/dist/src/infra/tailscale.js.map +0 -1
- package/dist/src/infra/undici-fetch.js.map +0 -1
- package/dist/src/infra/unhandled-rejections.js.map +0 -1
- package/dist/src/infra/update-channels.js.map +0 -1
- package/dist/src/infra/update-check.js.map +0 -1
- package/dist/src/infra/update-global.js.map +0 -1
- package/dist/src/infra/update-lock.js.map +0 -1
- package/dist/src/infra/update-log.js.map +0 -1
- package/dist/src/infra/update-restart.js.map +0 -1
- package/dist/src/infra/update-runner.js.map +0 -1
- package/dist/src/infra/update-startup.js.map +0 -1
- package/dist/src/infra/warning-filter.js.map +0 -1
- package/dist/src/infra/write-file-atomic.js.map +0 -1
- package/dist/src/knowledge/connected-knowledge-pipeline.js.map +0 -1
- package/dist/src/knowledge/coordinator.js.map +0 -1
- package/dist/src/knowledge/ingestion-service.js.map +0 -1
- package/dist/src/local-apps/acceptance.js.map +0 -1
- package/dist/src/local-apps/preview-runtime-bridge.js.map +0 -1
- package/dist/src/local-apps/runtime-entry.js.map +0 -1
- package/dist/src/local-apps/scaffold.js.map +0 -1
- package/dist/src/local-apps/service.js.map +0 -1
- package/dist/src/local-apps/store.js.map +0 -1
- package/dist/src/markdown/chunk.js.map +0 -1
- package/dist/src/markdown/code-spans.js.map +0 -1
- package/dist/src/markdown/fences.js.map +0 -1
- package/dist/src/markdown/frontmatter.js.map +0 -1
- package/dist/src/markdown/ir.js.map +0 -1
- package/dist/src/markdown/render.js.map +0 -1
- package/dist/src/markdown/tables.js.map +0 -1
- package/dist/src/mcp/channel-bridge.js.map +0 -1
- package/dist/src/mcp/channel-server.js.map +0 -1
- package/dist/src/mcp/channel-shared.js.map +0 -1
- package/dist/src/mcp/channel-tools.js.map +0 -1
- package/dist/src/mcp/gateway-http-client.js.map +0 -1
- package/dist/src/media/media-reference.js.map +0 -1
- package/dist/src/media/paths.js.map +0 -1
- package/dist/src/media/session-references.js.map +0 -1
- package/dist/src/media/store.js.map +0 -1
- package/dist/src/media/uri.js.map +0 -1
- package/dist/src/media-shared/http/api-key-rotation.js.map +0 -1
- package/dist/src/media-shared/http/deadline.js.map +0 -1
- package/dist/src/media-shared/http/private-network.js.map +0 -1
- package/dist/src/media-shared/http/provider-http-errors.js.map +0 -1
- package/dist/src/media-shared/http/provider-http.js.map +0 -1
- package/dist/src/media-shared/http/resolve-provider-http-request-config.js.map +0 -1
- package/dist/src/media-shared/http/ssrf-guard.js.map +0 -1
- package/dist/src/media-shared/http/test-helpers/mock-server.js.map +0 -1
- package/dist/src/media-understanding/audio-transcription-runner.js.map +0 -1
- package/dist/src/media-understanding/openai-compatible-audio.js.map +0 -1
- package/dist/src/media-understanding/registry.js.map +0 -1
- package/dist/src/media-understanding/resolve-entries.js.map +0 -1
- package/dist/src/media-understanding/runner.js.map +0 -1
- package/dist/src/migrations/config/default-capability-preset.js.map +0 -1
- package/dist/src/migrations/registry.js.map +0 -1
- package/dist/src/migrations/runner.js.map +0 -1
- package/dist/src/mobile/notification-service.js.map +0 -1
- package/dist/src/mobile/notification-store.js.map +0 -1
- package/dist/src/mobile/notification-types.js.map +0 -1
- package/dist/src/notes/agent-context.js.map +0 -1
- package/dist/src/notes/attachment-ref.js.map +0 -1
- package/dist/src/notes/note-attachment-sync.js.map +0 -1
- package/dist/src/notes/note-index-meta.js.map +0 -1
- package/dist/src/notes/note-markdown.js.map +0 -1
- package/dist/src/notes/paths.js.map +0 -1
- package/dist/src/notes/service.js.map +0 -1
- package/dist/src/notes/store.js.map +0 -1
- package/dist/src/package-version.js.map +0 -1
- package/dist/src/pets/factory.js.map +0 -1
- package/dist/src/pets/manifest.js.map +0 -1
- package/dist/src/pets/validator.js.map +0 -1
- package/dist/src/process/kill-tree.js.map +0 -1
- package/dist/src/project-trust/trust-store.js.map +0 -1
- package/dist/src/projects/automation-bind.js.map +0 -1
- package/dist/src/projects/goal-bind.js.map +0 -1
- package/dist/src/projects/memory-bind.js.map +0 -1
- package/dist/src/projects/project-agent-suggestion.js.map +0 -1
- package/dist/src/projects/project-agent.js.map +0 -1
- package/dist/src/projects/project-kind.js.map +0 -1
- package/dist/src/projects/project-loop.js.map +0 -1
- package/dist/src/projects/project-service.js.map +0 -1
- package/dist/src/projects/project-store.js.map +0 -1
- package/dist/src/projects/session-bind.js.map +0 -1
- package/dist/src/projects/workflow-bind.js.map +0 -1
- package/dist/src/projects/workspace-project.js.map +0 -1
- package/dist/src/projects/workspace.js.map +0 -1
- package/dist/src/providers/auth-runtime/auth-profile-store.js.map +0 -1
- package/dist/src/providers/auth-runtime/is-configured.js.map +0 -1
- package/dist/src/providers/auth-runtime/oauth.js.map +0 -1
- package/dist/src/providers/auth-runtime/resolve-api-key.js.map +0 -1
- package/dist/src/providers/auth-runtime/resolve-auth.js.map +0 -1
- package/dist/src/providers/constants.js.map +0 -1
- package/dist/src/providers/domestic-presets.js.map +0 -1
- package/dist/src/providers/env-keys.js.map +0 -1
- package/dist/src/providers/extension-stream-bridge.js.map +0 -1
- package/dist/src/providers/index.js.map +0 -1
- package/dist/src/providers/model-call.js.map +0 -1
- package/dist/src/providers/model-discovery.js.map +0 -1
- package/dist/src/providers/model-registry.js.map +0 -1
- package/dist/src/providers/model-supplements.js.map +0 -1
- package/dist/src/providers/plugin-registry.js.map +0 -1
- package/dist/src/providers/presentation.js.map +0 -1
- package/dist/src/remote-access/exposure-guards.js.map +0 -1
- package/dist/src/remote-access/exposure-manager.js.map +0 -1
- package/dist/src/review/review-git.js.map +0 -1
- package/dist/src/review/review-types.js.map +0 -1
- package/dist/src/routing/account-id.js.map +0 -1
- package/dist/src/routing/agent-session-key.js.map +0 -1
- package/dist/src/routing/bindings.js.map +0 -1
- package/dist/src/routing/index.js.map +0 -1
- package/dist/src/routing/resolve-route.js.map +0 -1
- package/dist/src/routing/resolve-tui-session-key.js.map +0 -1
- package/dist/src/routing/session-key-utils.js.map +0 -1
- package/dist/src/routing/session-key.js.map +0 -1
- package/dist/src/session/abort-cutoff.js.map +0 -1
- package/dist/src/session/chat-export.js.map +0 -1
- package/dist/src/session/client-history.js.map +0 -1
- package/dist/src/session/compaction-checkpoints.js.map +0 -1
- package/dist/src/session/config-store.js.map +0 -1
- package/dist/src/session/init-session-turn.js.map +0 -1
- package/dist/src/session/lifecycle-timestamps.js.map +0 -1
- package/dist/src/session/load-jsonl-entries.js.map +0 -1
- package/dist/src/session/manager.js.map +0 -1
- package/dist/src/session/patch-metadata.js.map +0 -1
- package/dist/src/session/reset-policy.js.map +0 -1
- package/dist/src/session/reset-triggers.js.map +0 -1
- package/dist/src/session/reset-type.js.map +0 -1
- package/dist/src/session/resolve-session.js.map +0 -1
- package/dist/src/session/session-context-for-llm.js.map +0 -1
- package/dist/src/session/session-id.js.map +0 -1
- package/dist/src/session/session-title.js.map +0 -1
- package/dist/src/session/session-workspace.js.map +0 -1
- package/dist/src/session/store.js.map +0 -1
- package/dist/src/session/stored-rows-to-file-entries.js.map +0 -1
- package/dist/src/session/thinking-resolve.js.map +0 -1
- package/dist/src/session/transcript-events.js.map +0 -1
- package/dist/src/session/transcript-format.js.map +0 -1
- package/dist/src/session/transcript-outline.js.map +0 -1
- package/dist/src/session/transcript-stats.js.map +0 -1
- package/dist/src/session/types.js.map +0 -1
- package/dist/src/session/user-round-delete.js.map +0 -1
- package/dist/src/share/share-audit.js.map +0 -1
- package/dist/src/share/share-auto.js.map +0 -1
- package/dist/src/share/share-config.js.map +0 -1
- package/dist/src/share/share-landing.js.map +0 -1
- package/dist/src/share/share-rate-limit.js.map +0 -1
- package/dist/src/share/share-store.js.map +0 -1
- package/dist/src/share/share-thumbnail.js.map +0 -1
- package/dist/src/share/share-types.js.map +0 -1
- package/dist/src/share/share-url.js.map +0 -1
- package/dist/src/share/share-zip.js.map +0 -1
- package/dist/src/share/site-proxy.js.map +0 -1
- package/dist/src/share/site-share-config.js.map +0 -1
- package/dist/src/share/site-share-router.js.map +0 -1
- package/dist/src/share/site-share-store.js.map +0 -1
- package/dist/src/share/site-share-types.js.map +0 -1
- package/dist/src/share/site-static-serve.js.map +0 -1
- package/dist/src/storage/sqlite/activity-repository.js.map +0 -1
- package/dist/src/storage/sqlite/config-repository.js.map +0 -1
- package/dist/src/storage/sqlite/connection.js.map +0 -1
- package/dist/src/storage/sqlite/connector-repository.js.map +0 -1
- package/dist/src/storage/sqlite/fts.js.map +0 -1
- package/dist/src/storage/sqlite/knowledge-repository.js.map +0 -1
- package/dist/src/storage/sqlite/memory-index-repository.js.map +0 -1
- package/dist/src/storage/sqlite/memory-records-repository.js.map +0 -1
- package/dist/src/storage/sqlite/memory-reference-consent-repository.js.map +0 -1
- package/dist/src/storage/sqlite/migrations/discover.js.map +0 -1
- package/dist/src/storage/sqlite/migrations/errors.js.map +0 -1
- package/dist/src/storage/sqlite/migrations/runner.js.map +0 -1
- package/dist/src/storage/sqlite/note-agent-context-repository.js.map +0 -1
- package/dist/src/storage/sqlite/notes-repository.js.map +0 -1
- package/dist/src/storage/sqlite/paths.js.map +0 -1
- package/dist/src/storage/sqlite/row-mappers.js.map +0 -1
- package/dist/src/storage/sqlite/schema-version.js.map +0 -1
- package/dist/src/storage/sqlite/schema.js.map +0 -1
- package/dist/src/storage/sqlite/session-metadata.js.map +0 -1
- package/dist/src/storage/sqlite/session-repository.js.map +0 -1
- package/dist/src/storage/sqlite/transaction.js.map +0 -1
- package/dist/src/storage/sqlite/transcript-repository.js.map +0 -1
- package/dist/src/storage/sqlite/user-profile-setup-repository.js.map +0 -1
- package/dist/src/storage/sqlite/user-trust-repository.js.map +0 -1
- package/dist/src/tui/backends/embedded-backend.js.map +0 -1
- package/dist/src/tui/backends/gateway-sse-backend.js.map +0 -1
- package/dist/src/tui/chat-history.js.map +0 -1
- package/dist/src/tui/clipboard-image.js.map +0 -1
- package/dist/src/tui/clipboard-text.js.map +0 -1
- package/dist/src/tui/components/assistant-message.js.map +0 -1
- package/dist/src/tui/components/bash-execution.js.map +0 -1
- package/dist/src/tui/components/bash-summary.js.map +0 -1
- package/dist/src/tui/components/branch-message-summary.js.map +0 -1
- package/dist/src/tui/components/branch-summary.js.map +0 -1
- package/dist/src/tui/components/chat-log.js.map +0 -1
- package/dist/src/tui/components/compaction-summary.js.map +0 -1
- package/dist/src/tui/components/custom-editor.js.map +0 -1
- package/dist/src/tui/components/custom-message.js.map +0 -1
- package/dist/src/tui/components/dynamic-border.js.map +0 -1
- package/dist/src/tui/components/extension-dialog.js.map +0 -1
- package/dist/src/tui/components/fuzzy-filter.js.map +0 -1
- package/dist/src/tui/components/scoped-models-selector.js.map +0 -1
- package/dist/src/tui/components/searchable-select-list.js.map +0 -1
- package/dist/src/tui/components/session-selector.js.map +0 -1
- package/dist/src/tui/components/settings-selector.js.map +0 -1
- package/dist/src/tui/components/thinking-selector.js.map +0 -1
- package/dist/src/tui/components/tool-execution.js.map +0 -1
- package/dist/src/tui/components/tui-bottom-bar.js.map +0 -1
- package/dist/src/tui/components/tui-header.js.map +0 -1
- package/dist/src/tui/components/user-message.js.map +0 -1
- package/dist/src/tui/components/visual-truncate.js.map +0 -1
- package/dist/src/tui/extension-host/autocomplete.js.map +0 -1
- package/dist/src/tui/extension-host/host.js.map +0 -1
- package/dist/src/tui/extension-host/load-extensions.js.map +0 -1
- package/dist/src/tui/extension-host/runtime-context.js.map +0 -1
- package/dist/src/tui/extension-host/runtime.js.map +0 -1
- package/dist/src/tui/extension-host/surface.js.map +0 -1
- package/dist/src/tui/extension-host/tool-renderers.js.map +0 -1
- package/dist/src/tui/format-tui-hotkeys.js.map +0 -1
- package/dist/src/tui/sse-consumer.js.map +0 -1
- package/dist/src/tui/theme/dark.js.map +0 -1
- package/dist/src/tui/theme/light.js.map +0 -1
- package/dist/src/tui/theme-manager.js.map +0 -1
- package/dist/src/tui/theme.js.map +0 -1
- package/dist/src/tui/tool-summary.js.map +0 -1
- package/dist/src/tui/tui-agent-events.js.map +0 -1
- package/dist/src/tui/tui-command-formatters.js.map +0 -1
- package/dist/src/tui/tui-commands.js.map +0 -1
- package/dist/src/tui/tui-context-usage.js.map +0 -1
- package/dist/src/tui/tui-extension-user-message.js.map +0 -1
- package/dist/src/tui/tui-fd-path.js.map +0 -1
- package/dist/src/tui/tui-file-autocomplete.js.map +0 -1
- package/dist/src/tui/tui-follow-up-queue.js.map +0 -1
- package/dist/src/tui/tui-git-branch.js.map +0 -1
- package/dist/src/tui/tui-keybindings-file.js.map +0 -1
- package/dist/src/tui/tui-lifecycle.js.map +0 -1
- package/dist/src/tui/tui-local-shell.js.map +0 -1
- package/dist/src/tui/tui-model-picker.js.map +0 -1
- package/dist/src/tui/tui-oauth-login.js.map +0 -1
- package/dist/src/tui/tui-overlays.js.map +0 -1
- package/dist/src/tui/tui-picker-overlay.js.map +0 -1
- package/dist/src/tui/tui-run-state.js.map +0 -1
- package/dist/src/tui/tui-run-status-format.js.map +0 -1
- package/dist/src/tui/tui-runtime-hints.js.map +0 -1
- package/dist/src/tui/tui-scoped-models.js.map +0 -1
- package/dist/src/tui/tui-session-actions.js.map +0 -1
- package/dist/src/tui/tui-session-format.js.map +0 -1
- package/dist/src/tui/tui-session-snapshot.js.map +0 -1
- package/dist/src/tui/tui-session-stats.js.map +0 -1
- package/dist/src/tui/tui-settings.js.map +0 -1
- package/dist/src/tui/tui-skills-autocomplete.js.map +0 -1
- package/dist/src/tui/tui-startup-resources.js.map +0 -1
- package/dist/src/tui/tui-startup-text.js.map +0 -1
- package/dist/src/tui/tui-stdio-filter.js.map +0 -1
- package/dist/src/tui/tui-submit.js.map +0 -1
- package/dist/src/tui/tui-suspend.js.map +0 -1
- package/dist/src/tui/tui-timeline-picker.js.map +0 -1
- package/dist/src/tui/tui-timeline.js.map +0 -1
- package/dist/src/tui/tui-tool-diff.js.map +0 -1
- package/dist/src/tui/tui-tool-result.js.map +0 -1
- package/dist/src/tui/tui-transcript-tree-picker.js.map +0 -1
- package/dist/src/tui/tui-transcript-tree.js.map +0 -1
- package/dist/src/tui/tui-types.js.map +0 -1
- package/dist/src/tui/tui-workflow-slash.js.map +0 -1
- package/dist/src/tui/tui.js.map +0 -1
- package/dist/src/tui/xopc-tui-keybindings.js.map +0 -1
- package/dist/src/tunnel/broker-client.js.map +0 -1
- package/dist/src/tunnel/consent.js.map +0 -1
- package/dist/src/tunnel/enable-lan-pairing.js.map +0 -1
- package/dist/src/tunnel/env.js.map +0 -1
- package/dist/src/tunnel/frp-subdomain-host.js.map +0 -1
- package/dist/src/tunnel/frpc-binary.js.map +0 -1
- package/dist/src/tunnel/frpc-config.js.map +0 -1
- package/dist/src/tunnel/frpc-extract.js.map +0 -1
- package/dist/src/tunnel/frpc-process.js.map +0 -1
- package/dist/src/tunnel/gateway-lifecycle.js.map +0 -1
- package/dist/src/tunnel/pair-context.js.map +0 -1
- package/dist/src/tunnel/pair-url.js.map +0 -1
- package/dist/src/tunnel/pairing-rate-limit.js.map +0 -1
- package/dist/src/tunnel/pairing.js.map +0 -1
- package/dist/src/tunnel/tunnel-audit.js.map +0 -1
- package/dist/src/tunnel/tunnel-config.js.map +0 -1
- package/dist/src/tunnel/tunnel-persist.js.map +0 -1
- package/dist/src/tunnel/tunnel-qr.js.map +0 -1
- package/dist/src/tunnel/tunnel-rate-limit.js.map +0 -1
- package/dist/src/tunnel/tunnel-service.js.map +0 -1
- package/dist/src/tunnel/tunnel-state.js.map +0 -1
- package/dist/src/tunnel/well-known.js.map +0 -1
- package/dist/src/user-context/config.js.map +0 -1
- package/dist/src/user-context/import.js.map +0 -1
- package/dist/src/user-context/owner.js.map +0 -1
- package/dist/src/user-context/profile.js.map +0 -1
- package/dist/src/user-context/projection.js.map +0 -1
- package/dist/src/user-context/runtime.js.map +0 -1
- package/dist/src/user-context/source-recommendations.js.map +0 -1
- package/dist/src/user-context/trust-policy.js.map +0 -1
- package/dist/src/utils/global-singleton.js.map +0 -1
- package/dist/src/utils/helpers.js.map +0 -1
- package/dist/src/utils/index.js.map +0 -1
- package/dist/src/utils/is-record.js.map +0 -1
- package/dist/src/utils/logger/audit.js.map +0 -1
- package/dist/src/utils/logger/config.js.map +0 -1
- package/dist/src/utils/logger/context.js.map +0 -1
- package/dist/src/utils/logger/exporters.js.map +0 -1
- package/dist/src/utils/logger/index.js.map +0 -1
- package/dist/src/utils/logger/log-store.js.map +0 -1
- package/dist/src/utils/logger/log-stream.js.map +0 -1
- package/dist/src/utils/logger/pino-record.js.map +0 -1
- package/dist/src/utils/logger/redact.js.map +0 -1
- package/dist/src/utils/logger/rotation.js.map +0 -1
- package/dist/src/utils/logger/shutdown.js.map +0 -1
- package/dist/src/utils/logger/stats.js.map +0 -1
- package/dist/src/utils/logger/streams.js.map +0 -1
- package/dist/src/utils/logger/types.js.map +0 -1
- package/dist/src/utils/logger.js.map +0 -1
- package/dist/src/utils/redact-sensitive-url.js.map +0 -1
- package/dist/src/utils/sanitize-log.js.map +0 -1
- package/dist/src/utils/string-coerce.js.map +0 -1
- package/dist/src/voice/language-profile.js.map +0 -1
- package/dist/src/voice/local/model-files.js.map +0 -1
- package/dist/src/voice/local/model-manager.js.map +0 -1
- package/dist/src/voice/local/models.js.map +0 -1
- package/dist/src/voice/local/runtime-client.js.map +0 -1
- package/dist/src/voice/local/runtime-dispatcher.js.map +0 -1
- package/dist/src/voice/local/runtime-worker.js.map +0 -1
- package/dist/src/voice/local/wav.js.map +0 -1
- package/dist/src/voice/metadata/builtin.js.map +0 -1
- package/dist/src/voice/metadata/registry.js.map +0 -1
- package/dist/src/voice/stt/availability.js.map +0 -1
- package/dist/src/voice/stt/config-slice.js.map +0 -1
- package/dist/src/voice/stt/factory.js.map +0 -1
- package/dist/src/voice/stt/index.js.map +0 -1
- package/dist/src/voice/stt/list-providers.js.map +0 -1
- package/dist/src/voice/stt/mention.js.map +0 -1
- package/dist/src/voice/stt/preflight.js.map +0 -1
- package/dist/src/voice/stt/providers/alibaba-transcription.js.map +0 -1
- package/dist/src/voice/stt/providers/local-transcription.js.map +0 -1
- package/dist/src/voice/stt/providers/openai-transcription.js.map +0 -1
- package/dist/src/voice/stt/transcribe-core.js.map +0 -1
- package/dist/src/voice/stt/types.js.map +0 -1
- package/dist/src/voice/tts/audio.js.map +0 -1
- package/dist/src/voice/tts/config-slice.js.map +0 -1
- package/dist/src/voice/tts/directives.js.map +0 -1
- package/dist/src/voice/tts/factory.js.map +0 -1
- package/dist/src/voice/tts/list-providers.js.map +0 -1
- package/dist/src/voice/tts/merge-config.js.map +0 -1
- package/dist/src/voice/tts/openai-compatible-speech.js.map +0 -1
- package/dist/src/voice/tts/payload.js.map +0 -1
- package/dist/src/voice/tts/preprocess.js.map +0 -1
- package/dist/src/voice/tts/providers/alibaba-speech.js.map +0 -1
- package/dist/src/voice/tts/providers/edge-speech.js.map +0 -1
- package/dist/src/voice/tts/providers/minimax-speech.js.map +0 -1
- package/dist/src/voice/tts/providers/openai-speech.js.map +0 -1
- package/dist/src/voice/tts/sentence-boundary.js.map +0 -1
- package/dist/src/voice/tts/service.js.map +0 -1
- package/dist/src/voice/tts/speak-core.js.map +0 -1
- package/dist/src/voice/tts/speech-registry.js.map +0 -1
- package/dist/src/voice/tts/status-tracker.js.map +0 -1
- package/dist/src/voice/tts/summarize.js.map +0 -1
- package/dist/src/voice/tts/types.js.map +0 -1
- package/dist/src/work-discovery/analyzer.js.map +0 -1
- package/dist/src/work-discovery/probe.js.map +0 -1
- package/dist/src/work-discovery/repository.js.map +0 -1
- package/dist/src/work-discovery/service.js.map +0 -1
- package/dist/src/work-items/agent-context.js.map +0 -1
- package/dist/src/work-items/work-item-service.js.map +0 -1
- package/dist/src/work-items/work-item-store.js.map +0 -1
- package/dist/src/work-items/work-item-workflow-judge.js.map +0 -1
- package/dist/src/workflows/authoring/workflow-draft-store.js.map +0 -1
- package/dist/src/workflows/domain/definition-utils.js.map +0 -1
- package/dist/src/workflows/domain/run.js.map +0 -1
- package/dist/src/workflows/domain/schema-validation.js.map +0 -1
- package/dist/src/workflows/domain/validation.js.map +0 -1
- package/dist/src/workflows/draft/workflow-draft-prompt.js.map +0 -1
- package/dist/src/workflows/draft/workflow-draft-service.js.map +0 -1
- package/dist/src/workflows/draft/workflow-draft-validator.js.map +0 -1
- package/dist/src/workflows/engine/projector.js.map +0 -1
- package/dist/src/workflows/engine/workflow-engine.js.map +0 -1
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +0 -1
- package/dist/src/workflows/runtime/graph-workflow-runtime.js.map +0 -1
- package/dist/src/workflows/service/run-view-to-snapshot.js.map +0 -1
- package/dist/src/workflows/service/workflow-run-service.js.map +0 -1
- package/dist/src/workflows/service/workflow-session-bridge.js.map +0 -1
- package/dist/src/workflows/service/workflow-session-key.js.map +0 -1
- package/dist/src/workflows/store/event-store.js.map +0 -1
- package/dist/src/workflows/store/paths.js.map +0 -1
- package/dist/src/workflows/store/run-index-store.js.map +0 -1
- package/dist/src/workflows/store/run-store.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"login-qr.js","names":[],"sources":["../../../../../extensions/weixin/src/auth/login-qr.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\n\nimport { apiGetFetch } from \"../api/api.js\";\nimport { logger } from \"../util/logger.js\";\nimport { redactToken } from \"../util/redact.js\";\n\ntype ActiveLogin = {\n sessionKey: string;\n id: string;\n qrcode: string;\n qrcodeUrl: string;\n startedAt: number;\n botToken?: string;\n status?: \"wait\" | \"scaned\" | \"confirmed\" | \"expired\" | \"scaned_but_redirect\";\n error?: string;\n /** The current effective polling base URL; may be updated on IDC redirect. */\n currentApiBaseUrl?: string;\n};\n\nconst ACTIVE_LOGIN_TTL_MS = 5 * 60_000;\n/** Client-side timeout for the long-poll get_qrcode_status request. */\nconst QR_LONG_POLL_TIMEOUT_MS = 35_000;\n\n/** Default `bot_type` for ilink get_bot_qrcode / get_qrcode_status (this channel build). */\nexport const DEFAULT_ILINK_BOT_TYPE = \"3\";\n\n/** Fixed API base URL for all QR code requests. */\nconst FIXED_BASE_URL = \"https://ilinkai.weixin.qq.com\";\n\nconst activeLogins = new Map<string, ActiveLogin>();\n\ninterface QRCodeResponse {\n qrcode: string;\n qrcode_img_content: string;\n}\n\ninterface StatusResponse {\n status: \"wait\" | \"scaned\" | \"confirmed\" | \"expired\" | \"scaned_but_redirect\";\n bot_token?: string;\n ilink_bot_id?: string;\n baseurl?: string;\n /** The user ID of the person who scanned the QR code. */\n ilink_user_id?: string;\n /** New host to redirect polling to when status is scaned_but_redirect. */\n redirect_host?: string;\n}\n\nfunction isLoginFresh(login: ActiveLogin): boolean {\n return Date.now() - login.startedAt < ACTIVE_LOGIN_TTL_MS;\n}\n\n/** Remove all expired entries from the activeLogins map to prevent memory leaks. */\nfunction purgeExpiredLogins(): void {\n for (const [id, login] of activeLogins) {\n if (!isLoginFresh(login)) {\n activeLogins.delete(id);\n }\n }\n}\n\nasync function fetchQRCode(botType: string, routeTag?: string): Promise<QRCodeResponse> {\n logger.info(`Fetching QR code from: ${FIXED_BASE_URL} bot_type=${botType}`);\n const rawText = await apiGetFetch({\n baseUrl: FIXED_BASE_URL,\n endpoint: `ilink/bot/get_bot_qrcode?bot_type=${encodeURIComponent(botType)}`,\n label: \"fetchQRCode\",\n routeTag,\n });\n return JSON.parse(rawText) as QRCodeResponse;\n}\n\nasync function pollQRStatus(\n apiBaseUrl: string,\n qrcode: string,\n routeTag?: string,\n): Promise<StatusResponse> {\n logger.debug(`Long-poll QR status from: ${apiBaseUrl} qrcode=***`);\n try {\n const rawText = await apiGetFetch({\n baseUrl: apiBaseUrl,\n endpoint: `ilink/bot/get_qrcode_status?qrcode=${encodeURIComponent(qrcode)}`,\n timeoutMs: QR_LONG_POLL_TIMEOUT_MS,\n label: \"pollQRStatus\",\n routeTag,\n });\n logger.debug(`pollQRStatus: body=${rawText.substring(0, 200)}`);\n return JSON.parse(rawText) as StatusResponse;\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n logger.debug(`pollQRStatus: client-side timeout after ${QR_LONG_POLL_TIMEOUT_MS}ms, returning wait`);\n return { status: \"wait\" };\n }\n logger.warn(`pollQRStatus: network/gateway error, will retry: ${String(err)}`);\n return { status: \"wait\" };\n }\n}\n\nexport type WeixinQrStartResult = {\n qrcodeUrl?: string;\n message: string;\n sessionKey: string;\n};\n\nexport type WeixinQrWaitResult = {\n connected: boolean;\n botToken?: string;\n accountId?: string;\n baseUrl?: string;\n /** The user ID of the person who scanned the QR code; add to allowFrom. */\n userId?: string;\n message: string;\n};\n\nexport async function startWeixinLoginWithQr(opts: {\n verbose?: boolean;\n timeoutMs?: number;\n force?: boolean;\n accountId?: string;\n botType?: string;\n routeTag?: string;\n}): Promise<WeixinQrStartResult> {\n const sessionKey = opts.accountId || randomUUID();\n\n purgeExpiredLogins();\n\n const existing = activeLogins.get(sessionKey);\n if (!opts.force && existing && isLoginFresh(existing) && existing.qrcodeUrl) {\n return {\n qrcodeUrl: existing.qrcodeUrl,\n message: \"二维码已就绪,请使用微信扫描。\",\n sessionKey,\n };\n }\n\n try {\n const botType = opts.botType || DEFAULT_ILINK_BOT_TYPE;\n logger.info(`Starting Weixin login with bot_type=${botType}`);\n\n const qrResponse = await fetchQRCode(botType, opts.routeTag);\n logger.info(\n `QR code received, qrcode=${redactToken(qrResponse.qrcode)} imgContentLen=${qrResponse.qrcode_img_content?.length ?? 0}`,\n );\n logger.info(`二维码链接: ${qrResponse.qrcode_img_content}`);\n\n const login: ActiveLogin = {\n sessionKey,\n id: randomUUID(),\n qrcode: qrResponse.qrcode,\n qrcodeUrl: qrResponse.qrcode_img_content,\n startedAt: Date.now(),\n };\n\n activeLogins.set(sessionKey, login);\n\n return {\n qrcodeUrl: qrResponse.qrcode_img_content,\n message: \"使用微信扫描以下二维码,以完成连接。\",\n sessionKey,\n };\n } catch (err) {\n logger.error(`Failed to start Weixin login: ${String(err)}`);\n return {\n message: `Failed to start login: ${String(err)}`,\n sessionKey,\n };\n }\n}\n\nconst MAX_QR_REFRESH_COUNT = 3;\n\nexport function getWeixinActiveLoginSnapshot(sessionKey: string): {\n qrcodeUrl: string;\n status?: ActiveLogin[\"status\"];\n} | null {\n const login = activeLogins.get(sessionKey);\n if (!login || !isLoginFresh(login)) {\n return null;\n }\n return { qrcodeUrl: login.qrcodeUrl, status: login.status };\n}\n\nexport async function waitForWeixinLogin(opts: {\n timeoutMs?: number;\n verbose?: boolean;\n /** When true, do not write to stdout (browser / gateway QR flow). */\n silent?: boolean;\n sessionKey: string;\n botType?: string;\n routeTag?: string;\n}): Promise<WeixinQrWaitResult> {\n let activeLogin = activeLogins.get(opts.sessionKey);\n\n if (!activeLogin) {\n logger.warn(`waitForWeixinLogin: no active login sessionKey=${opts.sessionKey}`);\n return {\n connected: false,\n message: \"当前没有进行中的登录,请先发起登录。\",\n };\n }\n\n if (!isLoginFresh(activeLogin)) {\n logger.warn(`waitForWeixinLogin: login QR expired sessionKey=${opts.sessionKey}`);\n activeLogins.delete(opts.sessionKey);\n return {\n connected: false,\n message: \"二维码已过期,请重新生成。\",\n };\n }\n\n const timeoutMs = Math.max(opts.timeoutMs ?? 480_000, 1000);\n const deadline = Date.now() + timeoutMs;\n let scannedPrinted = false;\n let qrRefreshCount = 1;\n const silent = Boolean(opts.silent);\n\n activeLogin.currentApiBaseUrl = FIXED_BASE_URL;\n\n logger.info(\"Starting to poll QR code status...\");\n\n while (Date.now() < deadline) {\n try {\n const currentBaseUrl = activeLogin.currentApiBaseUrl ?? FIXED_BASE_URL;\n const statusResponse = await pollQRStatus(currentBaseUrl, activeLogin.qrcode, opts.routeTag);\n logger.debug(\n `pollQRStatus: status=${statusResponse.status} hasBotToken=${Boolean(statusResponse.bot_token)} hasBotId=${Boolean(statusResponse.ilink_bot_id)}`,\n );\n activeLogin.status = statusResponse.status;\n\n switch (statusResponse.status) {\n case \"wait\":\n if (opts.verbose) {\n process.stdout.write(\".\");\n }\n break;\n case \"scaned\":\n if (!scannedPrinted && !silent) {\n process.stdout.write(\"\\n👀 已扫码,在微信继续操作...\\n\");\n scannedPrinted = true;\n } else if (!scannedPrinted) {\n scannedPrinted = true;\n }\n break;\n case \"expired\": {\n qrRefreshCount++;\n if (qrRefreshCount > MAX_QR_REFRESH_COUNT) {\n logger.warn(\n `waitForWeixinLogin: QR expired ${MAX_QR_REFRESH_COUNT} times, giving up sessionKey=${opts.sessionKey}`,\n );\n activeLogins.delete(opts.sessionKey);\n return {\n connected: false,\n message: \"登录超时:二维码多次过期,请重新开始登录流程。\",\n };\n }\n\n if (!silent) {\n process.stdout.write(`\\n⏳ 二维码已过期,正在刷新...(${qrRefreshCount}/${MAX_QR_REFRESH_COUNT})\\n`);\n }\n logger.info(\n `waitForWeixinLogin: QR expired, refreshing (${qrRefreshCount}/${MAX_QR_REFRESH_COUNT})`,\n );\n\n try {\n const botType = opts.botType || DEFAULT_ILINK_BOT_TYPE;\n const qrResponse = await fetchQRCode(botType, opts.routeTag);\n activeLogin.qrcode = qrResponse.qrcode;\n activeLogin.qrcodeUrl = qrResponse.qrcode_img_content;\n activeLogin.startedAt = Date.now();\n scannedPrinted = false;\n logger.info(`waitForWeixinLogin: new QR code obtained qrcode=${redactToken(qrResponse.qrcode)}`);\n if (!silent) {\n process.stdout.write(`🔄 新二维码已生成,请重新扫描\\n\\n`);\n try {\n const qrterm = await import(/* @vite-ignore */ \"qrcode-terminal\");\n qrterm.default.generate(qrResponse.qrcode_img_content, { small: true });\n process.stdout.write(`如果二维码未能成功展示,请用浏览器打开以下链接扫码:\\n`);\n process.stdout.write(`${qrResponse.qrcode_img_content}\\n`);\n } catch {\n process.stdout.write(`二维码未加载成功,请用浏览器打开以下链接扫码:\\n`);\n process.stdout.write(`${qrResponse.qrcode_img_content}\\n`);\n }\n }\n } catch (refreshErr) {\n logger.error(`waitForWeixinLogin: failed to refresh QR code: ${String(refreshErr)}`);\n activeLogins.delete(opts.sessionKey);\n return {\n connected: false,\n message: `刷新二维码失败: ${String(refreshErr)}`,\n };\n }\n break;\n }\n case \"scaned_but_redirect\": {\n const redirectHost = statusResponse.redirect_host;\n if (redirectHost) {\n const newBaseUrl = `https://${redirectHost}`;\n activeLogin.currentApiBaseUrl = newBaseUrl;\n logger.info(`waitForWeixinLogin: IDC redirect, switching polling host to ${redirectHost}`);\n } else {\n logger.warn(\n `waitForWeixinLogin: received scaned_but_redirect but redirect_host is missing, continuing with current host`,\n );\n }\n break;\n }\n case \"confirmed\": {\n if (!statusResponse.ilink_bot_id) {\n activeLogins.delete(opts.sessionKey);\n logger.error(\"Login confirmed but ilink_bot_id missing from response\");\n return {\n connected: false,\n message: \"登录失败:服务器未返回 ilink_bot_id。\",\n };\n }\n\n activeLogin.botToken = statusResponse.bot_token;\n activeLogins.delete(opts.sessionKey);\n\n logger.info(\n `✅ Login confirmed! ilink_bot_id=${statusResponse.ilink_bot_id} ilink_user_id=${redactToken(statusResponse.ilink_user_id)}`,\n );\n\n return {\n connected: true,\n botToken: statusResponse.bot_token,\n accountId: statusResponse.ilink_bot_id,\n baseUrl: statusResponse.baseurl,\n userId: statusResponse.ilink_user_id,\n message: \"✅ 与微信连接成功!\",\n };\n }\n }\n } catch (err) {\n logger.error(`Error polling QR status: ${String(err)}`);\n activeLogins.delete(opts.sessionKey);\n return {\n connected: false,\n message: `Login failed: ${String(err)}`,\n };\n }\n\n await new Promise((r) => setTimeout(r, 1000));\n }\n\n logger.warn(\n `waitForWeixinLogin: timed out waiting for QR scan sessionKey=${opts.sessionKey} timeoutMs=${timeoutMs}`,\n );\n activeLogins.delete(opts.sessionKey);\n return {\n connected: false,\n message: \"登录超时,请重试。\",\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pairing.js","names":[],"sources":["../../../../../extensions/weixin/src/auth/pairing.ts"],"sourcesContent":["import {\n appendAllowFromIdSync,\n readAllowFromIdsSync,\n resolveWeixinAllowFromPath,\n} from '@xopcai/xopc/channels/pairing/index.js';\n\nexport { resolveFrameworkAllowFromPath } from './accounts.js';\n\nexport function readFrameworkAllowFromList(accountId: string): string[] {\n return readAllowFromIdsSync(resolveWeixinAllowFromPath(accountId));\n}\n\nexport async function registerUserInFrameworkStore(params: {\n accountId: string;\n userId: string | number;\n}): Promise<{ changed: boolean }> {\n const trimmedUserId = String(typeof params.userId === 'number' ? params.userId : params.userId.trim()).trim();\n if (!trimmedUserId) return { changed: false };\n const changed = appendAllowFromIdSync(resolveWeixinAllowFromPath(params.accountId), trimmedUserId).changed;\n return { changed };\n}\n"],"mappings":";;;;AAQA,SAAgB,2BAA2B,WAA6B;AACtE,QAAO,qBAAqB,2BAA2B,UAAU,CAAC;;AAGpE,eAAsB,6BAA6B,QAGjB;CAChC,MAAM,gBAAgB,OAAO,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS,OAAO,OAAO,MAAM,CAAC,CAAC,MAAM;AAC7G,KAAI,CAAC,cAAe,QAAO,EAAE,SAAS,OAAO;AAE7C,QAAO,EAAE,SADO,sBAAsB,2BAA2B,OAAO,UAAU,EAAE,cAAc,CAAC,SACjF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"weixin-account-id.js","names":[],"sources":["../../../../../extensions/weixin/src/auth/weixin-account-id.ts"],"sourcesContent":["import { sanitizeSegment } from \"@xopcai/xopc/routing/session-key.js\";\n\n/**\n * Canonical Weixin bot account id (ilink / state paths).\n * Kept separate from `accounts.ts` so token store can import it without circular deps with `inbound`.\n */\nexport function normalizeWeixinAccountId(raw: string): string {\n return raw\n .trim()\n .toLowerCase()\n .replace(/@/g, '-')\n .replace(/\\./g, '-')\n .replace(/[^a-z0-9_-]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\n/**\n * Peer id as in session keys / context-token map (same rules as `buildSessionKey` peer segment).\n */\nexport function canonicalWeixinPeerId(rawPeerId: string): string {\n const t = rawPeerId.trim();\n const s = sanitizeSegment(t, { allowLeadingDash: true });\n return s || t.toLowerCase();\n}\n\nconst ILINK_WECHAT_USER_SUFFIX = \"-im-wechat\";\n\n/**\n * ilink sendmessage / getUploadUrl / getconfig expect `…@im.wechat` for C2C users.\n * Session/cron addresses use sanitized `…-im-wechat` (from `sanitizeSegment`); map back before API calls.\n */\nexport function toRawIlinkUserIdForApi(peerId: string): string {\n const t = peerId.trim();\n if (t.includes(\"@\")) return t;\n if (t.toLowerCase().endsWith(ILINK_WECHAT_USER_SUFFIX)) {\n const prefix = t.slice(0, t.length - ILINK_WECHAT_USER_SUFFIX.length);\n return `${prefix}@im.wechat`;\n }\n return t;\n}\n"],"mappings":";;kBAAsE;;;;;AAMtE,SAAgB,yBAAyB,KAAqB;AAC5D,QAAO,IACJ,MAAM,CACN,aAAa,CACb,QAAQ,MAAM,IAAI,CAClB,QAAQ,OAAO,IAAI,CACnB,QAAQ,iBAAiB,IAAI,CAC7B,QAAQ,OAAO,IAAI,CACnB,QAAQ,UAAU,GAAG;;;;;AAM1B,SAAgB,sBAAsB,WAA2B;CAC/D,MAAM,IAAI,UAAU,MAAM;AAE1B,QADU,gBAAgB,GAAG,EAAE,kBAAkB,MAAM,CAC/C,IAAI,EAAE,aAAa;;AAG7B,MAAM,2BAA2B;;;;;AAMjC,SAAgB,uBAAuB,QAAwB;CAC7D,MAAM,IAAI,OAAO,MAAM;AACvB,KAAI,EAAE,SAAS,IAAI,CAAE,QAAO;AAC5B,KAAI,EAAE,aAAa,CAAC,SAAS,yBAAyB,CAEpD,QAAO,GADQ,EAAE,MAAM,GAAG,EAAE,SAAS,GACrB,CAAC;AAEnB,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aes-ecb.js","names":[],"sources":["../../../../../extensions/weixin/src/cdn/aes-ecb.ts"],"sourcesContent":["/**\n * Shared AES-128-ECB crypto utilities for CDN upload and download.\n */\nimport { createCipheriv, createDecipheriv } from \"node:crypto\";\n\n/** Encrypt buffer with AES-128-ECB (PKCS7 padding is default). */\nexport function encryptAesEcb(plaintext: Buffer, key: Buffer): Buffer {\n const cipher = createCipheriv(\"aes-128-ecb\", key, null);\n return Buffer.concat([cipher.update(plaintext), cipher.final()]);\n}\n\n/** Decrypt buffer with AES-128-ECB (PKCS7 padding). */\nexport function decryptAesEcb(ciphertext: Buffer, key: Buffer): Buffer {\n const decipher = createDecipheriv(\"aes-128-ecb\", key, null);\n return Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n}\n\n/** Compute AES-128-ECB ciphertext size (PKCS7 padding to 16-byte boundary). */\nexport function aesEcbPaddedSize(plaintextSize: number): number {\n return Math.ceil((plaintextSize + 1) / 16) * 16;\n}\n"],"mappings":";;;;;;AAMA,SAAgB,cAAc,WAAmB,KAAqB;CACpE,MAAM,SAAS,eAAe,eAAe,KAAK,KAAK;AACvD,QAAO,OAAO,OAAO,CAAC,OAAO,OAAO,UAAU,EAAE,OAAO,OAAO,CAAC,CAAC;;;AAIlE,SAAgB,cAAc,YAAoB,KAAqB;CACrE,MAAM,WAAW,iBAAiB,eAAe,KAAK,KAAK;AAC3D,QAAO,OAAO,OAAO,CAAC,SAAS,OAAO,WAAW,EAAE,SAAS,OAAO,CAAC,CAAC;;;AAIvE,SAAgB,iBAAiB,eAA+B;AAC9D,QAAO,KAAK,MAAM,gBAAgB,KAAK,GAAG,GAAG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cdn-upload.js","names":[],"sources":["../../../../../extensions/weixin/src/cdn/cdn-upload.ts"],"sourcesContent":["import { encryptAesEcb } from \"./aes-ecb.js\";\nimport { buildCdnUploadUrl } from \"./cdn-url.js\";\nimport { logger } from \"../util/logger.js\";\nimport { redactUrl } from \"../util/redact.js\";\n\n/** Maximum retry attempts for CDN upload. */\nconst UPLOAD_MAX_RETRIES = 3;\n\n/**\n * Upload one buffer to the Weixin CDN with AES-128-ECB encryption.\n * Returns the download encrypted_query_param from the CDN response.\n * Retries up to UPLOAD_MAX_RETRIES times on server errors; client errors (4xx) abort immediately.\n */\nexport async function uploadBufferToCdn(params: {\n buf: Buffer;\n /** From getUploadUrl.upload_full_url; POST target when set (takes precedence over uploadParam). */\n uploadFullUrl?: string;\n uploadParam?: string;\n filekey: string;\n cdnBaseUrl: string;\n label: string;\n aeskey: Buffer;\n}): Promise<{ downloadParam: string }> {\n const { buf, uploadFullUrl, uploadParam, filekey, cdnBaseUrl, label, aeskey } = params;\n const ciphertext = encryptAesEcb(buf, aeskey);\n const trimmedFull = uploadFullUrl?.trim();\n let cdnUrl: string;\n if (trimmedFull) {\n cdnUrl = trimmedFull;\n } else if (uploadParam) {\n cdnUrl = buildCdnUploadUrl({ cdnBaseUrl, uploadParam, filekey });\n } else {\n throw new Error(`${label}: CDN upload URL missing (need upload_full_url or upload_param)`);\n }\n logger.debug(`${label}: CDN POST url=${redactUrl(cdnUrl)} ciphertextSize=${ciphertext.length}`);\n\n let downloadParam: string | undefined;\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= UPLOAD_MAX_RETRIES; attempt++) {\n try {\n const res = await fetch(cdnUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/octet-stream\" },\n body: new Uint8Array(ciphertext),\n });\n if (res.status >= 400 && res.status < 500) {\n const errMsg = res.headers.get(\"x-error-message\") ?? (await res.text());\n logger.error(\n `${label}: CDN client error attempt=${attempt} status=${res.status} errMsg=${errMsg}`,\n );\n throw new Error(`CDN upload client error ${res.status}: ${errMsg}`);\n }\n if (res.status !== 200) {\n const errMsg = res.headers.get(\"x-error-message\") ?? `status ${res.status}`;\n logger.error(\n `${label}: CDN server error attempt=${attempt} status=${res.status} errMsg=${errMsg}`,\n );\n throw new Error(`CDN upload server error: ${errMsg}`);\n }\n downloadParam = res.headers.get(\"x-encrypted-param\") ?? undefined;\n if (!downloadParam) {\n logger.error(\n `${label}: CDN response missing x-encrypted-param header attempt=${attempt}`,\n );\n throw new Error(\"CDN upload response missing x-encrypted-param header\");\n }\n logger.debug(`${label}: CDN upload success attempt=${attempt}`);\n break;\n } catch (err) {\n lastError = err;\n if (err instanceof Error && err.message.includes(\"client error\")) throw err;\n if (attempt < UPLOAD_MAX_RETRIES) {\n logger.error(`${label}: attempt ${attempt} failed, retrying... err=${String(err)}`);\n } else {\n logger.error(`${label}: all ${UPLOAD_MAX_RETRIES} attempts failed err=${String(err)}`);\n }\n }\n }\n\n if (!downloadParam) {\n throw lastError instanceof Error\n ? lastError\n : new Error(`CDN upload failed after ${UPLOAD_MAX_RETRIES} attempts`);\n }\n return { downloadParam };\n}\n"],"mappings":";;;;;;AAMA,MAAM,qBAAqB;;;;;;AAO3B,eAAsB,kBAAkB,QASD;CACrC,MAAM,EAAE,KAAK,eAAe,aAAa,SAAS,YAAY,OAAO,WAAW;CAChF,MAAM,aAAa,cAAc,KAAK,OAAO;CAC7C,MAAM,cAAc,eAAe,MAAM;CACzC,IAAI;AACJ,KAAI,YACF,UAAS;UACA,YACT,UAAS,kBAAkB;EAAE;EAAY;EAAa;EAAS,CAAC;KAEhE,OAAM,IAAI,MAAM,GAAG,MAAM,iEAAiE;AAE5F,QAAO,MAAM,GAAG,MAAM,iBAAiB,UAAU,OAAO,CAAC,kBAAkB,WAAW,SAAS;CAE/F,IAAI;CACJ,IAAI;AAEJ,MAAK,IAAI,UAAU,GAAG,WAAW,oBAAoB,UACnD,KAAI;EACF,MAAM,MAAM,MAAM,MAAM,QAAQ;GAC9B,QAAQ;GACR,SAAS,EAAE,gBAAgB,4BAA4B;GACvD,MAAM,IAAI,WAAW,WAAW;GACjC,CAAC;AACF,MAAI,IAAI,UAAU,OAAO,IAAI,SAAS,KAAK;GACzC,MAAM,SAAS,IAAI,QAAQ,IAAI,kBAAkB,IAAK,MAAM,IAAI,MAAM;AACtE,UAAO,MACL,GAAG,MAAM,6BAA6B,QAAQ,UAAU,IAAI,OAAO,UAAU,SAC9E;AACD,SAAM,IAAI,MAAM,2BAA2B,IAAI,OAAO,IAAI,SAAS;;AAErE,MAAI,IAAI,WAAW,KAAK;GACtB,MAAM,SAAS,IAAI,QAAQ,IAAI,kBAAkB,IAAI,UAAU,IAAI;AACnE,UAAO,MACL,GAAG,MAAM,6BAA6B,QAAQ,UAAU,IAAI,OAAO,UAAU,SAC9E;AACD,SAAM,IAAI,MAAM,4BAA4B,SAAS;;AAEvD,kBAAgB,IAAI,QAAQ,IAAI,oBAAoB,IAAI,KAAA;AACxD,MAAI,CAAC,eAAe;AAClB,UAAO,MACL,GAAG,MAAM,0DAA0D,UACpE;AACD,SAAM,IAAI,MAAM,uDAAuD;;AAEzE,SAAO,MAAM,GAAG,MAAM,+BAA+B,UAAU;AAC/D;UACO,KAAK;AACZ,cAAY;AACZ,MAAI,eAAe,SAAS,IAAI,QAAQ,SAAS,eAAe,CAAE,OAAM;AACxE,MAAI,UAAU,mBACZ,QAAO,MAAM,GAAG,MAAM,YAAY,QAAQ,2BAA2B,OAAO,IAAI,GAAG;MAEnF,QAAO,MAAM,GAAG,MAAM,QAAQ,mBAAmB,uBAAuB,OAAO,IAAI,GAAG;;AAK5F,KAAI,CAAC,cACH,OAAM,qBAAqB,QACvB,4BACA,IAAI,MAAM,2BAA2B,mBAAmB,WAAW;AAEzE,QAAO,EAAE,eAAe"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cdn-url.js","names":[],"sources":["../../../../../extensions/weixin/src/cdn/cdn-url.ts"],"sourcesContent":["/**\n * Unified CDN URL construction for Weixin CDN upload/download.\n */\n\n/** When true, if the server omits `full_url`, fall back to client-built URLs; when false, require `full_url`. */\nexport const ENABLE_CDN_URL_FALLBACK = true;\n\n/** Build a CDN download URL from encrypt_query_param. */\nexport function buildCdnDownloadUrl(encryptedQueryParam: string, cdnBaseUrl: string): string {\n return `${cdnBaseUrl}/download?encrypted_query_param=${encodeURIComponent(encryptedQueryParam)}`;\n}\n\n/** Build a CDN upload URL from upload_param and filekey. */\nexport function buildCdnUploadUrl(params: {\n cdnBaseUrl: string;\n uploadParam: string;\n filekey: string;\n}): string {\n return `${params.cdnBaseUrl}/upload?encrypted_query_param=${encodeURIComponent(params.uploadParam)}&filekey=${encodeURIComponent(params.filekey)}`;\n}\n"],"mappings":";;;;;AAKA,MAAa,0BAA0B;;AAGvC,SAAgB,oBAAoB,qBAA6B,YAA4B;AAC3F,QAAO,GAAG,WAAW,kCAAkC,mBAAmB,oBAAoB;;;AAIhG,SAAgB,kBAAkB,QAIvB;AACT,QAAO,GAAG,OAAO,WAAW,gCAAgC,mBAAmB,OAAO,YAAY,CAAC,WAAW,mBAAmB,OAAO,QAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pic-decrypt.js","names":[],"sources":["../../../../../extensions/weixin/src/cdn/pic-decrypt.ts"],"sourcesContent":["import { decryptAesEcb } from \"./aes-ecb.js\";\nimport { buildCdnDownloadUrl, ENABLE_CDN_URL_FALLBACK } from \"./cdn-url.js\";\nimport { logger } from \"../util/logger.js\";\n\n/**\n * Download raw bytes from the CDN (no decryption).\n */\nasync function fetchCdnBytes(url: string, label: string): Promise<Buffer> {\n let res: Response;\n try {\n res = await fetch(url);\n } catch (err) {\n const cause =\n (err as NodeJS.ErrnoException).cause ?? (err as NodeJS.ErrnoException).code ?? \"(no cause)\";\n logger.error(\n `${label}: fetch network error url=${url} err=${String(err)} cause=${String(cause)}`,\n );\n throw err;\n }\n logger.debug(`${label}: response status=${res.status} ok=${res.ok}`);\n if (!res.ok) {\n const body = await res.text().catch(() => \"(unreadable)\");\n const msg = `${label}: CDN download ${res.status} ${res.statusText} body=${body}`;\n logger.error(msg);\n throw new Error(msg);\n }\n return Buffer.from(await res.arrayBuffer());\n}\n\n/**\n * Parse CDNMedia.aes_key into a raw 16-byte AES key.\n *\n * Two encodings are seen in the wild:\n * - base64(raw 16 bytes) → images (aes_key from media field)\n * - base64(hex string of 16 bytes) → file / voice / video\n *\n * In the second case, base64-decoding yields 32 ASCII hex chars which must\n * then be parsed as hex to recover the actual 16-byte key.\n */\nfunction parseAesKey(aesKeyBase64: string, label: string): Buffer {\n const decoded = Buffer.from(aesKeyBase64, \"base64\");\n if (decoded.length === 16) {\n return decoded;\n }\n if (decoded.length === 32 && /^[0-9a-fA-F]{32}$/.test(decoded.toString(\"ascii\"))) {\n return Buffer.from(decoded.toString(\"ascii\"), \"hex\");\n }\n const msg = `${label}: aes_key must decode to 16 raw bytes or 32-char hex string, got ${decoded.length} bytes (base64=\"${aesKeyBase64}\")`;\n logger.error(msg);\n throw new Error(msg);\n}\n\n/**\n * Download and AES-128-ECB decrypt a CDN media file. Returns plaintext Buffer.\n * aesKeyBase64: CDNMedia.aes_key JSON field (see parseAesKey for supported formats).\n */\nexport async function downloadAndDecryptBuffer(\n encryptedQueryParam: string,\n aesKeyBase64: string,\n cdnBaseUrl: string,\n label: string,\n fullUrl?: string,\n): Promise<Buffer> {\n const key = parseAesKey(aesKeyBase64, label);\n let url: string;\n if (fullUrl) {\n url = fullUrl;\n } else if (ENABLE_CDN_URL_FALLBACK) {\n url = buildCdnDownloadUrl(encryptedQueryParam, cdnBaseUrl);\n } else {\n throw new Error(`${label}: fullUrl is required (CDN URL fallback is disabled)`);\n }\n logger.debug(`${label}: fetching url=${url}`);\n const encrypted = await fetchCdnBytes(url, label);\n logger.debug(`${label}: downloaded ${encrypted.byteLength} bytes, decrypting`);\n const decrypted = decryptAesEcb(encrypted, key);\n logger.debug(`${label}: decrypted ${decrypted.length} bytes`);\n return decrypted;\n}\n\n/**\n * Download plain (unencrypted) bytes from the CDN. Returns the raw Buffer.\n */\nexport async function downloadPlainCdnBuffer(\n encryptedQueryParam: string,\n cdnBaseUrl: string,\n label: string,\n fullUrl?: string,\n): Promise<Buffer> {\n let url: string;\n if (fullUrl) {\n url = fullUrl;\n } else if (ENABLE_CDN_URL_FALLBACK) {\n url = buildCdnDownloadUrl(encryptedQueryParam, cdnBaseUrl);\n } else {\n throw new Error(`${label}: fullUrl is required (CDN URL fallback is disabled)`);\n }\n logger.debug(`${label}: fetching url=${url}`);\n return fetchCdnBytes(url, label);\n}\n"],"mappings":";;;;;;;AAOA,eAAe,cAAc,KAAa,OAAgC;CACxE,IAAI;AACJ,KAAI;AACF,QAAM,MAAM,MAAM,IAAI;UACf,KAAK;EACZ,MAAM,QACH,IAA8B,SAAU,IAA8B,QAAQ;AACjF,SAAO,MACL,GAAG,MAAM,4BAA4B,IAAI,OAAO,OAAO,IAAI,CAAC,SAAS,OAAO,MAAM,GACnF;AACD,QAAM;;AAER,QAAO,MAAM,GAAG,MAAM,oBAAoB,IAAI,OAAO,MAAM,IAAI,KAAK;AACpE,KAAI,CAAC,IAAI,IAAI;EACX,MAAM,OAAO,MAAM,IAAI,MAAM,CAAC,YAAY,eAAe;EACzD,MAAM,MAAM,GAAG,MAAM,iBAAiB,IAAI,OAAO,GAAG,IAAI,WAAW,QAAQ;AAC3E,SAAO,MAAM,IAAI;AACjB,QAAM,IAAI,MAAM,IAAI;;AAEtB,QAAO,OAAO,KAAK,MAAM,IAAI,aAAa,CAAC;;;;;;;;;;;;AAa7C,SAAS,YAAY,cAAsB,OAAuB;CAChE,MAAM,UAAU,OAAO,KAAK,cAAc,SAAS;AACnD,KAAI,QAAQ,WAAW,GACrB,QAAO;AAET,KAAI,QAAQ,WAAW,MAAM,oBAAoB,KAAK,QAAQ,SAAS,QAAQ,CAAC,CAC9E,QAAO,OAAO,KAAK,QAAQ,SAAS,QAAQ,EAAE,MAAM;CAEtD,MAAM,MAAM,GAAG,MAAM,mEAAmE,QAAQ,OAAO,kBAAkB,aAAa;AACtI,QAAO,MAAM,IAAI;AACjB,OAAM,IAAI,MAAM,IAAI;;;;;;AAOtB,eAAsB,yBACpB,qBACA,cACA,YACA,OACA,SACiB;CACjB,MAAM,MAAM,YAAY,cAAc,MAAM;CAC5C,IAAI;AACJ,KAAI,QACF,OAAM;KAEN,OAAM,oBAAoB,qBAAqB,WAAW;AAI5D,QAAO,MAAM,GAAG,MAAM,iBAAiB,MAAM;CAC7C,MAAM,YAAY,MAAM,cAAc,KAAK,MAAM;AACjD,QAAO,MAAM,GAAG,MAAM,eAAe,UAAU,WAAW,oBAAoB;CAC9E,MAAM,YAAY,cAAc,WAAW,IAAI;AAC/C,QAAO,MAAM,GAAG,MAAM,cAAc,UAAU,OAAO,QAAQ;AAC7D,QAAO;;;;;AAMT,eAAsB,uBACpB,qBACA,YACA,OACA,SACiB;CACjB,IAAI;AACJ,KAAI,QACF,OAAM;KAEN,OAAM,oBAAoB,qBAAqB,WAAW;AAI5D,QAAO,MAAM,GAAG,MAAM,iBAAiB,MAAM;AAC7C,QAAO,cAAc,KAAK,MAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload.js","names":[],"sources":["../../../../../extensions/weixin/src/cdn/upload.ts"],"sourcesContent":["import crypto from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { toRawIlinkUserIdForApi } from \"../auth/weixin-account-id.js\";\nimport { getUploadUrl } from \"../api/api.js\";\nimport type { WeixinApiOptions } from \"../api/api.js\";\nimport { aesEcbPaddedSize } from \"./aes-ecb.js\";\nimport { uploadBufferToCdn } from \"./cdn-upload.js\";\nimport { logger } from \"../util/logger.js\";\nimport { getExtensionFromContentTypeOrUrl } from \"../media/mime.js\";\nimport { tempFileName } from \"../util/random.js\";\nimport { UploadMediaType } from \"../api/types.js\";\n\nexport type UploadedFileInfo = {\n filekey: string;\n /** 由 upload_param 上传后 CDN 返回的下载加密参数; fill into ImageItem.media.encrypt_query_param */\n downloadEncryptedQueryParam: string;\n /** AES-128-ECB key, hex-encoded; convert to base64 for CDNMedia.aes_key */\n aeskey: string;\n /** Plaintext file size in bytes */\n fileSize: number;\n /** Ciphertext file size in bytes (AES-128-ECB with PKCS7 padding); use for ImageItem.hd_size / mid_size */\n fileSizeCiphertext: number;\n};\n\n/**\n * Download a remote media URL (image, video, file) to a local temp file in destDir.\n * Returns the local file path; extension is inferred from Content-Type / URL.\n */\nexport async function downloadRemoteImageToTemp(url: string, destDir: string): Promise<string> {\n logger.debug(`downloadRemoteImageToTemp: fetching url=${url}`);\n const res = await fetch(url);\n if (!res.ok) {\n const msg = `remote media download failed: ${res.status} ${res.statusText} url=${url}`;\n logger.error(`downloadRemoteImageToTemp: ${msg}`);\n throw new Error(msg);\n }\n const buf = Buffer.from(await res.arrayBuffer());\n logger.debug(`downloadRemoteImageToTemp: downloaded ${buf.length} bytes`);\n await fs.mkdir(destDir, { recursive: true });\n const ext = getExtensionFromContentTypeOrUrl(res.headers.get(\"content-type\"), url);\n const name = tempFileName(\"weixin-remote\", ext);\n const filePath = path.join(destDir, name);\n await fs.writeFile(filePath, buf);\n logger.debug(`downloadRemoteImageToTemp: saved to ${filePath} ext=${ext}`);\n return filePath;\n}\n\n/**\n * Common upload pipeline: read file → hash → gen aeskey → getUploadUrl → uploadBufferToCdn → return info.\n */\nasync function uploadMediaToCdn(params: {\n filePath: string;\n toUserId: string;\n opts: WeixinApiOptions;\n cdnBaseUrl: string;\n mediaType: (typeof UploadMediaType)[keyof typeof UploadMediaType];\n label: string;\n}): Promise<UploadedFileInfo> {\n const { filePath, toUserId, opts, cdnBaseUrl, mediaType, label } = params;\n\n const plaintext = await fs.readFile(filePath);\n const rawsize = plaintext.length;\n const rawfilemd5 = crypto.createHash(\"md5\").update(plaintext).digest(\"hex\");\n const filesize = aesEcbPaddedSize(rawsize);\n const filekey = crypto.randomBytes(16).toString(\"hex\");\n const aeskey = crypto.randomBytes(16);\n\n logger.debug(\n `${label}: file=${filePath} rawsize=${rawsize} filesize=${filesize} md5=${rawfilemd5} filekey=${filekey}`,\n );\n\n const uploadUrlResp = await getUploadUrl({\n ...opts,\n filekey,\n media_type: mediaType,\n to_user_id: toRawIlinkUserIdForApi(toUserId),\n rawsize,\n rawfilemd5,\n filesize,\n no_need_thumb: true,\n aeskey: aeskey.toString(\"hex\"),\n });\n\n const uploadFullUrl = uploadUrlResp.upload_full_url?.trim();\n const uploadParam = uploadUrlResp.upload_param;\n if (!uploadFullUrl && !uploadParam) {\n logger.error(\n `${label}: getUploadUrl returned no upload URL (need upload_full_url or upload_param), resp=${JSON.stringify(uploadUrlResp)}`,\n );\n throw new Error(`${label}: getUploadUrl returned no upload URL`);\n }\n\n const { downloadParam: downloadEncryptedQueryParam } = await uploadBufferToCdn({\n buf: plaintext,\n uploadFullUrl: uploadFullUrl || undefined,\n uploadParam: uploadParam ?? undefined,\n filekey,\n cdnBaseUrl,\n aeskey,\n label: `${label}[orig filekey=${filekey}]`,\n });\n\n return {\n filekey,\n downloadEncryptedQueryParam,\n aeskey: aeskey.toString(\"hex\"),\n fileSize: rawsize,\n fileSizeCiphertext: filesize,\n };\n}\n\n/** Upload a local image file to the Weixin CDN with AES-128-ECB encryption. */\nexport async function uploadFileToWeixin(params: {\n filePath: string;\n toUserId: string;\n opts: WeixinApiOptions;\n cdnBaseUrl: string;\n}): Promise<UploadedFileInfo> {\n return uploadMediaToCdn({\n ...params,\n mediaType: UploadMediaType.IMAGE,\n label: \"uploadFileToWeixin\",\n });\n}\n\n/** Upload a local video file to the Weixin CDN. */\nexport async function uploadVideoToWeixin(params: {\n filePath: string;\n toUserId: string;\n opts: WeixinApiOptions;\n cdnBaseUrl: string;\n}): Promise<UploadedFileInfo> {\n return uploadMediaToCdn({\n ...params,\n mediaType: UploadMediaType.VIDEO,\n label: \"uploadVideoToWeixin\",\n });\n}\n\n/**\n * Upload a local file attachment (non-image, non-video) to the Weixin CDN.\n * Uses media_type=FILE; no thumbnail required.\n */\nexport async function uploadFileAttachmentToWeixin(params: {\n filePath: string;\n fileName: string;\n toUserId: string;\n opts: WeixinApiOptions;\n cdnBaseUrl: string;\n}): Promise<UploadedFileInfo> {\n return uploadMediaToCdn({\n ...params,\n mediaType: UploadMediaType.FILE,\n label: \"uploadFileAttachmentToWeixin\",\n });\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;AA8BA,eAAsB,0BAA0B,KAAa,SAAkC;AAC7F,QAAO,MAAM,2CAA2C,MAAM;CAC9D,MAAM,MAAM,MAAM,MAAM,IAAI;AAC5B,KAAI,CAAC,IAAI,IAAI;EACX,MAAM,MAAM,iCAAiC,IAAI,OAAO,GAAG,IAAI,WAAW,OAAO;AACjF,SAAO,MAAM,8BAA8B,MAAM;AACjD,QAAM,IAAI,MAAM,IAAI;;CAEtB,MAAM,MAAM,OAAO,KAAK,MAAM,IAAI,aAAa,CAAC;AAChD,QAAO,MAAM,yCAAyC,IAAI,OAAO,QAAQ;AACzE,OAAM,GAAG,MAAM,SAAS,EAAE,WAAW,MAAM,CAAC;CAC5C,MAAM,MAAM,iCAAiC,IAAI,QAAQ,IAAI,eAAe,EAAE,IAAI;CAClF,MAAM,OAAO,aAAa,iBAAiB,IAAI;CAC/C,MAAM,WAAW,KAAK,KAAK,SAAS,KAAK;AACzC,OAAM,GAAG,UAAU,UAAU,IAAI;AACjC,QAAO,MAAM,uCAAuC,SAAS,OAAO,MAAM;AAC1E,QAAO;;;;;AAMT,eAAe,iBAAiB,QAOF;CAC5B,MAAM,EAAE,UAAU,UAAU,MAAM,YAAY,WAAW,UAAU;CAEnE,MAAM,YAAY,MAAM,GAAG,SAAS,SAAS;CAC7C,MAAM,UAAU,UAAU;CAC1B,MAAM,aAAa,OAAO,WAAW,MAAM,CAAC,OAAO,UAAU,CAAC,OAAO,MAAM;CAC3E,MAAM,WAAW,iBAAiB,QAAQ;CAC1C,MAAM,UAAU,OAAO,YAAY,GAAG,CAAC,SAAS,MAAM;CACtD,MAAM,SAAS,OAAO,YAAY,GAAG;AAErC,QAAO,MACL,GAAG,MAAM,SAAS,SAAS,WAAW,QAAQ,YAAY,SAAS,OAAO,WAAW,WAAW,UACjG;CAED,MAAM,gBAAgB,MAAM,aAAa;EACvC,GAAG;EACH;EACA,YAAY;EACZ,YAAY,uBAAuB,SAAS;EAC5C;EACA;EACA;EACA,eAAe;EACf,QAAQ,OAAO,SAAS,MAAM;EAC/B,CAAC;CAEF,MAAM,gBAAgB,cAAc,iBAAiB,MAAM;CAC3D,MAAM,cAAc,cAAc;AAClC,KAAI,CAAC,iBAAiB,CAAC,aAAa;AAClC,SAAO,MACL,GAAG,MAAM,qFAAqF,KAAK,UAAU,cAAc,GAC5H;AACD,QAAM,IAAI,MAAM,GAAG,MAAM,uCAAuC;;CAGlE,MAAM,EAAE,eAAe,gCAAgC,MAAM,kBAAkB;EAC7E,KAAK;EACL,eAAe,iBAAiB,KAAA;EAChC,aAAa,eAAe,KAAA;EAC5B;EACA;EACA;EACA,OAAO,GAAG,MAAM,gBAAgB,QAAQ;EACzC,CAAC;AAEF,QAAO;EACL;EACA;EACA,QAAQ,OAAO,SAAS,MAAM;EAC9B,UAAU;EACV,oBAAoB;EACrB;;;AAIH,eAAsB,mBAAmB,QAKX;AAC5B,QAAO,iBAAiB;EACtB,GAAG;EACH,WAAW,gBAAgB;EAC3B,OAAO;EACR,CAAC;;;AAIJ,eAAsB,oBAAoB,QAKZ;AAC5B,QAAO,iBAAiB;EACtB,GAAG;EACH,WAAW,gBAAgB;EAC3B,OAAO;EACR,CAAC;;;;;;AAOJ,eAAsB,6BAA6B,QAMrB;AAC5B,QAAO,iBAAiB;EACtB,GAAG;EACH,WAAW,gBAAgB;EAC3B,OAAO;EACR,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-qr-login.js","names":[],"sources":["../../../../../extensions/weixin/src/cli/gateway-qr-login.ts"],"sourcesContent":["/**\n * Gateway / web UI: start Weixin QR login, poll status, persist credentials (same as CLI).\n */\n\nimport { readFileSync, writeFileSync } from \"node:fs\";\n\nimport type { Config } from \"@xopcai/xopc/config/schema.js\";\n\nimport {\n clearStaleAccountsForUserId,\n normalizeWeixinAccountId,\n registerWeixinAccountId,\n saveWeixinAccount,\n} from \"../auth/accounts.js\";\nimport {\n DEFAULT_ILINK_BOT_TYPE,\n getWeixinActiveLoginSnapshot,\n startWeixinLoginWithQr,\n waitForWeixinLogin,\n} from \"../auth/login-qr.js\";\nimport { clearContextTokensForAccount } from \"../messaging/inbound.js\";\nimport { logger } from \"../util/logger.js\";\n\nimport { getWeixinLoginApiContext, mergeWeixinConfigAfterLogin } from \"./qr-login.js\";\n\nexport type WeixinGatewayQrLoginStatus =\n | {\n phase: \"polling\";\n qrcodeUrl: string;\n /** Sub-state from ilink while waiting */\n qrStatus?: string;\n }\n | { phase: \"done\"; ok: true; accountId: string }\n | { phase: \"done\"; ok: false; message: string }\n | { phase: \"unknown\"; message: string };\n\ntype TerminalRecord =\n | { phase: \"done\"; ok: true; accountId: string }\n | { phase: \"done\"; ok: false; message: string };\n\nconst completedSessions = new Map<string, TerminalRecord>();\n\nfunction loadConfigSnapshot(configPath: string | undefined, fallback: Config | undefined): Config {\n if (fallback) return fallback;\n if (!configPath) return {} as Config;\n try {\n return JSON.parse(readFileSync(configPath, 'utf8')) as Config;\n } catch {\n return {} as Config;\n }\n}\n\nfunction saveConfigSnapshot(configPath: string | undefined, config: Config): void {\n if (!configPath) return;\n writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\\n`, 'utf8');\n}\n\nfunction rememberCompleted(sessionKey: string, state: TerminalRecord): void {\n completedSessions.set(sessionKey, state);\n setTimeout(() => completedSessions.delete(sessionKey), 10 * 60_000);\n}\n\nexport function getWeixinGatewayQrLoginStatus(sessionKey: string): WeixinGatewayQrLoginStatus {\n const done = completedSessions.get(sessionKey);\n if (done) {\n if (done.ok === true) {\n return { phase: \"done\", ok: true, accountId: done.accountId };\n }\n return { phase: \"done\", ok: false, message: done.message };\n }\n\n const snap = getWeixinActiveLoginSnapshot(sessionKey);\n if (snap) {\n return {\n phase: \"polling\",\n qrcodeUrl: snap.qrcodeUrl,\n qrStatus: snap.status,\n };\n }\n\n return {\n phase: \"unknown\",\n message: \"No active login for this session. Start again or the QR may have expired.\",\n };\n}\n\nexport type WeixinGatewayQrLoginStartOptions = {\n configPath?: string;\n account?: string;\n timeoutMs?: number;\n verbose?: boolean;\n /** Config snapshot from the already-running gateway; avoids loading the heavy config loader from Electron dynamic extension code. */\n initialConfig?: Config;\n /** After credentials + config file are written (or login failed after wait). */\n onPersisted?: (r: { ok: boolean; accountId?: string; message: string; config?: Config }) => void | Promise<void>;\n};\n\n/**\n * Begin QR login and wait in the background; poll with {@link getWeixinGatewayQrLoginStatus}.\n */\nexport async function startWeixinGatewayQrLogin(\n opts: WeixinGatewayQrLoginStartOptions,\n): Promise<{ ok: true; sessionKey: string; qrcodeUrl: string } | { ok: false; message: string }> {\n const configPath = opts.configPath ?? process.env.XOPC_CONFIG_PATH;\n const cfg = loadConfigSnapshot(configPath, opts.initialConfig);\n const { baseUrl, routeTag } = getWeixinLoginApiContext(cfg, opts.account);\n const timeoutMs = opts.timeoutMs ?? 480_000;\n const verbose = Boolean(opts.verbose);\n\n const startResult = await startWeixinLoginWithQr({\n accountId: opts.account?.trim() || undefined,\n botType: DEFAULT_ILINK_BOT_TYPE,\n routeTag,\n verbose,\n });\n\n if (!startResult.qrcodeUrl) {\n return { ok: false, message: startResult.message || \"Failed to get QR code\" };\n }\n\n const sessionKey = startResult.sessionKey;\n\n void (async () => {\n const waitResult = await waitForWeixinLogin({\n sessionKey,\n timeoutMs,\n verbose,\n routeTag,\n botType: DEFAULT_ILINK_BOT_TYPE,\n silent: true,\n });\n\n if (!waitResult.connected || !waitResult.botToken || !waitResult.accountId) {\n const message = waitResult.message || \"Login did not complete\";\n rememberCompleted(sessionKey, { phase: \"done\", ok: false, message });\n await opts.onPersisted?.({ ok: false, message });\n return;\n }\n\n const normalizedId = normalizeWeixinAccountId(waitResult.accountId);\n\n try {\n saveWeixinAccount(normalizedId, {\n token: waitResult.botToken,\n baseUrl: waitResult.baseUrl?.trim() || baseUrl,\n userId: waitResult.userId,\n });\n registerWeixinAccountId(normalizedId);\n if (waitResult.userId) {\n clearStaleAccountsForUserId(normalizedId, waitResult.userId, clearContextTokensForAccount);\n }\n } catch (err) {\n const message = `Saved login failed: ${String(err)}`;\n logger.error(message);\n rememberCompleted(sessionKey, { phase: \"done\", ok: false, message });\n await opts.onPersisted?.({ ok: false, message });\n return;\n }\n\n try {\n const nextCfg = mergeWeixinConfigAfterLogin(cfg as Config, normalizedId);\n saveConfigSnapshot(configPath, nextCfg);\n await opts.onPersisted?.({ ok: true, accountId: normalizedId, message: \"OK\", config: nextCfg });\n rememberCompleted(sessionKey, { phase: \"done\", ok: true, accountId: normalizedId });\n return;\n } catch (err) {\n logger.warn(`Config merge failed (credentials saved on disk): ${String(err)}`);\n }\n\n await opts.onPersisted?.({ ok: true, accountId: normalizedId, message: \"OK\", config: cfg as Config });\n rememberCompleted(sessionKey, { phase: \"done\", ok: true, accountId: normalizedId });\n })();\n\n return { ok: true, sessionKey, qrcodeUrl: startResult.qrcodeUrl };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"qr-login.js","names":[],"sources":["../../../../../extensions/weixin/src/cli/qr-login.ts"],"sourcesContent":["/**\n * CLI: Weixin QR login — start poll, show terminal QR, persist token + optional config merge.\n */\n\nimport type { Config } from '@xopcai/xopc/config/schema.js';\nimport { ConfigSchema } from '@xopcai/xopc/config/schema.js';\n\nimport {\n clearStaleAccountsForUserId,\n normalizeWeixinAccountId,\n registerWeixinAccountId,\n resolveWeixinAccount,\n saveWeixinAccount,\n DEFAULT_BASE_URL,\n} from '../auth/accounts.js';\nimport { clearContextTokensForAccount } from '../messaging/inbound.js';\nimport {\n DEFAULT_ILINK_BOT_TYPE,\n startWeixinLoginWithQr,\n waitForWeixinLogin,\n} from '../auth/login-qr.js';\nimport { logger } from '../util/logger.js';\n\nexport type WeixinQrLoginCliOptions = {\n /** Config file path (same as CLI --config / XOPC_CONFIG). */\n configPath?: string;\n verbose?: boolean;\n /** Client wait for scan (ms). */\n timeoutMs?: number;\n /** Existing account id to re-login, or omit for a new account session. */\n account?: string;\n /** When true, merge `channels.weixin.enabled` and accounts entry after success. */\n writeConfig?: boolean;\n /**\n * When set (e.g. interactive onboard), merges Weixin after login into this in-memory snapshot\n * instead of reloading from disk so prior unsaved onboarding edits are preserved when saving.\n */\n existingConfig?: Config;\n};\n\nexport function getWeixinLoginApiContext(cfg: Config, accountHint?: string): { baseUrl: string; routeTag?: string } {\n const section = cfg.channels?.weixin as { routeTag?: string | number } | undefined;\n const routeTagRaw = section?.routeTag;\n const sectionRouteTag =\n typeof routeTagRaw === 'number'\n ? String(routeTagRaw)\n : typeof routeTagRaw === 'string' && routeTagRaw.trim()\n ? routeTagRaw.trim()\n : undefined;\n\n if (accountHint?.trim()) {\n try {\n const r = resolveWeixinAccount(cfg, accountHint);\n return { baseUrl: r.baseUrl, routeTag: r.routeTag ?? sectionRouteTag };\n } catch {\n // ignore\n }\n }\n return { baseUrl: DEFAULT_BASE_URL, routeTag: sectionRouteTag };\n}\n\nexport function mergeWeixinConfigAfterLogin(cfg: Config, normalizedAccountId: string): Config {\n const prev = cfg.channels?.weixin as Record<string, unknown> | undefined;\n const prevAccounts = (prev?.accounts as Record<string, Record<string, unknown>> | undefined) ?? {};\n const merged = {\n ...cfg,\n channels: {\n ...cfg.channels,\n weixin: {\n ...(prev ?? {}),\n enabled: true,\n accounts: {\n ...prevAccounts,\n [normalizedAccountId]: {\n ...(prevAccounts[normalizedAccountId] ?? {}),\n enabled: true,\n },\n },\n },\n },\n };\n return ConfigSchema.parse(merged);\n}\n\n/**\n * Run interactive Weixin QR login (terminal QR + long-poll until confirmed or timeout).\n */\nexport async function runWeixinQrLoginCli(opts: WeixinQrLoginCliOptions): Promise<{\n ok: boolean;\n accountId?: string;\n message: string;\n}> {\n const configPath = opts.configPath ?? process.env.XOPC_CONFIG_PATH;\n const { loadConfig } = await import('@xopcai/xopc/config/loader.js');\n const cfg = opts.existingConfig ?? loadConfig(configPath);\n const { baseUrl, routeTag } = getWeixinLoginApiContext(cfg, opts.account);\n const timeoutMs = opts.timeoutMs ?? 480_000;\n const verbose = Boolean(opts.verbose);\n\n console.log('\\n🔐 Weixin QR login');\n console.log(` API base: ${baseUrl}\\n`);\n\n const startResult = await startWeixinLoginWithQr({\n accountId: opts.account?.trim() || undefined,\n botType: DEFAULT_ILINK_BOT_TYPE,\n routeTag,\n verbose,\n });\n\n if (!startResult.qrcodeUrl) {\n return { ok: false, message: startResult.message || 'Failed to get QR code' };\n }\n\n console.log('Scan this QR code with WeChat:\\n');\n try {\n const qrcodeTerminal = await import(/* @vite-ignore */ 'qrcode-terminal');\n await new Promise<void>((resolve) => {\n qrcodeTerminal.default.generate(startResult.qrcodeUrl!, { small: true }, (qr: string) => {\n console.log(qr);\n resolve();\n });\n });\n } catch {\n console.log('Open this URL in a browser to scan:\\n');\n console.log(startResult.qrcodeUrl);\n }\n console.log('\\nWaiting for confirmation...\\n');\n\n const waitResult = await waitForWeixinLogin({\n sessionKey: startResult.sessionKey,\n timeoutMs,\n verbose,\n routeTag,\n botType: DEFAULT_ILINK_BOT_TYPE,\n });\n\n if (!waitResult.connected || !waitResult.botToken || !waitResult.accountId) {\n return {\n ok: false,\n message: waitResult.message || 'Login did not complete',\n };\n }\n\n const normalizedId = normalizeWeixinAccountId(waitResult.accountId);\n\n try {\n saveWeixinAccount(normalizedId, {\n token: waitResult.botToken,\n baseUrl: waitResult.baseUrl?.trim() || baseUrl,\n userId: waitResult.userId,\n });\n registerWeixinAccountId(normalizedId);\n if (waitResult.userId) {\n clearStaleAccountsForUserId(normalizedId, waitResult.userId, clearContextTokensForAccount);\n }\n } catch (err) {\n logger.error(`Failed to save Weixin account: ${String(err)}`);\n return { ok: false, message: `Saved login failed: ${String(err)}` };\n }\n\n if (opts.writeConfig !== false) {\n try {\n const next = mergeWeixinConfigAfterLogin(cfg, normalizedId);\n const { saveConfig } = await import('@xopcai/xopc/config/loader.js');\n await saveConfig(next, configPath);\n } catch (err) {\n logger.warn(`Config merge failed (credentials saved on disk): ${String(err)}`);\n }\n }\n\n console.log(`\\n✅ Weixin connected as account \"${normalizedId}\".`);\n console.log(' Restart the gateway if it is already running.\\n');\n\n return { ok: true, accountId: normalizedId, message: 'OK' };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-schema.js","names":[],"sources":["../../../../extensions/weixin/src/config-schema.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const WeixinAccountConfigSchema = z.object({\n name: z.string().optional(),\n enabled: z.boolean().optional(),\n cdnBaseUrl: z.string().optional(),\n routeTag: z.union([z.string(), z.number()]).optional(),\n dmPolicy: z.enum(['pairing', 'allowlist', 'open', 'disabled']).default('open'),\n allowFrom: z.array(z.string()).default([]),\n streamMode: z.enum(['off', 'partial', 'block']).optional(),\n debug: z.boolean().optional(),\n});\n\nexport const WeixinConfigSchema = z.object({\n enabled: z.boolean().default(false),\n dmPolicy: z.enum(['pairing', 'allowlist', 'open', 'disabled']).default('open'),\n allowFrom: z.array(z.string()).default([]),\n debug: z.boolean().default(false),\n streamMode: z.enum(['off', 'partial', 'block']).optional(),\n historyLimit: z.number().default(50),\n textChunkLimit: z.number().default(4000),\n routeTag: z.union([z.string(), z.number()]).optional(),\n accounts: z.record(z.string(), WeixinAccountConfigSchema).optional(),\n});\n\nexport type WeixinConfig = z.infer<typeof WeixinConfigSchema>;\n"],"mappings":";;;;;AAEa,6BAA4B,EAAE,OAAO;EAChD,MAAM,EAAE,QAAQ,CAAC,UAAU;EAC3B,SAAS,EAAE,SAAS,CAAC,UAAU;EAC/B,YAAY,EAAE,QAAQ,CAAC,UAAU;EACjC,UAAU,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU;EACtD,UAAU,EAAE,KAAK;GAAC;GAAW;GAAa;GAAQ;GAAW,CAAC,CAAC,QAAQ,OAAO;EAC9E,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;EAC1C,YAAY,EAAE,KAAK;GAAC;GAAO;GAAW;GAAQ,CAAC,CAAC,UAAU;EAC1D,OAAO,EAAE,SAAS,CAAC,UAAU;EAC9B,CAAC;AAEW,sBAAqB,EAAE,OAAO;EACzC,SAAS,EAAE,SAAS,CAAC,QAAQ,MAAM;EACnC,UAAU,EAAE,KAAK;GAAC;GAAW;GAAa;GAAQ;GAAW,CAAC,CAAC,QAAQ,OAAO;EAC9E,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;EAC1C,OAAO,EAAE,SAAS,CAAC,QAAQ,MAAM;EACjC,YAAY,EAAE,KAAK;GAAC;GAAO;GAAW;GAAQ,CAAC,CAAC,UAAU;EAC1D,cAAc,EAAE,QAAQ,CAAC,QAAQ,GAAG;EACpC,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,IAAK;EACxC,UAAU,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU;EACtD,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,0BAA0B,CAAC,UAAU;EACrE,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-surface.js","names":[],"sources":["../../../../extensions/weixin/src/config-surface.ts"],"sourcesContent":["import type { Config } from '@xopcai/xopc/config/index.js';\nimport type { ChannelConfigSurfaceAdapter } from '@xopcai/xopc/channels/plugins/types.adapters.js';\n\nexport const weixinConfigSurface: ChannelConfigSurfaceAdapter = {\n buildConfigSurface(cfg: Config): Record<string, unknown> {\n const weixin = cfg.channels?.weixin as Record<string, unknown> | undefined;\n return {\n enabled: weixin?.enabled ?? false,\n dmPolicy: weixin?.dmPolicy || 'open',\n allowFrom: weixin?.allowFrom || [],\n debug: weixin?.debug ?? false,\n streamMode: weixin?.streamMode ?? 'partial',\n historyLimit: weixin?.historyLimit ?? 50,\n textChunkLimit: weixin?.textChunkLimit ?? 4000,\n routeTag: weixin?.routeTag,\n accounts: weixin?.accounts || {},\n };\n },\n};\n"],"mappings":";AAGA,MAAa,sBAAmD,EAC9D,mBAAmB,KAAsC;CACvD,MAAM,SAAS,IAAI,UAAU;AAC7B,QAAO;EACL,SAAS,QAAQ,WAAW;EAC5B,UAAU,QAAQ,YAAY;EAC9B,WAAW,QAAQ,aAAa,EAAE;EAClC,OAAO,QAAQ,SAAS;EACxB,YAAY,QAAQ,cAAc;EAClC,cAAc,QAAQ,gBAAgB;EACtC,gBAAgB,QAAQ,kBAAkB;EAC1C,UAAU,QAAQ;EAClB,UAAU,QAAQ,YAAY,EAAE;EACjC;GAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"delivery-to.js","names":[],"sources":["../../../../extensions/weixin/src/delivery-to.ts"],"sourcesContent":["import { parseSessionKey } from '@xopcai/xopc/routing/session-key.js';\nimport type { SessionListReader } from '@xopcai/xopc/session/store-reader.js';\n\nexport type NormalizedWeixinCronDelivery = {\n chatId: string;\n /** Set on OutboundMessage.metadata for multi-account Weixin */\n accountId?: string;\n};\n\n/**\n * Resolves Weixin ilink `chat_id` and optional `accountId` from cron / UI `delivery.to`.\n */\nexport function normalizeWeixinCronDeliveryTo(to: string): NormalizedWeixinCronDelivery {\n const trimmed = to.trim();\n if (!trimmed) {\n return { chatId: trimmed };\n }\n\n const parsed = parseSessionKey(trimmed);\n if (parsed?.source === 'weixin' && (parsed.peerKind === 'direct' || parsed.peerKind === 'dm') && parsed.peerId) {\n const accountId = parsed.accountId && parsed.accountId !== '_' ? parsed.accountId : undefined;\n return { chatId: parsed.peerId, accountId };\n }\n\n const parts = trimmed.split(':');\n if (parts.length === 3 && parts[1]?.toLowerCase() === 'direct' && parts[0] && parts[2]) {\n return { chatId: parts[2], accountId: parts[0] };\n }\n\n return { chatId: trimmed };\n}\n\n/**\n * If exactly one indexed weixin DM session matches `ilinkPeerId`, return that session's accountId.\n */\nexport async function resolveWeixinAccountIdFromSessions(\n store: SessionListReader,\n ilinkPeerId: string,\n): Promise<string | undefined> {\n const normalized = ilinkPeerId.trim().toLowerCase();\n if (!normalized) return undefined;\n\n const accountIds = new Set<string>();\n let offset = 0;\n const pageSize = 2000;\n\n for (;;) {\n const batch = await store.list({ channel: 'weixin', limit: pageSize, offset });\n for (const s of batch.items) {\n const rp = s.routing?.peerId?.toLowerCase();\n if (rp === normalized && s.routing?.accountId) {\n accountIds.add(s.routing.accountId);\n }\n }\n if (!batch.hasMore) break;\n offset += pageSize;\n }\n\n if (accountIds.size === 1) return [...accountIds][0];\n return undefined;\n}\n\n/** Like {@link normalizeWeixinCronDeliveryTo}, plus session-index lookup for bare ilink user ids. */\nexport async function normalizeWeixinCronDeliveryToResolved(\n to: string,\n sessionStore?: SessionListReader,\n): Promise<NormalizedWeixinCronDelivery> {\n const base = normalizeWeixinCronDeliveryTo(to);\n if (base.accountId || !sessionStore) return base;\n if (!to.trim().includes(':')) {\n const accountId = await resolveWeixinAccountIdFromSessions(sessionStore, base.chatId);\n if (accountId) return { chatId: base.chatId, accountId };\n }\n return base;\n}\n"],"mappings":";;kBAAsE;;;;AAYtE,SAAgB,8BAA8B,IAA0C;CACtF,MAAM,UAAU,GAAG,MAAM;AACzB,KAAI,CAAC,QACH,QAAO,EAAE,QAAQ,SAAS;CAG5B,MAAM,SAAS,gBAAgB,QAAQ;AACvC,KAAI,QAAQ,WAAW,aAAa,OAAO,aAAa,YAAY,OAAO,aAAa,SAAS,OAAO,QAAQ;EAC9G,MAAM,YAAY,OAAO,aAAa,OAAO,cAAc,MAAM,OAAO,YAAY,KAAA;AACpF,SAAO;GAAE,QAAQ,OAAO;GAAQ;GAAW;;CAG7C,MAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,KAAI,MAAM,WAAW,KAAK,MAAM,IAAI,aAAa,KAAK,YAAY,MAAM,MAAM,MAAM,GAClF,QAAO;EAAE,QAAQ,MAAM;EAAI,WAAW,MAAM;EAAI;AAGlD,QAAO,EAAE,QAAQ,SAAS;;;;;AAM5B,eAAsB,mCACpB,OACA,aAC6B;CAC7B,MAAM,aAAa,YAAY,MAAM,CAAC,aAAa;AACnD,KAAI,CAAC,WAAY,QAAO,KAAA;CAExB,MAAM,6BAAa,IAAI,KAAa;CACpC,IAAI,SAAS;CACb,MAAM,WAAW;AAEjB,UAAS;EACP,MAAM,QAAQ,MAAM,MAAM,KAAK;GAAE,SAAS;GAAU,OAAO;GAAU;GAAQ,CAAC;AAC9E,OAAK,MAAM,KAAK,MAAM,MAEpB,KADW,EAAE,SAAS,QAAQ,aAAa,KAChC,cAAc,EAAE,SAAS,UAClC,YAAW,IAAI,EAAE,QAAQ,UAAU;AAGvC,MAAI,CAAC,MAAM,QAAS;AACpB,YAAU;;AAGZ,KAAI,WAAW,SAAS,EAAG,QAAO,CAAC,GAAG,WAAW,CAAC;;;AAKpD,eAAsB,sCACpB,IACA,cACuC;CACvC,MAAM,OAAO,8BAA8B,GAAG;AAC9C,KAAI,KAAK,aAAa,CAAC,aAAc,QAAO;AAC5C,KAAI,CAAC,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE;EAC5B,MAAM,YAAY,MAAM,mCAAmC,cAAc,KAAK,OAAO;AACrF,MAAI,UAAW,QAAO;GAAE,QAAQ,KAAK;GAAQ;GAAW;;AAE1D,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../extensions/weixin/src/index.ts"],"sourcesContent":["import { defineChannelPluginEntry } from '@xopcai/xopc/extensions/sdk/channel-entry.js';\n\nimport { weixinPlugin } from './plugin.js';\n\nexport { weixinPlugin, WeixinChannelPlugin } from './plugin.js';\nexport { defineChannelPluginEntry } from '@xopcai/xopc/extensions/sdk/channel-entry.js';\nexport {\n normalizeWeixinCronDeliveryTo,\n normalizeWeixinCronDeliveryToResolved,\n resolveWeixinAccountIdFromSessions,\n} from './delivery-to.js';\nexport type { NormalizedWeixinCronDelivery } from './delivery-to.js';\nexport { runWeixinQrLoginCli } from './cli/qr-login.js';\nexport type { WeixinQrLoginCliOptions } from './cli/qr-login.js';\nexport {\n getWeixinGatewayQrLoginStatus,\n startWeixinGatewayQrLogin,\n} from './cli/gateway-qr-login.js';\nexport type {\n WeixinGatewayQrLoginStartOptions,\n WeixinGatewayQrLoginStatus,\n} from './cli/gateway-qr-login.js';\n\nexport default defineChannelPluginEntry({\n id: 'weixin',\n name: 'Weixin',\n description: 'Personal WeChat channel through QR login',\n plugin: weixinPlugin,\n});\n"],"mappings":";;;;;;AAuBA,IAAA,cAAe,yBAAyB;CACtC,IAAI;CACJ,MAAM;CACN,aAAa;CACb,QAAQ;CACT,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-url.js","names":[],"sources":["../../../../../extensions/weixin/src/media/data-url.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\n\nimport { getExtensionFromMime } from \"./mime.js\";\n\n/**\n * Parse `data:mime;base64,...` into buffer (aligned with Telegram `parseDataUrl`).\n */\nexport function parseDataUrl(dataUrl: string): { mimeType: string; buffer: Buffer } | null {\n if (!dataUrl.startsWith(\"data:\")) return null;\n const comma = dataUrl.indexOf(\",\");\n if (comma === -1) return null;\n const header = dataUrl.slice(0, comma);\n const mimeMatch = header.match(/^data:([^;]+)/);\n if (!mimeMatch) return null;\n if (!header.toLowerCase().includes(\";base64\")) return null;\n const b64 = dataUrl.slice(comma + 1).replace(/\\s/g, \"\");\n return {\n mimeType: mimeMatch[1].trim(),\n buffer: Buffer.from(b64, \"base64\"),\n };\n}\n\nexport async function writeDataUrlBufferToTemp(params: {\n buffer: Buffer;\n mimeType: string;\n destDir: string;\n}): Promise<string> {\n await fs.mkdir(params.destDir, { recursive: true });\n const ext = getExtensionFromMime(params.mimeType);\n const name = `weixin-data-${randomBytes(8).toString(\"hex\")}${ext}`;\n const filePath = path.join(params.destDir, name);\n await fs.writeFile(filePath, params.buffer);\n return filePath;\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,aAAa,SAA8D;AACzF,KAAI,CAAC,QAAQ,WAAW,QAAQ,CAAE,QAAO;CACzC,MAAM,QAAQ,QAAQ,QAAQ,IAAI;AAClC,KAAI,UAAU,GAAI,QAAO;CACzB,MAAM,SAAS,QAAQ,MAAM,GAAG,MAAM;CACtC,MAAM,YAAY,OAAO,MAAM,gBAAgB;AAC/C,KAAI,CAAC,UAAW,QAAO;AACvB,KAAI,CAAC,OAAO,aAAa,CAAC,SAAS,UAAU,CAAE,QAAO;CACtD,MAAM,MAAM,QAAQ,MAAM,QAAQ,EAAE,CAAC,QAAQ,OAAO,GAAG;AACvD,QAAO;EACL,UAAU,UAAU,GAAG,MAAM;EAC7B,QAAQ,OAAO,KAAK,KAAK,SAAS;EACnC;;AAGH,eAAsB,yBAAyB,QAI3B;AAClB,OAAM,GAAG,MAAM,OAAO,SAAS,EAAE,WAAW,MAAM,CAAC;CACnD,MAAM,MAAM,qBAAqB,OAAO,SAAS;CACjD,MAAM,OAAO,eAAe,YAAY,EAAE,CAAC,SAAS,MAAM,GAAG;CAC7D,MAAM,WAAW,KAAK,KAAK,OAAO,SAAS,KAAK;AAChD,OAAM,GAAG,UAAU,UAAU,OAAO,OAAO;AAC3C,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"media-download.js","names":[],"sources":["../../../../../extensions/weixin/src/media/media-download.ts"],"sourcesContent":["import type { WeixinInboundMediaOpts } from \"../messaging/inbound.js\";\nimport { logger } from \"../util/logger.js\";\nimport { getMimeFromFilename } from \"./mime.js\";\nimport {\n downloadAndDecryptBuffer,\n downloadPlainCdnBuffer,\n} from \"../cdn/pic-decrypt.js\";\nimport { silkToWav } from \"./silk-transcode.js\";\nimport type { WeixinMessage } from \"../api/types.js\";\nimport { MessageItemType } from \"../api/types.js\";\n\nconst WEIXIN_MEDIA_MAX_BYTES = 100 * 1024 * 1024;\n\n/** Persist a buffer via the framework's unified media store. */\ntype SaveMediaFn = (\n buffer: Buffer,\n contentType?: string,\n subdir?: string,\n maxBytes?: number,\n originalFilename?: string,\n) => Promise<{ path: string }>;\n\n/**\n * Download and decrypt media from a single MessageItem.\n * Returns the populated WeixinInboundMediaOpts fields; empty object on unsupported type or failure.\n */\nexport async function downloadMediaFromItem(\n item: WeixinMessage[\"item_list\"] extends (infer T)[] | undefined ? T : never,\n deps: {\n cdnBaseUrl: string;\n saveMedia: SaveMediaFn;\n log: (msg: string) => void;\n errLog: (msg: string) => void;\n label: string;\n },\n): Promise<WeixinInboundMediaOpts> {\n const { cdnBaseUrl, saveMedia, errLog, label } = deps;\n const result: WeixinInboundMediaOpts = {};\n\n if (item.type === MessageItemType.IMAGE) {\n const img = item.image_item;\n if (!img?.media?.encrypt_query_param && !img?.media?.full_url) return result;\n const aesKeyBase64 = img.aeskey\n ? Buffer.from(img.aeskey, \"hex\").toString(\"base64\")\n : img.media.aes_key;\n logger.debug(\n `${label} image: encrypt_query_param=${(img.media.encrypt_query_param ?? \"\").slice(0, 40)}... hasAesKey=${Boolean(aesKeyBase64)} aeskeySource=${img.aeskey ? \"image_item.aeskey\" : \"media.aes_key\"} full_url=${Boolean(img.media.full_url)}`,\n );\n try {\n const buf = aesKeyBase64\n ? await downloadAndDecryptBuffer(\n img.media.encrypt_query_param ?? \"\",\n aesKeyBase64,\n cdnBaseUrl,\n `${label} image`,\n img.media.full_url,\n )\n : await downloadPlainCdnBuffer(\n img.media.encrypt_query_param ?? \"\",\n cdnBaseUrl,\n `${label} image-plain`,\n img.media.full_url,\n );\n const saved = await saveMedia(buf, undefined, \"inbound\", WEIXIN_MEDIA_MAX_BYTES);\n result.decryptedPicPath = saved.path;\n logger.debug(`${label} image saved: ${saved.path}`);\n } catch (err) {\n logger.error(`${label} image download/decrypt failed: ${String(err)}`);\n errLog(`weixin ${label} image download/decrypt failed: ${String(err)}`);\n }\n } else if (item.type === MessageItemType.VOICE) {\n const voice = item.voice_item;\n if ((!voice?.media?.encrypt_query_param && !voice?.media?.full_url) || !voice.media.aes_key)\n return result;\n try {\n const silkBuf = await downloadAndDecryptBuffer(\n voice.media.encrypt_query_param ?? \"\",\n voice.media.aes_key,\n cdnBaseUrl,\n `${label} voice`,\n voice.media.full_url,\n );\n logger.debug(`${label} voice: decrypted ${silkBuf.length} bytes, attempting silk transcode`);\n const wavBuf = await silkToWav(silkBuf);\n if (wavBuf) {\n const saved = await saveMedia(wavBuf, \"audio/wav\", \"inbound\", WEIXIN_MEDIA_MAX_BYTES);\n result.decryptedVoicePath = saved.path;\n result.voiceMediaType = \"audio/wav\";\n logger.debug(`${label} voice: saved WAV to ${saved.path}`);\n } else {\n const saved = await saveMedia(silkBuf, \"audio/silk\", \"inbound\", WEIXIN_MEDIA_MAX_BYTES);\n result.decryptedVoicePath = saved.path;\n result.voiceMediaType = \"audio/silk\";\n logger.debug(`${label} voice: silk transcode unavailable, saved raw SILK to ${saved.path}`);\n }\n } catch (err) {\n logger.error(`${label} voice download/transcode failed: ${String(err)}`);\n errLog(`weixin ${label} voice download/transcode failed: ${String(err)}`);\n }\n } else if (item.type === MessageItemType.FILE) {\n const fileItem = item.file_item;\n if ((!fileItem?.media?.encrypt_query_param && !fileItem?.media?.full_url) || !fileItem.media.aes_key)\n return result;\n try {\n const buf = await downloadAndDecryptBuffer(\n fileItem.media.encrypt_query_param ?? \"\",\n fileItem.media.aes_key,\n cdnBaseUrl,\n `${label} file`,\n fileItem.media.full_url,\n );\n const mime = getMimeFromFilename(fileItem.file_name ?? \"file.bin\");\n const saved = await saveMedia(\n buf,\n mime,\n \"inbound\",\n WEIXIN_MEDIA_MAX_BYTES,\n fileItem.file_name ?? undefined,\n );\n result.decryptedFilePath = saved.path;\n result.fileMediaType = mime;\n logger.debug(`${label} file: saved to ${saved.path} mime=${mime}`);\n } catch (err) {\n logger.error(`${label} file download failed: ${String(err)}`);\n errLog(`weixin ${label} file download failed: ${String(err)}`);\n }\n } else if (item.type === MessageItemType.VIDEO) {\n const videoItem = item.video_item;\n if ((!videoItem?.media?.encrypt_query_param && !videoItem?.media?.full_url) || !videoItem.media.aes_key)\n return result;\n try {\n const buf = await downloadAndDecryptBuffer(\n videoItem.media.encrypt_query_param ?? \"\",\n videoItem.media.aes_key,\n cdnBaseUrl,\n `${label} video`,\n videoItem.media.full_url,\n );\n const saved = await saveMedia(buf, \"video/mp4\", \"inbound\", WEIXIN_MEDIA_MAX_BYTES);\n result.decryptedVideoPath = saved.path;\n logger.debug(`${label} video: saved to ${saved.path}`);\n } catch (err) {\n logger.error(`${label} video download failed: ${String(err)}`);\n errLog(`weixin ${label} video download failed: ${String(err)}`);\n }\n }\n\n return result;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mime.js","names":[],"sources":["../../../../../extensions/weixin/src/media/mime.ts"],"sourcesContent":["import path from \"node:path\";\n\nconst EXTENSION_TO_MIME: Record<string, string> = {\n \".pdf\": \"application/pdf\",\n \".doc\": \"application/msword\",\n \".docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \".xls\": \"application/vnd.ms-excel\",\n \".xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \".ppt\": \"application/vnd.ms-powerpoint\",\n \".pptx\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \".txt\": \"text/plain\",\n \".csv\": \"text/csv\",\n \".zip\": \"application/zip\",\n \".tar\": \"application/x-tar\",\n \".gz\": \"application/gzip\",\n \".mp3\": \"audio/mpeg\",\n \".ogg\": \"audio/ogg\",\n \".wav\": \"audio/wav\",\n \".mp4\": \"video/mp4\",\n \".mov\": \"video/quicktime\",\n \".webm\": \"video/webm\",\n \".mkv\": \"video/x-matroska\",\n \".avi\": \"video/x-msvideo\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".bmp\": \"image/bmp\",\n};\n\nconst MIME_TO_EXTENSION: Record<string, string> = {\n \"image/jpeg\": \".jpg\",\n \"image/jpg\": \".jpg\",\n \"image/png\": \".png\",\n \"image/gif\": \".gif\",\n \"image/webp\": \".webp\",\n \"image/bmp\": \".bmp\",\n \"video/mp4\": \".mp4\",\n \"video/quicktime\": \".mov\",\n \"video/webm\": \".webm\",\n \"video/x-matroska\": \".mkv\",\n \"video/x-msvideo\": \".avi\",\n \"audio/mpeg\": \".mp3\",\n \"audio/ogg\": \".ogg\",\n \"audio/wav\": \".wav\",\n \"application/pdf\": \".pdf\",\n \"application/zip\": \".zip\",\n \"application/x-tar\": \".tar\",\n \"application/gzip\": \".gz\",\n \"text/plain\": \".txt\",\n \"text/csv\": \".csv\",\n};\n\n/** Get MIME type from filename extension. Returns \"application/octet-stream\" for unknown extensions. */\nexport function getMimeFromFilename(filename: string): string {\n const ext = path.extname(filename).toLowerCase();\n return EXTENSION_TO_MIME[ext] ?? \"application/octet-stream\";\n}\n\n/** Get file extension from MIME type. Returns \".bin\" for unknown types. */\nexport function getExtensionFromMime(mimeType: string): string {\n const ct = mimeType.split(\";\")[0].trim().toLowerCase();\n return MIME_TO_EXTENSION[ct] ?? \".bin\";\n}\n\n/** Get file extension from Content-Type header or URL path. Returns \".bin\" for unknown. */\nexport function getExtensionFromContentTypeOrUrl(contentType: string | null, url: string): string {\n if (contentType) {\n const ext = getExtensionFromMime(contentType);\n if (ext !== \".bin\") return ext;\n }\n const ext = path.extname(new URL(url).pathname).toLowerCase();\n const knownExts = new Set(Object.keys(EXTENSION_TO_MIME));\n return knownExts.has(ext) ? ext : \".bin\";\n}\n"],"mappings":";;AAEA,MAAM,oBAA4C;CAChD,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,SAAS;CACT,QAAQ;CACT;AAED,MAAM,oBAA4C;CAChD,cAAc;CACd,aAAa;CACb,aAAa;CACb,aAAa;CACb,cAAc;CACd,aAAa;CACb,aAAa;CACb,mBAAmB;CACnB,cAAc;CACd,oBAAoB;CACpB,mBAAmB;CACnB,cAAc;CACd,aAAa;CACb,aAAa;CACb,mBAAmB;CACnB,mBAAmB;CACnB,qBAAqB;CACrB,oBAAoB;CACpB,cAAc;CACd,YAAY;CACb;;AAGD,SAAgB,oBAAoB,UAA0B;AAE5D,QAAO,kBADK,KAAK,QAAQ,SAAS,CAAC,aACP,KAAK;;;AAInC,SAAgB,qBAAqB,UAA0B;AAE7D,QAAO,kBADI,SAAS,MAAM,IAAI,CAAC,GAAG,MAAM,CAAC,aACd,KAAK;;;AAIlC,SAAgB,iCAAiC,aAA4B,KAAqB;AAChG,KAAI,aAAa;EACf,MAAM,MAAM,qBAAqB,YAAY;AAC7C,MAAI,QAAQ,OAAQ,QAAO;;CAE7B,MAAM,MAAM,KAAK,QAAQ,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa;AAE7D,QAAO,IADe,IAAI,OAAO,KAAK,kBAAkB,CACxC,CAAC,IAAI,IAAI,GAAG,MAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"silk-transcode.js","names":[],"sources":["../../../../../extensions/weixin/src/media/silk-transcode.ts"],"sourcesContent":["import { logger } from \"../util/logger.js\";\n\n/** Default sample rate for Weixin voice messages. */\nconst SILK_SAMPLE_RATE = 24_000;\n\n/**\n * Wrap raw pcm_s16le bytes in a WAV container.\n * Mono channel, 16-bit signed little-endian.\n */\nfunction pcmBytesToWav(pcm: Uint8Array, sampleRate: number): Buffer {\n const pcmBytes = pcm.byteLength;\n const totalSize = 44 + pcmBytes;\n const buf = Buffer.allocUnsafe(totalSize);\n let offset = 0;\n\n buf.write(\"RIFF\", offset);\n offset += 4;\n buf.writeUInt32LE(totalSize - 8, offset);\n offset += 4;\n buf.write(\"WAVE\", offset);\n offset += 4;\n\n buf.write(\"fmt \", offset);\n offset += 4;\n buf.writeUInt32LE(16, offset);\n offset += 4; // fmt chunk size\n buf.writeUInt16LE(1, offset);\n offset += 2; // PCM format\n buf.writeUInt16LE(1, offset);\n offset += 2; // mono\n buf.writeUInt32LE(sampleRate, offset);\n offset += 4;\n buf.writeUInt32LE(sampleRate * 2, offset);\n offset += 4; // byte rate (mono 16-bit)\n buf.writeUInt16LE(2, offset);\n offset += 2; // block align\n buf.writeUInt16LE(16, offset);\n offset += 2; // bits per sample\n\n buf.write(\"data\", offset);\n offset += 4;\n buf.writeUInt32LE(pcmBytes, offset);\n offset += 4;\n\n Buffer.from(pcm.buffer, pcm.byteOffset, pcm.byteLength).copy(buf, offset);\n\n return buf;\n}\n\n/**\n * Try to transcode a SILK audio buffer to WAV using silk-wasm.\n * silk-wasm's decode() returns { data: Uint8Array (pcm_s16le), duration: number }.\n *\n * Returns a WAV Buffer on success, or null if silk-wasm is unavailable or decoding fails.\n * Callers should fall back to passing the raw SILK file when null is returned.\n */\nexport async function silkToWav(silkBuf: Buffer): Promise<Buffer | null> {\n try {\n const { decode } = await import(\"silk-wasm\");\n\n logger.debug(`silkToWav: decoding ${silkBuf.length} bytes of SILK`);\n const result = await decode(silkBuf, SILK_SAMPLE_RATE);\n logger.debug(\n `silkToWav: decoded duration=${result.duration}ms pcmBytes=${result.data.byteLength}`,\n );\n\n const wav = pcmBytesToWav(result.data, SILK_SAMPLE_RATE);\n logger.debug(`silkToWav: WAV size=${wav.length}`);\n return wav;\n } catch (err) {\n logger.warn(`silkToWav: transcode failed, will use raw silk err=${String(err)}`);\n return null;\n }\n}\n"],"mappings":";;;AAGA,MAAM,mBAAmB;;;;;AAMzB,SAAS,cAAc,KAAiB,YAA4B;CAClE,MAAM,WAAW,IAAI;CACrB,MAAM,YAAY,KAAK;CACvB,MAAM,MAAM,OAAO,YAAY,UAAU;CACzC,IAAI,SAAS;AAEb,KAAI,MAAM,QAAQ,OAAO;AACzB,WAAU;AACV,KAAI,cAAc,YAAY,GAAG,OAAO;AACxC,WAAU;AACV,KAAI,MAAM,QAAQ,OAAO;AACzB,WAAU;AAEV,KAAI,MAAM,QAAQ,OAAO;AACzB,WAAU;AACV,KAAI,cAAc,IAAI,OAAO;AAC7B,WAAU;AACV,KAAI,cAAc,GAAG,OAAO;AAC5B,WAAU;AACV,KAAI,cAAc,GAAG,OAAO;AAC5B,WAAU;AACV,KAAI,cAAc,YAAY,OAAO;AACrC,WAAU;AACV,KAAI,cAAc,aAAa,GAAG,OAAO;AACzC,WAAU;AACV,KAAI,cAAc,GAAG,OAAO;AAC5B,WAAU;AACV,KAAI,cAAc,IAAI,OAAO;AAC7B,WAAU;AAEV,KAAI,MAAM,QAAQ,OAAO;AACzB,WAAU;AACV,KAAI,cAAc,UAAU,OAAO;AACnC,WAAU;AAEV,QAAO,KAAK,IAAI,QAAQ,IAAI,YAAY,IAAI,WAAW,CAAC,KAAK,KAAK,OAAO;AAEzE,QAAO;;;;;;;;;AAUT,eAAsB,UAAU,SAAyC;AACvE,KAAI;EACF,MAAM,EAAE,WAAW,MAAM,OAAO;AAEhC,SAAO,MAAM,uBAAuB,QAAQ,OAAO,gBAAgB;EACnE,MAAM,SAAS,MAAM,OAAO,SAAS,iBAAiB;AACtD,SAAO,MACL,+BAA+B,OAAO,SAAS,cAAc,OAAO,KAAK,aAC1E;EAED,MAAM,MAAM,cAAc,OAAO,MAAM,iBAAiB;AACxD,SAAO,MAAM,uBAAuB,IAAI,SAAS;AACjD,SAAO;UACA,KAAK;AACZ,SAAO,KAAK,sDAAsD,OAAO,IAAI,GAAG;AAChF,SAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-token-init.js","names":[],"sources":["../../../../../extensions/weixin/src/messaging/context-token-init.ts"],"sourcesContent":["import { toRawIlinkUserIdForApi } from '../auth/weixin-account-id.js';\nimport { getConfig } from '../api/api.js';\nimport type { ResolvedWeixinAccount } from '../auth/accounts.js';\nimport { logger } from '../util/logger.js';\n\nimport { getContextToken, getWeixinOutboundSendUserId, setContextToken } from './inbound.js';\n\n/**\n * When there is no cached context_token (e.g. cron before any inbound in this process),\n * try ilink getconfig — some deployments return context_token for the given ilink_user_id.\n */\nexport async function ensureWeixinContextTokenForOutbound(\n accountId: string,\n userId: string,\n account: Pick<ResolvedWeixinAccount, 'baseUrl' | 'token' | 'routeTag'>,\n): Promise<string | undefined> {\n const cached = getContextToken(accountId, userId);\n if (cached) return cached;\n if (!account.token?.trim()) return undefined;\n\n try {\n const ilinkUserId =\n getWeixinOutboundSendUserId(accountId, userId)?.trim() || toRawIlinkUserIdForApi(userId);\n const resp = await getConfig({\n baseUrl: account.baseUrl,\n token: account.token,\n routeTag: account.routeTag,\n ilinkUserId,\n contextToken: undefined,\n });\n if (resp.ret != null && resp.ret !== 0) {\n logger.debug(\n { userId, accountId, ret: resp.ret, errmsg: resp.errmsg },\n 'ensureWeixinContextTokenForOutbound: getConfig returned error',\n );\n return undefined;\n }\n const t = resp.context_token?.trim();\n if (t) {\n setContextToken(accountId, userId, t);\n logger.info(\n { userId, accountId },\n 'ensureWeixinContextTokenForOutbound: stored context_token from getConfig',\n );\n return t;\n }\n } catch (e) {\n logger.debug({ err: e, userId, accountId }, 'ensureWeixinContextTokenForOutbound: getConfig failed');\n }\n return undefined;\n}\n"],"mappings":";;;;;;;;;AAWA,eAAsB,oCACpB,WACA,QACA,SAC6B;CAC7B,MAAM,SAAS,gBAAgB,WAAW,OAAO;AACjD,KAAI,OAAQ,QAAO;AACnB,KAAI,CAAC,QAAQ,OAAO,MAAM,CAAE,QAAO,KAAA;AAEnC,KAAI;EACF,MAAM,cACJ,4BAA4B,WAAW,OAAO,EAAE,MAAM,IAAI,uBAAuB,OAAO;EAC1F,MAAM,OAAO,MAAM,UAAU;GAC3B,SAAS,QAAQ;GACjB,OAAO,QAAQ;GACf,UAAU,QAAQ;GAClB;GACA,cAAc,KAAA;GACf,CAAC;AACF,MAAI,KAAK,OAAO,QAAQ,KAAK,QAAQ,GAAG;AACtC,UAAO,MACL;IAAE;IAAQ;IAAW,KAAK,KAAK;IAAK,QAAQ,KAAK;IAAQ,EACzD,gEACD;AACD;;EAEF,MAAM,IAAI,KAAK,eAAe,MAAM;AACpC,MAAI,GAAG;AACL,mBAAgB,WAAW,QAAQ,EAAE;AACrC,UAAO,KACL;IAAE;IAAQ;IAAW,EACrB,2EACD;AACD,UAAO;;UAEF,GAAG;AACV,SAAO,MAAM;GAAE,KAAK;GAAG;GAAQ;GAAW,EAAE,wDAAwD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-mode.js","names":[],"sources":["../../../../../extensions/weixin/src/messaging/debug-mode.ts"],"sourcesContent":["/**\n * Per-bot debug mode toggle, persisted to disk so it survives gateway restarts.\n *\n * State file: `resolveWeixinRootDir()/debug-mode.json`\n * Format: `{ \"accounts\": { \"<accountId>\": true, ... } }`\n *\n * When enabled, processOneMessage appends a timing summary after each\n * AI reply is delivered to the user.\n */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport { resolveWeixinRootDir } from \"../storage/state-dir.js\";\nimport { logger } from \"../util/logger.js\";\n\ninterface DebugModeState {\n accounts: Record<string, boolean>;\n}\n\nfunction resolveDebugModePath(): string {\n return path.join(resolveWeixinRootDir(), \"debug-mode.json\");\n}\n\nfunction loadState(): DebugModeState {\n try {\n const raw = fs.readFileSync(resolveDebugModePath(), \"utf-8\");\n const parsed = JSON.parse(raw) as DebugModeState;\n if (parsed && typeof parsed.accounts === \"object\") return parsed;\n } catch {\n // missing or corrupt — start fresh\n }\n return { accounts: {} };\n}\n\nfunction saveState(state: DebugModeState): void {\n const filePath = resolveDebugModePath();\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, JSON.stringify(state, null, 2), \"utf-8\");\n}\n\n/** Toggle debug mode for a bot account. Returns the new state. */\nexport function toggleDebugMode(accountId: string): boolean {\n const state = loadState();\n const next = !state.accounts[accountId];\n state.accounts[accountId] = next;\n try {\n saveState(state);\n } catch (err) {\n logger.error(`debug-mode: failed to persist state: ${String(err)}`);\n }\n return next;\n}\n\n/** Check whether debug mode is active for a bot account. */\nexport function isDebugMode(accountId: string): boolean {\n return loadState().accounts[accountId] === true;\n}\n\n/**\n * Reset internal state — only for tests.\n * @internal\n */\nexport function _resetForTest(): void {\n try {\n fs.unlinkSync(resolveDebugModePath());\n } catch {\n // ignore if not present\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAmBA,SAAS,uBAA+B;AACtC,QAAO,KAAK,KAAK,sBAAsB,EAAE,kBAAkB;;AAG7D,SAAS,YAA4B;AACnC,KAAI;EACF,MAAM,MAAM,GAAG,aAAa,sBAAsB,EAAE,QAAQ;EAC5D,MAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,MAAI,UAAU,OAAO,OAAO,aAAa,SAAU,QAAO;SACpD;AAGR,QAAO,EAAE,UAAU,EAAE,EAAE;;AAGzB,SAAS,UAAU,OAA6B;CAC9C,MAAM,WAAW,sBAAsB;AACvC,IAAG,UAAU,KAAK,QAAQ,SAAS,EAAE,EAAE,WAAW,MAAM,CAAC;AACzD,IAAG,cAAc,UAAU,KAAK,UAAU,OAAO,MAAM,EAAE,EAAE,QAAQ;;;AAIrE,SAAgB,gBAAgB,WAA4B;CAC1D,MAAM,QAAQ,WAAW;CACzB,MAAM,OAAO,CAAC,MAAM,SAAS;AAC7B,OAAM,SAAS,aAAa;AAC5B,KAAI;AACF,YAAU,MAAM;UACT,KAAK;AACZ,SAAO,MAAM,wCAAwC,OAAO,IAAI,GAAG;;AAErE,QAAO;;;AAIT,SAAgB,YAAY,WAA4B;AACtD,QAAO,WAAW,CAAC,SAAS,eAAe;;;;;;AAO7C,SAAgB,gBAAsB;AACpC,KAAI;AACF,KAAG,WAAW,sBAAsB,CAAC;SAC/B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"error-notice.js","names":[],"sources":["../../../../../extensions/weixin/src/messaging/error-notice.ts"],"sourcesContent":["import { sendMessageWeixin } from \"./send.js\";\n\n/**\n * Map send failures to user-visible copy (process-message onError behavior).\n */\nexport function mapWeixinOutboundErrorNotice(errMsg: string): string {\n if (errMsg.includes(\"remote media download failed\") || errMsg.includes(\"fetch\")) {\n return `⚠️ 媒体文件下载失败,请检查链接是否可访问。`;\n }\n if (\n errMsg.includes(\"getUploadUrl\") ||\n errMsg.includes(\"CDN upload\") ||\n errMsg.includes(\"upload_param\")\n ) {\n return `⚠️ 媒体文件上传失败,请稍后重试。`;\n }\n return `⚠️ 消息发送失败:${errMsg}`;\n}\n\n/**\n * Fire-and-forget error line to the user; logs secondary failures.\n */\nexport async function sendWeixinErrorNotice(params: {\n to: string;\n toUserIdForApi?: string;\n contextToken: string | undefined;\n message: string;\n baseUrl: string;\n token?: string;\n routeTag?: string;\n errLog: (m: string) => void;\n}): Promise<void> {\n if (!params.contextToken) {\n params.errLog(`sendWeixinErrorNotice: no contextToken for to=${params.to}`);\n }\n try {\n await sendMessageWeixin({\n to: params.to,\n toUserIdForApi: params.toUserIdForApi,\n text: params.message,\n opts: {\n baseUrl: params.baseUrl,\n token: params.token,\n routeTag: params.routeTag,\n contextToken: params.contextToken,\n },\n });\n } catch (err) {\n params.errLog(`[weixin] sendWeixinErrorNotice failed to=${params.to}: ${String(err)}`);\n }\n}\n"],"mappings":";;;;;AAKA,SAAgB,6BAA6B,QAAwB;AACnE,KAAI,OAAO,SAAS,+BAA+B,IAAI,OAAO,SAAS,QAAQ,CAC7E,QAAO;AAET,KACE,OAAO,SAAS,eAAe,IAC/B,OAAO,SAAS,aAAa,IAC7B,OAAO,SAAS,eAAe,CAE/B,QAAO;AAET,QAAO,aAAa;;;;;AAMtB,eAAsB,sBAAsB,QAS1B;AAChB,KAAI,CAAC,OAAO,aACV,QAAO,OAAO,iDAAiD,OAAO,KAAK;AAE7E,KAAI;AACF,QAAM,kBAAkB;GACtB,IAAI,OAAO;GACX,gBAAgB,OAAO;GACvB,MAAM,OAAO;GACb,MAAM;IACJ,SAAS,OAAO;IAChB,OAAO,OAAO;IACd,UAAU,OAAO;IACjB,cAAc,OAAO;IACtB;GACF,CAAC;UACK,KAAK;AACZ,SAAO,OAAO,4CAA4C,OAAO,GAAG,IAAI,OAAO,IAAI,GAAG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inbound.js","names":[],"sources":["../../../../../extensions/weixin/src/messaging/inbound.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport { logger } from \"../util/logger.js\";\nimport { generateId } from \"../util/random.js\";\nimport type { WeixinMessage, MessageItem } from \"../api/types.js\";\nimport { MessageItemType } from \"../api/types.js\";\nimport { canonicalWeixinPeerId, normalizeWeixinAccountId } from \"../auth/weixin-account-id.js\";\nimport { resolveWeixinRootDir } from \"../storage/state-dir.js\";\n\n// ---------------------------------------------------------------------------\n// Context token store (in-process cache + disk persistence)\n// ---------------------------------------------------------------------------\n\ntype WeixinContextTokenEntry = { token: string; sendTo?: string };\n\n/**\n * contextToken is issued per-message by the Weixin getupdates API and must\n * be echoed verbatim in every outbound send. The in-memory map is the primary\n * lookup; a disk-backed file per account ensures tokens survive gateway restarts.\n *\n * `sendTo` is the last inbound `from_user_id` verbatim. ilink often requires `to_user_id`\n * in sendmessage to match that string exactly (session/cron peer ids are sanitized).\n */\nconst contextTokenStore = new Map<string, WeixinContextTokenEntry>();\n\nfunction parsePersistedPeerVal(val: unknown): WeixinContextTokenEntry | null {\n if (typeof val === \"string\" && val.trim()) {\n return { token: val.trim() };\n }\n if (val && typeof val === \"object\" && \"token\" in val) {\n const o = val as { token: unknown; sendTo?: unknown };\n if (typeof o.token !== \"string\" || !o.token.trim()) return null;\n const sendTo = typeof o.sendTo === \"string\" && o.sendTo.trim() ? o.sendTo.trim() : undefined;\n return { token: o.token.trim(), ...(sendTo ? { sendTo } : {}) };\n }\n return null;\n}\n\n/**\n * Session keys use {@link canonicalWeixinPeerId} (same as `buildSessionKey`); cron `delivery.to`\n * and outbound `ctx.to` use that shape. ilink `from_user_id` is often `…@im.wechat` while the\n * session peer is `…-im-wechat`. Normalize so context_token cache keys match lookups.\n */\nfunction normalizeIlinkUserIdForContext(userId: string): string {\n return canonicalWeixinPeerId(userId);\n}\n\n/** ilink may use a shorter openid in one path and a suffixed id in another; treat as same peer when unambiguous. */\nfunction ilinkPeerKeysLikelySame(storedKey: string, queryPeer: string): boolean {\n const a = normalizeIlinkUserIdForContext(storedKey);\n const b = normalizeIlinkUserIdForContext(queryPeer);\n if (a === b) return true;\n if (a.length < 12 || b.length < 12) return false;\n return a.startsWith(b) || b.startsWith(a);\n}\n\nfunction contextTokenKey(accountId: string, userId: string): string {\n return `${normalizeWeixinAccountId(accountId)}:${normalizeIlinkUserIdForContext(userId)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Disk persistence helpers\n// ---------------------------------------------------------------------------\n\nfunction canonicalContextTokenFilePath(accountId: string): string {\n const norm = normalizeWeixinAccountId(accountId);\n return path.join(resolveWeixinRootDir(), \"accounts\", `${norm}.context-tokens.json`);\n}\n\n/** Persist all context tokens for a given account to disk. */\nfunction persistContextTokens(accountId: string): void {\n const norm = normalizeWeixinAccountId(accountId);\n const prefix = `${norm}:`;\n const tokens: Record<string, string | { token: string; sendTo?: string }> = {};\n for (const [k, v] of contextTokenStore) {\n if (k.startsWith(prefix)) {\n const peerSuffix = k.slice(prefix.length);\n if (v.sendTo?.trim()) {\n tokens[peerSuffix] = { token: v.token, sendTo: v.sendTo.trim() };\n } else {\n tokens[peerSuffix] = v.token;\n }\n }\n }\n const filePath = canonicalContextTokenFilePath(accountId);\n try {\n const dir = path.dirname(filePath);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(filePath, JSON.stringify(tokens, null, 0), \"utf-8\");\n } catch (err) {\n logger.warn(`persistContextTokens: failed to write ${filePath}: ${String(err)}`);\n }\n}\n\n/**\n * Restore persisted context tokens for an account into the in-memory map.\n * Called once during gateway startAccount to survive restarts.\n */\nexport function restoreContextTokens(accountId: string): void {\n let count = 0;\n const norm = normalizeWeixinAccountId(accountId);\n const filePath = canonicalContextTokenFilePath(accountId);\n try {\n if (fs.existsSync(filePath)) {\n const raw = fs.readFileSync(filePath, \"utf-8\");\n const tokens = JSON.parse(raw) as Record<string, unknown>;\n for (const [userId, val] of Object.entries(tokens)) {\n const entry = parsePersistedPeerVal(val);\n if (entry?.token) {\n contextTokenStore.set(contextTokenKey(norm, userId), entry);\n count++;\n }\n }\n }\n } catch (err) {\n logger.warn(`restoreContextTokens: failed to read ${filePath}: ${String(err)}`);\n }\n if (count > 0) {\n logger.info(`restoreContextTokens: restored ${count} tokens for account=${norm}`);\n }\n}\n\n/** Remove all context tokens for a given account (memory + disk). */\nexport function clearContextTokensForAccount(accountId: string): void {\n const norm = normalizeWeixinAccountId(accountId);\n const prefix = `${norm}:`;\n for (const k of [...contextTokenStore.keys()]) {\n if (k.startsWith(prefix)) {\n contextTokenStore.delete(k);\n }\n }\n try {\n const filePath = canonicalContextTokenFilePath(accountId);\n if (fs.existsSync(filePath)) fs.unlinkSync(filePath);\n } catch (err) {\n logger.warn(`clearContextTokensForAccount: failed to remove context tokens file: ${String(err)}`);\n }\n logger.info(`clearContextTokensForAccount: cleared tokens for account=${norm}`);\n}\n\nfunction tryHydratePeerEntryFromDisk(accountId: string, userId: string): WeixinContextTokenEntry | undefined {\n const peer = normalizeIlinkUserIdForContext(userId);\n const norm = normalizeWeixinAccountId(accountId);\n const filePath = canonicalContextTokenFilePath(accountId);\n if (!fs.existsSync(filePath)) return undefined;\n try {\n const raw = fs.readFileSync(filePath, \"utf-8\");\n const tokens = JSON.parse(raw) as Record<string, unknown>;\n for (const [jsonKey, val] of Object.entries(tokens)) {\n const entry = parsePersistedPeerVal(val);\n if (!entry?.token) continue;\n if (!ilinkPeerKeysLikelySame(jsonKey, peer)) continue;\n contextTokenStore.set(contextTokenKey(norm, peer), entry);\n persistContextTokens(accountId);\n return entry;\n }\n } catch (err) {\n logger.debug(`tryHydratePeerEntryFromDisk: ${filePath}: ${String(err)}`);\n }\n return undefined;\n}\n\nfunction getWeixinContextPeerEntry(\n accountId: string,\n userId: string,\n): WeixinContextTokenEntry | undefined {\n const k = contextTokenKey(accountId, userId);\n let e = contextTokenStore.get(k);\n if (e?.token) {\n return e;\n }\n const hydrated = tryHydratePeerEntryFromDisk(accountId, userId);\n if (hydrated) return hydrated;\n return contextTokenStore.get(k);\n}\n\n/** Last inbound `from_user_id` for API `to_user_id` (verbatim), when known. */\nexport function getWeixinOutboundSendUserId(accountId: string, userId: string): string | undefined {\n return getWeixinContextPeerEntry(accountId, userId)?.sendTo?.trim() || undefined;\n}\n\n/** Store a context token for a given account+user pair (memory + disk). */\nexport function setContextToken(\n accountId: string,\n userId: string,\n token: string,\n options?: { sendToUserId?: string },\n): void {\n const k = contextTokenKey(accountId, userId);\n const prev = contextTokenStore.get(k);\n const sendTo =\n options && options.sendToUserId !== undefined\n ? options.sendToUserId.trim() || undefined\n : prev?.sendTo;\n const next: WeixinContextTokenEntry = { token, ...(sendTo ? { sendTo } : {}) };\n logger.debug(`setContextToken: key=${k} sendTo=${sendTo ? \"yes\" : \"no\"}`);\n contextTokenStore.set(k, next);\n persistContextTokens(accountId);\n}\n\n/** Retrieve the cached context token for a given account+user pair. */\nexport function getContextToken(accountId: string, userId: string): string | undefined {\n const k = contextTokenKey(accountId, userId);\n const e = getWeixinContextPeerEntry(accountId, userId);\n logger.debug(\n `getContextToken: key=${k} found=${e?.token !== undefined} storeSize=${contextTokenStore.size}`,\n );\n return e?.token;\n}\n\n/**\n * Find all accountIds that have an active contextToken for the given userId.\n * Used to infer the sending bot account from the recipient address when\n * accountId is not explicitly provided (e.g. cron delivery).\n *\n * Returns all matching accountIds (not just the first) so the caller can\n * detect ambiguity when multiple accounts have sessions with the same user.\n */\nexport function findAccountIdsByContextToken(\n accountIds: string[],\n userId: string,\n): string[] {\n return accountIds.filter((id) => contextTokenStore.has(contextTokenKey(id, userId)));\n}\n\n/** In-memory entries whose peer id matches (exact or ilink prefix/suffix variant). */\nexport function findContextTokenEntriesByPeer(\n peerUserId: string,\n): Array<{ accountId: string; token: string; sendTo?: string }> {\n const peer = normalizeIlinkUserIdForContext(peerUserId);\n const out: Array<{ accountId: string; token: string; sendTo?: string }> = [];\n for (const [k, entry] of contextTokenStore) {\n if (!entry?.token?.trim()) continue;\n const idx = k.indexOf(':');\n if (idx <= 0 || idx >= k.length - 1) continue;\n const accountId = k.slice(0, idx);\n const storedPeer = k.slice(idx + 1);\n if (!ilinkPeerKeysLikelySame(storedPeer, peer)) continue;\n if (accountId) {\n out.push({\n accountId,\n token: entry.token,\n ...(entry.sendTo?.trim() ? { sendTo: entry.sendTo.trim() } : {}),\n });\n }\n }\n return out;\n}\n\n/**\n * When the preferred account id does not match the token filename, scan every\n * `accounts/*.context-tokens.json` for this peer (case-insensitive user key).\n */\nexport function tryHydrateAnyAccountContextTokenFromDisk(\n peerUserId: string,\n): { accountId: string; token: string; sendTo?: string } | undefined {\n const peer = normalizeIlinkUserIdForContext(peerUserId);\n const accountsDir = path.join(resolveWeixinRootDir(), 'accounts');\n if (!fs.existsSync(accountsDir)) return undefined;\n const hits: Array<{ accountId: string; token: string; sendTo?: string }> = [];\n let names: string[];\n try {\n names = fs.readdirSync(accountsDir);\n } catch {\n return undefined;\n }\n const suffix = '.context-tokens.json';\n for (const name of names) {\n if (!name.endsWith(suffix)) continue;\n const accountFromFile = name.slice(0, -suffix.length);\n const filePath = path.join(accountsDir, name);\n try {\n const raw = fs.readFileSync(filePath, 'utf-8');\n const tokens = JSON.parse(raw) as Record<string, unknown>;\n for (const [jsonKey, val] of Object.entries(tokens)) {\n const entry = parsePersistedPeerVal(val);\n if (!entry?.token) continue;\n if (!ilinkPeerKeysLikelySame(jsonKey, peer)) continue;\n hits.push({\n accountId: normalizeWeixinAccountId(accountFromFile),\n token: entry.token,\n ...(entry.sendTo?.trim() ? { sendTo: entry.sendTo.trim() } : {}),\n });\n }\n } catch {\n /* skip corrupt file */\n }\n }\n if (hits.length === 0) return undefined;\n const byAccount = new Map<string, { token: string; sendTo?: string }>();\n for (const h of hits) {\n if (!byAccount.has(h.accountId)) byAccount.set(h.accountId, { token: h.token, sendTo: h.sendTo });\n }\n if (byAccount.size > 1) return undefined;\n const [accountId, hit] = [...byAccount.entries()][0]!;\n setContextToken(accountId, peer, hit.token, hit.sendTo ? { sendToUserId: hit.sendTo } : undefined);\n return { accountId, token: hit.token, sendTo: hit.sendTo };\n}\n\n// ---------------------------------------------------------------------------\n// Message ID generation\n// ---------------------------------------------------------------------------\n\nfunction generateMessageSid(): string {\n return generateId(\"weixin\");\n}\n\n/** Inbound context for the core message pipeline (matches MsgContext shape). */\nexport type WeixinMsgContext = {\n Body: string;\n From: string;\n To: string;\n AccountId: string;\n OriginatingChannel: \"weixin\";\n OriginatingTo: string;\n MessageSid: string;\n Timestamp?: number;\n Provider: \"weixin\";\n ChatType: \"direct\";\n /** Set by monitor after resolveAgentRoute so dispatchReplyFromConfig uses the correct session. */\n SessionKey?: string;\n context_token?: string;\n MediaUrl?: string;\n MediaPath?: string;\n MediaType?: string;\n /** Raw message body for framework command authorization. */\n CommandBody?: string;\n /** Whether the sender is authorized to execute slash commands. */\n CommandAuthorized?: boolean;\n};\n\n/** Returns true if the message item is a media type (image, video, file, or voice). */\nexport function isMediaItem(item: MessageItem): boolean {\n return (\n item.type === MessageItemType.IMAGE ||\n item.type === MessageItemType.VIDEO ||\n item.type === MessageItemType.FILE ||\n item.type === MessageItemType.VOICE\n );\n}\n\nfunction bodyFromItemList(itemList?: MessageItem[]): string {\n if (!itemList?.length) return \"\";\n for (const item of itemList) {\n if (item.type === MessageItemType.TEXT && item.text_item?.text != null) {\n const text = String(item.text_item.text);\n const ref = item.ref_msg;\n if (!ref) return text;\n // Quoted media is passed as MediaPath; only include the current text as body.\n if (ref.message_item && isMediaItem(ref.message_item)) return text;\n // Build quoted context from both title and message_item content.\n const parts: string[] = [];\n if (ref.title) parts.push(ref.title);\n if (ref.message_item) {\n const refBody = bodyFromItemList([ref.message_item]);\n if (refBody) parts.push(refBody);\n }\n if (!parts.length) return text;\n return `[引用: ${parts.join(\" | \")}]\\n${text}`;\n }\n // 语音转文字:如果语音消息有 text 字段,直接使用文字内容\n if (item.type === MessageItemType.VOICE && item.voice_item?.text) {\n return item.voice_item.text;\n }\n }\n return \"\";\n}\n\nexport type WeixinInboundMediaOpts = {\n /** Local path to decrypted image file. */\n decryptedPicPath?: string;\n /** Local path to transcoded/raw voice file (.wav or .silk). */\n decryptedVoicePath?: string;\n /** MIME type for the voice file (e.g. \"audio/wav\" or \"audio/silk\"). */\n voiceMediaType?: string;\n /** Local path to decrypted file attachment. */\n decryptedFilePath?: string;\n /** MIME type for the file attachment (guessed from file_name). */\n fileMediaType?: string;\n /** Local path to decrypted video file. */\n decryptedVideoPath?: string;\n};\n\n/**\n * Convert a WeixinMessage from getUpdates to the inbound MsgContext for the core pipeline.\n * Media: only pass MediaPath (local file, after CDN download + decrypt).\n * We never pass MediaUrl — the upstream CDN URL is encrypted/auth-only.\n * Priority when multiple media types present: image > video > file > voice.\n */\nexport function weixinMessageToMsgContext(\n msg: WeixinMessage,\n accountId: string,\n opts?: WeixinInboundMediaOpts,\n): WeixinMsgContext {\n const from_user_id = msg.from_user_id ?? \"\";\n const ctx: WeixinMsgContext = {\n Body: bodyFromItemList(msg.item_list),\n From: from_user_id,\n To: from_user_id,\n AccountId: accountId,\n OriginatingChannel: \"weixin\",\n OriginatingTo: from_user_id,\n MessageSid: generateMessageSid(),\n Timestamp: msg.create_time_ms,\n Provider: \"weixin\",\n ChatType: \"direct\",\n };\n if (msg.context_token) {\n ctx.context_token = msg.context_token;\n }\n\n if (opts?.decryptedPicPath) {\n ctx.MediaPath = opts.decryptedPicPath;\n ctx.MediaType = \"image/*\";\n } else if (opts?.decryptedVideoPath) {\n ctx.MediaPath = opts.decryptedVideoPath;\n ctx.MediaType = \"video/mp4\";\n } else if (opts?.decryptedFilePath) {\n ctx.MediaPath = opts.decryptedFilePath;\n ctx.MediaType = opts.fileMediaType ?? \"application/octet-stream\";\n } else if (opts?.decryptedVoicePath) {\n ctx.MediaPath = opts.decryptedVoicePath;\n ctx.MediaType = opts.voiceMediaType ?? \"audio/wav\";\n }\n\n return ctx;\n}\n\n/** Extract the context_token from an inbound WeixinMsgContext. */\nexport function getContextTokenFromMsgContext(ctx: WeixinMsgContext): string | undefined {\n return ctx.context_token;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-filter.js","names":[],"sources":["../../../../../extensions/weixin/src/messaging/markdown-filter.ts"],"sourcesContent":["/**\n * Streaming markdown filter — character-level state machine that strips\n * unsupported markdown syntax on-the-fly.\n */\nexport class StreamingMarkdownFilter {\n private buf = \"\";\n private fence = false;\n private sol = true;\n private inl: { type: \"image\" | \"bold3\" | \"italic\" | \"ubold3\" | \"uitalic\"; acc: string } | null =\n null;\n\n feed(delta: string): string {\n this.buf += delta;\n return this.pump(false);\n }\n\n flush(): string {\n return this.pump(true);\n }\n\n private pump(eof: boolean): string {\n let out = \"\";\n while (this.buf) {\n const sLen = this.buf.length;\n const sSol = this.sol;\n const sFence = this.fence;\n const sInl = this.inl;\n\n if (this.fence) out += this.pumpFence(eof);\n else if (this.inl) out += this.pumpInline(eof);\n else if (this.sol) out += this.pumpSOL(eof);\n else out += this.pumpBody(eof);\n\n if (\n this.buf.length === sLen &&\n this.sol === sSol &&\n this.fence === sFence &&\n this.inl === sInl\n )\n break;\n }\n\n if (eof && this.inl) {\n const markers: Record<string, string> = {\n image: \"![\",\n bold3: \"***\",\n italic: \"*\",\n ubold3: \"___\",\n uitalic: \"_\",\n };\n out += (markers[this.inl.type] ?? \"\") + this.inl.acc;\n this.inl = null;\n }\n return out;\n }\n\n private pumpFence(eof: boolean): string {\n if (this.sol) {\n if (this.buf.length < 3 && !eof) return \"\";\n if (this.buf.startsWith(\"```\")) {\n const nl = this.buf.indexOf(\"\\n\", 3);\n if (nl !== -1) {\n this.fence = false;\n const line = this.buf.slice(0, nl + 1);\n this.buf = this.buf.slice(nl + 1);\n this.sol = true;\n return line;\n }\n if (eof) {\n this.fence = false;\n const line = this.buf;\n this.buf = \"\";\n return line;\n }\n return \"\";\n }\n this.sol = false;\n }\n const nl = this.buf.indexOf(\"\\n\");\n if (nl !== -1) {\n const chunk = this.buf.slice(0, nl + 1);\n this.buf = this.buf.slice(nl + 1);\n this.sol = true;\n return chunk;\n }\n const chunk = this.buf;\n this.buf = \"\";\n return chunk;\n }\n\n private pumpSOL(eof: boolean): string {\n const b = this.buf;\n\n if (b[0] === \"\\n\") {\n this.buf = b.slice(1);\n return \"\\n\";\n }\n\n if (b[0] === \"`\") {\n if (b.length < 3 && !eof) return \"\";\n if (b.startsWith(\"```\")) {\n const nl = b.indexOf(\"\\n\", 3);\n if (nl !== -1) {\n this.fence = true;\n const line = b.slice(0, nl + 1);\n this.buf = b.slice(nl + 1);\n this.sol = true;\n return line;\n }\n if (eof) {\n this.buf = \"\";\n return b;\n }\n return \"\";\n }\n this.sol = false;\n return \"\";\n }\n\n if (b[0] === \">\") {\n this.sol = false;\n return \"\";\n }\n\n if (b[0] === \"#\") {\n let n = 0;\n while (n < b.length && b[n] === \"#\") n++;\n if (n === b.length && !eof) return \"\";\n if (n >= 5 && n <= 6 && n < b.length && b[n] === \" \") {\n this.buf = b.slice(n + 1);\n this.sol = false;\n return \"\";\n }\n this.sol = false;\n return \"\";\n }\n\n if (b[0] === \" \" || b[0] === \"\\t\") {\n if (b.search(/[^ \\t]/) === -1 && !eof) return \"\";\n this.sol = false;\n return \"\";\n }\n\n if (b[0] === \"-\" || b[0] === \"*\" || b[0] === \"_\") {\n const ch = b[0];\n let j = 0;\n while (j < b.length && (b[j] === ch || b[j] === \" \")) j++;\n if (j === b.length && !eof) return \"\";\n if (j === b.length || b[j] === \"\\n\") {\n let count = 0;\n for (let k = 0; k < j; k++) if (b[k] === ch) count++;\n if (count >= 3) {\n if (j < b.length) {\n this.buf = b.slice(j + 1);\n this.sol = true;\n return b.slice(0, j + 1);\n }\n this.buf = \"\";\n return b;\n }\n }\n this.sol = false;\n return \"\";\n }\n\n this.sol = false;\n return \"\";\n }\n\n private pumpBody(eof: boolean): string {\n let out = \"\";\n let i = 0;\n while (i < this.buf.length) {\n const c = this.buf[i];\n if (c === \"\\n\") {\n out += this.buf.slice(0, i + 1);\n this.buf = this.buf.slice(i + 1);\n this.sol = true;\n return out;\n }\n if (c === \"!\" && i + 1 < this.buf.length && this.buf[i + 1] === \"[\") {\n out += this.buf.slice(0, i);\n this.buf = this.buf.slice(i + 2);\n this.inl = { type: \"image\", acc: \"\" };\n return out;\n }\n if (c === \"~\") {\n i++;\n continue;\n }\n if (c === \"*\") {\n if (i + 2 < this.buf.length && this.buf[i + 1] === \"*\" && this.buf[i + 2] === \"*\") {\n out += this.buf.slice(0, i);\n this.buf = this.buf.slice(i + 3);\n this.inl = { type: \"bold3\", acc: \"\" };\n return out;\n }\n if (i + 1 < this.buf.length && this.buf[i + 1] === \"*\") {\n i += 2;\n continue;\n }\n if (i + 1 < this.buf.length && this.buf[i + 1] !== \" \" && this.buf[i + 1] !== \"\\n\") {\n out += this.buf.slice(0, i);\n this.buf = this.buf.slice(i + 1);\n this.inl = { type: \"italic\", acc: \"\" };\n return out;\n }\n i++;\n continue;\n }\n if (c === \"_\") {\n if (i + 2 < this.buf.length && this.buf[i + 1] === \"_\" && this.buf[i + 2] === \"_\") {\n out += this.buf.slice(0, i);\n this.buf = this.buf.slice(i + 3);\n this.inl = { type: \"ubold3\", acc: \"\" };\n return out;\n }\n if (i + 1 < this.buf.length && this.buf[i + 1] === \"_\") {\n i += 2;\n continue;\n }\n if (i + 1 < this.buf.length && this.buf[i + 1] !== \" \" && this.buf[i + 1] !== \"\\n\") {\n out += this.buf.slice(0, i);\n this.buf = this.buf.slice(i + 1);\n this.inl = { type: \"uitalic\", acc: \"\" };\n return out;\n }\n i++;\n continue;\n }\n i++;\n }\n\n let hold = 0;\n if (!eof) {\n if (this.buf.endsWith(\"**\")) hold = 2;\n else if (this.buf.endsWith(\"__\")) hold = 2;\n else if (this.buf.endsWith(\"*\")) hold = 1;\n else if (this.buf.endsWith(\"_\")) hold = 1;\n else if (this.buf.endsWith(\"!\")) hold = 1;\n }\n out += this.buf.slice(0, this.buf.length - hold);\n this.buf = hold > 0 ? this.buf.slice(-hold) : \"\";\n return out;\n }\n\n private pumpInline(_eof: boolean): string {\n if (!this.inl) return \"\";\n this.inl.acc += this.buf;\n this.buf = \"\";\n\n switch (this.inl.type) {\n case \"bold3\": {\n const idx = this.inl.acc.indexOf(\"***\");\n if (idx !== -1) {\n const content = this.inl.acc.slice(0, idx);\n this.buf = this.inl.acc.slice(idx + 3);\n this.inl = null;\n if (StreamingMarkdownFilter.containsCJK(content)) return content;\n return `***${content}***`;\n }\n return \"\";\n }\n case \"ubold3\": {\n const idx = this.inl.acc.indexOf(\"___\");\n if (idx !== -1) {\n const content = this.inl.acc.slice(0, idx);\n this.buf = this.inl.acc.slice(idx + 3);\n this.inl = null;\n if (StreamingMarkdownFilter.containsCJK(content)) return content;\n return `___${content}___`;\n }\n return \"\";\n }\n case \"italic\": {\n for (let j = 0; j < this.inl.acc.length; j++) {\n if (this.inl.acc[j] === \"\\n\") {\n const r = \"*\" + this.inl.acc.slice(0, j + 1);\n this.buf = this.inl.acc.slice(j + 1);\n this.inl = null;\n this.sol = true;\n return r;\n }\n if (this.inl.acc[j] === \"*\") {\n if (j + 1 < this.inl.acc.length && this.inl.acc[j + 1] === \"*\") {\n j++;\n continue;\n }\n const content = this.inl.acc.slice(0, j);\n this.buf = this.inl.acc.slice(j + 1);\n this.inl = null;\n if (StreamingMarkdownFilter.containsCJK(content)) return content;\n return `*${content}*`;\n }\n }\n return \"\";\n }\n case \"uitalic\": {\n for (let j = 0; j < this.inl.acc.length; j++) {\n if (this.inl.acc[j] === \"\\n\") {\n const r = \"_\" + this.inl.acc.slice(0, j + 1);\n this.buf = this.inl.acc.slice(j + 1);\n this.inl = null;\n this.sol = true;\n return r;\n }\n if (this.inl.acc[j] === \"_\") {\n if (j + 1 < this.inl.acc.length && this.inl.acc[j + 1] === \"_\") {\n j++;\n continue;\n }\n const content = this.inl.acc.slice(0, j);\n this.buf = this.inl.acc.slice(j + 1);\n this.inl = null;\n if (StreamingMarkdownFilter.containsCJK(content)) return content;\n return `_${content}_`;\n }\n }\n return \"\";\n }\n case \"image\": {\n const cb = this.inl.acc.indexOf(\"]\");\n if (cb === -1) return \"\";\n if (cb + 1 >= this.inl.acc.length) return \"\";\n if (this.inl.acc[cb + 1] !== \"(\") {\n const r = \"![\" + this.inl.acc.slice(0, cb + 1);\n this.buf = this.inl.acc.slice(cb + 1);\n this.inl = null;\n return r;\n }\n const cp = this.inl.acc.indexOf(\")\", cb + 2);\n if (cp !== -1) {\n this.buf = this.inl.acc.slice(cp + 1);\n this.inl = null;\n return \"\";\n }\n return \"\";\n }\n }\n return \"\";\n }\n\n private static containsCJK(text: string): boolean {\n return /[\\u2E80-\\u9FFF\\uAC00-\\uD7AF\\uF900-\\uFAFF]/.test(text);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"process-message.js","names":[],"sources":["../../../../../extensions/weixin/src/messaging/process-message.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { randomBytes } from 'node:crypto';\n\nimport type { Config } from '@xopcai/xopc/config/schema.js';\nimport type { MessageBus } from '@xopcai/xopc/infra/bus/index.js';\nimport { issuePairingChallenge, resolveWeixinPairingPath } from '@xopcai/xopc/channels/pairing/index.js';\nimport { evaluateAccess } from '@xopcai/xopc/channels/security.js';\nimport type { WeixinMessage } from '../api/types.js';\nimport { MessageItemType } from '../api/types.js';\nimport type { ResolvedWeixinAccount } from '../auth/accounts.js';\nimport { readFrameworkAllowFromList } from '../auth/pairing.js';\nimport { downloadMediaFromItem } from '../media/media-download.js';\nimport { logger } from '../util/logger.js';\nimport { resolveWeixinRootDir } from '../storage/state-dir.js';\nimport { handleSlashCommand } from './slash-commands.js';\nimport { sendMessageWeixin } from './send.js';\nimport {\n setContextToken,\n weixinMessageToMsgContext,\n isMediaItem,\n type WeixinInboundMediaOpts,\n} from './inbound.js';\nimport { isDebugMode } from './debug-mode.js';\nimport { generateWeixinSessionKeyWithRouting } from '../routing-integration.js';\n\nfunction extractTextBody(itemList?: import('../api/types.js').MessageItem[]): string {\n if (!itemList?.length) return '';\n for (const item of itemList) {\n if (item.type === MessageItemType.TEXT && item.text_item?.text != null) {\n return String(item.text_item.text);\n }\n }\n return '';\n}\n\nfunction mergeAllowFrom(account: ResolvedWeixinAccount, accountId: string): string[] {\n const store = readFrameworkAllowFromList(accountId);\n return [...new Set([...(account.allowFrom ?? []).map(String), ...store])];\n}\n\nasync function saveMediaBuffer(\n buffer: Buffer,\n contentType?: string,\n _subdir?: string,\n maxBytes?: number,\n originalFilename?: string,\n): Promise<{ path: string }> {\n const cap = maxBytes ?? 100 * 1024 * 1024;\n if (buffer.length > cap) {\n throw new Error(`weixin media exceeds max bytes (${cap})`);\n }\n const dir = path.join(resolveWeixinRootDir(), 'media', 'inbound-temp');\n await mkdir(dir, { recursive: true });\n const ext = originalFilename ? path.extname(originalFilename) : contentType?.includes('wav') ? '.wav' : '.bin';\n const fname = `${Date.now()}-${randomBytes(6).toString('hex')}${ext || '.bin'}`;\n const filePath = path.join(dir, fname);\n await writeFile(filePath, buffer);\n return { path: filePath };\n}\n\nexport type ProcessWeixinMessageDeps = {\n accountId: string;\n account: ResolvedWeixinAccount;\n config: Config;\n bus: MessageBus;\n baseUrl: string;\n cdnBaseUrl: string;\n token?: string;\n routeTag?: string;\n};\n\nexport async function processWeixinInboundMessage(\n full: WeixinMessage,\n deps: ProcessWeixinMessageDeps,\n): Promise<void> {\n const receivedAt = Date.now();\n const senderId = full.from_user_id ?? '';\n // Persist ilink context_token before slash handling and DM policy. Pairing only gates the agent\n // pipeline; cron/tools still need a cached token to call sendmessage.\n if (full.context_token?.trim() && senderId) {\n setContextToken(deps.accountId, senderId, full.context_token, { sendToUserId: senderId });\n }\n\n const textBody = extractTextBody(full.item_list);\n\n if (textBody.startsWith('/')) {\n const slashResult = await handleSlashCommand(\n textBody,\n {\n to: full.from_user_id ?? '',\n contextToken: full.context_token,\n baseUrl: deps.baseUrl,\n token: deps.token,\n accountId: deps.accountId,\n log: () => {},\n errLog: () => {},\n },\n receivedAt,\n full.create_time_ms,\n );\n if (slashResult.handled) {\n return;\n }\n }\n\n const mergedAllow = mergeAllowFrom(deps.account, deps.accountId);\n const access = evaluateAccess({\n context: {\n channel: 'weixin',\n accountId: deps.accountId,\n chatId: senderId,\n senderId,\n isGroup: false,\n isDm: true,\n },\n dmPolicy: deps.account.dmPolicy ?? 'open',\n allowFrom: mergedAllow,\n });\n if (!access.allowed) {\n if (access.reason === 'pairing-required' && deps.token) {\n try {\n await issuePairingChallenge({\n channel: 'weixin',\n pairingFilePath: resolveWeixinPairingPath(deps.accountId),\n accountId: deps.accountId,\n senderId,\n senderIdLine: `Your Weixin user id: ${senderId}`,\n sendPairingReply: async (text) => {\n await sendMessageWeixin({\n to: senderId,\n text,\n opts: {\n baseUrl: deps.baseUrl,\n token: deps.token,\n contextToken: full.context_token,\n routeTag: deps.routeTag,\n },\n });\n },\n onReplyError: (err) => {\n logger.warn(`weixin pairing reply failed from=${senderId} err=${String(err)}`);\n },\n });\n } catch (err) {\n logger.warn(`weixin pairing prompt failed from=${senderId} err=${String(err)}`);\n }\n } else {\n logger.info(\n `weixin: dropped message from=${senderId} dmPolicy=${deps.account.dmPolicy ?? 'open'} reason=${access.reason ?? 'not allowed'}`,\n );\n }\n return;\n }\n\n const mediaOpts: WeixinInboundMediaOpts = {};\n\n const hasDownloadableMedia = (m?: { encrypt_query_param?: string; full_url?: string }) =>\n Boolean(m?.encrypt_query_param || m?.full_url);\n\n const mainMediaItem =\n full.item_list?.find(\n (i) => i.type === MessageItemType.IMAGE && hasDownloadableMedia(i.image_item?.media),\n ) ??\n full.item_list?.find(\n (i) => i.type === MessageItemType.VIDEO && hasDownloadableMedia(i.video_item?.media),\n ) ??\n full.item_list?.find(\n (i) => i.type === MessageItemType.FILE && hasDownloadableMedia(i.file_item?.media),\n ) ??\n full.item_list?.find(\n (i) =>\n i.type === MessageItemType.VOICE &&\n hasDownloadableMedia(i.voice_item?.media) &&\n !i.voice_item?.text,\n );\n const refMediaItem = !mainMediaItem\n ? full.item_list?.find(\n (i) =>\n i.type === MessageItemType.TEXT &&\n i.ref_msg?.message_item &&\n isMediaItem(i.ref_msg.message_item!),\n )?.ref_msg?.message_item\n : undefined;\n\n const mediaItem = mainMediaItem ?? refMediaItem;\n if (mediaItem) {\n const label = refMediaItem ? 'ref' : 'inbound';\n const downloaded = await downloadMediaFromItem(mediaItem, {\n cdnBaseUrl: deps.cdnBaseUrl,\n saveMedia: saveMediaBuffer,\n log: (m) => logger.debug(m),\n errLog: (m) => logger.warn(m),\n label,\n });\n Object.assign(mediaOpts, downloaded);\n }\n\n const ctx = weixinMessageToMsgContext(full, deps.accountId, mediaOpts);\n const body = ctx.Body?.trim() ?? '';\n\n const sessionKey = generateWeixinSessionKeyWithRouting(\n { accountId: deps.accountId, senderId },\n deps.config,\n );\n\n const attachments: Array<{ type: string; mimeType?: string; data?: string; name?: string }> = [];\n\n if (mediaOpts.decryptedPicPath) {\n const buf = await readFile(mediaOpts.decryptedPicPath);\n attachments.push({\n type: 'image',\n mimeType: 'image/jpeg',\n data: buf.toString('base64'),\n name: path.basename(mediaOpts.decryptedPicPath),\n });\n } else if (mediaOpts.decryptedVoicePath) {\n const buf = await readFile(mediaOpts.decryptedVoicePath);\n attachments.push({\n type: 'audio',\n mimeType: mediaOpts.voiceMediaType ?? 'audio/wav',\n data: buf.toString('base64'),\n name: path.basename(mediaOpts.decryptedVoicePath),\n });\n } else if (mediaOpts.decryptedFilePath) {\n const buf = await readFile(mediaOpts.decryptedFilePath);\n attachments.push({\n type: 'file',\n mimeType: mediaOpts.fileMediaType ?? 'application/octet-stream',\n data: buf.toString('base64'),\n name: path.basename(mediaOpts.decryptedFilePath),\n });\n } else if (mediaOpts.decryptedVideoPath) {\n const buf = await readFile(mediaOpts.decryptedVideoPath);\n attachments.push({\n type: 'file',\n mimeType: 'video/mp4',\n data: buf.toString('base64'),\n name: path.basename(mediaOpts.decryptedVideoPath),\n });\n }\n\n const debug = isDebugMode(deps.accountId);\n if (debug) {\n logger.debug(\n `weixin debug inbound from=${senderId} bodyLen=${body.length} attachments=${attachments.length}`,\n );\n }\n\n await deps.bus.publishInbound({\n channel: 'weixin',\n sender_id: senderId,\n chat_id: senderId,\n content: body,\n metadata: {\n accountId: deps.accountId,\n sessionKey,\n messageId: full.message_id != null ? String(full.message_id) : undefined,\n isGroup: false,\n isCommand: body.trim().startsWith('/'),\n contextToken: ctx.context_token,\n },\n attachments: attachments.length ? attachments : undefined,\n });\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"send-media.js","names":[],"sources":["../../../../../extensions/weixin/src/messaging/send-media.ts"],"sourcesContent":["import path from \"node:path\";\nimport type { WeixinApiOptions } from \"../api/api.js\";\nimport { toRawIlinkUserIdForApi } from \"../auth/weixin-account-id.js\";\nimport { logger } from \"../util/logger.js\";\nimport { getMimeFromFilename } from \"../media/mime.js\";\nimport { sendFileMessageWeixin, sendImageMessageWeixin, sendVideoMessageWeixin } from \"./send.js\";\nimport { uploadFileAttachmentToWeixin, uploadFileToWeixin, uploadVideoToWeixin } from \"../cdn/upload.js\";\n\n/**\n * Upload a local file and send it as a weixin message, routing by MIME type:\n * video/* → uploadVideoToWeixin + sendVideoMessageWeixin\n * image/* → uploadFileToWeixin + sendImageMessageWeixin\n * else → uploadFileAttachmentToWeixin + sendFileMessageWeixin\n *\n * Used by both the auto-reply deliver path (monitor.ts) and the outbound\n * sendMedia path (channel.ts) so they stay in sync.\n *\n * `audio/*` (e.g. TTS mp3) hits the `else` branch (file attachment, not VoiceItem).\n */\nexport async function sendWeixinMediaFile(params: {\n filePath: string;\n to: string;\n toUserIdForApi?: string;\n text: string;\n opts: WeixinApiOptions & { contextToken?: string };\n cdnBaseUrl: string;\n}): Promise<{ messageId: string }> {\n const { filePath, to, text, opts, cdnBaseUrl } = params;\n const apiTo = params.toUserIdForApi?.trim() || toRawIlinkUserIdForApi(to);\n const mime = getMimeFromFilename(filePath);\n /** `{ baseUrl, token }` only; xopc adds `routeTag` for `SKRouteTag` on getUploadUrl. */\n const uploadOpts: WeixinApiOptions = { baseUrl: opts.baseUrl, token: opts.token };\n if (opts.routeTag?.trim()) {\n uploadOpts.routeTag = opts.routeTag;\n }\n\n if (mime.startsWith(\"video/\")) {\n logger.info(`[weixin] sendWeixinMediaFile: uploading video filePath=${filePath} to=${to}`);\n const uploaded = await uploadVideoToWeixin({\n filePath,\n toUserId: apiTo,\n opts: uploadOpts,\n cdnBaseUrl,\n });\n logger.info(\n `[weixin] sendWeixinMediaFile: video upload done filekey=${uploaded.filekey} size=${uploaded.fileSize}`,\n );\n return sendVideoMessageWeixin({ to, toUserIdForApi: apiTo, text, uploaded, opts });\n }\n\n if (mime.startsWith(\"image/\")) {\n logger.info(`[weixin] sendWeixinMediaFile: uploading image filePath=${filePath} to=${to}`);\n const uploaded = await uploadFileToWeixin({\n filePath,\n toUserId: apiTo,\n opts: uploadOpts,\n cdnBaseUrl,\n });\n logger.info(\n `[weixin] sendWeixinMediaFile: image upload done filekey=${uploaded.filekey} size=${uploaded.fileSize}`,\n );\n return sendImageMessageWeixin({ to, toUserIdForApi: apiTo, text, uploaded, opts });\n }\n\n // File attachment: pdf, doc, zip, etc.\n const fileName = path.basename(filePath);\n logger.info(\n `[weixin] sendWeixinMediaFile: uploading file attachment filePath=${filePath} name=${fileName} to=${to}`,\n );\n const uploaded = await uploadFileAttachmentToWeixin({\n filePath,\n fileName,\n toUserId: apiTo,\n opts: uploadOpts,\n cdnBaseUrl,\n });\n logger.info(\n `[weixin] sendWeixinMediaFile: file upload done filekey=${uploaded.filekey} size=${uploaded.fileSize}`,\n );\n return sendFileMessageWeixin({ to, toUserIdForApi: apiTo, text, fileName, uploaded, opts });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAmBA,eAAsB,oBAAoB,QAOP;CACjC,MAAM,EAAE,UAAU,IAAI,MAAM,MAAM,eAAe;CACjD,MAAM,QAAQ,OAAO,gBAAgB,MAAM,IAAI,uBAAuB,GAAG;CACzE,MAAM,OAAO,oBAAoB,SAAS;;CAE1C,MAAM,aAA+B;EAAE,SAAS,KAAK;EAAS,OAAO,KAAK;EAAO;AACjF,KAAI,KAAK,UAAU,MAAM,CACvB,YAAW,WAAW,KAAK;AAG7B,KAAI,KAAK,WAAW,SAAS,EAAE;AAC7B,SAAO,KAAK,0DAA0D,SAAS,MAAM,KAAK;EAC1F,MAAM,WAAW,MAAM,oBAAoB;GACzC;GACA,UAAU;GACV,MAAM;GACN;GACD,CAAC;AACF,SAAO,KACL,2DAA2D,SAAS,QAAQ,QAAQ,SAAS,WAC9F;AACD,SAAO,uBAAuB;GAAE;GAAI,gBAAgB;GAAO;GAAM;GAAU;GAAM,CAAC;;AAGpF,KAAI,KAAK,WAAW,SAAS,EAAE;AAC7B,SAAO,KAAK,0DAA0D,SAAS,MAAM,KAAK;EAC1F,MAAM,WAAW,MAAM,mBAAmB;GACxC;GACA,UAAU;GACV,MAAM;GACN;GACD,CAAC;AACF,SAAO,KACL,2DAA2D,SAAS,QAAQ,QAAQ,SAAS,WAC9F;AACD,SAAO,uBAAuB;GAAE;GAAI,gBAAgB;GAAO;GAAM;GAAU;GAAM,CAAC;;CAIpF,MAAM,WAAW,KAAK,SAAS,SAAS;AACxC,QAAO,KACL,oEAAoE,SAAS,QAAQ,SAAS,MAAM,KACrG;CACD,MAAM,WAAW,MAAM,6BAA6B;EAClD;EACA;EACA,UAAU;EACV,MAAM;EACN;EACD,CAAC;AACF,QAAO,KACL,0DAA0D,SAAS,QAAQ,QAAQ,SAAS,WAC7F;AACD,QAAO,sBAAsB;EAAE;EAAI,gBAAgB;EAAO;EAAM;EAAU;EAAU;EAAM,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"send.js","names":["sendMessageApi"],"sources":["../../../../../extensions/weixin/src/messaging/send.ts"],"sourcesContent":["import { toRawIlinkUserIdForApi } from \"../auth/weixin-account-id.js\";\nimport { sendMessage as sendMessageApi } from \"../api/api.js\";\nimport type { WeixinApiOptions } from \"../api/api.js\";\nimport { logger } from \"../util/logger.js\";\nimport { generateId } from \"../util/random.js\";\nimport type { MessageItem, SendMessageReq } from \"../api/types.js\";\nimport { MessageItemType, MessageState, MessageType } from \"../api/types.js\";\nimport type { UploadedFileInfo } from \"../cdn/upload.js\";\n\nfunction generateClientId(): string {\n return generateId(\"weixin\");\n}\n\nfunction resolveToUserIdForApi(sessionTo: string, override?: string): string {\n const o = override?.trim();\n if (o) return o;\n return toRawIlinkUserIdForApi(sessionTo);\n}\n\n/**\n * Convert markdown-formatted model reply to plain text for Weixin delivery.\n * Preserves newlines; strips markdown syntax.\n */\nexport function markdownToPlainText(text: string): string {\n let result = text;\n // Code blocks: strip fences, keep code content\n result = result.replace(/```[^\\n]*\\n?([\\s\\S]*?)```/g, (_, code: string) => code.trim());\n // Images: remove entirely\n result = result.replace(/!\\[[^\\]]*\\]\\([^)]*\\)/g, \"\");\n // Links: keep display text only\n result = result.replace(/\\[([^\\]]+)\\]\\([^)]*\\)/g, \"$1\");\n // Tables: remove separator rows, then strip leading/trailing pipes and convert inner pipes to spaces\n result = result.replace(/^\\|[\\s:|-]+\\|$/gm, \"\");\n result = result.replace(/^\\|(.+)\\|$/gm, (_, inner: string) =>\n inner.split(\"|\").map((cell) => cell.trim()).join(\" \"),\n );\n result = result.replace(/\\*\\*([^*]+)\\*\\*/g, \"$1\");\n result = result.replace(/\\*([^*]+)\\*/g, \"$1\");\n result = result.replace(/__([^_]+)__/g, \"$1\");\n result = result.replace(/`([^`]+)`/g, \"$1\");\n return result.trim();\n}\n\n\n/** Build a SendMessageReq containing a single text message. */\nfunction buildTextMessageReq(params: {\n toUserIdForApi: string;\n text: string;\n contextToken?: string;\n clientId: string;\n}): SendMessageReq {\n const { toUserIdForApi, text, contextToken, clientId } = params;\n const item_list: MessageItem[] = text\n ? [{ type: MessageItemType.TEXT, text_item: { text } }]\n : [];\n return {\n msg: {\n from_user_id: \"\",\n to_user_id: toUserIdForApi,\n client_id: clientId,\n message_type: MessageType.BOT,\n message_state: MessageState.FINISH,\n item_list: item_list.length ? item_list : undefined,\n context_token: contextToken ?? undefined,\n },\n };\n}\n\n/**\n * Send a plain text message downstream.\n */\nexport async function sendMessageWeixin(params: {\n to: string;\n /** Verbatim ilink `to_user_id` when known (inbound `from_user_id`); else derived from `to`. */\n toUserIdForApi?: string;\n text: string;\n opts: WeixinApiOptions & { contextToken?: string };\n}): Promise<{ messageId: string }> {\n const { to, text, opts } = params;\n const apiTo = resolveToUserIdForApi(to, params.toUserIdForApi);\n if (!opts.contextToken) {\n logger.warn(`sendMessageWeixin: contextToken missing for to=${to}, sending without context`);\n }\n const clientId = generateClientId();\n const req = buildTextMessageReq({\n toUserIdForApi: apiTo,\n text,\n contextToken: opts.contextToken,\n clientId,\n });\n try {\n await sendMessageApi({\n baseUrl: opts.baseUrl,\n token: opts.token,\n timeoutMs: opts.timeoutMs,\n routeTag: opts.routeTag,\n body: req,\n });\n } catch (err) {\n logger.error(\n `sendMessageWeixin: failed sessionTo=${to} apiTo=${apiTo} clientId=${clientId} err=${String(err)}`,\n );\n throw err;\n }\n return { messageId: clientId };\n}\n\n/**\n * Send one or more MessageItems (optionally preceded by a text caption) downstream.\n * Each item is sent as its own request so that item_list always has exactly one entry.\n */\nasync function sendMediaItems(params: {\n to: string;\n toUserIdForApi?: string;\n text: string;\n mediaItem: MessageItem;\n opts: WeixinApiOptions & { contextToken?: string };\n label: string;\n}): Promise<{ messageId: string }> {\n const { to, text, mediaItem, opts, label } = params;\n const apiTo = resolveToUserIdForApi(to, params.toUserIdForApi);\n\n const items: MessageItem[] = [];\n if (text) {\n items.push({ type: MessageItemType.TEXT, text_item: { text } });\n }\n items.push(mediaItem);\n\n let lastClientId = \"\";\n /** Each request uses `opts.contextToken` (no per-bubble refresh). */\n for (const item of items) {\n lastClientId = generateClientId();\n const req: SendMessageReq = {\n msg: {\n from_user_id: \"\",\n to_user_id: apiTo,\n client_id: lastClientId,\n message_type: MessageType.BOT,\n message_state: MessageState.FINISH,\n item_list: [item],\n context_token: opts.contextToken ?? undefined,\n },\n };\n try {\n await sendMessageApi({\n baseUrl: opts.baseUrl,\n token: opts.token,\n timeoutMs: opts.timeoutMs,\n routeTag: opts.routeTag,\n body: req,\n });\n } catch (err) {\n logger.error(\n `${label}: failed sessionTo=${to} apiTo=${apiTo} clientId=${lastClientId} err=${String(err)}`,\n );\n throw err;\n }\n }\n\n logger.info(`${label}: success sessionTo=${to} apiTo=${apiTo} clientId=${lastClientId}`);\n return { messageId: lastClientId };\n}\n\n/**\n * Send an image message downstream using a previously uploaded file.\n * Optionally include a text caption as a separate TEXT item before the image.\n *\n * ImageItem fields:\n * - media.encrypt_query_param: CDN download param\n * - media.aes_key: AES key, base64-encoded\n * - mid_size: original ciphertext file size\n */\nexport async function sendImageMessageWeixin(params: {\n to: string;\n toUserIdForApi?: string;\n text: string;\n uploaded: UploadedFileInfo;\n opts: WeixinApiOptions & { contextToken?: string };\n}): Promise<{ messageId: string }> {\n const { to, text, uploaded, opts, toUserIdForApi } = params;\n if (!opts.contextToken) {\n logger.warn(`sendImageMessageWeixin: contextToken missing for to=${to}, sending without context`);\n }\n logger.info(\n `sendImageMessageWeixin: to=${to} filekey=${uploaded.filekey} fileSize=${uploaded.fileSize} aeskey=present`,\n );\n\n const imageItem: MessageItem = {\n type: MessageItemType.IMAGE,\n image_item: {\n media: {\n encrypt_query_param: uploaded.downloadEncryptedQueryParam,\n aes_key: Buffer.from(uploaded.aeskey).toString(\"base64\"),\n encrypt_type: 1,\n },\n mid_size: uploaded.fileSizeCiphertext,\n },\n };\n\n return sendMediaItems({\n to,\n toUserIdForApi,\n text,\n mediaItem: imageItem,\n opts,\n label: \"sendImageMessageWeixin\",\n });\n}\n\n/**\n * Send a video message downstream using a previously uploaded file.\n * VideoItem: media (CDN ref), video_size (ciphertext bytes).\n * Includes an optional text caption sent as a separate TEXT item first.\n */\nexport async function sendVideoMessageWeixin(params: {\n to: string;\n toUserIdForApi?: string;\n text: string;\n uploaded: UploadedFileInfo;\n opts: WeixinApiOptions & { contextToken?: string };\n}): Promise<{ messageId: string }> {\n const { to, text, uploaded, opts, toUserIdForApi } = params;\n if (!opts.contextToken) {\n logger.warn(`sendVideoMessageWeixin: contextToken missing for to=${to}, sending without context`);\n }\n\n const videoItem: MessageItem = {\n type: MessageItemType.VIDEO,\n video_item: {\n media: {\n encrypt_query_param: uploaded.downloadEncryptedQueryParam,\n aes_key: Buffer.from(uploaded.aeskey).toString(\"base64\"),\n encrypt_type: 1,\n },\n video_size: uploaded.fileSizeCiphertext,\n },\n };\n\n return sendMediaItems({\n to,\n toUserIdForApi,\n text,\n mediaItem: videoItem,\n opts,\n label: \"sendVideoMessageWeixin\",\n });\n}\n\n/**\n * Send a file attachment downstream using a previously uploaded file.\n * FileItem: media (CDN ref), file_name, len (plaintext bytes as string).\n * Includes an optional text caption sent as a separate TEXT item first.\n */\nexport async function sendFileMessageWeixin(params: {\n to: string;\n toUserIdForApi?: string;\n text: string;\n fileName: string;\n uploaded: UploadedFileInfo;\n opts: WeixinApiOptions & { contextToken?: string };\n}): Promise<{ messageId: string }> {\n const { to, text, fileName, uploaded, opts, toUserIdForApi } = params;\n if (!opts.contextToken) {\n logger.warn(`sendFileMessageWeixin: contextToken missing for to=${to}, sending without context`);\n }\n const fileItem: MessageItem = {\n type: MessageItemType.FILE,\n file_item: {\n media: {\n encrypt_query_param: uploaded.downloadEncryptedQueryParam,\n aes_key: Buffer.from(uploaded.aeskey).toString(\"base64\"),\n encrypt_type: 1,\n },\n file_name: fileName,\n len: String(uploaded.fileSize),\n },\n };\n\n return sendMediaItems({\n to,\n toUserIdForApi,\n text,\n mediaItem: fileItem,\n opts,\n label: \"sendFileMessageWeixin\",\n });\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"slash-commands.js","names":[],"sources":["../../../../../extensions/weixin/src/messaging/slash-commands.ts"],"sourcesContent":["/**\n * Weixin 斜杠指令处理模块\n *\n * 支持的指令:\n * - /echo <message> 直接回复消息(不经过 AI),并附带通道耗时统计\n * - /toggle-debug 开关 debug 模式,启用后每条 AI 回复追加全链路耗时\n */\nimport type { WeixinApiOptions } from \"../api/api.js\";\nimport { logger } from \"../util/logger.js\";\n\nimport { toggleDebugMode, isDebugMode } from \"./debug-mode.js\";\nimport { sendMessageWeixin } from \"./send.js\";\n\nexport interface SlashCommandResult {\n /** 是否是斜杠指令(true 表示已处理,不需要继续走 AI) */\n handled: boolean;\n}\n\nexport interface SlashCommandContext {\n to: string;\n contextToken?: string;\n baseUrl: string;\n token?: string;\n accountId: string;\n log: (msg: string) => void;\n errLog: (msg: string) => void;\n}\n\n/** 发送回复消息 */\nasync function sendReply(ctx: SlashCommandContext, text: string): Promise<void> {\n const opts: WeixinApiOptions & { contextToken?: string } = {\n baseUrl: ctx.baseUrl,\n token: ctx.token,\n contextToken: ctx.contextToken,\n };\n await sendMessageWeixin({ to: ctx.to, text, opts });\n}\n\n/** 处理 /echo 指令 */\nasync function handleEcho(\n ctx: SlashCommandContext,\n args: string,\n receivedAt: number,\n eventTimestamp?: number,\n): Promise<void> {\n const message = args.trim();\n if (message) {\n await sendReply(ctx, message);\n }\n const eventTs = eventTimestamp ?? 0;\n const platformDelay = eventTs > 0 ? `${receivedAt - eventTs}ms` : \"N/A\";\n const timing = [\n \"⏱ 通道耗时\",\n `├ 事件时间: ${eventTs > 0 ? new Date(eventTs).toISOString() : \"N/A\"}`,\n `├ 平台→插件: ${platformDelay}`,\n `└ 插件处理: ${Date.now() - receivedAt}ms`,\n ].join(\"\\n\");\n await sendReply(ctx, timing);\n}\n\n/**\n * 尝试处理斜杠指令\n *\n * @returns handled=true 表示该消息已作为指令处理,不需要继续走 AI 管道\n */\nexport async function handleSlashCommand(\n content: string,\n ctx: SlashCommandContext,\n receivedAt: number,\n eventTimestamp?: number,\n): Promise<SlashCommandResult> {\n const trimmed = content.trim();\n if (!trimmed.startsWith(\"/\")) {\n return { handled: false };\n }\n\n const spaceIdx = trimmed.indexOf(\" \");\n const command = spaceIdx === -1 ? trimmed.toLowerCase() : trimmed.slice(0, spaceIdx).toLowerCase();\n const args = spaceIdx === -1 ? \"\" : trimmed.slice(spaceIdx + 1);\n\n logger.info(`[weixin] Slash command: ${command}, args: ${args.slice(0, 50)}`);\n\n try {\n switch (command) {\n case \"/echo\":\n await handleEcho(ctx, args, receivedAt, eventTimestamp);\n return { handled: true };\n case \"/toggle-debug\": {\n const enabled = toggleDebugMode(ctx.accountId);\n await sendReply(\n ctx,\n enabled\n ? \"Debug 模式已开启\"\n : \"Debug 模式已关闭\",\n );\n return { handled: true };\n }\n default:\n return { handled: false };\n }\n } catch (err) {\n logger.error(`[weixin] Slash command error: ${String(err)}`);\n try {\n await sendReply(ctx, `❌ 指令执行失败: ${String(err).slice(0, 200)}`);\n } catch {\n // 发送错误消息也失败了,只能记日志\n }\n return { handled: true };\n }\n}\n"],"mappings":";;;;;AA6BA,eAAe,UAAU,KAA0B,MAA6B;CAC9E,MAAM,OAAqD;EACzD,SAAS,IAAI;EACb,OAAO,IAAI;EACX,cAAc,IAAI;EACnB;AACD,OAAM,kBAAkB;EAAE,IAAI,IAAI;EAAI;EAAM;EAAM,CAAC;;;AAIrD,eAAe,WACb,KACA,MACA,YACA,gBACe;CACf,MAAM,UAAU,KAAK,MAAM;AAC3B,KAAI,QACF,OAAM,UAAU,KAAK,QAAQ;CAE/B,MAAM,UAAU,kBAAkB;CAClC,MAAM,gBAAgB,UAAU,IAAI,GAAG,aAAa,QAAQ,MAAM;AAOlE,OAAM,UAAU,KAND;EACb;EACA,WAAW,UAAU,IAAI,IAAI,KAAK,QAAQ,CAAC,aAAa,GAAG;EAC3D,YAAY;EACZ,WAAW,KAAK,KAAK,GAAG,WAAW;EACpC,CAAC,KAAK,KACoB,CAAC;;;;;;;AAQ9B,eAAsB,mBACpB,SACA,KACA,YACA,gBAC6B;CAC7B,MAAM,UAAU,QAAQ,MAAM;AAC9B,KAAI,CAAC,QAAQ,WAAW,IAAI,CAC1B,QAAO,EAAE,SAAS,OAAO;CAG3B,MAAM,WAAW,QAAQ,QAAQ,IAAI;CACrC,MAAM,UAAU,aAAa,KAAK,QAAQ,aAAa,GAAG,QAAQ,MAAM,GAAG,SAAS,CAAC,aAAa;CAClG,MAAM,OAAO,aAAa,KAAK,KAAK,QAAQ,MAAM,WAAW,EAAE;AAE/D,QAAO,KAAK,2BAA2B,QAAQ,UAAU,KAAK,MAAM,GAAG,GAAG,GAAG;AAE7E,KAAI;AACF,UAAQ,SAAR;GACE,KAAK;AACH,UAAM,WAAW,KAAK,MAAM,YAAY,eAAe;AACvD,WAAO,EAAE,SAAS,MAAM;GAC1B,KAAK;AAEH,UAAM,UACJ,KAFc,gBAAgB,IAAI,UAG3B,GACH,gBACA,cACL;AACD,WAAO,EAAE,SAAS,MAAM;GAE1B,QACE,QAAO,EAAE,SAAS,OAAO;;UAEtB,KAAK;AACZ,SAAO,MAAM,iCAAiC,OAAO,IAAI,GAAG;AAC5D,MAAI;AACF,SAAM,UAAU,KAAK,aAAa,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG;UACxD;AAGR,SAAO,EAAE,SAAS,MAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"typing-ticket-store.js","names":[],"sources":["../../../../../extensions/weixin/src/messaging/typing-ticket-store.ts"],"sourcesContent":["import { canonicalWeixinPeerId, normalizeWeixinAccountId } from \"../auth/weixin-account-id.js\";\n\n/** In-memory typing_ticket per (accountId, peer user id) — refreshed from getConfig in monitor. */\n\nconst tickets = new Map<string, string>();\n\nfunction storeKey(accountId: string, ilinkUserId: string): string {\n return `${normalizeWeixinAccountId(accountId)}:${canonicalWeixinPeerId(ilinkUserId)}`;\n}\n\nexport function setWeixinTypingTicket(\n accountId: string,\n ilinkUserId: string,\n typingTicket: string,\n): void {\n const k = storeKey(accountId, ilinkUserId);\n const t = typingTicket.trim();\n if (t) tickets.set(k, t);\n else tickets.delete(k);\n}\n\nexport function getWeixinTypingTicket(accountId: string, ilinkUserId: string): string | undefined {\n return tickets.get(storeKey(accountId, ilinkUserId));\n}\n"],"mappings":";;;AAIA,MAAM,0BAAU,IAAI,KAAqB;AAEzC,SAAS,SAAS,WAAmB,aAA6B;AAChE,QAAO,GAAG,yBAAyB,UAAU,CAAC,GAAG,sBAAsB,YAAY;;AAGrF,SAAgB,sBACd,WACA,aACA,cACM;CACN,MAAM,IAAI,SAAS,WAAW,YAAY;CAC1C,MAAM,IAAI,aAAa,MAAM;AAC7B,KAAI,EAAG,SAAQ,IAAI,GAAG,EAAE;KACnB,SAAQ,OAAO,EAAE;;AAGxB,SAAgB,sBAAsB,WAAmB,aAAyC;AAChG,QAAO,QAAQ,IAAI,SAAS,WAAW,YAAY,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"monitor.js","names":[],"sources":["../../../../../extensions/weixin/src/monitor/monitor.ts"],"sourcesContent":["import type { Config } from '@xopcai/xopc/config/schema.js';\nimport type { MessageBus } from '@xopcai/xopc/infra/bus/index.js';\n\nimport { getUpdates } from '../api/api.js';\nimport { WeixinConfigManager } from '../api/config-cache.js';\nimport { SESSION_EXPIRED_ERRCODE, pauseSession, getRemainingPauseMs } from '../api/session-guard.js';\nimport { processWeixinInboundMessage } from '../messaging/process-message.js';\nimport { setWeixinTypingTicket } from '../messaging/typing-ticket-store.js';\nimport { getSyncBufFilePath, loadGetUpdatesBuf, saveGetUpdatesBuf } from '../storage/sync-buf.js';\nimport { logger } from '../util/logger.js';\nimport { redactBody } from '../util/redact.js';\nimport type { ResolvedWeixinAccount } from '../auth/accounts.js';\n\nconst DEFAULT_LONG_POLL_TIMEOUT_MS = 35_000;\nconst MAX_CONSECUTIVE_FAILURES = 3;\nconst BACKOFF_DELAY_MS = 30_000;\nconst RETRY_DELAY_MS = 2_000;\n\nexport type MonitorWeixinOpts = {\n account: ResolvedWeixinAccount;\n config: Config;\n bus: MessageBus;\n abortSignal?: AbortSignal;\n longPollTimeoutMs?: number;\n};\n\n/**\n * Long-poll loop: getUpdates → process inbound.\n */\nexport async function monitorWeixinProvider(opts: MonitorWeixinOpts): Promise<void> {\n const { account, config, bus, abortSignal, longPollTimeoutMs } = opts;\n const accountId = account.accountId;\n const baseUrl = account.baseUrl;\n const cdnBaseUrl = account.cdnBaseUrl;\n const token = account.token;\n const routeTag = account.routeTag;\n\n const aLog = logger;\n\n const syncFilePath = getSyncBufFilePath(accountId);\n aLog.debug(`syncFilePath: ${syncFilePath}`);\n\n const previousGetUpdatesBuf = loadGetUpdatesBuf(syncFilePath);\n let getUpdatesBuf = previousGetUpdatesBuf ?? '';\n\n if (previousGetUpdatesBuf) {\n aLog.debug(`Using previous get_updates_buf (${getUpdatesBuf.length} bytes)`);\n } else {\n aLog.info(`No previous get_updates_buf found, starting fresh`);\n }\n\n const configLog = (msg: string) => {\n aLog.debug(msg);\n };\n const configManager = new WeixinConfigManager({ baseUrl, token, routeTag }, configLog);\n\n let nextTimeoutMs = longPollTimeoutMs ?? DEFAULT_LONG_POLL_TIMEOUT_MS;\n let consecutiveFailures = 0;\n let lastHealthCheck = Date.now();\n\n aLog.info(\n `Weixin monitor started: baseUrl=${baseUrl} account=${accountId} timeoutMs=${nextTimeoutMs}`,\n );\n\n while (!abortSignal?.aborted) {\n try {\n aLog.debug(\n `getUpdates: get_updates_buf=${getUpdatesBuf.substring(0, 50)}..., timeoutMs=${nextTimeoutMs}`,\n );\n const resp = await getUpdates({\n baseUrl,\n token,\n get_updates_buf: getUpdatesBuf,\n timeoutMs: nextTimeoutMs,\n routeTag,\n abortSignal,\n });\n aLog.debug(\n `getUpdates response: ret=${resp.ret}, msgs=${resp.msgs?.length ?? 0}, get_updates_buf_length=${resp.get_updates_buf?.length ?? 0}`,\n );\n\n if (resp.longpolling_timeout_ms != null && resp.longpolling_timeout_ms > 0) {\n nextTimeoutMs = resp.longpolling_timeout_ms;\n aLog.debug(`Updated next poll timeout: ${nextTimeoutMs}ms`);\n }\n const isApiError =\n (resp.ret !== undefined && resp.ret !== 0) ||\n (resp.errcode !== undefined && resp.errcode !== 0);\n if (isApiError) {\n const isSessionExpired =\n resp.errcode === SESSION_EXPIRED_ERRCODE || resp.ret === SESSION_EXPIRED_ERRCODE;\n\n if (isSessionExpired) {\n pauseSession(accountId);\n const pauseMs = getRemainingPauseMs(accountId);\n aLog.error(\n `getUpdates: session expired (errcode=${resp.errcode} ret=${resp.ret}), pausing all requests for ${Math.ceil(pauseMs / 60_000)} min`,\n );\n consecutiveFailures = 0;\n await sleep(pauseMs, abortSignal);\n continue;\n }\n\n consecutiveFailures += 1;\n aLog.error(\n `getUpdates failed: ret=${resp.ret} errcode=${resp.errcode} errmsg=${resp.errmsg ?? ''} response=${redactBody(JSON.stringify(resp))}`,\n );\n if (consecutiveFailures >= MAX_CONSECUTIVE_FAILURES) {\n aLog.error(\n `getUpdates: ${MAX_CONSECUTIVE_FAILURES} consecutive failures, backing off 30s`,\n );\n consecutiveFailures = 0;\n await sleep(BACKOFF_DELAY_MS, abortSignal);\n } else {\n await sleep(RETRY_DELAY_MS, abortSignal);\n }\n continue;\n }\n consecutiveFailures = 0;\n if (resp.get_updates_buf != null && resp.get_updates_buf !== '') {\n saveGetUpdatesBuf(syncFilePath, resp.get_updates_buf);\n getUpdatesBuf = resp.get_updates_buf;\n aLog.debug(`Saved new get_updates_buf (${getUpdatesBuf.length} bytes)`);\n }\n const list = resp.msgs ?? [];\n for (const full of list) {\n aLog.info(\n `inbound message: from=${full.from_user_id} types=${full.item_list?.map((i) => i.type).join(',') ?? 'none'}`,\n );\n\n const fromUserId = full.from_user_id ?? '';\n const cached = await configManager.getForUser(fromUserId, full.context_token);\n setWeixinTypingTicket(accountId, fromUserId, cached.typingTicket);\n\n await processWeixinInboundMessage(full, {\n accountId,\n account,\n config,\n bus,\n baseUrl,\n cdnBaseUrl,\n token,\n routeTag,\n });\n }\n } catch (err) {\n if (abortSignal?.aborted) {\n aLog.info(`Weixin monitor stopped (aborted)`);\n return;\n }\n consecutiveFailures += 1;\n const e = err as { stack?: string; cause?: unknown };\n const cause = (e && typeof e === 'object' ? (e as any).cause : undefined) as\n | { code?: string; message?: string; name?: string }\n | undefined;\n const causeText = cause\n ? ` cause=${cause.name ?? ''}${cause.code ? `(${cause.code})` : ''}:${cause.message ?? String(cause)}`\n : '';\n aLog.error(`getUpdates error: ${String(err)}${causeText}, stack=${(err as Error).stack ?? ''}`);\n if (consecutiveFailures >= MAX_CONSECUTIVE_FAILURES) {\n aLog.error(\n `getUpdates: ${MAX_CONSECUTIVE_FAILURES} consecutive failures, backing off 30s`,\n );\n consecutiveFailures = 0;\n await sleep(30_000, abortSignal);\n } else {\n await sleep(2000, abortSignal);\n }\n\n // 健康检查:定期重置 getUpdatesBuf 防止长轮询卡死\n // 强制刷新缓冲区,避免网络/VPN 不稳定时卡在旧请求上\n const HEALTH_CHECK_INTERVAL_MS = 120_000; // 2 分钟\n const now = Date.now();\n if (now - lastHealthCheck > HEALTH_CHECK_INTERVAL_MS) {\n aLog.debug(`Health check: resetting get_updates_buf to force fresh poll`);\n getUpdatesBuf = '';\n }\n lastHealthCheck = now;\n }\n }\n aLog.info(`Weixin monitor ended`);\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const t = setTimeout(resolve, ms);\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(t);\n // Treat abort as a normal shutdown path (caller may catch and ignore).\n reject(Object.assign(new Error('aborted'), { name: 'AbortError' }));\n },\n { once: true },\n );\n });\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"outbound-send.js","names":[],"sources":["../../../../extensions/weixin/src/outbound-send.ts"],"sourcesContent":["import path from 'node:path';\n\nimport type { Config } from '@xopcai/xopc/config/schema.js';\nimport type {\n ChannelOutboundContext,\n ChannelOutboundPayloadContext,\n OutboundDeliveryResult,\n} from '@xopcai/xopc/channels/plugin-types.js';\nimport type { OutboundMessage } from '@xopcai/xopc/channels/transport-types.js';\n\nimport { toRawIlinkUserIdForApi } from './auth/weixin-account-id.js';\nimport { sendTyping } from './api/api.js';\nimport { TypingStatus } from './api/types.js';\nimport { assertSessionActive } from './api/session-guard.js';\nimport {\n listWeixinAccountIds,\n resolveWeixinAccount,\n type ResolvedWeixinAccount,\n} from './auth/accounts.js';\nimport { downloadRemoteImageToTemp } from './cdn/upload.js';\nimport { ensureWeixinContextTokenForOutbound } from './messaging/context-token-init.js';\nimport {\n findAccountIdsByContextToken,\n findContextTokenEntriesByPeer,\n getContextToken,\n getWeixinOutboundSendUserId,\n tryHydrateAnyAccountContextTokenFromDisk,\n} from './messaging/inbound.js';\nimport { mapWeixinOutboundErrorNotice, sendWeixinErrorNotice } from './messaging/error-notice.js';\nimport { StreamingMarkdownFilter } from './messaging/markdown-filter.js';\nimport { parseDataUrl, writeDataUrlBufferToTemp } from './media/data-url.js';\nimport { markdownToPlainText, sendMessageWeixin } from './messaging/send.js';\nimport { sendWeixinMediaFile } from './messaging/send-media.js';\nimport { getWeixinTypingTicket } from './messaging/typing-ticket-store.js';\nimport { logger } from './util/logger.js';\nimport { resolveWeixinRootDir } from './storage/state-dir.js';\n\nconst MEDIA_OUTBOUND_TEMP_DIR = path.join(resolveWeixinRootDir(), 'media', 'outbound-temp');\n\n/**\n * Weixin ilink text items are plain text (no client-side markdown).\n * Apply StreamingMarkdownFilter, then strip remaining markdown to plain text.\n */\nexport function formatWeixinOutboundText(text: string): string {\n const f = new StreamingMarkdownFilter();\n const filtered = f.feed(text) + f.flush();\n return markdownToPlainText(filtered);\n}\n\nfunction isLocalFilePath(mediaUrl: string): boolean {\n if (mediaUrl.startsWith('data:')) return false;\n return !mediaUrl.includes('://');\n}\n\nfunction isRemoteUrl(mediaUrl: string): boolean {\n return mediaUrl.startsWith('http://') || mediaUrl.startsWith('https://');\n}\n\nfunction resolveLocalPath(mediaUrl: string): string {\n if (mediaUrl.startsWith('file://')) return new URL(mediaUrl).pathname;\n if (!path.isAbsolute(mediaUrl)) return path.resolve(mediaUrl);\n return mediaUrl;\n}\n\nfunction resolveOutboundAccountId(cfg: Config, to: string, explicit?: string | null): string {\n if (explicit?.trim()) return explicit.trim();\n const allIds = listWeixinAccountIds(cfg);\n if (allIds.length === 0) {\n throw new Error('weixin: no accounts — complete QR login for Weixin first');\n }\n if (allIds.length === 1) return allIds[0];\n const matched = findAccountIdsByContextToken(allIds, to);\n if (matched.length === 1) return matched[0];\n if (matched.length > 1) {\n throw new Error(\n `weixin: ambiguous account for to=${to}; set delivery.accountId in cron or tool calls.`,\n );\n }\n throw new Error(\n `weixin: cannot pick account for to=${to}; specify accountId or ensure an active session with this user.`,\n );\n}\n\ntype WeixinOutboundPrepared =\n | { ok: true; accountId: string; account: ResolvedWeixinAccount; ctxTok: string | undefined }\n | { ok: false; error: string };\n\nconst MISSING_WEIXIN_CONTEXT_TOKEN =\n 'weixin: missing context_token for this user — set cron delivery.to to \"{accountId}:dm:{ilinkUserId}\", ensure the user has messaged this bot recently, or restart after a fresh inbound so the token is cached.';\n\nconst AMBIGUOUS_WEIXIN_CONTEXT_TOKEN =\n 'weixin: multiple bot accounts have a context_token for this user; set cron delivery.to to \"{accountId}:dm:{ilinkUserId}\" or metadata.accountId.';\n\nasync function resolveWeixinSendContext(\n ctx: ChannelOutboundContext,\n): Promise<\n | { ok: true; account: ResolvedWeixinAccount; ctxTok: string; ilinkToUserId: string }\n | { ok: false; error: string }\n> {\n const prep = prepareWeixinOutboundSend(ctx);\n if (prep.ok === false) return { ok: false, error: prep.error };\n\n let account = prep.account;\n let ctxTok = prep.ctxTok?.trim() || undefined;\n\n if (!ctxTok) {\n for (const aid of listWeixinAccountIds(ctx.cfg)) {\n let a: ResolvedWeixinAccount;\n try {\n a = resolveWeixinAccount(ctx.cfg, aid);\n } catch {\n continue;\n }\n if (!a.configured || !a.token) continue;\n try {\n assertSessionActive(a.accountId);\n } catch {\n continue;\n }\n const t = getContextToken(a.accountId, ctx.to);\n if (t?.trim()) {\n ctxTok = t;\n account = a;\n break;\n }\n }\n }\n\n if (!ctxTok) {\n const entries = findContextTokenEntriesByPeer(ctx.to);\n const uniqueAccounts = [...new Set(entries.map((e) => e.accountId))];\n if (uniqueAccounts.length > 1) {\n return { ok: false, error: AMBIGUOUS_WEIXIN_CONTEXT_TOKEN };\n }\n if (entries.length >= 1 && uniqueAccounts.length === 1) {\n const { accountId: aid, token } = entries[0]!;\n if (token?.trim()) {\n try {\n const a = resolveWeixinAccount(ctx.cfg, aid);\n assertSessionActive(a.accountId);\n if (a.configured && a.token) {\n account = a;\n ctxTok = token;\n }\n } catch {\n /* keep searching */\n }\n }\n }\n }\n\n if (!ctxTok?.trim()) {\n const diskHit = tryHydrateAnyAccountContextTokenFromDisk(ctx.to);\n if (diskHit?.token?.trim()) {\n try {\n const a = resolveWeixinAccount(ctx.cfg, diskHit.accountId);\n assertSessionActive(a.accountId);\n if (a.configured && a.token) {\n account = a;\n ctxTok = diskHit.token;\n }\n } catch {\n /* */\n }\n }\n }\n\n if (!ctxTok?.trim()) {\n ctxTok =\n (await ensureWeixinContextTokenForOutbound(account.accountId, ctx.to, account))?.trim() ||\n undefined;\n }\n\n if (!ctxTok?.trim()) {\n return { ok: false, error: MISSING_WEIXIN_CONTEXT_TOKEN };\n }\n\n const ilinkToUserId =\n getWeixinOutboundSendUserId(account.accountId, ctx.to)?.trim() ||\n toRawIlinkUserIdForApi(ctx.to);\n\n return { ok: true, account, ctxTok, ilinkToUserId };\n}\n\n/** Resolve account + session without throwing so ChannelManager can ack durable queue items. */\nfunction prepareWeixinOutboundSend(ctx: ChannelOutboundContext): WeixinOutboundPrepared {\n let accountId: string;\n try {\n accountId = resolveOutboundAccountId(ctx.cfg, ctx.to, ctx.accountId);\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n let account: ResolvedWeixinAccount;\n try {\n account = resolveWeixinAccount(ctx.cfg, accountId);\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n try {\n assertSessionActive(account.accountId);\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n if (!account.configured || !account.token) {\n return { ok: false, error: 'weixin not logged in' };\n }\n const ctxTok = getContextToken(account.accountId, ctx.to);\n return { ok: true, accountId: account.accountId, account, ctxTok };\n}\n\nasync function sendWeixinTypingIndicator(\n ctx: ChannelOutboundContext,\n mode: 'on' | 'off',\n): Promise<OutboundDeliveryResult> {\n try {\n const accountId = resolveOutboundAccountId(ctx.cfg, ctx.to, ctx.accountId);\n const account = resolveWeixinAccount(ctx.cfg, accountId);\n assertSessionActive(account.accountId);\n if (!account.configured || !account.token) {\n return { messageId: '', chatId: ctx.to, success: true };\n }\n const ticket = getWeixinTypingTicket(account.accountId, ctx.to);\n if (!ticket) {\n return { messageId: '', chatId: ctx.to, success: true };\n }\n const typingTo =\n getWeixinOutboundSendUserId(account.accountId, ctx.to)?.trim() ||\n toRawIlinkUserIdForApi(ctx.to);\n await sendTyping({\n baseUrl: account.baseUrl,\n token: account.token,\n routeTag: account.routeTag,\n body: {\n ilink_user_id: typingTo,\n typing_ticket: ticket,\n status: mode === 'on' ? TypingStatus.TYPING : TypingStatus.CANCEL,\n },\n });\n return { messageId: '', chatId: ctx.to, success: true };\n } catch (err) {\n logger.debug(\n { err, to: ctx.to },\n `weixin sendTyping ${mode} skipped or failed (best-effort)`,\n );\n return { messageId: '', chatId: ctx.to, success: true };\n }\n}\n\nexport function createWeixinOutboundHandlers() {\n const sendTextImpl = async (ctx: ChannelOutboundContext): Promise<OutboundDeliveryResult> => {\n const resolved = await resolveWeixinSendContext(ctx);\n if (resolved.ok === false) {\n return { messageId: '', chatId: ctx.to, success: false, error: resolved.error };\n }\n const { account, ctxTok, ilinkToUserId } = resolved;\n const raw = ctx.text ?? '';\n const text = formatWeixinOutboundText(raw);\n try {\n const r = await sendMessageWeixin({\n to: ctx.to,\n toUserIdForApi: ilinkToUserId,\n text,\n opts: {\n baseUrl: account.baseUrl,\n token: account.token,\n routeTag: account.routeTag,\n contextToken: ctxTok,\n },\n });\n return { messageId: r.messageId, chatId: ctx.to, success: true };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.error({ err, to: ctx.to }, 'weixin sendText failed');\n void sendWeixinErrorNotice({\n to: ctx.to,\n toUserIdForApi: ilinkToUserId,\n contextToken: ctxTok,\n message: mapWeixinOutboundErrorNotice(msg),\n baseUrl: account.baseUrl,\n token: account.token,\n routeTag: account.routeTag,\n errLog: (m) => logger.warn(m),\n });\n return { messageId: '', chatId: ctx.to, success: false, error: msg };\n }\n };\n\n const sendMediaImpl = async (ctx: ChannelOutboundContext): Promise<OutboundDeliveryResult> => {\n const resolved = await resolveWeixinSendContext(ctx);\n if (resolved.ok === false) {\n return { messageId: '', chatId: ctx.to, success: false, error: resolved.error };\n }\n const { account, ctxTok, ilinkToUserId } = resolved;\n const mediaUrl = ctx.mediaUrl?.trim();\n if (!mediaUrl) {\n return { messageId: '', chatId: ctx.to, success: false, error: 'No media URL' };\n }\n const caption = formatWeixinOutboundText(ctx.text ?? '');\n try {\n let filePath: string;\n\n if (mediaUrl.startsWith('data:')) {\n const parsed = parseDataUrl(mediaUrl);\n if (!parsed) {\n return { messageId: '', chatId: ctx.to, success: false, error: 'Invalid data URL' };\n }\n filePath = await writeDataUrlBufferToTemp({\n buffer: parsed.buffer,\n mimeType: parsed.mimeType,\n destDir: MEDIA_OUTBOUND_TEMP_DIR,\n });\n } else if (isLocalFilePath(mediaUrl) || mediaUrl.startsWith('file://')) {\n filePath = resolveLocalPath(mediaUrl);\n } else if (isRemoteUrl(mediaUrl)) {\n filePath = await downloadRemoteImageToTemp(mediaUrl, MEDIA_OUTBOUND_TEMP_DIR);\n } else {\n await sendMessageWeixin({\n to: ctx.to,\n toUserIdForApi: ilinkToUserId,\n text: caption,\n opts: {\n baseUrl: account.baseUrl,\n token: account.token,\n routeTag: account.routeTag,\n contextToken: ctxTok,\n },\n });\n return { messageId: '', chatId: ctx.to, success: true };\n }\n\n const uploadOpts = {\n baseUrl: account.baseUrl,\n token: account.token,\n routeTag: account.routeTag,\n contextToken: ctxTok,\n };\n\n /** Audio (e.g. TTS mp3) is not VoiceItem — same as other non-image/video files (FILE attachment). */\n const r = await sendWeixinMediaFile({\n filePath,\n to: ctx.to,\n toUserIdForApi: ilinkToUserId,\n text: caption,\n opts: uploadOpts,\n cdnBaseUrl: account.cdnBaseUrl,\n });\n return { messageId: r.messageId, chatId: ctx.to, success: true };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.error({ err, to: ctx.to }, 'weixin sendMedia failed');\n void sendWeixinErrorNotice({\n to: ctx.to,\n toUserIdForApi: ilinkToUserId,\n contextToken: ctxTok,\n message: mapWeixinOutboundErrorNotice(msg),\n baseUrl: account.baseUrl,\n token: account.token,\n routeTag: account.routeTag,\n errLog: (m) => logger.warn(m),\n });\n return { messageId: '', chatId: ctx.to, success: false, error: msg };\n }\n };\n\n const sendPayloadImpl = async (\n ctx: ChannelOutboundPayloadContext,\n ): Promise<OutboundDeliveryResult> => {\n const payload = ctx.payload as OutboundMessage;\n if (payload.type === 'typing_on') {\n return sendWeixinTypingIndicator(ctx, 'on');\n }\n if (payload.type === 'typing_off') {\n return sendWeixinTypingIndicator(ctx, 'off');\n }\n const hasMediaUrl = Boolean(ctx.mediaUrl?.trim());\n if (hasMediaUrl) {\n return sendMediaImpl(ctx);\n }\n return sendTextImpl(ctx);\n };\n\n return {\n sendPayload: sendPayloadImpl,\n sendText: sendTextImpl,\n sendMedia: sendMediaImpl,\n };\n}\n\nexport function weixinTextChunker(text: string, limit: number): string[] {\n const chunks: string[] = [];\n let i = 0;\n while (i < text.length) {\n chunks.push(text.slice(i, i + limit));\n i += limit;\n }\n return chunks.length ? chunks : [''];\n}\n"],"mappings":"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"}
|