@xopcai/xopc 0.0.114 → 0.0.115
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/feishu/src/outbound/media-load.js +1 -1
- package/dist/extensions/feishu/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
- package/dist/extensions/telegram/src/inbound-processor.js +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/src/update-offset-store.js +1 -1
- package/dist/extensions/telegram/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +2 -2
- package/dist/extensions/weixin/src/auth/accounts.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
- package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Fp-p7bP1.js → agent-avatar-dicebear-DVnBfANm.js} +1 -1
- package/dist/gateway/static/root/assets/agent-browser-settings-page-DPXc4hz8.js +6 -0
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CTJ0YnRQ.js +1 -0
- package/dist/gateway/static/root/assets/agents-zJXQfJ_W.js +71 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-v24i25Oj.js → app-management-settings-panel-DzGbdr04.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-ycbdJRuZ.js → appearance-settings-BQpPSTHD.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-CPjfyzSD.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-CJzSADJo.js → archive-plugin-CXu-Csep.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-BTAB4zGS.js → attachment-load-BAjgOoGY.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-DXR1-mct.js → binary-plugins-BSBgB2hO.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-CzQri9h2.js → block-editor-BpXw9TTR.js} +44 -44
- package/dist/gateway/static/root/assets/channels-settings-BbPUpzWB.js +1 -0
- package/dist/gateway/static/root/assets/{config-api-DRqjEvAx.js → config-api-NOoPiIYz.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-settings-CAXYMOdp.js +2 -0
- package/dist/gateway/static/root/assets/{cron-api-BXaZXv1o.js → cron-api-C9BOqAXd.js} +1 -1
- package/dist/gateway/static/root/assets/cron-page-DuUbBeKI.js +3 -0
- package/dist/gateway/static/root/assets/dreaming-settings-DQ4DtiK1.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-DSkqMYo7.js → extension-debug-page-D9kgUHCc.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-h2dGDbMN.js → extension-page-CGyhXqzR.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-hN99RhOi.js → extension-settings-page-DL8Xquqd.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-D9QqUtzZ.js → fetch-D0VXA932.js} +1 -1
- package/dist/gateway/static/root/assets/{format-interval-label-D6E687rG.js → format-interval-label-Be8SmgUw.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-CLt_SKTC.js → gateway-config-api-C-xjn__h.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-1PDi4lI0.js → gateway-settings-BMPwIjKI.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-N7Z_sz7p.js → gateway-startup-retry-DERUH61L.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-BJsyjJnF.js +1 -0
- package/dist/gateway/static/root/assets/goals-config-api-BPmqWk90.js +1 -0
- package/dist/gateway/static/root/assets/goals-page-BerDgIhw.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-ByTjeAto.js +1 -0
- package/dist/gateway/static/root/assets/{heartbeat-config-api-DGPadTw-.js → heartbeat-config-api-Bfdzr8oV.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-BHHAs8ZX.js → heartbeat-settings-TbHgcjTn.js} +1 -1
- package/dist/gateway/static/root/assets/{index-DefIdW9q.js → index-AkTrf6Pb.js} +56 -56
- package/dist/gateway/static/root/assets/index-fh5sXTj9.css +1 -0
- package/dist/gateway/static/root/assets/{interval-presets-CEklPQ_r.js → interval-presets-utKbuCRY.js} +1 -1
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-Ce_aQ8Iv.js → keyboard-shortcuts-settings-CjqS6c6V.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-DGXuPf5B.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-split-BMz3xPXO.js → markdown-split-DW8C47iB.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-BalOSoz9.js → media-plugins-D6HwDhDT.js} +1 -1
- package/dist/gateway/static/root/assets/messages-upgxw6Ub.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-Bot16nn7.js +2 -0
- package/dist/gateway/static/root/assets/note-detail-page-Brlyou8M.js +2 -0
- package/dist/gateway/static/root/assets/{note-image-lightbox-C5D1Q5mY.js → note-image-lightbox-pJM35Pz5.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-DvZ4pwc-.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-CYFR5U9l.js → preview-open-alternatives-CVwHuyN6.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BZEDmxbZ.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-BQ79Z5IP.js → save-bar-controls-Ba-UEk7x.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-Bgk6Emue.js → schedule-field-CNN9595U.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-DzS36TMa.js → schema-form-DnNMmtD5.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-DdGGlsfn.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DlkEkPf9.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-CdjFnSAy.js → settings-collapsible-section-CmOz80i5.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-DZLy_exu.js → settings-form-section-BmK7JJOV.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-DFPTrsPF.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-CYCCfgh4.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-_qRDr4g_.js → share-preview-page-Dp2qGrHC.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-Bff1pGd0.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-CJGKpBur.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-C6ocduTD.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-hqaBF5aG.js → system-settings-panel-5jrIEr5b.js} +1 -1
- package/dist/gateway/static/root/assets/{use-agent-defaults-form-zbVIQLOA.js → use-agent-defaults-form-BuiXLIs5.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-CbXq97rT.js → use-channel-catalog-CHlO8J9G.js} +1 -1
- package/dist/gateway/static/root/assets/{use-settings-tab-guard-DwS3drWK.js → use-settings-tab-guard-CW5JORnl.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DDoQyghO.js +1 -0
- package/dist/gateway/static/root/assets/{voice-player-store-DSuOd9zy.js → voice-player-store-DDDWYHvg.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-page.utils-C0Uq3xyq.js → workflow-page.utils-CKjeEGqx.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-B604ehHG.js +18 -0
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/gateway/static/root/logo.svg +4 -3
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.js +6 -6
- package/dist/src/agent/agent-scope.js +1 -1
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
- package/dist/src/agent/bootstrap/project-agents-context.js +1 -1
- package/dist/src/agent/context/workspace-seed.js +2 -2
- package/dist/src/agent/context/workspace-state.js +1 -1
- package/dist/src/agent/context/workspace.js +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js +8 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
- package/dist/src/agent/goals/checklist-judge.d.ts +1 -0
- package/dist/src/agent/goals/checklist-judge.js +3 -2
- package/dist/src/agent/goals/checklist-judge.js.map +1 -1
- package/dist/src/agent/goals/evaluate-turn.d.ts +1 -1
- package/dist/src/agent/goals/evaluate-turn.js +1 -0
- package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
- package/dist/src/agent/goals/goal-locale.js +2 -2
- package/dist/src/agent/goals/post-turn.d.ts +6 -1
- package/dist/src/agent/goals/post-turn.js +15 -6
- package/dist/src/agent/goals/post-turn.js.map +1 -1
- package/dist/src/agent/image/load-image-media.js +2 -2
- package/dist/src/agent/ipc/inbox.js +3 -3
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
- package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +1 -1
- package/dist/src/agent/memory/builtin-memory-store.js +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
- package/dist/src/agent/memory/dreaming/events.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
- package/dist/src/agent/memory/dreaming/preview.js +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/memory/memory-flush.js +1 -1
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/prompt/memory/index.js +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
- package/dist/src/agent/reply/post-compaction-context.js +1 -1
- package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
- package/dist/src/agent/sandbox/path-policy.js +2 -2
- package/dist/src/agent/service.js +4 -4
- package/dist/src/agent/session/session-inspector.js +1 -1
- package/dist/src/agent/skills/config.js +2 -2
- package/dist/src/agent/skills/filesystem-watcher.js +1 -1
- package/dist/src/agent/skills/hub-hash.js +2 -2
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +2 -2
- package/dist/src/agent/skills/index.js +2 -2
- package/dist/src/agent/skills/installer.js +2 -2
- package/dist/src/agent/skills/managed-store.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +1 -1
- package/dist/src/agent/skills/skill-manager.js +1 -1
- package/dist/src/agent/skills/skill-view-path.js +1 -1
- package/dist/src/agent/skills/test-framework.js +1 -1
- package/dist/src/agent/starter-agents.js +1 -1
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/find.js +1 -1
- package/dist/src/agent/tools/grep.js +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +1 -1
- package/dist/src/agent/tools/workflow-tool.js +1 -1
- package/dist/src/agent/workflow/catalog.js +1 -1
- package/dist/src/agent/workflow/snapshot.d.ts +10 -0
- package/dist/src/agent/workflow/snapshot.js +136 -1
- package/dist/src/agent/workflow/snapshot.js.map +1 -1
- package/dist/src/ai-assist/text-assist.js +1 -1
- package/dist/src/auth/credentials.js +2 -2
- package/dist/src/auth/profiles/store.js +2 -2
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/browser/cache-dir-policy.js +1 -1
- package/dist/src/browser/cdp-local-launcher.js +2 -2
- package/dist/src/browser/pipeline/source.js +1 -1
- package/dist/src/browser/providers/browser-ext-install.js +4 -4
- package/dist/src/browser/providers/cloakbrowser.js +5 -5
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/channels/catalog/channel-catalog-service.d.ts +2 -1
- package/dist/src/channels/catalog/channel-catalog-service.js +133 -16
- package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -1
- package/dist/src/channels/catalog/channel-catalog-types.d.ts +13 -0
- package/dist/src/channels/outbound/persist-store.js +1 -1
- package/dist/src/channels/pairing/allow-from-file.js +1 -1
- package/dist/src/channels/pairing/pairing-store.js +2 -2
- package/dist/src/chat-commands/agent-edit.js +2 -2
- package/dist/src/chat-commands/builtins/config.js +2 -2
- package/dist/src/cli/commands/config.js +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js +14 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
- package/dist/src/cli/commands/extension-create.js +1 -1
- package/dist/src/cli/commands/extension-dev.js +2 -2
- package/dist/src/cli/commands/extension-marketplace.js +2 -2
- package/dist/src/cli/commands/extension-pack.js +2 -2
- package/dist/src/cli/commands/extension.js +3 -3
- package/dist/src/cli/commands/gateway/logs.js +1 -1
- package/dist/src/cli/commands/image.js +1 -1
- package/dist/src/cli/commands/init.js +2 -2
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/skills-test.js +1 -1
- package/dist/src/cli/templates.js +1 -1
- package/dist/src/cli/utils/gateway-client.js +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +2 -2
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/agent-typed-models.js +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +7 -7
- package/dist/src/config/loader.js +4 -4
- package/dist/src/config/models-json.js +2 -2
- package/dist/src/config/paths-state.js +1 -1
- package/dist/src/config/paths.js +1 -1
- package/dist/src/config/profile.js +1 -1
- package/dist/src/config/reload.js +1 -1
- package/dist/src/config/schema.d.ts +8 -0
- package/dist/src/config/schema.js +7 -0
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/web-patch.d.ts +1 -0
- package/dist/src/config/web-patch.js +1 -0
- package/dist/src/config/web-patch.js.map +1 -1
- package/dist/src/config/workspace-path.js +1 -1
- package/dist/src/cron/executor.js +1 -1
- package/dist/src/cron/service.js +1 -1
- package/dist/src/daemon/constants.js +1 -1
- package/dist/src/daemon/install-plan.js +2 -2
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/schtasks.js +2 -2
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/extensions/bundle-mcp.js +1 -1
- package/dist/src/extensions/discover-extensions.js +2 -2
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/install.js +2 -2
- package/dist/src/extensions/loader.js +2 -2
- package/dist/src/extensions/lockfile.js +3 -3
- package/dist/src/extensions/security.js +1 -1
- package/dist/src/extensions/update.js +2 -2
- package/dist/src/gateway/agents-admin.js +2 -2
- package/dist/src/gateway/file-path-classifier.js +2 -2
- package/dist/src/gateway/hono/app.js +5 -1
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -1
- package/dist/src/gateway/hono/lib/config-payload.js +7 -4
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +2 -2
- package/dist/src/gateway/hono/lib/static-ui.js +2 -2
- package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js +19 -5
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/channels.js +18 -14
- package/dist/src/gateway/hono/routes/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
- package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
- package/dist/src/gateway/hono/routes/dreaming.js +1 -1
- package/dist/src/gateway/hono/routes/host-fs.js +2 -2
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/shares.js +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +2 -2
- package/dist/src/gateway/lock.js +3 -3
- package/dist/src/gateway/ports.js +1 -1
- 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/rate-limit/buckets.js.map +1 -1
- package/dist/src/gateway/service/config-coordinator.js +1 -1
- package/dist/src/gateway/service/marketplace-service.js +2 -2
- package/dist/src/gateway/service.js +4 -4
- package/dist/src/gateway/workspace-fs-file-list.js +1 -1
- package/dist/src/goals/goal-workflow-judge.js +2 -2
- package/dist/src/i18n/goals-bundle.js +1 -1
- package/dist/src/i18n/index.js +1 -1
- package/dist/src/i18n/share-tool-bundle.js +2 -2
- package/dist/src/infra/brew.js +1 -1
- package/dist/src/infra/package-json.js +1 -1
- package/dist/src/infra/package-update-steps.js +1 -1
- package/dist/src/infra/path-env.js +2 -2
- package/dist/src/infra/restart.js +1 -1
- package/dist/src/infra/stable-node-path.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-global.js +1 -1
- package/dist/src/infra/update-lock.js +2 -2
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/infra/update-startup.js +1 -1
- package/dist/src/infra/write-file-atomic.js +2 -2
- package/dist/src/media/store.js +1 -1
- package/dist/src/notes/agent-context.js +1 -1
- package/dist/src/notes/service.js +1 -1
- package/dist/src/notes/store.js +2 -2
- package/dist/src/project-trust/trust-store.js +2 -2
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/index.js +1 -1
- package/dist/src/providers/model-registry.js +4 -4
- package/dist/src/session/init-session-turn.js +1 -1
- package/dist/src/session/resolve-session.js +1 -1
- package/dist/src/session/session-title.js +2 -2
- package/dist/src/session/store.js +1 -1
- package/dist/src/share/share-auto.js +2 -2
- package/dist/src/share/share-store.js +3 -3
- package/dist/src/share/share-thumbnail.js +2 -2
- package/dist/src/share/share-zip.js +1 -1
- package/dist/src/share/site-share-store.js +3 -3
- package/dist/src/share/site-static-serve.js +1 -1
- package/dist/src/storage/sqlite/connection.js +1 -1
- package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
- package/dist/src/storage/sqlite/migrations/discover.js +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +8 -1
- package/dist/src/tui/backends/embedded-backend.js +73 -0
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +2 -1
- package/dist/src/tui/backends/gateway-sse-backend.js +24 -0
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/clipboard-image.js +3 -3
- package/dist/src/tui/components/chat-log.d.ts +2 -0
- package/dist/src/tui/components/chat-log.js +19 -0
- package/dist/src/tui/components/chat-log.js.map +1 -1
- package/dist/src/tui/extension-host/autocomplete.d.ts +3 -2
- package/dist/src/tui/extension-host/autocomplete.js +17 -3
- package/dist/src/tui/extension-host/autocomplete.js.map +1 -1
- package/dist/src/tui/extension-host/load-extensions.js +1 -1
- package/dist/src/tui/extension-host/runtime.d.ts +5 -0
- package/dist/src/tui/extension-host/runtime.js +1 -1
- package/dist/src/tui/extension-host/runtime.js.map +1 -1
- package/dist/src/tui/theme-manager.js +1 -1
- package/dist/src/tui/tui-backend.d.ts +14 -0
- package/dist/src/tui/tui-command-formatters.js +4 -4
- package/dist/src/tui/tui-commands.d.ts +16 -3
- package/dist/src/tui/tui-commands.js +49 -21
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-keybindings-file.js +1 -1
- package/dist/src/tui/tui-scoped-models.js +2 -2
- package/dist/src/tui/tui-settings.js +1 -1
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui-startup-text.js +1 -1
- package/dist/src/tui/tui-startup-text.js.map +1 -1
- package/dist/src/tui/tui.js +78 -7
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/tunnel/frpc-binary.js +4 -4
- package/dist/src/tunnel/frpc-config.js +1 -1
- package/dist/src/tunnel/frpc-extract.js +1 -1
- package/dist/src/tunnel/tunnel-state.js +1 -1
- package/dist/src/utils/logger/audit.js +1 -1
- package/dist/src/utils/logger/log-store.js +1 -1
- package/dist/src/utils/logger/rotation.js +1 -1
- package/dist/src/utils/logger/streams.js +1 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +2 -2
- package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +1 -1
- package/dist/src/workflows/store/event-store.js +1 -1
- package/dist/src/workflows/store/run-store.js +1 -1
- package/package.json +1 -1
- package/dist/gateway/static/root/assets/agent-browser-settings-page-CWh7trjd.js +0 -6
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-kC8OuLoj.js +0 -1
- package/dist/gateway/static/root/assets/agents-DJWG26Si.js +0 -71
- package/dist/gateway/static/root/assets/apps-page-0V3DXZ7J.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-CIKOkYdO.js +0 -1
- package/dist/gateway/static/root/assets/connectors-settings-ClrDS5jH.js +0 -2
- package/dist/gateway/static/root/assets/cron-page-Chi_4u4P.js +0 -3
- package/dist/gateway/static/root/assets/dreaming-settings-B0_rs2tj.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-D_wwXL-t.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-DZ2toZ8y.js +0 -2
- package/dist/gateway/static/root/assets/goals-settings-LFlwtIKE.js +0 -1
- package/dist/gateway/static/root/assets/index-DzmWBkq-.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-j_D2QTuQ.js +0 -2
- package/dist/gateway/static/root/assets/messages-BN_WiUg0.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-CMH_TmZz.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-page-O18BrQPq.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-B_ZYCmY9.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CwKgWixY.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-C4fcD-7B.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-Ad2OJ86w.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-D2BMY5wo.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-aWwxl_E1.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-DUE83uIf.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-mWKJcrog.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-0Sx1Q58n.js +0 -2
- package/dist/gateway/static/root/assets/voice-api-key-field-D6HR0hR2.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-DW0fmWhQ.js +0 -18
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buildChannelCatalogForConfig, buildChannelCatalogFromSnapshot,
|
|
1
|
+
import { buildChannelCatalogForConfig, buildChannelCatalogFromSnapshot, getChannelSetupStatus, init_channel_catalog_service } from "../../../channels/catalog/channel-catalog-service.js";
|
|
2
2
|
import { approveChannelPairing, approveChannelPairingBySender, dismissChannelPairingPending, listChannelPairingState, listChannelPairingSummary, revokeChannelPairingPaired } from "../../../channels/pairing/pairing-service.js";
|
|
3
3
|
//#region src/gateway/hono/routes/channels.ts
|
|
4
4
|
init_channel_catalog_service();
|
|
@@ -16,20 +16,24 @@ function localeFromRequest(c) {
|
|
|
16
16
|
}
|
|
17
17
|
function registerChannelRoutes(authenticated, deps) {
|
|
18
18
|
const { service, strictRateLimitMiddleware } = deps;
|
|
19
|
+
const channelRateLimitMiddleware = deps.channelRateLimitMiddleware ?? strictRateLimitMiddleware;
|
|
19
20
|
authenticated.get("/api/channels/catalog", (c) => {
|
|
20
21
|
const snapshot = service.getExtensionLoader()?.getManifestSnapshot();
|
|
21
22
|
const locale = localeFromRequest(c);
|
|
22
23
|
const catalog = snapshot ? buildChannelCatalogFromSnapshot(snapshot, { locale }) : buildChannelCatalogForConfig(service.currentConfig, { locale });
|
|
23
|
-
const channelsCfg = service.currentConfig.channels;
|
|
24
24
|
const running = new Set(service.getRunningChannelIds());
|
|
25
25
|
return c.json({
|
|
26
26
|
ok: true,
|
|
27
|
-
payload: { channels: catalog.entries.map((entry) =>
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
payload: { channels: catalog.entries.map((entry) => {
|
|
28
|
+
const setupStatus = getChannelSetupStatus(service.currentConfig, entry.id, entry);
|
|
29
|
+
return {
|
|
30
|
+
...entry,
|
|
31
|
+
enabled: setupStatus.enabled,
|
|
32
|
+
configured: setupStatus.ready,
|
|
33
|
+
setupStatus,
|
|
34
|
+
runtime: running.has(entry.id) ? "loaded" : "missing"
|
|
35
|
+
};
|
|
36
|
+
}) }
|
|
33
37
|
});
|
|
34
38
|
});
|
|
35
39
|
authenticated.get("/api/channels/status", (c) => {
|
|
@@ -61,7 +65,7 @@ function registerChannelRoutes(authenticated, deps) {
|
|
|
61
65
|
payload: { config: value }
|
|
62
66
|
});
|
|
63
67
|
});
|
|
64
|
-
authenticated.post("/api/channels/:channelId/actions/:actionId",
|
|
68
|
+
authenticated.post("/api/channels/:channelId/actions/:actionId", channelRateLimitMiddleware, async (c) => {
|
|
65
69
|
const channel = channelIdParam(c.req.param("channelId"));
|
|
66
70
|
const action = c.req.param("actionId")?.trim() ?? "";
|
|
67
71
|
if (!channel || !action) return c.json({
|
|
@@ -162,7 +166,7 @@ function registerChannelRoutes(authenticated, deps) {
|
|
|
162
166
|
payload: { summary }
|
|
163
167
|
});
|
|
164
168
|
});
|
|
165
|
-
authenticated.post("/api/channels/:channelId/pairing/approve",
|
|
169
|
+
authenticated.post("/api/channels/:channelId/pairing/approve", channelRateLimitMiddleware, async (c) => {
|
|
166
170
|
const channel = channelIdParam(c.req.param("channelId"));
|
|
167
171
|
const body = await c.req.json().catch(() => ({}));
|
|
168
172
|
const result = approveChannelPairing({
|
|
@@ -185,7 +189,7 @@ function registerChannelRoutes(authenticated, deps) {
|
|
|
185
189
|
}
|
|
186
190
|
});
|
|
187
191
|
});
|
|
188
|
-
authenticated.post("/api/channels/:channelId/pairing/approve-sender",
|
|
192
|
+
authenticated.post("/api/channels/:channelId/pairing/approve-sender", channelRateLimitMiddleware, async (c) => {
|
|
189
193
|
const channel = channelIdParam(c.req.param("channelId"));
|
|
190
194
|
const body = await c.req.json().catch(() => ({}));
|
|
191
195
|
const result = approveChannelPairingBySender({
|
|
@@ -208,7 +212,7 @@ function registerChannelRoutes(authenticated, deps) {
|
|
|
208
212
|
}
|
|
209
213
|
});
|
|
210
214
|
});
|
|
211
|
-
authenticated.delete("/api/channels/:channelId/pairing/paired",
|
|
215
|
+
authenticated.delete("/api/channels/:channelId/pairing/paired", channelRateLimitMiddleware, async (c) => {
|
|
212
216
|
const channel = channelIdParam(c.req.param("channelId"));
|
|
213
217
|
const body = await c.req.json().catch(() => ({}));
|
|
214
218
|
const result = revokeChannelPairingPaired({
|
|
@@ -228,7 +232,7 @@ function registerChannelRoutes(authenticated, deps) {
|
|
|
228
232
|
payload: { changed: result.changed }
|
|
229
233
|
});
|
|
230
234
|
});
|
|
231
|
-
authenticated.delete("/api/channels/:channelId/pairing/pending",
|
|
235
|
+
authenticated.delete("/api/channels/:channelId/pairing/pending", channelRateLimitMiddleware, async (c) => {
|
|
232
236
|
const channel = channelIdParam(c.req.param("channelId"));
|
|
233
237
|
const body = await c.req.json().catch(() => ({}));
|
|
234
238
|
const result = dismissChannelPairingPending({
|
|
@@ -261,7 +265,7 @@ function registerChannelRoutes(authenticated, deps) {
|
|
|
261
265
|
payload: { checks }
|
|
262
266
|
});
|
|
263
267
|
});
|
|
264
|
-
authenticated.post("/api/channels/:channelId/restart",
|
|
268
|
+
authenticated.post("/api/channels/:channelId/restart", channelRateLimitMiddleware, async (c) => {
|
|
265
269
|
const channel = channelIdParam(c.req.param("channelId"));
|
|
266
270
|
await service.restartChannel(channel);
|
|
267
271
|
return c.json({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channels.js","names":[],"sources":["../../../../../src/gateway/hono/routes/channels.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport {\n approveChannelPairing,\n approveChannelPairingBySender,\n dismissChannelPairingPending,\n listChannelPairingState,\n listChannelPairingSummary,\n revokeChannelPairingPaired,\n} from '../../../channels/pairing/pairing-service.js';\nimport {\n buildChannelCatalogForConfig,\n buildChannelCatalogFromSnapshot,\n isChannelConfigured,\n} from '../../../channels/catalog/channel-catalog-service.js';\nimport type { Config } from '../../../config/index.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport type { ChannelRuntimeActionPayload } from '../../../channels/plugins/types.adapters.js';\n\nfunction channelIdParam(raw: string | undefined): string {\n return (raw ?? '').trim().toLowerCase();\n}\n\nfunction accountIdFromQuery(raw: string | undefined): string {\n return raw?.trim() || 'default';\n}\n\nfunction actionPayloadChangedConfig(payload: ChannelRuntimeActionPayload | undefined): boolean {\n return Boolean(payload && 'configChanged' in payload && payload.configChanged === true);\n}\n\nfunction localeFromRequest(c: { req: { query(name: string): string | undefined; header(name: string): string | undefined } }): string | undefined {\n return c.req.query('locale') ?? c.req.header('X-XOPC-Locale') ?? c.req.header('Accept-Language')?.split(',')[0];\n}\n\nexport function registerChannelRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n authenticated.get('/api/channels/catalog', (c) => {\n const snapshot = service.getExtensionLoader()?.getManifestSnapshot();\n const locale = localeFromRequest(c);\n const catalog = snapshot\n ? buildChannelCatalogFromSnapshot(snapshot, { locale })\n : buildChannelCatalogForConfig(service.currentConfig, { locale });\n const channelsCfg = service.currentConfig.channels as Record<string, { enabled?: boolean } | undefined> | undefined;\n const running = new Set(service.getRunningChannelIds());\n return c.json({\n ok: true,\n payload: {\n channels: catalog.entries.map((entry) => ({\n ...entry,\n enabled: channelsCfg?.[entry.id]?.enabled === true,\n configured: isChannelConfigured(service.currentConfig, entry.id),\n runtime: running.has(entry.id) ? 'loaded' : 'missing',\n })),\n },\n });\n });\n\n authenticated.get('/api/channels/status', (c) => {\n const channels = service.getChannelsStatus();\n return c.json({ ok: true, payload: { channels } });\n });\n\n authenticated.get('/api/channels/meta', (c) => {\n const channels = service.getChannelsHubMeta();\n return c.json({ ok: true, payload: { channels } });\n });\n\n authenticated.get('/api/channels/:channelId/config', (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n if (!channel) {\n return c.json({ ok: false, error: { code: 'BAD_REQUEST', message: 'Missing channel id' } }, 400);\n }\n const plugin = service.getChannelRuntimePlugin(channel);\n const value =\n plugin?.configSurface?.buildConfigSurface(service.currentConfig) ??\n (service.currentConfig.channels as Record<string, unknown> | undefined)?.[channel] ??\n {};\n return c.json({ ok: true, payload: { config: value } });\n });\n\n authenticated.post('/api/channels/:channelId/actions/:actionId', strictRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const action = c.req.param('actionId')?.trim() ?? '';\n if (!channel || !action) {\n return c.json({ ok: false, error: { code: 'BAD_REQUEST', message: 'Missing channel/action id' } }, 400);\n }\n const plugin = await service.ensureChannelRuntimePlugin(channel);\n if (!plugin) {\n return c.json({ ok: false, error: { code: 'CHANNEL_RUNTIME_MISSING', message: 'Channel runtime is not loaded' } }, 404);\n }\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : undefined;\n const input = body && typeof body === 'object' ? (body as { input?: unknown }).input : undefined;\n\n if (action === 'doctor.run' && plugin.doctor) {\n const checks = await plugin.doctor.check({ cfg: service.currentConfig, locale: localeFromRequest(c) });\n return c.json({ ok: true, payload: { type: 'diagnostics', checks } });\n }\n\n if (plugin.runtimeActions) {\n const result = await plugin.runtimeActions.runAction({\n cfg: service.currentConfig,\n locale: localeFromRequest(c),\n actionId: action,\n accountId,\n input,\n });\n if (!result.ok) {\n return c.json({ ok: false, error: { code: 'CHANNEL_ACTION_FAILED', message: result.message ?? 'Channel action failed' } }, 400);\n }\n if (result.nextConfig) {\n const saved = await service.saveConfig(result.nextConfig);\n if (!saved.saved) {\n return c.json({ ok: false, error: { code: 'CHANNEL_ACTION_FAILED', message: saved.error ?? 'Failed to save channel config' } }, 500);\n }\n } else if (actionPayloadChangedConfig(result.payload)) {\n await service.reloadConfig();\n }\n return c.json({ ok: true, payload: result.payload ?? {} });\n }\n\n return c.json(\n {\n ok: false,\n error: {\n code: 'ACTION_NOT_IMPLEMENTED',\n message: `Channel action \"${channel}.${action}\" is not implemented by the runtime adapter.`,\n },\n },\n 501,\n );\n });\n\n authenticated.get('/api/channels/:channelId/pairing', (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n if (!channel) {\n return c.json({ ok: false, error: { code: 'BAD_REQUEST', message: 'Missing channel id' } }, 400);\n }\n const accountId = accountIdFromQuery(c.req.query('account'));\n const config = service.currentConfig as Config | undefined;\n const state = listChannelPairingState({ channel, accountId, config });\n return c.json({ ok: true, payload: state });\n });\n\n authenticated.get('/api/channels/pairing/summary', (c) => {\n const config = service.currentConfig as Config | undefined;\n const summary = listChannelPairingSummary(config);\n return c.json({ ok: true, payload: { summary } });\n });\n\n authenticated.post('/api/channels/:channelId/pairing/approve', strictRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : 'default';\n const code =\n body && typeof body === 'object' && typeof (body as { code?: unknown }).code === 'string'\n ? (body as { code: string }).code.trim()\n : '';\n const result = approveChannelPairing({ channel, accountId, code });\n if (result.ok === false) {\n return c.json({ ok: false, error: { code: 'PAIRING_INVALID', message: result.error } }, 400);\n }\n return c.json({ ok: true, payload: { senderId: result.senderId, alreadyPaired: result.alreadyPaired } });\n });\n\n authenticated.post('/api/channels/:channelId/pairing/approve-sender', strictRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : 'default';\n const senderId =\n body && typeof body === 'object' && typeof (body as { senderId?: unknown }).senderId === 'string'\n ? (body as { senderId: string }).senderId.trim()\n : '';\n const result = approveChannelPairingBySender({ channel, accountId, senderId });\n if (result.ok === false) {\n return c.json({ ok: false, error: { code: 'PAIRING_INVALID', message: result.error } }, 400);\n }\n return c.json({ ok: true, payload: { senderId: result.senderId, alreadyPaired: result.alreadyPaired } });\n });\n\n authenticated.delete('/api/channels/:channelId/pairing/paired', strictRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : 'default';\n const senderId =\n body && typeof body === 'object' && typeof (body as { senderId?: unknown }).senderId === 'string'\n ? (body as { senderId: string }).senderId.trim()\n : '';\n const result = revokeChannelPairingPaired({ channel, accountId, senderId });\n if (result.ok === false) {\n return c.json({ ok: false, error: { code: 'BAD_REQUEST', message: result.error } }, 400);\n }\n return c.json({ ok: true, payload: { changed: result.changed } });\n });\n\n authenticated.delete('/api/channels/:channelId/pairing/pending', strictRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : 'default';\n const senderId =\n body && typeof body === 'object' && typeof (body as { senderId?: unknown }).senderId === 'string'\n ? (body as { senderId: string }).senderId.trim()\n : '';\n const result = dismissChannelPairingPending({ channel, accountId, senderId });\n if (result.ok === false) {\n return c.json({ ok: false, error: { code: 'PAIRING_INVALID', message: result.error } }, 400);\n }\n return c.json({ ok: true, payload: { senderId: result.senderId } });\n });\n\n authenticated.get('/api/channels/:channelId/doctor', async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const plugin = service.getChannelRuntimePlugin(channel);\n if (!plugin?.doctor) {\n return c.json({ ok: true, payload: { checks: [] } });\n }\n const checks = await plugin.doctor.check({ cfg: service.currentConfig });\n return c.json({ ok: true, payload: { checks } });\n });\n\n authenticated.post('/api/channels/:channelId/restart', strictRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n await service.restartChannel(channel);\n return c.json({ ok: true, payload: { restarted: true } });\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"channels.js","names":[],"sources":["../../../../../src/gateway/hono/routes/channels.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport {\n approveChannelPairing,\n approveChannelPairingBySender,\n dismissChannelPairingPending,\n listChannelPairingState,\n listChannelPairingSummary,\n revokeChannelPairingPaired,\n} from '../../../channels/pairing/pairing-service.js';\nimport {\n buildChannelCatalogForConfig,\n buildChannelCatalogFromSnapshot,\n getChannelSetupStatus,\n} from '../../../channels/catalog/channel-catalog-service.js';\nimport type { Config } from '../../../config/index.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport type { ChannelRuntimeActionPayload } from '../../../channels/plugins/types.adapters.js';\n\nfunction channelIdParam(raw: string | undefined): string {\n return (raw ?? '').trim().toLowerCase();\n}\n\nfunction accountIdFromQuery(raw: string | undefined): string {\n return raw?.trim() || 'default';\n}\n\nfunction actionPayloadChangedConfig(payload: ChannelRuntimeActionPayload | undefined): boolean {\n return Boolean(payload && 'configChanged' in payload && payload.configChanged === true);\n}\n\nfunction localeFromRequest(c: { req: { query(name: string): string | undefined; header(name: string): string | undefined } }): string | undefined {\n return c.req.query('locale') ?? c.req.header('X-XOPC-Locale') ?? c.req.header('Accept-Language')?.split(',')[0];\n}\n\nexport function registerChannelRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n const channelRateLimitMiddleware = deps.channelRateLimitMiddleware ?? strictRateLimitMiddleware;\n\n authenticated.get('/api/channels/catalog', (c) => {\n const snapshot = service.getExtensionLoader()?.getManifestSnapshot();\n const locale = localeFromRequest(c);\n const catalog = snapshot\n ? buildChannelCatalogFromSnapshot(snapshot, { locale })\n : buildChannelCatalogForConfig(service.currentConfig, { locale });\n const running = new Set(service.getRunningChannelIds());\n return c.json({\n ok: true,\n payload: {\n channels: catalog.entries.map((entry) => {\n const setupStatus = getChannelSetupStatus(service.currentConfig, entry.id, entry);\n return {\n ...entry,\n enabled: setupStatus.enabled,\n configured: setupStatus.ready,\n setupStatus,\n runtime: running.has(entry.id) ? 'loaded' : 'missing',\n };\n }),\n },\n });\n });\n\n authenticated.get('/api/channels/status', (c) => {\n const channels = service.getChannelsStatus();\n return c.json({ ok: true, payload: { channels } });\n });\n\n authenticated.get('/api/channels/meta', (c) => {\n const channels = service.getChannelsHubMeta();\n return c.json({ ok: true, payload: { channels } });\n });\n\n authenticated.get('/api/channels/:channelId/config', (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n if (!channel) {\n return c.json({ ok: false, error: { code: 'BAD_REQUEST', message: 'Missing channel id' } }, 400);\n }\n const plugin = service.getChannelRuntimePlugin(channel);\n const value =\n plugin?.configSurface?.buildConfigSurface(service.currentConfig) ??\n (service.currentConfig.channels as Record<string, unknown> | undefined)?.[channel] ??\n {};\n return c.json({ ok: true, payload: { config: value } });\n });\n\n authenticated.post('/api/channels/:channelId/actions/:actionId', channelRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const action = c.req.param('actionId')?.trim() ?? '';\n if (!channel || !action) {\n return c.json({ ok: false, error: { code: 'BAD_REQUEST', message: 'Missing channel/action id' } }, 400);\n }\n const plugin = await service.ensureChannelRuntimePlugin(channel);\n if (!plugin) {\n return c.json({ ok: false, error: { code: 'CHANNEL_RUNTIME_MISSING', message: 'Channel runtime is not loaded' } }, 404);\n }\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : undefined;\n const input = body && typeof body === 'object' ? (body as { input?: unknown }).input : undefined;\n\n if (action === 'doctor.run' && plugin.doctor) {\n const checks = await plugin.doctor.check({ cfg: service.currentConfig, locale: localeFromRequest(c) });\n return c.json({ ok: true, payload: { type: 'diagnostics', checks } });\n }\n\n if (plugin.runtimeActions) {\n const result = await plugin.runtimeActions.runAction({\n cfg: service.currentConfig,\n locale: localeFromRequest(c),\n actionId: action,\n accountId,\n input,\n });\n if (!result.ok) {\n return c.json({ ok: false, error: { code: 'CHANNEL_ACTION_FAILED', message: result.message ?? 'Channel action failed' } }, 400);\n }\n if (result.nextConfig) {\n const saved = await service.saveConfig(result.nextConfig);\n if (!saved.saved) {\n return c.json({ ok: false, error: { code: 'CHANNEL_ACTION_FAILED', message: saved.error ?? 'Failed to save channel config' } }, 500);\n }\n } else if (actionPayloadChangedConfig(result.payload)) {\n await service.reloadConfig();\n }\n return c.json({ ok: true, payload: result.payload ?? {} });\n }\n\n return c.json(\n {\n ok: false,\n error: {\n code: 'ACTION_NOT_IMPLEMENTED',\n message: `Channel action \"${channel}.${action}\" is not implemented by the runtime adapter.`,\n },\n },\n 501,\n );\n });\n\n authenticated.get('/api/channels/:channelId/pairing', (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n if (!channel) {\n return c.json({ ok: false, error: { code: 'BAD_REQUEST', message: 'Missing channel id' } }, 400);\n }\n const accountId = accountIdFromQuery(c.req.query('account'));\n const config = service.currentConfig as Config | undefined;\n const state = listChannelPairingState({ channel, accountId, config });\n return c.json({ ok: true, payload: state });\n });\n\n authenticated.get('/api/channels/pairing/summary', (c) => {\n const config = service.currentConfig as Config | undefined;\n const summary = listChannelPairingSummary(config);\n return c.json({ ok: true, payload: { summary } });\n });\n\n authenticated.post('/api/channels/:channelId/pairing/approve', channelRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : 'default';\n const code =\n body && typeof body === 'object' && typeof (body as { code?: unknown }).code === 'string'\n ? (body as { code: string }).code.trim()\n : '';\n const result = approveChannelPairing({ channel, accountId, code });\n if (result.ok === false) {\n return c.json({ ok: false, error: { code: 'PAIRING_INVALID', message: result.error } }, 400);\n }\n return c.json({ ok: true, payload: { senderId: result.senderId, alreadyPaired: result.alreadyPaired } });\n });\n\n authenticated.post('/api/channels/:channelId/pairing/approve-sender', channelRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : 'default';\n const senderId =\n body && typeof body === 'object' && typeof (body as { senderId?: unknown }).senderId === 'string'\n ? (body as { senderId: string }).senderId.trim()\n : '';\n const result = approveChannelPairingBySender({ channel, accountId, senderId });\n if (result.ok === false) {\n return c.json({ ok: false, error: { code: 'PAIRING_INVALID', message: result.error } }, 400);\n }\n return c.json({ ok: true, payload: { senderId: result.senderId, alreadyPaired: result.alreadyPaired } });\n });\n\n authenticated.delete('/api/channels/:channelId/pairing/paired', channelRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : 'default';\n const senderId =\n body && typeof body === 'object' && typeof (body as { senderId?: unknown }).senderId === 'string'\n ? (body as { senderId: string }).senderId.trim()\n : '';\n const result = revokeChannelPairingPaired({ channel, accountId, senderId });\n if (result.ok === false) {\n return c.json({ ok: false, error: { code: 'BAD_REQUEST', message: result.error } }, 400);\n }\n return c.json({ ok: true, payload: { changed: result.changed } });\n });\n\n authenticated.delete('/api/channels/:channelId/pairing/pending', channelRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : 'default';\n const senderId =\n body && typeof body === 'object' && typeof (body as { senderId?: unknown }).senderId === 'string'\n ? (body as { senderId: string }).senderId.trim()\n : '';\n const result = dismissChannelPairingPending({ channel, accountId, senderId });\n if (result.ok === false) {\n return c.json({ ok: false, error: { code: 'PAIRING_INVALID', message: result.error } }, 400);\n }\n return c.json({ ok: true, payload: { senderId: result.senderId } });\n });\n\n authenticated.get('/api/channels/:channelId/doctor', async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const plugin = service.getChannelRuntimePlugin(channel);\n if (!plugin?.doctor) {\n return c.json({ ok: true, payload: { checks: [] } });\n }\n const checks = await plugin.doctor.check({ cfg: service.currentConfig });\n return c.json({ ok: true, payload: { checks } });\n });\n\n authenticated.post('/api/channels/:channelId/restart', channelRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n await service.restartChannel(channel);\n return c.json({ ok: true, payload: { restarted: true } });\n });\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { CredentialResolver, init_credentials } from "../../../../auth/credentials.js";
|
|
2
1
|
import { BindingsConfigSchema, McpConfigSchema, init_schema } from "../../../../config/schema.js";
|
|
2
|
+
import { CredentialResolver, init_credentials } from "../../../../auth/credentials.js";
|
|
3
3
|
import { canonicalizeConfiguredMcpServer } from "../../../../config/mcp-config-normalize.js";
|
|
4
4
|
import { mergeCronConfigPatch, mergeGatewaySkillsMarketplacePatch, mergeGoalsConfigPatch, mergeSessionConfigPatch, mergeUpdateConfigPatch } from "../../../../config/web-patch.js";
|
|
5
5
|
import { assertGatewayAuthConfigured, resolveGatewayAuth } from "../../../auth.js";
|
|
@@ -5,8 +5,8 @@ import { parseDreamingLastRunFile } from "../../../agent/memory/dreaming/last-ru
|
|
|
5
5
|
import { readDreamingEvents } from "../../../agent/memory/dreaming/events.js";
|
|
6
6
|
import { getWorkspacePath } from "../../../config/workspace-path-helpers.js";
|
|
7
7
|
import { previewDreamingDeepPromotion } from "../../../agent/memory/dreaming/preview.js";
|
|
8
|
-
import fs from "node:fs/promises";
|
|
9
8
|
import path from "node:path";
|
|
9
|
+
import fs from "node:fs/promises";
|
|
10
10
|
//#region src/gateway/hono/routes/dreaming.ts
|
|
11
11
|
function isRecord(v) {
|
|
12
12
|
return v !== null && typeof v === "object" && !Array.isArray(v);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createGatewayRouteLogger } from "../lib/route-logger.js";
|
|
2
|
-
import { readdir, realpath, stat } from "node:fs/promises";
|
|
3
|
-
import * as path$1 from "node:path";
|
|
4
2
|
import * as os$1 from "node:os";
|
|
3
|
+
import * as path$1 from "node:path";
|
|
4
|
+
import { readdir, realpath, stat } from "node:fs/promises";
|
|
5
5
|
//#region src/gateway/hono/routes/host-fs.ts
|
|
6
6
|
const log = createGatewayRouteLogger("HostFs");
|
|
7
7
|
function jsonError(status, message) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { init_resolve_config_value, testApiKeyResolution } from "../../../config/resolve-config-value.js";
|
|
2
1
|
import { resolveModelsJsonPath } from "../../../config/paths.js";
|
|
2
|
+
import { init_resolve_config_value, testApiKeyResolution } from "../../../config/resolve-config-value.js";
|
|
3
3
|
import { init_models_json, loadModelsJson, saveModelsJson, validateModelsConfig } from "../../../config/models-json.js";
|
|
4
4
|
import { getModelRegistry } from "../../../providers/model-registry.js";
|
|
5
5
|
import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
|
|
@@ -13,8 +13,8 @@ import { getClientIpFromHeaders } from "../../security/loopback.js";
|
|
|
13
13
|
import { renderFolderLandingPage, renderShareExpiredPage, renderShareLandingPage } from "../../../share/share-landing.js";
|
|
14
14
|
import { consumeSharePublicLimit } from "../../../share/share-rate-limit.js";
|
|
15
15
|
import { createZipStream, planDirectoryFiles } from "../../../share/share-zip.js";
|
|
16
|
-
import { createHash } from "node:crypto";
|
|
17
16
|
import { createReadStream } from "node:fs";
|
|
17
|
+
import { createHash } from "node:crypto";
|
|
18
18
|
import { stat } from "node:fs/promises";
|
|
19
19
|
import { Readable } from "node:stream";
|
|
20
20
|
//#region src/gateway/hono/routes/shares.ts
|
|
@@ -7,8 +7,8 @@ import "../../../workflows/domain/index.js";
|
|
|
7
7
|
import { resolveWorkflowRunArtifactsDir } from "../../../workflows/store/paths.js";
|
|
8
8
|
import { WorkflowDraftService } from "../../../workflows/draft/workflow-draft-service.js";
|
|
9
9
|
import "../../../workflows/draft/index.js";
|
|
10
|
-
import { readFile, stat } from "node:fs/promises";
|
|
11
10
|
import { basename, join } from "node:path";
|
|
11
|
+
import { readFile, stat } from "node:fs/promises";
|
|
12
12
|
//#region src/gateway/hono/routes/workflows.ts
|
|
13
13
|
init_agent_scope();
|
|
14
14
|
function registerWorkflowRoutes(authenticated, deps) {
|
|
@@ -8,10 +8,10 @@ import { resolveHeartbeatMdPath } from "../../workspace-heartbeat-path.js";
|
|
|
8
8
|
import { createGatewayRouteLogger } from "../lib/route-logger.js";
|
|
9
9
|
import { runRipgrepInDirectory } from "../../workspace-ripgrep.js";
|
|
10
10
|
import { fuzzySearchWorkspaceFiles } from "../../workspace-file-search.js";
|
|
11
|
-
import {
|
|
11
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
12
12
|
import { constants } from "node:fs";
|
|
13
|
+
import { randomUUID } from "node:crypto";
|
|
13
14
|
import { copyFile, link, mkdir, readFile, readdir, rename, stat, unlink, writeFile } from "node:fs/promises";
|
|
14
|
-
import { basename, dirname, join, resolve } from "node:path";
|
|
15
15
|
//#region src/gateway/hono/routes/workspace.ts
|
|
16
16
|
init_agent_scope();
|
|
17
17
|
const log = createGatewayRouteLogger("Workspace");
|
package/dist/src/gateway/lock.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
|
-
import fs from "node:fs";
|
|
3
|
-
import fs$1 from "node:fs/promises";
|
|
4
1
|
import path from "node:path";
|
|
5
2
|
import net from "node:net";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import { createHash } from "node:crypto";
|
|
5
|
+
import fs$1 from "node:fs/promises";
|
|
6
6
|
import { homedir } from "os";
|
|
7
7
|
//#region src/gateway/lock.ts
|
|
8
8
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
-
import fs from "node:fs";
|
|
4
3
|
import net from "node:net";
|
|
4
|
+
import fs from "node:fs";
|
|
5
5
|
import { execFileSync } from "node:child_process";
|
|
6
6
|
//#region src/gateway/ports.ts
|
|
7
7
|
/**
|
|
@@ -35,6 +35,7 @@ declare class BucketRegistry {
|
|
|
35
35
|
private authFailureLimiter?;
|
|
36
36
|
private authFailureSignature?;
|
|
37
37
|
private strictApiLimiter?;
|
|
38
|
+
private channelApiLimiter?;
|
|
38
39
|
private tunnelMutateLimiter?;
|
|
39
40
|
private pairingExchangeLimiter?;
|
|
40
41
|
private sharePublicShortLimiter?;
|
|
@@ -47,6 +48,8 @@ declare class BucketRegistry {
|
|
|
47
48
|
authFailure(cfg: ResolvedAuthRateLimitConfig): FailureLimiter;
|
|
48
49
|
/** Sensitive admin / mutation endpoints — 15 req / 60 s per client IP. */
|
|
49
50
|
strictApi(): RateLimiter;
|
|
51
|
+
/** Channel mutation/action endpoints — 20 req / 60 s per client IP. */
|
|
52
|
+
channelApi(): RateLimiter;
|
|
50
53
|
/** Tunnel mutation calls — 12 req / 5 min per gateway-token fingerprint. */
|
|
51
54
|
tunnelMutate(): RateLimiter;
|
|
52
55
|
/** Failed pairing-exchange attempts — 30 failures / 5 min per client IP. */
|
|
@@ -47,6 +47,7 @@ var BucketRegistry = class {
|
|
|
47
47
|
authFailureLimiter;
|
|
48
48
|
authFailureSignature;
|
|
49
49
|
strictApiLimiter;
|
|
50
|
+
channelApiLimiter;
|
|
50
51
|
tunnelMutateLimiter;
|
|
51
52
|
pairingExchangeLimiter;
|
|
52
53
|
sharePublicShortLimiter;
|
|
@@ -78,6 +79,14 @@ var BucketRegistry = class {
|
|
|
78
79
|
});
|
|
79
80
|
return this.strictApiLimiter;
|
|
80
81
|
}
|
|
82
|
+
/** Channel mutation/action endpoints — 20 req / 60 s per client IP. */
|
|
83
|
+
channelApi() {
|
|
84
|
+
if (!this.channelApiLimiter) this.channelApiLimiter = new RateLimiter({
|
|
85
|
+
maxRequests: 20,
|
|
86
|
+
windowMs: 6e4
|
|
87
|
+
});
|
|
88
|
+
return this.channelApiLimiter;
|
|
89
|
+
}
|
|
81
90
|
/** Tunnel mutation calls — 12 req / 5 min per gateway-token fingerprint. */
|
|
82
91
|
tunnelMutate() {
|
|
83
92
|
if (!this.tunnelMutateLimiter) this.tunnelMutateLimiter = new RateLimiter({
|
|
@@ -114,12 +123,14 @@ var BucketRegistry = class {
|
|
|
114
123
|
destroyAll() {
|
|
115
124
|
this.authFailureLimiter?.destroy();
|
|
116
125
|
this.strictApiLimiter?.destroy();
|
|
126
|
+
this.channelApiLimiter?.destroy();
|
|
117
127
|
this.tunnelMutateLimiter?.destroy();
|
|
118
128
|
this.pairingExchangeLimiter?.destroy();
|
|
119
129
|
this.sharePublicShortLimiter?.destroy();
|
|
120
130
|
this.sharePublicLongLimiter?.destroy();
|
|
121
131
|
this.authFailureLimiter = void 0;
|
|
122
132
|
this.strictApiLimiter = void 0;
|
|
133
|
+
this.channelApiLimiter = void 0;
|
|
123
134
|
this.tunnelMutateLimiter = void 0;
|
|
124
135
|
this.pairingExchangeLimiter = void 0;
|
|
125
136
|
this.sharePublicShortLimiter = void 0;
|
|
@@ -130,6 +141,7 @@ var BucketRegistry = class {
|
|
|
130
141
|
resetAllForTests() {
|
|
131
142
|
this.authFailureLimiter?.resetForTests();
|
|
132
143
|
this.strictApiLimiter?.resetForTests();
|
|
144
|
+
this.channelApiLimiter?.resetForTests();
|
|
133
145
|
this.tunnelMutateLimiter?.resetForTests();
|
|
134
146
|
this.pairingExchangeLimiter?.resetForTests();
|
|
135
147
|
this.sharePublicShortLimiter?.resetForTests();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buckets.js","names":[],"sources":["../../../../src/gateway/rate-limit/buckets.ts"],"sourcesContent":["/**\n * Named rate-limit buckets used across the gateway. Each is a thin wrapper\n * over a primitive limiter ({@link RateLimiter} or {@link FailureLimiter})\n * that hard-codes its config and exposes a small surface.\n *\n * All buckets are owned by a process-level singleton {@link BucketRegistry}\n * so that:\n * - lifecycle (cleanup timers) is centralized — `destroyAll()` on shutdown,\n * - tests get one obvious reset entry point (`resetAllForTests`),\n * - new buckets are added in exactly one place.\n *\n * Tuning policy:\n * - `auth_failure` is read from runtime config because users tune it per\n * deployment. Other buckets keep static defaults until a real need\n * emerges to expose them. (YAGNI > premature configurability.)\n */\n\nimport { FailureLimiter, RateLimiter } from '../../infra/rate-limit/index.js';\n\nimport type { GatewayAuthRateLimitConfig } from '../../config/schema.js';\nimport type { AuthRateLimitPolicyConfig } from './auth-policy.js';\n\n/**\n * Auth-failure config validated/normalized into the shape both the limiter\n * primitive and the policy layer need.\n */\nexport type ResolvedAuthRateLimitConfig = {\n enabled: boolean;\n maxFailures: number;\n windowMs: number;\n blockDurationMs: number;\n burstCoalesceMs: number;\n exemptLoopback: boolean;\n};\n\nconst DEFAULT_AUTH_RATE_LIMIT: ResolvedAuthRateLimitConfig = {\n enabled: true,\n maxFailures: 5,\n windowMs: 15 * 60 * 1000,\n blockDurationMs: 5 * 60 * 1000,\n burstCoalesceMs: 1000,\n exemptLoopback: true,\n};\n\nexport function resolveAuthRateLimit(\n input: GatewayAuthRateLimitConfig | undefined,\n): ResolvedAuthRateLimitConfig {\n if (!input) return { ...DEFAULT_AUTH_RATE_LIMIT };\n const blockDurationMs =\n input.blockDurationMs ?? input.lockoutMs ?? DEFAULT_AUTH_RATE_LIMIT.blockDurationMs;\n return {\n enabled: input.enabled ?? DEFAULT_AUTH_RATE_LIMIT.enabled,\n maxFailures: Math.max(1, Math.floor(input.maxAttempts ?? DEFAULT_AUTH_RATE_LIMIT.maxFailures)),\n windowMs: Math.max(1000, Math.floor(input.windowMs ?? DEFAULT_AUTH_RATE_LIMIT.windowMs)),\n blockDurationMs: Math.max(1000, Math.floor(blockDurationMs)),\n burstCoalesceMs: Math.max(\n 0,\n Math.floor(input.burstCoalesceMs ?? DEFAULT_AUTH_RATE_LIMIT.burstCoalesceMs),\n ),\n exemptLoopback: input.exemptLoopback ?? DEFAULT_AUTH_RATE_LIMIT.exemptLoopback,\n };\n}\n\nexport function authPolicyConfig(\n cfg: ResolvedAuthRateLimitConfig,\n): AuthRateLimitPolicyConfig {\n return { enabled: cfg.enabled, exemptLoopback: cfg.exemptLoopback };\n}\n\nclass BucketRegistry {\n private authFailureLimiter?: FailureLimiter;\n private authFailureSignature?: string;\n\n private strictApiLimiter?: RateLimiter;\n private tunnelMutateLimiter?: RateLimiter;\n private pairingExchangeLimiter?: FailureLimiter;\n private sharePublicShortLimiter?: RateLimiter;\n private sharePublicLongLimiter?: RateLimiter;\n\n /**\n * Reconfigured on the fly when `gateway.auth.rateLimit` is reloaded —\n * compares a stable signature to avoid swapping out a hot bucket on every\n * config read.\n */\n authFailure(cfg: ResolvedAuthRateLimitConfig): FailureLimiter {\n const sig = `${cfg.maxFailures}|${cfg.windowMs}|${cfg.blockDurationMs}|${cfg.burstCoalesceMs}`;\n if (!this.authFailureLimiter || this.authFailureSignature !== sig) {\n this.authFailureLimiter?.destroy();\n this.authFailureLimiter = new FailureLimiter({\n maxFailures: cfg.maxFailures,\n windowMs: cfg.windowMs,\n blockDurationMs: cfg.blockDurationMs,\n burstCoalesceMs: cfg.burstCoalesceMs,\n });\n this.authFailureSignature = sig;\n }\n return this.authFailureLimiter;\n }\n\n /** Sensitive admin / mutation endpoints — 15 req / 60 s per client IP. */\n strictApi(): RateLimiter {\n if (!this.strictApiLimiter) {\n this.strictApiLimiter = new RateLimiter({ maxRequests: 15, windowMs: 60_000 });\n }\n return this.strictApiLimiter;\n }\n\n /** Tunnel mutation calls — 12 req / 5 min per gateway-token fingerprint. */\n tunnelMutate(): RateLimiter {\n if (!this.tunnelMutateLimiter) {\n this.tunnelMutateLimiter = new RateLimiter({\n maxRequests: 12,\n windowMs: 5 * 60_000,\n });\n }\n return this.tunnelMutateLimiter;\n }\n\n /** Failed pairing-exchange attempts — 30 failures / 5 min per client IP. */\n pairingExchange(): FailureLimiter {\n if (!this.pairingExchangeLimiter) {\n this.pairingExchangeLimiter = new FailureLimiter({\n maxFailures: 30,\n windowMs: 5 * 60_000,\n blockDurationMs: 5 * 60_000,\n });\n }\n return this.pairingExchangeLimiter;\n }\n\n /** Public share download short window — 60 req / min per client IP. */\n sharePublicShort(): RateLimiter {\n if (!this.sharePublicShortLimiter) {\n this.sharePublicShortLimiter = new RateLimiter({\n maxRequests: 60,\n windowMs: 60_000,\n });\n }\n return this.sharePublicShortLimiter;\n }\n\n /** Public share download long window — 300 req / 15 min per client IP. */\n sharePublicLong(): RateLimiter {\n if (!this.sharePublicLongLimiter) {\n this.sharePublicLongLimiter = new RateLimiter({\n maxRequests: 300,\n windowMs: 15 * 60_000,\n });\n }\n return this.sharePublicLongLimiter;\n }\n\n destroyAll(): void {\n this.authFailureLimiter?.destroy();\n this.strictApiLimiter?.destroy();\n this.tunnelMutateLimiter?.destroy();\n this.pairingExchangeLimiter?.destroy();\n this.sharePublicShortLimiter?.destroy();\n this.sharePublicLongLimiter?.destroy();\n this.authFailureLimiter = undefined;\n this.strictApiLimiter = undefined;\n this.tunnelMutateLimiter = undefined;\n this.pairingExchangeLimiter = undefined;\n this.sharePublicShortLimiter = undefined;\n this.sharePublicLongLimiter = undefined;\n this.authFailureSignature = undefined;\n }\n\n /** @internal */\n resetAllForTests(): void {\n this.authFailureLimiter?.resetForTests();\n this.strictApiLimiter?.resetForTests();\n this.tunnelMutateLimiter?.resetForTests();\n this.pairingExchangeLimiter?.resetForTests();\n this.sharePublicShortLimiter?.resetForTests();\n this.sharePublicLongLimiter?.resetForTests();\n }\n}\n\nexport const buckets = new BucketRegistry();\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"buckets.js","names":[],"sources":["../../../../src/gateway/rate-limit/buckets.ts"],"sourcesContent":["/**\n * Named rate-limit buckets used across the gateway. Each is a thin wrapper\n * over a primitive limiter ({@link RateLimiter} or {@link FailureLimiter})\n * that hard-codes its config and exposes a small surface.\n *\n * All buckets are owned by a process-level singleton {@link BucketRegistry}\n * so that:\n * - lifecycle (cleanup timers) is centralized — `destroyAll()` on shutdown,\n * - tests get one obvious reset entry point (`resetAllForTests`),\n * - new buckets are added in exactly one place.\n *\n * Tuning policy:\n * - `auth_failure` is read from runtime config because users tune it per\n * deployment. Other buckets keep static defaults until a real need\n * emerges to expose them. (YAGNI > premature configurability.)\n */\n\nimport { FailureLimiter, RateLimiter } from '../../infra/rate-limit/index.js';\n\nimport type { GatewayAuthRateLimitConfig } from '../../config/schema.js';\nimport type { AuthRateLimitPolicyConfig } from './auth-policy.js';\n\n/**\n * Auth-failure config validated/normalized into the shape both the limiter\n * primitive and the policy layer need.\n */\nexport type ResolvedAuthRateLimitConfig = {\n enabled: boolean;\n maxFailures: number;\n windowMs: number;\n blockDurationMs: number;\n burstCoalesceMs: number;\n exemptLoopback: boolean;\n};\n\nconst DEFAULT_AUTH_RATE_LIMIT: ResolvedAuthRateLimitConfig = {\n enabled: true,\n maxFailures: 5,\n windowMs: 15 * 60 * 1000,\n blockDurationMs: 5 * 60 * 1000,\n burstCoalesceMs: 1000,\n exemptLoopback: true,\n};\n\nexport function resolveAuthRateLimit(\n input: GatewayAuthRateLimitConfig | undefined,\n): ResolvedAuthRateLimitConfig {\n if (!input) return { ...DEFAULT_AUTH_RATE_LIMIT };\n const blockDurationMs =\n input.blockDurationMs ?? input.lockoutMs ?? DEFAULT_AUTH_RATE_LIMIT.blockDurationMs;\n return {\n enabled: input.enabled ?? DEFAULT_AUTH_RATE_LIMIT.enabled,\n maxFailures: Math.max(1, Math.floor(input.maxAttempts ?? DEFAULT_AUTH_RATE_LIMIT.maxFailures)),\n windowMs: Math.max(1000, Math.floor(input.windowMs ?? DEFAULT_AUTH_RATE_LIMIT.windowMs)),\n blockDurationMs: Math.max(1000, Math.floor(blockDurationMs)),\n burstCoalesceMs: Math.max(\n 0,\n Math.floor(input.burstCoalesceMs ?? DEFAULT_AUTH_RATE_LIMIT.burstCoalesceMs),\n ),\n exemptLoopback: input.exemptLoopback ?? DEFAULT_AUTH_RATE_LIMIT.exemptLoopback,\n };\n}\n\nexport function authPolicyConfig(\n cfg: ResolvedAuthRateLimitConfig,\n): AuthRateLimitPolicyConfig {\n return { enabled: cfg.enabled, exemptLoopback: cfg.exemptLoopback };\n}\n\nclass BucketRegistry {\n private authFailureLimiter?: FailureLimiter;\n private authFailureSignature?: string;\n\n private strictApiLimiter?: RateLimiter;\n private channelApiLimiter?: RateLimiter;\n private tunnelMutateLimiter?: RateLimiter;\n private pairingExchangeLimiter?: FailureLimiter;\n private sharePublicShortLimiter?: RateLimiter;\n private sharePublicLongLimiter?: RateLimiter;\n\n /**\n * Reconfigured on the fly when `gateway.auth.rateLimit` is reloaded —\n * compares a stable signature to avoid swapping out a hot bucket on every\n * config read.\n */\n authFailure(cfg: ResolvedAuthRateLimitConfig): FailureLimiter {\n const sig = `${cfg.maxFailures}|${cfg.windowMs}|${cfg.blockDurationMs}|${cfg.burstCoalesceMs}`;\n if (!this.authFailureLimiter || this.authFailureSignature !== sig) {\n this.authFailureLimiter?.destroy();\n this.authFailureLimiter = new FailureLimiter({\n maxFailures: cfg.maxFailures,\n windowMs: cfg.windowMs,\n blockDurationMs: cfg.blockDurationMs,\n burstCoalesceMs: cfg.burstCoalesceMs,\n });\n this.authFailureSignature = sig;\n }\n return this.authFailureLimiter;\n }\n\n /** Sensitive admin / mutation endpoints — 15 req / 60 s per client IP. */\n strictApi(): RateLimiter {\n if (!this.strictApiLimiter) {\n this.strictApiLimiter = new RateLimiter({ maxRequests: 15, windowMs: 60_000 });\n }\n return this.strictApiLimiter;\n }\n\n /** Channel mutation/action endpoints — 20 req / 60 s per client IP. */\n channelApi(): RateLimiter {\n if (!this.channelApiLimiter) {\n this.channelApiLimiter = new RateLimiter({ maxRequests: 20, windowMs: 60_000 });\n }\n return this.channelApiLimiter;\n }\n\n /** Tunnel mutation calls — 12 req / 5 min per gateway-token fingerprint. */\n tunnelMutate(): RateLimiter {\n if (!this.tunnelMutateLimiter) {\n this.tunnelMutateLimiter = new RateLimiter({\n maxRequests: 12,\n windowMs: 5 * 60_000,\n });\n }\n return this.tunnelMutateLimiter;\n }\n\n /** Failed pairing-exchange attempts — 30 failures / 5 min per client IP. */\n pairingExchange(): FailureLimiter {\n if (!this.pairingExchangeLimiter) {\n this.pairingExchangeLimiter = new FailureLimiter({\n maxFailures: 30,\n windowMs: 5 * 60_000,\n blockDurationMs: 5 * 60_000,\n });\n }\n return this.pairingExchangeLimiter;\n }\n\n /** Public share download short window — 60 req / min per client IP. */\n sharePublicShort(): RateLimiter {\n if (!this.sharePublicShortLimiter) {\n this.sharePublicShortLimiter = new RateLimiter({\n maxRequests: 60,\n windowMs: 60_000,\n });\n }\n return this.sharePublicShortLimiter;\n }\n\n /** Public share download long window — 300 req / 15 min per client IP. */\n sharePublicLong(): RateLimiter {\n if (!this.sharePublicLongLimiter) {\n this.sharePublicLongLimiter = new RateLimiter({\n maxRequests: 300,\n windowMs: 15 * 60_000,\n });\n }\n return this.sharePublicLongLimiter;\n }\n\n destroyAll(): void {\n this.authFailureLimiter?.destroy();\n this.strictApiLimiter?.destroy();\n this.channelApiLimiter?.destroy();\n this.tunnelMutateLimiter?.destroy();\n this.pairingExchangeLimiter?.destroy();\n this.sharePublicShortLimiter?.destroy();\n this.sharePublicLongLimiter?.destroy();\n this.authFailureLimiter = undefined;\n this.strictApiLimiter = undefined;\n this.channelApiLimiter = undefined;\n this.tunnelMutateLimiter = undefined;\n this.pairingExchangeLimiter = undefined;\n this.sharePublicShortLimiter = undefined;\n this.sharePublicLongLimiter = undefined;\n this.authFailureSignature = undefined;\n }\n\n /** @internal */\n resetAllForTests(): void {\n this.authFailureLimiter?.resetForTests();\n this.strictApiLimiter?.resetForTests();\n this.channelApiLimiter?.resetForTests();\n this.tunnelMutateLimiter?.resetForTests();\n this.pairingExchangeLimiter?.resetForTests();\n this.sharePublicShortLimiter?.resetForTests();\n this.sharePublicLongLimiter?.resetForTests();\n }\n}\n\nexport const buckets = new BucketRegistry();\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { getModelRegistry } from "../../providers/model-registry.js";
|
|
4
3
|
import { loadConfig, saveConfig } from "../../config/loader.js";
|
|
4
|
+
import { getModelRegistry } from "../../providers/model-registry.js";
|
|
5
5
|
import { init_providers } from "../../providers/index.js";
|
|
6
6
|
import { disposeAllSessionMcpRuntimes } from "../../agent/mcp/bundle-mcp-runtime.js";
|
|
7
7
|
import "../../agent/mcp/bundle-mcp-tools.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { resolveStateDir } from "../../config/paths-state.js";
|
|
2
|
-
import { init_paths, resolveExtensionsDir } from "../../config/paths.js";
|
|
3
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
4
3
|
import { init_logger } from "../../utils/logger.js";
|
|
4
|
+
import { init_paths, resolveExtensionsDir } from "../../config/paths.js";
|
|
5
5
|
import { createSkillConfigManager } from "../../agent/skills/config.js";
|
|
6
6
|
import { removeSkillsLockEntry } from "../../agent/skills/hub-lock.js";
|
|
7
7
|
import { deleteManagedSkill, installSkillFromZip, listManagedSkillDirs } from "../../agent/skills/managed-store.js";
|
|
@@ -11,8 +11,8 @@ import { installExtensionFromStoreZip, peekExtensionIdFromStoreZip } from "../..
|
|
|
11
11
|
import { downloadExtensionStoreZipBuffer, fetchMarketplacePackageDetail, resolveExtensionZipDownloadUrl, resolveExtensionsStoreBaseUrl } from "../../agent/skills/marketplace/adapters/store/store-api-client.js";
|
|
12
12
|
import { getMarketplaceProviderDisplayName, resolveSkillsMarketplaceProvider } from "../../agent/skills/marketplace/resolve-adapter.js";
|
|
13
13
|
import { downloadFromMarketplace, getMarketplacePackageDetail, listMarketplaceCategories, listMarketplacePackages } from "../../agent/skills/skills-marketplace.js";
|
|
14
|
-
import { existsSync, mkdirSync, rmSync } from "node:fs";
|
|
15
14
|
import { join } from "node:path";
|
|
15
|
+
import { existsSync, mkdirSync, rmSync } from "node:fs";
|
|
16
16
|
//#region src/gateway/service/marketplace-service.ts
|
|
17
17
|
/**
|
|
18
18
|
* GatewayMarketplaceService — install / browse / remove for the two marketplaces
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { __toCommonJS } from "../../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { PACKAGE_VERSION, init_package_version } from "../package-version.js";
|
|
3
3
|
import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveDefaultAgentId } from "../agent/agent-scope.js";
|
|
4
|
-
import {
|
|
4
|
+
import { buildSessionKey, init_session_key, sanitizeSegment } from "../routing/session-key.js";
|
|
5
|
+
import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
5
6
|
import { getLogDir } from "../utils/logger/config.js";
|
|
6
7
|
import { getRuntimeLogStats } from "../utils/logger/stats.js";
|
|
7
8
|
import { createLogger } from "../utils/logger/index.js";
|
|
8
9
|
import { init_logger } from "../utils/logger.js";
|
|
9
|
-
import {
|
|
10
|
+
import { init_paths, resolveAgentDir, resolveConfigPath, resolveExtensionsDir } from "../config/paths.js";
|
|
10
11
|
import { areExtensionsGloballyDisabled } from "../extensions/discover-extensions.js";
|
|
11
12
|
import { buildExtensionMetadataSnapshot } from "../extensions/extension-metadata-snapshot.js";
|
|
12
13
|
import { buildChannelCatalogForConfig, buildChannelCatalogFromSnapshot, init_channel_catalog_service } from "../channels/catalog/channel-catalog-service.js";
|
|
13
14
|
import { loadConfig, saveConfig } from "../config/loader.js";
|
|
14
|
-
import {
|
|
15
|
-
import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
15
|
+
import { prewarmModelRegistry } from "../providers/model-registry.js";
|
|
16
16
|
import { init_providers, providers_exports } from "../providers/index.js";
|
|
17
17
|
import { closeXopcDatabase, openXopcDatabase } from "../storage/sqlite/connection.js";
|
|
18
18
|
import "../storage/sqlite/index.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
-
import { readdir } from "node:fs/promises";
|
|
4
3
|
import { join, relative } from "node:path";
|
|
4
|
+
import { readdir } from "node:fs/promises";
|
|
5
5
|
//#region src/gateway/workspace-fs-file-list.ts
|
|
6
6
|
init_logger();
|
|
7
7
|
const log = createLogger("WorkspaceFsFileList");
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
|
|
1
2
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
-
import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
|
|
4
|
-
import { resolveGoalUiLocale } from "../agent/goals/goal-locale.js";
|
|
5
4
|
import { renderWorkflowText } from "../agent/workflow/snapshot.js";
|
|
6
5
|
import { GoalService } from "./goal-service.js";
|
|
6
|
+
import { resolveGoalUiLocale } from "../agent/goals/goal-locale.js";
|
|
7
7
|
import { evaluateAfterTurnHermesLike } from "../agent/goals/evaluate-turn.js";
|
|
8
8
|
import { runViewToSnapshot } from "../workflows/service/run-view-to-snapshot.js";
|
|
9
9
|
//#region src/goals/goal-workflow-judge.ts
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { formatI18n } from "./format.js";
|
|
2
|
+
import { serverLocaleOrFallback } from "./locale.js";
|
|
2
3
|
import goals_en_default, { judgeReason } from "./locales/goals.en.js";
|
|
3
4
|
import goals_zh_default from "./locales/goals.zh.js";
|
|
4
|
-
import { serverLocaleOrFallback } from "./locale.js";
|
|
5
5
|
//#region src/i18n/goals-bundle.ts
|
|
6
6
|
/** Canonical English strings for judge parse / API contract (from `goals.en.json`). */
|
|
7
7
|
const JUDGE_REASON_EN = judgeReason;
|
package/dist/src/i18n/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { formatI18n } from "./format.js";
|
|
2
2
|
import { DEFAULT_SERVER_LOCALE, SERVER_LOCALES, isServerLocale, normalizeServerLocale, serverLocaleOrFallback } from "./locale.js";
|
|
3
|
-
import { JUDGE_REASON_EN, goalsChecklistProgressSuffix, goalsContinuationChecklistTemplate, goalsContinuationPlainTemplate, goalsEvaluateCopy, goalsJudgeReason, goalsJudgeResponseLanguageNote, goalsMessages } from "./goals-bundle.js";
|
|
4
3
|
import { resolveToolLocale, shareToolErrorLine, shareToolMessages, shareToolSuccessLines } from "./share-tool-bundle.js";
|
|
4
|
+
import { JUDGE_REASON_EN, goalsChecklistProgressSuffix, goalsContinuationChecklistTemplate, goalsContinuationPlainTemplate, goalsEvaluateCopy, goalsJudgeReason, goalsJudgeResponseLanguageNote, goalsMessages } from "./goals-bundle.js";
|
|
5
5
|
export { DEFAULT_SERVER_LOCALE, JUDGE_REASON_EN, SERVER_LOCALES, formatI18n, goalsChecklistProgressSuffix, goalsContinuationChecklistTemplate, goalsContinuationPlainTemplate, goalsEvaluateCopy, goalsJudgeReason, goalsJudgeResponseLanguageNote, goalsMessages, isServerLocale, normalizeServerLocale, resolveToolLocale, serverLocaleOrFallback, shareToolErrorLine, shareToolMessages, shareToolSuccessLines };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { formatI18n } from "./format.js";
|
|
2
|
-
import { normalizeServerLocale, serverLocaleOrFallback } from "./locale.js";
|
|
3
1
|
import share_tool_en_default from "./locales/share-tool.en.js";
|
|
4
2
|
import share_tool_zh_default from "./locales/share-tool.zh.js";
|
|
3
|
+
import { formatI18n } from "./format.js";
|
|
4
|
+
import { normalizeServerLocale, serverLocaleOrFallback } from "./locale.js";
|
|
5
5
|
//#region src/i18n/share-tool-bundle.ts
|
|
6
6
|
const byLocale = {
|
|
7
7
|
en: share_tool_en_default,
|
package/dist/src/infra/brew.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readPackageVersion } from "./package-json.js";
|
|
2
2
|
import { XOPC_PACKAGE_NAME, collectInstalledGlobalPackageErrors, globalInstallArgs, globalInstallFallbackArgs, resolveExpectedInstalledVersionFromSpec, resolveGlobalInstallTarget, resolveNpmGlobalPrefixLayoutFromGlobalRoot, resolveNpmGlobalPrefixLayoutFromPrefix } from "./update-global.js";
|
|
3
|
-
import fs from "node:fs/promises";
|
|
4
3
|
import path from "node:path";
|
|
4
|
+
import fs from "node:fs/promises";
|
|
5
5
|
//#region src/infra/package-update-steps.ts
|
|
6
6
|
function formatError(err) {
|
|
7
7
|
return err instanceof Error ? err.message : String(err);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { resolveBrewPathDirs } from "./brew.js";
|
|
2
|
-
import fs from "node:fs";
|
|
3
|
-
import path from "node:path";
|
|
4
2
|
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import fs from "node:fs";
|
|
5
5
|
//#region src/infra/path-env.ts
|
|
6
6
|
function isTruthyEnvValue(value) {
|
|
7
7
|
if (!value) return false;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { init_paths_state, resolveStateDir } from "../config/paths-state.js";
|
|
2
2
|
import { createLogger } from "../utils/logger/index.js";
|
|
3
3
|
import { init_logger } from "../utils/logger.js";
|
|
4
|
-
import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
5
4
|
import path from "node:path";
|
|
5
|
+
import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
6
6
|
//#region src/infra/restart.ts
|
|
7
7
|
/**
|
|
8
8
|
* Gateway restart coordination — OpenClaw-aligned SIGUSR1 authorization and restart intent.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PACKAGE_VERSION, init_package_version } from "../package-version.js";
|
|
2
2
|
import { channelToNpmTag } from "./update-channels.js";
|
|
3
|
-
import { access, readFile } from "node:fs/promises";
|
|
4
3
|
import { dirname, join } from "node:path";
|
|
4
|
+
import { access, readFile } from "node:fs/promises";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
6
|
//#region src/infra/update-check.ts
|
|
7
7
|
init_package_version();
|
|
@@ -2,9 +2,9 @@ import { resolveExecPathBinPrepend } from "./path-env.js";
|
|
|
2
2
|
import { readPackageVersion } from "./package-json.js";
|
|
3
3
|
import { applyPathPrepend } from "./path-prepend.js";
|
|
4
4
|
import { createDefaultCommandRunner } from "./run-command.js";
|
|
5
|
+
import path from "node:path";
|
|
5
6
|
import fs from "node:fs";
|
|
6
7
|
import fs$1 from "node:fs/promises";
|
|
7
|
-
import path from "node:path";
|
|
8
8
|
//#region src/infra/update-global.ts
|
|
9
9
|
const XOPC_PACKAGE_NAME = "@xopcai/xopc";
|
|
10
10
|
const GLOBAL_RENAME_PREFIX = ".";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { init_write_file_atomic, writeTextAtomic } from "./write-file-atomic.js";
|
|
2
1
|
import { init_paths_state, resolveUpdateLockPath } from "../config/paths-state.js";
|
|
3
2
|
import { createLogger } from "../utils/logger/index.js";
|
|
4
3
|
import { init_logger } from "../utils/logger.js";
|
|
5
|
-
import {
|
|
4
|
+
import { init_write_file_atomic, writeTextAtomic } from "./write-file-atomic.js";
|
|
6
5
|
import { dirname } from "node:path";
|
|
6
|
+
import { mkdir, readFile, unlink } from "node:fs/promises";
|
|
7
7
|
//#region src/infra/update-lock.ts
|
|
8
8
|
init_write_file_atomic();
|
|
9
9
|
init_paths_state();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { init_paths, resolveConfigPath } from "../config/paths.js";
|
|
2
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
3
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { init_paths, resolveConfigPath } from "../config/paths.js";
|
|
4
4
|
import { init_loader, loadConfig } from "../config/loader.js";
|
|
5
5
|
import { isRestartEnabled } from "../config/commands.flags.js";
|
|
6
6
|
import { resolveGatewayService } from "../daemon/service.js";
|