@xopcai/xopc 0.0.81 → 0.0.83
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/README.zh-CN.md +1 -1
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/outbound/media-load.js +2 -3
- package/dist/extensions/feishu/src/outbound/media-load.js.map +1 -1
- package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
- package/dist/extensions/telegram/src/config-schema.d.ts +6 -6
- package/dist/extensions/telegram/src/plugin.d.ts +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/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +3 -3
- 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/config-schema.d.ts +3 -3
- 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/gateway/static/root/assets/agents-CrpYTHJS.js +222 -0
- package/dist/gateway/static/root/assets/{apps-page-Ci17oA_o.js → apps-page-1mcKh5Rh.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-zd6QNKPx.js +1 -0
- package/dist/gateway/static/root/assets/{channels-status-swr-CUU3faST.js → channels-status-swr-uRAuhiUo.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-api-BVQ2n75R.js → cron-api-O2Q_ruV6.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-x582Y6D5.js → cron-page-By09AQD-.js} +1 -1
- package/dist/gateway/static/root/assets/{dist-XT96cQdR.js → dist-BpQxde0t.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-Czzfrtt5.js → extension-debug-page-CY27wj_p.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-B_c5UIqX.js → extension-page-C-Ed5ZmP.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-Ckvjgw0_.js → extension-settings-page-raLux7E7.js} +1 -1
- package/dist/gateway/static/root/assets/fetch-2iRFmd3n.js +3 -0
- package/dist/gateway/static/root/assets/{field-primitives-DQpT8iVa.js → field-primitives-fa_hiQcX.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-DKqOuQ0V.js → heartbeat-config-api-BVl5VHvL.js} +1 -1
- package/dist/gateway/static/root/assets/index-BuFldCsB.css +1 -0
- package/dist/gateway/static/root/assets/{index-Bq3Lg4bG.js → index-Y-iqo-gL.js} +95 -86
- package/dist/gateway/static/root/assets/{logs-page-B3CwJNBq.js → logs-page-BdH2n7ZW.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-Vpchzdp-.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-CjjEpVYM.js → settings-form-section-Kk1yAGBl.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-KBm0u6Dz.js +3 -0
- package/dist/gateway/static/root/assets/skills-page-BjeXXaOn.js +2 -0
- package/dist/gateway/static/root/assets/{theme-store-DnwYutiX.js → theme-store-D01dJt95.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-DQehHvlm.js → utils-DpTxN4AF.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-CwO8Cf01.js +1 -0
- package/dist/gateway/static/root/index.html +4 -4
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-instance-gateway.d.ts +50 -0
- package/dist/src/agent/agent-instance-gateway.js +1 -0
- package/dist/src/agent/agent-manager.d.ts +20 -14
- package/dist/src/agent/agent-manager.js +74 -186
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/background-review/coordinator.d.ts +61 -0
- package/dist/src/agent/background-review/coordinator.js +120 -0
- package/dist/src/agent/background-review/coordinator.js.map +1 -0
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
- package/dist/src/agent/child-agent-factory.d.ts +14 -0
- package/dist/src/agent/child-agent-factory.js +2 -8
- package/dist/src/agent/child-agent-factory.js.map +1 -1
- package/dist/src/agent/context/workspace-seed.js +3 -3
- package/dist/src/agent/embedded/index.d.ts +1 -2
- package/dist/src/agent/embedded/index.js +2 -3
- package/dist/src/agent/embedded/run-for-session.d.ts +2 -2
- package/dist/src/agent/embedded/run-for-session.js.map +1 -1
- package/dist/src/agent/embedded/runs.d.ts +32 -0
- package/dist/src/agent/embedded/runs.js +79 -19
- package/dist/src/agent/embedded/runs.js.map +1 -1
- package/dist/src/agent/embedded/session-manager-cache.d.ts +14 -0
- package/dist/src/agent/embedded/session-manager-cache.js +32 -11
- package/dist/src/agent/embedded/session-manager-cache.js.map +1 -1
- package/dist/src/agent/embedded/session-runner.d.ts +37 -7
- package/dist/src/agent/embedded/session-runner.js +184 -153
- package/dist/src/agent/embedded/session-runner.js.map +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.d.ts +57 -9
- package/dist/src/agent/embedded/session-tool-result-guard.js +159 -67
- package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
- package/dist/src/agent/goals/goal-run-store.js +4 -4
- package/dist/src/agent/goals/persistent-goal-service.d.ts +84 -0
- package/dist/src/agent/goals/persistent-goal-service.js +139 -0
- package/dist/src/agent/goals/persistent-goal-service.js.map +1 -0
- package/dist/src/agent/goals/post-turn.js +2 -2
- package/dist/src/agent/goals/state.d.ts +1 -1
- package/dist/src/agent/goals/state.js.map +1 -1
- package/dist/src/agent/image/load-image-media.js +1 -1
- package/dist/src/agent/inbound/inbound-loop.d.ts +77 -0
- package/dist/src/agent/inbound/inbound-loop.js +226 -0
- package/dist/src/agent/inbound/inbound-loop.js.map +1 -0
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +80 -0
- package/dist/src/agent/inbound/turn-dispatcher.js +138 -0
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -0
- package/dist/src/agent/ipc/bus.js +1 -1
- package/dist/src/agent/ipc/inbox.js +2 -2
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -1
- package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
- package/dist/src/agent/lifecycle/manager.d.ts +1 -1
- package/dist/src/agent/lifecycle/manager.js.map +1 -1
- package/dist/src/agent/lifecycle/types.d.ts +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.d.ts +12 -2
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js.map +1 -1
- package/dist/src/agent/memory/index.js +3 -3
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/memory/prefetch-coordinator.d.ts +37 -0
- package/dist/src/agent/memory/prefetch-coordinator.js +45 -0
- package/dist/src/agent/memory/prefetch-coordinator.js.map +1 -0
- package/dist/src/agent/messaging/command-handler.d.ts +5 -1
- package/dist/src/agent/messaging/command-handler.js +24 -96
- package/dist/src/agent/messaging/command-handler.js.map +1 -1
- package/dist/src/agent/messaging/index.d.ts +1 -0
- package/dist/src/agent/messaging/index.js +2 -1
- package/dist/src/agent/messaging/message-router.d.ts +1 -1
- package/dist/src/agent/messaging/message-router.js.map +1 -1
- package/dist/src/agent/messaging/outbound-coordinator.d.ts +82 -0
- package/dist/src/agent/messaging/outbound-coordinator.js +123 -0
- package/dist/src/agent/messaging/outbound-coordinator.js.map +1 -0
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/orchestration/agent-event-handler.d.ts +36 -33
- package/dist/src/agent/orchestration/agent-event-handler.js +212 -174
- package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.d.ts +4 -4
- package/dist/src/agent/orchestration/agent-orchestrator.js +4 -8
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/orchestration/index.d.ts +1 -1
- package/dist/src/agent/orchestration/index.js +2 -2
- package/dist/src/agent/prompt/service-prompt-builder.js +4 -4
- 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 +1 -1
- package/dist/src/agent/service/async-queue.d.ts +20 -0
- package/dist/src/agent/service/async-queue.js +53 -0
- package/dist/src/agent/service/async-queue.js.map +1 -0
- package/dist/src/agent/service/build-direct-message-content.d.ts +2 -2
- package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
- package/dist/src/agent/service/direct-turn-helpers.d.ts +70 -0
- package/dist/src/agent/service/direct-turn-helpers.js +90 -0
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -0
- package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -3
- package/dist/src/agent/service/process-direct-one-shot.js +17 -34
- package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
- package/dist/src/agent/service/process-direct-streaming.js +133 -167
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/webchat-tts.d.ts +2 -2
- package/dist/src/agent/service/webchat-tts.js +1 -1
- package/dist/src/agent/service/webchat-tts.js.map +1 -1
- package/dist/src/agent/service.d.ts +62 -167
- package/dist/src/agent/service.js +177 -786
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/index.d.ts +4 -0
- package/dist/src/agent/session/index.js +5 -1
- package/dist/src/agent/session/session-config-service.d.ts +68 -0
- package/dist/src/agent/session/session-config-service.js +172 -0
- package/dist/src/agent/session/session-config-service.js.map +1 -0
- package/dist/src/agent/session/session-context.d.ts +27 -19
- package/dist/src/agent/session/session-context.js +39 -24
- package/dist/src/agent/session/session-context.js.map +1 -1
- package/dist/src/agent/session/session-hydrator.d.ts +42 -0
- package/dist/src/agent/session/session-hydrator.js +66 -0
- package/dist/src/agent/session/session-hydrator.js.map +1 -0
- package/dist/src/agent/session/session-inspector.d.ts +80 -0
- package/dist/src/agent/session/session-inspector.js +119 -0
- package/dist/src/agent/session/session-inspector.js.map +1 -0
- package/dist/src/agent/session/session-state-bag.d.ts +83 -0
- package/dist/src/agent/session/session-state-bag.js +192 -0
- package/dist/src/agent/session/session-state-bag.js.map +1 -0
- package/dist/src/agent/skills/config.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.d.ts +0 -2
- package/dist/src/agent/skills/index.js +3 -5
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/managed-store.js +1 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -6
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +35 -7
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/scanner.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +2 -2
- package/dist/src/agent/skills/skill-manager.js +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +7 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +37 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/delegate-tool.d.ts +7 -0
- package/dist/src/agent/tools/delegate-tool.js +2 -1
- package/dist/src/agent/tools/delegate-tool.js.map +1 -1
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/executor.d.ts +34 -15
- package/dist/src/agent/tools/executor.js +44 -79
- package/dist/src/agent/tools/executor.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +6 -0
- package/dist/src/agent/tools/factory.js +63 -4
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/send-media.js +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +1 -1
- package/dist/src/agent/tools/skills-tools.js +1 -1
- package/dist/src/agent/tools/tts-tool.js +1 -1
- package/dist/src/agent/tools/write.js +1 -1
- package/dist/src/agent/workspace-runtime/registry.d.ts +48 -0
- package/dist/src/agent/workspace-runtime/registry.js +59 -0
- package/dist/src/agent/workspace-runtime/registry.js.map +1 -0
- package/dist/src/auth/credentials.js +3 -3
- package/dist/src/auth/profiles/store.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/browser/cdp-local-launcher.js +4 -3
- package/dist/src/browser/cdp-local-launcher.js.map +1 -1
- package/dist/src/browser/index.d.ts +1 -0
- package/dist/src/browser/index.js +2 -1
- package/dist/src/browser/manager.js +3 -2
- package/dist/src/browser/manager.js.map +1 -1
- package/dist/src/browser/providers/browser-ext-install.js +4 -4
- package/dist/src/browser/providers/browser-use.js +2 -1
- package/dist/src/browser/providers/browser-use.js.map +1 -1
- package/dist/src/browser/providers/browserbase.js +2 -1
- package/dist/src/browser/providers/browserbase.js.map +1 -1
- package/dist/src/browser/providers/cloakbrowser.js +7 -6
- package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
- package/dist/src/browser/providers/playwright-doctor.d.ts +2 -0
- package/dist/src/browser/providers/playwright-doctor.js +7 -3
- package/dist/src/browser/providers/playwright-doctor.js.map +1 -1
- package/dist/src/browser/readiness.d.ts +33 -0
- package/dist/src/browser/readiness.js +138 -0
- package/dist/src/browser/readiness.js.map +1 -0
- package/dist/src/browser/stealth.js +2 -2
- package/dist/src/channels/attachments/inbound-persist.js +1 -1
- package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
- package/dist/src/channels/channel-domain.d.ts +1 -1
- package/dist/src/channels/config-helpers.d.ts +1 -1
- package/dist/src/channels/config-helpers.js.map +1 -1
- package/dist/src/channels/heartbeat-scheduler.d.ts +40 -0
- package/dist/src/channels/heartbeat-scheduler.js +94 -0
- package/dist/src/channels/heartbeat-scheduler.js.map +1 -0
- package/dist/src/channels/lifecycle-supervisor.d.ts +81 -0
- package/dist/src/channels/lifecycle-supervisor.js +263 -0
- package/dist/src/channels/lifecycle-supervisor.js.map +1 -0
- package/dist/src/channels/manager.d.ts +34 -68
- package/dist/src/channels/manager.js +107 -477
- package/dist/src/channels/manager.js.map +1 -1
- package/dist/src/channels/outbound/deliver.d.ts +1 -1
- package/dist/src/channels/outbound/deliver.js.map +1 -1
- package/dist/src/channels/outbound/persist-store.js +1 -1
- package/dist/src/channels/outbound-sender.d.ts +51 -0
- package/dist/src/channels/outbound-sender.js +125 -0
- package/dist/src/channels/outbound-sender.js.map +1 -0
- package/dist/src/channels/pairing/allow-from-file.js +1 -1
- package/dist/src/channels/pairing/pairing-service.d.ts +3 -10
- package/dist/src/channels/pairing/pairing-service.js.map +1 -1
- package/dist/src/channels/pairing/pairing-store.js +2 -2
- package/dist/src/channels/pairing/pairing-types.d.ts +15 -0
- package/dist/src/channels/pairing/pairing-types.js +1 -0
- package/dist/src/channels/plugin-registry.d.ts +22 -0
- package/dist/src/channels/plugin-registry.js +44 -0
- package/dist/src/channels/plugin-registry.js.map +1 -0
- package/dist/src/channels/plugin-types.d.ts +1 -1
- package/dist/src/channels/plugins/types.adapters.d.ts +2 -2
- package/dist/src/channels/security-helpers.d.ts +1 -1
- package/dist/src/channels/security-helpers.js.map +1 -1
- package/dist/src/channels/setup-wizard.d.ts +1 -1
- package/dist/src/chat-commands/builtins/config.js +2 -2
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/cli/commands/agent/stream-renderer.js +1 -1
- package/dist/src/cli/commands/agent/stream-renderer.js.map +1 -1
- package/dist/src/cli/commands/agent.js +4 -4
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/browser-cli-helpers.js +2 -1
- package/dist/src/cli/commands/browser-cli-helpers.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/session-integrity.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-dev.js +2 -2
- package/dist/src/cli/commands/extension-dev.js.map +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +2 -2
- package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
- package/dist/src/cli/commands/extension-pack.js +1 -1
- package/dist/src/cli/commands/gateway/call.js +1 -1
- package/dist/src/cli/commands/gateway/call.js.map +1 -1
- package/dist/src/cli/commands/gateway/health.js +1 -1
- package/dist/src/cli/commands/gateway/health.js.map +1 -1
- package/dist/src/cli/commands/gateway/lifecycle-core.d.ts +31 -12
- package/dist/src/cli/commands/gateway/lifecycle-core.js +167 -116
- package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.d.ts +11 -0
- package/dist/src/cli/commands/gateway/lifecycle.js +102 -0
- package/dist/src/cli/commands/gateway/lifecycle.js.map +1 -0
- package/dist/src/cli/commands/gateway/logs.js +1 -1
- package/dist/src/cli/commands/gateway/logs.js.map +1 -1
- package/dist/src/cli/commands/gateway/probe.js +1 -1
- package/dist/src/cli/commands/gateway/probe.js.map +1 -1
- package/dist/src/cli/commands/gateway/restart-health.d.ts +12 -0
- package/dist/src/cli/commands/gateway/restart-health.js +45 -1
- package/dist/src/cli/commands/gateway/restart-health.js.map +1 -1
- package/dist/src/cli/commands/gateway/restart.js +3 -3
- package/dist/src/cli/commands/gateway/restart.js.map +1 -1
- package/dist/src/cli/commands/gateway/run-foreground.d.ts +0 -1
- package/dist/src/cli/commands/gateway/run-foreground.js +0 -35
- package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
- package/dist/src/cli/commands/gateway/service.js +1 -1
- package/dist/src/cli/commands/gateway/service.js.map +1 -1
- package/dist/src/cli/commands/gateway/shared.d.ts +3 -0
- package/dist/src/cli/commands/gateway/shared.js +54 -0
- package/dist/src/cli/commands/gateway/shared.js.map +1 -0
- package/dist/src/cli/commands/gateway/status.js +1 -1
- package/dist/src/cli/commands/gateway/status.js.map +1 -1
- package/dist/src/cli/commands/gateway/stop.js +2 -2
- package/dist/src/cli/commands/gateway/stop.js.map +1 -1
- package/dist/src/cli/commands/gateway/token.js +1 -1
- package/dist/src/cli/commands/gateway/token.js.map +1 -1
- package/dist/src/cli/commands/gateway.js +5 -5
- package/dist/src/cli/commands/gateway.js.map +1 -1
- package/dist/src/cli/commands/image.js +2 -2
- package/dist/src/cli/commands/image.js.map +1 -1
- package/dist/src/cli/commands/init.js +4 -4
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard/gateway.d.ts +0 -8
- package/dist/src/cli/commands/onboard/gateway.js +48 -49
- package/dist/src/cli/commands/onboard/gateway.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +9 -64
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/session/utils.js +1 -1
- package/dist/src/cli/commands/session/utils.js.map +1 -1
- package/dist/src/cli/commands/skills.js +1 -1
- package/dist/src/cli/commands/tailscale.js +1 -1
- package/dist/src/cli/commands/tailscale.js.map +1 -1
- package/dist/src/cli/context.d.ts +20 -0
- package/dist/src/cli/context.js +23 -0
- package/dist/src/cli/context.js.map +1 -0
- package/dist/src/cli/extension-cli-register.js +3 -3
- package/dist/src/cli/gateway-run-argv.js +1 -4
- package/dist/src/cli/gateway-run-argv.js.map +1 -1
- package/dist/src/cli/gateway-run-fast-path.js +1 -1
- package/dist/src/cli/gateway-run-fast-path.js.map +1 -1
- package/dist/src/cli/index.d.ts +1 -7
- package/dist/src/cli/index.js +4 -6
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +2 -2
- package/dist/src/config/commands.flags.d.ts +3 -0
- package/dist/src/config/commands.flags.js +11 -0
- package/dist/src/config/commands.flags.js.map +1 -0
- package/dist/src/config/index.d.ts +1 -0
- package/dist/src/config/index.js +6 -5
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/config/loader.js +2 -2
- package/dist/src/config/models-json.js +2 -2
- package/dist/src/config/profile.js +2 -2
- package/dist/src/config/schema.d.ts +11 -4
- package/dist/src/config/schema.js +13 -12
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/workspace-path-helpers.d.ts +15 -0
- package/dist/src/config/workspace-path-helpers.js +14 -0
- package/dist/src/config/workspace-path-helpers.js.map +1 -0
- package/dist/src/cron/executor.js +4 -4
- package/dist/src/cron/executor.js.map +1 -1
- package/dist/src/cron/persistence.js +1 -1
- package/dist/src/cron/run-log-store.js +1 -1
- package/dist/src/daemon/index.d.ts +0 -1
- package/dist/src/daemon/index.js +1 -2
- package/dist/src/daemon/install-plan.js +3 -2
- package/dist/src/daemon/install-plan.js.map +1 -1
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/daemon/types.d.ts +0 -6
- package/dist/src/extensions/api.d.ts +1 -1
- package/dist/src/extensions/api.js +2 -2
- package/dist/src/extensions/api.js.map +1 -1
- package/dist/src/extensions/bundle-mcp.js +1 -1
- package/dist/src/extensions/discover-extensions.js +1 -1
- package/dist/src/extensions/extension-registry-impl.d.ts +51 -0
- package/dist/src/extensions/extension-registry-impl.js +117 -0
- package/dist/src/extensions/extension-registry-impl.js.map +1 -0
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/index.js +3 -2
- package/dist/src/extensions/loader.d.ts +3 -43
- package/dist/src/extensions/loader.js +3 -110
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/extensions/lockfile.js +2 -2
- package/dist/src/extensions/sdk/index.js +2 -1
- package/dist/src/extensions/sdk/index.js.map +1 -1
- package/dist/src/extensions/types/events.d.ts +7 -1
- package/dist/src/gateway/agents-admin.js +2 -2
- package/dist/src/gateway/file-path-classifier.js +2 -2
- package/dist/src/gateway/heartbeat/service.js +2 -2
- package/dist/src/gateway/heartbeat/service.js.map +1 -1
- package/dist/src/gateway/hono/app.js +40 -37
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +1 -1
- package/dist/src/gateway/hono/lib/static-ui.js +2 -2
- package/dist/src/gateway/hono/middleware/auth.d.ts +5 -14
- package/dist/src/gateway/hono/middleware/auth.js +92 -105
- package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
- package/dist/src/gateway/hono/middleware/logger.d.ts +5 -1
- package/dist/src/gateway/hono/middleware/logger.js +41 -5
- package/dist/src/gateway/hono/middleware/logger.js.map +1 -1
- package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +14 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js +62 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -0
- package/dist/src/gateway/hono/oauth.js +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +4 -4
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
- package/dist/src/gateway/hono/routes/browser.d.ts +20 -0
- package/dist/src/gateway/hono/routes/browser.js +626 -0
- package/dist/src/gateway/hono/routes/browser.js.map +1 -0
- package/dist/src/gateway/hono/routes/commands-skills.js +13 -13
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +18 -0
- package/dist/src/gateway/hono/routes/config-patch/agents.js +418 -0
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +12 -0
- package/dist/src/gateway/hono/routes/config-patch/channels.js +186 -0
- package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +18 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.js +264 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/index.d.ts +9 -0
- package/dist/src/gateway/hono/routes/config-patch/index.js +6 -0
- package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +23 -0
- package/dist/src/gateway/hono/routes/config-patch/misc.js +139 -0
- package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/result.d.ts +18 -0
- package/dist/src/gateway/hono/routes/config-patch/result.js +13 -0
- package/dist/src/gateway/hono/routes/config-patch/result.js.map +1 -0
- package/dist/src/gateway/hono/routes/config.js +20 -1764
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +2 -3
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/exposure.js +2 -1
- package/dist/src/gateway/hono/routes/exposure.js.map +1 -1
- package/dist/src/gateway/hono/routes/host-fs.js +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -5
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/mcp.js +1 -2
- package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +32 -32
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/shares.js +4 -4
- package/dist/src/gateway/hono/routes/shares.js.map +1 -1
- package/dist/src/gateway/hono/routes/tunnel.js +1 -1
- package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +6 -7
- package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
- package/dist/src/gateway/hono/sse.d.ts +1 -0
- package/dist/src/gateway/hono/sse.js +3 -2
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/index.d.ts +1 -1
- package/dist/src/gateway/index.js +4 -2
- package/dist/src/gateway/lock.js +3 -3
- package/dist/src/gateway/rate-limit/auth-policy.d.ts +34 -0
- package/dist/src/gateway/rate-limit/auth-policy.js +49 -0
- package/dist/src/gateway/rate-limit/auth-policy.js.map +1 -0
- package/dist/src/gateway/rate-limit/buckets.d.ts +63 -0
- package/dist/src/gateway/rate-limit/buckets.js +143 -0
- package/dist/src/gateway/rate-limit/buckets.js.map +1 -0
- package/dist/src/gateway/rate-limit/env-flags.d.ts +13 -0
- package/dist/src/gateway/rate-limit/env-flags.js +16 -0
- package/dist/src/gateway/rate-limit/env-flags.js.map +1 -0
- package/dist/src/gateway/rate-limit/index.d.ts +3 -0
- package/dist/src/gateway/rate-limit/index.js +4 -0
- package/dist/src/gateway/run-loop.d.ts +1 -1
- package/dist/src/gateway/run-loop.js +24 -4
- package/dist/src/gateway/run-loop.js.map +1 -1
- package/dist/src/gateway/runtime-config.js +2 -1
- package/dist/src/gateway/runtime-config.js.map +1 -1
- package/dist/src/gateway/security/audit.js +2 -1
- package/dist/src/gateway/security/audit.js.map +1 -1
- package/dist/src/gateway/security/index.d.ts +0 -1
- package/dist/src/gateway/security/index.js +1 -2
- package/dist/src/gateway/security/loopback.d.ts +13 -0
- package/dist/src/gateway/security/loopback.js +45 -0
- package/dist/src/gateway/security/loopback.js.map +1 -0
- package/dist/src/gateway/service/agent-runner.d.ts +108 -0
- package/dist/src/gateway/service/agent-runner.js +184 -0
- package/dist/src/gateway/service/agent-runner.js.map +1 -0
- package/dist/src/gateway/service/config-coordinator.d.ts +119 -0
- package/dist/src/gateway/service/config-coordinator.js +351 -0
- package/dist/src/gateway/service/config-coordinator.js.map +1 -0
- package/dist/src/gateway/service/marketplace-service.d.ts +85 -0
- package/dist/src/gateway/service/marketplace-service.js +239 -0
- package/dist/src/gateway/service/marketplace-service.js.map +1 -0
- package/dist/src/gateway/service/run-gateway-agent.js +5 -5
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +125 -0
- package/dist/src/gateway/service/sessions-api.js +135 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -0
- package/dist/src/gateway/service.d.ts +30 -360
- package/dist/src/gateway/service.js +122 -904
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/workspace-fs-file-list.js +1 -1
- package/dist/src/gateway/workspace-heartbeat-path.js +1 -2
- package/dist/src/gateway/workspace-heartbeat-path.js.map +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/infra/gateway-process-argv.d.ts +4 -0
- package/dist/src/infra/gateway-process-argv.js +26 -0
- package/dist/src/infra/gateway-process-argv.js.map +1 -0
- package/dist/src/infra/gateway-processes.d.ts +5 -0
- package/dist/src/infra/gateway-processes.js +65 -0
- package/dist/src/infra/gateway-processes.js.map +1 -0
- package/dist/src/infra/rate-limit/failure-limiter.d.ts +50 -0
- package/dist/src/infra/rate-limit/failure-limiter.js +100 -0
- package/dist/src/infra/rate-limit/failure-limiter.js.map +1 -0
- package/dist/src/infra/rate-limit/index.d.ts +5 -0
- package/dist/src/infra/rate-limit/index.js +3 -0
- package/dist/src/infra/rate-limit/keyed-store.d.ts +34 -0
- package/dist/src/infra/rate-limit/keyed-store.js +44 -0
- package/dist/src/infra/rate-limit/keyed-store.js.map +1 -0
- package/dist/src/infra/rate-limit/rate-limiter.d.ts +39 -0
- package/dist/src/infra/rate-limit/rate-limiter.js +65 -0
- package/dist/src/infra/rate-limit/rate-limiter.js.map +1 -0
- package/dist/src/infra/restart.d.ts +21 -0
- package/dist/src/infra/restart.js +122 -0
- package/dist/src/infra/restart.js.map +1 -0
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-lock.js +3 -3
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/infra/update-startup.js +2 -2
- package/dist/src/infra/write-file-atomic.js +2 -2
- package/dist/src/mcp/channel-bridge.d.ts +0 -6
- package/dist/src/mcp/channel-bridge.js +1 -5
- package/dist/src/mcp/channel-bridge.js.map +1 -1
- package/dist/src/media-shared/http/ssrf-guard.js +1 -1
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/index.js +2 -2
- package/dist/src/providers/model-registry.js +1 -1
- package/dist/src/session/config-store.js +2 -2
- package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
- package/dist/src/session/parity/sessions-json-file-read.d.ts +2 -1
- package/dist/src/session/parity/sessions-json-file-read.js.map +1 -1
- package/dist/src/session/parity/sessions-json-file.js +1 -1
- package/dist/src/session/parity/transcript-file-lock.js +2 -2
- package/dist/src/session/parity/transcript-paths.js +1 -1
- package/dist/src/session/search-index-cache.js +1 -1
- package/dist/src/session/search-index.js +1 -1
- package/dist/src/session/session-title.js +1 -1
- package/dist/src/session/store.js +5 -5
- package/dist/src/share/share-rate-limit.d.ts +10 -2
- package/dist/src/share/share-rate-limit.js +39 -27
- package/dist/src/share/share-rate-limit.js.map +1 -1
- package/dist/src/share/share-store.js +3 -3
- package/dist/src/tui/backends/embedded-backend.js +16 -12
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/clipboard-image.js +2 -2
- package/dist/src/tui/extension-host/load-extensions.js +1 -1
- package/dist/src/tui/format-tui-hotkeys.js +1 -1
- package/dist/src/tui/theme-manager.js +1 -1
- package/dist/src/tui/tui-keybindings-file.js +1 -1
- package/dist/src/tui/tui-scoped-models.js +1 -1
- package/dist/src/tui/tui-settings.js +1 -1
- package/dist/src/tui/tui-skills-autocomplete.js +1 -1
- package/dist/src/tui/tui.js +1 -2
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/tui/xopc-tui-keybindings.d.ts +0 -1
- package/dist/src/tui/xopc-tui-keybindings.js +1 -2
- package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
- package/dist/src/tunnel/frpc-binary.js +2 -2
- package/dist/src/tunnel/frpc-config.js +1 -1
- package/dist/src/tunnel/frpc-extract.js +1 -1
- package/dist/src/tunnel/pairing-rate-limit.d.ts +10 -2
- package/dist/src/tunnel/pairing-rate-limit.js +19 -15
- package/dist/src/tunnel/pairing-rate-limit.js.map +1 -1
- package/dist/src/tunnel/tunnel-rate-limit.d.ts +6 -3
- package/dist/src/tunnel/tunnel-rate-limit.js +19 -18
- package/dist/src/tunnel/tunnel-rate-limit.js.map +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/stats.d.ts +1 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/factory.js +1 -1
- package/dist/src/voice/tts/index.js +2 -2
- package/dist/src/voice/tts/merge-config.js +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +1 -1
- package/dist/src/voice/tts/service.js +1 -1
- package/dist/src/voice/tts/service.js.map +1 -1
- package/dist/src/voice/tts/speak-core.js +1 -1
- package/package.json +10 -5
- package/dist/gateway/static/root/assets/agents-DOONGaKz.js +0 -222
- package/dist/gateway/static/root/assets/channels-settings-CARdL-ys.js +0 -1
- package/dist/gateway/static/root/assets/fetch-BAAh_kXG.js +0 -3
- package/dist/gateway/static/root/assets/index-C8yHX-AA.css +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BCNnhz9g.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-B7_PjiHL.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-VrL9TeVF.js +0 -2
- package/dist/gateway/static/root/assets/voice-api-key-field-k4FWwgkk.js +0 -1
- package/dist/src/agent/embedded/session-raw-append-message.d.ts +0 -11
- package/dist/src/agent/embedded/session-raw-append-message.js +0 -15
- package/dist/src/agent/embedded/session-raw-append-message.js.map +0 -1
- package/dist/src/agent/embedded/session-tool-result-guard-wrapper.d.ts +0 -15
- package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js +0 -24
- package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js.map +0 -1
- package/dist/src/agent/embedded/session-tool-result-state.d.ts +0 -17
- package/dist/src/agent/embedded/session-tool-result-state.js +0 -26
- package/dist/src/agent/embedded/session-tool-result-state.js.map +0 -1
- package/dist/src/daemon/launchd-restart-handoff.d.ts +0 -25
- package/dist/src/daemon/launchd-restart-handoff.js +0 -132
- package/dist/src/daemon/launchd-restart-handoff.js.map +0 -1
- package/dist/src/gateway/auth-rate-limit.d.ts +0 -71
- package/dist/src/gateway/auth-rate-limit.js +0 -192
- package/dist/src/gateway/auth-rate-limit.js.map +0 -1
- package/dist/src/gateway/restart-handler.d.ts +0 -14
- package/dist/src/gateway/restart-handler.js +0 -64
- package/dist/src/gateway/restart-handler.js.map +0 -1
- package/dist/src/gateway/security/flood-guard.d.ts +0 -28
- package/dist/src/gateway/security/flood-guard.js +0 -42
- package/dist/src/gateway/security/flood-guard.js.map +0 -1
- package/dist/src/infra/rate-limit.d.ts +0 -38
- package/dist/src/infra/rate-limit.js +0 -60
- package/dist/src/infra/rate-limit.js.map +0 -1
- package/dist/src/infra/restart-intent.d.ts +0 -13
- package/dist/src/infra/restart-intent.js +0 -40
- package/dist/src/infra/restart-intent.js.map +0 -1
- package/dist/src/infra/restart-sentinel.d.ts +0 -23
- package/dist/src/infra/restart-sentinel.js +0 -75
- package/dist/src/infra/restart-sentinel.js.map +0 -1
- package/skills/creative/canvas-design/LICENSE.txt +0 -202
- package/skills/creative/canvas-design/SKILL-zh.md +0 -130
- package/skills/creative/canvas-design/SKILL.md +0 -130
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
//#region src/gateway/hono/routes/config-patch/channels.ts
|
|
2
|
+
function applyChannelsPatch(config, body) {
|
|
3
|
+
const patchChannels = body.channels;
|
|
4
|
+
if (patchChannels == null || typeof patchChannels !== "object" || Array.isArray(patchChannels)) return;
|
|
5
|
+
if ("telegram" in patchChannels) {
|
|
6
|
+
const tgRaw = patchChannels.telegram;
|
|
7
|
+
if (tgRaw === null) {
|
|
8
|
+
if (config.channels) delete config.channels.telegram;
|
|
9
|
+
} else if (typeof tgRaw === "object" && !Array.isArray(tgRaw)) {
|
|
10
|
+
const bodyTg = tgRaw;
|
|
11
|
+
if (!config.channels) config.channels = { telegram: {
|
|
12
|
+
enabled: false,
|
|
13
|
+
allowFrom: [],
|
|
14
|
+
groupAllowFrom: [],
|
|
15
|
+
debug: false,
|
|
16
|
+
accounts: { default: {
|
|
17
|
+
accountId: "default",
|
|
18
|
+
enabled: true,
|
|
19
|
+
botToken: "",
|
|
20
|
+
allowFrom: [],
|
|
21
|
+
dmPolicy: "pairing",
|
|
22
|
+
groupPolicy: "open",
|
|
23
|
+
replyToMode: "off",
|
|
24
|
+
historyLimit: 50,
|
|
25
|
+
textChunkLimit: 4e3,
|
|
26
|
+
streamMode: "partial"
|
|
27
|
+
} },
|
|
28
|
+
dmPolicy: "pairing",
|
|
29
|
+
groupPolicy: "open",
|
|
30
|
+
replyToMode: "off",
|
|
31
|
+
historyLimit: 50,
|
|
32
|
+
textChunkLimit: 4e3
|
|
33
|
+
} };
|
|
34
|
+
if (!config.channels.telegram) config.channels.telegram = {};
|
|
35
|
+
const tg = config.channels.telegram;
|
|
36
|
+
if (bodyTg.enabled !== void 0) tg.enabled = bodyTg.enabled;
|
|
37
|
+
if (bodyTg.botToken !== void 0) {
|
|
38
|
+
const accRaw = tg.accounts;
|
|
39
|
+
const acc = accRaw && typeof accRaw === "object" && !Array.isArray(accRaw) ? { ...accRaw } : {};
|
|
40
|
+
const defRaw = acc.default;
|
|
41
|
+
acc.default = {
|
|
42
|
+
...defRaw && typeof defRaw === "object" && !Array.isArray(defRaw) ? { ...defRaw } : {},
|
|
43
|
+
accountId: "default",
|
|
44
|
+
botToken: bodyTg.botToken
|
|
45
|
+
};
|
|
46
|
+
tg.accounts = acc;
|
|
47
|
+
}
|
|
48
|
+
if (bodyTg.allowFrom !== void 0) tg.allowFrom = bodyTg.allowFrom;
|
|
49
|
+
if ("apiRoot" in bodyTg) {
|
|
50
|
+
const ar = bodyTg.apiRoot;
|
|
51
|
+
if (ar === null || ar === void 0 || typeof ar === "string" && !ar.trim()) delete tg.apiRoot;
|
|
52
|
+
else tg.apiRoot = String(ar).trim();
|
|
53
|
+
}
|
|
54
|
+
if (bodyTg.debug !== void 0) tg.debug = bodyTg.debug;
|
|
55
|
+
if (bodyTg.streamMode !== void 0) tg.streamMode = bodyTg.streamMode;
|
|
56
|
+
if ("groupAllowFrom" in bodyTg) {
|
|
57
|
+
const ga = bodyTg.groupAllowFrom;
|
|
58
|
+
if (ga === null || Array.isArray(ga) && ga.length === 0) delete tg.groupAllowFrom;
|
|
59
|
+
else tg.groupAllowFrom = ga;
|
|
60
|
+
}
|
|
61
|
+
if (bodyTg.dmPolicy !== void 0) tg.dmPolicy = bodyTg.dmPolicy;
|
|
62
|
+
if (bodyTg.groupPolicy !== void 0) tg.groupPolicy = bodyTg.groupPolicy;
|
|
63
|
+
if (bodyTg.replyToMode !== void 0) tg.replyToMode = bodyTg.replyToMode;
|
|
64
|
+
if (bodyTg.historyLimit !== void 0) tg.historyLimit = bodyTg.historyLimit;
|
|
65
|
+
if (bodyTg.textChunkLimit !== void 0) tg.textChunkLimit = bodyTg.textChunkLimit;
|
|
66
|
+
if ("proxy" in bodyTg) {
|
|
67
|
+
const pr = bodyTg.proxy;
|
|
68
|
+
if (pr === null || pr === void 0 || typeof pr === "string" && !pr.trim()) delete tg.proxy;
|
|
69
|
+
else tg.proxy = String(pr).trim();
|
|
70
|
+
}
|
|
71
|
+
if (bodyTg.accounts !== void 0) tg.accounts = bodyTg.accounts;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if ("weixin" in patchChannels) {
|
|
75
|
+
const wxRaw = patchChannels.weixin;
|
|
76
|
+
if (wxRaw === null) {
|
|
77
|
+
if (config.channels) delete config.channels.weixin;
|
|
78
|
+
} else if (typeof wxRaw === "object" && !Array.isArray(wxRaw)) {
|
|
79
|
+
const wx = wxRaw;
|
|
80
|
+
if (!config.channels) config.channels = {};
|
|
81
|
+
if (!config.channels.weixin) config.channels.weixin = {
|
|
82
|
+
enabled: false,
|
|
83
|
+
dmPolicy: "open",
|
|
84
|
+
allowFrom: [],
|
|
85
|
+
debug: false,
|
|
86
|
+
historyLimit: 50,
|
|
87
|
+
textChunkLimit: 4e3
|
|
88
|
+
};
|
|
89
|
+
const wxTarget = config.channels.weixin;
|
|
90
|
+
if (wx.enabled !== void 0) wxTarget.enabled = wx.enabled;
|
|
91
|
+
if (wx.dmPolicy !== void 0) wxTarget.dmPolicy = wx.dmPolicy;
|
|
92
|
+
if (wx.allowFrom !== void 0) wxTarget.allowFrom = wx.allowFrom;
|
|
93
|
+
if (wx.debug !== void 0) wxTarget.debug = wx.debug;
|
|
94
|
+
if (wx.streamMode !== void 0) wxTarget.streamMode = wx.streamMode;
|
|
95
|
+
if (wx.historyLimit !== void 0) wxTarget.historyLimit = wx.historyLimit;
|
|
96
|
+
if (wx.textChunkLimit !== void 0) wxTarget.textChunkLimit = wx.textChunkLimit;
|
|
97
|
+
if ("routeTag" in wx) {
|
|
98
|
+
const rt = wx.routeTag;
|
|
99
|
+
if (rt === null || rt === void 0 || rt === "") delete wxTarget.routeTag;
|
|
100
|
+
else wxTarget.routeTag = rt;
|
|
101
|
+
}
|
|
102
|
+
if (wx.accounts !== void 0) wxTarget.accounts = wx.accounts;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if ("feishu" in patchChannels) {
|
|
106
|
+
const fsRaw = patchChannels.feishu;
|
|
107
|
+
if (fsRaw === null) {
|
|
108
|
+
if (config.channels) delete config.channels.feishu;
|
|
109
|
+
} else if (typeof fsRaw === "object" && !Array.isArray(fsRaw)) {
|
|
110
|
+
const fs = fsRaw;
|
|
111
|
+
if (!config.channels) config.channels = {};
|
|
112
|
+
if (!config.channels.feishu) config.channels.feishu = {
|
|
113
|
+
enabled: false,
|
|
114
|
+
appId: "",
|
|
115
|
+
appSecret: "",
|
|
116
|
+
domain: "feishu",
|
|
117
|
+
connectionMode: "websocket",
|
|
118
|
+
dmPolicy: "open",
|
|
119
|
+
groupPolicy: "allowlist",
|
|
120
|
+
allowFrom: [],
|
|
121
|
+
groupAllowFrom: [],
|
|
122
|
+
requireMention: true,
|
|
123
|
+
historyLimit: 50,
|
|
124
|
+
textChunkLimit: 4e3,
|
|
125
|
+
accounts: {}
|
|
126
|
+
};
|
|
127
|
+
const fsTarget = config.channels.feishu;
|
|
128
|
+
if (fs.enabled !== void 0) fsTarget.enabled = fs.enabled;
|
|
129
|
+
if (fs.defaultAccount !== void 0) {
|
|
130
|
+
const da = fs.defaultAccount;
|
|
131
|
+
if (da === null || da === "") delete fsTarget.defaultAccount;
|
|
132
|
+
else fsTarget.defaultAccount = String(da);
|
|
133
|
+
}
|
|
134
|
+
if (fs.appId !== void 0) fsTarget.appId = fs.appId;
|
|
135
|
+
if ("appSecret" in fs) {
|
|
136
|
+
const v = fs.appSecret;
|
|
137
|
+
if (v === null || typeof v === "string" && !String(v).trim()) delete fsTarget.appSecret;
|
|
138
|
+
else fsTarget.appSecret = v;
|
|
139
|
+
}
|
|
140
|
+
if (fs.domain !== void 0) fsTarget.domain = fs.domain;
|
|
141
|
+
if (fs.connectionMode !== void 0) fsTarget.connectionMode = fs.connectionMode;
|
|
142
|
+
if (fs.verificationToken !== void 0) {
|
|
143
|
+
const v = fs.verificationToken;
|
|
144
|
+
if (v === null || typeof v === "string" && !String(v).trim()) delete fsTarget.verificationToken;
|
|
145
|
+
else fsTarget.verificationToken = v;
|
|
146
|
+
}
|
|
147
|
+
if (fs.encryptKey !== void 0) {
|
|
148
|
+
const v = fs.encryptKey;
|
|
149
|
+
if (v === null || typeof v === "string" && !String(v).trim()) delete fsTarget.encryptKey;
|
|
150
|
+
else fsTarget.encryptKey = v;
|
|
151
|
+
}
|
|
152
|
+
if (fs.webhookHost !== void 0) {
|
|
153
|
+
const v = fs.webhookHost;
|
|
154
|
+
if (v === null || typeof v === "string" && !String(v).trim()) delete fsTarget.webhookHost;
|
|
155
|
+
else fsTarget.webhookHost = v;
|
|
156
|
+
}
|
|
157
|
+
if (fs.webhookPort !== void 0) fsTarget.webhookPort = fs.webhookPort;
|
|
158
|
+
if (fs.webhookPath !== void 0) {
|
|
159
|
+
const v = fs.webhookPath;
|
|
160
|
+
if (v === null || typeof v === "string" && !String(v).trim()) delete fsTarget.webhookPath;
|
|
161
|
+
else fsTarget.webhookPath = v;
|
|
162
|
+
}
|
|
163
|
+
if (fs.dmPolicy !== void 0) fsTarget.dmPolicy = fs.dmPolicy;
|
|
164
|
+
if (fs.groupPolicy !== void 0) fsTarget.groupPolicy = fs.groupPolicy;
|
|
165
|
+
if (fs.allowFrom !== void 0) fsTarget.allowFrom = fs.allowFrom;
|
|
166
|
+
if (fs.groupAllowFrom !== void 0) {
|
|
167
|
+
const ga = fs.groupAllowFrom;
|
|
168
|
+
if (ga === null || Array.isArray(ga) && ga.length === 0) delete fsTarget.groupAllowFrom;
|
|
169
|
+
else fsTarget.groupAllowFrom = ga;
|
|
170
|
+
}
|
|
171
|
+
if (fs.requireMention !== void 0) fsTarget.requireMention = fs.requireMention;
|
|
172
|
+
if (fs.historyLimit !== void 0) fsTarget.historyLimit = fs.historyLimit;
|
|
173
|
+
if (fs.textChunkLimit !== void 0) fsTarget.textChunkLimit = fs.textChunkLimit;
|
|
174
|
+
if (fs.renderMode !== void 0) fsTarget.renderMode = fs.renderMode;
|
|
175
|
+
if (fs.streaming !== void 0) fsTarget.streaming = fs.streaming;
|
|
176
|
+
if (fs.reactionNotifications !== void 0) fsTarget.reactionNotifications = fs.reactionNotifications;
|
|
177
|
+
if (fs.tools !== void 0) fsTarget.tools = fs.tools;
|
|
178
|
+
if (fs.actions !== void 0) fsTarget.actions = fs.actions;
|
|
179
|
+
if (fs.accounts !== void 0) fsTarget.accounts = fs.accounts;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//#endregion
|
|
184
|
+
export { applyChannelsPatch };
|
|
185
|
+
|
|
186
|
+
//# sourceMappingURL=channels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channels.js","names":[],"sources":["../../../../../../src/gateway/hono/routes/config-patch/channels.ts"],"sourcesContent":["/**\n * `PATCH /api/config` — `body.channels.{telegram,weixin,feishu}` section.\n *\n * Uses `in patchChannels` / `null` semantics so the web UI can remove a\n * provider with `{ weixin: null }` — `if (ch.weixin)` would silently drop\n * those clears.\n *\n * Each provider has its own first-init template (so a brand-new install gets\n * sane account / policy defaults), then field-by-field overlay.\n */\nimport type { Config } from '../../../../config/schema.js';\n\nexport function applyChannelsPatch(config: Config, body: any): void {\n const patchChannels = body.channels;\n if (patchChannels == null || typeof patchChannels !== 'object' || Array.isArray(patchChannels)) {\n return;\n }\n\n if ('telegram' in patchChannels) {\n const tgRaw = patchChannels.telegram;\n if (tgRaw === null) {\n if (config.channels) delete config.channels.telegram;\n } else if (typeof tgRaw === 'object' && !Array.isArray(tgRaw)) {\n const bodyTg = tgRaw as Record<string, unknown>;\n if (!config.channels) {\n config.channels = {\n telegram: {\n enabled: false,\n allowFrom: [],\n groupAllowFrom: [],\n debug: false,\n accounts: {\n default: {\n accountId: 'default',\n enabled: true,\n botToken: '',\n allowFrom: [],\n dmPolicy: 'pairing' as const,\n groupPolicy: 'open' as const,\n replyToMode: 'off' as const,\n historyLimit: 50,\n textChunkLimit: 4000,\n streamMode: 'partial' as const,\n },\n },\n dmPolicy: 'pairing' as const,\n groupPolicy: 'open' as const,\n replyToMode: 'off' as const,\n historyLimit: 50,\n textChunkLimit: 4000,\n },\n };\n }\n if (!config.channels.telegram) config.channels.telegram = {} as any;\n const tg = config.channels.telegram as Record<string, unknown>;\n\n if (bodyTg.enabled !== undefined) {\n tg.enabled = bodyTg.enabled;\n }\n if (bodyTg.botToken !== undefined) {\n const accRaw = tg.accounts;\n const acc =\n accRaw && typeof accRaw === 'object' && !Array.isArray(accRaw)\n ? { ...(accRaw as Record<string, unknown>) }\n : {};\n const defRaw = acc.default;\n const def =\n defRaw && typeof defRaw === 'object' && !Array.isArray(defRaw)\n ? { ...(defRaw as Record<string, unknown>) }\n : {};\n acc.default = {\n ...def,\n accountId: 'default',\n botToken: bodyTg.botToken,\n };\n tg.accounts = acc;\n }\n if (bodyTg.allowFrom !== undefined) {\n tg.allowFrom = bodyTg.allowFrom;\n }\n if ('apiRoot' in bodyTg) {\n const ar = bodyTg.apiRoot;\n if (ar === null || ar === undefined || (typeof ar === 'string' && !ar.trim())) {\n delete tg.apiRoot;\n } else {\n tg.apiRoot = String(ar).trim();\n }\n }\n if (bodyTg.debug !== undefined) {\n tg.debug = bodyTg.debug;\n }\n if (bodyTg.streamMode !== undefined) {\n tg.streamMode = bodyTg.streamMode;\n }\n if ('groupAllowFrom' in bodyTg) {\n const ga = bodyTg.groupAllowFrom;\n if (ga === null || (Array.isArray(ga) && ga.length === 0)) {\n delete tg.groupAllowFrom;\n } else {\n tg.groupAllowFrom = ga;\n }\n }\n if (bodyTg.dmPolicy !== undefined) {\n tg.dmPolicy = bodyTg.dmPolicy;\n }\n if (bodyTg.groupPolicy !== undefined) {\n tg.groupPolicy = bodyTg.groupPolicy;\n }\n if (bodyTg.replyToMode !== undefined) {\n tg.replyToMode = bodyTg.replyToMode;\n }\n if (bodyTg.historyLimit !== undefined) {\n tg.historyLimit = bodyTg.historyLimit;\n }\n if (bodyTg.textChunkLimit !== undefined) {\n tg.textChunkLimit = bodyTg.textChunkLimit;\n }\n if ('proxy' in bodyTg) {\n const pr = bodyTg.proxy;\n if (pr === null || pr === undefined || (typeof pr === 'string' && !pr.trim())) {\n delete tg.proxy;\n } else {\n tg.proxy = String(pr).trim();\n }\n }\n if (bodyTg.accounts !== undefined) {\n tg.accounts = bodyTg.accounts;\n }\n }\n }\n\n if ('weixin' in patchChannels) {\n const wxRaw = patchChannels.weixin;\n if (wxRaw === null) {\n if (config.channels) delete config.channels.weixin;\n } else if (typeof wxRaw === 'object' && !Array.isArray(wxRaw)) {\n const wx = wxRaw as Record<string, unknown>;\n if (!config.channels) config.channels = {} as any;\n if (!config.channels.weixin) {\n config.channels.weixin = {\n enabled: false,\n dmPolicy: 'open',\n allowFrom: [],\n debug: false,\n historyLimit: 50,\n textChunkLimit: 4000,\n };\n }\n const wxTarget = config.channels.weixin as Record<string, unknown>;\n if (wx.enabled !== undefined) wxTarget.enabled = wx.enabled;\n if (wx.dmPolicy !== undefined) wxTarget.dmPolicy = wx.dmPolicy;\n if (wx.allowFrom !== undefined) wxTarget.allowFrom = wx.allowFrom;\n if (wx.debug !== undefined) wxTarget.debug = wx.debug;\n if (wx.streamMode !== undefined) wxTarget.streamMode = wx.streamMode;\n if (wx.historyLimit !== undefined) wxTarget.historyLimit = wx.historyLimit;\n if (wx.textChunkLimit !== undefined) wxTarget.textChunkLimit = wx.textChunkLimit;\n if ('routeTag' in wx) {\n const rt = wx.routeTag;\n if (rt === null || rt === undefined || rt === '') {\n delete wxTarget.routeTag;\n } else {\n wxTarget.routeTag = rt as string | number;\n }\n }\n if (wx.accounts !== undefined) wxTarget.accounts = wx.accounts;\n }\n }\n\n if ('feishu' in patchChannels) {\n const fsRaw = patchChannels.feishu;\n if (fsRaw === null) {\n if (config.channels) delete config.channels.feishu;\n } else if (typeof fsRaw === 'object' && !Array.isArray(fsRaw)) {\n const fs = fsRaw as Record<string, unknown>;\n if (!config.channels) config.channels = {} as any;\n if (!config.channels.feishu) {\n config.channels.feishu = {\n enabled: false,\n appId: '',\n appSecret: '',\n domain: 'feishu',\n connectionMode: 'websocket',\n dmPolicy: 'open',\n groupPolicy: 'allowlist',\n allowFrom: [],\n groupAllowFrom: [],\n requireMention: true,\n historyLimit: 50,\n textChunkLimit: 4000,\n accounts: {},\n };\n }\n const fsTarget = config.channels.feishu as Record<string, unknown>;\n\n if (fs.enabled !== undefined) fsTarget.enabled = fs.enabled;\n if (fs.defaultAccount !== undefined) {\n const da = fs.defaultAccount;\n if (da === null || da === '') delete fsTarget.defaultAccount;\n else fsTarget.defaultAccount = String(da);\n }\n if (fs.appId !== undefined) fsTarget.appId = fs.appId;\n if ('appSecret' in fs) {\n const v = fs.appSecret;\n if (v === null || (typeof v === 'string' && !String(v).trim())) {\n delete fsTarget.appSecret;\n } else {\n fsTarget.appSecret = v;\n }\n }\n if (fs.domain !== undefined) fsTarget.domain = fs.domain;\n if (fs.connectionMode !== undefined) fsTarget.connectionMode = fs.connectionMode;\n if (fs.verificationToken !== undefined) {\n const v = fs.verificationToken;\n if (v === null || (typeof v === 'string' && !String(v).trim())) delete fsTarget.verificationToken;\n else fsTarget.verificationToken = v;\n }\n if (fs.encryptKey !== undefined) {\n const v = fs.encryptKey;\n if (v === null || (typeof v === 'string' && !String(v).trim())) delete fsTarget.encryptKey;\n else fsTarget.encryptKey = v;\n }\n if (fs.webhookHost !== undefined) {\n const v = fs.webhookHost;\n if (v === null || (typeof v === 'string' && !String(v).trim())) delete fsTarget.webhookHost;\n else fsTarget.webhookHost = v;\n }\n if (fs.webhookPort !== undefined) fsTarget.webhookPort = fs.webhookPort;\n if (fs.webhookPath !== undefined) {\n const v = fs.webhookPath;\n if (v === null || (typeof v === 'string' && !String(v).trim())) delete fsTarget.webhookPath;\n else fsTarget.webhookPath = v;\n }\n if (fs.dmPolicy !== undefined) fsTarget.dmPolicy = fs.dmPolicy;\n if (fs.groupPolicy !== undefined) fsTarget.groupPolicy = fs.groupPolicy;\n if (fs.allowFrom !== undefined) fsTarget.allowFrom = fs.allowFrom;\n if (fs.groupAllowFrom !== undefined) {\n const ga = fs.groupAllowFrom;\n if (ga === null || (Array.isArray(ga) && ga.length === 0)) delete fsTarget.groupAllowFrom;\n else fsTarget.groupAllowFrom = ga;\n }\n if (fs.requireMention !== undefined) fsTarget.requireMention = fs.requireMention;\n if (fs.historyLimit !== undefined) fsTarget.historyLimit = fs.historyLimit;\n if (fs.textChunkLimit !== undefined) fsTarget.textChunkLimit = fs.textChunkLimit;\n if (fs.renderMode !== undefined) fsTarget.renderMode = fs.renderMode;\n if (fs.streaming !== undefined) fsTarget.streaming = fs.streaming;\n if (fs.reactionNotifications !== undefined) {\n fsTarget.reactionNotifications = fs.reactionNotifications;\n }\n if (fs.tools !== undefined) fsTarget.tools = fs.tools;\n if (fs.actions !== undefined) fsTarget.actions = fs.actions;\n if (fs.accounts !== undefined) fsTarget.accounts = fs.accounts;\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `PATCH /api/config` — `body.gateway.*` section.
|
|
3
|
+
*
|
|
4
|
+
* Covers heartbeat, bind/customBindHost/port, tailscale, auth (mode + token +
|
|
5
|
+
* password + rateLimit + trustedProxy), trustedProxies, allowRealIpFallback,
|
|
6
|
+
* dangerouslyAllowHostHeaderOriginFallback, security, share, corsOrigins,
|
|
7
|
+
* maxSseConnections, and channelConnectDefer{Mode,Ids,SkipIds}.
|
|
8
|
+
*
|
|
9
|
+
* Validation policy: each subsection that can reject rejects with a 400 and a
|
|
10
|
+
* specific `message`. The dispatcher converts these into `c.json(...)`.
|
|
11
|
+
*
|
|
12
|
+
* Initial-state branches use the same literal defaults the inline code did
|
|
13
|
+
* (loopback + port 18790 + 1800s heartbeat + 100 SSE conn + empty CORS) so
|
|
14
|
+
* a brand-new install gets a working gateway after the first PATCH.
|
|
15
|
+
*/
|
|
16
|
+
import type { Config } from '../../../../config/schema.js';
|
|
17
|
+
import { type PatchResult } from './result.js';
|
|
18
|
+
export declare function applyGatewayPatch(config: Config, body: any): PatchResult;
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { isValidIPv4 } from "../../../../config/gateway-bind.js";
|
|
2
|
+
import { mergeShareConfigPatch } from "../../../../share/share-config.js";
|
|
3
|
+
import { PATCH_OK, patchError } from "./result.js";
|
|
4
|
+
//#region src/gateway/hono/routes/config-patch/gateway.ts
|
|
5
|
+
/**
|
|
6
|
+
* Shared default for "user PATCH'd a gateway subsection but `config.gateway`
|
|
7
|
+
* was never initialised". Identical to the inline literal repeated in the
|
|
8
|
+
* pre-extraction handler so this is behavior-preserving.
|
|
9
|
+
*/
|
|
10
|
+
function ensureGateway(config) {
|
|
11
|
+
if (!config.gateway) config.gateway = {
|
|
12
|
+
bind: "loopback",
|
|
13
|
+
port: 18790,
|
|
14
|
+
heartbeat: {
|
|
15
|
+
enabled: true,
|
|
16
|
+
intervalMs: 18e5,
|
|
17
|
+
includeSystemPromptSection: false
|
|
18
|
+
},
|
|
19
|
+
maxSseConnections: 100,
|
|
20
|
+
corsOrigins: []
|
|
21
|
+
};
|
|
22
|
+
return config.gateway;
|
|
23
|
+
}
|
|
24
|
+
function parseDeferIdList(raw) {
|
|
25
|
+
if (!Array.isArray(raw)) return null;
|
|
26
|
+
const ids = raw.filter((x) => typeof x === "string" && x.trim().length > 0).map((x) => x.trim());
|
|
27
|
+
if (ids.length > 24) return null;
|
|
28
|
+
return ids;
|
|
29
|
+
}
|
|
30
|
+
function applyGatewayPatch(config, body) {
|
|
31
|
+
if (body.gateway?.heartbeat !== void 0 && typeof body.gateway.heartbeat === "object") {
|
|
32
|
+
const gw = ensureGateway(config);
|
|
33
|
+
if (!gw.heartbeat) gw.heartbeat = {
|
|
34
|
+
enabled: true,
|
|
35
|
+
intervalMs: 18e5,
|
|
36
|
+
includeSystemPromptSection: false
|
|
37
|
+
};
|
|
38
|
+
const h = gw.heartbeat;
|
|
39
|
+
const p = body.gateway.heartbeat;
|
|
40
|
+
if (p.enabled !== void 0) h.enabled = Boolean(p.enabled);
|
|
41
|
+
if (p.intervalMs !== void 0 && typeof p.intervalMs === "number" && Number.isFinite(p.intervalMs)) h.intervalMs = p.intervalMs;
|
|
42
|
+
if (p.includeSystemPromptSection !== void 0) h.includeSystemPromptSection = Boolean(p.includeSystemPromptSection);
|
|
43
|
+
if (p.target !== void 0) if (p.target === null || p.target === "") delete h.target;
|
|
44
|
+
else h.target = String(p.target);
|
|
45
|
+
if (p.targetChatId !== void 0) if (p.targetChatId === null || p.targetChatId === "") delete h.targetChatId;
|
|
46
|
+
else h.targetChatId = String(p.targetChatId);
|
|
47
|
+
if (p.prompt !== void 0) if (p.prompt === null || p.prompt === "") delete h.prompt;
|
|
48
|
+
else h.prompt = String(p.prompt);
|
|
49
|
+
if (p.ackMaxChars !== void 0) {
|
|
50
|
+
if (p.ackMaxChars === null || p.ackMaxChars === "") delete h.ackMaxChars;
|
|
51
|
+
else if (typeof p.ackMaxChars === "number" && Number.isFinite(p.ackMaxChars)) h.ackMaxChars = p.ackMaxChars;
|
|
52
|
+
}
|
|
53
|
+
if (p.isolatedSession !== void 0) if (p.isolatedSession === null || p.isolatedSession === false) delete h.isolatedSession;
|
|
54
|
+
else h.isolatedSession = Boolean(p.isolatedSession);
|
|
55
|
+
if (p.activeHours !== void 0) {
|
|
56
|
+
if (p.activeHours === null) delete h.activeHours;
|
|
57
|
+
else if (typeof p.activeHours === "object" && p.activeHours !== null) {
|
|
58
|
+
const ah = p.activeHours;
|
|
59
|
+
const start = typeof ah.start === "string" ? ah.start : "";
|
|
60
|
+
const end = typeof ah.end === "string" ? ah.end : "";
|
|
61
|
+
if (start && end) h.activeHours = {
|
|
62
|
+
start,
|
|
63
|
+
end,
|
|
64
|
+
...typeof ah.timezone === "string" && ah.timezone.trim() ? { timezone: ah.timezone } : {}
|
|
65
|
+
};
|
|
66
|
+
else delete h.activeHours;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (body.gateway?.bind !== void 0) {
|
|
71
|
+
const bindModes = new Set([
|
|
72
|
+
"auto",
|
|
73
|
+
"loopback",
|
|
74
|
+
"lan",
|
|
75
|
+
"tailnet",
|
|
76
|
+
"custom"
|
|
77
|
+
]);
|
|
78
|
+
const bind = body.gateway.bind;
|
|
79
|
+
if (typeof bind !== "string" || !bindModes.has(bind)) return patchError("gateway.bind must be one of: auto, loopback, lan, tailnet, custom");
|
|
80
|
+
if (!config.gateway) config.gateway = {
|
|
81
|
+
bind,
|
|
82
|
+
port: 18790,
|
|
83
|
+
heartbeat: {
|
|
84
|
+
enabled: true,
|
|
85
|
+
intervalMs: 18e5,
|
|
86
|
+
includeSystemPromptSection: false
|
|
87
|
+
},
|
|
88
|
+
maxSseConnections: 100,
|
|
89
|
+
corsOrigins: []
|
|
90
|
+
};
|
|
91
|
+
else config.gateway.bind = bind;
|
|
92
|
+
if (bind !== "custom") delete config.gateway.customBindHost;
|
|
93
|
+
}
|
|
94
|
+
if (body.gateway?.customBindHost !== void 0) {
|
|
95
|
+
if (body.gateway.customBindHost === null || body.gateway.customBindHost === "") {
|
|
96
|
+
if (config.gateway) delete config.gateway.customBindHost;
|
|
97
|
+
} else if (typeof body.gateway.customBindHost !== "string" || !isValidIPv4(body.gateway.customBindHost.trim())) return patchError("gateway.customBindHost must be a valid IPv4 address");
|
|
98
|
+
else if (config.gateway) {
|
|
99
|
+
config.gateway.customBindHost = body.gateway.customBindHost.trim();
|
|
100
|
+
config.gateway.bind = "custom";
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (body.gateway?.port !== void 0) {
|
|
104
|
+
if (typeof body.gateway.port !== "number" || !Number.isFinite(body.gateway.port) || body.gateway.port < 1 || body.gateway.port > 65535) return patchError("gateway.port must be an integer from 1 to 65535");
|
|
105
|
+
if (!config.gateway) config.gateway = {
|
|
106
|
+
bind: "loopback",
|
|
107
|
+
port: Math.floor(body.gateway.port),
|
|
108
|
+
heartbeat: {
|
|
109
|
+
enabled: true,
|
|
110
|
+
intervalMs: 18e5,
|
|
111
|
+
includeSystemPromptSection: false
|
|
112
|
+
},
|
|
113
|
+
maxSseConnections: 100,
|
|
114
|
+
corsOrigins: []
|
|
115
|
+
};
|
|
116
|
+
else config.gateway.port = Math.floor(body.gateway.port);
|
|
117
|
+
}
|
|
118
|
+
if (body.gateway?.tailscale !== void 0 && typeof body.gateway.tailscale === "object") {
|
|
119
|
+
const ts = body.gateway.tailscale;
|
|
120
|
+
if (!config.gateway) config.gateway = {
|
|
121
|
+
bind: "loopback",
|
|
122
|
+
port: 18790,
|
|
123
|
+
auth: { mode: "token" },
|
|
124
|
+
heartbeat: {
|
|
125
|
+
enabled: true,
|
|
126
|
+
intervalMs: 18e5,
|
|
127
|
+
includeSystemPromptSection: false
|
|
128
|
+
},
|
|
129
|
+
maxSseConnections: 100,
|
|
130
|
+
corsOrigins: []
|
|
131
|
+
};
|
|
132
|
+
config.gateway.tailscale = { ...config.gateway.tailscale ?? {
|
|
133
|
+
mode: "off",
|
|
134
|
+
resetOnExit: true
|
|
135
|
+
} };
|
|
136
|
+
if (ts.mode !== void 0) {
|
|
137
|
+
if (ts.mode !== "off" && ts.mode !== "serve" && ts.mode !== "funnel") return patchError("gateway.tailscale.mode must be off, serve, or funnel");
|
|
138
|
+
config.gateway.tailscale.mode = ts.mode;
|
|
139
|
+
}
|
|
140
|
+
if (ts.resetOnExit !== void 0) config.gateway.tailscale.resetOnExit = ts.resetOnExit === true;
|
|
141
|
+
}
|
|
142
|
+
if (body.gateway?.auth !== void 0) {
|
|
143
|
+
const gw = ensureGateway(config);
|
|
144
|
+
if (!gw.auth) gw.auth = { mode: "token" };
|
|
145
|
+
const a = body.gateway.auth;
|
|
146
|
+
if (a.mode !== void 0) {
|
|
147
|
+
if (a.mode !== "none" && a.mode !== "token" && a.mode !== "password" && a.mode !== "trusted-proxy") return patchError("gateway.auth.mode must be none, token, password, or trusted-proxy");
|
|
148
|
+
gw.auth.mode = a.mode;
|
|
149
|
+
}
|
|
150
|
+
if (a.token !== void 0) {
|
|
151
|
+
if (a.token === null || typeof a.token === "string" && !a.token.trim()) delete gw.auth.token;
|
|
152
|
+
else if (typeof a.token === "string") gw.auth.token = a.token;
|
|
153
|
+
}
|
|
154
|
+
if (a.password !== void 0) {
|
|
155
|
+
if (a.password === null || typeof a.password === "string" && !a.password.trim()) delete gw.auth.password;
|
|
156
|
+
else if (typeof a.password === "string" && a.password !== "***" && a.password !== "••••••••••••") gw.auth.password = a.password;
|
|
157
|
+
}
|
|
158
|
+
if (a.rateLimit !== void 0 && typeof a.rateLimit === "object" && a.rateLimit !== null) {
|
|
159
|
+
const rlIn = a.rateLimit;
|
|
160
|
+
if (!gw.auth.rateLimit) gw.auth.rateLimit = {
|
|
161
|
+
enabled: true,
|
|
162
|
+
maxAttempts: 5,
|
|
163
|
+
windowMs: 9e5,
|
|
164
|
+
blockDurationMs: 3e5,
|
|
165
|
+
burstCoalesceMs: 1e3,
|
|
166
|
+
exemptLoopback: true
|
|
167
|
+
};
|
|
168
|
+
const rl = gw.auth.rateLimit;
|
|
169
|
+
if (rlIn.enabled !== void 0) rl.enabled = Boolean(rlIn.enabled);
|
|
170
|
+
if (typeof rlIn.maxAttempts === "number" && Number.isFinite(rlIn.maxAttempts)) rl.maxAttempts = Math.max(1, Math.floor(rlIn.maxAttempts));
|
|
171
|
+
if (typeof rlIn.windowMs === "number" && Number.isFinite(rlIn.windowMs) && rlIn.windowMs > 0) rl.windowMs = Math.floor(rlIn.windowMs);
|
|
172
|
+
if (typeof rlIn.blockDurationMs === "number" && Number.isFinite(rlIn.blockDurationMs) && rlIn.blockDurationMs > 0) rl.blockDurationMs = Math.floor(rlIn.blockDurationMs);
|
|
173
|
+
if (typeof rlIn.lockoutMs === "number" && Number.isFinite(rlIn.lockoutMs) && rlIn.lockoutMs > 0) rl.blockDurationMs = Math.floor(rlIn.lockoutMs);
|
|
174
|
+
if (rlIn.exemptLoopback !== void 0) rl.exemptLoopback = Boolean(rlIn.exemptLoopback);
|
|
175
|
+
}
|
|
176
|
+
if (a.trustedProxy !== void 0) {
|
|
177
|
+
if (a.trustedProxy === null) delete gw.auth.trustedProxy;
|
|
178
|
+
else if (typeof a.trustedProxy === "object" && a.trustedProxy !== null) {
|
|
179
|
+
const tpIn = a.trustedProxy;
|
|
180
|
+
const userHeader = typeof tpIn.userHeader === "string" ? tpIn.userHeader.trim() : "";
|
|
181
|
+
if (!userHeader) return patchError("gateway.auth.trustedProxy.userHeader is required");
|
|
182
|
+
const trustedProxy = { userHeader };
|
|
183
|
+
if (tpIn.requiredHeaders !== void 0) {
|
|
184
|
+
if (!Array.isArray(tpIn.requiredHeaders)) return patchError("gateway.auth.trustedProxy.requiredHeaders must be an array");
|
|
185
|
+
trustedProxy.requiredHeaders = tpIn.requiredHeaders.filter((x) => typeof x === "string" && x.trim().length > 0).map((x) => x.trim());
|
|
186
|
+
}
|
|
187
|
+
if (tpIn.allowUsers !== void 0) {
|
|
188
|
+
if (!Array.isArray(tpIn.allowUsers)) return patchError("gateway.auth.trustedProxy.allowUsers must be an array");
|
|
189
|
+
trustedProxy.allowUsers = tpIn.allowUsers.filter((x) => typeof x === "string" && x.trim().length > 0).map((x) => x.trim());
|
|
190
|
+
}
|
|
191
|
+
if (tpIn.allowLoopback !== void 0) trustedProxy.allowLoopback = Boolean(tpIn.allowLoopback);
|
|
192
|
+
gw.auth.trustedProxy = trustedProxy;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (body.gateway?.trustedProxies !== void 0) {
|
|
197
|
+
if (!Array.isArray(body.gateway.trustedProxies)) return patchError("gateway.trustedProxies must be an array");
|
|
198
|
+
const gw = ensureGateway(config);
|
|
199
|
+
gw.trustedProxies = body.gateway.trustedProxies.filter((x) => typeof x === "string" && x.trim().length > 0).map((x) => x.trim());
|
|
200
|
+
}
|
|
201
|
+
if (body.gateway?.allowRealIpFallback !== void 0) {
|
|
202
|
+
const gw = ensureGateway(config);
|
|
203
|
+
gw.allowRealIpFallback = Boolean(body.gateway.allowRealIpFallback);
|
|
204
|
+
}
|
|
205
|
+
if (body.gateway?.dangerouslyAllowHostHeaderOriginFallback !== void 0) {
|
|
206
|
+
const gw = ensureGateway(config);
|
|
207
|
+
gw.dangerouslyAllowHostHeaderOriginFallback = Boolean(body.gateway.dangerouslyAllowHostHeaderOriginFallback);
|
|
208
|
+
}
|
|
209
|
+
if (body.gateway?.security !== void 0) {
|
|
210
|
+
if (typeof body.gateway.security !== "object" || body.gateway.security === null) return patchError("gateway.security must be an object");
|
|
211
|
+
const gw = ensureGateway(config);
|
|
212
|
+
const secIn = body.gateway.security;
|
|
213
|
+
if (!gw.security) gw.security = {};
|
|
214
|
+
if (secIn.strict !== void 0) gw.security.strict = Boolean(secIn.strict);
|
|
215
|
+
}
|
|
216
|
+
if (body.gateway?.share !== void 0) {
|
|
217
|
+
if (typeof body.gateway.share !== "object" || body.gateway.share === null || Array.isArray(body.gateway.share)) return patchError("gateway.share must be an object");
|
|
218
|
+
const shareResult = mergeShareConfigPatch(config, body.gateway.share);
|
|
219
|
+
if (shareResult.ok === false) return patchError(shareResult.message);
|
|
220
|
+
}
|
|
221
|
+
if (body.gateway?.corsOrigins !== void 0) {
|
|
222
|
+
if (!Array.isArray(body.gateway.corsOrigins)) return patchError("gateway.corsOrigins must be an array");
|
|
223
|
+
const gw = ensureGateway(config);
|
|
224
|
+
gw.corsOrigins = body.gateway.corsOrigins.filter((x) => typeof x === "string" && x.trim().length > 0).map((x) => x.trim());
|
|
225
|
+
}
|
|
226
|
+
if (body.gateway?.maxSseConnections !== void 0) {
|
|
227
|
+
if (typeof body.gateway.maxSseConnections !== "number" || !Number.isFinite(body.gateway.maxSseConnections) || body.gateway.maxSseConnections < 1) return patchError("gateway.maxSseConnections must be a positive integer");
|
|
228
|
+
if (!config.gateway) config.gateway = {
|
|
229
|
+
bind: "loopback",
|
|
230
|
+
port: 18790,
|
|
231
|
+
heartbeat: {
|
|
232
|
+
enabled: true,
|
|
233
|
+
intervalMs: 18e5,
|
|
234
|
+
includeSystemPromptSection: false
|
|
235
|
+
},
|
|
236
|
+
maxSseConnections: Math.floor(body.gateway.maxSseConnections),
|
|
237
|
+
corsOrigins: []
|
|
238
|
+
};
|
|
239
|
+
else config.gateway.maxSseConnections = Math.floor(body.gateway.maxSseConnections);
|
|
240
|
+
}
|
|
241
|
+
if (body.gateway?.channelConnectDeferMode !== void 0) {
|
|
242
|
+
const mode = body.gateway.channelConnectDeferMode;
|
|
243
|
+
if (mode !== "auto" && mode !== "off" && mode !== "explicit") return patchError("gateway.channelConnectDeferMode must be auto, off, or explicit");
|
|
244
|
+
const gw = ensureGateway(config);
|
|
245
|
+
gw.channelConnectDeferMode = mode;
|
|
246
|
+
}
|
|
247
|
+
if (body.gateway?.channelConnectDeferIds !== void 0) {
|
|
248
|
+
const ids = parseDeferIdList(body.gateway.channelConnectDeferIds);
|
|
249
|
+
if (ids === null) return patchError("gateway.channelConnectDeferIds must be an array of up to 24 strings");
|
|
250
|
+
const gw = ensureGateway(config);
|
|
251
|
+
gw.channelConnectDeferIds = ids;
|
|
252
|
+
}
|
|
253
|
+
if (body.gateway?.channelConnectDeferSkipIds !== void 0) {
|
|
254
|
+
const ids = parseDeferIdList(body.gateway.channelConnectDeferSkipIds);
|
|
255
|
+
if (ids === null) return patchError("gateway.channelConnectDeferSkipIds must be an array of up to 24 strings");
|
|
256
|
+
const gw = ensureGateway(config);
|
|
257
|
+
gw.channelConnectDeferSkipIds = ids;
|
|
258
|
+
}
|
|
259
|
+
return PATCH_OK;
|
|
260
|
+
}
|
|
261
|
+
//#endregion
|
|
262
|
+
export { applyGatewayPatch };
|
|
263
|
+
|
|
264
|
+
//# sourceMappingURL=gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.js","names":[],"sources":["../../../../../../src/gateway/hono/routes/config-patch/gateway.ts"],"sourcesContent":["/**\n * `PATCH /api/config` — `body.gateway.*` section.\n *\n * Covers heartbeat, bind/customBindHost/port, tailscale, auth (mode + token +\n * password + rateLimit + trustedProxy), trustedProxies, allowRealIpFallback,\n * dangerouslyAllowHostHeaderOriginFallback, security, share, corsOrigins,\n * maxSseConnections, and channelConnectDefer{Mode,Ids,SkipIds}.\n *\n * Validation policy: each subsection that can reject rejects with a 400 and a\n * specific `message`. The dispatcher converts these into `c.json(...)`.\n *\n * Initial-state branches use the same literal defaults the inline code did\n * (loopback + port 18790 + 1800s heartbeat + 100 SSE conn + empty CORS) so\n * a brand-new install gets a working gateway after the first PATCH.\n */\nimport type { Config, GatewayBindMode } from '../../../../config/schema.js';\nimport { isValidIPv4 } from '../../../../config/gateway-bind.js';\nimport { mergeShareConfigPatch } from '../../../../share/share-config.js';\nimport { type PatchResult, PATCH_OK, patchError } from './result.js';\n\n/**\n * Shared default for \"user PATCH'd a gateway subsection but `config.gateway`\n * was never initialised\". Identical to the inline literal repeated in the\n * pre-extraction handler so this is behavior-preserving.\n */\nfunction ensureGateway(config: Config): NonNullable<Config['gateway']> {\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: 18790,\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: [],\n };\n }\n return config.gateway;\n}\n\nfunction parseDeferIdList(raw: unknown): string[] | null {\n if (!Array.isArray(raw)) return null;\n const ids = raw\n .filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n .map((x) => x.trim());\n if (ids.length > 24) return null;\n return ids;\n}\n\nexport function applyGatewayPatch(config: Config, body: any): PatchResult {\n if (body.gateway?.heartbeat !== undefined && typeof body.gateway.heartbeat === 'object') {\n const gw = ensureGateway(config);\n if (!gw.heartbeat) {\n gw.heartbeat = { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false };\n }\n const h = gw.heartbeat;\n const p = body.gateway.heartbeat as Record<string, unknown>;\n if (p.enabled !== undefined) h.enabled = Boolean(p.enabled);\n if (p.intervalMs !== undefined && typeof p.intervalMs === 'number' && Number.isFinite(p.intervalMs)) {\n h.intervalMs = p.intervalMs;\n }\n if (p.includeSystemPromptSection !== undefined) {\n h.includeSystemPromptSection = Boolean(p.includeSystemPromptSection);\n }\n if (p.target !== undefined) {\n if (p.target === null || p.target === '') delete (h as { target?: string }).target;\n else (h as { target?: string }).target = String(p.target);\n }\n if (p.targetChatId !== undefined) {\n if (p.targetChatId === null || p.targetChatId === '') delete (h as { targetChatId?: string }).targetChatId;\n else (h as { targetChatId?: string }).targetChatId = String(p.targetChatId);\n }\n if (p.prompt !== undefined) {\n if (p.prompt === null || p.prompt === '') delete (h as { prompt?: string }).prompt;\n else (h as { prompt?: string }).prompt = String(p.prompt);\n }\n if (p.ackMaxChars !== undefined) {\n if (p.ackMaxChars === null || p.ackMaxChars === '') delete (h as { ackMaxChars?: number }).ackMaxChars;\n else if (typeof p.ackMaxChars === 'number' && Number.isFinite(p.ackMaxChars)) {\n (h as { ackMaxChars?: number }).ackMaxChars = p.ackMaxChars;\n }\n }\n if (p.isolatedSession !== undefined) {\n if (p.isolatedSession === null || p.isolatedSession === false) {\n delete (h as { isolatedSession?: boolean }).isolatedSession;\n } else {\n (h as { isolatedSession?: boolean }).isolatedSession = Boolean(p.isolatedSession);\n }\n }\n if (p.activeHours !== undefined) {\n if (p.activeHours === null) {\n delete (h as { activeHours?: unknown }).activeHours;\n } else if (typeof p.activeHours === 'object' && p.activeHours !== null) {\n const ah = p.activeHours as Record<string, unknown>;\n const start = typeof ah.start === 'string' ? ah.start : '';\n const end = typeof ah.end === 'string' ? ah.end : '';\n if (start && end) {\n (h as { activeHours?: { start: string; end: string; timezone?: string } }).activeHours = {\n start,\n end,\n ...(typeof ah.timezone === 'string' && ah.timezone.trim() ? { timezone: ah.timezone } : {}),\n };\n } else {\n delete (h as { activeHours?: unknown }).activeHours;\n }\n }\n }\n }\n\n if (body.gateway?.bind !== undefined) {\n const bindModes = new Set(['auto', 'loopback', 'lan', 'tailnet', 'custom']);\n const bind = body.gateway.bind;\n if (typeof bind !== 'string' || !bindModes.has(bind)) {\n return patchError('gateway.bind must be one of: auto, loopback, lan, tailnet, custom');\n }\n if (!config.gateway) {\n config.gateway = {\n bind: bind as GatewayBindMode,\n port: 18790,\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: [],\n };\n } else {\n config.gateway.bind = bind as GatewayBindMode;\n }\n if (bind !== 'custom') {\n delete config.gateway.customBindHost;\n }\n }\n\n if (body.gateway?.customBindHost !== undefined) {\n if (body.gateway.customBindHost === null || body.gateway.customBindHost === '') {\n if (config.gateway) {\n delete config.gateway.customBindHost;\n }\n } else if (typeof body.gateway.customBindHost !== 'string' || !isValidIPv4(body.gateway.customBindHost.trim())) {\n return patchError('gateway.customBindHost must be a valid IPv4 address');\n } else if (config.gateway) {\n config.gateway.customBindHost = body.gateway.customBindHost.trim();\n config.gateway.bind = 'custom';\n }\n }\n\n if (body.gateway?.port !== undefined) {\n if (\n typeof body.gateway.port !== 'number' ||\n !Number.isFinite(body.gateway.port) ||\n body.gateway.port < 1 ||\n body.gateway.port > 65535\n ) {\n return patchError('gateway.port must be an integer from 1 to 65535');\n }\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: Math.floor(body.gateway.port),\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: [],\n };\n } else {\n config.gateway.port = Math.floor(body.gateway.port);\n }\n }\n\n if (body.gateway?.tailscale !== undefined && typeof body.gateway.tailscale === 'object') {\n const ts = body.gateway.tailscale as Record<string, unknown>;\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: 18790,\n auth: { mode: 'token' },\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: [],\n };\n }\n config.gateway.tailscale = {\n ...(config.gateway.tailscale ?? { mode: 'off', resetOnExit: true }),\n };\n if (ts.mode !== undefined) {\n if (ts.mode !== 'off' && ts.mode !== 'serve' && ts.mode !== 'funnel') {\n return patchError('gateway.tailscale.mode must be off, serve, or funnel');\n }\n config.gateway.tailscale.mode = ts.mode as 'off' | 'serve' | 'funnel';\n }\n if (ts.resetOnExit !== undefined) {\n config.gateway.tailscale.resetOnExit = ts.resetOnExit === true;\n }\n }\n\n if (body.gateway?.auth !== undefined) {\n const gw = ensureGateway(config);\n if (!gw.auth) gw.auth = { mode: 'token' };\n const a = body.gateway.auth;\n if (a.mode !== undefined) {\n if (\n a.mode !== 'none' &&\n a.mode !== 'token' &&\n a.mode !== 'password' &&\n a.mode !== 'trusted-proxy'\n ) {\n return patchError('gateway.auth.mode must be none, token, password, or trusted-proxy');\n }\n gw.auth.mode = a.mode;\n }\n if (a.token !== undefined) {\n if (a.token === null || (typeof a.token === 'string' && !a.token.trim())) {\n delete gw.auth.token;\n } else if (typeof a.token === 'string') {\n gw.auth.token = a.token;\n }\n }\n if (a.password !== undefined) {\n if (a.password === null || (typeof a.password === 'string' && !a.password.trim())) {\n delete gw.auth.password;\n } else if (\n typeof a.password === 'string' &&\n a.password !== '***' &&\n a.password !== '••••••••••••'\n ) {\n gw.auth.password = a.password;\n }\n }\n if (a.rateLimit !== undefined && typeof a.rateLimit === 'object' && a.rateLimit !== null) {\n const rlIn = a.rateLimit as Record<string, unknown>;\n if (!gw.auth.rateLimit) {\n gw.auth.rateLimit = {\n enabled: true,\n maxAttempts: 5,\n windowMs: 900_000,\n blockDurationMs: 300_000,\n burstCoalesceMs: 1000,\n exemptLoopback: true,\n };\n }\n const rl = gw.auth.rateLimit!;\n if (rlIn.enabled !== undefined) rl.enabled = Boolean(rlIn.enabled);\n if (typeof rlIn.maxAttempts === 'number' && Number.isFinite(rlIn.maxAttempts)) {\n rl.maxAttempts = Math.max(1, Math.floor(rlIn.maxAttempts));\n }\n if (typeof rlIn.windowMs === 'number' && Number.isFinite(rlIn.windowMs) && rlIn.windowMs > 0) {\n rl.windowMs = Math.floor(rlIn.windowMs);\n }\n if (\n typeof rlIn.blockDurationMs === 'number' &&\n Number.isFinite(rlIn.blockDurationMs) &&\n rlIn.blockDurationMs > 0\n ) {\n rl.blockDurationMs = Math.floor(rlIn.blockDurationMs);\n }\n if (\n typeof rlIn.lockoutMs === 'number' &&\n Number.isFinite(rlIn.lockoutMs) &&\n rlIn.lockoutMs > 0\n ) {\n rl.blockDurationMs = Math.floor(rlIn.lockoutMs);\n }\n if (rlIn.exemptLoopback !== undefined) {\n rl.exemptLoopback = Boolean(rlIn.exemptLoopback);\n }\n }\n if (a.trustedProxy !== undefined) {\n if (a.trustedProxy === null) {\n delete gw.auth.trustedProxy;\n } else if (typeof a.trustedProxy === 'object' && a.trustedProxy !== null) {\n const tpIn = a.trustedProxy as Record<string, unknown>;\n const userHeader =\n typeof tpIn.userHeader === 'string' ? tpIn.userHeader.trim() : '';\n if (!userHeader) {\n return patchError('gateway.auth.trustedProxy.userHeader is required');\n }\n const trustedProxy: NonNullable<(typeof gw.auth)['trustedProxy']> = {\n userHeader,\n };\n if (tpIn.requiredHeaders !== undefined) {\n if (!Array.isArray(tpIn.requiredHeaders)) {\n return patchError('gateway.auth.trustedProxy.requiredHeaders must be an array');\n }\n trustedProxy.requiredHeaders = tpIn.requiredHeaders\n .filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n .map((x) => x.trim());\n }\n if (tpIn.allowUsers !== undefined) {\n if (!Array.isArray(tpIn.allowUsers)) {\n return patchError('gateway.auth.trustedProxy.allowUsers must be an array');\n }\n trustedProxy.allowUsers = tpIn.allowUsers\n .filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n .map((x) => x.trim());\n }\n if (tpIn.allowLoopback !== undefined) {\n trustedProxy.allowLoopback = Boolean(tpIn.allowLoopback);\n }\n gw.auth.trustedProxy = trustedProxy;\n }\n }\n }\n\n if (body.gateway?.trustedProxies !== undefined) {\n if (!Array.isArray(body.gateway.trustedProxies)) {\n return patchError('gateway.trustedProxies must be an array');\n }\n const gw = ensureGateway(config);\n gw.trustedProxies = body.gateway.trustedProxies\n .filter((x: unknown): x is string => typeof x === 'string' && x.trim().length > 0)\n .map((x: string) => x.trim());\n }\n\n if (body.gateway?.allowRealIpFallback !== undefined) {\n const gw = ensureGateway(config);\n gw.allowRealIpFallback = Boolean(body.gateway.allowRealIpFallback);\n }\n\n if (body.gateway?.dangerouslyAllowHostHeaderOriginFallback !== undefined) {\n const gw = ensureGateway(config);\n gw.dangerouslyAllowHostHeaderOriginFallback = Boolean(\n body.gateway.dangerouslyAllowHostHeaderOriginFallback,\n );\n }\n\n if (body.gateway?.security !== undefined) {\n if (typeof body.gateway.security !== 'object' || body.gateway.security === null) {\n return patchError('gateway.security must be an object');\n }\n const gw = ensureGateway(config);\n const secIn = body.gateway.security as Record<string, unknown>;\n if (!gw.security) {\n gw.security = {};\n }\n if (secIn.strict !== undefined) {\n gw.security.strict = Boolean(secIn.strict);\n }\n }\n\n if (body.gateway?.share !== undefined) {\n if (typeof body.gateway.share !== 'object' || body.gateway.share === null || Array.isArray(body.gateway.share)) {\n return patchError('gateway.share must be an object');\n }\n const shareResult = mergeShareConfigPatch(config, body.gateway.share as Record<string, unknown>);\n if (shareResult.ok === false) {\n return patchError(shareResult.message);\n }\n }\n\n if (body.gateway?.corsOrigins !== undefined) {\n if (!Array.isArray(body.gateway.corsOrigins)) {\n return patchError('gateway.corsOrigins must be an array');\n }\n const gw = ensureGateway(config);\n gw.corsOrigins = body.gateway.corsOrigins\n .filter((x: unknown): x is string => typeof x === 'string' && x.trim().length > 0)\n .map((x: string) => x.trim());\n }\n\n if (body.gateway?.maxSseConnections !== undefined) {\n if (\n typeof body.gateway.maxSseConnections !== 'number' ||\n !Number.isFinite(body.gateway.maxSseConnections) ||\n body.gateway.maxSseConnections < 1\n ) {\n return patchError('gateway.maxSseConnections must be a positive integer');\n }\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: 18790,\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: Math.floor(body.gateway.maxSseConnections),\n corsOrigins: [],\n };\n } else {\n config.gateway.maxSseConnections = Math.floor(body.gateway.maxSseConnections);\n }\n }\n\n if (body.gateway?.channelConnectDeferMode !== undefined) {\n const mode = body.gateway.channelConnectDeferMode;\n if (mode !== 'auto' && mode !== 'off' && mode !== 'explicit') {\n return patchError('gateway.channelConnectDeferMode must be auto, off, or explicit');\n }\n const gw = ensureGateway(config);\n gw.channelConnectDeferMode = mode;\n }\n\n if (body.gateway?.channelConnectDeferIds !== undefined) {\n const ids = parseDeferIdList(body.gateway.channelConnectDeferIds);\n if (ids === null) {\n return patchError('gateway.channelConnectDeferIds must be an array of up to 24 strings');\n }\n const gw = ensureGateway(config);\n gw.channelConnectDeferIds = ids;\n }\n\n if (body.gateway?.channelConnectDeferSkipIds !== undefined) {\n const ids = parseDeferIdList(body.gateway.channelConnectDeferSkipIds);\n if (ids === null) {\n return patchError('gateway.channelConnectDeferSkipIds must be an array of up to 24 strings');\n }\n const gw = ensureGateway(config);\n gw.channelConnectDeferSkipIds = ids;\n }\n\n return PATCH_OK;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Barrel for `PATCH /api/config` section patchers. See `agents.ts`,
|
|
3
|
+
* `channels.ts`, `gateway.ts`, `misc.ts` for the per-section split.
|
|
4
|
+
*/
|
|
5
|
+
export { applyAgentsPatch } from './agents.js';
|
|
6
|
+
export { applyChannelsPatch } from './channels.js';
|
|
7
|
+
export { applyGatewayPatch } from './gateway.js';
|
|
8
|
+
export { applyMiscPatch, validateGatewayAfterPatch } from './misc.js';
|
|
9
|
+
export { type PatchResult, PATCH_OK, patchError } from './result.js';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { applyAgentsPatch } from "./agents.js";
|
|
2
|
+
import { applyChannelsPatch } from "./channels.js";
|
|
3
|
+
import { PATCH_OK, patchError } from "./result.js";
|
|
4
|
+
import { applyGatewayPatch } from "./gateway.js";
|
|
5
|
+
import { applyMiscPatch, validateGatewayAfterPatch } from "./misc.js";
|
|
6
|
+
export { PATCH_OK, applyAgentsPatch, applyChannelsPatch, applyGatewayPatch, applyMiscPatch, patchError, validateGatewayAfterPatch };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `PATCH /api/config` — tail sections that are each <50 lines:
|
|
3
|
+
* update / cron / goals / session / gateway.{skillsMarketplaceProvider,
|
|
4
|
+
* skillsStoreBaseUrl} / providers / providersConfig / stt / tts / tools /
|
|
5
|
+
* tunnel / bindings / mcp.
|
|
6
|
+
*
|
|
7
|
+
* Most of these delegate to a `mergeXxxConfigPatch(config, body) → { ok,
|
|
8
|
+
* message? }` helper that lives next to the schema, so this file is mostly
|
|
9
|
+
* "validate object shape, call helper, surface 400 on failure". The async
|
|
10
|
+
* `providers` branch saves into the credential resolver rather than config.
|
|
11
|
+
*
|
|
12
|
+
* Final validation (resolveGatewayAuth + assertGatewayRuntimeConfig) runs
|
|
13
|
+
* after every gateway-touching patch lands, so it sees the merged shape.
|
|
14
|
+
*/
|
|
15
|
+
import type { Config } from '../../../../config/schema.js';
|
|
16
|
+
import { type PatchResult } from './result.js';
|
|
17
|
+
export declare function applyMiscPatch(config: Config, body: any): Promise<PatchResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Re-validate gateway runtime config when `body.gateway` touched anything that
|
|
20
|
+
* could break the bind/auth contract. Runs *after* all per-section patches
|
|
21
|
+
* land so it sees the fully merged shape.
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateGatewayAfterPatch(config: Config, body: any): PatchResult;
|