@xopcai/xopc 0.0.325 → 0.0.329
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 +4 -3
- package/README.zh-CN.md +4 -3
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CxfXpPWs.js → agent-avatar-dicebear-Bs1qnnhD.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-DHJyAT7t.js +1 -0
- package/dist/gateway/static/root/assets/agent-plugin-dialog-DLKj_iIh.js +1 -0
- package/dist/gateway/static/root/assets/agents-SXZ5O0g4.js +70 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-p7fZB4dT.js → app-management-settings-panel-BrIji9B5.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-C-clVcfp.js → appearance-settings-Uts-MQ7K.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-DcclVdxW.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-Xm6xChUX.js → archive-plugin-_EzRfBuI.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-Di8kuG4L.js → attachment-load-CHg7_XFl.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-GUZgDhKj.js → automations-page-CGMErk_w.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-Cc4yqiF6.js +7 -0
- package/dist/gateway/static/root/assets/{binary-plugins-OCrDjC9O.js → binary-plugins-D3WB-tVn.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-m9tqvu7x.js → block-editor-Cm1W-14I.js} +53 -53
- package/dist/gateway/static/root/assets/box-DvYoGszj.js +1 -0
- package/dist/gateway/static/root/assets/braces-Cfmtagno.js +1 -0
- package/dist/gateway/static/root/assets/{browser-automation-inputs-DSWXq9lI.js → browser-automation-inputs-VnvK-GQP.js} +1 -1
- package/dist/gateway/static/root/assets/browser-automations-page-CZYCvSSU.js +3 -0
- package/dist/gateway/static/root/assets/browser-settings-page-DDz9PE6m.js +3 -0
- package/dist/gateway/static/root/assets/calendar-clock-D-quYVPe.js +1 -0
- package/dist/gateway/static/root/assets/capabilities-page-DH3aDk53.js +2 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-C8jMZAJl.js +8 -0
- package/dist/gateway/static/root/assets/capability-discover-page-CgGvsf3t.js +1 -0
- package/dist/gateway/static/root/assets/capability-header-actions-C3chJDQu.js +1 -0
- package/dist/gateway/static/root/assets/capability-icon-BYm2-nS-.js +1 -0
- package/dist/gateway/static/root/assets/channels-CuVS_KsY.js +1 -0
- package/dist/gateway/static/root/assets/{chat-terminal-dock-BfnVh8oo.js → chat-terminal-dock-ClbmjCL2.js} +2 -2
- package/dist/gateway/static/root/assets/chevron-left-DqFhpbvK.js +1 -0
- package/dist/gateway/static/root/assets/clock-3-DnrAnuyZ.js +1 -0
- package/dist/gateway/static/root/assets/computer-settings-page-BfZaf516.js +1 -0
- package/dist/gateway/static/root/assets/connector-service-page-F-fYNIx8.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-B4SLpvSL.js +2 -0
- package/dist/gateway/static/root/assets/date-picker-DXQTsUJn.js +1 -0
- package/dist/gateway/static/root/assets/dependency-picker-B_z3zihW.js +1 -0
- package/dist/gateway/static/root/assets/{desktop-pet-BsIYCAkG.js → desktop-pet-C1TZzKS3.js} +1 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-B5JGIfqn.js +1 -0
- package/dist/gateway/static/root/assets/device-pairing-wizard-DFYK_Ywf.js +1 -0
- package/dist/gateway/static/root/assets/directory-picker-path-field-BfxaNwMB.js +1 -0
- package/dist/gateway/static/root/assets/ellipsis-0k4rZLoy.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-Ct9pABNW.js → extension-debug-page-Bs8_FYCm.js} +1 -1
- package/dist/gateway/static/root/assets/extension-marketplace-api-DqV4YRYs.js +1 -0
- package/dist/gateway/static/root/assets/{extension-page-BktsR4hj.js → extension-page-DH5vFbBw.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-BQJc-vXH.js → extension-settings-page-hGKovxxC.js} +1 -1
- package/dist/gateway/static/root/assets/external-link-DjqjBmc3.js +1 -0
- package/dist/gateway/static/root/assets/eye-CABVeTq0.js +1 -0
- package/dist/gateway/static/root/assets/folder-open-CyzJ19I9.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-config-swr-CoQVulMd.js → gateway-config-swr-BYMrbKZE.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-BIsiP-JI.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-B5GJ-CQV.js → gateway-startup-retry-DMqYXHAn.js} +1 -1
- package/dist/gateway/static/root/assets/gauge-C78eD2BA.js +1 -0
- package/dist/gateway/static/root/assets/git-branch-Dh9uxTot.js +1 -0
- package/dist/gateway/static/root/assets/globe-DSSGFWFn.js +1 -0
- package/dist/gateway/static/root/assets/home-page-CoBivEvx.js +1 -0
- package/dist/gateway/static/root/assets/image-Cwyalflz.js +1 -0
- package/dist/gateway/static/root/assets/{image-generation-api-DvWDkbk1.js → image-generation-api-D1sQGaJz.js} +1 -1
- package/dist/gateway/static/root/assets/imports-page-rssb4rjP.js +1 -0
- package/dist/gateway/static/root/assets/inbox-DNoSz682.js +1 -0
- package/dist/gateway/static/root/assets/index-C4QN4gCi.css +1 -0
- package/dist/gateway/static/root/assets/index-Cr4SINLG.js +121 -0
- package/dist/gateway/static/root/assets/is-masked-secret-DOkL5b_X.js +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-ctJLm8TP.js → keyboard-shortcuts-settings-CMitbles.js} +1 -1
- package/dist/gateway/static/root/assets/layout-grid-CEVZdVFU.js +1 -0
- package/dist/gateway/static/root/assets/link-2-D_ZKYUW7.js +1 -0
- package/dist/gateway/static/root/assets/list-BBGUdmkF.js +1 -0
- package/dist/gateway/static/root/assets/loader-circle-CifKLtgG.js +1 -0
- package/dist/gateway/static/root/assets/local-app-workbench-page-Di82Oacm.js +1 -0
- package/dist/gateway/static/root/assets/local-apps-page-CCvA9d9L.js +1 -0
- package/dist/gateway/static/root/assets/{locale-store-BPZR8x9b.js → locale-store-BSkKhYkc.js} +1 -1
- package/dist/gateway/static/root/assets/lock-keyhole-DEK5kH0u.js +1 -0
- package/dist/gateway/static/root/assets/logs-page-BK8ol1q0.js +2 -0
- package/dist/gateway/static/root/assets/management-settings-CebXkEtB.js +1 -0
- package/dist/gateway/static/root/assets/{markdown-view-Dft8ASFD.js → markdown-view-DXubGEic.js} +2 -2
- package/dist/gateway/static/root/assets/{media-plugins-ni5zJ4Ok.js → media-plugins-DLJrmU9J.js} +1 -1
- package/dist/gateway/static/root/assets/message-circle-Badhj-4D.js +1 -0
- package/dist/gateway/static/root/assets/message-square-fVE7Ghj1.js +1 -0
- package/dist/gateway/static/root/assets/message-square-plus-XP0tGdlV.js +1 -0
- package/dist/gateway/static/root/assets/messages-D0G_sZvA.js +3 -0
- package/dist/gateway/static/root/assets/minimize-2-DtOGrlpo.js +1 -0
- package/dist/gateway/static/root/assets/models-hub-cache-B0EUPwTv.js +1 -0
- package/dist/gateway/static/root/assets/network-BUQLY1BV.js +1 -0
- package/dist/gateway/static/root/assets/note-detail-panel-xsKDIJdK.js +5 -0
- package/dist/gateway/static/root/assets/note-image-lightbox-1qg2v-9j.js +1 -0
- package/dist/gateway/static/root/assets/notes-page-BFm7XnWH.js +8 -0
- package/dist/gateway/static/root/assets/page-context-capture-button-C3JiQEKD.js +1 -0
- package/dist/gateway/static/root/assets/paperclip-f1HujQY1.js +1 -0
- package/dist/gateway/static/root/assets/pencil-DmIY3Oa-.js +1 -0
- package/dist/gateway/static/root/assets/power-ZI-pBczI.js +1 -0
- package/dist/gateway/static/root/assets/preview-open-alternatives-buk_gdip.js +1 -0
- package/dist/gateway/static/root/assets/{product-open-page-DQctU8z3.js → product-open-page-DwEEO0Ak.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-CRQGCRSU.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-DcqylysA.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-DWWO6ajd.js → registry-api-tx8XCHOs.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-Cq5MaiRW.js +1 -0
- package/dist/gateway/static/root/assets/rotate-cw-LIg3Am9S.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-xhOSYfiX.js → runtime-tools-settings-panel-De7HmmBu.js} +2 -2
- package/dist/gateway/static/root/assets/scenes-page-GXJ-b3dO.js +2 -0
- package/dist/gateway/static/root/assets/{schema-form-z8IeSdBp.js → schema-form-DPMEuj5D.js} +1 -1
- package/dist/gateway/static/root/assets/search-DA7gz22f.js +1 -0
- package/dist/gateway/static/root/assets/server-BlHCBjiE.js +1 -0
- package/dist/gateway/static/root/assets/sessions-page-C6FwYIRA.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BEyQiZs0.js +1 -0
- package/dist/gateway/static/root/assets/settings-form-section-DM0D-BQ_.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-Br9no5e4.js → settings-page-CWS9yOH3.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-layout-X1x-2Cp9.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-BhGKiTPf.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-CE0SER59.js → share-preview-page-CcRi2yGy.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-DNmcCBfX.js +1 -0
- package/dist/gateway/static/root/assets/skill-api-BCAV_F1P.js +1 -0
- package/dist/gateway/static/root/assets/skill-card-icon-BrrpZ3Mw.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-BEV2WXGk.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-C8zOGpKw.js +2 -0
- package/dist/gateway/static/root/assets/star-BUWJqJ5c.js +1 -0
- package/dist/gateway/static/root/assets/stethoscope-DRqTAtjD.js +1 -0
- package/dist/gateway/static/root/assets/store-SzD1Jvgm.js +1 -0
- package/dist/gateway/static/root/assets/system-settings-panel-C_lajq9u.js +1 -0
- package/dist/gateway/static/root/assets/task-detail-page-Dk8Bmlhw.js +1 -0
- package/dist/gateway/static/root/assets/tunnel-api-CYvKiE_f.js +1 -0
- package/dist/gateway/static/root/assets/upload-rrb46c3c.js +1 -0
- package/dist/gateway/static/root/assets/use-autosave-ZTHe1zCM.js +1 -0
- package/dist/gateway/static/root/assets/user-model-page-C_SPNZbP.js +2 -0
- package/dist/gateway/static/root/assets/user-round-C9jxPhMR.js +1 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-By6Lgbse.js → voice-api-key-field-C8Kpkct-.js} +1 -1
- package/dist/gateway/static/root/assets/voice-config-api-BvzxINUk.js +1 -0
- package/dist/gateway/static/root/assets/wand-sparkles-DWuJz5ya.js +1 -0
- package/dist/gateway/static/root/assets/{work-discovery-overlay-DdhgIlyf.js → work-discovery-overlay-ClB6T-dm.js} +1 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-X0Cyh2AR.js +3 -0
- package/dist/gateway/static/root/assets/workflows-page-BrL6dzf0.js +6 -0
- package/dist/gateway/static/root/connector-icons/SOURCES.md +1 -0
- package/dist/gateway/static/root/connector-icons/wecom.svg +9 -0
- package/dist/gateway/static/root/index.html +26 -8
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-instance-gateway.d.ts +2 -2
- package/dist/src/agent/agent-manager.d.ts +4 -2
- package/dist/src/agent/agent-manager.js +58 -19
- package/dist/src/agent/background-review/coordinator.d.ts +2 -7
- package/dist/src/agent/background-review/coordinator.js +17 -34
- package/dist/src/agent/background-review/prompts.d.ts +13 -5
- package/dist/src/agent/background-review/prompts.js +17 -12
- package/dist/src/agent/background-review/run-background-review.d.ts +3 -3
- package/dist/src/agent/background-review/run-background-review.js +58 -43
- package/dist/src/agent/context/execution-context.js +5 -2
- package/dist/src/agent/mcp/index.js +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +2 -2
- package/dist/src/agent/mcp/oauth/index.js +1 -1
- package/dist/src/agent/mcp/oauth/mcp-oauth-manager.js +2 -2
- package/dist/src/agent/mcp/oauth/mcp-oauth-provider.js +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
- package/dist/src/agent/prompt/sections/tooling.js +3 -0
- package/dist/src/agent/service/direct-turn-helpers.js +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +12 -0
- package/dist/src/agent/tools/user-context-tool.js +29 -4
- package/dist/src/automations/domain/types.d.ts +7 -1
- package/dist/src/automations/service/action-executor.d.ts +2 -2
- package/dist/src/automations/service/action-executor.js +36 -13
- package/dist/src/automations/service/automation-service.js +2 -1
- package/dist/src/browser/automations/index.js +2 -2
- package/dist/src/browser/automations/service.d.ts +11 -2
- package/dist/src/browser/automations/service.js +19 -5
- package/dist/src/capabilities/readiness/from-config.d.ts +0 -1
- package/dist/src/capabilities/readiness/from-config.js +2 -4
- package/dist/src/cli/commands/auth.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/extension-agent-plugin.js +2 -1
- package/dist/src/cli/commands/onboard/model.js +1 -1
- package/dist/src/cli/commands/providers.js +1 -1
- package/dist/src/config/schema.js +4 -4
- package/dist/src/connectors/china-catalog.js +5 -1
- package/dist/src/connectors/connected-source-ingestion.js +6 -1
- package/dist/src/connectors/connected-source-observations.d.ts +10 -0
- package/dist/src/connectors/connected-source-observations.js +80 -0
- package/dist/src/connectors/connected-source-understanding.js +198 -8
- package/dist/src/connectors/learning-coordinator.js +63 -26
- package/dist/src/connectors/learning-recipes.js +19 -2
- package/dist/src/discussions/audio-repair.d.ts +1 -1
- package/dist/src/discussions/live-worker.js +1 -3
- package/dist/src/discussions/recording.js +2 -2
- package/dist/src/discussions/sealer.js +2 -2
- package/dist/src/extensions/agent-plugins/auth.d.ts +2 -2
- package/dist/src/extensions/agent-plugins/auth.js +6 -35
- package/dist/src/extensions/agent-plugins/credentials.d.ts +2 -0
- package/dist/src/extensions/agent-plugins/credentials.js +37 -0
- package/dist/src/extensions/agent-plugins/plugin-oauth-scope.d.ts +1 -0
- package/dist/src/extensions/agent-plugins/plugin-oauth-scope.js +8 -0
- package/dist/src/extensions/marketplace.d.ts +4 -0
- package/dist/src/extensions/marketplace.js +4 -0
- package/dist/src/gateway/file-space-service.d.ts +9 -2
- package/dist/src/gateway/hono/routes/agent-plugins.js +2 -1
- package/dist/src/gateway/hono/routes/config.js +0 -3
- package/dist/src/gateway/hono/routes/connectors.js +3 -10
- package/dist/src/gateway/hono/routes/context-sources.d.ts +0 -1
- package/dist/src/gateway/hono/routes/context-sources.js +12 -15
- package/dist/src/gateway/hono/routes/status.js +0 -1
- package/dist/src/gateway/hono/routes/user-model.js +21 -3
- package/dist/src/gateway/hono/routes/voice.js +0 -67
- package/dist/src/gateway/service.js +6 -4
- package/dist/src/media-understanding/types.d.ts +1 -1
- package/dist/src/memory-maintenance/service.d.ts +1 -0
- package/dist/src/memory-maintenance/service.js +13 -0
- package/dist/src/migrations/retired-local-stt.d.ts +2 -0
- package/dist/src/migrations/retired-local-stt.js +52 -0
- package/dist/src/migrations/runner.js +2 -1
- package/dist/src/session/turn-outcome-projector.js +1 -1
- package/dist/src/storage/sqlite/connection.js +1 -0
- package/dist/src/storage/sqlite/migrations/207_user_model_policy_contract.sql +121 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/sql-assets.d.ts +1 -0
- package/dist/src/storage/sqlite/sql-assets.js +7 -4
- package/dist/src/tasks/index.js +2 -2
- package/dist/src/tasks/task-application-service.d.ts +1 -0
- package/dist/src/tasks/task-application-service.js +4 -2
- package/dist/src/tasks/task-context-assembler.js +10 -1
- package/dist/src/tasks/task-run-dispatcher.d.ts +1 -0
- package/dist/src/tasks/task-run-dispatcher.js +15 -2
- package/dist/src/user-context/sources/consent-repository.d.ts +7 -0
- package/dist/src/user-context/sources/consent-repository.js +81 -0
- package/dist/src/user-context/sources/index.d.ts +1 -0
- package/dist/src/user-context/sources/index.js +2 -1
- package/dist/src/user-context/sources/repository.js +73 -1
- package/dist/src/user-context/sources/types.d.ts +16 -0
- package/dist/src/user-model/action-rule-suggestions.d.ts +11 -0
- package/dist/src/user-model/action-rule-suggestions.js +29 -0
- package/dist/src/user-model/bootstrap.js +1 -1
- package/dist/src/user-model/capture/executor.js +83 -7
- package/dist/src/user-model/capture/semantic.d.ts +5 -2
- package/dist/src/user-model/capture/semantic.js +27 -11
- package/dist/src/user-model/domain.d.ts +26 -0
- package/dist/src/user-model/domain.js +40 -2
- package/dist/src/user-model/index.d.ts +2 -0
- package/dist/src/user-model/index.js +6 -4
- package/dist/src/user-model/maintenance-policy.d.ts +1 -0
- package/dist/src/user-model/maintenance-policy.js +13 -0
- package/dist/src/user-model/observation-repository.d.ts +48 -0
- package/dist/src/user-model/observation-repository.js +100 -0
- package/dist/src/user-model/repository.d.ts +5 -0
- package/dist/src/user-model/repository.js +121 -10
- package/dist/src/user-model/usage-policy.d.ts +5 -2
- package/dist/src/user-model/usage-policy.js +2 -2
- package/dist/src/voice/audio/normalize.d.ts +1 -1
- package/dist/src/voice/audio/normalize.js +1 -1
- package/dist/src/voice/{local → audio}/wav.js +1 -1
- package/dist/src/voice/language-profile.js +10 -16
- package/dist/src/voice/metadata/builtin.js +0 -46
- package/dist/src/voice/stt/providers/index.d.ts +0 -1
- package/dist/src/voice/stt/providers/index.js +1 -2
- package/dist/src/voice/stt/types.js +3 -4
- package/dist/src/voice/tts/merge-config.js +1 -1
- package/dist/src/voice/tts/speech-registry.d.ts +1 -1
- package/dist/src/voice/tts/types.d.ts +1 -1
- package/dist/src/work-discovery/analyzer.js +6 -5
- package/dist/src/work-discovery/service.js +2 -2
- package/dist/src/work-discovery/types.d.ts +1 -1
- package/dist/src/workflows/context/workflow-context.js +5 -1
- package/dist/src/workflows/index.js +2 -2
- package/dist/src/workflows/service/workflow-run-service.d.ts +1 -0
- package/dist/src/workflows/service/workflow-run-service.js +13 -4
- package/package.json +13 -17
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-CDHe8gJf.js +0 -1
- package/dist/gateway/static/root/assets/agent-plugin-dialog-DMv-udoZ.js +0 -1
- package/dist/gateway/static/root/assets/agents-D_xOAXgj.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-Dz2g7eAN.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-BUZhG9aJ.js +0 -7
- package/dist/gateway/static/root/assets/browser-automations-page-DuOaridE.js +0 -3
- package/dist/gateway/static/root/assets/browser-settings-page-D2_PgHep.js +0 -3
- package/dist/gateway/static/root/assets/capabilities-settings-panel-7Y_pJqyt.js +0 -8
- package/dist/gateway/static/root/assets/channels-settings-B-Igy1ro.js +0 -1
- package/dist/gateway/static/root/assets/computer-settings-page-aRG2lU4w.js +0 -1
- package/dist/gateway/static/root/assets/connector-service-page-B5EhnfJH.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-7HfRt1LW.js +0 -2
- package/dist/gateway/static/root/assets/date-picker-CtDyij_x.js +0 -1
- package/dist/gateway/static/root/assets/dependency-picker-z6ouWxmz.js +0 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-z-0aQ5ct.js +0 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-DlmhQvY5.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-BfDVlvy6.js +0 -1
- package/dist/gateway/static/root/assets/home-page-CI_eQTPL.js +0 -1
- package/dist/gateway/static/root/assets/imports-page-DFpQfHVU.js +0 -1
- package/dist/gateway/static/root/assets/index-19rMUT3d.js +0 -121
- package/dist/gateway/static/root/assets/index-BKL5tg2f.css +0 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-C9kaP3Dy.js +0 -1
- package/dist/gateway/static/root/assets/local-apps-page-BxC_LTqq.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-Ok5SpG-G.js +0 -2
- package/dist/gateway/static/root/assets/management-settings-aOzRaQHM.js +0 -1
- package/dist/gateway/static/root/assets/messages-kFWhF6_t.js +0 -3
- package/dist/gateway/static/root/assets/note-detail-panel-C9OEltN9.js +0 -5
- package/dist/gateway/static/root/assets/notes-page-Dj9rMgdi.js +0 -8
- package/dist/gateway/static/root/assets/page-context-capture-button-BJA3d8vU.js +0 -1
- package/dist/gateway/static/root/assets/page-tabs-Dyc3wKkl.js +0 -1
- package/dist/gateway/static/root/assets/preview-open-alternatives-tIOIQbNX.js +0 -1
- package/dist/gateway/static/root/assets/project-detail-page-Dy-EwZcc.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-JaGKa6rM.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-Cb8-nd60.js +0 -1
- package/dist/gateway/static/root/assets/scenes-page-ClBkFdRY.js +0 -2
- package/dist/gateway/static/root/assets/sessions-page-BYW5l_nY.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-CDNwmXuH.js +0 -1
- package/dist/gateway/static/root/assets/settings-form-section-BXTJAser.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-layout-D6745w0p.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-D2N9764S.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-Dk3_QOKQ.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-CPt61fEv.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-Db6PB2C6.js +0 -2
- package/dist/gateway/static/root/assets/skills-page.utils-DrtW5FBy.js +0 -1
- package/dist/gateway/static/root/assets/system-settings-panel-CuY1Zh5s.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-o7RiDUMi.js +0 -1
- package/dist/gateway/static/root/assets/tunnel-api-PGHDgvWb.js +0 -1
- package/dist/gateway/static/root/assets/use-autosave-B55oBQUt.js +0 -1
- package/dist/gateway/static/root/assets/user-model-page-DspelwAa.js +0 -2
- package/dist/gateway/static/root/assets/voice-config-api-BaxITrwZ.js +0 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-BOJYQaxX.js +0 -3
- package/dist/gateway/static/root/assets/workflows-page-6ObD0IQZ.js +0 -6
- package/dist/src/voice/local/model-files.d.ts +0 -14
- package/dist/src/voice/local/model-files.js +0 -92
- package/dist/src/voice/local/model-manager.d.ts +0 -18
- package/dist/src/voice/local/model-manager.js +0 -133
- package/dist/src/voice/local/models.d.ts +0 -28
- package/dist/src/voice/local/models.js +0 -99
- package/dist/src/voice/local/provider-switch.d.ts +0 -4
- package/dist/src/voice/local/provider-switch.js +0 -36
- package/dist/src/voice/local/runtime-client.d.ts +0 -28
- package/dist/src/voice/local/runtime-client.js +0 -183
- package/dist/src/voice/local/runtime-worker.d.ts +0 -1
- package/dist/src/voice/local/runtime-worker.js +0 -271
- package/dist/src/voice/stt/providers/local-transcription.d.ts +0 -2
- package/dist/src/voice/stt/providers/local-transcription.js +0 -53
- /package/dist/src/voice/{local → audio}/wav.d.ts +0 -0
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { dirname, join } from "node:path";
|
|
2
|
-
import { createReadStream, createWriteStream } from "node:fs";
|
|
3
|
-
import { createHash } from "node:crypto";
|
|
4
|
-
import { mkdir, rm, stat } from "node:fs/promises";
|
|
5
|
-
import { pipeline } from "node:stream/promises";
|
|
6
|
-
import { Readable } from "node:stream";
|
|
7
|
-
//#region src/voice/local/model-files.ts
|
|
8
|
-
function resolveModelFileUrl(remoteHost, model, file) {
|
|
9
|
-
const base = remoteHost.endsWith("/") ? remoteHost : `${remoteHost}/`;
|
|
10
|
-
const path = file.path.split("/").map(encodeURIComponent).join("/");
|
|
11
|
-
return new URL(`${model.repository}/resolve/${model.revision}/${path}`, base).toString();
|
|
12
|
-
}
|
|
13
|
-
async function sha256File(path) {
|
|
14
|
-
const hash = createHash("sha256");
|
|
15
|
-
for await (const chunk of createReadStream(path)) hash.update(chunk);
|
|
16
|
-
return hash.digest("hex");
|
|
17
|
-
}
|
|
18
|
-
async function downloadFile(url, destination, expectedBytes, onBytes) {
|
|
19
|
-
const existing = await stat(destination).catch(() => null);
|
|
20
|
-
let offset = existing?.isFile() ? existing.size : 0;
|
|
21
|
-
if (offset > expectedBytes) {
|
|
22
|
-
await rm(destination, { force: true });
|
|
23
|
-
offset = 0;
|
|
24
|
-
}
|
|
25
|
-
if (offset === expectedBytes) {
|
|
26
|
-
onBytes(offset);
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
const response = await fetch(url, {
|
|
30
|
-
redirect: "follow",
|
|
31
|
-
headers: offset > 0 ? { Range: `bytes=${offset}-` } : void 0
|
|
32
|
-
});
|
|
33
|
-
if (!response.ok || !response.body) throw new Error(`Model download failed with HTTP ${response.status}`);
|
|
34
|
-
const isResume = offset > 0 && response.status === 206;
|
|
35
|
-
if (offset > 0 && !isResume) offset = 0;
|
|
36
|
-
const declaredBytes = Number(response.headers.get("content-length"));
|
|
37
|
-
const expectedResponseBytes = expectedBytes - offset;
|
|
38
|
-
if (Number.isFinite(declaredBytes) && declaredBytes > 0 && declaredBytes !== expectedResponseBytes) throw new Error(`Model download size mismatch: expected ${expectedResponseBytes}, received ${declaredBytes}`);
|
|
39
|
-
await mkdir(dirname(destination), { recursive: true });
|
|
40
|
-
let loaded = offset;
|
|
41
|
-
let lastReportedBytes = offset;
|
|
42
|
-
let lastReportedAt = 0;
|
|
43
|
-
const source = Readable.fromWeb(response.body);
|
|
44
|
-
source.on("data", (chunk) => {
|
|
45
|
-
loaded += chunk.length;
|
|
46
|
-
const now = Date.now();
|
|
47
|
-
if (loaded === expectedBytes || loaded - lastReportedBytes >= 256 * 1024 || now - lastReportedAt >= 250) {
|
|
48
|
-
lastReportedBytes = loaded;
|
|
49
|
-
lastReportedAt = now;
|
|
50
|
-
onBytes(loaded);
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
await pipeline(source, createWriteStream(destination, {
|
|
54
|
-
flags: isResume ? "a" : "w",
|
|
55
|
-
mode: 384
|
|
56
|
-
}));
|
|
57
|
-
if (loaded !== expectedBytes) throw new Error(`Model download was incomplete: expected ${expectedBytes}, received ${loaded}`);
|
|
58
|
-
}
|
|
59
|
-
async function verifyModelFile(path, file) {
|
|
60
|
-
if ((await stat(path)).size !== file.bytes) throw new Error(`Model file size mismatch for ${file.path}`);
|
|
61
|
-
if (await sha256File(path) !== file.sha256) throw new Error(`Model file checksum mismatch for ${file.path}`);
|
|
62
|
-
}
|
|
63
|
-
async function downloadLocalVoiceModelFiles(options) {
|
|
64
|
-
const files = options.model.files;
|
|
65
|
-
if (!files?.length) throw new Error(`No downloadable files declared for ${options.model.id}`);
|
|
66
|
-
const total = files.reduce((sum, file) => sum + file.bytes, 0);
|
|
67
|
-
let completedBytes = 0;
|
|
68
|
-
for (const file of files) {
|
|
69
|
-
const destination = join(options.destinationDir, file.path);
|
|
70
|
-
let lastError;
|
|
71
|
-
for (const host of options.remoteHosts) try {
|
|
72
|
-
await downloadFile(resolveModelFileUrl(host, options.model, file), destination, file.bytes, (fileBytes) => options.onProgress?.({
|
|
73
|
-
status: "download",
|
|
74
|
-
file: file.path,
|
|
75
|
-
loaded: completedBytes + fileBytes,
|
|
76
|
-
total,
|
|
77
|
-
progress: (completedBytes + fileBytes) / total
|
|
78
|
-
}));
|
|
79
|
-
await verifyModelFile(destination, file);
|
|
80
|
-
lastError = void 0;
|
|
81
|
-
break;
|
|
82
|
-
} catch (error) {
|
|
83
|
-
lastError = error;
|
|
84
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
85
|
-
if (message.includes("checksum mismatch") || message.includes("size mismatch")) await rm(destination, { force: true });
|
|
86
|
-
}
|
|
87
|
-
if (lastError) throw lastError;
|
|
88
|
-
completedBytes += file.bytes;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
//#endregion
|
|
92
|
-
export { downloadLocalVoiceModelFiles };
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export type LocalVoiceModelState = 'not_installed' | 'downloading' | 'ready' | 'error';
|
|
2
|
-
export interface LocalVoiceModelStatus {
|
|
3
|
-
id: string;
|
|
4
|
-
name: string;
|
|
5
|
-
description: string;
|
|
6
|
-
approximateBytes: number;
|
|
7
|
-
engine: string;
|
|
8
|
-
languages: readonly string[];
|
|
9
|
-
recommended?: boolean;
|
|
10
|
-
state: LocalVoiceModelState;
|
|
11
|
-
progress?: number;
|
|
12
|
-
downloadedBytes?: number;
|
|
13
|
-
totalBytes?: number;
|
|
14
|
-
error?: string;
|
|
15
|
-
}
|
|
16
|
-
export declare function listLocalVoiceModelStatuses(): Promise<LocalVoiceModelStatus[]>;
|
|
17
|
-
export declare function startLocalVoiceModelInstall(modelId: string): LocalVoiceModelStatus;
|
|
18
|
-
export declare function removeLocalVoiceModel(modelId: string): Promise<void>;
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import { createLogger } from "../../utils/logger/index.js";
|
|
2
|
-
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { LOCAL_VOICE_MODELS, getLocalVoiceModel, isLocalVoiceModelInstalled, resolveLocalVoiceModelDir, resolveLocalVoiceModelMarkerPath } from "./models.js";
|
|
4
|
-
import { getLocalVoiceRuntimeClient } from "./runtime-client.js";
|
|
5
|
-
import { join } from "node:path";
|
|
6
|
-
import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
7
|
-
//#region src/voice/local/model-manager.ts
|
|
8
|
-
init_logger();
|
|
9
|
-
const log = createLogger("LocalVoice:Models");
|
|
10
|
-
const jobs = /* @__PURE__ */ new Map();
|
|
11
|
-
function progressFraction(progress) {
|
|
12
|
-
if (typeof progress.progress === "number" && Number.isFinite(progress.progress)) return progress.progress > 1 ? progress.progress / 100 : progress.progress;
|
|
13
|
-
if (typeof progress.loaded === "number" && typeof progress.total === "number" && progress.total > 0) return progress.loaded / progress.total;
|
|
14
|
-
}
|
|
15
|
-
async function listLocalVoiceModelStatuses() {
|
|
16
|
-
return Promise.all(LOCAL_VOICE_MODELS.map(async (model) => {
|
|
17
|
-
const active = jobs.get(model.id);
|
|
18
|
-
if (active) return { ...active };
|
|
19
|
-
if (!isLocalVoiceModelInstalled(model.id)) return {
|
|
20
|
-
id: model.id,
|
|
21
|
-
name: model.name,
|
|
22
|
-
description: model.description,
|
|
23
|
-
approximateBytes: model.approximateBytes,
|
|
24
|
-
engine: model.engine,
|
|
25
|
-
languages: model.languages,
|
|
26
|
-
recommended: model.recommended,
|
|
27
|
-
state: "not_installed"
|
|
28
|
-
};
|
|
29
|
-
let installedAt;
|
|
30
|
-
try {
|
|
31
|
-
installedAt = JSON.parse(await readFile(resolveLocalVoiceModelMarkerPath(model.id), "utf8")).installedAt;
|
|
32
|
-
} catch {}
|
|
33
|
-
return {
|
|
34
|
-
id: model.id,
|
|
35
|
-
name: model.name,
|
|
36
|
-
description: installedAt ? `${model.description} Installed ${installedAt}.` : model.description,
|
|
37
|
-
approximateBytes: model.approximateBytes,
|
|
38
|
-
engine: model.engine,
|
|
39
|
-
languages: model.languages,
|
|
40
|
-
recommended: model.recommended,
|
|
41
|
-
state: "ready"
|
|
42
|
-
};
|
|
43
|
-
}));
|
|
44
|
-
}
|
|
45
|
-
function startLocalVoiceModelInstall(modelId) {
|
|
46
|
-
const model = getLocalVoiceModel(modelId);
|
|
47
|
-
const existing = jobs.get(model.id);
|
|
48
|
-
if (existing?.state === "downloading") return { ...existing };
|
|
49
|
-
const status = {
|
|
50
|
-
id: model.id,
|
|
51
|
-
name: model.name,
|
|
52
|
-
description: model.description,
|
|
53
|
-
approximateBytes: model.approximateBytes,
|
|
54
|
-
engine: model.engine,
|
|
55
|
-
languages: model.languages,
|
|
56
|
-
recommended: model.recommended,
|
|
57
|
-
state: "downloading",
|
|
58
|
-
progress: 0
|
|
59
|
-
};
|
|
60
|
-
jobs.set(model.id, status);
|
|
61
|
-
(async () => {
|
|
62
|
-
const modelDir = resolveLocalVoiceModelDir(model.id);
|
|
63
|
-
const stagingDir = `${modelDir}.download`;
|
|
64
|
-
try {
|
|
65
|
-
if (model.engine === "transformers.js") await rm(stagingDir, {
|
|
66
|
-
recursive: true,
|
|
67
|
-
force: true
|
|
68
|
-
});
|
|
69
|
-
await mkdir(stagingDir, { recursive: true });
|
|
70
|
-
await getLocalVoiceRuntimeClient().request("model.install", {
|
|
71
|
-
modelId: model.id,
|
|
72
|
-
cacheDir: stagingDir
|
|
73
|
-
}, { onProgress: (progress) => {
|
|
74
|
-
const current = jobs.get(model.id);
|
|
75
|
-
if (!current) return;
|
|
76
|
-
current.progress = progressFraction(progress) ?? current.progress;
|
|
77
|
-
current.downloadedBytes = progress.loaded;
|
|
78
|
-
current.totalBytes = progress.total;
|
|
79
|
-
} });
|
|
80
|
-
await writeFile(join(stagingDir, "installed.json"), `${JSON.stringify({
|
|
81
|
-
modelId: model.id,
|
|
82
|
-
repository: model.repository,
|
|
83
|
-
revision: model.revision,
|
|
84
|
-
engine: model.engine,
|
|
85
|
-
...model.dtype ? { dtype: model.dtype } : {},
|
|
86
|
-
installedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
87
|
-
}, null, 2)}\n`, { mode: 384 });
|
|
88
|
-
await rm(modelDir, {
|
|
89
|
-
recursive: true,
|
|
90
|
-
force: true
|
|
91
|
-
});
|
|
92
|
-
await rename(stagingDir, modelDir);
|
|
93
|
-
jobs.delete(model.id);
|
|
94
|
-
log.info({ modelId: model.id }, "Local voice model installed");
|
|
95
|
-
} catch (error) {
|
|
96
|
-
if (model.engine === "transformers.js") await rm(stagingDir, {
|
|
97
|
-
recursive: true,
|
|
98
|
-
force: true
|
|
99
|
-
}).catch(() => {});
|
|
100
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
101
|
-
jobs.set(model.id, {
|
|
102
|
-
...status,
|
|
103
|
-
state: "error",
|
|
104
|
-
error: message
|
|
105
|
-
});
|
|
106
|
-
log.error({
|
|
107
|
-
err: error,
|
|
108
|
-
modelId: model.id
|
|
109
|
-
}, `Local voice model installation failed: ${message}`);
|
|
110
|
-
}
|
|
111
|
-
})();
|
|
112
|
-
return { ...status };
|
|
113
|
-
}
|
|
114
|
-
async function removeLocalVoiceModel(modelId) {
|
|
115
|
-
const model = getLocalVoiceModel(modelId);
|
|
116
|
-
if (jobs.get(model.id)?.state === "downloading") throw new Error("Cannot remove a model while it is downloading");
|
|
117
|
-
try {
|
|
118
|
-
await getLocalVoiceRuntimeClient().request("model.unload", { modelId: model.id }, { timeoutMs: 1e4 });
|
|
119
|
-
} catch (error) {
|
|
120
|
-
log.warn({
|
|
121
|
-
err: error,
|
|
122
|
-
modelId: model.id
|
|
123
|
-
}, "Local voice runtime unload failed; removing model files");
|
|
124
|
-
}
|
|
125
|
-
await rm(resolveLocalVoiceModelDir(model.id), {
|
|
126
|
-
recursive: true,
|
|
127
|
-
force: true
|
|
128
|
-
});
|
|
129
|
-
jobs.delete(model.id);
|
|
130
|
-
log.info({ modelId: model.id }, "Local voice model removed");
|
|
131
|
-
}
|
|
132
|
-
//#endregion
|
|
133
|
-
export { listLocalVoiceModelStatuses, removeLocalVoiceModel, startLocalVoiceModelInstall };
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
export type LocalVoiceModelId = 'sensevoice-small' | 'tiny' | 'base' | 'small';
|
|
2
|
-
export type LocalVoiceEngine = 'sherpa-onnx' | 'transformers.js';
|
|
3
|
-
export interface LocalVoiceModelFile {
|
|
4
|
-
path: string;
|
|
5
|
-
bytes: number;
|
|
6
|
-
sha256: string;
|
|
7
|
-
}
|
|
8
|
-
export interface LocalVoiceModelDefinition {
|
|
9
|
-
id: LocalVoiceModelId;
|
|
10
|
-
name: string;
|
|
11
|
-
description: string;
|
|
12
|
-
engine: LocalVoiceEngine;
|
|
13
|
-
repository: string;
|
|
14
|
-
revision: string;
|
|
15
|
-
dtype?: 'q8';
|
|
16
|
-
files?: readonly LocalVoiceModelFile[];
|
|
17
|
-
languages: readonly string[];
|
|
18
|
-
recommended?: boolean;
|
|
19
|
-
approximateBytes: number;
|
|
20
|
-
}
|
|
21
|
-
export declare const DEFAULT_LOCAL_VOICE_MODEL_ID: LocalVoiceModelId;
|
|
22
|
-
export declare const LOCAL_VOICE_MODELS: readonly LocalVoiceModelDefinition[];
|
|
23
|
-
export declare function resolveLocalVoiceRootDir(): string;
|
|
24
|
-
export declare function resolveLocalVoiceModelDir(modelId: string): string;
|
|
25
|
-
export declare function resolveLocalVoiceModelMarkerPath(modelId: string): string;
|
|
26
|
-
export declare function getLocalVoiceModel(modelId: string | undefined): LocalVoiceModelDefinition;
|
|
27
|
-
export declare function isLocalVoiceModelInstalled(modelId: string): boolean;
|
|
28
|
-
export declare function hasInstalledLocalVoiceModel(): boolean;
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { resolveStateDir } from "../../config/paths-state.js";
|
|
2
|
-
import { init_paths } from "../../config/paths.js";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
import { existsSync } from "node:fs";
|
|
5
|
-
//#region src/voice/local/models.ts
|
|
6
|
-
init_paths();
|
|
7
|
-
const DEFAULT_LOCAL_VOICE_MODEL_ID = "sensevoice-small";
|
|
8
|
-
const LOCAL_VOICE_MODELS = [
|
|
9
|
-
{
|
|
10
|
-
id: "sensevoice-small",
|
|
11
|
-
name: "SenseVoice Small 中文",
|
|
12
|
-
description: "中文推荐;适合普通话、粤语和中英混说,支持标点与数字规整。",
|
|
13
|
-
engine: "sherpa-onnx",
|
|
14
|
-
repository: "csukuangfj/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17",
|
|
15
|
-
revision: "2365baeacb507f821a0c8120fcee3d484dba7a07",
|
|
16
|
-
files: [
|
|
17
|
-
{
|
|
18
|
-
path: "model.int8.onnx",
|
|
19
|
-
bytes: 239233841,
|
|
20
|
-
sha256: "c71f0ce00bec95b07744e116345e33d8cbbe08cef896382cf907bf4b51a2cd51"
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
path: "tokens.txt",
|
|
24
|
-
bytes: 315894,
|
|
25
|
-
sha256: "f449eb28dc567533d7fa59be34e2abca8784f771850c78a47fb731a31429a1dc"
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
path: "LICENSE",
|
|
29
|
-
bytes: 71,
|
|
30
|
-
sha256: "221c6df10b0931a5629adad671ea48fb7747e034c414b6d2bfa275bc3dd4ea17"
|
|
31
|
-
}
|
|
32
|
-
],
|
|
33
|
-
languages: [
|
|
34
|
-
"zh",
|
|
35
|
-
"yue",
|
|
36
|
-
"en",
|
|
37
|
-
"ja",
|
|
38
|
-
"ko"
|
|
39
|
-
],
|
|
40
|
-
recommended: true,
|
|
41
|
-
approximateBytes: 239549806
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
id: "tiny",
|
|
45
|
-
name: "Whisper Tiny",
|
|
46
|
-
description: "Fastest and smallest; best for short commands.",
|
|
47
|
-
engine: "transformers.js",
|
|
48
|
-
repository: "onnx-community/whisper-tiny",
|
|
49
|
-
revision: "ff4177021cc41f7db950912b73ea4fdf7d01d8e7",
|
|
50
|
-
dtype: "q8",
|
|
51
|
-
languages: ["multilingual"],
|
|
52
|
-
approximateBytes: 45 * 1024 * 1024
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
id: "base",
|
|
56
|
-
name: "Whisper Base",
|
|
57
|
-
description: "Recommended balance of accuracy, speed, and disk use.",
|
|
58
|
-
engine: "transformers.js",
|
|
59
|
-
repository: "onnx-community/whisper-base",
|
|
60
|
-
revision: "1846881b6b3a3024392c1eea3ad983695bc23925",
|
|
61
|
-
dtype: "q8",
|
|
62
|
-
languages: ["multilingual"],
|
|
63
|
-
approximateBytes: 80 * 1024 * 1024
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
id: "small",
|
|
67
|
-
name: "Whisper Small",
|
|
68
|
-
description: "Higher accuracy with more memory and disk use.",
|
|
69
|
-
engine: "transformers.js",
|
|
70
|
-
repository: "onnx-community/whisper-small",
|
|
71
|
-
revision: "36050c46d777d46dc4b5f43f6d90574fc38f8732",
|
|
72
|
-
dtype: "q8",
|
|
73
|
-
languages: ["multilingual"],
|
|
74
|
-
approximateBytes: 245 * 1024 * 1024
|
|
75
|
-
}
|
|
76
|
-
];
|
|
77
|
-
function resolveLocalVoiceRootDir() {
|
|
78
|
-
return process.env.XOPC_VOICE_MODEL_DIR?.trim() || join(resolveStateDir(), "voice");
|
|
79
|
-
}
|
|
80
|
-
function resolveLocalVoiceModelDir(modelId) {
|
|
81
|
-
return join(resolveLocalVoiceRootDir(), "models", modelId);
|
|
82
|
-
}
|
|
83
|
-
function resolveLocalVoiceModelMarkerPath(modelId) {
|
|
84
|
-
return join(resolveLocalVoiceModelDir(modelId), "installed.json");
|
|
85
|
-
}
|
|
86
|
-
function getLocalVoiceModel(modelId) {
|
|
87
|
-
const id = modelId?.trim() || "sensevoice-small";
|
|
88
|
-
const model = LOCAL_VOICE_MODELS.find((entry) => entry.id === id);
|
|
89
|
-
if (!model) throw new Error(`Unknown local voice model: ${id}`);
|
|
90
|
-
return model;
|
|
91
|
-
}
|
|
92
|
-
function isLocalVoiceModelInstalled(modelId) {
|
|
93
|
-
return existsSync(resolveLocalVoiceModelMarkerPath(modelId));
|
|
94
|
-
}
|
|
95
|
-
function hasInstalledLocalVoiceModel() {
|
|
96
|
-
return LOCAL_VOICE_MODELS.some((model) => isLocalVoiceModelInstalled(model.id));
|
|
97
|
-
}
|
|
98
|
-
//#endregion
|
|
99
|
-
export { DEFAULT_LOCAL_VOICE_MODEL_ID, LOCAL_VOICE_MODELS, getLocalVoiceModel, hasInstalledLocalVoiceModel, isLocalVoiceModelInstalled, resolveLocalVoiceModelDir, resolveLocalVoiceModelMarkerPath, resolveLocalVoiceRootDir };
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { Config } from '../../config/schema.js';
|
|
2
|
-
export declare function localVoiceModelForProviderSwitch(previousProvider: string | undefined, config: Config): string | null;
|
|
3
|
-
/** Start a missing local STT model only after the provider changes to xopc-local. */
|
|
4
|
-
export declare function prepareLocalVoiceModelAfterProviderSwitch(previousProvider: string | undefined, config: Config): void;
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { createLogger } from "../../utils/logger/index.js";
|
|
2
|
-
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { DEFAULT_LOCAL_VOICE_MODEL_ID, isLocalVoiceModelInstalled } from "./models.js";
|
|
4
|
-
import { startLocalVoiceModelInstall } from "./model-manager.js";
|
|
5
|
-
//#region src/voice/local/provider-switch.ts
|
|
6
|
-
init_logger();
|
|
7
|
-
const log = createLogger("Voice:Local");
|
|
8
|
-
function localVoiceModelForProviderSwitch(previousProvider, config) {
|
|
9
|
-
const audio = config.tools?.media?.audio;
|
|
10
|
-
const previous = previousProvider?.trim() || "xopc-local";
|
|
11
|
-
if (audio?.enabled === false || previous === "xopc-local" || audio?.provider !== "xopc-local") return null;
|
|
12
|
-
const configuredModel = audio.providers?.["xopc-local"]?.model;
|
|
13
|
-
return typeof configuredModel === "string" && configuredModel.trim() ? configuredModel.trim() : DEFAULT_LOCAL_VOICE_MODEL_ID;
|
|
14
|
-
}
|
|
15
|
-
/** Start a missing local STT model only after the provider changes to xopc-local. */
|
|
16
|
-
function prepareLocalVoiceModelAfterProviderSwitch(previousProvider, config) {
|
|
17
|
-
const modelId = localVoiceModelForProviderSwitch(previousProvider, config);
|
|
18
|
-
if (!modelId || isLocalVoiceModelInstalled(modelId)) return;
|
|
19
|
-
try {
|
|
20
|
-
startLocalVoiceModelInstall(modelId);
|
|
21
|
-
log.info({
|
|
22
|
-
modelId,
|
|
23
|
-
phase: "provider_switch"
|
|
24
|
-
}, "Local voice model preparation started");
|
|
25
|
-
} catch (err) {
|
|
26
|
-
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
27
|
-
log.warn({
|
|
28
|
-
err,
|
|
29
|
-
modelId,
|
|
30
|
-
errorMessage,
|
|
31
|
-
phase: "provider_switch"
|
|
32
|
-
}, `Local voice model preparation failed: ${errorMessage}`);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
//#endregion
|
|
36
|
-
export { localVoiceModelForProviderSwitch, prepareLocalVoiceModelAfterProviderSwitch };
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
export interface LocalVoiceRuntimeProgress {
|
|
2
|
-
status?: string;
|
|
3
|
-
file?: string;
|
|
4
|
-
progress?: number;
|
|
5
|
-
loaded?: number;
|
|
6
|
-
total?: number;
|
|
7
|
-
}
|
|
8
|
-
export declare class LocalVoiceRuntimeClient {
|
|
9
|
-
private child;
|
|
10
|
-
private nextId;
|
|
11
|
-
private pending;
|
|
12
|
-
private requestTail;
|
|
13
|
-
request<T>(method: string, params?: Record<string, unknown>, options?: {
|
|
14
|
-
signal?: AbortSignal;
|
|
15
|
-
timeoutMs?: number;
|
|
16
|
-
/** Health/status probes must never terminate an active model download on timeout. */
|
|
17
|
-
stopOnTimeout?: boolean;
|
|
18
|
-
onProgress?: (progress: LocalVoiceRuntimeProgress) => void;
|
|
19
|
-
}): Promise<T>;
|
|
20
|
-
private executeRequest;
|
|
21
|
-
stop(): void;
|
|
22
|
-
private ensureStarted;
|
|
23
|
-
private handleLine;
|
|
24
|
-
private rejectAll;
|
|
25
|
-
private deletePending;
|
|
26
|
-
}
|
|
27
|
-
export declare function getLocalVoiceRuntimeClient(): LocalVoiceRuntimeClient;
|
|
28
|
-
export declare function resetLocalVoiceRuntimeForTests(): void;
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
import { createLogger } from "../../utils/logger/index.js";
|
|
2
|
-
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { resolveLocalVoiceRootDir } from "./models.js";
|
|
4
|
-
import { existsSync } from "node:fs";
|
|
5
|
-
import { fileURLToPath } from "node:url";
|
|
6
|
-
import { spawn } from "node:child_process";
|
|
7
|
-
import { createInterface } from "node:readline";
|
|
8
|
-
//#region src/voice/local/runtime-client.ts
|
|
9
|
-
init_logger();
|
|
10
|
-
const log = createLogger("LocalVoice:Runtime");
|
|
11
|
-
const DEFAULT_REQUEST_TIMEOUT_MS = 10 * 6e4;
|
|
12
|
-
function resolveWorkerCommand() {
|
|
13
|
-
const configured = process.env.XOPC_VOICE_RUNTIME_ENTRY?.trim();
|
|
14
|
-
if (configured) return {
|
|
15
|
-
entry: configured,
|
|
16
|
-
args: [configured]
|
|
17
|
-
};
|
|
18
|
-
const jsEntry = fileURLToPath(new URL("./runtime-worker.js", import.meta.url));
|
|
19
|
-
if (existsSync(jsEntry)) return {
|
|
20
|
-
entry: jsEntry,
|
|
21
|
-
args: [jsEntry]
|
|
22
|
-
};
|
|
23
|
-
const tsEntry = fileURLToPath(new URL("./runtime-worker.ts", import.meta.url));
|
|
24
|
-
if (existsSync(tsEntry)) return {
|
|
25
|
-
entry: tsEntry,
|
|
26
|
-
args: [
|
|
27
|
-
"--import",
|
|
28
|
-
"tsx",
|
|
29
|
-
tsEntry
|
|
30
|
-
]
|
|
31
|
-
};
|
|
32
|
-
throw new Error("Bundled local voice runtime entry is missing");
|
|
33
|
-
}
|
|
34
|
-
var LocalVoiceRuntimeClient = class {
|
|
35
|
-
child = null;
|
|
36
|
-
nextId = 1;
|
|
37
|
-
pending = /* @__PURE__ */ new Map();
|
|
38
|
-
requestTail = Promise.resolve();
|
|
39
|
-
async request(method, params = {}, options = {}) {
|
|
40
|
-
options.signal?.throwIfAborted();
|
|
41
|
-
if (method === "health") return this.executeRequest(method, params, options);
|
|
42
|
-
const queued = this.requestTail.then(() => this.executeRequest(method, params, options));
|
|
43
|
-
this.requestTail = queued.then(() => void 0, () => void 0);
|
|
44
|
-
if (!options.signal) return queued;
|
|
45
|
-
return new Promise((resolve, reject) => {
|
|
46
|
-
const abort = () => reject(/* @__PURE__ */ new Error("Local voice runtime request aborted"));
|
|
47
|
-
options.signal.addEventListener("abort", abort, { once: true });
|
|
48
|
-
queued.then((value) => {
|
|
49
|
-
options.signal.removeEventListener("abort", abort);
|
|
50
|
-
resolve(value);
|
|
51
|
-
}, (error) => {
|
|
52
|
-
options.signal.removeEventListener("abort", abort);
|
|
53
|
-
reject(error instanceof Error ? error : new Error(String(error)));
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
async executeRequest(method, params, options) {
|
|
58
|
-
options.signal?.throwIfAborted();
|
|
59
|
-
const child = this.ensureStarted();
|
|
60
|
-
const id = this.nextId++;
|
|
61
|
-
return new Promise((resolve, reject) => {
|
|
62
|
-
const timeout = setTimeout(() => {
|
|
63
|
-
this.deletePending(id);
|
|
64
|
-
reject(/* @__PURE__ */ new Error(`Local voice runtime request timed out: ${method}`));
|
|
65
|
-
if (options.stopOnTimeout !== false) this.stop();
|
|
66
|
-
}, options.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS);
|
|
67
|
-
this.pending.set(id, {
|
|
68
|
-
resolve: (value) => resolve(value),
|
|
69
|
-
reject,
|
|
70
|
-
timeout,
|
|
71
|
-
signal: options.signal,
|
|
72
|
-
onProgress: options.onProgress
|
|
73
|
-
});
|
|
74
|
-
const abort = () => {
|
|
75
|
-
const pending = this.pending.get(id);
|
|
76
|
-
if (!pending) return;
|
|
77
|
-
this.deletePending(id);
|
|
78
|
-
pending.reject(/* @__PURE__ */ new Error("Local voice runtime request aborted"));
|
|
79
|
-
this.stop();
|
|
80
|
-
};
|
|
81
|
-
const pending = this.pending.get(id);
|
|
82
|
-
if (pending) pending.abort = abort;
|
|
83
|
-
options.signal?.addEventListener("abort", abort, { once: true });
|
|
84
|
-
child.stdin.write(`${JSON.stringify({
|
|
85
|
-
id,
|
|
86
|
-
method,
|
|
87
|
-
params
|
|
88
|
-
})}\n`, (error) => {
|
|
89
|
-
if (!error) return;
|
|
90
|
-
this.deletePending(id);
|
|
91
|
-
reject(error);
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
stop() {
|
|
96
|
-
const child = this.child;
|
|
97
|
-
this.child = null;
|
|
98
|
-
if (child && !child.killed) child.kill("SIGTERM");
|
|
99
|
-
this.rejectAll(/* @__PURE__ */ new Error("Local voice runtime stopped"));
|
|
100
|
-
}
|
|
101
|
-
ensureStarted() {
|
|
102
|
-
if (this.child && !this.child.killed) return this.child;
|
|
103
|
-
const command = resolveWorkerCommand();
|
|
104
|
-
const child = spawn(process.execPath, command.args, {
|
|
105
|
-
env: {
|
|
106
|
-
...process.env,
|
|
107
|
-
ELECTRON_RUN_AS_NODE: "1",
|
|
108
|
-
XOPC_VOICE_MODEL_DIR: resolveLocalVoiceRootDir()
|
|
109
|
-
},
|
|
110
|
-
stdio: [
|
|
111
|
-
"pipe",
|
|
112
|
-
"pipe",
|
|
113
|
-
"pipe"
|
|
114
|
-
],
|
|
115
|
-
windowsHide: true
|
|
116
|
-
});
|
|
117
|
-
this.child = child;
|
|
118
|
-
createInterface({ input: child.stdout }).on("line", (line) => this.handleLine(line));
|
|
119
|
-
child.stderr.on("data", (chunk) => {
|
|
120
|
-
const message = chunk.toString().trim();
|
|
121
|
-
if (message) log.debug({ message }, "Local voice runtime stderr");
|
|
122
|
-
});
|
|
123
|
-
child.once("error", (error) => {
|
|
124
|
-
if (this.child === child) this.child = null;
|
|
125
|
-
this.rejectAll(error);
|
|
126
|
-
});
|
|
127
|
-
child.once("exit", (code, signal) => {
|
|
128
|
-
if (this.child === child) this.child = null;
|
|
129
|
-
if (this.pending.size > 0) this.rejectAll(/* @__PURE__ */ new Error(`Local voice runtime exited (${code ?? signal ?? "unknown"})`));
|
|
130
|
-
});
|
|
131
|
-
return child;
|
|
132
|
-
}
|
|
133
|
-
handleLine(line) {
|
|
134
|
-
let message;
|
|
135
|
-
try {
|
|
136
|
-
message = JSON.parse(line);
|
|
137
|
-
} catch {
|
|
138
|
-
log.warn({ linePreview: line.slice(0, 200) }, "Ignored invalid local voice runtime output");
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
if (typeof message.id !== "number") return;
|
|
142
|
-
const pending = this.pending.get(message.id);
|
|
143
|
-
if (!pending) return;
|
|
144
|
-
if (message.event === "progress") {
|
|
145
|
-
pending.onProgress?.(message.data ?? {});
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
this.deletePending(message.id);
|
|
149
|
-
if (message.error) {
|
|
150
|
-
const detail = typeof message.error === "string" ? { message: message.error } : message.error;
|
|
151
|
-
const suffix = [detail.code, detail.cause].filter(Boolean).join(": ");
|
|
152
|
-
const error = /* @__PURE__ */ new Error(`${detail.message || "Local voice runtime failed"}${suffix ? ` (${suffix})` : ""}`);
|
|
153
|
-
if (detail.code) Object.assign(error, { code: detail.code });
|
|
154
|
-
pending.reject(error);
|
|
155
|
-
} else pending.resolve(message.result);
|
|
156
|
-
}
|
|
157
|
-
rejectAll(error) {
|
|
158
|
-
for (const pending of this.pending.values()) {
|
|
159
|
-
clearTimeout(pending.timeout);
|
|
160
|
-
if (pending.signal && pending.abort) pending.signal.removeEventListener("abort", pending.abort);
|
|
161
|
-
pending.reject(error);
|
|
162
|
-
}
|
|
163
|
-
this.pending.clear();
|
|
164
|
-
}
|
|
165
|
-
deletePending(id) {
|
|
166
|
-
const pending = this.pending.get(id);
|
|
167
|
-
if (!pending) return;
|
|
168
|
-
clearTimeout(pending.timeout);
|
|
169
|
-
if (pending.signal && pending.abort) pending.signal.removeEventListener("abort", pending.abort);
|
|
170
|
-
this.pending.delete(id);
|
|
171
|
-
}
|
|
172
|
-
};
|
|
173
|
-
let sharedRuntime;
|
|
174
|
-
function getLocalVoiceRuntimeClient() {
|
|
175
|
-
sharedRuntime ??= new LocalVoiceRuntimeClient();
|
|
176
|
-
return sharedRuntime;
|
|
177
|
-
}
|
|
178
|
-
function resetLocalVoiceRuntimeForTests() {
|
|
179
|
-
sharedRuntime?.stop();
|
|
180
|
-
sharedRuntime = void 0;
|
|
181
|
-
}
|
|
182
|
-
//#endregion
|
|
183
|
-
export { LocalVoiceRuntimeClient, getLocalVoiceRuntimeClient, resetLocalVoiceRuntimeForTests };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|