@xopcai/xopc 0.0.208 → 0.0.211
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-D0mYZqhc.js → activity-store-BzjFoSr0.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-MWLQWL_i.js → agent-avatar-dicebear-DTfjhfVE.js} +1 -1
- package/dist/gateway/static/root/assets/agents-CjhgfuVJ.js +68 -0
- package/dist/gateway/static/root/assets/{api-DZA1yVzM.js → api-D269PnU9.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-B2X6quAF.js → app-management-settings-panel-BFpfQDWc.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-BZW-c38q.js → appearance-settings-DLxFdqhY.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-CjmlGB5V.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-CK-gsjsJ.js → archive-plugin-DPlH4dnc.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-EJGP4rCw.js → attachment-load-xqfLLd0I.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-4m6Ey6wG.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-Tbss_4P-.js → binary-plugins-C0tuoPXk.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-C-dOWigw.js → block-editor-Deyphj1o.js} +6 -6
- package/dist/gateway/static/root/assets/browser-settings-page-CAGCYx8U.js +8 -0
- package/dist/gateway/static/root/assets/{browser-workflow-inputs-DW06Zo1N.js → browser-workflow-inputs-CYEbXyRF.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-workflows-page-B6RnRGwm.js → browser-workflows-page-Bf0tPbGi.js} +2 -2
- package/dist/gateway/static/root/assets/capabilities-settings-panel-CKfLsxTI.js +7 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-Cc3BtQar.js → capability-presets-api-DPkFA_-R.js} +1 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CpipKNqX.js +3 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-BvZO5FaO.js → channel-recipient-api-DqKaAcnZ.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-Bvq-O4pt.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-CrMld2l7.js +1 -0
- package/dist/gateway/static/root/assets/chat-terminal-dock-CTDRZa7e.js +36 -0
- package/dist/gateway/static/root/assets/{connectors-api-CUl6_EQJ.js → connectors-api-Buu8fif8.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-CSQRzaVn.js +2 -0
- package/dist/gateway/static/root/assets/{cron-expression-BD9MgoE_.js → cron-expression-DTLR82NB.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-ChqNmoxw.js → date-picker-DyNogHQH.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-CDUmFs6H.js → dependency-picker-BpnCuo7B.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-D61gqxaD.js → desktop-pet-CDKI4gVB.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-QvuJvIX_.js → desktop-pet-settings-DjT5C2a3.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-DvXMvDNY.js → directory-picker-path-field-DlJY90TM.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DMdVTAQ3.js → extension-debug-page-DWf2z7q5.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BNzxZtaK.js → extension-page-Dorx0kf9.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DoEfyizU.js → extension-settings-page-B1wU9ZOB.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-o7AKvthC.js → gateway-config-api-B1lG4dNr.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-BQbkUP5X.js → gateway-config-swr-BIxuwPQi.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-TO5YYZ9a.js → gateway-settings-DqIOqJjM.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-DIgdpHgk.js → gateway-startup-retry-BpZgd4U-.js} +1 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-DG4Kmgkc.js +1 -0
- package/dist/gateway/static/root/assets/home-page-BhqItS_s.js +1 -0
- package/dist/gateway/static/root/assets/image-generation-api-PkhYohDa.js +1 -0
- package/dist/gateway/static/root/assets/index-DLhvsU9B.css +2 -0
- package/dist/gateway/static/root/assets/index-_cuTcWjB.js +107 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-4xaM3jjU.js → keyboard-shortcuts-settings-6OQT3gQF.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-DWjTmzxw.js +2 -0
- package/dist/gateway/static/root/assets/{local-apps-page-C1xDicdr.js → local-apps-page-DfruRAmE.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-pByvK12G.js → locale-store-C5MK9WcP.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-BA5efZ8B.js +2 -0
- package/dist/gateway/static/root/assets/{management-settings-D1XdHm7v.js → management-settings-L1VYkywO.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-split-B_Ijq1Fr.js → markdown-split-oqgHbqt-.js} +1 -1
- package/dist/gateway/static/root/assets/markdown-view-DD_PgVue.css +1 -0
- package/dist/gateway/static/root/assets/{markdown-view-CyJlGUxB.js → markdown-view-V4rcPPH0.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-CXXNRROJ.js → media-plugins-Bb6gSX2o.js} +1 -1
- package/dist/gateway/static/root/assets/messages-ctG2e-ix.js +3 -0
- package/dist/gateway/static/root/assets/{notes-page-rkePB4CB.js → notes-page-B1rOXjpT.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-CkHXVmKP.js +4 -0
- package/dist/gateway/static/root/assets/{page-tabs-gw-RMQCV.js → page-tabs-CBuCKeyy.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-B8aMScJ2.js → preview-open-alternatives-BQ0tLfPO.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-CjcpkWAz.js → product-open-page-DPeFn7Hu.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-DCqet9-L.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-D0t_AjzG.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-BUWPoBvw.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-Ch5qq86o.js → runtime-tools-settings-panel-BCfQNzjG.js} +2 -2
- package/dist/gateway/static/root/assets/{schema-form-DHYWYUFt.js → schema-form-Bo7YbHYN.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-vLhrrM3m.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-OP1y0Y8M.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-DlzZx0-i.js → settings-form-section-B9dnKr3M.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-BVLhreQi.js → settings-loading-skeleton-CYDV2JtY.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-BJU-kUnN.js → settings-page-DbrIYfS9.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Cxc-Ejl5.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-hvIuZXMe.js → share-preview-page-olgr7LLN.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-ZOqC6-aA.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DwvC3Iuf.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-Dlvuh7D-.js → skills-page-PE16CNw5.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page.utils-B6ddOpnf.js → skills-page.utils-nXmBcBxt.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-BdbCAyoA.js → system-settings-panel-C3qPwAdY.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-DCRB-5q-.js +1 -0
- package/dist/gateway/static/root/assets/{theme-store-BtdGacMI.js → theme-store-KR5Otp5w.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-CL6qHYJA.js → typed-models-lib-lMZodtDF.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-DysNnqCS.js → use-autosave-CKpatP3S.js} +1 -1
- package/dist/gateway/static/root/assets/user-context-page-CoiedRuA.js +1 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-UEsO9Jr-.js → voice-api-key-field-CDcv0Wbh.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-B9disASf.js → work-discovery-overlay-CGdT22un.js} +1 -1
- package/dist/gateway/static/root/assets/work-discovery-page-BwaU1RqI.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-A0zTQHFQ.js → workflow-run-setup-panel-BAHYNlQt.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-DHYmh9G7.js +5 -0
- package/dist/gateway/static/root/index.html +10 -10
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.js +1 -1
- package/dist/src/agent/background-review/coordinator.d.ts +1 -1
- package/dist/src/agent/background-review/coordinator.js +4 -5
- package/dist/src/agent/background-review/run-background-review.js +0 -1
- package/dist/src/agent/background-review/settings.d.ts +1 -2
- package/dist/src/agent/background-review/settings.js +3 -4
- package/dist/src/agent/external-tools/composio-provider.js +8 -4
- package/dist/src/agent/image/generation/providers/xopc-cloud.js +2 -1
- package/dist/src/agent/image/tool-model-config.js +15 -9
- package/dist/src/agent/memory/builtin-provider.js +1 -2
- package/dist/src/agent/memory/manager.js +2 -0
- package/dist/src/agent/memory/sensitivity.js +1 -1
- package/dist/src/agent/memory/understanding/service.js +43 -19
- package/dist/src/agent/memory/user-context-coordinator.js +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +23 -7
- package/dist/src/automations/domain/validation.d.ts +7 -7
- package/dist/src/automations/draft/automation-draft-validator.d.ts +2 -2
- package/dist/src/capabilities/readiness/from-config.d.ts +10 -0
- package/dist/src/capabilities/readiness/from-config.js +128 -0
- package/dist/src/capabilities/readiness/index.d.ts +3 -0
- package/dist/src/capabilities/readiness/index.js +3 -0
- package/dist/src/capabilities/readiness/planner.d.ts +3 -0
- package/dist/src/capabilities/readiness/planner.js +56 -0
- package/dist/src/capabilities/readiness/types.d.ts +35 -0
- package/dist/src/capabilities/readiness/types.js +1 -0
- package/dist/src/cli/commands/agent.js +9 -0
- package/dist/src/cli/commands/auth.js +4 -3
- package/dist/src/cli/commands/connectors.js +1 -1
- package/dist/src/cli/commands/models.js +2 -1
- package/dist/src/cli/commands/onboard/model.d.ts +3 -21
- package/dist/src/cli/commands/onboard/model.js +10 -86
- package/dist/src/cli/utils/oauth-login.d.ts +2 -0
- package/dist/src/cli/utils/oauth-login.js +9 -1
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/index.js +2 -2
- package/dist/src/config/paths-state.d.ts +2 -0
- package/dist/src/config/paths-state.js +5 -1
- package/dist/src/config/paths.d.ts +1 -1
- package/dist/src/config/paths.js +2 -2
- package/dist/src/config/schema.js +1 -1
- package/dist/src/connectors/auth-provider-registry.d.ts +2 -1
- package/dist/src/connectors/auth-provider-registry.js +5 -2
- package/dist/src/connectors/composio-sessions.d.ts +39 -0
- package/dist/src/connectors/composio-sessions.js +66 -7
- package/dist/src/connectors/composio.d.ts +4 -1
- package/dist/src/connectors/composio.js +34 -7
- package/dist/src/connectors/connected-source-cursor.d.ts +9 -0
- package/dist/src/connectors/connected-source-cursor.js +30 -0
- package/dist/src/connectors/connected-source-ingestion.js +67 -46
- package/dist/src/connectors/connected-source-normalizers.d.ts +1 -0
- package/dist/src/connectors/connected-source-normalizers.js +33 -2
- package/dist/src/connectors/connected-source-sanitization.d.ts +1 -0
- package/dist/src/connectors/connected-source-sanitization.js +21 -0
- package/dist/src/connectors/connector-identity.js +10 -2
- package/dist/src/connectors/content-enrichment.d.ts +29 -0
- package/dist/src/connectors/content-enrichment.js +273 -0
- package/dist/src/connectors/health.js +1 -1
- package/dist/src/connectors/learning-coordinator.js +1 -2
- package/dist/src/connectors/learning-recipes.js +28 -33
- package/dist/src/connectors/runtime-adapter-registry.js +14 -1
- package/dist/src/discussions/live-worker.d.ts +1 -0
- package/dist/src/discussions/live-worker.js +7 -1
- package/dist/src/discussions/repository.js +11 -1
- package/dist/src/discussions/sealer.d.ts +1 -1
- package/dist/src/discussions/sealer.js +16 -7
- package/dist/src/discussions/transcript.js +27 -1
- package/dist/src/discussions/types.d.ts +4 -0
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/hono/app.js +8 -3
- package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js +8 -1
- package/dist/src/gateway/hono/oauth-async.d.ts +11 -5
- package/dist/src/gateway/hono/oauth-async.js +29 -16
- package/dist/src/gateway/hono/oauth.d.ts +1 -3
- package/dist/src/gateway/hono/oauth.js +22 -22
- package/dist/src/gateway/hono/routes/agent-stream.js +4 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/connectors.js +16 -3
- package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
- package/dist/src/gateway/hono/routes/discussions.js +2 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +2 -1
- package/dist/src/gateway/hono/routes/mcp.js +1 -1
- package/dist/src/gateway/hono/routes/models.js +59 -5
- package/dist/src/gateway/hono/routes/session-input-handler.d.ts +60 -0
- package/dist/src/gateway/hono/routes/session-input-handler.js +75 -1
- package/dist/src/gateway/hono/routes/understanding-sources.js +29 -0
- package/dist/src/gateway/hono/routes/voice.d.ts +1 -2
- package/dist/src/gateway/hono/routes/voice.js +16 -35
- package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
- package/dist/src/gateway/rate-limit/buckets.js +12 -0
- package/dist/src/gateway/service/agent-runner.d.ts +9 -1
- package/dist/src/gateway/service/agent-runner.js +9 -0
- package/dist/src/gateway/service/session-input-coordinator.d.ts +12 -0
- package/dist/src/gateway/service/session-input-coordinator.js +63 -6
- package/dist/src/gateway/service.d.ts +8 -0
- package/dist/src/gateway/service.js +18 -0
- package/dist/src/knowledge/connected-understanding-pipeline.d.ts +1 -1
- package/dist/src/knowledge/connected-understanding-pipeline.js +74 -25
- package/dist/src/knowledge/ingestion-service.js +33 -15
- package/dist/src/knowledge/types.d.ts +2 -0
- package/dist/src/media-understanding/audio-transcription-runner.d.ts +2 -0
- package/dist/src/media-understanding/audio-transcription-runner.js +3 -1
- package/dist/src/media-understanding/runner.js +3 -1
- package/dist/src/media-understanding/types.d.ts +2 -0
- package/dist/src/providers/model-catalog-persistence.d.ts +9 -0
- package/dist/src/providers/model-catalog-persistence.js +172 -0
- package/dist/src/providers/model-catalog-ranking.d.ts +2 -0
- package/dist/src/providers/model-catalog-ranking.js +17 -0
- package/dist/src/providers/model-catalog-store.d.ts +13 -3
- package/dist/src/providers/model-catalog-store.js +24 -5
- package/dist/src/providers/model-catalog-sync-service.d.ts +3 -3
- package/dist/src/providers/model-catalog-sync-service.js +12 -7
- package/dist/src/providers/provider-auth-service.d.ts +1 -0
- package/dist/src/providers/provider-auth-service.js +3 -0
- package/dist/src/providers/provider-disconnect.d.ts +11 -0
- package/dist/src/providers/provider-disconnect.js +33 -0
- package/dist/src/providers/xopc-cloud-catalog-coordinator.d.ts +56 -0
- package/dist/src/providers/xopc-cloud-catalog-coordinator.js +182 -0
- package/dist/src/providers/xopc-cloud-model-source.d.ts +6 -10
- package/dist/src/providers/xopc-cloud-model-source.js +49 -27
- package/dist/src/retrieval/audit.d.ts +1 -0
- package/dist/src/retrieval/audit.js +8 -0
- package/dist/src/retrieval/candidateFusion.d.ts +5 -0
- package/dist/src/retrieval/candidateFusion.js +20 -0
- package/dist/src/retrieval/queryProfile.d.ts +16 -0
- package/dist/src/retrieval/queryProfile.js +66 -0
- package/dist/src/retrieval/textFeatures.d.ts +5 -0
- package/dist/src/retrieval/textFeatures.js +71 -0
- package/dist/src/session/client-history.d.ts +1 -0
- package/dist/src/session/client-history.js +4 -0
- package/dist/src/session/index.js +1 -1
- package/dist/src/session/store.js +1 -1
- package/dist/src/storage/sqlite/fts.d.ts +0 -4
- package/dist/src/storage/sqlite/fts.js +2 -49
- package/dist/src/storage/sqlite/index.d.ts +3 -2
- package/dist/src/storage/sqlite/index.js +6 -5
- package/dist/src/storage/sqlite/knowledge-repository.d.ts +1 -0
- package/dist/src/storage/sqlite/knowledge-repository.js +4 -0
- package/dist/src/storage/sqlite/memory-records-repository.js +60 -38
- package/dist/src/storage/sqlite/row-mappers.js +2 -2
- package/dist/src/storage/sqlite/session-repository.js +2 -2
- package/dist/src/storage/sqlite/session-turn-replace-repository.d.ts +34 -0
- package/dist/src/storage/sqlite/session-turn-replace-repository.js +110 -0
- package/dist/src/storage/sqlite/transcript-repository.js +1 -1
- package/dist/src/storage/sqlite/user-context-quality-repository.d.ts +15 -0
- package/dist/src/storage/sqlite/user-context-quality-repository.js +46 -2
- package/dist/src/storage/sqlite/user-context-repository.d.ts +4 -0
- package/dist/src/storage/sqlite/user-context-repository.js +29 -3
- package/dist/src/tasks/home-query-service.d.ts +3 -1
- package/dist/src/tasks/home-query-service.js +73 -70
- package/dist/src/tui/backends/embedded-backend.js +12 -4
- package/dist/src/tui/tui-oauth-login.js +5 -0
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/user-context/planner.d.ts +1 -0
- package/dist/src/user-context/planner.js +16 -29
- package/dist/src/user-context/retriever.d.ts +15 -0
- package/dist/src/user-context/retriever.js +65 -0
- package/dist/src/user-context/scope.d.ts +7 -0
- package/dist/src/user-context/scope.js +9 -0
- package/dist/src/user-context/sources/activity-clustering.js +30 -117
- 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/signal-clustering.d.ts +18 -0
- package/dist/src/user-context/sources/signal-clustering.js +131 -0
- package/dist/src/voice/audio/normalize.d.ts +17 -0
- package/dist/src/voice/audio/normalize.js +155 -0
- package/dist/src/voice/language-profile.d.ts +1 -4
- package/dist/src/voice/language-profile.js +2 -25
- package/dist/src/voice/local/runtime-client.d.ts +2 -0
- package/dist/src/voice/local/runtime-client.js +20 -1
- package/dist/src/voice/local/runtime-worker.js +7 -13
- package/dist/src/voice/local/wav.js +1 -1
- package/dist/src/voice/stt/availability.d.ts +1 -4
- package/dist/src/voice/stt/availability.js +3 -15
- package/dist/src/voice/stt/config.js +1 -0
- package/dist/src/voice/stt/factory.js +23 -0
- package/dist/src/voice/stt/index.d.ts +1 -0
- package/dist/src/voice/stt/index.js +2 -2
- package/dist/src/voice/stt/list-providers.js +1 -1
- package/dist/src/voice/stt/providers/local-transcription.js +7 -3
- package/dist/src/voice/stt/providers/xopc-cloud-transcription.js +3 -1
- package/dist/src/voice/stt/transcribe-core.d.ts +5 -1
- package/dist/src/voice/stt/transcribe-core.js +13 -5
- package/dist/src/voice/stt/types.d.ts +2 -0
- package/dist/src/voice/tts/factory.d.ts +1 -1
- package/dist/src/voice/tts/factory.js +23 -1
- package/dist/src/voice/tts/merge-config.js +5 -3
- package/dist/src/voice/tts/providers/xopc-cloud-speech.js +3 -1
- package/dist/src/voice/tts/types.d.ts +2 -0
- package/dist/src/voice/tts/types.js +4 -2
- package/dist/src/work-discovery/evaluation.d.ts +23 -0
- package/dist/src/work-discovery/evaluation.js +18 -1
- package/dist/src/work-discovery/index.js +2 -2
- package/package.json +4 -3
- package/dist/gateway/static/root/assets/agents-Bl8FQZxW.js +0 -68
- package/dist/gateway/static/root/assets/apps-page-CRUgTO10.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-DrSwolhG.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-NlvDyMwD.js +0 -8
- package/dist/gateway/static/root/assets/capabilities-settings-panel-BWXUznw5.js +0 -7
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-D0loEbzq.js +0 -3
- package/dist/gateway/static/root/assets/channels-settings-CcivCw8U.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-DkHAD2Zn.js +0 -1
- package/dist/gateway/static/root/assets/chat-terminal-dock-DVedGAeX.js +0 -36
- package/dist/gateway/static/root/assets/connectors-page-DlBSlfkv.js +0 -2
- package/dist/gateway/static/root/assets/heartbeat-settings-UZAn1aAQ.js +0 -1
- package/dist/gateway/static/root/assets/home-page-CRJDpy5E.js +0 -3
- package/dist/gateway/static/root/assets/index-BSjP0Wsx.css +0 -2
- package/dist/gateway/static/root/assets/index-C2ZYFBGL.js +0 -85
- package/dist/gateway/static/root/assets/local-app-workbench-page-D9bguWRo.js +0 -2
- package/dist/gateway/static/root/assets/logs-page-Gr-nE4nW.js +0 -2
- package/dist/gateway/static/root/assets/markdown-view-B12xeflb.css +0 -1
- package/dist/gateway/static/root/assets/messages-yG5P43Q9.js +0 -3
- package/dist/gateway/static/root/assets/notes-workbench-CpbD4XG2.js +0 -4
- package/dist/gateway/static/root/assets/project-detail-page-GvSYDbjR.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-DPRxKGbs.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-WIzeu-gB.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-2XEJM0YE.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-g1GThZ0O.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-C6qj2L-q.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-BBpE1bep.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DXORBJNk.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-DC0hc8hp.js +0 -1
- package/dist/gateway/static/root/assets/user-context-page-Bwg4KV8B.js +0 -1
- package/dist/gateway/static/root/assets/work-discovery-page-CmPfOfHl.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-DhQNh7W6.js +0 -5
- package/dist/src/voice/local/runtime-dispatcher.d.ts +0 -9
- package/dist/src/voice/local/runtime-dispatcher.js +0 -20
|
@@ -35,7 +35,26 @@ var LocalVoiceRuntimeClient = class {
|
|
|
35
35
|
child = null;
|
|
36
36
|
nextId = 1;
|
|
37
37
|
pending = /* @__PURE__ */ new Map();
|
|
38
|
+
requestTail = Promise.resolve();
|
|
38
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) {
|
|
39
58
|
options.signal?.throwIfAborted();
|
|
40
59
|
const child = this.ensureStarted();
|
|
41
60
|
const id = this.nextId++;
|
|
@@ -56,7 +75,7 @@ var LocalVoiceRuntimeClient = class {
|
|
|
56
75
|
const pending = this.pending.get(id);
|
|
57
76
|
if (!pending) return;
|
|
58
77
|
this.deletePending(id);
|
|
59
|
-
pending.reject(/* @__PURE__ */ new Error("Local voice
|
|
78
|
+
pending.reject(/* @__PURE__ */ new Error("Local voice runtime request aborted"));
|
|
60
79
|
this.stop();
|
|
61
80
|
};
|
|
62
81
|
const pending = this.pending.get(id);
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { getLocalVoiceModel, resolveLocalVoiceModelDir } from "./models.js";
|
|
2
2
|
import { downloadLocalVoiceModelFiles } from "./model-files.js";
|
|
3
|
-
import { createRuntimeDispatcher } from "./runtime-dispatcher.js";
|
|
4
3
|
import { join, resolve, sep } from "node:path";
|
|
5
4
|
import { mkdir, rm } from "node:fs/promises";
|
|
6
5
|
import { EnvHttpProxyAgent, RetryAgent, setGlobalDispatcher } from "undici";
|
|
@@ -230,17 +229,6 @@ async function handle(request) {
|
|
|
230
229
|
throw new Error(`Unknown local voice runtime method: ${request.method}`);
|
|
231
230
|
}
|
|
232
231
|
const lines = createInterface({ input: process.stdin });
|
|
233
|
-
const dispatch = createRuntimeDispatcher({
|
|
234
|
-
execute: handle,
|
|
235
|
-
sendResult: (request, result) => send({
|
|
236
|
-
id: request.id,
|
|
237
|
-
result
|
|
238
|
-
}),
|
|
239
|
-
sendError: (request, error) => send({
|
|
240
|
-
id: request.id,
|
|
241
|
-
error: serializeError(error)
|
|
242
|
-
})
|
|
243
|
-
});
|
|
244
232
|
lines.on("line", (line) => {
|
|
245
233
|
let request;
|
|
246
234
|
try {
|
|
@@ -248,7 +236,13 @@ lines.on("line", (line) => {
|
|
|
248
236
|
} catch {
|
|
249
237
|
return;
|
|
250
238
|
}
|
|
251
|
-
|
|
239
|
+
handle(request).then((result) => send({
|
|
240
|
+
id: request.id,
|
|
241
|
+
result
|
|
242
|
+
}), (error) => send({
|
|
243
|
+
id: request.id,
|
|
244
|
+
error: serializeError(error)
|
|
245
|
+
}));
|
|
252
246
|
});
|
|
253
247
|
lines.once("close", () => {
|
|
254
248
|
networkAgent.close().finally(() => process.exit(0));
|
|
@@ -17,7 +17,7 @@ function resampleLinear(input, sourceRate, targetRate) {
|
|
|
17
17
|
return output;
|
|
18
18
|
}
|
|
19
19
|
function decodeWavToMonoFloat32(buffer, targetRate = 16e3) {
|
|
20
|
-
if (buffer.length < 44 || readChunkId(buffer, 0) !== "RIFF" || readChunkId(buffer, 8) !== "WAVE") throw new Error("
|
|
20
|
+
if (buffer.length < 44 || readChunkId(buffer, 0) !== "RIFF" || readChunkId(buffer, 8) !== "WAVE") throw new Error("Unsupported or corrupt WAV audio");
|
|
21
21
|
let offset = 12;
|
|
22
22
|
let format;
|
|
23
23
|
let dataOffset = -1;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import type { STTConfig } from './types.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
* factory/provider registry here; channel plugins call this at startup and the
|
|
5
|
-
* provider registry pulls optional SDKs (e.g. openai) into Electron's dynamic
|
|
6
|
-
* extension runtime path.
|
|
3
|
+
* Runtime-truth availability check shared by channels and the gateway.
|
|
7
4
|
*/
|
|
8
5
|
export declare function isSTTAvailable(config?: STTConfig): boolean;
|
|
@@ -1,23 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import "../metadata/index.js";
|
|
1
|
+
import { resolveSTTProviderChain } from "./factory.js";
|
|
3
2
|
//#region src/voice/stt/availability.ts
|
|
4
|
-
function providerHasConfig(config, providerId) {
|
|
5
|
-
const provider = config.providers?.[providerId];
|
|
6
|
-
if (provider && Object.keys(provider).length > 0) return true;
|
|
7
|
-
if ([...config.models ?? [], ...config.sharedModels ?? []].some((entry) => entry.provider === providerId && entry.capabilities?.includes("audio"))) return true;
|
|
8
|
-
return getVoiceProviderMetadata("stt", providerId)?.diagnostics.requiresApiKey === false;
|
|
9
|
-
}
|
|
10
3
|
/**
|
|
11
|
-
*
|
|
12
|
-
* factory/provider registry here; channel plugins call this at startup and the
|
|
13
|
-
* provider registry pulls optional SDKs (e.g. openai) into Electron's dynamic
|
|
14
|
-
* extension runtime path.
|
|
4
|
+
* Runtime-truth availability check shared by channels and the gateway.
|
|
15
5
|
*/
|
|
16
6
|
function isSTTAvailable(config) {
|
|
17
7
|
if (!config?.enabled) return false;
|
|
18
|
-
|
|
19
|
-
if (config.fallback?.enabled) return config.fallback.order.some((providerId) => providerHasConfig(config, providerId));
|
|
20
|
-
return false;
|
|
8
|
+
return resolveSTTProviderChain(config).length > 0;
|
|
21
9
|
}
|
|
22
10
|
//#endregion
|
|
23
11
|
export { isSTTAvailable };
|
|
@@ -14,6 +14,7 @@ function mergeSttConfigFromAppConfig(stt, toolsMedia) {
|
|
|
14
14
|
return {
|
|
15
15
|
...DEFAULT_STT_CONFIG,
|
|
16
16
|
...patch,
|
|
17
|
+
managedAuto: stt === void 0,
|
|
17
18
|
providers: mergeSttProviders(DEFAULT_STT_CONFIG.providers, patch.providers),
|
|
18
19
|
fallback: {
|
|
19
20
|
...DEFAULT_STT_CONFIG.fallback,
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { getModelCatalogStore, init_model_catalog_store } from "../../providers/model-catalog-store.js";
|
|
4
|
+
import { compareCatalogModels } from "../../providers/model-catalog-ranking.js";
|
|
3
5
|
import { getMediaUnderstandingProvider, listMediaUnderstandingProviders } from "../../media-understanding/registry.js";
|
|
4
6
|
import "./providers/index.js";
|
|
5
7
|
import { resolveModelEntries } from "../../media-understanding/resolve-entries.js";
|
|
6
8
|
import { readSttProviderFields, resolveSttProviderConfigSlice } from "./config-slice.js";
|
|
7
9
|
//#region src/voice/stt/factory.ts
|
|
8
10
|
init_logger();
|
|
11
|
+
init_model_catalog_store();
|
|
9
12
|
const log = createLogger("STT:Factory");
|
|
10
13
|
function resolveApiKey(providerId, fields, envKey) {
|
|
11
14
|
return fields.apiKey ?? (envKey ? process.env[envKey] : void 0);
|
|
@@ -54,6 +57,7 @@ function resolveSTTProviderOrder(primary, fallback, config) {
|
|
|
54
57
|
for (const providerId of fallback.order) if (providerId !== primary && !order.includes(providerId)) order.push(providerId);
|
|
55
58
|
return order;
|
|
56
59
|
}
|
|
60
|
+
if (!config.managedAuto) return [primary];
|
|
57
61
|
const configured = sortAudioProvidersByAutoPriority(listMediaUnderstandingProviders()).filter((providerId) => resolveSTTProviderConfig(providerId, config) !== null);
|
|
58
62
|
const order = [primary];
|
|
59
63
|
for (const providerId of configured) if (providerId !== primary && !order.includes(providerId)) order.push(providerId);
|
|
@@ -72,8 +76,23 @@ function resolveModelEntryChain(config) {
|
|
|
72
76
|
const resolved = resolveSTTProviderConfig(providerId, config, entry);
|
|
73
77
|
if (resolved) chain.push(resolved);
|
|
74
78
|
}
|
|
79
|
+
if (chain.some((entry) => entry.id === "xopc-cloud")) appendManagedCloudModels(chain, config);
|
|
75
80
|
return chain;
|
|
76
81
|
}
|
|
82
|
+
function appendManagedCloudModels(chain, config) {
|
|
83
|
+
const seen = new Set(chain.filter((entry) => entry.id === "xopc-cloud" && entry.model).map((entry) => entry.model));
|
|
84
|
+
const source = getModelCatalogStore().getSource("xopc-cloud");
|
|
85
|
+
const models = [...source?.models ?? []].sort((left, right) => compareCatalogModels(left, right, source?.recommended?.stt));
|
|
86
|
+
for (const model of models) {
|
|
87
|
+
if (model.availability !== "available" || model.kind !== "stt" || !model.operations.includes("audio.transcription") || seen.has(model.id)) continue;
|
|
88
|
+
const resolved = resolveSTTProviderConfig("xopc-cloud", config, {
|
|
89
|
+
provider: "xopc-cloud",
|
|
90
|
+
model: model.id,
|
|
91
|
+
capabilities: ["audio"]
|
|
92
|
+
});
|
|
93
|
+
if (resolved) chain.push(resolved);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
77
96
|
/** Build the full chain of resolved provider configs in priority order. */
|
|
78
97
|
function resolveSTTProviderChain(config) {
|
|
79
98
|
if (!config.enabled) return [];
|
|
@@ -82,6 +101,10 @@ function resolveSTTProviderChain(config) {
|
|
|
82
101
|
const order = resolveSTTProviderOrder(config.provider, config.fallback, config);
|
|
83
102
|
const chain = [];
|
|
84
103
|
for (const providerId of order) {
|
|
104
|
+
if (providerId === "xopc-cloud") {
|
|
105
|
+
appendManagedCloudModels(chain, config);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
85
108
|
const resolved = resolveSTTProviderConfig(providerId, config);
|
|
86
109
|
if (resolved) chain.push(resolved);
|
|
87
110
|
}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import './providers/index.js';
|
|
8
8
|
import type { STTConfig, STTOptions, STTResult } from './types.js';
|
|
9
9
|
export { transcribe } from './transcribe-core.js';
|
|
10
|
+
export { STTTranscriptionError } from './transcribe-core.js';
|
|
10
11
|
export { isSTTAvailable } from './availability.js';
|
|
11
12
|
export { mergeSttConfigFromAppConfig } from './config.js';
|
|
12
13
|
/**
|
|
@@ -2,7 +2,7 @@ import { openAiTranscriptionProvider } from "./providers/openai-transcription.js
|
|
|
2
2
|
import { alibabaTranscriptionProvider } from "./providers/alibaba-transcription.js";
|
|
3
3
|
import "./providers/index.js";
|
|
4
4
|
import { resolveSTTProviderChain, resolveSTTProviderConfig, resolveSTTProviderOrder } from "./factory.js";
|
|
5
|
-
import { transcribe } from "./transcribe-core.js";
|
|
5
|
+
import { STTTranscriptionError, transcribe } from "./transcribe-core.js";
|
|
6
6
|
import { isSTTAvailable } from "./availability.js";
|
|
7
7
|
import { mergeSttConfigFromAppConfig } from "./config.js";
|
|
8
8
|
import { checkMentionInTranscription } from "./mention.js";
|
|
@@ -29,4 +29,4 @@ async function transcribeWithProvider(audioBuffer, providerName, config, options
|
|
|
29
29
|
};
|
|
30
30
|
}
|
|
31
31
|
//#endregion
|
|
32
|
-
export { alibabaTranscriptionProvider, audioPreflightTranscribe, checkMentionInTranscription, isSTTAvailable, mergeSttConfigFromAppConfig, openAiTranscriptionProvider, resolveSTTProviderChain, resolveSTTProviderConfig, resolveSTTProviderOrder, transcribe, transcribeWithProvider };
|
|
32
|
+
export { STTTranscriptionError, alibabaTranscriptionProvider, audioPreflightTranscribe, checkMentionInTranscription, isSTTAvailable, mergeSttConfigFromAppConfig, openAiTranscriptionProvider, resolveSTTProviderChain, resolveSTTProviderConfig, resolveSTTProviderOrder, transcribe, transcribeWithProvider };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { listMediaUnderstandingProviders } from "../../media-understanding/registry.js";
|
|
2
2
|
import { resolveSTTProviderConfig } from "./factory.js";
|
|
3
|
+
import { mergeSttConfigFromAppConfig } from "./config.js";
|
|
3
4
|
import { getVoiceProviderMetadata } from "../metadata/registry.js";
|
|
4
5
|
import "../metadata/index.js";
|
|
5
|
-
import { mergeSttConfigFromAppConfig } from "./config.js";
|
|
6
6
|
//#region src/voice/stt/list-providers.ts
|
|
7
7
|
function fallbackMetadata(providerId, aliases) {
|
|
8
8
|
return {
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
import { createLogger } from "../../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../../utils/logger.js";
|
|
3
|
-
import { registerMediaUnderstandingProvider } from "../../../media-understanding/registry.js";
|
|
4
3
|
import { DEFAULT_LOCAL_VOICE_MODEL_ID, getLocalVoiceModel, hasInstalledLocalVoiceModel, isLocalVoiceModelInstalled } from "../../local/models.js";
|
|
4
|
+
import { registerMediaUnderstandingProvider } from "../../../media-understanding/registry.js";
|
|
5
5
|
import { getLocalVoiceRuntimeClient } from "../../local/runtime-client.js";
|
|
6
|
-
import {
|
|
6
|
+
import { decodeAudioToMonoFloat32 } from "../../audio/normalize.js";
|
|
7
7
|
//#region src/voice/stt/providers/local-transcription.ts
|
|
8
8
|
init_logger();
|
|
9
9
|
const log = createLogger("STT:Local");
|
|
10
10
|
async function transcribeAudio(req) {
|
|
11
11
|
const model = getLocalVoiceModel(req.model);
|
|
12
12
|
if (!isLocalVoiceModelInstalled(model.id)) throw new Error(`Local voice model "${model.id}" is not installed`);
|
|
13
|
-
const decoded =
|
|
13
|
+
const decoded = await decodeAudioToMonoFloat32({
|
|
14
|
+
buffer: req.buffer,
|
|
15
|
+
signal: req.signal
|
|
16
|
+
});
|
|
14
17
|
const audioBytes = Buffer.from(decoded.samples.buffer, decoded.samples.byteOffset, decoded.samples.byteLength);
|
|
15
18
|
const startedAt = Date.now();
|
|
16
19
|
const result = await getLocalVoiceRuntimeClient().request("transcribe", {
|
|
@@ -25,6 +28,7 @@ async function transcribeAudio(req) {
|
|
|
25
28
|
model: model.id,
|
|
26
29
|
audioDurationSeconds: decoded.durationSeconds,
|
|
27
30
|
latencyMs: Date.now() - startedAt,
|
|
31
|
+
realTimeFactor: decoded.durationSeconds > 0 ? (Date.now() - startedAt) / 1e3 / decoded.durationSeconds : void 0,
|
|
28
32
|
textLength: result.text.length
|
|
29
33
|
}, "Local transcription completed");
|
|
30
34
|
return {
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { getModelCatalogStore, init_model_catalog_store } from "../../../providers/model-catalog-store.js";
|
|
2
2
|
import { init_xopc_cloud_config, resolveXopcModelRouterUrl } from "../../../providers/xopc-cloud-config.js";
|
|
3
3
|
import { getProviderAuthService, init_provider_auth_service } from "../../../providers/provider-auth-service.js";
|
|
4
|
+
import { compareCatalogModels } from "../../../providers/model-catalog-ranking.js";
|
|
4
5
|
import { registerMediaUnderstandingProvider } from "../../../media-understanding/registry.js";
|
|
5
6
|
//#region src/voice/stt/providers/xopc-cloud-transcription.ts
|
|
6
7
|
init_model_catalog_store();
|
|
7
8
|
init_provider_auth_service();
|
|
8
9
|
init_xopc_cloud_config();
|
|
9
10
|
function defaultModel() {
|
|
10
|
-
|
|
11
|
+
const source = getModelCatalogStore().getSource("xopc-cloud");
|
|
12
|
+
return source?.models.filter((model) => model.availability === "available" && model.kind === "stt").sort((left, right) => compareCatalogModels(left, right, source.recommended?.stt))[0]?.id;
|
|
11
13
|
}
|
|
12
14
|
const xopcCloudTranscriptionProvider = {
|
|
13
15
|
id: "xopc-cloud",
|
|
@@ -11,5 +11,9 @@
|
|
|
11
11
|
* wrap the input as a single CapabilityAttachmentInput and unpack the first
|
|
12
12
|
* output. Multi-attachment cases go through `runAudioTranscription` directly.
|
|
13
13
|
*/
|
|
14
|
-
import type { STTConfig, STTOptions, STTResultWithTracking } from './types.js';
|
|
14
|
+
import type { STTConfig, STTOptions, STTProviderFailureReason, STTResultWithTracking } from './types.js';
|
|
15
|
+
export declare class STTTranscriptionError extends Error {
|
|
16
|
+
readonly reasonCode: STTProviderFailureReason;
|
|
17
|
+
constructor(message: string, reasonCode: STTProviderFailureReason);
|
|
18
|
+
}
|
|
15
19
|
export declare function transcribe(audioBuffer: Buffer, config: STTConfig, options?: STTOptions): Promise<STTResultWithTracking>;
|
|
@@ -10,9 +10,16 @@ function classifyFailureReason(reason) {
|
|
|
10
10
|
const lower = reason.toLowerCase();
|
|
11
11
|
if (lower.includes("not configured") || lower.includes("api key") || lower.includes("missing")) return "not_configured";
|
|
12
12
|
if (lower.includes("timeout") || lower.includes("timed out") || lower.includes("aborted")) return "timeout";
|
|
13
|
-
if (lower.includes("unsupported") || lower.includes("format")) return "unsupported_format";
|
|
13
|
+
if (lower.includes("unsupported") || lower.includes("format") || lower.includes("audio decoder")) return "unsupported_format";
|
|
14
14
|
return "provider_error";
|
|
15
15
|
}
|
|
16
|
+
var STTTranscriptionError = class extends Error {
|
|
17
|
+
constructor(message, reasonCode) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.reasonCode = reasonCode;
|
|
20
|
+
this.name = "STTTranscriptionError";
|
|
21
|
+
}
|
|
22
|
+
};
|
|
16
23
|
function toAttempt(attempt) {
|
|
17
24
|
return {
|
|
18
25
|
provider: attempt.provider ?? "unknown",
|
|
@@ -49,8 +56,8 @@ async function transcribe(audioBuffer, config, options) {
|
|
|
49
56
|
attempts,
|
|
50
57
|
attemptedProviders
|
|
51
58
|
}, "All STT providers failed");
|
|
52
|
-
const
|
|
53
|
-
throw new
|
|
59
|
+
const lastFailure = attempts.findLast((attempt) => attempt.task === "failed");
|
|
60
|
+
throw new STTTranscriptionError(lastFailure?.error ?? "All STT providers failed", lastFailure?.reasonCode ?? "unknown");
|
|
54
61
|
}
|
|
55
62
|
const chosen = attachmentDecision.chosen;
|
|
56
63
|
const output = result.outputs[0];
|
|
@@ -60,11 +67,12 @@ async function transcribe(audioBuffer, config, options) {
|
|
|
60
67
|
return {
|
|
61
68
|
text: output.text,
|
|
62
69
|
provider: chosen.provider ?? "unknown",
|
|
63
|
-
...
|
|
70
|
+
...output.durationSeconds !== void 0 ? { duration: output.durationSeconds } : {},
|
|
71
|
+
...output.language || options?.language ? { language: output.language ?? options?.language } : {},
|
|
64
72
|
attempts,
|
|
65
73
|
...fallbackFrom ? { fallbackFrom } : {},
|
|
66
74
|
attemptedProviders
|
|
67
75
|
};
|
|
68
76
|
}
|
|
69
77
|
//#endregion
|
|
70
|
-
export { transcribe };
|
|
78
|
+
export { STTTranscriptionError, transcribe };
|
|
@@ -31,6 +31,8 @@ import type { MediaUnderstandingModelEntry } from '../../media-understanding/typ
|
|
|
31
31
|
export interface STTConfig {
|
|
32
32
|
enabled: boolean;
|
|
33
33
|
provider: string;
|
|
34
|
+
/** Runtime-only flag: absent app config enables managed provider selection. */
|
|
35
|
+
managedAuto?: boolean;
|
|
34
36
|
/** Capability-local model chain (`tools.media.audio.models`). */
|
|
35
37
|
models?: MediaUnderstandingModelEntry[];
|
|
36
38
|
/** Shared model entries merged from `tools.media.models` at runtime. */
|
|
@@ -23,7 +23,7 @@ export interface ResolvedSpeechProvider {
|
|
|
23
23
|
timeoutMs: number;
|
|
24
24
|
}
|
|
25
25
|
/** Resolve a single provider id → plugin + per-call config, or null if unavailable. */
|
|
26
|
-
export declare function resolveSpeechProvider(providerId: TTSProvider, config: TTSConfig): ResolvedSpeechProvider | null;
|
|
26
|
+
export declare function resolveSpeechProvider(providerId: TTSProvider, config: TTSConfig, providerOverride?: Record<string, unknown>): ResolvedSpeechProvider | null;
|
|
27
27
|
/** Order providers: explicit fallback when enabled, otherwise auto-select by registry order. */
|
|
28
28
|
export declare function resolveProviderOrder(primary: TTSProvider, fallback: TTSConfig['fallback'] | undefined, config: TTSConfig): TTSProvider[];
|
|
29
29
|
/** Resolve the full provider chain in priority order; only configured plugins included. */
|
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { getModelCatalogStore, init_model_catalog_store } from "../../providers/model-catalog-store.js";
|
|
4
|
+
import { compareCatalogModels } from "../../providers/model-catalog-ranking.js";
|
|
3
5
|
import { getSpeechProvider, listSpeechProviders } from "./speech-registry.js";
|
|
4
6
|
import "./providers/index.js";
|
|
5
7
|
import { buildTtsResolveRawConfig } from "./config-slice.js";
|
|
6
8
|
//#region src/voice/tts/factory.ts
|
|
7
9
|
init_logger();
|
|
10
|
+
init_model_catalog_store();
|
|
8
11
|
const log = createLogger("TTS:Factory");
|
|
9
12
|
/** Resolve a single provider id → plugin + per-call config, or null if unavailable. */
|
|
10
|
-
function resolveSpeechProvider(providerId, config) {
|
|
13
|
+
function resolveSpeechProvider(providerId, config, providerOverride) {
|
|
11
14
|
const plugin = getSpeechProvider(providerId);
|
|
12
15
|
if (!plugin) {
|
|
13
16
|
log.warn({ providerId }, `Unknown TTS provider "${providerId}" (not registered)`);
|
|
14
17
|
return null;
|
|
15
18
|
}
|
|
16
19
|
const rawConfig = buildTtsResolveRawConfig(providerId, config);
|
|
20
|
+
if (providerOverride) rawConfig[providerId] = {
|
|
21
|
+
...rawConfig[providerId] ?? {},
|
|
22
|
+
...providerOverride
|
|
23
|
+
};
|
|
17
24
|
const timeoutMs = config.timeoutMs ?? 3e4;
|
|
18
25
|
const providerConfig = plugin.resolveConfig({
|
|
19
26
|
cfg: void 0,
|
|
@@ -41,6 +48,7 @@ function resolveProviderOrder(primary, fallback, config) {
|
|
|
41
48
|
for (const provider of fallback.order) if (provider !== primary && !order.includes(provider)) order.push(provider);
|
|
42
49
|
return order;
|
|
43
50
|
}
|
|
51
|
+
if (!config.managedAuto) return [primary];
|
|
44
52
|
const configured = listSpeechProviders().map((plugin) => {
|
|
45
53
|
return resolveSpeechProvider(plugin.id, config) ? plugin : null;
|
|
46
54
|
}).filter((plugin) => plugin !== null).sort((left, right) => {
|
|
@@ -59,6 +67,20 @@ function resolveSpeechProviderChain(config) {
|
|
|
59
67
|
const order = resolveProviderOrder(config.provider, config.fallback, config);
|
|
60
68
|
const chain = [];
|
|
61
69
|
for (const providerId of order) {
|
|
70
|
+
if (providerId === "xopc-cloud") {
|
|
71
|
+
const configuredModel = typeof config.providers?.["xopc-cloud"]?.model === "string" ? config.providers["xopc-cloud"].model : void 0;
|
|
72
|
+
const source = getModelCatalogStore().getSource("xopc-cloud");
|
|
73
|
+
const models = source?.models.filter((model) => model.availability === "available" && model.kind === "tts" && model.operations.includes("audio.speech") && Boolean(model.tts?.defaultVoice)).sort((left, right) => {
|
|
74
|
+
if (left.id === configuredModel) return -1;
|
|
75
|
+
if (right.id === configuredModel) return 1;
|
|
76
|
+
return compareCatalogModels(left, right, source.recommended?.tts);
|
|
77
|
+
}) ?? [];
|
|
78
|
+
for (const model of models) {
|
|
79
|
+
const resolved = resolveSpeechProvider(providerId, config, { model: model.id });
|
|
80
|
+
if (resolved) chain.push(resolved);
|
|
81
|
+
}
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
62
84
|
const resolved = resolveSpeechProvider(providerId, config);
|
|
63
85
|
if (resolved) chain.push(resolved);
|
|
64
86
|
}
|
|
@@ -24,15 +24,17 @@ function mergeProviderEntries(base, patch) {
|
|
|
24
24
|
}
|
|
25
25
|
function mergeTtsConfigFromAppConfig(tts) {
|
|
26
26
|
const p = tts ?? {};
|
|
27
|
+
const managedAuto = tts === void 0;
|
|
27
28
|
return {
|
|
28
29
|
...DEFAULT_TTS_CONFIG,
|
|
29
30
|
...p,
|
|
31
|
+
managedAuto,
|
|
30
32
|
enabled: p.enabled ?? DEFAULT_TTS_CONFIG.enabled,
|
|
31
33
|
provider: normalizeTtsProvider(p.provider),
|
|
32
34
|
trigger: normalizeTtsTrigger(p.trigger ?? DEFAULT_TTS_CONFIG.trigger),
|
|
33
|
-
fallback: {
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
fallback: managedAuto ? { ...DEFAULT_TTS_CONFIG.fallback } : p.fallback ? { ...p.fallback } : {
|
|
36
|
+
enabled: false,
|
|
37
|
+
order: []
|
|
36
38
|
},
|
|
37
39
|
modelOverrides: {
|
|
38
40
|
...DEFAULT_TTS_CONFIG.modelOverrides,
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { getModelCatalogStore, init_model_catalog_store } from "../../../providers/model-catalog-store.js";
|
|
2
2
|
import { init_xopc_cloud_config, resolveXopcModelRouterUrl } from "../../../providers/xopc-cloud-config.js";
|
|
3
3
|
import { getProviderAuthService, init_provider_auth_service } from "../../../providers/provider-auth-service.js";
|
|
4
|
+
import { compareCatalogModels } from "../../../providers/model-catalog-ranking.js";
|
|
4
5
|
import { registerSpeechProvider } from "../speech-registry.js";
|
|
5
6
|
//#region src/voice/tts/providers/xopc-cloud-speech.ts
|
|
6
7
|
init_model_catalog_store();
|
|
7
8
|
init_provider_auth_service();
|
|
8
9
|
init_xopc_cloud_config();
|
|
9
10
|
function availableModels() {
|
|
10
|
-
|
|
11
|
+
const source = getModelCatalogStore().getSource("xopc-cloud");
|
|
12
|
+
return source?.models.filter((model) => model.availability === "available" && model.kind === "tts").sort((left, right) => compareCatalogModels(left, right, source.recommended?.tts)) ?? [];
|
|
11
13
|
}
|
|
12
14
|
function readConfig(config) {
|
|
13
15
|
return config;
|
|
@@ -57,6 +57,8 @@ export interface TTSModelOverrideConfig {
|
|
|
57
57
|
export interface TTSConfig {
|
|
58
58
|
enabled: boolean;
|
|
59
59
|
provider: TTSProvider;
|
|
60
|
+
/** Runtime-only flag: absent app config enables managed provider selection. */
|
|
61
|
+
managedAuto?: boolean;
|
|
60
62
|
/** Trigger mode for automatic voice replies. */
|
|
61
63
|
trigger: TTSAutoMode;
|
|
62
64
|
/** Fallback configuration */
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
//#region src/voice/tts/types.ts
|
|
2
2
|
const DEFAULT_TTS_CONFIG = {
|
|
3
3
|
enabled: true,
|
|
4
|
-
provider: "
|
|
5
|
-
trigger: "
|
|
4
|
+
provider: "xopc-cloud",
|
|
5
|
+
trigger: "off",
|
|
6
6
|
fallback: {
|
|
7
7
|
enabled: true,
|
|
8
8
|
order: [
|
|
9
|
+
"xopc-cloud",
|
|
9
10
|
"openai",
|
|
10
11
|
"alibaba",
|
|
11
12
|
"minimax",
|
|
@@ -26,6 +27,7 @@ const DEFAULT_TTS_CONFIG = {
|
|
|
26
27
|
allowSeed: false
|
|
27
28
|
},
|
|
28
29
|
providers: {
|
|
30
|
+
"xopc-cloud": {},
|
|
29
31
|
alibaba: {
|
|
30
32
|
model: "qwen-tts",
|
|
31
33
|
voice: "Cherry"
|
|
@@ -9,3 +9,26 @@ export declare function evaluateWorkUnderstandingCase(input: WorkUnderstandingEv
|
|
|
9
9
|
evidenceCoverage: number;
|
|
10
10
|
f1: number;
|
|
11
11
|
};
|
|
12
|
+
export interface QuickUnderstandingEvaluationCase extends WorkUnderstandingEvaluationCase {
|
|
13
|
+
expectedSourceIds: string[];
|
|
14
|
+
observedSourceIds: string[];
|
|
15
|
+
startedAtMs: number;
|
|
16
|
+
firstCandidateAtMs?: number;
|
|
17
|
+
timeBudgetMs: number;
|
|
18
|
+
}
|
|
19
|
+
export type QuickUnderstandingGate = {
|
|
20
|
+
minPrecision: number;
|
|
21
|
+
minRecall: number;
|
|
22
|
+
minEvidenceCoverage: number;
|
|
23
|
+
minSourceCoverage: number;
|
|
24
|
+
};
|
|
25
|
+
export declare function evaluateQuickUnderstandingCase(input: QuickUnderstandingEvaluationCase): {
|
|
26
|
+
sourceCoverage: number;
|
|
27
|
+
timeToFirstCandidateMs: number;
|
|
28
|
+
withinTimeBudget: boolean;
|
|
29
|
+
precision: number;
|
|
30
|
+
recall: number;
|
|
31
|
+
evidenceCoverage: number;
|
|
32
|
+
f1: number;
|
|
33
|
+
};
|
|
34
|
+
export declare function meetsQuickUnderstandingGate(metrics: ReturnType<typeof evaluateQuickUnderstandingCase>, gate: QuickUnderstandingGate): boolean;
|
|
@@ -13,5 +13,22 @@ function evaluateWorkUnderstandingCase(input) {
|
|
|
13
13
|
f1: precision + recall ? 2 * precision * recall / (precision + recall) : 0
|
|
14
14
|
};
|
|
15
15
|
}
|
|
16
|
+
function evaluateQuickUnderstandingCase(input) {
|
|
17
|
+
const topic = evaluateWorkUnderstandingCase(input);
|
|
18
|
+
const expectedSources = new Set(input.expectedSourceIds);
|
|
19
|
+
const observedSources = new Set(input.observedSourceIds);
|
|
20
|
+
const coveredSources = [...expectedSources].filter((sourceId) => observedSources.has(sourceId)).length;
|
|
21
|
+
const sourceCoverage = expectedSources.size ? coveredSources / expectedSources.size : 1;
|
|
22
|
+
const timeToFirstCandidateMs = input.firstCandidateAtMs === void 0 ? null : Math.max(0, input.firstCandidateAtMs - input.startedAtMs);
|
|
23
|
+
return {
|
|
24
|
+
...topic,
|
|
25
|
+
sourceCoverage,
|
|
26
|
+
timeToFirstCandidateMs,
|
|
27
|
+
withinTimeBudget: timeToFirstCandidateMs !== null && timeToFirstCandidateMs <= input.timeBudgetMs
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function meetsQuickUnderstandingGate(metrics, gate) {
|
|
31
|
+
return metrics.precision >= gate.minPrecision && metrics.recall >= gate.minRecall && metrics.evidenceCoverage >= gate.minEvidenceCoverage && metrics.sourceCoverage >= gate.minSourceCoverage && metrics.withinTimeBudget;
|
|
32
|
+
}
|
|
16
33
|
//#endregion
|
|
17
|
-
export { evaluateWorkUnderstandingCase };
|
|
34
|
+
export { evaluateQuickUnderstandingCase, evaluateWorkUnderstandingCase, meetsQuickUnderstandingGate };
|
|
@@ -9,5 +9,5 @@ import { DEFAULT_WORK_INVESTIGATION_BUDGET, investigateWorkContext } from "./inv
|
|
|
9
9
|
import { persistWorkThreadsFromDiscovery } from "./thread-service.js";
|
|
10
10
|
import { getWorkDiscoveryDirectorySource, listWorkDiscoveryDirectorySources, revokeWorkDiscoveryDirectorySource, upsertWorkDiscoveryDirectorySource } from "./source-repository.js";
|
|
11
11
|
import { WorkDiscoveryService } from "./service.js";
|
|
12
|
-
import { evaluateWorkUnderstandingCase } from "./evaluation.js";
|
|
13
|
-
export { DEFAULT_WORK_INVESTIGATION_BUDGET, WORK_DISCOVERY_SCAN_POLICY_VERSION, WorkDiscoveryService, analyzeUnderstandingSources, analyzeWorkContext, appendWorkUnderstandingEvidence, canonicalWorkDiscoveryRoot, createWorkDiscoveryRun, createWorkUnderstandingInvestigation, discoverWorkCandidates, evaluateWorkUnderstandingCase, findActiveWorkDiscoverySourceRefresh, getWorkDiscoveryDirectorySource, getWorkDiscoveryOnboardingState, getWorkDiscoveryRun, getWorkDiscoveryRunByIdempotencyKey, getWorkUnderstandingInvestigation, getWorkUnderstandingInvestigationForRun, investigateWorkContext, listWorkDiscoveryDirectorySources, listWorkDiscoverySourceRefreshes, listWorkUnderstandingEvidence, persistWorkThreadsFromDiscovery, previewWorkDiscoveryRoot, probeWorkDiscoveryRoot, readWorkDiscoveryTextExcerpt, recordWorkDiscoverySourceRefresh, resetWorkUnderstandingInvestigation, resolvePersonalWorkRoots, revokeWorkDiscoveryDirectorySource, searchWorkDiscoveryText, setWorkDiscoveryFeedback, setWorkDiscoveryOnboardingState, summarizeWorkContextSnapshot, updateWorkDiscoveryRun, updateWorkDiscoverySourceRefreshForRun, updateWorkUnderstandingEvidenceObservation, updateWorkUnderstandingInvestigation, upsertWorkDiscoveryDirectorySource, workDiscoveryFingerprintsEqual, workDiscoveryResultMarkdown };
|
|
12
|
+
import { evaluateQuickUnderstandingCase, evaluateWorkUnderstandingCase, meetsQuickUnderstandingGate } from "./evaluation.js";
|
|
13
|
+
export { DEFAULT_WORK_INVESTIGATION_BUDGET, WORK_DISCOVERY_SCAN_POLICY_VERSION, WorkDiscoveryService, analyzeUnderstandingSources, analyzeWorkContext, appendWorkUnderstandingEvidence, canonicalWorkDiscoveryRoot, createWorkDiscoveryRun, createWorkUnderstandingInvestigation, discoverWorkCandidates, evaluateQuickUnderstandingCase, evaluateWorkUnderstandingCase, findActiveWorkDiscoverySourceRefresh, getWorkDiscoveryDirectorySource, getWorkDiscoveryOnboardingState, getWorkDiscoveryRun, getWorkDiscoveryRunByIdempotencyKey, getWorkUnderstandingInvestigation, getWorkUnderstandingInvestigationForRun, investigateWorkContext, listWorkDiscoveryDirectorySources, listWorkDiscoverySourceRefreshes, listWorkUnderstandingEvidence, meetsQuickUnderstandingGate, persistWorkThreadsFromDiscovery, previewWorkDiscoveryRoot, probeWorkDiscoveryRoot, readWorkDiscoveryTextExcerpt, recordWorkDiscoverySourceRefresh, resetWorkUnderstandingInvestigation, resolvePersonalWorkRoots, revokeWorkDiscoveryDirectorySource, searchWorkDiscoveryText, setWorkDiscoveryFeedback, setWorkDiscoveryOnboardingState, summarizeWorkContextSnapshot, updateWorkDiscoveryRun, updateWorkDiscoverySourceRefreshForRun, updateWorkUnderstandingEvidenceObservation, updateWorkUnderstandingInvestigation, upsertWorkDiscoveryDirectorySource, workDiscoveryFingerprintsEqual, workDiscoveryResultMarkdown };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xopcai/xopc",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.211",
|
|
4
4
|
"description": "Local-first AI system that remembers context, coordinates AI, and sustains long-term progress.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -165,8 +165,8 @@
|
|
|
165
165
|
"vue": "^3.5.35",
|
|
166
166
|
"@xopcai/endpoint-tools-protocol": "0.0.0",
|
|
167
167
|
"@xopcai/gateway-contract": "0.0.0",
|
|
168
|
-
"@xopcai/realtime-
|
|
169
|
-
"@xopcai/realtime-
|
|
168
|
+
"@xopcai/realtime-protocol": "0.0.0",
|
|
169
|
+
"@xopcai/realtime-client": "0.0.0"
|
|
170
170
|
},
|
|
171
171
|
"scripts": {
|
|
172
172
|
"assets:brand": "node scripts/generate-brand-assets.mjs",
|
|
@@ -198,6 +198,7 @@
|
|
|
198
198
|
"dev:gateway": "sh -c 'mkdir -p \"$HOME/.xopc-dev\" && XOPC_STATE_DIR=\"$HOME/.xopc-dev\" XOPC_CONFIG_PATH=\"$HOME/.xopc-dev/xopc.json\" XOPC_CONFIG=\"$HOME/.xopc-dev/xopc.json\" XOPC_LOG_DIR=\"$HOME/.xopc-dev/logs\" XOPC_LOG_LEVEL=info tsx src/cli/bin.ts gateway \"$@\"' --",
|
|
199
199
|
"start": "node dist/src/cli/bin.js",
|
|
200
200
|
"test": "vitest run src extensions/telegram/src extensions/feishu/src extensions/weixin/src",
|
|
201
|
+
"test:quick-understanding": "XOPC_LOG_LEVEL=fatal vitest run src/work-discovery/__tests__/evaluation.test.ts src/user-context/sources/__tests__/activity-clustering.test.ts src/knowledge/__tests__/quick-understanding.e2e.test.ts src/connectors/__tests__/content-enrichment.test.ts src/connectors/__tests__/connected-source-ingestion.test.ts",
|
|
201
202
|
"test:skills": "vitest run src/agent/skills/__tests__",
|
|
202
203
|
"test:skills:regression": "./scripts/test-skills.sh",
|
|
203
204
|
"test:skills:all": "npm run test:skills && npm run test:skills:regression",
|