@xopcai/xopc 0.0.149 → 0.0.151
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-B4s0ipx2.js → activity-store-uu1xu9Pl.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BSccACje.js → agent-avatar-dicebear-BuO-OVfD.js} +1 -1
- package/dist/gateway/static/root/assets/agents-Bpv3h31T.js +2 -0
- package/dist/gateway/static/root/assets/{api-BMdUsNCV.js → api-CwL38LEV.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-DrLGhYkI.js → app-management-settings-panel-B6OU3Eol.js} +1 -1
- package/dist/gateway/static/root/assets/appearance-settings-BaP4GFvN.js +1 -0
- package/dist/gateway/static/root/assets/apps-page-DZKNIMRg.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-BQ17IK9x.js → archive-plugin-CJX3zIh_.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-HXvgWHXu.js → attachment-load-CI1ejk_l.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-suggestion-card-CjIWpsch.js → automation-suggestion-card-CjmhICbv.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-BtZl3B8m.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-DifWJzNZ.js → binary-plugins-CZ8nOXqK.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-DtRzIkPU.js → block-editor-BoSfyS_j.js} +46 -46
- package/dist/gateway/static/root/assets/browser-settings-page-CL1UiPcb.js +8 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-DazKjWW1.js → capability-presets-api-XzDKxPZ8.js} +1 -1
- package/dist/gateway/static/root/assets/{capability-presets-settings-panel-Cvrw4fD1.js → capability-presets-settings-panel-Dc_uHYgl.js} +2 -2
- package/dist/gateway/static/root/assets/{channel-recipient-api-Bea6if_6.js → channel-recipient-api-DYLBAhFF.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-mALvXpJj.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-CZuEsO5b.js +1 -0
- package/dist/gateway/static/root/assets/{connector-logo-BjbYbJjQ.js → connector-logo-BSjlInHT.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-Cm_E3mmI.js +2 -0
- package/dist/gateway/static/root/assets/desktop-pet-DcJc91-C.js +1 -0
- package/dist/gateway/static/root/assets/desktop-pet-settings-CdeqTa3Q.js +1 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-C8zZNUzC.js → directory-picker-path-field-Cp3fpm0k.js} +1 -1
- package/dist/gateway/static/root/assets/{dreaming-settings-gJSw7Adk.js → dreaming-settings-Bwj1O3zr.js} +3 -3
- package/dist/gateway/static/root/assets/{extension-debug-page-DFE5ADJ0.js → extension-debug-page-D_1xpKbZ.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CfR-aW8G.js → extension-page-CqZNCj96.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-CFIEbs2L.js → extension-settings-page-5MWbtQaQ.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-B6M_ra8U.js → gateway-config-api-Co_IaS34.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-kmeWm2Pt.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-DNA3OOzV.js → gateway-startup-retry-BM_xvzl0.js} +1 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-FoO-R4_U.js +1 -0
- package/dist/gateway/static/root/assets/goal-detail-page-CkJq7N5g.js +4 -0
- package/dist/gateway/static/root/assets/{goals-config-api-D88opgcs.js → goals-config-api-DrtsYjXz.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-DRAN-R64.js +2 -0
- package/dist/gateway/static/root/assets/{goals-settings-D07UL8Jo.js → goals-settings-wq9TKhIZ.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-YCSNOcXC.js → heartbeat-settings-B5zDoHbo.js} +1 -1
- package/dist/gateway/static/root/assets/index-DIlxvrlG.css +1 -0
- package/dist/gateway/static/root/assets/index-apLU0Hun.js +196 -0
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-3tC9iD21.js +1 -0
- package/dist/gateway/static/root/assets/local-app-workbench-page-CT-vDTLK.js +2 -0
- package/dist/gateway/static/root/assets/{local-apps-page-CKvtLzsF.js → local-apps-page-B9ruF9GV.js} +1 -1
- package/dist/gateway/static/root/assets/locale-store-GfSwnwIZ.js +1 -0
- package/dist/gateway/static/root/assets/logs-page-Ca1X8X2P.js +7 -0
- package/dist/gateway/static/root/assets/{markdown-split-BVSFG99p.js → markdown-split-CzuhSQAB.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-DdOjIVk3.js → media-plugins-a3R4y-EL.js} +1 -1
- package/dist/gateway/static/root/assets/messages-B0B40tpO.js +5 -0
- package/dist/gateway/static/root/assets/models-hub-panel-CbTlz9Of.js +2 -0
- package/dist/gateway/static/root/assets/{notes-page-ZbLR3awn.js → notes-page-BCxDy2dV.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-z6sBX9B2.js +4 -0
- package/dist/gateway/static/root/assets/{page-tabs-DMlQERNg.js → page-tabs-CJfk6M78.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-CbiJRPxK.js → preview-open-alternatives-MFopTSgF.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-DU29deIr.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-Ck3DLTlZ.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-gLsLyAyi.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-BZTj3hxl.js → save-bar-controls-D0uhU3Z8.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-CxYDObjT.js → schedule-field-NGOH-7wV.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-CBbXgpKQ.js → schema-form-BJz5LoqG.js} +1 -1
- package/dist/gateway/static/root/assets/schemas-DgQq6Z5S.js +64 -0
- package/dist/gateway/static/root/assets/sessions-page-TmNoWpa_.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-CtPhh2m9.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-BySKZ8rp.js → settings-collapsible-section-oDnUHnX_.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-CjINay6t.js → settings-form-section-DND90dDt.js} +1 -1
- package/dist/gateway/static/root/assets/settings-loading-skeleton-CEJtaoQp.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-BNrVwuL7.js → settings-page-B1LJlRi9.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-HdlQOOqp.js → settings-page-layout-CsrLuDsW.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-BPCJPHHY.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-DC-eQONB.js → share-preview-page-C1PwLh-p.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-DCuqr7js.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-kn1Vypcy.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-k6VIqTkK.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-CVa90q2f.js → system-settings-panel-BEsrEkSx.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-D1cOpgsy.js → theme-store-Bi6hMBDb.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-DIKF9vpz.js → typed-models-lib-dOypdlMf.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-DnvpI0Ys.js → use-channel-catalog-f8A-PVuq.js} +1 -1
- package/dist/gateway/static/root/assets/user-context-page-B9Y_Ciav.js +1 -0
- package/dist/gateway/static/root/assets/{user-profile-fields-editor-y8gTmkPX.js → user-profile-fields-editor-DGC38Lx7.js} +1 -1
- package/dist/gateway/static/root/assets/{user-profile-settings-panel-C3pvqe28.js → user-profile-settings-panel-DFkZ-tan.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-BK2vwu_3.js → utils-CEIYZihF.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DK6gaQsA.js +1 -0
- package/dist/gateway/static/root/assets/work-discovery-page-DSJb9Kq7.js +1 -0
- package/dist/gateway/static/root/assets/work-item-detail-page-DVavwV3D.js +1 -0
- package/dist/gateway/static/root/assets/work-page-foJDp0nz.js +1 -0
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-BYqZpFCC.js +3 -0
- package/dist/gateway/static/root/assets/workflows-page-DgO0WAzs.js +11 -0
- package/dist/gateway/static/root/favicon.svg +1 -187
- package/dist/gateway/static/root/index.html +8 -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.d.ts +1 -0
- package/dist/src/agent/agent-manager.js +1 -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 +1 -2
- package/dist/src/agent/service.types.d.ts +2 -0
- 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.d.ts +1 -1
- package/dist/src/agent/tool-manuals/xopc-use.js +41 -4
- package/dist/src/agent/tools/apply-patch.js +0 -2
- package/dist/src/agent/tools/automation-tool.js +45 -8
- 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.d.ts +2 -0
- package/dist/src/agent/tools/factory.js +3 -4
- 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.d.ts +7 -1
- package/dist/src/agent/tools/goal-tool.js +34 -7
- 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 +32 -4
- package/dist/src/agent/tools/write.js +23 -5
- package/dist/src/agent/tools/xopc-use-tool.d.ts +6 -2
- package/dist/src/agent/tools/xopc-use-tool.js +216 -8
- 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 +0 -2
- 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 +0 -2
- 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 +0 -2
- 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 +0 -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 +1 -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/discover.js +0 -2
- package/dist/src/storage/sqlite/migrations/errors.js +0 -2
- package/dist/src/storage/sqlite/migrations/runner.js +0 -2
- 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 +0 -2
- 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 +0 -2
- package/dist/src/work-discovery/probe.js +0 -2
- package/dist/src/work-discovery/repository.js +0 -2
- package/dist/src/work-discovery/service.js +0 -2
- 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 +1 -3
- 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 +43 -12
- 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-DZDOcgz5.js +0 -2
- package/dist/gateway/static/root/assets/appearance-settings-BNasnY9D.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-Cmr-Hvm9.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-TWgUAI8t.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-DBsFItW_.js +0 -8
- package/dist/gateway/static/root/assets/channels-settings-BBkzrBYy.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-CuU6ez3y.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-DLsZCAw7.js +0 -2
- package/dist/gateway/static/root/assets/desktop-pet-C6V-PHwi.js +0 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-5Fcz47XQ.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-BrxzyVW2.js +0 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-DRVRLc5Z.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-8F7NElzP.js +0 -4
- package/dist/gateway/static/root/assets/goals-page-BaoLiV8G.js +0 -2
- package/dist/gateway/static/root/assets/index-CH7XN6KY.js +0 -259
- package/dist/gateway/static/root/assets/index-Dfnl9tp_.css +0 -1
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-BHnh5OoY.js +0 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-Boe8n4zH.js +0 -2
- package/dist/gateway/static/root/assets/locale-store-BneNAR8R.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-Cb4Uptct.js +0 -7
- package/dist/gateway/static/root/assets/messages-t1yPaVCt.js +0 -5
- package/dist/gateway/static/root/assets/models-hub-panel-CNiUKZUV.js +0 -2
- package/dist/gateway/static/root/assets/notes-workbench-C9__VkD6.js +0 -4
- package/dist/gateway/static/root/assets/project-detail-page-CZhuB5kO.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-BOq4WVdR.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BxGq0ebQ.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-B6gSU_Au.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DwuBL834.js +0 -1
- package/dist/gateway/static/root/assets/settings-loading-skeleton-vitElc-n.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-BJeA4mmk.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-DB2KYA2_.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DQtZiejw.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-Pm0fNe_p.js +0 -2
- package/dist/gateway/static/root/assets/user-context-page-DnLqQyRG.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-BiFIIWC4.js +0 -1
- package/dist/gateway/static/root/assets/work-discovery-page-D2-_bC0J.js +0 -1
- package/dist/gateway/static/root/assets/work-item-detail-page-B0FPG4eJ.js +0 -1
- package/dist/gateway/static/root/assets/work-page-BDeVxts_.js +0 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-BPzS67fU.js +0 -3
- package/dist/gateway/static/root/assets/workflows-page-xPhmrRLs.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":"audio.js","names":[],"sources":["../../../../src/voice/tts/audio.ts"],"sourcesContent":["/**\n * Audio Compression Utilities\n */\n\nimport { spawn } from 'child_process';\nimport { writeFile, unlink } from 'fs/promises';\nimport { tmpdir } from 'os';\nimport { join } from 'path';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('AudioUtils');\n\n/**\n * Execute a command using spawn (avoids shell injection)\n */\nfunction spawnAsync(command: string, args: string[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const process = spawn(command, args, { stdio: 'ignore' });\n process.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`${command} exited with code ${code}`));\n });\n process.on('error', reject);\n });\n}\n\nexport interface CompressionResult {\n buffer: Buffer;\n format: string;\n}\n\n/** When TTS returns WAV, ffmpeg can target Opus (Telegram, etc.) or MP3 (Weixin VoiceItem, webchat). */\nexport type WavCompressionTarget = 'opus' | 'mp3';\n\n/**\n * Compress WAV using ffmpeg. Non-WAV inputs are returned unchanged.\n * Default `wavTarget` is Opus (common for Telegram voice).\n */\nexport async function compressAudio(\n audioBuffer: Buffer,\n inputFormat: string,\n wavTarget: WavCompressionTarget = 'opus',\n): Promise<CompressionResult> {\n if (inputFormat !== 'wav') {\n return { buffer: audioBuffer, format: inputFormat };\n }\n\n const tempDir = tmpdir();\n const inputPath = join(tempDir, `input_${Date.now()}.wav`);\n const outExt = wavTarget === 'mp3' ? 'mp3' : 'opus';\n const outputPath = join(tempDir, `output_${Date.now()}.${outExt}`);\n\n try {\n await writeFile(inputPath, audioBuffer);\n\n if (wavTarget === 'mp3') {\n await spawnAsync('ffmpeg', [\n '-i', inputPath,\n '-c:a', 'libmp3lame',\n '-b:a', '64k',\n outputPath,\n '-y',\n ]);\n } else {\n await spawnAsync('ffmpeg', [\n '-i', inputPath,\n '-c:a', 'libopus',\n '-b:a', '24k',\n '-vbr', 'on',\n outputPath,\n '-y',\n ]);\n }\n\n const { readFile } = await import('fs/promises');\n const compressedBuffer = await readFile(outputPath);\n\n log.info(\n {\n originalSize: audioBuffer.length,\n compressedSize: compressedBuffer.length,\n ratio: ((compressedBuffer.length / audioBuffer.length) * 100).toFixed(1) + '%',\n wavTarget,\n },\n 'Audio compressed successfully',\n );\n\n return { buffer: compressedBuffer, format: wavTarget === 'mp3' ? 'mp3' : 'opus' };\n } catch (error) {\n const hint =\n error instanceof Error && (error as NodeJS.ErrnoException).code === 'ENOENT'\n ? ' (install ffmpeg and ensure it is on PATH for wav compression)'\n : '';\n log.warn({ error, inputFormat, wavTarget }, `Audio compression failed, using original${hint}`);\n return { buffer: audioBuffer, format: inputFormat };\n } finally {\n try {\n await unlink(inputPath).catch(() => {});\n await unlink(outputPath).catch(() => {});\n } catch {}\n }\n}\n"],"mappings":";;;;;;;;;;aAQqD;AAErD,MAAM,MAAM,aAAa,aAAa;;;;AAKtC,SAAS,WAAW,SAAiB,MAA+B;AAClE,QAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,UAAU,MAAM,SAAS,MAAM,EAAE,OAAO,UAAU,CAAC;AACzD,UAAQ,GAAG,UAAU,SAAS;AAC5B,OAAI,SAAS,EAAG,UAAS;OACpB,wBAAO,IAAI,MAAM,GAAG,QAAQ,oBAAoB,OAAO,CAAC;IAC7D;AACF,UAAQ,GAAG,SAAS,OAAO;GAC3B;;;;;;AAeJ,eAAsB,cACpB,aACA,aACA,YAAkC,QACN;AAC5B,KAAI,gBAAgB,MAClB,QAAO;EAAE,QAAQ;EAAa,QAAQ;EAAa;CAGrD,MAAM,UAAU,QAAQ;CACxB,MAAM,YAAY,KAAK,SAAS,SAAS,KAAK,KAAK,CAAC,MAAM;CAC1D,MAAM,SAAS,cAAc,QAAQ,QAAQ;CAC7C,MAAM,aAAa,KAAK,SAAS,UAAU,KAAK,KAAK,CAAC,GAAG,SAAS;AAElE,KAAI;AACF,QAAM,UAAU,WAAW,YAAY;AAEvC,MAAI,cAAc,MAChB,OAAM,WAAW,UAAU;GACzB;GAAM;GACN;GAAQ;GACR;GAAQ;GACR;GACA;GACD,CAAC;MAEF,OAAM,WAAW,UAAU;GACzB;GAAM;GACN;GAAQ;GACR;GAAQ;GACR;GAAQ;GACR;GACA;GACD,CAAC;EAGJ,MAAM,EAAE,aAAa,MAAM,OAAO;EAClC,MAAM,mBAAmB,MAAM,SAAS,WAAW;AAEnD,MAAI,KACF;GACE,cAAc,YAAY;GAC1B,gBAAgB,iBAAiB;GACjC,QAAS,iBAAiB,SAAS,YAAY,SAAU,KAAK,QAAQ,EAAE,GAAG;GAC3E;GACD,EACD,gCACD;AAED,SAAO;GAAE,QAAQ;GAAkB,QAAQ,cAAc,QAAQ,QAAQ;GAAQ;UAC1E,OAAO;EACd,MAAM,OACJ,iBAAiB,SAAU,MAAgC,SAAS,WAChE,mEACA;AACN,MAAI,KAAK;GAAE;GAAO;GAAa;GAAW,EAAE,2CAA2C,OAAO;AAC9F,SAAO;GAAE,QAAQ;GAAa,QAAQ;GAAa;WAC3C;AACR,MAAI;AACF,SAAM,OAAO,UAAU,CAAC,YAAY,GAAG;AACvC,SAAM,OAAO,WAAW,CAAC,YAAY,GAAG;UAClC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-slice.js","names":[],"sources":["../../../../src/voice/tts/config-slice.ts"],"sourcesContent":["/**\n * TTS config slice resolution — maps persisted config to per-provider raw config.\n *\n * Reads `messages.tts.providers.<id>` only — there is no legacy flat-key form.\n */\n\nimport type { TTSConfig } from './types.js';\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\n/** Collect provider-id → raw config entries from the `providers` map. */\nexport function collectTtsProviderConfigEntries(\n config: Partial<TTSConfig> | Record<string, unknown> | undefined,\n): Record<string, Record<string, unknown>> {\n const raw = (config ?? {}) as Record<string, unknown>;\n const providers = asRecord(raw.providers);\n if (!providers) return {};\n const entries: Record<string, Record<string, unknown>> = {};\n for (const [providerId, value] of Object.entries(providers)) {\n entries[providerId] = { ...(asRecord(value) ?? {}) };\n }\n return entries;\n}\n\n/** Resolve the raw config slice for one provider id. */\nexport function resolveTtsProviderConfigSlice(\n providerId: string,\n config: Partial<TTSConfig> | Record<string, unknown> | undefined,\n): Record<string, unknown> {\n return collectTtsProviderConfigEntries(config)[providerId] ?? {};\n}\n\n/**\n * Build the `rawConfig` object passed into `SpeechProviderPlugin.resolveConfig`.\n * Includes the full TTS block plus a normalized `providers` map.\n */\nexport function buildTtsResolveRawConfig(\n providerId: string,\n config: Partial<TTSConfig> | Record<string, unknown>,\n): Record<string, unknown> {\n const entries = collectTtsProviderConfigEntries(config);\n return {\n ...(config as Record<string, unknown>),\n providers: entries,\n [providerId]: entries[providerId] ?? {},\n };\n}\n"],"mappings":";AAQA,SAAS,SAAS,OAAqD;AACrE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM,GACtE,QACD,KAAA;;;AAIN,SAAgB,gCACd,QACyC;CAEzC,MAAM,YAAY,UADL,UAAU,EAAE,EACM,UAAU;AACzC,KAAI,CAAC,UAAW,QAAO,EAAE;CACzB,MAAM,UAAmD,EAAE;AAC3D,MAAK,MAAM,CAAC,YAAY,UAAU,OAAO,QAAQ,UAAU,CACzD,SAAQ,cAAc,EAAE,GAAI,SAAS,MAAM,IAAI,EAAE,EAAG;AAEtD,QAAO;;;AAIT,SAAgB,8BACd,YACA,QACyB;AACzB,QAAO,gCAAgC,OAAO,CAAC,eAAe,EAAE;;;;;;AAOlE,SAAgB,yBACd,YACA,QACyB;CACzB,MAAM,UAAU,gCAAgC,OAAO;AACvD,QAAO;EACL,GAAI;EACJ,WAAW;GACV,aAAa,QAAQ,eAAe,EAAE;EACxC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"directives.js","names":[],"sources":["../../../../src/voice/tts/directives.ts"],"sourcesContent":["/**\n * TTS directive parser.\n *\n * Parses `[[tts:key=value]]` and `[[tts:text]]...[[/tts:text]]` blocks.\n *\n * Per-provider key handling (voice/model/speed) is delegated to each\n * `SpeechProviderPlugin.parseDirectiveToken`. The parser:\n * 1. Pulls out the `text` block and the global `provider` token here (these\n * are cross-provider concerns).\n * 2. For every other token, asks each registered provider via\n * `parseDirectiveToken({ key, value, policy })`. The first provider whose\n * result has `handled === true` wins; its returned overrides are merged\n * into `overrides[provider.id]`.\n * 3. Tokens that no provider handles produce a warning (helps catch typos).\n *\n * Adding a new provider with a new directive key (e.g. `[[tts:emotion=happy]]`)\n * requires no change to this file — the provider's own `parseDirectiveToken`\n * declares which keys it owns.\n */\n\nimport { createLogger } from '../../utils/logger.js';\n\nimport './providers/index.js'; // side-effect: register built-in providers\nimport { listSpeechProviders } from './speech-registry.js';\nimport type { TTSModelOverrideConfig, TTSProvider, TtsDirectiveOverrides, TtsDirectiveParseResult } from './types.js';\n\nconst log = createLogger('TTS:Directives');\n\nconst VALID_PROVIDERS: TTSProvider[] = ['openai', 'alibaba', 'edge', 'minimax'];\n\nfunction isValidProvider(value: string): value is TTSProvider {\n return VALID_PROVIDERS.includes(value as TTSProvider);\n}\n\nfunction parseNumber(value: string): number | undefined {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\n/**\n * Apply a provider-handled override into the bucket for `providerId`. Mutates\n * `overrides` in place. Maps the SpeechProviderOverrides keys (model/voice/speed)\n * onto the per-provider bucket in TtsDirectiveOverrides.\n */\nfunction recordProviderOverride(\n overrides: TtsDirectiveOverrides,\n providerId: string,\n patch: { model?: string; voice?: string; speed?: number },\n): void {\n if (!isValidProvider(providerId)) {\n return;\n }\n const bucket = (overrides[providerId] as Record<string, unknown> | undefined) ?? {};\n if (patch.voice !== undefined) {\n bucket.voice = patch.voice;\n }\n if (patch.model !== undefined) {\n bucket.model = patch.model;\n }\n if (patch.speed !== undefined) {\n bucket.speed = patch.speed;\n }\n (overrides as Record<string, unknown>)[providerId] = bucket;\n}\n\nexport function parseTtsDirectives(\n text: string,\n policy: TTSModelOverrideConfig = { enabled: true },\n): TtsDirectiveParseResult {\n if (!policy.enabled) {\n return {\n cleanedText: text,\n hasDirective: false,\n overrides: {},\n warnings: [],\n };\n }\n\n const overrides: TtsDirectiveOverrides = {};\n const warnings: string[] = [];\n let cleanedText = text;\n let hasDirective = false;\n\n // 1. Pull out [[tts:text]]...[[/tts:text]] blocks (cross-provider concern).\n const textBlockRegex = /\\[\\[tts:text\\]\\]([\\s\\S]*?)\\[\\[\\/tts:text\\]\\]/gi;\n cleanedText = cleanedText.replace(textBlockRegex, (_match, inner: string) => {\n hasDirective = true;\n if (policy.allowText && overrides.ttsText === undefined) {\n overrides.ttsText = inner.trim();\n }\n return '';\n });\n\n const providers = listSpeechProviders();\n\n // 2. Parse [[tts:key=value ...]] tokens.\n const directiveRegex = /\\[\\[tts:([^\\]]+)\\]\\]/gi;\n cleanedText = cleanedText.replace(directiveRegex, (_match, body: string) => {\n hasDirective = true;\n const tokens = body.split(/\\s+/).filter(Boolean);\n\n for (const token of tokens) {\n const eqIndex = token.indexOf('=');\n if (eqIndex === -1) {\n continue;\n }\n const key = token.slice(0, eqIndex).toLowerCase().trim();\n const value = token.slice(eqIndex + 1).trim();\n if (!key || !value) {\n continue;\n }\n\n // Cross-provider: provider switch.\n if (key === 'provider') {\n if (!policy.allowProvider) {\n continue;\n }\n if (isValidProvider(value)) {\n overrides.provider = value;\n } else {\n warnings.push(`Invalid provider \"${value}\"`);\n }\n continue;\n }\n\n // Cross-provider: speed (validated globally with shared 0.25-4.0 range).\n // Per-provider plugins may also accept their own `speed` token.\n if (key === 'speed') {\n if (!policy.allowVoiceSettings) {\n continue;\n }\n const speed = parseNumber(value);\n if (speed !== undefined && speed >= 0.25 && speed <= 4.0) {\n (overrides as Record<string, unknown>).speed = speed;\n } else {\n warnings.push(`Invalid speed \"${value}\" (must be 0.25-4.0)`);\n }\n continue;\n }\n\n // Per-provider: ask each registered plugin. First handled wins.\n let handled = false;\n for (const plugin of providers) {\n if (typeof plugin.parseDirectiveToken !== 'function') {\n continue;\n }\n const result = plugin.parseDirectiveToken({\n key,\n value,\n policy: {\n enabled: policy.enabled ?? true,\n allowText: policy.allowText ?? false,\n allowProvider: policy.allowProvider ?? false,\n allowVoice: policy.allowVoice ?? false,\n allowModelId: policy.allowModelId ?? false,\n allowVoiceSettings: policy.allowVoiceSettings ?? false,\n allowNormalization: policy.allowNormalization ?? false,\n allowSeed: policy.allowSeed ?? false,\n },\n });\n if (result.handled) {\n handled = true;\n if (result.warnings) {\n warnings.push(...result.warnings);\n }\n if (result.overrides) {\n recordProviderOverride(overrides, plugin.id, result.overrides);\n }\n break;\n }\n }\n if (!handled) {\n warnings.push(`Unknown TTS directive key \"${key}\"`);\n }\n }\n\n return '';\n });\n\n cleanedText = cleanedText\n .replace(/[ \\t]+/g, ' ')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n\n if (warnings.length > 0) {\n log.debug({ warnings }, 'TTS directive warnings');\n }\n\n return {\n cleanedText,\n ttsText: overrides.ttsText,\n hasDirective,\n overrides,\n warnings,\n };\n}\n\nexport function hasTtsDirectives(text: string): boolean {\n return /\\[\\[tts:/i.test(text);\n}\n\nexport function stripTtsDirectives(text: string): string {\n return text\n .replace(/\\[\\[tts:text\\]\\][\\s\\S]*?\\[\\[\\/tts:text\\]\\]/gi, '')\n .replace(/\\[\\[tts:[^\\]]+\\]\\]/gi, '')\n .replace(/[ \\t]+/g, ' ')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\nexport function buildTtsSystemPromptHint(config: {\n enabled: boolean;\n trigger: string;\n maxTextLength?: number;\n modelOverrides?: TTSModelOverrideConfig;\n /** Current channel id (e.g. telegram) for output format hint */\n channel?: string;\n /** Preferred audio format for this channel when known */\n channelAudioFormat?: string;\n /** Whether voice-note style delivery is supported */\n channelVoiceBubble?: boolean;\n /** `text_to_speech` tool is registered */\n textToSpeechTool?: boolean;\n}): string | undefined {\n if (!config.enabled) {\n return undefined;\n }\n\n const hints: string[] = ['Voice (TTS) is enabled.'];\n\n switch (config.trigger) {\n case 'inbound':\n hints.push(\"Only use TTS when the user's last message includes audio/voice.\");\n break;\n case 'tagged':\n hints.push('Only use TTS when you include [[tts]] or [[tts:text]] tags.');\n break;\n case 'always':\n hints.push('You can use TTS for any message by including [[tts]] tag.');\n break;\n case 'off':\n return undefined;\n }\n\n const maxLength = config.maxTextLength || 4096;\n hints.push(`Keep spoken text ≤${maxLength} chars.`);\n\n if (config.channel && (config.channelAudioFormat || config.channelVoiceBubble !== undefined)) {\n const fmt = config.channelAudioFormat ?? 'mp3';\n const bubble =\n config.channelVoiceBubble === true\n ? 'voice-note compatible'\n : config.channelVoiceBubble === false\n ? 'attachment / inline audio only'\n : 'channel default';\n hints.push(`Channel ${config.channel}: prefer ${fmt}; ${bubble}.`);\n }\n\n if (config.textToSpeechTool) {\n hints.push(\n 'You may call `text_to_speech` to generate speech when the user asks you to read aloud or voice fits better than text. Do not use it on every reply.',\n );\n }\n\n if (config.modelOverrides?.enabled) {\n const allowed: string[] = [];\n if (config.modelOverrides.allowText) allowed.push('[[tts:text]]...[[/tts:text]]');\n if (config.modelOverrides.allowVoice) allowed.push('[[tts:voice=...]]');\n if (config.modelOverrides.allowModelId) allowed.push('[[tts:model=...]]');\n if (config.modelOverrides.allowProvider) allowed.push('[[tts:provider=...]]');\n\n if (allowed.length > 0) {\n hints.push(`Use ${allowed.join(', ')} to control voice output.`);\n }\n }\n\n return hints.join('\\n');\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","names":[],"sources":["../../../../src/voice/tts/factory.ts"],"sourcesContent":["/**\n * TTS factory — registry-driven provider chain construction.\n *\n * Looks up SpeechProviderPlugin instances from the central registry\n * (src/voice/tts/speech-registry.ts), builds per-provider config via\n * plugin.resolveConfig, and filters out providers that report\n * isConfigured() === false.\n *\n * Side-effect import of `./providers/index.js` ensures all built-in providers\n * self-register before the first lookup.\n */\n\nimport { createLogger } from '../../utils/logger.js';\n\nimport './providers/index.js'; // side-effect: register built-in providers\nimport { buildTtsResolveRawConfig } from './config-slice.js';\nimport { getSpeechProvider, listSpeechProviders } from './speech-registry.js';\nimport type { SpeechProviderConfig, SpeechProviderPlugin } from './speech-provider-types.js';\nimport type { TTSConfig, TTSProvider } from './types.js';\n\nconst log = createLogger('TTS:Factory');\n\n/** A configured plugin ready to synthesize, with its resolved config snapshot. */\nexport interface ResolvedSpeechProvider {\n plugin: SpeechProviderPlugin;\n /** Provider id from the chain config (may differ from plugin.id when alias). */\n providerId: TTSProvider;\n /** Per-provider normalized config (output of plugin.resolveConfig). */\n providerConfig: SpeechProviderConfig;\n /** Plugin-shared timeout/maxLength carried from TTSConfig. */\n timeoutMs: number;\n}\n\n/** Resolve a single provider id → plugin + per-call config, or null if unavailable. */\nexport function resolveSpeechProvider(\n providerId: TTSProvider,\n config: TTSConfig,\n): ResolvedSpeechProvider | null {\n const plugin = getSpeechProvider(providerId);\n if (!plugin) {\n log.warn({ providerId }, `Unknown TTS provider \"${providerId}\" (not registered)`);\n return null;\n }\n const rawConfig = buildTtsResolveRawConfig(providerId, config);\n const timeoutMs = config.timeoutMs ?? 30_000;\n // SpeechProviderResolveConfigContext requires `cfg: Config` but this entry\n // point only holds a TTSConfig slice. Cast through unknown — built-in\n // providers' resolveConfig implementations only read `rawConfig`.\n const providerConfig = plugin.resolveConfig({\n cfg: undefined as unknown as Parameters<typeof plugin.resolveConfig>[0]['cfg'],\n rawConfig,\n timeoutMs,\n });\n if (!plugin.isConfigured({ providerConfig, timeoutMs })) {\n log.debug({ providerId }, `Provider \"${providerId}\" reports not configured; skipping`);\n return null;\n }\n return {\n plugin,\n providerId,\n providerConfig,\n timeoutMs,\n };\n}\n\n/** Order providers: explicit fallback when enabled, otherwise auto-select by registry order. */\nexport function resolveProviderOrder(\n primary: TTSProvider,\n fallback: TTSConfig['fallback'] | undefined,\n config: TTSConfig,\n): TTSProvider[] {\n if (fallback?.enabled && fallback.order.length > 0) {\n const order: TTSProvider[] = [primary];\n for (const provider of fallback.order) {\n if (provider !== primary && !order.includes(provider)) {\n order.push(provider);\n }\n }\n return order;\n }\n\n const configured = listSpeechProviders()\n .map((plugin) => {\n const resolved = resolveSpeechProvider(plugin.id, config);\n return resolved ? plugin : null;\n })\n .filter((plugin): plugin is SpeechProviderPlugin => plugin !== null)\n .sort((left, right) => {\n const leftOrder = left.autoSelectOrder ?? Number.MAX_SAFE_INTEGER;\n const rightOrder = right.autoSelectOrder ?? Number.MAX_SAFE_INTEGER;\n if (leftOrder !== rightOrder) {\n return leftOrder - rightOrder;\n }\n return left.id.localeCompare(right.id);\n })\n .map((plugin) => plugin.id);\n\n const order: TTSProvider[] = [primary];\n for (const providerId of configured) {\n if (providerId !== primary && !order.includes(providerId)) {\n order.push(providerId);\n }\n }\n return order;\n}\n\n/** Resolve the full provider chain in priority order; only configured plugins included. */\nexport function resolveSpeechProviderChain(config: TTSConfig): ResolvedSpeechProvider[] {\n if (!config.enabled) {\n throw new Error('TTS is not enabled');\n }\n const order = resolveProviderOrder(config.provider, config.fallback, config);\n const chain: ResolvedSpeechProvider[] = [];\n for (const providerId of order) {\n const resolved = resolveSpeechProvider(providerId, config);\n if (resolved) {\n chain.push(resolved);\n }\n }\n if (chain.length === 0) {\n throw new Error('No TTS providers are available');\n }\n log.debug(\n { primary: config.provider, chain: chain.map((c) => c.providerId) },\n 'TTS provider chain resolved',\n );\n return chain;\n}\n\n// ---- Public API ---------------------------------------------------------\n\nexport function isTTSAvailable(config?: TTSConfig): boolean {\n if (!config?.enabled) {\n return false;\n }\n try {\n return resolveSpeechProviderChain(config).length > 0;\n } catch {\n return false;\n }\n}\n\nexport function isProviderConfigured(provider: TTSProvider, config: TTSConfig): boolean {\n return resolveSpeechProvider(provider, config) !== null;\n}\n\nexport function getAvailableProviders(config: TTSConfig): TTSProvider[] {\n return listSpeechProviders()\n .map((plugin) => plugin.id)\n .filter((provider) => isProviderConfigured(provider, config));\n}\n\n/** List all registered SpeechProviderPlugin ids — primarily for the gateway console. */\nexport function listRegisteredSpeechProviderIds(): string[] {\n return listSpeechProviders().map((plugin) => plugin.id);\n}\n"],"mappings":";;;;;;aAYqD;AAQrD,MAAM,MAAM,aAAa,cAAc;;AAcvC,SAAgB,sBACd,YACA,QAC+B;CAC/B,MAAM,SAAS,kBAAkB,WAAW;AAC5C,KAAI,CAAC,QAAQ;AACX,MAAI,KAAK,EAAE,YAAY,EAAE,yBAAyB,WAAW,oBAAoB;AACjF,SAAO;;CAET,MAAM,YAAY,yBAAyB,YAAY,OAAO;CAC9D,MAAM,YAAY,OAAO,aAAa;CAItC,MAAM,iBAAiB,OAAO,cAAc;EAC1C,KAAK,KAAA;EACL;EACA;EACD,CAAC;AACF,KAAI,CAAC,OAAO,aAAa;EAAE;EAAgB;EAAW,CAAC,EAAE;AACvD,MAAI,MAAM,EAAE,YAAY,EAAE,aAAa,WAAW,oCAAoC;AACtF,SAAO;;AAET,QAAO;EACL;EACA;EACA;EACA;EACD;;;AAIH,SAAgB,qBACd,SACA,UACA,QACe;AACf,KAAI,UAAU,WAAW,SAAS,MAAM,SAAS,GAAG;EAClD,MAAM,QAAuB,CAAC,QAAQ;AACtC,OAAK,MAAM,YAAY,SAAS,MAC9B,KAAI,aAAa,WAAW,CAAC,MAAM,SAAS,SAAS,CACnD,OAAM,KAAK,SAAS;AAGxB,SAAO;;CAGT,MAAM,aAAa,qBAAqB,CACrC,KAAK,WAAW;AAEf,SADiB,sBAAsB,OAAO,IAAI,OACnC,GAAG,SAAS;GAC3B,CACD,QAAQ,WAA2C,WAAW,KAAK,CACnE,MAAM,MAAM,UAAU;EACrB,MAAM,YAAY,KAAK,mBAAmB,OAAO;EACjD,MAAM,aAAa,MAAM,mBAAmB,OAAO;AACnD,MAAI,cAAc,WAChB,QAAO,YAAY;AAErB,SAAO,KAAK,GAAG,cAAc,MAAM,GAAG;GACtC,CACD,KAAK,WAAW,OAAO,GAAG;CAE7B,MAAM,QAAuB,CAAC,QAAQ;AACtC,MAAK,MAAM,cAAc,WACvB,KAAI,eAAe,WAAW,CAAC,MAAM,SAAS,WAAW,CACvD,OAAM,KAAK,WAAW;AAG1B,QAAO;;;AAIT,SAAgB,2BAA2B,QAA6C;AACtF,KAAI,CAAC,OAAO,QACV,OAAM,IAAI,MAAM,qBAAqB;CAEvC,MAAM,QAAQ,qBAAqB,OAAO,UAAU,OAAO,UAAU,OAAO;CAC5E,MAAM,QAAkC,EAAE;AAC1C,MAAK,MAAM,cAAc,OAAO;EAC9B,MAAM,WAAW,sBAAsB,YAAY,OAAO;AAC1D,MAAI,SACF,OAAM,KAAK,SAAS;;AAGxB,KAAI,MAAM,WAAW,EACnB,OAAM,IAAI,MAAM,iCAAiC;AAEnD,KAAI,MACF;EAAE,SAAS,OAAO;EAAU,OAAO,MAAM,KAAK,MAAM,EAAE,WAAW;EAAE,EACnE,8BACD;AACD,QAAO;;AAKT,SAAgB,eAAe,QAA6B;AAC1D,KAAI,CAAC,QAAQ,QACX,QAAO;AAET,KAAI;AACF,SAAO,2BAA2B,OAAO,CAAC,SAAS;SAC7C;AACN,SAAO;;;AAIX,SAAgB,qBAAqB,UAAuB,QAA4B;AACtF,QAAO,sBAAsB,UAAU,OAAO,KAAK;;AAGrD,SAAgB,sBAAsB,QAAkC;AACtE,QAAO,qBAAqB,CACzB,KAAK,WAAW,OAAO,GAAG,CAC1B,QAAQ,aAAa,qBAAqB,UAAU,OAAO,CAAC;;;AAIjE,SAAgB,kCAA4C;AAC1D,QAAO,qBAAqB,CAAC,KAAK,WAAW,OAAO,GAAG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"list-providers.js","names":[],"sources":["../../../../src/voice/tts/list-providers.ts"],"sourcesContent":["/**\n * Registry-driven TTS provider listing for gateway / Web UI discovery.\n */\n\nimport type { Config } from '../../config/schema.js';\nimport { getVoiceProviderMetadata, type VoiceProviderMetadata } from '../metadata/index.js';\n\nimport { resolveSpeechProvider } from './factory.js';\nimport { mergeTtsConfigFromAppConfig } from './merge-config.js';\nimport { listSpeechProviders } from './speech-registry.js';\n\nexport interface TtsProviderListEntry extends VoiceProviderMetadata {\n aliases: string[];\n configured: boolean;\n}\n\nexport interface TtsProvidersPayload {\n providers: TtsProviderListEntry[];\n active: string;\n}\n\nfunction fallbackMetadata(providerId: string, aliases: readonly string[]): VoiceProviderMetadata {\n return {\n id: providerId,\n capability: 'tts',\n displayName: providerId,\n aliases: [...aliases],\n fields: [\n { key: 'apiKey', label: 'API Key', type: 'password', secret: true },\n { key: 'model', label: 'Model', type: 'string' },\n { key: 'voice', label: 'Voice', type: 'string' },\n ],\n diagnostics: {\n requiresApiKey: true,\n configPath: `messages.tts.providers.${providerId}`,\n },\n };\n}\n\n/** List registered speech providers with configured state and UI metadata. */\nexport function listTtsProvidersForApi(config: Config | undefined): TtsProvidersPayload {\n const ttsConfig = mergeTtsConfigFromAppConfig(config?.messages?.tts);\n const providers: TtsProviderListEntry[] = listSpeechProviders().map((plugin) => {\n const metadata = getVoiceProviderMetadata('tts', plugin.id) ?? fallbackMetadata(plugin.id, plugin.aliases ?? []);\n return {\n ...metadata,\n aliases: [...(metadata.aliases ?? plugin.aliases ?? [])],\n configured: resolveSpeechProvider(plugin.id, ttsConfig) !== null,\n };\n });\n\n return {\n providers,\n active: ttsConfig.provider,\n };\n}\n"],"mappings":";;;;;;AAqBA,SAAS,iBAAiB,YAAoB,SAAmD;AAC/F,QAAO;EACL,IAAI;EACJ,YAAY;EACZ,aAAa;EACb,SAAS,CAAC,GAAG,QAAQ;EACrB,QAAQ;GACN;IAAE,KAAK;IAAU,OAAO;IAAW,MAAM;IAAY,QAAQ;IAAM;GACnE;IAAE,KAAK;IAAS,OAAO;IAAS,MAAM;IAAU;GAChD;IAAE,KAAK;IAAS,OAAO;IAAS,MAAM;IAAU;GACjD;EACD,aAAa;GACX,gBAAgB;GAChB,YAAY,0BAA0B;GACvC;EACF;;;AAIH,SAAgB,uBAAuB,QAAiD;CACtF,MAAM,YAAY,4BAA4B,QAAQ,UAAU,IAAI;AAUpE,QAAO;EACL,WAVwC,qBAAqB,CAAC,KAAK,WAAW;GAC9E,MAAM,WAAW,yBAAyB,OAAO,OAAO,GAAG,IAAI,iBAAiB,OAAO,IAAI,OAAO,WAAW,EAAE,CAAC;AAChH,UAAO;IACL,GAAG;IACH,SAAS,CAAC,GAAI,SAAS,WAAW,OAAO,WAAW,EAAE,CAAE;IACxD,YAAY,sBAAsB,OAAO,IAAI,UAAU,KAAK;IAC7D;IAIQ;EACT,QAAQ,UAAU;EACnB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"merge-config.js","names":[],"sources":["../../../../src/voice/tts/merge-config.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { DEFAULT_TTS_CONFIG, type TTSConfig } from './types.js';\nimport { isTTSAvailable } from './factory.js';\n\n/**\n * Merge persisted app config `tts` with defaults to a full {@link TTSConfig}\n * for validation (provider chain, env-based keys, etc.).\n */\nfunction normalizeTtsTrigger(raw: unknown): TTSConfig['trigger'] {\n const t = typeof raw === 'string' ? raw.toLowerCase() : '';\n if (t === 'off' || t === 'always' || t === 'inbound' || t === 'tagged') return t;\n return DEFAULT_TTS_CONFIG.trigger;\n}\n\nfunction normalizeTtsProvider(raw: unknown): string {\n return typeof raw === 'string' && raw.trim().length > 0 ? raw.trim() : DEFAULT_TTS_CONFIG.provider;\n}\n\nfunction mergeProviderEntries(\n base: Record<string, Record<string, unknown>> | undefined,\n patch: Record<string, Record<string, unknown>> | undefined,\n): Record<string, Record<string, unknown>> | undefined {\n if (!base && !patch) {\n return undefined;\n }\n const merged: Record<string, Record<string, unknown>> = { ...(base ?? {}) };\n for (const [providerId, slice] of Object.entries(patch ?? {})) {\n merged[providerId] = { ...(merged[providerId] ?? {}), ...slice };\n }\n return merged;\n}\n\nexport function mergeTtsConfigFromAppConfig(tts: Partial<TTSConfig> | undefined): TTSConfig {\n const p = (tts ?? {}) as Partial<TTSConfig>;\n return {\n ...DEFAULT_TTS_CONFIG,\n ...p,\n enabled: p.enabled ?? DEFAULT_TTS_CONFIG.enabled,\n provider: normalizeTtsProvider(p.provider),\n trigger: normalizeTtsTrigger(p.trigger ?? DEFAULT_TTS_CONFIG.trigger),\n fallback: {\n ...DEFAULT_TTS_CONFIG.fallback!,\n ...p.fallback,\n },\n modelOverrides: {\n ...DEFAULT_TTS_CONFIG.modelOverrides!,\n ...p.modelOverrides,\n },\n providers: mergeProviderEntries(DEFAULT_TTS_CONFIG.providers, p.providers),\n summarization: {\n ...DEFAULT_TTS_CONFIG.summarization,\n ...p.summarization,\n },\n };\n}\n\n/**\n * User-facing hint when TTS is enabled in settings but no provider can run.\n */\nexport function formatTtsSetupHint(): string {\n return (\n `⚠️ *TTS is on, but no provider can run yet.*\\n\\n` +\n `Configure one of the following in \\`~/.xopc/xopc.json\\` (or env):\\n` +\n `• *OpenAI*: \\`OPENAI_API_KEY\\` or \\`messages.tts.providers.openai.apiKey\\`\\n` +\n `• *Alibaba*: \\`DASHSCOPE_API_KEY\\` or \\`messages.tts.providers.alibaba.apiKey\\`\\n` +\n `• *MiniMax*: \\`MINIMAX_API_KEY\\` or \\`messages.tts.providers.minimax.apiKey\\`\\n` +\n `• *Edge* (no key): ensure \\`messages.tts.providers.edge.enabled\\` is not \\`false\\`\\n` +\n `• *Local CLI*: \\`messages.tts.providers.tts-local-cli.command\\`\\n\\n` +\n `You can also use the gateway Web UI → Settings → Voice.`\n );\n}\n\n/**\n * Append readiness / setup guidance when TTS is enabled but unavailable.\n */\nexport function appendTtsReadinessNote(content: string, appConfig: Config | undefined): string {\n const effective = mergeTtsConfigFromAppConfig(appConfig?.messages?.tts);\n if (!effective.enabled) {\n return content;\n }\n if (isTTSAvailable(effective)) {\n return content;\n }\n return `${content}\\n\\n${formatTtsSetupHint()}`;\n}\n"],"mappings":";;;;;;;AAQA,SAAS,oBAAoB,KAAoC;CAC/D,MAAM,IAAI,OAAO,QAAQ,WAAW,IAAI,aAAa,GAAG;AACxD,KAAI,MAAM,SAAS,MAAM,YAAY,MAAM,aAAa,MAAM,SAAU,QAAO;AAC/E,QAAO,mBAAmB;;AAG5B,SAAS,qBAAqB,KAAsB;AAClD,QAAO,OAAO,QAAQ,YAAY,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,MAAM,GAAG,mBAAmB;;AAG5F,SAAS,qBACP,MACA,OACqD;AACrD,KAAI,CAAC,QAAQ,CAAC,MACZ;CAEF,MAAM,SAAkD,EAAE,GAAI,QAAQ,EAAE,EAAG;AAC3E,MAAK,MAAM,CAAC,YAAY,UAAU,OAAO,QAAQ,SAAS,EAAE,CAAC,CAC3D,QAAO,cAAc;EAAE,GAAI,OAAO,eAAe,EAAE;EAAG,GAAG;EAAO;AAElE,QAAO;;AAGT,SAAgB,4BAA4B,KAAgD;CAC1F,MAAM,IAAK,OAAO,EAAE;AACpB,QAAO;EACL,GAAG;EACH,GAAG;EACH,SAAS,EAAE,WAAW,mBAAmB;EACzC,UAAU,qBAAqB,EAAE,SAAS;EAC1C,SAAS,oBAAoB,EAAE,WAAW,mBAAmB,QAAQ;EACrE,UAAU;GACR,GAAG,mBAAmB;GACtB,GAAG,EAAE;GACN;EACD,gBAAgB;GACd,GAAG,mBAAmB;GACtB,GAAG,EAAE;GACN;EACD,WAAW,qBAAqB,mBAAmB,WAAW,EAAE,UAAU;EAC1E,eAAe;GACb,GAAG,mBAAmB;GACtB,GAAG,EAAE;GACN;EACF;;;;;AAMH,SAAgB,qBAA6B;AAC3C,QACE;;;;;AAcJ,SAAgB,uBAAuB,SAAiB,WAAuC;CAC7F,MAAM,YAAY,4BAA4B,WAAW,UAAU,IAAI;AACvE,KAAI,CAAC,UAAU,QACb,QAAO;AAET,KAAI,eAAe,UAAU,CAC3B,QAAO;AAET,QAAO,GAAG,QAAQ,MAAM,oBAAoB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openai-compatible-speech.js","names":["normalizeBaseUrlGeneric"],"sources":["../../../../src/voice/tts/openai-compatible-speech.ts"],"sourcesContent":["/**\n * Factory: createOpenAiCompatibleSpeechProvider\n *\n * Most TTS providers (OpenAI, MiniMax, ElevenLabs, OpenRouter, ...) speak the\n * OpenAI `/audio/speech` POST shape. This factory eliminates the boilerplate so\n * a new compatible vendor is ~30 lines of declaration instead of a full provider\n * implementation.\n *\n * Ported from openclaw/src/tts/openai-compatible-speech-provider.ts (commit\n * baseline 2026-05-08), with the following INTENTIONAL OMISSIONS per\n * docs/voice-rearchitecture.md §15.3:\n * - resolveTalkConfig / resolveTalkOverrides (talk-mode is excluded)\n * - Persona resolution context (persona system is excluded)\n * - Custom dispatcherPolicy (xopc uses Node 22 native fetch — see ssrf-guard.ts)\n *\n * DECISION: We use `Record<string, unknown>` for the extra-config slot rather\n * than openclaw's generic `<ExtraConfig extends Record<string, unknown>>`. The\n * generic adds significant TypeScript complexity but no runtime safety; we\n * declare per-provider config types in each provider file's own normalizer.\n *\n * DECISION: `voiceCompatibleResponseFormats` defaults to `['opus']` if omitted,\n * because Telegram voice notes require opus/ogg. Providers that natively support\n * opus output (OpenAI, ElevenLabs) can rely on this; others (MiniMax mp3-only)\n * pass an empty array and downstream ffmpeg-compresses to opus.\n */\n\nimport {\n ProviderHttpError,\n fetchWithTimeoutGuarded,\n normalizeBaseUrl as normalizeBaseUrlGeneric,\n postJsonRequest,\n} from '../../media-shared/http/index.js';\nimport { createLogger } from '../../utils/logger.js';\n\nimport type {\n SpeechDirectiveTokenParseContext,\n SpeechDirectiveTokenParseResult,\n SpeechProviderConfig,\n SpeechProviderConfiguredContext,\n SpeechProviderOverrides,\n SpeechProviderPlugin,\n SpeechProviderResolveConfigContext,\n SpeechSynthesisRequest,\n SpeechSynthesisResult,\n SpeechVoiceOption,\n} from './speech-provider-types.js';\n\nconst log = createLogger('SpeechProvider:OpenAiCompat');\n\ninterface OpenAiCompatibleBaseConfig {\n apiKey?: string;\n baseUrl?: string;\n model: string;\n voice: string;\n speed?: number;\n responseFormat?: string;\n}\n\nexport type OpenAiCompatibleSpeechProviderConfig = OpenAiCompatibleBaseConfig &\n Record<string, unknown>;\n\nexport interface OpenAiCompatibleSpeechProviderExtraJsonBodyField {\n /** Key to read from normalized config. */\n configKey: string;\n /** Key to send in the HTTP body. Defaults to `configKey`. */\n requestKey?: string;\n}\n\nexport interface OpenAiCompatibleSpeechProviderOptions {\n /** Canonical provider id (e.g. \"openai\", \"minimax\"). */\n id: string;\n /** Optional aliases for provider lookup. */\n aliases?: readonly string[];\n /** Human-readable label for error messages and logs (e.g. \"OpenAI\", \"MiniMax\"). */\n label: string;\n /** Sort key for UI auto-fallback ordering. Lower = higher priority. */\n autoSelectOrder: number;\n /** Allowed model ids. Used by listVoices and validation. */\n models: readonly string[];\n /** Allowed voice ids. */\n voices: readonly string[];\n /** Default model when config does not specify. */\n defaultModel: string;\n /** Default voice. */\n defaultVoice: string;\n /** Default base URL (e.g. \"https://api.openai.com/v1\"). */\n defaultBaseUrl: string;\n /** Env var name for the api key (e.g. \"OPENAI_API_KEY\"). */\n envKey: string;\n /** Allowed response formats. */\n responseFormats: readonly string[];\n /** Default response format (e.g. \"opus\" for OpenAI, \"mp3\" for MiniMax). */\n defaultResponseFormat: string;\n /** Response formats that produce a voice-note-compatible buffer (no ffmpeg needed). */\n voiceCompatibleResponseFormats?: readonly string[];\n /** Extra static headers (e.g. `{ \"OpenAI-Beta\": \"...\" }`). Auth header is added automatically. */\n extraHeaders?: Record<string, string>;\n /** Read provider-specific extra config keys (e.g. MiniMax's `groupId`). */\n readExtraConfig?: (raw: Record<string, unknown> | undefined) => Record<string, unknown>;\n /** Provider-specific extra body fields to copy from config into request JSON. */\n extraJsonBodyFields?: readonly OpenAiCompatibleSpeechProviderExtraJsonBodyField[];\n /** Override the API error label (defaults to `${label} TTS API error`). */\n apiErrorLabel?: string;\n /** Override the missing-key error message. */\n missingApiKeyError?: string;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction trimToUndefined(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction asFiniteNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string') {\n const parsed = Number.parseFloat(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return undefined;\n}\n\nfunction compactKey(value: string): string {\n return value.replace(/[^a-z0-9]+/giu, '').toLowerCase();\n}\n\nfunction normalizeResponseFormat(label: string, formats: readonly string[], value: unknown): string | undefined {\n const next = trimToUndefined(value)?.toLowerCase();\n if (!next) {\n return undefined;\n }\n if (formats.includes(next)) {\n return next;\n }\n throw new Error(`Invalid ${label} speech responseFormat: ${next}`);\n}\n\nfunction buildExtraJsonBodyFields(\n config: OpenAiCompatibleSpeechProviderConfig,\n fields: readonly OpenAiCompatibleSpeechProviderExtraJsonBodyField[] | undefined,\n): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n for (const field of fields ?? []) {\n const value = config[field.configKey];\n if (value !== undefined && value !== null && value !== '') {\n body[field.requestKey ?? field.configKey] = value;\n }\n }\n return body;\n}\n\nfunction readSpeechOverrides(overrides: SpeechProviderOverrides | undefined): {\n model?: string;\n voice?: string;\n speed?: number;\n} {\n if (!overrides) {\n return {};\n }\n return {\n model: trimToUndefined(overrides.model ?? overrides.modelId),\n voice: trimToUndefined(overrides.voice ?? overrides.voiceId),\n speed: asFiniteNumber(overrides.speed),\n };\n}\n\nfunction parseDirectiveTokenInternal(\n ctx: SpeechDirectiveTokenParseContext,\n providerConfigKey: string,\n): SpeechDirectiveTokenParseResult {\n const compactProviderKey = compactKey(providerConfigKey);\n switch (ctx.key) {\n case 'voice':\n case 'voice_id':\n case 'voiceid':\n case `${providerConfigKey}_voice`:\n case `${compactProviderKey}voice`:\n if (!ctx.policy.allowVoice) {\n return { handled: true };\n }\n return { handled: true, overrides: { voice: ctx.value } };\n case 'model':\n case 'model_id':\n case 'modelid':\n case `${providerConfigKey}_model`:\n case `${compactProviderKey}model`:\n if (!ctx.policy.allowModelId) {\n return { handled: true };\n }\n return { handled: true, overrides: { model: ctx.value } };\n case 'speed': {\n const speed = asFiniteNumber(ctx.value);\n if (speed === undefined) {\n return { handled: true, warnings: [`Invalid speed value: ${ctx.value}`] };\n }\n return { handled: true, overrides: { speed } };\n }\n default:\n return { handled: false };\n }\n}\n\nexport function createOpenAiCompatibleSpeechProvider(\n options: OpenAiCompatibleSpeechProviderOptions,\n): SpeechProviderPlugin {\n const providerConfigKey = options.id;\n const voiceCompatibleResponseFormats = options.voiceCompatibleResponseFormats ?? ['opus'];\n\n function readExtraConfig(raw: Record<string, unknown> | undefined): Record<string, unknown> {\n return options.readExtraConfig?.(raw) ?? {};\n }\n\n function normalizeConfig(rawConfig: Record<string, unknown>): OpenAiCompatibleSpeechProviderConfig {\n const raw = asObject(rawConfig[providerConfigKey]) ?? rawConfig;\n return {\n apiKey: trimToUndefined(raw.apiKey),\n baseUrl: trimToUndefined(raw.baseUrl)\n ? normalizeBaseUrlGeneric(String(raw.baseUrl))\n : undefined,\n model: trimToUndefined(raw.model ?? raw.modelId) ?? options.defaultModel,\n voice: trimToUndefined(raw.voice ?? raw.voiceId) ?? options.defaultVoice,\n speed: asFiniteNumber(raw.speed),\n responseFormat: normalizeResponseFormat(options.label, options.responseFormats, raw.responseFormat),\n ...readExtraConfig(raw),\n };\n }\n\n function readProviderConfig(config: SpeechProviderConfig): OpenAiCompatibleSpeechProviderConfig {\n return {\n apiKey: trimToUndefined(config.apiKey),\n baseUrl: trimToUndefined(config.baseUrl)\n ? normalizeBaseUrlGeneric(String(config.baseUrl))\n : undefined,\n model: trimToUndefined(config.model ?? config.modelId) ?? options.defaultModel,\n voice: trimToUndefined(config.voice ?? config.voiceId) ?? options.defaultVoice,\n speed: asFiniteNumber(config.speed),\n responseFormat:\n normalizeResponseFormat(options.label, options.responseFormats, config.responseFormat) ??\n options.defaultResponseFormat,\n ...readExtraConfig(config),\n };\n }\n\n function resolveApiKey(providerConfig: OpenAiCompatibleSpeechProviderConfig): string | undefined {\n return providerConfig.apiKey ?? trimToUndefined(process.env[options.envKey]);\n }\n\n function resolveBaseUrl(providerConfig: OpenAiCompatibleSpeechProviderConfig): string {\n return providerConfig.baseUrl ?? options.defaultBaseUrl.replace(/\\/+$/u, '');\n }\n\n return {\n id: options.id,\n aliases: options.aliases,\n autoSelectOrder: options.autoSelectOrder,\n\n resolveConfig: (ctx: SpeechProviderResolveConfigContext) => normalizeConfig(ctx.rawConfig),\n\n isConfigured: (ctx: SpeechProviderConfiguredContext) =>\n Boolean(resolveApiKey(readProviderConfig(ctx.providerConfig))),\n\n parseDirectiveToken: (ctx) => parseDirectiveTokenInternal(ctx, providerConfigKey),\n\n listVoices: async (): Promise<SpeechVoiceOption[]> =>\n options.voices.map((voice) => ({ id: voice, name: voice })),\n\n synthesize: async (req: SpeechSynthesisRequest): Promise<SpeechSynthesisResult> => {\n const config = readProviderConfig(req.providerConfig);\n const overrides = readSpeechOverrides(req.providerOverrides);\n const apiKey = resolveApiKey(config);\n if (!apiKey) {\n throw new Error(options.missingApiKeyError ?? `${options.label} API key missing`);\n }\n const baseUrl = resolveBaseUrl(config);\n const responseFormat = config.responseFormat ?? options.defaultResponseFormat;\n const speed = overrides.speed ?? config.speed;\n const model = overrides.model ?? config.model;\n const voice = overrides.voice ?? config.voice;\n\n const url = `${baseUrl}/audio/speech`;\n log.debug(\n { provider: options.id, model, voice, responseFormat, baseUrl, target: req.target },\n `Calling ${options.label} TTS`,\n );\n\n // postJsonRequest already throws ProviderHttpError on non-2xx.\n const response = await postJsonRequest(url, {\n timeoutMs: req.timeoutMs,\n label: options.apiErrorLabel ?? `${options.label} TTS API error`,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n ...options.extraHeaders,\n },\n body: {\n model,\n input: req.text,\n voice,\n response_format: responseFormat,\n ...(speed === undefined ? {} : { speed }),\n ...buildExtraJsonBodyFields(config, options.extraJsonBodyFields),\n },\n });\n\n const audioBuffer = Buffer.from(await response.arrayBuffer());\n return {\n audioBuffer,\n outputFormat: responseFormat,\n fileExtension: responseFormat,\n voiceCompatible: voiceCompatibleResponseFormats.includes(responseFormat),\n };\n },\n\n /**\n * Streaming via OpenAI's POST /audio/speech (the response body itself is\n * the audio stream — no SSE / WebSocket needed). We do NOT call assertOk\n * via postJsonRequest because we want to surface the body as-is for\n * streaming consumers; instead we manually check status and convert to\n * ProviderHttpError on failure (matches openclaw behavior).\n */\n synthesizeStream: async (req) => {\n const config = readProviderConfig(req.providerConfig);\n const overrides = readSpeechOverrides(req.providerOverrides);\n const apiKey = resolveApiKey(config);\n if (!apiKey) {\n throw new Error(options.missingApiKeyError ?? `${options.label} API key missing`);\n }\n const baseUrl = resolveBaseUrl(config);\n const responseFormat = config.responseFormat ?? options.defaultResponseFormat;\n const speed = overrides.speed ?? config.speed;\n const model = overrides.model ?? config.model;\n const voice = overrides.voice ?? config.voice;\n\n const response = await fetchWithTimeoutGuarded(`${baseUrl}/audio/speech`, {\n timeoutMs: req.timeoutMs,\n label: options.apiErrorLabel ?? `${options.label} TTS streaming`,\n init: {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'content-type': 'application/json',\n accept: 'application/octet-stream',\n ...options.extraHeaders,\n },\n body: JSON.stringify({\n model,\n input: req.text,\n voice,\n response_format: responseFormat,\n stream: true,\n ...(speed === undefined ? {} : { speed }),\n ...buildExtraJsonBodyFields(config, options.extraJsonBodyFields),\n }),\n },\n });\n\n if (!response.ok) {\n const detail = await response.text().catch(() => undefined);\n throw new ProviderHttpError({\n label: options.apiErrorLabel ?? `${options.label} TTS streaming`,\n status: response.status,\n detail: detail?.slice(0, 220),\n });\n }\n if (!response.body) {\n throw new Error(`${options.label} TTS streaming: empty response body`);\n }\n\n return {\n audioStream: response.body,\n outputFormat: responseFormat,\n fileExtension: responseFormat,\n voiceCompatible: voiceCompatibleResponseFormats.includes(responseFormat),\n };\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAgCqD;AAerD,MAAM,MAAM,aAAa,8BAA8B;AA4DvD,SAAS,SAAS,OAAqD;AACrE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM,GACtE,QACD,KAAA;;AAGN,SAAS,gBAAgB,OAAoC;AAC3D,KAAI,OAAO,UAAU,SACnB;CAEF,MAAM,UAAU,MAAM,MAAM;AAC5B,QAAO,QAAQ,SAAS,IAAI,UAAU,KAAA;;AAGxC,SAAS,eAAe,OAAoC;AAC1D,KAAI,OAAO,UAAU,YAAY,OAAO,SAAS,MAAM,CACrD,QAAO;AAET,KAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,SAAS,OAAO,WAAW,MAAM;AACvC,MAAI,OAAO,SAAS,OAAO,CACzB,QAAO;;;AAMb,SAAS,WAAW,OAAuB;AACzC,QAAO,MAAM,QAAQ,iBAAiB,GAAG,CAAC,aAAa;;AAGzD,SAAS,wBAAwB,OAAe,SAA4B,OAAoC;CAC9G,MAAM,OAAO,gBAAgB,MAAM,EAAE,aAAa;AAClD,KAAI,CAAC,KACH;AAEF,KAAI,QAAQ,SAAS,KAAK,CACxB,QAAO;AAET,OAAM,IAAI,MAAM,WAAW,MAAM,0BAA0B,OAAO;;AAGpE,SAAS,yBACP,QACA,QACyB;CACzB,MAAM,OAAgC,EAAE;AACxC,MAAK,MAAM,SAAS,UAAU,EAAE,EAAE;EAChC,MAAM,QAAQ,OAAO,MAAM;AAC3B,MAAI,UAAU,KAAA,KAAa,UAAU,QAAQ,UAAU,GACrD,MAAK,MAAM,cAAc,MAAM,aAAa;;AAGhD,QAAO;;AAGT,SAAS,oBAAoB,WAI3B;AACA,KAAI,CAAC,UACH,QAAO,EAAE;AAEX,QAAO;EACL,OAAO,gBAAgB,UAAU,SAAS,UAAU,QAAQ;EAC5D,OAAO,gBAAgB,UAAU,SAAS,UAAU,QAAQ;EAC5D,OAAO,eAAe,UAAU,MAAM;EACvC;;AAGH,SAAS,4BACP,KACA,mBACiC;CACjC,MAAM,qBAAqB,WAAW,kBAAkB;AACxD,SAAQ,IAAI,KAAZ;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,GAAG,kBAAkB;EAC1B,KAAK,GAAG,mBAAmB;AACzB,OAAI,CAAC,IAAI,OAAO,WACd,QAAO,EAAE,SAAS,MAAM;AAE1B,UAAO;IAAE,SAAS;IAAM,WAAW,EAAE,OAAO,IAAI,OAAO;IAAE;EAC3D,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,GAAG,kBAAkB;EAC1B,KAAK,GAAG,mBAAmB;AACzB,OAAI,CAAC,IAAI,OAAO,aACd,QAAO,EAAE,SAAS,MAAM;AAE1B,UAAO;IAAE,SAAS;IAAM,WAAW,EAAE,OAAO,IAAI,OAAO;IAAE;EAC3D,KAAK,SAAS;GACZ,MAAM,QAAQ,eAAe,IAAI,MAAM;AACvC,OAAI,UAAU,KAAA,EACZ,QAAO;IAAE,SAAS;IAAM,UAAU,CAAC,wBAAwB,IAAI,QAAQ;IAAE;AAE3E,UAAO;IAAE,SAAS;IAAM,WAAW,EAAE,OAAO;IAAE;;EAEhD,QACE,QAAO,EAAE,SAAS,OAAO;;;AAI/B,SAAgB,qCACd,SACsB;CACtB,MAAM,oBAAoB,QAAQ;CAClC,MAAM,iCAAiC,QAAQ,kCAAkC,CAAC,OAAO;CAEzF,SAAS,gBAAgB,KAAmE;AAC1F,SAAO,QAAQ,kBAAkB,IAAI,IAAI,EAAE;;CAG7C,SAAS,gBAAgB,WAA0E;EACjG,MAAM,MAAM,SAAS,UAAU,mBAAmB,IAAI;AACtD,SAAO;GACL,QAAQ,gBAAgB,IAAI,OAAO;GACnC,SAAS,gBAAgB,IAAI,QAAQ,GACjCA,iBAAwB,OAAO,IAAI,QAAQ,CAAC,GAC5C,KAAA;GACJ,OAAO,gBAAgB,IAAI,SAAS,IAAI,QAAQ,IAAI,QAAQ;GAC5D,OAAO,gBAAgB,IAAI,SAAS,IAAI,QAAQ,IAAI,QAAQ;GAC5D,OAAO,eAAe,IAAI,MAAM;GAChC,gBAAgB,wBAAwB,QAAQ,OAAO,QAAQ,iBAAiB,IAAI,eAAe;GACnG,GAAG,gBAAgB,IAAI;GACxB;;CAGH,SAAS,mBAAmB,QAAoE;AAC9F,SAAO;GACL,QAAQ,gBAAgB,OAAO,OAAO;GACtC,SAAS,gBAAgB,OAAO,QAAQ,GACpCA,iBAAwB,OAAO,OAAO,QAAQ,CAAC,GAC/C,KAAA;GACJ,OAAO,gBAAgB,OAAO,SAAS,OAAO,QAAQ,IAAI,QAAQ;GAClE,OAAO,gBAAgB,OAAO,SAAS,OAAO,QAAQ,IAAI,QAAQ;GAClE,OAAO,eAAe,OAAO,MAAM;GACnC,gBACE,wBAAwB,QAAQ,OAAO,QAAQ,iBAAiB,OAAO,eAAe,IACtF,QAAQ;GACV,GAAG,gBAAgB,OAAO;GAC3B;;CAGH,SAAS,cAAc,gBAA0E;AAC/F,SAAO,eAAe,UAAU,gBAAgB,QAAQ,IAAI,QAAQ,QAAQ;;CAG9E,SAAS,eAAe,gBAA8D;AACpF,SAAO,eAAe,WAAW,QAAQ,eAAe,QAAQ,SAAS,GAAG;;AAG9E,QAAO;EACL,IAAI,QAAQ;EACZ,SAAS,QAAQ;EACjB,iBAAiB,QAAQ;EAEzB,gBAAgB,QAA4C,gBAAgB,IAAI,UAAU;EAE1F,eAAe,QACb,QAAQ,cAAc,mBAAmB,IAAI,eAAe,CAAC,CAAC;EAEhE,sBAAsB,QAAQ,4BAA4B,KAAK,kBAAkB;EAEjF,YAAY,YACV,QAAQ,OAAO,KAAK,WAAW;GAAE,IAAI;GAAO,MAAM;GAAO,EAAE;EAE7D,YAAY,OAAO,QAAgE;GACjF,MAAM,SAAS,mBAAmB,IAAI,eAAe;GACrD,MAAM,YAAY,oBAAoB,IAAI,kBAAkB;GAC5D,MAAM,SAAS,cAAc,OAAO;AACpC,OAAI,CAAC,OACH,OAAM,IAAI,MAAM,QAAQ,sBAAsB,GAAG,QAAQ,MAAM,kBAAkB;GAEnF,MAAM,UAAU,eAAe,OAAO;GACtC,MAAM,iBAAiB,OAAO,kBAAkB,QAAQ;GACxD,MAAM,QAAQ,UAAU,SAAS,OAAO;GACxC,MAAM,QAAQ,UAAU,SAAS,OAAO;GACxC,MAAM,QAAQ,UAAU,SAAS,OAAO;GAExC,MAAM,MAAM,GAAG,QAAQ;AACvB,OAAI,MACF;IAAE,UAAU,QAAQ;IAAI;IAAO;IAAO;IAAgB;IAAS,QAAQ,IAAI;IAAQ,EACnF,WAAW,QAAQ,MAAM,MAC1B;GAGD,MAAM,WAAW,MAAM,gBAAgB,KAAK;IAC1C,WAAW,IAAI;IACf,OAAO,QAAQ,iBAAiB,GAAG,QAAQ,MAAM;IACjD,SAAS;KACP,eAAe,UAAU;KACzB,GAAG,QAAQ;KACZ;IACD,MAAM;KACJ;KACA,OAAO,IAAI;KACX;KACA,iBAAiB;KACjB,GAAI,UAAU,KAAA,IAAY,EAAE,GAAG,EAAE,OAAO;KACxC,GAAG,yBAAyB,QAAQ,QAAQ,oBAAoB;KACjE;IACF,CAAC;AAGF,UAAO;IACL,aAFkB,OAAO,KAAK,MAAM,SAAS,aAAa,CAE/C;IACX,cAAc;IACd,eAAe;IACf,iBAAiB,+BAA+B,SAAS,eAAe;IACzE;;;;;;;;;EAUH,kBAAkB,OAAO,QAAQ;GAC/B,MAAM,SAAS,mBAAmB,IAAI,eAAe;GACrD,MAAM,YAAY,oBAAoB,IAAI,kBAAkB;GAC5D,MAAM,SAAS,cAAc,OAAO;AACpC,OAAI,CAAC,OACH,OAAM,IAAI,MAAM,QAAQ,sBAAsB,GAAG,QAAQ,MAAM,kBAAkB;GAEnF,MAAM,UAAU,eAAe,OAAO;GACtC,MAAM,iBAAiB,OAAO,kBAAkB,QAAQ;GACxD,MAAM,QAAQ,UAAU,SAAS,OAAO;GACxC,MAAM,QAAQ,UAAU,SAAS,OAAO;GACxC,MAAM,QAAQ,UAAU,SAAS,OAAO;GAExC,MAAM,WAAW,MAAM,wBAAwB,GAAG,QAAQ,gBAAgB;IACxE,WAAW,IAAI;IACf,OAAO,QAAQ,iBAAiB,GAAG,QAAQ,MAAM;IACjD,MAAM;KACJ,QAAQ;KACR,SAAS;MACP,eAAe,UAAU;MACzB,gBAAgB;MAChB,QAAQ;MACR,GAAG,QAAQ;MACZ;KACD,MAAM,KAAK,UAAU;MACnB;MACA,OAAO,IAAI;MACX;MACA,iBAAiB;MACjB,QAAQ;MACR,GAAI,UAAU,KAAA,IAAY,EAAE,GAAG,EAAE,OAAO;MACxC,GAAG,yBAAyB,QAAQ,QAAQ,oBAAoB;MACjE,CAAC;KACH;IACF,CAAC;AAEF,OAAI,CAAC,SAAS,IAAI;IAChB,MAAM,SAAS,MAAM,SAAS,MAAM,CAAC,YAAY,KAAA,EAAU;AAC3D,UAAM,IAAI,kBAAkB;KAC1B,OAAO,QAAQ,iBAAiB,GAAG,QAAQ,MAAM;KACjD,QAAQ,SAAS;KACjB,QAAQ,QAAQ,MAAM,GAAG,IAAI;KAC9B,CAAC;;AAEJ,OAAI,CAAC,SAAS,KACZ,OAAM,IAAI,MAAM,GAAG,QAAQ,MAAM,qCAAqC;AAGxE,UAAO;IACL,aAAa,SAAS;IACtB,cAAc;IACd,eAAe;IACf,iBAAiB,+BAA+B,SAAS,eAAe;IACzE;;EAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"payload.js","names":[],"sources":["../../../../src/voice/tts/payload.ts"],"sourcesContent":["import type { OutboundMessage } from '../../channels/transport-types.js';\nimport type { Config } from '../../config/schema.js';\nimport type { TTSConfig, TTSAutoMode } from './types.js';\nimport { shouldUseTTS, getChannelOutputFormat } from './service.js';\nimport { speak } from './speak-core.js';\nimport { compressAudio } from './audio.js';\nimport { recordTtsSuccess, recordTtsFailure } from './status-tracker.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('TTS/Payload');\n\nexport interface TTSApplyOptions {\n config: TTSConfig | undefined;\n channel: string;\n inboundAudio: boolean;\n /** Resolves summarization LLM when enabled */\n appConfig?: Config;\n}\n\nexport async function maybeApplyTtsToPayload(\n msg: OutboundMessage,\n options: TTSApplyOptions\n): Promise<OutboundMessage> {\n const { config, channel, inboundAudio } = options;\n\n if (!msg.content?.trim()) return msg;\n if (msg.mediaUrl) return msg;\n\n const ttsDecision = shouldUseTTS(config, inboundAudio);\n if (!ttsDecision.useTTS) {\n log.debug({ reason: ttsDecision.reason }, 'TTS skipped');\n return msg;\n }\n\n const trigger = config?.trigger || 'off';\n if (trigger === 'off') return msg;\n\n if (trigger === 'tagged') {\n const hasTtsDirective = /\\[\\[tts\\]\\]/i.test(msg.content);\n if (!hasTtsDirective) return msg;\n msg = {\n ...msg,\n content: msg.content.replace(/\\[\\[tts\\]\\]/gi, '').trim(),\n };\n }\n\n const startTime = Date.now();\n\n try {\n const outFmt = getChannelOutputFormat(channel);\n const ttsResult = await speak(msg.content, config, {\n appConfig: options.appConfig,\n tts: {\n format: outFmt.format as 'opus' | 'mp3' | 'wav',\n },\n });\n\n const wavTarget = outFmt.format === 'mp3' ? 'mp3' : 'opus';\n const { buffer: compressedAudio, format: compressedFormat } = await compressAudio(\n Buffer.from(ttsResult.audio),\n ttsResult.format,\n wavTarget,\n );\n\n const mimeType =\n compressedFormat === 'opus'\n ? 'audio/ogg'\n : compressedFormat === 'mp3' || compressedFormat === 'mpeg'\n ? 'audio/mpeg'\n : `audio/${compressedFormat}`;\n const base64 = compressedAudio.toString('base64');\n const dataUrl = `data:${mimeType};base64,${base64}`;\n\n const latencyMs = Date.now() - startTime;\n recordTtsSuccess({\n provider: ttsResult.provider,\n latencyMs,\n textLength: msg.content.length,\n audioSize: compressedAudio.length,\n audioFormat: compressedFormat,\n usedFallback: Boolean(ttsResult.fallbackFrom),\n wasSummarized: Boolean(ttsResult.wasSummarized),\n });\n\n log.info({ channel, provider: ttsResult.provider, format: compressedFormat }, 'TTS generated');\n\n return {\n ...msg,\n mediaUrl: dataUrl,\n mediaType: 'audio',\n audioAsVoice: outFmt.voiceCompatible,\n };\n } catch (error) {\n const latencyMs = Date.now() - startTime;\n recordTtsFailure({\n latencyMs,\n textLength: msg.content?.length ?? 0,\n error: error instanceof Error ? error.message : String(error),\n });\n log.warn({ error }, 'TTS failed, sending text');\n return msg;\n }\n}\n\nexport function isTtsEnabled(config: TTSConfig | undefined): boolean {\n if (!config?.enabled) return false;\n return config.trigger !== 'off';\n}\n\nexport function resolveTtsAutoMode(\n config: TTSConfig | undefined,\n sessionOverride?: string\n): TTSAutoMode {\n if (sessionOverride) {\n const normalized = sessionOverride.toLowerCase().trim();\n if (['off', 'always', 'inbound', 'tagged'].includes(normalized)) {\n return normalized as TTSAutoMode;\n }\n }\n if (!config?.enabled) return 'off';\n return config.trigger || 'off';\n}\n"],"mappings":";;;;;;;aAOqD;AAErD,MAAM,MAAM,aAAa,cAAc;AAUvC,eAAsB,uBACpB,KACA,SAC0B;CAC1B,MAAM,EAAE,QAAQ,SAAS,iBAAiB;AAE1C,KAAI,CAAC,IAAI,SAAS,MAAM,CAAE,QAAO;AACjC,KAAI,IAAI,SAAU,QAAO;CAEzB,MAAM,cAAc,aAAa,QAAQ,aAAa;AACtD,KAAI,CAAC,YAAY,QAAQ;AACvB,MAAI,MAAM,EAAE,QAAQ,YAAY,QAAQ,EAAE,cAAc;AACxD,SAAO;;CAGT,MAAM,UAAU,QAAQ,WAAW;AACnC,KAAI,YAAY,MAAO,QAAO;AAE9B,KAAI,YAAY,UAAU;AAExB,MAAI,CADoB,eAAe,KAAK,IAAI,QAC5B,CAAE,QAAO;AAC7B,QAAM;GACJ,GAAG;GACH,SAAS,IAAI,QAAQ,QAAQ,iBAAiB,GAAG,CAAC,MAAM;GACzD;;CAGH,MAAM,YAAY,KAAK,KAAK;AAE5B,KAAI;EACF,MAAM,SAAS,uBAAuB,QAAQ;EAC9C,MAAM,YAAY,MAAM,MAAM,IAAI,SAAS,QAAQ;GACjD,WAAW,QAAQ;GACnB,KAAK,EACH,QAAQ,OAAO,QAChB;GACF,CAAC;EAEF,MAAM,YAAY,OAAO,WAAW,QAAQ,QAAQ;EACpD,MAAM,EAAE,QAAQ,iBAAiB,QAAQ,qBAAqB,MAAM,cAClE,OAAO,KAAK,UAAU,MAAM,EAC5B,UAAU,QACV,UACD;EASD,MAAM,UAAU,QANd,qBAAqB,SACjB,cACA,qBAAqB,SAAS,qBAAqB,SACjD,eACA,SAAS,mBAEgB,UADlB,gBAAgB,SAAS,SACS;EAEjD,MAAM,YAAY,KAAK,KAAK,GAAG;AAC/B,mBAAiB;GACf,UAAU,UAAU;GACpB;GACA,YAAY,IAAI,QAAQ;GACxB,WAAW,gBAAgB;GAC3B,aAAa;GACb,cAAc,QAAQ,UAAU,aAAa;GAC7C,eAAe,QAAQ,UAAU,cAAc;GAChD,CAAC;AAEF,MAAI,KAAK;GAAE;GAAS,UAAU,UAAU;GAAU,QAAQ;GAAkB,EAAE,gBAAgB;AAE9F,SAAO;GACL,GAAG;GACH,UAAU;GACV,WAAW;GACX,cAAc,OAAO;GACtB;UACM,OAAO;AAEd,mBAAiB;GACf,WAFgB,KAAK,KAAK,GAAG;GAG7B,YAAY,IAAI,SAAS,UAAU;GACnC,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;GAC9D,CAAC;AACF,MAAI,KAAK,EAAE,OAAO,EAAE,2BAA2B;AAC/C,SAAO;;;AAIX,SAAgB,aAAa,QAAwC;AACnE,KAAI,CAAC,QAAQ,QAAS,QAAO;AAC7B,QAAO,OAAO,YAAY;;AAG5B,SAAgB,mBACd,QACA,iBACa;AACb,KAAI,iBAAiB;EACnB,MAAM,aAAa,gBAAgB,aAAa,CAAC,MAAM;AACvD,MAAI;GAAC;GAAO;GAAU;GAAW;GAAS,CAAC,SAAS,WAAW,CAC7D,QAAO;;AAGX,KAAI,CAAC,QAAQ,QAAS,QAAO;AAC7B,QAAO,OAAO,WAAW"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preprocess.js","names":[],"sources":["../../../../src/voice/tts/preprocess.ts"],"sourcesContent":["import { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('TTS:Preprocess');\n\nexport interface PreprocessOptions {\n maxLength?: number;\n stripMarkdown?: boolean;\n normalizeWhitespace?: boolean;\n}\n\nexport interface PreprocessResult {\n text: string;\n wasTruncated: boolean;\n originalLength: number;\n finalLength: number;\n}\n\nexport function stripMarkdown(text: string): string {\n return (\n text\n .replace(/```[\\s\\S]*?```/g, (match) => {\n const content = match.replace(/```(\\w+)?\\n?/, '').replace(/```$/, '');\n return content.trim();\n })\n .replace(/^#{1,6}\\s+/gm, '')\n .replace(/(\\*\\*|__)(.+?)\\1/g, '$2')\n .replace(/(\\*|_)(.+?)\\1/g, '$2')\n .replace(/`([^`]+)`/g, '$1')\n .replace(/^\\s*>\\s*/gm, '')\n .replace(/!\\[([^\\]]*)\\]\\([^)]+\\)/g, '$1')\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1')\n .replace(/~~(.+?)~~/g, '$1')\n .replace(/^(---+|\\*\\*\\*+|___+)\\s*$/gm, '')\n .replace(/^\\s*[-*+]\\s+/gm, '')\n .replace(/^\\s*\\d+\\.\\s+/gm, '')\n .replace(/<[^>]+>/g, '')\n );\n}\n\nexport function normalizeWhitespace(text: string): string {\n return (\n text\n .replace(/[ \\t]+/g, ' ')\n .replace(/\\n{3,}/g, '\\n\\n')\n .split('\\n')\n .map((line) => line.trim())\n .join('\\n')\n .trim()\n );\n}\n\nexport function truncateText(text: string, maxLength: number): { text: string; wasTruncated: boolean } {\n if (text.length <= maxLength) {\n return { text, wasTruncated: false };\n }\n\n let truncateAt = maxLength - 3;\n while (truncateAt > 0 && text[truncateAt] !== ' ' && text[truncateAt] !== '\\n') {\n truncateAt--;\n }\n\n if (truncateAt <= maxLength * 0.8) {\n truncateAt = maxLength - 3;\n }\n\n return {\n text: text.slice(0, truncateAt).trim() + '...',\n wasTruncated: true,\n };\n}\n\nexport function preprocessText(\n text: string,\n options: PreprocessOptions = {}\n): PreprocessResult {\n const {\n maxLength = 4096,\n stripMarkdown: shouldStripMarkdown = true,\n normalizeWhitespace: shouldNormalizeWhitespace = true,\n } = options;\n\n const originalLength = text.length;\n let processed = text;\n\n if (shouldStripMarkdown) {\n processed = stripMarkdown(processed);\n log.debug({ originalLength, afterMarkdown: processed.length }, 'Stripped markdown');\n }\n\n if (shouldNormalizeWhitespace) {\n processed = normalizeWhitespace(processed);\n log.debug({ afterWhitespace: processed.length }, 'Normalized whitespace');\n }\n\n const { text: finalText, wasTruncated } = truncateText(processed, maxLength);\n\n if (wasTruncated) {\n log.warn(\n { originalLength, finalLength: finalText.length, maxLength },\n 'Text truncated for TTS'\n );\n }\n\n return {\n text: finalText,\n wasTruncated,\n originalLength,\n finalLength: finalText.length,\n };\n}\n\nexport function checkTTSSuitability(text: string): { suitable: boolean; reason?: string } {\n const trimmed = text.trim();\n\n if (trimmed.length < 10) {\n return { suitable: false, reason: 'Text too short for TTS (min 10 chars)' };\n }\n\n const codePattern = /[{};\\[\\]\\(\\)=><]/g;\n const codeMatches = trimmed.match(codePattern);\n const codeRatio = codeMatches ? codeMatches.length / trimmed.length : 0;\n if (codeRatio > 0.3) {\n return { suitable: false, reason: 'Text appears to be mostly code' };\n }\n\n if (/^(https?:\\/\\/\\S+\\s*)+$/.test(trimmed)) {\n return { suitable: false, reason: 'Text contains only URLs' };\n }\n\n return { suitable: true };\n}\n"],"mappings":";;;aAAqD;AAErD,MAAM,MAAM,aAAa,iBAAiB;AAe1C,SAAgB,cAAc,MAAsB;AAClD,QACE,KACG,QAAQ,oBAAoB,UAAU;AAErC,SADgB,MAAM,QAAQ,gBAAgB,GAAG,CAAC,QAAQ,QAAQ,GACpD,CAAC,MAAM;GACrB,CACD,QAAQ,gBAAgB,GAAG,CAC3B,QAAQ,qBAAqB,KAAK,CAClC,QAAQ,kBAAkB,KAAK,CAC/B,QAAQ,cAAc,KAAK,CAC3B,QAAQ,cAAc,GAAG,CACzB,QAAQ,2BAA2B,KAAK,CACxC,QAAQ,0BAA0B,KAAK,CACvC,QAAQ,cAAc,KAAK,CAC3B,QAAQ,8BAA8B,GAAG,CACzC,QAAQ,kBAAkB,GAAG,CAC7B,QAAQ,kBAAkB,GAAG,CAC7B,QAAQ,YAAY,GAAG;;AAI9B,SAAgB,oBAAoB,MAAsB;AACxD,QACE,KACG,QAAQ,WAAW,IAAI,CACvB,QAAQ,WAAW,OAAO,CAC1B,MAAM,KAAK,CACX,KAAK,SAAS,KAAK,MAAM,CAAC,CAC1B,KAAK,KAAK,CACV,MAAM;;AAIb,SAAgB,aAAa,MAAc,WAA4D;AACrG,KAAI,KAAK,UAAU,UACjB,QAAO;EAAE;EAAM,cAAc;EAAO;CAGtC,IAAI,aAAa,YAAY;AAC7B,QAAO,aAAa,KAAK,KAAK,gBAAgB,OAAO,KAAK,gBAAgB,KACxE;AAGF,KAAI,cAAc,YAAY,GAC5B,cAAa,YAAY;AAG3B,QAAO;EACL,MAAM,KAAK,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG;EACzC,cAAc;EACf;;AAGH,SAAgB,eACd,MACA,UAA6B,EAAE,EACb;CAClB,MAAM,EACJ,YAAY,MACZ,eAAe,sBAAsB,MACrC,qBAAqB,4BAA4B,SAC/C;CAEJ,MAAM,iBAAiB,KAAK;CAC5B,IAAI,YAAY;AAEhB,KAAI,qBAAqB;AACvB,cAAY,cAAc,UAAU;AACpC,MAAI,MAAM;GAAE;GAAgB,eAAe,UAAU;GAAQ,EAAE,oBAAoB;;AAGrF,KAAI,2BAA2B;AAC7B,cAAY,oBAAoB,UAAU;AAC1C,MAAI,MAAM,EAAE,iBAAiB,UAAU,QAAQ,EAAE,wBAAwB;;CAG3E,MAAM,EAAE,MAAM,WAAW,iBAAiB,aAAa,WAAW,UAAU;AAE5E,KAAI,aACF,KAAI,KACF;EAAE;EAAgB,aAAa,UAAU;EAAQ;EAAW,EAC5D,yBACD;AAGH,QAAO;EACL,MAAM;EACN;EACA;EACA,aAAa,UAAU;EACxB;;AAGH,SAAgB,oBAAoB,MAAsD;CACxF,MAAM,UAAU,KAAK,MAAM;AAE3B,KAAI,QAAQ,SAAS,GACnB,QAAO;EAAE,UAAU;EAAO,QAAQ;EAAyC;CAI7E,MAAM,cAAc,QAAQ,MAAM,oBAAY;AAE9C,MADkB,cAAc,YAAY,SAAS,QAAQ,SAAS,KACtD,GACd,QAAO;EAAE,UAAU;EAAO,QAAQ;EAAkC;AAGtE,KAAI,yBAAyB,KAAK,QAAQ,CACxC,QAAO;EAAE,UAAU;EAAO,QAAQ;EAA2B;AAG/D,QAAO,EAAE,UAAU,MAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"alibaba-speech.js","names":[],"sources":["../../../../../src/voice/tts/providers/alibaba-speech.ts"],"sourcesContent":["/**\n * Alibaba DashScope TTS provider (qwen-tts model).\n *\n * Implements the SpeechProviderPlugin contract directly because DashScope's\n * response shape (output.audio.url for the audio binary, no direct stream)\n * doesn't fit the OpenAI-compatible factory.\n *\n * Implementation notes (per docs/voice-rearchitecture.md §8.4.1):\n * - `synthesizeStream` is intentionally not implemented. Native qwen-tts\n * streaming uses a WebSocket protocol\n * (wss://dashscope.aliyuncs.com/api-ws/v1/inference); speak-core's stream\n * fallback wraps `synthesize` output as a single-chunk ReadableStream so\n * callers see the same shape.\n * - `maxTextLength = 512` (DashScope qwen-tts hard limit). Enforced upstream\n * via `truncateAtSentenceBoundary` before this provider sees the text.\n * - The audio URL returned by DashScope is hosted on Alibaba's CDN (variable\n * hostname). We do not SSRF-guard the audio fetch because:\n * (a) the URL is provided by the same provider we already trust for the\n * initial synthesis call,\n * (b) it's HTTPS-only and short-lived (~5 min TTL),\n * (c) maintaining a hostname allowlist breaks every time Alibaba rotates\n * CDN domains.\n * A dedicated `assertSafeUrl` for trusted-CDN responses can be added later\n * as a hardening pass.\n */\n\nimport {\n ProviderHttpError,\n fetchWithTimeoutGuarded,\n postJsonRequest,\n} from '../../../media-shared/http/index.js';\nimport { createLogger } from '../../../utils/logger.js';\nimport { registerSpeechProvider } from '../speech-registry.js';\nimport type {\n SpeechDirectiveTokenParseContext,\n SpeechDirectiveTokenParseResult,\n SpeechProviderConfig,\n SpeechProviderConfiguredContext,\n SpeechProviderPlugin,\n SpeechProviderResolveConfigContext,\n SpeechSynthesisRequest,\n SpeechSynthesisResult,\n} from '../speech-provider-types.js';\n\nconst log = createLogger('SpeechProvider:Alibaba');\n\nconst DEFAULT_BASE_URL =\n 'https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation';\nconst DEFAULT_MODEL = 'qwen-tts';\nconst DEFAULT_VOICE = 'longxiaochun';\nconst ENV_KEY = 'DASHSCOPE_API_KEY';\nconst MAX_TEXT_LENGTH = 512;\nconst ALIBABA_VOICES = [\n 'Cherry',\n 'Ethan',\n 'Serena',\n 'Chelsie',\n 'longxiaochun',\n 'longxiaobai',\n 'longwan',\n 'longcheng',\n] as const;\n\ninterface AlibabaTtsConfig extends Record<string, unknown> {\n apiKey?: string;\n baseUrl: string;\n model: string;\n voice: string;\n}\n\ninterface CosyVoiceResponse {\n output: {\n audio?: { url?: string; data?: string };\n speech?: string;\n speech_url?: string;\n finish_reason?: string;\n };\n usage?: { characters?: number };\n request_id?: string;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction trimToUndefined(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction normalizeConfig(rawConfig: Record<string, unknown>): AlibabaTtsConfig {\n const raw = asObject(rawConfig.alibaba) ?? {};\n return {\n apiKey: trimToUndefined(raw.apiKey),\n baseUrl: trimToUndefined(raw.baseUrl) ?? DEFAULT_BASE_URL,\n model: trimToUndefined(raw.model ?? raw.modelId) ?? DEFAULT_MODEL,\n voice: trimToUndefined(raw.voice ?? raw.voiceId) ?? DEFAULT_VOICE,\n };\n}\n\nfunction readProviderConfig(config: SpeechProviderConfig): AlibabaTtsConfig {\n return {\n apiKey: trimToUndefined(config.apiKey),\n baseUrl: trimToUndefined(config.baseUrl) ?? DEFAULT_BASE_URL,\n model: trimToUndefined(config.model ?? config.modelId) ?? DEFAULT_MODEL,\n voice: trimToUndefined(config.voice ?? config.voiceId) ?? DEFAULT_VOICE,\n };\n}\n\nfunction resolveApiKey(config: AlibabaTtsConfig): string | undefined {\n return config.apiKey ?? trimToUndefined(process.env[ENV_KEY]);\n}\n\nfunction parseDirectiveTokenInternal(\n ctx: SpeechDirectiveTokenParseContext,\n): SpeechDirectiveTokenParseResult {\n switch (ctx.key) {\n case 'voice':\n case 'voice_id':\n case 'voiceid':\n case 'alibaba_voice':\n case 'alibabavoice':\n if (!ctx.policy.allowVoice) {\n return { handled: true };\n }\n return { handled: true, overrides: { voice: ctx.value } };\n case 'model':\n case 'model_id':\n case 'modelid':\n case 'alibaba_model':\n case 'alibabamodel':\n if (!ctx.policy.allowModelId) {\n return { handled: true };\n }\n return { handled: true, overrides: { model: ctx.value } };\n default:\n return { handled: false };\n }\n}\n\nexport const alibabaSpeechProvider: SpeechProviderPlugin = {\n id: 'alibaba',\n aliases: ['dashscope', 'qwen-tts'],\n autoSelectOrder: 25,\n\n resolveConfig: (ctx: SpeechProviderResolveConfigContext) => normalizeConfig(ctx.rawConfig),\n\n isConfigured: (ctx: SpeechProviderConfiguredContext) =>\n Boolean(resolveApiKey(readProviderConfig(ctx.providerConfig))),\n\n parseDirectiveToken: parseDirectiveTokenInternal,\n\n listVoices: async () => ALIBABA_VOICES.map((id) => ({ id, name: id })),\n\n synthesize: async (req: SpeechSynthesisRequest): Promise<SpeechSynthesisResult> => {\n const config = readProviderConfig(req.providerConfig);\n const apiKey = resolveApiKey(config);\n if (!apiKey) {\n throw new Error(\n `Alibaba TTS API key missing (set ${ENV_KEY} or messages.tts.providers.alibaba.apiKey)`,\n );\n }\n if (req.text.length > MAX_TEXT_LENGTH) {\n throw new Error(\n `Alibaba TTS text exceeds ${MAX_TEXT_LENGTH} char limit (got ${req.text.length})`,\n );\n }\n\n const overrides = req.providerOverrides ?? {};\n const model = trimToUndefined(overrides.model ?? overrides.modelId) ?? config.model;\n const voice = trimToUndefined(overrides.voice ?? overrides.voiceId) ?? config.voice;\n\n log.debug({ model, voice, textLength: req.text.length }, 'Calling Alibaba TTS');\n\n const response = await postJsonRequest(config.baseUrl, {\n timeoutMs: req.timeoutMs,\n label: 'Alibaba TTS',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'X-DashScope-DataInspection': 'disable',\n },\n body: {\n model,\n input: { text: req.text },\n parameters: { voice },\n },\n });\n\n const data = (await response.json()) as CosyVoiceResponse;\n\n // DashScope occasionally returns `finish_reason: \"null\"` (string) on failure.\n if (data.output?.finish_reason === 'null' && !data.output?.audio?.url) {\n throw new Error(`Alibaba TTS API error: ${JSON.stringify(data)}`);\n }\n\n let audioBuffer: Buffer;\n const audioUrl = data.output?.audio?.url ?? data.output?.speech_url;\n if (audioUrl) {\n // CDN URL — see file-level DECISION on why we skip SSRF here.\n const audioResponse = await fetchWithTimeoutGuarded(audioUrl, {\n timeoutMs: req.timeoutMs,\n label: 'Alibaba TTS audio download',\n allowPrivateNetwork: false,\n });\n if (!audioResponse.ok) {\n throw new ProviderHttpError({\n label: 'Alibaba TTS audio download',\n status: audioResponse.status,\n detail: audioResponse.statusText,\n });\n }\n audioBuffer = Buffer.from(await audioResponse.arrayBuffer());\n } else if (data.output?.speech) {\n audioBuffer = Buffer.from(data.output.speech, 'base64');\n } else if (data.output?.audio?.data) {\n audioBuffer = Buffer.from(data.output.audio.data, 'base64');\n } else {\n throw new Error('No audio returned from Alibaba TTS');\n }\n\n log.debug(\n { size: audioBuffer.length, characters: data.usage?.characters, requestId: data.request_id },\n 'Alibaba TTS completed',\n );\n\n return {\n audioBuffer,\n outputFormat: 'wav',\n fileExtension: 'wav',\n // wav is NOT a Telegram voice-note format → ffmpeg compresses downstream.\n voiceCompatible: false,\n };\n },\n\n // synthesizeStream intentionally omitted — see file-level DECISION.\n};\n\nregisterSpeechProvider(alibabaSpeechProvider);\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"edge-speech.js","names":[],"sources":["../../../../../src/voice/tts/providers/edge-speech.ts"],"sourcesContent":["/**\n * Edge TTS provider — wraps the `node-edge-tts` package. Requires no API key\n * (Microsoft's Edge browser endpoint is unauthenticated).\n *\n * Implementation notes:\n * - Temp-file dance (mkdtemp → ttsPromise → readFileSync → rm) is required\n * because `node-edge-tts` does not expose a stream-to-buffer API.\n * - `synthesizeStream` is implemented as \"synthesize + wrap as single-chunk\n * stream\" so callers see uniform behavior. This is not a true network\n * stream; it's buffered-then-wrapped.\n * - `inferEdgeExtension` derives the file extension from Edge's outputFormat\n * string.\n */\n\nimport { mkdtempSync, readFileSync, rmSync, statSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\n\nimport { createLogger } from '../../../utils/logger.js';\nimport { registerSpeechProvider } from '../speech-registry.js';\nimport type {\n SpeechDirectiveTokenParseContext,\n SpeechDirectiveTokenParseResult,\n SpeechProviderConfig,\n SpeechProviderConfiguredContext,\n SpeechProviderPlugin,\n SpeechProviderResolveConfigContext,\n SpeechSynthesisRequest,\n SpeechSynthesisResult,\n SpeechSynthesisStreamRequest,\n SpeechSynthesisStreamResult,\n} from '../speech-provider-types.js';\n\nconst log = createLogger('SpeechProvider:Edge');\n\nconst DEFAULT_VOICE = 'zh-CN-XiaoxiaoNeural';\nconst DEFAULT_LANG = 'zh-CN';\nconst DEFAULT_OUTPUT_FORMAT = 'audio-24khz-48kbitrate-mono-mp3';\n\ninterface EdgeTtsConfig extends Record<string, unknown> {\n voice: string;\n lang: string;\n outputFormat: string;\n pitch?: string;\n rate?: string;\n volume?: string;\n proxy?: string;\n enabled: boolean;\n}\n\nfunction trimToUndefined(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction inferEdgeExtension(outputFormat: string): { ext: string; format: string } {\n const normalized = outputFormat.toLowerCase();\n if (normalized.includes('webm')) return { ext: 'webm', format: 'webm' };\n if (normalized.includes('opus')) return { ext: 'opus', format: 'opus' };\n if (normalized.includes('ogg')) return { ext: 'ogg', format: 'ogg' };\n if (normalized.includes('wav') || normalized.includes('riff') || normalized.includes('pcm')) {\n return { ext: 'wav', format: 'wav' };\n }\n return { ext: 'mp3', format: 'mp3' };\n}\n\nfunction normalizeConfig(rawConfig: Record<string, unknown>): EdgeTtsConfig {\n const raw = asObject(rawConfig.edge) ?? rawConfig;\n return {\n voice: trimToUndefined(raw.voice ?? raw.voiceId) ?? DEFAULT_VOICE,\n lang: trimToUndefined(raw.lang) ?? DEFAULT_LANG,\n outputFormat: trimToUndefined(raw.outputFormat) ?? DEFAULT_OUTPUT_FORMAT,\n pitch: trimToUndefined(raw.pitch),\n rate: trimToUndefined(raw.rate),\n volume: trimToUndefined(raw.volume),\n proxy: trimToUndefined(raw.proxy),\n enabled: raw.enabled !== false, // default-on\n };\n}\n\nfunction readProviderConfig(config: SpeechProviderConfig): EdgeTtsConfig {\n return {\n voice: trimToUndefined(config.voice ?? config.voiceId) ?? DEFAULT_VOICE,\n lang: trimToUndefined(config.lang) ?? DEFAULT_LANG,\n outputFormat: trimToUndefined(config.outputFormat) ?? DEFAULT_OUTPUT_FORMAT,\n pitch: trimToUndefined(config.pitch),\n rate: trimToUndefined(config.rate),\n volume: trimToUndefined(config.volume),\n proxy: trimToUndefined(config.proxy),\n enabled: config.enabled !== false,\n };\n}\n\nfunction parseDirectiveTokenInternal(\n ctx: SpeechDirectiveTokenParseContext,\n): SpeechDirectiveTokenParseResult {\n switch (ctx.key) {\n case 'voice':\n case 'voice_id':\n case 'voiceid':\n case 'edge_voice':\n case 'edgevoice':\n if (!ctx.policy.allowVoice) {\n return { handled: true };\n }\n return { handled: true, overrides: { voice: ctx.value } };\n default:\n return { handled: false };\n }\n}\n\nasync function waitForNonEmptyFile(filePath: string, timeoutMs: number): Promise<void> {\n const deadline = Date.now() + Math.min(Math.max(timeoutMs, 1000), 5000);\n while (Date.now() < deadline) {\n try {\n if (statSync(filePath).size > 0) return;\n } catch {\n // The Edge package may resolve before the file is visible on slower filesystems.\n }\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n}\n\nasync function synthesizeToBuffer(\n text: string,\n config: EdgeTtsConfig,\n voiceOverride: string | undefined,\n timeoutMs: number,\n): Promise<{ buffer: Buffer; outputFormat: string; ext: string }> {\n // Lazy import — node-edge-tts loads ws transitively; skip cost for users that\n // never enable the edge provider.\n const { EdgeTTS } = await import('node-edge-tts');\n\n const voice = voiceOverride ?? config.voice;\n const tempDir = mkdtempSync(path.join(tmpdir(), 'tts-edge-'));\n const { ext, format } = inferEdgeExtension(config.outputFormat);\n const outputPath = path.join(tempDir, `speech-${Date.now()}.${ext}`);\n\n try {\n log.debug(\n { voice, outputFormat: config.outputFormat, textLength: text.length },\n 'Calling Edge TTS',\n );\n const tts = new EdgeTTS({\n voice,\n lang: config.lang,\n outputFormat: config.outputFormat,\n proxy: config.proxy,\n rate: config.rate,\n pitch: config.pitch,\n volume: config.volume,\n timeout: timeoutMs,\n });\n await tts.ttsPromise(text, outputPath);\n await waitForNonEmptyFile(outputPath, timeoutMs);\n const buffer = readFileSync(outputPath);\n if (buffer.length === 0) {\n throw new Error(`Edge TTS produced an empty ${format} file for voice ${voice}`);\n }\n return { buffer, outputFormat: format, ext };\n } finally {\n try {\n rmSync(tempDir, { recursive: true, force: true });\n } catch (cleanupError) {\n log.warn({ err: cleanupError, tempDir }, 'Failed to cleanup Edge TTS temp directory');\n }\n }\n}\n\nexport const edgeSpeechProvider: SpeechProviderPlugin = {\n id: 'edge',\n autoSelectOrder: 100,\n\n resolveConfig: (ctx: SpeechProviderResolveConfigContext) => normalizeConfig(ctx.rawConfig),\n\n isConfigured: (ctx: SpeechProviderConfiguredContext) => readProviderConfig(ctx.providerConfig).enabled,\n\n parseDirectiveToken: parseDirectiveTokenInternal,\n\n // Edge has hundreds of voices; we don't enumerate them statically. UI should\n // call upstream Microsoft endpoint for the full catalog.\n listVoices: async () => [{ id: DEFAULT_VOICE, name: DEFAULT_VOICE, locale: DEFAULT_LANG }],\n\n synthesize: async (req: SpeechSynthesisRequest): Promise<SpeechSynthesisResult> => {\n const config = readProviderConfig(req.providerConfig);\n if (!config.enabled) {\n throw new Error('Edge TTS is disabled in config (messages.tts.providers.edge.enabled = false)');\n }\n const overrides = req.providerOverrides ?? {};\n const voiceOverride = trimToUndefined(overrides.voice ?? overrides.voiceId);\n const { buffer, outputFormat, ext } = await synthesizeToBuffer(\n req.text,\n config,\n voiceOverride,\n req.timeoutMs,\n );\n return {\n audioBuffer: buffer,\n outputFormat,\n fileExtension: ext,\n voiceCompatible: outputFormat === 'opus' || outputFormat === 'ogg',\n };\n },\n\n // True streaming would require a node-edge-tts upstream change. We expose a\n // \"fake stream\" (single chunk) so callers don't fall through to speak-core's\n // wrapBufferAsStream branch and can treat all providers uniformly.\n synthesizeStream: async (req: SpeechSynthesisStreamRequest): Promise<SpeechSynthesisStreamResult> => {\n const config = readProviderConfig(req.providerConfig);\n if (!config.enabled) {\n throw new Error('Edge TTS is disabled in config (messages.tts.providers.edge.enabled = false)');\n }\n const overrides = req.providerOverrides ?? {};\n const voiceOverride = trimToUndefined(overrides.voice ?? overrides.voiceId);\n const { buffer, outputFormat, ext } = await synthesizeToBuffer(\n req.text,\n config,\n voiceOverride,\n req.timeoutMs,\n );\n const audioStream = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(new Uint8Array(buffer));\n controller.close();\n },\n });\n return {\n audioStream,\n outputFormat,\n fileExtension: ext,\n voiceCompatible: outputFormat === 'opus' || outputFormat === 'ogg',\n };\n },\n};\n\nregisterSpeechProvider(edgeSpeechProvider);\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"minimax-speech.js","names":[],"sources":["../../../../../src/voice/tts/providers/minimax-speech.ts"],"sourcesContent":["/**\n * MiniMax TTS provider — async task model (submit → poll → download).\n *\n * MiniMax's t2a_async_v2 endpoint does not match the OpenAI POST /audio/speech\n * shape (it returns task_id, then we poll, then we fetch the file by file_id),\n * so we implement the contract directly rather than using\n * createOpenAiCompatibleSpeechProvider.\n *\n * Implementation notes (per docs/voice-rearchitecture.md §8.4.4):\n * - Default per-call timeout: 150s. Submit + poll + download can legitimately\n * take 60-120s on long inputs, so we enforce `Math.max(timeoutMs, 150000)`.\n * - `synthesizeStream` is intentionally not implemented. MiniMax has a\n * separate WebSocket streaming endpoint that does not match the\n * buffer-then-wrap pattern; speak-core falls back to wrapBufferAsStream.\n * - Poll interval = 2s, max 60 attempts (2 min cap). Aligns with MiniMax docs.\n * - `groupId` is read from config but not passed into the request body —\n * MiniMax embeds groupId in the API key for this account tier. Kept as a\n * forward-compat slot for the enterprise account tier.\n */\n\nimport { ProviderHttpError, fetchWithTimeoutGuarded } from '../../../media-shared/http/index.js';\nimport { createLogger } from '../../../utils/logger.js';\nimport { registerSpeechProvider } from '../speech-registry.js';\nimport type {\n SpeechDirectiveTokenParseContext,\n SpeechDirectiveTokenParseResult,\n SpeechProviderConfig,\n SpeechProviderConfiguredContext,\n SpeechProviderPlugin,\n SpeechProviderResolveConfigContext,\n SpeechSynthesisRequest,\n SpeechSynthesisResult,\n} from '../speech-provider-types.js';\n\nconst log = createLogger('SpeechProvider:MiniMax');\n\nconst DEFAULT_BASE_URL = 'https://api.minimaxi.com/v1';\nconst DEFAULT_MODEL = 'speech-2.8-hd';\nconst DEFAULT_VOICE = 'male-qn-qingse';\nconst ENV_KEY = 'MINIMAX_API_KEY';\nconst POLL_INTERVAL_MS = 2000;\nconst MAX_POLL_ATTEMPTS = 60;\nconst DEFAULT_TIMEOUT_MS = 150_000;\n\nexport const MINIMAX_TTS_MODELS = [\n 'speech-2.8-hd',\n 'speech-2.8-turbo',\n 'speech-2.6-hd',\n 'speech-2.6-turbo',\n 'speech-02-hd',\n 'speech-02-turbo',\n] as const;\n\nexport const MINIMAX_TTS_VOICES = [\n 'male-qn-qingse',\n 'male-qn-jingying',\n 'male-qn-badao',\n 'male-qn-daxuesheng',\n 'female-shaonv',\n 'female-yujie',\n 'female-chengshu',\n 'female-tianmei',\n 'audiobook_male_1',\n 'audiobook_male_2',\n 'audiobook_female_1',\n 'audiobook_female_2',\n 'presenter_male',\n 'presenter_female',\n] as const;\n\ninterface MinimaxTtsConfig extends Record<string, unknown> {\n apiKey?: string;\n baseUrl: string;\n model: string;\n voice: string;\n groupId?: string;\n}\n\ninterface MiniMaxBaseResp {\n status_code?: number;\n status_msg?: string;\n}\n\ninterface SubmitResponse {\n task_id?: string;\n base_resp?: MiniMaxBaseResp;\n}\n\ninterface QueryResponse {\n status?: string;\n file_id?: string;\n base_resp?: MiniMaxBaseResp;\n}\n\nfunction trimToUndefined(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction normalizeConfig(rawConfig: Record<string, unknown>): MinimaxTtsConfig {\n const raw = asObject(rawConfig.minimax) ?? rawConfig;\n return {\n apiKey: trimToUndefined(raw.apiKey),\n baseUrl: (trimToUndefined(raw.baseUrl) ?? DEFAULT_BASE_URL).replace(/\\/+$/u, ''),\n model: trimToUndefined(raw.model ?? raw.modelId) ?? DEFAULT_MODEL,\n voice: trimToUndefined(raw.voice ?? raw.voiceId) ?? DEFAULT_VOICE,\n groupId: trimToUndefined(raw.groupId),\n };\n}\n\nfunction readProviderConfig(config: SpeechProviderConfig): MinimaxTtsConfig {\n return {\n apiKey: trimToUndefined(config.apiKey),\n baseUrl: (trimToUndefined(config.baseUrl) ?? DEFAULT_BASE_URL).replace(/\\/+$/u, ''),\n model: trimToUndefined(config.model ?? config.modelId) ?? DEFAULT_MODEL,\n voice: trimToUndefined(config.voice ?? config.voiceId) ?? DEFAULT_VOICE,\n groupId: trimToUndefined(config.groupId),\n };\n}\n\nfunction resolveApiKey(config: MinimaxTtsConfig): string | undefined {\n return config.apiKey ?? trimToUndefined(process.env[ENV_KEY]);\n}\n\nfunction abortError(): Error {\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n return err;\n}\n\nfunction sleep(ms: number, signal: AbortSignal | undefined): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(abortError());\n return;\n }\n const id = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(id);\n signal?.removeEventListener('abort', onAbort);\n reject(abortError());\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nasync function submitTask(params: {\n baseUrl: string;\n apiKey: string;\n model: string;\n voiceId: string;\n text: string;\n timeoutMs: number;\n signal?: AbortSignal;\n}): Promise<string> {\n const response = await fetchWithTimeoutGuarded(`${params.baseUrl}/t2a_async_v2`, {\n timeoutMs: params.timeoutMs,\n label: 'MiniMax TTS submit',\n signal: params.signal,\n init: {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${params.apiKey}`,\n 'content-type': 'application/json',\n },\n body: JSON.stringify({\n model: params.model,\n text: params.text,\n voice_setting: { voice_id: params.voiceId, speed: 1, vol: 10, pitch: 0 },\n audio_setting: {\n audio_sample_rate: 32000,\n bitrate: 128000,\n format: 'mp3',\n channel: 1,\n },\n }),\n },\n });\n\n const raw = await response.text();\n if (!response.ok) {\n throw new ProviderHttpError({\n label: 'MiniMax TTS submit',\n status: response.status,\n detail: raw.slice(0, 220) || response.statusText,\n });\n }\n let data: SubmitResponse;\n try {\n data = JSON.parse(raw) as SubmitResponse;\n } catch {\n throw new Error(`MiniMax TTS submit returned non-JSON: ${raw.slice(0, 240)}`);\n }\n const code = data.base_resp?.status_code;\n if (code !== undefined && code !== 0) {\n throw new Error(\n `MiniMax TTS submit error: ${code} ${data.base_resp?.status_msg ?? ''}`.trim(),\n );\n }\n const taskId = data.task_id?.trim();\n if (!taskId) {\n throw new Error('MiniMax TTS submit returned no task_id');\n }\n return taskId;\n}\n\nasync function pollTask(params: {\n baseUrl: string;\n apiKey: string;\n taskId: string;\n timeoutMs: number;\n signal?: AbortSignal;\n}): Promise<string> {\n for (let attempt = 0; attempt < MAX_POLL_ATTEMPTS; attempt++) {\n if (params.signal?.aborted) {\n throw abortError();\n }\n const url = `${params.baseUrl}/query/t2a_async_query_v2?task_id=${encodeURIComponent(params.taskId)}`;\n const response = await fetchWithTimeoutGuarded(url, {\n timeoutMs: params.timeoutMs,\n label: 'MiniMax TTS query',\n signal: params.signal,\n init: {\n method: 'GET',\n headers: { Authorization: `Bearer ${params.apiKey}` },\n },\n });\n const raw = await response.text();\n if (!response.ok) {\n throw new ProviderHttpError({\n label: 'MiniMax TTS query',\n status: response.status,\n detail: raw.slice(0, 220) || response.statusText,\n });\n }\n let data: QueryResponse;\n try {\n data = JSON.parse(raw) as QueryResponse;\n } catch {\n throw new Error(`MiniMax TTS query returned non-JSON: ${raw.slice(0, 240)}`);\n }\n const code = data.base_resp?.status_code;\n if (code !== undefined && code !== 0) {\n throw new Error(\n `MiniMax TTS query error: ${code} ${data.base_resp?.status_msg ?? ''}`.trim(),\n );\n }\n const status = (data.status || '').trim();\n if (status === 'Success') {\n const fileId = data.file_id?.trim();\n if (!fileId) {\n throw new Error('MiniMax TTS completed but file_id is missing');\n }\n return fileId;\n }\n if (status === 'Failed' || status === 'Fail') {\n throw new Error('MiniMax TTS task failed');\n }\n await sleep(POLL_INTERVAL_MS, params.signal);\n }\n throw new Error(`MiniMax TTS timed out after ${MAX_POLL_ATTEMPTS} polls`);\n}\n\nasync function downloadAudio(params: {\n baseUrl: string;\n apiKey: string;\n fileId: string;\n timeoutMs: number;\n signal?: AbortSignal;\n}): Promise<Buffer> {\n const url = `${params.baseUrl}/files/retrieve_content?file_id=${encodeURIComponent(params.fileId)}`;\n const response = await fetchWithTimeoutGuarded(url, {\n timeoutMs: params.timeoutMs,\n label: 'MiniMax TTS download',\n signal: params.signal,\n init: {\n method: 'GET',\n headers: { Authorization: `Bearer ${params.apiKey}` },\n },\n });\n if (!response.ok) {\n const detail = await response.text().catch(() => '');\n throw new ProviderHttpError({\n label: 'MiniMax TTS download',\n status: response.status,\n detail: detail.slice(0, 220) || response.statusText,\n });\n }\n return Buffer.from(await response.arrayBuffer());\n}\n\nfunction parseDirectiveTokenInternal(\n ctx: SpeechDirectiveTokenParseContext,\n): SpeechDirectiveTokenParseResult {\n switch (ctx.key) {\n case 'voice':\n case 'voice_id':\n case 'voiceid':\n case 'minimax_voice':\n case 'minimaxvoice':\n if (!ctx.policy.allowVoice) return { handled: true };\n return { handled: true, overrides: { voice: ctx.value } };\n case 'model':\n case 'model_id':\n case 'modelid':\n case 'minimax_model':\n case 'minimaxmodel':\n if (!ctx.policy.allowModelId) return { handled: true };\n return { handled: true, overrides: { model: ctx.value } };\n default:\n return { handled: false };\n }\n}\n\nexport const minimaxSpeechProvider: SpeechProviderPlugin = {\n id: 'minimax',\n autoSelectOrder: 40,\n\n resolveConfig: (ctx: SpeechProviderResolveConfigContext) => normalizeConfig(ctx.rawConfig),\n\n isConfigured: (ctx: SpeechProviderConfiguredContext) =>\n Boolean(resolveApiKey(readProviderConfig(ctx.providerConfig))),\n\n parseDirectiveToken: parseDirectiveTokenInternal,\n\n listVoices: async () => MINIMAX_TTS_VOICES.map((id) => ({ id, name: id })),\n\n synthesize: async (req: SpeechSynthesisRequest): Promise<SpeechSynthesisResult> => {\n const config = readProviderConfig(req.providerConfig);\n const apiKey = resolveApiKey(config);\n if (!apiKey) {\n throw new Error(\n `MiniMax TTS API key missing (set ${ENV_KEY} or messages.tts.providers.minimax.apiKey)`,\n );\n }\n const overrides = req.providerOverrides ?? {};\n const model = trimToUndefined(overrides.model ?? overrides.modelId) ?? config.model;\n const voice = trimToUndefined(overrides.voice ?? overrides.voiceId) ?? config.voice;\n const callTimeoutMs = Math.max(req.timeoutMs, DEFAULT_TIMEOUT_MS);\n\n log.debug({ model, voice, textLength: req.text.length }, 'MiniMax TTS submit');\n // SpeechSynthesisRequest carries no AbortSignal — orchestrator controls\n // timeouts via timeoutMs. If user cancellation is required later, expose\n // it through fetchWithTimeoutGuarded's `signal` option.\n const taskId = await submitTask({\n baseUrl: config.baseUrl,\n apiKey,\n model,\n voiceId: voice,\n text: req.text,\n timeoutMs: callTimeoutMs,\n });\n const fileId = await pollTask({\n baseUrl: config.baseUrl,\n apiKey,\n taskId,\n timeoutMs: callTimeoutMs,\n });\n const audioBuffer = await downloadAudio({\n baseUrl: config.baseUrl,\n apiKey,\n fileId,\n timeoutMs: callTimeoutMs,\n });\n log.debug({ size: audioBuffer.length, taskId }, 'MiniMax TTS completed');\n return {\n audioBuffer,\n outputFormat: 'mp3',\n fileExtension: 'mp3',\n voiceCompatible: false, // mp3 → ffmpeg compresses to opus downstream\n };\n },\n\n // synthesizeStream intentionally omitted — see file-level DECISION.\n};\n\nregisterSpeechProvider(minimaxSpeechProvider);\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openai-speech.js","names":[],"sources":["../../../../../src/voice/tts/providers/openai-speech.ts"],"sourcesContent":["/**\n * OpenAI TTS provider — built via createOpenAiCompatibleSpeechProvider factory.\n *\n * Env: OPENAI_API_KEY, OPENAI_TTS_BASE_URL (optional override).\n *\n * `OPENAI_TTS_MODELS` / `OPENAI_TTS_VOICES` are exported because the gateway\n * console imports them for UI dropdowns. The factory's `models` / `voices`\n * arrays are used only for `listVoices` discovery; runtime calls accept any\n * string so custom OpenAI-compatible endpoints work without enumeration.\n *\n * Resolution priority for base URL: providerConfig > OPENAI_TTS_BASE_URL env >\n * https://api.openai.com/v1 (env is read at module load time below).\n */\n\nimport { createOpenAiCompatibleSpeechProvider } from '../openai-compatible-speech.js';\nimport { registerSpeechProvider } from '../speech-registry.js';\n\nexport const OPENAI_TTS_MODELS = [\n 'gpt-4o-mini-tts',\n 'tts-1',\n 'tts-1-hd',\n] as const;\n\nexport const OPENAI_TTS_VOICES = [\n 'alloy',\n 'ash',\n 'ballad',\n 'cedar',\n 'coral',\n 'echo',\n 'fable',\n 'juniper',\n 'marin',\n 'onyx',\n 'nova',\n 'sage',\n 'shimmer',\n 'verse',\n] as const;\n\nconst DEFAULT_BASE_URL =\n process.env.OPENAI_TTS_BASE_URL?.trim().replace(/\\/+$/, '') ?? 'https://api.openai.com/v1';\n\nexport const openAiSpeechProvider = createOpenAiCompatibleSpeechProvider({\n id: 'openai',\n label: 'OpenAI',\n autoSelectOrder: 10,\n models: OPENAI_TTS_MODELS,\n voices: OPENAI_TTS_VOICES,\n defaultModel: 'tts-1',\n defaultVoice: 'alloy',\n defaultBaseUrl: DEFAULT_BASE_URL,\n envKey: 'OPENAI_API_KEY',\n responseFormats: ['opus', 'mp3', 'aac', 'flac', 'wav', 'pcm'],\n defaultResponseFormat: 'opus',\n voiceCompatibleResponseFormats: ['opus'],\n apiErrorLabel: 'OpenAI TTS error',\n missingApiKeyError: 'OpenAI TTS API key missing (set OPENAI_API_KEY or providers.openai.apiKey)',\n});\n\n// Self-register at module load so the registry is populated when this file is\n// imported via providers/index.ts (side-effect aggregator).\nregisterSpeechProvider(openAiSpeechProvider);\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,MAAa,oBAAoB;CAC/B;CACA;CACA;CACD;AAED,MAAa,oBAAoB;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAKD,MAAa,uBAAuB,qCAAqC;CACvE,IAAI;CACJ,OAAO;CACP,iBAAiB;CACjB,QAAQ;CACR,QAAQ;CACR,cAAc;CACd,cAAc;CACd,gBAVA,QAAQ,IAAI,qBAAqB,MAAM,CAAC,QAAQ,QAAQ,GAAG,IAAI;CAW/D,QAAQ;CACR,iBAAiB;EAAC;EAAQ;EAAO;EAAO;EAAQ;EAAO;EAAM;CAC7D,uBAAuB;CACvB,gCAAgC,CAAC,OAAO;CACxC,eAAe;CACf,oBAAoB;CACrB,CAAC;AAIF,uBAAuB,qBAAqB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sentence-boundary.js","names":[],"sources":["../../../../src/voice/tts/sentence-boundary.ts"],"sourcesContent":["/**\n * Truncate text at a sentence or word boundary (TTS-friendly).\n */\nexport function truncateAtSentenceBoundary(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n\n const truncated = text.slice(0, maxLength);\n const sentenceEndRegex = /[.!?。!?]\\s*/g;\n let lastSentenceEnd = -1;\n let match: RegExpExecArray | null;\n\n while ((match = sentenceEndRegex.exec(truncated)) !== null) {\n lastSentenceEnd = match.index + match[0].length;\n }\n\n if (lastSentenceEnd > maxLength * 0.6) {\n return truncated.slice(0, lastSentenceEnd).trim();\n }\n\n const lastSpace = truncated.lastIndexOf(' ');\n if (lastSpace > maxLength * 0.8) {\n return `${truncated.slice(0, lastSpace).trim()}...`;\n }\n\n return `${truncated.trim()}...`;\n}\n"],"mappings":";;;;AAGA,SAAgB,2BAA2B,MAAc,WAA2B;AAClF,KAAI,KAAK,UAAU,UAAW,QAAO;CAErC,MAAM,YAAY,KAAK,MAAM,GAAG,UAAU;CAC1C,MAAM,mBAAmB;CACzB,IAAI,kBAAkB;CACtB,IAAI;AAEJ,SAAQ,QAAQ,iBAAiB,KAAK,UAAU,MAAM,KACpD,mBAAkB,MAAM,QAAQ,MAAM,GAAG;AAG3C,KAAI,kBAAkB,YAAY,GAChC,QAAO,UAAU,MAAM,GAAG,gBAAgB,CAAC,MAAM;CAGnD,MAAM,YAAY,UAAU,YAAY,IAAI;AAC5C,KAAI,YAAY,YAAY,GAC1B,QAAO,GAAG,UAAU,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;AAGjD,QAAO,GAAG,UAAU,MAAM,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","names":[],"sources":["../../../../src/voice/tts/service.ts"],"sourcesContent":["import type { TTSConfig, TTSAutoMode, TTSResultWithTracking } from './types.js';\n\nexport interface ChannelAudioFormat {\n format: string;\n voiceCompatible: boolean;\n}\n\n/** Per-channel encoding for outbound TTS. Only ids that xopc actually delivers on are listed; anything else uses `default`. */\nconst CHANNEL_OUTPUT_FORMATS: Record<string, ChannelAudioFormat> = {\n telegram: { format: 'opus', voiceCompatible: true },\n /** Weixin ilink: VoiceItem encode_type 7 = MP3 per API types. */\n weixin: { format: 'mp3', voiceCompatible: true },\n webchat: { format: 'mp3', voiceCompatible: false },\n cli: { format: 'mp3', voiceCompatible: false },\n default: { format: 'mp3', voiceCompatible: false },\n};\n\nexport function getChannelOutputFormat(channel?: string): ChannelAudioFormat {\n if (!channel) return CHANNEL_OUTPUT_FORMATS.default;\n return CHANNEL_OUTPUT_FORMATS[channel.toLowerCase()] || CHANNEL_OUTPUT_FORMATS.default;\n}\n\nexport function getSupportedChannels(): string[] {\n return Object.keys(CHANNEL_OUTPUT_FORMATS).filter((k) => k !== 'default');\n}\n\nexport function isVoiceCompatibleChannel(channel: string): boolean {\n return getChannelOutputFormat(channel).voiceCompatible;\n}\n\nexport interface TTSContext {\n channel?: string;\n chatId?: string;\n}\n\nexport interface TTSDecision {\n useTTS: boolean;\n reason: string;\n}\n\nexport function shouldUseTTS(config: TTSConfig | undefined, inboundAudio?: boolean): TTSDecision {\n if (!config?.enabled) {\n return { useTTS: false, reason: 'TTS disabled' };\n }\n\n const trigger = (config.trigger ?? 'off') as string;\n\n switch (trigger) {\n case 'off':\n return { useTTS: false, reason: 'trigger=off' };\n case 'always':\n return { useTTS: true, reason: 'trigger=always' };\n case 'inbound':\n return inboundAudio === true\n ? { useTTS: true, reason: 'trigger=inbound + inboundAudio=true' }\n : { useTTS: false, reason: 'trigger=inbound but no inbound audio' };\n case 'tagged':\n return { useTTS: false, reason: 'trigger=tagged (directive check in TTS module)' };\n default:\n return { useTTS: false, reason: `unknown trigger=${trigger}` };\n }\n}\n\nexport class TTSService {\n constructor(private config: TTSConfig) {}\n\n isEnabled(): boolean {\n return this.config.enabled;\n }\n\n getTriggerMode(): TTSAutoMode {\n return this.config.trigger;\n }\n\n async speak(text: string, context?: TTSContext): Promise<TTSResultWithTracking> {\n // Direct dynamic import of `./speak-core.js` — going through `./index.js`\n // pulls the full barrel, which re-exports this file and forms a cycle.\n const { speak } = await import('./speak-core.js');\n return speak(text, this.config, {\n tts: {\n format: getChannelOutputFormat(context?.channel).format as 'opus' | 'mp3' | 'wav',\n },\n });\n }\n}\n"],"mappings":";;AAQA,MAAM,yBAA6D;CACjE,UAAU;EAAE,QAAQ;EAAQ,iBAAiB;EAAM;;CAEnD,QAAQ;EAAE,QAAQ;EAAO,iBAAiB;EAAM;CAChD,SAAS;EAAE,QAAQ;EAAO,iBAAiB;EAAO;CAClD,KAAK;EAAE,QAAQ;EAAO,iBAAiB;EAAO;CAC9C,SAAS;EAAE,QAAQ;EAAO,iBAAiB;EAAO;CACnD;AAED,SAAgB,uBAAuB,SAAsC;AAC3E,KAAI,CAAC,QAAS,QAAO,uBAAuB;AAC5C,QAAO,uBAAuB,QAAQ,aAAa,KAAK,uBAAuB;;AAGjF,SAAgB,uBAAiC;AAC/C,QAAO,OAAO,KAAK,uBAAuB,CAAC,QAAQ,MAAM,MAAM,UAAU;;AAG3E,SAAgB,yBAAyB,SAA0B;AACjE,QAAO,uBAAuB,QAAQ,CAAC;;AAazC,SAAgB,aAAa,QAA+B,cAAqC;AAC/F,KAAI,CAAC,QAAQ,QACX,QAAO;EAAE,QAAQ;EAAO,QAAQ;EAAgB;CAGlD,MAAM,UAAW,OAAO,WAAW;AAEnC,SAAQ,SAAR;EACE,KAAK,MACH,QAAO;GAAE,QAAQ;GAAO,QAAQ;GAAe;EACjD,KAAK,SACH,QAAO;GAAE,QAAQ;GAAM,QAAQ;GAAkB;EACnD,KAAK,UACH,QAAO,iBAAiB,OACpB;GAAE,QAAQ;GAAM,QAAQ;GAAuC,GAC/D;GAAE,QAAQ;GAAO,QAAQ;GAAwC;EACvE,KAAK,SACH,QAAO;GAAE,QAAQ;GAAO,QAAQ;GAAkD;EACpF,QACE,QAAO;GAAE,QAAQ;GAAO,QAAQ,mBAAmB;GAAW;;;AAIpE,IAAa,aAAb,MAAwB;CACtB,YAAY,QAA2B;AAAnB,OAAA,SAAA;;CAEpB,YAAqB;AACnB,SAAO,KAAK,OAAO;;CAGrB,iBAA8B;AAC5B,SAAO,KAAK,OAAO;;CAGrB,MAAM,MAAM,MAAc,SAAsD;EAG9E,MAAM,EAAE,UAAU,MAAM,OAAO;AAC/B,SAAO,MAAM,MAAM,KAAK,QAAQ,EAC9B,KAAK,EACH,QAAQ,uBAAuB,SAAS,QAAQ,CAAC,QAClD,EACF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"speak-core.js","names":[],"sources":["../../../../src/voice/tts/speak-core.ts"],"sourcesContent":["/**\n * speak-core — orchestrates per-call TTS synthesis through the SpeechProviderPlugin chain.\n *\n * Provider invocation goes through `plugin.synthesize` / `plugin.synthesizeStream`.\n * Streaming consumers (Telegram draft etc.) use `speakStream`; providers without\n * `synthesizeStream` automatically fall back to `synthesize` wrapped as a\n * single-chunk ReadableStream (see wrapBufferAsStream).\n *\n * Directive overrides are routed via per-provider buckets (`overrides.openai`,\n * `overrides.minimax`, …). The bucket whose key matches the currently active\n * provider id wins; cross-provider keys are ignored.\n *\n * `cfg: Config` is threaded through `SpeakOptions.appConfig`. The orchestrator\n * does NOT auto-summarize / preprocess for `speakStream` beyond the same path\n * as `speak`; streaming is a transport optimization, not a different semantic.\n */\n\nimport type { Config } from '../../config/schema.js';\nimport { createLogger } from '../../utils/logger.js';\n\nimport { parseTtsDirectives } from './directives.js';\nimport { resolveSpeechProviderChain, resolveSpeechProvider, type ResolvedSpeechProvider } from './factory.js';\nimport { preprocessText, type PreprocessOptions, type PreprocessResult } from './preprocess.js';\nimport type {\n SpeechProviderOverrides,\n SpeechSynthesisRequest,\n SpeechSynthesisResult,\n SpeechSynthesisStreamRequest,\n SpeechSynthesisStreamResult,\n} from './speech-provider-types.js';\nimport { summarizeForTts } from './summarize.js';\nimport type {\n ProviderAttempt,\n ProviderFailureReason,\n TTSConfig,\n TTSModelOverrideConfig,\n TTSOptions,\n TTSProvider,\n TTSResultWithTracking,\n TtsDirectiveOverrides,\n} from './types.js';\n\nconst log = createLogger('TTS');\n\nexport interface SpeakOptions {\n tts?: TTSOptions;\n preprocess?: PreprocessOptions;\n parseDirectives?: boolean;\n modelOverrides?: TTSModelOverrideConfig;\n appConfig?: Config;\n /** Optional caller-supplied AbortSignal (currently passed through to providers via timeoutMs guard only). */\n signal?: AbortSignal;\n}\n\n/** Pulls the override bucket for a given provider id from the directive overrides. */\nfunction pickProviderOverrides(\n overrides: TtsDirectiveOverrides | undefined,\n providerId: TTSProvider,\n): SpeechProviderOverrides | undefined {\n if (!overrides) return undefined;\n const bucket = (overrides as Record<string, unknown>)[providerId];\n if (bucket && typeof bucket === 'object') {\n return bucket as SpeechProviderOverrides;\n }\n return undefined;\n}\n\n/** Merges TTSOptions (caller-supplied) with directive bucket. Directive wins on overlap. */\nfunction mergeOverrides(\n ttsOptions: TTSOptions | undefined,\n directiveBucket: SpeechProviderOverrides | undefined,\n): SpeechProviderOverrides | undefined {\n const merged: Record<string, unknown> = {};\n if (ttsOptions?.voice) merged.voice = ttsOptions.voice;\n if (ttsOptions?.model) merged.model = ttsOptions.model;\n if (ttsOptions?.speed) merged.speed = ttsOptions.speed;\n if (directiveBucket) {\n Object.assign(merged, directiveBucket);\n }\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction classifyError(error: unknown): ProviderFailureReason {\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n if (message.includes('not configured') || message.includes('api key')) {\n return 'not_configured';\n }\n if (message.includes('timeout') || message.includes('timed out') || message.includes('aborted')) {\n return 'timeout';\n }\n if (message.includes('too long') || message.includes('text length') || message.includes('exceeds')) {\n return 'text_too_long';\n }\n return 'provider_error';\n }\n return 'unknown';\n}\n\n/** Common pre-flight: directive parse → preprocess → optional summarize. */\nasync function prepareTextForSynthesis(\n text: string,\n config: TTSConfig,\n options: SpeakOptions | undefined,\n): Promise<{\n text: string;\n wasPreprocessed: boolean;\n wasSummarized: boolean;\n ttsOptions: TTSOptions | undefined;\n directiveOverrides: TtsDirectiveOverrides | undefined;\n selectedProvider: TTSProvider;\n}> {\n let ttsText = text;\n let ttsOptions = options?.tts;\n let directiveOverrides: TtsDirectiveOverrides | undefined;\n let selectedProvider: TTSProvider = config.provider;\n\n if (options?.parseDirectives !== false && config.modelOverrides?.enabled) {\n const directiveResult = parseTtsDirectives(text, config.modelOverrides);\n ttsText = directiveResult.ttsText || directiveResult.cleanedText;\n directiveOverrides = directiveResult.overrides;\n if (directiveResult.overrides?.provider) {\n selectedProvider = directiveResult.overrides.provider;\n }\n }\n\n const maxLength = config.maxTextLength || 4096;\n const preprocessOptions: PreprocessOptions = {\n maxLength,\n stripMarkdown: true,\n normalizeWhitespace: true,\n ...options?.preprocess,\n };\n\n let preprocessResult: PreprocessResult = preprocessText(ttsText, preprocessOptions);\n const wasPreprocessed =\n preprocessResult.wasTruncated || preprocessResult.originalLength !== preprocessResult.finalLength;\n\n let wasSummarized = false;\n const sumCfg = config.summarization;\n const threshold = sumCfg?.threshold ?? maxLength;\n if (sumCfg?.enabled !== false && preprocessResult.text.length > threshold) {\n const summarizeResult = await summarizeForTts({\n text: preprocessResult.text,\n targetLength: sumCfg?.targetLength ?? maxLength,\n config: options?.appConfig,\n modelRef: sumCfg?.model,\n });\n if (summarizeResult.wasSummarized) {\n preprocessResult = {\n ...preprocessResult,\n text: summarizeResult.summary,\n finalLength: summarizeResult.summaryLength,\n wasTruncated: false,\n };\n wasSummarized = true;\n log.info(\n {\n originalLength: summarizeResult.originalLength,\n summaryLength: summarizeResult.summaryLength,\n },\n 'Text summarized before TTS',\n );\n }\n }\n\n return {\n text: preprocessResult.text,\n wasPreprocessed,\n wasSummarized,\n ttsOptions,\n directiveOverrides,\n selectedProvider,\n };\n}\n\n/** Build the SpeechSynthesisRequest from a resolved provider + prepared text. */\nfunction buildSynthesisRequest(\n resolved: ResolvedSpeechProvider,\n preparedText: string,\n ttsOptions: TTSOptions | undefined,\n directiveOverrides: TtsDirectiveOverrides | undefined,\n appConfig: Config | undefined,\n target: 'audio-file' | 'voice-note',\n): SpeechSynthesisRequest {\n const directiveBucket = pickProviderOverrides(directiveOverrides, resolved.providerId);\n const providerOverrides = mergeOverrides(ttsOptions, directiveBucket);\n const callTimeoutMs = ttsOptions?.timeoutMs ?? resolved.timeoutMs;\n return {\n text: preparedText,\n cfg: appConfig as Config,\n providerConfig: resolved.providerConfig,\n target,\n timeoutMs: callTimeoutMs,\n ...(providerOverrides ? { providerOverrides } : {}),\n };\n}\n\n/** Convert SpeechSynthesisResult → TTSResult shape (audio/format/provider). */\nfunction toTtsResult(\n resolved: ResolvedSpeechProvider,\n result: SpeechSynthesisResult,\n durationSeconds: number | undefined,\n): { audio: Buffer; format: string; provider: string; duration?: number } {\n return {\n audio: result.audioBuffer,\n format: result.outputFormat,\n provider: resolved.providerId,\n ...(durationSeconds !== undefined ? { duration: durationSeconds } : {}),\n };\n}\n\n// ---- Public API ---------------------------------------------------------\n\n/**\n * Run the TTS chain (primary → fallback) and return the first successful result.\n */\nexport async function speak(\n text: string,\n config: TTSConfig,\n options?: SpeakOptions,\n): Promise<TTSResultWithTracking> {\n if (!config.enabled) {\n throw new Error('TTS is not enabled');\n }\n if (config.trigger === 'tagged' && !/\\[\\[tts/.test(text)) {\n throw new Error('TTS trigger is tagged but no [[tts]] directive found');\n }\n\n const prepared = await prepareTextForSynthesis(text, config, options);\n const chain = resolveSpeechProviderChain(config);\n\n // Reorder so the directive-selected provider (if registered + configured) goes first.\n const orderedChain = (() => {\n const idx = chain.findIndex((c) => c.providerId === prepared.selectedProvider);\n if (idx <= 0) return chain;\n const reordered = [...chain];\n const [picked] = reordered.splice(idx, 1);\n if (picked) {\n reordered.unshift(picked);\n }\n return reordered;\n })();\n\n const attempts: ProviderAttempt[] = [];\n const attemptedProviders: string[] = [];\n let lastError: Error | undefined;\n\n for (const resolved of orderedChain) {\n const startTime = Date.now();\n attemptedProviders.push(resolved.providerId);\n\n if (typeof resolved.plugin.synthesize !== 'function') {\n attempts.push({\n provider: resolved.providerId,\n outcome: 'skipped',\n reasonCode: 'not_configured',\n latencyMs: Date.now() - startTime,\n error: `Provider \"${resolved.providerId}\" does not implement synthesize()`,\n });\n continue;\n }\n\n try {\n log.debug(\n { textLength: prepared.text.length, provider: resolved.providerId },\n 'Converting text to speech',\n );\n const request = buildSynthesisRequest(\n resolved,\n prepared.text,\n prepared.ttsOptions,\n prepared.directiveOverrides,\n options?.appConfig,\n 'audio-file',\n );\n const result = await resolved.plugin.synthesize(request);\n const durationSeconds = (Date.now() - startTime) / 1000;\n attempts.push({\n provider: resolved.providerId,\n outcome: 'success',\n reasonCode: 'success',\n latencyMs: Date.now() - startTime,\n });\n\n const primaryProvider = orderedChain[0]!.providerId;\n const fallbackFrom = resolved.providerId !== primaryProvider ? primaryProvider : undefined;\n if (fallbackFrom) {\n log.info(\n { primaryProvider: fallbackFrom, actualProvider: resolved.providerId, attempts },\n 'TTS used fallback provider',\n );\n } else {\n log.info(\n { provider: resolved.providerId, format: result.outputFormat, size: result.audioBuffer.length },\n 'TTS succeeded',\n );\n }\n\n return {\n ...toTtsResult(resolved, result, durationSeconds),\n attempts,\n ...(fallbackFrom ? { fallbackFrom } : {}),\n attemptedProviders,\n wasPreprocessed: prepared.wasPreprocessed,\n ttsText: prepared.text,\n wasSummarized: prepared.wasSummarized,\n };\n } catch (error) {\n const latencyMs = Date.now() - startTime;\n const reasonCode = classifyError(error);\n const errorMsg = error instanceof Error ? error.message : String(error);\n attempts.push({\n provider: resolved.providerId,\n outcome: 'failed',\n reasonCode,\n latencyMs,\n error: errorMsg,\n });\n lastError = error instanceof Error ? error : new Error(String(error));\n log.warn(\n { provider: resolved.providerId, errorMessage: errorMsg, reasonCode, latencyMs },\n 'TTS provider failed, trying next',\n );\n }\n }\n\n log.error({ attempts, attemptedProviders }, 'All TTS providers failed');\n throw (\n lastError ?? new Error(`All TTS providers failed: ${attempts.map((a) => a.error).join('; ')}`)\n );\n}\n\n/** Single-provider variant; bypasses the fallback chain. */\nexport async function speakWithProvider(\n text: string,\n config: TTSConfig,\n providerName: TTSProvider,\n options?: SpeakOptions,\n): Promise<TTSResultWithTracking> {\n if (!config.enabled) {\n throw new Error('TTS is not enabled');\n }\n const resolved = resolveSpeechProvider(providerName, config);\n if (!resolved) {\n throw new Error(`Provider '${providerName}' is not available`);\n }\n if (typeof resolved.plugin.synthesize !== 'function') {\n throw new Error(`Provider '${providerName}' does not implement synthesize()`);\n }\n\n const prepared = await prepareTextForSynthesis(text, config, options);\n const startTime = Date.now();\n const request = buildSynthesisRequest(\n resolved,\n prepared.text,\n prepared.ttsOptions,\n prepared.directiveOverrides,\n options?.appConfig,\n 'audio-file',\n );\n const result = await resolved.plugin.synthesize(request);\n const durationSeconds = (Date.now() - startTime) / 1000;\n\n return {\n ...toTtsResult(resolved, result, durationSeconds),\n attempts: [\n {\n provider: providerName,\n outcome: 'success',\n reasonCode: 'success',\n latencyMs: Date.now() - startTime,\n },\n ],\n attemptedProviders: [providerName],\n wasPreprocessed: prepared.wasPreprocessed,\n ttsText: prepared.text,\n wasSummarized: prepared.wasSummarized,\n };\n}\n\n// ---- Streaming surface --------------------------------------------------\n\nexport interface SpeakStreamResult {\n /** Audio chunks. Caller is responsible for consuming the stream. */\n audioStream: ReadableStream<Uint8Array>;\n outputFormat: string;\n fileExtension: string;\n voiceCompatible: boolean;\n /** Provider id that produced this stream. */\n provider: TTSProvider;\n /** Cleanup hook (close sockets etc.). Always defined; no-op when nothing to release. */\n release: () => Promise<void>;\n /** Pre-flight metadata (after directive parse / preprocess / summarize). */\n ttsText: string;\n wasPreprocessed: boolean;\n wasSummarized: boolean;\n}\n\n/**\n * Streaming TTS — tries the chain and returns the first provider's stream.\n * Providers without `synthesizeStream` are wrapped via wrapBufferAsStream.\n */\nexport async function speakStream(\n text: string,\n config: TTSConfig,\n options?: SpeakOptions,\n): Promise<SpeakStreamResult> {\n if (!config.enabled) {\n throw new Error('TTS is not enabled');\n }\n if (config.trigger === 'tagged' && !/\\[\\[tts/.test(text)) {\n throw new Error('TTS trigger is tagged but no [[tts]] directive found');\n }\n\n const prepared = await prepareTextForSynthesis(text, config, options);\n const chain = resolveSpeechProviderChain(config);\n\n let lastError: Error | undefined;\n for (const resolved of chain) {\n try {\n const baseRequest: SpeechSynthesisStreamRequest = buildSynthesisRequest(\n resolved,\n prepared.text,\n prepared.ttsOptions,\n prepared.directiveOverrides,\n options?.appConfig,\n 'voice-note',\n );\n\n let streamResult: SpeechSynthesisStreamResult;\n if (typeof resolved.plugin.synthesizeStream === 'function') {\n streamResult = await resolved.plugin.synthesizeStream(baseRequest);\n } else if (typeof resolved.plugin.synthesize === 'function') {\n // Fallback: buffer-then-wrap. Documented behavior: callers see a\n // single-chunk stream with the same outputFormat.\n const bufferResult = await resolved.plugin.synthesize(baseRequest);\n streamResult = wrapBufferAsStream(bufferResult);\n } else {\n throw new Error(\n `Provider \"${resolved.providerId}\" implements neither synthesize nor synthesizeStream`,\n );\n }\n\n log.info(\n {\n provider: resolved.providerId,\n outputFormat: streamResult.outputFormat,\n voiceCompatible: streamResult.voiceCompatible,\n streamed: typeof resolved.plugin.synthesizeStream === 'function',\n },\n 'TTS stream ready',\n );\n\n const release = streamResult.release ?? (async () => {});\n return {\n audioStream: streamResult.audioStream,\n outputFormat: streamResult.outputFormat,\n fileExtension: streamResult.fileExtension,\n voiceCompatible: streamResult.voiceCompatible,\n provider: resolved.providerId,\n release,\n ttsText: prepared.text,\n wasPreprocessed: prepared.wasPreprocessed,\n wasSummarized: prepared.wasSummarized,\n };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n log.warn(\n { err: lastError, provider: resolved.providerId },\n `TTS stream provider \"${resolved.providerId}\" failed, trying next`,\n );\n }\n }\n throw lastError ?? new Error('All TTS providers failed (streaming)');\n}\n\n/** Wrap a one-shot synthesis result into a single-chunk stream (no-op release). */\nfunction wrapBufferAsStream(result: SpeechSynthesisResult): SpeechSynthesisStreamResult {\n const { audioBuffer } = result;\n const audioStream = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(new Uint8Array(audioBuffer));\n controller.close();\n },\n });\n return {\n audioStream,\n outputFormat: result.outputFormat,\n fileExtension: result.fileExtension,\n voiceCompatible: result.voiceCompatible,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"speech-registry.js","names":[],"sources":["../../../../src/voice/tts/speech-registry.ts"],"sourcesContent":["/**\n * SpeechProviderRegistry — central lookup for SpeechProviderPlugin instances.\n *\n * Per docs/voice-rearchitecture.md §11:\n * - Bundled providers (openai/alibaba/edge/minimax/local-cli) self-register at\n * module load time via `registerSpeechProvider()`.\n * - Extension-loaded providers register through `extensions/sdk/speech.ts`\n * re-exports of the same registration call.\n * - Lookup is case-insensitive on `id` and `aliases`.\n * - Re-registering the same id LOGS a warning and OVERWRITES (later registration\n * wins — used by user extensions to override bundled defaults).\n *\n * DECISION: We do NOT separate \"loaded vs configured\" the way openclaw does\n * (their `listLoadedSpeechProviders` vs `listSpeechProviders`). xopc's extension\n * model is much simpler — extensions either load successfully or they don't.\n * If a provider is in the registry, it's loaded; whether it's configured is a\n * runtime question answered by `provider.isConfigured(ctx)`.\n */\n\nimport { createLogger } from '../../utils/logger.js';\n\nimport type { SpeechProviderId, SpeechProviderPlugin } from './speech-provider-types.js';\n\nconst log = createLogger('SpeechRegistry');\n\nconst registry = new Map<string, SpeechProviderPlugin>();\n\nfunction normalizeId(id: string): string {\n return id.trim().toLowerCase();\n}\n\nfunction indexProvider(provider: SpeechProviderPlugin): string[] {\n const keys = [normalizeId(provider.id)];\n for (const alias of provider.aliases ?? []) {\n keys.push(normalizeId(alias));\n }\n return keys;\n}\n\n/**\n * Register a speech provider. Safe to call multiple times during boot — later\n * registrations overwrite earlier ones for the same id (with a warn log).\n *\n * Returns an unregister function for tests / hot-reload scenarios.\n */\nexport function registerSpeechProvider(provider: SpeechProviderPlugin): () => void {\n const keys = indexProvider(provider);\n const conflicts: string[] = [];\n for (const key of keys) {\n if (registry.has(key)) {\n conflicts.push(key);\n }\n }\n if (conflicts.length > 0) {\n log.warn(\n { providerId: provider.id, conflicts },\n `Speech provider \"${provider.id}\" overrides existing registration(s): ${conflicts.join(', ')}`,\n );\n }\n for (const key of keys) {\n registry.set(key, provider);\n }\n return () => {\n for (const key of keys) {\n const current = registry.get(key);\n if (current === provider) {\n registry.delete(key);\n }\n }\n };\n}\n\n/**\n * Look up a provider by id or alias (case-insensitive). Returns undefined when\n * no provider matches — callers must NOT throw here; the orchestrator decides\n * whether the absence is fatal or means \"skip and try next provider\".\n */\nexport function getSpeechProvider(id: SpeechProviderId): SpeechProviderPlugin | undefined {\n return registry.get(normalizeId(id));\n}\n\n/**\n * Resolve the canonical id for a provider lookup key (id or alias).\n * Useful for normalizing config strings before persistence.\n */\nexport function canonicalizeSpeechProviderId(id: SpeechProviderId): SpeechProviderId | undefined {\n return registry.get(normalizeId(id))?.id;\n}\n\n/**\n * List all registered providers. Order is registration order (Map preserves\n * insertion order, and we de-dup by id at registration time).\n */\nexport function listSpeechProviders(): SpeechProviderPlugin[] {\n const seen = new Set<SpeechProviderPlugin>();\n const result: SpeechProviderPlugin[] = [];\n for (const provider of registry.values()) {\n if (!seen.has(provider)) {\n seen.add(provider);\n result.push(provider);\n }\n }\n return result;\n}\n\n/** Test-only: clear the registry. Not exported from the public barrel. */\nexport function _clearSpeechRegistryForTests(): void {\n registry.clear();\n}\n"],"mappings":";;;aAmBqD;AAIrD,MAAM,MAAM,aAAa,iBAAiB;AAE1C,MAAM,2BAAW,IAAI,KAAmC;AAExD,SAAS,YAAY,IAAoB;AACvC,QAAO,GAAG,MAAM,CAAC,aAAa;;AAGhC,SAAS,cAAc,UAA0C;CAC/D,MAAM,OAAO,CAAC,YAAY,SAAS,GAAG,CAAC;AACvC,MAAK,MAAM,SAAS,SAAS,WAAW,EAAE,CACxC,MAAK,KAAK,YAAY,MAAM,CAAC;AAE/B,QAAO;;;;;;;;AAST,SAAgB,uBAAuB,UAA4C;CACjF,MAAM,OAAO,cAAc,SAAS;CACpC,MAAM,YAAsB,EAAE;AAC9B,MAAK,MAAM,OAAO,KAChB,KAAI,SAAS,IAAI,IAAI,CACnB,WAAU,KAAK,IAAI;AAGvB,KAAI,UAAU,SAAS,EACrB,KAAI,KACF;EAAE,YAAY,SAAS;EAAI;EAAW,EACtC,oBAAoB,SAAS,GAAG,wCAAwC,UAAU,KAAK,KAAK,GAC7F;AAEH,MAAK,MAAM,OAAO,KAChB,UAAS,IAAI,KAAK,SAAS;AAE7B,cAAa;AACX,OAAK,MAAM,OAAO,KAEhB,KADgB,SAAS,IAAI,IAClB,KAAK,SACd,UAAS,OAAO,IAAI;;;;;;;;AAW5B,SAAgB,kBAAkB,IAAwD;AACxF,QAAO,SAAS,IAAI,YAAY,GAAG,CAAC;;;;;;AAOtC,SAAgB,6BAA6B,IAAoD;AAC/F,QAAO,SAAS,IAAI,YAAY,GAAG,CAAC,EAAE;;;;;;AAOxC,SAAgB,sBAA8C;CAC5D,MAAM,uBAAO,IAAI,KAA2B;CAC5C,MAAM,SAAiC,EAAE;AACzC,MAAK,MAAM,YAAY,SAAS,QAAQ,CACtC,KAAI,CAAC,KAAK,IAAI,SAAS,EAAE;AACvB,OAAK,IAAI,SAAS;AAClB,SAAO,KAAK,SAAS;;AAGzB,QAAO;;;AAIT,SAAgB,+BAAqC;AACnD,UAAS,OAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"status-tracker.js","names":[],"sources":["../../../../src/voice/tts/status-tracker.ts"],"sourcesContent":["import type { TtsRuntimeStatus, TtsStatusEntry } from './types.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('TTS:StatusTracker');\n\nconst MAX_RECENT_ENTRIES = 20;\n\nclass TtsStatusTrackerImpl {\n private recentEntries: TtsStatusEntry[] = [];\n private totalCalls = 0;\n private totalSuccesses = 0;\n private totalFailures = 0;\n\n recordAttempt(entry: TtsStatusEntry): void {\n this.recentEntries.push(entry);\n this.totalCalls += 1;\n\n if (entry.success) {\n this.totalSuccesses += 1;\n } else {\n this.totalFailures += 1;\n }\n\n if (this.recentEntries.length > MAX_RECENT_ENTRIES) {\n this.recentEntries.shift();\n }\n\n log.debug(\n {\n success: entry.success,\n provider: entry.provider,\n latencyMs: entry.latencyMs,\n totalCalls: this.totalCalls,\n },\n 'TTS attempt recorded',\n );\n }\n\n getStatus(): TtsRuntimeStatus {\n const recentSuccesses = this.recentEntries.filter((e) => e.success).length;\n const recentTotal = this.recentEntries.length;\n\n return {\n lastAttempt:\n this.recentEntries.length > 0\n ? this.recentEntries[this.recentEntries.length - 1]\n : undefined,\n recentSuccessRate: recentTotal > 0 ? recentSuccesses / recentTotal : undefined,\n totalCalls: this.totalCalls,\n totalSuccesses: this.totalSuccesses,\n totalFailures: this.totalFailures,\n };\n }\n\n getRecentEntries(count?: number): TtsStatusEntry[] {\n const limit = count ?? MAX_RECENT_ENTRIES;\n return this.recentEntries.slice(-limit);\n }\n\n reset(): void {\n this.recentEntries = [];\n this.totalCalls = 0;\n this.totalSuccesses = 0;\n this.totalFailures = 0;\n }\n}\n\nexport const ttsStatusTracker = new TtsStatusTrackerImpl();\n\nexport function recordTtsSuccess(params: {\n provider: string;\n latencyMs: number;\n textLength: number;\n audioSize: number;\n audioFormat: string;\n usedFallback?: boolean;\n wasSummarized?: boolean;\n}): void {\n ttsStatusTracker.recordAttempt({\n timestamp: Date.now(),\n success: true,\n ...params,\n });\n}\n\nexport function recordTtsFailure(params: {\n provider?: string;\n latencyMs: number;\n textLength: number;\n error: string;\n}): void {\n ttsStatusTracker.recordAttempt({\n timestamp: Date.now(),\n success: false,\n ...params,\n });\n}\n"],"mappings":";;;aACqD;AAErD,MAAM,MAAM,aAAa,oBAAoB;AAE7C,MAAM,qBAAqB;AAE3B,IAAM,uBAAN,MAA2B;CACzB,gBAA0C,EAAE;CAC5C,aAAqB;CACrB,iBAAyB;CACzB,gBAAwB;CAExB,cAAc,OAA6B;AACzC,OAAK,cAAc,KAAK,MAAM;AAC9B,OAAK,cAAc;AAEnB,MAAI,MAAM,QACR,MAAK,kBAAkB;MAEvB,MAAK,iBAAiB;AAGxB,MAAI,KAAK,cAAc,SAAS,mBAC9B,MAAK,cAAc,OAAO;AAG5B,MAAI,MACF;GACE,SAAS,MAAM;GACf,UAAU,MAAM;GAChB,WAAW,MAAM;GACjB,YAAY,KAAK;GAClB,EACD,uBACD;;CAGH,YAA8B;EAC5B,MAAM,kBAAkB,KAAK,cAAc,QAAQ,MAAM,EAAE,QAAQ,CAAC;EACpE,MAAM,cAAc,KAAK,cAAc;AAEvC,SAAO;GACL,aACE,KAAK,cAAc,SAAS,IACxB,KAAK,cAAc,KAAK,cAAc,SAAS,KAC/C,KAAA;GACN,mBAAmB,cAAc,IAAI,kBAAkB,cAAc,KAAA;GACrE,YAAY,KAAK;GACjB,gBAAgB,KAAK;GACrB,eAAe,KAAK;GACrB;;CAGH,iBAAiB,OAAkC;EACjD,MAAM,QAAQ,SAAS;AACvB,SAAO,KAAK,cAAc,MAAM,CAAC,MAAM;;CAGzC,QAAc;AACZ,OAAK,gBAAgB,EAAE;AACvB,OAAK,aAAa;AAClB,OAAK,iBAAiB;AACtB,OAAK,gBAAgB;;;AAIzB,MAAa,mBAAmB,IAAI,sBAAsB;AAE1D,SAAgB,iBAAiB,QAQxB;AACP,kBAAiB,cAAc;EAC7B,WAAW,KAAK,KAAK;EACrB,SAAS;EACT,GAAG;EACJ,CAAC;;AAGJ,SAAgB,iBAAiB,QAKxB;AACP,kBAAiB,cAAc;EAC7B,WAAW,KAAK,KAAK;EACrB,SAAS;EACT,GAAG;EACJ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"summarize.js","names":[],"sources":["../../../../src/voice/tts/summarize.ts"],"sourcesContent":["import { type UserMessage } from '@earendil-works/pi-ai/compat';\nimport type { Api, Model } from '@earendil-works/pi-ai';\n\nimport type { Config } from '../../config/schema.js';\nimport { getDefaultModelSync, resolveModel } from '../../providers/index.js';\nimport { completeWithResolvedCredentials } from '../../providers/model-call.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { truncateAtSentenceBoundary } from './sentence-boundary.js';\n\nconst log = createLogger('TTS:Summarize');\n\nconst SUMMARIZE_TIMEOUT_MS = 45_000;\n\nconst SUMMARIZE_SYSTEM_PROMPT = `You are a text summarizer for a text-to-speech system.\nYour task is to condense the given text while preserving the key information and meaning.\n\nRules:\n1. Output ONLY the summarized text, no explanations or meta-commentary\n2. Keep the summary in the same language as the input\n3. Preserve key facts, numbers, names, and conclusions\n4. Use natural, spoken language suitable for audio playback\n5. Remove code blocks, URLs, markdown formatting, and technical syntax where possible\n6. Keep the summary under the specified character limit\n7. End with a complete sentence, never mid-sentence`;\n\nexport interface SummarizeForTtsOptions {\n text: string;\n targetLength: number;\n config?: Config;\n modelRef?: string;\n signal?: AbortSignal;\n}\n\nexport interface SummarizeResult {\n summary: string;\n originalLength: number;\n summaryLength: number;\n wasSummarized: boolean;\n}\n\nfunction resolveSummarizeModel(config: Config | undefined, modelRef?: string): Model<Api> {\n const envRef = process.env.XOPC_TTS_SUMMARIZE_MODEL?.trim();\n const ref = modelRef?.trim() || envRef;\n if (ref) {\n try {\n return resolveModel(ref);\n } catch {\n /* fall through */\n }\n }\n for (const candidate of ['openai/gpt-5.6-luna', 'google/gemini-3.5-flash']) {\n try {\n return resolveModel(candidate);\n } catch {\n /* next */\n }\n }\n return resolveModel(getDefaultModelSync(config));\n}\n\nfunction fallbackTruncate(text: string, maxLength: number): SummarizeResult {\n const truncated = truncateAtSentenceBoundary(text, maxLength);\n return {\n summary: truncated,\n originalLength: text.length,\n summaryLength: truncated.length,\n wasSummarized: false,\n };\n}\n\n/**\n * Condense text for TTS using a small LLM pass; falls back to sentence-boundary truncation.\n */\nexport async function summarizeForTts(options: SummarizeForTtsOptions): Promise<SummarizeResult> {\n const { text, targetLength, config, modelRef, signal } = options;\n\n if (text.length <= targetLength) {\n return {\n summary: text,\n originalLength: text.length,\n summaryLength: text.length,\n wasSummarized: false,\n };\n }\n\n const startTime = Date.now();\n\n try {\n const model = resolveSummarizeModel(config, modelRef);\n const userPrompt = [\n `Summarize the following text to fit within ${targetLength} characters.`,\n `The summary will be read aloud by a text-to-speech system, so use natural spoken language.`,\n '',\n '---',\n '',\n text,\n ].join('\\n');\n\n const userMsg: UserMessage = {\n role: 'user',\n content: `${SUMMARIZE_SYSTEM_PROMPT}\\n\\n---\\n\\n${userPrompt}`,\n timestamp: Date.now(),\n };\n\n const timeoutSignal =\n typeof AbortSignal !== 'undefined' && typeof AbortSignal.timeout === 'function'\n ? AbortSignal.timeout(SUMMARIZE_TIMEOUT_MS)\n : undefined;\n const mergedSignal =\n signal && timeoutSignal && typeof AbortSignal.any === 'function'\n ? AbortSignal.any([signal, timeoutSignal])\n : signal ?? timeoutSignal;\n\n const result = await completeWithResolvedCredentials(\n model,\n { messages: [userMsg] },\n {\n maxTokens: Math.min(Math.ceil(targetLength / 2), 4096),\n temperature: 0.3,\n signal: mergedSignal as AbortSignal,\n },\n );\n\n let out = '';\n if (Array.isArray(result.content)) {\n for (const c of result.content) {\n if (c && typeof c === 'object' && (c as { type?: string }).type === 'text') {\n out += String((c as { text?: string }).text || '');\n }\n }\n }\n\n const summary = out.trim();\n if (!summary) {\n log.warn('Empty summary returned, falling back to truncation');\n return fallbackTruncate(text, targetLength);\n }\n\n const finalSummary =\n summary.length > targetLength ? truncateAtSentenceBoundary(summary, targetLength) : summary;\n\n log.info(\n {\n originalLength: text.length,\n summaryLength: finalSummary.length,\n durationMs: Date.now() - startTime,\n },\n 'Text summarized for TTS',\n );\n\n return {\n summary: finalSummary,\n originalLength: text.length,\n summaryLength: finalSummary.length,\n wasSummarized: true,\n };\n } catch (error) {\n const em = error instanceof Error ? error.message : String(error);\n log.warn({ errorMessage: em }, 'Summarization failed, falling back to truncation');\n return fallbackTruncate(text, targetLength);\n }\n}\n"],"mappings":";;;;;;gBAI6E;aAExB;AAGrD,MAAM,MAAM,aAAa,gBAAgB;AAEzC,MAAM,uBAAuB;AAE7B,MAAM,0BAA0B;;;;;;;;;;;AA2BhC,SAAS,sBAAsB,QAA4B,UAA+B;CACxF,MAAM,SAAS,QAAQ,IAAI,0BAA0B,MAAM;CAC3D,MAAM,MAAM,UAAU,MAAM,IAAI;AAChC,KAAI,IACF,KAAI;AACF,SAAO,aAAa,IAAI;SAClB;AAIV,MAAK,MAAM,aAAa,CAAC,uBAAuB,0BAA0B,CACxE,KAAI;AACF,SAAO,aAAa,UAAU;SACxB;AAIV,QAAO,aAAa,oBAAoB,OAAO,CAAC;;AAGlD,SAAS,iBAAiB,MAAc,WAAoC;CAC1E,MAAM,YAAY,2BAA2B,MAAM,UAAU;AAC7D,QAAO;EACL,SAAS;EACT,gBAAgB,KAAK;EACrB,eAAe,UAAU;EACzB,eAAe;EAChB;;;;;AAMH,eAAsB,gBAAgB,SAA2D;CAC/F,MAAM,EAAE,MAAM,cAAc,QAAQ,UAAU,WAAW;AAEzD,KAAI,KAAK,UAAU,aACjB,QAAO;EACL,SAAS;EACT,gBAAgB,KAAK;EACrB,eAAe,KAAK;EACpB,eAAe;EAChB;CAGH,MAAM,YAAY,KAAK,KAAK;AAE5B,KAAI;EACF,MAAM,QAAQ,sBAAsB,QAAQ,SAAS;EAUrD,MAAM,UAAuB;GAC3B,MAAM;GACN,SAAS,GAAG,wBAAwB,aAXnB;IACjB,8CAA8C,aAAa;IAC3D;IACA;IACA;IACA;IACA;IACD,CAAC,KAAK,KAIsD;GAC3D,WAAW,KAAK,KAAK;GACtB;EAED,MAAM,gBACJ,OAAO,gBAAgB,eAAe,OAAO,YAAY,YAAY,aACjE,YAAY,QAAQ,qBAAqB,GACzC,KAAA;EACN,MAAM,eACJ,UAAU,iBAAiB,OAAO,YAAY,QAAQ,aAClD,YAAY,IAAI,CAAC,QAAQ,cAAc,CAAC,GACxC,UAAU;EAEhB,MAAM,SAAS,MAAM,gCACnB,OACA,EAAE,UAAU,CAAC,QAAQ,EAAE,EACvB;GACE,WAAW,KAAK,IAAI,KAAK,KAAK,eAAe,EAAE,EAAE,KAAK;GACtD,aAAa;GACb,QAAQ;GACT,CACF;EAED,IAAI,MAAM;AACV,MAAI,MAAM,QAAQ,OAAO,QAAQ;QAC1B,MAAM,KAAK,OAAO,QACrB,KAAI,KAAK,OAAO,MAAM,YAAa,EAAwB,SAAS,OAClE,QAAO,OAAQ,EAAwB,QAAQ,GAAG;;EAKxD,MAAM,UAAU,IAAI,MAAM;AAC1B,MAAI,CAAC,SAAS;AACZ,OAAI,KAAK,qDAAqD;AAC9D,UAAO,iBAAiB,MAAM,aAAa;;EAG7C,MAAM,eACJ,QAAQ,SAAS,eAAe,2BAA2B,SAAS,aAAa,GAAG;AAEtF,MAAI,KACF;GACE,gBAAgB,KAAK;GACrB,eAAe,aAAa;GAC5B,YAAY,KAAK,KAAK,GAAG;GAC1B,EACD,0BACD;AAED,SAAO;GACL,SAAS;GACT,gBAAgB,KAAK;GACrB,eAAe,aAAa;GAC5B,eAAe;GAChB;UACM,OAAO;EACd,MAAM,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACjE,MAAI,KAAK,EAAE,cAAc,IAAI,EAAE,mDAAmD;AAClF,SAAO,iBAAiB,MAAM,aAAa"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../../src/voice/tts/types.ts"],"sourcesContent":["/**\n * TTS (Text-to-Speech) Types\n */\n\n/** Built-in provider ids shipped in core. Extensions add more at runtime. */\nexport type BuiltinTTSProvider = 'openai' | 'alibaba' | 'edge' | 'minimax' | 'tts-local-cli';\n\n/** Any registered SpeechProviderPlugin id (built-in or extension). */\nexport type TTSProvider = string;\n\nexport type TTSAutoMode = 'off' | 'always' | 'inbound' | 'tagged';\n\nexport interface TTSOptions {\n /** Voice ID */\n voice?: string;\n /** Speed (0.25 - 4.0) */\n speed?: number;\n /** Output format */\n format?: 'opus' | 'mp3' | 'wav';\n /** Model ID (for provider-specific model selection) */\n model?: string;\n /** Request timeout in milliseconds */\n timeoutMs?: number;\n}\n\nexport interface TTSResult {\n /** Audio buffer */\n audio: Buffer;\n /** Format */\n format: string;\n /** Duration in seconds (if available) */\n duration?: number;\n /** Provider that generated the speech */\n provider: string;\n}\n\nexport interface TTSProviderInterface {\n /** Provider name */\n name: string;\n /** Convert text to speech */\n speak(text: string, options?: TTSOptions): Promise<TTSResult>;\n /** Check if provider is configured */\n isConfigured(): boolean;\n}\n\nexport interface TTSModelOverrideConfig {\n /** Enable model-provided overrides for TTS */\n enabled?: boolean;\n /** Allow model-provided TTS text blocks */\n allowText?: boolean;\n /** Allow model-provided provider override (default: false) */\n allowProvider?: boolean;\n /** Allow model-provided voice/voiceId override */\n allowVoice?: boolean;\n /** Allow model-provided modelId override */\n allowModelId?: boolean;\n /** Allow model-provided voice settings override */\n allowVoiceSettings?: boolean;\n /** Allow model-provided normalization or language overrides */\n allowNormalization?: boolean;\n /** Allow model-provided seed override */\n allowSeed?: boolean;\n}\n\nexport interface TTSConfig {\n enabled: boolean;\n provider: TTSProvider;\n /** Trigger mode: auto = reply with voice when user sends voice */\n trigger: TTSAutoMode;\n /** Fallback configuration */\n fallback?: {\n enabled: boolean;\n order: TTSProvider[];\n };\n /** Maximum text length for TTS */\n maxTextLength?: number;\n /** API request timeout (ms) */\n timeoutMs?: number;\n /** Long-text summarization before TTS */\n summarization?: TTSSummarizationConfig;\n /** Allow model to override TTS parameters */\n modelOverrides?: TTSModelOverrideConfig;\n /** Provider settings map (`messages.tts.providers.<id>`). */\n providers?: Record<string, Record<string, unknown>>;\n}\n\nexport interface TTSSummarizationConfig {\n /** When true (default), long text is summarized via LLM before TTS */\n enabled?: boolean;\n targetLength?: number;\n threshold?: number;\n model?: string;\n}\n\nexport const DEFAULT_TTS_CONFIG: TTSConfig = {\n enabled: true,\n provider: 'edge',\n trigger: 'inbound',\n fallback: {\n enabled: true,\n order: ['openai', 'alibaba', 'minimax', 'edge'],\n },\n maxTextLength: 512, // Conservative default to accommodate all providers (Alibaba limit is 512)\n timeoutMs: 60000,\n summarization: {\n enabled: true,\n },\n modelOverrides: {\n enabled: true,\n allowText: true,\n allowProvider: false,\n allowVoice: true,\n allowModelId: true,\n allowVoiceSettings: false,\n allowNormalization: false,\n allowSeed: false,\n },\n providers: {\n alibaba: { model: 'qwen-tts', voice: 'Cherry' },\n openai: { model: 'tts-1', voice: 'alloy' },\n edge: {\n enabled: true,\n voice: 'en-US-MichelleNeural',\n lang: 'en-US',\n outputFormat: 'audio-24khz-48kbitrate-mono-mp3',\n },\n minimax: { model: 'speech-2.8-hd', voice: 'male-qn-qingse' },\n },\n};\n\n/** TTS directive parse result */\nexport interface TtsDirectiveParseResult {\n cleanedText: string;\n ttsText?: string;\n hasDirective: boolean;\n overrides: TtsDirectiveOverrides;\n warnings: string[];\n}\n\n/** TTS directive overrides */\nexport interface TtsDirectiveOverrides {\n ttsText?: string;\n provider?: TTSProvider;\n openai?: {\n voice?: string;\n model?: string;\n };\n alibaba?: {\n voice?: string;\n model?: string;\n };\n edge?: {\n voice?: string;\n };\n minimax?: {\n voice?: string;\n model?: string;\n };\n}\n\n/** Provider attempt result (TTS fallback chain) */\nexport type ProviderAttemptOutcome = 'success' | 'skipped' | 'failed';\n\n/** Provider failure reason classification */\nexport type ProviderFailureReason =\n | 'success'\n | 'not_configured'\n | 'timeout'\n | 'provider_error'\n | 'text_too_long'\n | 'unknown';\n\n/** Single provider attempt in a TTS fallback chain */\nexport interface ProviderAttempt {\n provider: string;\n outcome: ProviderAttemptOutcome;\n reasonCode: ProviderFailureReason;\n latencyMs: number;\n error?: string;\n}\n\n/** TTS result including fallback / preprocessing metadata */\nexport interface TTSResultWithTracking extends TTSResult {\n attempts: ProviderAttempt[];\n fallbackFrom?: string;\n attemptedProviders: string[];\n wasPreprocessed?: boolean;\n ttsText?: string;\n wasSummarized?: boolean;\n}\n\n/** Last TTS call diagnostics (memory-only) */\nexport interface TtsStatusEntry {\n timestamp: number;\n success: boolean;\n provider?: string;\n latencyMs?: number;\n error?: string;\n textLength?: number;\n audioSize?: number;\n audioFormat?: string;\n usedFallback?: boolean;\n wasSummarized?: boolean;\n}\n\nexport interface TtsRuntimeStatus {\n lastAttempt?: TtsStatusEntry;\n recentSuccessRate?: number;\n totalCalls: number;\n totalSuccesses: number;\n totalFailures: number;\n}\n"],"mappings":";AA8FA,MAAa,qBAAgC;CAC3C,SAAS;CACT,UAAU;CACV,SAAS;CACT,UAAU;EACR,SAAS;EACT,OAAO;GAAC;GAAU;GAAW;GAAW;GAAO;EAChD;CACD,eAAe;CACf,WAAW;CACX,eAAe,EACb,SAAS,MACV;CACD,gBAAgB;EACd,SAAS;EACT,WAAW;EACX,eAAe;EACf,YAAY;EACZ,cAAc;EACd,oBAAoB;EACpB,oBAAoB;EACpB,WAAW;EACZ;CACD,WAAW;EACT,SAAS;GAAE,OAAO;GAAY,OAAO;GAAU;EAC/C,QAAQ;GAAE,OAAO;GAAS,OAAO;GAAS;EAC1C,MAAM;GACJ,SAAS;GACT,OAAO;GACP,MAAM;GACN,cAAc;GACf;EACD,SAAS;GAAE,OAAO;GAAiB,OAAO;GAAkB;EAC7D;CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer.js","names":[],"sources":["../../../src/work-discovery/analyzer.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { UserMessage } from '@earendil-works/pi-ai/compat';\n\nimport type { Config } from '../config/schema.js';\nimport { getAgentDefaultModelRef } from '../config/schema.js';\nimport { completeWithResolvedCredentials } from '../providers/model-call.js';\nimport { resolveModel } from '../providers/index.js';\n\nimport type {\n WorkContextSnapshot,\n WorkDiscoveryResult,\n WorkDiscoverySuggestion,\n} from './types.js';\n\nconst MAX_MODEL_CONTEXT_CHARS = 120_000;\n\nfunction extractText(content: unknown): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n return content.map((part) => {\n if (!part || typeof part !== 'object') return '';\n const value = part as { type?: unknown; text?: unknown };\n return value.type === 'text' && typeof value.text === 'string' ? value.text : '';\n }).join('');\n}\n\nfunction parseJson(raw: string): Record<string, unknown> | null {\n const fenced = /```(?:json)?\\s*([\\s\\S]*?)```/i.exec(raw)?.[1];\n const start = raw.indexOf('{');\n const end = raw.lastIndexOf('}');\n const candidate = fenced ?? (start >= 0 && end > start ? raw.slice(start, end + 1) : raw);\n try {\n const value = JSON.parse(candidate) as unknown;\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : null;\n } catch {\n return null;\n }\n}\n\nfunction strings(value: unknown, max: number): string[] {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string' && item.trim().length > 0)\n .slice(0, max)\n .map((item) => item.trim())\n : [];\n}\n\nfunction validateSuggestion(value: unknown, allowedPaths: Set<string>): WorkDiscoverySuggestion | null {\n if (!value || typeof value !== 'object') return null;\n const item = value as Record<string, unknown>;\n if (typeof item.title !== 'string' || !item.title.trim()) return null;\n if (typeof item.rationale !== 'string' || !item.rationale.trim()) return null;\n if (typeof item.actionPrompt !== 'string' || !item.actionPrompt.trim()) return null;\n const confidence = item.confidence === 'high' || item.confidence === 'medium' || item.confidence === 'low'\n ? item.confidence\n : 'medium';\n const actionType = item.actionType === 'summarize_recent_work'\n || item.actionType === 'inspect_related_tests'\n || item.actionType === 'plan_next_step'\n ? item.actionType\n : 'plan_next_step';\n const risk = item.risk === 'command' || item.risk === 'file_write' ? item.risk : 'analysis';\n const estimatedMinutes = typeof item.estimatedMinutes === 'number' && Number.isFinite(item.estimatedMinutes)\n ? Math.max(1, Math.min(30, Math.round(item.estimatedMinutes)))\n : 3;\n const expectedOutcome = typeof item.expectedOutcome === 'string' && item.expectedOutcome.trim()\n ? item.expectedOutcome.trim().slice(0, 500)\n : item.title.trim().slice(0, 120);\n const evidence = Array.isArray(item.evidence)\n ? item.evidence.flatMap((raw) => {\n if (!raw || typeof raw !== 'object') return [];\n const candidate = raw as Record<string, unknown>;\n if (typeof candidate.observation !== 'string' || !candidate.observation.trim()) return [];\n const path = typeof candidate.path === 'string' && allowedPaths.has(candidate.path)\n ? candidate.path\n : undefined;\n return [{ ...(path ? { path } : {}), observation: candidate.observation.trim().slice(0, 500) }];\n }).slice(0, 4)\n : [];\n if (evidence.length === 0) return null;\n return {\n id: randomUUID(),\n actionType,\n title: item.title.trim().slice(0, 120),\n rationale: item.rationale.trim().slice(0, 600),\n evidence,\n actionPrompt: item.actionPrompt.trim().slice(0, 2_000),\n confidence,\n expectedOutcome,\n estimatedMinutes,\n risk,\n verification: strings(item.verification, 4).map((entry) => entry.slice(0, 300)),\n };\n}\n\nfunction suggestionScore(suggestion: WorkDiscoverySuggestion): number {\n const confidence = suggestion.confidence === 'high' ? 3 : suggestion.confidence === 'medium' ? 2 : 1;\n const safety = suggestion.risk === 'analysis' ? 3 : suggestion.risk === 'command' ? 2 : 1;\n return confidence * 4 + safety * 2 - Math.min(suggestion.estimatedMinutes, 10) / 10;\n}\n\nfunction snapshotForModel(snapshot: WorkContextSnapshot): WorkContextSnapshot {\n let remaining = MAX_MODEL_CONTEXT_CHARS;\n return {\n ...snapshot,\n structure: {\n ...snapshot.structure,\n sampledPaths: snapshot.structure.sampledPaths.slice(0, 200),\n metadataOnlyFiles: snapshot.structure.metadataOnlyFiles.slice(0, 200),\n },\n documents: snapshot.documents.flatMap((document) => {\n if (remaining <= 0) return [];\n const excerpt = document.excerpt.slice(0, remaining);\n remaining -= excerpt.length;\n return [{ ...document, excerpt, truncated: document.truncated || excerpt.length < document.excerpt.length }];\n }),\n };\n}\n\nfunction lowConfidenceResult(snapshot: WorkContextSnapshot, question?: string): WorkDiscoveryResult {\n return {\n projectSummary: snapshot.root.projectKind === 'coding'\n ? `${snapshot.root.displayName} appears to be a software project.`\n : `${snapshot.root.displayName} is a local work folder.`,\n currentState: snapshot.git?.changedPaths.length\n ? `${snapshot.git.changedPaths.length} changed paths were detected, but there was not enough reliable context to recommend work.`\n : 'There was not enough recent, readable context to determine the current objective.',\n uncertainties: ['The current objective is not explicit in the selected files.'],\n suggestions: [],\n lowConfidence: true,\n contextQuestion: question ?? 'What are you trying to move forward in this folder?',\n };\n}\n\nexport async function analyzeWorkContext(input: {\n config: Config;\n snapshot: WorkContextSnapshot;\n signal?: AbortSignal;\n}): Promise<{ modelRef: string; result: WorkDiscoveryResult }> {\n const modelRef = getAgentDefaultModelRef(input.config);\n if (!modelRef) throw new Error('No default model configured');\n if (input.snapshot.documents.length === 0 && !input.snapshot.git?.changedPaths.length) {\n return { modelRef, result: lowConfidenceResult(input.snapshot) };\n }\n\n const model = resolveModel(modelRef);\n const compactSnapshot = snapshotForModel(input.snapshot);\n const prompt = [\n 'You help a user resume real work in one explicitly selected local folder.',\n 'Analyze only the supplied bounded snapshot. Never claim that you ran commands, tests, or inspected anything absent from it.',\n 'Return only one JSON object with projectSummary, currentState, uncertainties, suggestions, lowConfidence, and contextQuestion.',\n 'For a normal result, suggestions must contain exactly 3 materially different next steps.',\n 'Each suggestion must include actionType, title, rationale, evidence, actionPrompt, confidence, expectedOutcome, estimatedMinutes, risk, and verification.',\n 'actionType must be summarize_recent_work, inspect_related_tests, or plan_next_step.',\n 'risk must be analysis, command, or file_write. estimatedMinutes is an integer from 1 to 30.',\n 'verification is a short array describing how the user can tell the outcome is real.',\n 'Each evidence item contains an optional exact relative path from the snapshot and one concrete observation.',\n 'actionPrompt asks the assistant to investigate or continue the step; it does not silently authorize file changes.',\n 'If the current objective is unclear or fewer than three credible suggestions exist, set lowConfidence=true, return suggestions=[], and ask one concise contextQuestion.',\n 'Use Simplified Chinese for every user-facing string when the visible snapshot documents are mainly Chinese; otherwise use English.',\n '',\n JSON.stringify(compactSnapshot),\n ].join('\\n');\n const message: UserMessage = { role: 'user', content: prompt, timestamp: Date.now() };\n const response = await completeWithResolvedCredentials(model, { messages: [message] }, {\n maxTokens: 2_500,\n temperature: 0.1,\n signal: input.signal,\n });\n const parsed = parseJson(extractText(response.content));\n if (!parsed) throw new Error('Analysis did not return valid JSON');\n\n const lowConfidence = parsed.lowConfidence === true;\n if (lowConfidence) {\n return {\n modelRef,\n result: lowConfidenceResult(\n input.snapshot,\n typeof parsed.contextQuestion === 'string' ? parsed.contextQuestion.trim().slice(0, 500) : undefined,\n ),\n };\n }\n\n const allowedPaths = new Set([\n ...input.snapshot.structure.sampledPaths,\n ...input.snapshot.documents.map((document) => document.relativePath),\n ...(input.snapshot.git?.changedPaths ?? []),\n ]);\n const suggestions = Array.isArray(parsed.suggestions)\n ? parsed.suggestions.map((value) => validateSuggestion(value, allowedPaths)).filter((value): value is WorkDiscoverySuggestion => Boolean(value))\n : [];\n if (suggestions.length !== 3) return { modelRef, result: lowConfidenceResult(input.snapshot) };\n const primarySuggestion = [...suggestions].sort((a, b) => suggestionScore(b) - suggestionScore(a))[0];\n const projectSummary = typeof parsed.projectSummary === 'string' ? parsed.projectSummary.trim() : '';\n const currentState = typeof parsed.currentState === 'string' ? parsed.currentState.trim() : '';\n if (!projectSummary || !currentState) throw new Error('Analysis result is missing its summary');\n return {\n modelRef,\n result: {\n projectSummary: projectSummary.slice(0, 1_200),\n currentState: currentState.slice(0, 1_200),\n uncertainties: strings(parsed.uncertainties, 6).map((value) => value.slice(0, 500)),\n suggestions,\n ...(primarySuggestion ? { primarySuggestionId: primarySuggestion.id } : {}),\n },\n };\n}\n\nexport function workDiscoveryResultMarkdown(result: WorkDiscoveryResult): string {\n const lines = [`## What I found`, '', result.projectSummary, '', result.currentState];\n if (result.lowConfidence) {\n if (result.contextQuestion) lines.push('', `**${result.contextQuestion}**`);\n return lines.join('\\n');\n }\n lines.push('', '## Suggested next steps');\n for (const [index, suggestion] of result.suggestions.entries()) {\n lines.push('', `### ${index + 1}. ${suggestion.title}`, '', suggestion.rationale, '', `Expected outcome: ${suggestion.expectedOutcome}`, '');\n for (const evidence of suggestion.evidence) {\n lines.push(`- ${evidence.path ? `\\`${evidence.path}\\`: ` : ''}${evidence.observation}`);\n }\n }\n return lines.join('\\n');\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"probe.js","names":["fsConstants"],"sources":["../../../src/work-discovery/probe.ts"],"sourcesContent":["import { execFile } from 'node:child_process';\nimport { constants as fsConstants } from 'node:fs';\nimport { access, lstat, readFile, readdir, realpath, stat } from 'node:fs/promises';\nimport { basename, extname, isAbsolute, relative, resolve, sep } from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { inferProjectKind } from '../projects/index.js';\n\nimport type { WorkContextSnapshot, WorkContextSnapshotSummary } from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport const WORK_DISCOVERY_SCAN_POLICY_VERSION = 1;\n\nconst MAX_DEPTH = 4;\nconst MAX_CANDIDATE_FILES = 2_000;\nconst MAX_CONTENT_FILES = 30;\nconst MAX_FILE_BYTES = 64 * 1024;\nconst MAX_TOTAL_BYTES = 512 * 1024;\n\nconst EXCLUDED_DIRECTORY_NAMES = new Set([\n '.git', '.hg', '.svn', 'node_modules', 'vendor', 'dist', 'build', 'coverage', '.coverage',\n '.cache', '.next', '.nuxt', '.turbo', '.vite', '.pnpm-store', '__pycache__', '.venv', 'venv',\n 'target', 'out', 'Pods', 'DerivedData',\n]);\n\nconst BINARY_EXTENSIONS = new Set([\n '.7z', '.a', '.avi', '.bin', '.class', '.db', '.dmg', '.dll', '.eot', '.exe', '.gz', '.jar',\n '.lockb', '.mov', '.mp3', '.mp4', '.o', '.otf', '.pyc', '.rar', '.so', '.sqlite', '.sqlite3',\n '.tar', '.ttf', '.wav', '.webm', '.woff', '.woff2', '.zip',\n]);\n\nconst METADATA_ONLY_EXTENSIONS = new Map<string, 'document' | 'pdf' | 'image'>([\n ['.doc', 'document'], ['.docx', 'document'], ['.ppt', 'document'], ['.pptx', 'document'],\n ['.xls', 'document'], ['.xlsx', 'document'], ['.pdf', 'pdf'],\n ['.bmp', 'image'], ['.gif', 'image'], ['.ico', 'image'], ['.jpeg', 'image'], ['.jpg', 'image'],\n ['.png', 'image'], ['.webp', 'image'],\n]);\n\nconst SECRET_FILE_PATTERNS = [\n /^\\.env(?:\\.|$)/i,\n /(?:^|[-_.])(credentials?|secrets?|tokens?|api[-_]?keys?|auth)(?:[-_.]|$)/i,\n /\\.(?:pem|key|p12|pfx|crt|cer)$/i,\n /^(?:id_rsa|id_ed25519)(?:\\.pub)?$/i,\n];\n\nconst HIGH_VALUE_NAMES = [\n /^AGENTS\\.md$/i,\n /^CONTEXT\\.md$/i,\n /^README(?:\\..+)?$/i,\n /^TODO(?:\\..+)?$/i,\n /^ROADMAP(?:\\..+)?$/i,\n /^CHANGELOG(?:\\..+)?$/i,\n /^package\\.json$/i,\n /^pyproject\\.toml$/i,\n /^Cargo\\.toml$/i,\n /^go\\.mod$/i,\n];\n\nfunction abortIfNeeded(signal?: AbortSignal): void {\n if (signal?.aborted) throw new DOMException('Work discovery canceled', 'AbortError');\n}\n\nfunction isSecretFile(name: string): boolean {\n return SECRET_FILE_PATTERNS.some((pattern) => pattern.test(name));\n}\n\nfunction isExcludedDirectory(name: string): boolean {\n return EXCLUDED_DIRECTORY_NAMES.has(name) || name.startsWith('.');\n}\n\nfunction isLikelyBinary(path: string): boolean {\n return BINARY_EXTENSIONS.has(extname(path).toLowerCase());\n}\n\nfunction isInsideRoot(root: string, candidate: string): boolean {\n return candidate === root || candidate.startsWith(`${root}${sep}`);\n}\n\nfunction selectionPriority(path: string, modifiedAt: number): number {\n const name = basename(path);\n const highValueIndex = HIGH_VALUE_NAMES.findIndex((pattern) => pattern.test(name));\n if (highValueIndex >= 0) return 10_000 - highValueIndex * 100;\n return Math.floor(modifiedAt / 1_000_000);\n}\n\nasync function gitInfo(root: string, signal?: AbortSignal): Promise<WorkContextSnapshot['git'] | undefined> {\n abortIfNeeded(signal);\n try {\n const [{ stdout: statusOutput }, { stdout: logOutput }] = await Promise.all([\n execFileAsync('git', ['-C', root, 'status', '--short', '--branch', '--untracked-files=no'], {\n timeout: 4_000,\n maxBuffer: 256 * 1024,\n signal,\n }),\n execFileAsync('git', ['-C', root, 'log', '-10', '--format=%ct%x09%s'], {\n timeout: 4_000,\n maxBuffer: 256 * 1024,\n signal,\n }),\n ]);\n const statusLines = statusOutput.split('\\n').filter(Boolean);\n const branch = statusLines[0]?.startsWith('## ')\n ? statusLines[0].slice(3).split('...')[0]?.trim()\n : undefined;\n const changedPaths = statusLines.slice(1, 101).map((line) => line.slice(3).trim()).filter(Boolean);\n const recentCommits = logOutput.split('\\n').filter(Boolean).slice(0, 10).map((line) => {\n const [timestamp, ...subjectParts] = line.split('\\t');\n const committedAt = Number(timestamp) * 1000;\n return {\n subject: subjectParts.join('\\t').slice(0, 240),\n ...(Number.isFinite(committedAt) ? { committedAt } : {}),\n };\n });\n return { ...(branch ? { branch } : {}), changedPaths, recentCommits };\n } catch {\n return undefined;\n }\n}\n\nexport async function canonicalWorkDiscoveryRoot(input: string): Promise<string> {\n const trimmed = input.trim();\n if (!trimmed || !isAbsolute(trimmed)) throw new Error('An absolute folder path is required');\n const canonical = await realpath(trimmed);\n const info = await stat(canonical);\n if (!info.isDirectory()) throw new Error('Selected path is not a directory');\n await access(canonical, fsConstants.R_OK);\n return canonical;\n}\n\nexport async function previewWorkDiscoveryRoot(rootPath: string) {\n const canonicalRootPath = await canonicalWorkDiscoveryRoot(rootPath);\n const inference = inferProjectKind({ workspaceRoot: canonicalRootPath });\n const git = await gitInfo(canonicalRootPath);\n const recentAreas = Array.from(new Set((git?.changedPaths ?? []).map((path) => {\n const normalized = path.replaceAll('\\\\', '/');\n const [first, second] = normalized.split('/');\n return second ? `${first}/${second}` : first;\n }).filter((area): area is string => Boolean(area)))).slice(0, 5);\n return {\n canonicalRootPath,\n displayName: basename(canonicalRootPath),\n projectKind: inference.kind,\n projectKindConfidence: inference.confidence,\n markerReasons: inference.reasons,\n fingerprint: {\n ...(git?.branch ? { branch: git.branch } : {}),\n changedFileCount: git?.changedPaths.length ?? 0,\n recentAreas,\n generatedAt: Date.now(),\n },\n };\n}\n\nexport async function probeWorkDiscoveryRoot(\n rootPath: string,\n signal?: AbortSignal,\n): Promise<WorkContextSnapshot> {\n const root = await canonicalWorkDiscoveryRoot(rootPath);\n const inference = inferProjectKind({ workspaceRoot: root });\n const candidates: Array<{ absolutePath: string; relativePath: string; modifiedAt: number; size: number }> = [];\n const metadataOnlyFiles: WorkContextSnapshot['structure']['metadataOnlyFiles'] = [];\n let omittedPathCount = 0;\n let traversalTruncated = false;\n\n const walk = async (directory: string, depth: number): Promise<void> => {\n abortIfNeeded(signal);\n if (candidates.length >= MAX_CANDIDATE_FILES) {\n traversalTruncated = true;\n return;\n }\n let entries;\n try {\n entries = await readdir(directory, { withFileTypes: true });\n } catch {\n return;\n }\n entries.sort((a, b) => a.name.localeCompare(b.name));\n for (const entry of entries) {\n abortIfNeeded(signal);\n if (candidates.length >= MAX_CANDIDATE_FILES) {\n traversalTruncated = true;\n omittedPathCount += 1;\n continue;\n }\n if (entry.isDirectory()) {\n if (depth >= MAX_DEPTH || isExcludedDirectory(entry.name)) {\n omittedPathCount += 1;\n continue;\n }\n await walk(resolve(directory, entry.name), depth + 1);\n continue;\n }\n if (!entry.isFile() || isSecretFile(entry.name)) {\n omittedPathCount += 1;\n continue;\n }\n const absolutePath = resolve(directory, entry.name);\n try {\n const resolvedPath = await realpath(absolutePath);\n if (!isInsideRoot(root, resolvedPath)) {\n omittedPathCount += 1;\n continue;\n }\n const info = await lstat(resolvedPath);\n if (!info.isFile()) {\n omittedPathCount += 1;\n continue;\n }\n const relativePath = relative(root, resolvedPath);\n const metadataKind = METADATA_ONLY_EXTENSIONS.get(extname(entry.name).toLowerCase());\n if (metadataKind) {\n if (metadataOnlyFiles.length < 200) {\n metadataOnlyFiles.push({ relativePath, modifiedAt: info.mtimeMs, size: info.size, kind: metadataKind });\n } else {\n omittedPathCount += 1;\n }\n continue;\n }\n if (isLikelyBinary(entry.name) || info.size > MAX_FILE_BYTES * 4) {\n omittedPathCount += 1;\n continue;\n }\n candidates.push({\n absolutePath: resolvedPath,\n relativePath,\n modifiedAt: info.mtimeMs,\n size: info.size,\n });\n } catch {\n omittedPathCount += 1;\n }\n }\n };\n\n await walk(root, 0);\n const git = await gitInfo(root, signal);\n const changed = new Set(git?.changedPaths ?? []);\n candidates.sort((a, b) => {\n const aScore = selectionPriority(a.relativePath, a.modifiedAt) + (changed.has(a.relativePath) ? 20_000 : 0);\n const bScore = selectionPriority(b.relativePath, b.modifiedAt) + (changed.has(b.relativePath) ? 20_000 : 0);\n return bScore - aScore || a.relativePath.localeCompare(b.relativePath);\n });\n\n const documents: WorkContextSnapshot['documents'] = [];\n let contentBytes = 0;\n for (const candidate of candidates) {\n abortIfNeeded(signal);\n if (documents.length >= MAX_CONTENT_FILES || contentBytes >= MAX_TOTAL_BYTES) break;\n const remaining = MAX_TOTAL_BYTES - contentBytes;\n const limit = Math.min(MAX_FILE_BYTES, remaining);\n try {\n const buffer = await readFile(candidate.absolutePath);\n const slice = buffer.subarray(0, limit);\n if (slice.includes(0)) continue;\n const excerpt = slice.toString('utf8').trim();\n if (!excerpt) continue;\n const highValue = HIGH_VALUE_NAMES.some((pattern) => pattern.test(basename(candidate.relativePath)));\n documents.push({\n relativePath: candidate.relativePath,\n modifiedAt: candidate.modifiedAt,\n excerpt,\n truncated: buffer.length > slice.length,\n selectionReason: changed.has(candidate.relativePath)\n ? 'git_change'\n : highValue\n ? 'project_context'\n : 'recently_modified',\n });\n contentBytes += slice.length;\n } catch {\n // Continue with the remaining readable files.\n }\n }\n\n return {\n root: {\n displayName: basename(root),\n projectKind: inference.kind,\n markerReasons: inference.reasons,\n },\n structure: {\n sampledPaths: [\n ...candidates.map((candidate) => candidate.relativePath),\n ...metadataOnlyFiles.map((file) => file.relativePath),\n ].slice(0, 200),\n metadataOnlyFiles,\n omittedPathCount,\n },\n ...(git ? { git } : {}),\n documents,\n limits: {\n policyVersion: WORK_DISCOVERY_SCAN_POLICY_VERSION,\n fileCount: candidates.length,\n contentBytes,\n truncated: traversalTruncated || candidates.length > 200 || documents.some((document) => document.truncated),\n },\n };\n}\n\nexport function summarizeWorkContextSnapshot(snapshot: WorkContextSnapshot): WorkContextSnapshotSummary {\n return {\n projectKind: snapshot.root.projectKind,\n sampledPathCount: snapshot.structure.sampledPaths.length,\n omittedPathCount: snapshot.structure.omittedPathCount,\n documentCount: snapshot.documents.length,\n contentBytes: snapshot.limits.contentBytes,\n changedPathCount: snapshot.git?.changedPaths.length ?? 0,\n truncated: snapshot.limits.truncated,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","names":[],"sources":["../../../src/work-discovery/repository.ts"],"sourcesContent":["import type { DatabaseSync } from 'node:sqlite';\n\nimport { requireXopcDatabase } from '../storage/sqlite/connection.js';\nimport { runSqliteWriteTransaction } from '../storage/sqlite/transaction.js';\n\nimport type {\n WorkDiscoveryOnboardingState,\n WorkDiscoveryOnboardingStatus,\n WorkDiscoveryFeedback,\n WorkDiscoveryRecognitionDecision,\n WorkDiscoveryRun,\n} from './types.js';\n\ntype OnboardingRow = {\n status: string;\n active_run_id: string | null;\n completed_at: number | null;\n dismissed_at: number | null;\n updated_at: number;\n};\n\ntype RunRow = {\n id: string;\n idempotency_key: string;\n source: string;\n status: string;\n stage: string | null;\n root_path: string;\n project_id: string;\n session_key: string;\n agent_id: string;\n model_ref: string;\n scan_policy_version: number;\n snapshot_summary_json: string | null;\n result_json: string | null;\n error_code: string | null;\n error_message: string | null;\n created_at: number;\n started_at: number | null;\n completed_at: number | null;\n canceled_at: number | null;\n};\n\ntype FeedbackRow = {\n run_id: string;\n recognition_decision: string;\n corrected_intent: string | null;\n created_at: number;\n updated_at: number;\n};\n\nfunction parseJson<T>(value: string | null): T | undefined {\n if (!value) return undefined;\n try {\n return JSON.parse(value) as T;\n } catch {\n return undefined;\n }\n}\n\nfunction onboardingFromRow(row: OnboardingRow): WorkDiscoveryOnboardingState {\n return {\n status: row.status as WorkDiscoveryOnboardingStatus,\n ...(row.active_run_id ? { activeRunId: row.active_run_id } : {}),\n ...(row.completed_at != null ? { completedAt: row.completed_at } : {}),\n ...(row.dismissed_at != null ? { dismissedAt: row.dismissed_at } : {}),\n updatedAt: row.updated_at,\n };\n}\n\nfunction runFromRow(row: RunRow): WorkDiscoveryRun {\n return {\n id: row.id,\n idempotencyKey: row.idempotency_key,\n source: row.source as WorkDiscoveryRun['source'],\n status: row.status as WorkDiscoveryRun['status'],\n ...(row.stage ? { stage: row.stage as WorkDiscoveryRun['stage'] } : {}),\n rootPath: row.root_path,\n projectId: row.project_id,\n sessionKey: row.session_key,\n agentId: row.agent_id,\n modelRef: row.model_ref,\n scanPolicyVersion: row.scan_policy_version,\n ...(parseJson<WorkDiscoveryRun['snapshot']>(row.snapshot_summary_json)\n ? { snapshot: parseJson<WorkDiscoveryRun['snapshot']>(row.snapshot_summary_json) }\n : {}),\n ...(parseJson<WorkDiscoveryRun['result']>(row.result_json)\n ? { result: parseJson<WorkDiscoveryRun['result']>(row.result_json) }\n : {}),\n ...(row.error_code ? { errorCode: row.error_code as WorkDiscoveryRun['errorCode'] } : {}),\n ...(row.error_message ? { errorMessage: row.error_message } : {}),\n createdAt: row.created_at,\n ...(row.started_at != null ? { startedAt: row.started_at } : {}),\n ...(row.completed_at != null ? { completedAt: row.completed_at } : {}),\n ...(row.canceled_at != null ? { canceledAt: row.canceled_at } : {}),\n };\n}\n\nfunction readRun(db: DatabaseSync, clause: string, value: string): WorkDiscoveryRun | null {\n const row = db.prepare(`SELECT * FROM work_discovery_runs WHERE ${clause} = ?`).get(value) as RunRow | undefined;\n if (!row) return null;\n const run = runFromRow(row);\n const feedback = getWorkDiscoveryFeedbackFromDb(db, run.id);\n return feedback ? { ...run, feedback } : run;\n}\n\nfunction feedbackFromRow(row: FeedbackRow): WorkDiscoveryFeedback {\n return {\n runId: row.run_id,\n recognitionDecision: row.recognition_decision as WorkDiscoveryRecognitionDecision,\n ...(row.corrected_intent ? { correctedIntent: row.corrected_intent } : {}),\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nfunction getWorkDiscoveryFeedbackFromDb(db: DatabaseSync, runId: string): WorkDiscoveryFeedback | null {\n const row = db.prepare('SELECT * FROM work_discovery_feedback WHERE run_id = ?').get(runId) as FeedbackRow | undefined;\n return row ? feedbackFromRow(row) : null;\n}\n\nexport function getWorkDiscoveryOnboardingState(): WorkDiscoveryOnboardingState {\n const { db } = requireXopcDatabase();\n const row = db.prepare('SELECT * FROM work_discovery_onboarding WHERE singleton_id = 1').get() as OnboardingRow;\n return onboardingFromRow(row);\n}\n\nexport function setWorkDiscoveryOnboardingState(input: {\n status: WorkDiscoveryOnboardingStatus;\n activeRunId?: string | null;\n nowMs?: number;\n}): WorkDiscoveryOnboardingState {\n const now = input.nowMs ?? Date.now();\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `UPDATE work_discovery_onboarding\n SET status = ?, active_run_id = ?,\n completed_at = CASE WHEN ? = 'completed' THEN ? ELSE completed_at END,\n dismissed_at = CASE WHEN ? = 'dismissed' THEN ? ELSE dismissed_at END,\n updated_at = ?\n WHERE singleton_id = 1`,\n ).run(input.status, input.activeRunId ?? null, input.status, now, input.status, now, now);\n });\n return getWorkDiscoveryOnboardingState();\n}\n\nexport function createWorkDiscoveryRun(run: WorkDiscoveryRun): WorkDiscoveryRun {\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO work_discovery_runs (\n id, idempotency_key, source, status, stage, root_path, project_id, session_key,\n agent_id, model_ref, scan_policy_version, snapshot_summary_json, result_json,\n error_code, error_message, created_at, started_at, completed_at, canceled_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n run.id,\n run.idempotencyKey,\n run.source,\n run.status,\n run.stage ?? null,\n run.rootPath,\n run.projectId,\n run.sessionKey,\n run.agentId,\n run.modelRef,\n run.scanPolicyVersion,\n run.snapshot ? JSON.stringify(run.snapshot) : null,\n run.result ? JSON.stringify(run.result) : null,\n run.errorCode ?? null,\n run.errorMessage ?? null,\n run.createdAt,\n run.startedAt ?? null,\n run.completedAt ?? null,\n run.canceledAt ?? null,\n );\n });\n return getWorkDiscoveryRun(run.id)!;\n}\n\nexport function getWorkDiscoveryRun(id: string): WorkDiscoveryRun | null {\n const { db } = requireXopcDatabase();\n return readRun(db, 'id', id);\n}\n\nexport function getWorkDiscoveryRunByIdempotencyKey(key: string): WorkDiscoveryRun | null {\n const { db } = requireXopcDatabase();\n return readRun(db, 'idempotency_key', key);\n}\n\nexport function setWorkDiscoveryFeedback(input: {\n runId: string;\n recognitionDecision: WorkDiscoveryRecognitionDecision;\n correctedIntent?: string;\n nowMs?: number;\n}): WorkDiscoveryFeedback {\n const now = input.nowMs ?? Date.now();\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO work_discovery_feedback (\n run_id, recognition_decision, corrected_intent, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(run_id) DO UPDATE SET\n recognition_decision = excluded.recognition_decision,\n corrected_intent = excluded.corrected_intent,\n updated_at = excluded.updated_at`,\n ).run(\n input.runId,\n input.recognitionDecision,\n input.correctedIntent ?? null,\n now,\n now,\n );\n });\n const { db } = requireXopcDatabase();\n return getWorkDiscoveryFeedbackFromDb(db, input.runId)!;\n}\n\nexport function updateWorkDiscoveryRun(\n id: string,\n patch: Partial<Pick<\n WorkDiscoveryRun,\n | 'status'\n | 'stage'\n | 'snapshot'\n | 'result'\n | 'errorCode'\n | 'errorMessage'\n | 'startedAt'\n | 'completedAt'\n | 'canceledAt'\n >>,\n): WorkDiscoveryRun | null {\n const existing = getWorkDiscoveryRun(id);\n if (!existing) return null;\n const next = { ...existing, ...patch };\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `UPDATE work_discovery_runs SET\n status = ?, stage = ?, snapshot_summary_json = ?, result_json = ?,\n error_code = ?, error_message = ?, started_at = ?, completed_at = ?, canceled_at = ?\n WHERE id = ?`,\n ).run(\n next.status,\n next.stage ?? null,\n next.snapshot ? JSON.stringify(next.snapshot) : null,\n next.result ? JSON.stringify(next.result) : null,\n next.errorCode ?? null,\n next.errorMessage ?? null,\n next.startedAt ?? null,\n next.completedAt ?? null,\n next.canceledAt ?? null,\n id,\n );\n });\n return getWorkDiscoveryRun(id);\n}\n"],"mappings":"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"}
|