@xopcai/xopc 0.0.6 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/extensions/weixin/src/api/api.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/gateway/static/root/assets/{agents-B6s2BvpH.js → agents-BdC4Y-HX.js} +2 -2
- package/dist/gateway/static/root/assets/agents-BdC4Y-HX.js.map +1 -0
- package/dist/gateway/static/root/assets/{apps-page-BtsZ5ZPx.js → apps-page-C-oaSHkm.js} +2 -2
- package/dist/gateway/static/root/assets/{apps-page-BtsZ5ZPx.js.map → apps-page-C-oaSHkm.js.map} +1 -1
- package/dist/gateway/static/root/assets/attachment-load-BDDlItdE.js +1 -0
- package/dist/gateway/static/root/assets/{channels-settings-BUfWBEVU.js → channels-settings-BqEUppPO.js} +2 -2
- package/dist/gateway/static/root/assets/{channels-settings-BUfWBEVU.js.map → channels-settings-BqEUppPO.js.map} +1 -1
- package/dist/gateway/static/root/assets/{chat-agents-api-BR30M2YQ.js → chat-agents-api-BhqjQ7iL.js} +2 -2
- package/dist/gateway/static/root/assets/{chat-agents-api-BR30M2YQ.js.map → chat-agents-api-BhqjQ7iL.js.map} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-CMTx0Mjz.js → cron-page-Cli49RKR.js} +2 -2
- package/dist/gateway/static/root/assets/{cron-page-CMTx0Mjz.js.map → cron-page-Cli49RKR.js.map} +1 -1
- package/dist/gateway/static/root/assets/{cron-utils-BJma9IcD.js → cron-utils-Dkj-Ldpf.js} +2 -2
- package/dist/gateway/static/root/assets/{cron-utils-BJma9IcD.js.map → cron-utils-Dkj-Ldpf.js.map} +1 -1
- package/dist/gateway/static/root/assets/electron-env-BDtJw9AY.js +2 -0
- package/dist/gateway/static/root/assets/electron-env-BDtJw9AY.js.map +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-BCVoNSo6.js → extension-debug-page-BMcZlaxF.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-debug-page-BCVoNSo6.js.map → extension-debug-page-BMcZlaxF.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-iframe-host-PWB-Pw2d.js → extension-iframe-host-D5HEF0KR.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-iframe-host-PWB-Pw2d.js.map → extension-iframe-host-D5HEF0KR.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-D2tTklsD.js → extension-page-CXdCSSPl.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-page-D2tTklsD.js.map → extension-page-CXdCSSPl.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-provider-BpHodVRj.js → extension-provider-DZCZgQE2.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-provider-BpHodVRj.js.map → extension-provider-DZCZgQE2.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-BEu6Xw1Z.js → extension-settings-page-CX6STpx3.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-settings-page-BEu6Xw1Z.js.map → extension-settings-page-CX6STpx3.js.map} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-C7ZFPhNj.js → gateway-config-swr-Cph02QZn.js} +2 -2
- package/dist/gateway/static/root/assets/{gateway-config-swr-C7ZFPhNj.js.map → gateway-config-swr-Cph02QZn.js.map} +1 -1
- package/dist/gateway/static/root/assets/index-Bty3m0mS.css +2 -0
- package/dist/gateway/static/root/assets/index-iTUyfzNr.js +16 -0
- package/dist/gateway/static/root/assets/index-iTUyfzNr.js.map +1 -0
- package/dist/gateway/static/root/assets/{logs-page-BpsxYdcL.js → logs-page-B9O5l3I8.js} +2 -2
- package/dist/gateway/static/root/assets/{logs-page-BpsxYdcL.js.map → logs-page-B9O5l3I8.js.map} +1 -1
- package/dist/gateway/static/root/assets/{model-selector-BiiDq8Pk.js → model-selector-BLiY_O25.js} +2 -2
- package/dist/gateway/static/root/assets/{model-selector-BiiDq8Pk.js.map → model-selector-BLiY_O25.js.map} +1 -1
- package/dist/gateway/static/root/assets/navigation-DB9S-C6S.js +2 -0
- package/dist/gateway/static/root/assets/navigation-DB9S-C6S.js.map +1 -0
- package/dist/gateway/static/root/assets/page-header-store-BFpnFTed.js +2 -0
- package/dist/gateway/static/root/assets/{page-header-store-HcRZK5CZ.js.map → page-header-store-BFpnFTed.js.map} +1 -1
- package/dist/gateway/static/root/assets/{session-api-DxNaAkmX.js → session-api-DEhQXWJg.js} +2 -2
- package/dist/gateway/static/root/assets/{session-api-DxNaAkmX.js.map → session-api-DEhQXWJg.js.map} +1 -1
- package/dist/gateway/static/root/assets/{session-working-directory-control-CDH-Wk4E.js → session-working-directory-control-DKOtWs3-.js} +3 -3
- package/dist/gateway/static/root/assets/{session-working-directory-control-CDH-Wk4E.js.map → session-working-directory-control-DKOtWs3-.js.map} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-5PK75r1n.js → sessions-page-BYlWP1ep.js} +2 -2
- package/dist/gateway/static/root/assets/{sessions-page-5PK75r1n.js.map → sessions-page-BYlWP1ep.js.map} +1 -1
- package/dist/gateway/static/root/assets/settings-page-oCnIavdg.js +2 -0
- package/dist/gateway/static/root/assets/settings-page-oCnIavdg.js.map +1 -0
- package/dist/gateway/static/root/assets/{skill-api-CxbNlOD_.js → skill-api-DWrn8Az0.js} +2 -2
- package/dist/gateway/static/root/assets/{skill-api-CxbNlOD_.js.map → skill-api-DWrn8Az0.js.map} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-Dd8ZzYJb.js → skills-page-C59WQpM1.js} +2 -2
- package/dist/gateway/static/root/assets/{skills-page-Dd8ZzYJb.js.map → skills-page-C59WQpM1.js.map} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-CPTH77BE.js → theme-store-CywXkKml.js} +2 -2
- package/dist/gateway/static/root/assets/{theme-store-CPTH77BE.js.map → theme-store-CywXkKml.js.map} +1 -1
- package/dist/gateway/static/root/assets/url-D7yWllI8.js +2 -0
- package/dist/gateway/static/root/assets/url-D7yWllI8.js.map +1 -0
- package/dist/gateway/static/root/assets/{useTranslation-BEUWOMuh.js → useTranslation-CACj0DBJ.js} +2 -2
- package/dist/gateway/static/root/assets/{useTranslation-BEUWOMuh.js.map → useTranslation-CACj0DBJ.js.map} +1 -1
- package/dist/gateway/static/root/index.html +16 -16
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +1 -0
- package/dist/src/agent/agent-manager.js +17 -9
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/background-review/run-background-review.js +2 -0
- package/dist/src/agent/background-review/run-background-review.js.map +1 -1
- package/dist/src/agent/child-agent-factory.js +2 -0
- package/dist/src/agent/child-agent-factory.js.map +1 -1
- package/dist/src/agent/context/expand-at-file-mentions.d.ts +4 -0
- package/dist/src/agent/context/expand-at-file-mentions.js +69 -0
- package/dist/src/agent/context/expand-at-file-mentions.js.map +1 -0
- package/dist/src/agent/context/workspace-seed.js +1 -1
- package/dist/src/agent/image/index.d.ts +0 -1
- package/dist/src/agent/image/index.js +1 -2
- package/dist/src/agent/image/understanding/pi-ai-provider.js.map +1 -1
- package/dist/src/agent/ipc/inbox.js +1 -1
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/memory/compaction.d.ts +1 -1
- package/dist/src/agent/memory/compaction.js +38 -11
- package/dist/src/agent/memory/compaction.js.map +1 -1
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/messaging/command-handler.d.ts +13 -0
- package/dist/src/agent/messaging/command-handler.js +14 -2
- package/dist/src/agent/messaging/command-handler.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +6 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/service.d.ts +16 -1
- package/dist/src/agent/service.js +175 -17
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
- package/dist/src/agent/skills/hub-hash.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/skills/scanner.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js.map +1 -1
- package/dist/src/agent/tools/browser/tools.js +2 -2
- package/dist/src/agent/tools/browser/tools.js.map +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/image-tool.js +2 -2
- package/dist/src/agent/tools/image-tool.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -1
- package/dist/src/agent/tools/index.js +2 -2
- package/dist/src/agent/tools/read.d.ts +0 -2
- package/dist/src/agent/tools/read.js +1 -3
- package/dist/src/agent/tools/read.js.map +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +1 -1
- package/dist/src/agent/tools/write.js +1 -1
- package/dist/src/auth/credentials.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/index.d.ts +1 -1
- package/dist/src/channels/index.js +2 -2
- package/dist/src/channels/pipeline.d.ts +8 -1
- package/dist/src/channels/pipeline.js +49 -4
- package/dist/src/channels/pipeline.js.map +1 -1
- package/dist/src/channels/plugin-types.d.ts +14 -0
- package/dist/src/chat-commands/builtins/config.d.ts +4 -0
- package/dist/src/chat-commands/builtins/config.js +197 -0
- package/dist/src/chat-commands/builtins/config.js.map +1 -0
- package/dist/src/chat-commands/builtins/context.d.ts +4 -0
- package/dist/src/chat-commands/builtins/context.js +44 -0
- package/dist/src/chat-commands/builtins/context.js.map +1 -0
- package/dist/src/chat-commands/builtins/session.js +111 -0
- package/dist/src/chat-commands/builtins/session.js.map +1 -1
- package/dist/src/chat-commands/builtins/thinking.js +49 -21
- package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
- package/dist/src/chat-commands/config-paths.d.ts +10 -0
- package/dist/src/chat-commands/config-paths.js +45 -0
- package/dist/src/chat-commands/config-paths.js.map +1 -0
- package/dist/src/chat-commands/config-value.d.ts +12 -0
- package/dist/src/chat-commands/config-value.js +53 -0
- package/dist/src/chat-commands/config-value.js.map +1 -0
- package/dist/src/chat-commands/context.d.ts +24 -1
- package/dist/src/chat-commands/context.js +41 -0
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/chat-commands/index.d.ts +2 -0
- package/dist/src/chat-commands/index.js +5 -1
- package/dist/src/chat-commands/index.js.map +1 -1
- package/dist/src/chat-commands/types.d.ts +33 -1
- package/dist/src/cli/commands/agent/interactive.js +1 -1
- package/dist/src/cli/commands/agent/interactive.js.map +1 -1
- package/dist/src/cli/commands/agent.js +21 -9
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/auth.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/channel-config.js +113 -0
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/channel-plugins.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js +47 -0
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/config-health.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/config-health.js +82 -0
- package/dist/src/cli/commands/doctor/checks/config-health.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/cron-health.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/cron-health.js +116 -0
- package/dist/src/cli/commands/doctor/checks/cron-health.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/gateway-health.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/gateway-health.js +64 -0
- package/dist/src/cli/commands/doctor/checks/gateway-health.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/gateway-service.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/gateway-service.js +64 -0
- package/dist/src/cli/commands/doctor/checks/gateway-service.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/node-version.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/node-version.js +33 -0
- package/dist/src/cli/commands/doctor/checks/node-version.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/provider-auth.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +91 -0
- package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/security-audit.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/security-audit.js +85 -0
- package/dist/src/cli/commands/doctor/checks/security-audit.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/session-integrity.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +118 -0
- package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/state-integrity.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +99 -0
- package/dist/src/cli/commands/doctor/checks/state-integrity.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/version-check.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/version-check.js +71 -0
- package/dist/src/cli/commands/doctor/checks/version-check.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/workspace-status.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +73 -0
- package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +1 -0
- package/dist/src/cli/commands/doctor/flow.d.ts +9 -0
- package/dist/src/cli/commands/doctor/flow.js +51 -0
- package/dist/src/cli/commands/doctor/flow.js.map +1 -0
- package/dist/src/cli/commands/doctor/format.d.ts +6 -0
- package/dist/src/cli/commands/doctor/format.js +61 -0
- package/dist/src/cli/commands/doctor/format.js.map +1 -0
- package/dist/src/cli/commands/doctor/index.js +44 -0
- package/dist/src/cli/commands/doctor/index.js.map +1 -0
- package/dist/src/cli/commands/doctor/types.d.ts +20 -0
- package/dist/src/cli/commands/doctor/types.js +1 -0
- package/dist/src/cli/commands/extension.js +10 -0
- package/dist/src/cli/commands/extension.js.map +1 -1
- package/dist/src/cli/commands/init.js +1 -2
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/session/utils.js.map +1 -1
- package/dist/src/cli/commands/update.d.ts +1 -0
- package/dist/src/cli/commands/update.js +171 -0
- package/dist/src/cli/commands/update.js.map +1 -0
- package/dist/src/cli/index.d.ts +2 -2
- package/dist/src/cli/index.js +4 -2
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/utils/init-workspace.js +1 -1
- package/dist/src/config/index.d.ts +1 -0
- package/dist/src/config/index.js +4 -3
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/config/loader.js +1 -1
- package/dist/src/config/models-json.d.ts +15 -15
- package/dist/src/config/paths.js.map +1 -1
- package/dist/src/config/profile.js +1 -1
- package/dist/src/config/runtime-overrides.d.ts +8 -0
- package/dist/src/config/runtime-overrides.js +40 -0
- package/dist/src/config/runtime-overrides.js.map +1 -0
- package/dist/src/config/schema.d.ts +34 -104
- package/dist/src/config/schema.js +18 -39
- package/dist/src/config/schema.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/launchd.js +2 -2
- package/dist/src/daemon/launchd.js.map +1 -1
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/daemon/systemd.js.map +1 -1
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/loader.d.ts +1 -1
- package/dist/src/extensions/loader.js +5 -8
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/extensions/lockfile.js +1 -1
- package/dist/src/extensions/sdk/index.js +6 -1
- package/dist/src/extensions/sdk/index.js.map +1 -0
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/hono/lib/static-ui.js +1 -1
- package/dist/src/gateway/hono/oauth.js +1 -1
- package/dist/src/gateway/hono/routes/config.js +1 -1
- package/dist/src/gateway/hono/routes/doctor.d.ts +3 -0
- package/dist/src/gateway/hono/routes/doctor.js +35 -0
- package/dist/src/gateway/hono/routes/doctor.js.map +1 -0
- package/dist/src/gateway/hono/routes/index.js +4 -0
- package/dist/src/gateway/hono/routes/index.js.map +1 -1
- package/dist/src/gateway/hono/routes/models.js +64 -11
- package/dist/src/gateway/hono/routes/models.js.map +1 -1
- package/dist/src/gateway/hono/routes/public-gateway.js +10 -0
- package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/update.d.ts +3 -0
- package/dist/src/gateway/hono/routes/update.js +141 -0
- package/dist/src/gateway/hono/routes/update.js.map +1 -0
- package/dist/src/gateway/hono/routes/workspace.js +82 -2
- package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
- package/dist/src/gateway/lock.js +1 -1
- package/dist/src/gateway/ports.js +98 -3
- package/dist/src/gateway/ports.js.map +1 -1
- package/dist/src/gateway/service.d.ts +1 -4
- package/dist/src/gateway/service.js +13 -20
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/workspace-fs-file-list.d.ts +5 -0
- package/dist/src/gateway/workspace-fs-file-list.js +56 -0
- package/dist/src/gateway/workspace-fs-file-list.js.map +1 -0
- package/dist/src/gateway/workspace-heartbeat-path.js +1 -1
- package/dist/src/gateway/workspace-ripgrep.d.ts +5 -0
- package/dist/src/gateway/workspace-ripgrep.js +88 -4
- package/dist/src/gateway/workspace-ripgrep.js.map +1 -1
- package/dist/src/infra/update-channels.d.ts +14 -0
- package/dist/src/infra/update-channels.js +30 -0
- package/dist/src/infra/update-channels.js.map +1 -0
- package/dist/src/infra/update-check.d.ts +53 -0
- package/dist/src/infra/update-check.js +155 -0
- package/dist/src/infra/update-check.js.map +1 -0
- package/dist/src/infra/update-runner.d.ts +18 -0
- package/dist/src/infra/update-runner.js +112 -0
- package/dist/src/infra/update-runner.js.map +1 -0
- package/dist/src/infra/update-startup.d.ts +20 -0
- package/dist/src/infra/update-startup.js +246 -0
- package/dist/src/infra/update-startup.js.map +1 -0
- package/dist/src/providers/extension-stream-bridge.d.ts +3 -0
- package/dist/src/providers/extension-stream-bridge.js +239 -0
- package/dist/src/providers/extension-stream-bridge.js.map +1 -0
- package/dist/src/providers/index.d.ts +7 -2
- package/dist/src/providers/index.js +77 -14
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/providers/model-registry.js +1 -1
- package/dist/src/providers/plugin-registry.js +92 -87
- package/dist/src/providers/plugin-registry.js.map +1 -1
- package/dist/src/routing/bindings.js +1 -1
- package/dist/src/routing/index.d.ts +1 -1
- package/dist/src/routing/index.js +2 -2
- package/dist/src/routing/index.js.map +1 -1
- package/dist/src/routing/resolve-route.js +1 -1
- package/dist/src/routing/session-key.d.ts +0 -5
- package/dist/src/routing/session-key.js +1 -27
- package/dist/src/routing/session-key.js.map +1 -1
- package/dist/src/session/chat-export.d.ts +5 -0
- package/dist/src/session/chat-export.js +35 -0
- package/dist/src/session/chat-export.js.map +1 -0
- package/dist/src/session/config-store.js +1 -1
- package/dist/src/session/manager.d.ts +1 -1
- package/dist/src/session/manager.js +2 -2
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/store.d.ts +1 -1
- package/dist/src/session/store.js +3 -7
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/types.d.ts +0 -10
- package/dist/src/session/types.js.map +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/voice/tts/audio.js +1 -1
- package/package.json +2 -2
- package/dist/gateway/static/root/assets/agents-B6s2BvpH.js.map +0 -1
- package/dist/gateway/static/root/assets/attachment-load-6pRlDPZ8.js +0 -1
- package/dist/gateway/static/root/assets/index-DBZ5eXW5.js +0 -16
- package/dist/gateway/static/root/assets/index-DBZ5eXW5.js.map +0 -1
- package/dist/gateway/static/root/assets/index-KsVMH-Jo.css +0 -2
- package/dist/gateway/static/root/assets/navigation-BpLKd2Ca.js +0 -2
- package/dist/gateway/static/root/assets/navigation-BpLKd2Ca.js.map +0 -1
- package/dist/gateway/static/root/assets/page-header-store-HcRZK5CZ.js +0 -2
- package/dist/gateway/static/root/assets/preference-select-fields-B4AJBqUY.js +0 -2
- package/dist/gateway/static/root/assets/preference-select-fields-B4AJBqUY.js.map +0 -1
- package/dist/gateway/static/root/assets/settings-page-BvSj0JqX.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-BvSj0JqX.js.map +0 -1
- package/dist/gateway/static/root/assets/url-QmwQTJ-j.js +0 -2
- package/dist/gateway/static/root/assets/url-QmwQTJ-j.js.map +0 -1
- package/dist/src/acp/commands.d.ts +0 -11
- package/dist/src/acp/commands.js +0 -17
- package/dist/src/acp/commands.js.map +0 -1
- package/dist/src/acp/control-plane/identity-reconcile.d.ts +0 -36
- package/dist/src/acp/control-plane/identity-reconcile.js +0 -124
- package/dist/src/acp/control-plane/identity-reconcile.js.map +0 -1
- package/dist/src/acp/control-plane/index.d.ts +0 -10
- package/dist/src/acp/control-plane/index.js +0 -6
- package/dist/src/acp/control-plane/manager.d.ts +0 -86
- package/dist/src/acp/control-plane/manager.js +0 -502
- package/dist/src/acp/control-plane/manager.js.map +0 -1
- package/dist/src/acp/control-plane/manager.types.d.ts +0 -125
- package/dist/src/acp/control-plane/manager.types.js +0 -14
- package/dist/src/acp/control-plane/manager.types.js.map +0 -1
- package/dist/src/acp/control-plane/manager.utils.d.ts +0 -29
- package/dist/src/acp/control-plane/manager.utils.js +0 -46
- package/dist/src/acp/control-plane/manager.utils.js.map +0 -1
- package/dist/src/acp/control-plane/runtime-cache-manager.d.ts +0 -49
- package/dist/src/acp/control-plane/runtime-cache-manager.js +0 -155
- package/dist/src/acp/control-plane/runtime-cache-manager.js.map +0 -1
- package/dist/src/acp/control-plane/runtime-cache.d.ts +0 -45
- package/dist/src/acp/control-plane/runtime-cache.js +0 -58
- package/dist/src/acp/control-plane/runtime-cache.js.map +0 -1
- package/dist/src/acp/control-plane/runtime-options.d.ts +0 -30
- package/dist/src/acp/control-plane/runtime-options.js +0 -92
- package/dist/src/acp/control-plane/runtime-options.js.map +0 -1
- package/dist/src/acp/control-plane/session-actor-queue.d.ts +0 -22
- package/dist/src/acp/control-plane/session-actor-queue.js +0 -70
- package/dist/src/acp/control-plane/session-actor-queue.js.map +0 -1
- package/dist/src/acp/control-plane/session-lifecycle-manager.d.ts +0 -59
- package/dist/src/acp/control-plane/session-lifecycle-manager.js +0 -209
- package/dist/src/acp/control-plane/session-lifecycle-manager.js.map +0 -1
- package/dist/src/acp/control-plane/session-store.d.ts +0 -39
- package/dist/src/acp/control-plane/session-store.js +0 -149
- package/dist/src/acp/control-plane/session-store.js.map +0 -1
- package/dist/src/acp/control-plane/turn-manager.d.ts +0 -40
- package/dist/src/acp/control-plane/turn-manager.js +0 -134
- package/dist/src/acp/control-plane/turn-manager.js.map +0 -1
- package/dist/src/acp/event-mapper.d.ts +0 -48
- package/dist/src/acp/event-mapper.js +0 -94
- package/dist/src/acp/event-mapper.js.map +0 -1
- package/dist/src/acp/index.d.ts +0 -10
- package/dist/src/acp/index.js +0 -5
- package/dist/src/acp/meta.d.ts +0 -15
- package/dist/src/acp/meta.js +0 -36
- package/dist/src/acp/meta.js.map +0 -1
- package/dist/src/acp/routing-integration.d.ts +0 -37
- package/dist/src/acp/routing-integration.js +0 -58
- package/dist/src/acp/routing-integration.js.map +0 -1
- package/dist/src/acp/runtime/backends/index.d.ts +0 -4
- package/dist/src/acp/runtime/backends/index.js +0 -2
- package/dist/src/acp/runtime/backends/local.d.ts +0 -136
- package/dist/src/acp/runtime/backends/local.js +0 -603
- package/dist/src/acp/runtime/backends/local.js.map +0 -1
- package/dist/src/acp/runtime/error-text.d.ts +0 -16
- package/dist/src/acp/runtime/error-text.js +0 -40
- package/dist/src/acp/runtime/error-text.js.map +0 -1
- package/dist/src/acp/runtime/errors.d.ts +0 -31
- package/dist/src/acp/runtime/errors.js +0 -47
- package/dist/src/acp/runtime/errors.js.map +0 -1
- package/dist/src/acp/runtime/index.d.ts +0 -7
- package/dist/src/acp/runtime/index.js +0 -4
- package/dist/src/acp/runtime/registry.d.ts +0 -35
- package/dist/src/acp/runtime/registry.js +0 -85
- package/dist/src/acp/runtime/registry.js.map +0 -1
- package/dist/src/acp/runtime/session-identity.d.ts +0 -35
- package/dist/src/acp/runtime/session-identity.js +0 -134
- package/dist/src/acp/runtime/session-identity.js.map +0 -1
- package/dist/src/acp/runtime/types.d.ts +0 -214
- package/dist/src/acp/secret-file.d.ts +0 -7
- package/dist/src/acp/secret-file.js +0 -19
- package/dist/src/acp/secret-file.js.map +0 -1
- package/dist/src/acp/server.d.ts +0 -48
- package/dist/src/acp/server.js +0 -300
- package/dist/src/acp/server.js.map +0 -1
- package/dist/src/acp/session.d.ts +0 -29
- package/dist/src/acp/session.js +0 -30
- package/dist/src/acp/session.js.map +0 -1
- package/dist/src/acp/types.d.ts +0 -39
- package/dist/src/acp/types.js +0 -13
- package/dist/src/acp/types.js.map +0 -1
- package/dist/src/agent/image/describe-images.d.ts +0 -18
- package/dist/src/agent/image/describe-images.js +0 -19
- package/dist/src/agent/image/describe-images.js.map +0 -1
- package/dist/src/cli/commands/acp.d.ts +0 -4
- package/dist/src/cli/commands/acp.js +0 -200
- package/dist/src/cli/commands/acp.js.map +0 -1
- /package/dist/src/{acp/runtime/types.js → cli/commands/doctor/index.d.ts} +0 -0
|
@@ -658,73 +658,6 @@ export declare const TTSConfigSchema: z.ZodObject<{
|
|
|
658
658
|
voice: z.ZodOptional<z.ZodString>;
|
|
659
659
|
}, z.core.$strip>>;
|
|
660
660
|
}, z.core.$strip>;
|
|
661
|
-
export declare const AcpDispatchConfigSchema: z.ZodObject<{
|
|
662
|
-
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
663
|
-
}, z.core.$strip>;
|
|
664
|
-
export declare const AcpStreamConfigSchema: z.ZodObject<{
|
|
665
|
-
coalesceIdleMs: z.ZodOptional<z.ZodNumber>;
|
|
666
|
-
maxChunkChars: z.ZodOptional<z.ZodNumber>;
|
|
667
|
-
repeatSuppression: z.ZodOptional<z.ZodBoolean>;
|
|
668
|
-
deliveryMode: z.ZodOptional<z.ZodEnum<{
|
|
669
|
-
live: "live";
|
|
670
|
-
final_only: "final_only";
|
|
671
|
-
}>>;
|
|
672
|
-
hiddenBoundarySeparator: z.ZodOptional<z.ZodEnum<{
|
|
673
|
-
none: "none";
|
|
674
|
-
space: "space";
|
|
675
|
-
newline: "newline";
|
|
676
|
-
paragraph: "paragraph";
|
|
677
|
-
}>>;
|
|
678
|
-
maxOutputChars: z.ZodOptional<z.ZodNumber>;
|
|
679
|
-
maxSessionUpdateChars: z.ZodOptional<z.ZodNumber>;
|
|
680
|
-
tagVisibility: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodBoolean>>;
|
|
681
|
-
}, z.core.$strip>;
|
|
682
|
-
export declare const AcpRuntimeConfigSchema: z.ZodObject<{
|
|
683
|
-
ttlMinutes: z.ZodOptional<z.ZodNumber>;
|
|
684
|
-
installCommand: z.ZodOptional<z.ZodString>;
|
|
685
|
-
}, z.core.$strip>;
|
|
686
|
-
export declare const AcpRateLimitConfigSchema: z.ZodObject<{
|
|
687
|
-
maxRequests: z.ZodDefault<z.ZodNumber>;
|
|
688
|
-
windowMs: z.ZodDefault<z.ZodNumber>;
|
|
689
|
-
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
690
|
-
}, z.core.$strip>;
|
|
691
|
-
export declare const AcpConfigSchema: z.ZodObject<{
|
|
692
|
-
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
693
|
-
dispatch: z.ZodOptional<z.ZodObject<{
|
|
694
|
-
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
695
|
-
}, z.core.$strip>>;
|
|
696
|
-
backend: z.ZodOptional<z.ZodString>;
|
|
697
|
-
defaultAgent: z.ZodOptional<z.ZodString>;
|
|
698
|
-
allowedAgents: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
699
|
-
maxConcurrentSessions: z.ZodOptional<z.ZodNumber>;
|
|
700
|
-
rateLimit: z.ZodOptional<z.ZodObject<{
|
|
701
|
-
maxRequests: z.ZodDefault<z.ZodNumber>;
|
|
702
|
-
windowMs: z.ZodDefault<z.ZodNumber>;
|
|
703
|
-
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
704
|
-
}, z.core.$strip>>;
|
|
705
|
-
stream: z.ZodOptional<z.ZodObject<{
|
|
706
|
-
coalesceIdleMs: z.ZodOptional<z.ZodNumber>;
|
|
707
|
-
maxChunkChars: z.ZodOptional<z.ZodNumber>;
|
|
708
|
-
repeatSuppression: z.ZodOptional<z.ZodBoolean>;
|
|
709
|
-
deliveryMode: z.ZodOptional<z.ZodEnum<{
|
|
710
|
-
live: "live";
|
|
711
|
-
final_only: "final_only";
|
|
712
|
-
}>>;
|
|
713
|
-
hiddenBoundarySeparator: z.ZodOptional<z.ZodEnum<{
|
|
714
|
-
none: "none";
|
|
715
|
-
space: "space";
|
|
716
|
-
newline: "newline";
|
|
717
|
-
paragraph: "paragraph";
|
|
718
|
-
}>>;
|
|
719
|
-
maxOutputChars: z.ZodOptional<z.ZodNumber>;
|
|
720
|
-
maxSessionUpdateChars: z.ZodOptional<z.ZodNumber>;
|
|
721
|
-
tagVisibility: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodBoolean>>;
|
|
722
|
-
}, z.core.$strip>>;
|
|
723
|
-
runtime: z.ZodOptional<z.ZodObject<{
|
|
724
|
-
ttlMinutes: z.ZodOptional<z.ZodNumber>;
|
|
725
|
-
installCommand: z.ZodOptional<z.ZodString>;
|
|
726
|
-
}, z.core.$strip>>;
|
|
727
|
-
}, z.core.$strip>;
|
|
728
661
|
export declare const ExtensionSecurityConfigSchema: z.ZodObject<{
|
|
729
662
|
checkPermissions: z.ZodDefault<z.ZodBoolean>;
|
|
730
663
|
allowUntrusted: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -739,6 +672,27 @@ export declare const ExtensionSlotsConfigSchema: z.ZodObject<{
|
|
|
739
672
|
webSearch: z.ZodOptional<z.ZodString>;
|
|
740
673
|
}, z.core.$strip>;
|
|
741
674
|
export declare const ExtensionsConfigSchema: z.ZodType<Record<string, unknown>>;
|
|
675
|
+
export declare const UpdateAutoConfigSchema: z.ZodOptional<z.ZodObject<{
|
|
676
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
677
|
+
stableDelayHours: z.ZodDefault<z.ZodNumber>;
|
|
678
|
+
stableJitterHours: z.ZodDefault<z.ZodNumber>;
|
|
679
|
+
betaCheckIntervalHours: z.ZodDefault<z.ZodNumber>;
|
|
680
|
+
}, z.core.$strict>>;
|
|
681
|
+
export declare const UpdateConfigSchema: z.ZodOptional<z.ZodObject<{
|
|
682
|
+
checkOnStart: z.ZodDefault<z.ZodBoolean>;
|
|
683
|
+
channel: z.ZodDefault<z.ZodEnum<{
|
|
684
|
+
stable: "stable";
|
|
685
|
+
beta: "beta";
|
|
686
|
+
dev: "dev";
|
|
687
|
+
}>>;
|
|
688
|
+
auto: z.ZodOptional<z.ZodObject<{
|
|
689
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
690
|
+
stableDelayHours: z.ZodDefault<z.ZodNumber>;
|
|
691
|
+
stableJitterHours: z.ZodDefault<z.ZodNumber>;
|
|
692
|
+
betaCheckIntervalHours: z.ZodDefault<z.ZodNumber>;
|
|
693
|
+
}, z.core.$strict>>;
|
|
694
|
+
}, z.core.$strict>>;
|
|
695
|
+
export type UpdateConfig = z.infer<typeof UpdateConfigSchema>;
|
|
742
696
|
export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
743
697
|
agents: z.ZodDefault<z.ZodObject<{
|
|
744
698
|
default: z.ZodOptional<z.ZodString>;
|
|
@@ -1076,43 +1030,20 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
|
1076
1030
|
voice: z.ZodOptional<z.ZodString>;
|
|
1077
1031
|
}, z.core.$strip>>;
|
|
1078
1032
|
}, z.core.$strip>>;
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
maxConcurrentSessions: z.ZodOptional<z.ZodNumber>;
|
|
1088
|
-
rateLimit: z.ZodOptional<z.ZodObject<{
|
|
1089
|
-
maxRequests: z.ZodDefault<z.ZodNumber>;
|
|
1090
|
-
windowMs: z.ZodDefault<z.ZodNumber>;
|
|
1033
|
+
update: z.ZodOptional<z.ZodObject<{
|
|
1034
|
+
checkOnStart: z.ZodDefault<z.ZodBoolean>;
|
|
1035
|
+
channel: z.ZodDefault<z.ZodEnum<{
|
|
1036
|
+
stable: "stable";
|
|
1037
|
+
beta: "beta";
|
|
1038
|
+
dev: "dev";
|
|
1039
|
+
}>>;
|
|
1040
|
+
auto: z.ZodOptional<z.ZodObject<{
|
|
1091
1041
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
deliveryMode: z.ZodOptional<z.ZodEnum<{
|
|
1098
|
-
live: "live";
|
|
1099
|
-
final_only: "final_only";
|
|
1100
|
-
}>>;
|
|
1101
|
-
hiddenBoundarySeparator: z.ZodOptional<z.ZodEnum<{
|
|
1102
|
-
none: "none";
|
|
1103
|
-
space: "space";
|
|
1104
|
-
newline: "newline";
|
|
1105
|
-
paragraph: "paragraph";
|
|
1106
|
-
}>>;
|
|
1107
|
-
maxOutputChars: z.ZodOptional<z.ZodNumber>;
|
|
1108
|
-
maxSessionUpdateChars: z.ZodOptional<z.ZodNumber>;
|
|
1109
|
-
tagVisibility: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodBoolean>>;
|
|
1110
|
-
}, z.core.$strip>>;
|
|
1111
|
-
runtime: z.ZodOptional<z.ZodObject<{
|
|
1112
|
-
ttlMinutes: z.ZodOptional<z.ZodNumber>;
|
|
1113
|
-
installCommand: z.ZodOptional<z.ZodString>;
|
|
1114
|
-
}, z.core.$strip>>;
|
|
1115
|
-
}, z.core.$strip>>;
|
|
1042
|
+
stableDelayHours: z.ZodDefault<z.ZodNumber>;
|
|
1043
|
+
stableJitterHours: z.ZodDefault<z.ZodNumber>;
|
|
1044
|
+
betaCheckIntervalHours: z.ZodDefault<z.ZodNumber>;
|
|
1045
|
+
}, z.core.$strict>>;
|
|
1046
|
+
}, z.core.$strict>>;
|
|
1116
1047
|
}, z.core.$strip>>;
|
|
1117
1048
|
export type Config = z.infer<typeof ConfigSchema>;
|
|
1118
1049
|
export type AgentDefaults = z.infer<typeof AgentDefaultsSchema>;
|
|
@@ -1120,7 +1051,6 @@ export type GatewayAuthConfig = z.infer<typeof GatewayAuthSchema>;
|
|
|
1120
1051
|
export type GatewayAuthRateLimitConfig = z.infer<typeof GatewayAuthRateLimitSchema>;
|
|
1121
1052
|
export type STTConfig = z.infer<typeof STTConfigSchema>;
|
|
1122
1053
|
export type TTSConfig = z.infer<typeof TTSConfigSchema>;
|
|
1123
|
-
export type AcpConfig = z.infer<typeof AcpConfigSchema>;
|
|
1124
1054
|
/**
|
|
1125
1055
|
* Parse a model reference string.
|
|
1126
1056
|
*/
|
|
@@ -32,7 +32,7 @@ function parseModelRef(ref) {
|
|
|
32
32
|
model: trimmed.slice(idx + 1).trim()
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
|
-
var AgentModelRefSchema, AgentDefaultsSchema, AgentConfigSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, SessionDmScopeSchema, SessionStorageConfigSchema, SessionConfigSchema, ChannelsConfigSchema, SearchProviderEntrySchema, WebSearchConfigSchema, WebToolsConfigSchema, ToolsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, HeartbeatConfigSchema, GatewayConfigSchema, CronConfigSchema, ModelsDevConfigSchema, STTProviderConfigSchema, STTFallbackConfigSchema, STTConfigSchema, TTSProviderConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSEdgeConfigSchema, TTSSummarizationConfigSchema, TTSConfigSchema,
|
|
35
|
+
var AgentModelRefSchema, AgentDefaultsSchema, AgentConfigSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, SessionDmScopeSchema, SessionStorageConfigSchema, SessionConfigSchema, ChannelsConfigSchema, SearchProviderEntrySchema, WebSearchConfigSchema, WebToolsConfigSchema, ToolsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, HeartbeatConfigSchema, GatewayConfigSchema, CronConfigSchema, ModelsDevConfigSchema, STTProviderConfigSchema, STTFallbackConfigSchema, STTConfigSchema, TTSProviderConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSEdgeConfigSchema, TTSSummarizationConfigSchema, TTSConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, UpdateAutoConfigSchema, UpdateConfigSchema, ConfigSchema;
|
|
36
36
|
var init_schema = __esmMin((() => {
|
|
37
37
|
init_agent_scope();
|
|
38
38
|
init_config_schema();
|
|
@@ -405,42 +405,6 @@ var init_schema = __esmMin((() => {
|
|
|
405
405
|
edge: TTSEdgeConfigSchema.optional(),
|
|
406
406
|
minimax: TTSProviderConfigSchema.optional()
|
|
407
407
|
});
|
|
408
|
-
AcpDispatchConfigSchema = z.object({ enabled: z.boolean().optional() });
|
|
409
|
-
AcpStreamConfigSchema = z.object({
|
|
410
|
-
coalesceIdleMs: z.number().optional(),
|
|
411
|
-
maxChunkChars: z.number().optional(),
|
|
412
|
-
repeatSuppression: z.boolean().optional(),
|
|
413
|
-
deliveryMode: z.enum(["live", "final_only"]).optional(),
|
|
414
|
-
hiddenBoundarySeparator: z.enum([
|
|
415
|
-
"none",
|
|
416
|
-
"space",
|
|
417
|
-
"newline",
|
|
418
|
-
"paragraph"
|
|
419
|
-
]).optional(),
|
|
420
|
-
maxOutputChars: z.number().optional(),
|
|
421
|
-
maxSessionUpdateChars: z.number().optional(),
|
|
422
|
-
tagVisibility: z.record(z.string(), z.boolean()).optional()
|
|
423
|
-
});
|
|
424
|
-
AcpRuntimeConfigSchema = z.object({
|
|
425
|
-
ttlMinutes: z.number().optional(),
|
|
426
|
-
installCommand: z.string().optional()
|
|
427
|
-
});
|
|
428
|
-
AcpRateLimitConfigSchema = z.object({
|
|
429
|
-
maxRequests: z.number().default(100),
|
|
430
|
-
windowMs: z.number().default(6e4),
|
|
431
|
-
enabled: z.boolean().default(true)
|
|
432
|
-
});
|
|
433
|
-
AcpConfigSchema = z.object({
|
|
434
|
-
enabled: z.boolean().default(false),
|
|
435
|
-
dispatch: AcpDispatchConfigSchema.optional(),
|
|
436
|
-
backend: z.string().optional(),
|
|
437
|
-
defaultAgent: z.string().optional(),
|
|
438
|
-
allowedAgents: z.array(z.string()).optional(),
|
|
439
|
-
maxConcurrentSessions: z.number().optional(),
|
|
440
|
-
rateLimit: AcpRateLimitConfigSchema.optional(),
|
|
441
|
-
stream: AcpStreamConfigSchema.optional(),
|
|
442
|
-
runtime: AcpRuntimeConfigSchema.optional()
|
|
443
|
-
});
|
|
444
408
|
ExtensionSecurityConfigSchema = z.object({
|
|
445
409
|
checkPermissions: z.boolean().default(true),
|
|
446
410
|
allowUntrusted: z.boolean().default(false),
|
|
@@ -455,6 +419,21 @@ var init_schema = __esmMin((() => {
|
|
|
455
419
|
webSearch: z.string().optional()
|
|
456
420
|
});
|
|
457
421
|
ExtensionsConfigSchema = z.record(z.string(), z.unknown());
|
|
422
|
+
UpdateAutoConfigSchema = z.object({
|
|
423
|
+
enabled: z.boolean().default(false),
|
|
424
|
+
stableDelayHours: z.number().min(0).default(6),
|
|
425
|
+
stableJitterHours: z.number().min(0).default(12),
|
|
426
|
+
betaCheckIntervalHours: z.number().min(.25).default(1)
|
|
427
|
+
}).strict().optional();
|
|
428
|
+
UpdateConfigSchema = z.object({
|
|
429
|
+
checkOnStart: z.boolean().default(true),
|
|
430
|
+
channel: z.enum([
|
|
431
|
+
"stable",
|
|
432
|
+
"beta",
|
|
433
|
+
"dev"
|
|
434
|
+
]).default("stable"),
|
|
435
|
+
auto: UpdateAutoConfigSchema
|
|
436
|
+
}).strict().optional();
|
|
458
437
|
ConfigSchema = z.object({
|
|
459
438
|
agents: AgentsConfigSchema,
|
|
460
439
|
bindings: BindingsConfigSchema,
|
|
@@ -467,7 +446,7 @@ var init_schema = __esmMin((() => {
|
|
|
467
446
|
modelsDev: ModelsDevConfigSchema,
|
|
468
447
|
stt: STTConfigSchema.optional(),
|
|
469
448
|
tts: TTSConfigSchema.optional(),
|
|
470
|
-
|
|
449
|
+
update: UpdateConfigSchema
|
|
471
450
|
}).default({
|
|
472
451
|
agents: { defaults: {
|
|
473
452
|
workspace: "~/.xopc/workspace",
|
|
@@ -605,6 +584,6 @@ var init_schema = __esmMin((() => {
|
|
|
605
584
|
}));
|
|
606
585
|
//#endregion
|
|
607
586
|
init_schema();
|
|
608
|
-
export {
|
|
587
|
+
export { AgentConfigSchema, AgentDefaultsSchema, AgentModelRefSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, ChannelsConfigSchema, ConfigSchema, CronConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayConfigSchema, HeartbeatConfigSchema, ModelsDevConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema, ToolsConfigSchema, UpdateAutoConfigSchema, UpdateConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WeixinAccountConfigSchema, WeixinConfigSchema, getAgentDefaultModelRef, getWorkspacePath, init_schema, parseModelRef };
|
|
609
588
|
|
|
610
589
|
//# sourceMappingURL=schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../../src/config/schema.ts"],"sourcesContent":["import { z } from 'zod';\n\nimport { getDefaultWorkspacePath } from '../agent/agent-scope.js';\n\n// ============================================\n// Agent Configs\n// ============================================\n\nexport const AgentModelRefSchema = z.union([\n z.string(),\n z\n .object({\n primary: z.string().optional(),\n fallbacks: z.array(z.string()).optional(),\n })\n .strict(),\n]);\n\nexport type AgentModelConfig = z.infer<typeof AgentModelRefSchema>;\n\nexport const AgentDefaultsSchema = z.object({\n workspace: z.string().default('~/.xopc/workspace'),\n model: z.union([\n z.string(),\n z.object({\n primary: z.string().optional(),\n fallbacks: z.array(z.string()).optional(),\n }).strict(),\n ]).default(''), // Empty default - will be resolved dynamically at runtime\n /** Vision / image understanding model (provider/model). Falls back to heuristics when unset. */\n imageModel: AgentModelRefSchema.optional(),\n /** Image generation model (provider/model), e.g. openai/gpt-image-1. Thin REST wrapper; OpenAI supported. */\n imageGenerationModel: AgentModelRefSchema.optional(),\n /** Max image size for image tool loads (MB). */\n mediaMaxMb: z.number().positive().optional(),\n maxTokens: z.number().default(8192),\n temperature: z.number().default(0.7),\n maxToolIterations: z.number().default(20),\n // Wall-clock limit for one user turn (LLM + tools). Default 30m if unset; cap 4h.\n maxTaskDurationMs: z.number().min(60000).max(14_400_000).optional(),\n // Reliability settings\n maxRequestsPerTurn: z.number().min(10).max(200).default(50),\n maxToolFailuresPerTurn: z.number().min(1).max(20).default(3),\n // Thinking ability settings\n thinkingDefault: z.enum(['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'adaptive']).optional(),\n reasoningDefault: z.enum(['off', 'on', 'stream']).optional(),\n verboseDefault: z.enum(['off', 'on', 'full']).optional(),\n compaction: z.object({\n enabled: z.boolean().default(true),\n mode: z.enum(['default', 'safeguard']).default('default'),\n reserveTokens: z.number().default(8000),\n triggerThreshold: z.number().min(0.5).max(0.95).default(0.8),\n minMessagesBeforeCompact: z.number().default(10),\n keepRecentMessages: z.number().default(5),\n // Dual-strategy compaction\n evictionWindow: z.number().min(0.1).max(0.5).default(0.2),\n retentionWindow: z.number().min(3).max(20).default(6),\n }).optional(),\n pruning: z.object({\n enabled: z.boolean().default(true),\n maxToolResultChars: z.number().default(10000),\n headKeepRatio: z.number().default(0.3),\n tailKeepRatio: z.number().default(0.3),\n }).optional(),\n /**\n * Curated memory (`agents/<id>/memories/`) + pluggable external provider.\n * Only one external provider at a time.\n */\n memory: z\n .object({\n /** Master switch: curated snapshot, `curated_memory`, prefetch, and external provider. Default true. */\n enabled: z.boolean().optional(),\n /** When false, use workspace bootstrap only (no curated snapshot / tool). Default true. */\n useEnhancedSystem: z.boolean().optional(),\n /** Include USER.md in snapshot. Default true. */\n userProfileEnabled: z.boolean().optional(),\n memoryCharLimit: z.number().positive().optional(),\n userCharLimit: z.number().positive().optional(),\n provider: z.enum(['none', 'stub']).optional(),\n /** How often prefetched external memory is injected into the user message. */\n injectionFrequency: z.enum(['every-turn', 'first-turn']).optional(),\n /** Inject prefetch on turns 1, 1+N, 1+2N, … (only when injectionFrequency is every-turn). Min 1. */\n contextCadence: z.number().int().min(1).optional(),\n /** Reserved for future external “dialectic” sync cadence (not wired yet). */\n dialecticCadence: z.number().int().min(1).optional(),\n })\n .optional(),\n /** Cross-session transcript search (`session_search` tool). */\n sessionSearch: z\n .object({\n /** Model ref for per-session summaries (e.g. openai/gpt-4o-mini). */\n summaryModel: z.string().optional(),\n })\n .optional(),\n /**\n * Post-turn background review (Hermes-style): optional quiet follow-up that may call\n * `curated_memory` / `skill_manage` so durable facts and reusable workflows persist\n * without bloating the main user-visible turn.\n */\n backgroundReview: z\n .object({\n /** When true, nudges may run after successful turns. Default false (opt-in). */\n enabled: z.boolean().optional(),\n /** User-turn cadence for memory review. 0 disables the memory channel. Default 10. */\n memoryNudgeInterval: z.number().int().min(0).optional(),\n /** LLM rounds without `skill_manage` before a skill review. 0 disables the skill channel. Default 10. */\n skillNudgeInterval: z.number().int().min(0).optional(),\n /** Max tool executions for the review agent. Default 8. */\n maxToolRounds: z.number().int().min(1).max(32).optional(),\n /** Max prior messages passed into the review context (tail). Default 80. */\n maxHistoryMessages: z.number().int().min(10).max(200).optional(),\n /** Wall-clock cap for the review run (ms). Default 120000. */\n maxDurationMs: z.number().int().min(30_000).max(600_000).optional(),\n })\n .optional(),\n /** LLM pass for `web_extract` (markdown-focused extraction). */\n webExtract: z\n .object({\n model: z.string().optional(),\n maxLength: z.number().positive().optional(),\n })\n .optional(),\n /**\n * Headless Playwright tools (`browser_*`). Opt-in. Install browsers once: `npx playwright install chromium`.\n */\n browser: z\n .object({\n enabled: z.boolean().optional(),\n /** Default true when browser tools are enabled. */\n headless: z.boolean().optional(),\n })\n .optional(),\n /** Sub-agent delegation (`delegate_task`). Opt-in. */\n delegate: z\n .object({\n enabled: z.boolean().optional(),\n })\n .optional(),\n /** Sandboxed `execute_code` (programmatic tool calls). Opt-in. */\n executeCode: z\n .object({\n enabled: z.boolean().optional(),\n })\n .optional(),\n /** Optional full system prompt replacement (merged with per-agent entry; entry wins). */\n systemPromptOverride: z.string().optional(),\n /** Optional allowlist of skill names for `<available_skills>`; when set, replaces unfiltered list. */\n skills: z.array(z.string()).optional(),\n /** Disable built-in tools by name (e.g. `shell`, `web_search`). */\n tools: z\n .object({\n disable: z.array(z.string()).optional(),\n })\n .optional(),\n /** Opaque per-process params (reserved for extensions / future use). */\n params: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const AgentConfigSchema = z.object({\n id: z.string(),\n /** When true, this entry is the default routing agent. */\n default: z.boolean().optional(),\n name: z.string().optional(),\n /** Short human-readable summary for UIs (gateway console, pickers). */\n description: z.string().max(4000).optional(),\n enabled: z.boolean().default(true),\n /** Per-agent workspace root (`~` expanded at runtime). */\n workspace: z.string().optional(),\n /**\n * Internal agent state directory (`…/credentials`, `agent.json`, pid, inbox).\n * Default: `<stateDir>/agents/<id>/agent`.\n */\n agentDir: z.string().optional(),\n model: AgentModelRefSchema.optional(),\n thinkingDefault: z.enum(['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'adaptive']).optional(),\n reasoningDefault: z.enum(['off', 'on', 'stream']).optional(),\n verboseDefault: z.enum(['off', 'on', 'full']).optional(),\n systemPromptOverride: z.string().optional(),\n skills: z.array(z.string()).optional(),\n tools: z\n .object({\n disable: z.array(z.string()).optional(),\n })\n .optional(),\n params: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const AgentsConfigSchema = z.object({\n /** Default agent id when not specified (routing / session creation). */\n default: z.string().optional(),\n defaults: AgentDefaultsSchema.optional(),\n list: z.array(AgentConfigSchema).optional(),\n}).default({\n defaults: {\n workspace: '~/.xopc/workspace',\n model: '', // Empty default - will be resolved dynamically at runtime\n maxTokens: 8192,\n temperature: 0.7,\n maxToolIterations: 20,\n maxRequestsPerTurn: 50,\n maxToolFailuresPerTurn: 3,\n compaction: {\n enabled: true,\n mode: 'default',\n reserveTokens: 8000,\n triggerThreshold: 0.8,\n minMessagesBeforeCompact: 10,\n keepRecentMessages: 5,\n evictionWindow: 0.2,\n retentionWindow: 6,\n },\n pruning: {\n enabled: true,\n maxToolResultChars: 10000,\n headKeepRatio: 0.3,\n tailKeepRatio: 0.3,\n },\n },\n} as any);\n\n// ============================================\n// Channel Configs (per-channel Zod lives in bundled extensions; root schema is open)\n// ============================================\n\nexport {\n TelegramTopicConfigSchema,\n TelegramGroupConfigSchema,\n TelegramAccountConfigSchema,\n TelegramConfigSchema,\n} from '../../extensions/telegram/src/config-schema.js';\nexport type { TelegramConfig } from '../../extensions/telegram/src/config-schema.js';\nexport { WeixinAccountConfigSchema, WeixinConfigSchema } from '../../extensions/weixin/src/config-schema.js';\nexport type { WeixinConfig } from '../../extensions/weixin/src/config-schema.js';\n\n// ============================================\n// Session Routing Configuration\n// ============================================\n\nexport const BindingMatchSchema = z.object({\n channel: z.string(),\n accountId: z.string().optional(),\n peerKind: z.string().optional(),\n peerId: z.string().optional(),\n guildId: z.string().optional(),\n teamId: z.string().optional(),\n memberRoleIds: z.array(z.string()).optional(),\n});\n\nexport const BindingRuleSchema = z.object({\n id: z.string().optional(),\n agentId: z.string(),\n priority: z.number().default(100),\n match: BindingMatchSchema,\n enabled: z.boolean().default(true),\n});\n\nexport const BindingsConfigSchema = z.array(BindingRuleSchema).default([]);\n\nexport const SessionDmScopeSchema = z.enum([\n 'main',\n 'per-peer',\n 'per-channel-peer',\n 'per-account-channel-peer',\n]);\n\nexport const SessionStorageConfigSchema = z.object({\n pruneAfterMs: z.number().optional(),\n maxEntries: z.number().optional(),\n});\n\nexport const SessionConfigSchema = z.object({\n dmScope: SessionDmScopeSchema.default('main'),\n identityLinks: z.record(z.string(), z.array(z.string())).optional(),\n storage: SessionStorageConfigSchema.optional(),\n}).default({\n dmScope: 'main',\n});\n\n/** Channel buckets — shapes validated post-parse by registered channel plugins. */\nexport const ChannelsConfigSchema = z.record(z.string(), z.unknown()).default({\n telegram: {\n enabled: false,\n botToken: '',\n allowFrom: [],\n groupAllowFrom: [],\n debug: false,\n dmPolicy: 'pairing' as const,\n groupPolicy: 'open' as const,\n replyToMode: 'off' as const,\n historyLimit: 50,\n textChunkLimit: 4000,\n },\n});\n\nexport const SearchProviderEntrySchema = z.object({\n type: z.enum(['brave', 'tavily', 'bing', 'searxng']),\n apiKey: z.string().optional(),\n /** SearXNG instance base URL (e.g. http://localhost:8080) */\n url: z.string().optional(),\n disabled: z.boolean().optional(),\n});\n\nexport type SearchProviderEntry = z.infer<typeof SearchProviderEntrySchema>;\n\nexport const WebSearchConfigSchema = z.object({\n maxResults: z.number().default(5),\n /** Ordered API providers; empty → HTML fallback only */\n providers: z.array(SearchProviderEntrySchema).default([]),\n});\n\nexport type WebSearchConfig = z.infer<typeof WebSearchConfigSchema>;\n\nexport const WebToolsConfigSchema = z.object({\n /** Search result HTML fallback: cn → Bing, otherwise DuckDuckGo */\n region: z.enum(['cn', 'global']).optional(),\n search: WebSearchConfigSchema.optional(),\n});\n\nexport type WebToolsConfig = z.infer<typeof WebToolsConfigSchema>;\n\nexport const ToolsConfigSchema = z.object({\n web: WebToolsConfigSchema.optional(),\n}).default({\n web: {\n search: {\n maxResults: 5,\n providers: [],\n },\n },\n});\n\n// ============================================\n// Gateway Configuration\n// ============================================\n\nexport const GatewayAuthRateLimitSchema = z\n .object({\n enabled: z.boolean().default(true),\n maxAttempts: z.number().int().min(1).default(5),\n windowMs: z.number().default(900_000),\n blockDurationMs: z.number().default(300_000),\n })\n .optional();\n\nexport const GatewayAuthSchema = z\n .object({\n mode: z.enum(['none', 'token']).default('token'),\n token: z.string().optional(),\n rateLimit: GatewayAuthRateLimitSchema,\n })\n .default({\n mode: 'token',\n });\n\nexport const HeartbeatConfigSchema = z\n .object({\n enabled: z.boolean(),\n intervalMs: z.number(),\n /** When false, heartbeat instructions are only sent during heartbeat polling turns (not in every chat system prompt). */\n includeSystemPromptSection: z.boolean().optional().default(false),\n target: z.string().optional(),\n targetChatId: z.string().optional(),\n prompt: z.string().optional(),\n ackMaxChars: z.number().optional(),\n isolatedSession: z.boolean().optional(),\n activeHours: z\n .object({\n start: z.string(),\n end: z.string(),\n timezone: z.string().optional(),\n })\n .optional(),\n })\n .default({\n enabled: true,\n intervalMs: 1_800_000,\n includeSystemPromptSection: false,\n });\n\nexport const GatewayConfigSchema = z.object({\n host: z.string().optional(),\n port: z.number().optional(),\n auth: GatewayAuthSchema.optional(),\n heartbeat: HeartbeatConfigSchema.optional(),\n maxSseConnections: z.number().optional(),\n corsOrigins: z.array(z.string()).optional(),\n /** Base URL for the xopc skills marketplace (public REST API). */\n skillsStoreBaseUrl: z.string().url().optional(),\n}).default({\n host: '127.0.0.1',\n port: 18790,\n auth: {\n mode: 'token',\n },\n heartbeat: {\n enabled: true,\n intervalMs: 1_800_000,\n includeSystemPromptSection: false,\n },\n maxSseConnections: 100,\n corsOrigins: [],\n skillsStoreBaseUrl: 'https://store.xopc.ai',\n});\n\nexport const CronConfigSchema = z.object({\n enabled: z.boolean().optional(),\n maxConcurrentJobs: z.number().optional(),\n defaultTimezone: z.string().optional(),\n historyRetentionDays: z.number().optional(),\n enableMetrics: z.boolean().optional(),\n}).default({\n enabled: true,\n maxConcurrentJobs: 5,\n defaultTimezone: 'UTC',\n historyRetentionDays: 7,\n enableMetrics: true,\n});\n\nexport const ModelsDevConfigSchema = z.object({\n enabled: z.boolean().default(true),\n}).default({\n enabled: true,\n});\n\n// ============================================\n// STT (Speech-to-Text) Config\n// ============================================\n\nexport const STTProviderConfigSchema = z.object({\n apiKey: z.string().optional(),\n model: z.string().optional(),\n});\n\nexport const STTFallbackConfigSchema = z.object({\n enabled: z.boolean().default(true),\n order: z.array(z.enum(['alibaba', 'openai'])).default(['alibaba', 'openai']),\n});\n\nexport const STTConfigSchema = z.object({\n enabled: z.boolean().default(false),\n provider: z.enum(['alibaba', 'openai']).default('alibaba'),\n alibaba: STTProviderConfigSchema.optional(),\n openai: STTProviderConfigSchema.optional(),\n fallback: STTFallbackConfigSchema.optional(),\n});\n\n// ============================================\n// TTS (Text-to-Speech) Config\n// ============================================\n\nexport const TTSProviderConfigSchema = z.object({\n apiKey: z.string().optional(),\n model: z.string().optional(),\n voice: z.string().optional(),\n});\n\nexport const TTSFallbackConfigSchema = z.object({\n enabled: z.boolean().default(true),\n order: z\n .array(z.enum(['openai', 'alibaba', 'edge', 'minimax']))\n .default(['openai', 'alibaba', 'minimax', 'edge']),\n});\n\nexport const TTSModelOverridesConfigSchema = z.object({\n enabled: z.boolean().default(true),\n allowText: z.boolean().default(true),\n allowProvider: z.boolean().default(false),\n allowVoice: z.boolean().default(true),\n allowModelId: z.boolean().default(true),\n allowVoiceSettings: z.boolean().default(false),\n allowNormalization: z.boolean().default(false),\n allowSeed: z.boolean().default(false),\n});\n\nexport const TTSEdgeConfigSchema = z.object({\n enabled: z.boolean().default(true),\n voice: z.string().optional(),\n lang: z.string().optional(),\n outputFormat: z.string().optional(),\n pitch: z.string().optional(),\n rate: z.string().optional(),\n volume: z.string().optional(),\n proxy: z.string().optional(),\n timeoutMs: z.number().int().min(1000).max(120000).optional(),\n});\n\nexport const TTSSummarizationConfigSchema = z.object({\n enabled: z.boolean().optional(),\n targetLength: z.number().int().min(1).optional(),\n threshold: z.number().int().min(1).optional(),\n model: z.string().optional(),\n});\n\nexport const TTSConfigSchema = z.object({\n enabled: z.boolean().default(false),\n provider: z.enum(['openai', 'alibaba', 'edge', 'minimax']).default('openai'),\n trigger: z\n .preprocess(\n (v) => (v === 'auto' ? 'inbound' : v),\n z.enum(['off', 'always', 'inbound', 'tagged']).default('always'),\n ),\n fallback: TTSFallbackConfigSchema.optional(),\n maxTextLength: z.number().int().min(1).default(512), // Conservative default to accommodate all providers (Alibaba limit is 512)\n timeoutMs: z.number().int().min(1000).max(180000).default(30000),\n summarization: TTSSummarizationConfigSchema.optional(),\n modelOverrides: TTSModelOverridesConfigSchema.optional(),\n alibaba: TTSProviderConfigSchema.optional(),\n openai: TTSProviderConfigSchema.optional(),\n edge: TTSEdgeConfigSchema.optional(),\n minimax: TTSProviderConfigSchema.optional(),\n});\n\n// ============================================\n// ACP (Agent Control Protocol) Config\n// ============================================\n\nexport const AcpDispatchConfigSchema = z.object({\n /** Master switch for ACP turn dispatch */\n enabled: z.boolean().optional(),\n});\n\nexport const AcpStreamConfigSchema = z.object({\n /** Coalescer idle flush window in milliseconds */\n coalesceIdleMs: z.number().optional(),\n /** Maximum text size per streamed chunk */\n maxChunkChars: z.number().optional(),\n /** Suppresses repeated status/tool projection lines */\n repeatSuppression: z.boolean().optional(),\n /** Live streams or waits for terminal event */\n deliveryMode: z.enum(['live', 'final_only']).optional(),\n /** Separator before visible text when hidden tool events occurred */\n hiddenBoundarySeparator: z.enum(['none', 'space', 'newline', 'paragraph']).optional(),\n /** Maximum assistant output characters per turn */\n maxOutputChars: z.number().optional(),\n /** Maximum visible characters for session/update lines */\n maxSessionUpdateChars: z.number().optional(),\n /** Per-sessionUpdate visibility overrides */\n tagVisibility: z.record(z.string(), z.boolean()).optional(),\n});\n\nexport const AcpRuntimeConfigSchema = z.object({\n /** Idle runtime TTL in minutes */\n ttlMinutes: z.number().optional(),\n /** Install/setup command shown by doctor */\n installCommand: z.string().optional(),\n});\n\nexport const AcpRateLimitConfigSchema = z.object({\n /** Maximum requests per window per session */\n maxRequests: z.number().default(100),\n /** Time window in milliseconds */\n windowMs: z.number().default(60000),\n /** Whether to enable rate limiting */\n enabled: z.boolean().default(true),\n});\n\nexport const AcpConfigSchema = z.object({\n /** Global ACP runtime gate */\n enabled: z.boolean().default(false),\n dispatch: AcpDispatchConfigSchema.optional(),\n /** Backend id registered by ACP runtime plugin */\n backend: z.string().optional(),\n /** Default agent for ACP sessions */\n defaultAgent: z.string().optional(),\n /** Allowed agents list */\n allowedAgents: z.array(z.string()).optional(),\n /** Maximum concurrent ACP sessions */\n maxConcurrentSessions: z.number().optional(),\n /** Rate limiting configuration */\n rateLimit: AcpRateLimitConfigSchema.optional(),\n stream: AcpStreamConfigSchema.optional(),\n runtime: AcpRuntimeConfigSchema.optional(),\n});\n\n// ============================================\n// ============================================\n// Extension Configs \n// ============================================\n\n// Security config for extensions \nexport const ExtensionSecurityConfigSchema = z.object({\n checkPermissions: z.boolean().default(true),\n allowUntrusted: z.boolean().default(false),\n allow: z.array(z.string()).default([]),\n trackProvenance: z.boolean().default(true),\n allowPromptInjection: z.boolean().default(false),\n});\n\n// Slot config for extensions \nexport const ExtensionSlotsConfigSchema = z.object({\n memory: z.string().optional(),\n tts: z.string().optional(),\n imageGeneration: z.string().optional(),\n webSearch: z.string().optional(),\n});\n\n// Complete extensions config\n// Extension config allows both known fields AND arbitrary extension-specific config\n// Known fields: enabled (array), allow (array), security (object), slots (object)\n// Arbitrary: any other key is extension-specific config (e.g., extensions.hello.greeting)\nexport const ExtensionsConfigSchema: z.ZodType<Record<string, unknown>> = z.record(z.string(), z.unknown());\n\n// ============================================\n// Root Config\n// ============================================\n\nexport const ConfigSchema = z.object({\n agents: AgentsConfigSchema,\n bindings: BindingsConfigSchema,\n session: SessionConfigSchema,\n channels: ChannelsConfigSchema,\n gateway: GatewayConfigSchema,\n tools: ToolsConfigSchema,\n cron: CronConfigSchema,\n extensions: ExtensionsConfigSchema.default({}),\n modelsDev: ModelsDevConfigSchema,\n stt: STTConfigSchema.optional(),\n tts: TTSConfigSchema.optional(),\n acp: AcpConfigSchema.optional(),\n}).default({\n agents: {\n defaults: {\n workspace: '~/.xopc/workspace',\n model: '', // Empty default - will be resolved dynamically at runtime\n maxTokens: 8192,\n temperature: 0.7,\n maxToolIterations: 20,\n maxRequestsPerTurn: 50,\n maxToolFailuresPerTurn: 3,\n thinkingDefault: 'medium',\n reasoningDefault: 'off',\n verboseDefault: 'off',\n compaction: {\n enabled: true,\n mode: 'default',\n reserveTokens: 8000,\n triggerThreshold: 0.8,\n minMessagesBeforeCompact: 10,\n keepRecentMessages: 5,\n evictionWindow: 0.2,\n retentionWindow: 6,\n },\n pruning: {\n enabled: true,\n maxToolResultChars: 10000,\n headKeepRatio: 0.3,\n tailKeepRatio: 0.3,\n },\n },\n },\n bindings: [],\n session: {\n dmScope: 'main' as const,\n },\n channels: {\n telegram: {\n enabled: false,\n botToken: '',\n allowFrom: [],\n groupAllowFrom: [],\n debug: false,\n dmPolicy: 'pairing' as const,\n groupPolicy: 'open' as const,\n replyToMode: 'off' as const,\n historyLimit: 50,\n textChunkLimit: 4000,\n },\n },\n gateway: {\n host: '127.0.0.1',\n port: 18790,\n auth: {\n mode: 'token',\n },\n heartbeat: {\n enabled: true,\n intervalMs: 1_800_000,\n includeSystemPromptSection: false,\n },\n maxSseConnections: 100,\n corsOrigins: [],\n skillsStoreBaseUrl: 'https://store.xopc.ai',\n },\n tools: {\n web: {\n search: {\n maxResults: 5,\n providers: [],\n },\n },\n },\n cron: {\n enabled: true,\n maxConcurrentJobs: 5,\n defaultTimezone: 'UTC',\n historyRetentionDays: 7,\n enableMetrics: true,\n },\n extensions: {\n allow: [],\n security: {\n checkPermissions: true,\n allowUntrusted: false,\n allow: [],\n trackProvenance: true,\n allowPromptInjection: false,\n },\n slots: {},\n },\n modelsDev: {\n enabled: true,\n },\n stt: {\n enabled: false,\n provider: 'alibaba',\n alibaba: {\n model: 'paraformer-v2',\n },\n openai: {\n model: 'whisper-1',\n },\n fallback: {\n enabled: true,\n order: ['alibaba', 'openai'],\n },\n },\n tts: {\n enabled: false,\n provider: 'openai',\n trigger: 'always',\n fallback: {\n enabled: true,\n order: ['openai', 'alibaba', 'minimax', 'edge'],\n },\n maxTextLength: 4096,\n timeoutMs: 30000,\n modelOverrides: {\n enabled: true,\n allowText: true,\n allowProvider: false,\n allowVoice: true,\n allowModelId: true,\n allowVoiceSettings: false,\n allowNormalization: false,\n allowSeed: false,\n },\n alibaba: {\n model: 'qwen-tts',\n voice: 'Cherry',\n },\n openai: {\n model: 'tts-1',\n voice: 'alloy',\n },\n edge: {\n enabled: true,\n voice: 'en-US-MichelleNeural',\n lang: 'en-US',\n outputFormat: 'audio-24khz-48kbitrate-mono-mp3',\n },\n minimax: {\n model: 'speech-2.8-hd',\n voice: 'male-qn-qingse',\n },\n },\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\nexport type AgentDefaults = z.infer<typeof AgentDefaultsSchema>;\nexport type GatewayAuthConfig = z.infer<typeof GatewayAuthSchema>;\nexport type GatewayAuthRateLimitConfig = z.infer<typeof GatewayAuthRateLimitSchema>;\nexport type STTConfig = z.infer<typeof STTConfigSchema>;\nexport type TTSConfig = z.infer<typeof TTSConfigSchema>;\nexport type AcpConfig = z.infer<typeof AcpConfigSchema>;\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Parse a model reference string.\n */\nexport interface ParsedModelRef {\n provider: string;\n model: string;\n}\n\n/**\n * Default agent Markdown workspace (merged `agents.defaults` + `agents.list`).\n */\nexport function getWorkspacePath(config: Config): string {\n return getDefaultWorkspacePath(config);\n}\n\n/**\n * Primary model ref from `agents.defaults.model` (string or `{ primary }`).\n * Returns undefined when unset or empty.\n */\nexport function getAgentDefaultModelRef(config: Config): string | undefined {\n const raw = config.agents?.defaults?.model;\n if (raw === undefined || raw === null) return undefined;\n const ref = typeof raw === 'string' ? raw : raw.primary;\n if (ref === undefined || ref === null) return undefined;\n const s = String(ref).trim();\n return s ? s : undefined;\n}\n\n/** `provider/model` or null when invalid. */\nexport function parseModelRef(ref: string): ParsedModelRef | null {\n const trimmed = ref.trim();\n const idx = trimmed.indexOf('/');\n if (idx <= 0 || idx === trimmed.length - 1) {\n return null;\n }\n return { provider: trimmed.slice(0, idx).trim(), model: trimmed.slice(idx + 1).trim() };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../../src/config/schema.ts"],"sourcesContent":["import { z } from 'zod';\n\nimport { getDefaultWorkspacePath } from '../agent/agent-scope.js';\n\n// ============================================\n// Agent Configs\n// ============================================\n\nexport const AgentModelRefSchema = z.union([\n z.string(),\n z\n .object({\n primary: z.string().optional(),\n fallbacks: z.array(z.string()).optional(),\n })\n .strict(),\n]);\n\nexport type AgentModelConfig = z.infer<typeof AgentModelRefSchema>;\n\nexport const AgentDefaultsSchema = z.object({\n workspace: z.string().default('~/.xopc/workspace'),\n model: z.union([\n z.string(),\n z.object({\n primary: z.string().optional(),\n fallbacks: z.array(z.string()).optional(),\n }).strict(),\n ]).default(''), // Empty default - will be resolved dynamically at runtime\n /** Vision / image understanding model (provider/model). Falls back to heuristics when unset. */\n imageModel: AgentModelRefSchema.optional(),\n /** Image generation model (provider/model), e.g. openai/gpt-image-1. Thin REST wrapper; OpenAI supported. */\n imageGenerationModel: AgentModelRefSchema.optional(),\n /** Max image size for image tool loads (MB). */\n mediaMaxMb: z.number().positive().optional(),\n maxTokens: z.number().default(8192),\n temperature: z.number().default(0.7),\n maxToolIterations: z.number().default(20),\n // Wall-clock limit for one user turn (LLM + tools). Default 30m if unset; cap 4h.\n maxTaskDurationMs: z.number().min(60000).max(14_400_000).optional(),\n // Reliability settings\n maxRequestsPerTurn: z.number().min(10).max(200).default(50),\n maxToolFailuresPerTurn: z.number().min(1).max(20).default(3),\n // Thinking ability settings\n thinkingDefault: z.enum(['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'adaptive']).optional(),\n reasoningDefault: z.enum(['off', 'on', 'stream']).optional(),\n verboseDefault: z.enum(['off', 'on', 'full']).optional(),\n compaction: z.object({\n enabled: z.boolean().default(true),\n mode: z.enum(['default', 'safeguard']).default('default'),\n reserveTokens: z.number().default(8000),\n triggerThreshold: z.number().min(0.5).max(0.95).default(0.8),\n minMessagesBeforeCompact: z.number().default(10),\n keepRecentMessages: z.number().default(5),\n // Dual-strategy compaction\n evictionWindow: z.number().min(0.1).max(0.5).default(0.2),\n retentionWindow: z.number().min(3).max(20).default(6),\n }).optional(),\n pruning: z.object({\n enabled: z.boolean().default(true),\n maxToolResultChars: z.number().default(10000),\n headKeepRatio: z.number().default(0.3),\n tailKeepRatio: z.number().default(0.3),\n }).optional(),\n /**\n * Curated memory (`agents/<id>/memories/`) + pluggable external provider.\n * Only one external provider at a time.\n */\n memory: z\n .object({\n /** Master switch: curated snapshot, `curated_memory`, prefetch, and external provider. Default true. */\n enabled: z.boolean().optional(),\n /** When false, use workspace bootstrap only (no curated snapshot / tool). Default true. */\n useEnhancedSystem: z.boolean().optional(),\n /** Include USER.md in snapshot. Default true. */\n userProfileEnabled: z.boolean().optional(),\n memoryCharLimit: z.number().positive().optional(),\n userCharLimit: z.number().positive().optional(),\n provider: z.enum(['none', 'stub']).optional(),\n /** How often prefetched external memory is injected into the user message. */\n injectionFrequency: z.enum(['every-turn', 'first-turn']).optional(),\n /** Inject prefetch on turns 1, 1+N, 1+2N, … (only when injectionFrequency is every-turn). Min 1. */\n contextCadence: z.number().int().min(1).optional(),\n /** Reserved for future external “dialectic” sync cadence (not wired yet). */\n dialecticCadence: z.number().int().min(1).optional(),\n })\n .optional(),\n /** Cross-session transcript search (`session_search` tool). */\n sessionSearch: z\n .object({\n /** Model ref for per-session summaries (e.g. openai/gpt-4o-mini). */\n summaryModel: z.string().optional(),\n })\n .optional(),\n /**\n * Post-turn background review (Hermes-style): optional quiet follow-up that may call\n * `curated_memory` / `skill_manage` so durable facts and reusable workflows persist\n * without bloating the main user-visible turn.\n */\n backgroundReview: z\n .object({\n /** When true, nudges may run after successful turns. Default false (opt-in). */\n enabled: z.boolean().optional(),\n /** User-turn cadence for memory review. 0 disables the memory channel. Default 10. */\n memoryNudgeInterval: z.number().int().min(0).optional(),\n /** LLM rounds without `skill_manage` before a skill review. 0 disables the skill channel. Default 10. */\n skillNudgeInterval: z.number().int().min(0).optional(),\n /** Max tool executions for the review agent. Default 8. */\n maxToolRounds: z.number().int().min(1).max(32).optional(),\n /** Max prior messages passed into the review context (tail). Default 80. */\n maxHistoryMessages: z.number().int().min(10).max(200).optional(),\n /** Wall-clock cap for the review run (ms). Default 120000. */\n maxDurationMs: z.number().int().min(30_000).max(600_000).optional(),\n })\n .optional(),\n /** LLM pass for `web_extract` (markdown-focused extraction). */\n webExtract: z\n .object({\n model: z.string().optional(),\n maxLength: z.number().positive().optional(),\n })\n .optional(),\n /**\n * Headless Playwright tools (`browser_*`). Opt-in. Install browsers once: `npx playwright install chromium`.\n */\n browser: z\n .object({\n enabled: z.boolean().optional(),\n /** Default true when browser tools are enabled. */\n headless: z.boolean().optional(),\n })\n .optional(),\n /** Sub-agent delegation (`delegate_task`). Opt-in. */\n delegate: z\n .object({\n enabled: z.boolean().optional(),\n })\n .optional(),\n /** Sandboxed `execute_code` (programmatic tool calls). Opt-in. */\n executeCode: z\n .object({\n enabled: z.boolean().optional(),\n })\n .optional(),\n /** Optional full system prompt replacement (merged with per-agent entry; entry wins). */\n systemPromptOverride: z.string().optional(),\n /** Optional allowlist of skill names for `<available_skills>`; when set, replaces unfiltered list. */\n skills: z.array(z.string()).optional(),\n /** Disable built-in tools by name (e.g. `shell`, `web_search`). */\n tools: z\n .object({\n disable: z.array(z.string()).optional(),\n })\n .optional(),\n /** Opaque per-process params (reserved for extensions / future use). */\n params: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const AgentConfigSchema = z.object({\n id: z.string(),\n /** When true, this entry is the default routing agent. */\n default: z.boolean().optional(),\n name: z.string().optional(),\n /** Short human-readable summary for UIs (gateway console, pickers). */\n description: z.string().max(4000).optional(),\n enabled: z.boolean().default(true),\n /** Per-agent workspace root (`~` expanded at runtime). */\n workspace: z.string().optional(),\n /**\n * Internal agent state directory (`…/credentials`, `agent.json`, pid, inbox).\n * Default: `<stateDir>/agents/<id>/agent`.\n */\n agentDir: z.string().optional(),\n model: AgentModelRefSchema.optional(),\n thinkingDefault: z.enum(['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'adaptive']).optional(),\n reasoningDefault: z.enum(['off', 'on', 'stream']).optional(),\n verboseDefault: z.enum(['off', 'on', 'full']).optional(),\n systemPromptOverride: z.string().optional(),\n skills: z.array(z.string()).optional(),\n tools: z\n .object({\n disable: z.array(z.string()).optional(),\n })\n .optional(),\n params: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const AgentsConfigSchema = z.object({\n /** Default agent id when not specified (routing / session creation). */\n default: z.string().optional(),\n defaults: AgentDefaultsSchema.optional(),\n list: z.array(AgentConfigSchema).optional(),\n}).default({\n defaults: {\n workspace: '~/.xopc/workspace',\n model: '', // Empty default - will be resolved dynamically at runtime\n maxTokens: 8192,\n temperature: 0.7,\n maxToolIterations: 20,\n maxRequestsPerTurn: 50,\n maxToolFailuresPerTurn: 3,\n compaction: {\n enabled: true,\n mode: 'default',\n reserveTokens: 8000,\n triggerThreshold: 0.8,\n minMessagesBeforeCompact: 10,\n keepRecentMessages: 5,\n evictionWindow: 0.2,\n retentionWindow: 6,\n },\n pruning: {\n enabled: true,\n maxToolResultChars: 10000,\n headKeepRatio: 0.3,\n tailKeepRatio: 0.3,\n },\n },\n} as any);\n\n// ============================================\n// Channel Configs (per-channel Zod lives in bundled extensions; root schema is open)\n// ============================================\n\nexport {\n TelegramTopicConfigSchema,\n TelegramGroupConfigSchema,\n TelegramAccountConfigSchema,\n TelegramConfigSchema,\n} from '../../extensions/telegram/src/config-schema.js';\nexport type { TelegramConfig } from '../../extensions/telegram/src/config-schema.js';\nexport { WeixinAccountConfigSchema, WeixinConfigSchema } from '../../extensions/weixin/src/config-schema.js';\nexport type { WeixinConfig } from '../../extensions/weixin/src/config-schema.js';\n\n// ============================================\n// Session Routing Configuration\n// ============================================\n\nexport const BindingMatchSchema = z.object({\n channel: z.string(),\n accountId: z.string().optional(),\n peerKind: z.string().optional(),\n peerId: z.string().optional(),\n guildId: z.string().optional(),\n teamId: z.string().optional(),\n memberRoleIds: z.array(z.string()).optional(),\n});\n\nexport const BindingRuleSchema = z.object({\n id: z.string().optional(),\n agentId: z.string(),\n priority: z.number().default(100),\n match: BindingMatchSchema,\n enabled: z.boolean().default(true),\n});\n\nexport const BindingsConfigSchema = z.array(BindingRuleSchema).default([]);\n\nexport const SessionDmScopeSchema = z.enum([\n 'main',\n 'per-peer',\n 'per-channel-peer',\n 'per-account-channel-peer',\n]);\n\nexport const SessionStorageConfigSchema = z.object({\n pruneAfterMs: z.number().optional(),\n maxEntries: z.number().optional(),\n});\n\nexport const SessionConfigSchema = z.object({\n dmScope: SessionDmScopeSchema.default('main'),\n identityLinks: z.record(z.string(), z.array(z.string())).optional(),\n storage: SessionStorageConfigSchema.optional(),\n}).default({\n dmScope: 'main',\n});\n\n/** Channel buckets — shapes validated post-parse by registered channel plugins. */\nexport const ChannelsConfigSchema = z.record(z.string(), z.unknown()).default({\n telegram: {\n enabled: false,\n botToken: '',\n allowFrom: [],\n groupAllowFrom: [],\n debug: false,\n dmPolicy: 'pairing' as const,\n groupPolicy: 'open' as const,\n replyToMode: 'off' as const,\n historyLimit: 50,\n textChunkLimit: 4000,\n },\n});\n\nexport const SearchProviderEntrySchema = z.object({\n type: z.enum(['brave', 'tavily', 'bing', 'searxng']),\n apiKey: z.string().optional(),\n /** SearXNG instance base URL (e.g. http://localhost:8080) */\n url: z.string().optional(),\n disabled: z.boolean().optional(),\n});\n\nexport type SearchProviderEntry = z.infer<typeof SearchProviderEntrySchema>;\n\nexport const WebSearchConfigSchema = z.object({\n maxResults: z.number().default(5),\n /** Ordered API providers; empty → HTML fallback only */\n providers: z.array(SearchProviderEntrySchema).default([]),\n});\n\nexport type WebSearchConfig = z.infer<typeof WebSearchConfigSchema>;\n\nexport const WebToolsConfigSchema = z.object({\n /** Search result HTML fallback: cn → Bing, otherwise DuckDuckGo */\n region: z.enum(['cn', 'global']).optional(),\n search: WebSearchConfigSchema.optional(),\n});\n\nexport type WebToolsConfig = z.infer<typeof WebToolsConfigSchema>;\n\nexport const ToolsConfigSchema = z.object({\n web: WebToolsConfigSchema.optional(),\n}).default({\n web: {\n search: {\n maxResults: 5,\n providers: [],\n },\n },\n});\n\n// ============================================\n// Gateway Configuration\n// ============================================\n\nexport const GatewayAuthRateLimitSchema = z\n .object({\n enabled: z.boolean().default(true),\n maxAttempts: z.number().int().min(1).default(5),\n windowMs: z.number().default(900_000),\n blockDurationMs: z.number().default(300_000),\n })\n .optional();\n\nexport const GatewayAuthSchema = z\n .object({\n mode: z.enum(['none', 'token']).default('token'),\n token: z.string().optional(),\n rateLimit: GatewayAuthRateLimitSchema,\n })\n .default({\n mode: 'token',\n });\n\nexport const HeartbeatConfigSchema = z\n .object({\n enabled: z.boolean(),\n intervalMs: z.number(),\n /** When false, heartbeat instructions are only sent during heartbeat polling turns (not in every chat system prompt). */\n includeSystemPromptSection: z.boolean().optional().default(false),\n target: z.string().optional(),\n targetChatId: z.string().optional(),\n prompt: z.string().optional(),\n ackMaxChars: z.number().optional(),\n isolatedSession: z.boolean().optional(),\n activeHours: z\n .object({\n start: z.string(),\n end: z.string(),\n timezone: z.string().optional(),\n })\n .optional(),\n })\n .default({\n enabled: true,\n intervalMs: 1_800_000,\n includeSystemPromptSection: false,\n });\n\nexport const GatewayConfigSchema = z.object({\n host: z.string().optional(),\n port: z.number().optional(),\n auth: GatewayAuthSchema.optional(),\n heartbeat: HeartbeatConfigSchema.optional(),\n maxSseConnections: z.number().optional(),\n corsOrigins: z.array(z.string()).optional(),\n /** Base URL for the xopc skills marketplace (public REST API). */\n skillsStoreBaseUrl: z.string().url().optional(),\n}).default({\n host: '127.0.0.1',\n port: 18790,\n auth: {\n mode: 'token',\n },\n heartbeat: {\n enabled: true,\n intervalMs: 1_800_000,\n includeSystemPromptSection: false,\n },\n maxSseConnections: 100,\n corsOrigins: [],\n skillsStoreBaseUrl: 'https://store.xopc.ai',\n});\n\nexport const CronConfigSchema = z.object({\n enabled: z.boolean().optional(),\n maxConcurrentJobs: z.number().optional(),\n defaultTimezone: z.string().optional(),\n historyRetentionDays: z.number().optional(),\n enableMetrics: z.boolean().optional(),\n}).default({\n enabled: true,\n maxConcurrentJobs: 5,\n defaultTimezone: 'UTC',\n historyRetentionDays: 7,\n enableMetrics: true,\n});\n\nexport const ModelsDevConfigSchema = z.object({\n enabled: z.boolean().default(true),\n}).default({\n enabled: true,\n});\n\n// ============================================\n// STT (Speech-to-Text) Config\n// ============================================\n\nexport const STTProviderConfigSchema = z.object({\n apiKey: z.string().optional(),\n model: z.string().optional(),\n});\n\nexport const STTFallbackConfigSchema = z.object({\n enabled: z.boolean().default(true),\n order: z.array(z.enum(['alibaba', 'openai'])).default(['alibaba', 'openai']),\n});\n\nexport const STTConfigSchema = z.object({\n enabled: z.boolean().default(false),\n provider: z.enum(['alibaba', 'openai']).default('alibaba'),\n alibaba: STTProviderConfigSchema.optional(),\n openai: STTProviderConfigSchema.optional(),\n fallback: STTFallbackConfigSchema.optional(),\n});\n\n// ============================================\n// TTS (Text-to-Speech) Config\n// ============================================\n\nexport const TTSProviderConfigSchema = z.object({\n apiKey: z.string().optional(),\n model: z.string().optional(),\n voice: z.string().optional(),\n});\n\nexport const TTSFallbackConfigSchema = z.object({\n enabled: z.boolean().default(true),\n order: z\n .array(z.enum(['openai', 'alibaba', 'edge', 'minimax']))\n .default(['openai', 'alibaba', 'minimax', 'edge']),\n});\n\nexport const TTSModelOverridesConfigSchema = z.object({\n enabled: z.boolean().default(true),\n allowText: z.boolean().default(true),\n allowProvider: z.boolean().default(false),\n allowVoice: z.boolean().default(true),\n allowModelId: z.boolean().default(true),\n allowVoiceSettings: z.boolean().default(false),\n allowNormalization: z.boolean().default(false),\n allowSeed: z.boolean().default(false),\n});\n\nexport const TTSEdgeConfigSchema = z.object({\n enabled: z.boolean().default(true),\n voice: z.string().optional(),\n lang: z.string().optional(),\n outputFormat: z.string().optional(),\n pitch: z.string().optional(),\n rate: z.string().optional(),\n volume: z.string().optional(),\n proxy: z.string().optional(),\n timeoutMs: z.number().int().min(1000).max(120000).optional(),\n});\n\nexport const TTSSummarizationConfigSchema = z.object({\n enabled: z.boolean().optional(),\n targetLength: z.number().int().min(1).optional(),\n threshold: z.number().int().min(1).optional(),\n model: z.string().optional(),\n});\n\nexport const TTSConfigSchema = z.object({\n enabled: z.boolean().default(false),\n provider: z.enum(['openai', 'alibaba', 'edge', 'minimax']).default('openai'),\n trigger: z\n .preprocess(\n (v) => (v === 'auto' ? 'inbound' : v),\n z.enum(['off', 'always', 'inbound', 'tagged']).default('always'),\n ),\n fallback: TTSFallbackConfigSchema.optional(),\n maxTextLength: z.number().int().min(1).default(512), // Conservative default to accommodate all providers (Alibaba limit is 512)\n timeoutMs: z.number().int().min(1000).max(180000).default(30000),\n summarization: TTSSummarizationConfigSchema.optional(),\n modelOverrides: TTSModelOverridesConfigSchema.optional(),\n alibaba: TTSProviderConfigSchema.optional(),\n openai: TTSProviderConfigSchema.optional(),\n edge: TTSEdgeConfigSchema.optional(),\n minimax: TTSProviderConfigSchema.optional(),\n});\n\n// ============================================\n// Extension Configs \n// ============================================\n\n// Security config for extensions \nexport const ExtensionSecurityConfigSchema = z.object({\n checkPermissions: z.boolean().default(true),\n allowUntrusted: z.boolean().default(false),\n allow: z.array(z.string()).default([]),\n trackProvenance: z.boolean().default(true),\n allowPromptInjection: z.boolean().default(false),\n});\n\n// Slot config for extensions \nexport const ExtensionSlotsConfigSchema = z.object({\n memory: z.string().optional(),\n tts: z.string().optional(),\n imageGeneration: z.string().optional(),\n webSearch: z.string().optional(),\n});\n\n// Complete extensions config\n// Extension config allows both known fields AND arbitrary extension-specific config\n// Known fields: enabled (array), allow (array), security (object), slots (object)\n// Arbitrary: any other key is extension-specific config (e.g., extensions.hello.greeting)\nexport const ExtensionsConfigSchema: z.ZodType<Record<string, unknown>> = z.record(z.string(), z.unknown());\n\n// ============================================\n// Update Config\n// ============================================\n\nexport const UpdateAutoConfigSchema = z\n .object({\n /** Enable automatic update installation. Default false. */\n enabled: z.boolean().default(false),\n /** Hours to wait before applying a stable update after first detection. */\n stableDelayHours: z.number().min(0).default(6),\n /** Additional random jitter hours for stable rollout (avoids thundering herd). */\n stableJitterHours: z.number().min(0).default(12),\n /** How often to re-check for beta updates (hours). Min 0.25. */\n betaCheckIntervalHours: z.number().min(0.25).default(1),\n })\n .strict()\n .optional();\n\nexport const UpdateConfigSchema = z\n .object({\n /** Check for updates on gateway startup. Default true. */\n checkOnStart: z.boolean().default(true),\n /** Update channel: stable (default), beta, or dev. */\n channel: z.enum(['stable', 'beta', 'dev']).default('stable'),\n /** Automatic update policy. */\n auto: UpdateAutoConfigSchema,\n })\n .strict()\n .optional();\n\nexport type UpdateConfig = z.infer<typeof UpdateConfigSchema>;\n\n// ============================================\n// Root Config\n// ============================================\n\nexport const ConfigSchema = z.object({\n agents: AgentsConfigSchema,\n bindings: BindingsConfigSchema,\n session: SessionConfigSchema,\n channels: ChannelsConfigSchema,\n gateway: GatewayConfigSchema,\n tools: ToolsConfigSchema,\n cron: CronConfigSchema,\n extensions: ExtensionsConfigSchema.default({}),\n modelsDev: ModelsDevConfigSchema,\n stt: STTConfigSchema.optional(),\n tts: TTSConfigSchema.optional(),\n update: UpdateConfigSchema,\n}).default({\n agents: {\n defaults: {\n workspace: '~/.xopc/workspace',\n model: '', // Empty default - will be resolved dynamically at runtime\n maxTokens: 8192,\n temperature: 0.7,\n maxToolIterations: 20,\n maxRequestsPerTurn: 50,\n maxToolFailuresPerTurn: 3,\n thinkingDefault: 'medium',\n reasoningDefault: 'off',\n verboseDefault: 'off',\n compaction: {\n enabled: true,\n mode: 'default',\n reserveTokens: 8000,\n triggerThreshold: 0.8,\n minMessagesBeforeCompact: 10,\n keepRecentMessages: 5,\n evictionWindow: 0.2,\n retentionWindow: 6,\n },\n pruning: {\n enabled: true,\n maxToolResultChars: 10000,\n headKeepRatio: 0.3,\n tailKeepRatio: 0.3,\n },\n },\n },\n bindings: [],\n session: {\n dmScope: 'main' as const,\n },\n channels: {\n telegram: {\n enabled: false,\n botToken: '',\n allowFrom: [],\n groupAllowFrom: [],\n debug: false,\n dmPolicy: 'pairing' as const,\n groupPolicy: 'open' as const,\n replyToMode: 'off' as const,\n historyLimit: 50,\n textChunkLimit: 4000,\n },\n },\n gateway: {\n host: '127.0.0.1',\n port: 18790,\n auth: {\n mode: 'token',\n },\n heartbeat: {\n enabled: true,\n intervalMs: 1_800_000,\n includeSystemPromptSection: false,\n },\n maxSseConnections: 100,\n corsOrigins: [],\n skillsStoreBaseUrl: 'https://store.xopc.ai',\n },\n tools: {\n web: {\n search: {\n maxResults: 5,\n providers: [],\n },\n },\n },\n cron: {\n enabled: true,\n maxConcurrentJobs: 5,\n defaultTimezone: 'UTC',\n historyRetentionDays: 7,\n enableMetrics: true,\n },\n extensions: {\n allow: [],\n security: {\n checkPermissions: true,\n allowUntrusted: false,\n allow: [],\n trackProvenance: true,\n allowPromptInjection: false,\n },\n slots: {},\n },\n modelsDev: {\n enabled: true,\n },\n stt: {\n enabled: false,\n provider: 'alibaba',\n alibaba: {\n model: 'paraformer-v2',\n },\n openai: {\n model: 'whisper-1',\n },\n fallback: {\n enabled: true,\n order: ['alibaba', 'openai'],\n },\n },\n tts: {\n enabled: false,\n provider: 'openai',\n trigger: 'always',\n fallback: {\n enabled: true,\n order: ['openai', 'alibaba', 'minimax', 'edge'],\n },\n maxTextLength: 4096,\n timeoutMs: 30000,\n modelOverrides: {\n enabled: true,\n allowText: true,\n allowProvider: false,\n allowVoice: true,\n allowModelId: true,\n allowVoiceSettings: false,\n allowNormalization: false,\n allowSeed: false,\n },\n alibaba: {\n model: 'qwen-tts',\n voice: 'Cherry',\n },\n openai: {\n model: 'tts-1',\n voice: 'alloy',\n },\n edge: {\n enabled: true,\n voice: 'en-US-MichelleNeural',\n lang: 'en-US',\n outputFormat: 'audio-24khz-48kbitrate-mono-mp3',\n },\n minimax: {\n model: 'speech-2.8-hd',\n voice: 'male-qn-qingse',\n },\n },\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\nexport type AgentDefaults = z.infer<typeof AgentDefaultsSchema>;\nexport type GatewayAuthConfig = z.infer<typeof GatewayAuthSchema>;\nexport type GatewayAuthRateLimitConfig = z.infer<typeof GatewayAuthRateLimitSchema>;\nexport type STTConfig = z.infer<typeof STTConfigSchema>;\nexport type TTSConfig = z.infer<typeof TTSConfigSchema>;\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Parse a model reference string.\n */\nexport interface ParsedModelRef {\n provider: string;\n model: string;\n}\n\n/**\n * Default agent Markdown workspace (merged `agents.defaults` + `agents.list`).\n */\nexport function getWorkspacePath(config: Config): string {\n return getDefaultWorkspacePath(config);\n}\n\n/**\n * Primary model ref from `agents.defaults.model` (string or `{ primary }`).\n * Returns undefined when unset or empty.\n */\nexport function getAgentDefaultModelRef(config: Config): string | undefined {\n const raw = config.agents?.defaults?.model;\n if (raw === undefined || raw === null) return undefined;\n const ref = typeof raw === 'string' ? raw : raw.primary;\n if (ref === undefined || ref === null) return undefined;\n const s = String(ref).trim();\n return s ? s : undefined;\n}\n\n/** `provider/model` or null when invalid. */\nexport function parseModelRef(ref: string): ParsedModelRef | null {\n const trimmed = ref.trim();\n const idx = trimmed.indexOf('/');\n if (idx <= 0 || idx === trimmed.length - 1) {\n return null;\n }\n return { provider: trimmed.slice(0, idx).trim(), model: trimmed.slice(idx + 1).trim() };\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
3
|
import { JobDataSchema } from "./validation.js";
|
|
4
|
-
import { dirname } from "path";
|
|
5
4
|
import { access, mkdir, readFile, rename, unlink, writeFile } from "fs/promises";
|
|
5
|
+
import { dirname } from "path";
|
|
6
6
|
//#region src/cron/persistence.ts
|
|
7
7
|
init_logger();
|
|
8
8
|
const log = createLogger("CronPersistence");
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
3
|
import { init_paths, resolveCronRunsDir } from "../config/paths.js";
|
|
4
|
-
import { join } from "path";
|
|
5
4
|
import { appendFile, mkdir, readFile, readdir, unlink, writeFile } from "fs/promises";
|
|
5
|
+
import { join } from "path";
|
|
6
6
|
//#region src/cron/run-log-store.ts
|
|
7
7
|
init_paths();
|
|
8
8
|
init_logger();
|
|
@@ -4,7 +4,7 @@ import { init_logger } from "../utils/logger.js";
|
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import os from "node:os";
|
|
6
6
|
import { existsSync } from "node:fs";
|
|
7
|
-
import { access, constants, mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
7
|
+
import { access, constants as constants$1, mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
8
8
|
import { spawn, spawnSync } from "node:child_process";
|
|
9
9
|
//#region src/daemon/launchd.ts
|
|
10
10
|
/**
|
|
@@ -215,7 +215,7 @@ var init_launchd = __esmMin((() => {
|
|
|
215
215
|
async isLoaded(args) {
|
|
216
216
|
const plistPath = resolveLaunchAgentPlistPath(args.env);
|
|
217
217
|
try {
|
|
218
|
-
await access(plistPath, constants.F_OK);
|
|
218
|
+
await access(plistPath, constants$1.F_OK);
|
|
219
219
|
return true;
|
|
220
220
|
} catch {
|
|
221
221
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launchd.js","names":[],"sources":["../../../src/daemon/launchd.ts"],"sourcesContent":["/**\n * LaunchAgent Service - macOS user service management\n */\n\nimport { writeFile, mkdir, readFile, rm, access, constants } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { spawn, spawnSync } from 'node:child_process';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { createLogger } from '../utils/logger.js';\nimport type {\n GatewayService,\n GatewayServiceInstallArgs,\n GatewayServiceControlArgs,\n GatewayServiceEnvArgs,\n GatewayServiceRuntime,\n GatewayServiceCommandConfig,\n GatewayServiceEnv,\n} from './types.js';\n\nconst log = createLogger('LaunchdService');\n\n/**\n * Get GUI domain (for user launchd)\n */\nfunction resolveGuiDomain(): string {\n // For user agents, use \"gui/\" domain\n return `gui/${os.userInfo().uid}`;\n}\n\n/**\n * Resolve plist path\n */\nfunction resolveLaunchAgentPlistPath(env: GatewayServiceEnv): string {\n const home = os.homedir();\n const libraryPath = path.join(home, 'Library', 'LaunchAgents');\n const label = env.XOPC_PROFILE ? `ai.xopc.gateway.${env.XOPC_PROFILE}` : 'ai.xopc.gateway';\n return path.join(libraryPath, `${label}.plist`);\n}\n\n/**\n * Resolve log directory\n */\nfunction resolveLogDir(): string {\n return path.join(os.homedir(), '.xopc', 'logs');\n}\n\n/**\n * Build plist content\n */\nfunction buildLaunchAgentPlist(params: {\n label: string;\n programArguments: string[];\n workingDirectory?: string;\n environment: Record<string, string>;\n stdoutPath?: string;\n stderrPath?: string;\n}): string {\n const envDict = Object.entries(params.environment)\n .map(([k, v]) => ` <key>${k}</key>\\n <string>${escapeXml(v)}</string>`)\n .join('\\n');\n\n const programArgs = params.programArguments\n .map((arg) => ` <string>${escapeXml(arg)}</string>`)\n .join('\\n');\n\n let plist = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${escapeXml(params.label)}</string>\n <key>ProgramArguments</key>\n <array>\n${programArgs}\n </array>\n`;\n\n if (params.workingDirectory) {\n plist += ` <key>WorkingDirectory</key>\n <string>${escapeXml(params.workingDirectory)}</string>\n`;\n }\n\n if (Object.keys(params.environment).length > 0) {\n plist += ` <key>EnvironmentVariables</key>\n <dict>\n${envDict}\n </dict>\n`;\n }\n\n if (params.stdoutPath) {\n plist += ` <key>StandardOutPath</key>\n <string>${escapeXml(params.stdoutPath)}</string>\n`;\n }\n\n if (params.stderrPath) {\n plist += ` <key>StandardErrorPath</key>\n <string>${escapeXml(params.stderrPath)}</string>\n`;\n }\n\n plist += ` <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <dict>\n <key>SuccessfulExit</key>\n <false/>\n </dict>\n <key>ProcessType</key>\n <string>Interactive</string>\n</dict>\n</plist>`;\n\n return plist;\n}\n\n/**\n * Escape XML special characters\n */\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * Execute launchctl command\n */\nasync function launchctl(args: string[], _options?: { stdin?: string }): Promise<string> {\n try {\n const child = spawn('launchctl', args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n \n let out = '';\n let err = '';\n \n if (child.stdout) {\n child.stdout.on('data', (data) => { out += data.toString(); });\n }\n if (child.stderr) {\n child.stderr.on('data', (data) => { err += data.toString(); });\n }\n \n return await new Promise<string>((resolve, reject) => {\n child.on('close', () => {\n if (err) {\n const errStr = err.trim();\n if (errStr) {\n log.debug({ stderr: errStr }, 'launchctl stderr');\n }\n }\n resolve(out);\n });\n child.on('error', reject);\n });\n } catch (err) {\n const e = err as { message?: string };\n throw new Error(`launchctl failed: ${e.message || String(err)}`);\n }\n}\n\n/**\n * Check if launchd is available\n */\nexport function isLaunchdAvailable(): boolean {\n if (process.platform !== 'darwin') return false;\n try {\n const result = spawnSync('launchctl', ['print', 'gui/'], {\n stdio: ['ignore', 'ignore', 'ignore'],\n });\n return result.status === 0;\n } catch {\n return false;\n }\n}\n\n/**\n * LaunchAgent service implementation\n */\nexport const launchdService: GatewayService = {\n label: 'ai.xopc.gateway',\n loadedText: 'ai.xopc.gateway',\n notLoadedText: 'ai.xopc.gateway',\n\n async install(args: GatewayServiceInstallArgs): Promise<void> {\n const plistPath = resolveLaunchAgentPlistPath(args.env);\n const logDir = resolveLogDir();\n const label = args.env.XOPC_PROFILE\n ? `ai.xopc.gateway.${args.env.XOPC_PROFILE}`\n : 'ai.xopc.gateway';\n\n // Ensure directories exist\n await mkdir(path.dirname(plistPath), { recursive: true });\n await mkdir(logDir, { recursive: true });\n\n // Build environment\n const environment: Record<string, string> = {\n ...args.environment,\n XOPC_CONFIG: args.env.XOPC_CONFIG || '',\n XOPC_WORKSPACE: args.env.XOPC_WORKSPACE || '',\n XOPC_LOG_LEVEL: args.env.XOPC_LOG_LEVEL || 'info',\n XOPC_LOG_FILE: 'true',\n };\n\n if (args.env.XOPC_GATEWAY_TOKEN) {\n environment.XOPC_GATEWAY_TOKEN = args.env.XOPC_GATEWAY_TOKEN;\n }\n\n // Build plist\n const plist = buildLaunchAgentPlist({\n label,\n programArguments: args.programArguments,\n workingDirectory: args.workingDirectory,\n environment,\n stdoutPath: path.join(logDir, 'gateway.log'),\n stderrPath: path.join(logDir, 'gateway.err.log'),\n });\n\n // Write plist\n await writeFile(plistPath, plist, 'utf8');\n args.stdout?.write(`Written: ${plistPath}\\n`);\n\n // Bootstrap the agent\n const domain = resolveGuiDomain();\n await launchctl(['bootstrap', domain, plistPath]);\n\n log.info('LaunchAgent installed');\n },\n\n async uninstall(args: GatewayServiceControlArgs): Promise<void> {\n const plistPath = resolveLaunchAgentPlistPath(args.env);\n\n // Bootout (stop and unload)\n const domain = resolveGuiDomain();\n try {\n await launchctl(['bootout', domain, plistPath]);\n } catch {\n // Ignore if not loaded\n }\n\n // Remove plist\n if (existsSync(plistPath)) {\n await rm(plistPath);\n args.stdout?.write(`Removed: ${plistPath}\\n`);\n }\n\n log.info('LaunchAgent uninstalled');\n },\n\n async start(args: GatewayServiceControlArgs): Promise<void> {\n const plistPath = resolveLaunchAgentPlistPath(args.env);\n const domain = resolveGuiDomain();\n await launchctl(['bootstrap', domain, plistPath]);\n log.info('LaunchAgent started');\n },\n\n async stop(args: GatewayServiceControlArgs): Promise<void> {\n const plistPath = resolveLaunchAgentPlistPath(args.env);\n const domain = resolveGuiDomain();\n try {\n await launchctl(['bootout', domain, plistPath]);\n } catch {\n // Ignore if not running\n }\n log.info('LaunchAgent stopped');\n },\n\n async restart(args: GatewayServiceControlArgs): Promise<void> {\n await this.stop(args);\n await this.start(args);\n log.info('LaunchAgent restarted');\n },\n\n async isLoaded(args: GatewayServiceEnvArgs): Promise<boolean> {\n const plistPath = resolveLaunchAgentPlistPath(args.env);\n try {\n await access(plistPath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n },\n\n async getRuntime(args: GatewayServiceEnvArgs): Promise<GatewayServiceRuntime> {\n const plistPath = resolveLaunchAgentPlistPath(args.env);\n const domain = resolveGuiDomain();\n\n try {\n const output = await launchctl(['print', `${domain}/${path.basename(plistPath, '.plist')}`]);\n \n // Parse output for PID and state\n const pidMatch = output.match(/pid\\s*=\\s*(\\d+)/);\n const stateMatch = output.match(/\"initial\"\\s*=\\s*\"([^\"]+)\"/);\n \n let status: 'running' | 'stopped' | 'unknown' = 'unknown';\n let pid: number | undefined;\n \n if (stateMatch) {\n status = stateMatch[1] === 'running' ? 'running' : 'stopped';\n }\n if (pidMatch) {\n pid = parseInt(pidMatch[1], 10);\n }\n \n return { status, pid };\n } catch {\n return { status: 'unknown' };\n }\n },\n\n async readCommand(env: GatewayServiceEnv): Promise<GatewayServiceCommandConfig | null> {\n const plistPath = resolveLaunchAgentPlistPath(env);\n if (!existsSync(plistPath)) return null;\n\n const content = await readFile(plistPath, 'utf8');\n \n // Parse plist (simple regex approach)\n const argsMatch = content.match(/<array>[\\s\\S]*?<\\/array>/);\n const programArgs: string[] = [];\n \n if (argsMatch) {\n const stringMatches = argsMatch[0].match(/<string>([^<]+)<\\/string>/g);\n if (stringMatches) {\n for (const m of stringMatches) {\n programArgs.push(m.replace(/<\\/?string>/g, ''));\n }\n }\n }\n\n const workDirMatch = content.match(/<key>WorkingDirectory<\\/key>\\s*<string>([^<]+)<\\/string>/);\n\n return {\n program: programArgs[0] || '',\n arguments: programArgs.slice(1),\n workingDirectory: workDirMatch?.[1],\n };\n },\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"launchd.js","names":["constants"],"sources":["../../../src/daemon/launchd.ts"],"sourcesContent":["/**\n * LaunchAgent Service - macOS user service management\n */\n\nimport { writeFile, mkdir, readFile, rm, access, constants } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { spawn, spawnSync } from 'node:child_process';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { createLogger } from '../utils/logger.js';\nimport type {\n GatewayService,\n GatewayServiceInstallArgs,\n GatewayServiceControlArgs,\n GatewayServiceEnvArgs,\n GatewayServiceRuntime,\n GatewayServiceCommandConfig,\n GatewayServiceEnv,\n} from './types.js';\n\nconst log = createLogger('LaunchdService');\n\n/**\n * Get GUI domain (for user launchd)\n */\nfunction resolveGuiDomain(): string {\n // For user agents, use \"gui/\" domain\n return `gui/${os.userInfo().uid}`;\n}\n\n/**\n * Resolve plist path\n */\nfunction resolveLaunchAgentPlistPath(env: GatewayServiceEnv): string {\n const home = os.homedir();\n const libraryPath = path.join(home, 'Library', 'LaunchAgents');\n const label = env.XOPC_PROFILE ? `ai.xopc.gateway.${env.XOPC_PROFILE}` : 'ai.xopc.gateway';\n return path.join(libraryPath, `${label}.plist`);\n}\n\n/**\n * Resolve log directory\n */\nfunction resolveLogDir(): string {\n return path.join(os.homedir(), '.xopc', 'logs');\n}\n\n/**\n * Build plist content\n */\nfunction buildLaunchAgentPlist(params: {\n label: string;\n programArguments: string[];\n workingDirectory?: string;\n environment: Record<string, string>;\n stdoutPath?: string;\n stderrPath?: string;\n}): string {\n const envDict = Object.entries(params.environment)\n .map(([k, v]) => ` <key>${k}</key>\\n <string>${escapeXml(v)}</string>`)\n .join('\\n');\n\n const programArgs = params.programArguments\n .map((arg) => ` <string>${escapeXml(arg)}</string>`)\n .join('\\n');\n\n let plist = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${escapeXml(params.label)}</string>\n <key>ProgramArguments</key>\n <array>\n${programArgs}\n </array>\n`;\n\n if (params.workingDirectory) {\n plist += ` <key>WorkingDirectory</key>\n <string>${escapeXml(params.workingDirectory)}</string>\n`;\n }\n\n if (Object.keys(params.environment).length > 0) {\n plist += ` <key>EnvironmentVariables</key>\n <dict>\n${envDict}\n </dict>\n`;\n }\n\n if (params.stdoutPath) {\n plist += ` <key>StandardOutPath</key>\n <string>${escapeXml(params.stdoutPath)}</string>\n`;\n }\n\n if (params.stderrPath) {\n plist += ` <key>StandardErrorPath</key>\n <string>${escapeXml(params.stderrPath)}</string>\n`;\n }\n\n plist += ` <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <dict>\n <key>SuccessfulExit</key>\n <false/>\n </dict>\n <key>ProcessType</key>\n <string>Interactive</string>\n</dict>\n</plist>`;\n\n return plist;\n}\n\n/**\n * Escape XML special characters\n */\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * Execute launchctl command\n */\nasync function launchctl(args: string[], _options?: { stdin?: string }): Promise<string> {\n try {\n const child = spawn('launchctl', args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n \n let out = '';\n let err = '';\n \n if (child.stdout) {\n child.stdout.on('data', (data) => { out += data.toString(); });\n }\n if (child.stderr) {\n child.stderr.on('data', (data) => { err += data.toString(); });\n }\n \n return await new Promise<string>((resolve, reject) => {\n child.on('close', () => {\n if (err) {\n const errStr = err.trim();\n if (errStr) {\n log.debug({ stderr: errStr }, 'launchctl stderr');\n }\n }\n resolve(out);\n });\n child.on('error', reject);\n });\n } catch (err) {\n const e = err as { message?: string };\n throw new Error(`launchctl failed: ${e.message || String(err)}`);\n }\n}\n\n/**\n * Check if launchd is available\n */\nexport function isLaunchdAvailable(): boolean {\n if (process.platform !== 'darwin') return false;\n try {\n const result = spawnSync('launchctl', ['print', 'gui/'], {\n stdio: ['ignore', 'ignore', 'ignore'],\n });\n return result.status === 0;\n } catch {\n return false;\n }\n}\n\n/**\n * LaunchAgent service implementation\n */\nexport const launchdService: GatewayService = {\n label: 'ai.xopc.gateway',\n loadedText: 'ai.xopc.gateway',\n notLoadedText: 'ai.xopc.gateway',\n\n async install(args: GatewayServiceInstallArgs): Promise<void> {\n const plistPath = resolveLaunchAgentPlistPath(args.env);\n const logDir = resolveLogDir();\n const label = args.env.XOPC_PROFILE\n ? `ai.xopc.gateway.${args.env.XOPC_PROFILE}`\n : 'ai.xopc.gateway';\n\n // Ensure directories exist\n await mkdir(path.dirname(plistPath), { recursive: true });\n await mkdir(logDir, { recursive: true });\n\n // Build environment\n const environment: Record<string, string> = {\n ...args.environment,\n XOPC_CONFIG: args.env.XOPC_CONFIG || '',\n XOPC_WORKSPACE: args.env.XOPC_WORKSPACE || '',\n XOPC_LOG_LEVEL: args.env.XOPC_LOG_LEVEL || 'info',\n XOPC_LOG_FILE: 'true',\n };\n\n if (args.env.XOPC_GATEWAY_TOKEN) {\n environment.XOPC_GATEWAY_TOKEN = args.env.XOPC_GATEWAY_TOKEN;\n }\n\n // Build plist\n const plist = buildLaunchAgentPlist({\n label,\n programArguments: args.programArguments,\n workingDirectory: args.workingDirectory,\n environment,\n stdoutPath: path.join(logDir, 'gateway.log'),\n stderrPath: path.join(logDir, 'gateway.err.log'),\n });\n\n // Write plist\n await writeFile(plistPath, plist, 'utf8');\n args.stdout?.write(`Written: ${plistPath}\\n`);\n\n // Bootstrap the agent\n const domain = resolveGuiDomain();\n await launchctl(['bootstrap', domain, plistPath]);\n\n log.info('LaunchAgent installed');\n },\n\n async uninstall(args: GatewayServiceControlArgs): Promise<void> {\n const plistPath = resolveLaunchAgentPlistPath(args.env);\n\n // Bootout (stop and unload)\n const domain = resolveGuiDomain();\n try {\n await launchctl(['bootout', domain, plistPath]);\n } catch {\n // Ignore if not loaded\n }\n\n // Remove plist\n if (existsSync(plistPath)) {\n await rm(plistPath);\n args.stdout?.write(`Removed: ${plistPath}\\n`);\n }\n\n log.info('LaunchAgent uninstalled');\n },\n\n async start(args: GatewayServiceControlArgs): Promise<void> {\n const plistPath = resolveLaunchAgentPlistPath(args.env);\n const domain = resolveGuiDomain();\n await launchctl(['bootstrap', domain, plistPath]);\n log.info('LaunchAgent started');\n },\n\n async stop(args: GatewayServiceControlArgs): Promise<void> {\n const plistPath = resolveLaunchAgentPlistPath(args.env);\n const domain = resolveGuiDomain();\n try {\n await launchctl(['bootout', domain, plistPath]);\n } catch {\n // Ignore if not running\n }\n log.info('LaunchAgent stopped');\n },\n\n async restart(args: GatewayServiceControlArgs): Promise<void> {\n await this.stop(args);\n await this.start(args);\n log.info('LaunchAgent restarted');\n },\n\n async isLoaded(args: GatewayServiceEnvArgs): Promise<boolean> {\n const plistPath = resolveLaunchAgentPlistPath(args.env);\n try {\n await access(plistPath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n },\n\n async getRuntime(args: GatewayServiceEnvArgs): Promise<GatewayServiceRuntime> {\n const plistPath = resolveLaunchAgentPlistPath(args.env);\n const domain = resolveGuiDomain();\n\n try {\n const output = await launchctl(['print', `${domain}/${path.basename(plistPath, '.plist')}`]);\n \n // Parse output for PID and state\n const pidMatch = output.match(/pid\\s*=\\s*(\\d+)/);\n const stateMatch = output.match(/\"initial\"\\s*=\\s*\"([^\"]+)\"/);\n \n let status: 'running' | 'stopped' | 'unknown' = 'unknown';\n let pid: number | undefined;\n \n if (stateMatch) {\n status = stateMatch[1] === 'running' ? 'running' : 'stopped';\n }\n if (pidMatch) {\n pid = parseInt(pidMatch[1], 10);\n }\n \n return { status, pid };\n } catch {\n return { status: 'unknown' };\n }\n },\n\n async readCommand(env: GatewayServiceEnv): Promise<GatewayServiceCommandConfig | null> {\n const plistPath = resolveLaunchAgentPlistPath(env);\n if (!existsSync(plistPath)) return null;\n\n const content = await readFile(plistPath, 'utf8');\n \n // Parse plist (simple regex approach)\n const argsMatch = content.match(/<array>[\\s\\S]*?<\\/array>/);\n const programArgs: string[] = [];\n \n if (argsMatch) {\n const stringMatches = argsMatch[0].match(/<string>([^<]+)<\\/string>/g);\n if (stringMatches) {\n for (const m of stringMatches) {\n programArgs.push(m.replace(/<\\/?string>/g, ''));\n }\n }\n }\n\n const workDirMatch = content.match(/<key>WorkingDirectory<\\/key>\\s*<string>([^<]+)<\\/string>/);\n\n return {\n program: programArgs[0] || '',\n arguments: programArgs.slice(1),\n workingDirectory: workDirMatch?.[1],\n };\n },\n};\n"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { init_logger } from "../utils/logger.js";
|
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import os from "node:os";
|
|
6
6
|
import { existsSync } from "node:fs";
|
|
7
|
-
import { access, constants, mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
7
|
+
import { access, constants as constants$1, mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
8
8
|
import { execSync, spawn, spawnSync } from "node:child_process";
|
|
9
9
|
//#region src/daemon/systemd.ts
|
|
10
10
|
/**
|
|
@@ -107,7 +107,7 @@ function isSystemdAvailable() {
|
|
|
107
107
|
*/
|
|
108
108
|
async function isLingerEnabled() {
|
|
109
109
|
try {
|
|
110
|
-
await access(`/var/lib/systemd/linger/${getUsername()}`, constants.F_OK);
|
|
110
|
+
await access(`/var/lib/systemd/linger/${getUsername()}`, constants$1.F_OK);
|
|
111
111
|
return true;
|
|
112
112
|
} catch {
|
|
113
113
|
return false;
|