@xopcai/xopc 0.0.82 → 0.0.84

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.
Files changed (740) hide show
  1. package/README.md +3 -1
  2. package/README.zh-CN.md +3 -1
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/feishu/src/outbound/media-load.js +2 -3
  5. package/dist/extensions/feishu/src/outbound/media-load.js.map +1 -1
  6. package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
  7. package/dist/extensions/telegram/src/config-schema.d.ts +6 -6
  8. package/dist/extensions/telegram/src/plugin.d.ts +1 -1
  9. package/dist/extensions/telegram/src/plugin.js +1 -1
  10. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  11. package/dist/extensions/telegram/xopc.extension.json +1 -1
  12. package/dist/extensions/weixin/src/api/api.js +3 -3
  13. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  14. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  15. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  16. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  17. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  18. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  19. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  20. package/dist/extensions/weixin/src/plugin.js +1 -1
  21. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  22. package/dist/gateway/static/root/assets/agents-tR-nNP04.js +222 -0
  23. package/dist/gateway/static/root/assets/{apps-page-pJ27dsqn.js → apps-page-BDw6SP-d.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-settings-DEFd-jj1.js +1 -0
  25. package/dist/gateway/static/root/assets/{channels-status-swr-D1KYmOmi.js → channels-status-swr-DI5FHdGe.js} +1 -1
  26. package/dist/gateway/static/root/assets/{cron-api-Y2wfSJVI.js → cron-api-BSqY8LwW.js} +1 -1
  27. package/dist/gateway/static/root/assets/{cron-page-B97KU_RG.js → cron-page-D7lVDjcR.js} +1 -1
  28. package/dist/gateway/static/root/assets/{dist-CboA_Css.js → dist-CqNMNhJM.js} +1 -1
  29. package/dist/gateway/static/root/assets/{extension-debug-page-DN_zNmpo.js → extension-debug-page-gf2L0kY_.js} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-page-BUXtOzv5.js → extension-page-CQo2Xsmg.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-settings-page-C2dX4KCW.js → extension-settings-page-CZf0WoZg.js} +1 -1
  32. package/dist/gateway/static/root/assets/fetch-2iRFmd3n.js +3 -0
  33. package/dist/gateway/static/root/assets/{field-primitives-B9rOLqdm.js → field-primitives-DTtlp-l8.js} +1 -1
  34. package/dist/gateway/static/root/assets/{heartbeat-config-api-DvfiRVrc.js → heartbeat-config-api-B0drdQEJ.js} +1 -1
  35. package/dist/gateway/static/root/assets/{index-DQuaMye9.js → index-0Gt3TG4j.js} +94 -85
  36. package/dist/gateway/static/root/assets/index-BuFldCsB.css +1 -0
  37. package/dist/gateway/static/root/assets/{logs-page-BQuBpHcc.js → logs-page-DMuORLfC.js} +1 -1
  38. package/dist/gateway/static/root/assets/sessions-page-_UO8g6NN.js +1 -0
  39. package/dist/gateway/static/root/assets/{settings-form-section-2Yu-FASs.js → settings-form-section-DkmHkknc.js} +1 -1
  40. package/dist/gateway/static/root/assets/settings-page-Cz8FoW_A.js +3 -0
  41. package/dist/gateway/static/root/assets/skills-page-HrUOxF7H.js +2 -0
  42. package/dist/gateway/static/root/assets/{theme-store-DnwYutiX.js → theme-store-D01dJt95.js} +1 -1
  43. package/dist/gateway/static/root/assets/{utils-D2Gn2qod.js → utils-BFwcR6pL.js} +1 -1
  44. package/dist/gateway/static/root/assets/voice-api-key-field-JF8-aqc5.js +1 -0
  45. package/dist/gateway/static/root/index.html +4 -4
  46. package/dist/package.js +1 -1
  47. package/dist/src/agent/agent-instance-gateway.d.ts +50 -0
  48. package/dist/src/agent/agent-instance-gateway.js +1 -0
  49. package/dist/src/agent/agent-manager.d.ts +20 -14
  50. package/dist/src/agent/agent-manager.js +74 -186
  51. package/dist/src/agent/agent-manager.js.map +1 -1
  52. package/dist/src/agent/background-review/coordinator.d.ts +61 -0
  53. package/dist/src/agent/background-review/coordinator.js +120 -0
  54. package/dist/src/agent/background-review/coordinator.js.map +1 -0
  55. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  56. package/dist/src/agent/child-agent-factory.d.ts +14 -0
  57. package/dist/src/agent/child-agent-factory.js +2 -8
  58. package/dist/src/agent/child-agent-factory.js.map +1 -1
  59. package/dist/src/agent/context/workspace-seed.js +3 -3
  60. package/dist/src/agent/embedded/index.d.ts +1 -2
  61. package/dist/src/agent/embedded/index.js +2 -3
  62. package/dist/src/agent/embedded/run-for-session.d.ts +2 -2
  63. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  64. package/dist/src/agent/embedded/runs.d.ts +32 -0
  65. package/dist/src/agent/embedded/runs.js +79 -19
  66. package/dist/src/agent/embedded/runs.js.map +1 -1
  67. package/dist/src/agent/embedded/session-manager-cache.d.ts +14 -0
  68. package/dist/src/agent/embedded/session-manager-cache.js +32 -11
  69. package/dist/src/agent/embedded/session-manager-cache.js.map +1 -1
  70. package/dist/src/agent/embedded/session-runner.d.ts +37 -7
  71. package/dist/src/agent/embedded/session-runner.js +184 -153
  72. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  73. package/dist/src/agent/embedded/session-tool-result-guard.d.ts +57 -9
  74. package/dist/src/agent/embedded/session-tool-result-guard.js +159 -67
  75. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  76. package/dist/src/agent/goals/goal-run-store.js +4 -4
  77. package/dist/src/agent/goals/persistent-goal-service.d.ts +84 -0
  78. package/dist/src/agent/goals/persistent-goal-service.js +139 -0
  79. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -0
  80. package/dist/src/agent/goals/post-turn.js +2 -2
  81. package/dist/src/agent/goals/state.d.ts +1 -1
  82. package/dist/src/agent/goals/state.js.map +1 -1
  83. package/dist/src/agent/image/load-image-media.js +1 -1
  84. package/dist/src/agent/inbound/inbound-loop.d.ts +77 -0
  85. package/dist/src/agent/inbound/inbound-loop.js +226 -0
  86. package/dist/src/agent/inbound/inbound-loop.js.map +1 -0
  87. package/dist/src/agent/inbound/turn-dispatcher.d.ts +80 -0
  88. package/dist/src/agent/inbound/turn-dispatcher.js +138 -0
  89. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -0
  90. package/dist/src/agent/ipc/bus.js +1 -1
  91. package/dist/src/agent/ipc/inbox.js +2 -2
  92. package/dist/src/agent/ipc/socket.js +1 -1
  93. package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -1
  94. package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
  95. package/dist/src/agent/lifecycle/manager.d.ts +1 -1
  96. package/dist/src/agent/lifecycle/manager.js.map +1 -1
  97. package/dist/src/agent/lifecycle/types.d.ts +1 -1
  98. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  99. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  100. package/dist/src/agent/memory/dreaming/events.js +1 -1
  101. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  102. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  103. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  104. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  105. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  106. package/dist/src/agent/memory/dreaming/utils.d.ts +12 -2
  107. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  108. package/dist/src/agent/memory/dreaming/utils.js.map +1 -1
  109. package/dist/src/agent/memory/index.js +3 -3
  110. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  111. package/dist/src/agent/memory/prefetch-coordinator.d.ts +37 -0
  112. package/dist/src/agent/memory/prefetch-coordinator.js +45 -0
  113. package/dist/src/agent/memory/prefetch-coordinator.js.map +1 -0
  114. package/dist/src/agent/messaging/command-handler.d.ts +5 -1
  115. package/dist/src/agent/messaging/command-handler.js +24 -96
  116. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  117. package/dist/src/agent/messaging/index.d.ts +1 -0
  118. package/dist/src/agent/messaging/index.js +2 -1
  119. package/dist/src/agent/messaging/message-router.d.ts +1 -1
  120. package/dist/src/agent/messaging/message-router.js.map +1 -1
  121. package/dist/src/agent/messaging/outbound-coordinator.d.ts +82 -0
  122. package/dist/src/agent/messaging/outbound-coordinator.js +123 -0
  123. package/dist/src/agent/messaging/outbound-coordinator.js.map +1 -0
  124. package/dist/src/agent/models/manager.js +1 -1
  125. package/dist/src/agent/orchestration/agent-event-handler.d.ts +36 -33
  126. package/dist/src/agent/orchestration/agent-event-handler.js +212 -174
  127. package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
  128. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +4 -4
  129. package/dist/src/agent/orchestration/agent-orchestrator.js +4 -8
  130. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  131. package/dist/src/agent/orchestration/index.d.ts +1 -1
  132. package/dist/src/agent/orchestration/index.js +2 -2
  133. package/dist/src/agent/prompt/service-prompt-builder.js +4 -4
  134. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  135. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  136. package/dist/src/agent/sandbox/path-policy.js +1 -1
  137. package/dist/src/agent/service/async-queue.d.ts +20 -0
  138. package/dist/src/agent/service/async-queue.js +53 -0
  139. package/dist/src/agent/service/async-queue.js.map +1 -0
  140. package/dist/src/agent/service/build-direct-message-content.d.ts +2 -2
  141. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  142. package/dist/src/agent/service/direct-turn-helpers.d.ts +70 -0
  143. package/dist/src/agent/service/direct-turn-helpers.js +90 -0
  144. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -0
  145. package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -3
  146. package/dist/src/agent/service/process-direct-one-shot.js +17 -34
  147. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  148. package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
  149. package/dist/src/agent/service/process-direct-streaming.js +122 -168
  150. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  151. package/dist/src/agent/service/webchat-tts.d.ts +2 -2
  152. package/dist/src/agent/service/webchat-tts.js +1 -1
  153. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  154. package/dist/src/agent/service.d.ts +62 -167
  155. package/dist/src/agent/service.js +177 -786
  156. package/dist/src/agent/service.js.map +1 -1
  157. package/dist/src/agent/session/index.d.ts +4 -0
  158. package/dist/src/agent/session/index.js +5 -1
  159. package/dist/src/agent/session/session-config-service.d.ts +68 -0
  160. package/dist/src/agent/session/session-config-service.js +172 -0
  161. package/dist/src/agent/session/session-config-service.js.map +1 -0
  162. package/dist/src/agent/session/session-context.d.ts +27 -19
  163. package/dist/src/agent/session/session-context.js +39 -24
  164. package/dist/src/agent/session/session-context.js.map +1 -1
  165. package/dist/src/agent/session/session-hydrator.d.ts +42 -0
  166. package/dist/src/agent/session/session-hydrator.js +66 -0
  167. package/dist/src/agent/session/session-hydrator.js.map +1 -0
  168. package/dist/src/agent/session/session-inspector.d.ts +80 -0
  169. package/dist/src/agent/session/session-inspector.js +119 -0
  170. package/dist/src/agent/session/session-inspector.js.map +1 -0
  171. package/dist/src/agent/session/session-state-bag.d.ts +83 -0
  172. package/dist/src/agent/session/session-state-bag.js +192 -0
  173. package/dist/src/agent/session/session-state-bag.js.map +1 -0
  174. package/dist/src/agent/skills/config.js +1 -1
  175. package/dist/src/agent/skills/hub-hash.js +2 -2
  176. package/dist/src/agent/skills/hub-lock.js +1 -1
  177. package/dist/src/agent/skills/hub-pull.js +2 -2
  178. package/dist/src/agent/skills/index.d.ts +0 -2
  179. package/dist/src/agent/skills/index.js +3 -5
  180. package/dist/src/agent/skills/index.js.map +1 -1
  181. package/dist/src/agent/skills/managed-store.js +1 -1
  182. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -6
  183. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
  184. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +35 -7
  185. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  186. package/dist/src/agent/skills/scanner.js +1 -1
  187. package/dist/src/agent/skills/skill-manage-ops.js +2 -2
  188. package/dist/src/agent/skills/skill-manager.js +1 -1
  189. package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +7 -0
  190. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +37 -0
  191. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  192. package/dist/src/agent/tools/delegate-tool.d.ts +7 -0
  193. package/dist/src/agent/tools/delegate-tool.js +2 -1
  194. package/dist/src/agent/tools/delegate-tool.js.map +1 -1
  195. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  196. package/dist/src/agent/tools/executor.d.ts +34 -15
  197. package/dist/src/agent/tools/executor.js +44 -79
  198. package/dist/src/agent/tools/executor.js.map +1 -1
  199. package/dist/src/agent/tools/factory.d.ts +6 -0
  200. package/dist/src/agent/tools/factory.js +63 -4
  201. package/dist/src/agent/tools/factory.js.map +1 -1
  202. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  203. package/dist/src/agent/tools/send-media.js +1 -1
  204. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  205. package/dist/src/agent/tools/skills-tools.js +1 -1
  206. package/dist/src/agent/tools/tts-tool.js +1 -1
  207. package/dist/src/agent/tools/write.js +1 -1
  208. package/dist/src/agent/workspace-runtime/registry.d.ts +48 -0
  209. package/dist/src/agent/workspace-runtime/registry.js +59 -0
  210. package/dist/src/agent/workspace-runtime/registry.js.map +1 -0
  211. package/dist/src/auth/credentials.js +3 -3
  212. package/dist/src/auth/profiles/store.js +1 -1
  213. package/dist/src/auth/sync-provider-auth.js +1 -1
  214. package/dist/src/browser/cdp-local-launcher.js +4 -3
  215. package/dist/src/browser/cdp-local-launcher.js.map +1 -1
  216. package/dist/src/browser/index.d.ts +1 -0
  217. package/dist/src/browser/index.js +2 -1
  218. package/dist/src/browser/manager.js +3 -2
  219. package/dist/src/browser/manager.js.map +1 -1
  220. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  221. package/dist/src/browser/providers/browser-use.js +2 -1
  222. package/dist/src/browser/providers/browser-use.js.map +1 -1
  223. package/dist/src/browser/providers/browserbase.js +2 -1
  224. package/dist/src/browser/providers/browserbase.js.map +1 -1
  225. package/dist/src/browser/providers/cloakbrowser.js +7 -6
  226. package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
  227. package/dist/src/browser/providers/playwright-doctor.d.ts +2 -0
  228. package/dist/src/browser/providers/playwright-doctor.js +7 -3
  229. package/dist/src/browser/providers/playwright-doctor.js.map +1 -1
  230. package/dist/src/browser/readiness.d.ts +33 -0
  231. package/dist/src/browser/readiness.js +138 -0
  232. package/dist/src/browser/readiness.js.map +1 -0
  233. package/dist/src/browser/stealth.js +2 -2
  234. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  235. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  236. package/dist/src/channels/channel-domain.d.ts +1 -1
  237. package/dist/src/channels/config-helpers.d.ts +1 -1
  238. package/dist/src/channels/config-helpers.js.map +1 -1
  239. package/dist/src/channels/heartbeat-scheduler.d.ts +40 -0
  240. package/dist/src/channels/heartbeat-scheduler.js +94 -0
  241. package/dist/src/channels/heartbeat-scheduler.js.map +1 -0
  242. package/dist/src/channels/lifecycle-supervisor.d.ts +81 -0
  243. package/dist/src/channels/lifecycle-supervisor.js +263 -0
  244. package/dist/src/channels/lifecycle-supervisor.js.map +1 -0
  245. package/dist/src/channels/manager.d.ts +34 -68
  246. package/dist/src/channels/manager.js +107 -477
  247. package/dist/src/channels/manager.js.map +1 -1
  248. package/dist/src/channels/outbound/deliver.d.ts +1 -1
  249. package/dist/src/channels/outbound/deliver.js.map +1 -1
  250. package/dist/src/channels/outbound/persist-store.js +1 -1
  251. package/dist/src/channels/outbound-sender.d.ts +51 -0
  252. package/dist/src/channels/outbound-sender.js +125 -0
  253. package/dist/src/channels/outbound-sender.js.map +1 -0
  254. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  255. package/dist/src/channels/pairing/pairing-service.d.ts +3 -10
  256. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  257. package/dist/src/channels/pairing/pairing-store.js +2 -2
  258. package/dist/src/channels/pairing/pairing-types.d.ts +15 -0
  259. package/dist/src/channels/pairing/pairing-types.js +1 -0
  260. package/dist/src/channels/plugin-registry.d.ts +22 -0
  261. package/dist/src/channels/plugin-registry.js +44 -0
  262. package/dist/src/channels/plugin-registry.js.map +1 -0
  263. package/dist/src/channels/plugin-types.d.ts +1 -1
  264. package/dist/src/channels/plugins/types.adapters.d.ts +2 -2
  265. package/dist/src/channels/security-helpers.d.ts +1 -1
  266. package/dist/src/channels/security-helpers.js.map +1 -1
  267. package/dist/src/channels/setup-wizard.d.ts +1 -1
  268. package/dist/src/chat-commands/builtins/config.js +2 -2
  269. package/dist/src/chat-commands/context.js +1 -1
  270. package/dist/src/cli/command-catalog.js +110 -8
  271. package/dist/src/cli/command-catalog.js.map +1 -1
  272. package/dist/src/cli/command-loaders.js +2 -0
  273. package/dist/src/cli/command-loaders.js.map +1 -1
  274. package/dist/src/cli/command-manifest.js +9 -1
  275. package/dist/src/cli/command-manifest.js.map +1 -1
  276. package/dist/src/cli/commands/agent/stream-renderer.js +1 -1
  277. package/dist/src/cli/commands/agent/stream-renderer.js.map +1 -1
  278. package/dist/src/cli/commands/agent.js +4 -4
  279. package/dist/src/cli/commands/agent.js.map +1 -1
  280. package/dist/src/cli/commands/browser-cli-helpers.js +2 -1
  281. package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
  282. package/dist/src/cli/commands/config.js +70 -19
  283. package/dist/src/cli/commands/config.js.map +1 -1
  284. package/dist/src/cli/commands/cron-cli.d.ts +2 -0
  285. package/dist/src/cli/commands/cron-cli.js +15 -0
  286. package/dist/src/cli/commands/cron-cli.js.map +1 -0
  287. package/dist/src/cli/commands/cron.d.ts +4 -1
  288. package/dist/src/cli/commands/cron.js +76 -41
  289. package/dist/src/cli/commands/cron.js.map +1 -1
  290. package/dist/src/cli/commands/doctor/checks/channel-config.js +1 -1
  291. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  292. package/dist/src/cli/commands/doctor/checks/config-health.js +2 -2
  293. package/dist/src/cli/commands/doctor/checks/config-health.js.map +1 -1
  294. package/dist/src/cli/commands/doctor/checks/cron-health.js +1 -1
  295. package/dist/src/cli/commands/doctor/checks/cron-health.js.map +1 -1
  296. package/dist/src/cli/commands/doctor/checks/gateway-health.js +2 -2
  297. package/dist/src/cli/commands/doctor/checks/gateway-health.js.map +1 -1
  298. package/dist/src/cli/commands/doctor/checks/gateway-service.js +2 -2
  299. package/dist/src/cli/commands/doctor/checks/gateway-service.js.map +1 -1
  300. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  301. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  302. package/dist/src/cli/commands/doctor/checks/state-integrity.js +2 -2
  303. package/dist/src/cli/commands/doctor/checks/state-integrity.js.map +1 -1
  304. package/dist/src/cli/commands/doctor/checks/workspace-status.js +4 -4
  305. package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +1 -1
  306. package/dist/src/cli/commands/extension-dev.js +2 -2
  307. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  308. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  309. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  310. package/dist/src/cli/commands/extension-pack.js +1 -1
  311. package/dist/src/cli/commands/gateway/call.js +1 -1
  312. package/dist/src/cli/commands/gateway/call.js.map +1 -1
  313. package/dist/src/cli/commands/gateway/health.js +1 -1
  314. package/dist/src/cli/commands/gateway/health.js.map +1 -1
  315. package/dist/src/cli/commands/gateway/index.d.ts +1 -1
  316. package/dist/src/cli/commands/gateway/index.js +2 -2
  317. package/dist/src/cli/commands/gateway/lifecycle-core.d.ts +31 -12
  318. package/dist/src/cli/commands/gateway/lifecycle-core.js +167 -116
  319. package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
  320. package/dist/src/cli/commands/gateway/lifecycle.d.ts +11 -0
  321. package/dist/src/cli/commands/gateway/lifecycle.js +102 -0
  322. package/dist/src/cli/commands/gateway/lifecycle.js.map +1 -0
  323. package/dist/src/cli/commands/gateway/logs.js +1 -1
  324. package/dist/src/cli/commands/gateway/logs.js.map +1 -1
  325. package/dist/src/cli/commands/gateway/probe.js +1 -1
  326. package/dist/src/cli/commands/gateway/probe.js.map +1 -1
  327. package/dist/src/cli/commands/gateway/restart-health.d.ts +12 -0
  328. package/dist/src/cli/commands/gateway/restart-health.js +45 -1
  329. package/dist/src/cli/commands/gateway/restart-health.js.map +1 -1
  330. package/dist/src/cli/commands/gateway/restart.js +3 -3
  331. package/dist/src/cli/commands/gateway/restart.js.map +1 -1
  332. package/dist/src/cli/commands/gateway/run-foreground.d.ts +0 -1
  333. package/dist/src/cli/commands/gateway/run-foreground.js +0 -35
  334. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  335. package/dist/src/cli/commands/gateway/service.d.ts +4 -0
  336. package/dist/src/cli/commands/gateway/service.js +18 -3
  337. package/dist/src/cli/commands/gateway/service.js.map +1 -1
  338. package/dist/src/cli/commands/gateway/shared.d.ts +3 -0
  339. package/dist/src/cli/commands/gateway/shared.js +54 -0
  340. package/dist/src/cli/commands/gateway/shared.js.map +1 -0
  341. package/dist/src/cli/commands/gateway/status.js +1 -1
  342. package/dist/src/cli/commands/gateway/status.js.map +1 -1
  343. package/dist/src/cli/commands/gateway/stop.js +2 -2
  344. package/dist/src/cli/commands/gateway/stop.js.map +1 -1
  345. package/dist/src/cli/commands/gateway/subcommands.js +1 -4
  346. package/dist/src/cli/commands/gateway/subcommands.js.map +1 -1
  347. package/dist/src/cli/commands/gateway/token.js +1 -1
  348. package/dist/src/cli/commands/gateway/token.js.map +1 -1
  349. package/dist/src/cli/commands/gateway.js +5 -5
  350. package/dist/src/cli/commands/gateway.js.map +1 -1
  351. package/dist/src/cli/commands/image.js +2 -2
  352. package/dist/src/cli/commands/image.js.map +1 -1
  353. package/dist/src/cli/commands/init.js +31 -4
  354. package/dist/src/cli/commands/init.js.map +1 -1
  355. package/dist/src/cli/commands/models.d.ts +4 -1
  356. package/dist/src/cli/commands/models.js +87 -75
  357. package/dist/src/cli/commands/models.js.map +1 -1
  358. package/dist/src/cli/commands/onboard/gateway.d.ts +0 -8
  359. package/dist/src/cli/commands/onboard/gateway.js +48 -49
  360. package/dist/src/cli/commands/onboard/gateway.js.map +1 -1
  361. package/dist/src/cli/commands/onboard.js +11 -64
  362. package/dist/src/cli/commands/onboard.js.map +1 -1
  363. package/dist/src/cli/commands/profile.d.ts +3 -5
  364. package/dist/src/cli/commands/profile.js +31 -31
  365. package/dist/src/cli/commands/profile.js.map +1 -1
  366. package/dist/src/cli/commands/session/utils.js +1 -1
  367. package/dist/src/cli/commands/session/utils.js.map +1 -1
  368. package/dist/src/cli/commands/setup.js +6 -1
  369. package/dist/src/cli/commands/setup.js.map +1 -1
  370. package/dist/src/cli/commands/skills.js +1 -1
  371. package/dist/src/cli/commands/tailscale.js +1 -1
  372. package/dist/src/cli/commands/tailscale.js.map +1 -1
  373. package/dist/src/cli/context.d.ts +20 -0
  374. package/dist/src/cli/context.js +23 -0
  375. package/dist/src/cli/context.js.map +1 -0
  376. package/dist/src/cli/extension-cli-register.js +3 -3
  377. package/dist/src/cli/gateway-run-argv.js +16 -9
  378. package/dist/src/cli/gateway-run-argv.js.map +1 -1
  379. package/dist/src/cli/gateway-run-fast-path.js +1 -1
  380. package/dist/src/cli/gateway-run-fast-path.js.map +1 -1
  381. package/dist/src/cli/index.d.ts +1 -7
  382. package/dist/src/cli/index.js +4 -6
  383. package/dist/src/cli/index.js.map +1 -1
  384. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  385. package/dist/src/config/commands.flags.d.ts +3 -0
  386. package/dist/src/config/commands.flags.js +11 -0
  387. package/dist/src/config/commands.flags.js.map +1 -0
  388. package/dist/src/config/index.d.ts +1 -0
  389. package/dist/src/config/index.js +6 -5
  390. package/dist/src/config/index.js.map +1 -1
  391. package/dist/src/config/loader.js +2 -2
  392. package/dist/src/config/models-json.js +2 -2
  393. package/dist/src/config/profile.js +2 -2
  394. package/dist/src/config/schema.d.ts +11 -4
  395. package/dist/src/config/schema.js +13 -12
  396. package/dist/src/config/schema.js.map +1 -1
  397. package/dist/src/config/workspace-path-helpers.d.ts +15 -0
  398. package/dist/src/config/workspace-path-helpers.js +14 -0
  399. package/dist/src/config/workspace-path-helpers.js.map +1 -0
  400. package/dist/src/cron/executor.js +4 -4
  401. package/dist/src/cron/executor.js.map +1 -1
  402. package/dist/src/cron/persistence.js +1 -1
  403. package/dist/src/cron/run-log-store.js +1 -1
  404. package/dist/src/daemon/index.d.ts +0 -1
  405. package/dist/src/daemon/index.js +1 -2
  406. package/dist/src/daemon/install-plan.js +3 -2
  407. package/dist/src/daemon/install-plan.js.map +1 -1
  408. package/dist/src/daemon/launchd.js +2 -2
  409. package/dist/src/daemon/systemd.js +2 -2
  410. package/dist/src/daemon/types.d.ts +0 -6
  411. package/dist/src/extensions/api.d.ts +1 -1
  412. package/dist/src/extensions/api.js +2 -2
  413. package/dist/src/extensions/api.js.map +1 -1
  414. package/dist/src/extensions/bundle-mcp.js +1 -1
  415. package/dist/src/extensions/discover-extensions.js +1 -1
  416. package/dist/src/extensions/extension-registry-impl.d.ts +51 -0
  417. package/dist/src/extensions/extension-registry-impl.js +117 -0
  418. package/dist/src/extensions/extension-registry-impl.js.map +1 -0
  419. package/dist/src/extensions/health.js +1 -1
  420. package/dist/src/extensions/index.js +3 -2
  421. package/dist/src/extensions/loader.d.ts +3 -43
  422. package/dist/src/extensions/loader.js +3 -110
  423. package/dist/src/extensions/loader.js.map +1 -1
  424. package/dist/src/extensions/lockfile.js +2 -2
  425. package/dist/src/extensions/sdk/index.js +2 -1
  426. package/dist/src/extensions/sdk/index.js.map +1 -1
  427. package/dist/src/extensions/types/events.d.ts +7 -1
  428. package/dist/src/gateway/agents-admin.js +2 -2
  429. package/dist/src/gateway/file-path-classifier.js +2 -2
  430. package/dist/src/gateway/heartbeat/service.js +1 -1
  431. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  432. package/dist/src/gateway/hono/app.js +5 -53
  433. package/dist/src/gateway/hono/app.js.map +1 -1
  434. package/dist/src/gateway/hono/lib/extension-store.js +1 -1
  435. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  436. package/dist/src/gateway/hono/middleware/auth.d.ts +5 -14
  437. package/dist/src/gateway/hono/middleware/auth.js +89 -126
  438. package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
  439. package/dist/src/gateway/hono/middleware/logger.js +1 -1
  440. package/dist/src/gateway/hono/middleware/logger.js.map +1 -1
  441. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +14 -0
  442. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +62 -0
  443. package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -0
  444. package/dist/src/gateway/hono/oauth.js +1 -1
  445. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +4 -4
  446. package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
  447. package/dist/src/gateway/hono/routes/browser.d.ts +20 -0
  448. package/dist/src/gateway/hono/routes/browser.js +626 -0
  449. package/dist/src/gateway/hono/routes/browser.js.map +1 -0
  450. package/dist/src/gateway/hono/routes/commands-skills.js +13 -13
  451. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  452. package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +18 -0
  453. package/dist/src/gateway/hono/routes/config-patch/agents.js +418 -0
  454. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -0
  455. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +12 -0
  456. package/dist/src/gateway/hono/routes/config-patch/channels.js +186 -0
  457. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -0
  458. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +18 -0
  459. package/dist/src/gateway/hono/routes/config-patch/gateway.js +264 -0
  460. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -0
  461. package/dist/src/gateway/hono/routes/config-patch/index.d.ts +9 -0
  462. package/dist/src/gateway/hono/routes/config-patch/index.js +6 -0
  463. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +23 -0
  464. package/dist/src/gateway/hono/routes/config-patch/misc.js +139 -0
  465. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -0
  466. package/dist/src/gateway/hono/routes/config-patch/result.d.ts +18 -0
  467. package/dist/src/gateway/hono/routes/config-patch/result.js +13 -0
  468. package/dist/src/gateway/hono/routes/config-patch/result.js.map +1 -0
  469. package/dist/src/gateway/hono/routes/config.js +20 -1764
  470. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  471. package/dist/src/gateway/hono/routes/dreaming.js +2 -3
  472. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  473. package/dist/src/gateway/hono/routes/host-fs.js +1 -1
  474. package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -5
  475. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  476. package/dist/src/gateway/hono/routes/mcp.js +1 -2
  477. package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
  478. package/dist/src/gateway/hono/routes/models.js +1 -1
  479. package/dist/src/gateway/hono/routes/sessions.js +32 -32
  480. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  481. package/dist/src/gateway/hono/routes/shares.js +4 -4
  482. package/dist/src/gateway/hono/routes/shares.js.map +1 -1
  483. package/dist/src/gateway/hono/routes/tunnel.js +1 -1
  484. package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
  485. package/dist/src/gateway/hono/routes/workspace.js +6 -7
  486. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  487. package/dist/src/gateway/hono/sse.js +2 -2
  488. package/dist/src/gateway/index.d.ts +1 -1
  489. package/dist/src/gateway/index.js +4 -2
  490. package/dist/src/gateway/lock.js +3 -3
  491. package/dist/src/gateway/rate-limit/auth-policy.d.ts +34 -0
  492. package/dist/src/gateway/rate-limit/auth-policy.js +49 -0
  493. package/dist/src/gateway/rate-limit/auth-policy.js.map +1 -0
  494. package/dist/src/gateway/rate-limit/buckets.d.ts +63 -0
  495. package/dist/src/gateway/rate-limit/buckets.js +143 -0
  496. package/dist/src/gateway/rate-limit/buckets.js.map +1 -0
  497. package/dist/src/gateway/rate-limit/env-flags.d.ts +13 -0
  498. package/dist/src/gateway/rate-limit/env-flags.js +16 -0
  499. package/dist/src/gateway/rate-limit/env-flags.js.map +1 -0
  500. package/dist/src/gateway/rate-limit/index.d.ts +3 -0
  501. package/dist/src/gateway/rate-limit/index.js +4 -0
  502. package/dist/src/gateway/run-loop.d.ts +1 -1
  503. package/dist/src/gateway/run-loop.js +24 -4
  504. package/dist/src/gateway/run-loop.js.map +1 -1
  505. package/dist/src/gateway/runtime-config.js +2 -1
  506. package/dist/src/gateway/runtime-config.js.map +1 -1
  507. package/dist/src/gateway/security/audit.js +2 -1
  508. package/dist/src/gateway/security/audit.js.map +1 -1
  509. package/dist/src/gateway/security/index.d.ts +0 -1
  510. package/dist/src/gateway/security/index.js +1 -2
  511. package/dist/src/gateway/security/loopback.d.ts +13 -0
  512. package/dist/src/gateway/security/loopback.js +45 -0
  513. package/dist/src/gateway/security/loopback.js.map +1 -0
  514. package/dist/src/gateway/service/agent-runner.d.ts +108 -0
  515. package/dist/src/gateway/service/agent-runner.js +184 -0
  516. package/dist/src/gateway/service/agent-runner.js.map +1 -0
  517. package/dist/src/gateway/service/config-coordinator.d.ts +119 -0
  518. package/dist/src/gateway/service/config-coordinator.js +351 -0
  519. package/dist/src/gateway/service/config-coordinator.js.map +1 -0
  520. package/dist/src/gateway/service/marketplace-service.d.ts +85 -0
  521. package/dist/src/gateway/service/marketplace-service.js +239 -0
  522. package/dist/src/gateway/service/marketplace-service.js.map +1 -0
  523. package/dist/src/gateway/service/run-gateway-agent.js +5 -5
  524. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  525. package/dist/src/gateway/service/sessions-api.d.ts +125 -0
  526. package/dist/src/gateway/service/sessions-api.js +135 -0
  527. package/dist/src/gateway/service/sessions-api.js.map +1 -0
  528. package/dist/src/gateway/service.d.ts +30 -360
  529. package/dist/src/gateway/service.js +122 -904
  530. package/dist/src/gateway/service.js.map +1 -1
  531. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  532. package/dist/src/gateway/workspace-heartbeat-path.js +1 -2
  533. package/dist/src/gateway/workspace-heartbeat-path.js.map +1 -1
  534. package/dist/src/infra/gateway-process-argv.d.ts +4 -0
  535. package/dist/src/infra/gateway-process-argv.js +26 -0
  536. package/dist/src/infra/gateway-process-argv.js.map +1 -0
  537. package/dist/src/infra/gateway-processes.d.ts +5 -0
  538. package/dist/src/infra/gateway-processes.js +65 -0
  539. package/dist/src/infra/gateway-processes.js.map +1 -0
  540. package/dist/src/infra/rate-limit/failure-limiter.d.ts +50 -0
  541. package/dist/src/infra/rate-limit/failure-limiter.js +100 -0
  542. package/dist/src/infra/rate-limit/failure-limiter.js.map +1 -0
  543. package/dist/src/infra/rate-limit/index.d.ts +5 -0
  544. package/dist/src/infra/rate-limit/index.js +3 -0
  545. package/dist/src/infra/rate-limit/keyed-store.d.ts +34 -0
  546. package/dist/src/infra/rate-limit/keyed-store.js +44 -0
  547. package/dist/src/infra/rate-limit/keyed-store.js.map +1 -0
  548. package/dist/src/infra/rate-limit/rate-limiter.d.ts +39 -0
  549. package/dist/src/infra/rate-limit/rate-limiter.js +65 -0
  550. package/dist/src/infra/rate-limit/rate-limiter.js.map +1 -0
  551. package/dist/src/infra/restart.d.ts +21 -0
  552. package/dist/src/infra/restart.js +122 -0
  553. package/dist/src/infra/restart.js.map +1 -0
  554. package/dist/src/infra/update-check.js +1 -1
  555. package/dist/src/infra/update-lock.js +3 -3
  556. package/dist/src/infra/update-runner.js +1 -1
  557. package/dist/src/infra/update-startup.js +2 -2
  558. package/dist/src/infra/write-file-atomic.js +2 -2
  559. package/dist/src/mcp/channel-bridge.d.ts +0 -6
  560. package/dist/src/mcp/channel-bridge.js +1 -5
  561. package/dist/src/mcp/channel-bridge.js.map +1 -1
  562. package/dist/src/media-shared/http/ssrf-guard.js +1 -1
  563. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  564. package/dist/src/providers/index.js +2 -2
  565. package/dist/src/providers/model-registry.js +1 -1
  566. package/dist/src/session/config-store.js +2 -2
  567. package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
  568. package/dist/src/session/parity/sessions-json-file-read.d.ts +2 -1
  569. package/dist/src/session/parity/sessions-json-file-read.js.map +1 -1
  570. package/dist/src/session/parity/sessions-json-file.js +1 -1
  571. package/dist/src/session/parity/transcript-file-lock.js +2 -2
  572. package/dist/src/session/parity/transcript-paths.js +1 -1
  573. package/dist/src/session/search-index-cache.js +1 -1
  574. package/dist/src/session/search-index.js +1 -1
  575. package/dist/src/session/session-title.js +1 -1
  576. package/dist/src/session/store.js +5 -5
  577. package/dist/src/share/share-rate-limit.d.ts +10 -2
  578. package/dist/src/share/share-rate-limit.js +33 -42
  579. package/dist/src/share/share-rate-limit.js.map +1 -1
  580. package/dist/src/share/share-store.js +3 -3
  581. package/dist/src/tui/backends/embedded-backend.js +16 -12
  582. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  583. package/dist/src/tui/clipboard-image.js +2 -2
  584. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  585. package/dist/src/tui/format-tui-hotkeys.js +1 -1
  586. package/dist/src/tui/theme-manager.js +1 -1
  587. package/dist/src/tui/tui-keybindings-file.js +1 -1
  588. package/dist/src/tui/tui-scoped-models.js +1 -1
  589. package/dist/src/tui/tui-settings.js +1 -1
  590. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  591. package/dist/src/tui/tui.js +1 -2
  592. package/dist/src/tui/tui.js.map +1 -1
  593. package/dist/src/tui/xopc-tui-keybindings.d.ts +0 -1
  594. package/dist/src/tui/xopc-tui-keybindings.js +1 -2
  595. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  596. package/dist/src/tunnel/frpc-binary.js +2 -2
  597. package/dist/src/tunnel/frpc-config.js +1 -1
  598. package/dist/src/tunnel/frpc-extract.js +1 -1
  599. package/dist/src/tunnel/pairing-rate-limit.d.ts +10 -2
  600. package/dist/src/tunnel/pairing-rate-limit.js +19 -15
  601. package/dist/src/tunnel/pairing-rate-limit.js.map +1 -1
  602. package/dist/src/tunnel/tunnel-rate-limit.d.ts +6 -3
  603. package/dist/src/tunnel/tunnel-rate-limit.js +11 -22
  604. package/dist/src/tunnel/tunnel-rate-limit.js.map +1 -1
  605. package/dist/src/tunnel/tunnel-state.js +1 -1
  606. package/dist/src/utils/logger/audit.js +1 -1
  607. package/dist/src/utils/logger/log-store.js +1 -1
  608. package/dist/src/utils/logger/rotation.js +1 -1
  609. package/dist/src/utils/logger/stats.d.ts +1 -1
  610. package/dist/src/voice/tts/audio.js +1 -1
  611. package/dist/src/voice/tts/factory.js +1 -1
  612. package/dist/src/voice/tts/index.js +2 -2
  613. package/dist/src/voice/tts/merge-config.js +1 -1
  614. package/dist/src/voice/tts/providers/edge-speech.js +1 -1
  615. package/dist/src/voice/tts/service.js +1 -1
  616. package/dist/src/voice/tts/service.js.map +1 -1
  617. package/dist/src/voice/tts/speak-core.js +1 -1
  618. package/package.json +10 -5
  619. package/dist/gateway/static/root/assets/agents-Cqh1ts38.js +0 -222
  620. package/dist/gateway/static/root/assets/channels-settings-wTiWStg9.js +0 -1
  621. package/dist/gateway/static/root/assets/fetch-BAAh_kXG.js +0 -3
  622. package/dist/gateway/static/root/assets/index-C8yHX-AA.css +0 -1
  623. package/dist/gateway/static/root/assets/sessions-page-BeiFm0Ms.js +0 -1
  624. package/dist/gateway/static/root/assets/settings-page-RPAz_Wg_.js +0 -3
  625. package/dist/gateway/static/root/assets/skills-page-Wu4aNWDx.js +0 -2
  626. package/dist/gateway/static/root/assets/voice-api-key-field-BxIGhhEL.js +0 -1
  627. package/dist/src/agent/embedded/session-raw-append-message.d.ts +0 -11
  628. package/dist/src/agent/embedded/session-raw-append-message.js +0 -15
  629. package/dist/src/agent/embedded/session-raw-append-message.js.map +0 -1
  630. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.d.ts +0 -15
  631. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js +0 -24
  632. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js.map +0 -1
  633. package/dist/src/agent/embedded/session-tool-result-state.d.ts +0 -17
  634. package/dist/src/agent/embedded/session-tool-result-state.js +0 -26
  635. package/dist/src/agent/embedded/session-tool-result-state.js.map +0 -1
  636. package/dist/src/daemon/launchd-restart-handoff.d.ts +0 -25
  637. package/dist/src/daemon/launchd-restart-handoff.js +0 -132
  638. package/dist/src/daemon/launchd-restart-handoff.js.map +0 -1
  639. package/dist/src/gateway/auth-rate-limit.d.ts +0 -71
  640. package/dist/src/gateway/auth-rate-limit.js +0 -192
  641. package/dist/src/gateway/auth-rate-limit.js.map +0 -1
  642. package/dist/src/gateway/restart-handler.d.ts +0 -14
  643. package/dist/src/gateway/restart-handler.js +0 -64
  644. package/dist/src/gateway/restart-handler.js.map +0 -1
  645. package/dist/src/gateway/security/flood-guard.d.ts +0 -28
  646. package/dist/src/gateway/security/flood-guard.js +0 -42
  647. package/dist/src/gateway/security/flood-guard.js.map +0 -1
  648. package/dist/src/infra/rate-limit.d.ts +0 -38
  649. package/dist/src/infra/rate-limit.js +0 -60
  650. package/dist/src/infra/rate-limit.js.map +0 -1
  651. package/dist/src/infra/restart-intent.d.ts +0 -13
  652. package/dist/src/infra/restart-intent.js +0 -40
  653. package/dist/src/infra/restart-intent.js.map +0 -1
  654. package/dist/src/infra/restart-sentinel.d.ts +0 -23
  655. package/dist/src/infra/restart-sentinel.js +0 -75
  656. package/dist/src/infra/restart-sentinel.js.map +0 -1
  657. package/skills/creative/canvas-design/LICENSE.txt +0 -202
  658. package/skills/creative/canvas-design/SKILL-zh.md +0 -130
  659. package/skills/creative/canvas-design/SKILL.md +0 -130
  660. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
  661. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  662. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  663. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
  664. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  665. package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
  666. package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  667. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  668. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
  669. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  670. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  671. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  672. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
  673. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  674. package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
  675. package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  676. package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
  677. package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  678. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  679. package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
  680. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  681. package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
  682. package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  683. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  684. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
  685. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  686. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  687. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  688. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  689. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  690. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  691. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  692. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  693. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
  694. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  695. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  696. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  697. package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
  698. package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  699. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  700. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
  701. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  702. package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  703. package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  704. package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
  705. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
  706. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  707. package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  708. package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  709. package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  710. package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
  711. package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  712. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  713. package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
  714. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  715. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
  716. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  717. package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  718. package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
  719. package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  720. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  721. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
  722. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
  723. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  724. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  725. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
  726. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  727. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
  728. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  729. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  730. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
  731. package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  732. package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
  733. package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  734. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  735. package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  736. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  737. package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
  738. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  739. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
  740. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
@@ -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
- async function executeDaemonStop(options) {
7
- const { resolveGatewayService, isDaemonAvailableAsync } = await import("../../../daemon/service.js");
8
- if (!await isDaemonAvailableAsync()) {
9
- outputResult(options, {
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: "Daemon service not available on this platform"
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
- const service = await resolveGatewayService();
16
- if (!await service.isLoaded({ env: process.env })) {
17
- outputResult(options, {
18
- ok: true,
19
- result: "not-running",
20
- message: `Gateway service ${service.notLoadedText}. Nothing to stop.`
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
- outputResult(options, {
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
- outputResult(options, {
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 executeDaemonRestart(options) {
45
- const { resolveGatewayService, isDaemonAvailableAsync } = await import("../../../daemon/service.js");
46
- if (!await isDaemonAvailableAsync()) {
47
- outputResult(options, {
48
- ok: false,
49
- error: "Daemon service not available on this platform"
50
- });
51
- process.exit(1);
52
- }
53
- const service = await resolveGatewayService();
54
- if (!await service.isLoaded({ env: process.env })) {
55
- outputResult(options, {
56
- ok: false,
57
- error: `Gateway service ${service.notLoadedText}. Install first with: xopc gateway service install`,
58
- hints: ["xopc gateway service install"]
59
- });
60
- process.exit(1);
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
- const result = await service.restart({ env: process.env });
67
- if (options.wait) await waitForHealthAfterRestart(service, parseWaitTimeout(options.wait), options);
68
- else outputResult(options, {
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: result.outcome,
71
- message: `Gateway restart ${result.outcome}.`
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
- outputResult(options, {
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
- outputResult(options, {
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
- outputResult(options, {
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
- outputResult(options, {
215
+ emitResult(options, {
107
216
  ok: false,
108
- error: `Failed to uninstall: ${message}`
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 { executeDaemonRestart, executeDaemonStop, executeDaemonUninstall };
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":";;;aAWwD;AAMxD,MAAM,MAAM,aAAa,kBAAkB;AAI3C,eAAsB,kBAAkB,SAAgD;CACtF,MAAM,EAAE,uBAAuB,2BAA2B,MAAM,OAC9D;AAIF,KAAI,CAAC,MADmB,wBAAwB,EAChC;AACd,eAAa,SAAS;GAAE,IAAI;GAAO,OAAO;GAAiD,CAAC;AAC5F,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,MAAM,uBAAuB;AAG7C,KAAI,CAAC,MAFgB,QAAQ,SAAS,EAAE,KAAK,QAAQ,KAAK,CAAC,EAE9C;AACX,eAAa,SAAS;GACpB,IAAI;GACJ,QAAQ;GACR,SAAS,mBAAmB,QAAQ,cAAc;GACnD,CAAC;AACF;;AAGF,KAAI;AACF,QAAM,QAAQ,KAAK;GAAE,KAAK,QAAQ;GAAK,SAAS,QAAQ;GAAS,CAAC;AAClE,eAAa,SAAS;GACpB,IAAI;GACJ,QAAQ;GACR,SAAS,QAAQ,UACb,qDACA;GACL,CAAC;UACK,KAAK;EACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAChE,MAAI,MAAM,EAAE,KAAK,EAAE,yBAAyB;AAC5C,eAAa,SAAS;GAAE,IAAI;GAAO,OAAO,mBAAmB;GAAW,CAAC;AACzE,UAAQ,KAAK,EAAE;;;AAMnB,eAAsB,qBAAqB,SAAgD;CACzF,MAAM,EAAE,uBAAuB,2BAA2B,MAAM,OAC9D;AAIF,KAAI,CAAC,MADmB,wBAAwB,EAChC;AACd,eAAa,SAAS;GAAE,IAAI;GAAO,OAAO;GAAiD,CAAC;AAC5F,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,MAAM,uBAAuB;AAG7C,KAAI,CAAC,MAFgB,QAAQ,SAAS,EAAE,KAAK,QAAQ,KAAK,CAAC,EAE9C;AACX,eAAa,SAAS;GACpB,IAAI;GACJ,OAAO,mBAAmB,QAAQ,cAAc;GAChD,OAAO,CAAC,+BAA+B;GACxC,CAAC;AACF,UAAQ,KAAK,EAAE;;AAIjB,OAAM,uBAAuB,SAAS,QAAQ;CAG9C,MAAM,EAAE,kCAAkC,MAAM,OAAO;AACvD,+BAA8B,EAAE,OAAO,QAAQ,OAAO,CAAC;AAEvD,KAAI;EACF,MAAM,SAAsC,MAAM,QAAQ,QAAQ,EAAE,KAAK,QAAQ,KAAK,CAAC;AAGvF,MAAI,QAAQ,KAEV,OAAM,0BAA0B,SADd,iBAAiB,QAAQ,KACO,EAAE,QAAQ;MAE5D,cAAa,SAAS;GACpB,IAAI;GACJ,QAAQ,OAAO;GACf,SAAS,mBAAmB,OAAO,QAAQ;GAC5C,CAAC;UAEG,KAAK;EACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAChE,MAAI,MAAM,EAAE,KAAK,EAAE,4BAA4B;AAC/C,eAAa,SAAS;GAAE,IAAI;GAAO,OAAO,sBAAsB;GAAW,CAAC;AAC5E,UAAQ,KAAK,EAAE;WACP;EAER,MAAM,EAAE,kCAAkC,MAAM,OAAO;AACvD,iCAA+B;;;AAMnC,eAAsB,uBAAuB,SAAgD;CAC3F,MAAM,EAAE,uBAAuB,2BAA2B,MAAM,OAC9D;AAIF,KAAI,CAAC,MADmB,wBAAwB,EAChC;AACd,eAAa,SAAS;GAAE,IAAI;GAAO,OAAO;GAAiD,CAAC;AAC5F,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,MAAM,uBAAuB;AAE7C,KAAI;AACF,QAAM,QAAQ,UAAU,EAAE,KAAK,QAAQ,KAAK,CAAC;AAC7C,eAAa,SAAS;GACpB,IAAI;GACJ,QAAQ;GACR,SAAS;GACV,CAAC;UACK,KAAK;EACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAChE,MAAI,MAAM,EAAE,KAAK,EAAE,sCAAsC;AACzD,eAAa,SAAS;GAAE,IAAI;GAAO,OAAO,wBAAwB;GAAW,CAAC;AAC9E,UAAQ,KAAK,EAAE;;;AAMnB,eAAe,uBACb,SACA,SACe;AACf,KAAI;EACF,MAAM,UAAU,MAAM,QAAQ,YAAY,QAAQ,IAAI;AACtD,MAAI,CAAC,SAAS,aAAa,mBAAoB;EAE/C,MAAM,EAAE,eAAe,MAAM,OAAO;EACpC,MAAM,EAAE,sBAAsB,MAAM,OAAO;EAE3C,MAAM,cADS,WAAW,mBAAmB,CACnB,EAAE,SAAS,MAAM;AAE3C,MAAI,eAAe,QAAQ,YAAY,uBAAuB,aAAa;GACzE,MAAM,UACJ;AAGF,OAAI,QAAQ,MAAM,OAGhB,SAAQ,KAAK,OAAO,UAAU;;SAG5B;;AAOV,eAAe,0BACb,SACA,WACA,SACe;CACf,MAAM,EAAE,eAAe,MAAM,OAAO;CACpC,MAAM,EAAE,sBAAsB,MAAM,OAAO;CAE3C,MAAM,OADS,WAAW,mBAAmB,CAC1B,EAAE,SAAS,QAAQ;AAEtC,KAAI;EACF,MAAM,EAAE,yBAAyB,MAAM,OAAO;EAC9C,MAAM,WAAW,MAAM,qBAAqB;GACjC;GACT;GACA;GACA,aAAa,UAAU;AACrB,QAAI,CAAC,QAAQ,KACX,SAAQ,OAAO,MAAM,IAAI;;GAG9B,CAAC;AAEF,MAAI,CAAC,QAAQ,KACX,SAAQ,OAAO,MAAM,KAAK;AAG5B,MAAI,SAAS,QACX,cAAa,SAAS;GACpB,IAAI;GACJ,QAAQ;GACR,SAAS,sCAAsC,SAAS,SAAS,OAAO,UAAU,IAAI,SAAS,UAAU;GAC1G,CAAC;OACG;AACL,gBAAa,SAAS;IACpB,IAAI;IACJ,OAAO,gCAAgC,SAAS;IAChD,OAAO,CAAC,qCAAqC;IAC9C,CAAC;AACF,WAAQ,KAAK,EAAE;;UAEV,KAAK;AAEZ,eAAa,SAAS;GACpB,IAAI;GACJ,OAAO,uBAHO,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;GAI/D,CAAC;AACF,UAAQ,KAAK,EAAE;;;AAMnB,SAAS,iBAAiB,MAAsB;CAC9C,MAAM,QAAQ,KAAK,MAAM,mBAAmB;AAC5C,KAAI,CAAC,MAAO,QAAO;CAEnB,MAAM,QAAQ,SAAS,MAAM,IAAI,GAAG;AAGpC,SAFa,MAAM,MAAM,KAEzB;EACE,KAAK,KAAM,QAAO;EAClB,KAAK,IAAK,QAAO,QAAQ;EAEzB,QAAS,QAAO,QAAQ;;;AAY5B,SAAS,aAAa,SAAiC,QAA+B;AACpF,KAAI,QAAQ,KACV,SAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;UACnC,OAAO;MACZ,OAAO,QACT,SAAQ,IAAI,KAAK,OAAO,UAAU;QAE/B;AACL,MAAI,OAAO,MACT,SAAQ,MAAM,KAAK,OAAO,QAAQ;AAEpC,MAAI,OAAO,MACT,MAAK,MAAM,QAAQ,OAAO,MACxB,SAAQ,IAAI,MAAM,OAAO"}
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","names":[],"sources":["../../../../../src/cli/commands/gateway/lifecycle.ts"],"sourcesContent":["/**\n * Gateway lifecycle orchestration — OpenClaw-aligned service + unmanaged fallback.\n */\n\nimport { isRestartEnabled } from '../../../config/commands.flags.js';\nimport { loadConfig } from '../../../config/index.js';\nimport { resolveConfigPath } from '../../../config/paths.js';\nimport { resolveGatewayService } from '../../../daemon/service.js';\nimport {\n findVerifiedGatewayListenerPidsOnPortSync,\n formatGatewayPidList,\n signalVerifiedGatewayPidSync,\n} from '../../../infra/gateway-processes.js';\nimport { authorizeGatewaySigusr1Restart } from '../../../infra/restart.js';\nimport {\n DEFAULT_RESTART_HEALTH_ATTEMPTS,\n DEFAULT_RESTART_HEALTH_DELAY_MS,\n renderGatewayPortHealthDiagnostics,\n waitForGatewayHealthyListener,\n} from './restart-health.js';\nimport {\n parsePortFromArgs,\n renderGatewayServiceStartHints,\n resolveGatewayPortFromConfig,\n} from './shared.js';\nimport {\n runServiceRestart,\n runServiceStop,\n type ServiceRecoveryResult,\n} from './lifecycle-core.js';\n\nconst POST_RESTART_HEALTH_ATTEMPTS = DEFAULT_RESTART_HEALTH_ATTEMPTS;\nconst POST_RESTART_HEALTH_DELAY_MS = DEFAULT_RESTART_HEALTH_DELAY_MS;\n\nasync function resolveGatewayLifecyclePort(service?: Awaited<ReturnType<typeof resolveGatewayService>>): Promise<number> {\n const resolvedService = service ?? (await resolveGatewayService());\n const command = await resolvedService.readCommand(process.env).catch(() => null);\n const portFromArgs = parsePortFromArgs(command?.programArguments);\n return portFromArgs ?? resolveGatewayPortFromConfig();\n}\n\nfunction resolveVerifiedGatewayListenerPids(port: number): number[] {\n return findVerifiedGatewayListenerPidsOnPortSync(port).filter(\n (pid): pid is number => Number.isFinite(pid) && pid > 0,\n );\n}\n\nasync function assertUnmanagedGatewayRestartEnabled(port: number): Promise<void> {\n const config = loadConfig(resolveConfigPath());\n if (!isRestartEnabled(config)) {\n throw new Error(\n 'Gateway restart is disabled in config (commands.restart=false); unmanaged SIGUSR1 restart would be ignored',\n );\n }\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 1000);\n const response = await fetch(`http://127.0.0.1:${port}/api/health`, {\n method: 'GET',\n signal: controller.signal,\n });\n clearTimeout(timeout);\n if (!response.ok) {\n return;\n }\n } catch {\n // Best-effort probe; unmanaged restart may still target a starting gateway.\n }\n}\n\nasync function stopGatewayWithoutServiceManager(port: number): Promise<ServiceRecoveryResult | null> {\n const pids = resolveVerifiedGatewayListenerPids(port);\n if (pids.length === 0) {\n return null;\n }\n for (const pid of pids) {\n signalVerifiedGatewayPidSync(pid, 'SIGTERM');\n }\n return {\n result: 'stopped',\n message: `Gateway stop signal sent to unmanaged process${pids.length === 1 ? '' : 'es'} on port ${port}: ${formatGatewayPidList(pids)}.`,\n };\n}\n\nasync function restartGatewayWithoutServiceManager(port: number): Promise<ServiceRecoveryResult | null> {\n await assertUnmanagedGatewayRestartEnabled(port);\n const pids = resolveVerifiedGatewayListenerPids(port);\n if (pids.length === 0) {\n return null;\n }\n if (pids.length > 1) {\n throw new Error(\n `multiple gateway processes are listening on port ${port}: ${formatGatewayPidList(pids)}; use \"xopc gateway status\" before retrying restart`,\n );\n }\n authorizeGatewaySigusr1Restart();\n signalVerifiedGatewayPidSync(pids[0], 'SIGUSR1');\n return {\n result: 'restarted',\n message: `Gateway restart signal sent to unmanaged process on port ${port}: ${pids[0]}.`,\n };\n}\n\nexport async function runDaemonStop(options: { json?: boolean; disable?: boolean } = {}): Promise<void> {\n const service = await resolveGatewayService();\n let gatewayPortPromise: Promise<number> | undefined;\n\n await runServiceStop({\n service,\n opts: options,\n onNotLoaded: async () => {\n gatewayPortPromise ??= resolveGatewayLifecyclePort(service);\n return stopGatewayWithoutServiceManager(await gatewayPortPromise);\n },\n });\n}\n\nexport async function runDaemonRestart(options: {\n json?: boolean;\n wait?: string;\n} = {}): Promise<void> {\n const service = await resolveGatewayService();\n let restartedWithoutServiceManager = false;\n const restartPort = await resolveGatewayLifecyclePort(service);\n const restartHealthAttempts = POST_RESTART_HEALTH_ATTEMPTS;\n const restartWaitSeconds = Math.round(\n (restartHealthAttempts * POST_RESTART_HEALTH_DELAY_MS) / 1000,\n );\n\n await runServiceRestart({\n service,\n opts: options,\n renderStartHints: renderGatewayServiceStartHints,\n checkTokenDrift: true,\n onNotLoaded: async () => {\n const handled = await restartGatewayWithoutServiceManager(restartPort);\n if (handled) {\n restartedWithoutServiceManager = true;\n }\n return handled;\n },\n postRestartCheck: async ({ options: opts, fail }) => {\n if (!restartedWithoutServiceManager) {\n return;\n }\n const health = await waitForGatewayHealthyListener({\n port: restartPort,\n attempts: restartHealthAttempts,\n delayMs: POST_RESTART_HEALTH_DELAY_MS,\n });\n if (health.healthy) {\n return;\n }\n const diagnostics = renderGatewayPortHealthDiagnostics(health);\n fail(\n `Gateway restart timed out after ${restartWaitSeconds}s waiting for health checks.`,\n ['xopc gateway status', 'xopc doctor'],\n diagnostics,\n opts,\n );\n },\n });\n}\n"],"mappings":";;;;;;;;;;;;;;YAM6D;AAyB7D,MAAM,+BAA+B;AACrC,MAAM,+BAAA;AAEN,eAAe,4BAA4B,SAA8E;AAIvH,QADqB,mBAAkB,OAFf,WAAY,MAAM,uBAAuB,EAC3B,YAAY,QAAQ,IAAI,CAAC,YAAY,KAAK,GAChC,iBAC7B,IAAI,8BAA8B;;AAGvD,SAAS,mCAAmC,MAAwB;AAClE,QAAO,0CAA0C,KAAK,CAAC,QACpD,QAAuB,OAAO,SAAS,IAAI,IAAI,MAAM,EACvD;;AAGH,eAAe,qCAAqC,MAA6B;AAE/E,KAAI,CAAC,iBADU,WAAW,mBAAmB,CACjB,CAAC,CAC3B,OAAM,IAAI,MACR,6GACD;AAGH,KAAI;EACF,MAAM,aAAa,IAAI,iBAAiB;EACxC,MAAM,UAAU,iBAAiB,WAAW,OAAO,EAAE,IAAK;EAC1D,MAAM,WAAW,MAAM,MAAM,oBAAoB,KAAK,cAAc;GAClE,QAAQ;GACR,QAAQ,WAAW;GACpB,CAAC;AACF,eAAa,QAAQ;AACrB,MAAI,CAAC,SAAS,GACZ;SAEI;;AAKV,eAAe,iCAAiC,MAAqD;CACnG,MAAM,OAAO,mCAAmC,KAAK;AACrD,KAAI,KAAK,WAAW,EAClB,QAAO;AAET,MAAK,MAAM,OAAO,KAChB,8BAA6B,KAAK,UAAU;AAE9C,QAAO;EACL,QAAQ;EACR,SAAS,gDAAgD,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,KAAK,IAAI,qBAAqB,KAAK,CAAC;EACvI;;AAGH,eAAe,oCAAoC,MAAqD;AACtG,OAAM,qCAAqC,KAAK;CAChD,MAAM,OAAO,mCAAmC,KAAK;AACrD,KAAI,KAAK,WAAW,EAClB,QAAO;AAET,KAAI,KAAK,SAAS,EAChB,OAAM,IAAI,MACR,oDAAoD,KAAK,IAAI,qBAAqB,KAAK,CAAC,qDACzF;AAEH,iCAAgC;AAChC,8BAA6B,KAAK,IAAI,UAAU;AAChD,QAAO;EACL,QAAQ;EACR,SAAS,4DAA4D,KAAK,IAAI,KAAK,GAAG;EACvF;;AAGH,eAAsB,cAAc,UAAiD,EAAE,EAAiB;CACtG,MAAM,UAAU,MAAM,uBAAuB;CAC7C,IAAI;AAEJ,OAAM,eAAe;EACnB;EACA,MAAM;EACN,aAAa,YAAY;AACvB,0BAAuB,4BAA4B,QAAQ;AAC3D,UAAO,iCAAiC,MAAM,mBAAmB;;EAEpE,CAAC;;AAGJ,eAAsB,iBAAiB,UAGnC,EAAE,EAAiB;CACrB,MAAM,UAAU,MAAM,uBAAuB;CAC7C,IAAI,iCAAiC;CACrC,MAAM,cAAc,MAAM,4BAA4B,QAAQ;CAC9D,MAAM,wBAAwB;CAC9B,MAAM,qBAAqB,KAAK,MAC7B,wBAAwB,+BAAgC,IAC1D;AAED,OAAM,kBAAkB;EACtB;EACA,MAAM;EACN,kBAAkB;EAClB,iBAAiB;EACjB,aAAa,YAAY;GACvB,MAAM,UAAU,MAAM,oCAAoC,YAAY;AACtE,OAAI,QACF,kCAAiC;AAEnC,UAAO;;EAET,kBAAkB,OAAO,EAAE,SAAS,MAAM,WAAW;AACnD,OAAI,CAAC,+BACH;GAEF,MAAM,SAAS,MAAM,8BAA8B;IACjD,MAAM;IACN,UAAU;IACV,SAAS;IACV,CAAC;AACF,OAAI,OAAO,QACT;GAEF,MAAM,cAAc,mCAAmC,OAAO;AAC9D,QACE,mCAAmC,mBAAmB,+BACtD,CAAC,uBAAuB,cAAc,EACtC,aACA,KACD;;EAEJ,CAAC"}
@@ -1,4 +1,4 @@
1
- import { getContextWithOpts } from "../../index.js";
1
+ import { getContextWithOpts } from "../../context.js";
2
2
  import { execSync, spawn } from "child_process";
3
3
  import { Command } from "commander";
4
4
  //#region src/cli/commands/gateway/logs.ts
@@ -1 +1 @@
1
- {"version":3,"file":"logs.js","names":[],"sources":["../../../../../src/cli/commands/gateway/logs.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { spawn, execSync } from 'child_process';\nimport { getContextWithOpts } from '../../index.js';\n\n/**\n * Create logs subcommand\n */\nexport function createLogsCommand(): Command {\n return new Command('logs')\n .description('View gateway logs')\n .option('--lines <n>', 'Number of lines to show', '50')\n .option('--follow', 'Follow log output (like tail -f)')\n .action(async (options) => {\n const ctx = getContextWithOpts();\n \n // Determine log directory from environment or default\n const logDir = process.env.XOPC_LOG_DIR || \n `${ctx.configPath.replace('/config.json', '')}/logs`;\n\n try {\n if (options.follow) {\n // Follow mode: use tail -f\n console.log(`📜 Following gateway logs (Ctrl+C to exit)...\\n`);\n const tail = spawn('tail', ['-f', '-n', options.lines, `${logDir}/app.log`], {\n stdio: 'inherit',\n });\n \n tail.on('error', (err) => {\n console.error('❌ Failed to tail logs:', err.message);\n process.exit(1);\n });\n } else {\n // Static mode: read last N lines\n const output = execSync(\n `tail -n ${options.lines} ${logDir}/app.log 2>/dev/null || echo \"No logs found\"`,\n { encoding: 'utf-8' }\n );\n \n console.log(`📜 Last ${options.lines} lines of gateway logs:\\n`);\n console.log(output);\n process.exit(0);\n }\n } catch (err) {\n console.error('❌ Failed to read logs:', err);\n process.exit(1);\n }\n });\n}\n"],"mappings":";;;;;;;AAOA,SAAgB,oBAA6B;AAC3C,QAAO,IAAI,QAAQ,OAAO,CACvB,YAAY,oBAAoB,CAChC,OAAO,eAAe,2BAA2B,KAAK,CACtD,OAAO,YAAY,mCAAmC,CACtD,OAAO,OAAO,YAAY;EACzB,MAAM,MAAM,oBAAoB;EAGhC,MAAM,SAAS,QAAQ,IAAI,gBACzB,GAAG,IAAI,WAAW,QAAQ,gBAAgB,GAAG,CAAC;AAEhD,MAAI;AACF,OAAI,QAAQ,QAAQ;AAElB,YAAQ,IAAI,kDAAkD;AACjD,UAAM,QAAQ;KAAC;KAAM;KAAM,QAAQ;KAAO,GAAG,OAAO;KAAU,EAAE,EAC3E,OAAO,WACR,CAEG,CAAC,GAAG,UAAU,QAAQ;AACxB,aAAQ,MAAM,0BAA0B,IAAI,QAAQ;AACpD,aAAQ,KAAK,EAAE;MACf;UACG;IAEL,MAAM,SAAS,SACb,WAAW,QAAQ,MAAM,GAAG,OAAO,+CACnC,EAAE,UAAU,SAAS,CACtB;AAED,YAAQ,IAAI,WAAW,QAAQ,MAAM,2BAA2B;AAChE,YAAQ,IAAI,OAAO;AACnB,YAAQ,KAAK,EAAE;;WAEV,KAAK;AACZ,WAAQ,MAAM,0BAA0B,IAAI;AAC5C,WAAQ,KAAK,EAAE;;GAEjB"}
1
+ {"version":3,"file":"logs.js","names":[],"sources":["../../../../../src/cli/commands/gateway/logs.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { spawn, execSync } from 'child_process';\nimport { getContextWithOpts } from '../../context.js';\n\n/**\n * Create logs subcommand\n */\nexport function createLogsCommand(): Command {\n return new Command('logs')\n .description('View gateway logs')\n .option('--lines <n>', 'Number of lines to show', '50')\n .option('--follow', 'Follow log output (like tail -f)')\n .action(async (options) => {\n const ctx = getContextWithOpts();\n \n // Determine log directory from environment or default\n const logDir = process.env.XOPC_LOG_DIR || \n `${ctx.configPath.replace('/config.json', '')}/logs`;\n\n try {\n if (options.follow) {\n // Follow mode: use tail -f\n console.log(`📜 Following gateway logs (Ctrl+C to exit)...\\n`);\n const tail = spawn('tail', ['-f', '-n', options.lines, `${logDir}/app.log`], {\n stdio: 'inherit',\n });\n \n tail.on('error', (err) => {\n console.error('❌ Failed to tail logs:', err.message);\n process.exit(1);\n });\n } else {\n // Static mode: read last N lines\n const output = execSync(\n `tail -n ${options.lines} ${logDir}/app.log 2>/dev/null || echo \"No logs found\"`,\n { encoding: 'utf-8' }\n );\n \n console.log(`📜 Last ${options.lines} lines of gateway logs:\\n`);\n console.log(output);\n process.exit(0);\n }\n } catch (err) {\n console.error('❌ Failed to read logs:', err);\n process.exit(1);\n }\n });\n}\n"],"mappings":";;;;;;;AAOA,SAAgB,oBAA6B;AAC3C,QAAO,IAAI,QAAQ,OAAO,CACvB,YAAY,oBAAoB,CAChC,OAAO,eAAe,2BAA2B,KAAK,CACtD,OAAO,YAAY,mCAAmC,CACtD,OAAO,OAAO,YAAY;EACzB,MAAM,MAAM,oBAAoB;EAGhC,MAAM,SAAS,QAAQ,IAAI,gBACzB,GAAG,IAAI,WAAW,QAAQ,gBAAgB,GAAG,CAAC;AAEhD,MAAI;AACF,OAAI,QAAQ,QAAQ;AAElB,YAAQ,IAAI,kDAAkD;AACjD,UAAM,QAAQ;KAAC;KAAM;KAAM,QAAQ;KAAO,GAAG,OAAO;KAAU,EAAE,EAC3E,OAAO,WACR,CAEG,CAAC,GAAG,UAAU,QAAQ;AACxB,aAAQ,MAAM,0BAA0B,IAAI,QAAQ;AACpD,aAAQ,KAAK,EAAE;MACf;UACG;IAEL,MAAM,SAAS,SACb,WAAW,QAAQ,MAAM,GAAG,OAAO,+CACnC,EAAE,UAAU,SAAS,CACtB;AAED,YAAQ,IAAI,WAAW,QAAQ,MAAM,2BAA2B;AAChE,YAAQ,IAAI,OAAO;AACnB,YAAQ,KAAK,EAAE;;WAEV,KAAK;AACZ,WAAQ,MAAM,0BAA0B,IAAI;AAC5C,WAAQ,KAAK,EAAE;;GAEjB"}
@@ -1,5 +1,5 @@
1
1
  import { init_paths, resolveConfigPath } from "../../../config/paths.js";
2
- import { getContextWithOpts } from "../../index.js";
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/probe.ts
@@ -1 +1 @@
1
- {"version":3,"file":"probe.js","names":[],"sources":["../../../../../src/cli/commands/gateway/probe.ts"],"sourcesContent":["import { Command } from 'commander';\n\nimport { resolveConfigPath } from '../../../config/paths.js';\nimport {\n addGatewayClientOptions,\n parseGatewayClientOptions,\n} from '../../utils/gateway-client-options.js';\nimport { getContextWithOpts } from '../../index.js';\n\ntype GatewayClientModule = typeof import('../../utils/gateway-client.js');\n\ninterface ProbeTarget {\n label: string;\n url: string;\n}\n\ninterface ProbeResultEntry {\n label: string;\n url: string;\n reachable: boolean;\n authenticated: boolean;\n durationMs: number;\n version?: string;\n error?: string;\n}\n\nfunction resolveProbeTargets(opts: { url?: string; port: number }): ProbeTarget[] {\n const targets: ProbeTarget[] = [];\n const port = opts.port;\n targets.push({ label: 'localhost', url: `http://127.0.0.1:${port}` });\n\n if (opts.url) {\n const normalized = opts.url.replace(/\\/+$/, '');\n if (!normalized.includes('127.0.0.1') && !normalized.includes('localhost')) {\n targets.push({ label: 'remote', url: normalized });\n }\n }\n\n return targets;\n}\n\nasync function probeTarget(\n callGatewayApi: GatewayClientModule['callGatewayApi'],\n target: ProbeTarget,\n token?: string,\n timeoutMs?: number,\n): Promise<ProbeResultEntry> {\n const healthResult = await callGatewayApi<{ status: string; version?: string }>('GET', '/api/health', {\n url: target.url,\n timeoutMs: timeoutMs ?? 5000,\n });\n\n if (!healthResult.ok) {\n return {\n label: target.label,\n url: target.url,\n reachable: false,\n authenticated: false,\n durationMs: healthResult.durationMs,\n error: healthResult.error,\n };\n }\n\n let authenticated = false;\n if (token) {\n const statusResult = await callGatewayApi('GET', '/api/status', {\n url: target.url,\n token,\n timeoutMs: timeoutMs ?? 5000,\n });\n authenticated = statusResult.ok;\n }\n\n return {\n label: target.label,\n url: target.url,\n reachable: true,\n authenticated,\n durationMs: healthResult.durationMs,\n version: healthResult.data?.version,\n };\n}\n\nexport function createProbeCommand(): Command {\n const cmd = new Command('probe').description('Probe gateway reachability and auth capability');\n\n addGatewayClientOptions(cmd);\n\n cmd.action(async (options) => {\n const ctx = getContextWithOpts();\n const configPath = ctx.configPath || resolveConfigPath();\n const [{ loadConfig }, { callGatewayApi, resolveGatewayToken }] = await Promise.all([\n import('../../../config/index.js'),\n import('../../utils/gateway-client.js'),\n ]);\n const config = loadConfig(configPath);\n const port = config?.gateway?.port ?? 18790;\n\n const clientOpts = { ...parseGatewayClientOptions(options as Record<string, unknown>), configPath };\n const token = resolveGatewayToken(clientOpts);\n const targets = resolveProbeTargets({ url: clientOpts.url, port });\n const results: ProbeResultEntry[] = [];\n\n for (const target of targets) {\n const result = await probeTarget(callGatewayApi, target, token, clientOpts.timeoutMs);\n results.push(result);\n }\n\n if (clientOpts.json) {\n console.log(JSON.stringify({ targets: results }, null, 2));\n const anyReachable = results.some((r) => r.reachable);\n process.exit(anyReachable ? 0 : 1);\n }\n\n console.log('🔍 Gateway Probe');\n console.log('');\n\n for (const result of results) {\n if (result.reachable) {\n console.log(`✅ ${result.label} (${result.url})`);\n console.log(` Reachable: yes (${result.durationMs}ms)`);\n console.log(\n ` Auth: ${result.authenticated ? '✅ authenticated' : '🔒 not authenticated (pass --token)'}`,\n );\n if (result.version) {\n console.log(` Version: ${result.version}`);\n }\n } else {\n console.log(`❌ ${result.label} (${result.url})`);\n console.log(' Reachable: no');\n console.log(` Error: ${result.error}`);\n }\n console.log('');\n }\n\n const anyReachable = results.some((r) => r.reachable);\n if (!anyReachable) {\n console.log('💡 Is the gateway running? Try: xopc gateway');\n }\n process.exit(anyReachable ? 0 : 1);\n });\n\n return cmd;\n}\n"],"mappings":";;;;;YAE6D;AAwB7D,SAAS,oBAAoB,MAAqD;CAChF,MAAM,UAAyB,EAAE;CACjC,MAAM,OAAO,KAAK;AAClB,SAAQ,KAAK;EAAE,OAAO;EAAa,KAAK,oBAAoB;EAAQ,CAAC;AAErE,KAAI,KAAK,KAAK;EACZ,MAAM,aAAa,KAAK,IAAI,QAAQ,QAAQ,GAAG;AAC/C,MAAI,CAAC,WAAW,SAAS,YAAY,IAAI,CAAC,WAAW,SAAS,YAAY,CACxE,SAAQ,KAAK;GAAE,OAAO;GAAU,KAAK;GAAY,CAAC;;AAItD,QAAO;;AAGT,eAAe,YACb,gBACA,QACA,OACA,WAC2B;CAC3B,MAAM,eAAe,MAAM,eAAqD,OAAO,eAAe;EACpG,KAAK,OAAO;EACZ,WAAW,aAAa;EACzB,CAAC;AAEF,KAAI,CAAC,aAAa,GAChB,QAAO;EACL,OAAO,OAAO;EACd,KAAK,OAAO;EACZ,WAAW;EACX,eAAe;EACf,YAAY,aAAa;EACzB,OAAO,aAAa;EACrB;CAGH,IAAI,gBAAgB;AACpB,KAAI,MAMF,kBAAgB,MALW,eAAe,OAAO,eAAe;EAC9D,KAAK,OAAO;EACZ;EACA,WAAW,aAAa;EACzB,CAAC,EAC2B;AAG/B,QAAO;EACL,OAAO,OAAO;EACd,KAAK,OAAO;EACZ,WAAW;EACX;EACA,YAAY,aAAa;EACzB,SAAS,aAAa,MAAM;EAC7B;;AAGH,SAAgB,qBAA8B;CAC5C,MAAM,MAAM,IAAI,QAAQ,QAAQ,CAAC,YAAY,iDAAiD;AAE9F,yBAAwB,IAAI;AAE5B,KAAI,OAAO,OAAO,YAAY;EAE5B,MAAM,aADM,oBACU,CAAC,cAAc,mBAAmB;EACxD,MAAM,CAAC,EAAE,cAAc,EAAE,gBAAgB,yBAAyB,MAAM,QAAQ,IAAI,CAClF,OAAO,6BACP,OAAO,iCACR,CAAC;EAEF,MAAM,OADS,WAAW,WACP,EAAE,SAAS,QAAQ;EAEtC,MAAM,aAAa;GAAE,GAAG,0BAA0B,QAAmC;GAAE;GAAY;EACnG,MAAM,QAAQ,oBAAoB,WAAW;EAC7C,MAAM,UAAU,oBAAoB;GAAE,KAAK,WAAW;GAAK;GAAM,CAAC;EAClE,MAAM,UAA8B,EAAE;AAEtC,OAAK,MAAM,UAAU,SAAS;GAC5B,MAAM,SAAS,MAAM,YAAY,gBAAgB,QAAQ,OAAO,WAAW,UAAU;AACrF,WAAQ,KAAK,OAAO;;AAGtB,MAAI,WAAW,MAAM;AACnB,WAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,SAAS,EAAE,MAAM,EAAE,CAAC;GAC1D,MAAM,eAAe,QAAQ,MAAM,MAAM,EAAE,UAAU;AACrD,WAAQ,KAAK,eAAe,IAAI,EAAE;;AAGpC,UAAQ,IAAI,mBAAmB;AAC/B,UAAQ,IAAI,GAAG;AAEf,OAAK,MAAM,UAAU,SAAS;AAC5B,OAAI,OAAO,WAAW;AACpB,YAAQ,IAAI,KAAK,OAAO,MAAM,IAAI,OAAO,IAAI,GAAG;AAChD,YAAQ,IAAI,sBAAsB,OAAO,WAAW,KAAK;AACzD,YAAQ,IACN,YAAY,OAAO,gBAAgB,oBAAoB,wCACxD;AACD,QAAI,OAAO,QACT,SAAQ,IAAI,eAAe,OAAO,UAAU;UAEzC;AACL,YAAQ,IAAI,KAAK,OAAO,MAAM,IAAI,OAAO,IAAI,GAAG;AAChD,YAAQ,IAAI,mBAAmB;AAC/B,YAAQ,IAAI,aAAa,OAAO,QAAQ;;AAE1C,WAAQ,IAAI,GAAG;;EAGjB,MAAM,eAAe,QAAQ,MAAM,MAAM,EAAE,UAAU;AACrD,MAAI,CAAC,aACH,SAAQ,IAAI,+CAA+C;AAE7D,UAAQ,KAAK,eAAe,IAAI,EAAE;GAClC;AAEF,QAAO"}
1
+ {"version":3,"file":"probe.js","names":[],"sources":["../../../../../src/cli/commands/gateway/probe.ts"],"sourcesContent":["import { Command } from 'commander';\n\nimport { resolveConfigPath } from '../../../config/paths.js';\nimport {\n addGatewayClientOptions,\n parseGatewayClientOptions,\n} from '../../utils/gateway-client-options.js';\nimport { getContextWithOpts } from '../../context.js';\n\ntype GatewayClientModule = typeof import('../../utils/gateway-client.js');\n\ninterface ProbeTarget {\n label: string;\n url: string;\n}\n\ninterface ProbeResultEntry {\n label: string;\n url: string;\n reachable: boolean;\n authenticated: boolean;\n durationMs: number;\n version?: string;\n error?: string;\n}\n\nfunction resolveProbeTargets(opts: { url?: string; port: number }): ProbeTarget[] {\n const targets: ProbeTarget[] = [];\n const port = opts.port;\n targets.push({ label: 'localhost', url: `http://127.0.0.1:${port}` });\n\n if (opts.url) {\n const normalized = opts.url.replace(/\\/+$/, '');\n if (!normalized.includes('127.0.0.1') && !normalized.includes('localhost')) {\n targets.push({ label: 'remote', url: normalized });\n }\n }\n\n return targets;\n}\n\nasync function probeTarget(\n callGatewayApi: GatewayClientModule['callGatewayApi'],\n target: ProbeTarget,\n token?: string,\n timeoutMs?: number,\n): Promise<ProbeResultEntry> {\n const healthResult = await callGatewayApi<{ status: string; version?: string }>('GET', '/api/health', {\n url: target.url,\n timeoutMs: timeoutMs ?? 5000,\n });\n\n if (!healthResult.ok) {\n return {\n label: target.label,\n url: target.url,\n reachable: false,\n authenticated: false,\n durationMs: healthResult.durationMs,\n error: healthResult.error,\n };\n }\n\n let authenticated = false;\n if (token) {\n const statusResult = await callGatewayApi('GET', '/api/status', {\n url: target.url,\n token,\n timeoutMs: timeoutMs ?? 5000,\n });\n authenticated = statusResult.ok;\n }\n\n return {\n label: target.label,\n url: target.url,\n reachable: true,\n authenticated,\n durationMs: healthResult.durationMs,\n version: healthResult.data?.version,\n };\n}\n\nexport function createProbeCommand(): Command {\n const cmd = new Command('probe').description('Probe gateway reachability and auth capability');\n\n addGatewayClientOptions(cmd);\n\n cmd.action(async (options) => {\n const ctx = getContextWithOpts();\n const configPath = ctx.configPath || resolveConfigPath();\n const [{ loadConfig }, { callGatewayApi, resolveGatewayToken }] = await Promise.all([\n import('../../../config/index.js'),\n import('../../utils/gateway-client.js'),\n ]);\n const config = loadConfig(configPath);\n const port = config?.gateway?.port ?? 18790;\n\n const clientOpts = { ...parseGatewayClientOptions(options as Record<string, unknown>), configPath };\n const token = resolveGatewayToken(clientOpts);\n const targets = resolveProbeTargets({ url: clientOpts.url, port });\n const results: ProbeResultEntry[] = [];\n\n for (const target of targets) {\n const result = await probeTarget(callGatewayApi, target, token, clientOpts.timeoutMs);\n results.push(result);\n }\n\n if (clientOpts.json) {\n console.log(JSON.stringify({ targets: results }, null, 2));\n const anyReachable = results.some((r) => r.reachable);\n process.exit(anyReachable ? 0 : 1);\n }\n\n console.log('🔍 Gateway Probe');\n console.log('');\n\n for (const result of results) {\n if (result.reachable) {\n console.log(`✅ ${result.label} (${result.url})`);\n console.log(` Reachable: yes (${result.durationMs}ms)`);\n console.log(\n ` Auth: ${result.authenticated ? '✅ authenticated' : '🔒 not authenticated (pass --token)'}`,\n );\n if (result.version) {\n console.log(` Version: ${result.version}`);\n }\n } else {\n console.log(`❌ ${result.label} (${result.url})`);\n console.log(' Reachable: no');\n console.log(` Error: ${result.error}`);\n }\n console.log('');\n }\n\n const anyReachable = results.some((r) => r.reachable);\n if (!anyReachable) {\n console.log('💡 Is the gateway running? Try: xopc gateway');\n }\n process.exit(anyReachable ? 0 : 1);\n });\n\n return cmd;\n}\n"],"mappings":";;;;;YAE6D;AAwB7D,SAAS,oBAAoB,MAAqD;CAChF,MAAM,UAAyB,EAAE;CACjC,MAAM,OAAO,KAAK;AAClB,SAAQ,KAAK;EAAE,OAAO;EAAa,KAAK,oBAAoB;EAAQ,CAAC;AAErE,KAAI,KAAK,KAAK;EACZ,MAAM,aAAa,KAAK,IAAI,QAAQ,QAAQ,GAAG;AAC/C,MAAI,CAAC,WAAW,SAAS,YAAY,IAAI,CAAC,WAAW,SAAS,YAAY,CACxE,SAAQ,KAAK;GAAE,OAAO;GAAU,KAAK;GAAY,CAAC;;AAItD,QAAO;;AAGT,eAAe,YACb,gBACA,QACA,OACA,WAC2B;CAC3B,MAAM,eAAe,MAAM,eAAqD,OAAO,eAAe;EACpG,KAAK,OAAO;EACZ,WAAW,aAAa;EACzB,CAAC;AAEF,KAAI,CAAC,aAAa,GAChB,QAAO;EACL,OAAO,OAAO;EACd,KAAK,OAAO;EACZ,WAAW;EACX,eAAe;EACf,YAAY,aAAa;EACzB,OAAO,aAAa;EACrB;CAGH,IAAI,gBAAgB;AACpB,KAAI,MAMF,kBAAgB,MALW,eAAe,OAAO,eAAe;EAC9D,KAAK,OAAO;EACZ;EACA,WAAW,aAAa;EACzB,CAAC,EAC2B;AAG/B,QAAO;EACL,OAAO,OAAO;EACd,KAAK,OAAO;EACZ,WAAW;EACX;EACA,YAAY,aAAa;EACzB,SAAS,aAAa,MAAM;EAC7B;;AAGH,SAAgB,qBAA8B;CAC5C,MAAM,MAAM,IAAI,QAAQ,QAAQ,CAAC,YAAY,iDAAiD;AAE9F,yBAAwB,IAAI;AAE5B,KAAI,OAAO,OAAO,YAAY;EAE5B,MAAM,aADM,oBACU,CAAC,cAAc,mBAAmB;EACxD,MAAM,CAAC,EAAE,cAAc,EAAE,gBAAgB,yBAAyB,MAAM,QAAQ,IAAI,CAClF,OAAO,6BACP,OAAO,iCACR,CAAC;EAEF,MAAM,OADS,WAAW,WACP,EAAE,SAAS,QAAQ;EAEtC,MAAM,aAAa;GAAE,GAAG,0BAA0B,QAAmC;GAAE;GAAY;EACnG,MAAM,QAAQ,oBAAoB,WAAW;EAC7C,MAAM,UAAU,oBAAoB;GAAE,KAAK,WAAW;GAAK;GAAM,CAAC;EAClE,MAAM,UAA8B,EAAE;AAEtC,OAAK,MAAM,UAAU,SAAS;GAC5B,MAAM,SAAS,MAAM,YAAY,gBAAgB,QAAQ,OAAO,WAAW,UAAU;AACrF,WAAQ,KAAK,OAAO;;AAGtB,MAAI,WAAW,MAAM;AACnB,WAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,SAAS,EAAE,MAAM,EAAE,CAAC;GAC1D,MAAM,eAAe,QAAQ,MAAM,MAAM,EAAE,UAAU;AACrD,WAAQ,KAAK,eAAe,IAAI,EAAE;;AAGpC,UAAQ,IAAI,mBAAmB;AAC/B,UAAQ,IAAI,GAAG;AAEf,OAAK,MAAM,UAAU,SAAS;AAC5B,OAAI,OAAO,WAAW;AACpB,YAAQ,IAAI,KAAK,OAAO,MAAM,IAAI,OAAO,IAAI,GAAG;AAChD,YAAQ,IAAI,sBAAsB,OAAO,WAAW,KAAK;AACzD,YAAQ,IACN,YAAY,OAAO,gBAAgB,oBAAoB,wCACxD;AACD,QAAI,OAAO,QACT,SAAQ,IAAI,eAAe,OAAO,UAAU;UAEzC;AACL,YAAQ,IAAI,KAAK,OAAO,MAAM,IAAI,OAAO,IAAI,GAAG;AAChD,YAAQ,IAAI,mBAAmB;AAC/B,YAAQ,IAAI,aAAa,OAAO,QAAQ;;AAE1C,WAAQ,IAAI,GAAG;;EAGjB,MAAM,eAAe,QAAQ,MAAM,MAAM,EAAE,UAAU;AACrD,MAAI,CAAC,aACH,SAAQ,IAAI,+CAA+C;AAE7D,UAAQ,KAAK,eAAe,IAAI,EAAE;GAClC;AAEF,QAAO"}
@@ -11,6 +11,7 @@ import type { GatewayServiceRuntime } from '../../../daemon/types.js';
11
11
  import type { PortUsage } from '../../../infra/ports.js';
12
12
  export declare const DEFAULT_RESTART_HEALTH_TIMEOUT_MS = 60000;
13
13
  export declare const DEFAULT_RESTART_HEALTH_DELAY_MS = 500;
14
+ export declare const DEFAULT_RESTART_HEALTH_ATTEMPTS: number;
14
15
  export type GatewayRestartWaitOutcome = 'healthy' | 'version-mismatch' | 'stale-pids' | 'stopped-free' | 'timeout';
15
16
  export interface GatewayRestartSnapshot {
16
17
  runtime?: GatewayServiceRuntime;
@@ -47,4 +48,15 @@ export declare function waitForRestartHealth(params: {
47
48
  token?: string;
48
49
  onProgress?: (snapshot: GatewayRestartSnapshot) => void;
49
50
  }): Promise<GatewayRestartSnapshot>;
51
+ export type GatewayPortHealthSnapshot = {
52
+ portUsage?: PortUsage;
53
+ healthy: boolean;
54
+ };
55
+ export declare function waitForGatewayHealthyListener(params: {
56
+ port: number;
57
+ attempts?: number;
58
+ delayMs?: number;
59
+ token?: string;
60
+ }): Promise<GatewayPortHealthSnapshot>;
61
+ export declare function renderGatewayPortHealthDiagnostics(snapshot: GatewayPortHealthSnapshot): string[];
50
62
  export {};