@xopcai/xopc 0.0.325 → 0.0.330
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-BDG0hI-J.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-ArM6Sm9S.js +1 -0
- package/dist/gateway/static/root/assets/agent-plugin-dialog-BX_Bhre1.js +1 -0
- package/dist/gateway/static/root/assets/agents-BiQqpMw0.js +70 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-p7fZB4dT.js → app-management-settings-panel-DgttzUCG.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-C-clVcfp.js → appearance-settings-CHpyWV8Z.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-BhfYQcm8.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-Xm6xChUX.js → archive-plugin-B7Q7Oeo7.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-Di8kuG4L.js → attachment-load-BYwqQ8qN.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-GUZgDhKj.js → automations-page-CsvAtTNd.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-DMH_1Ped.js +7 -0
- package/dist/gateway/static/root/assets/{binary-plugins-OCrDjC9O.js → binary-plugins-DdgWCI-M.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-m9tqvu7x.js → block-editor-DyOagNnn.js} +3 -3
- package/dist/gateway/static/root/assets/{browser-automation-inputs-DSWXq9lI.js → browser-automation-inputs-CwF8OQFN.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automations-page-DuOaridE.js → browser-automations-page-D_EQjiiu.js} +2 -2
- package/dist/gateway/static/root/assets/browser-settings-page-BE6691Jz.js +3 -0
- package/dist/gateway/static/root/assets/capabilities-page-MweWNrC1.js +2 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-CdSWkh89.js +8 -0
- package/dist/gateway/static/root/assets/capability-header-actions-C5F2GNE9.js +1 -0
- package/dist/gateway/static/root/assets/capability-icon-BYm2-nS-.js +1 -0
- package/dist/gateway/static/root/assets/channels-NGfwR3He.js +1 -0
- package/dist/gateway/static/root/assets/{chat-terminal-dock-BfnVh8oo.js → chat-terminal-dock-C6tl9Rfw.js} +2 -2
- package/dist/gateway/static/root/assets/computer-settings-page-C0MsVw4l.js +1 -0
- package/dist/gateway/static/root/assets/connector-service-page-DsF60pPs.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-BE8NdQcR.js +2 -0
- package/dist/gateway/static/root/assets/{date-picker-CtDyij_x.js → date-picker-CELKKqYN.js} +1 -1
- package/dist/gateway/static/root/assets/dependency-picker-BcEwCnI5.js +1 -0
- package/dist/gateway/static/root/assets/{desktop-pet-BsIYCAkG.js → desktop-pet-Ww7Gm8-x.js} +1 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-D-dbAxGu.js +1 -0
- package/dist/gateway/static/root/assets/device-pairing-wizard-DsYY6szg.js +1 -0
- package/dist/gateway/static/root/assets/directory-picker-path-field-CVmuCRyO.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-UUHNJj-d.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BktsR4hj.js → extension-page-BvL452mX.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-BQJc-vXH.js → extension-settings-page-CrNnUSOs.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-DMm1vU51.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-DrHhtZqv.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-B5GJ-CQV.js → gateway-startup-retry-Ck6tj6yE.js} +1 -1
- package/dist/gateway/static/root/assets/globe-DSSGFWFn.js +1 -0
- package/dist/gateway/static/root/assets/home-page-YgI6jfGA.js +1 -0
- package/dist/gateway/static/root/assets/{image-generation-api-DvWDkbk1.js → image-generation-api-BOh6j0BF.js} +1 -1
- package/dist/gateway/static/root/assets/imports-page-BuqdzA7h.js +1 -0
- package/dist/gateway/static/root/assets/index-DJmO2VAY.css +1 -0
- package/dist/gateway/static/root/assets/index-vCIBfJp7.js +121 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-ctJLm8TP.js → keyboard-shortcuts-settings-D9L7IdUg.js} +1 -1
- package/dist/gateway/static/root/assets/link-2-D_ZKYUW7.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-DO8uUtos.js +1 -0
- package/dist/gateway/static/root/assets/{local-apps-page-BxC_LTqq.js → local-apps-page-BEvyufm7.js} +1 -1
- package/dist/gateway/static/root/assets/locale-store-DAOwT3Zp.js +1 -0
- package/dist/gateway/static/root/assets/logs-page-Jev1m9sS.js +2 -0
- package/dist/gateway/static/root/assets/management-settings-41i7B1RO.js +1 -0
- package/dist/gateway/static/root/assets/{markdown-view-Dft8ASFD.js → markdown-view-nL4xzvI8.js} +2 -2
- package/dist/gateway/static/root/assets/{media-plugins-ni5zJ4Ok.js → media-plugins-dHbcqMan.js} +1 -1
- package/dist/gateway/static/root/assets/message-square-plus-XP0tGdlV.js +1 -0
- package/dist/gateway/static/root/assets/messages-BZbt9x1y.js +3 -0
- package/dist/gateway/static/root/assets/minimize-2-DtOGrlpo.js +1 -0
- package/dist/gateway/static/root/assets/note-detail-panel-DonP0E6Q.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-CYHMeVKo.js +8 -0
- package/dist/gateway/static/root/assets/page-context-capture-button-BKsMcPOy.js +1 -0
- package/dist/gateway/static/root/assets/pencil-DmIY3Oa-.js +1 -0
- package/dist/gateway/static/root/assets/preview-open-alternatives-Du18QgWc.js +1 -0
- package/dist/gateway/static/root/assets/{product-open-page-DQctU8z3.js → product-open-page-IY1QL6s0.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-Bpw9mxfV.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-BdYbDNUn.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-DWWO6ajd.js → registry-api-DCFXWBOt.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CLhbz3TF.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-CuTFmXyj.js} +2 -2
- package/dist/gateway/static/root/assets/scenes-page-XwK2IEmr.js +2 -0
- package/dist/gateway/static/root/assets/{schema-form-z8IeSdBp.js → schema-form-qWQii8IU.js} +1 -1
- package/dist/gateway/static/root/assets/search-DA7gz22f.js +1 -0
- package/dist/gateway/static/root/assets/sessions-page-4-QoiDES.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BggQVM1y.js +1 -0
- package/dist/gateway/static/root/assets/settings-form-section-B0ZBr0L9.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-Br9no5e4.js → settings-page-DpII4NO3.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-HPpC7EE0.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-CE0SER59.js → share-preview-page-B2CGYZHc.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-DhVCRYGP.js +1 -0
- package/dist/gateway/static/root/assets/skill-api-_ddww47C.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-XPZkWJJe.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-uF7DkJMC.js +2 -0
- package/dist/gateway/static/root/assets/system-settings-panel-25ABVt7H.js +1 -0
- package/dist/gateway/static/root/assets/task-detail-page-gepxhO4j.js +1 -0
- package/dist/gateway/static/root/assets/tunnel-api-CwQGBI_4.js +1 -0
- package/dist/gateway/static/root/assets/use-autosave-CL3wytbs.js +1 -0
- package/dist/gateway/static/root/assets/user-model-page-DldQW9Wh.js +2 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-By6Lgbse.js → voice-api-key-field-zjAzQrx4.js} +1 -1
- package/dist/gateway/static/root/assets/voice-config-api-DvzQ-128.js +1 -0
- package/dist/gateway/static/root/assets/{work-discovery-overlay-DdhgIlyf.js → work-discovery-overlay-MaPPjWwl.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BOJYQaxX.js → workflow-run-setup-panel-C3dQN1fE.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-B9lnTU3U.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 +20 -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 +5 -2
- package/dist/src/agent/agent-manager.js +77 -23
- 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 +59 -44
- package/dist/src/agent/bootstrap/filter-bootstrap-files.js +1 -1
- package/dist/src/agent/capabilities/definitions.d.ts +3 -2
- package/dist/src/agent/capabilities/definitions.js +3 -2
- package/dist/src/agent/context/execution-context.js +5 -2
- package/dist/src/agent/external-tools/endpoint-provider.js +2 -2
- package/dist/src/agent/image/tool-model-config.js +1 -1
- 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/orchestration/llm-turn-retry.js +2 -15
- 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/service.d.ts +1 -0
- package/dist/src/agent/service.js +5 -2
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +12 -0
- package/dist/src/agent/tasks/task-judge-service.js +1 -1
- package/dist/src/agent/tools/factory.js +3 -2
- package/dist/src/agent/tools/index.d.ts +1 -0
- package/dist/src/agent/tools/index.js +2 -1
- package/dist/src/agent/tools/user-context-tool.js +29 -4
- package/dist/src/agent/tools/workflow-manage-tool.d.ts +2 -0
- package/dist/src/agent/tools/workflow-manage-tool.js +225 -0
- package/dist/src/agent/tools/xopc-use-tool.js +1 -1
- package/dist/src/agent-catalog/capabilities.js +2 -2
- package/dist/src/auth/credentials.js +1 -1
- package/dist/src/auth/oauth-provider-lock.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/automations/capabilities/drafts.js +1 -1
- package/dist/src/automations/domain/types.d.ts +7 -1
- package/dist/src/automations/draft/automation-draft-service.js +13 -4
- 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/bootstrap/application-state.js +1 -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/capabilities/runtime/dispatcher.js +1 -1
- package/dist/src/capabilities/runtime/product.js +1 -1
- package/dist/src/chat-commands/agent-edit.js +1 -1
- package/dist/src/chat-commands/builtins/config.js +1 -1
- package/dist/src/chat-previews/service.js +1 -2
- package/dist/src/cli/commands/agent.js +1 -1
- package/dist/src/cli/commands/agents.js +1 -1
- 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/models.js +1 -1
- package/dist/src/cli/commands/onboard/model.js +3 -3
- package/dist/src/cli/commands/providers.js +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +1 -1
- package/dist/src/config/index.js +4 -4
- package/dist/src/config/loader.js +2 -2
- package/dist/src/config/models-json.js +1 -1
- package/dist/src/config/schema.js +5 -5
- 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/agent-plugins/validation.js +1 -1
- package/dist/src/extensions/bundled-extension-activation.d.ts +3 -1
- package/dist/src/extensions/bundled-extension-activation.js +5 -8
- package/dist/src/extensions/marketplace.d.ts +4 -0
- package/dist/src/extensions/marketplace.js +4 -0
- package/dist/src/gateway/agents-admin.js +2 -2
- package/dist/src/gateway/file-path-classifier.js +1 -1
- package/dist/src/gateway/file-space-service.d.ts +9 -2
- package/dist/src/gateway/gateway-workflow-host.types.d.ts +1 -0
- package/dist/src/gateway/hono/lib/config-payload.js +1 -1
- package/dist/src/gateway/hono/routes/agent-plugins.js +2 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +27 -5
- package/dist/src/gateway/hono/routes/config-patch/misc.js +2 -2
- 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/notes.js +2 -2
- package/dist/src/gateway/hono/routes/projects.js +2 -2
- package/dist/src/gateway/hono/routes/session-input-handler.js +1 -1
- package/dist/src/gateway/hono/routes/status.js +0 -1
- package/dist/src/gateway/hono/routes/tasks.js +1 -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/hono/routes/workflows.js +1 -23
- package/dist/src/gateway/image-generation-setup.js +2 -2
- package/dist/src/gateway/lock.js +1 -1
- package/dist/src/gateway/service/config-coordinator.d.ts +4 -4
- package/dist/src/gateway/service/config-coordinator.js +6 -6
- package/dist/src/gateway/service/marketplace-service.js +8 -6
- package/dist/src/gateway/service.d.ts +1 -1
- package/dist/src/gateway/service.js +20 -18
- package/dist/src/gateway/xopc-cloud-capability-setup.js +1 -1
- package/dist/src/home-intelligence/generator.js +7 -6
- package/dist/src/home-intelligence/host.js +1 -1
- package/dist/src/local-apps/service.js +1 -1
- 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/providers/model-catalog-persistence.js +1 -1
- package/dist/src/providers/model-response.d.ts +2 -0
- package/dist/src/providers/model-response.js +24 -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/capabilities/read.js +2 -2
- 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/tui/backends/embedded-backend.js +6 -3
- package/dist/src/tui/tui-commands.js +2 -2
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui.js +3 -3
- 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/platform-streams.js +15 -7
- package/dist/src/voice/realtime/agentEngine.js +19 -3
- package/dist/src/voice/realtime/pcmFrameBuffer.js +2 -1
- package/dist/src/voice/realtime/persona-context.js +1 -1
- package/dist/src/voice/realtime/playback-echo.js +16 -1
- 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/authoring/index.d.ts +1 -0
- package/dist/src/workflows/authoring/index.js +2 -1
- package/dist/src/workflows/authoring/workflow-draft-defaults.d.ts +3 -0
- package/dist/src/workflows/authoring/workflow-draft-defaults.js +63 -0
- package/dist/src/workflows/context/workflow-context.js +5 -1
- package/dist/src/workflows/domain/index.js +1 -1
- package/dist/src/workflows/engine/workflow-engine.js +1 -1
- package/dist/src/workflows/index.js +4 -4
- package/dist/src/workflows/service/workflow-run-service.d.ts +1 -0
- package/dist/src/workflows/service/workflow-run-service.js +39 -7
- package/dist/src/workflows/service/workflow-session-bridge.js +2 -2
- package/package.json +12 -16
- package/skills/engineering/workflow-authoring/SKILL.md +32 -0
- 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-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/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/locale-store-BPZR8x9b.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/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/workflows/draft/index.d.ts +0 -3
- package/dist/src/workflows/draft/index.js +0 -3
- package/dist/src/workflows/draft/workflow-draft-prompt.d.ts +0 -22
- package/dist/src/workflows/draft/workflow-draft-prompt.js +0 -54
- package/dist/src/workflows/draft/workflow-draft-service.d.ts +0 -12
- package/dist/src/workflows/draft/workflow-draft-service.js +0 -125
- package/dist/src/workflows/draft/workflow-draft-validator.d.ts +0 -4
- package/dist/src/workflows/draft/workflow-draft-validator.js +0 -123
- package/dist/src/workflows/draft/workflow-draft.types.d.ts +0 -44
- package/dist/src/workflows/draft/workflow-draft.types.js +0 -1
- /package/dist/src/voice/{local → audio}/wav.d.ts +0 -0
|
@@ -1,271 +0,0 @@
|
|
|
1
|
-
import { getLocalVoiceModel, resolveLocalVoiceModelDir } from "./models.js";
|
|
2
|
-
import { downloadLocalVoiceModelFiles } from "./model-files.js";
|
|
3
|
-
import { join, resolve, sep } from "node:path";
|
|
4
|
-
import { mkdir, rm } from "node:fs/promises";
|
|
5
|
-
import { EnvHttpProxyAgent, RetryAgent, setGlobalDispatcher } from "undici";
|
|
6
|
-
import { createInterface } from "node:readline";
|
|
7
|
-
//#region src/voice/local/runtime-worker.ts
|
|
8
|
-
const pipelines = /* @__PURE__ */ new Map();
|
|
9
|
-
const sherpaRecognizers = /* @__PURE__ */ new Map();
|
|
10
|
-
async function assertLocalVoiceEngineAvailable(modelId) {
|
|
11
|
-
const model = getLocalVoiceModel(modelId);
|
|
12
|
-
if (model.engine === "sherpa-onnx") {
|
|
13
|
-
const imported = await import("sherpa-onnx-node").catch((cause) => {
|
|
14
|
-
throw new Error("The sherpa-onnx local voice engine is not installed. Install sherpa-onnx-node@1.13.4 alongside @xopcai/xopc.", { cause });
|
|
15
|
-
});
|
|
16
|
-
if (typeof (imported.default ?? imported).OfflineRecognizer !== "function") throw new Error("The sherpa-onnx local voice engine did not expose OfflineRecognizer");
|
|
17
|
-
} else await import("@huggingface/transformers").catch((cause) => {
|
|
18
|
-
throw new Error("The Transformers.js local voice engine is not installed. Install @huggingface/transformers@3.8.1 alongside @xopcai/xopc.", { cause });
|
|
19
|
-
});
|
|
20
|
-
return model.engine;
|
|
21
|
-
}
|
|
22
|
-
const networkAgent = new RetryAgent(new EnvHttpProxyAgent(), {
|
|
23
|
-
maxRetries: 4,
|
|
24
|
-
minTimeout: 500,
|
|
25
|
-
maxTimeout: 8e3,
|
|
26
|
-
timeoutFactor: 2,
|
|
27
|
-
retryAfter: true
|
|
28
|
-
});
|
|
29
|
-
setGlobalDispatcher(networkAgent);
|
|
30
|
-
function normalizeRemoteHost(value) {
|
|
31
|
-
const url = new URL(value);
|
|
32
|
-
if (url.username || url.password) throw new Error("Local voice model endpoint must not contain credentials");
|
|
33
|
-
if (url.protocol !== "https:" && url.hostname !== "127.0.0.1" && url.hostname !== "localhost") throw new Error("Local voice model endpoint must use HTTPS");
|
|
34
|
-
url.pathname = `${url.pathname.replace(/\/+$/, "")}/`;
|
|
35
|
-
return url.toString();
|
|
36
|
-
}
|
|
37
|
-
function resolveRemoteHosts() {
|
|
38
|
-
const configured = process.env.XOPC_VOICE_MODEL_ENDPOINT?.trim() || process.env.HF_ENDPOINT?.trim();
|
|
39
|
-
if (configured) return [normalizeRemoteHost(configured)];
|
|
40
|
-
return [normalizeRemoteHost("https://xopc.ai/api/voice/models"), normalizeRemoteHost("https://huggingface.co")];
|
|
41
|
-
}
|
|
42
|
-
function serializeError(error) {
|
|
43
|
-
if (!(error instanceof Error)) return { message: String(error) };
|
|
44
|
-
const withCode = error;
|
|
45
|
-
const nested = withCode.cause;
|
|
46
|
-
const nestedMessage = nested instanceof Error ? nested.message : void 0;
|
|
47
|
-
const nestedCode = nested && typeof nested === "object" && "code" in nested ? String(nested.code ?? "") : void 0;
|
|
48
|
-
return {
|
|
49
|
-
message: error.message,
|
|
50
|
-
...typeof withCode.code === "string" ? { code: withCode.code } : {},
|
|
51
|
-
...nestedCode ? { code: nestedCode } : {},
|
|
52
|
-
...nestedMessage && nestedMessage !== error.message ? { cause: nestedMessage } : {}
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
function send(message) {
|
|
56
|
-
process.stdout.write(`${JSON.stringify(message)}\n`);
|
|
57
|
-
}
|
|
58
|
-
async function loadPipeline(modelId, allowRemote, cacheDir = resolveLocalVoiceModelDir(modelId), onProgress) {
|
|
59
|
-
const key = `${modelId}:${cacheDir}`;
|
|
60
|
-
const existing = pipelines.get(key);
|
|
61
|
-
if (existing) return existing;
|
|
62
|
-
const model = getLocalVoiceModel(modelId);
|
|
63
|
-
if (model.engine !== "transformers.js") throw new Error(`Model ${model.id} does not use the Transformers.js engine`);
|
|
64
|
-
const promise = (async () => {
|
|
65
|
-
let transformers;
|
|
66
|
-
try {
|
|
67
|
-
transformers = await import("@huggingface/transformers");
|
|
68
|
-
} catch (cause) {
|
|
69
|
-
throw new Error("The Transformers.js local voice engine is not installed. Install @huggingface/transformers@3.8.1 alongside @xopcai/xopc; use npm install -g when xopc is installed globally.", { cause });
|
|
70
|
-
}
|
|
71
|
-
transformers.env.cacheDir = cacheDir;
|
|
72
|
-
transformers.env.allowRemoteModels = allowRemote;
|
|
73
|
-
transformers.env.allowLocalModels = true;
|
|
74
|
-
const remoteHosts = allowRemote ? resolveRemoteHosts() : [normalizeRemoteHost("https://xopc.ai")];
|
|
75
|
-
let lastError;
|
|
76
|
-
for (const [index, remoteHost] of remoteHosts.entries()) {
|
|
77
|
-
transformers.env.remoteHost = remoteHost;
|
|
78
|
-
try {
|
|
79
|
-
return await transformers.pipeline("automatic-speech-recognition", model.repository, {
|
|
80
|
-
revision: model.revision,
|
|
81
|
-
dtype: model.dtype,
|
|
82
|
-
progress_callback: onProgress
|
|
83
|
-
});
|
|
84
|
-
} catch (error) {
|
|
85
|
-
lastError = error;
|
|
86
|
-
if (index + 1 < remoteHosts.length) {
|
|
87
|
-
await rm(cacheDir, {
|
|
88
|
-
recursive: true,
|
|
89
|
-
force: true
|
|
90
|
-
});
|
|
91
|
-
await mkdir(cacheDir, { recursive: true });
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
throw lastError;
|
|
96
|
-
})();
|
|
97
|
-
pipelines.set(key, promise);
|
|
98
|
-
try {
|
|
99
|
-
return await promise;
|
|
100
|
-
} catch (error) {
|
|
101
|
-
pipelines.delete(key);
|
|
102
|
-
throw error;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
function normalizeSenseVoiceLanguage(language) {
|
|
106
|
-
if (typeof language !== "string") return "auto";
|
|
107
|
-
const value = language.trim().toLowerCase().replace("_", "-");
|
|
108
|
-
if (!value || value === "auto") return "auto";
|
|
109
|
-
if (value === "cmn" || value.startsWith("zh")) return "zh";
|
|
110
|
-
if (value === "cantonese" || value.startsWith("yue")) return "yue";
|
|
111
|
-
if (value.startsWith("en")) return "en";
|
|
112
|
-
if (value.startsWith("ja")) return "ja";
|
|
113
|
-
if (value.startsWith("ko")) return "ko";
|
|
114
|
-
return "auto";
|
|
115
|
-
}
|
|
116
|
-
function cleanSenseVoiceTag(value) {
|
|
117
|
-
return value?.replace(/^<\|/, "").replace(/\|>$/, "").trim() || void 0;
|
|
118
|
-
}
|
|
119
|
-
async function loadSherpaRecognizer(modelId, language) {
|
|
120
|
-
const key = `${modelId}:${language}`;
|
|
121
|
-
const existing = sherpaRecognizers.get(key);
|
|
122
|
-
if (existing) return existing;
|
|
123
|
-
const model = getLocalVoiceModel(modelId);
|
|
124
|
-
if (model.engine !== "sherpa-onnx") throw new Error(`Model ${model.id} does not use the sherpa-onnx engine`);
|
|
125
|
-
const modelDir = resolveLocalVoiceModelDir(model.id);
|
|
126
|
-
const promise = (async () => {
|
|
127
|
-
let imported;
|
|
128
|
-
try {
|
|
129
|
-
imported = await import("sherpa-onnx-node");
|
|
130
|
-
} catch (cause) {
|
|
131
|
-
throw new Error("The sherpa-onnx local voice engine is not installed. Install sherpa-onnx-node@1.13.4 alongside @xopcai/xopc; use npm install -g when xopc is installed globally.", { cause });
|
|
132
|
-
}
|
|
133
|
-
return new (imported.default ?? imported).OfflineRecognizer({
|
|
134
|
-
featConfig: {
|
|
135
|
-
sampleRate: 16e3,
|
|
136
|
-
featureDim: 80
|
|
137
|
-
},
|
|
138
|
-
modelConfig: {
|
|
139
|
-
senseVoice: {
|
|
140
|
-
model: join(modelDir, "model.int8.onnx"),
|
|
141
|
-
language,
|
|
142
|
-
useInverseTextNormalization: 1
|
|
143
|
-
},
|
|
144
|
-
tokens: join(modelDir, "tokens.txt"),
|
|
145
|
-
numThreads: Math.max(1, Math.min(4, Number(process.env.XOPC_VOICE_THREADS) || 2)),
|
|
146
|
-
provider: "cpu",
|
|
147
|
-
debug: 0
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
})();
|
|
151
|
-
sherpaRecognizers.set(key, promise);
|
|
152
|
-
try {
|
|
153
|
-
return await promise;
|
|
154
|
-
} catch (error) {
|
|
155
|
-
sherpaRecognizers.delete(key);
|
|
156
|
-
throw error;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
async function transcribeWithSherpa(modelId, audio, language) {
|
|
160
|
-
const recognizer = await loadSherpaRecognizer(modelId, normalizeSenseVoiceLanguage(language));
|
|
161
|
-
const stream = recognizer.createStream();
|
|
162
|
-
stream.acceptWaveform({
|
|
163
|
-
sampleRate: 16e3,
|
|
164
|
-
samples: audio
|
|
165
|
-
});
|
|
166
|
-
const result = recognizer.decodeAsync ? await recognizer.decodeAsync(stream) : (recognizer.decode(stream), recognizer.getResult(stream));
|
|
167
|
-
return {
|
|
168
|
-
text: String(result.text ?? "").trim(),
|
|
169
|
-
...cleanSenseVoiceTag(result.lang) ? { language: cleanSenseVoiceTag(result.lang) } : {},
|
|
170
|
-
...cleanSenseVoiceTag(result.emotion) ? { emotion: cleanSenseVoiceTag(result.emotion) } : {},
|
|
171
|
-
...cleanSenseVoiceTag(result.event) ? { event: cleanSenseVoiceTag(result.event) } : {}
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
async function handle(request) {
|
|
175
|
-
const params = request.params ?? {};
|
|
176
|
-
if (request.method === "health") {
|
|
177
|
-
const modelId = typeof params.modelId === "string" && params.modelId ? params.modelId : void 0;
|
|
178
|
-
const selectedEngine = modelId ? await assertLocalVoiceEngineAvailable(modelId) : void 0;
|
|
179
|
-
return {
|
|
180
|
-
ok: true,
|
|
181
|
-
protocolVersion: 2,
|
|
182
|
-
engine: "transformers.js+sherpa-onnx",
|
|
183
|
-
engines: ["transformers.js", "sherpa-onnx"],
|
|
184
|
-
...modelId ? {
|
|
185
|
-
modelId,
|
|
186
|
-
selectedEngine
|
|
187
|
-
} : {}
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
if (request.method === "model.install") {
|
|
191
|
-
const modelId = String(params.modelId ?? "");
|
|
192
|
-
const modelDir = resolve(resolveLocalVoiceModelDir(modelId));
|
|
193
|
-
const requestedCacheDir = typeof params.cacheDir === "string" ? resolve(params.cacheDir) : modelDir;
|
|
194
|
-
const allowedPrefix = `${resolve(modelDir, "..")}${sep}`;
|
|
195
|
-
if (requestedCacheDir !== modelDir && !requestedCacheDir.startsWith(allowedPrefix)) throw new Error("Local voice model cache directory is outside the managed root");
|
|
196
|
-
const model = getLocalVoiceModel(modelId);
|
|
197
|
-
if (model.engine === "sherpa-onnx") await downloadLocalVoiceModelFiles({
|
|
198
|
-
model,
|
|
199
|
-
destinationDir: requestedCacheDir,
|
|
200
|
-
remoteHosts: resolveRemoteHosts(),
|
|
201
|
-
onProgress: (data) => send({
|
|
202
|
-
id: request.id,
|
|
203
|
-
event: "progress",
|
|
204
|
-
data
|
|
205
|
-
})
|
|
206
|
-
});
|
|
207
|
-
else {
|
|
208
|
-
await loadPipeline(modelId, true, requestedCacheDir, (data) => send({
|
|
209
|
-
id: request.id,
|
|
210
|
-
event: "progress",
|
|
211
|
-
data
|
|
212
|
-
}));
|
|
213
|
-
pipelines.delete(`${modelId}:${requestedCacheDir}`);
|
|
214
|
-
}
|
|
215
|
-
return {
|
|
216
|
-
installed: true,
|
|
217
|
-
modelId
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
if (request.method === "model.unload") {
|
|
221
|
-
const modelId = String(params.modelId ?? "");
|
|
222
|
-
for (const key of pipelines.keys()) if (key.startsWith(`${modelId}:`)) pipelines.delete(key);
|
|
223
|
-
for (const key of sherpaRecognizers.keys()) if (key.startsWith(`${modelId}:`)) sherpaRecognizers.delete(key);
|
|
224
|
-
return { unloaded: true };
|
|
225
|
-
}
|
|
226
|
-
if (request.method === "transcribe") {
|
|
227
|
-
const modelId = String(params.modelId ?? "");
|
|
228
|
-
const bytes = Buffer.from(String(params.audioBase64 ?? ""), "base64");
|
|
229
|
-
const copied = Uint8Array.from(bytes);
|
|
230
|
-
const audio = new Float32Array(copied.buffer);
|
|
231
|
-
const language = typeof params.language === "string" && params.language ? params.language : void 0;
|
|
232
|
-
const model = getLocalVoiceModel(modelId);
|
|
233
|
-
if (model.engine === "sherpa-onnx") return {
|
|
234
|
-
...await transcribeWithSherpa(model.id, audio, language),
|
|
235
|
-
modelId
|
|
236
|
-
};
|
|
237
|
-
const output = await (await loadPipeline(modelId, false))(audio, {
|
|
238
|
-
task: "transcribe",
|
|
239
|
-
...language ? { language } : {},
|
|
240
|
-
chunk_length_s: 30,
|
|
241
|
-
stride_length_s: 5,
|
|
242
|
-
return_timestamps: false
|
|
243
|
-
});
|
|
244
|
-
return {
|
|
245
|
-
text: (output && typeof output === "object" && "text" in output ? String(output.text ?? "") : "").trim(),
|
|
246
|
-
modelId
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
throw new Error(`Unknown local voice runtime method: ${request.method}`);
|
|
250
|
-
}
|
|
251
|
-
const lines = createInterface({ input: process.stdin });
|
|
252
|
-
lines.on("line", (line) => {
|
|
253
|
-
let request;
|
|
254
|
-
try {
|
|
255
|
-
request = JSON.parse(line);
|
|
256
|
-
} catch {
|
|
257
|
-
return;
|
|
258
|
-
}
|
|
259
|
-
handle(request).then((result) => send({
|
|
260
|
-
id: request.id,
|
|
261
|
-
result
|
|
262
|
-
}), (error) => send({
|
|
263
|
-
id: request.id,
|
|
264
|
-
error: serializeError(error)
|
|
265
|
-
}));
|
|
266
|
-
});
|
|
267
|
-
lines.once("close", () => {
|
|
268
|
-
networkAgent.close().finally(() => process.exit(0));
|
|
269
|
-
});
|
|
270
|
-
//#endregion
|
|
271
|
-
export {};
|
|
@@ -1,53 +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, getLocalVoiceModel, hasInstalledLocalVoiceModel, isLocalVoiceModelInstalled } from "../../local/models.js";
|
|
4
|
-
import { registerMediaUnderstandingProvider } from "../../../media-understanding/registry.js";
|
|
5
|
-
import { getLocalVoiceRuntimeClient } from "../../local/runtime-client.js";
|
|
6
|
-
import { decodeAudioToMonoFloat32 } from "../../audio/normalize.js";
|
|
7
|
-
//#region src/voice/stt/providers/local-transcription.ts
|
|
8
|
-
init_logger();
|
|
9
|
-
const log = createLogger("STT:Local");
|
|
10
|
-
async function transcribeAudio(req) {
|
|
11
|
-
const model = getLocalVoiceModel(req.model);
|
|
12
|
-
if (!isLocalVoiceModelInstalled(model.id)) throw new Error(`Local voice model "${model.id}" is not installed`);
|
|
13
|
-
const decoded = await decodeAudioToMonoFloat32({
|
|
14
|
-
buffer: req.buffer,
|
|
15
|
-
signal: req.signal
|
|
16
|
-
});
|
|
17
|
-
const audioBytes = Buffer.from(decoded.samples.buffer, decoded.samples.byteOffset, decoded.samples.byteLength);
|
|
18
|
-
const startedAt = Date.now();
|
|
19
|
-
const result = await getLocalVoiceRuntimeClient().request("transcribe", {
|
|
20
|
-
modelId: model.id,
|
|
21
|
-
audioBase64: audioBytes.toString("base64"),
|
|
22
|
-
...req.language ? { language: req.language } : {}
|
|
23
|
-
}, {
|
|
24
|
-
signal: req.signal,
|
|
25
|
-
timeoutMs: req.timeoutMs
|
|
26
|
-
});
|
|
27
|
-
log.info({
|
|
28
|
-
model: model.id,
|
|
29
|
-
audioDurationSeconds: decoded.durationSeconds,
|
|
30
|
-
latencyMs: Date.now() - startedAt,
|
|
31
|
-
realTimeFactor: decoded.durationSeconds > 0 ? (Date.now() - startedAt) / 1e3 / decoded.durationSeconds : void 0,
|
|
32
|
-
textLength: result.text.length
|
|
33
|
-
}, "Local transcription completed");
|
|
34
|
-
return {
|
|
35
|
-
text: result.text,
|
|
36
|
-
model: model.id,
|
|
37
|
-
...result.language || req.language ? { language: result.language ?? req.language } : {},
|
|
38
|
-
durationSeconds: decoded.durationSeconds
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
const localTranscriptionProvider = {
|
|
42
|
-
id: "xopc-local",
|
|
43
|
-
aliases: ["local"],
|
|
44
|
-
capabilities: ["audio"],
|
|
45
|
-
requiresApiKey: false,
|
|
46
|
-
defaultModels: { audio: DEFAULT_LOCAL_VOICE_MODEL_ID },
|
|
47
|
-
autoPriority: { audio: 0 },
|
|
48
|
-
isConfigured: (options) => options?.model ? isLocalVoiceModelInstalled(options.model) : hasInstalledLocalVoiceModel(),
|
|
49
|
-
transcribeAudio
|
|
50
|
-
};
|
|
51
|
-
registerMediaUnderstandingProvider(localTranscriptionProvider);
|
|
52
|
-
//#endregion
|
|
53
|
-
export { localTranscriptionProvider };
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { buildWorkflowDraftResponse, lintWorkflowDraft, parseGeneratedWorkflowDraft } from "./workflow-draft-validator.js";
|
|
2
|
-
import { WorkflowDraftService, resolveDraftModelRef } from "./workflow-draft-service.js";
|
|
3
|
-
export { WorkflowDraftService, buildWorkflowDraftResponse, lintWorkflowDraft, parseGeneratedWorkflowDraft, resolveDraftModelRef };
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { WorkflowGraph } from '../domain/definition.js';
|
|
2
|
-
import type { WorkflowDraftConstraints, WorkflowDraftMode } from './workflow-draft.types.js';
|
|
3
|
-
export interface WorkflowDraftRepairIssue {
|
|
4
|
-
source: 'parse' | 'validation' | 'lint';
|
|
5
|
-
severity: 'error' | 'warning';
|
|
6
|
-
code: string;
|
|
7
|
-
message: string;
|
|
8
|
-
}
|
|
9
|
-
export declare function buildWorkflowDraftPrompt(params: {
|
|
10
|
-
prompt: string;
|
|
11
|
-
language?: 'en' | 'zh';
|
|
12
|
-
mode: WorkflowDraftMode;
|
|
13
|
-
existingGraph?: WorkflowGraph;
|
|
14
|
-
constraints?: WorkflowDraftConstraints;
|
|
15
|
-
}): string;
|
|
16
|
-
export declare function buildWorkflowDraftRepairPrompt(params: {
|
|
17
|
-
prompt: string;
|
|
18
|
-
language?: 'en' | 'zh';
|
|
19
|
-
constraints?: WorkflowDraftConstraints;
|
|
20
|
-
previousOutput: string;
|
|
21
|
-
issues: WorkflowDraftRepairIssue[];
|
|
22
|
-
}): string;
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
//#region src/workflows/draft/workflow-draft-prompt.ts
|
|
2
|
-
function buildWorkflowDraftPrompt(params) {
|
|
3
|
-
return `${GRAPH_DESIGN_PROMPT}
|
|
4
|
-
|
|
5
|
-
Mode: ${params.mode}
|
|
6
|
-
Language for user-facing copy: ${params.language ?? "en"}
|
|
7
|
-
Constraints:
|
|
8
|
-
${JSON.stringify(params.constraints ?? {}, null, 2)}
|
|
9
|
-
|
|
10
|
-
${params.existingGraph ? `Existing graph to improve:\n${JSON.stringify(params.existingGraph, null, 2).slice(0, 16e3)}\n` : ""}
|
|
11
|
-
User request:
|
|
12
|
-
${params.prompt.slice(0, 8e3)}`;
|
|
13
|
-
}
|
|
14
|
-
function buildWorkflowDraftRepairPrompt(params) {
|
|
15
|
-
return `${GRAPH_DESIGN_PROMPT}
|
|
16
|
-
|
|
17
|
-
Repair the previous graph while preserving the user's intent. Fix every listed issue.
|
|
18
|
-
Language for user-facing copy: ${params.language ?? "en"}
|
|
19
|
-
Constraints:
|
|
20
|
-
${JSON.stringify(params.constraints ?? {}, null, 2)}
|
|
21
|
-
Issues:
|
|
22
|
-
${JSON.stringify(params.issues, null, 2)}
|
|
23
|
-
User request:
|
|
24
|
-
${params.prompt.slice(0, 8e3)}
|
|
25
|
-
Previous output:
|
|
26
|
-
${params.previousOutput.slice(0, 16e3)}`;
|
|
27
|
-
}
|
|
28
|
-
const GRAPH_DESIGN_PROMPT = `You design xopc visual workflows for non-technical users. Return ONLY one JSON object, no markdown.
|
|
29
|
-
|
|
30
|
-
Shape:
|
|
31
|
-
{
|
|
32
|
-
"name": "lowercase_snake_case",
|
|
33
|
-
"graph": { "schemaVersion": 1, "nodes": [], "edges": [] },
|
|
34
|
-
"manifest": {
|
|
35
|
-
"title": "Human title", "description": "Task in plain language", "version": "1.0.0",
|
|
36
|
-
"inputSchema": { "type": "object", "properties": {}, "required": [] },
|
|
37
|
-
"defaults": { "concurrency": 3, "timeoutSec": 1800, "maxSubagents": 8 },
|
|
38
|
-
"permissions": { "network": false, "fileSystem": "read", "approvalRequired": false },
|
|
39
|
-
"tags": ["custom"], "whenToUse": "A concrete user situation"
|
|
40
|
-
},
|
|
41
|
-
"explanation": "Short explanation", "assumptions": [], "risks": []
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
Graph rules:
|
|
45
|
-
- Exactly one input node and one output node. Every node must be reachable from input and lead toward output.
|
|
46
|
-
- Node kinds are input, agent, decision, merge, output.
|
|
47
|
-
- Every node has id, kind, title, position {x,y}, config, and optional phaseId/description.
|
|
48
|
-
- input config: {schema?}; agent config: {prompt, model?, toolset?, maxIterations?, outputSchema?}; decision config: {rule:{path,operator,value?}}; merge config: {mode:"array"|"object"}; output config: {summary?,title?}.
|
|
49
|
-
- Edge shape: {id,source,target,sourcePort?}. Decision branch ports are true and false.
|
|
50
|
-
- Agent prompts may reference {{goal}}, {{input}}, {{input.field}}, {{nodes.nodeId}}, and {{predecessors.nodeId}}.
|
|
51
|
-
- Prefer a small, understandable graph: 3-8 nodes, short titles, clear descriptions. Parallel independent work should fan out and then merge.
|
|
52
|
-
- Do not create code or script fields. Do not request permissions the user did not need.`;
|
|
53
|
-
//#endregion
|
|
54
|
-
export { buildWorkflowDraftPrompt, buildWorkflowDraftRepairPrompt };
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { Config } from '../../config/schema.js';
|
|
2
|
-
import type { CreateWorkflowDraftRequest, WorkflowDraftResponse } from './workflow-draft.types.js';
|
|
3
|
-
export interface WorkflowDraftServiceOptions {
|
|
4
|
-
config: Config;
|
|
5
|
-
maxRepairAttempts?: number;
|
|
6
|
-
}
|
|
7
|
-
export declare class WorkflowDraftService {
|
|
8
|
-
private readonly options;
|
|
9
|
-
constructor(options: WorkflowDraftServiceOptions);
|
|
10
|
-
createDraft(request: CreateWorkflowDraftRequest, signal?: AbortSignal): Promise<WorkflowDraftResponse>;
|
|
11
|
-
}
|
|
12
|
-
export declare function resolveDraftModelRef(config: Config, agentId: string): string;
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { createLogger } from "../../utils/logger/index.js";
|
|
2
|
-
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
|
|
4
|
-
import { getDefaultModelSync, init_providers, resolveModel } from "../../providers/index.js";
|
|
5
|
-
import { completeWithResolvedCredentials } from "../../providers/model-call.js";
|
|
6
|
-
import { resolveModelSelector } from "../../config/agent-model-intents.js";
|
|
7
|
-
import { buildWorkflowDraftPrompt, buildWorkflowDraftRepairPrompt } from "./workflow-draft-prompt.js";
|
|
8
|
-
import { buildWorkflowDraftResponse, parseGeneratedWorkflowDraft } from "./workflow-draft-validator.js";
|
|
9
|
-
//#region src/workflows/draft/workflow-draft-service.ts
|
|
10
|
-
init_schema();
|
|
11
|
-
init_providers();
|
|
12
|
-
init_logger();
|
|
13
|
-
const log = createLogger("WorkflowDraft");
|
|
14
|
-
const DEFAULT_MAX_REPAIR_ATTEMPTS = 2;
|
|
15
|
-
var WorkflowDraftService = class {
|
|
16
|
-
constructor(options) {
|
|
17
|
-
this.options = options;
|
|
18
|
-
}
|
|
19
|
-
async createDraft(request, signal) {
|
|
20
|
-
const prompt = request.prompt.trim();
|
|
21
|
-
if (!prompt) throw new Error("prompt is required");
|
|
22
|
-
const modelRef = resolveDraftModelRef(this.options.config, request.agentId);
|
|
23
|
-
const model = resolveModel(modelRef);
|
|
24
|
-
const maxRepairAttempts = this.options.maxRepairAttempts ?? DEFAULT_MAX_REPAIR_ATTEMPTS;
|
|
25
|
-
let messageContent = buildWorkflowDraftPrompt({
|
|
26
|
-
prompt,
|
|
27
|
-
language: request.language,
|
|
28
|
-
mode: request.mode ?? (request.existingGraph ? "improve" : "create"),
|
|
29
|
-
existingGraph: request.existingGraph,
|
|
30
|
-
constraints: request.constraints
|
|
31
|
-
});
|
|
32
|
-
let lastIssues = [];
|
|
33
|
-
let lastText = "";
|
|
34
|
-
for (let attempt = 0; attempt <= maxRepairAttempts; attempt += 1) {
|
|
35
|
-
lastText = extractText(await completeWithResolvedCredentials(model, { messages: [{
|
|
36
|
-
role: "user",
|
|
37
|
-
content: messageContent,
|
|
38
|
-
timestamp: Date.now()
|
|
39
|
-
}] }, {
|
|
40
|
-
maxTokens: 4096,
|
|
41
|
-
temperature: attempt === 0 ? .25 : .1,
|
|
42
|
-
signal
|
|
43
|
-
}));
|
|
44
|
-
try {
|
|
45
|
-
const response = buildWorkflowDraftResponse(parseGeneratedWorkflowDraft(lastText), request.constraints);
|
|
46
|
-
const blockingIssues = getBlockingDraftIssues(response);
|
|
47
|
-
if (blockingIssues.length === 0) return {
|
|
48
|
-
...response,
|
|
49
|
-
repairAttempts: attempt
|
|
50
|
-
};
|
|
51
|
-
lastIssues = blockingIssues;
|
|
52
|
-
} catch (err) {
|
|
53
|
-
lastIssues = [{
|
|
54
|
-
source: "parse",
|
|
55
|
-
severity: "error",
|
|
56
|
-
code: "invalid_model_output",
|
|
57
|
-
message: err instanceof Error ? err.message : String(err)
|
|
58
|
-
}];
|
|
59
|
-
}
|
|
60
|
-
if (attempt >= maxRepairAttempts) break;
|
|
61
|
-
log.warn({
|
|
62
|
-
modelRef,
|
|
63
|
-
attempt: attempt + 1,
|
|
64
|
-
issueCount: lastIssues.length,
|
|
65
|
-
preview: lastText.slice(0, 500)
|
|
66
|
-
}, "Workflow draft validation failed; asking model to repair");
|
|
67
|
-
messageContent = buildWorkflowDraftRepairPrompt({
|
|
68
|
-
prompt,
|
|
69
|
-
language: request.language,
|
|
70
|
-
constraints: request.constraints,
|
|
71
|
-
previousOutput: lastText,
|
|
72
|
-
issues: lastIssues
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
const message = `Unable to generate a valid workflow draft after ${maxRepairAttempts + 1} attempts: ${formatRepairIssues(lastIssues)}`;
|
|
76
|
-
log.warn({
|
|
77
|
-
modelRef,
|
|
78
|
-
issues: lastIssues,
|
|
79
|
-
preview: lastText.slice(0, 500)
|
|
80
|
-
}, message);
|
|
81
|
-
throw new Error(message);
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
function resolveDraftModelRef(config, agentId) {
|
|
85
|
-
try {
|
|
86
|
-
return resolveModelSelector(config, agentId, "reasoning");
|
|
87
|
-
} catch {
|
|
88
|
-
return getAgentDefaultModelRef() ?? getDefaultModelSync(config);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
function extractText(result) {
|
|
92
|
-
const content = result.content;
|
|
93
|
-
if (typeof content === "string") return content;
|
|
94
|
-
if (Array.isArray(content)) return content.map((item) => {
|
|
95
|
-
if (item && typeof item === "object" && item.type === "text") return String(item.text ?? "");
|
|
96
|
-
return "";
|
|
97
|
-
}).join("");
|
|
98
|
-
return "";
|
|
99
|
-
}
|
|
100
|
-
function getBlockingDraftIssues(response) {
|
|
101
|
-
const validationIssues = [...response.validation.errors.map((issue) => ({
|
|
102
|
-
source: "validation",
|
|
103
|
-
severity: "error",
|
|
104
|
-
code: issue.code,
|
|
105
|
-
message: issue.message
|
|
106
|
-
})), ...response.validation.warnings.map((issue) => ({
|
|
107
|
-
source: "validation",
|
|
108
|
-
severity: "warning",
|
|
109
|
-
code: issue.code,
|
|
110
|
-
message: issue.message
|
|
111
|
-
}))];
|
|
112
|
-
const lintIssues = response.lint.filter((issue) => issue.severity === "error").map((issue) => ({
|
|
113
|
-
source: "lint",
|
|
114
|
-
severity: issue.severity,
|
|
115
|
-
code: issue.code,
|
|
116
|
-
message: issue.message
|
|
117
|
-
}));
|
|
118
|
-
return [...validationIssues, ...lintIssues];
|
|
119
|
-
}
|
|
120
|
-
function formatRepairIssues(issues) {
|
|
121
|
-
if (issues.length === 0) return "unknown validation failure";
|
|
122
|
-
return issues.slice(0, 5).map((issue) => `${issue.source}:${issue.code}: ${issue.message}`).join("; ");
|
|
123
|
-
}
|
|
124
|
-
//#endregion
|
|
125
|
-
export { WorkflowDraftService, resolveDraftModelRef };
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { GeneratedWorkflowDraft, WorkflowDraftConstraints, WorkflowDraftLintIssue, WorkflowDraftResponse } from './workflow-draft.types.js';
|
|
2
|
-
export declare function parseGeneratedWorkflowDraft(raw: string): GeneratedWorkflowDraft;
|
|
3
|
-
export declare function buildWorkflowDraftResponse(draft: GeneratedWorkflowDraft, constraints?: WorkflowDraftConstraints): WorkflowDraftResponse;
|
|
4
|
-
export declare function lintWorkflowDraft(draft: GeneratedWorkflowDraft, constraints?: WorkflowDraftConstraints): WorkflowDraftLintIssue[];
|