@xopcai/xopc 0.0.83 → 0.0.85
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/README.zh-CN.md +3 -1
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
- package/dist/extensions/feishu/src/plugin.d.ts +2 -0
- package/dist/extensions/feishu/src/plugin.js +10 -0
- package/dist/extensions/feishu/src/plugin.js.map +1 -1
- package/dist/extensions/feishu/src/workflow-progress.d.ts +27 -0
- package/dist/extensions/feishu/src/workflow-progress.js +99 -0
- package/dist/extensions/feishu/src/workflow-progress.js.map +1 -0
- package/dist/extensions/telegram/src/plugin.d.ts +2 -0
- package/dist/extensions/telegram/src/plugin.js +11 -1
- package/dist/extensions/telegram/src/plugin.js.map +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/src/workflow-progress.d.ts +24 -0
- package/dist/extensions/telegram/src/workflow-progress.js +73 -0
- package/dist/extensions/telegram/src/workflow-progress.js.map +1 -0
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +158 -0
- package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +1 -0
- package/dist/extensions/weixin/src/api/api.js +2 -2
- package/dist/extensions/weixin/src/auth/accounts.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
- package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.d.ts +2 -0
- package/dist/extensions/weixin/src/plugin.js +11 -1
- package/dist/extensions/weixin/src/plugin.js.map +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.d.ts +26 -0
- package/dist/extensions/weixin/src/workflow-progress.js +99 -0
- package/dist/extensions/weixin/src/workflow-progress.js.map +1 -0
- package/dist/gateway/static/root/assets/agents-D3_-kNlZ.js +222 -0
- package/dist/gateway/static/root/assets/apps-page-D7v7649T.js +1 -0
- package/dist/gateway/static/root/assets/channels-settings-nCaMb0a7.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-C1gZBcJV.js +8 -0
- package/dist/gateway/static/root/assets/createLucideIcon-DPHK1VkS.js +1 -0
- package/dist/gateway/static/root/assets/cron-api-CoYK0hlm.js +1 -0
- package/dist/gateway/static/root/assets/cron-page-DeGo-Vjc.js +1 -0
- package/dist/gateway/static/root/assets/dist-BTWC-BTN.js +45 -0
- package/dist/gateway/static/root/assets/{dist-BpQxde0t.js → dist-DaK4dsss.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-CY27wj_p.js → extension-debug-page-BZngZWbO.js} +1 -1
- package/dist/gateway/static/root/assets/extension-page-D6JSyV27.js +1 -0
- package/dist/gateway/static/root/assets/extension-settings-page-8PZcmWI7.js +1 -0
- package/dist/gateway/static/root/assets/fetch-B2MYHbWg.js +1 -0
- package/dist/gateway/static/root/assets/{field-primitives-fa_hiQcX.js → field-primitives-Zzl22MvN.js} +1 -1
- package/dist/gateway/static/root/assets/heartbeat-config-api-BtIcpG0O.js +1 -0
- package/dist/gateway/static/root/assets/index-D4vM3-P7.js +4700 -0
- package/dist/gateway/static/root/assets/index-ew_2L2We.css +1 -0
- package/dist/gateway/static/root/assets/logs-page-_d4UJ-qQ.js +1 -0
- package/dist/gateway/static/root/assets/sessions-page-5N4aF2Wk.js +1 -0
- package/dist/gateway/static/root/assets/settings-form-section-D_tgb8r2.js +1 -0
- package/dist/gateway/static/root/assets/settings-page-C18xBt4X.js +3 -0
- package/dist/gateway/static/root/assets/share-preview-page-D4EG_vM1.js +2 -0
- package/dist/gateway/static/root/assets/skills-page-sPAXhh8w.js +2 -0
- package/dist/gateway/static/root/assets/theme-store-DryYl3qD.js +1 -0
- package/dist/gateway/static/root/assets/url-BwNL6Rgk.js +3 -0
- package/dist/gateway/static/root/assets/utils-CYO9eTCM.js +1 -0
- package/dist/gateway/static/root/assets/voice-api-key-field-Ds51havm.js +1 -0
- package/dist/gateway/static/root/index.html +7 -6
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.js +7 -7
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
- package/dist/src/agent/context/workspace-seed.js +3 -3
- package/dist/src/agent/embedded/map-stream-events.js +6 -0
- package/dist/src/agent/embedded/map-stream-events.js.map +1 -1
- package/dist/src/agent/embedded/subscribe-session.js +24 -0
- package/dist/src/agent/embedded/subscribe-session.js.map +1 -1
- package/dist/src/agent/embedded/types.d.ts +19 -0
- package/dist/src/agent/goals/goal-locale.js +2 -2
- package/dist/src/agent/goals/goal-run-store.js +4 -4
- package/dist/src/agent/goals/persistent-goal-service.js +1 -1
- package/dist/src/agent/goals/post-turn.js +2 -2
- package/dist/src/agent/image/load-image-media.js +2 -2
- package/dist/src/agent/ipc/bus.js +1 -1
- package/dist/src/agent/ipc/inbox.js +2 -2
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/memory/builtin-memory-store.js +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
- package/dist/src/agent/memory/dreaming/events.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
- package/dist/src/agent/memory/dreaming/preview.js +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
- package/dist/src/agent/reply/post-compaction-context.js +1 -1
- package/dist/src/agent/reply/startup-context.d.ts +3 -0
- package/dist/src/agent/reply/startup-context.js +25 -2
- package/dist/src/agent/reply/startup-context.js.map +1 -1
- package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
- package/dist/src/agent/sandbox/path-policy.js +2 -2
- package/dist/src/agent/service/build-direct-message-content.js +1 -1
- package/dist/src/agent/service.d.ts +1 -0
- package/dist/src/agent/service.js +10 -4
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/session-inspector.js +1 -1
- package/dist/src/agent/skills/config.js +1 -1
- package/dist/src/agent/skills/hub-hash.js +2 -2
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +3 -3
- package/dist/src/agent/skills/index.js +1 -1
- package/dist/src/agent/skills/managed-store.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-manager.js +1 -1
- package/dist/src/agent/tools/create-share-tool.d.ts +27 -0
- package/dist/src/agent/tools/create-share-tool.js +237 -0
- package/dist/src/agent/tools/create-share-tool.js.map +1 -0
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/factory.js +35 -1
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/index.d.ts +2 -0
- package/dist/src/agent/tools/index.js +3 -1
- package/dist/src/agent/tools/send-media.js +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +1 -1
- package/dist/src/agent/tools/workflow-tool.d.ts +41 -0
- package/dist/src/agent/tools/workflow-tool.js +271 -0
- package/dist/src/agent/tools/workflow-tool.js.map +1 -0
- package/dist/src/agent/tools/write.js +1 -1
- package/dist/src/agent/workflow/builtins/audit-repo.d.ts +9 -0
- package/dist/src/agent/workflow/builtins/audit-repo.js +115 -0
- package/dist/src/agent/workflow/builtins/audit-repo.js.map +1 -0
- package/dist/src/agent/workflow/builtins/index.d.ts +15 -0
- package/dist/src/agent/workflow/builtins/index.js +28 -0
- package/dist/src/agent/workflow/builtins/index.js.map +1 -0
- package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +9 -0
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js +113 -0
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +1 -0
- package/dist/src/agent/workflow/builtins/research.d.ts +9 -0
- package/dist/src/agent/workflow/builtins/research.js +129 -0
- package/dist/src/agent/workflow/builtins/research.js.map +1 -0
- package/dist/src/agent/workflow/catalog.d.ts +51 -0
- package/dist/src/agent/workflow/catalog.js +155 -0
- package/dist/src/agent/workflow/catalog.js.map +1 -0
- package/dist/src/agent/workflow/channel-capability.d.ts +76 -0
- package/dist/src/agent/workflow/channel-capability.js +1 -0
- package/dist/src/agent/workflow/index.d.ts +11 -0
- package/dist/src/agent/workflow/index.js +10 -0
- package/dist/src/agent/workflow/last-run-memory.d.ts +42 -0
- package/dist/src/agent/workflow/last-run-memory.js +60 -0
- package/dist/src/agent/workflow/last-run-memory.js.map +1 -0
- package/dist/src/agent/workflow/parser.d.ts +20 -0
- package/dist/src/agent/workflow/parser.js +137 -0
- package/dist/src/agent/workflow/parser.js.map +1 -0
- package/dist/src/agent/workflow/progress-broker.d.ts +80 -0
- package/dist/src/agent/workflow/progress-broker.js +263 -0
- package/dist/src/agent/workflow/progress-broker.js.map +1 -0
- package/dist/src/agent/workflow/runtime.d.ts +31 -0
- package/dist/src/agent/workflow/runtime.js +301 -0
- package/dist/src/agent/workflow/runtime.js.map +1 -0
- package/dist/src/agent/workflow/snapshot.d.ts +18 -0
- package/dist/src/agent/workflow/snapshot.js +144 -0
- package/dist/src/agent/workflow/snapshot.js.map +1 -0
- package/dist/src/agent/workflow/structured-output-tool.d.ts +33 -0
- package/dist/src/agent/workflow/structured-output-tool.js +58 -0
- package/dist/src/agent/workflow/structured-output-tool.js.map +1 -0
- package/dist/src/agent/workflow/subagent-runner.d.ts +42 -0
- package/dist/src/agent/workflow/subagent-runner.js +104 -0
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -0
- package/dist/src/agent/workflow/types.d.ts +137 -0
- package/dist/src/agent/workflow/types.js +1 -0
- package/dist/src/auth/credentials.js +3 -3
- package/dist/src/auth/profiles/store.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/browser/cache-dir-policy.js +1 -1
- package/dist/src/browser/cdp-local-launcher.js +2 -2
- package/dist/src/browser/providers/browser-ext-install.js +4 -4
- package/dist/src/browser/providers/cloakbrowser.js +4 -4
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/stealth.js +1 -1
- 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/outbound/persist-store.js +1 -1
- package/dist/src/channels/pairing/allow-from-file.js +1 -1
- package/dist/src/channels/pairing/pairing-store.js +2 -2
- package/dist/src/chat-commands/builtins/config.js +2 -2
- package/dist/src/chat-commands/builtins/model.js +40 -23
- package/dist/src/chat-commands/builtins/model.js.map +1 -1
- package/dist/src/chat-commands/builtins/system.js +30 -15
- package/dist/src/chat-commands/builtins/system.js.map +1 -1
- package/dist/src/chat-commands/builtins/workflow.d.ts +18 -0
- package/dist/src/chat-commands/builtins/workflow.js +167 -0
- package/dist/src/chat-commands/builtins/workflow.js.map +1 -0
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/chat-commands/format-output.d.ts +28 -0
- package/dist/src/chat-commands/format-output.js +45 -0
- package/dist/src/chat-commands/format-output.js.map +1 -0
- package/dist/src/chat-commands/index.d.ts +1 -0
- package/dist/src/chat-commands/index.js +3 -1
- package/dist/src/chat-commands/index.js.map +1 -1
- package/dist/src/cli/command-catalog.js +110 -8
- package/dist/src/cli/command-catalog.js.map +1 -1
- package/dist/src/cli/command-loaders.js +2 -0
- package/dist/src/cli/command-loaders.js.map +1 -1
- package/dist/src/cli/command-manifest.js +9 -1
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/config.js +71 -20
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/cron-cli.d.ts +2 -0
- package/dist/src/cli/commands/cron-cli.js +15 -0
- package/dist/src/cli/commands/cron-cli.js.map +1 -0
- package/dist/src/cli/commands/cron.d.ts +4 -1
- package/dist/src/cli/commands/cron.js +76 -41
- package/dist/src/cli/commands/cron.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/config-health.js +2 -2
- package/dist/src/cli/commands/doctor/checks/config-health.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/cron-health.js +1 -1
- package/dist/src/cli/commands/doctor/checks/cron-health.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/gateway-health.js +2 -2
- package/dist/src/cli/commands/doctor/checks/gateway-health.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/gateway-service.js +2 -2
- package/dist/src/cli/commands/doctor/checks/gateway-service.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +2 -2
- package/dist/src/cli/commands/doctor/checks/state-integrity.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +4 -4
- package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +1 -1
- package/dist/src/cli/commands/extension-dev.js +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +1 -1
- package/dist/src/cli/commands/extension-pack.js +1 -1
- package/dist/src/cli/commands/gateway/index.d.ts +1 -1
- package/dist/src/cli/commands/gateway/index.js +2 -2
- package/dist/src/cli/commands/gateway/lifecycle.js +10 -4
- package/dist/src/cli/commands/gateway/lifecycle.js.map +1 -1
- package/dist/src/cli/commands/gateway/service.d.ts +4 -0
- package/dist/src/cli/commands/gateway/service.js +17 -2
- package/dist/src/cli/commands/gateway/service.js.map +1 -1
- package/dist/src/cli/commands/gateway/shared.js +1 -1
- package/dist/src/cli/commands/gateway/subcommands.js +1 -4
- package/dist/src/cli/commands/gateway/subcommands.js.map +1 -1
- package/dist/src/cli/commands/image.js +1 -1
- package/dist/src/cli/commands/init.js +31 -4
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/models.d.ts +4 -1
- package/dist/src/cli/commands/models.js +86 -74
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +4 -2
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/profile.d.ts +3 -5
- package/dist/src/cli/commands/profile.js +31 -31
- package/dist/src/cli/commands/profile.js.map +1 -1
- package/dist/src/cli/commands/setup.js +6 -1
- package/dist/src/cli/commands/setup.js.map +1 -1
- package/dist/src/cli/commands/tunnel.js +2 -2
- package/dist/src/cli/gateway-run-argv.js +15 -5
- package/dist/src/cli/gateway-run-argv.js.map +1 -1
- package/dist/src/cli/utils/gateway-client.js +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +2 -2
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +5 -5
- package/dist/src/config/loader.js +2 -2
- package/dist/src/config/models-json.js +2 -2
- package/dist/src/config/paths-state.js +1 -1
- package/dist/src/config/profile.js +2 -2
- package/dist/src/config/public-url.d.ts +28 -0
- package/dist/src/config/public-url.js +103 -0
- package/dist/src/config/public-url.js.map +1 -0
- package/dist/src/config/schema.d.ts +82 -0
- package/dist/src/config/schema.js +130 -1
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/workspace-path.js +1 -1
- package/dist/src/cron/executor.js +2 -2
- package/dist/src/cron/persistence.js +1 -1
- package/dist/src/cron/run-log-store.js +1 -1
- package/dist/src/daemon/constants.js +1 -1
- package/dist/src/daemon/install-plan.js +3 -3
- package/dist/src/daemon/install-plan.js.map +1 -1
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/schtasks.js +38 -1
- package/dist/src/daemon/schtasks.js.map +1 -1
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/extensions/bundle-mcp.js +1 -1
- package/dist/src/extensions/discover-extensions.js +1 -1
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/loader.js +1 -1
- package/dist/src/extensions/lockfile.js +2 -2
- package/dist/src/gateway/agents-admin.js +2 -2
- package/dist/src/gateway/file-path-classifier.js +2 -2
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/app.js +33 -2
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.js +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +2 -2
- package/dist/src/gateway/hono/lib/static-ui.js +2 -2
- package/dist/src/gateway/hono/oauth.js +1 -1
- package/dist/src/gateway/hono/routes/agents.js +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +1 -1
- package/dist/src/gateway/hono/routes/host-fs.js +2 -2
- package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/shares.js +631 -34
- package/dist/src/gateway/hono/routes/shares.js.map +1 -1
- package/dist/src/gateway/hono/routes/site-shares.d.ts +3 -0
- package/dist/src/gateway/hono/routes/site-shares.js +228 -0
- package/dist/src/gateway/hono/routes/site-shares.js.map +1 -0
- package/dist/src/gateway/hono/routes/tunnel.js +97 -8
- package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +5 -5
- package/dist/src/gateway/hono/sse.js +2 -2
- package/dist/src/gateway/host.d.ts +3 -1
- package/dist/src/gateway/host.js +3 -1
- package/dist/src/gateway/host.js.map +1 -1
- package/dist/src/gateway/lock.js +3 -3
- package/dist/src/gateway/ports.d.ts +6 -0
- package/dist/src/gateway/ports.js +38 -2
- package/dist/src/gateway/ports.js.map +1 -1
- package/dist/src/gateway/public-url.d.ts +8 -0
- package/dist/src/gateway/public-url.js +10 -0
- package/dist/src/gateway/public-url.js.map +1 -0
- package/dist/src/gateway/security/origin-check.d.ts +9 -1
- package/dist/src/gateway/security/origin-check.js +4 -0
- package/dist/src/gateway/security/origin-check.js.map +1 -1
- package/dist/src/gateway/server.js +15 -0
- package/dist/src/gateway/server.js.map +1 -1
- package/dist/src/gateway/service/agent-runner.js +2 -2
- package/dist/src/gateway/service/marketplace-service.js +2 -2
- package/dist/src/gateway/service/run-gateway-agent.js +2 -2
- package/dist/src/gateway/service.js +3 -2
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/workspace-fs-file-list.js +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/i18n/goals-bundle.js +1 -1
- package/dist/src/i18n/index.d.ts +1 -0
- package/dist/src/i18n/index.js +2 -1
- package/dist/src/i18n/locales/share-tool.en.js +15 -0
- package/dist/src/i18n/locales/share-tool.en.js.map +1 -0
- package/dist/src/i18n/locales/share-tool.zh.js +15 -0
- package/dist/src/i18n/locales/share-tool.zh.js.map +1 -0
- package/dist/src/i18n/share-tool-bundle.d.ts +20 -0
- package/dist/src/i18n/share-tool-bundle.js +56 -0
- package/dist/src/i18n/share-tool-bundle.js.map +1 -0
- package/dist/src/infra/gateway-processes.js +1 -0
- package/dist/src/infra/gateway-processes.js.map +1 -1
- package/dist/src/infra/restart.js +2 -2
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-lock.js +3 -3
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/infra/update-startup.js +2 -2
- package/dist/src/infra/write-file-atomic.js +2 -2
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/index.js +2 -2
- package/dist/src/providers/model-registry.js +1 -1
- package/dist/src/session/config-store.js +2 -2
- package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
- package/dist/src/session/parity/sessions-json-file.js +1 -1
- package/dist/src/session/parity/transcript-file-lock.js +2 -2
- package/dist/src/session/parity/transcript-paths.js +1 -1
- package/dist/src/session/search-index-cache.js +1 -1
- package/dist/src/session/search-index.js +1 -1
- package/dist/src/session/session-title.js +3 -2
- package/dist/src/session/session-title.js.map +1 -1
- package/dist/src/session/store.js +5 -5
- package/dist/src/share/share-auto.d.ts +74 -0
- package/dist/src/share/share-auto.js +247 -0
- package/dist/src/share/share-auto.js.map +1 -0
- package/dist/src/share/share-config.js +63 -4
- package/dist/src/share/share-config.js.map +1 -1
- package/dist/src/share/share-landing.d.ts +28 -2
- package/dist/src/share/share-landing.js +155 -34
- package/dist/src/share/share-landing.js.map +1 -1
- package/dist/src/share/share-store.d.ts +48 -4
- package/dist/src/share/share-store.js +322 -51
- package/dist/src/share/share-store.js.map +1 -1
- package/dist/src/share/share-thumbnail.d.ts +35 -0
- package/dist/src/share/share-thumbnail.js +277 -0
- package/dist/src/share/share-thumbnail.js.map +1 -0
- package/dist/src/share/share-types.d.ts +68 -10
- package/dist/src/share/share-types.js +18 -1
- package/dist/src/share/share-types.js.map +1 -1
- package/dist/src/share/share-url.js +1 -1
- package/dist/src/share/share-zip.d.ts +35 -0
- package/dist/src/share/share-zip.js +303 -0
- package/dist/src/share/share-zip.js.map +1 -0
- package/dist/src/share/site-proxy.d.ts +35 -0
- package/dist/src/share/site-proxy.js +234 -0
- package/dist/src/share/site-proxy.js.map +1 -0
- package/dist/src/share/site-share-config.d.ts +11 -0
- package/dist/src/share/site-share-config.js +103 -0
- package/dist/src/share/site-share-config.js.map +1 -0
- package/dist/src/share/site-share-router.d.ts +23 -0
- package/dist/src/share/site-share-router.js +147 -0
- package/dist/src/share/site-share-router.js.map +1 -0
- package/dist/src/share/site-share-store.d.ts +53 -0
- package/dist/src/share/site-share-store.js +400 -0
- package/dist/src/share/site-share-store.js.map +1 -0
- package/dist/src/share/site-share-types.d.ts +103 -0
- package/dist/src/share/site-share-types.js +41 -0
- package/dist/src/share/site-share-types.js.map +1 -0
- package/dist/src/share/site-static-serve.d.ts +10 -0
- package/dist/src/share/site-static-serve.js +145 -0
- package/dist/src/share/site-static-serve.js.map +1 -0
- package/dist/src/tui/clipboard-image.js +3 -3
- package/dist/src/tui/theme-manager.js +1 -1
- package/dist/src/tui/tui-commands.js +18 -0
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-keybindings-file.js +1 -1
- package/dist/src/tui/tui-scoped-models.js +2 -2
- package/dist/src/tui/tui-settings.js +1 -1
- package/dist/src/tui/tui-workflow-slash.d.ts +32 -0
- package/dist/src/tui/tui-workflow-slash.js +63 -0
- package/dist/src/tui/tui-workflow-slash.js.map +1 -0
- package/dist/src/tui/tui.js +2 -2
- package/dist/src/tunnel/enable-lan-pairing.js +1 -1
- package/dist/src/tunnel/frpc-binary.js +3 -3
- package/dist/src/tunnel/frpc-config.js +1 -1
- package/dist/src/tunnel/frpc-extract.js +1 -1
- package/dist/src/tunnel/index.js +2 -2
- package/dist/src/tunnel/pair-context.d.ts +7 -1
- package/dist/src/tunnel/pair-context.js +25 -9
- package/dist/src/tunnel/pair-context.js.map +1 -1
- package/dist/src/tunnel/pair-url.d.ts +14 -1
- package/dist/src/tunnel/pair-url.js +14 -1
- package/dist/src/tunnel/pair-url.js.map +1 -1
- package/dist/src/tunnel/tunnel-service.js +2 -2
- package/dist/src/tunnel/tunnel-state.js +1 -1
- package/dist/src/utils/logger/audit.js +1 -1
- package/dist/src/utils/logger/log-store.js +1 -1
- package/dist/src/utils/logger/rotation.js +1 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +2 -2
- package/package.json +3 -2
- package/dist/gateway/static/root/assets/agents-CrpYTHJS.js +0 -222
- package/dist/gateway/static/root/assets/apps-page-1mcKh5Rh.js +0 -1
- package/dist/gateway/static/root/assets/button-KafIU8dx.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-zd6QNKPx.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-uRAuhiUo.js +0 -8
- package/dist/gateway/static/root/assets/cron-api-O2Q_ruV6.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-By09AQD-.js +0 -1
- package/dist/gateway/static/root/assets/dist-C57OMHW8.js +0 -48
- package/dist/gateway/static/root/assets/extension-page-C-Ed5ZmP.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-raLux7E7.js +0 -1
- package/dist/gateway/static/root/assets/fetch-2iRFmd3n.js +0 -3
- package/dist/gateway/static/root/assets/heartbeat-config-api-BVl5VHvL.js +0 -1
- package/dist/gateway/static/root/assets/index-BuFldCsB.css +0 -1
- package/dist/gateway/static/root/assets/index-Y-iqo-gL.js +0 -4693
- package/dist/gateway/static/root/assets/logs-page-BdH2n7ZW.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-Vpchzdp-.js +0 -1
- package/dist/gateway/static/root/assets/settings-form-section-Kk1yAGBl.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-KBm0u6Dz.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-BjeXXaOn.js +0 -2
- package/dist/gateway/static/root/assets/theme-store-D01dJt95.js +0 -1
- package/dist/gateway/static/root/assets/utils-DpTxN4AF.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-CwO8Cf01.js +0 -1
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import {
|
|
3
|
+
import { formatExamples, register } from "../registry.js";
|
|
4
|
+
import { createProfile, deleteProfile, getCurrentProfile, getSwitchCommand, listProfiles, resolveProfileStateDir } from "../../config/profile.js";
|
|
4
5
|
import { colors } from "../utils/colors.js";
|
|
5
6
|
import { Command } from "commander";
|
|
6
7
|
import Table from "cli-table3";
|
|
7
8
|
//#region src/cli/commands/profile.ts
|
|
8
9
|
init_logger();
|
|
9
10
|
const log = createLogger("ProfileCommands");
|
|
10
|
-
function
|
|
11
|
-
|
|
11
|
+
function createProfileCommand(_ctx) {
|
|
12
|
+
const cmd = new Command("profile").description("Manage xopc state profiles (~/.xopc vs ~/.xopc-<name>)").addHelpText("after", formatExamples([
|
|
13
|
+
"xopc profile list",
|
|
14
|
+
"xopc profile create staging",
|
|
15
|
+
"xopc profile switch staging",
|
|
16
|
+
"xopc profile delete staging --force"
|
|
17
|
+
]));
|
|
18
|
+
cmd.command("list").description("List all profiles").option("--json", "Output as JSON").action(async (options) => {
|
|
12
19
|
try {
|
|
13
20
|
const profiles = await listProfiles();
|
|
14
21
|
if (options.json) {
|
|
@@ -16,7 +23,7 @@ function createProfileListCommand() {
|
|
|
16
23
|
return;
|
|
17
24
|
}
|
|
18
25
|
if (profiles.length === 0) {
|
|
19
|
-
console.log("No profiles found. Create one with: xopc profile
|
|
26
|
+
console.log("No profiles found. Create one with: xopc profile create <name>");
|
|
20
27
|
return;
|
|
21
28
|
}
|
|
22
29
|
const table = new Table({
|
|
@@ -53,26 +60,20 @@ function createProfileListCommand() {
|
|
|
53
60
|
process.exit(1);
|
|
54
61
|
}
|
|
55
62
|
});
|
|
56
|
-
|
|
57
|
-
function createProfileCreateCommand() {
|
|
58
|
-
return new Command("profile:create").description("Create a new profile").argument("<name>", "Profile name (letters, numbers, hyphens, underscores)").action(async (name) => {
|
|
63
|
+
cmd.command("create").description("Create a new profile").argument("<name>", "Profile name (letters, numbers, hyphens, underscores)").action(async (name) => {
|
|
59
64
|
try {
|
|
60
65
|
const profile = await createProfile(name);
|
|
61
66
|
console.log(colors.green("✓"), `Created profile "${profile.name}"`);
|
|
62
67
|
console.log(`\n Directory: ${profile.stateDir}`);
|
|
63
|
-
console.log(
|
|
64
|
-
console.log(`
|
|
65
|
-
console.log(`\nOr add to your shell profile:`);
|
|
66
|
-
console.log(` echo 'export XOPC_PROFILE=${profile.name}' >> ~/.bashrc`);
|
|
68
|
+
console.log("\nTo use this profile:");
|
|
69
|
+
console.log(` ${getSwitchCommand(profile.name)}`);
|
|
67
70
|
} catch (error) {
|
|
68
71
|
log.error({ error }, "Failed to create profile");
|
|
69
72
|
console.error(colors.red("Error:"), error instanceof Error ? error.message : String(error));
|
|
70
73
|
process.exit(1);
|
|
71
74
|
}
|
|
72
75
|
});
|
|
73
|
-
|
|
74
|
-
function createProfileDeleteCommand() {
|
|
75
|
-
return new Command("profile:delete").description("Delete a profile").argument("<name>", "Profile name").option("-f, --force", "Force delete even if active").action(async (name, options) => {
|
|
76
|
+
cmd.command("delete").description("Delete a profile").argument("<name>", "Profile name").option("-f, --force", "Force delete even if active").action(async (name, options) => {
|
|
76
77
|
try {
|
|
77
78
|
await deleteProfile(name, { force: options.force });
|
|
78
79
|
console.log(colors.green("✓"), `Deleted profile "${name}"`);
|
|
@@ -82,38 +83,37 @@ function createProfileDeleteCommand() {
|
|
|
82
83
|
process.exit(1);
|
|
83
84
|
}
|
|
84
85
|
});
|
|
85
|
-
|
|
86
|
-
function createProfileSwitchCommand() {
|
|
87
|
-
return new Command("profile:switch").description("Get shell command to switch to a profile").argument("<name>", "Profile name").action(async (name) => {
|
|
86
|
+
cmd.command("switch").description("Print shell command to switch to a profile").argument("<name>", "Profile name").action(async (name) => {
|
|
88
87
|
try {
|
|
89
|
-
const stateDir = resolveProfileStateDir(name);
|
|
90
88
|
if (!(await listProfiles()).some((p) => p.name === name)) {
|
|
91
89
|
console.error(colors.red("Error:"), `Profile "${name}" not found`);
|
|
92
|
-
console.log(`\nCreate it with: xopc profile
|
|
90
|
+
console.log(`\nCreate it with: xopc profile create ${name}`);
|
|
93
91
|
process.exit(1);
|
|
94
92
|
}
|
|
95
93
|
console.log(colors.cyan("Run this command to switch to this profile:"));
|
|
96
94
|
console.log();
|
|
97
|
-
console.log(`
|
|
95
|
+
console.log(` ${getSwitchCommand(name)}`);
|
|
98
96
|
console.log();
|
|
99
|
-
console.log(
|
|
100
|
-
console.log(` echo 'export XOPC_PROFILE=${name}' >> ~/.bashrc`);
|
|
101
|
-
console.log();
|
|
102
|
-
console.log(`State directory: ${stateDir}`);
|
|
97
|
+
console.log(`State directory: ${resolveProfileStateDir(name)}`);
|
|
103
98
|
} catch (error) {
|
|
104
99
|
log.error({ error }, "Failed to switch profile");
|
|
105
100
|
console.error(colors.red("Error:"), error instanceof Error ? error.message : String(error));
|
|
106
101
|
process.exit(1);
|
|
107
102
|
}
|
|
108
103
|
});
|
|
104
|
+
return cmd;
|
|
109
105
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
106
|
+
register({
|
|
107
|
+
id: "profile",
|
|
108
|
+
name: "profile",
|
|
109
|
+
description: "Manage xopc state profiles (~/.xopc vs ~/.xopc-<name>)",
|
|
110
|
+
factory: createProfileCommand,
|
|
111
|
+
metadata: {
|
|
112
|
+
category: "setup",
|
|
113
|
+
examples: ["xopc profile list", "xopc profile create staging"]
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
116
|
//#endregion
|
|
117
|
-
export {
|
|
117
|
+
export { createProfileCommand };
|
|
118
118
|
|
|
119
119
|
//# sourceMappingURL=profile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","names":[],"sources":["../../../../src/cli/commands/profile.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createLogger } from '../../utils/logger.js';\nimport {\n
|
|
1
|
+
{"version":3,"file":"profile.js","names":[],"sources":["../../../../src/cli/commands/profile.ts"],"sourcesContent":["import { Command } from 'commander';\nimport Table from 'cli-table3';\n\nimport { createLogger } from '../../utils/logger.js';\nimport {\n createProfile,\n deleteProfile,\n getCurrentProfile,\n getSwitchCommand,\n listProfiles,\n resolveProfileStateDir,\n} from '../../config/profile.js';\nimport { formatExamples, register, type CLIContext } from '../registry.js';\nimport { colors } from '../utils/colors.js';\n\nconst log = createLogger('ProfileCommands');\n\nfunction createProfileCommand(_ctx: CLIContext): Command {\n const cmd = new Command('profile')\n .description('Manage xopc state profiles (~/.xopc vs ~/.xopc-<name>)')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc profile list',\n 'xopc profile create staging',\n 'xopc profile switch staging',\n 'xopc profile delete staging --force',\n ]),\n );\n\n cmd\n .command('list')\n .description('List all profiles')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const profiles = await listProfiles();\n\n if (options.json) {\n console.log(JSON.stringify(profiles, null, 2));\n return;\n }\n\n if (profiles.length === 0) {\n console.log('No profiles found. Create one with: xopc profile create <name>');\n return;\n }\n\n const table = new Table({\n head: ['Name', 'Status', 'Agents', 'Created', 'Directory'].map((h) => colors.cyan(h)),\n colWidths: [15, 10, 8, 20, 40],\n });\n\n for (const profile of profiles) {\n const status = profile.isActive ? colors.green('active') : colors.gray('inactive');\n table.push([\n profile.name === 'default' ? colors.yellow(profile.name) : profile.name,\n status,\n profile.agentCount.toString(),\n profile.createdAt ? new Date(profile.createdAt).toLocaleDateString() : '-',\n profile.stateDir,\n ]);\n }\n\n console.log(table.toString());\n console.log(`\\nCurrent: ${getCurrentProfile()}`);\n } catch (error) {\n log.error({ error }, 'Failed to list profiles');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n cmd\n .command('create')\n .description('Create a new profile')\n .argument('<name>', 'Profile name (letters, numbers, hyphens, underscores)')\n .action(async (name) => {\n try {\n const profile = await createProfile(name);\n\n console.log(colors.green('✓'), `Created profile \"${profile.name}\"`);\n console.log(`\\n Directory: ${profile.stateDir}`);\n console.log('\\nTo use this profile:');\n console.log(` ${getSwitchCommand(profile.name)}`);\n } catch (error) {\n log.error({ error }, 'Failed to create profile');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n cmd\n .command('delete')\n .description('Delete a profile')\n .argument('<name>', 'Profile name')\n .option('-f, --force', 'Force delete even if active')\n .action(async (name, options) => {\n try {\n await deleteProfile(name, { force: options.force });\n console.log(colors.green('✓'), `Deleted profile \"${name}\"`);\n } catch (error) {\n log.error({ error }, 'Failed to delete profile');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n cmd\n .command('switch')\n .description('Print shell command to switch to a profile')\n .argument('<name>', 'Profile name')\n .action(async (name) => {\n try {\n const profiles = await listProfiles();\n const exists = profiles.some((p) => p.name === name);\n\n if (!exists) {\n console.error(colors.red('Error:'), `Profile \"${name}\" not found`);\n console.log(`\\nCreate it with: xopc profile create ${name}`);\n process.exit(1);\n }\n\n console.log(colors.cyan('Run this command to switch to this profile:'));\n console.log();\n console.log(` ${getSwitchCommand(name)}`);\n console.log();\n console.log(`State directory: ${resolveProfileStateDir(name)}`);\n } catch (error) {\n log.error({ error }, 'Failed to switch profile');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n return cmd;\n}\n\nregister({\n id: 'profile',\n name: 'profile',\n description: 'Manage xopc state profiles (~/.xopc vs ~/.xopc-<name>)',\n factory: createProfileCommand,\n metadata: {\n category: 'setup',\n examples: ['xopc profile list', 'xopc profile create staging'],\n },\n});\n\nexport { createProfileCommand };\n"],"mappings":"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"}
|
|
@@ -5,7 +5,11 @@ import { getWorkspaceStatus } from "../utils/workspace.js";
|
|
|
5
5
|
import { Command } from "commander";
|
|
6
6
|
//#region src/cli/commands/setup.ts
|
|
7
7
|
function createSetupCommand(ctx) {
|
|
8
|
-
return new Command("setup").description("Initialize config file and workspace directory").addHelpText("after", formatExamples([
|
|
8
|
+
return new Command("setup").description("Initialize config file and workspace directory").addHelpText("after", formatExamples([
|
|
9
|
+
"xopc setup # Create config + workspace",
|
|
10
|
+
"xopc setup --workspace /path # Custom workspace path",
|
|
11
|
+
"xopc init # Full state dirs + agent profile seeds"
|
|
12
|
+
])).option("--workspace <path>", "Workspace directory path", ctx.workspacePath).action(async (options) => {
|
|
9
13
|
const workspacePath = options.workspace || ctx.workspacePath;
|
|
10
14
|
const configPath = ctx.configPath;
|
|
11
15
|
console.log("🔧 xopc Setup\n");
|
|
@@ -29,6 +33,7 @@ function createSetupCommand(ctx) {
|
|
|
29
33
|
console.log(" Config:", configPath);
|
|
30
34
|
console.log(" Workspace:", workspacePath);
|
|
31
35
|
console.log("\n🚀 Next Steps:");
|
|
36
|
+
console.log(" xopc init # Full Agent OS dirs (optional, beyond setup)");
|
|
32
37
|
console.log(" xopc onboard # Run full setup wizard");
|
|
33
38
|
console.log(" xopc onboard --model # Configure model only");
|
|
34
39
|
console.log(" xopc onboard --channels # Configure channels only");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","names":[],"sources":["../../../../src/cli/commands/setup.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\nimport { seedMainAgentProfileMarkdown } from '../../agent/context/workspace-seed.js';\nimport { getWorkspaceStatus } from '../utils/workspace.js';\nimport { initWorkspace } from '../utils/init-workspace.js';\n\nfunction createSetupCommand(ctx: CLIContext): Command {\n const cmd = new Command('setup')\n .description('Initialize config file and workspace directory')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc setup # Create config + workspace',\n 'xopc setup --workspace /path # Custom workspace path',\n ])\n )\n .option('--workspace <path>', 'Workspace directory path', ctx.workspacePath)\n .action(async (options) => {\n const workspacePath = options.workspace || ctx.workspacePath;\n const configPath = ctx.configPath;\n\n console.log('🔧 xopc Setup\\n');\n console.log('═'.repeat(40));\n\n // Check current status\n const status = getWorkspaceStatus(configPath, workspacePath);\n\n console.log('\\n📊 Current Status:');\n console.log(` Config: ${status.configExists ? '✅ exists' : '❌ not found'}`);\n console.log(` Workspace: ${status.workspaceSetup ? '✅ setup' : '❌ not found'}`);\n\n const result = await initWorkspace({ configPath, workspacePath });\n\n if (result.configCreated) {\n console.log('\\n📝 Created config file.');\n } else {\n console.log('\\n📝 Config already present (verified).');\n }\n\n if (result.workspaceCreated) {\n console.log('\\n📁 Created workspace + memory/.');\n } else {\n console.log('\\n📁 Workspace already present (verified).');\n }\n\n seedMainAgentProfileMarkdown(result.config);\n\n console.log('\\n' + '═'.repeat(40));\n console.log('\\n✅ Setup complete!\\n');\n\n console.log('📁 Files:');\n console.log(' Config:', configPath);\n console.log(' Workspace:', workspacePath);\n\n console.log('\\n🚀 Next Steps:');\n console.log(' xopc onboard # Run full setup wizard');\n console.log(' xopc onboard --model # Configure model only');\n console.log(' xopc onboard --channels # Configure channels only');\n });\n\n return cmd;\n}\n\nregister({\n id: 'setup',\n name: 'setup',\n description: 'Initialize config file and workspace directory',\n factory: createSetupCommand,\n metadata: {\n category: 'setup',\n examples: [\n 'xopc setup',\n 'xopc setup --workspace ~/.my-workspace',\n ],\n },\n});\n"],"mappings":";;;;;;AAMA,SAAS,mBAAmB,KAA0B;
|
|
1
|
+
{"version":3,"file":"setup.js","names":[],"sources":["../../../../src/cli/commands/setup.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\nimport { seedMainAgentProfileMarkdown } from '../../agent/context/workspace-seed.js';\nimport { getWorkspaceStatus } from '../utils/workspace.js';\nimport { initWorkspace } from '../utils/init-workspace.js';\n\nfunction createSetupCommand(ctx: CLIContext): Command {\n const cmd = new Command('setup')\n .description('Initialize config file and workspace directory')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc setup # Create config + workspace',\n 'xopc setup --workspace /path # Custom workspace path',\n 'xopc init # Full state dirs + agent profile seeds',\n ])\n )\n .option('--workspace <path>', 'Workspace directory path', ctx.workspacePath)\n .action(async (options) => {\n const workspacePath = options.workspace || ctx.workspacePath;\n const configPath = ctx.configPath;\n\n console.log('🔧 xopc Setup\\n');\n console.log('═'.repeat(40));\n\n // Check current status\n const status = getWorkspaceStatus(configPath, workspacePath);\n\n console.log('\\n📊 Current Status:');\n console.log(` Config: ${status.configExists ? '✅ exists' : '❌ not found'}`);\n console.log(` Workspace: ${status.workspaceSetup ? '✅ setup' : '❌ not found'}`);\n\n const result = await initWorkspace({ configPath, workspacePath });\n\n if (result.configCreated) {\n console.log('\\n📝 Created config file.');\n } else {\n console.log('\\n📝 Config already present (verified).');\n }\n\n if (result.workspaceCreated) {\n console.log('\\n📁 Created workspace + memory/.');\n } else {\n console.log('\\n📁 Workspace already present (verified).');\n }\n\n seedMainAgentProfileMarkdown(result.config);\n\n console.log('\\n' + '═'.repeat(40));\n console.log('\\n✅ Setup complete!\\n');\n\n console.log('📁 Files:');\n console.log(' Config:', configPath);\n console.log(' Workspace:', workspacePath);\n\n console.log('\\n🚀 Next Steps:');\n console.log(' xopc init # Full Agent OS dirs (optional, beyond setup)');\n console.log(' xopc onboard # Run full setup wizard');\n console.log(' xopc onboard --model # Configure model only');\n console.log(' xopc onboard --channels # Configure channels only');\n });\n\n return cmd;\n}\n\nregister({\n id: 'setup',\n name: 'setup',\n description: 'Initialize config file and workspace directory',\n factory: createSetupCommand,\n metadata: {\n category: 'setup',\n examples: [\n 'xopc setup',\n 'xopc setup --workspace ~/.my-workspace',\n ],\n },\n});\n"],"mappings":";;;;;;AAMA,SAAS,mBAAmB,KAA0B;AAwDpD,QAvDY,IAAI,QAAQ,QAAQ,CAC7B,YAAY,iDAAiD,CAC7D,YACC,SACA,eAAe;EACb;EACA;EACA;EACD,CAAC,CACH,CACA,OAAO,sBAAsB,4BAA4B,IAAI,cAAc,CAC3E,OAAO,OAAO,YAAY;EACzB,MAAM,gBAAgB,QAAQ,aAAa,IAAI;EAC/C,MAAM,aAAa,IAAI;AAEvB,UAAQ,IAAI,kBAAkB;AAC9B,UAAQ,IAAI,IAAI,OAAO,GAAG,CAAC;EAG3B,MAAM,SAAS,mBAAmB,YAAY,cAAc;AAE5D,UAAQ,IAAI,uBAAuB;AACnC,UAAQ,IAAI,cAAc,OAAO,eAAe,aAAa,gBAAgB;AAC7E,UAAQ,IAAI,iBAAiB,OAAO,iBAAiB,YAAY,gBAAgB;EAEjF,MAAM,SAAS,MAAM,cAAc;GAAE;GAAY;GAAe,CAAC;AAEjE,MAAI,OAAO,cACT,SAAQ,IAAI,4BAA4B;MAExC,SAAQ,IAAI,0CAA0C;AAGxD,MAAI,OAAO,iBACT,SAAQ,IAAI,oCAAoC;MAEhD,SAAQ,IAAI,6CAA6C;AAG3D,+BAA6B,OAAO,OAAO;AAE3C,UAAQ,IAAI,OAAO,IAAI,OAAO,GAAG,CAAC;AAClC,UAAQ,IAAI,wBAAwB;AAEpC,UAAQ,IAAI,YAAY;AACxB,UAAQ,IAAI,cAAc,WAAW;AACrC,UAAQ,IAAI,iBAAiB,cAAc;AAE3C,UAAQ,IAAI,mBAAmB;AAC/B,UAAQ,IAAI,6EAA6E;AACzF,UAAQ,IAAI,uDAAuD;AACnE,UAAQ,IAAI,sDAAsD;AAClE,UAAQ,IAAI,wDAAwD;GAG9D;;AAGZ,SAAS;CACP,IAAI;CACJ,MAAM;CACN,aAAa;CACb,SAAS;CACT,UAAU;EACR,UAAU;EACV,UAAU,CACR,cACA,yCACD;EACF;CACF,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
3
|
import { loadConfig, saveConfig } from "../../config/loader.js";
|
|
4
|
+
import { resolveGatewayEffectiveHost } from "../../config/gateway-bind.js";
|
|
5
|
+
import { loadTunnelState } from "../../tunnel/tunnel-state.js";
|
|
4
6
|
import { formatExamples, register } from "../registry.js";
|
|
5
7
|
import "../../config/index.js";
|
|
6
|
-
import { resolveGatewayEffectiveHost } from "../../config/gateway-bind.js";
|
|
7
8
|
import { TUNNEL_RISK_SUMMARY_LINES, TunnelConsentError, assertTunnelMayStart, hasValidTunnelConsent } from "../../tunnel/consent.js";
|
|
8
9
|
import { resolveTunnelBrokerUrl, resolveTunnelRegistrationSecret } from "../../tunnel/env.js";
|
|
9
10
|
import { ensureFrpcBinary } from "../../tunnel/frpc-binary.js";
|
|
10
|
-
import { loadTunnelState } from "../../tunnel/tunnel-state.js";
|
|
11
11
|
import { getTunnelService } from "../../tunnel/tunnel-service.js";
|
|
12
12
|
import { resolveFrpSubdomainHost } from "../../tunnel/frp-subdomain-host.js";
|
|
13
13
|
import { applyTunnelConsentToConfig, mergeTunnelConfigPatch, setTunnelEnabledInConfig } from "../../tunnel/tunnel-config.js";
|
|
@@ -21,10 +21,7 @@ const GATEWAY_SUBCOMMANDS = new Set([
|
|
|
21
21
|
"stop",
|
|
22
22
|
"restart",
|
|
23
23
|
"logs",
|
|
24
|
-
"
|
|
25
|
-
"uninstall",
|
|
26
|
-
"start",
|
|
27
|
-
"service-status",
|
|
24
|
+
"service",
|
|
28
25
|
"ssh-tunnel"
|
|
29
26
|
]);
|
|
30
27
|
function isValueToken(token) {
|
|
@@ -73,13 +70,26 @@ function resolveGatewayCatalogCommandPath(argv) {
|
|
|
73
70
|
continue;
|
|
74
71
|
}
|
|
75
72
|
if (arg.startsWith("-")) continue;
|
|
73
|
+
if (arg === "service") {
|
|
74
|
+
for (let nestedIndex = index + 1; nestedIndex < args.length; nestedIndex += 1) {
|
|
75
|
+
const nested = args[nestedIndex];
|
|
76
|
+
if (!nested || nested === "--") break;
|
|
77
|
+
if (nested.startsWith("-")) continue;
|
|
78
|
+
return [
|
|
79
|
+
"gateway",
|
|
80
|
+
"service",
|
|
81
|
+
nested
|
|
82
|
+
];
|
|
83
|
+
}
|
|
84
|
+
return ["gateway", "service"];
|
|
85
|
+
}
|
|
76
86
|
return ["gateway", arg];
|
|
77
87
|
}
|
|
78
88
|
return sawGateway ? ["gateway"] : null;
|
|
79
89
|
}
|
|
80
90
|
function resolveGatewaySubcommandName(argv) {
|
|
81
91
|
const path = resolveGatewayCatalogCommandPath(argv);
|
|
82
|
-
return path && path.length
|
|
92
|
+
return path && path.length >= 2 ? path[1] : void 0;
|
|
83
93
|
}
|
|
84
94
|
function isGatewayRunFastPathArgv(argv) {
|
|
85
95
|
if (process.env.XOPC_DISABLE_GATEWAY_RUN_FAST_PATH === "1") return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-run-argv.js","names":[],"sources":["../../../src/cli/gateway-run-argv.ts"],"sourcesContent":["import { resolveCliArgvInvocation } from './argv-invocation.js';\n\nconst GATEWAY_RUN_VALUE_FLAGS = new Set([\n '--port',\n '--bind',\n '--token',\n '--tailscale',\n]);\n\nconst GATEWAY_RUN_BOOLEAN_FLAGS = new Set([\n '--tailscale-reset-on-exit',\n '--force',\n '--no-hot-reload',\n '--foreground',\n]);\n\nconst GATEWAY_SUBCOMMANDS = new Set([\n 'token',\n 'status',\n 'health',\n 'call',\n 'probe',\n 'stop',\n 'restart',\n 'logs',\n '
|
|
1
|
+
{"version":3,"file":"gateway-run-argv.js","names":[],"sources":["../../../src/cli/gateway-run-argv.ts"],"sourcesContent":["import { resolveCliArgvInvocation } from './argv-invocation.js';\n\nconst GATEWAY_RUN_VALUE_FLAGS = new Set([\n '--port',\n '--bind',\n '--token',\n '--tailscale',\n]);\n\nconst GATEWAY_RUN_BOOLEAN_FLAGS = new Set([\n '--tailscale-reset-on-exit',\n '--force',\n '--no-hot-reload',\n '--foreground',\n]);\n\nconst GATEWAY_SUBCOMMANDS = new Set([\n 'token',\n 'status',\n 'health',\n 'call',\n 'probe',\n 'stop',\n 'restart',\n 'logs',\n 'service',\n 'ssh-tunnel',\n]);\n\nfunction isValueToken(token: string | undefined): boolean {\n return typeof token === 'string' && token.length > 0 && !token.startsWith('-');\n}\n\nexport function consumeGatewayRunOptionToken(args: ReadonlyArray<string>, index: number): number {\n const arg = args[index];\n if (!arg || arg === '--' || !arg.startsWith('-')) {\n return 0;\n }\n const equalsIndex = arg.indexOf('=');\n const flag = equalsIndex === -1 ? arg : arg.slice(0, equalsIndex);\n if (GATEWAY_RUN_BOOLEAN_FLAGS.has(flag)) {\n return equalsIndex === -1 ? 1 : 0;\n }\n if (!GATEWAY_RUN_VALUE_FLAGS.has(flag)) {\n return 0;\n }\n if (equalsIndex !== -1) {\n return arg.slice(equalsIndex + 1).trim() ? 1 : 0;\n }\n return isValueToken(args[index + 1]) ? 2 : 0;\n}\n\nexport function consumeGatewayFastPathRootOptionToken(\n args: ReadonlyArray<string>,\n index: number,\n): number {\n const arg = args[index];\n if (!arg || arg === '--') {\n return 0;\n }\n if (arg.startsWith('--config=')) {\n return arg.slice('--config='.length).trim() ? 1 : 0;\n }\n if (arg === '--config') {\n return isValueToken(args[index + 1]) ? 2 : 0;\n }\n if (arg.startsWith('--workspace=')) {\n return arg.slice('--workspace='.length).trim() ? 1 : 0;\n }\n if (arg === '--workspace') {\n return isValueToken(args[index + 1]) ? 2 : 0;\n }\n if (arg === '--verbose' || arg === '-v') {\n return 1;\n }\n return 0;\n}\n\nexport function resolveGatewayCatalogCommandPath(argv: string[]): string[] | null {\n const args = argv.slice(2).filter((arg) => arg !== '--');\n let sawGateway = false;\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (!arg || arg === '--') {\n break;\n }\n if (!sawGateway) {\n const consumed = consumeGatewayFastPathRootOptionToken(args, index);\n if (consumed > 0) {\n index += consumed - 1;\n continue;\n }\n if (arg.startsWith('-')) {\n continue;\n }\n if (arg !== 'gateway') {\n return null;\n }\n sawGateway = true;\n continue;\n }\n\n const consumed = consumeGatewayRunOptionToken(args, index);\n if (consumed > 0) {\n index += consumed - 1;\n continue;\n }\n if (arg.startsWith('-')) {\n continue;\n }\n if (arg === 'service') {\n for (let nestedIndex = index + 1; nestedIndex < args.length; nestedIndex += 1) {\n const nested = args[nestedIndex];\n if (!nested || nested === '--') {\n break;\n }\n if (nested.startsWith('-')) {\n continue;\n }\n return ['gateway', 'service', nested];\n }\n return ['gateway', 'service'];\n }\n return ['gateway', arg];\n }\n\n return sawGateway ? ['gateway'] : null;\n}\n\nexport function resolveGatewaySubcommandName(argv: string[]): string | undefined {\n const path = resolveGatewayCatalogCommandPath(argv);\n return path && path.length >= 2 ? path[1] : undefined;\n}\n\nexport function isGatewayRunFastPathArgv(argv: string[]): boolean {\n if (process.env.XOPC_DISABLE_GATEWAY_RUN_FAST_PATH === '1') {\n return false;\n }\n\n const invocation = resolveCliArgvInvocation(argv);\n if (invocation.hasHelpOrVersion) {\n return false;\n }\n\n const args = argv.slice(2).filter((arg) => arg !== '--');\n let sawGateway = false;\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (!arg || arg === '--') {\n return false;\n }\n if (!sawGateway) {\n const consumed = consumeGatewayFastPathRootOptionToken(args, index);\n if (consumed > 0) {\n index += consumed - 1;\n continue;\n }\n if (arg !== 'gateway') {\n return false;\n }\n sawGateway = true;\n continue;\n }\n\n const consumed = consumeGatewayRunOptionToken(args, index);\n if (consumed > 0) {\n index += consumed - 1;\n continue;\n }\n if (arg.startsWith('-')) {\n continue;\n }\n return false;\n }\n\n return sawGateway;\n}\n\nexport function isKnownGatewaySubcommand(name: string): boolean {\n return GATEWAY_SUBCOMMANDS.has(name);\n}\n"],"mappings":";;AAEA,MAAM,0BAA0B,IAAI,IAAI;CACtC;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,4BAA4B,IAAI,IAAI;CACxC;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,sBAAsB,IAAI,IAAI;CAClC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAS,aAAa,OAAoC;AACxD,QAAO,OAAO,UAAU,YAAY,MAAM,SAAS,KAAK,CAAC,MAAM,WAAW,IAAI;;AAGhF,SAAgB,6BAA6B,MAA6B,OAAuB;CAC/F,MAAM,MAAM,KAAK;AACjB,KAAI,CAAC,OAAO,QAAQ,QAAQ,CAAC,IAAI,WAAW,IAAI,CAC9C,QAAO;CAET,MAAM,cAAc,IAAI,QAAQ,IAAI;CACpC,MAAM,OAAO,gBAAgB,KAAK,MAAM,IAAI,MAAM,GAAG,YAAY;AACjE,KAAI,0BAA0B,IAAI,KAAK,CACrC,QAAO,gBAAgB,KAAK,IAAI;AAElC,KAAI,CAAC,wBAAwB,IAAI,KAAK,CACpC,QAAO;AAET,KAAI,gBAAgB,GAClB,QAAO,IAAI,MAAM,cAAc,EAAE,CAAC,MAAM,GAAG,IAAI;AAEjD,QAAO,aAAa,KAAK,QAAQ,GAAG,GAAG,IAAI;;AAG7C,SAAgB,sCACd,MACA,OACQ;CACR,MAAM,MAAM,KAAK;AACjB,KAAI,CAAC,OAAO,QAAQ,KAClB,QAAO;AAET,KAAI,IAAI,WAAW,YAAY,CAC7B,QAAO,IAAI,MAAM,EAAmB,CAAC,MAAM,GAAG,IAAI;AAEpD,KAAI,QAAQ,WACV,QAAO,aAAa,KAAK,QAAQ,GAAG,GAAG,IAAI;AAE7C,KAAI,IAAI,WAAW,eAAe,CAChC,QAAO,IAAI,MAAM,GAAsB,CAAC,MAAM,GAAG,IAAI;AAEvD,KAAI,QAAQ,cACV,QAAO,aAAa,KAAK,QAAQ,GAAG,GAAG,IAAI;AAE7C,KAAI,QAAQ,eAAe,QAAQ,KACjC,QAAO;AAET,QAAO;;AAGT,SAAgB,iCAAiC,MAAiC;CAChF,MAAM,OAAO,KAAK,MAAM,EAAE,CAAC,QAAQ,QAAQ,QAAQ,KAAK;CACxD,IAAI,aAAa;AAEjB,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,MAAM,KAAK;AACjB,MAAI,CAAC,OAAO,QAAQ,KAClB;AAEF,MAAI,CAAC,YAAY;GACf,MAAM,WAAW,sCAAsC,MAAM,MAAM;AACnE,OAAI,WAAW,GAAG;AAChB,aAAS,WAAW;AACpB;;AAEF,OAAI,IAAI,WAAW,IAAI,CACrB;AAEF,OAAI,QAAQ,UACV,QAAO;AAET,gBAAa;AACb;;EAGF,MAAM,WAAW,6BAA6B,MAAM,MAAM;AAC1D,MAAI,WAAW,GAAG;AAChB,YAAS,WAAW;AACpB;;AAEF,MAAI,IAAI,WAAW,IAAI,CACrB;AAEF,MAAI,QAAQ,WAAW;AACrB,QAAK,IAAI,cAAc,QAAQ,GAAG,cAAc,KAAK,QAAQ,eAAe,GAAG;IAC7E,MAAM,SAAS,KAAK;AACpB,QAAI,CAAC,UAAU,WAAW,KACxB;AAEF,QAAI,OAAO,WAAW,IAAI,CACxB;AAEF,WAAO;KAAC;KAAW;KAAW;KAAO;;AAEvC,UAAO,CAAC,WAAW,UAAU;;AAE/B,SAAO,CAAC,WAAW,IAAI;;AAGzB,QAAO,aAAa,CAAC,UAAU,GAAG;;AAGpC,SAAgB,6BAA6B,MAAoC;CAC/E,MAAM,OAAO,iCAAiC,KAAK;AACnD,QAAO,QAAQ,KAAK,UAAU,IAAI,KAAK,KAAK,KAAA;;AAG9C,SAAgB,yBAAyB,MAAyB;AAChE,KAAI,QAAQ,IAAI,uCAAuC,IACrD,QAAO;AAIT,KADmB,yBAAyB,KAC9B,CAAC,iBACb,QAAO;CAGT,MAAM,OAAO,KAAK,MAAM,EAAE,CAAC,QAAQ,QAAQ,QAAQ,KAAK;CACxD,IAAI,aAAa;AAEjB,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,MAAM,KAAK;AACjB,MAAI,CAAC,OAAO,QAAQ,KAClB,QAAO;AAET,MAAI,CAAC,YAAY;GACf,MAAM,WAAW,sCAAsC,MAAM,MAAM;AACnE,OAAI,WAAW,GAAG;AAChB,aAAS,WAAW;AACpB;;AAEF,OAAI,QAAQ,UACV,QAAO;AAET,gBAAa;AACb;;EAGF,MAAM,WAAW,6BAA6B,MAAM,MAAM;AAC1D,MAAI,WAAW,GAAG;AAChB,YAAS,WAAW;AACpB;;AAEF,MAAI,IAAI,WAAW,IAAI,CACrB;AAEF,SAAO;;AAGT,QAAO;;AAGT,SAAgB,yBAAyB,MAAuB;AAC9D,QAAO,oBAAoB,IAAI,KAAK"}
|
|
@@ -2,8 +2,8 @@ import { createLogger } from "../../utils/logger/index.js";
|
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
3
|
import { init_paths, resolveConfigPath } from "../../config/paths.js";
|
|
4
4
|
import { loadConfig } from "../../config/loader.js";
|
|
5
|
-
import "../../config/index.js";
|
|
6
5
|
import { resolveGatewayEffectiveHost } from "../../config/gateway-bind.js";
|
|
6
|
+
import "../../config/index.js";
|
|
7
7
|
import { assertSecureGatewayHttpUrl } from "../../gateway/ws-security.js";
|
|
8
8
|
import { addGatewayClientOptions, parseGatewayClientOptions } from "./gateway-client-options.js";
|
|
9
9
|
//#region src/cli/utils/gateway-client.ts
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ConfigSchema, init_schema } from "../../config/schema.js";
|
|
2
2
|
import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
|
|
3
|
-
import { randomBytes } from "node:crypto";
|
|
4
|
-
import { existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
5
3
|
import { dirname, join } from "node:path";
|
|
4
|
+
import { existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
5
|
+
import { randomBytes } from "node:crypto";
|
|
6
6
|
//#region src/cli/utils/init-workspace-core.ts
|
|
7
7
|
init_schema();
|
|
8
8
|
init_loader();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { init_agent_scope, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
|
|
2
1
|
import { getAgentDefaultModelRef, init_schema } from "./schema.js";
|
|
2
|
+
import { init_agent_scope, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
|
|
3
3
|
import { init_session_key, parseSessionKey } from "../routing/session-key.js";
|
|
4
4
|
import { agentExists, getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
5
5
|
//#region src/config/agent-profile.ts
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getTailnetIPv4Sync } from "../infra/tailscale.js";
|
|
2
2
|
import { isLoopbackHost } from "../gateway/host.js";
|
|
3
|
-
import { existsSync } from "node:fs";
|
|
4
3
|
import net from "node:net";
|
|
4
|
+
import { existsSync } from "node:fs";
|
|
5
5
|
//#region src/config/gateway-bind.ts
|
|
6
6
|
function resolveGatewayBindMode(cfg, bindOverride) {
|
|
7
7
|
if (bindOverride) return bindOverride;
|
package/dist/src/config/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
+
import { TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema } from "../../extensions/telegram/src/config-schema.js";
|
|
2
|
+
import { WeixinAccountConfigSchema, WeixinConfigSchema } from "../../extensions/weixin/src/config-schema.js";
|
|
3
|
+
import { AgentConfigSchema, AgentDefaultsSchema, AgentImageGenerationModelSchema, AgentModelRefSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, CronConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GoalsConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultModelRef, init_schema, parseModelRef } from "./schema.js";
|
|
4
|
+
import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.js";
|
|
1
5
|
import { ENV_VARS, resolveHomeDir, resolveStateDir } from "./paths-state.js";
|
|
2
6
|
import { expandWorkspacePathString, init_workspace_path, normalizeWorkspaceDir, resolveWorkspaceRoot } from "./workspace-path.js";
|
|
3
7
|
import { resolveDefaultAgentWorkspaceDir } from "./workspace-defaults.js";
|
|
4
8
|
import { resolveAgentDir as resolveAgentDir$1, resolveAgentHomeDir as resolveAgentHomeDir$1, resolveAgentWorkspaceDir, resolveSessionsDir as resolveSessionsDir$1 } from "../agent/agent-scope.js";
|
|
9
|
+
import { extractProfileAgentId, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "./agent-profile.js";
|
|
5
10
|
import { resolveSessionFilePath, resolveSessionTranscriptPathInDir } from "../session/parity/transcript-paths.js";
|
|
6
11
|
import { FILENAMES, WORKSPACE_FILES, existsSync, init_paths, resolveAgentAuthProfilesPath, resolveAgentDir, resolveAgentHomeDir, resolveAgentMetadataPath, resolveAgentProfileDir, resolveAgentProfileMarkdownPath, resolveAuthProfilesPath, resolveBinDir, resolveBundledExtensionsDir, resolveBundledSkillsDir, resolveConfigPath, resolveCredentialsDir, resolveCronDir, resolveCronJobsPath, resolveCronLogPath, resolveCronLogsDir, resolveCronRunsDir, resolveExtensionSdkPath, resolveExtensionsDir, resolveExtensionsLockPath, resolveInboxDir, resolveInboxMessagePath, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogPath, resolveLogsDir, resolveMemoryDir, resolveMemoryPath, resolveModelsJsonPath, resolveNodeBinDir, resolveNodeBinPath, resolveNodeToolsDir, resolveNpmBinPath, resolveOAuthPath, resolvePidPath, resolveSessionTranscriptPath, resolveSessionsArchiveDir, resolveSessionsDir, resolveSessionsMapPath, resolveSkillPath, resolveSkillsCachePath, resolveSkillsDir, resolveSkillsLockPath, resolveSocketPath, resolveStatusPath, resolveToolsDir, resolveWorkspaceExtensionsDir, resolveWorkspaceFile, resolveWorkspaceStateDir, resolveWorkspaceStatePath, resolveXopcBinPath } from "./paths.js";
|
|
7
|
-
import { TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema } from "../../extensions/telegram/src/config-schema.js";
|
|
8
|
-
import { WeixinAccountConfigSchema, WeixinConfigSchema } from "../../extensions/weixin/src/config-schema.js";
|
|
9
|
-
import { AgentConfigSchema, AgentDefaultsSchema, AgentImageGenerationModelSchema, AgentModelRefSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, CronConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GoalsConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultModelRef, init_schema, parseModelRef } from "./schema.js";
|
|
10
12
|
import { init_loader, loadConfig, registerChannelConfigValidator, saveConfig } from "./loader.js";
|
|
11
|
-
import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.js";
|
|
12
|
-
import { extractProfileAgentId, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "./agent-profile.js";
|
|
13
13
|
import { clearConfigValueCache, getAllowedCommands, getCacheStats, init_resolve_config_value, resolveConfigValue, resolveHeaders, testApiKeyResolution } from "./resolve-config-value.js";
|
|
14
14
|
import { CustomModelSchema, ModelOverrideSchema, ModelsJsonSchema, OpenAICompatSchema, OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema, OpenRouterRoutingSchema, ProviderConfigSchema, VercelGatewayRoutingSchema, getDefaultModelValues, init_models_json, loadModelsJson, modelsJsonExists, saveModelsJson, validateModelsConfig } from "./models-json.js";
|
|
15
15
|
import { canonicalizeConfiguredMcpServer, isKnownCliMcpTypeAlias, normalizeConfiguredMcpServers, resolveXopcMcpTransportAlias } from "./mcp-config-normalize.js";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import {
|
|
2
|
+
import { ConfigSchema, init_schema } from "./schema.js";
|
|
3
3
|
import { createLogger } from "../utils/logger/index.js";
|
|
4
4
|
import { init_logger } from "../utils/logger.js";
|
|
5
5
|
import { init_paths, resolveConfigPath } from "./paths.js";
|
|
6
|
-
import {
|
|
6
|
+
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
7
7
|
import { dirname } from "path";
|
|
8
8
|
import { existsSync, mkdirSync, promises, readFileSync } from "fs";
|
|
9
9
|
import { config } from "dotenv";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { init_write_file_atomic, writeTextAtomicSync } from "../infra/write-file-atomic.js";
|
|
3
2
|
import { init_paths, resolveModelsJsonPath } from "./paths.js";
|
|
4
|
-
import {
|
|
3
|
+
import { init_write_file_atomic, writeTextAtomicSync } from "../infra/write-file-atomic.js";
|
|
5
4
|
import { z } from "zod";
|
|
5
|
+
import { existsSync, readFileSync } from "fs";
|
|
6
6
|
//#region src/config/models-json.ts
|
|
7
7
|
/**
|
|
8
8
|
* Models.json configuration types and schema
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { join } from "node:path";
|
|
3
2
|
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
4
|
//#region src/config/paths-state.ts
|
|
5
5
|
function resolveHomeDir(env = process.env) {
|
|
6
6
|
return env[ENV_VARS.HOME] || homedir();
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { ENV_VARS, init_paths_state, resolveHomeDir } from "./paths-state.js";
|
|
1
2
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
-
import { ENV_VARS, init_paths_state, resolveHomeDir } from "./paths-state.js";
|
|
4
|
-
import { mkdir, readdir, rm, stat } from "fs/promises";
|
|
5
4
|
import { join } from "path";
|
|
6
5
|
import { existsSync } from "fs";
|
|
6
|
+
import { mkdir, readdir, rm, stat } from "fs/promises";
|
|
7
7
|
//#region src/config/profile.ts
|
|
8
8
|
init_logger();
|
|
9
9
|
init_paths_state();
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation + normalization helpers for `gateway.publicUrl`.
|
|
3
|
+
*
|
|
4
|
+
* The publicUrl is a user-deployed reverse-proxy origin (e.g.
|
|
5
|
+
* `https://gateway.example.com`). We accept it as both a config field and as
|
|
6
|
+
* a one-off candidate (auto-detected from `window.location.origin`), so the
|
|
7
|
+
* validator must run in identical shape on both surfaces.
|
|
8
|
+
*/
|
|
9
|
+
export type PublicUrlIssueCode = 'invalid_url' | 'invalid_scheme' | 'has_userinfo' | 'has_path' | 'has_query_or_fragment' | 'requires_https';
|
|
10
|
+
export type PublicUrlValidation = {
|
|
11
|
+
ok: true;
|
|
12
|
+
url: string;
|
|
13
|
+
protocol: 'http:' | 'https:';
|
|
14
|
+
hostname: string;
|
|
15
|
+
} | {
|
|
16
|
+
ok: false;
|
|
17
|
+
code: PublicUrlIssueCode;
|
|
18
|
+
message: string;
|
|
19
|
+
};
|
|
20
|
+
/** Lowercase RFC1918 / loopback / link-local / `.local` host match. */
|
|
21
|
+
export declare function isPrivateOrLocalHostname(hostname: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Validate a candidate publicUrl. Strict by design — we reject anything that
|
|
24
|
+
* looks ambiguous so the QR payload is always a clean origin.
|
|
25
|
+
*/
|
|
26
|
+
export declare function validatePublicUrl(raw: string): PublicUrlValidation;
|
|
27
|
+
/** Convenience: return the normalized origin or `null` when invalid. */
|
|
28
|
+
export declare function normalizePublicUrlOrNull(raw: string | null | undefined): string | null;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import net from "node:net";
|
|
3
|
+
//#region src/config/public-url.ts
|
|
4
|
+
/**
|
|
5
|
+
* Validation + normalization helpers for `gateway.publicUrl`.
|
|
6
|
+
*
|
|
7
|
+
* The publicUrl is a user-deployed reverse-proxy origin (e.g.
|
|
8
|
+
* `https://gateway.example.com`). We accept it as both a config field and as
|
|
9
|
+
* a one-off candidate (auto-detected from `window.location.origin`), so the
|
|
10
|
+
* validator must run in identical shape on both surfaces.
|
|
11
|
+
*/
|
|
12
|
+
/** Lowercase RFC1918 / loopback / link-local / `.local` host match. */
|
|
13
|
+
function isPrivateOrLocalHostname(hostname) {
|
|
14
|
+
const host = hostname.trim().toLowerCase();
|
|
15
|
+
if (!host) return false;
|
|
16
|
+
if (host === "localhost" || host.endsWith(".localhost")) return true;
|
|
17
|
+
if (host.endsWith(".local")) return true;
|
|
18
|
+
if (host === "::1" || host === "[::1]") return true;
|
|
19
|
+
if (host.startsWith("fe80:") || host.startsWith("[fe80:")) return true;
|
|
20
|
+
if (host.startsWith("fc") || host.startsWith("fd")) {
|
|
21
|
+
if (net.isIPv6(host.replace(/^\[|\]$/g, ""))) return true;
|
|
22
|
+
}
|
|
23
|
+
if (net.isIPv4(host)) {
|
|
24
|
+
const parts = host.split(".").map((p) => Number.parseInt(p, 10));
|
|
25
|
+
if (parts.length !== 4 || parts.some((n) => !Number.isFinite(n))) return false;
|
|
26
|
+
const [a, b] = parts;
|
|
27
|
+
if (a === 10) return true;
|
|
28
|
+
if (a === 127) return true;
|
|
29
|
+
if (a === 169 && b === 254) return true;
|
|
30
|
+
if (a === 172 && b >= 16 && b <= 31) return true;
|
|
31
|
+
if (a === 192 && b === 168) return true;
|
|
32
|
+
if (a === 100 && b >= 64 && b <= 127) return true;
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Validate a candidate publicUrl. Strict by design — we reject anything that
|
|
38
|
+
* looks ambiguous so the QR payload is always a clean origin.
|
|
39
|
+
*/
|
|
40
|
+
function validatePublicUrl(raw) {
|
|
41
|
+
const trimmed = (raw ?? "").trim();
|
|
42
|
+
if (!trimmed) return {
|
|
43
|
+
ok: false,
|
|
44
|
+
code: "invalid_url",
|
|
45
|
+
message: "publicUrl is empty"
|
|
46
|
+
};
|
|
47
|
+
let parsed;
|
|
48
|
+
try {
|
|
49
|
+
parsed = new URL(trimmed);
|
|
50
|
+
} catch {
|
|
51
|
+
return {
|
|
52
|
+
ok: false,
|
|
53
|
+
code: "invalid_url",
|
|
54
|
+
message: "publicUrl is not a valid URL"
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const protocol = parsed.protocol.toLowerCase();
|
|
58
|
+
if (protocol !== "https:" && protocol !== "http:") return {
|
|
59
|
+
ok: false,
|
|
60
|
+
code: "invalid_scheme",
|
|
61
|
+
message: "publicUrl must use http(s)"
|
|
62
|
+
};
|
|
63
|
+
if (parsed.username || parsed.password) return {
|
|
64
|
+
ok: false,
|
|
65
|
+
code: "has_userinfo",
|
|
66
|
+
message: "publicUrl must not contain userinfo"
|
|
67
|
+
};
|
|
68
|
+
const path = parsed.pathname;
|
|
69
|
+
if (path && path !== "/" && path !== "") return {
|
|
70
|
+
ok: false,
|
|
71
|
+
code: "has_path",
|
|
72
|
+
message: "publicUrl must not contain a path"
|
|
73
|
+
};
|
|
74
|
+
if (parsed.search || parsed.hash) return {
|
|
75
|
+
ok: false,
|
|
76
|
+
code: "has_query_or_fragment",
|
|
77
|
+
message: "publicUrl must not contain query or fragment"
|
|
78
|
+
};
|
|
79
|
+
const hostname = parsed.hostname.toLowerCase();
|
|
80
|
+
if (protocol === "http:" && !isPrivateOrLocalHostname(hostname)) return {
|
|
81
|
+
ok: false,
|
|
82
|
+
code: "requires_https",
|
|
83
|
+
message: "publicUrl must use https for public hostnames (http is only allowed for RFC1918 / .local)"
|
|
84
|
+
};
|
|
85
|
+
return {
|
|
86
|
+
ok: true,
|
|
87
|
+
url: `${protocol}//${parsed.host.toLowerCase()}`,
|
|
88
|
+
protocol,
|
|
89
|
+
hostname
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** Convenience: return the normalized origin or `null` when invalid. */
|
|
93
|
+
function normalizePublicUrlOrNull(raw) {
|
|
94
|
+
if (!raw) return null;
|
|
95
|
+
const result = validatePublicUrl(raw);
|
|
96
|
+
return result.ok ? result.url : null;
|
|
97
|
+
}
|
|
98
|
+
var init_public_url = __esmMin((() => {}));
|
|
99
|
+
//#endregion
|
|
100
|
+
init_public_url();
|
|
101
|
+
export { init_public_url, isPrivateOrLocalHostname, normalizePublicUrlOrNull, validatePublicUrl };
|
|
102
|
+
|
|
103
|
+
//# sourceMappingURL=public-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-url.js","names":[],"sources":["../../../src/config/public-url.ts"],"sourcesContent":["/**\n * Validation + normalization helpers for `gateway.publicUrl`.\n *\n * The publicUrl is a user-deployed reverse-proxy origin (e.g.\n * `https://gateway.example.com`). We accept it as both a config field and as\n * a one-off candidate (auto-detected from `window.location.origin`), so the\n * validator must run in identical shape on both surfaces.\n */\n\nimport net from 'node:net';\n\nexport type PublicUrlIssueCode =\n | 'invalid_url'\n | 'invalid_scheme'\n | 'has_userinfo'\n | 'has_path'\n | 'has_query_or_fragment'\n | 'requires_https';\n\nexport type PublicUrlValidation =\n | { ok: true; url: string; protocol: 'http:' | 'https:'; hostname: string }\n | { ok: false; code: PublicUrlIssueCode; message: string };\n\n/** Lowercase RFC1918 / loopback / link-local / `.local` host match. */\nexport function isPrivateOrLocalHostname(hostname: string): boolean {\n const host = hostname.trim().toLowerCase();\n if (!host) return false;\n if (host === 'localhost' || host.endsWith('.localhost')) return true;\n if (host.endsWith('.local')) return true;\n // IPv6 loopback / link-local\n if (host === '::1' || host === '[::1]') return true;\n if (host.startsWith('fe80:') || host.startsWith('[fe80:')) return true;\n if (host.startsWith('fc') || host.startsWith('fd')) {\n // fc00::/7 ULA\n if (net.isIPv6(host.replace(/^\\[|\\]$/g, ''))) return true;\n }\n // IPv4 private + loopback ranges\n if (net.isIPv4(host)) {\n const parts = host.split('.').map((p) => Number.parseInt(p, 10));\n if (parts.length !== 4 || parts.some((n) => !Number.isFinite(n))) return false;\n const [a, b] = parts;\n if (a === 10) return true;\n if (a === 127) return true;\n if (a === 169 && b === 254) return true; // link-local\n if (a === 172 && b >= 16 && b <= 31) return true;\n if (a === 192 && b === 168) return true;\n if (a === 100 && b >= 64 && b <= 127) return true; // CGNAT — common for tailnet / mesh\n }\n return false;\n}\n\n/**\n * Validate a candidate publicUrl. Strict by design — we reject anything that\n * looks ambiguous so the QR payload is always a clean origin.\n */\nexport function validatePublicUrl(raw: string): PublicUrlValidation {\n const trimmed = (raw ?? '').trim();\n if (!trimmed) {\n return { ok: false, code: 'invalid_url', message: 'publicUrl is empty' };\n }\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch {\n return { ok: false, code: 'invalid_url', message: 'publicUrl is not a valid URL' };\n }\n const protocol = parsed.protocol.toLowerCase();\n if (protocol !== 'https:' && protocol !== 'http:') {\n return { ok: false, code: 'invalid_scheme', message: 'publicUrl must use http(s)' };\n }\n if (parsed.username || parsed.password) {\n return { ok: false, code: 'has_userinfo', message: 'publicUrl must not contain userinfo' };\n }\n // pathname may be \"/\" (trailing slash) but nothing else\n const path = parsed.pathname;\n if (path && path !== '/' && path !== '') {\n return { ok: false, code: 'has_path', message: 'publicUrl must not contain a path' };\n }\n if (parsed.search || parsed.hash) {\n return {\n ok: false,\n code: 'has_query_or_fragment',\n message: 'publicUrl must not contain query or fragment',\n };\n }\n const hostname = parsed.hostname.toLowerCase();\n if (protocol === 'http:' && !isPrivateOrLocalHostname(hostname)) {\n return {\n ok: false,\n code: 'requires_https',\n message:\n 'publicUrl must use https for public hostnames (http is only allowed for RFC1918 / .local)',\n };\n }\n // Normalize: drop trailing slash, lowercase host.\n const normalized = `${protocol}//${parsed.host.toLowerCase()}`;\n return {\n ok: true,\n url: normalized,\n protocol: protocol as 'http:' | 'https:',\n hostname,\n };\n}\n\n/** Convenience: return the normalized origin or `null` when invalid. */\nexport function normalizePublicUrlOrNull(raw: string | null | undefined): string | null {\n if (!raw) return null;\n const result = validatePublicUrl(raw);\n return result.ok ? result.url : null;\n}\n"],"mappings":";;;;;;;;;;;;AAwBA,SAAgB,yBAAyB,UAA2B;CAClE,MAAM,OAAO,SAAS,MAAM,CAAC,aAAa;AAC1C,KAAI,CAAC,KAAM,QAAO;AAClB,KAAI,SAAS,eAAe,KAAK,SAAS,aAAa,CAAE,QAAO;AAChE,KAAI,KAAK,SAAS,SAAS,CAAE,QAAO;AAEpC,KAAI,SAAS,SAAS,SAAS,QAAS,QAAO;AAC/C,KAAI,KAAK,WAAW,QAAQ,IAAI,KAAK,WAAW,SAAS,CAAE,QAAO;AAClE,KAAI,KAAK,WAAW,KAAK,IAAI,KAAK,WAAW,KAAK;MAE5C,IAAI,OAAO,KAAK,QAAQ,YAAY,GAAG,CAAC,CAAE,QAAO;;AAGvD,KAAI,IAAI,OAAO,KAAK,EAAE;EACpB,MAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,OAAO,SAAS,GAAG,GAAG,CAAC;AAChE,MAAI,MAAM,WAAW,KAAK,MAAM,MAAM,MAAM,CAAC,OAAO,SAAS,EAAE,CAAC,CAAE,QAAO;EACzE,MAAM,CAAC,GAAG,KAAK;AACf,MAAI,MAAM,GAAI,QAAO;AACrB,MAAI,MAAM,IAAK,QAAO;AACtB,MAAI,MAAM,OAAO,MAAM,IAAK,QAAO;AACnC,MAAI,MAAM,OAAO,KAAK,MAAM,KAAK,GAAI,QAAO;AAC5C,MAAI,MAAM,OAAO,MAAM,IAAK,QAAO;AACnC,MAAI,MAAM,OAAO,KAAK,MAAM,KAAK,IAAK,QAAO;;AAE/C,QAAO;;;;;;AAOT,SAAgB,kBAAkB,KAAkC;CAClE,MAAM,WAAW,OAAO,IAAI,MAAM;AAClC,KAAI,CAAC,QACH,QAAO;EAAE,IAAI;EAAO,MAAM;EAAe,SAAS;EAAsB;CAE1E,IAAI;AACJ,KAAI;AACF,WAAS,IAAI,IAAI,QAAQ;SACnB;AACN,SAAO;GAAE,IAAI;GAAO,MAAM;GAAe,SAAS;GAAgC;;CAEpF,MAAM,WAAW,OAAO,SAAS,aAAa;AAC9C,KAAI,aAAa,YAAY,aAAa,QACxC,QAAO;EAAE,IAAI;EAAO,MAAM;EAAkB,SAAS;EAA8B;AAErF,KAAI,OAAO,YAAY,OAAO,SAC5B,QAAO;EAAE,IAAI;EAAO,MAAM;EAAgB,SAAS;EAAuC;CAG5F,MAAM,OAAO,OAAO;AACpB,KAAI,QAAQ,SAAS,OAAO,SAAS,GACnC,QAAO;EAAE,IAAI;EAAO,MAAM;EAAY,SAAS;EAAqC;AAEtF,KAAI,OAAO,UAAU,OAAO,KAC1B,QAAO;EACL,IAAI;EACJ,MAAM;EACN,SAAS;EACV;CAEH,MAAM,WAAW,OAAO,SAAS,aAAa;AAC9C,KAAI,aAAa,WAAW,CAAC,yBAAyB,SAAS,CAC7D,QAAO;EACL,IAAI;EACJ,MAAM;EACN,SACE;EACH;AAIH,QAAO;EACL,IAAI;EACJ,KAAK,GAHe,SAAS,IAAI,OAAO,KAAK,aAAa;EAIhD;EACV;EACD;;;AAIH,SAAgB,yBAAyB,KAA+C;AACtF,KAAI,CAAC,IAAK,QAAO;CACjB,MAAM,SAAS,kBAAkB,IAAI;AACrC,QAAO,OAAO,KAAK,OAAO,MAAM"}
|