@xopcai/xopc 0.0.389 → 0.0.390
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/src/plugin.js +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-dvik6t7Z.js → activity-store-DGMAYkw8.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-bWMd5TDC.js → agent-avatar-dicebear-B4AsZzJR.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-9NUY1sO3.js +1 -0
- package/dist/gateway/static/root/assets/agent-plugin-dialog-CNc6ntzP.js +1 -0
- package/dist/gateway/static/root/assets/agents-QNY9Vkrf.js +77 -0
- package/dist/gateway/static/root/assets/{agents-admin-api-BlNGyXpm.js → agents-admin-api-DxdaiFWn.js} +1 -1
- package/dist/gateway/static/root/assets/app-management-settings-panel-DHRfLkYD.js +1 -0
- package/dist/gateway/static/root/assets/{appearance-settings-CUAdx44v.js → appearance-settings-DtKSapgb.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-D5zDB6gp.js → apps-page-B9kuRt_z.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-Du6dJNcl.js → archive-plugin-AgySTXp_.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-BO8Ig5Z4.js → automations-page-D1o7ZtUW.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-BJenz0P1.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-D7VJjwnr.js → binary-plugins-A1AXOsO6.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-CaJlWTAn.js → block-editor-DUNLkLKF.js} +3 -3
- package/dist/gateway/static/root/assets/{browser-automation-inputs-iyMBJmQX.js → browser-automation-inputs-BvUC6OiW.js} +1 -1
- package/dist/gateway/static/root/assets/browser-automations-page-Dq2LlVMh.js +3 -0
- package/dist/gateway/static/root/assets/browser-settings-page-BOZ-1g51.js +3 -0
- package/dist/gateway/static/root/assets/{capabilities-MCKRMZDK.js → capabilities-BkCutK0V.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-CEH1AnXc.js → capabilities-D61uSJPy.js} +1 -1
- package/dist/gateway/static/root/assets/capabilities-page-BDP6gzlv.js +2 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-D6PL3Mfl.js +8 -0
- package/dist/gateway/static/root/assets/{capability-header-actions-BIA0Lwt5.js → capability-header-actions-D9uGs4Pw.js} +1 -1
- package/dist/gateway/static/root/assets/channels-xb7n8rwF.js +1 -0
- package/dist/gateway/static/root/assets/chat-terminal-dock-Dgn09YDs.js +36 -0
- package/dist/gateway/static/root/assets/{computer-settings-page-DvY3zgyY.js → computer-settings-page-C66P4ifT.js} +1 -1
- package/dist/gateway/static/root/assets/{connector-service-page-St2-Fj3y.js → connector-service-page-Dp35XdYf.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-BHcRxYib.js +1 -0
- package/dist/gateway/static/root/assets/{date-picker-C0-D80ny.js → date-picker-CddHY982.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-CNd7mwMU.js → dependency-picker-Ob6BZTqv.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-C-2wDANn.js → desktop-pet-dmwCV-I4.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-DyhxLrdJ.js → desktop-pet-settings-B-TBkZAZ.js} +1 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-SWHwRgG3.js +1 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-CNivVIPT.js → directory-picker-path-field-6VZa4fT1.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-CGYO3JPw.js → extension-debug-page-C0_njMva.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-Dc51ALAg.js → extension-page-BeBLMFmW.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-provider-BXPILdlw.js → extension-provider-DWI0KAKT.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-BiLUwoKx.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-config-swr-Bc2MytsF.js → gateway-config-swr-CmYcOqhb.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-realtime-BFK-vlME.js → gateway-realtime-Ci1Jst5g.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-BMUiUQMk.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-CzWT_v09.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-BDPMttPx.js → gateway-startup-retry-C-BG5M7H.js} +1 -1
- package/dist/gateway/static/root/assets/{highlighted-body-KQOG7T2V-DAlRGMge.js → highlighted-body-KQOG7T2V-CsA7lCVc.js} +1 -1
- package/dist/gateway/static/root/assets/home-page-BeXJfxsg.js +2 -0
- package/dist/gateway/static/root/assets/image-generation-api-B_DqCwtV.js +1 -0
- package/dist/gateway/static/root/assets/imports-page-oAvAF9QS.js +1 -0
- package/dist/gateway/static/root/assets/index-W9ls-0Yd.css +1 -0
- package/dist/gateway/static/root/assets/index-xTL-vb51.js +260 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BYYC9Qmw.js → keyboard-shortcuts-settings--MjYe-Pb.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-BKZfn-MS.js → local-app-workbench-page-DL33dtd7.js} +1 -1
- package/dist/gateway/static/root/assets/{local-apps-page-BU8pUsVM.js → local-apps-page-DOa7mxjB.js} +1 -1
- package/dist/gateway/static/root/assets/{local-session-drafts-kFc_MAA9.js → local-session-drafts-DAtLkTPg.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-Dr43FCty.js → locale-store-DMy9W6IG.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-C-GbTYsM.js +2 -0
- package/dist/gateway/static/root/assets/management-settings-C0TzuD3-.js +1 -0
- package/dist/gateway/static/root/assets/{markdown-view-CdKlPjJM.js → markdown-view-wyOHdXEg.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-DE9zt88i.js → media-plugins-Pb2zr_-L.js} +1 -1
- package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-BxyGGa4D.js +1 -0
- package/dist/gateway/static/root/assets/messages-O0BEUKnx.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-cache-DdH1MODX.js +1 -0
- package/dist/gateway/static/root/assets/note-detail-panel-BFpEqskQ.js +5 -0
- package/dist/gateway/static/root/assets/{notes-api-BHouNL6-.js → notes-api-CYt2pGsm.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-h-qqFJ6Z.js +8 -0
- package/dist/gateway/static/root/assets/{page-context-capture-button-TQr8NnSc.js → page-context-capture-button-3uj5EcQC.js} +1 -1
- package/dist/gateway/static/root/assets/personal-page-BGyW6cdt.js +1 -0
- package/dist/gateway/static/root/assets/{product-open-page-BEl6syFp.js → product-open-page-hI13tPS1.js} +1 -1
- package/dist/gateway/static/root/assets/{product-preview-content-BxSHnbqz.js → product-preview-content-lT_in0-Q.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-Baj7fQ7N.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-D7DyQFU3.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-BD5IgDOA.js → registry-api-CgQrCqL6.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-DU_d93Tm.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-api-CjTRoQWT.js → runtime-tools-api-D12qVKeC.js} +1 -1
- package/dist/gateway/static/root/assets/runtime-tools-settings-panel-DOSPOfCU.js +1 -0
- package/dist/gateway/static/root/assets/scenes-page-swyUIF5A.js +2 -0
- package/dist/gateway/static/root/assets/{schema-form-ByG-R6N2.js → schema-form-CwOFgsyh.js} +1 -1
- package/dist/gateway/static/root/assets/{send-session-input-UAVStisp.js → send-session-input-nH8Cw0US.js} +1 -1
- package/dist/gateway/static/root/assets/{session-api-DvgEiNRS.js → session-api-B9HrwF-c.js} +1 -1
- package/dist/gateway/static/root/assets/{session-manager-BOb1tC_Z.js → session-manager-aXqXuqDX.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-CI_PJmlX.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DCVaeBLW.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-C1e9m23j.js → settings-page-BN70wE6R.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-CHzcVRi-.js +1 -0
- package/dist/gateway/static/root/assets/{share-link-dialog-kE_6v5Dp.js → share-link-dialog-B1TDyhPt.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-BT-_yR1h.js → share-preview-page-Br-eAZaP.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-api-Dg_SqHQE.js → shares-api-Bl1ZBh5S.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-jgCC_E4Y.js +1 -0
- package/dist/gateway/static/root/assets/{skill-api-BslUYMnX.js → skill-api-ClUw3SRC.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-reload-api-BQ2rTOP1.js → skill-reload-api--1BfIPzb.js} +1 -1
- package/dist/gateway/static/root/assets/skills-page-C9oRZSuL.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-GpbPfWwo.js → system-settings-panel-tWrqu7ai.js} +1 -1
- package/dist/gateway/static/root/assets/{task-detail-page-5B5ZVAu0.js → task-detail-page-BYRW7Rrr.js} +2 -2
- package/dist/gateway/static/root/assets/{task-expandable-content-DJrrEBB4.js → task-expandable-content-D2t4ahzR.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-BKpYnggg.js → theme-store-BBLjE0fi.js} +1 -1
- package/dist/gateway/static/root/assets/{tracing-settings-page-D71w7dwV.js → tracing-settings-page-5ATxQH5c.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-BV46CvS8.js → tunnel-api-CF1Qh4wU.js} +1 -1
- package/dist/gateway/static/root/assets/{usage-page-rMuwNpJi.js → usage-page-CuEHzXil.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-CzyqRffr.js → use-autosave-tY3keIbm.js} +1 -1
- package/dist/gateway/static/root/assets/{use-composer-attachments-Dviq-1f6.js → use-composer-attachments-CXsocZjt.js} +1 -1
- package/dist/gateway/static/root/assets/{use-file-preview-expanded-D5Kk7Hon.js → use-file-preview-expanded-CEsxnDnQ.js} +2 -2
- package/dist/gateway/static/root/assets/user-model-page-Dvt5TIZ6.js +2 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-DWtbmacd.js → voice-api-key-field-COTNLUU3.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-DnIjZm_9.js → voice-config-api-DrxBjSja.js} +1 -1
- package/dist/gateway/static/root/assets/voice-transcribe-api-B47j0_xA.js +1 -0
- package/dist/gateway/static/root/assets/{work-discovery-overlay-ChEG71hz.js → work-discovery-overlay-PByMJrhV.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-pdiRKLxP.js → workflow-run-setup-panel-CSUkMo63.js} +2 -2
- package/dist/gateway/static/root/assets/{workflows-page-D9LMxINt.js → workflows-page-BUDvFo3R.js} +3 -3
- package/dist/gateway/static/root/assets/{workspace-api-CZDvu7uA.js → workspace-api-Bmx1O449.js} +2 -2
- package/dist/gateway/static/root/assets/{xopc-cloud-account-card-CbUgg1SK.js → xopc-cloud-account-card-DVsAbvwP.js} +1 -1
- package/dist/gateway/static/root/index.html +28 -27
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/discussions.js +3 -2
- package/dist/packages/gateway-contract/src/index.js +4 -0
- package/dist/packages/gateway-contract/src/provider-setup.js +6 -0
- package/dist/packages/gateway-contract/src/recording-outcome.js +6 -0
- package/dist/packages/image-providers/src/catalog.js +10 -0
- package/dist/packages/image-providers/src/execute.js +5 -1
- package/dist/packages/image-providers/src/validation.js +19 -1
- package/dist/src/agent/background-review/run-background-review.d.ts +0 -1
- package/dist/src/agent/background-review/run-background-review.js +10 -2
- package/dist/src/agent/embedded/run-for-session.js +26 -3
- package/dist/src/agent/embedded/run-turn.js +12 -0
- package/dist/src/agent/embedded/xopc-stream-bridge.js +3 -0
- package/dist/src/agent/image/generation/runtime.js +12 -14
- package/dist/src/agent/image/understanding/runtime.js +5 -0
- package/dist/src/agent/inbound/inbound-loop.d.ts +1 -15
- package/dist/src/agent/inbound/inbound-loop.js +5 -0
- package/dist/src/agent/mcp/connection-errors.d.ts +3 -0
- package/dist/src/agent/mcp/connection-errors.js +32 -0
- package/dist/src/agent/mcp/connection-setup.d.ts +2 -0
- package/dist/src/agent/mcp/connection-setup.js +38 -18
- package/dist/src/agent/memory/compaction.js +5 -1
- package/dist/src/agent/memory/idle-compaction-scheduler.js +3 -1
- package/dist/src/agent/models/manager.d.ts +1 -0
- package/dist/src/agent/models/manager.js +4 -2
- package/dist/src/agent/orchestration/agent-orchestrator.d.ts +1 -6
- package/dist/src/agent/orchestration/agent-orchestrator.js +5 -0
- package/dist/src/agent/service/process-direct-one-shot.js +5 -0
- package/dist/src/agent/service/process-direct-streaming.d.ts +1 -0
- package/dist/src/agent/service/process-direct-streaming.js +17 -1
- package/dist/src/agent/tools/image-generate-tool.js +5 -1
- package/dist/src/agent-config/resolver.js +5 -0
- package/dist/src/agent-config/schema.d.ts +26 -6
- package/dist/src/agent-config/schema.js +2 -0
- package/dist/src/ai-assist/text-assist.js +5 -16
- package/dist/src/automations/service/action-executor.js +3 -1
- package/dist/src/channels/index.js +1 -1
- package/dist/src/channels/manager.js +1 -1
- package/dist/src/cli/commands/channels.js +1 -1
- package/dist/src/cli/commands/connectors.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +1 -1
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/onboard.js +1 -1
- package/dist/src/config/agent-model-intents.js +4 -1
- package/dist/src/config/schema.d.ts +11 -5
- package/dist/src/config/schema.js +11 -3
- package/dist/src/discussions/analyzer.d.ts +2 -0
- package/dist/src/discussions/analyzer.js +38 -9
- package/dist/src/discussions/audio-clip.d.ts +3 -0
- package/dist/src/discussions/audio-clip.js +72 -0
- package/dist/src/discussions/live-worker.js +3 -1
- package/dist/src/discussions/long-review.d.ts +17 -0
- package/dist/src/discussions/long-review.js +278 -0
- package/dist/src/discussions/media-timeline.d.ts +21 -0
- package/dist/src/discussions/media-timeline.js +134 -0
- package/dist/src/discussions/organizer-worker.d.ts +4 -1
- package/dist/src/discussions/organizer-worker.js +17 -12
- package/dist/src/discussions/organizer.js +2 -0
- package/dist/src/discussions/processing.d.ts +43 -0
- package/dist/src/discussions/processing.js +125 -0
- package/dist/src/discussions/recording.js +202 -42
- package/dist/src/discussions/recordingJobs.js +2 -0
- package/dist/src/discussions/repository.js +4 -2
- package/dist/src/discussions/review.d.ts +8 -0
- package/dist/src/discussions/review.js +183 -0
- package/dist/src/discussions/sealer.d.ts +7 -1
- package/dist/src/discussions/sealer.js +163 -87
- package/dist/src/discussions/service.d.ts +7 -1
- package/dist/src/discussions/service.js +51 -15
- package/dist/src/discussions/types.d.ts +2 -1
- package/dist/src/extensions/sdk/index.js +1 -1
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/global-defaults-admin.d.ts +3 -1
- package/dist/src/gateway/global-defaults-admin.js +14 -2
- package/dist/src/gateway/hono/lib/config-payload.d.ts +11 -2
- package/dist/src/gateway/hono/lib/config-payload.js +2 -0
- package/dist/src/gateway/hono/lib/voice-settings-revisions.d.ts +5 -0
- package/dist/src/gateway/hono/lib/voice-settings-revisions.js +23 -0
- package/dist/src/gateway/hono/routes/config-patch/misc.js +8 -1
- package/dist/src/gateway/hono/routes/config.js +12 -0
- package/dist/src/gateway/hono/routes/discussions.js +63 -1
- package/dist/src/gateway/hono/routes/global-defaults.js +8 -1
- package/dist/src/gateway/hono/routes/models.js +12 -4
- package/dist/src/gateway/hono/routes/provider-setup.d.ts +3 -0
- package/dist/src/gateway/hono/routes/provider-setup.js +106 -0
- package/dist/src/gateway/hono/routes/status.js +2 -0
- package/dist/src/gateway/hono/routes/voice.js +23 -10
- package/dist/src/gateway/provider-model-setup.d.ts +4 -0
- package/dist/src/gateway/provider-model-setup.js +56 -0
- package/dist/src/gateway/service/config-coordinator.d.ts +2 -2
- package/dist/src/gateway/service.js +7 -7
- package/dist/src/home-intelligence/host.js +2 -2
- package/dist/src/media-shared/http/provider-http.d.ts +0 -6
- package/dist/src/media-shared/http/provider-http.js +5 -4
- package/dist/src/media-understanding/runner.d.ts +0 -28
- package/dist/src/media-understanding/runner.js +4 -0
- package/dist/src/platform/client.d.ts +1 -1
- package/dist/src/platform/contracts.d.ts +1 -1
- package/dist/src/providers/env-keys.js +3 -0
- package/dist/src/providers/extension-stream-bridge.js +3 -0
- package/dist/src/providers/index.js +15 -0
- package/dist/src/providers/model-call.d.ts +5 -2
- package/dist/src/providers/model-call.js +13 -2
- package/dist/src/providers/model-reference-auditor.js +1 -0
- package/dist/src/providers/model-response.js +1 -1
- package/dist/src/providers/model-usage.d.ts +15 -0
- package/dist/src/providers/model-usage.js +50 -0
- package/dist/src/providers/presentation.js +8 -0
- package/dist/src/providers/setup/engine.d.ts +37 -0
- package/dist/src/providers/setup/engine.js +177 -0
- package/dist/src/providers/setup/profiles.d.ts +4 -0
- package/dist/src/providers/setup/profiles.js +94 -0
- package/dist/src/providers/setup/voice.d.ts +23 -0
- package/dist/src/providers/setup/voice.js +234 -0
- package/dist/src/scenes/agentExecutor.d.ts +1 -0
- package/dist/src/scenes/agentExecutor.js +5 -0
- package/dist/src/storage/sqlite/migrations/253_discussion_processing_recovery.sql +20 -0
- package/dist/src/storage/sqlite/migrations/254_discussion_annotations.sql +17 -0
- package/dist/src/storage/sqlite/migrations/255_discussion_chapter_progress.sql +10 -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/usage/recorder.js +2 -1
- package/dist/src/usage/scenario-registry.js +128 -123
- package/dist/src/voice/dashscope/streaming-stt-session.js +3 -0
- package/dist/src/voice/dashscope/streaming-tts-stream.js +3 -0
- package/dist/src/voice/dictation.d.ts +12 -0
- package/dist/src/voice/dictation.js +22 -0
- package/dist/src/voice/metadata/builtin.js +54 -0
- package/dist/src/voice/platform-streams.js +3 -0
- package/dist/src/voice/realtime/omniEngine.js +3 -0
- package/dist/src/voice/realtime/omniRoute.js +3 -2
- package/dist/src/voice/realtime/runtime.js +4 -2
- package/dist/src/voice/stt/factory.js +9 -3
- package/dist/src/voice/stt/providers/bailian-plan-transcription.d.ts +2 -0
- package/dist/src/voice/stt/providers/bailian-plan-transcription.js +32 -0
- package/dist/src/voice/stt/providers/index.d.ts +1 -0
- package/dist/src/voice/stt/providers/index.js +2 -1
- package/dist/src/voice/token-plan.d.ts +8 -0
- package/dist/src/voice/token-plan.js +11 -0
- package/dist/src/voice/tts/factory.js +4 -1
- package/dist/src/voice/tts/providers/bailian-plan-speech.d.ts +2 -0
- package/dist/src/voice/tts/providers/bailian-plan-speech.js +84 -0
- package/dist/src/voice/tts/providers/index.d.ts +1 -0
- package/dist/src/voice/tts/providers/index.js +2 -1
- package/dist/src/voice/tts/speak-core.js +10 -1
- package/package.json +4 -4
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-Ds0Ue2FB.js +0 -1
- package/dist/gateway/static/root/assets/agent-plugin-dialog-UunIxc1q.js +0 -1
- package/dist/gateway/static/root/assets/agents-BLRM4o-U.js +0 -77
- package/dist/gateway/static/root/assets/app-management-settings-panel-Dmy828Pe.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-UcCneEs3.js +0 -6
- package/dist/gateway/static/root/assets/browser-automations-page-BjvQnYfO.js +0 -3
- package/dist/gateway/static/root/assets/browser-settings-page-D5ZghI28.js +0 -3
- package/dist/gateway/static/root/assets/capabilities-page-MC8qIrXo.js +0 -2
- package/dist/gateway/static/root/assets/capabilities-settings-panel-Blz3hEzp.js +0 -8
- package/dist/gateway/static/root/assets/channels-DSg_iCVC.js +0 -1
- package/dist/gateway/static/root/assets/chat-terminal-dock-C97SJEwd.js +0 -36
- package/dist/gateway/static/root/assets/connectors-page-DXk-GAsd.js +0 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-BeSuq__I.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-jYu6qpY2.js +0 -1
- package/dist/gateway/static/root/assets/fallback-models-CoyzvDo7.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-C3vH-Iup.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-JlT1dlSj.js +0 -1
- package/dist/gateway/static/root/assets/home-page-DOVl8s-1.js +0 -2
- package/dist/gateway/static/root/assets/image-generation-api-BZBiYDmV.js +0 -1
- package/dist/gateway/static/root/assets/imports-page-DgdBTp_0.js +0 -1
- package/dist/gateway/static/root/assets/index-CmC8JkSM.js +0 -260
- package/dist/gateway/static/root/assets/index-Dgzc0oBu.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-BSepiACn.js +0 -2
- package/dist/gateway/static/root/assets/management-settings-dE_ykPNY.js +0 -1
- package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-65SE6j-_.js +0 -1
- package/dist/gateway/static/root/assets/messages-DlTNQI92.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-cache-C7FAsEe_.js +0 -1
- package/dist/gateway/static/root/assets/note-detail-panel-D9oqhdyk.js +0 -5
- package/dist/gateway/static/root/assets/notes-page-Bd4_7ph8.js +0 -8
- package/dist/gateway/static/root/assets/personal-page-BvWzq4Wp.js +0 -1
- package/dist/gateway/static/root/assets/project-detail-page-D-qkIXVT.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-BQtw1Dfn.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CYFNz0Jc.js +0 -1
- package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Qq_NyYx_.js +0 -1
- package/dist/gateway/static/root/assets/scenes-page-hGr-ppYk.js +0 -2
- package/dist/gateway/static/root/assets/sessions-page-CpX1Rluw.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-D2s_MlxR.js +0 -1
- package/dist/gateway/static/root/assets/settings-loading-skeleton-BTqvr_Fw.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-BiHRYDHq.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-DfcAu08T.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-CvKc5nBN.js +0 -2
- package/dist/gateway/static/root/assets/user-model-page-Dhqw3v_u.js +0 -2
|
@@ -1,18 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* InboundLoop — owns the bus-driven inbound pipeline.
|
|
3
|
-
*
|
|
4
|
-
* Replaces the previous `AgentService.start()` while-loop, `handleInboundMessage`,
|
|
5
|
-
* and `handleSystemMessage` methods. Everything that "a message arrives, run the
|
|
6
|
-
* agent turn, publish the reply" needs is concentrated here; the parent
|
|
7
|
-
* `AgentService` now just constructs the loop with collaborators and forwards
|
|
8
|
-
* start/stop to it.
|
|
9
|
-
*
|
|
10
|
-
* The constructor takes a fairly wide config because handling a single inbound
|
|
11
|
-
* message touches almost every subsystem (router, command handler, lifecycle
|
|
12
|
-
* manager, agent orchestrator, outbound coordinator, session state, etc.). All
|
|
13
|
-
* dependencies are injected so this class is unit-testable and the inbound
|
|
14
|
-
* pipeline can evolve without touching `AgentService`.
|
|
15
|
-
*/
|
|
16
1
|
import type { MessageBus } from '../../infra/bus/index.js';
|
|
17
2
|
import type { Config } from '../../config/schema.js';
|
|
18
3
|
import type { ChannelManager } from '../../channels/manager.js';
|
|
@@ -74,5 +59,6 @@ export declare class InboundLoop {
|
|
|
74
59
|
/** Cooperatively stop the loop; the current message (if any) is allowed to finish. */
|
|
75
60
|
stop(): void;
|
|
76
61
|
private handleInboundMessage;
|
|
62
|
+
private handleInboundMessageScoped;
|
|
77
63
|
private handleSystemMessage;
|
|
78
64
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { runWithLogContext, updateAsyncLogContext } from "../../utils/logger/context.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { init_model_usage, withModelUsageOrigin } from "../../providers/model-usage.js";
|
|
3
4
|
import { shouldSkipResetOverlapCommand } from "../../session/reset-triggers.js";
|
|
4
5
|
import { initSessionTurn } from "../../session/init-session-turn.js";
|
|
5
6
|
import { MessageBusShutdownError } from "../../infra/bus/queue.js";
|
|
@@ -7,6 +8,7 @@ import "../../infra/bus/index.js";
|
|
|
7
8
|
import { runEmbeddedTurnForSession } from "../embedded/run-for-session.js";
|
|
8
9
|
import { inboundMessageLogRequestId } from "../service-inbound-utils.js";
|
|
9
10
|
//#region src/agent/inbound/inbound-loop.ts
|
|
11
|
+
init_model_usage();
|
|
10
12
|
init_logger();
|
|
11
13
|
/** Initial back-off when bus consume fails. Doubles each consecutive failure. */
|
|
12
14
|
const INBOUND_CONSUME_BASE_BACKOFF_MS = 1e3;
|
|
@@ -75,6 +77,9 @@ var InboundLoop = class {
|
|
|
75
77
|
this.running = false;
|
|
76
78
|
}
|
|
77
79
|
async handleInboundMessage(msg) {
|
|
80
|
+
return withModelUsageOrigin(msg.channel === "system" ? "background" : "interactive", () => this.handleInboundMessageScoped(msg));
|
|
81
|
+
}
|
|
82
|
+
async handleInboundMessageScoped(msg) {
|
|
78
83
|
await runWithLogContext({ requestId: inboundMessageLogRequestId(msg) }, async () => {
|
|
79
84
|
const { context, isCommand, command, commandArgs } = await this.cfg.messageRouter.routeMessage(msg);
|
|
80
85
|
const sessionContext = {
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type McpConnectionErrorCode = 'command_missing' | 'connection_refused' | 'host_not_found' | 'timeout' | 'access_denied' | 'network' | 'tls' | 'invalid_response' | 'not_found' | 'rate_limited' | 'configuration' | 'unknown';
|
|
2
|
+
/** Return a safe category without exposing addresses, headers, or credential-bearing errors. */
|
|
3
|
+
export declare function classifyMcpConnectionError(error: unknown): McpConnectionErrorCode;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//#region src/agent/mcp/connection-errors.ts
|
|
2
|
+
/** Return a safe category without exposing addresses, headers, or credential-bearing errors. */
|
|
3
|
+
function classifyMcpConnectionError(error) {
|
|
4
|
+
const messages = [];
|
|
5
|
+
const seen = /* @__PURE__ */ new Set();
|
|
6
|
+
let current = error;
|
|
7
|
+
while (current && !seen.has(current) && seen.size < 8) {
|
|
8
|
+
seen.add(current);
|
|
9
|
+
if (typeof current !== "object") {
|
|
10
|
+
messages.push(String(current));
|
|
11
|
+
break;
|
|
12
|
+
}
|
|
13
|
+
const detail = current;
|
|
14
|
+
messages.push(String(detail.message ?? ""), String(detail.code ?? ""));
|
|
15
|
+
current = detail.cause;
|
|
16
|
+
}
|
|
17
|
+
const message = messages.join(" ");
|
|
18
|
+
if (/ENOENT|command not found|executable.{0,30}not found/i.test(message)) return "command_missing";
|
|
19
|
+
if (/ECONNREFUSED|connection refused/i.test(message)) return "connection_refused";
|
|
20
|
+
if (/ENOTFOUND|EAI_AGAIN|could not resolve/i.test(message)) return "host_not_found";
|
|
21
|
+
if (/timeout|timed out|ETIMEDOUT/i.test(message)) return "timeout";
|
|
22
|
+
if (/CERT_|CERTIFICATE|ERR_TLS|UNABLE_TO_VERIFY|DEPTH_ZERO|self.signed|unable to verify/i.test(message)) return "tls";
|
|
23
|
+
if (/\b429\b|too many requests|rate.limit/i.test(message)) return "rate_limited";
|
|
24
|
+
if (/\b(?:401|403)\b|unauthorized|forbidden|permission denied|invalid_token/i.test(message)) return "access_denied";
|
|
25
|
+
if (/\b404\b|\b405\b|method not allowed/i.test(message)) return "not_found";
|
|
26
|
+
if (/ECONNRESET|EHOSTUNREACH|ENETUNREACH|fetch failed|network error|socket.*closed/i.test(message)) return "network";
|
|
27
|
+
if (/content.type|text\/html|invalid json|unexpected token|protocol version|not a valid JSON/i.test(message)) return "invalid_response";
|
|
28
|
+
if (/not configured|invalid configuration|is disabled/i.test(message)) return "configuration";
|
|
29
|
+
return "unknown";
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
export { classifyMcpConnectionError };
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { Config } from '../../config/schema.js';
|
|
2
|
+
import { type McpConnectionErrorCode } from './connection-errors.js';
|
|
2
3
|
import { type McpSessionOptions } from './tool-catalog.js';
|
|
3
4
|
export type McpConnectionProbe = {
|
|
4
5
|
state: 'connected' | 'oauth_required' | 'token_required' | 'error';
|
|
5
6
|
toolCount?: number;
|
|
6
7
|
error?: string;
|
|
8
|
+
errorCode?: McpConnectionErrorCode;
|
|
7
9
|
};
|
|
8
10
|
export declare function probeMcpConnection(config: Config, workspace: string, serverId: string, options?: McpSessionOptions): Promise<McpConnectionProbe>;
|
|
9
11
|
export type McpAuthorization = {
|
|
@@ -1,34 +1,44 @@
|
|
|
1
|
+
import { createLogger } from "../../utils/logger/index.js";
|
|
2
|
+
import { init_logger } from "../../utils/logger.js";
|
|
1
3
|
import { isManagedConnectorServer } from "../../connectors/materialize.js";
|
|
2
4
|
import { prepareNativeMcpConfig } from "./native-mcp.js";
|
|
5
|
+
import { classifyMcpConnectionError } from "./connection-errors.js";
|
|
3
6
|
import { McpAuthenticationRequiredError, discoverMcpTools, signInNativeMcp } from "./tool-catalog.js";
|
|
4
7
|
import { createHash, randomUUID } from "node:crypto";
|
|
5
8
|
//#region src/agent/mcp/connection-setup.ts
|
|
9
|
+
init_logger();
|
|
10
|
+
const log = createLogger("McpConnectionSetup");
|
|
6
11
|
function httpUrl(value) {
|
|
7
12
|
const url = new URL(value);
|
|
8
13
|
if (!["http:", "https:"].includes(url.protocol) || url.username || url.password) throw new Error("Use an HTTP or HTTPS MCP address without embedded credentials.");
|
|
9
14
|
return url;
|
|
10
15
|
}
|
|
11
|
-
async function metadata(url) {
|
|
16
|
+
async function metadata(url, signal) {
|
|
12
17
|
try {
|
|
13
18
|
const response = await fetch(url, {
|
|
14
|
-
signal: AbortSignal.timeout(5e3),
|
|
19
|
+
signal: signal ? AbortSignal.any([signal, AbortSignal.timeout(5e3)]) : AbortSignal.timeout(5e3),
|
|
15
20
|
redirect: "error",
|
|
16
21
|
headers: { Accept: "application/json" }
|
|
17
22
|
});
|
|
18
23
|
if (!response.ok) return;
|
|
19
24
|
const result = await response.json();
|
|
20
25
|
if (result && typeof result === "object" && !Array.isArray(result)) return result;
|
|
21
|
-
} catch {
|
|
26
|
+
} catch {
|
|
27
|
+
signal?.throwIfAborted();
|
|
28
|
+
}
|
|
22
29
|
}
|
|
23
30
|
/** A 401 alone is not evidence that a service supports OAuth. */
|
|
24
|
-
async function advertisesOAuth(config, workspace, serverId) {
|
|
25
|
-
|
|
31
|
+
async function advertisesOAuth(config, workspace, serverId, signal) {
|
|
32
|
+
signal?.throwIfAborted();
|
|
33
|
+
const loaded = await prepareNativeMcpConfig(config, workspace);
|
|
34
|
+
signal?.throwIfAborted();
|
|
35
|
+
const entry = loaded.servers.find((server) => server.name === serverId);
|
|
26
36
|
if (!entry || !("url" in entry.config)) return false;
|
|
27
37
|
const url = httpUrl(entry.config.url);
|
|
28
38
|
if (Object.keys(entry.config.headers ?? {}).some((name) => name.toLowerCase() === "authorization")) return false;
|
|
29
39
|
const response = await fetch(url, {
|
|
30
40
|
method: "POST",
|
|
31
|
-
signal: AbortSignal.timeout(1e4),
|
|
41
|
+
signal: signal ? AbortSignal.any([signal, AbortSignal.timeout(1e4)]) : AbortSignal.timeout(1e4),
|
|
32
42
|
redirect: "error",
|
|
33
43
|
headers: {
|
|
34
44
|
Accept: "application/json, text/event-stream",
|
|
@@ -58,7 +68,8 @@ async function advertisesOAuth(config, workspace, serverId) {
|
|
|
58
68
|
new URL("/.well-known/oauth-protected-resource", url)
|
|
59
69
|
];
|
|
60
70
|
for (const candidate of candidates) {
|
|
61
|
-
|
|
71
|
+
signal?.throwIfAborted();
|
|
72
|
+
const data = await metadata(candidate, signal);
|
|
62
73
|
if (data && typeof data.resource === "string" && data.resource === url.href && Array.isArray(data.authorization_servers) && data.authorization_servers.some((value) => {
|
|
63
74
|
try {
|
|
64
75
|
return typeof value === "string" && Boolean(httpUrl(value));
|
|
@@ -68,7 +79,7 @@ async function advertisesOAuth(config, workspace, serverId) {
|
|
|
68
79
|
})) return true;
|
|
69
80
|
}
|
|
70
81
|
if (!/\bBearer\b/i.test(challenge)) return false;
|
|
71
|
-
const legacy = await metadata(new URL("/.well-known/oauth-authorization-server", url));
|
|
82
|
+
const legacy = await metadata(new URL("/.well-known/oauth-authorization-server", url), signal);
|
|
72
83
|
return Boolean(legacy && legacy.issuer === url.origin && typeof legacy.authorization_endpoint === "string" && typeof legacy.token_endpoint === "string");
|
|
73
84
|
}
|
|
74
85
|
async function probeMcpConnection(config, workspace, serverId, options) {
|
|
@@ -78,20 +89,29 @@ async function probeMcpConnection(config, workspace, serverId, options) {
|
|
|
78
89
|
toolCount: (await discoverMcpTools(config, workspace, serverId, options)).length
|
|
79
90
|
};
|
|
80
91
|
} catch (error) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
92
|
+
const failed = (cause) => {
|
|
93
|
+
const errorCode = classifyMcpConnectionError(cause);
|
|
94
|
+
log.warn({
|
|
95
|
+
serverId,
|
|
96
|
+
errorCode
|
|
97
|
+
}, `MCP connection check failed: ${errorCode}`);
|
|
84
98
|
return {
|
|
85
99
|
state: "error",
|
|
86
|
-
error:
|
|
100
|
+
error: cause instanceof Error ? cause.message : String(cause),
|
|
101
|
+
errorCode
|
|
87
102
|
};
|
|
88
|
-
}
|
|
89
|
-
const server = config.mcp?.servers?.[serverId];
|
|
90
|
-
if (server?.url && Object.keys(server.headers ?? {}).some((name) => name.toLowerCase() === "authorization") && /401|403|unauthorized|forbidden/i.test(String(error))) return { state: "token_required" };
|
|
91
|
-
return {
|
|
92
|
-
state: "error",
|
|
93
|
-
error: error instanceof Error ? error.message : String(error)
|
|
94
103
|
};
|
|
104
|
+
const server = config.mcp?.servers?.[serverId];
|
|
105
|
+
const rejectedCredential = /\b401\b|unauthorized|invalid_token/i.test(String(error));
|
|
106
|
+
const hasCredentials = server?.auth || Object.keys(server?.headers ?? {}).some((name) => name.toLowerCase() === "authorization");
|
|
107
|
+
if (error instanceof McpAuthenticationRequiredError || server?.url && rejectedCredential && !hasCredentials) try {
|
|
108
|
+
options?.signal?.throwIfAborted();
|
|
109
|
+
return { state: await advertisesOAuth(config, workspace, serverId, options?.signal) ? "oauth_required" : "token_required" };
|
|
110
|
+
} catch (cause) {
|
|
111
|
+
return failed(cause);
|
|
112
|
+
}
|
|
113
|
+
if (server?.url && hasCredentials && /\b(?:401|403)\b|unauthorized|forbidden/i.test(String(error))) return { state: "token_required" };
|
|
114
|
+
return failed(error);
|
|
95
115
|
}
|
|
96
116
|
}
|
|
97
117
|
const attempts = /* @__PURE__ */ new Map();
|
|
@@ -2,6 +2,7 @@ import { createLogger } from "../../utils/logger/index.js";
|
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
3
|
import { init_compaction_types, isCompactionHandover } from "../../session/compaction-types.js";
|
|
4
4
|
import { buildSessionContextForLlm, init_session_context_for_llm, isTranscriptCompactionEntry } from "../../session/session-context-for-llm.js";
|
|
5
|
+
import { getModelUsageOrigin, init_model_usage, isProviderUsageScopeError } from "../../providers/model-usage.js";
|
|
5
6
|
import { completeWithResolvedCredentials } from "../../providers/model-call.js";
|
|
6
7
|
import { estimateMessagesTokens, estimateTextTokens } from "./context-budget.js";
|
|
7
8
|
import { applyCompactionHandoverDelta, consolidateCompactionHandover, handoverForPrompt, renderCompactionHandover } from "./compaction-ledger.js";
|
|
@@ -11,6 +12,7 @@ import { CompactionChunkCursor } from "./compaction-chunks.js";
|
|
|
11
12
|
import { COMPACTION_REPAIR_RESERVE, CompactionRequestError, compactionOutputLimit, compactionPayloadGuard, compactionPromptFits, initialCompactionOutputLimit, isPermanentCompactionError } from "./compaction-request.js";
|
|
12
13
|
import { createHash } from "node:crypto";
|
|
13
14
|
//#region src/agent/memory/compaction.ts
|
|
15
|
+
init_model_usage();
|
|
14
16
|
init_session_context_for_llm();
|
|
15
17
|
init_compaction_types();
|
|
16
18
|
init_logger();
|
|
@@ -397,6 +399,7 @@ Return a valid JSON delta only.`;
|
|
|
397
399
|
auditModelRef: reviewed.modelRef
|
|
398
400
|
};
|
|
399
401
|
} catch (error) {
|
|
402
|
+
if (isProviderUsageScopeError(error)) throw error;
|
|
400
403
|
signal?.throwIfAborted();
|
|
401
404
|
log.warn({
|
|
402
405
|
err: error,
|
|
@@ -521,7 +524,7 @@ Return a JSON delta containing only missing facts, using {"upserts":[]}. Include
|
|
|
521
524
|
}, void 0, {
|
|
522
525
|
operation: "session.compact",
|
|
523
526
|
conversationId: callContext.conversationId,
|
|
524
|
-
trigger: attempt === 0 && modelIndex === 0 ? "system" : "retry"
|
|
527
|
+
trigger: attempt === 0 && modelIndex === 0 ? getModelUsageOrigin() === "interactive" ? "agent" : "system" : "retry"
|
|
525
528
|
});
|
|
526
529
|
parentSignal?.throwIfAborted();
|
|
527
530
|
if (linked.timedOut()) throw new CompactionRequestError("timeout", "Compaction handover timed out");
|
|
@@ -554,6 +557,7 @@ Return a JSON delta containing only missing facts, using {"upserts":[]}. Include
|
|
|
554
557
|
modelRef: `${model.provider}/${model.id}`
|
|
555
558
|
};
|
|
556
559
|
} catch (error) {
|
|
560
|
+
if (isProviderUsageScopeError(error)) throw error;
|
|
557
561
|
parentSignal?.throwIfAborted();
|
|
558
562
|
lastError = linked.timedOut() ? new CompactionRequestError("timeout", `Compaction handover timed out after ${this.config.summaryTimeoutMs}ms`) : error;
|
|
559
563
|
const kind = lastError instanceof CompactionRequestError ? lastError.kind : "provider";
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { init_model_usage, withModelUsageOrigin } from "../../providers/model-usage.js";
|
|
3
4
|
//#region src/agent/memory/idle-compaction-scheduler.ts
|
|
5
|
+
init_model_usage();
|
|
4
6
|
init_logger();
|
|
5
7
|
const log = createLogger("IdleCompaction");
|
|
6
8
|
/** Generation checks protect commits even when a provider ignores cancellation. */
|
|
@@ -89,7 +91,7 @@ var IdleCompactionScheduler = class {
|
|
|
89
91
|
state.deadline = timeout;
|
|
90
92
|
timeout.unref?.();
|
|
91
93
|
});
|
|
92
|
-
const operation = Promise.resolve().then(() => job(controller.signal, isCurrent));
|
|
94
|
+
const operation = Promise.resolve().then(() => withModelUsageOrigin("background", () => job(controller.signal, isCurrent)));
|
|
93
95
|
Promise.race([operation, deadline]).then((outcome) => {
|
|
94
96
|
this.metrics[outcome]++;
|
|
95
97
|
if (outcome === "committed") state.eligibleAt = Date.now() + options.cooldownMs;
|
|
@@ -62,6 +62,7 @@ export declare class ModelManager {
|
|
|
62
62
|
* Get model for session, checking session override first
|
|
63
63
|
*/
|
|
64
64
|
getModelForSession(conversationId: string): string;
|
|
65
|
+
hasSessionModelOverride(conversationId: string): boolean;
|
|
65
66
|
/**
|
|
66
67
|
* Apply model to agent if different from current
|
|
67
68
|
*/
|
|
@@ -42,8 +42,7 @@ var ModelManager = class {
|
|
|
42
42
|
setSessionProfileDefault(conversationId, modelRef, fallbacks = []) {
|
|
43
43
|
this.sessionProfileDefaults.set(conversationId, modelRef);
|
|
44
44
|
const cleanFallbacks = fallbacks.map((ref) => ref.trim()).filter(Boolean);
|
|
45
|
-
|
|
46
|
-
else this.sessionProfileFallbacks.delete(conversationId);
|
|
45
|
+
this.sessionProfileFallbacks.set(conversationId, cleanFallbacks);
|
|
47
46
|
}
|
|
48
47
|
/**
|
|
49
48
|
* Register the profile model and return the model that should initialize the
|
|
@@ -117,6 +116,9 @@ var ModelManager = class {
|
|
|
117
116
|
if (profileDefault) return profileDefault;
|
|
118
117
|
return this.defaultModel;
|
|
119
118
|
}
|
|
119
|
+
hasSessionModelOverride(conversationId) {
|
|
120
|
+
return this.sessionModels.has(conversationId);
|
|
121
|
+
}
|
|
120
122
|
/**
|
|
121
123
|
* Apply model to agent if different from current
|
|
122
124
|
*/
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Orchestrator - Coordinates Agent execution flow
|
|
3
|
-
*
|
|
4
|
-
* Manages the complete agent execution pipeline from message processing
|
|
5
|
-
* to response generation.
|
|
6
|
-
*/
|
|
7
1
|
import type { Config } from '../../config/schema.js';
|
|
8
2
|
import type { InboundMessage } from '../../infra/bus/index.js';
|
|
9
3
|
import type { SessionConfigStore, SessionStore } from '../../session/index.js';
|
|
@@ -52,6 +46,7 @@ export declare class AgentOrchestrator {
|
|
|
52
46
|
* Process a message through the agent orchestration pipeline
|
|
53
47
|
*/
|
|
54
48
|
process(msg: InboundMessage, context: SessionContext): Promise<void>;
|
|
49
|
+
private processScoped;
|
|
55
50
|
/**
|
|
56
51
|
* Get the current agent model ID
|
|
57
52
|
*/
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { init_model_usage, modelUsageOriginFromTurn, withModelUsageOrigin } from "../../providers/model-usage.js";
|
|
3
4
|
import { abortEmbeddedRun } from "../embedded/runs.js";
|
|
4
5
|
import { persistInboundAttachments } from "../../channels/attachments/inbound-persist.js";
|
|
5
6
|
import { buildTranscriptUserMessage, clearPendingTranscriptUserMessage, hydrateUserTurnForLlm, setPendingTranscriptUserMessage } from "../inbound/attachment-pipeline.js";
|
|
@@ -13,6 +14,7 @@ import { randomUUID } from "node:crypto";
|
|
|
13
14
|
* Manages the complete agent execution pipeline from message processing
|
|
14
15
|
* to response generation.
|
|
15
16
|
*/
|
|
17
|
+
init_model_usage();
|
|
16
18
|
init_logger();
|
|
17
19
|
const log = createLogger("AgentOrchestrator");
|
|
18
20
|
var AgentOrchestrator = class {
|
|
@@ -42,6 +44,9 @@ var AgentOrchestrator = class {
|
|
|
42
44
|
* Process a message through the agent orchestration pipeline
|
|
43
45
|
*/
|
|
44
46
|
async process(msg, context) {
|
|
47
|
+
return withModelUsageOrigin(modelUsageOriginFromTurn(context.origin), () => this.processScoped(msg, context));
|
|
48
|
+
}
|
|
49
|
+
async processScoped(msg, context) {
|
|
45
50
|
const { conversationId } = context;
|
|
46
51
|
log.debug({ conversationId }, "Processing message through agent orchestrator");
|
|
47
52
|
await this.sessionHydrator.workspace(conversationId);
|
|
@@ -1,13 +1,18 @@
|
|
|
1
|
+
import { init_model_usage, modelUsageOriginFromTurn, withModelUsageOrigin } from "../../providers/model-usage.js";
|
|
1
2
|
import { clearPendingTranscriptUserMessage, setPendingTranscriptUserMessage } from "../inbound/attachment-pipeline.js";
|
|
2
3
|
import { initSessionTurn } from "../../session/init-session-turn.js";
|
|
3
4
|
import "../../session/index.js";
|
|
4
5
|
import { buildDirectUserMessageContent } from "./build-direct-message-content.js";
|
|
5
6
|
import { hydratePerTurnState, runDirectAgentTurn, tryRunSlashCommand } from "./direct-turn-helpers.js";
|
|
6
7
|
//#region src/agent/service/process-direct-one-shot.ts
|
|
8
|
+
init_model_usage();
|
|
7
9
|
function isReviewOutput(value) {
|
|
8
10
|
return !!value && typeof value === "object" && !Array.isArray(value) && value.type === "review";
|
|
9
11
|
}
|
|
10
12
|
async function runProcessDirect(deps, input) {
|
|
13
|
+
return withModelUsageOrigin(modelUsageOriginFromTurn(input.origin), () => runProcessDirectInner(deps, input));
|
|
14
|
+
}
|
|
15
|
+
async function runProcessDirectInner(deps, input) {
|
|
11
16
|
deps.sessionStore?.idleCompaction?.interrupt(input.conversationId);
|
|
12
17
|
const { channel, chatId } = await deps.resolveSessionEndpoint(input.conversationId);
|
|
13
18
|
deps.initSessionContext(input.conversationId, channel, chatId, input.origin);
|
|
@@ -77,4 +77,5 @@ export type ProcessDirectStreamEvent = {
|
|
|
77
77
|
type: string;
|
|
78
78
|
[key: string]: unknown;
|
|
79
79
|
};
|
|
80
|
+
/** Bind each generator advancement so independent streams retain their own origin. */
|
|
80
81
|
export declare function runProcessDirectStreaming(deps: ProcessDirectStreamingDeps, input: ProcessDirectStreamingInput): AsyncGenerator<ProcessDirectStreamEvent, void, unknown>;
|
|
@@ -5,6 +5,7 @@ import { getClarificationResumeInput, init_clarification_wait_repository } from
|
|
|
5
5
|
import { getConnectionResumeInput, init_connection_wait_repository } from "../../storage/sqlite/connection-wait-repository.js";
|
|
6
6
|
import { init_agent_scope, resolveDefaultAgentId } from "../agent-scope.js";
|
|
7
7
|
import { init_agent_session_key, resolveAgentMainConversationId } from "../../routing/agent-session-key.js";
|
|
8
|
+
import { init_model_usage, modelUsageOriginFromTurn, withModelUsageOrigin } from "../../providers/model-usage.js";
|
|
8
9
|
import { readAgentMessageContent } from "../memory/agent-message-access.js";
|
|
9
10
|
import { abortEmbeddedRun } from "../embedded/runs.js";
|
|
10
11
|
import { clearPendingTranscriptUserMessage, setPendingTranscriptUserMessage } from "../inbound/attachment-pipeline.js";
|
|
@@ -24,6 +25,7 @@ import { AsyncQueue, AsyncQueueOverflowError } from "./async-queue.js";
|
|
|
24
25
|
import { hydratePerTurnState, runDirectAgentTurn, tryRunSlashCommand } from "./direct-turn-helpers.js";
|
|
25
26
|
import { isSuccessfulWebchatTtsToolEvent } from "./webchat-tts.js";
|
|
26
27
|
//#region src/agent/service/process-direct-streaming.ts
|
|
28
|
+
init_model_usage();
|
|
27
29
|
init_agent_session_key();
|
|
28
30
|
init_agent_scope();
|
|
29
31
|
init_src();
|
|
@@ -137,7 +139,7 @@ function pushAssistantReceipt(queue, text, runId, metadata) {
|
|
|
137
139
|
message
|
|
138
140
|
});
|
|
139
141
|
}
|
|
140
|
-
async function*
|
|
142
|
+
async function* runProcessDirectStreamingInner(deps, input) {
|
|
141
143
|
const conversationId = input.conversationId ?? resolveAgentMainConversationId({ agentId: resolveDefaultAgentId() });
|
|
142
144
|
deps.sessionStore?.idleCompaction?.interrupt(conversationId);
|
|
143
145
|
const isConnectionResume = Boolean(input.runId && getConnectionResumeInput(conversationId, input.runId));
|
|
@@ -445,5 +447,19 @@ async function* runProcessDirectStreaming(deps, input) {
|
|
|
445
447
|
deps.endDirectRequestContext();
|
|
446
448
|
}
|
|
447
449
|
}
|
|
450
|
+
/** Bind each generator advancement so independent streams retain their own origin. */
|
|
451
|
+
async function* runProcessDirectStreaming(deps, input) {
|
|
452
|
+
const iterator = runProcessDirectStreamingInner(deps, input);
|
|
453
|
+
const origin = modelUsageOriginFromTurn(input.origin);
|
|
454
|
+
try {
|
|
455
|
+
while (true) {
|
|
456
|
+
const result = await withModelUsageOrigin(origin, () => iterator.next());
|
|
457
|
+
if (result.done) return;
|
|
458
|
+
yield result.value;
|
|
459
|
+
}
|
|
460
|
+
} finally {
|
|
461
|
+
await withModelUsageOrigin(origin, () => iterator.return());
|
|
462
|
+
}
|
|
463
|
+
}
|
|
448
464
|
//#endregion
|
|
449
465
|
export { runProcessDirectStreaming };
|
|
@@ -195,10 +195,14 @@ function createImageGenerateTool(options) {
|
|
|
195
195
|
});
|
|
196
196
|
if (!imageGenerationModelConfig) return null;
|
|
197
197
|
const effectiveCfg = applyImageGenerationModelConfigDefaults(options.config, imageGenerationModelConfig) ?? options.config;
|
|
198
|
+
const primaryRef = imageGenerationModelConfig.primary;
|
|
199
|
+
const primaryProvider = primaryRef ? getImageGenerationProvider(primaryRef.slice(0, primaryRef.indexOf("/"))) : void 0;
|
|
200
|
+
const primaryModel = primaryRef?.slice(primaryRef.indexOf("/") + 1);
|
|
201
|
+
const capabilities = primaryModel ? primaryProvider?.modelCapabilities?.[primaryModel] ?? primaryProvider?.capabilities : void 0;
|
|
198
202
|
return {
|
|
199
203
|
name: "image_generate",
|
|
200
204
|
label: "Image Generation",
|
|
201
|
-
description:
|
|
205
|
+
description: `Generate and attach images with the configured image-generation model (${primaryRef}). ${capabilities ? `Configured model capabilities: ${JSON.stringify(capabilities)}. ` : ""}Omit optional image parameters unless needed. Keep the configured model unless the user asks for another provider/model. Use action="list" to see providers. Also saves files under workspace/media/generated/. Do not call send_media for generated images.`,
|
|
202
206
|
parameters: ImageGenerateToolSchema,
|
|
203
207
|
async execute(_toolCallId, args) {
|
|
204
208
|
const params = args;
|
|
@@ -55,10 +55,15 @@ function resolveEffectiveAgentConfig(params) {
|
|
|
55
55
|
const models = {
|
|
56
56
|
chat: structuredClone(agent.models?.chat ?? defaults.models.chat),
|
|
57
57
|
intents,
|
|
58
|
+
...agent.models?.background === null ? {} : agent.models?.background ?? defaults.models.background ? { background: structuredClone(agent.models?.background ?? defaults.models.background) } : {},
|
|
58
59
|
...agent.models?.computerUse ?? defaults.models.computerUse ? { computerUse: structuredClone(agent.models?.computerUse ?? defaults.models.computerUse) } : {},
|
|
59
60
|
...agent.models?.imageUnderstanding === null ? {} : agent.models?.imageUnderstanding ? { imageUnderstanding: structuredClone(agent.models.imageUnderstanding) } : defaults.models.imageUnderstanding ? { imageUnderstanding: structuredClone(defaults.models.imageUnderstanding) } : {},
|
|
60
61
|
...agent.models?.imageGeneration === null ? {} : agent.models?.imageGeneration ? { imageGeneration: structuredClone(agent.models.imageGeneration) } : defaults.models.imageGeneration ? { imageGeneration: structuredClone(defaults.models.imageGeneration) } : {}
|
|
61
62
|
};
|
|
63
|
+
if (agent.models && Object.hasOwn(agent.models, "background")) {
|
|
64
|
+
clearSources("models.background", sources);
|
|
65
|
+
if (agent.models.background) markObjectSources(agent.models.background, "agent", "models.background", sources);
|
|
66
|
+
}
|
|
62
67
|
if (agent.models?.chat) markObjectSources(agent.models.chat, "agent", "models.chat", sources);
|
|
63
68
|
if (agent.models?.computerUse) {
|
|
64
69
|
clearSources("models.computerUse", sources);
|
|
@@ -24,9 +24,9 @@ export declare const ComputerModelRouteSchema: z.ZodObject<{
|
|
|
24
24
|
export declare const ModelIntentSchema: z.ZodEnum<{
|
|
25
25
|
review: "review";
|
|
26
26
|
coding: "coding";
|
|
27
|
+
vision: "vision";
|
|
27
28
|
fast: "fast";
|
|
28
29
|
reasoning: "reasoning";
|
|
29
|
-
vision: "vision";
|
|
30
30
|
understanding: "understanding";
|
|
31
31
|
}>;
|
|
32
32
|
export declare const AgentModelsDefaultsSchema: z.ZodObject<{
|
|
@@ -34,12 +34,16 @@ export declare const AgentModelsDefaultsSchema: z.ZodObject<{
|
|
|
34
34
|
primary: z.ZodString;
|
|
35
35
|
fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
36
36
|
}, z.core.$strict>;
|
|
37
|
+
background: z.ZodOptional<z.ZodObject<{
|
|
38
|
+
primary: z.ZodString;
|
|
39
|
+
fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
40
|
+
}, z.core.$strict>>;
|
|
37
41
|
intents: z.ZodDefault<z.ZodRecord<z.ZodEnum<{
|
|
38
42
|
review: "review";
|
|
39
43
|
coding: "coding";
|
|
44
|
+
vision: "vision";
|
|
40
45
|
fast: "fast";
|
|
41
46
|
reasoning: "reasoning";
|
|
42
|
-
vision: "vision";
|
|
43
47
|
understanding: "understanding";
|
|
44
48
|
}> & z.core.$partial, z.ZodObject<{
|
|
45
49
|
primary: z.ZodString;
|
|
@@ -65,12 +69,16 @@ export declare const AgentModelsOverrideSchema: z.ZodObject<{
|
|
|
65
69
|
primary: z.ZodString;
|
|
66
70
|
fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
67
71
|
}, z.core.$strict>>;
|
|
72
|
+
background: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
73
|
+
primary: z.ZodString;
|
|
74
|
+
fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
75
|
+
}, z.core.$strict>>>;
|
|
68
76
|
intents: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
|
|
69
77
|
review: "review";
|
|
70
78
|
coding: "coding";
|
|
79
|
+
vision: "vision";
|
|
71
80
|
fast: "fast";
|
|
72
81
|
reasoning: "reasoning";
|
|
73
|
-
vision: "vision";
|
|
74
82
|
understanding: "understanding";
|
|
75
83
|
}> & z.core.$partial, z.ZodNullable<z.ZodObject<{
|
|
76
84
|
primary: z.ZodString;
|
|
@@ -184,12 +192,16 @@ export declare const AgentDefaultsSchema: z.ZodObject<{
|
|
|
184
192
|
primary: z.ZodString;
|
|
185
193
|
fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
186
194
|
}, z.core.$strict>;
|
|
195
|
+
background: z.ZodOptional<z.ZodObject<{
|
|
196
|
+
primary: z.ZodString;
|
|
197
|
+
fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
198
|
+
}, z.core.$strict>>;
|
|
187
199
|
intents: z.ZodDefault<z.ZodRecord<z.ZodEnum<{
|
|
188
200
|
review: "review";
|
|
189
201
|
coding: "coding";
|
|
202
|
+
vision: "vision";
|
|
190
203
|
fast: "fast";
|
|
191
204
|
reasoning: "reasoning";
|
|
192
|
-
vision: "vision";
|
|
193
205
|
understanding: "understanding";
|
|
194
206
|
}> & z.core.$partial, z.ZodObject<{
|
|
195
207
|
primary: z.ZodString;
|
|
@@ -424,12 +436,16 @@ export declare const AgentEntrySchema: z.ZodObject<{
|
|
|
424
436
|
primary: z.ZodString;
|
|
425
437
|
fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
426
438
|
}, z.core.$strict>>;
|
|
439
|
+
background: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
440
|
+
primary: z.ZodString;
|
|
441
|
+
fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
442
|
+
}, z.core.$strict>>>;
|
|
427
443
|
intents: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
|
|
428
444
|
review: "review";
|
|
429
445
|
coding: "coding";
|
|
446
|
+
vision: "vision";
|
|
430
447
|
fast: "fast";
|
|
431
448
|
reasoning: "reasoning";
|
|
432
|
-
vision: "vision";
|
|
433
449
|
understanding: "understanding";
|
|
434
450
|
}> & z.core.$partial, z.ZodNullable<z.ZodObject<{
|
|
435
451
|
primary: z.ZodString;
|
|
@@ -590,12 +606,16 @@ export declare const EffectiveAgentConfigSchema: z.ZodObject<{
|
|
|
590
606
|
primary: z.ZodString;
|
|
591
607
|
fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
592
608
|
}, z.core.$strict>;
|
|
609
|
+
background: z.ZodOptional<z.ZodObject<{
|
|
610
|
+
primary: z.ZodString;
|
|
611
|
+
fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
612
|
+
}, z.core.$strict>>;
|
|
593
613
|
intents: z.ZodDefault<z.ZodRecord<z.ZodEnum<{
|
|
594
614
|
review: "review";
|
|
595
615
|
coding: "coding";
|
|
616
|
+
vision: "vision";
|
|
596
617
|
fast: "fast";
|
|
597
618
|
reasoning: "reasoning";
|
|
598
|
-
vision: "vision";
|
|
599
619
|
understanding: "understanding";
|
|
600
620
|
}> & z.core.$partial, z.ZodObject<{
|
|
601
621
|
primary: z.ZodString;
|
|
@@ -43,6 +43,7 @@ var init_schema = __esmMin((() => {
|
|
|
43
43
|
ModelIntentOverridesSchema = z.partialRecord(ModelIntentSchema, ModelRouteSchema.nullable());
|
|
44
44
|
AgentModelsDefaultsSchema = z.object({
|
|
45
45
|
chat: ModelRouteSchema,
|
|
46
|
+
background: ModelRouteSchema.optional(),
|
|
46
47
|
intents: ModelIntentRoutesSchema.default({}),
|
|
47
48
|
imageUnderstanding: ModelRouteSchema.optional(),
|
|
48
49
|
computerUse: ComputerModelRouteSchema.optional(),
|
|
@@ -50,6 +51,7 @@ var init_schema = __esmMin((() => {
|
|
|
50
51
|
}).strict();
|
|
51
52
|
AgentModelsOverrideSchema = z.object({
|
|
52
53
|
chat: ModelRouteSchema.optional(),
|
|
54
|
+
background: ModelRouteSchema.nullable().optional(),
|
|
53
55
|
intents: ModelIntentOverridesSchema.optional(),
|
|
54
56
|
imageUnderstanding: ModelRouteSchema.nullable().optional(),
|
|
55
57
|
computerUse: ComputerModelRouteSchema.nullable().optional(),
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
3
|
import { getDefaultModelSync, init_providers, resolveModel } from "../providers/index.js";
|
|
4
|
-
import {
|
|
5
|
-
import { trackAiUsageStream } from "../usage/recorder.js";
|
|
6
|
-
import { isLocalModelBaseUrl, resolveModelCallApiKey, resolveModelCallOptions } from "../providers/model-call.js";
|
|
4
|
+
import { createResolvedModelStream, isLocalModelBaseUrl, resolveModelCallApiKey } from "../providers/model-call.js";
|
|
7
5
|
import { getAssistantMessageErrorReason, stripCodeFences } from "../providers/model-response.js";
|
|
8
|
-
import { normalizeContext } from "@earendil-works/pi-ai";
|
|
9
6
|
//#region src/ai-assist/text-assist.ts
|
|
10
7
|
init_providers();
|
|
11
8
|
init_logger();
|
|
@@ -228,28 +225,20 @@ async function* streamTextAssist(request, config, signal) {
|
|
|
228
225
|
};
|
|
229
226
|
const scenario = scenarioFromRequest(resolvedRequest);
|
|
230
227
|
const model = resolveModel(getDefaultModelSync(config));
|
|
231
|
-
const
|
|
232
|
-
const modelCallOptions = await resolveModelCallOptions(model, {
|
|
228
|
+
const stream = await createResolvedModelStream(model, buildPrompt(resolvedRequest, scenario), {
|
|
233
229
|
maxTokens: 1600,
|
|
234
230
|
temperature: intent === "fix" ? .15 : .25,
|
|
235
231
|
signal
|
|
232
|
+
}, void 0, {
|
|
233
|
+
operation: "text_assist.generate",
|
|
234
|
+
trigger: "user"
|
|
236
235
|
});
|
|
237
|
-
log.debug({
|
|
238
|
-
provider: model.provider,
|
|
239
|
-
modelId: model.id,
|
|
240
|
-
hasApiKey: Boolean(modelCallOptions.apiKey),
|
|
241
|
-
localBaseUrl: isLocalModelBaseUrl(model.baseUrl)
|
|
242
|
-
}, "Resolved AI text assist model auth");
|
|
243
236
|
yield {
|
|
244
237
|
type: "start",
|
|
245
238
|
provider: model.provider,
|
|
246
239
|
modelId: model.id,
|
|
247
240
|
scenario: scenario.id
|
|
248
241
|
};
|
|
249
|
-
const stream = await trackAiUsageStream(model, {
|
|
250
|
-
operation: "text_assist.generate",
|
|
251
|
-
trigger: "user"
|
|
252
|
-
}, () => createExtensionAwareStreamFn()(model, normalizeContext(prompt), modelCallOptions));
|
|
253
242
|
let streamedText = "";
|
|
254
243
|
for await (const event of stream) {
|
|
255
244
|
const streamEvent = event;
|
|
@@ -3,8 +3,10 @@ import { init_logger } from "../../utils/logger.js";
|
|
|
3
3
|
import { normalizeAgentId } from "../../agent-catalog/id.js";
|
|
4
4
|
import { init_agent_scope } from "../../agent/agent-scope.js";
|
|
5
5
|
import { init_session_key, resolveConversationId } from "../../routing/session-key.js";
|
|
6
|
+
import { init_model_usage, withModelUsageOrigin } from "../../providers/model-usage.js";
|
|
6
7
|
import { resolveAutomationTimeoutSeconds } from "../domain/defaults.js";
|
|
7
8
|
//#region src/automations/service/action-executor.ts
|
|
9
|
+
init_model_usage();
|
|
8
10
|
init_agent_scope();
|
|
9
11
|
init_session_key();
|
|
10
12
|
init_logger();
|
|
@@ -111,7 +113,7 @@ var AutomationActionExecutor = class {
|
|
|
111
113
|
const deadlineAtMs = run.deadlineAtMs ?? Date.now() + configuredTimeoutMs;
|
|
112
114
|
const timeoutMs = Math.max(1, deadlineAtMs - Date.now());
|
|
113
115
|
await hooks.onRunPatch?.({ deadlineAtMs });
|
|
114
|
-
return executeWithDeadline((deadlineSignal) => this.executeWithoutTimeout(automation, run, deadlineSignal, hooks, deadlineAtMs, context), timeoutMs, signal, deadlineAtMs).catch((err) => {
|
|
116
|
+
return withModelUsageOrigin("background", () => executeWithDeadline((deadlineSignal) => this.executeWithoutTimeout(automation, run, deadlineSignal, hooks, deadlineAtMs, context), timeoutMs, signal, deadlineAtMs)).catch((err) => {
|
|
115
117
|
const message = err instanceof Error ? err.message : String(err);
|
|
116
118
|
if (err instanceof AutomationExecutionStoppedError) return {
|
|
117
119
|
status: err.status,
|