@xopcai/xopc 0.0.208 → 0.0.211
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-D0mYZqhc.js → activity-store-BzjFoSr0.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-MWLQWL_i.js → agent-avatar-dicebear-DTfjhfVE.js} +1 -1
- package/dist/gateway/static/root/assets/agents-CjhgfuVJ.js +68 -0
- package/dist/gateway/static/root/assets/{api-DZA1yVzM.js → api-D269PnU9.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-B2X6quAF.js → app-management-settings-panel-BFpfQDWc.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-BZW-c38q.js → appearance-settings-DLxFdqhY.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-CjmlGB5V.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-CK-gsjsJ.js → archive-plugin-DPlH4dnc.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-EJGP4rCw.js → attachment-load-xqfLLd0I.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-4m6Ey6wG.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-Tbss_4P-.js → binary-plugins-C0tuoPXk.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-C-dOWigw.js → block-editor-Deyphj1o.js} +6 -6
- package/dist/gateway/static/root/assets/browser-settings-page-CAGCYx8U.js +8 -0
- package/dist/gateway/static/root/assets/{browser-workflow-inputs-DW06Zo1N.js → browser-workflow-inputs-CYEbXyRF.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-workflows-page-B6RnRGwm.js → browser-workflows-page-Bf0tPbGi.js} +2 -2
- package/dist/gateway/static/root/assets/capabilities-settings-panel-CKfLsxTI.js +7 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-Cc3BtQar.js → capability-presets-api-DPkFA_-R.js} +1 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CpipKNqX.js +3 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-BvZO5FaO.js → channel-recipient-api-DqKaAcnZ.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-Bvq-O4pt.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-CrMld2l7.js +1 -0
- package/dist/gateway/static/root/assets/chat-terminal-dock-CTDRZa7e.js +36 -0
- package/dist/gateway/static/root/assets/{connectors-api-CUl6_EQJ.js → connectors-api-Buu8fif8.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-CSQRzaVn.js +2 -0
- package/dist/gateway/static/root/assets/{cron-expression-BD9MgoE_.js → cron-expression-DTLR82NB.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-ChqNmoxw.js → date-picker-DyNogHQH.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-CDUmFs6H.js → dependency-picker-BpnCuo7B.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-D61gqxaD.js → desktop-pet-CDKI4gVB.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-QvuJvIX_.js → desktop-pet-settings-DjT5C2a3.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-DvXMvDNY.js → directory-picker-path-field-DlJY90TM.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DMdVTAQ3.js → extension-debug-page-DWf2z7q5.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BNzxZtaK.js → extension-page-Dorx0kf9.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DoEfyizU.js → extension-settings-page-B1wU9ZOB.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-o7AKvthC.js → gateway-config-api-B1lG4dNr.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-BQbkUP5X.js → gateway-config-swr-BIxuwPQi.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-TO5YYZ9a.js → gateway-settings-DqIOqJjM.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-DIgdpHgk.js → gateway-startup-retry-BpZgd4U-.js} +1 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-DG4Kmgkc.js +1 -0
- package/dist/gateway/static/root/assets/home-page-BhqItS_s.js +1 -0
- package/dist/gateway/static/root/assets/image-generation-api-PkhYohDa.js +1 -0
- package/dist/gateway/static/root/assets/index-DLhvsU9B.css +2 -0
- package/dist/gateway/static/root/assets/index-_cuTcWjB.js +107 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-4xaM3jjU.js → keyboard-shortcuts-settings-6OQT3gQF.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-DWjTmzxw.js +2 -0
- package/dist/gateway/static/root/assets/{local-apps-page-C1xDicdr.js → local-apps-page-DfruRAmE.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-pByvK12G.js → locale-store-C5MK9WcP.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-BA5efZ8B.js +2 -0
- package/dist/gateway/static/root/assets/{management-settings-D1XdHm7v.js → management-settings-L1VYkywO.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-split-B_Ijq1Fr.js → markdown-split-oqgHbqt-.js} +1 -1
- package/dist/gateway/static/root/assets/markdown-view-DD_PgVue.css +1 -0
- package/dist/gateway/static/root/assets/{markdown-view-CyJlGUxB.js → markdown-view-V4rcPPH0.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-CXXNRROJ.js → media-plugins-Bb6gSX2o.js} +1 -1
- package/dist/gateway/static/root/assets/messages-ctG2e-ix.js +3 -0
- package/dist/gateway/static/root/assets/{notes-page-rkePB4CB.js → notes-page-B1rOXjpT.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-CkHXVmKP.js +4 -0
- package/dist/gateway/static/root/assets/{page-tabs-gw-RMQCV.js → page-tabs-CBuCKeyy.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-B8aMScJ2.js → preview-open-alternatives-BQ0tLfPO.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-CjcpkWAz.js → product-open-page-DPeFn7Hu.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-DCqet9-L.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-D0t_AjzG.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-BUWPoBvw.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-Ch5qq86o.js → runtime-tools-settings-panel-BCfQNzjG.js} +2 -2
- package/dist/gateway/static/root/assets/{schema-form-DHYWYUFt.js → schema-form-Bo7YbHYN.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-vLhrrM3m.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-OP1y0Y8M.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-DlzZx0-i.js → settings-form-section-B9dnKr3M.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-BVLhreQi.js → settings-loading-skeleton-CYDV2JtY.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-BJU-kUnN.js → settings-page-DbrIYfS9.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Cxc-Ejl5.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-hvIuZXMe.js → share-preview-page-olgr7LLN.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-ZOqC6-aA.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DwvC3Iuf.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-Dlvuh7D-.js → skills-page-PE16CNw5.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page.utils-B6ddOpnf.js → skills-page.utils-nXmBcBxt.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-BdbCAyoA.js → system-settings-panel-C3qPwAdY.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-DCRB-5q-.js +1 -0
- package/dist/gateway/static/root/assets/{theme-store-BtdGacMI.js → theme-store-KR5Otp5w.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-CL6qHYJA.js → typed-models-lib-lMZodtDF.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-DysNnqCS.js → use-autosave-CKpatP3S.js} +1 -1
- package/dist/gateway/static/root/assets/user-context-page-CoiedRuA.js +1 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-UEsO9Jr-.js → voice-api-key-field-CDcv0Wbh.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-B9disASf.js → work-discovery-overlay-CGdT22un.js} +1 -1
- package/dist/gateway/static/root/assets/work-discovery-page-BwaU1RqI.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-A0zTQHFQ.js → workflow-run-setup-panel-BAHYNlQt.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-DHYmh9G7.js +5 -0
- package/dist/gateway/static/root/index.html +10 -10
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.js +1 -1
- package/dist/src/agent/background-review/coordinator.d.ts +1 -1
- package/dist/src/agent/background-review/coordinator.js +4 -5
- package/dist/src/agent/background-review/run-background-review.js +0 -1
- package/dist/src/agent/background-review/settings.d.ts +1 -2
- package/dist/src/agent/background-review/settings.js +3 -4
- package/dist/src/agent/external-tools/composio-provider.js +8 -4
- package/dist/src/agent/image/generation/providers/xopc-cloud.js +2 -1
- package/dist/src/agent/image/tool-model-config.js +15 -9
- package/dist/src/agent/memory/builtin-provider.js +1 -2
- package/dist/src/agent/memory/manager.js +2 -0
- package/dist/src/agent/memory/sensitivity.js +1 -1
- package/dist/src/agent/memory/understanding/service.js +43 -19
- package/dist/src/agent/memory/user-context-coordinator.js +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +23 -7
- package/dist/src/automations/domain/validation.d.ts +7 -7
- package/dist/src/automations/draft/automation-draft-validator.d.ts +2 -2
- package/dist/src/capabilities/readiness/from-config.d.ts +10 -0
- package/dist/src/capabilities/readiness/from-config.js +128 -0
- package/dist/src/capabilities/readiness/index.d.ts +3 -0
- package/dist/src/capabilities/readiness/index.js +3 -0
- package/dist/src/capabilities/readiness/planner.d.ts +3 -0
- package/dist/src/capabilities/readiness/planner.js +56 -0
- package/dist/src/capabilities/readiness/types.d.ts +35 -0
- package/dist/src/capabilities/readiness/types.js +1 -0
- package/dist/src/cli/commands/agent.js +9 -0
- package/dist/src/cli/commands/auth.js +4 -3
- package/dist/src/cli/commands/connectors.js +1 -1
- package/dist/src/cli/commands/models.js +2 -1
- package/dist/src/cli/commands/onboard/model.d.ts +3 -21
- package/dist/src/cli/commands/onboard/model.js +10 -86
- package/dist/src/cli/utils/oauth-login.d.ts +2 -0
- package/dist/src/cli/utils/oauth-login.js +9 -1
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/index.js +2 -2
- package/dist/src/config/paths-state.d.ts +2 -0
- package/dist/src/config/paths-state.js +5 -1
- package/dist/src/config/paths.d.ts +1 -1
- package/dist/src/config/paths.js +2 -2
- package/dist/src/config/schema.js +1 -1
- package/dist/src/connectors/auth-provider-registry.d.ts +2 -1
- package/dist/src/connectors/auth-provider-registry.js +5 -2
- package/dist/src/connectors/composio-sessions.d.ts +39 -0
- package/dist/src/connectors/composio-sessions.js +66 -7
- package/dist/src/connectors/composio.d.ts +4 -1
- package/dist/src/connectors/composio.js +34 -7
- package/dist/src/connectors/connected-source-cursor.d.ts +9 -0
- package/dist/src/connectors/connected-source-cursor.js +30 -0
- package/dist/src/connectors/connected-source-ingestion.js +67 -46
- package/dist/src/connectors/connected-source-normalizers.d.ts +1 -0
- package/dist/src/connectors/connected-source-normalizers.js +33 -2
- package/dist/src/connectors/connected-source-sanitization.d.ts +1 -0
- package/dist/src/connectors/connected-source-sanitization.js +21 -0
- package/dist/src/connectors/connector-identity.js +10 -2
- package/dist/src/connectors/content-enrichment.d.ts +29 -0
- package/dist/src/connectors/content-enrichment.js +273 -0
- package/dist/src/connectors/health.js +1 -1
- package/dist/src/connectors/learning-coordinator.js +1 -2
- package/dist/src/connectors/learning-recipes.js +28 -33
- package/dist/src/connectors/runtime-adapter-registry.js +14 -1
- package/dist/src/discussions/live-worker.d.ts +1 -0
- package/dist/src/discussions/live-worker.js +7 -1
- package/dist/src/discussions/repository.js +11 -1
- package/dist/src/discussions/sealer.d.ts +1 -1
- package/dist/src/discussions/sealer.js +16 -7
- package/dist/src/discussions/transcript.js +27 -1
- package/dist/src/discussions/types.d.ts +4 -0
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/hono/app.js +8 -3
- package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js +8 -1
- package/dist/src/gateway/hono/oauth-async.d.ts +11 -5
- package/dist/src/gateway/hono/oauth-async.js +29 -16
- package/dist/src/gateway/hono/oauth.d.ts +1 -3
- package/dist/src/gateway/hono/oauth.js +22 -22
- package/dist/src/gateway/hono/routes/agent-stream.js +4 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/connectors.js +16 -3
- package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
- package/dist/src/gateway/hono/routes/discussions.js +2 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +2 -1
- package/dist/src/gateway/hono/routes/mcp.js +1 -1
- package/dist/src/gateway/hono/routes/models.js +59 -5
- package/dist/src/gateway/hono/routes/session-input-handler.d.ts +60 -0
- package/dist/src/gateway/hono/routes/session-input-handler.js +75 -1
- package/dist/src/gateway/hono/routes/understanding-sources.js +29 -0
- package/dist/src/gateway/hono/routes/voice.d.ts +1 -2
- package/dist/src/gateway/hono/routes/voice.js +16 -35
- package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
- package/dist/src/gateway/rate-limit/buckets.js +12 -0
- package/dist/src/gateway/service/agent-runner.d.ts +9 -1
- package/dist/src/gateway/service/agent-runner.js +9 -0
- package/dist/src/gateway/service/session-input-coordinator.d.ts +12 -0
- package/dist/src/gateway/service/session-input-coordinator.js +63 -6
- package/dist/src/gateway/service.d.ts +8 -0
- package/dist/src/gateway/service.js +18 -0
- package/dist/src/knowledge/connected-understanding-pipeline.d.ts +1 -1
- package/dist/src/knowledge/connected-understanding-pipeline.js +74 -25
- package/dist/src/knowledge/ingestion-service.js +33 -15
- package/dist/src/knowledge/types.d.ts +2 -0
- package/dist/src/media-understanding/audio-transcription-runner.d.ts +2 -0
- package/dist/src/media-understanding/audio-transcription-runner.js +3 -1
- package/dist/src/media-understanding/runner.js +3 -1
- package/dist/src/media-understanding/types.d.ts +2 -0
- package/dist/src/providers/model-catalog-persistence.d.ts +9 -0
- package/dist/src/providers/model-catalog-persistence.js +172 -0
- package/dist/src/providers/model-catalog-ranking.d.ts +2 -0
- package/dist/src/providers/model-catalog-ranking.js +17 -0
- package/dist/src/providers/model-catalog-store.d.ts +13 -3
- package/dist/src/providers/model-catalog-store.js +24 -5
- package/dist/src/providers/model-catalog-sync-service.d.ts +3 -3
- package/dist/src/providers/model-catalog-sync-service.js +12 -7
- package/dist/src/providers/provider-auth-service.d.ts +1 -0
- package/dist/src/providers/provider-auth-service.js +3 -0
- package/dist/src/providers/provider-disconnect.d.ts +11 -0
- package/dist/src/providers/provider-disconnect.js +33 -0
- package/dist/src/providers/xopc-cloud-catalog-coordinator.d.ts +56 -0
- package/dist/src/providers/xopc-cloud-catalog-coordinator.js +182 -0
- package/dist/src/providers/xopc-cloud-model-source.d.ts +6 -10
- package/dist/src/providers/xopc-cloud-model-source.js +49 -27
- package/dist/src/retrieval/audit.d.ts +1 -0
- package/dist/src/retrieval/audit.js +8 -0
- package/dist/src/retrieval/candidateFusion.d.ts +5 -0
- package/dist/src/retrieval/candidateFusion.js +20 -0
- package/dist/src/retrieval/queryProfile.d.ts +16 -0
- package/dist/src/retrieval/queryProfile.js +66 -0
- package/dist/src/retrieval/textFeatures.d.ts +5 -0
- package/dist/src/retrieval/textFeatures.js +71 -0
- package/dist/src/session/client-history.d.ts +1 -0
- package/dist/src/session/client-history.js +4 -0
- package/dist/src/session/index.js +1 -1
- package/dist/src/session/store.js +1 -1
- package/dist/src/storage/sqlite/fts.d.ts +0 -4
- package/dist/src/storage/sqlite/fts.js +2 -49
- package/dist/src/storage/sqlite/index.d.ts +3 -2
- package/dist/src/storage/sqlite/index.js +6 -5
- package/dist/src/storage/sqlite/knowledge-repository.d.ts +1 -0
- package/dist/src/storage/sqlite/knowledge-repository.js +4 -0
- package/dist/src/storage/sqlite/memory-records-repository.js +60 -38
- package/dist/src/storage/sqlite/row-mappers.js +2 -2
- package/dist/src/storage/sqlite/session-repository.js +2 -2
- package/dist/src/storage/sqlite/session-turn-replace-repository.d.ts +34 -0
- package/dist/src/storage/sqlite/session-turn-replace-repository.js +110 -0
- package/dist/src/storage/sqlite/transcript-repository.js +1 -1
- package/dist/src/storage/sqlite/user-context-quality-repository.d.ts +15 -0
- package/dist/src/storage/sqlite/user-context-quality-repository.js +46 -2
- package/dist/src/storage/sqlite/user-context-repository.d.ts +4 -0
- package/dist/src/storage/sqlite/user-context-repository.js +29 -3
- package/dist/src/tasks/home-query-service.d.ts +3 -1
- package/dist/src/tasks/home-query-service.js +73 -70
- package/dist/src/tui/backends/embedded-backend.js +12 -4
- package/dist/src/tui/tui-oauth-login.js +5 -0
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/user-context/planner.d.ts +1 -0
- package/dist/src/user-context/planner.js +16 -29
- package/dist/src/user-context/retriever.d.ts +15 -0
- package/dist/src/user-context/retriever.js +65 -0
- package/dist/src/user-context/scope.d.ts +7 -0
- package/dist/src/user-context/scope.js +9 -0
- package/dist/src/user-context/sources/activity-clustering.js +30 -117
- package/dist/src/user-context/sources/index.d.ts +1 -0
- package/dist/src/user-context/sources/index.js +2 -1
- package/dist/src/user-context/sources/signal-clustering.d.ts +18 -0
- package/dist/src/user-context/sources/signal-clustering.js +131 -0
- package/dist/src/voice/audio/normalize.d.ts +17 -0
- package/dist/src/voice/audio/normalize.js +155 -0
- package/dist/src/voice/language-profile.d.ts +1 -4
- package/dist/src/voice/language-profile.js +2 -25
- package/dist/src/voice/local/runtime-client.d.ts +2 -0
- package/dist/src/voice/local/runtime-client.js +20 -1
- package/dist/src/voice/local/runtime-worker.js +7 -13
- package/dist/src/voice/local/wav.js +1 -1
- package/dist/src/voice/stt/availability.d.ts +1 -4
- package/dist/src/voice/stt/availability.js +3 -15
- package/dist/src/voice/stt/config.js +1 -0
- package/dist/src/voice/stt/factory.js +23 -0
- package/dist/src/voice/stt/index.d.ts +1 -0
- package/dist/src/voice/stt/index.js +2 -2
- package/dist/src/voice/stt/list-providers.js +1 -1
- package/dist/src/voice/stt/providers/local-transcription.js +7 -3
- package/dist/src/voice/stt/providers/xopc-cloud-transcription.js +3 -1
- package/dist/src/voice/stt/transcribe-core.d.ts +5 -1
- package/dist/src/voice/stt/transcribe-core.js +13 -5
- package/dist/src/voice/stt/types.d.ts +2 -0
- package/dist/src/voice/tts/factory.d.ts +1 -1
- package/dist/src/voice/tts/factory.js +23 -1
- package/dist/src/voice/tts/merge-config.js +5 -3
- package/dist/src/voice/tts/providers/xopc-cloud-speech.js +3 -1
- package/dist/src/voice/tts/types.d.ts +2 -0
- package/dist/src/voice/tts/types.js +4 -2
- package/dist/src/work-discovery/evaluation.d.ts +23 -0
- package/dist/src/work-discovery/evaluation.js +18 -1
- package/dist/src/work-discovery/index.js +2 -2
- package/package.json +4 -3
- package/dist/gateway/static/root/assets/agents-Bl8FQZxW.js +0 -68
- package/dist/gateway/static/root/assets/apps-page-CRUgTO10.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-DrSwolhG.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-NlvDyMwD.js +0 -8
- package/dist/gateway/static/root/assets/capabilities-settings-panel-BWXUznw5.js +0 -7
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-D0loEbzq.js +0 -3
- package/dist/gateway/static/root/assets/channels-settings-CcivCw8U.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-DkHAD2Zn.js +0 -1
- package/dist/gateway/static/root/assets/chat-terminal-dock-DVedGAeX.js +0 -36
- package/dist/gateway/static/root/assets/connectors-page-DlBSlfkv.js +0 -2
- package/dist/gateway/static/root/assets/heartbeat-settings-UZAn1aAQ.js +0 -1
- package/dist/gateway/static/root/assets/home-page-CRJDpy5E.js +0 -3
- package/dist/gateway/static/root/assets/index-BSjP0Wsx.css +0 -2
- package/dist/gateway/static/root/assets/index-C2ZYFBGL.js +0 -85
- package/dist/gateway/static/root/assets/local-app-workbench-page-D9bguWRo.js +0 -2
- package/dist/gateway/static/root/assets/logs-page-Gr-nE4nW.js +0 -2
- package/dist/gateway/static/root/assets/markdown-view-B12xeflb.css +0 -1
- package/dist/gateway/static/root/assets/messages-yG5P43Q9.js +0 -3
- package/dist/gateway/static/root/assets/notes-workbench-CpbD4XG2.js +0 -4
- package/dist/gateway/static/root/assets/project-detail-page-GvSYDbjR.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-DPRxKGbs.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-WIzeu-gB.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-2XEJM0YE.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-g1GThZ0O.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-C6qj2L-q.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-BBpE1bep.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DXORBJNk.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-DC0hc8hp.js +0 -1
- package/dist/gateway/static/root/assets/user-context-page-Bwg4KV8B.js +0 -1
- package/dist/gateway/static/root/assets/work-discovery-page-CmPfOfHl.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-DhQNh7W6.js +0 -5
- package/dist/src/voice/local/runtime-dispatcher.d.ts +0 -9
- package/dist/src/voice/local/runtime-dispatcher.js +0 -20
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { forEachNormalizedAudioSegment } from "../voice/audio/normalize.js";
|
|
3
4
|
import { transcribe } from "../voice/stt/transcribe-core.js";
|
|
4
5
|
import { isSTTAvailable } from "../voice/stt/availability.js";
|
|
5
6
|
import { mergeSttConfigFromAppConfig } from "../voice/stt/config.js";
|
|
6
7
|
import "../voice/stt/index.js";
|
|
7
8
|
import { getDiscussionCapture, listDiscussionCaptures, listDiscussionTranscriptSegments, updateDiscussionCapture } from "./repository.js";
|
|
8
|
-
import { assembleDiscussionTranscript } from "./transcript.js";
|
|
9
|
+
import { appendTranscriptWithoutOverlap, assembleDiscussionTranscript } from "./transcript.js";
|
|
9
10
|
import { createHash } from "node:crypto";
|
|
10
|
-
import { readFile } from "node:fs/promises";
|
|
11
11
|
//#region src/discussions/sealer.ts
|
|
12
12
|
init_logger();
|
|
13
13
|
const log = createLogger("DiscussionSealer");
|
|
@@ -85,15 +85,24 @@ var DiscussionSealer = class {
|
|
|
85
85
|
async transcribeFullRecording(capture) {
|
|
86
86
|
const attachment = await this.deps.notes.getAttachmentPath(capture.noteId, capture.audioAttachmentId);
|
|
87
87
|
if (!attachment) throw new Error("Discussion audio file is missing");
|
|
88
|
-
|
|
89
|
-
if (this.deps.transcribeRecording) return this.deps.transcribeRecording(buffer, capture);
|
|
88
|
+
if (this.deps.transcribeRecording) return this.deps.transcribeRecording(attachment.filePath, capture);
|
|
90
89
|
const config = this.deps.getConfig();
|
|
91
90
|
const sttConfig = mergeSttConfigFromAppConfig(config.tools?.media?.audio, config.tools?.media);
|
|
92
91
|
if (!isSTTAvailable(sttConfig)) throw new Error("STT is not configured");
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
92
|
+
let text = "";
|
|
93
|
+
let language;
|
|
94
|
+
await forEachNormalizedAudioSegment({ filePath: attachment.filePath }, async (buffer, index) => {
|
|
95
|
+
const result = await transcribe(buffer, sttConfig, {
|
|
96
|
+
mime: "audio/wav",
|
|
97
|
+
fileName: `discussion-recovery-${index}.wav`
|
|
98
|
+
});
|
|
99
|
+
text = appendTranscriptWithoutOverlap(text, result.text);
|
|
100
|
+
language ??= result.language;
|
|
96
101
|
});
|
|
102
|
+
return {
|
|
103
|
+
text,
|
|
104
|
+
...language ? { language } : {}
|
|
105
|
+
};
|
|
97
106
|
}
|
|
98
107
|
fail(capture, stage, code, message) {
|
|
99
108
|
const current = getDiscussionCapture(capture.id);
|
|
@@ -1,11 +1,37 @@
|
|
|
1
1
|
//#region src/discussions/transcript.ts
|
|
2
|
+
function searchableCharacters(value) {
|
|
3
|
+
let text = "";
|
|
4
|
+
const sourceEnds = [];
|
|
5
|
+
let sourceOffset = 0;
|
|
6
|
+
for (const character of value) {
|
|
7
|
+
sourceOffset += character.length;
|
|
8
|
+
if (!/[\p{L}\p{N}]/u.test(character)) continue;
|
|
9
|
+
text += character.toLocaleLowerCase();
|
|
10
|
+
sourceEnds.push(sourceOffset);
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
text,
|
|
14
|
+
sourceEnds
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function joinOverlap(left, remainder) {
|
|
18
|
+
return `${left}${/[\p{P}\p{S}]$/u.test(left) ? remainder.replace(/^[\s\p{P}\p{S}]+/u, "") : remainder}`.trim();
|
|
19
|
+
}
|
|
2
20
|
function appendTranscriptWithoutOverlap(existing, next) {
|
|
3
21
|
const left = existing.trim();
|
|
4
22
|
const right = next.trim();
|
|
5
23
|
if (!left) return right;
|
|
6
24
|
if (!right) return left;
|
|
7
25
|
const max = Math.min(200, left.length, right.length);
|
|
8
|
-
for (let size = max; size >= 8; size -= 1) if (left.slice(-size).toLocaleLowerCase() === right.slice(0, size).toLocaleLowerCase()) return
|
|
26
|
+
for (let size = max; size >= 8; size -= 1) if (left.slice(-size).toLocaleLowerCase() === right.slice(0, size).toLocaleLowerCase()) return joinOverlap(left, right.slice(size));
|
|
27
|
+
const leftSearchable = searchableCharacters(left).text.slice(-200);
|
|
28
|
+
const rightSearchable = searchableCharacters(right);
|
|
29
|
+
const normalizedMax = Math.min(leftSearchable.length, rightSearchable.text.length);
|
|
30
|
+
for (let size = normalizedMax; size >= 5; size -= 1) {
|
|
31
|
+
if (leftSearchable.slice(-size) !== rightSearchable.text.slice(0, size)) continue;
|
|
32
|
+
const sourceEnd = rightSearchable.sourceEnds[size - 1];
|
|
33
|
+
return joinOverlap(left, right.slice(sourceEnd));
|
|
34
|
+
}
|
|
9
35
|
return `${left}\n${right}`;
|
|
10
36
|
}
|
|
11
37
|
function assembleDiscussionTranscript(segments) {
|
|
@@ -132,6 +132,10 @@ export interface DiscussionMetrics {
|
|
|
132
132
|
byStatus: Record<DiscussionStatus, number>;
|
|
133
133
|
averageTimeToFirstTranscriptMs: number | null;
|
|
134
134
|
averageTimeToCompleteMs: number | null;
|
|
135
|
+
totalSegments: number;
|
|
136
|
+
failedSegments: number;
|
|
137
|
+
retriedSegments: number;
|
|
138
|
+
averageSegmentLatencyMs: number | null;
|
|
135
139
|
}
|
|
136
140
|
export interface DiscussionDetail {
|
|
137
141
|
discussion: DiscussionCapture;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { resolveCapabilityPresetLayer, resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
|
|
2
1
|
import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, resolveUserPath, validateAgentIdForNewAgent } from "../agent/agent-scope.js";
|
|
2
|
+
import { resolveCapabilityPresetLayer, resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
|
|
3
3
|
import { resolveEffectiveAgentProfile } from "../config/agent-profile.js";
|
|
4
4
|
import { WORKSPACE_FILES, init_paths } from "../config/paths.js";
|
|
5
5
|
import { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES, REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET } from "../agent/context/workspace.js";
|
|
@@ -10,7 +10,7 @@ import { buildGatewayConsoleCspHeader } from "../security/csp.js";
|
|
|
10
10
|
import { checkBrowserOrigin } from "../security/origin-check.js";
|
|
11
11
|
import { auth } from "./middleware/auth.js";
|
|
12
12
|
import { operatorScopes } from "./middleware/scopes.js";
|
|
13
|
-
import { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createStrictRateLimitMiddleware, createTaskRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware } from "./middleware/strict-rate-limit.js";
|
|
13
|
+
import { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createMediaRateLimitMiddleware, createStrictRateLimitMiddleware, createTaskRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware } from "./middleware/strict-rate-limit.js";
|
|
14
14
|
import { logContextMiddleware } from "./middleware/log-context.js";
|
|
15
15
|
import { logger } from "./middleware/logger.js";
|
|
16
16
|
import { routeErrorMiddleware } from "./middleware/route-errors.js";
|
|
@@ -147,7 +147,7 @@ function createHonoApp(config) {
|
|
|
147
147
|
const DEFAULT_API_BODY_MAX = 1 * 1024 * 1024;
|
|
148
148
|
const SKILL_UPLOAD_BODY_MAX = 10 * 1024 * 1024;
|
|
149
149
|
const NOTE_MEDIA_BODY_MAX = 25 * 1024 * 1024;
|
|
150
|
-
const VOICE_TRANSCRIBE_BODY_MAX =
|
|
150
|
+
const VOICE_TRANSCRIBE_BODY_MAX = 26 * 1024 * 1024;
|
|
151
151
|
const SESSION_INPUT_BODY_MAX = maxSessionInputRequestBodyBytes();
|
|
152
152
|
const isNoteMediaUploadRequest = (path, method, contentType) => {
|
|
153
153
|
if (method !== "POST") return false;
|
|
@@ -175,7 +175,7 @@ function createHonoApp(config) {
|
|
|
175
175
|
}));
|
|
176
176
|
app.use("/api/*", async (c, next) => {
|
|
177
177
|
const contentType = c.req.header("content-type");
|
|
178
|
-
const maxSize = c.req.method === "POST" && c.req.path === "/api/tasks" || c.req.method === "POST" && /^\/api\/sessions\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "POST" && /^\/api\/tasks\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "PATCH" && /^\/api\/sessions\/[^/]+\/inputs\/[^/]+$/.test(c.req.path) ? SESSION_INPUT_BODY_MAX : c.req.path === "/api/skills/upload" ? SKILL_UPLOAD_BODY_MAX : c.req.path === "/api/voice/
|
|
178
|
+
const maxSize = c.req.method === "POST" && c.req.path === "/api/tasks" || c.req.method === "POST" && /^\/api\/sessions\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "POST" && /^\/api\/tasks\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "PATCH" && /^\/api\/sessions\/[^/]+\/inputs\/[^/]+$/.test(c.req.path) ? SESSION_INPUT_BODY_MAX : c.req.path === "/api/skills/upload" ? SKILL_UPLOAD_BODY_MAX : c.req.path === "/api/voice/transcriptions" ? VOICE_TRANSCRIBE_BODY_MAX : isNoteMediaUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : isProjectFileUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : discussionUploadBodyMax(c.req.path, c.req.method, contentType) ?? DEFAULT_API_BODY_MAX;
|
|
179
179
|
const maxSizeMb = Math.ceil(maxSize / (1024 * 1024));
|
|
180
180
|
return bodyLimit({
|
|
181
181
|
maxSize,
|
|
@@ -213,6 +213,10 @@ function createHonoApp(config) {
|
|
|
213
213
|
trustedProxies: service.currentConfig.gateway?.trustedProxies,
|
|
214
214
|
allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true
|
|
215
215
|
}) });
|
|
216
|
+
const mediaRateLimitMiddleware = createMediaRateLimitMiddleware({ getTrustedProxyContext: () => ({
|
|
217
|
+
trustedProxies: service.currentConfig.gateway?.trustedProxies,
|
|
218
|
+
allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true
|
|
219
|
+
}) });
|
|
216
220
|
const taskRateLimitMiddleware = createTaskRateLimitMiddleware({ getTrustedProxyContext: () => ({
|
|
217
221
|
trustedProxies: service.currentConfig.gateway?.trustedProxies,
|
|
218
222
|
allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true
|
|
@@ -225,6 +229,7 @@ function createHonoApp(config) {
|
|
|
225
229
|
service,
|
|
226
230
|
strictRateLimitMiddleware,
|
|
227
231
|
chatRateLimitMiddleware,
|
|
232
|
+
mediaRateLimitMiddleware,
|
|
228
233
|
taskRateLimitMiddleware,
|
|
229
234
|
xopcCloudPollRateLimitMiddleware: createXopcCloudPollRateLimitMiddleware({ getTrustedProxyContext: () => ({
|
|
230
235
|
trustedProxies: service.currentConfig.gateway?.trustedProxies,
|
|
@@ -16,6 +16,10 @@ export declare function createChatRateLimitMiddleware(deps: StrictRateLimitDeps)
|
|
|
16
16
|
error: string;
|
|
17
17
|
code: string;
|
|
18
18
|
}, 429, "json">>;
|
|
19
|
+
export declare function createMediaRateLimitMiddleware(deps: StrictRateLimitDeps): import("hono").MiddlewareHandler<any, string, {}, Response & import("hono").TypedResponse<{
|
|
20
|
+
error: string;
|
|
21
|
+
code: string;
|
|
22
|
+
}, 429, "json">>;
|
|
19
23
|
export declare function createTaskRateLimitMiddleware(deps: StrictRateLimitDeps): import("hono").MiddlewareHandler<any, string, {}, Response & import("hono").TypedResponse<{
|
|
20
24
|
error: string;
|
|
21
25
|
code: string;
|
|
@@ -70,6 +70,13 @@ function createChatRateLimitMiddleware(deps) {
|
|
|
70
70
|
reason: "chat_rate_limit_exceeded"
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
|
+
function createMediaRateLimitMiddleware(deps) {
|
|
74
|
+
return createClientRateLimitMiddleware(deps, {
|
|
75
|
+
limiter: () => buckets.mediaApi(),
|
|
76
|
+
exceededMessage: "Media API rate limit exceeded",
|
|
77
|
+
reason: "media_rate_limit_exceeded"
|
|
78
|
+
});
|
|
79
|
+
}
|
|
73
80
|
function createTaskRateLimitMiddleware(deps) {
|
|
74
81
|
return createClientRateLimitMiddleware(deps, {
|
|
75
82
|
limiter: () => buckets.taskApi(),
|
|
@@ -92,4 +99,4 @@ function createChannelRateLimitMiddleware(deps) {
|
|
|
92
99
|
});
|
|
93
100
|
}
|
|
94
101
|
//#endregion
|
|
95
|
-
export { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createStrictRateLimitMiddleware, createTaskRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware };
|
|
102
|
+
export { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createMediaRateLimitMiddleware, createStrictRateLimitMiddleware, createTaskRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware };
|
|
@@ -7,8 +7,17 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { Hono } from 'hono';
|
|
9
9
|
import type { GatewayService } from '../service.js';
|
|
10
|
-
import {
|
|
11
|
-
|
|
10
|
+
import type { Config } from '../../config/schema.js';
|
|
11
|
+
import { type CapabilityId } from '../../capabilities/readiness/index.js';
|
|
12
|
+
import type { CatalogReadiness } from '../../providers/xopc-cloud-catalog-coordinator.js';
|
|
13
|
+
export interface OAuthCompletionReadiness {
|
|
14
|
+
authorized: true;
|
|
15
|
+
state: 'connected' | 'connected-degraded';
|
|
16
|
+
catalog: CatalogReadiness;
|
|
17
|
+
capabilities: Record<CapabilityId, 'ready' | 'unavailable' | 'disabled'>;
|
|
18
|
+
}
|
|
19
|
+
export declare function buildOAuthCompletionReadiness(config: Config, catalog: CatalogReadiness): OAuthCompletionReadiness;
|
|
20
|
+
export declare function refreshModelCatalogAfterOAuth(provider: string, service: Pick<GatewayService, 'getModelCatalogSync'>): Promise<CatalogReadiness | undefined>;
|
|
12
21
|
export declare function normalizeDesktopOAuthReturnPath(value: unknown): string | undefined;
|
|
13
22
|
export declare function resolveOAuthLoginMethodPreference(params: {
|
|
14
23
|
requestedMethod?: unknown;
|
|
@@ -16,6 +25,3 @@ export declare function resolveOAuthLoginMethodPreference(params: {
|
|
|
16
25
|
remote: boolean;
|
|
17
26
|
}): string | undefined;
|
|
18
27
|
export declare function createOAuthAsyncHandler(service: GatewayService): Hono<import("hono/dist/types/types.js").BlankEnv, import("hono/dist/types/types.js").BlankSchema, "/">;
|
|
19
|
-
export declare function getOAuthCredentialsFromCache(provider: string): OAuthCredentials | undefined;
|
|
20
|
-
export declare function setOAuthCredentialsToCache(provider: string, creds: OAuthCredentials): void;
|
|
21
|
-
export declare function deleteOAuthCredentialsFromCache(provider: string): void;
|
|
@@ -4,6 +4,8 @@ import { getOAuthProviderInterfaces, init_registry } from "../../auth/oauth/regi
|
|
|
4
4
|
import { CredentialResolver, init_credentials } from "../../auth/credentials.js";
|
|
5
5
|
import { isLoopbackHost } from "../host.js";
|
|
6
6
|
import { resolveReverseProxyPublicUrl } from "../public-url.js";
|
|
7
|
+
import { buildCapabilityPlansForConfig } from "../../capabilities/readiness/from-config.js";
|
|
8
|
+
import "../../capabilities/readiness/index.js";
|
|
7
9
|
import { Hono } from "hono";
|
|
8
10
|
//#region src/gateway/hono/oauth-async.ts
|
|
9
11
|
/**
|
|
@@ -17,10 +19,20 @@ init_registry();
|
|
|
17
19
|
init_credentials();
|
|
18
20
|
init_logger();
|
|
19
21
|
const log = createLogger("OAuthAsync");
|
|
22
|
+
function buildOAuthCompletionReadiness(config, catalog) {
|
|
23
|
+
const plans = buildCapabilityPlansForConfig(config);
|
|
24
|
+
const capabilities = Object.fromEntries(Object.entries(plans).map(([capability, plan]) => [capability, plan.status === "disabled" ? "disabled" : plan.status === "unavailable" ? "unavailable" : "ready"]));
|
|
25
|
+
return {
|
|
26
|
+
authorized: true,
|
|
27
|
+
state: Boolean(catalog.error) || Object.values(capabilities).some((status) => status === "unavailable") ? "connected-degraded" : "connected",
|
|
28
|
+
catalog,
|
|
29
|
+
capabilities
|
|
30
|
+
};
|
|
31
|
+
}
|
|
20
32
|
async function refreshModelCatalogAfterOAuth(provider, service) {
|
|
21
|
-
if (provider !== "xopc-cloud") return;
|
|
33
|
+
if (provider !== "xopc-cloud") return void 0;
|
|
22
34
|
try {
|
|
23
|
-
await service.getModelCatalogSync().refreshNow();
|
|
35
|
+
return await service.getModelCatalogSync().refreshNow();
|
|
24
36
|
} catch (err) {
|
|
25
37
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
26
38
|
log.warn({
|
|
@@ -28,6 +40,16 @@ async function refreshModelCatalogAfterOAuth(provider, service) {
|
|
|
28
40
|
provider,
|
|
29
41
|
errorMessage
|
|
30
42
|
}, `OAuth completed, but the model catalog could not be refreshed: ${errorMessage}`);
|
|
43
|
+
return {
|
|
44
|
+
state: "unavailable",
|
|
45
|
+
source: "none",
|
|
46
|
+
modelCount: 0,
|
|
47
|
+
error: {
|
|
48
|
+
code: "refresh_failed",
|
|
49
|
+
message: errorMessage,
|
|
50
|
+
retryable: true
|
|
51
|
+
}
|
|
52
|
+
};
|
|
31
53
|
}
|
|
32
54
|
}
|
|
33
55
|
/** User-facing message when undici/fetch fails (often DNS, firewall, or wrong machine for localhost callback). */
|
|
@@ -172,6 +194,7 @@ function createOAuthAsyncHandler(service) {
|
|
|
172
194
|
verificationUri: session.verificationUri,
|
|
173
195
|
message: session.message,
|
|
174
196
|
error: session.error,
|
|
197
|
+
readiness: session.readiness,
|
|
175
198
|
expiresAt: session.expiresAt
|
|
176
199
|
}
|
|
177
200
|
});
|
|
@@ -301,13 +324,13 @@ async function runOAuthFlow(session, oauthProvider, service) {
|
|
|
301
324
|
};
|
|
302
325
|
try {
|
|
303
326
|
const credentials = await oauthProvider.login(callbacks);
|
|
304
|
-
setOAuthCredentialsToCache(session.provider, credentials);
|
|
305
327
|
await new CredentialResolver().saveOAuthCredentials(session.provider, credentials);
|
|
306
328
|
session.message = session.provider === "xopc-cloud" ? "OAuth login successful. Syncing available models..." : "OAuth login successful";
|
|
307
|
-
await refreshModelCatalogAfterOAuth(session.provider, service);
|
|
329
|
+
const catalog = await refreshModelCatalogAfterOAuth(session.provider, service);
|
|
330
|
+
if (catalog && session.provider === "xopc-cloud") session.readiness = buildOAuthCompletionReadiness(service.currentConfig, catalog);
|
|
308
331
|
session.status = "completed";
|
|
309
332
|
session.credentials = credentials;
|
|
310
|
-
session.message = "OAuth login successful";
|
|
333
|
+
session.message = session.readiness?.state === "connected-degraded" ? `OAuth login successful, but capability setup is degraded${catalog?.error ? `: ${catalog.error.message}` : ""}` : "OAuth login successful";
|
|
311
334
|
log.info({
|
|
312
335
|
sessionId: session.id,
|
|
313
336
|
provider: session.provider
|
|
@@ -331,15 +354,5 @@ async function runOAuthFlow(session, oauthProvider, service) {
|
|
|
331
354
|
session.manualCodeReject = void 0;
|
|
332
355
|
}
|
|
333
356
|
}
|
|
334
|
-
const oauthCredentialsCache = /* @__PURE__ */ new Map();
|
|
335
|
-
function getOAuthCredentialsFromCache(provider) {
|
|
336
|
-
return oauthCredentialsCache.get(provider);
|
|
337
|
-
}
|
|
338
|
-
function setOAuthCredentialsToCache(provider, creds) {
|
|
339
|
-
oauthCredentialsCache.set(provider, creds);
|
|
340
|
-
}
|
|
341
|
-
function deleteOAuthCredentialsFromCache(provider) {
|
|
342
|
-
oauthCredentialsCache.delete(provider);
|
|
343
|
-
}
|
|
344
357
|
//#endregion
|
|
345
|
-
export {
|
|
358
|
+
export { buildOAuthCompletionReadiness, createOAuthAsyncHandler, normalizeDesktopOAuthReturnPath, refreshModelCatalogAfterOAuth, resolveOAuthLoginMethodPreference };
|
|
@@ -5,6 +5,4 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { Hono } from 'hono';
|
|
7
7
|
import type { GatewayService } from '../service.js';
|
|
8
|
-
|
|
9
|
-
export declare function loadOAuthCredentialsToCache(_service: GatewayService): void;
|
|
10
|
-
export declare function createOAuthHandler(_service: GatewayService): Hono<import("hono/dist/types/types.js").BlankEnv, import("hono/dist/types/types.js").BlankSchema, "/">;
|
|
8
|
+
export declare function createOAuthHandler(service: GatewayService): Hono<import("hono/dist/types/types.js").BlankEnv, import("hono/dist/types/types.js").BlankSchema, "/">;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { getOAuthProviderInterfaces, init_registry } from "../../auth/oauth/registry.js";
|
|
2
2
|
import { CredentialResolver, init_credentials } from "../../auth/credentials.js";
|
|
3
3
|
import { getProviderAuthState, init_providers, isProviderConfigured } from "../../providers/index.js";
|
|
4
|
+
import { disconnectProvider } from "../../providers/provider-disconnect.js";
|
|
5
|
+
import { buildOAuthCompletionReadiness, refreshModelCatalogAfterOAuth } from "./oauth-async.js";
|
|
4
6
|
import { Hono } from "hono";
|
|
5
7
|
//#region src/gateway/hono/oauth.ts
|
|
6
8
|
/**
|
|
@@ -12,19 +14,7 @@ init_registry();
|
|
|
12
14
|
init_credentials();
|
|
13
15
|
init_providers();
|
|
14
16
|
const OAUTH_PROVIDERS = getOAuthProviderInterfaces();
|
|
15
|
-
|
|
16
|
-
function getOAuthCredentialsFromCache(provider) {
|
|
17
|
-
return oauthCredentialsCache.get(provider);
|
|
18
|
-
}
|
|
19
|
-
function setOAuthCredentialsToCache(provider, creds) {
|
|
20
|
-
oauthCredentialsCache.set(provider, creds);
|
|
21
|
-
}
|
|
22
|
-
function deleteOAuthCredentialsFromCache(provider) {
|
|
23
|
-
oauthCredentialsCache.delete(provider);
|
|
24
|
-
}
|
|
25
|
-
/** No-op: OAuth tokens live on disk under auth paths; cache is populated during login. */
|
|
26
|
-
function loadOAuthCredentialsToCache(_service) {}
|
|
27
|
-
function createOAuthHandler(_service) {
|
|
17
|
+
function createOAuthHandler(service) {
|
|
28
18
|
const oauth = new Hono();
|
|
29
19
|
/**
|
|
30
20
|
* POST /api/auth/oauth/start
|
|
@@ -73,21 +63,28 @@ function createOAuthHandler(_service) {
|
|
|
73
63
|
return prompt.options.find((option) => option.id === "browser")?.id ?? prompt.options[0]?.id;
|
|
74
64
|
}
|
|
75
65
|
});
|
|
76
|
-
setOAuthCredentialsToCache(provider, credentials);
|
|
77
66
|
await new CredentialResolver().saveOAuthCredentials(provider, credentials);
|
|
67
|
+
const catalog = await refreshModelCatalogAfterOAuth(provider, service);
|
|
68
|
+
const readiness = catalog ? buildOAuthCompletionReadiness(service.currentConfig, catalog) : void 0;
|
|
69
|
+
service.emit("provider.auth.changed", {
|
|
70
|
+
provider,
|
|
71
|
+
connected: true
|
|
72
|
+
});
|
|
78
73
|
return c.json({
|
|
79
74
|
ok: true,
|
|
80
75
|
payload: {
|
|
81
76
|
success: true,
|
|
82
77
|
provider,
|
|
83
|
-
message: "OAuth login successful",
|
|
78
|
+
message: readiness?.state === "connected-degraded" ? "OAuth login successful, but capability setup is degraded" : "OAuth login successful",
|
|
84
79
|
expires: credentials.expires,
|
|
85
80
|
authUrl: authResult?.url,
|
|
86
81
|
deviceCode: authResult?.deviceCode,
|
|
87
82
|
verificationUri: authResult?.verificationUri,
|
|
88
83
|
instructions: authResult?.instructions,
|
|
89
84
|
usesCallbackServer: oauthProvider.usesCallbackServer ?? false,
|
|
90
|
-
manualCodeRequested
|
|
85
|
+
manualCodeRequested,
|
|
86
|
+
catalog,
|
|
87
|
+
readiness
|
|
91
88
|
}
|
|
92
89
|
});
|
|
93
90
|
} catch (err) {
|
|
@@ -101,16 +98,15 @@ function createOAuthHandler(_service) {
|
|
|
101
98
|
*/
|
|
102
99
|
oauth.get("/:provider", async (c) => {
|
|
103
100
|
const provider = c.req.param("provider");
|
|
104
|
-
const credentials = getOAuthCredentialsFromCache(provider);
|
|
105
101
|
const authState = await getProviderAuthState(provider);
|
|
106
102
|
const configured = await isProviderConfigured(provider);
|
|
107
103
|
return c.json({
|
|
108
104
|
ok: true,
|
|
109
105
|
payload: {
|
|
110
|
-
configured
|
|
106
|
+
configured,
|
|
111
107
|
authMode: authState.authMode,
|
|
112
108
|
authStatus: authState.authStatus,
|
|
113
|
-
expiresAt: authState.expiresAt
|
|
109
|
+
expiresAt: authState.expiresAt
|
|
114
110
|
}
|
|
115
111
|
});
|
|
116
112
|
});
|
|
@@ -120,8 +116,12 @@ function createOAuthHandler(_service) {
|
|
|
120
116
|
*/
|
|
121
117
|
oauth.delete("/:provider", async (c) => {
|
|
122
118
|
const provider = c.req.param("provider");
|
|
123
|
-
|
|
124
|
-
|
|
119
|
+
await disconnectProvider(provider);
|
|
120
|
+
service.emit("provider.auth.changed", {
|
|
121
|
+
provider,
|
|
122
|
+
connected: false
|
|
123
|
+
});
|
|
124
|
+
if (provider === "xopc-cloud") service.emit("model-catalog.updated", { modelCount: 0 });
|
|
125
125
|
return c.json({
|
|
126
126
|
ok: true,
|
|
127
127
|
payload: { disconnected: provider }
|
|
@@ -144,4 +144,4 @@ function createOAuthHandler(_service) {
|
|
|
144
144
|
return oauth;
|
|
145
145
|
}
|
|
146
146
|
//#endregion
|
|
147
|
-
export { createOAuthHandler
|
|
147
|
+
export { createOAuthHandler };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { validateWebchatAttachments, validateWebchatContent } from "../../chat-limits.js";
|
|
2
|
-
import { submitSessionInput } from "./session-input-handler.js";
|
|
2
|
+
import { replaceLatestSessionTurn, submitSessionInput } from "./session-input-handler.js";
|
|
3
3
|
//#region src/gateway/hono/routes/agent-stream.ts
|
|
4
4
|
function registerAgentStreamRoutes(authenticated, deps) {
|
|
5
5
|
const { service, chatRateLimitMiddleware } = deps;
|
|
@@ -36,6 +36,9 @@ function registerAgentStreamRoutes(authenticated, deps) {
|
|
|
36
36
|
authenticated.post("/api/sessions/:sessionKey/inputs", chatRateLimitMiddleware, async (c) => {
|
|
37
37
|
return submitSessionInput(c, deps, (c.req.param("sessionKey") ?? "").trim());
|
|
38
38
|
});
|
|
39
|
+
authenticated.post("/api/sessions/:sessionKey/turns/:turnId/replace", chatRateLimitMiddleware, async (c) => {
|
|
40
|
+
return replaceLatestSessionTurn(c, deps, (c.req.param("sessionKey") ?? "").trim(), (c.req.param("turnId") ?? "").trim());
|
|
41
|
+
});
|
|
39
42
|
authenticated.patch("/api/sessions/:sessionKey/inputs/:inputId", chatRateLimitMiddleware, async (c) => {
|
|
40
43
|
const sessionKey = (c.req.param("sessionKey") ?? "").trim();
|
|
41
44
|
const inputId = c.req.param("inputId")?.trim() ?? "";
|
|
@@ -3,8 +3,8 @@ import { ActivationPlanner } from "../../../extensions/activation-planner.js";
|
|
|
3
3
|
import { mergeActivationContext } from "../../../extensions/activation-context.js";
|
|
4
4
|
import { fetchRegistry, listExtensions, searchExtensions } from "../../../extensions/marketplace.js";
|
|
5
5
|
import { buildWhenContextSnapshot } from "../../../extensions/when-context.js";
|
|
6
|
-
import { createOAuthHandler } from "../oauth.js";
|
|
7
6
|
import { createOAuthAsyncHandler } from "../oauth-async.js";
|
|
7
|
+
import { createOAuthHandler } from "../oauth.js";
|
|
8
8
|
import { extensionAssetMimeType } from "../lib/extension-assets.js";
|
|
9
9
|
import { loadExtensionStore, saveExtensionStore } from "../lib/extension-store.js";
|
|
10
10
|
import { relative, resolve } from "node:path";
|
|
@@ -8,13 +8,12 @@ import { resolveComposioApiKey } from "../../../connectors/composio-sessions.js"
|
|
|
8
8
|
import { getConnectorLearningPlan } from "../../../connectors/learning-recipes.js";
|
|
9
9
|
import { listComposioConnectorCatalog } from "../../../connectors/composio-catalog.js";
|
|
10
10
|
import { createConnectorSetupSecretRequest, submitConnectorSetupSecret } from "../../../connectors/setup-secrets.js";
|
|
11
|
-
import { configureComposioApiKey, executeComposioTool, getComposioInstallationPolicy, getComposioToolkitScope, inspectComposioConnectorHealth, listComposioConnections, listComposioTools, refreshComposioConnection, revokeComposioConnection, setComposioToolkitScope, updateComposioConnection, updateComposioInstallationPolicy } from "../../../connectors/composio.js";
|
|
11
|
+
import { configureComposioApiKey, executeComposioTool, getComposioInstallationPolicy, getComposioToolkitAuthState, getComposioToolkitScope, inspectComposioConnectorHealth, listComposioConnections, listComposioTools, refreshComposioConnection, revokeComposioConnection, setComposioToolkitScope, updateComposioConnection, updateComposioInstallationPolicy } from "../../../connectors/composio.js";
|
|
12
12
|
import { listConnectorProviders } from "../../../connectors/providers.js";
|
|
13
13
|
import { getConnectorDefinition, listConnectorCatalog } from "../../../connectors/catalog.js";
|
|
14
14
|
import { listUnderstandingSourceGrants, revokeUnderstandingSourceGrant } from "../../../user-context/sources/repository.js";
|
|
15
15
|
import { recordConnectorHealthUsage } from "../../../connectors/usage.js";
|
|
16
16
|
import { getConnectorInstance, listConnectorInstances } from "../../../connectors/instances.js";
|
|
17
|
-
import { installConnector, installConnectorDefinition, uninstallConnector, updateConnectorConfig } from "../../../connectors/install.js";
|
|
18
17
|
import { startConnectorAuthorization } from "../../../connectors/auth-provider-registry.js";
|
|
19
18
|
import { composioLogoResponse } from "../../../connectors/composio-logo.js";
|
|
20
19
|
import { appendComposioTriggerEvent, listComposioTriggerEvents } from "../../../connectors/composio-triggers.js";
|
|
@@ -22,6 +21,7 @@ import { buildConnectedPeopleGraph } from "../../../knowledge/people-graph.js";
|
|
|
22
21
|
import "../../../knowledge/index.js";
|
|
23
22
|
import { ingestLocalFolderSource } from "../../../connectors/connected-source-ingestion.js";
|
|
24
23
|
import { previewConnectorDefinition, testConnectorInstance } from "../../../connectors/health.js";
|
|
24
|
+
import { installConnector, installConnectorDefinition, uninstallConnector, updateConnectorConfig } from "../../../connectors/install.js";
|
|
25
25
|
import { setConnectorEnabled } from "../../../connectors/lifecycle.js";
|
|
26
26
|
import { projectComposioConnectionStatus } from "../../../connectors/runtime-status.js";
|
|
27
27
|
//#region src/gateway/hono/routes/connectors.ts
|
|
@@ -314,6 +314,19 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
314
314
|
}, 400);
|
|
315
315
|
}
|
|
316
316
|
});
|
|
317
|
+
authenticated.get("/api/connectors/composio/:toolkit/auth-configs", async (c) => {
|
|
318
|
+
try {
|
|
319
|
+
return c.json({
|
|
320
|
+
ok: true,
|
|
321
|
+
payload: { auth: await getComposioToolkitAuthState(c.req.param("toolkit")) }
|
|
322
|
+
});
|
|
323
|
+
} catch (error) {
|
|
324
|
+
return c.json({
|
|
325
|
+
ok: false,
|
|
326
|
+
error: errorMessage(error)
|
|
327
|
+
}, 400);
|
|
328
|
+
}
|
|
329
|
+
});
|
|
317
330
|
authenticated.get("/api/connectors/composio/:toolkit/scope", async (c) => {
|
|
318
331
|
const toolkit = c.req.param("toolkit");
|
|
319
332
|
return c.json({
|
|
@@ -566,7 +579,7 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
566
579
|
error: `Unknown connector: ${connectorId}`
|
|
567
580
|
}, 404);
|
|
568
581
|
try {
|
|
569
|
-
const authorization = await startConnectorAuthorization(connector);
|
|
582
|
+
const authorization = await startConnectorAuthorization(connector, service.currentConfig);
|
|
570
583
|
return c.json({
|
|
571
584
|
ok: true,
|
|
572
585
|
payload: { authorization }
|
|
@@ -4,6 +4,7 @@ export interface AuthenticatedRouteDeps {
|
|
|
4
4
|
service: GatewayService;
|
|
5
5
|
strictRateLimitMiddleware: MiddlewareHandler;
|
|
6
6
|
chatRateLimitMiddleware: MiddlewareHandler;
|
|
7
|
+
mediaRateLimitMiddleware?: MiddlewareHandler;
|
|
7
8
|
taskRateLimitMiddleware?: MiddlewareHandler;
|
|
8
9
|
xopcCloudPollRateLimitMiddleware: MiddlewareHandler;
|
|
9
10
|
channelRateLimitMiddleware?: MiddlewareHandler;
|
|
@@ -22,6 +22,7 @@ async function multipart(c) {
|
|
|
22
22
|
}
|
|
23
23
|
function registerDiscussionRoutes(authenticated, deps) {
|
|
24
24
|
const { service, strictRateLimitMiddleware } = deps;
|
|
25
|
+
const mediaRateLimitMiddleware = deps.mediaRateLimitMiddleware ?? deps.chatRateLimitMiddleware ?? strictRateLimitMiddleware;
|
|
25
26
|
authenticated.get("/api/discussion-capture/settings", (c) => c.json(service.discussions.settings()));
|
|
26
27
|
authenticated.put("/api/discussion-capture/settings", strictRateLimitMiddleware, async (c) => {
|
|
27
28
|
const body = await c.req.json().catch(() => ({}));
|
|
@@ -76,7 +77,7 @@ function registerDiscussionRoutes(authenticated, deps) {
|
|
|
76
77
|
const transcript = service.discussions.transcript(c.req.param("id"));
|
|
77
78
|
return transcript ? c.json(transcript) : c.json({ error: "Discussion not found" }, 404);
|
|
78
79
|
});
|
|
79
|
-
authenticated.put("/api/discussions/:id/segments/:sequence",
|
|
80
|
+
authenticated.put("/api/discussions/:id/segments/:sequence", mediaRateLimitMiddleware, async (c) => {
|
|
80
81
|
const body = await multipart(c);
|
|
81
82
|
if (!body) return c.json({ error: "Invalid multipart body" }, 400);
|
|
82
83
|
const file = body.file;
|
|
@@ -139,7 +139,8 @@ const AUTHENTICATED_LAZY_ROUTE_BUNDLES = [
|
|
|
139
139
|
match: (path) => startsWithAny(path, [
|
|
140
140
|
"/api/models",
|
|
141
141
|
"/api/models-json",
|
|
142
|
-
"/api/providers"
|
|
142
|
+
"/api/providers",
|
|
143
|
+
"/api/capabilities/readiness"
|
|
143
144
|
]),
|
|
144
145
|
load: async () => {
|
|
145
146
|
const { registerModelsRoutes } = await import("./models.js");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { canonicalizeConfiguredMcpServer, normalizeConfiguredMcpServers } from "../../../config/mcp-config-normalize.js";
|
|
2
2
|
import { loadMergedBundleMcpConfig } from "../../../agent/mcp/bundle-mcp-config.js";
|
|
3
|
-
import { isManagedConnectorServer } from "../../../connectors/materialize.js";
|
|
4
3
|
import { getWorkspacePath } from "../../../config/workspace-path-helpers.js";
|
|
4
|
+
import { isManagedConnectorServer } from "../../../connectors/materialize.js";
|
|
5
5
|
import { listBundleMcpServerCapabilitiesForGateway, listBundleMcpServerToolsForGateway } from "../../../agent/mcp/bundle-mcp-gateway.js";
|
|
6
6
|
//#region src/gateway/hono/routes/mcp.ts
|
|
7
7
|
function registerMcpRoutes(authenticated, deps) {
|
|
@@ -6,7 +6,9 @@ import { getModelRegistry } from "../../../providers/model-registry.js";
|
|
|
6
6
|
import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
|
|
7
7
|
import "../../../providers/constants.js";
|
|
8
8
|
import { getProviderRegistry, init_plugin_registry } from "../../../providers/plugin-registry.js";
|
|
9
|
-
import { PROVIDER_META, getAllModels, getAllProviders, getAvailableModels, getProviderAuthState, init_providers, isProviderConfigured } from "../../../providers/index.js";
|
|
9
|
+
import { PROVIDER_META, getAllModels, getAllProviders, getAvailableModels, getProviderAuthState, init_providers, isProviderConfigured, isProviderConfiguredSync } from "../../../providers/index.js";
|
|
10
|
+
import { buildCapabilityPlansForConfig } from "../../../capabilities/readiness/from-config.js";
|
|
11
|
+
import "../../../capabilities/readiness/index.js";
|
|
10
12
|
import { getImageGenerationProvider, reloadImageGenerationProviders, resolveImageGenerationCredentialMode } from "../../../agent/image/generation/provider-registry.js";
|
|
11
13
|
import { SessionConfigStore } from "../../../session/config-store.js";
|
|
12
14
|
import { deleteCustomImageProvider, listCustomImageProviders, upsertCustomImageProvider } from "../../custom-image-providers.js";
|
|
@@ -14,6 +16,7 @@ import { getDomesticProviderPreset, getDomesticProviderPresetIds } from "../../.
|
|
|
14
16
|
import { getOnboardingFeaturedProviders, getProviderHint, getRecommendedModelsForProvider, isRecommendedModel, sortModelsForPicker, sortProvidersForPicker } from "../../../providers/presentation.js";
|
|
15
17
|
import { getAgentImageGenerationConfig, getImageGenerationCatalog, prepareImageGenerationSetup, verifyImageGenerationCredential } from "../../image-generation-setup.js";
|
|
16
18
|
import { discoverProviderModels, isProviderApiDiscoverable } from "../../../providers/model-discovery.js";
|
|
19
|
+
import { getXopcCloudCatalogCoordinator } from "../../../providers/xopc-cloud-catalog-coordinator.js";
|
|
17
20
|
import { respondStartupUnavailable } from "../lib/startup-unavailable.js";
|
|
18
21
|
import { auditModelReferences } from "../../../providers/model-reference-auditor.js";
|
|
19
22
|
import { XopcCloudAccountError, XopcCloudAccountService } from "../../../providers/xopc-cloud-account-service.js";
|
|
@@ -68,10 +71,61 @@ function registerModelsRoutes(authenticated, deps) {
|
|
|
68
71
|
const { service, strictRateLimitMiddleware } = deps;
|
|
69
72
|
const catalogSync = service.getModelCatalogSync();
|
|
70
73
|
const xopcCloudAccount = new XopcCloudAccountService();
|
|
71
|
-
authenticated.get("/api/models/catalog/status", (c) =>
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
74
|
+
authenticated.get("/api/models/catalog/status", (c) => {
|
|
75
|
+
const readiness = getXopcCloudCatalogCoordinator().snapshot();
|
|
76
|
+
return c.json({
|
|
77
|
+
ok: true,
|
|
78
|
+
payload: {
|
|
79
|
+
...catalogSync.getStatus(),
|
|
80
|
+
hydratedFromDisk: readiness.source === "disk",
|
|
81
|
+
stale: readiness.state === "stale",
|
|
82
|
+
fetchedAt: readiness.fetchedAt,
|
|
83
|
+
catalogVersion: readiness.catalogVersion,
|
|
84
|
+
lastRefreshError: readiness.error
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
authenticated.get("/api/capabilities/readiness", async (c) => {
|
|
89
|
+
const auth = await getProviderAuthState("xopc-cloud");
|
|
90
|
+
const catalog = getXopcCloudCatalogCoordinator().snapshot();
|
|
91
|
+
const authorized = auth.authStatus === "connected";
|
|
92
|
+
const capabilities = buildCapabilityPlansForConfig(service.currentConfig, { providerReady: (providerId) => providerId === "xopc-cloud" ? authorized : isProviderConfiguredSync(providerId) });
|
|
93
|
+
const issues = [
|
|
94
|
+
...auth.authStatus === "not_connected" ? [{
|
|
95
|
+
code: "oauth_not_connected",
|
|
96
|
+
capability: null
|
|
97
|
+
}] : [],
|
|
98
|
+
...auth.authStatus === "expired" ? [{
|
|
99
|
+
code: "oauth_expired_refresh_failed",
|
|
100
|
+
capability: null
|
|
101
|
+
}] : [],
|
|
102
|
+
...catalog.state === "unavailable" ? [{
|
|
103
|
+
code: "catalog_never_loaded",
|
|
104
|
+
capability: null
|
|
105
|
+
}] : [],
|
|
106
|
+
...catalog.state === "stale" ? [{
|
|
107
|
+
code: "catalog_stale",
|
|
108
|
+
capability: null
|
|
109
|
+
}] : [],
|
|
110
|
+
...Object.values(capabilities).filter((plan) => authorized && catalog.modelCount > 0 && plan.status === "unavailable").map((plan) => ({
|
|
111
|
+
code: "capability_not_published",
|
|
112
|
+
capability: plan.capability
|
|
113
|
+
}))
|
|
114
|
+
];
|
|
115
|
+
return c.json({
|
|
116
|
+
ok: true,
|
|
117
|
+
payload: {
|
|
118
|
+
provider: {
|
|
119
|
+
id: "xopc-cloud",
|
|
120
|
+
authorized,
|
|
121
|
+
authStatus: auth.authStatus,
|
|
122
|
+
catalog
|
|
123
|
+
},
|
|
124
|
+
capabilities,
|
|
125
|
+
issues
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
});
|
|
75
129
|
authenticated.get("/api/models/catalog", async (c) => {
|
|
76
130
|
const catalog = getModelCatalogStore().load();
|
|
77
131
|
const sessionConfigs = await new SessionConfigStore("").getAll();
|