@xopcai/xopc 0.0.81 → 0.0.83
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/README.zh-CN.md +1 -1
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/outbound/media-load.js +2 -3
- package/dist/extensions/feishu/src/outbound/media-load.js.map +1 -1
- package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
- package/dist/extensions/telegram/src/config-schema.d.ts +6 -6
- package/dist/extensions/telegram/src/plugin.d.ts +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +3 -3
- package/dist/extensions/weixin/src/auth/accounts.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
- package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
- package/dist/gateway/static/root/assets/agents-CrpYTHJS.js +222 -0
- package/dist/gateway/static/root/assets/{apps-page-Ci17oA_o.js → apps-page-1mcKh5Rh.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-zd6QNKPx.js +1 -0
- package/dist/gateway/static/root/assets/{channels-status-swr-CUU3faST.js → channels-status-swr-uRAuhiUo.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-api-BVQ2n75R.js → cron-api-O2Q_ruV6.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-x582Y6D5.js → cron-page-By09AQD-.js} +1 -1
- package/dist/gateway/static/root/assets/{dist-XT96cQdR.js → dist-BpQxde0t.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-Czzfrtt5.js → extension-debug-page-CY27wj_p.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-B_c5UIqX.js → extension-page-C-Ed5ZmP.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-Ckvjgw0_.js → extension-settings-page-raLux7E7.js} +1 -1
- package/dist/gateway/static/root/assets/fetch-2iRFmd3n.js +3 -0
- package/dist/gateway/static/root/assets/{field-primitives-DQpT8iVa.js → field-primitives-fa_hiQcX.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-DKqOuQ0V.js → heartbeat-config-api-BVl5VHvL.js} +1 -1
- package/dist/gateway/static/root/assets/index-BuFldCsB.css +1 -0
- package/dist/gateway/static/root/assets/{index-Bq3Lg4bG.js → index-Y-iqo-gL.js} +95 -86
- package/dist/gateway/static/root/assets/{logs-page-B3CwJNBq.js → logs-page-BdH2n7ZW.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-Vpchzdp-.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-CjjEpVYM.js → settings-form-section-Kk1yAGBl.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-KBm0u6Dz.js +3 -0
- package/dist/gateway/static/root/assets/skills-page-BjeXXaOn.js +2 -0
- package/dist/gateway/static/root/assets/{theme-store-DnwYutiX.js → theme-store-D01dJt95.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-DQehHvlm.js → utils-DpTxN4AF.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-CwO8Cf01.js +1 -0
- package/dist/gateway/static/root/index.html +4 -4
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-instance-gateway.d.ts +50 -0
- package/dist/src/agent/agent-instance-gateway.js +1 -0
- package/dist/src/agent/agent-manager.d.ts +20 -14
- package/dist/src/agent/agent-manager.js +74 -186
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/background-review/coordinator.d.ts +61 -0
- package/dist/src/agent/background-review/coordinator.js +120 -0
- package/dist/src/agent/background-review/coordinator.js.map +1 -0
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
- package/dist/src/agent/child-agent-factory.d.ts +14 -0
- package/dist/src/agent/child-agent-factory.js +2 -8
- package/dist/src/agent/child-agent-factory.js.map +1 -1
- package/dist/src/agent/context/workspace-seed.js +3 -3
- package/dist/src/agent/embedded/index.d.ts +1 -2
- package/dist/src/agent/embedded/index.js +2 -3
- package/dist/src/agent/embedded/run-for-session.d.ts +2 -2
- package/dist/src/agent/embedded/run-for-session.js.map +1 -1
- package/dist/src/agent/embedded/runs.d.ts +32 -0
- package/dist/src/agent/embedded/runs.js +79 -19
- package/dist/src/agent/embedded/runs.js.map +1 -1
- package/dist/src/agent/embedded/session-manager-cache.d.ts +14 -0
- package/dist/src/agent/embedded/session-manager-cache.js +32 -11
- package/dist/src/agent/embedded/session-manager-cache.js.map +1 -1
- package/dist/src/agent/embedded/session-runner.d.ts +37 -7
- package/dist/src/agent/embedded/session-runner.js +184 -153
- package/dist/src/agent/embedded/session-runner.js.map +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.d.ts +57 -9
- package/dist/src/agent/embedded/session-tool-result-guard.js +159 -67
- package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
- package/dist/src/agent/goals/goal-run-store.js +4 -4
- package/dist/src/agent/goals/persistent-goal-service.d.ts +84 -0
- package/dist/src/agent/goals/persistent-goal-service.js +139 -0
- package/dist/src/agent/goals/persistent-goal-service.js.map +1 -0
- package/dist/src/agent/goals/post-turn.js +2 -2
- package/dist/src/agent/goals/state.d.ts +1 -1
- package/dist/src/agent/goals/state.js.map +1 -1
- package/dist/src/agent/image/load-image-media.js +1 -1
- package/dist/src/agent/inbound/inbound-loop.d.ts +77 -0
- package/dist/src/agent/inbound/inbound-loop.js +226 -0
- package/dist/src/agent/inbound/inbound-loop.js.map +1 -0
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +80 -0
- package/dist/src/agent/inbound/turn-dispatcher.js +138 -0
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -0
- package/dist/src/agent/ipc/bus.js +1 -1
- package/dist/src/agent/ipc/inbox.js +2 -2
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -1
- package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
- package/dist/src/agent/lifecycle/manager.d.ts +1 -1
- package/dist/src/agent/lifecycle/manager.js.map +1 -1
- package/dist/src/agent/lifecycle/types.d.ts +1 -1
- package/dist/src/agent/memory/builtin-memory-store.js +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
- package/dist/src/agent/memory/dreaming/events.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
- package/dist/src/agent/memory/dreaming/preview.js +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.d.ts +12 -2
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js.map +1 -1
- package/dist/src/agent/memory/index.js +3 -3
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/memory/prefetch-coordinator.d.ts +37 -0
- package/dist/src/agent/memory/prefetch-coordinator.js +45 -0
- package/dist/src/agent/memory/prefetch-coordinator.js.map +1 -0
- package/dist/src/agent/messaging/command-handler.d.ts +5 -1
- package/dist/src/agent/messaging/command-handler.js +24 -96
- package/dist/src/agent/messaging/command-handler.js.map +1 -1
- package/dist/src/agent/messaging/index.d.ts +1 -0
- package/dist/src/agent/messaging/index.js +2 -1
- package/dist/src/agent/messaging/message-router.d.ts +1 -1
- package/dist/src/agent/messaging/message-router.js.map +1 -1
- package/dist/src/agent/messaging/outbound-coordinator.d.ts +82 -0
- package/dist/src/agent/messaging/outbound-coordinator.js +123 -0
- package/dist/src/agent/messaging/outbound-coordinator.js.map +1 -0
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/orchestration/agent-event-handler.d.ts +36 -33
- package/dist/src/agent/orchestration/agent-event-handler.js +212 -174
- package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.d.ts +4 -4
- package/dist/src/agent/orchestration/agent-orchestrator.js +4 -8
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/orchestration/index.d.ts +1 -1
- package/dist/src/agent/orchestration/index.js +2 -2
- package/dist/src/agent/prompt/service-prompt-builder.js +4 -4
- package/dist/src/agent/reply/post-compaction-context.js +1 -1
- package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
- package/dist/src/agent/sandbox/path-policy.js +1 -1
- package/dist/src/agent/service/async-queue.d.ts +20 -0
- package/dist/src/agent/service/async-queue.js +53 -0
- package/dist/src/agent/service/async-queue.js.map +1 -0
- package/dist/src/agent/service/build-direct-message-content.d.ts +2 -2
- package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
- package/dist/src/agent/service/direct-turn-helpers.d.ts +70 -0
- package/dist/src/agent/service/direct-turn-helpers.js +90 -0
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -0
- package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -3
- package/dist/src/agent/service/process-direct-one-shot.js +17 -34
- package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
- package/dist/src/agent/service/process-direct-streaming.js +133 -167
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/webchat-tts.d.ts +2 -2
- package/dist/src/agent/service/webchat-tts.js +1 -1
- package/dist/src/agent/service/webchat-tts.js.map +1 -1
- package/dist/src/agent/service.d.ts +62 -167
- package/dist/src/agent/service.js +177 -786
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/index.d.ts +4 -0
- package/dist/src/agent/session/index.js +5 -1
- package/dist/src/agent/session/session-config-service.d.ts +68 -0
- package/dist/src/agent/session/session-config-service.js +172 -0
- package/dist/src/agent/session/session-config-service.js.map +1 -0
- package/dist/src/agent/session/session-context.d.ts +27 -19
- package/dist/src/agent/session/session-context.js +39 -24
- package/dist/src/agent/session/session-context.js.map +1 -1
- package/dist/src/agent/session/session-hydrator.d.ts +42 -0
- package/dist/src/agent/session/session-hydrator.js +66 -0
- package/dist/src/agent/session/session-hydrator.js.map +1 -0
- package/dist/src/agent/session/session-inspector.d.ts +80 -0
- package/dist/src/agent/session/session-inspector.js +119 -0
- package/dist/src/agent/session/session-inspector.js.map +1 -0
- package/dist/src/agent/session/session-state-bag.d.ts +83 -0
- package/dist/src/agent/session/session-state-bag.js +192 -0
- package/dist/src/agent/session/session-state-bag.js.map +1 -0
- package/dist/src/agent/skills/config.js +1 -1
- package/dist/src/agent/skills/hub-hash.js +2 -2
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +2 -2
- package/dist/src/agent/skills/index.d.ts +0 -2
- package/dist/src/agent/skills/index.js +3 -5
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/managed-store.js +1 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -6
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +35 -7
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/scanner.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +2 -2
- package/dist/src/agent/skills/skill-manager.js +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +7 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +37 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/delegate-tool.d.ts +7 -0
- package/dist/src/agent/tools/delegate-tool.js +2 -1
- package/dist/src/agent/tools/delegate-tool.js.map +1 -1
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/executor.d.ts +34 -15
- package/dist/src/agent/tools/executor.js +44 -79
- package/dist/src/agent/tools/executor.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +6 -0
- package/dist/src/agent/tools/factory.js +63 -4
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/send-media.js +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +1 -1
- package/dist/src/agent/tools/skills-tools.js +1 -1
- package/dist/src/agent/tools/tts-tool.js +1 -1
- package/dist/src/agent/tools/write.js +1 -1
- package/dist/src/agent/workspace-runtime/registry.d.ts +48 -0
- package/dist/src/agent/workspace-runtime/registry.js +59 -0
- package/dist/src/agent/workspace-runtime/registry.js.map +1 -0
- package/dist/src/auth/credentials.js +3 -3
- package/dist/src/auth/profiles/store.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/browser/cdp-local-launcher.js +4 -3
- package/dist/src/browser/cdp-local-launcher.js.map +1 -1
- package/dist/src/browser/index.d.ts +1 -0
- package/dist/src/browser/index.js +2 -1
- package/dist/src/browser/manager.js +3 -2
- package/dist/src/browser/manager.js.map +1 -1
- package/dist/src/browser/providers/browser-ext-install.js +4 -4
- package/dist/src/browser/providers/browser-use.js +2 -1
- package/dist/src/browser/providers/browser-use.js.map +1 -1
- package/dist/src/browser/providers/browserbase.js +2 -1
- package/dist/src/browser/providers/browserbase.js.map +1 -1
- package/dist/src/browser/providers/cloakbrowser.js +7 -6
- package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
- package/dist/src/browser/providers/playwright-doctor.d.ts +2 -0
- package/dist/src/browser/providers/playwright-doctor.js +7 -3
- package/dist/src/browser/providers/playwright-doctor.js.map +1 -1
- package/dist/src/browser/readiness.d.ts +33 -0
- package/dist/src/browser/readiness.js +138 -0
- package/dist/src/browser/readiness.js.map +1 -0
- package/dist/src/browser/stealth.js +2 -2
- package/dist/src/channels/attachments/inbound-persist.js +1 -1
- package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
- package/dist/src/channels/channel-domain.d.ts +1 -1
- package/dist/src/channels/config-helpers.d.ts +1 -1
- package/dist/src/channels/config-helpers.js.map +1 -1
- package/dist/src/channels/heartbeat-scheduler.d.ts +40 -0
- package/dist/src/channels/heartbeat-scheduler.js +94 -0
- package/dist/src/channels/heartbeat-scheduler.js.map +1 -0
- package/dist/src/channels/lifecycle-supervisor.d.ts +81 -0
- package/dist/src/channels/lifecycle-supervisor.js +263 -0
- package/dist/src/channels/lifecycle-supervisor.js.map +1 -0
- package/dist/src/channels/manager.d.ts +34 -68
- package/dist/src/channels/manager.js +107 -477
- package/dist/src/channels/manager.js.map +1 -1
- package/dist/src/channels/outbound/deliver.d.ts +1 -1
- package/dist/src/channels/outbound/deliver.js.map +1 -1
- package/dist/src/channels/outbound/persist-store.js +1 -1
- package/dist/src/channels/outbound-sender.d.ts +51 -0
- package/dist/src/channels/outbound-sender.js +125 -0
- package/dist/src/channels/outbound-sender.js.map +1 -0
- package/dist/src/channels/pairing/allow-from-file.js +1 -1
- package/dist/src/channels/pairing/pairing-service.d.ts +3 -10
- package/dist/src/channels/pairing/pairing-service.js.map +1 -1
- package/dist/src/channels/pairing/pairing-store.js +2 -2
- package/dist/src/channels/pairing/pairing-types.d.ts +15 -0
- package/dist/src/channels/pairing/pairing-types.js +1 -0
- package/dist/src/channels/plugin-registry.d.ts +22 -0
- package/dist/src/channels/plugin-registry.js +44 -0
- package/dist/src/channels/plugin-registry.js.map +1 -0
- package/dist/src/channels/plugin-types.d.ts +1 -1
- package/dist/src/channels/plugins/types.adapters.d.ts +2 -2
- package/dist/src/channels/security-helpers.d.ts +1 -1
- package/dist/src/channels/security-helpers.js.map +1 -1
- package/dist/src/channels/setup-wizard.d.ts +1 -1
- package/dist/src/chat-commands/builtins/config.js +2 -2
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/cli/commands/agent/stream-renderer.js +1 -1
- package/dist/src/cli/commands/agent/stream-renderer.js.map +1 -1
- package/dist/src/cli/commands/agent.js +4 -4
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/browser-cli-helpers.js +2 -1
- package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
- package/dist/src/cli/commands/extension-dev.js +2 -2
- package/dist/src/cli/commands/extension-dev.js.map +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +2 -2
- package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
- package/dist/src/cli/commands/extension-pack.js +1 -1
- package/dist/src/cli/commands/gateway/call.js +1 -1
- package/dist/src/cli/commands/gateway/call.js.map +1 -1
- package/dist/src/cli/commands/gateway/health.js +1 -1
- package/dist/src/cli/commands/gateway/health.js.map +1 -1
- package/dist/src/cli/commands/gateway/lifecycle-core.d.ts +31 -12
- package/dist/src/cli/commands/gateway/lifecycle-core.js +167 -116
- package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.d.ts +11 -0
- package/dist/src/cli/commands/gateway/lifecycle.js +102 -0
- package/dist/src/cli/commands/gateway/lifecycle.js.map +1 -0
- package/dist/src/cli/commands/gateway/logs.js +1 -1
- package/dist/src/cli/commands/gateway/logs.js.map +1 -1
- package/dist/src/cli/commands/gateway/probe.js +1 -1
- package/dist/src/cli/commands/gateway/probe.js.map +1 -1
- package/dist/src/cli/commands/gateway/restart-health.d.ts +12 -0
- package/dist/src/cli/commands/gateway/restart-health.js +45 -1
- package/dist/src/cli/commands/gateway/restart-health.js.map +1 -1
- package/dist/src/cli/commands/gateway/restart.js +3 -3
- package/dist/src/cli/commands/gateway/restart.js.map +1 -1
- package/dist/src/cli/commands/gateway/run-foreground.d.ts +0 -1
- package/dist/src/cli/commands/gateway/run-foreground.js +0 -35
- package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
- package/dist/src/cli/commands/gateway/service.js +1 -1
- package/dist/src/cli/commands/gateway/service.js.map +1 -1
- package/dist/src/cli/commands/gateway/shared.d.ts +3 -0
- package/dist/src/cli/commands/gateway/shared.js +54 -0
- package/dist/src/cli/commands/gateway/shared.js.map +1 -0
- package/dist/src/cli/commands/gateway/status.js +1 -1
- package/dist/src/cli/commands/gateway/status.js.map +1 -1
- package/dist/src/cli/commands/gateway/stop.js +2 -2
- package/dist/src/cli/commands/gateway/stop.js.map +1 -1
- package/dist/src/cli/commands/gateway/token.js +1 -1
- package/dist/src/cli/commands/gateway/token.js.map +1 -1
- package/dist/src/cli/commands/gateway.js +5 -5
- package/dist/src/cli/commands/gateway.js.map +1 -1
- package/dist/src/cli/commands/image.js +2 -2
- package/dist/src/cli/commands/image.js.map +1 -1
- package/dist/src/cli/commands/init.js +4 -4
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard/gateway.d.ts +0 -8
- package/dist/src/cli/commands/onboard/gateway.js +48 -49
- package/dist/src/cli/commands/onboard/gateway.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +9 -64
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/session/utils.js +1 -1
- package/dist/src/cli/commands/session/utils.js.map +1 -1
- package/dist/src/cli/commands/skills.js +1 -1
- package/dist/src/cli/commands/tailscale.js +1 -1
- package/dist/src/cli/commands/tailscale.js.map +1 -1
- package/dist/src/cli/context.d.ts +20 -0
- package/dist/src/cli/context.js +23 -0
- package/dist/src/cli/context.js.map +1 -0
- package/dist/src/cli/extension-cli-register.js +3 -3
- package/dist/src/cli/gateway-run-argv.js +1 -4
- package/dist/src/cli/gateway-run-argv.js.map +1 -1
- package/dist/src/cli/gateway-run-fast-path.js +1 -1
- package/dist/src/cli/gateway-run-fast-path.js.map +1 -1
- package/dist/src/cli/index.d.ts +1 -7
- package/dist/src/cli/index.js +4 -6
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +2 -2
- package/dist/src/config/commands.flags.d.ts +3 -0
- package/dist/src/config/commands.flags.js +11 -0
- package/dist/src/config/commands.flags.js.map +1 -0
- package/dist/src/config/index.d.ts +1 -0
- package/dist/src/config/index.js +6 -5
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/config/loader.js +2 -2
- package/dist/src/config/models-json.js +2 -2
- package/dist/src/config/profile.js +2 -2
- package/dist/src/config/schema.d.ts +11 -4
- package/dist/src/config/schema.js +13 -12
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/workspace-path-helpers.d.ts +15 -0
- package/dist/src/config/workspace-path-helpers.js +14 -0
- package/dist/src/config/workspace-path-helpers.js.map +1 -0
- package/dist/src/cron/executor.js +4 -4
- package/dist/src/cron/executor.js.map +1 -1
- package/dist/src/cron/persistence.js +1 -1
- package/dist/src/cron/run-log-store.js +1 -1
- package/dist/src/daemon/index.d.ts +0 -1
- package/dist/src/daemon/index.js +1 -2
- package/dist/src/daemon/install-plan.js +3 -2
- package/dist/src/daemon/install-plan.js.map +1 -1
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/daemon/types.d.ts +0 -6
- package/dist/src/extensions/api.d.ts +1 -1
- package/dist/src/extensions/api.js +2 -2
- package/dist/src/extensions/api.js.map +1 -1
- package/dist/src/extensions/bundle-mcp.js +1 -1
- package/dist/src/extensions/discover-extensions.js +1 -1
- package/dist/src/extensions/extension-registry-impl.d.ts +51 -0
- package/dist/src/extensions/extension-registry-impl.js +117 -0
- package/dist/src/extensions/extension-registry-impl.js.map +1 -0
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/index.js +3 -2
- package/dist/src/extensions/loader.d.ts +3 -43
- package/dist/src/extensions/loader.js +3 -110
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/extensions/lockfile.js +2 -2
- package/dist/src/extensions/sdk/index.js +2 -1
- package/dist/src/extensions/sdk/index.js.map +1 -1
- package/dist/src/extensions/types/events.d.ts +7 -1
- package/dist/src/gateway/agents-admin.js +2 -2
- package/dist/src/gateway/file-path-classifier.js +2 -2
- package/dist/src/gateway/heartbeat/service.js +2 -2
- package/dist/src/gateway/heartbeat/service.js.map +1 -1
- package/dist/src/gateway/hono/app.js +40 -37
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +1 -1
- package/dist/src/gateway/hono/lib/static-ui.js +2 -2
- package/dist/src/gateway/hono/middleware/auth.d.ts +5 -14
- package/dist/src/gateway/hono/middleware/auth.js +92 -105
- package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
- package/dist/src/gateway/hono/middleware/logger.d.ts +5 -1
- package/dist/src/gateway/hono/middleware/logger.js +41 -5
- package/dist/src/gateway/hono/middleware/logger.js.map +1 -1
- package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +14 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js +62 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -0
- package/dist/src/gateway/hono/oauth.js +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +4 -4
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
- package/dist/src/gateway/hono/routes/browser.d.ts +20 -0
- package/dist/src/gateway/hono/routes/browser.js +626 -0
- package/dist/src/gateway/hono/routes/browser.js.map +1 -0
- package/dist/src/gateway/hono/routes/commands-skills.js +13 -13
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +18 -0
- package/dist/src/gateway/hono/routes/config-patch/agents.js +418 -0
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +12 -0
- package/dist/src/gateway/hono/routes/config-patch/channels.js +186 -0
- package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +18 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.js +264 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/index.d.ts +9 -0
- package/dist/src/gateway/hono/routes/config-patch/index.js +6 -0
- package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +23 -0
- package/dist/src/gateway/hono/routes/config-patch/misc.js +139 -0
- package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/result.d.ts +18 -0
- package/dist/src/gateway/hono/routes/config-patch/result.js +13 -0
- package/dist/src/gateway/hono/routes/config-patch/result.js.map +1 -0
- package/dist/src/gateway/hono/routes/config.js +20 -1764
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +2 -3
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/exposure.js +2 -1
- package/dist/src/gateway/hono/routes/exposure.js.map +1 -1
- package/dist/src/gateway/hono/routes/host-fs.js +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -5
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/mcp.js +1 -2
- package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +32 -32
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/shares.js +4 -4
- package/dist/src/gateway/hono/routes/shares.js.map +1 -1
- package/dist/src/gateway/hono/routes/tunnel.js +1 -1
- package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +6 -7
- package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
- package/dist/src/gateway/hono/sse.d.ts +1 -0
- package/dist/src/gateway/hono/sse.js +3 -2
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/index.d.ts +1 -1
- package/dist/src/gateway/index.js +4 -2
- package/dist/src/gateway/lock.js +3 -3
- package/dist/src/gateway/rate-limit/auth-policy.d.ts +34 -0
- package/dist/src/gateway/rate-limit/auth-policy.js +49 -0
- package/dist/src/gateway/rate-limit/auth-policy.js.map +1 -0
- package/dist/src/gateway/rate-limit/buckets.d.ts +63 -0
- package/dist/src/gateway/rate-limit/buckets.js +143 -0
- package/dist/src/gateway/rate-limit/buckets.js.map +1 -0
- package/dist/src/gateway/rate-limit/env-flags.d.ts +13 -0
- package/dist/src/gateway/rate-limit/env-flags.js +16 -0
- package/dist/src/gateway/rate-limit/env-flags.js.map +1 -0
- package/dist/src/gateway/rate-limit/index.d.ts +3 -0
- package/dist/src/gateway/rate-limit/index.js +4 -0
- package/dist/src/gateway/run-loop.d.ts +1 -1
- package/dist/src/gateway/run-loop.js +24 -4
- package/dist/src/gateway/run-loop.js.map +1 -1
- package/dist/src/gateway/runtime-config.js +2 -1
- package/dist/src/gateway/runtime-config.js.map +1 -1
- package/dist/src/gateway/security/audit.js +2 -1
- package/dist/src/gateway/security/audit.js.map +1 -1
- package/dist/src/gateway/security/index.d.ts +0 -1
- package/dist/src/gateway/security/index.js +1 -2
- package/dist/src/gateway/security/loopback.d.ts +13 -0
- package/dist/src/gateway/security/loopback.js +45 -0
- package/dist/src/gateway/security/loopback.js.map +1 -0
- package/dist/src/gateway/service/agent-runner.d.ts +108 -0
- package/dist/src/gateway/service/agent-runner.js +184 -0
- package/dist/src/gateway/service/agent-runner.js.map +1 -0
- package/dist/src/gateway/service/config-coordinator.d.ts +119 -0
- package/dist/src/gateway/service/config-coordinator.js +351 -0
- package/dist/src/gateway/service/config-coordinator.js.map +1 -0
- package/dist/src/gateway/service/marketplace-service.d.ts +85 -0
- package/dist/src/gateway/service/marketplace-service.js +239 -0
- package/dist/src/gateway/service/marketplace-service.js.map +1 -0
- package/dist/src/gateway/service/run-gateway-agent.js +5 -5
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +125 -0
- package/dist/src/gateway/service/sessions-api.js +135 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -0
- package/dist/src/gateway/service.d.ts +30 -360
- package/dist/src/gateway/service.js +122 -904
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/workspace-fs-file-list.js +1 -1
- package/dist/src/gateway/workspace-heartbeat-path.js +1 -2
- package/dist/src/gateway/workspace-heartbeat-path.js.map +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/infra/gateway-process-argv.d.ts +4 -0
- package/dist/src/infra/gateway-process-argv.js +26 -0
- package/dist/src/infra/gateway-process-argv.js.map +1 -0
- package/dist/src/infra/gateway-processes.d.ts +5 -0
- package/dist/src/infra/gateway-processes.js +65 -0
- package/dist/src/infra/gateway-processes.js.map +1 -0
- package/dist/src/infra/rate-limit/failure-limiter.d.ts +50 -0
- package/dist/src/infra/rate-limit/failure-limiter.js +100 -0
- package/dist/src/infra/rate-limit/failure-limiter.js.map +1 -0
- package/dist/src/infra/rate-limit/index.d.ts +5 -0
- package/dist/src/infra/rate-limit/index.js +3 -0
- package/dist/src/infra/rate-limit/keyed-store.d.ts +34 -0
- package/dist/src/infra/rate-limit/keyed-store.js +44 -0
- package/dist/src/infra/rate-limit/keyed-store.js.map +1 -0
- package/dist/src/infra/rate-limit/rate-limiter.d.ts +39 -0
- package/dist/src/infra/rate-limit/rate-limiter.js +65 -0
- package/dist/src/infra/rate-limit/rate-limiter.js.map +1 -0
- package/dist/src/infra/restart.d.ts +21 -0
- package/dist/src/infra/restart.js +122 -0
- package/dist/src/infra/restart.js.map +1 -0
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-lock.js +3 -3
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/infra/update-startup.js +2 -2
- package/dist/src/infra/write-file-atomic.js +2 -2
- package/dist/src/mcp/channel-bridge.d.ts +0 -6
- package/dist/src/mcp/channel-bridge.js +1 -5
- package/dist/src/mcp/channel-bridge.js.map +1 -1
- package/dist/src/media-shared/http/ssrf-guard.js +1 -1
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/index.js +2 -2
- package/dist/src/providers/model-registry.js +1 -1
- package/dist/src/session/config-store.js +2 -2
- package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
- package/dist/src/session/parity/sessions-json-file-read.d.ts +2 -1
- package/dist/src/session/parity/sessions-json-file-read.js.map +1 -1
- package/dist/src/session/parity/sessions-json-file.js +1 -1
- package/dist/src/session/parity/transcript-file-lock.js +2 -2
- package/dist/src/session/parity/transcript-paths.js +1 -1
- package/dist/src/session/search-index-cache.js +1 -1
- package/dist/src/session/search-index.js +1 -1
- package/dist/src/session/session-title.js +1 -1
- package/dist/src/session/store.js +5 -5
- package/dist/src/share/share-rate-limit.d.ts +10 -2
- package/dist/src/share/share-rate-limit.js +39 -27
- package/dist/src/share/share-rate-limit.js.map +1 -1
- package/dist/src/share/share-store.js +3 -3
- package/dist/src/tui/backends/embedded-backend.js +16 -12
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/clipboard-image.js +2 -2
- package/dist/src/tui/extension-host/load-extensions.js +1 -1
- package/dist/src/tui/format-tui-hotkeys.js +1 -1
- package/dist/src/tui/theme-manager.js +1 -1
- package/dist/src/tui/tui-keybindings-file.js +1 -1
- package/dist/src/tui/tui-scoped-models.js +1 -1
- package/dist/src/tui/tui-settings.js +1 -1
- package/dist/src/tui/tui-skills-autocomplete.js +1 -1
- package/dist/src/tui/tui.js +1 -2
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/tui/xopc-tui-keybindings.d.ts +0 -1
- package/dist/src/tui/xopc-tui-keybindings.js +1 -2
- package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
- package/dist/src/tunnel/frpc-binary.js +2 -2
- package/dist/src/tunnel/frpc-config.js +1 -1
- package/dist/src/tunnel/frpc-extract.js +1 -1
- package/dist/src/tunnel/pairing-rate-limit.d.ts +10 -2
- package/dist/src/tunnel/pairing-rate-limit.js +19 -15
- package/dist/src/tunnel/pairing-rate-limit.js.map +1 -1
- package/dist/src/tunnel/tunnel-rate-limit.d.ts +6 -3
- package/dist/src/tunnel/tunnel-rate-limit.js +19 -18
- package/dist/src/tunnel/tunnel-rate-limit.js.map +1 -1
- package/dist/src/tunnel/tunnel-state.js +1 -1
- package/dist/src/utils/logger/audit.js +1 -1
- package/dist/src/utils/logger/log-store.js +1 -1
- package/dist/src/utils/logger/rotation.js +1 -1
- package/dist/src/utils/logger/stats.d.ts +1 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/factory.js +1 -1
- package/dist/src/voice/tts/index.js +2 -2
- package/dist/src/voice/tts/merge-config.js +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +1 -1
- package/dist/src/voice/tts/service.js +1 -1
- package/dist/src/voice/tts/service.js.map +1 -1
- package/dist/src/voice/tts/speak-core.js +1 -1
- package/package.json +10 -5
- package/dist/gateway/static/root/assets/agents-DOONGaKz.js +0 -222
- package/dist/gateway/static/root/assets/channels-settings-CARdL-ys.js +0 -1
- package/dist/gateway/static/root/assets/fetch-BAAh_kXG.js +0 -3
- package/dist/gateway/static/root/assets/index-C8yHX-AA.css +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BCNnhz9g.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-B7_PjiHL.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-VrL9TeVF.js +0 -2
- package/dist/gateway/static/root/assets/voice-api-key-field-k4FWwgkk.js +0 -1
- package/dist/src/agent/embedded/session-raw-append-message.d.ts +0 -11
- package/dist/src/agent/embedded/session-raw-append-message.js +0 -15
- package/dist/src/agent/embedded/session-raw-append-message.js.map +0 -1
- package/dist/src/agent/embedded/session-tool-result-guard-wrapper.d.ts +0 -15
- package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js +0 -24
- package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js.map +0 -1
- package/dist/src/agent/embedded/session-tool-result-state.d.ts +0 -17
- package/dist/src/agent/embedded/session-tool-result-state.js +0 -26
- package/dist/src/agent/embedded/session-tool-result-state.js.map +0 -1
- package/dist/src/daemon/launchd-restart-handoff.d.ts +0 -25
- package/dist/src/daemon/launchd-restart-handoff.js +0 -132
- package/dist/src/daemon/launchd-restart-handoff.js.map +0 -1
- package/dist/src/gateway/auth-rate-limit.d.ts +0 -71
- package/dist/src/gateway/auth-rate-limit.js +0 -192
- package/dist/src/gateway/auth-rate-limit.js.map +0 -1
- package/dist/src/gateway/restart-handler.d.ts +0 -14
- package/dist/src/gateway/restart-handler.js +0 -64
- package/dist/src/gateway/restart-handler.js.map +0 -1
- package/dist/src/gateway/security/flood-guard.d.ts +0 -28
- package/dist/src/gateway/security/flood-guard.js +0 -42
- package/dist/src/gateway/security/flood-guard.js.map +0 -1
- package/dist/src/infra/rate-limit.d.ts +0 -38
- package/dist/src/infra/rate-limit.js +0 -60
- package/dist/src/infra/rate-limit.js.map +0 -1
- package/dist/src/infra/restart-intent.d.ts +0 -13
- package/dist/src/infra/restart-intent.js +0 -40
- package/dist/src/infra/restart-intent.js.map +0 -1
- package/dist/src/infra/restart-sentinel.d.ts +0 -23
- package/dist/src/infra/restart-sentinel.js +0 -75
- package/dist/src/infra/restart-sentinel.js.map +0 -1
- package/skills/creative/canvas-design/LICENSE.txt +0 -202
- package/skills/creative/canvas-design/SKILL-zh.md +0 -130
- package/skills/creative/canvas-design/SKILL.md +0 -130
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call.js","names":[],"sources":["../../../../../src/cli/commands/gateway/call.ts"],"sourcesContent":["import { Command } from 'commander';\n\nimport {\n addGatewayClientOptions,\n parseGatewayClientOptions,\n} from '../../utils/gateway-client-options.js';\nimport { getContextWithOpts } from '../../
|
|
1
|
+
{"version":3,"file":"call.js","names":[],"sources":["../../../../../src/cli/commands/gateway/call.ts"],"sourcesContent":["import { Command } from 'commander';\n\nimport {\n addGatewayClientOptions,\n parseGatewayClientOptions,\n} from '../../utils/gateway-client-options.js';\nimport { getContextWithOpts } from '../../context.js';\nimport { resolveConfigPath } from '../../../config/paths.js';\n\nconst METHOD_ALIASES: Record<string, { method: 'GET' | 'POST'; path: string }> = {\n health: { method: 'GET', path: '/api/health' },\n status: { method: 'GET', path: '/api/status' },\n config: { method: 'GET', path: '/api/config' },\n sessions: { method: 'GET', path: '/api/sessions' },\n models: { method: 'GET', path: '/api/models' },\n channels: { method: 'GET', path: '/api/channels/status' },\n cron: { method: 'GET', path: '/api/cron' },\n logs: { method: 'GET', path: '/api/logs' },\n agents: { method: 'GET', path: '/api/agents' },\n};\n\nexport function createCallCommand(): Command {\n const cmd = new Command('call')\n .description('Call a gateway API method')\n .argument(\n '<method>',\n `Method name or API path. Built-in aliases: ${Object.keys(METHOD_ALIASES).join(', ')}`,\n )\n .option('--params <json>', 'JSON body for POST/PATCH/DELETE requests', '{}')\n .option('--http-method <method>', 'HTTP method when using a raw path', 'GET');\n\n addGatewayClientOptions(cmd);\n\n cmd.action(async (methodArg: string, options: { params?: string; httpMethod?: string }) => {\n const ctx = getContextWithOpts();\n const configPath = ctx.configPath || resolveConfigPath();\n const { callGatewayApi } = await import('../../utils/gateway-client.js');\n const clientOpts = { ...parseGatewayClientOptions(options as Record<string, unknown>), configPath };\n\n const alias = METHOD_ALIASES[methodArg.toLowerCase()];\n let httpMethod: 'GET' | 'POST' | 'PATCH' | 'DELETE';\n let apiPath: string;\n\n if (alias) {\n httpMethod = alias.method;\n apiPath = alias.path;\n } else if (methodArg.startsWith('/')) {\n httpMethod = (options.httpMethod?.toUpperCase() ?? 'GET') as 'GET' | 'POST' | 'PATCH' | 'DELETE';\n apiPath = methodArg;\n } else {\n httpMethod = (options.httpMethod?.toUpperCase() ?? 'GET') as 'GET' | 'POST' | 'PATCH' | 'DELETE';\n apiPath = `/api/${methodArg}`;\n }\n\n let body: unknown | undefined;\n if (httpMethod !== 'GET' && options.params && options.params !== '{}') {\n try {\n body = JSON.parse(options.params);\n } catch {\n console.error(`❌ Invalid JSON in --params: ${options.params}`);\n process.exit(1);\n }\n }\n\n const result = await callGatewayApi(httpMethod, apiPath, clientOpts, body);\n\n if (clientOpts.json || result.ok) {\n console.log(\n JSON.stringify(\n result.ok\n ? result.data\n : { error: result.error, status: result.status, durationMs: result.durationMs },\n null,\n 2,\n ),\n );\n }\n\n if (!result.ok) {\n if (!clientOpts.json) {\n console.error(`❌ Gateway call failed: ${result.error} (status ${result.status}, ${result.durationMs}ms)`);\n }\n process.exit(1);\n }\n });\n\n return cmd;\n}\n"],"mappings":";;;;;YAO6D;AAE7D,MAAM,iBAA2E;CAC/E,QAAQ;EAAE,QAAQ;EAAO,MAAM;EAAe;CAC9C,QAAQ;EAAE,QAAQ;EAAO,MAAM;EAAe;CAC9C,QAAQ;EAAE,QAAQ;EAAO,MAAM;EAAe;CAC9C,UAAU;EAAE,QAAQ;EAAO,MAAM;EAAiB;CAClD,QAAQ;EAAE,QAAQ;EAAO,MAAM;EAAe;CAC9C,UAAU;EAAE,QAAQ;EAAO,MAAM;EAAwB;CACzD,MAAM;EAAE,QAAQ;EAAO,MAAM;EAAa;CAC1C,MAAM;EAAE,QAAQ;EAAO,MAAM;EAAa;CAC1C,QAAQ;EAAE,QAAQ;EAAO,MAAM;EAAe;CAC/C;AAED,SAAgB,oBAA6B;CAC3C,MAAM,MAAM,IAAI,QAAQ,OAAO,CAC5B,YAAY,4BAA4B,CACxC,SACC,YACA,8CAA8C,OAAO,KAAK,eAAe,CAAC,KAAK,KAAK,GACrF,CACA,OAAO,mBAAmB,4CAA4C,KAAK,CAC3E,OAAO,0BAA0B,qCAAqC,MAAM;AAE/E,yBAAwB,IAAI;AAE5B,KAAI,OAAO,OAAO,WAAmB,YAAsD;EAEzF,MAAM,aADM,oBACU,CAAC,cAAc,mBAAmB;EACxD,MAAM,EAAE,mBAAmB,MAAM,OAAO;EACxC,MAAM,aAAa;GAAE,GAAG,0BAA0B,QAAmC;GAAE;GAAY;EAEnG,MAAM,QAAQ,eAAe,UAAU,aAAa;EACpD,IAAI;EACJ,IAAI;AAEJ,MAAI,OAAO;AACT,gBAAa,MAAM;AACnB,aAAU,MAAM;aACP,UAAU,WAAW,IAAI,EAAE;AACpC,gBAAc,QAAQ,YAAY,aAAa,IAAI;AACnD,aAAU;SACL;AACL,gBAAc,QAAQ,YAAY,aAAa,IAAI;AACnD,aAAU,QAAQ;;EAGpB,IAAI;AACJ,MAAI,eAAe,SAAS,QAAQ,UAAU,QAAQ,WAAW,KAC/D,KAAI;AACF,UAAO,KAAK,MAAM,QAAQ,OAAO;UAC3B;AACN,WAAQ,MAAM,+BAA+B,QAAQ,SAAS;AAC9D,WAAQ,KAAK,EAAE;;EAInB,MAAM,SAAS,MAAM,eAAe,YAAY,SAAS,YAAY,KAAK;AAE1E,MAAI,WAAW,QAAQ,OAAO,GAC5B,SAAQ,IACN,KAAK,UACH,OAAO,KACH,OAAO,OACP;GAAE,OAAO,OAAO;GAAO,QAAQ,OAAO;GAAQ,YAAY,OAAO;GAAY,EACjF,MACA,EACD,CACF;AAGH,MAAI,CAAC,OAAO,IAAI;AACd,OAAI,CAAC,WAAW,KACd,SAAQ,MAAM,0BAA0B,OAAO,MAAM,WAAW,OAAO,OAAO,IAAI,OAAO,WAAW,KAAK;AAE3G,WAAQ,KAAK,EAAE;;GAEjB;AAEF,QAAO"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { init_paths, resolveConfigPath } from "../../../config/paths.js";
|
|
2
|
-
import { getContextWithOpts } from "../../
|
|
2
|
+
import { getContextWithOpts } from "../../context.js";
|
|
3
3
|
import { addGatewayClientOptions, parseGatewayClientOptions } from "../../utils/gateway-client-options.js";
|
|
4
4
|
import { Command } from "commander";
|
|
5
5
|
//#region src/cli/commands/gateway/health.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","names":[],"sources":["../../../../../src/cli/commands/gateway/health.ts"],"sourcesContent":["import { Command } from 'commander';\n\nimport {\n addGatewayClientOptions,\n parseGatewayClientOptions,\n} from '../../utils/gateway-client-options.js';\nimport { getContextWithOpts } from '../../
|
|
1
|
+
{"version":3,"file":"health.js","names":[],"sources":["../../../../../src/cli/commands/gateway/health.ts"],"sourcesContent":["import { Command } from 'commander';\n\nimport {\n addGatewayClientOptions,\n parseGatewayClientOptions,\n} from '../../utils/gateway-client-options.js';\nimport { getContextWithOpts } from '../../context.js';\nimport { resolveConfigPath } from '../../../config/paths.js';\n\ninterface HealthResponse {\n status: string;\n version?: string;\n uptime?: number;\n}\n\ninterface StatusResponse {\n status: string;\n version?: string;\n channels?: Record<string, { status: string; accounts?: number }>;\n uptime?: number;\n}\n\nfunction formatUptime(seconds?: number): string {\n if (!seconds || seconds <= 0) return 'unknown';\n const days = Math.floor(seconds / 86400);\n const hours = Math.floor((seconds % 86400) / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n parts.push(`${minutes}m`);\n return parts.join(' ');\n}\n\nexport function createHealthCommand(): Command {\n const cmd = new Command('health').description('Check gateway health and channel status');\n\n addGatewayClientOptions(cmd);\n\n cmd.action(async (options) => {\n const ctx = getContextWithOpts();\n const configPath = ctx.configPath || resolveConfigPath();\n const { callGatewayApi } = await import('../../utils/gateway-client.js');\n const clientOpts = { ...parseGatewayClientOptions(options as Record<string, unknown>), configPath };\n\n const healthResult = await callGatewayApi<HealthResponse>('GET', '/api/health', {\n ...clientOpts,\n timeoutMs: clientOpts.timeoutMs ?? 5000,\n });\n\n if (!healthResult.ok) {\n if (clientOpts.json) {\n console.log(\n JSON.stringify(\n {\n status: 'unreachable',\n error: healthResult.error,\n durationMs: healthResult.durationMs,\n },\n null,\n 2,\n ),\n );\n } else {\n console.error(`❌ Gateway unreachable: ${healthResult.error}`);\n console.error('');\n console.error('💡 Is the gateway running? Try: xopc gateway');\n }\n process.exit(1);\n }\n\n const statusResult = await callGatewayApi<StatusResponse>('GET', '/api/status', clientOpts);\n\n if (clientOpts.json) {\n console.log(\n JSON.stringify(\n {\n status: 'ok',\n durationMs: healthResult.durationMs,\n health: healthResult.data,\n ...(statusResult.ok ? { details: statusResult.data } : {}),\n },\n null,\n 2,\n ),\n );\n process.exit(0);\n }\n\n console.log(`✅ Gateway Health: OK (${healthResult.durationMs}ms)`);\n console.log('');\n\n if (healthResult.data?.version) {\n console.log(` Version: ${healthResult.data.version}`);\n }\n if (healthResult.data?.uptime != null) {\n console.log(` Uptime: ${formatUptime(healthResult.data.uptime)}`);\n }\n\n if (statusResult.ok && statusResult.data?.channels) {\n console.log('');\n console.log('📡 Channels:');\n for (const [name, info] of Object.entries(statusResult.data.channels)) {\n const statusIcon = info.status === 'connected' ? '✅' : info.status === 'disabled' ? '⚪' : '❌';\n const accountsLabel = info.accounts != null ? ` (${info.accounts} account(s))` : '';\n console.log(` ${statusIcon} ${name}: ${info.status}${accountsLabel}`);\n }\n } else if (statusResult.status === 401) {\n console.log('');\n console.log('🔒 Detailed status requires authentication. Pass --token <token>.');\n }\n\n process.exit(0);\n });\n\n return cmd;\n}\n"],"mappings":";;;;;YAO6D;AAe7D,SAAS,aAAa,SAA0B;AAC9C,KAAI,CAAC,WAAW,WAAW,EAAG,QAAO;CACrC,MAAM,OAAO,KAAK,MAAM,UAAU,MAAM;CACxC,MAAM,QAAQ,KAAK,MAAO,UAAU,QAAS,KAAK;CAClD,MAAM,UAAU,KAAK,MAAO,UAAU,OAAQ,GAAG;CACjD,MAAM,QAAkB,EAAE;AAC1B,KAAI,OAAO,EAAG,OAAM,KAAK,GAAG,KAAK,GAAG;AACpC,KAAI,QAAQ,EAAG,OAAM,KAAK,GAAG,MAAM,GAAG;AACtC,OAAM,KAAK,GAAG,QAAQ,GAAG;AACzB,QAAO,MAAM,KAAK,IAAI;;AAGxB,SAAgB,sBAA+B;CAC7C,MAAM,MAAM,IAAI,QAAQ,SAAS,CAAC,YAAY,0CAA0C;AAExF,yBAAwB,IAAI;AAE5B,KAAI,OAAO,OAAO,YAAY;EAE5B,MAAM,aADM,oBACU,CAAC,cAAc,mBAAmB;EACxD,MAAM,EAAE,mBAAmB,MAAM,OAAO;EACxC,MAAM,aAAa;GAAE,GAAG,0BAA0B,QAAmC;GAAE;GAAY;EAEnG,MAAM,eAAe,MAAM,eAA+B,OAAO,eAAe;GAC9E,GAAG;GACH,WAAW,WAAW,aAAa;GACpC,CAAC;AAEF,MAAI,CAAC,aAAa,IAAI;AACpB,OAAI,WAAW,KACb,SAAQ,IACN,KAAK,UACH;IACE,QAAQ;IACR,OAAO,aAAa;IACpB,YAAY,aAAa;IAC1B,EACD,MACA,EACD,CACF;QACI;AACL,YAAQ,MAAM,0BAA0B,aAAa,QAAQ;AAC7D,YAAQ,MAAM,GAAG;AACjB,YAAQ,MAAM,+CAA+C;;AAE/D,WAAQ,KAAK,EAAE;;EAGjB,MAAM,eAAe,MAAM,eAA+B,OAAO,eAAe,WAAW;AAE3F,MAAI,WAAW,MAAM;AACnB,WAAQ,IACN,KAAK,UACH;IACE,QAAQ;IACR,YAAY,aAAa;IACzB,QAAQ,aAAa;IACrB,GAAI,aAAa,KAAK,EAAE,SAAS,aAAa,MAAM,GAAG,EAAE;IAC1D,EACD,MACA,EACD,CACF;AACD,WAAQ,KAAK,EAAE;;AAGjB,UAAQ,IAAI,yBAAyB,aAAa,WAAW,KAAK;AAClE,UAAQ,IAAI,GAAG;AAEf,MAAI,aAAa,MAAM,QACrB,SAAQ,IAAI,eAAe,aAAa,KAAK,UAAU;AAEzD,MAAI,aAAa,MAAM,UAAU,KAC/B,SAAQ,IAAI,eAAe,aAAa,aAAa,KAAK,OAAO,GAAG;AAGtE,MAAI,aAAa,MAAM,aAAa,MAAM,UAAU;AAClD,WAAQ,IAAI,GAAG;AACf,WAAQ,IAAI,eAAe;AAC3B,QAAK,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,aAAa,KAAK,SAAS,EAAE;IACrE,MAAM,aAAa,KAAK,WAAW,cAAc,MAAM,KAAK,WAAW,aAAa,MAAM;IAC1F,MAAM,gBAAgB,KAAK,YAAY,OAAO,KAAK,KAAK,SAAS,gBAAgB;AACjF,YAAQ,IAAI,MAAM,WAAW,GAAG,KAAK,IAAI,KAAK,SAAS,gBAAgB;;aAEhE,aAAa,WAAW,KAAK;AACtC,WAAQ,IAAI,GAAG;AACf,WAAQ,IAAI,oEAAoE;;AAGlF,UAAQ,KAAK,EAAE;GACf;AAEF,QAAO"}
|
|
@@ -1,14 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Daemon
|
|
3
|
-
*
|
|
4
|
-
* Entry point for all daemon lifecycle operations. Handles:
|
|
5
|
-
* - Service resolution and availability checks
|
|
6
|
-
* - Token drift detection
|
|
7
|
-
* - Restart intent writing
|
|
8
|
-
* - Health wait coordination
|
|
9
|
-
* - JSON output mode
|
|
2
|
+
* Daemon lifecycle core — OpenClaw-aligned service start/stop/restart with onNotLoaded fallback.
|
|
10
3
|
*/
|
|
11
|
-
import type { DaemonLifecycleOptions } from '../../../daemon/types.js';
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
4
|
+
import type { DaemonLifecycleOptions, GatewayService } from '../../../daemon/types.js';
|
|
5
|
+
export type ServiceRecoveryResult = {
|
|
6
|
+
result: 'started' | 'stopped' | 'restarted';
|
|
7
|
+
message?: string;
|
|
8
|
+
warnings?: string[];
|
|
9
|
+
loaded?: boolean;
|
|
10
|
+
};
|
|
11
|
+
type ServiceRecoveryContext = {
|
|
12
|
+
json: boolean;
|
|
13
|
+
fail: (message: string, hints?: string[], diagnostics?: string[], options?: DaemonLifecycleOptions) => void;
|
|
14
|
+
};
|
|
15
|
+
type RestartPostCheckContext = {
|
|
16
|
+
options: DaemonLifecycleOptions;
|
|
17
|
+
fail: (message: string, hints?: string[], diagnostics?: string[], options?: DaemonLifecycleOptions) => void;
|
|
18
|
+
};
|
|
19
|
+
export declare function runServiceStop(params: {
|
|
20
|
+
service: GatewayService;
|
|
21
|
+
opts?: DaemonLifecycleOptions;
|
|
22
|
+
onNotLoaded?: (ctx: ServiceRecoveryContext) => Promise<ServiceRecoveryResult | null>;
|
|
23
|
+
}): Promise<void>;
|
|
24
|
+
export declare function runServiceRestart(params: {
|
|
25
|
+
service: GatewayService;
|
|
26
|
+
opts?: DaemonLifecycleOptions;
|
|
27
|
+
renderStartHints: () => string[];
|
|
28
|
+
checkTokenDrift?: boolean;
|
|
29
|
+
onNotLoaded?: (ctx: ServiceRecoveryContext) => Promise<ServiceRecoveryResult | null>;
|
|
30
|
+
postRestartCheck?: (ctx: RestartPostCheckContext) => Promise<void>;
|
|
31
|
+
}): Promise<void>;
|
|
32
|
+
export declare function executeDaemonUninstall(options?: DaemonLifecycleOptions): Promise<void>;
|
|
33
|
+
export {};
|
|
@@ -1,160 +1,220 @@
|
|
|
1
1
|
import { createLogger } from "../../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../../utils/logger.js";
|
|
3
|
+
import { clearGatewayRestartIntentSync, writeGatewayRestartIntentSync } from "../../../infra/restart.js";
|
|
3
4
|
//#region src/cli/commands/gateway/lifecycle-core.ts
|
|
4
5
|
init_logger();
|
|
5
6
|
const log = createLogger("DaemonLifecycle");
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
function emitResult(options, payload) {
|
|
8
|
+
if (options.json) {
|
|
9
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
if (payload.ok) {
|
|
13
|
+
if (payload.message) console.log(`✅ ${payload.message}`);
|
|
14
|
+
for (const warning of payload.warnings ?? []) console.warn(`⚠️ ${warning}`);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (payload.error) console.error(`❌ ${payload.error}`);
|
|
18
|
+
for (const hint of payload.hints ?? []) console.log(`💡 ${hint}`);
|
|
19
|
+
}
|
|
20
|
+
function createFail(options) {
|
|
21
|
+
return (message, hints, diagnostics, opts = options) => {
|
|
22
|
+
emitResult(opts, {
|
|
10
23
|
ok: false,
|
|
11
|
-
error:
|
|
24
|
+
error: message,
|
|
25
|
+
hints
|
|
12
26
|
});
|
|
27
|
+
for (const line of diagnostics ?? []) if (!opts.json) console.log(` ${line}`);
|
|
13
28
|
process.exit(1);
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async function resolveServiceLoadedOrFail(service, fail) {
|
|
32
|
+
try {
|
|
33
|
+
return await service.isLoaded({ env: process.env });
|
|
34
|
+
} catch (err) {
|
|
35
|
+
fail(`Gateway service check failed: ${String(err)}`);
|
|
36
|
+
return null;
|
|
14
37
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
38
|
+
}
|
|
39
|
+
async function handleServiceNotLoaded(params) {
|
|
40
|
+
emitResult(params.options, {
|
|
41
|
+
ok: true,
|
|
42
|
+
result: "not-loaded",
|
|
43
|
+
message: `Gateway service ${params.service.notLoadedText}.`,
|
|
44
|
+
hints: params.renderStartHints()
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async function checkAndWarnTokenDrift(service, options) {
|
|
48
|
+
const warnings = [];
|
|
49
|
+
try {
|
|
50
|
+
const serviceToken = (await service.readCommand(process.env))?.environment?.XOPC_GATEWAY_TOKEN;
|
|
51
|
+
if (!serviceToken) return warnings;
|
|
52
|
+
const { loadConfig } = await import("../../../config/index.js");
|
|
53
|
+
const { resolveConfigPath } = await import("../../../config/paths.js");
|
|
54
|
+
const configToken = loadConfig(resolveConfigPath())?.gateway?.auth?.token;
|
|
55
|
+
if (configToken && serviceToken !== configToken) {
|
|
56
|
+
const warning = "Token drift detected: service token differs from config. Run `xopc gateway service install --force` to sync.";
|
|
57
|
+
warnings.push(warning);
|
|
58
|
+
if (!options.json) console.warn(`⚠️ ${warning}`);
|
|
59
|
+
}
|
|
60
|
+
} catch {}
|
|
61
|
+
return warnings;
|
|
62
|
+
}
|
|
63
|
+
async function runServiceStop(params) {
|
|
64
|
+
const options = params.opts ?? {};
|
|
65
|
+
const fail = createFail(options);
|
|
66
|
+
const loaded = await resolveServiceLoadedOrFail(params.service, fail);
|
|
67
|
+
if (loaded === null) return;
|
|
68
|
+
if (!loaded) {
|
|
69
|
+
try {
|
|
70
|
+
const handled = await params.onNotLoaded?.({
|
|
71
|
+
json: Boolean(options.json),
|
|
72
|
+
fail
|
|
73
|
+
});
|
|
74
|
+
if (handled) {
|
|
75
|
+
emitResult(options, {
|
|
76
|
+
ok: true,
|
|
77
|
+
result: handled.result,
|
|
78
|
+
message: handled.message,
|
|
79
|
+
warnings: handled.warnings
|
|
80
|
+
});
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
} catch (err) {
|
|
84
|
+
fail(`Gateway stop failed: ${String(err)}`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
await handleServiceNotLoaded({
|
|
88
|
+
service: params.service,
|
|
89
|
+
renderStartHints: () => ["xopc gateway service install", "xopc gateway"],
|
|
90
|
+
options
|
|
21
91
|
});
|
|
22
92
|
return;
|
|
23
93
|
}
|
|
24
94
|
try {
|
|
25
|
-
await service.stop({
|
|
95
|
+
await params.service.stop({
|
|
26
96
|
env: process.env,
|
|
27
97
|
disable: options.disable
|
|
28
98
|
});
|
|
29
|
-
|
|
99
|
+
emitResult(options, {
|
|
30
100
|
ok: true,
|
|
31
101
|
result: "stopped",
|
|
32
102
|
message: options.disable ? "Gateway stopped and disabled (will not respawn)." : "Gateway stop signal sent."
|
|
33
103
|
});
|
|
34
104
|
} catch (err) {
|
|
35
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
36
105
|
log.error({ err }, "Failed to stop gateway");
|
|
37
|
-
|
|
38
|
-
ok: false,
|
|
39
|
-
error: `Failed to stop: ${message}`
|
|
40
|
-
});
|
|
41
|
-
process.exit(1);
|
|
106
|
+
fail(`Gateway stop failed: ${String(err)}`);
|
|
42
107
|
}
|
|
43
108
|
}
|
|
44
|
-
async function
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
109
|
+
async function runServiceRestart(params) {
|
|
110
|
+
const options = params.opts ?? {};
|
|
111
|
+
const fail = createFail(options);
|
|
112
|
+
const warnings = [];
|
|
113
|
+
let handledRecovery = null;
|
|
114
|
+
const loaded = await resolveServiceLoadedOrFail(params.service, fail);
|
|
115
|
+
if (loaded === null) return;
|
|
116
|
+
if (!loaded) {
|
|
117
|
+
try {
|
|
118
|
+
handledRecovery = await params.onNotLoaded?.({
|
|
119
|
+
json: Boolean(options.json),
|
|
120
|
+
fail
|
|
121
|
+
}) ?? null;
|
|
122
|
+
} catch (err) {
|
|
123
|
+
fail(`Gateway restart failed: ${String(err)}`);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (!handledRecovery) {
|
|
127
|
+
await handleServiceNotLoaded({
|
|
128
|
+
service: params.service,
|
|
129
|
+
renderStartHints: params.renderStartHints,
|
|
130
|
+
options
|
|
131
|
+
});
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (handledRecovery.warnings?.length) warnings.push(...handledRecovery.warnings);
|
|
61
135
|
}
|
|
62
|
-
await checkAndWarnTokenDrift(service, options);
|
|
63
|
-
const { writeGatewayRestartIntentSync } = await import("../../../infra/restart-intent.js");
|
|
64
|
-
writeGatewayRestartIntentSync({ force: options.force });
|
|
136
|
+
if (loaded && params.checkTokenDrift) warnings.push(...await checkAndWarnTokenDrift(params.service, options));
|
|
65
137
|
try {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
138
|
+
if (loaded) {
|
|
139
|
+
let wroteRestartIntent = false;
|
|
140
|
+
wroteRestartIntent = writeGatewayRestartIntentSync({ targetPid: (await params.service.readRuntime(process.env).catch(() => null))?.pid });
|
|
141
|
+
try {
|
|
142
|
+
await params.service.restart({ env: process.env });
|
|
143
|
+
} catch (err) {
|
|
144
|
+
if (wroteRestartIntent) clearGatewayRestartIntentSync();
|
|
145
|
+
throw err;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (params.postRestartCheck) await params.postRestartCheck({
|
|
149
|
+
options,
|
|
150
|
+
fail
|
|
151
|
+
});
|
|
152
|
+
if (options.wait) {
|
|
153
|
+
const timeoutMs = parseWaitTimeout(options.wait);
|
|
154
|
+
const { loadConfig } = await import("../../../config/index.js");
|
|
155
|
+
const { resolveConfigPath } = await import("../../../config/paths.js");
|
|
156
|
+
const config = loadConfig(resolveConfigPath());
|
|
157
|
+
const port = typeof config.gateway?.port === "number" ? config.gateway.port : 18790;
|
|
158
|
+
const { waitForRestartHealth } = await import("./restart-health.js");
|
|
159
|
+
const snapshot = await waitForRestartHealth({
|
|
160
|
+
service: params.service,
|
|
161
|
+
port,
|
|
162
|
+
timeoutMs,
|
|
163
|
+
onProgress: () => {
|
|
164
|
+
if (!options.json) process.stdout.write(".");
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
if (!options.json) process.stdout.write("\n");
|
|
168
|
+
if (!snapshot.healthy) {
|
|
169
|
+
fail(`Restart health check failed: ${snapshot.waitOutcome ?? "timeout"}`, ["xopc gateway logs"]);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
emitResult(options, {
|
|
173
|
+
ok: true,
|
|
174
|
+
result: "healthy",
|
|
175
|
+
message: `Gateway restarted and healthy (pid ${snapshot.runtime?.pid ?? "unknown"}, ${snapshot.elapsedMs ?? 0}ms).`,
|
|
176
|
+
warnings: warnings.length ? warnings : void 0
|
|
177
|
+
});
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
emitResult(options, {
|
|
69
181
|
ok: true,
|
|
70
|
-
result:
|
|
71
|
-
message:
|
|
182
|
+
result: "restarted",
|
|
183
|
+
message: handledRecovery?.message ?? "Gateway restart completed.",
|
|
184
|
+
warnings: warnings.length ? warnings : void 0
|
|
72
185
|
});
|
|
73
186
|
} catch (err) {
|
|
74
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
75
187
|
log.error({ err }, "Failed to restart gateway");
|
|
76
|
-
|
|
77
|
-
ok: false,
|
|
78
|
-
error: `Failed to restart: ${message}`
|
|
79
|
-
});
|
|
80
|
-
process.exit(1);
|
|
188
|
+
fail(`Gateway restart failed: ${String(err)}`, params.renderStartHints());
|
|
81
189
|
} finally {
|
|
82
|
-
const { clearGatewayRestartIntentSync } = await import("../../../infra/restart-intent.js");
|
|
83
190
|
clearGatewayRestartIntentSync();
|
|
84
191
|
}
|
|
85
192
|
}
|
|
86
|
-
async function executeDaemonUninstall(options) {
|
|
193
|
+
async function executeDaemonUninstall(options = {}) {
|
|
87
194
|
const { resolveGatewayService, isDaemonAvailableAsync } = await import("../../../daemon/service.js");
|
|
88
195
|
if (!await isDaemonAvailableAsync()) {
|
|
89
|
-
|
|
196
|
+
emitResult(options, {
|
|
90
197
|
ok: false,
|
|
91
198
|
error: "Daemon service not available on this platform"
|
|
92
199
|
});
|
|
93
200
|
process.exit(1);
|
|
94
201
|
}
|
|
95
202
|
const service = await resolveGatewayService();
|
|
203
|
+
if (await service.isLoaded({ env: process.env }).catch(() => false)) try {
|
|
204
|
+
await service.stop({ env: process.env });
|
|
205
|
+
} catch {}
|
|
96
206
|
try {
|
|
97
207
|
await service.uninstall({ env: process.env });
|
|
98
|
-
|
|
208
|
+
emitResult(options, {
|
|
99
209
|
ok: true,
|
|
100
210
|
result: "uninstalled",
|
|
101
211
|
message: "Gateway service uninstalled."
|
|
102
212
|
});
|
|
103
213
|
} catch (err) {
|
|
104
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
105
214
|
log.error({ err }, "Failed to uninstall gateway service");
|
|
106
|
-
|
|
215
|
+
emitResult(options, {
|
|
107
216
|
ok: false,
|
|
108
|
-
error: `Failed to uninstall: ${
|
|
109
|
-
});
|
|
110
|
-
process.exit(1);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
async function checkAndWarnTokenDrift(service, options) {
|
|
114
|
-
try {
|
|
115
|
-
const command = await service.readCommand(process.env);
|
|
116
|
-
if (!command?.environment?.XOPC_GATEWAY_TOKEN) return;
|
|
117
|
-
const { loadConfig } = await import("../../../config/index.js");
|
|
118
|
-
const { resolveConfigPath } = await import("../../../config/paths.js");
|
|
119
|
-
const configToken = loadConfig(resolveConfigPath())?.gateway?.auth?.token;
|
|
120
|
-
if (configToken && command.environment.XOPC_GATEWAY_TOKEN !== configToken) {
|
|
121
|
-
const warning = "Token drift detected: service token differs from config. Run `xopc gateway service install --force` to sync.";
|
|
122
|
-
if (options.json) {} else console.warn(`⚠️ ${warning}`);
|
|
123
|
-
}
|
|
124
|
-
} catch {}
|
|
125
|
-
}
|
|
126
|
-
async function waitForHealthAfterRestart(service, timeoutMs, options) {
|
|
127
|
-
const { loadConfig } = await import("../../../config/index.js");
|
|
128
|
-
const { resolveConfigPath } = await import("../../../config/paths.js");
|
|
129
|
-
const port = loadConfig(resolveConfigPath())?.gateway?.port ?? 18790;
|
|
130
|
-
try {
|
|
131
|
-
const { waitForRestartHealth } = await import("./restart-health.js");
|
|
132
|
-
const snapshot = await waitForRestartHealth({
|
|
133
|
-
service,
|
|
134
|
-
port,
|
|
135
|
-
timeoutMs,
|
|
136
|
-
onProgress: (_snap) => {
|
|
137
|
-
if (!options.json) process.stdout.write(".");
|
|
138
|
-
}
|
|
139
|
-
});
|
|
140
|
-
if (!options.json) process.stdout.write("\n");
|
|
141
|
-
if (snapshot.healthy) outputResult(options, {
|
|
142
|
-
ok: true,
|
|
143
|
-
result: "healthy",
|
|
144
|
-
message: `Gateway restarted and healthy (pid ${snapshot.runtime?.pid ?? "unknown"}, ${snapshot.elapsedMs}ms).`
|
|
145
|
-
});
|
|
146
|
-
else {
|
|
147
|
-
outputResult(options, {
|
|
148
|
-
ok: false,
|
|
149
|
-
error: `Restart health check failed: ${snapshot.waitOutcome}`,
|
|
150
|
-
hints: ["Check logs with: xopc gateway logs"]
|
|
151
|
-
});
|
|
152
|
-
process.exit(1);
|
|
153
|
-
}
|
|
154
|
-
} catch (err) {
|
|
155
|
-
outputResult(options, {
|
|
156
|
-
ok: false,
|
|
157
|
-
error: `Health wait failed: ${err instanceof Error ? err.message : String(err)}`
|
|
217
|
+
error: `Failed to uninstall: ${String(err)}`
|
|
158
218
|
});
|
|
159
219
|
process.exit(1);
|
|
160
220
|
}
|
|
@@ -169,16 +229,7 @@ function parseWaitTimeout(wait) {
|
|
|
169
229
|
default: return value * 1e3;
|
|
170
230
|
}
|
|
171
231
|
}
|
|
172
|
-
function outputResult(options, output) {
|
|
173
|
-
if (options.json) console.log(JSON.stringify(output, null, 2));
|
|
174
|
-
else if (output.ok) {
|
|
175
|
-
if (output.message) console.log(`✅ ${output.message}`);
|
|
176
|
-
} else {
|
|
177
|
-
if (output.error) console.error(`❌ ${output.error}`);
|
|
178
|
-
if (output.hints) for (const hint of output.hints) console.log(`💡 ${hint}`);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
232
|
//#endregion
|
|
182
|
-
export {
|
|
233
|
+
export { executeDaemonUninstall, runServiceRestart, runServiceStop };
|
|
183
234
|
|
|
184
235
|
//# sourceMappingURL=lifecycle-core.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle-core.js","names":[],"sources":["../../../../../src/cli/commands/gateway/lifecycle-core.ts"],"sourcesContent":["/**\n * Daemon Lifecycle Core - Unified start/stop/restart/uninstall logic\n *\n * Entry point for all daemon lifecycle operations. Handles:\n * - Service resolution and availability checks\n * - Token drift detection\n * - Restart intent writing\n * - Health wait coordination\n * - JSON output mode\n */\n\nimport { createLogger } from '../../../utils/logger.js';\nimport type {\n DaemonLifecycleOptions,\n GatewayServiceRestartResult,\n} from '../../../daemon/types.js';\n\nconst log = createLogger('DaemonLifecycle');\n\n// ─── Stop ───\n\nexport async function executeDaemonStop(options: DaemonLifecycleOptions): Promise<void> {\n const { resolveGatewayService, isDaemonAvailableAsync } = await import(\n '../../../daemon/service.js'\n );\n\n const available = await isDaemonAvailableAsync();\n if (!available) {\n outputResult(options, { ok: false, error: 'Daemon service not available on this platform' });\n process.exit(1);\n }\n\n const service = await resolveGatewayService();\n const loaded = await service.isLoaded({ env: process.env });\n\n if (!loaded) {\n outputResult(options, {\n ok: true,\n result: 'not-running',\n message: `Gateway service ${service.notLoadedText}. Nothing to stop.`,\n });\n return;\n }\n\n try {\n await service.stop({ env: process.env, disable: options.disable });\n outputResult(options, {\n ok: true,\n result: 'stopped',\n message: options.disable\n ? 'Gateway stopped and disabled (will not respawn).'\n : 'Gateway stop signal sent.',\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n log.error({ err }, 'Failed to stop gateway');\n outputResult(options, { ok: false, error: `Failed to stop: ${message}` });\n process.exit(1);\n }\n}\n\n// ─── Restart ───\n\nexport async function executeDaemonRestart(options: DaemonLifecycleOptions): Promise<void> {\n const { resolveGatewayService, isDaemonAvailableAsync } = await import(\n '../../../daemon/service.js'\n );\n\n const available = await isDaemonAvailableAsync();\n if (!available) {\n outputResult(options, { ok: false, error: 'Daemon service not available on this platform' });\n process.exit(1);\n }\n\n const service = await resolveGatewayService();\n const loaded = await service.isLoaded({ env: process.env });\n\n if (!loaded) {\n outputResult(options, {\n ok: false,\n error: `Gateway service ${service.notLoadedText}. Install first with: xopc gateway service install`,\n hints: ['xopc gateway service install'],\n });\n process.exit(1);\n }\n\n // Token drift check\n await checkAndWarnTokenDrift(service, options);\n\n // Write restart intent\n const { writeGatewayRestartIntentSync } = await import('../../../infra/restart-intent.js');\n writeGatewayRestartIntentSync({ force: options.force });\n\n try {\n const result: GatewayServiceRestartResult = await service.restart({ env: process.env });\n\n // If --wait specified, wait for health\n if (options.wait) {\n const timeoutMs = parseWaitTimeout(options.wait);\n await waitForHealthAfterRestart(service, timeoutMs, options);\n } else {\n outputResult(options, {\n ok: true,\n result: result.outcome,\n message: `Gateway restart ${result.outcome}.`,\n });\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n log.error({ err }, 'Failed to restart gateway');\n outputResult(options, { ok: false, error: `Failed to restart: ${message}` });\n process.exit(1);\n } finally {\n // Clean up intent\n const { clearGatewayRestartIntentSync } = await import('../../../infra/restart-intent.js');\n clearGatewayRestartIntentSync();\n }\n}\n\n// ─── Uninstall ───\n\nexport async function executeDaemonUninstall(options: DaemonLifecycleOptions): Promise<void> {\n const { resolveGatewayService, isDaemonAvailableAsync } = await import(\n '../../../daemon/service.js'\n );\n\n const available = await isDaemonAvailableAsync();\n if (!available) {\n outputResult(options, { ok: false, error: 'Daemon service not available on this platform' });\n process.exit(1);\n }\n\n const service = await resolveGatewayService();\n\n try {\n await service.uninstall({ env: process.env });\n outputResult(options, {\n ok: true,\n result: 'uninstalled',\n message: 'Gateway service uninstalled.',\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n log.error({ err }, 'Failed to uninstall gateway service');\n outputResult(options, { ok: false, error: `Failed to uninstall: ${message}` });\n process.exit(1);\n }\n}\n\n// ─── Token Drift Check ───\n\nasync function checkAndWarnTokenDrift(\n service: { readCommand: (env?: Record<string, string | undefined>) => Promise<{ environment?: Record<string, string> } | null> },\n options: DaemonLifecycleOptions,\n): Promise<void> {\n try {\n const command = await service.readCommand(process.env);\n if (!command?.environment?.XOPC_GATEWAY_TOKEN) return;\n\n const { loadConfig } = await import('../../../config/index.js');\n const { resolveConfigPath } = await import('../../../config/paths.js');\n const config = loadConfig(resolveConfigPath());\n const configToken = config?.gateway?.auth?.token;\n\n if (configToken && command.environment.XOPC_GATEWAY_TOKEN !== configToken) {\n const warning =\n 'Token drift detected: service token differs from config. ' +\n 'Run `xopc gateway service install --force` to sync.';\n\n if (options.json) {\n // Will be included in output\n } else {\n console.warn(`⚠️ ${warning}`);\n }\n }\n } catch {\n // Best-effort; don't block restart on drift check failure\n }\n}\n\n// ─── Health Wait ───\n\nasync function waitForHealthAfterRestart(\n service: { readRuntime: (env?: Record<string, string | undefined>) => Promise<{ status: string; pid?: number }> },\n timeoutMs: number,\n options: DaemonLifecycleOptions,\n): Promise<void> {\n const { loadConfig } = await import('../../../config/index.js');\n const { resolveConfigPath } = await import('../../../config/paths.js');\n const config = loadConfig(resolveConfigPath());\n const port = config?.gateway?.port ?? 18790;\n\n try {\n const { waitForRestartHealth } = await import('./restart-health.js');\n const snapshot = await waitForRestartHealth({\n service: service as any,\n port,\n timeoutMs,\n onProgress: (_snap) => {\n if (!options.json) {\n process.stdout.write('.');\n }\n },\n });\n\n if (!options.json) {\n process.stdout.write('\\n');\n }\n\n if (snapshot.healthy) {\n outputResult(options, {\n ok: true,\n result: 'healthy',\n message: `Gateway restarted and healthy (pid ${snapshot.runtime?.pid ?? 'unknown'}, ${snapshot.elapsedMs}ms).`,\n });\n } else {\n outputResult(options, {\n ok: false,\n error: `Restart health check failed: ${snapshot.waitOutcome}`,\n hints: ['Check logs with: xopc gateway logs'],\n });\n process.exit(1);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n outputResult(options, {\n ok: false,\n error: `Health wait failed: ${message}`,\n });\n process.exit(1);\n }\n}\n\n// ─── Helpers ───\n\nfunction parseWaitTimeout(wait: string): number {\n const match = wait.match(/^(\\d+)(s|m|ms)?$/);\n if (!match) return 60_000;\n\n const value = parseInt(match[1], 10);\n const unit = match[2] || 's';\n\n switch (unit) {\n case 'ms': return value;\n case 'm': return value * 60_000;\n case 's':\n default: return value * 1000;\n }\n}\n\ninterface LifecycleOutput {\n ok: boolean;\n result?: string;\n message?: string;\n error?: string;\n hints?: string[];\n}\n\nfunction outputResult(options: DaemonLifecycleOptions, output: LifecycleOutput): void {\n if (options.json) {\n console.log(JSON.stringify(output, null, 2));\n } else if (output.ok) {\n if (output.message) {\n console.log(`✅ ${output.message}`);\n }\n } else {\n if (output.error) {\n console.error(`❌ ${output.error}`);\n }\n if (output.hints) {\n for (const hint of output.hints) {\n console.log(`💡 ${hint}`);\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lifecycle-core.js","names":[],"sources":["../../../../../src/cli/commands/gateway/lifecycle-core.ts"],"sourcesContent":["/**\n * Daemon lifecycle core — OpenClaw-aligned service start/stop/restart with onNotLoaded fallback.\n */\n\nimport { createLogger } from '../../../utils/logger.js';\nimport type {\n DaemonLifecycleOptions,\n GatewayService,\n} from '../../../daemon/types.js';\nimport {\n clearGatewayRestartIntentSync,\n writeGatewayRestartIntentSync,\n} from '../../../infra/restart.js';\n\nconst log = createLogger('DaemonLifecycle');\n\nexport type ServiceRecoveryResult = {\n result: 'started' | 'stopped' | 'restarted';\n message?: string;\n warnings?: string[];\n loaded?: boolean;\n};\n\ntype ServiceRecoveryContext = {\n json: boolean;\n fail: (message: string, hints?: string[], diagnostics?: string[], options?: DaemonLifecycleOptions) => void;\n};\n\ntype RestartPostCheckContext = {\n options: DaemonLifecycleOptions;\n fail: (message: string, hints?: string[], diagnostics?: string[], options?: DaemonLifecycleOptions) => void;\n};\n\nfunction emitResult(\n options: DaemonLifecycleOptions,\n payload: {\n ok: boolean;\n result?: string;\n message?: string;\n error?: string;\n hints?: string[];\n warnings?: string[];\n },\n): void {\n if (options.json) {\n console.log(JSON.stringify(payload, null, 2));\n return;\n }\n if (payload.ok) {\n if (payload.message) {\n console.log(`✅ ${payload.message}`);\n }\n for (const warning of payload.warnings ?? []) {\n console.warn(`⚠️ ${warning}`);\n }\n return;\n }\n if (payload.error) {\n console.error(`❌ ${payload.error}`);\n }\n for (const hint of payload.hints ?? []) {\n console.log(`💡 ${hint}`);\n }\n}\n\nfunction createFail(options: DaemonLifecycleOptions) {\n return (\n message: string,\n hints?: string[],\n diagnostics?: string[],\n opts: DaemonLifecycleOptions = options,\n ) => {\n emitResult(opts, { ok: false, error: message, hints });\n for (const line of diagnostics ?? []) {\n if (!opts.json) {\n console.log(` ${line}`);\n }\n }\n process.exit(1);\n };\n}\n\nasync function resolveServiceLoadedOrFail(\n service: GatewayService,\n fail: ServiceRecoveryContext['fail'],\n): Promise<boolean | null> {\n try {\n return await service.isLoaded({ env: process.env });\n } catch (err) {\n fail(`Gateway service check failed: ${String(err)}`);\n return null;\n }\n}\n\nasync function handleServiceNotLoaded(params: {\n service: GatewayService;\n renderStartHints: () => string[];\n options: DaemonLifecycleOptions;\n}): Promise<void> {\n emitResult(params.options, {\n ok: true,\n result: 'not-loaded',\n message: `Gateway service ${params.service.notLoadedText}.`,\n hints: params.renderStartHints(),\n });\n}\n\nasync function checkAndWarnTokenDrift(\n service: GatewayService,\n options: DaemonLifecycleOptions,\n): Promise<string[]> {\n const warnings: string[] = [];\n try {\n const command = await service.readCommand(process.env);\n const serviceToken = command?.environment?.XOPC_GATEWAY_TOKEN;\n if (!serviceToken) {\n return warnings;\n }\n const { loadConfig } = await import('../../../config/index.js');\n const { resolveConfigPath } = await import('../../../config/paths.js');\n const config = loadConfig(resolveConfigPath());\n const configToken = config?.gateway?.auth?.token;\n if (configToken && serviceToken !== configToken) {\n const warning =\n 'Token drift detected: service token differs from config. Run `xopc gateway service install --force` to sync.';\n warnings.push(warning);\n if (!options.json) {\n console.warn(`⚠️ ${warning}`);\n }\n }\n } catch {\n // Best-effort\n }\n return warnings;\n}\n\nexport async function runServiceStop(params: {\n service: GatewayService;\n opts?: DaemonLifecycleOptions;\n onNotLoaded?: (ctx: ServiceRecoveryContext) => Promise<ServiceRecoveryResult | null>;\n}): Promise<void> {\n const options = params.opts ?? {};\n const fail = createFail(options);\n const loaded = await resolveServiceLoadedOrFail(params.service, fail);\n if (loaded === null) {\n return;\n }\n\n if (!loaded) {\n try {\n const handled = await params.onNotLoaded?.({ json: Boolean(options.json), fail });\n if (handled) {\n emitResult(options, {\n ok: true,\n result: handled.result,\n message: handled.message,\n warnings: handled.warnings,\n });\n return;\n }\n } catch (err) {\n fail(`Gateway stop failed: ${String(err)}`);\n return;\n }\n await handleServiceNotLoaded({\n service: params.service,\n renderStartHints: () => ['xopc gateway service install', 'xopc gateway'],\n options,\n });\n return;\n }\n\n try {\n await params.service.stop({ env: process.env, disable: options.disable });\n emitResult(options, {\n ok: true,\n result: 'stopped',\n message: options.disable\n ? 'Gateway stopped and disabled (will not respawn).'\n : 'Gateway stop signal sent.',\n });\n } catch (err) {\n log.error({ err }, 'Failed to stop gateway');\n fail(`Gateway stop failed: ${String(err)}`);\n }\n}\n\nexport async function runServiceRestart(params: {\n service: GatewayService;\n opts?: DaemonLifecycleOptions;\n renderStartHints: () => string[];\n checkTokenDrift?: boolean;\n onNotLoaded?: (ctx: ServiceRecoveryContext) => Promise<ServiceRecoveryResult | null>;\n postRestartCheck?: (ctx: RestartPostCheckContext) => Promise<void>;\n}): Promise<void> {\n const options = params.opts ?? {};\n const fail = createFail(options);\n const warnings: string[] = [];\n let handledRecovery: ServiceRecoveryResult | null = null;\n\n const loaded = await resolveServiceLoadedOrFail(params.service, fail);\n if (loaded === null) {\n return;\n }\n\n if (!loaded) {\n try {\n handledRecovery = (await params.onNotLoaded?.({ json: Boolean(options.json), fail })) ?? null;\n } catch (err) {\n fail(`Gateway restart failed: ${String(err)}`);\n return;\n }\n if (!handledRecovery) {\n await handleServiceNotLoaded({\n service: params.service,\n renderStartHints: params.renderStartHints,\n options,\n });\n return;\n }\n if (handledRecovery.warnings?.length) {\n warnings.push(...handledRecovery.warnings);\n }\n }\n\n if (loaded && params.checkTokenDrift) {\n warnings.push(...(await checkAndWarnTokenDrift(params.service, options)));\n }\n\n try {\n if (loaded) {\n let wroteRestartIntent = false;\n const runtime = await params.service.readRuntime(process.env).catch(() => null);\n wroteRestartIntent = writeGatewayRestartIntentSync({ targetPid: runtime?.pid });\n try {\n await params.service.restart({ env: process.env });\n } catch (err) {\n if (wroteRestartIntent) {\n clearGatewayRestartIntentSync();\n }\n throw err;\n }\n }\n\n if (params.postRestartCheck) {\n await params.postRestartCheck({ options, fail });\n }\n\n if (options.wait) {\n const timeoutMs = parseWaitTimeout(options.wait);\n const { loadConfig } = await import('../../../config/index.js');\n const { resolveConfigPath } = await import('../../../config/paths.js');\n const config = loadConfig(resolveConfigPath());\n const port = typeof config.gateway?.port === 'number' ? config.gateway.port : 18790;\n const { waitForRestartHealth } = await import('./restart-health.js');\n const snapshot = await waitForRestartHealth({\n service: params.service,\n port,\n timeoutMs,\n onProgress: () => {\n if (!options.json) {\n process.stdout.write('.');\n }\n },\n });\n if (!options.json) {\n process.stdout.write('\\n');\n }\n if (!snapshot.healthy) {\n fail(`Restart health check failed: ${snapshot.waitOutcome ?? 'timeout'}`, [\n 'xopc gateway logs',\n ]);\n return;\n }\n emitResult(options, {\n ok: true,\n result: 'healthy',\n message: `Gateway restarted and healthy (pid ${snapshot.runtime?.pid ?? 'unknown'}, ${snapshot.elapsedMs ?? 0}ms).`,\n warnings: warnings.length ? warnings : undefined,\n });\n return;\n }\n\n emitResult(options, {\n ok: true,\n result: 'restarted',\n message: handledRecovery?.message ?? 'Gateway restart completed.',\n warnings: warnings.length ? warnings : undefined,\n });\n } catch (err) {\n log.error({ err }, 'Failed to restart gateway');\n fail(`Gateway restart failed: ${String(err)}`, params.renderStartHints());\n } finally {\n clearGatewayRestartIntentSync();\n }\n}\n\nexport async function executeDaemonUninstall(options: DaemonLifecycleOptions = {}): Promise<void> {\n const { resolveGatewayService, isDaemonAvailableAsync } = await import('../../../daemon/service.js');\n const available = await isDaemonAvailableAsync();\n if (!available) {\n emitResult(options, { ok: false, error: 'Daemon service not available on this platform' });\n process.exit(1);\n }\n const service = await resolveGatewayService();\n const loaded = await service.isLoaded({ env: process.env }).catch(() => false);\n if (loaded) {\n try {\n await service.stop({ env: process.env });\n } catch {\n // Best-effort\n }\n }\n try {\n await service.uninstall({ env: process.env });\n emitResult(options, { ok: true, result: 'uninstalled', message: 'Gateway service uninstalled.' });\n } catch (err) {\n log.error({ err }, 'Failed to uninstall gateway service');\n emitResult(options, { ok: false, error: `Failed to uninstall: ${String(err)}` });\n process.exit(1);\n }\n}\n\nfunction parseWaitTimeout(wait: string): number {\n const match = wait.match(/^(\\d+)(s|m|ms)?$/);\n if (!match) return 60_000;\n const value = parseInt(match[1], 10);\n const unit = match[2] || 's';\n switch (unit) {\n case 'ms':\n return value;\n case 'm':\n return value * 60_000;\n case 's':\n default:\n return value * 1000;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway lifecycle orchestration — OpenClaw-aligned service + unmanaged fallback.
|
|
3
|
+
*/
|
|
4
|
+
export declare function runDaemonStop(options?: {
|
|
5
|
+
json?: boolean;
|
|
6
|
+
disable?: boolean;
|
|
7
|
+
}): Promise<void>;
|
|
8
|
+
export declare function runDaemonRestart(options?: {
|
|
9
|
+
json?: boolean;
|
|
10
|
+
wait?: string;
|
|
11
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { init_paths, resolveConfigPath } from "../../../config/paths.js";
|
|
2
|
+
import { loadConfig } from "../../../config/loader.js";
|
|
3
|
+
import "../../../config/index.js";
|
|
4
|
+
import { isRestartEnabled } from "../../../config/commands.flags.js";
|
|
5
|
+
import { resolveGatewayService } from "../../../daemon/service.js";
|
|
6
|
+
import { authorizeGatewaySigusr1Restart } from "../../../infra/restart.js";
|
|
7
|
+
import { findVerifiedGatewayListenerPidsOnPortSync, formatGatewayPidList, signalVerifiedGatewayPidSync } from "../../../infra/gateway-processes.js";
|
|
8
|
+
import { runServiceRestart, runServiceStop } from "./lifecycle-core.js";
|
|
9
|
+
import { DEFAULT_RESTART_HEALTH_ATTEMPTS, renderGatewayPortHealthDiagnostics, waitForGatewayHealthyListener } from "./restart-health.js";
|
|
10
|
+
import { parsePortFromArgs, renderGatewayServiceStartHints, resolveGatewayPortFromConfig } from "./shared.js";
|
|
11
|
+
//#region src/cli/commands/gateway/lifecycle.ts
|
|
12
|
+
/**
|
|
13
|
+
* Gateway lifecycle orchestration — OpenClaw-aligned service + unmanaged fallback.
|
|
14
|
+
*/
|
|
15
|
+
init_paths();
|
|
16
|
+
const POST_RESTART_HEALTH_ATTEMPTS = DEFAULT_RESTART_HEALTH_ATTEMPTS;
|
|
17
|
+
const POST_RESTART_HEALTH_DELAY_MS = 500;
|
|
18
|
+
async function resolveGatewayLifecyclePort(service) {
|
|
19
|
+
return parsePortFromArgs((await (service ?? await resolveGatewayService()).readCommand(process.env).catch(() => null))?.programArguments) ?? resolveGatewayPortFromConfig();
|
|
20
|
+
}
|
|
21
|
+
function resolveVerifiedGatewayListenerPids(port) {
|
|
22
|
+
return findVerifiedGatewayListenerPidsOnPortSync(port).filter((pid) => Number.isFinite(pid) && pid > 0);
|
|
23
|
+
}
|
|
24
|
+
async function assertUnmanagedGatewayRestartEnabled(port) {
|
|
25
|
+
if (!isRestartEnabled(loadConfig(resolveConfigPath()))) throw new Error("Gateway restart is disabled in config (commands.restart=false); unmanaged SIGUSR1 restart would be ignored");
|
|
26
|
+
try {
|
|
27
|
+
const controller = new AbortController();
|
|
28
|
+
const timeout = setTimeout(() => controller.abort(), 1e3);
|
|
29
|
+
const response = await fetch(`http://127.0.0.1:${port}/api/health`, {
|
|
30
|
+
method: "GET",
|
|
31
|
+
signal: controller.signal
|
|
32
|
+
});
|
|
33
|
+
clearTimeout(timeout);
|
|
34
|
+
if (!response.ok) return;
|
|
35
|
+
} catch {}
|
|
36
|
+
}
|
|
37
|
+
async function stopGatewayWithoutServiceManager(port) {
|
|
38
|
+
const pids = resolveVerifiedGatewayListenerPids(port);
|
|
39
|
+
if (pids.length === 0) return null;
|
|
40
|
+
for (const pid of pids) signalVerifiedGatewayPidSync(pid, "SIGTERM");
|
|
41
|
+
return {
|
|
42
|
+
result: "stopped",
|
|
43
|
+
message: `Gateway stop signal sent to unmanaged process${pids.length === 1 ? "" : "es"} on port ${port}: ${formatGatewayPidList(pids)}.`
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
async function restartGatewayWithoutServiceManager(port) {
|
|
47
|
+
await assertUnmanagedGatewayRestartEnabled(port);
|
|
48
|
+
const pids = resolveVerifiedGatewayListenerPids(port);
|
|
49
|
+
if (pids.length === 0) return null;
|
|
50
|
+
if (pids.length > 1) throw new Error(`multiple gateway processes are listening on port ${port}: ${formatGatewayPidList(pids)}; use "xopc gateway status" before retrying restart`);
|
|
51
|
+
authorizeGatewaySigusr1Restart();
|
|
52
|
+
signalVerifiedGatewayPidSync(pids[0], "SIGUSR1");
|
|
53
|
+
return {
|
|
54
|
+
result: "restarted",
|
|
55
|
+
message: `Gateway restart signal sent to unmanaged process on port ${port}: ${pids[0]}.`
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async function runDaemonStop(options = {}) {
|
|
59
|
+
const service = await resolveGatewayService();
|
|
60
|
+
let gatewayPortPromise;
|
|
61
|
+
await runServiceStop({
|
|
62
|
+
service,
|
|
63
|
+
opts: options,
|
|
64
|
+
onNotLoaded: async () => {
|
|
65
|
+
gatewayPortPromise ??= resolveGatewayLifecyclePort(service);
|
|
66
|
+
return stopGatewayWithoutServiceManager(await gatewayPortPromise);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
async function runDaemonRestart(options = {}) {
|
|
71
|
+
const service = await resolveGatewayService();
|
|
72
|
+
let restartedWithoutServiceManager = false;
|
|
73
|
+
const restartPort = await resolveGatewayLifecyclePort(service);
|
|
74
|
+
const restartHealthAttempts = POST_RESTART_HEALTH_ATTEMPTS;
|
|
75
|
+
const restartWaitSeconds = Math.round(restartHealthAttempts * POST_RESTART_HEALTH_DELAY_MS / 1e3);
|
|
76
|
+
await runServiceRestart({
|
|
77
|
+
service,
|
|
78
|
+
opts: options,
|
|
79
|
+
renderStartHints: renderGatewayServiceStartHints,
|
|
80
|
+
checkTokenDrift: true,
|
|
81
|
+
onNotLoaded: async () => {
|
|
82
|
+
const handled = await restartGatewayWithoutServiceManager(restartPort);
|
|
83
|
+
if (handled) restartedWithoutServiceManager = true;
|
|
84
|
+
return handled;
|
|
85
|
+
},
|
|
86
|
+
postRestartCheck: async ({ options: opts, fail }) => {
|
|
87
|
+
if (!restartedWithoutServiceManager) return;
|
|
88
|
+
const health = await waitForGatewayHealthyListener({
|
|
89
|
+
port: restartPort,
|
|
90
|
+
attempts: restartHealthAttempts,
|
|
91
|
+
delayMs: POST_RESTART_HEALTH_DELAY_MS
|
|
92
|
+
});
|
|
93
|
+
if (health.healthy) return;
|
|
94
|
+
const diagnostics = renderGatewayPortHealthDiagnostics(health);
|
|
95
|
+
fail(`Gateway restart timed out after ${restartWaitSeconds}s waiting for health checks.`, ["xopc gateway status", "xopc doctor"], diagnostics, opts);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//#endregion
|
|
100
|
+
export { runDaemonRestart, runDaemonStop };
|
|
101
|
+
|
|
102
|
+
//# sourceMappingURL=lifecycle.js.map
|