@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
@@ -3,13 +3,5 @@
3
3
  */
4
4
  import type { Config } from '../../../config/schema.js';
5
5
  import type { CLIContext } from '../../registry.js';
6
- /**
7
- * Configure Gateway WebUI
8
- */
9
6
  export declare function setupGateway(config: Config): Promise<Config>;
10
- /**
11
- * Handle gateway startup after onboarding.
12
- * In interactive mode, asks user if they want to start gateway in background.
13
- * In non-interactive mode, provides guidance on how to start manually.
14
- */
15
7
  export declare function startGatewayNow(config: Config, ctx: CLIContext): Promise<void>;
@@ -1,19 +1,12 @@
1
1
  import { GatewayLockError, acquireGatewayLock } from "../../../gateway/lock.js";
2
- import { spawn } from "child_process";
3
2
  import { confirm } from "@inquirer/prompts";
4
3
  //#region src/cli/commands/onboard/gateway.ts
5
4
  /**
6
5
  * Gateway Configuration and Startup for Onboarding
7
6
  */
8
- /**
9
- * Check if running in interactive mode
10
- */
11
7
  function isInteractive() {
12
8
  return process.stdin.isTTY && process.stdout.isTTY;
13
9
  }
14
- /**
15
- * Configure Gateway WebUI
16
- */
17
10
  async function setupGateway(config) {
18
11
  console.log("\n🌐 Step: Gateway WebUI (Optional)\n");
19
12
  if (!await confirm({
@@ -52,11 +45,30 @@ async function setupGateway(config) {
52
45
  console.log(` Token: ${token.slice(0, 8)}...${token.slice(-8)}`);
53
46
  return config;
54
47
  }
55
- /**
56
- * Handle gateway startup after onboarding.
57
- * In interactive mode, asks user if they want to start gateway in background.
58
- * In non-interactive mode, provides guidance on how to start manually.
59
- */
48
+ async function installAndStartGatewayService(config, _ctx) {
49
+ const [{ resolveGatewayService, isDaemonAvailableAsync, getPlatformName }, { buildGatewayInstallArgs }] = await Promise.all([import("../../../daemon/service.js"), import("../../../daemon/install-plan.js")]);
50
+ if (!await isDaemonAvailableAsync()) {
51
+ console.log(`ℹ️ OS service not available on ${getPlatformName()}.`);
52
+ console.log(" Start manually with: xopc gateway");
53
+ return false;
54
+ }
55
+ const service = await resolveGatewayService();
56
+ const port = config.gateway?.port ?? 18790;
57
+ const bind = config.gateway?.bind ?? "loopback";
58
+ const token = config.gateway?.auth?.token;
59
+ if (!await service.isLoaded({ env: process.env }).catch(() => false)) {
60
+ const installArgs = buildGatewayInstallArgs({
61
+ port,
62
+ bind,
63
+ token
64
+ });
65
+ installArgs.stdout = process.stdout;
66
+ await service.install(installArgs);
67
+ }
68
+ const { startGatewayService } = await import("../../../daemon/service.js");
69
+ const result = await startGatewayService({ service });
70
+ return result.outcome === "started" || result.outcome === "scheduled";
71
+ }
60
72
  async function startGatewayNow(config, ctx) {
61
73
  const bind = config?.gateway?.bind ?? "loopback";
62
74
  const port = config?.gateway?.port || 18790;
@@ -77,52 +89,39 @@ async function startGatewayNow(config, ctx) {
77
89
  console.log("📝 To apply the new configuration, restart gateway:");
78
90
  console.log(" xopc gateway restart");
79
91
  } else if (isInteractive()) if (await confirm({
80
- message: "Start Gateway WebUI now (background mode)?",
92
+ message: "Install and start Gateway as an OS service now?",
81
93
  default: true
82
94
  })) {
83
- console.log("\n🚀 Starting Gateway WebUI in background...");
84
- console.log("");
85
- const args = [
86
- ...process.execArgv,
87
- ...process.argv.slice(1).filter((arg) => !arg.includes("onboard") && arg !== "--quick"),
88
- "gateway",
89
- "--background",
90
- "--bind",
91
- bind,
92
- "--port",
93
- String(port)
94
- ];
95
- const child = spawn(process.execPath, args, {
96
- detached: true,
97
- stdio: "ignore",
98
- env: process.env
99
- });
100
- child.unref();
101
- await new Promise((resolve) => setTimeout(resolve, 500));
102
- if (child.pid && !child.killed) {
103
- console.log("✅ Gateway started in background");
104
- console.log(` PID: ${child.pid}`);
105
- console.log(` URL: http://${displayHost}:${port}`);
106
- const token = config?.gateway?.auth?.token;
107
- if (token) console.log(` Token: ${token.slice(0, 8)}...${token.slice(-8)}`);
108
- } else {
109
- console.log("⚠️ Failed to start gateway automatically.");
110
- console.log(" You can start it manually with:");
111
- console.log(` xopc gateway --background`);
95
+ console.log("\n🚀 Installing Gateway service...");
96
+ try {
97
+ if (await installAndStartGatewayService(config, ctx)) {
98
+ console.log("✅ Gateway service installed and started");
99
+ console.log(` URL: http://${displayHost}:${port}`);
100
+ const token = config?.gateway?.auth?.token;
101
+ if (token) console.log(` Token: ${token.slice(0, 8)}...${token.slice(-8)}`);
102
+ } else {
103
+ console.log("⚠️ Service install completed but start may need manual action.");
104
+ console.log(" Try: xopc gateway service start");
105
+ }
106
+ } catch (err) {
107
+ const message = err instanceof Error ? err.message : String(err);
108
+ console.log(`⚠️ Failed to install/start gateway service: ${message}`);
109
+ console.log(" Start manually with: xopc gateway");
112
110
  }
113
111
  } else {
114
- console.log("\n⏭️ Skipping gateway startup.");
115
- console.log(" You can start it later with:");
116
- console.log(` xopc gateway --background`);
112
+ console.log("\n⏭️ Skipping gateway service install.");
113
+ console.log(" Start in foreground with: xopc gateway");
114
+ console.log(" Or install service later: xopc gateway service install");
117
115
  }
118
116
  else {
119
117
  console.log("\n🚀 Gateway is configured but not running.");
120
118
  console.log("");
121
- console.log("📝 To start the gateway in background:");
122
- console.log(` xopc gateway --background`);
119
+ console.log("📝 To install and start as an OS service:");
120
+ console.log(" xopc gateway service install");
121
+ console.log(" xopc gateway service start");
123
122
  console.log("");
124
- console.log("📝 To start in foreground (development mode):");
125
- console.log(` pnpm run dev -- gateway --bind ${bind} --port ${port}`);
123
+ console.log("📝 To start in foreground (development):");
124
+ console.log(` xopc gateway --bind ${bind} --port ${port}`);
126
125
  }
127
126
  console.log("");
128
127
  console.log("📚 Other useful commands:");
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.js","names":[],"sources":["../../../../../src/cli/commands/onboard/gateway.ts"],"sourcesContent":["/**\n * Gateway Configuration and Startup for Onboarding\n */\n\nimport { confirm } from '@inquirer/prompts';\nimport { spawn } from 'child_process';\nimport type { Config } from '../../../config/schema.js';\nimport type { CLIContext } from '../../registry.js';\nimport { acquireGatewayLock, GatewayLockError } from '../../../gateway/lock.js';\n\n/**\n * Check if running in interactive mode\n */\nfunction isInteractive(): boolean {\n return process.stdin.isTTY && process.stdout.isTTY;\n}\n\n/**\n * Configure Gateway WebUI\n */\nexport async function setupGateway(config: Config): Promise<Config> {\n console.log('\\n🌐 Step: Gateway WebUI (Optional)\\n');\n\n const enableGateway = await confirm({\n message: 'Enable Gateway WebUI?',\n default: true,\n });\n\n if (!enableGateway) {\n config.gateway = config.gateway || {};\n config.gateway.auth = { mode: 'none' };\n console.log('ℹ️ Gateway disabled (auth mode set to none)');\n return config;\n }\n\n // Check if gateway auth is already configured\n const existingToken = config?.gateway?.auth?.token;\n const existingMode = config?.gateway?.auth?.mode;\n\n if (existingToken && existingMode === 'token') {\n console.log('\\nℹ️ Gateway auth token already configured');\n const keepExisting = await confirm({\n message: 'Keep existing token?',\n default: true,\n });\n\n if (keepExisting) {\n console.log('✅ Keeping existing gateway configuration');\n return config;\n }\n }\n\n // Generate new token\n const crypto = await import('crypto');\n const token = crypto.randomBytes(24).toString('hex');\n\n // Configure gateway with defaults\n config.gateway = config.gateway || {};\n config.gateway.bind = config.gateway.bind || 'loopback';\n config.gateway.port = config.gateway.port || 18790;\n config.gateway.auth = {\n mode: 'token',\n token,\n };\n\n console.log('\\n✅ Gateway configured:');\n console.log(` Bind: ${config.gateway.bind}`);\n console.log(` Port: ${config.gateway.port}`);\n console.log(` Auth: Token-based (auto-generated)`);\n console.log(` Token: ${token.slice(0, 8)}...${token.slice(-8)}`);\n\n return config;\n}\n\n/**\n * Handle gateway startup after onboarding.\n * In interactive mode, asks user if they want to start gateway in background.\n * In non-interactive mode, provides guidance on how to start manually.\n */\nexport async function startGatewayNow(config: Config, ctx: CLIContext): Promise<void> {\n const bind = config?.gateway?.bind ?? 'loopback';\n const port = config?.gateway?.port || 18790;\n const displayHost = bind === 'lan' ? 'localhost' : '127.0.0.1';\n\n // Check if gateway is already running by trying to acquire lock\n let isRunning = false;\n try {\n const lock = await acquireGatewayLock(ctx.configPath, { timeoutMs: 100, port });\n await lock.release();\n } catch (err) {\n if (err instanceof GatewayLockError) {\n isRunning = true;\n }\n }\n\n if (isRunning) {\n // Gateway is running - provide restart guidance\n console.log('\\n🌐 Gateway is already running!');\n console.log(` URL: http://${displayHost}:${port}`);\n console.log('');\n console.log('📝 To apply the new configuration, restart gateway:');\n console.log(' xopc gateway restart');\n } else {\n // Gateway is not running\n if (isInteractive()) {\n // Interactive mode: ask user if they want to start gateway\n const shouldStart = await confirm({\n message: 'Start Gateway WebUI now (background mode)?',\n default: true,\n });\n\n if (shouldStart) {\n console.log('\\n🚀 Starting Gateway WebUI in background...');\n console.log('');\n\n const args = [\n ...process.execArgv,\n ...process.argv.slice(1).filter(arg => !arg.includes('onboard') && arg !== '--quick'),\n 'gateway',\n '--background',\n '--bind', bind,\n '--port', String(port),\n ];\n\n const child = spawn(process.execPath, args, {\n detached: true,\n stdio: 'ignore',\n env: process.env,\n });\n\n child.unref();\n\n // Wait a moment to check if process started successfully\n await new Promise(resolve => setTimeout(resolve, 500));\n\n if (child.pid && !child.killed) {\n console.log('✅ Gateway started in background');\n console.log(` PID: ${child.pid}`);\n console.log(` URL: http://${displayHost}:${port}`);\n const token = config?.gateway?.auth?.token;\n if (token) {\n console.log(` Token: ${token.slice(0, 8)}...${token.slice(-8)}`);\n }\n } else {\n console.log('⚠️ Failed to start gateway automatically.');\n console.log(' You can start it manually with:');\n console.log(` xopc gateway --background`);\n }\n } else {\n // User chose not to start\n console.log('\\n⏭️ Skipping gateway startup.');\n console.log(' You can start it later with:');\n console.log(` xopc gateway --background`);\n }\n } else {\n // Non-interactive mode: provide guidance\n console.log('\\n🚀 Gateway is configured but not running.');\n console.log('');\n console.log('📝 To start the gateway in background:');\n console.log(` xopc gateway --background`);\n console.log('');\n console.log('📝 To start in foreground (development mode):');\n console.log(` pnpm run dev -- gateway --bind ${bind} --port ${port}`);\n }\n }\n\n console.log('');\n console.log('📚 Other useful commands:');\n console.log(' xopc gateway status # Check gateway status');\n console.log(' xopc gateway stop # Stop gateway');\n console.log(' xopc gateway restart # Restart gateway');\n console.log(' xopc gateway logs # View logs');\n}\n"],"mappings":";;;;;;;;;;AAaA,SAAS,gBAAyB;AAChC,QAAO,QAAQ,MAAM,SAAS,QAAQ,OAAO;;;;;AAM/C,eAAsB,aAAa,QAAiC;AAClE,SAAQ,IAAI,wCAAwC;AAOpD,KAAI,CAAC,MALuB,QAAQ;EAClC,SAAS;EACT,SAAS;EACV,CAAC,EAEkB;AAClB,SAAO,UAAU,OAAO,WAAW,EAAE;AACrC,SAAO,QAAQ,OAAO,EAAE,MAAM,QAAQ;AACtC,UAAQ,IAAI,+CAA+C;AAC3D,SAAO;;CAIT,MAAM,gBAAgB,QAAQ,SAAS,MAAM;CAC7C,MAAM,eAAe,QAAQ,SAAS,MAAM;AAE5C,KAAI,iBAAiB,iBAAiB,SAAS;AAC7C,UAAQ,IAAI,8CAA8C;AAM1D,MAAI,MALuB,QAAQ;GACjC,SAAS;GACT,SAAS;GACV,CAAC,EAEgB;AAChB,WAAQ,IAAI,2CAA2C;AACvD,UAAO;;;CAMX,MAAM,SAAQ,MADO,OAAO,WACP,YAAY,GAAG,CAAC,SAAS,MAAM;AAGpD,QAAO,UAAU,OAAO,WAAW,EAAE;AACrC,QAAO,QAAQ,OAAO,OAAO,QAAQ,QAAQ;AAC7C,QAAO,QAAQ,OAAO,OAAO,QAAQ,QAAQ;AAC7C,QAAO,QAAQ,OAAO;EACpB,MAAM;EACN;EACD;AAED,SAAQ,IAAI,0BAA0B;AACtC,SAAQ,IAAI,YAAY,OAAO,QAAQ,OAAO;AAC9C,SAAQ,IAAI,YAAY,OAAO,QAAQ,OAAO;AAC9C,SAAQ,IAAI,wCAAwC;AACpD,SAAQ,IAAI,aAAa,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,MAAM,MAAM,GAAG,GAAG;AAElE,QAAO;;;;;;;AAQT,eAAsB,gBAAgB,QAAgB,KAAgC;CACpF,MAAM,OAAO,QAAQ,SAAS,QAAQ;CACtC,MAAM,OAAO,QAAQ,SAAS,QAAQ;CACtC,MAAM,cAAc,SAAS,QAAQ,cAAc;CAGnD,IAAI,YAAY;AAChB,KAAI;AAEF,SAAM,MADa,mBAAmB,IAAI,YAAY;GAAE,WAAW;GAAK;GAAM,CAAC,EACpE,SAAS;UACb,KAAK;AACZ,MAAI,eAAe,iBACjB,aAAY;;AAIhB,KAAI,WAAW;AAEb,UAAQ,IAAI,mCAAmC;AAC/C,UAAQ,IAAI,kBAAkB,YAAY,GAAG,OAAO;AACpD,UAAQ,IAAI,GAAG;AACf,UAAQ,IAAI,sDAAsD;AAClE,UAAQ,IAAI,0BAA0B;YAGlC,eAAe,CAOjB,KAAI,MALsB,QAAQ;EAChC,SAAS;EACT,SAAS;EACV,CAAC,EAEe;AACf,UAAQ,IAAI,+CAA+C;AAC3D,UAAQ,IAAI,GAAG;EAEf,MAAM,OAAO;GACX,GAAG,QAAQ;GACX,GAAG,QAAQ,KAAK,MAAM,EAAE,CAAC,QAAO,QAAO,CAAC,IAAI,SAAS,UAAU,IAAI,QAAQ,UAAU;GACrF;GACA;GACA;GAAU;GACV;GAAU,OAAO,KAAK;GACvB;EAED,MAAM,QAAQ,MAAM,QAAQ,UAAU,MAAM;GAC1C,UAAU;GACV,OAAO;GACP,KAAK,QAAQ;GACd,CAAC;AAEF,QAAM,OAAO;AAGb,QAAM,IAAI,SAAQ,YAAW,WAAW,SAAS,IAAI,CAAC;AAEtD,MAAI,MAAM,OAAO,CAAC,MAAM,QAAQ;AAC9B,WAAQ,IAAI,kCAAkC;AAC9C,WAAQ,IAAI,WAAW,MAAM,MAAM;AACnC,WAAQ,IAAI,kBAAkB,YAAY,GAAG,OAAO;GACpD,MAAM,QAAQ,QAAQ,SAAS,MAAM;AACrC,OAAI,MACF,SAAQ,IAAI,aAAa,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,MAAM,MAAM,GAAG,GAAG;SAE/D;AACL,WAAQ,IAAI,6CAA6C;AACzD,WAAQ,IAAI,qCAAqC;AACjD,WAAQ,IAAI,+BAA+B;;QAExC;AAEL,UAAQ,IAAI,kCAAkC;AAC9C,UAAQ,IAAI,kCAAkC;AAC9C,UAAQ,IAAI,+BAA+B;;MAExC;AAEL,UAAQ,IAAI,8CAA8C;AAC1D,UAAQ,IAAI,GAAG;AACf,UAAQ,IAAI,yCAAyC;AACrD,UAAQ,IAAI,+BAA+B;AAC3C,UAAQ,IAAI,GAAG;AACf,UAAQ,IAAI,gDAAgD;AAC5D,UAAQ,IAAI,qCAAqC,KAAK,UAAU,OAAO;;AAI3E,SAAQ,IAAI,GAAG;AACf,SAAQ,IAAI,4BAA4B;AACxC,SAAQ,IAAI,mDAAmD;AAC/D,SAAQ,IAAI,2CAA2C;AACvD,SAAQ,IAAI,8CAA8C;AAC1D,SAAQ,IAAI,wCAAwC"}
1
+ {"version":3,"file":"gateway.js","names":[],"sources":["../../../../../src/cli/commands/onboard/gateway.ts"],"sourcesContent":["/**\n * Gateway Configuration and Startup for Onboarding\n */\n\nimport { confirm } from '@inquirer/prompts';\nimport type { Config } from '../../../config/schema.js';\nimport type { CLIContext } from '../../registry.js';\nimport { acquireGatewayLock, GatewayLockError } from '../../../gateway/lock.js';\n\nfunction isInteractive(): boolean {\n return process.stdin.isTTY && process.stdout.isTTY;\n}\n\nexport async function setupGateway(config: Config): Promise<Config> {\n console.log('\\n🌐 Step: Gateway WebUI (Optional)\\n');\n\n const enableGateway = await confirm({\n message: 'Enable Gateway WebUI?',\n default: true,\n });\n\n if (!enableGateway) {\n config.gateway = config.gateway || {};\n config.gateway.auth = { mode: 'none' };\n console.log('ℹ️ Gateway disabled (auth mode set to none)');\n return config;\n }\n\n const existingToken = config?.gateway?.auth?.token;\n const existingMode = config?.gateway?.auth?.mode;\n\n if (existingToken && existingMode === 'token') {\n console.log('\\nℹ️ Gateway auth token already configured');\n const keepExisting = await confirm({\n message: 'Keep existing token?',\n default: true,\n });\n\n if (keepExisting) {\n console.log('✅ Keeping existing gateway configuration');\n return config;\n }\n }\n\n const crypto = await import('crypto');\n const token = crypto.randomBytes(24).toString('hex');\n\n config.gateway = config.gateway || {};\n config.gateway.bind = config.gateway.bind || 'loopback';\n config.gateway.port = config.gateway.port || 18790;\n config.gateway.auth = {\n mode: 'token',\n token,\n };\n\n console.log('\\n✅ Gateway configured:');\n console.log(` Bind: ${config.gateway.bind}`);\n console.log(` Port: ${config.gateway.port}`);\n console.log(` Auth: Token-based (auto-generated)`);\n console.log(` Token: ${token.slice(0, 8)}...${token.slice(-8)}`);\n\n return config;\n}\n\nasync function installAndStartGatewayService(config: Config, _ctx: CLIContext): Promise<boolean> {\n const [{ resolveGatewayService, isDaemonAvailableAsync, getPlatformName }, { buildGatewayInstallArgs }] =\n await Promise.all([\n import('../../../daemon/service.js'),\n import('../../../daemon/install-plan.js'),\n ]);\n\n const available = await isDaemonAvailableAsync();\n if (!available) {\n console.log(`ℹ️ OS service not available on ${getPlatformName()}.`);\n console.log(' Start manually with: xopc gateway');\n return false;\n }\n\n const service = await resolveGatewayService();\n const port = config.gateway?.port ?? 18790;\n const bind = config.gateway?.bind ?? 'loopback';\n const token = config.gateway?.auth?.token;\n\n const loaded = await service.isLoaded({ env: process.env }).catch(() => false);\n if (!loaded) {\n const installArgs = buildGatewayInstallArgs({ port, bind, token });\n installArgs.stdout = process.stdout;\n await service.install(installArgs);\n }\n\n const { startGatewayService } = await import('../../../daemon/service.js');\n const result = await startGatewayService({ service });\n return result.outcome === 'started' || result.outcome === 'scheduled';\n}\n\nexport async function startGatewayNow(config: Config, ctx: CLIContext): Promise<void> {\n const bind = config?.gateway?.bind ?? 'loopback';\n const port = config?.gateway?.port || 18790;\n const displayHost = bind === 'lan' ? 'localhost' : '127.0.0.1';\n\n let isRunning = false;\n try {\n const lock = await acquireGatewayLock(ctx.configPath, { timeoutMs: 100, port });\n await lock.release();\n } catch (err) {\n if (err instanceof GatewayLockError) {\n isRunning = true;\n }\n }\n\n if (isRunning) {\n console.log('\\n🌐 Gateway is already running!');\n console.log(` URL: http://${displayHost}:${port}`);\n console.log('');\n console.log('📝 To apply the new configuration, restart gateway:');\n console.log(' xopc gateway restart');\n } else if (isInteractive()) {\n const shouldInstall = await confirm({\n message: 'Install and start Gateway as an OS service now?',\n default: true,\n });\n\n if (shouldInstall) {\n console.log('\\n🚀 Installing Gateway service...');\n try {\n const started = await installAndStartGatewayService(config, ctx);\n if (started) {\n console.log('✅ Gateway service installed and started');\n console.log(` URL: http://${displayHost}:${port}`);\n const token = config?.gateway?.auth?.token;\n if (token) {\n console.log(` Token: ${token.slice(0, 8)}...${token.slice(-8)}`);\n }\n } else {\n console.log('⚠️ Service install completed but start may need manual action.');\n console.log(' Try: xopc gateway service start');\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.log(`⚠️ Failed to install/start gateway service: ${message}`);\n console.log(' Start manually with: xopc gateway');\n }\n } else {\n console.log('\\n⏭️ Skipping gateway service install.');\n console.log(' Start in foreground with: xopc gateway');\n console.log(' Or install service later: xopc gateway service install');\n }\n } else {\n console.log('\\n🚀 Gateway is configured but not running.');\n console.log('');\n console.log('📝 To install and start as an OS service:');\n console.log(' xopc gateway service install');\n console.log(' xopc gateway service start');\n console.log('');\n console.log('📝 To start in foreground (development):');\n console.log(` xopc gateway --bind ${bind} --port ${port}`);\n }\n\n console.log('');\n console.log('📚 Other useful commands:');\n console.log(' xopc gateway status # Check gateway status');\n console.log(' xopc gateway stop # Stop gateway');\n console.log(' xopc gateway restart # Restart gateway');\n console.log(' xopc gateway logs # View logs');\n}\n"],"mappings":";;;;;;AASA,SAAS,gBAAyB;AAChC,QAAO,QAAQ,MAAM,SAAS,QAAQ,OAAO;;AAG/C,eAAsB,aAAa,QAAiC;AAClE,SAAQ,IAAI,wCAAwC;AAOpD,KAAI,CAAC,MALuB,QAAQ;EAClC,SAAS;EACT,SAAS;EACV,CAAC,EAEkB;AAClB,SAAO,UAAU,OAAO,WAAW,EAAE;AACrC,SAAO,QAAQ,OAAO,EAAE,MAAM,QAAQ;AACtC,UAAQ,IAAI,+CAA+C;AAC3D,SAAO;;CAGT,MAAM,gBAAgB,QAAQ,SAAS,MAAM;CAC7C,MAAM,eAAe,QAAQ,SAAS,MAAM;AAE5C,KAAI,iBAAiB,iBAAiB,SAAS;AAC7C,UAAQ,IAAI,8CAA8C;AAM1D,MAAI,MALuB,QAAQ;GACjC,SAAS;GACT,SAAS;GACV,CAAC,EAEgB;AAChB,WAAQ,IAAI,2CAA2C;AACvD,UAAO;;;CAKX,MAAM,SAAQ,MADO,OAAO,WACP,YAAY,GAAG,CAAC,SAAS,MAAM;AAEpD,QAAO,UAAU,OAAO,WAAW,EAAE;AACrC,QAAO,QAAQ,OAAO,OAAO,QAAQ,QAAQ;AAC7C,QAAO,QAAQ,OAAO,OAAO,QAAQ,QAAQ;AAC7C,QAAO,QAAQ,OAAO;EACpB,MAAM;EACN;EACD;AAED,SAAQ,IAAI,0BAA0B;AACtC,SAAQ,IAAI,YAAY,OAAO,QAAQ,OAAO;AAC9C,SAAQ,IAAI,YAAY,OAAO,QAAQ,OAAO;AAC9C,SAAQ,IAAI,wCAAwC;AACpD,SAAQ,IAAI,aAAa,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,MAAM,MAAM,GAAG,GAAG;AAElE,QAAO;;AAGT,eAAe,8BAA8B,QAAgB,MAAoC;CAC/F,MAAM,CAAC,EAAE,uBAAuB,wBAAwB,mBAAmB,EAAE,6BAC3E,MAAM,QAAQ,IAAI,CAChB,OAAO,+BACP,OAAO,mCACR,CAAC;AAGJ,KAAI,CAAC,MADmB,wBAAwB,EAChC;AACd,UAAQ,IAAI,mCAAmC,iBAAiB,CAAC,GAAG;AACpE,UAAQ,IAAI,uCAAuC;AACnD,SAAO;;CAGT,MAAM,UAAU,MAAM,uBAAuB;CAC7C,MAAM,OAAO,OAAO,SAAS,QAAQ;CACrC,MAAM,OAAO,OAAO,SAAS,QAAQ;CACrC,MAAM,QAAQ,OAAO,SAAS,MAAM;AAGpC,KAAI,CAAC,MADgB,QAAQ,SAAS,EAAE,KAAK,QAAQ,KAAK,CAAC,CAAC,YAAY,MAAM,EACjE;EACX,MAAM,cAAc,wBAAwB;GAAE;GAAM;GAAM;GAAO,CAAC;AAClE,cAAY,SAAS,QAAQ;AAC7B,QAAM,QAAQ,QAAQ,YAAY;;CAGpC,MAAM,EAAE,wBAAwB,MAAM,OAAO;CAC7C,MAAM,SAAS,MAAM,oBAAoB,EAAE,SAAS,CAAC;AACrD,QAAO,OAAO,YAAY,aAAa,OAAO,YAAY;;AAG5D,eAAsB,gBAAgB,QAAgB,KAAgC;CACpF,MAAM,OAAO,QAAQ,SAAS,QAAQ;CACtC,MAAM,OAAO,QAAQ,SAAS,QAAQ;CACtC,MAAM,cAAc,SAAS,QAAQ,cAAc;CAEnD,IAAI,YAAY;AAChB,KAAI;AAEF,SAAM,MADa,mBAAmB,IAAI,YAAY;GAAE,WAAW;GAAK;GAAM,CAAC,EACpE,SAAS;UACb,KAAK;AACZ,MAAI,eAAe,iBACjB,aAAY;;AAIhB,KAAI,WAAW;AACb,UAAQ,IAAI,mCAAmC;AAC/C,UAAQ,IAAI,kBAAkB,YAAY,GAAG,OAAO;AACpD,UAAQ,IAAI,GAAG;AACf,UAAQ,IAAI,sDAAsD;AAClE,UAAQ,IAAI,0BAA0B;YAC7B,eAAe,CAMxB,KAAI,MALwB,QAAQ;EAClC,SAAS;EACT,SAAS;EACV,CAAC,EAEiB;AACjB,UAAQ,IAAI,qCAAqC;AACjD,MAAI;AAEF,OAAI,MADkB,8BAA8B,QAAQ,IAAI,EACnD;AACX,YAAQ,IAAI,0CAA0C;AACtD,YAAQ,IAAI,kBAAkB,YAAY,GAAG,OAAO;IACpD,MAAM,QAAQ,QAAQ,SAAS,MAAM;AACrC,QAAI,MACF,SAAQ,IAAI,aAAa,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,MAAM,MAAM,GAAG,GAAG;UAE/D;AACL,YAAQ,IAAI,kEAAkE;AAC9E,YAAQ,IAAI,qCAAqC;;WAE5C,KAAK;GACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAChE,WAAQ,IAAI,gDAAgD,UAAU;AACtE,WAAQ,IAAI,uCAAuC;;QAEhD;AACL,UAAQ,IAAI,0CAA0C;AACtD,UAAQ,IAAI,4CAA4C;AACxD,UAAQ,IAAI,4DAA4D;;MAErE;AACL,UAAQ,IAAI,8CAA8C;AAC1D,UAAQ,IAAI,GAAG;AACf,UAAQ,IAAI,4CAA4C;AACxD,UAAQ,IAAI,kCAAkC;AAC9C,UAAQ,IAAI,gCAAgC;AAC5C,UAAQ,IAAI,GAAG;AACf,UAAQ,IAAI,2CAA2C;AACvD,UAAQ,IAAI,0BAA0B,KAAK,UAAU,OAAO;;AAG9D,SAAQ,IAAI,GAAG;AACf,SAAQ,IAAI,4BAA4B;AACxC,SAAQ,IAAI,mDAAmD;AAC/D,SAAQ,IAAI,2CAA2C;AACvD,SAAQ,IAAI,8CAA8C;AAC1D,SAAQ,IAAI,wCAAwC"}
@@ -1,13 +1,12 @@
1
1
  import { init_agent_scope, resolveAgentProfileDir, resolveDefaultAgentId } from "../../agent/agent-scope.js";
2
- import { ConfigSchema, init_schema } from "../../config/schema.js";
3
2
  import { WORKSPACE_FILES, init_paths } from "../../config/paths.js";
3
+ import { ConfigSchema, init_schema } from "../../config/schema.js";
4
4
  import { saveConfig } from "../../config/loader.js";
5
5
  import { isWeixinOnboardConfigured } from "../../../extensions/weixin/src/adapters/onboard-cli.js";
6
6
  import { formatExamples, register } from "../registry.js";
7
7
  import "../../config/index.js";
8
8
  import { resolveGatewayLocalClientHost } from "../../config/gateway-bind.js";
9
9
  import { seedMainAgentProfileMarkdown } from "../../agent/context/workspace-seed.js";
10
- import { GatewayLockError, acquireGatewayLock } from "../../gateway/lock.js";
11
10
  import { colors } from "../utils/colors.js";
12
11
  import { initWorkspace } from "../utils/init-workspace.js";
13
12
  import { setupModel } from "./onboard/model.js";
@@ -122,7 +121,9 @@ async function runOnboard(options, ctx) {
122
121
  console.log(" xopc agent -m \"Hello\" # Chat with AI");
123
122
  console.log(" xopc agent -i # Interactive mode");
124
123
  console.log(" xopc models list # List models");
124
+ console.log(" xopc config validate # Validate xopc.json");
125
125
  console.log(" xopc auth list # View authentication");
126
+ console.log(" xopc init # Full state dirs (if upgrading or missing data)");
126
127
  console.log("\n📁 Files:");
127
128
  console.log(" Config:", configPath);
128
129
  console.log(" Workspace:", workspacePath);
@@ -130,64 +131,9 @@ async function runOnboard(options, ctx) {
130
131
  if (isInteractive() && didConfigurableSteps) await promptLaunchAfterOnboard(config, ctx, { doChannels });
131
132
  process.exit(0);
132
133
  }
133
- async function startGatewayInBackground(config, ctx) {
134
- const bind = config.gateway?.bind ?? "loopback";
135
- const port = config.gateway?.port ?? 18790;
136
- const displayHost = bind === "lan" ? "localhost" : "127.0.0.1";
137
- let isRunning = false;
138
- try {
139
- await (await acquireGatewayLock(ctx.configPath, {
140
- timeoutMs: 100,
141
- port
142
- })).release();
143
- } catch (err) {
144
- if (err instanceof GatewayLockError) isRunning = true;
145
- }
146
- if (isRunning) {
147
- console.log("\n🌐 Gateway is already running!");
148
- console.log(` URL: http://${displayHost}:${port}`);
149
- console.log("");
150
- console.log("📝 To apply the new configuration, restart gateway:");
151
- console.log(" xopc gateway restart");
152
- } else {
153
- console.log("\n🚀 Starting Gateway WebUI in background...");
154
- console.log("");
155
- const { spawn } = await import("child_process");
156
- const args = [
157
- ...process.execArgv,
158
- ...process.argv.slice(1).filter((arg) => !arg.includes("onboard") && arg !== "--quick"),
159
- "gateway",
160
- "--background",
161
- "--bind",
162
- bind,
163
- "--port",
164
- String(port)
165
- ];
166
- const child = spawn(process.execPath, args, {
167
- detached: true,
168
- stdio: "ignore",
169
- env: process.env
170
- });
171
- child.unref();
172
- await new Promise((resolve) => setTimeout(resolve, 500));
173
- if (child.pid && !child.killed) {
174
- console.log("✅ Gateway started in background");
175
- console.log(` PID: ${child.pid}`);
176
- console.log(` URL: http://${displayHost}:${port}`);
177
- const token = config.gateway?.auth?.token;
178
- if (token) console.log(` Token: ${token.slice(0, 8)}...${token.slice(-8)}`);
179
- } else {
180
- console.log("⚠️ Failed to start gateway automatically.");
181
- console.log(" Start manually with:");
182
- console.log(" xopc gateway --background");
183
- }
184
- }
185
- console.log("");
186
- console.log("📚 Useful commands:");
187
- console.log(" xopc gateway status # Check gateway status");
188
- console.log(" xopc gateway stop # Stop gateway");
189
- console.log(" xopc gateway restart # Restart gateway");
190
- console.log(" xopc gateway logs # View logs");
134
+ async function startGatewayAsService(config, ctx) {
135
+ const { startGatewayNow } = await import("./onboard/gateway.js");
136
+ await startGatewayNow(config, ctx);
191
137
  }
192
138
  async function promptLaunchAfterOnboard(config, ctx, flags) {
193
139
  console.log("");
@@ -201,8 +147,8 @@ async function promptLaunchAfterOnboard(config, ctx, flags) {
201
147
  },
202
148
  {
203
149
  value: "gateway",
204
- name: "Gateway WebUI (background)",
205
- description: "Start the HTTP gateway for the browser console"
150
+ name: "Gateway WebUI (OS service)",
151
+ description: "Install and start the HTTP gateway for the browser console"
206
152
  },
207
153
  {
208
154
  value: "none",
@@ -213,7 +159,7 @@ async function promptLaunchAfterOnboard(config, ctx, flags) {
213
159
  default: "tui"
214
160
  });
215
161
  if (choice === "gateway") {
216
- await startGatewayInBackground(config, ctx);
162
+ await startGatewayAsService(config, ctx);
217
163
  return;
218
164
  }
219
165
  if (choice === "tui") {
@@ -223,7 +169,8 @@ async function promptLaunchAfterOnboard(config, ctx, flags) {
223
169
  return;
224
170
  }
225
171
  console.log("\n⏭️ You can start later:");
226
- console.log(" xopc gateway --background");
172
+ console.log(" xopc gateway service install");
173
+ console.log(" xopc gateway");
227
174
  console.log(" xopc tui --local");
228
175
  }
229
176
  async function setupGateway(config) {
@@ -1 +1 @@
1
- {"version":3,"file":"onboard.js","names":["runModelSetup","runChannelOnboard"],"sources":["../../../../src/cli/commands/onboard.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { join } from 'path';\nimport { select } from '@inquirer/prompts';\nimport { saveConfig } from '../../config/index.js';\nimport { register, formatExamples } from '../registry.js';\nimport type { CLIContext } from '../registry.js';\nimport type { Config } from '../../config/schema.js';\nimport { setupModel as runModelSetup } from './onboard/model.js';\nimport { colors } from '../utils/colors.js';\nimport { acquireGatewayLock, GatewayLockError } from '../../gateway/lock.js';\nimport { setupChannels as runChannelOnboard, getChannelConfigurators } from './onboard/channels/index.js';\nimport { seedMainAgentProfileMarkdown } from '../../agent/context/workspace-seed.js';\nimport { resolveDefaultAgentId, resolveAgentProfileDir } from '../../agent/agent-scope.js';\nimport { WORKSPACE_FILES } from '../../config/paths.js';\nimport { resolveGatewayLocalClientHost } from '../../config/gateway-bind.js';\nimport { initWorkspace } from '../utils/init-workspace.js';\nimport { ConfigSchema } from '../../config/schema.js';\nimport { isWeixinOnboardConfigured } from '../../../extensions/weixin/src/adapters/onboard-cli.js';\n\nfunction isInteractive(): boolean {\n return process.stdin.isTTY && process.stdout.isTTY;\n}\n\nasync function setupNonInteractive(_configPath: string, existingConfig: Config): Promise<Config> {\n console.log('\\n🤖 AI Model Configuration (Non-Interactive Mode)\\n');\n console.log('Current config:', JSON.stringify(existingConfig.agents?.defaults?.model, null, 2));\n console.log('\\n💡 To configure in interactive mode, run: xopc onboard');\n console.log('💡 Or set up manually in:', _configPath);\n return existingConfig;\n}\n\nfunction createOnboardCommand(ctx: CLIContext): Command {\n const cmd = new Command('onboard')\n .description('Interactive setup wizard for xopc (gateway uses schema defaults)')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc onboard # Full interactive setup',\n 'xopc onboard --model # Configure LLM model only',\n 'xopc onboard --channels # Configure channels (incl. Weixin QR)',\n 'xopc onboard --gateway # Apply default gateway settings (quiet)',\n ])\n )\n .option('--model', 'Configure LLM provider and model')\n .option('--channels', 'Configure messaging channels')\n .option('--gateway', 'Configure gateway WebUI')\n .option('--all', 'Configure everything (default)')\n .action(async (options) => {\n try {\n await runOnboard(options, ctx);\n } catch (error: unknown) {\n const err = error as { name?: string; code?: string };\n if (err?.name === 'ExitPromptError' || err?.code === 'EXIT_PROMPT') {\n console.log('\\n\\n👋 Setup cancelled.');\n process.exit(0);\n }\n throw error;\n }\n });\n\n return cmd;\n}\n\ntype OnboardOptions = {\n model?: boolean;\n channels?: boolean;\n gateway?: boolean;\n all?: boolean;\n};\n\nasync function runOnboard(\n options: OnboardOptions,\n ctx: CLIContext\n): Promise<void> {\n console.log(colors.cyan('\\n🚀 Welcome to xopc setup!\\n'));\n console.log('═'.repeat(50));\n\n const workspacePath = ctx.workspacePath;\n const configPath = ctx.configPath;\n\n const initResult = await initWorkspace({ configPath, workspacePath });\n let config = initResult.config;\n\n // Determine what to configure based on options\n const doModel = options.model || options.all || (!options.channels && !options.gateway);\n const doChannels = options.channels || options.all || (!options.model && !options.gateway);\n const doGateway = options.gateway || options.all || (!options.model && !options.channels);\n const runFullWizard = !options.model && !options.channels && !options.gateway;\n /** Any setup step besides the unified launch prompt ran in interactive flow. */\n const didConfigurableSteps = doModel || doChannels || doGateway;\n\n if (!isInteractive()) {\n // Non-interactive mode\n if (doModel) {\n config = await setupNonInteractive(configPath, config);\n }\n if (doChannels) {\n console.log('\\n💬 Channels Configuration (Non-Interactive Mode)\\n');\n console.log('💡 To configure channels, edit the config file manually.');\n }\n if (doGateway) {\n console.log('\\n🌐 Gateway Configuration (Non-Interactive Mode)\\n');\n console.log('💡 To configure gateway, edit the config file manually.');\n }\n } else {\n // Interactive mode\n if (doModel) {\n config = await runModelSetup(config, ctx);\n }\n\n if (doChannels) {\n const channelIds = getChannelConfigurators().map(c => c.id);\n console.log(colors.gray(`\\nChannel onboarding: ${channelIds.join(', ')}\\n`));\n config = await runChannelOnboard(config);\n }\n\n if (doGateway) {\n config = await setupGateway(config);\n }\n }\n\n // Save config once at the end\n await saveConfig(config as Config, configPath);\n\n seedMainAgentProfileMarkdown(config as Config);\n\n console.log('\\n' + '═'.repeat(50));\n console.log('\\n🎉 Setup Complete!\\n');\n\n const gatewayAuth = (config as any)?.gateway?.auth;\n const gatewayConfigured =\n gatewayAuth?.mode === 'token' &&\n typeof gatewayAuth?.token === 'string' &&\n gatewayAuth.token.length > 0;\n const port = (config as Config)?.gateway?.port ?? 18790;\n const displayHost = resolveGatewayLocalClientHost(config as Config);\n const gwToken = gatewayConfigured ? (gatewayAuth.token as string) : undefined;\n\n const showGatewaySummary = Boolean(gatewayConfigured && gwToken && (doGateway || runFullWizard));\n\n if (showGatewaySummary && gwToken) {\n const webuiUrl = `http://${displayHost}:${port}?token=${gwToken}`;\n console.log('🌐 Web console (browser) — start here');\n console.log(` Open: http://${displayHost}:${port}`);\n console.log(` Token: ${gwToken.slice(0, 8)}...${gwToken.slice(-8)}`);\n console.log(' Bookmark link (token is saved in the browser when you open it):');\n console.log(` ${webuiUrl}`);\n console.log('');\n }\n\n if (runFullWizard) {\n console.log('🚀 Next steps:');\n if (gatewayConfigured) {\n console.log(' 1. Choose how to launch below (gateway or terminal UI)');\n console.log(' 2. Or chat with: xopc agent -i');\n console.log(' 3. Optional: read BOOTSTRAP.md in your workspace for workspace tips');\n } else {\n console.log(' 1. Chat in the terminal: xopc agent -i');\n console.log(' 2. Optional: add the Web console: xopc onboard --gateway');\n console.log(' 3. Optional: read BOOTSTRAP.md in your workspace');\n }\n console.log('');\n } else if (doGateway && gatewayConfigured) {\n console.log('🚀 Next step:');\n console.log(' Start the gateway if it is not running, then open the Web console URL above.');\n console.log('');\n }\n\n console.log('📝 Usage:');\n console.log(' xopc agent -m \"Hello\" # Chat with AI');\n console.log(' xopc agent -i # Interactive mode');\n console.log(' xopc models list # List models');\n console.log(' xopc auth list # View authentication');\n\n console.log('\\n📁 Files:');\n console.log(' Config:', configPath);\n console.log(' Workspace:', workspacePath);\n if (runFullWizard) {\n console.log(\n ' BOOTSTRAP.md (origin story):',\n join(resolveAgentProfileDir(config as Config, resolveDefaultAgentId(config as Config)), WORKSPACE_FILES.BOOTSTRAP),\n );\n }\n\n if (isInteractive() && didConfigurableSteps) {\n await promptLaunchAfterOnboard(config as Config, ctx, { doChannels });\n }\n\n process.exit(0);\n}\n\nasync function startGatewayInBackground(config: Config, ctx: CLIContext): Promise<void> {\n const bind = (config as { gateway?: { bind?: string } }).gateway?.bind ?? 'loopback';\n const port = (config as { gateway?: { port?: number } }).gateway?.port ?? 18790;\n const displayHost = bind === 'lan' ? 'localhost' : '127.0.0.1';\n\n let isRunning = false;\n try {\n const lock = await acquireGatewayLock(ctx.configPath, { timeoutMs: 100, port });\n await lock.release();\n } catch (err) {\n if (err instanceof GatewayLockError) {\n isRunning = true;\n }\n }\n\n if (isRunning) {\n console.log('\\n🌐 Gateway is already running!');\n console.log(` URL: http://${displayHost}:${port}`);\n console.log('');\n console.log('📝 To apply the new configuration, restart gateway:');\n console.log(' xopc gateway restart');\n } else {\n console.log('\\n🚀 Starting Gateway WebUI in background...');\n console.log('');\n\n const { spawn } = await import('child_process');\n const args = [\n ...process.execArgv,\n ...process.argv.slice(1).filter((arg) => !arg.includes('onboard') && arg !== '--quick'),\n 'gateway',\n '--background',\n '--bind',\n bind,\n '--port',\n String(port),\n ];\n\n const child = spawn(process.execPath, args, {\n detached: true,\n stdio: 'ignore',\n env: process.env,\n });\n\n child.unref();\n\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n if (child.pid && !child.killed) {\n console.log('✅ Gateway started in background');\n console.log(` PID: ${child.pid}`);\n console.log(` URL: http://${displayHost}:${port}`);\n const token = (config as { gateway?: { auth?: { token?: string } } }).gateway?.auth?.token;\n if (token) {\n console.log(` Token: ${token.slice(0, 8)}...${token.slice(-8)}`);\n }\n } else {\n console.log('⚠️ Failed to start gateway automatically.');\n console.log(' Start manually with:');\n console.log(' xopc gateway --background');\n }\n }\n\n console.log('');\n console.log('📚 Useful commands:');\n console.log(' xopc gateway status # Check gateway status');\n console.log(' xopc gateway stop # Stop gateway');\n console.log(' xopc gateway restart # Restart gateway');\n console.log(' xopc gateway logs # View logs');\n}\n\nasync function promptLaunchAfterOnboard(\n config: Config,\n ctx: CLIContext,\n flags: { doChannels: boolean },\n): Promise<void> {\n console.log('');\n const choice = await select<'tui' | 'gateway' | 'none'>({\n message: 'How do you want to launch xopc now?',\n choices: [\n {\n value: 'tui',\n name: 'Terminal UI (embedded)',\n description: 'xopc tui --local — no gateway process required',\n },\n {\n value: 'gateway',\n name: 'Gateway WebUI (background)',\n description: 'Start the HTTP gateway for the browser console',\n },\n {\n value: 'none',\n name: 'Exit — I will start manually',\n description: 'Finish setup without starting a runtime',\n },\n ],\n default: 'tui',\n });\n\n if (choice === 'gateway') {\n await startGatewayInBackground(config, ctx);\n return;\n }\n\n if (choice === 'tui') {\n if (flags.doChannels && !isWeixinOnboardConfigured(config)) {\n console.log(\n colors.gray(\n '\\n💡 Weixin is not logged in yet. When ready run: xopc channels login --channel weixin\\n',\n ),\n );\n }\n const { runTui } = await import('../../tui/tui.js');\n await runTui({ local: true });\n return;\n }\n\n console.log('\\n⏭️ You can start later:');\n console.log(' xopc gateway --background');\n console.log(' xopc tui --local');\n}\n\nasync function setupGateway(config: Config): Promise<Config> {\n console.log(colors.cyan('\\n🌐 Gateway WebUI\\n'));\n console.log(\n colors.gray(\n 'Applying defaults from config schema (127.0.0.1:18790, token auth; token generated if missing).\\n',\n ),\n );\n\n const gw = config.gateway ?? {};\n const { randomBytes } = await import('node:crypto');\n const authMode = gw.auth?.mode === 'none' ? ('none' as const) : ('token' as const);\n const token =\n authMode === 'token'\n ? typeof gw.auth?.token === 'string' && gw.auth.token.length > 0\n ? gw.auth.token\n : randomBytes(24).toString('hex')\n : undefined;\n\n const merged: Config = {\n ...config,\n gateway: {\n ...gw,\n bind: gw.bind ?? 'loopback',\n port: gw.port ?? 18790,\n auth:\n authMode === 'none'\n ? { mode: 'none' as const }\n : { mode: 'token' as const, token: token! },\n },\n };\n\n const parsed = ConfigSchema.parse(merged);\n console.log('✅ Gateway defaults applied.\\n');\n return parsed;\n}\n\nregister({\n id: 'onboard',\n name: 'onboard',\n description: 'Interactive setup wizard',\n factory: createOnboardCommand,\n metadata: {\n category: 'setup',\n examples: ['xopc onboard', 'xopc onboard --model', 'xopc onboard --channels'],\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"onboard.js","names":["runModelSetup","runChannelOnboard"],"sources":["../../../../src/cli/commands/onboard.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { join } from 'path';\nimport { select } from '@inquirer/prompts';\nimport { saveConfig } from '../../config/index.js';\nimport { register, formatExamples } from '../registry.js';\nimport type { CLIContext } from '../registry.js';\nimport type { Config } from '../../config/schema.js';\nimport { setupModel as runModelSetup } from './onboard/model.js';\nimport { colors } from '../utils/colors.js';\nimport { setupChannels as runChannelOnboard, getChannelConfigurators } from './onboard/channels/index.js';\nimport { seedMainAgentProfileMarkdown } from '../../agent/context/workspace-seed.js';\nimport { resolveDefaultAgentId, resolveAgentProfileDir } from '../../agent/agent-scope.js';\nimport { WORKSPACE_FILES } from '../../config/paths.js';\nimport { resolveGatewayLocalClientHost } from '../../config/gateway-bind.js';\nimport { initWorkspace } from '../utils/init-workspace.js';\nimport { ConfigSchema } from '../../config/schema.js';\nimport { isWeixinOnboardConfigured } from '../../../extensions/weixin/src/adapters/onboard-cli.js';\n\nfunction isInteractive(): boolean {\n return process.stdin.isTTY && process.stdout.isTTY;\n}\n\nasync function setupNonInteractive(_configPath: string, existingConfig: Config): Promise<Config> {\n console.log('\\n🤖 AI Model Configuration (Non-Interactive Mode)\\n');\n console.log('Current config:', JSON.stringify(existingConfig.agents?.defaults?.model, null, 2));\n console.log('\\n💡 To configure in interactive mode, run: xopc onboard');\n console.log('💡 Or set up manually in:', _configPath);\n return existingConfig;\n}\n\nfunction createOnboardCommand(ctx: CLIContext): Command {\n const cmd = new Command('onboard')\n .description('Interactive setup wizard for xopc (gateway uses schema defaults)')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc onboard # Full interactive setup',\n 'xopc onboard --model # Configure LLM model only',\n 'xopc onboard --channels # Configure channels (incl. Weixin QR)',\n 'xopc onboard --gateway # Apply default gateway settings (quiet)',\n ])\n )\n .option('--model', 'Configure LLM provider and model')\n .option('--channels', 'Configure messaging channels')\n .option('--gateway', 'Configure gateway WebUI')\n .option('--all', 'Configure everything (default)')\n .action(async (options) => {\n try {\n await runOnboard(options, ctx);\n } catch (error: unknown) {\n const err = error as { name?: string; code?: string };\n if (err?.name === 'ExitPromptError' || err?.code === 'EXIT_PROMPT') {\n console.log('\\n\\n👋 Setup cancelled.');\n process.exit(0);\n }\n throw error;\n }\n });\n\n return cmd;\n}\n\ntype OnboardOptions = {\n model?: boolean;\n channels?: boolean;\n gateway?: boolean;\n all?: boolean;\n};\n\nasync function runOnboard(\n options: OnboardOptions,\n ctx: CLIContext\n): Promise<void> {\n console.log(colors.cyan('\\n🚀 Welcome to xopc setup!\\n'));\n console.log('═'.repeat(50));\n\n const workspacePath = ctx.workspacePath;\n const configPath = ctx.configPath;\n\n const initResult = await initWorkspace({ configPath, workspacePath });\n let config = initResult.config;\n\n // Determine what to configure based on options\n const doModel = options.model || options.all || (!options.channels && !options.gateway);\n const doChannels = options.channels || options.all || (!options.model && !options.gateway);\n const doGateway = options.gateway || options.all || (!options.model && !options.channels);\n const runFullWizard = !options.model && !options.channels && !options.gateway;\n /** Any setup step besides the unified launch prompt ran in interactive flow. */\n const didConfigurableSteps = doModel || doChannels || doGateway;\n\n if (!isInteractive()) {\n // Non-interactive mode\n if (doModel) {\n config = await setupNonInteractive(configPath, config);\n }\n if (doChannels) {\n console.log('\\n💬 Channels Configuration (Non-Interactive Mode)\\n');\n console.log('💡 To configure channels, edit the config file manually.');\n }\n if (doGateway) {\n console.log('\\n🌐 Gateway Configuration (Non-Interactive Mode)\\n');\n console.log('💡 To configure gateway, edit the config file manually.');\n }\n } else {\n // Interactive mode\n if (doModel) {\n config = await runModelSetup(config, ctx);\n }\n\n if (doChannels) {\n const channelIds = getChannelConfigurators().map(c => c.id);\n console.log(colors.gray(`\\nChannel onboarding: ${channelIds.join(', ')}\\n`));\n config = await runChannelOnboard(config);\n }\n\n if (doGateway) {\n config = await setupGateway(config);\n }\n }\n\n // Save config once at the end\n await saveConfig(config as Config, configPath);\n\n seedMainAgentProfileMarkdown(config as Config);\n\n console.log('\\n' + '═'.repeat(50));\n console.log('\\n🎉 Setup Complete!\\n');\n\n const gatewayAuth = (config as any)?.gateway?.auth;\n const gatewayConfigured =\n gatewayAuth?.mode === 'token' &&\n typeof gatewayAuth?.token === 'string' &&\n gatewayAuth.token.length > 0;\n const port = (config as Config)?.gateway?.port ?? 18790;\n const displayHost = resolveGatewayLocalClientHost(config as Config);\n const gwToken = gatewayConfigured ? (gatewayAuth.token as string) : undefined;\n\n const showGatewaySummary = Boolean(gatewayConfigured && gwToken && (doGateway || runFullWizard));\n\n if (showGatewaySummary && gwToken) {\n const webuiUrl = `http://${displayHost}:${port}?token=${gwToken}`;\n console.log('🌐 Web console (browser) — start here');\n console.log(` Open: http://${displayHost}:${port}`);\n console.log(` Token: ${gwToken.slice(0, 8)}...${gwToken.slice(-8)}`);\n console.log(' Bookmark link (token is saved in the browser when you open it):');\n console.log(` ${webuiUrl}`);\n console.log('');\n }\n\n if (runFullWizard) {\n console.log('🚀 Next steps:');\n if (gatewayConfigured) {\n console.log(' 1. Choose how to launch below (gateway or terminal UI)');\n console.log(' 2. Or chat with: xopc agent -i');\n console.log(' 3. Optional: read BOOTSTRAP.md in your workspace for workspace tips');\n } else {\n console.log(' 1. Chat in the terminal: xopc agent -i');\n console.log(' 2. Optional: add the Web console: xopc onboard --gateway');\n console.log(' 3. Optional: read BOOTSTRAP.md in your workspace');\n }\n console.log('');\n } else if (doGateway && gatewayConfigured) {\n console.log('🚀 Next step:');\n console.log(' Start the gateway if it is not running, then open the Web console URL above.');\n console.log('');\n }\n\n console.log('📝 Usage:');\n console.log(' xopc agent -m \"Hello\" # Chat with AI');\n console.log(' xopc agent -i # Interactive mode');\n console.log(' xopc models list # List models');\n console.log(' xopc config validate # Validate xopc.json');\n console.log(' xopc auth list # View authentication');\n console.log(' xopc init # Full state dirs (if upgrading or missing data)');\n\n console.log('\\n📁 Files:');\n console.log(' Config:', configPath);\n console.log(' Workspace:', workspacePath);\n if (runFullWizard) {\n console.log(\n ' BOOTSTRAP.md (origin story):',\n join(resolveAgentProfileDir(config as Config, resolveDefaultAgentId(config as Config)), WORKSPACE_FILES.BOOTSTRAP),\n );\n }\n\n if (isInteractive() && didConfigurableSteps) {\n await promptLaunchAfterOnboard(config as Config, ctx, { doChannels });\n }\n\n process.exit(0);\n}\n\nasync function startGatewayAsService(config: Config, ctx: CLIContext): Promise<void> {\n const { startGatewayNow } = await import('./onboard/gateway.js');\n await startGatewayNow(config, ctx);\n}\n\nasync function promptLaunchAfterOnboard(\n config: Config,\n ctx: CLIContext,\n flags: { doChannels: boolean },\n): Promise<void> {\n console.log('');\n const choice = await select<'tui' | 'gateway' | 'none'>({\n message: 'How do you want to launch xopc now?',\n choices: [\n {\n value: 'tui',\n name: 'Terminal UI (embedded)',\n description: 'xopc tui --local — no gateway process required',\n },\n {\n value: 'gateway',\n name: 'Gateway WebUI (OS service)',\n description: 'Install and start the HTTP gateway for the browser console',\n },\n {\n value: 'none',\n name: 'Exit — I will start manually',\n description: 'Finish setup without starting a runtime',\n },\n ],\n default: 'tui',\n });\n\n if (choice === 'gateway') {\n await startGatewayAsService(config, ctx);\n return;\n }\n\n if (choice === 'tui') {\n if (flags.doChannels && !isWeixinOnboardConfigured(config)) {\n console.log(\n colors.gray(\n '\\n💡 Weixin is not logged in yet. When ready run: xopc channels login --channel weixin\\n',\n ),\n );\n }\n const { runTui } = await import('../../tui/tui.js');\n await runTui({ local: true });\n return;\n }\n\n console.log('\\n⏭️ You can start later:');\n console.log(' xopc gateway service install');\n console.log(' xopc gateway');\n console.log(' xopc tui --local');\n}\n\nasync function setupGateway(config: Config): Promise<Config> {\n console.log(colors.cyan('\\n🌐 Gateway WebUI\\n'));\n console.log(\n colors.gray(\n 'Applying defaults from config schema (127.0.0.1:18790, token auth; token generated if missing).\\n',\n ),\n );\n\n const gw = config.gateway ?? {};\n const { randomBytes } = await import('node:crypto');\n const authMode = gw.auth?.mode === 'none' ? ('none' as const) : ('token' as const);\n const token =\n authMode === 'token'\n ? typeof gw.auth?.token === 'string' && gw.auth.token.length > 0\n ? gw.auth.token\n : randomBytes(24).toString('hex')\n : undefined;\n\n const merged: Config = {\n ...config,\n gateway: {\n ...gw,\n bind: gw.bind ?? 'loopback',\n port: gw.port ?? 18790,\n auth:\n authMode === 'none'\n ? { mode: 'none' as const }\n : { mode: 'token' as const, token: token! },\n },\n };\n\n const parsed = ConfigSchema.parse(merged);\n console.log('✅ Gateway defaults applied.\\n');\n return parsed;\n}\n\nregister({\n id: 'onboard',\n name: 'onboard',\n description: 'Interactive setup wizard',\n factory: createOnboardCommand,\n metadata: {\n category: 'setup',\n examples: ['xopc onboard', 'xopc onboard --model', 'xopc onboard --channels'],\n },\n});\n"],"mappings":"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"}
@@ -1,6 +1,4 @@
1
1
  import { Command } from 'commander';
2
- export declare function createProfileListCommand(): Command;
3
- export declare function createProfileCreateCommand(): Command;
4
- export declare function createProfileDeleteCommand(): Command;
5
- export declare function createProfileSwitchCommand(): Command;
6
- export declare function registerProfileCommands(program: Command): void;
2
+ import { type CLIContext } from '../registry.js';
3
+ declare function createProfileCommand(_ctx: CLIContext): Command;
4
+ export { createProfileCommand };
@@ -1,14 +1,21 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { createProfile, deleteProfile, getCurrentProfile, listProfiles, resolveProfileStateDir } from "../../config/profile.js";
3
+ import { formatExamples, register } from "../registry.js";
4
+ import { createProfile, deleteProfile, getCurrentProfile, getSwitchCommand, listProfiles, resolveProfileStateDir } from "../../config/profile.js";
4
5
  import { colors } from "../utils/colors.js";
5
6
  import { Command } from "commander";
6
7
  import Table from "cli-table3";
7
8
  //#region src/cli/commands/profile.ts
8
9
  init_logger();
9
10
  const log = createLogger("ProfileCommands");
10
- function createProfileListCommand() {
11
- return new Command("profile:list").description("List all profiles").option("--json", "Output as JSON").action(async (options) => {
11
+ function createProfileCommand(_ctx) {
12
+ const cmd = new Command("profile").description("Manage xopc state profiles (~/.xopc vs ~/.xopc-<name>)").addHelpText("after", formatExamples([
13
+ "xopc profile list",
14
+ "xopc profile create staging",
15
+ "xopc profile switch staging",
16
+ "xopc profile delete staging --force"
17
+ ]));
18
+ cmd.command("list").description("List all profiles").option("--json", "Output as JSON").action(async (options) => {
12
19
  try {
13
20
  const profiles = await listProfiles();
14
21
  if (options.json) {
@@ -16,7 +23,7 @@ function createProfileListCommand() {
16
23
  return;
17
24
  }
18
25
  if (profiles.length === 0) {
19
- console.log("No profiles found. Create one with: xopc profile:create <name>");
26
+ console.log("No profiles found. Create one with: xopc profile create <name>");
20
27
  return;
21
28
  }
22
29
  const table = new Table({
@@ -53,26 +60,20 @@ function createProfileListCommand() {
53
60
  process.exit(1);
54
61
  }
55
62
  });
56
- }
57
- function createProfileCreateCommand() {
58
- return new Command("profile:create").description("Create a new profile").argument("<name>", "Profile name (letters, numbers, hyphens, underscores)").action(async (name) => {
63
+ cmd.command("create").description("Create a new profile").argument("<name>", "Profile name (letters, numbers, hyphens, underscores)").action(async (name) => {
59
64
  try {
60
65
  const profile = await createProfile(name);
61
66
  console.log(colors.green("✓"), `Created profile "${profile.name}"`);
62
67
  console.log(`\n Directory: ${profile.stateDir}`);
63
- console.log(`\nTo use this profile:`);
64
- console.log(` export XOPC_PROFILE=${profile.name}`);
65
- console.log(`\nOr add to your shell profile:`);
66
- console.log(` echo 'export XOPC_PROFILE=${profile.name}' >> ~/.bashrc`);
68
+ console.log("\nTo use this profile:");
69
+ console.log(` ${getSwitchCommand(profile.name)}`);
67
70
  } catch (error) {
68
71
  log.error({ error }, "Failed to create profile");
69
72
  console.error(colors.red("Error:"), error instanceof Error ? error.message : String(error));
70
73
  process.exit(1);
71
74
  }
72
75
  });
73
- }
74
- function createProfileDeleteCommand() {
75
- return new Command("profile:delete").description("Delete a profile").argument("<name>", "Profile name").option("-f, --force", "Force delete even if active").action(async (name, options) => {
76
+ cmd.command("delete").description("Delete a profile").argument("<name>", "Profile name").option("-f, --force", "Force delete even if active").action(async (name, options) => {
76
77
  try {
77
78
  await deleteProfile(name, { force: options.force });
78
79
  console.log(colors.green("✓"), `Deleted profile "${name}"`);
@@ -82,38 +83,37 @@ function createProfileDeleteCommand() {
82
83
  process.exit(1);
83
84
  }
84
85
  });
85
- }
86
- function createProfileSwitchCommand() {
87
- return new Command("profile:switch").description("Get shell command to switch to a profile").argument("<name>", "Profile name").action(async (name) => {
86
+ cmd.command("switch").description("Print shell command to switch to a profile").argument("<name>", "Profile name").action(async (name) => {
88
87
  try {
89
- const stateDir = resolveProfileStateDir(name);
90
88
  if (!(await listProfiles()).some((p) => p.name === name)) {
91
89
  console.error(colors.red("Error:"), `Profile "${name}" not found`);
92
- console.log(`\nCreate it with: xopc profile:create ${name}`);
90
+ console.log(`\nCreate it with: xopc profile create ${name}`);
93
91
  process.exit(1);
94
92
  }
95
93
  console.log(colors.cyan("Run this command to switch to this profile:"));
96
94
  console.log();
97
- console.log(` export XOPC_PROFILE=${name}`);
95
+ console.log(` ${getSwitchCommand(name)}`);
98
96
  console.log();
99
- console.log("Or add to your shell profile:");
100
- console.log(` echo 'export XOPC_PROFILE=${name}' >> ~/.bashrc`);
101
- console.log();
102
- console.log(`State directory: ${stateDir}`);
97
+ console.log(`State directory: ${resolveProfileStateDir(name)}`);
103
98
  } catch (error) {
104
99
  log.error({ error }, "Failed to switch profile");
105
100
  console.error(colors.red("Error:"), error instanceof Error ? error.message : String(error));
106
101
  process.exit(1);
107
102
  }
108
103
  });
104
+ return cmd;
109
105
  }
110
- function registerProfileCommands(program) {
111
- program.addCommand(createProfileListCommand());
112
- program.addCommand(createProfileCreateCommand());
113
- program.addCommand(createProfileDeleteCommand());
114
- program.addCommand(createProfileSwitchCommand());
115
- }
106
+ register({
107
+ id: "profile",
108
+ name: "profile",
109
+ description: "Manage xopc state profiles (~/.xopc vs ~/.xopc-<name>)",
110
+ factory: createProfileCommand,
111
+ metadata: {
112
+ category: "setup",
113
+ examples: ["xopc profile list", "xopc profile create staging"]
114
+ }
115
+ });
116
116
  //#endregion
117
- export { createProfileCreateCommand, createProfileDeleteCommand, createProfileListCommand, createProfileSwitchCommand, registerProfileCommands };
117
+ export { createProfileCommand };
118
118
 
119
119
  //# sourceMappingURL=profile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"profile.js","names":[],"sources":["../../../../src/cli/commands/profile.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createLogger } from '../../utils/logger.js';\nimport {\n listProfiles,\n createProfile,\n deleteProfile,\n getCurrentProfile,\n resolveProfileStateDir,\n} from '../../config/profile.js';\nimport { colors } from '../utils/colors.js';\nimport Table from 'cli-table3';\n\nconst log = createLogger('ProfileCommands');\n\n// ============================================\n// Profile List Command\n// ============================================\n\nexport function createProfileListCommand(): Command {\n return new Command('profile:list')\n .description('List all profiles')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const profiles = await listProfiles();\n\n if (options.json) {\n console.log(JSON.stringify(profiles, null, 2));\n return;\n }\n\n if (profiles.length === 0) {\n console.log('No profiles found. Create one with: xopc profile:create <name>');\n return;\n }\n\n const table = new Table({\n head: ['Name', 'Status', 'Agents', 'Created', 'Directory'].map((h) =>\n colors.cyan(h)\n ),\n colWidths: [15, 10, 8, 20, 40],\n });\n\n for (const profile of profiles) {\n const status = profile.isActive\n ? colors.green('active')\n : colors.gray('inactive');\n\n table.push([\n profile.name === 'default' ? colors.yellow(profile.name) : profile.name,\n status,\n profile.agentCount.toString(),\n profile.createdAt ? new Date(profile.createdAt).toLocaleDateString() : '-',\n profile.stateDir,\n ]);\n }\n\n console.log(table.toString());\n console.log(`\\nCurrent: ${getCurrentProfile()}`);\n } catch (error) {\n log.error({ error }, 'Failed to list profiles');\n console.error(\n colors.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Profile Create Command\n// ============================================\n\nexport function createProfileCreateCommand(): Command {\n return new Command('profile:create')\n .description('Create a new profile')\n .argument('<name>', 'Profile name (letters, numbers, hyphens, underscores)')\n .action(async (name) => {\n try {\n const profile = await createProfile(name);\n\n console.log(colors.green('✓'), `Created profile \"${profile.name}\"`);\n console.log(`\\n Directory: ${profile.stateDir}`);\n console.log(`\\nTo use this profile:`);\n console.log(` export XOPC_PROFILE=${profile.name}`);\n console.log(`\\nOr add to your shell profile:`);\n console.log(` echo 'export XOPC_PROFILE=${profile.name}' >> ~/.bashrc`);\n } catch (error) {\n log.error({ error }, 'Failed to create profile');\n console.error(\n colors.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Profile Delete Command\n// ============================================\n\nexport function createProfileDeleteCommand(): Command {\n return new Command('profile:delete')\n .description('Delete a profile')\n .argument('<name>', 'Profile name')\n .option('-f, --force', 'Force delete even if active')\n .action(async (name, options) => {\n try {\n await deleteProfile(name, { force: options.force });\n\n console.log(colors.green('✓'), `Deleted profile \"${name}\"`);\n } catch (error) {\n log.error({ error }, 'Failed to delete profile');\n console.error(\n colors.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Profile Switch Command\n// ============================================\n\nexport function createProfileSwitchCommand(): Command {\n return new Command('profile:switch')\n .description('Get shell command to switch to a profile')\n .argument('<name>', 'Profile name')\n .action(async (name) => {\n try {\n const stateDir = resolveProfileStateDir(name);\n\n // Check if profile exists\n const profiles = await listProfiles();\n const exists = profiles.some((p) => p.name === name);\n\n if (!exists) {\n console.error(colors.red('Error:'), `Profile \"${name}\" not found`);\n console.log(`\\nCreate it with: xopc profile:create ${name}`);\n process.exit(1);\n }\n\n console.log(colors.cyan('Run this command to switch to this profile:'));\n console.log();\n console.log(` export XOPC_PROFILE=${name}`);\n console.log();\n console.log('Or add to your shell profile:');\n console.log(` echo 'export XOPC_PROFILE=${name}' >> ~/.bashrc`);\n console.log();\n console.log(`State directory: ${stateDir}`);\n } catch (error) {\n log.error({ error }, 'Failed to switch profile');\n console.error(\n colors.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Register All Commands\n// ============================================\n\nexport function registerProfileCommands(program: Command): void {\n program.addCommand(createProfileListCommand());\n program.addCommand(createProfileCreateCommand());\n program.addCommand(createProfileDeleteCommand());\n program.addCommand(createProfileSwitchCommand());\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"profile.js","names":[],"sources":["../../../../src/cli/commands/profile.ts"],"sourcesContent":["import { Command } from 'commander';\nimport Table from 'cli-table3';\n\nimport { createLogger } from '../../utils/logger.js';\nimport {\n createProfile,\n deleteProfile,\n getCurrentProfile,\n getSwitchCommand,\n listProfiles,\n resolveProfileStateDir,\n} from '../../config/profile.js';\nimport { formatExamples, register, type CLIContext } from '../registry.js';\nimport { colors } from '../utils/colors.js';\n\nconst log = createLogger('ProfileCommands');\n\nfunction createProfileCommand(_ctx: CLIContext): Command {\n const cmd = new Command('profile')\n .description('Manage xopc state profiles (~/.xopc vs ~/.xopc-<name>)')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc profile list',\n 'xopc profile create staging',\n 'xopc profile switch staging',\n 'xopc profile delete staging --force',\n ]),\n );\n\n cmd\n .command('list')\n .description('List all profiles')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const profiles = await listProfiles();\n\n if (options.json) {\n console.log(JSON.stringify(profiles, null, 2));\n return;\n }\n\n if (profiles.length === 0) {\n console.log('No profiles found. Create one with: xopc profile create <name>');\n return;\n }\n\n const table = new Table({\n head: ['Name', 'Status', 'Agents', 'Created', 'Directory'].map((h) => colors.cyan(h)),\n colWidths: [15, 10, 8, 20, 40],\n });\n\n for (const profile of profiles) {\n const status = profile.isActive ? colors.green('active') : colors.gray('inactive');\n table.push([\n profile.name === 'default' ? colors.yellow(profile.name) : profile.name,\n status,\n profile.agentCount.toString(),\n profile.createdAt ? new Date(profile.createdAt).toLocaleDateString() : '-',\n profile.stateDir,\n ]);\n }\n\n console.log(table.toString());\n console.log(`\\nCurrent: ${getCurrentProfile()}`);\n } catch (error) {\n log.error({ error }, 'Failed to list profiles');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n cmd\n .command('create')\n .description('Create a new profile')\n .argument('<name>', 'Profile name (letters, numbers, hyphens, underscores)')\n .action(async (name) => {\n try {\n const profile = await createProfile(name);\n\n console.log(colors.green('✓'), `Created profile \"${profile.name}\"`);\n console.log(`\\n Directory: ${profile.stateDir}`);\n console.log('\\nTo use this profile:');\n console.log(` ${getSwitchCommand(profile.name)}`);\n } catch (error) {\n log.error({ error }, 'Failed to create profile');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n cmd\n .command('delete')\n .description('Delete a profile')\n .argument('<name>', 'Profile name')\n .option('-f, --force', 'Force delete even if active')\n .action(async (name, options) => {\n try {\n await deleteProfile(name, { force: options.force });\n console.log(colors.green('✓'), `Deleted profile \"${name}\"`);\n } catch (error) {\n log.error({ error }, 'Failed to delete profile');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n cmd\n .command('switch')\n .description('Print shell command to switch to a profile')\n .argument('<name>', 'Profile name')\n .action(async (name) => {\n try {\n const profiles = await listProfiles();\n const exists = profiles.some((p) => p.name === name);\n\n if (!exists) {\n console.error(colors.red('Error:'), `Profile \"${name}\" not found`);\n console.log(`\\nCreate it with: xopc profile create ${name}`);\n process.exit(1);\n }\n\n console.log(colors.cyan('Run this command to switch to this profile:'));\n console.log();\n console.log(` ${getSwitchCommand(name)}`);\n console.log();\n console.log(`State directory: ${resolveProfileStateDir(name)}`);\n } catch (error) {\n log.error({ error }, 'Failed to switch profile');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n return cmd;\n}\n\nregister({\n id: 'profile',\n name: 'profile',\n description: 'Manage xopc state profiles (~/.xopc vs ~/.xopc-<name>)',\n factory: createProfileCommand,\n metadata: {\n category: 'setup',\n examples: ['xopc profile list', 'xopc profile create staging'],\n },\n});\n\nexport { createProfileCommand };\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { getContextWithOpts } from "../../index.js";
1
+ import { getContextWithOpts } from "../../context.js";
2
2
  import { getSessionManager } from "../../utils/session.js";
3
3
  //#region src/cli/commands/session/utils.ts
4
4
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../../../../src/cli/commands/session/utils.ts"],"sourcesContent":["/**\n * Session command utilities\n */\n\nimport { getSessionManager } from '../../utils/session.js';\nimport { getContextWithOpts } from '../../index.js';\nimport type { SessionIndex } from '../../../session/index.js';\n\n/**\n * Get initialized session manager\n */\nexport async function getManager(): Promise<SessionIndex> {\n getContextWithOpts();\n return getSessionManager();\n}\n\n/**\n * Collect multiple option values into array\n */\nexport function collect(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n"],"mappings":";;;;;;;;;AAWA,eAAsB,aAAoC;AACxD,qBAAoB;AACpB,QAAO,mBAAmB;;;;;AAM5B,SAAgB,QAAQ,OAAe,UAA8B;AACnE,QAAO,SAAS,OAAO,CAAC,MAAM,CAAC"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../../../src/cli/commands/session/utils.ts"],"sourcesContent":["/**\n * Session command utilities\n */\n\nimport { getSessionManager } from '../../utils/session.js';\nimport { getContextWithOpts } from '../../context.js';\nimport type { SessionIndex } from '../../../session/index.js';\n\n/**\n * Get initialized session manager\n */\nexport async function getManager(): Promise<SessionIndex> {\n getContextWithOpts();\n return getSessionManager();\n}\n\n/**\n * Collect multiple option values into array\n */\nexport function collect(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n"],"mappings":";;;;;;;;;AAWA,eAAsB,aAAoC;AACxD,qBAAoB;AACpB,QAAO,mBAAmB;;;;;AAM5B,SAAgB,QAAQ,OAAe,UAA8B;AACnE,QAAO,SAAS,OAAO,CAAC,MAAM,CAAC"}