@xopcai/xopc 0.0.86 → 0.0.87

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 (380) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/adapters/cli-login.js +3 -3
  3. package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
  4. package/dist/extensions/telegram/src/delivery-chat-id.d.ts +1 -1
  5. package/dist/extensions/telegram/src/delivery-chat-id.js +1 -1
  6. package/dist/extensions/telegram/src/delivery-chat-id.js.map +1 -1
  7. package/dist/extensions/telegram/src/routing-integration.js +1 -0
  8. package/dist/extensions/telegram/src/routing-integration.js.map +1 -1
  9. package/dist/extensions/telegram/xopc.extension.json +1 -1
  10. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +2 -2
  11. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +1 -1
  12. package/dist/extensions/weixin/src/api/api.js +2 -2
  13. package/dist/extensions/weixin/src/api/api.js.map +1 -1
  14. package/dist/extensions/weixin/src/auth/accounts.js +12 -12
  15. package/dist/extensions/weixin/src/auth/accounts.js.map +1 -1
  16. package/dist/extensions/weixin/src/delivery-to.js +2 -2
  17. package/dist/extensions/weixin/src/delivery-to.js.map +1 -1
  18. package/dist/extensions/weixin/src/messaging/debug-mode.js +5 -5
  19. package/dist/extensions/weixin/src/messaging/debug-mode.js.map +1 -1
  20. package/dist/extensions/weixin/src/messaging/inbound.js +11 -11
  21. package/dist/extensions/weixin/src/messaging/inbound.js.map +1 -1
  22. package/dist/extensions/weixin/src/storage/sync-buf.js +4 -4
  23. package/dist/extensions/weixin/src/storage/sync-buf.js.map +1 -1
  24. package/dist/extensions/weixin/src/workflow-progress.d.ts +1 -1
  25. package/dist/extensions/weixin/src/workflow-progress.js.map +1 -1
  26. package/dist/gateway/static/root/assets/{agents-mS3_HpRI.js → agents-BEAbXpuP.js} +6 -6
  27. package/dist/gateway/static/root/assets/{apps-page-DrfytjOb.js → apps-page-Dg8R-Szf.js} +1 -1
  28. package/dist/gateway/static/root/assets/{channels-settings-BG6b9KrW.js → channels-settings-yohw9YSu.js} +1 -1
  29. package/dist/gateway/static/root/assets/{channels-status-swr-Bs5kMCMI.js → channels-status-swr-BSHqqCF1.js} +1 -1
  30. package/dist/gateway/static/root/assets/{cron-api-BuVcZ5zR.js → cron-api-0h_QT8U3.js} +1 -1
  31. package/dist/gateway/static/root/assets/{cron-page-BMrloeFH.js → cron-page-BkfKFfFk.js} +1 -1
  32. package/dist/gateway/static/root/assets/{dist-CKU1OOTf.js → dist-Cmjp2APP.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-debug-page-BdW_46sN.js → extension-debug-page-CFa9z_1N.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-page-DW47KI82.js → extension-page-BI8eaTPq.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-settings-page-B-W4x2xP.js → extension-settings-page-x4BB7q1X.js} +1 -1
  36. package/dist/gateway/static/root/assets/{fetch-B2MYHbWg.js → fetch-DRqwef_Q.js} +1 -1
  37. package/dist/gateway/static/root/assets/{field-primitives-DPG-oJmx.js → field-primitives-BiNHBo2Y.js} +1 -1
  38. package/dist/gateway/static/root/assets/{heartbeat-config-api-C8dNts9i.js → heartbeat-config-api-ZRb8qhuz.js} +1 -1
  39. package/dist/gateway/static/root/assets/{index-BmVYculr.js → index-Cu7bKuUi.js} +96 -94
  40. package/dist/gateway/static/root/assets/index-a5gWIdZQ.css +1 -0
  41. package/dist/gateway/static/root/assets/{logs-page-sTsVWz0X.js → logs-page-BFZ8GgCv.js} +1 -1
  42. package/dist/gateway/static/root/assets/{sessions-page-FaG_Vlkb.js → sessions-page-CD7AfB-2.js} +1 -1
  43. package/dist/gateway/static/root/assets/{settings-form-section-DuvRQW--.js → settings-form-section-DiqqVs6m.js} +1 -1
  44. package/dist/gateway/static/root/assets/{settings-page-Bet1OerL.js → settings-page-BBOjEQW3.js} +1 -1
  45. package/dist/gateway/static/root/assets/{share-preview-page-BtG2kLDh.js → share-preview-page-n1Gprylk.js} +1 -1
  46. package/dist/gateway/static/root/assets/{skills-page-DhUO235y.js → skills-page-CcN_gj--.js} +1 -1
  47. package/dist/gateway/static/root/assets/{theme-store-DryYl3qD.js → theme-store-CZOh1nT3.js} +1 -1
  48. package/dist/gateway/static/root/assets/url-Dd8Q7kZZ.js +3 -0
  49. package/dist/gateway/static/root/assets/{utils-BY7bU1DT.js → utils-CkWBfxs4.js} +1 -1
  50. package/dist/gateway/static/root/assets/{voice-api-key-field-CGEydndO.js → voice-api-key-field-O6awz9hi.js} +1 -1
  51. package/dist/gateway/static/root/index.html +5 -5
  52. package/dist/package.js +1 -1
  53. package/dist/src/agent/agent-scope.d.ts +4 -0
  54. package/dist/src/agent/agent-scope.js +53 -10
  55. package/dist/src/agent/agent-scope.js.map +1 -1
  56. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +2 -1
  57. package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
  58. package/dist/src/agent/embedded/session-tool-result-guard.js +2 -1
  59. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  60. package/dist/src/agent/embedded/tool-result-truncation.js +2 -1
  61. package/dist/src/agent/embedded/tool-result-truncation.js.map +1 -1
  62. package/dist/src/agent/fallback/candidates.js +2 -2
  63. package/dist/src/agent/fallback/candidates.js.map +1 -1
  64. package/dist/src/agent/goals/persistent-goal-apis.d.ts +0 -2
  65. package/dist/src/agent/goals/persistent-goal-service.js +0 -1
  66. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
  67. package/dist/src/agent/image/generation/normalization.js +2 -12
  68. package/dist/src/agent/image/generation/normalization.js.map +1 -1
  69. package/dist/src/agent/image/generation/provider-registry.d.ts +4 -8
  70. package/dist/src/agent/image/generation/provider-registry.js.map +1 -1
  71. package/dist/src/agent/image/generation/runtime.d.ts +2 -2
  72. package/dist/src/agent/image/generation/runtime.js.map +1 -1
  73. package/dist/src/agent/image/generation/types.d.ts +0 -18
  74. package/dist/src/agent/image/image-helpers.js +6 -1
  75. package/dist/src/agent/image/image-helpers.js.map +1 -1
  76. package/dist/src/agent/image/index.d.ts +1 -1
  77. package/dist/src/agent/inbound/inbound-loop.d.ts +5 -0
  78. package/dist/src/agent/inbound/inbound-loop.js +41 -10
  79. package/dist/src/agent/inbound/inbound-loop.js.map +1 -1
  80. package/dist/src/agent/inbound/turn-dispatcher.d.ts +4 -0
  81. package/dist/src/agent/inbound/turn-dispatcher.js +6 -4
  82. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  83. package/dist/src/agent/mcp/bundle-mcp-materialize.js +2 -1
  84. package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
  85. package/dist/src/agent/mcp/bundle-mcp-names.js +2 -1
  86. package/dist/src/agent/mcp/bundle-mcp-names.js.map +1 -1
  87. package/dist/src/agent/mcp/bundle-mcp-runtime.js +2 -1
  88. package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +1 -1
  89. package/dist/src/agent/mcp/mcp-transport-config.js +2 -1
  90. package/dist/src/agent/mcp/mcp-transport-config.js.map +1 -1
  91. package/dist/src/agent/mcp/mcp-transport.js +2 -1
  92. package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
  93. package/dist/src/agent/media-generation/runtime-shared.js +2 -9
  94. package/dist/src/agent/media-generation/runtime-shared.js.map +1 -1
  95. package/dist/src/agent/messaging/command-handler.d.ts +6 -0
  96. package/dist/src/agent/messaging/command-handler.js +5 -0
  97. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  98. package/dist/src/agent/prompt/safety.d.ts +0 -7
  99. package/dist/src/agent/prompt/safety.js +1 -20
  100. package/dist/src/agent/prompt/safety.js.map +1 -1
  101. package/dist/src/agent/service/build-direct-message-content.js +1 -1
  102. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  103. package/dist/src/agent/service/direct-turn-helpers.d.ts +3 -1
  104. package/dist/src/agent/service/direct-turn-helpers.js +6 -1
  105. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  106. package/dist/src/agent/service/process-direct-one-shot.d.ts +4 -0
  107. package/dist/src/agent/service/process-direct-one-shot.js +15 -2
  108. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  109. package/dist/src/agent/service/process-direct-streaming.d.ts +4 -0
  110. package/dist/src/agent/service/process-direct-streaming.js +34 -4
  111. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  112. package/dist/src/agent/service/webchat-tts.js +1 -1
  113. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  114. package/dist/src/agent/service.d.ts +8 -0
  115. package/dist/src/agent/service.js +21 -1
  116. package/dist/src/agent/service.js.map +1 -1
  117. package/dist/src/agent/tools/create-share-tool.js +27 -20
  118. package/dist/src/agent/tools/create-share-tool.js.map +1 -1
  119. package/dist/src/agent/tools/factory.js +1 -1
  120. package/dist/src/agent/tools/index.d.ts +0 -1
  121. package/dist/src/agent/tools/index.js +4 -5
  122. package/dist/src/agent/tools/shell.js +0 -13
  123. package/dist/src/agent/tools/shell.js.map +1 -1
  124. package/dist/src/agent/tools/workflow-tool.js +7 -1
  125. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  126. package/dist/src/agent/workflow/channel-capability.d.ts +3 -3
  127. package/dist/src/agent/workflow/lint.d.ts +38 -0
  128. package/dist/src/agent/workflow/lint.js +74 -0
  129. package/dist/src/agent/workflow/lint.js.map +1 -0
  130. package/dist/src/agent/workflow/parser.js +4 -1
  131. package/dist/src/agent/workflow/parser.js.map +1 -1
  132. package/dist/src/agent/workflow/runtime.d.ts +3 -0
  133. package/dist/src/agent/workflow/runtime.js +76 -3
  134. package/dist/src/agent/workflow/runtime.js.map +1 -1
  135. package/dist/src/agent/workflow/types.d.ts +3 -1
  136. package/dist/src/browser/index.js +4 -4
  137. package/dist/src/browser/manager.d.ts +1 -3
  138. package/dist/src/browser/manager.js +0 -6
  139. package/dist/src/browser/manager.js.map +1 -1
  140. package/dist/src/browser/providers/browser-ext-install.d.ts +4 -4
  141. package/dist/src/browser/providers/browser-ext-install.js +38 -85
  142. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  143. package/dist/src/browser/providers/cloakbrowser.d.ts +0 -5
  144. package/dist/src/browser/providers/cloakbrowser.js +2 -55
  145. package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
  146. package/dist/src/channels/attachments/voice-stt-webchat.js +10 -8
  147. package/dist/src/channels/attachments/voice-stt-webchat.js.map +1 -1
  148. package/dist/src/channels/pairing/allow-from-file.js +9 -9
  149. package/dist/src/channels/pairing/allow-from-file.js.map +1 -1
  150. package/dist/src/channels/pairing/pairing-store.js +6 -6
  151. package/dist/src/channels/pairing/pairing-store.js.map +1 -1
  152. package/dist/src/chat-commands/builtins/session.js +1 -1
  153. package/dist/src/chat-commands/builtins/session.js.map +1 -1
  154. package/dist/src/chat-commands/builtins/tts.js +2 -2
  155. package/dist/src/chat-commands/builtins/tts.js.map +1 -1
  156. package/dist/src/chat-commands/context.d.ts +3 -0
  157. package/dist/src/chat-commands/context.js +21 -3
  158. package/dist/src/chat-commands/context.js.map +1 -1
  159. package/dist/src/chat-commands/session-key.d.ts +4 -37
  160. package/dist/src/chat-commands/session-key.js +49 -85
  161. package/dist/src/chat-commands/session-key.js.map +1 -1
  162. package/dist/src/chat-commands/types.d.ts +2 -0
  163. package/dist/src/cli/commands/agent/interactive.js +2 -2
  164. package/dist/src/cli/commands/agent/interactive.js.map +1 -1
  165. package/dist/src/cli/commands/agent/sessions.js +2 -2
  166. package/dist/src/cli/commands/agent/sessions.js.map +1 -1
  167. package/dist/src/cli/commands/agent.js +4 -5
  168. package/dist/src/cli/commands/agent.js.map +1 -1
  169. package/dist/src/cli/commands/channels.js +1 -5
  170. package/dist/src/cli/commands/channels.js.map +1 -1
  171. package/dist/src/cli/commands/gateway/lifecycle-core.js +1 -1
  172. package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
  173. package/dist/src/cli/commands/gateway/logs.d.ts +9 -0
  174. package/dist/src/cli/commands/gateway/logs.js +50 -17
  175. package/dist/src/cli/commands/gateway/logs.js.map +1 -1
  176. package/dist/src/cli/commands/image.js +22 -21
  177. package/dist/src/cli/commands/image.js.map +1 -1
  178. package/dist/src/cli/commands/session/utils.js +2 -2
  179. package/dist/src/cli/commands/session/utils.js.map +1 -1
  180. package/dist/src/cli/commands/update.js +26 -46
  181. package/dist/src/cli/commands/update.js.map +1 -1
  182. package/dist/src/cli/utils/session.d.ts +0 -5
  183. package/dist/src/cli/utils/session.js +1 -6
  184. package/dist/src/cli/utils/session.js.map +1 -1
  185. package/dist/src/commands/agents.config.js +1 -1
  186. package/dist/src/commands/agents.config.js.map +1 -1
  187. package/dist/src/config/agent-profile.js +5 -27
  188. package/dist/src/config/agent-profile.js.map +1 -1
  189. package/dist/src/config/index.js +2 -2
  190. package/dist/src/config/model-input.js +2 -5
  191. package/dist/src/config/model-input.js.map +1 -1
  192. package/dist/src/config/schema.d.ts +201 -217
  193. package/dist/src/config/schema.js +54 -39
  194. package/dist/src/config/schema.js.map +1 -1
  195. package/dist/src/config/workspace-path-helpers.d.ts +1 -2
  196. package/dist/src/config/workspace-path-helpers.js.map +1 -1
  197. package/dist/src/daemon/install-plan.js +25 -1
  198. package/dist/src/daemon/install-plan.js.map +1 -1
  199. package/dist/src/daemon/launchd.d.ts +8 -0
  200. package/dist/src/daemon/launchd.js +5 -12
  201. package/dist/src/daemon/launchd.js.map +1 -1
  202. package/dist/src/daemon/schtasks.d.ts +25 -0
  203. package/dist/src/daemon/schtasks.js +166 -46
  204. package/dist/src/daemon/schtasks.js.map +1 -1
  205. package/dist/src/daemon/service.js +5 -4
  206. package/dist/src/daemon/service.js.map +1 -1
  207. package/dist/src/daemon/systemd.d.ts +6 -0
  208. package/dist/src/daemon/systemd.js +18 -3
  209. package/dist/src/daemon/systemd.js.map +1 -1
  210. package/dist/src/extensions/activation-context.js +0 -1
  211. package/dist/src/extensions/activation-context.js.map +1 -1
  212. package/dist/src/extensions/normalize-manifest.js +0 -1
  213. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  214. package/dist/src/extensions/types/manifest.d.ts +0 -2
  215. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  216. package/dist/src/gateway/agent-builtin-tools.js +1 -0
  217. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  218. package/dist/src/gateway/agents-admin.js +10 -2
  219. package/dist/src/gateway/agents-admin.js.map +1 -1
  220. package/dist/src/gateway/heartbeat/service.js +2 -2
  221. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  222. package/dist/src/gateway/hono/app.js +1 -1
  223. package/dist/src/gateway/hono/lib/agent-model.d.ts +18 -10
  224. package/dist/src/gateway/hono/lib/agent-model.js +24 -35
  225. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  226. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  227. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  228. package/dist/src/gateway/hono/lib/safe-voice-config.js +14 -53
  229. package/dist/src/gateway/hono/lib/safe-voice-config.js.map +1 -1
  230. package/dist/src/gateway/hono/routes/config-patch/agents.js +17 -5
  231. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  232. package/dist/src/gateway/hono/routes/config-patch/channels.js +0 -11
  233. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  234. package/dist/src/gateway/hono/routes/goals.js +1 -1
  235. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  236. package/dist/src/gateway/hono/routes/sessions.js +28 -7
  237. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  238. package/dist/src/gateway/hono/routes/shares.js +14 -12
  239. package/dist/src/gateway/hono/routes/shares.js.map +1 -1
  240. package/dist/src/gateway/hono/routes/tunnel.js +1 -1
  241. package/dist/src/gateway/hono/routes/update.js +4 -2
  242. package/dist/src/gateway/hono/routes/update.js.map +1 -1
  243. package/dist/src/gateway/hono/sse.js +16 -33
  244. package/dist/src/gateway/hono/sse.js.map +1 -1
  245. package/dist/src/gateway/lock.js +10 -10
  246. package/dist/src/gateway/lock.js.map +1 -1
  247. package/dist/src/gateway/ports.js +6 -6
  248. package/dist/src/gateway/ports.js.map +1 -1
  249. package/dist/src/gateway/resolve-webchat-session-key.d.ts +19 -0
  250. package/dist/src/gateway/resolve-webchat-session-key.js +46 -0
  251. package/dist/src/gateway/resolve-webchat-session-key.js.map +1 -0
  252. package/dist/src/gateway/service/run-gateway-agent.js +27 -11
  253. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  254. package/dist/src/gateway/service/sessions-api.d.ts +3 -0
  255. package/dist/src/gateway/service/sessions-api.js +8 -0
  256. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  257. package/dist/src/gateway/service.d.ts +0 -2
  258. package/dist/src/gateway/service.js +2 -7
  259. package/dist/src/gateway/service.js.map +1 -1
  260. package/dist/src/gateway/session-reset-service.d.ts +20 -0
  261. package/dist/src/gateway/session-reset-service.js +54 -0
  262. package/dist/src/gateway/session-reset-service.js.map +1 -0
  263. package/dist/src/gateway/startup-readiness.d.ts +1 -1
  264. package/dist/src/gateway/startup-readiness.js +1 -0
  265. package/dist/src/gateway/startup-readiness.js.map +1 -1
  266. package/dist/src/heartbeat/index.js +1 -1
  267. package/dist/src/infra/gateway-processes.js +2 -2
  268. package/dist/src/infra/gateway-processes.js.map +1 -1
  269. package/dist/src/infra/run-command.d.ts +16 -0
  270. package/dist/src/infra/run-command.js +67 -0
  271. package/dist/src/infra/run-command.js.map +1 -0
  272. package/dist/src/infra/update-global.d.ts +45 -0
  273. package/dist/src/infra/update-global.js +224 -0
  274. package/dist/src/infra/update-global.js.map +1 -0
  275. package/dist/src/mcp/channel-bridge.js +1 -1
  276. package/dist/src/mcp/channel-shared.js +2 -1
  277. package/dist/src/mcp/channel-shared.js.map +1 -1
  278. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  279. package/dist/src/providers/auth-runtime/auth-profile-store.js.map +1 -1
  280. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -12
  281. package/dist/src/providers/auth-runtime/resolve-auth.js.map +1 -1
  282. package/dist/src/providers/auth-runtime/types.d.ts +6 -12
  283. package/dist/src/routing/agent-session-key.d.ts +58 -0
  284. package/dist/src/routing/agent-session-key.js +164 -0
  285. package/dist/src/routing/agent-session-key.js.map +1 -0
  286. package/dist/src/routing/index.d.ts +1 -1
  287. package/dist/src/routing/index.js +4 -2
  288. package/dist/src/routing/index.js.map +1 -1
  289. package/dist/src/routing/resolve-route.d.ts +15 -0
  290. package/dist/src/routing/resolve-route.js +41 -20
  291. package/dist/src/routing/resolve-route.js.map +1 -1
  292. package/dist/src/routing/resolve-tui-session-key.d.ts +25 -0
  293. package/dist/src/routing/resolve-tui-session-key.js +54 -0
  294. package/dist/src/routing/resolve-tui-session-key.js.map +1 -0
  295. package/dist/src/routing/session-key-utils.d.ts +24 -0
  296. package/dist/src/routing/session-key-utils.js +92 -0
  297. package/dist/src/routing/session-key-utils.js.map +1 -0
  298. package/dist/src/routing/session-key.d.ts +19 -49
  299. package/dist/src/routing/session-key.js +143 -116
  300. package/dist/src/routing/session-key.js.map +1 -1
  301. package/dist/src/session/index.d.ts +6 -0
  302. package/dist/src/session/index.js +7 -1
  303. package/dist/src/session/init-session-turn.d.ts +30 -0
  304. package/dist/src/session/init-session-turn.js +102 -0
  305. package/dist/src/session/init-session-turn.js.map +1 -0
  306. package/dist/src/session/lifecycle-timestamps.d.ts +8 -0
  307. package/dist/src/session/lifecycle-timestamps.js +16 -0
  308. package/dist/src/session/lifecycle-timestamps.js.map +1 -0
  309. package/dist/src/session/manager.d.ts +7 -1
  310. package/dist/src/session/manager.js +8 -1
  311. package/dist/src/session/manager.js.map +1 -1
  312. package/dist/src/session/parity/transcript-paths.js +2 -2
  313. package/dist/src/session/parity/transcript-paths.js.map +1 -1
  314. package/dist/src/session/parity/xopc-session-disk-entry.d.ts +6 -0
  315. package/dist/src/session/reset-policy.d.ts +32 -0
  316. package/dist/src/session/reset-policy.js +65 -0
  317. package/dist/src/session/reset-policy.js.map +1 -0
  318. package/dist/src/session/reset-triggers.d.ts +20 -0
  319. package/dist/src/session/reset-triggers.js +63 -0
  320. package/dist/src/session/reset-triggers.js.map +1 -0
  321. package/dist/src/session/reset-type.d.ts +12 -0
  322. package/dist/src/session/reset-type.js +25 -0
  323. package/dist/src/session/reset-type.js.map +1 -0
  324. package/dist/src/session/resolve-session.d.ts +30 -0
  325. package/dist/src/session/resolve-session.js +93 -0
  326. package/dist/src/session/resolve-session.js.map +1 -0
  327. package/dist/src/session/session-title.js +3 -2
  328. package/dist/src/session/session-title.js.map +1 -1
  329. package/dist/src/session/store.d.ts +11 -4
  330. package/dist/src/session/store.js +57 -6
  331. package/dist/src/session/store.js.map +1 -1
  332. package/dist/src/session/transcript-events.js +2 -1
  333. package/dist/src/session/transcript-events.js.map +1 -1
  334. package/dist/src/share/share-url.d.ts +33 -0
  335. package/dist/src/share/share-url.js +56 -14
  336. package/dist/src/share/share-url.js.map +1 -1
  337. package/dist/src/tui/backends/embedded-backend.js +4 -9
  338. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  339. package/dist/src/tui/backends/gateway-sse-backend.js +1 -1
  340. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  341. package/dist/src/tui/components/chat-log.js +3 -3
  342. package/dist/src/tui/components/chat-log.js.map +1 -1
  343. package/dist/src/tui/theme.d.ts +0 -2
  344. package/dist/src/tui/theme.js +1 -3
  345. package/dist/src/tui/theme.js.map +1 -1
  346. package/dist/src/tui/tui-commands.d.ts +3 -0
  347. package/dist/src/tui/tui-commands.js +45 -10
  348. package/dist/src/tui/tui-commands.js.map +1 -1
  349. package/dist/src/tui/tui-keybindings-file.js +1 -21
  350. package/dist/src/tui/tui-keybindings-file.js.map +1 -1
  351. package/dist/src/tui/tui-session-actions.d.ts +28 -0
  352. package/dist/src/tui/tui-session-actions.js +88 -0
  353. package/dist/src/tui/tui-session-actions.js.map +1 -0
  354. package/dist/src/tui/tui.js +52 -47
  355. package/dist/src/tui/tui.js.map +1 -1
  356. package/dist/src/utils/string-coerce.d.ts +2 -0
  357. package/dist/src/utils/string-coerce.js +10 -1
  358. package/dist/src/utils/string-coerce.js.map +1 -1
  359. package/dist/src/voice/stt/config-slice.d.ts +2 -5
  360. package/dist/src/voice/stt/config-slice.js +5 -26
  361. package/dist/src/voice/stt/config-slice.js.map +1 -1
  362. package/dist/src/voice/stt/types.d.ts +1 -18
  363. package/dist/src/voice/stt/types.js +4 -2
  364. package/dist/src/voice/stt/types.js.map +1 -1
  365. package/dist/src/voice/tts/config-slice.d.ts +3 -7
  366. package/dist/src/voice/tts/config-slice.js +7 -38
  367. package/dist/src/voice/tts/config-slice.js.map +1 -1
  368. package/dist/src/voice/tts/merge-config.js +2 -48
  369. package/dist/src/voice/tts/merge-config.js.map +1 -1
  370. package/dist/src/voice/tts/providers/alibaba-speech.js +1 -1
  371. package/dist/src/voice/tts/providers/alibaba-speech.js.map +1 -1
  372. package/dist/src/voice/tts/types.d.ts +1 -29
  373. package/dist/src/voice/tts/types.js +19 -17
  374. package/dist/src/voice/tts/types.js.map +1 -1
  375. package/package.json +1 -4
  376. package/dist/gateway/static/root/assets/index-ew_2L2We.css +0 -1
  377. package/dist/gateway/static/root/assets/url-BwNL6Rgk.js +0 -3
  378. package/dist/src/agent/tools/browser-legacy-tools.d.ts +0 -17
  379. package/dist/src/agent/tools/browser-legacy-tools.js +0 -766
  380. package/dist/src/agent/tools/browser-legacy-tools.js.map +0 -1
@@ -1,5 +1,14 @@
1
1
  import { Command } from 'commander';
2
+ declare function parseLineCount(value: string | number | undefined): number;
3
+ declare function resolveGatewayLogPath(configPath: string): string;
4
+ declare function readLastLines(filePath: string, lineCount: number): Promise<string>;
2
5
  /**
3
6
  * Create logs subcommand
4
7
  */
5
8
  export declare function createLogsCommand(): Command;
9
+ export declare const gatewayLogsTestInternals: {
10
+ parseLineCount: typeof parseLineCount;
11
+ readLastLines: typeof readLastLines;
12
+ resolveGatewayLogPath: typeof resolveGatewayLogPath;
13
+ };
14
+ export {};
@@ -1,39 +1,72 @@
1
1
  import { getContextWithOpts } from "../../context.js";
2
- import { execSync, spawn } from "child_process";
2
+ import path from "node:path";
3
+ import { existsSync, statSync, watch } from "node:fs";
4
+ import { readFile } from "node:fs/promises";
3
5
  import { Command } from "commander";
4
6
  //#region src/cli/commands/gateway/logs.ts
7
+ function parseLineCount(value) {
8
+ const parsed = parseInt(String(value ?? "50"), 10);
9
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 50;
10
+ }
11
+ function resolveGatewayLogPath(configPath) {
12
+ const logDir = process.env.XOPC_LOG_DIR || path.join(path.dirname(configPath), "logs");
13
+ return path.join(logDir, "app.log");
14
+ }
15
+ async function readLastLines(filePath, lineCount) {
16
+ if (!existsSync(filePath)) return "No logs found\n";
17
+ const lines = (await readFile(filePath, "utf8")).split(/\r?\n/);
18
+ const selectedLines = (lines.at(-1) === "" ? lines.slice(0, -1) : lines).slice(-lineCount);
19
+ return `${selectedLines.join("\n")}${selectedLines.length > 0 ? "\n" : ""}`;
20
+ }
21
+ async function followLogFile(filePath, lineCount) {
22
+ process.stdout.write(await readLastLines(filePath, lineCount));
23
+ let lastSize = existsSync(filePath) ? statSync(filePath).size : 0;
24
+ const directory = path.dirname(filePath);
25
+ const fileName = path.basename(filePath);
26
+ watch(directory, async (_eventType, changedFileName) => {
27
+ if (changedFileName && changedFileName.toString() !== fileName) return;
28
+ if (!existsSync(filePath)) {
29
+ lastSize = 0;
30
+ return;
31
+ }
32
+ const nextSize = statSync(filePath).size;
33
+ if (nextSize < lastSize) lastSize = 0;
34
+ if (nextSize === lastSize) return;
35
+ const content = await readFile(filePath, "utf8");
36
+ process.stdout.write(content.slice(lastSize));
37
+ lastSize = nextSize;
38
+ });
39
+ }
5
40
  /**
6
41
  * Create logs subcommand
7
42
  */
8
43
  function createLogsCommand() {
9
44
  return new Command("logs").description("View gateway logs").option("--lines <n>", "Number of lines to show", "50").option("--follow", "Follow log output (like tail -f)").action(async (options) => {
10
45
  const ctx = getContextWithOpts();
11
- const logDir = process.env.XOPC_LOG_DIR || `${ctx.configPath.replace("/config.json", "")}/logs`;
46
+ const lineCount = parseLineCount(options.lines);
47
+ const logPath = resolveGatewayLogPath(ctx.configPath);
12
48
  try {
13
49
  if (options.follow) {
14
50
  console.log(`📜 Following gateway logs (Ctrl+C to exit)...\n`);
15
- spawn("tail", [
16
- "-f",
17
- "-n",
18
- options.lines,
19
- `${logDir}/app.log`
20
- ], { stdio: "inherit" }).on("error", (err) => {
21
- console.error("❌ Failed to tail logs:", err.message);
22
- process.exit(1);
23
- });
24
- } else {
25
- const output = execSync(`tail -n ${options.lines} ${logDir}/app.log 2>/dev/null || echo "No logs found"`, { encoding: "utf-8" });
26
- console.log(`📜 Last ${options.lines} lines of gateway logs:\n`);
27
- console.log(output);
28
- process.exit(0);
51
+ await followLogFile(logPath, lineCount);
52
+ return;
29
53
  }
54
+ const output = await readLastLines(logPath, lineCount);
55
+ console.log(`📜 Last ${lineCount} lines of gateway logs:\n`);
56
+ console.log(output);
57
+ process.exit(0);
30
58
  } catch (err) {
31
59
  console.error("❌ Failed to read logs:", err);
32
60
  process.exit(1);
33
61
  }
34
62
  });
35
63
  }
64
+ const gatewayLogsTestInternals = {
65
+ parseLineCount,
66
+ readLastLines,
67
+ resolveGatewayLogPath
68
+ };
36
69
  //#endregion
37
- export { createLogsCommand };
70
+ export { createLogsCommand, gatewayLogsTestInternals };
38
71
 
39
72
  //# sourceMappingURL=logs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logs.js","names":[],"sources":["../../../../../src/cli/commands/gateway/logs.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { spawn, execSync } from 'child_process';\nimport { getContextWithOpts } from '../../context.js';\n\n/**\n * Create logs subcommand\n */\nexport function createLogsCommand(): Command {\n return new Command('logs')\n .description('View gateway logs')\n .option('--lines <n>', 'Number of lines to show', '50')\n .option('--follow', 'Follow log output (like tail -f)')\n .action(async (options) => {\n const ctx = getContextWithOpts();\n \n // Determine log directory from environment or default\n const logDir = process.env.XOPC_LOG_DIR || \n `${ctx.configPath.replace('/config.json', '')}/logs`;\n\n try {\n if (options.follow) {\n // Follow mode: use tail -f\n console.log(`📜 Following gateway logs (Ctrl+C to exit)...\\n`);\n const tail = spawn('tail', ['-f', '-n', options.lines, `${logDir}/app.log`], {\n stdio: 'inherit',\n });\n \n tail.on('error', (err) => {\n console.error('❌ Failed to tail logs:', err.message);\n process.exit(1);\n });\n } else {\n // Static mode: read last N lines\n const output = execSync(\n `tail -n ${options.lines} ${logDir}/app.log 2>/dev/null || echo \"No logs found\"`,\n { encoding: 'utf-8' }\n );\n \n console.log(`📜 Last ${options.lines} lines of gateway logs:\\n`);\n console.log(output);\n process.exit(0);\n }\n } catch (err) {\n console.error('❌ Failed to read logs:', err);\n process.exit(1);\n }\n });\n}\n"],"mappings":";;;;;;;AAOA,SAAgB,oBAA6B;AAC3C,QAAO,IAAI,QAAQ,OAAO,CACvB,YAAY,oBAAoB,CAChC,OAAO,eAAe,2BAA2B,KAAK,CACtD,OAAO,YAAY,mCAAmC,CACtD,OAAO,OAAO,YAAY;EACzB,MAAM,MAAM,oBAAoB;EAGhC,MAAM,SAAS,QAAQ,IAAI,gBACzB,GAAG,IAAI,WAAW,QAAQ,gBAAgB,GAAG,CAAC;AAEhD,MAAI;AACF,OAAI,QAAQ,QAAQ;AAElB,YAAQ,IAAI,kDAAkD;AACjD,UAAM,QAAQ;KAAC;KAAM;KAAM,QAAQ;KAAO,GAAG,OAAO;KAAU,EAAE,EAC3E,OAAO,WACR,CAEG,CAAC,GAAG,UAAU,QAAQ;AACxB,aAAQ,MAAM,0BAA0B,IAAI,QAAQ;AACpD,aAAQ,KAAK,EAAE;MACf;UACG;IAEL,MAAM,SAAS,SACb,WAAW,QAAQ,MAAM,GAAG,OAAO,+CACnC,EAAE,UAAU,SAAS,CACtB;AAED,YAAQ,IAAI,WAAW,QAAQ,MAAM,2BAA2B;AAChE,YAAQ,IAAI,OAAO;AACnB,YAAQ,KAAK,EAAE;;WAEV,KAAK;AACZ,WAAQ,MAAM,0BAA0B,IAAI;AAC5C,WAAQ,KAAK,EAAE;;GAEjB"}
1
+ {"version":3,"file":"logs.js","names":[],"sources":["../../../../../src/cli/commands/gateway/logs.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { existsSync, statSync, watch } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { getContextWithOpts } from '../../context.js';\n\nfunction parseLineCount(value: string | number | undefined): number {\n const parsed = parseInt(String(value ?? '50'), 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 50;\n}\n\nfunction resolveGatewayLogPath(configPath: string): string {\n const logDir = process.env.XOPC_LOG_DIR || path.join(path.dirname(configPath), 'logs');\n return path.join(logDir, 'app.log');\n}\n\nasync function readLastLines(filePath: string, lineCount: number): Promise<string> {\n if (!existsSync(filePath)) {\n return 'No logs found\\n';\n }\n\n const content = await readFile(filePath, 'utf8');\n const lines = content.split(/\\r?\\n/);\n const trailingEmptyLine = lines.at(-1) === '';\n const logLines = trailingEmptyLine ? lines.slice(0, -1) : lines;\n const selectedLines = logLines.slice(-lineCount);\n return `${selectedLines.join('\\n')}${selectedLines.length > 0 ? '\\n' : ''}`;\n}\n\nasync function followLogFile(filePath: string, lineCount: number): Promise<void> {\n process.stdout.write(await readLastLines(filePath, lineCount));\n let lastSize = existsSync(filePath) ? statSync(filePath).size : 0;\n\n const directory = path.dirname(filePath);\n const fileName = path.basename(filePath);\n watch(directory, async (_eventType, changedFileName) => {\n if (changedFileName && changedFileName.toString() !== fileName) {\n return;\n }\n if (!existsSync(filePath)) {\n lastSize = 0;\n return;\n }\n\n const nextSize = statSync(filePath).size;\n if (nextSize < lastSize) {\n lastSize = 0;\n }\n if (nextSize === lastSize) {\n return;\n }\n\n const content = await readFile(filePath, 'utf8');\n process.stdout.write(content.slice(lastSize));\n lastSize = nextSize;\n });\n}\n\n/**\n * Create logs subcommand\n */\nexport function createLogsCommand(): Command {\n return new Command('logs')\n .description('View gateway logs')\n .option('--lines <n>', 'Number of lines to show', '50')\n .option('--follow', 'Follow log output (like tail -f)')\n .action(async (options) => {\n const ctx = getContextWithOpts();\n const lineCount = parseLineCount(options.lines);\n const logPath = resolveGatewayLogPath(ctx.configPath);\n\n try {\n if (options.follow) {\n console.log(`📜 Following gateway logs (Ctrl+C to exit)...\\n`);\n await followLogFile(logPath, lineCount);\n return;\n }\n\n const output = await readLastLines(logPath, lineCount);\n console.log(`📜 Last ${lineCount} lines of gateway logs:\\n`);\n console.log(output);\n process.exit(0);\n } catch (err) {\n console.error('❌ Failed to read logs:', err);\n process.exit(1);\n }\n });\n}\n\nexport const gatewayLogsTestInternals = {\n parseLineCount,\n readLastLines,\n resolveGatewayLogPath,\n};\n"],"mappings":";;;;;;AAOA,SAAS,eAAe,OAA4C;CAClE,MAAM,SAAS,SAAS,OAAO,SAAS,KAAK,EAAE,GAAG;AAClD,QAAO,OAAO,SAAS,OAAO,IAAI,SAAS,IAAI,SAAS;;AAG1D,SAAS,sBAAsB,YAA4B;CACzD,MAAM,SAAS,QAAQ,IAAI,gBAAgB,KAAK,KAAK,KAAK,QAAQ,WAAW,EAAE,OAAO;AACtF,QAAO,KAAK,KAAK,QAAQ,UAAU;;AAGrC,eAAe,cAAc,UAAkB,WAAoC;AACjF,KAAI,CAAC,WAAW,SAAS,CACvB,QAAO;CAIT,MAAM,SAAQ,MADQ,SAAS,UAAU,OAAO,EAC1B,MAAM,QAAQ;CAGpC,MAAM,iBAFoB,MAAM,GAAG,GAAG,KAAK,KACN,MAAM,MAAM,GAAG,GAAG,GAAG,OAC3B,MAAM,CAAC,UAAU;AAChD,QAAO,GAAG,cAAc,KAAK,KAAK,GAAG,cAAc,SAAS,IAAI,OAAO;;AAGzE,eAAe,cAAc,UAAkB,WAAkC;AAC/E,SAAQ,OAAO,MAAM,MAAM,cAAc,UAAU,UAAU,CAAC;CAC9D,IAAI,WAAW,WAAW,SAAS,GAAG,SAAS,SAAS,CAAC,OAAO;CAEhE,MAAM,YAAY,KAAK,QAAQ,SAAS;CACxC,MAAM,WAAW,KAAK,SAAS,SAAS;AACxC,OAAM,WAAW,OAAO,YAAY,oBAAoB;AACtD,MAAI,mBAAmB,gBAAgB,UAAU,KAAK,SACpD;AAEF,MAAI,CAAC,WAAW,SAAS,EAAE;AACzB,cAAW;AACX;;EAGF,MAAM,WAAW,SAAS,SAAS,CAAC;AACpC,MAAI,WAAW,SACb,YAAW;AAEb,MAAI,aAAa,SACf;EAGF,MAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAChD,UAAQ,OAAO,MAAM,QAAQ,MAAM,SAAS,CAAC;AAC7C,aAAW;GACX;;;;;AAMJ,SAAgB,oBAA6B;AAC3C,QAAO,IAAI,QAAQ,OAAO,CACvB,YAAY,oBAAoB,CAChC,OAAO,eAAe,2BAA2B,KAAK,CACtD,OAAO,YAAY,mCAAmC,CACtD,OAAO,OAAO,YAAY;EACzB,MAAM,MAAM,oBAAoB;EAChC,MAAM,YAAY,eAAe,QAAQ,MAAM;EAC/C,MAAM,UAAU,sBAAsB,IAAI,WAAW;AAErD,MAAI;AACF,OAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,kDAAkD;AAC9D,UAAM,cAAc,SAAS,UAAU;AACvC;;GAGF,MAAM,SAAS,MAAM,cAAc,SAAS,UAAU;AACtD,WAAQ,IAAI,WAAW,UAAU,2BAA2B;AAC5D,WAAQ,IAAI,OAAO;AACnB,WAAQ,KAAK,EAAE;WACR,KAAK;AACZ,WAAQ,MAAM,0BAA0B,IAAI;AAC5C,WAAQ,KAAK,EAAE;;GAEjB;;AAGN,MAAa,2BAA2B;CACtC;CACA;CACA;CACD"}
@@ -102,11 +102,10 @@ function createImageCommand(_ctx) {
102
102
  if (!config.agents) config.agents = { defaults: {} };
103
103
  if (!config.agents.defaults) config.agents.defaults = {};
104
104
  const existingFallbacks = modelFallbacksToArray(config.agents.defaults.imageModel);
105
- if (existingFallbacks.length > 0) config.agents.defaults.imageModel = {
105
+ config.agents.defaults.imageModel = existingFallbacks.length > 0 ? {
106
106
  primary: modelRef,
107
107
  fallbacks: existingFallbacks
108
- };
109
- else config.agents.defaults.imageModel = modelRef;
108
+ } : { primary: modelRef };
110
109
  await saveConfig(config, configPath);
111
110
  console.log(colors.green(`Image understanding model set to: ${modelRef}`));
112
111
  });
@@ -122,11 +121,10 @@ function createImageCommand(_ctx) {
122
121
  if (!config.agents) config.agents = { defaults: {} };
123
122
  if (!config.agents.defaults) config.agents.defaults = {};
124
123
  const existingFallbacks = modelFallbacksToArray(config.agents.defaults.imageGenerationModel);
125
- if (existingFallbacks.length > 0) config.agents.defaults.imageGenerationModel = {
124
+ config.agents.defaults.imageGenerationModel = existingFallbacks.length > 0 ? {
126
125
  primary: modelRef,
127
126
  fallbacks: existingFallbacks
128
- };
129
- else config.agents.defaults.imageGenerationModel = modelRef;
127
+ } : { primary: modelRef };
130
128
  await saveConfig(config, configPath);
131
129
  console.log(colors.green(`Image generation model set to: ${modelRef}`));
132
130
  });
@@ -190,11 +188,10 @@ function createImageCommand(_ctx) {
190
188
  const removed = fallbacks.splice(index, 1)[0];
191
189
  if (!config.agents) config.agents = { defaults: {} };
192
190
  if (!config.agents.defaults) config.agents.defaults = {};
193
- if (fallbacks.length > 0 && primary) config.agents.defaults[configKey] = {
191
+ if (primary) config.agents.defaults[configKey] = fallbacks.length > 0 ? {
194
192
  primary,
195
193
  fallbacks
196
- };
197
- else if (primary) config.agents.defaults[configKey] = primary;
194
+ } : { primary };
198
195
  await saveConfig(config, configPath);
199
196
  console.log(colors.green(`Removed fallback: ${removed}`));
200
197
  });
@@ -272,22 +269,24 @@ function createImageCommand(_ctx) {
272
269
  if (!config.agents.defaults) config.agents.defaults = {};
273
270
  const current = config.agents.defaults.imageGenerationModel;
274
271
  const primary = resolveAgentModelPrimaryValue(current);
272
+ if (!primary) {
273
+ console.error(colors.red("No image generation model is configured. Run `xopc image set-generation <provider/model>` first."));
274
+ process.exit(1);
275
+ }
275
276
  const fallbacks = resolveAgentModelFallbackValues(current);
276
- const autoProviderFallback = typeof current === "object" && current !== null && !Array.isArray(current) ? current.autoProviderFallback === true : false;
277
+ const autoProviderFallback = current?.autoProviderFallback === true;
277
278
  if (ms === 0) {
278
- if (primary && fallbacks.length === 0 && !autoProviderFallback) config.agents.defaults.imageGenerationModel = primary;
279
- else if (primary || fallbacks.length > 0) config.agents.defaults.imageGenerationModel = {
280
- ...primary ? { primary } : {},
279
+ config.agents.defaults.imageGenerationModel = {
280
+ primary,
281
281
  ...fallbacks.length > 0 ? { fallbacks } : {},
282
282
  ...autoProviderFallback ? { autoProviderFallback: true } : {}
283
283
  };
284
- else delete config.agents.defaults.imageGenerationModel;
285
284
  await saveConfig(config, configPath);
286
285
  console.log(colors.green("Image generation timeout cleared."));
287
286
  return;
288
287
  }
289
288
  config.agents.defaults.imageGenerationModel = {
290
- ...primary ? { primary } : {},
289
+ primary,
291
290
  ...fallbacks.length > 0 ? { fallbacks } : {},
292
291
  ...autoProviderFallback ? { autoProviderFallback: true } : {},
293
292
  timeoutMs: ms
@@ -309,22 +308,24 @@ function createImageCommand(_ctx) {
309
308
  if (!config.agents.defaults) config.agents.defaults = {};
310
309
  const current = config.agents.defaults.imageGenerationModel;
311
310
  const primary = resolveAgentModelPrimaryValue(current);
311
+ if (!primary) {
312
+ console.error(colors.red("No image generation model is configured. Run `xopc image set-generation <provider/model>` first."));
313
+ process.exit(1);
314
+ }
312
315
  const fallbacks = resolveAgentModelFallbackValues(current);
313
- const timeoutMs = typeof current === "object" && current !== null && !Array.isArray(current) ? current.timeoutMs : void 0;
316
+ const timeoutMs = current?.timeoutMs;
314
317
  if (disable) {
315
- if (primary && fallbacks.length === 0 && !timeoutMs) config.agents.defaults.imageGenerationModel = primary;
316
- else if (primary || fallbacks.length > 0 || timeoutMs) config.agents.defaults.imageGenerationModel = {
317
- ...primary ? { primary } : {},
318
+ config.agents.defaults.imageGenerationModel = {
319
+ primary,
318
320
  ...fallbacks.length > 0 ? { fallbacks } : {},
319
321
  ...timeoutMs ? { timeoutMs } : {}
320
322
  };
321
- else delete config.agents.defaults.imageGenerationModel;
322
323
  await saveConfig(config, configPath);
323
324
  console.log(colors.green("Image generation auto-fallback disabled."));
324
325
  return;
325
326
  }
326
327
  config.agents.defaults.imageGenerationModel = {
327
- ...primary ? { primary } : {},
328
+ primary,
328
329
  ...fallbacks.length > 0 ? { fallbacks } : {},
329
330
  ...timeoutMs ? { timeoutMs } : {},
330
331
  autoProviderFallback: true
@@ -1 +1 @@
1
- {"version":3,"file":"image.js","names":["resolvePath"],"sources":["../../../../src/cli/commands/image.ts"],"sourcesContent":["import { mkdir, writeFile } from 'node:fs/promises';\nimport { join, resolve as resolvePath } from 'node:path';\nimport { Command } from 'commander';\nimport { loadConfig, saveConfig } from '../../config/loader.js';\nimport { parseModelRef, type AgentModelConfig } from '../../config/schema.js';\nimport {\n resolveAgentModelPrimaryValue,\n resolveAgentModelFallbackValues,\n} from '../../config/model-input.js';\nimport { isProviderConfigured } from '../../providers/index.js';\nimport {\n generateImage,\n getImageGenerationProvider,\n listImageGenerationProvidersSummary,\n} from '../../agent/image/index.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\nimport { colors } from '../utils/colors.js';\nimport { getContextWithOpts } from '../context.js';\n\nfunction modelRefToString(model?: AgentModelConfig): string | null {\n if (!model) {\n return null;\n }\n return resolveAgentModelPrimaryValue(model) ?? null;\n}\n\nfunction modelFallbacksToArray(model?: AgentModelConfig): string[] {\n return resolveAgentModelFallbackValues(model);\n}\n\nfunction createImageCommand(_ctx: CLIContext): Command {\n const cmd = new Command('image')\n .description('Configure image generation and understanding models')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc image status # Show current image config',\n 'xopc image set-understanding openai/gpt-4o # Set image understanding model',\n 'xopc image set-generation openai/gpt-image-1 # Set image generation model',\n 'xopc image add-fallback understanding anthropic/claude-sonnet-4-5',\n 'xopc image add-fallback generation dashscope/wan2.7-image-pro',\n 'xopc image remove-fallback understanding 0 # Remove first fallback',\n 'xopc image providers # List available providers',\n ]),\n );\n\n cmd\n .command('status')\n .description('Show current image model configuration')\n .option('--json', 'Output as JSON')\n .action(async (opts: { json?: boolean }) => {\n const ctx = getContextWithOpts();\n const config = loadConfig(ctx.configPath);\n const defaults = config.agents?.defaults;\n\n const understandingPrimary = modelRefToString(defaults?.imageModel);\n const understandingFallbacks = modelFallbacksToArray(defaults?.imageModel);\n const generationPrimary = modelRefToString(defaults?.imageGenerationModel);\n const generationFallbacks = modelFallbacksToArray(defaults?.imageGenerationModel);\n const mediaMaxMb = defaults?.mediaMaxMb;\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n imageUnderstanding: {\n primary: understandingPrimary,\n fallbacks: understandingFallbacks,\n },\n imageGeneration: {\n primary: generationPrimary,\n fallbacks: generationFallbacks,\n },\n mediaMaxMb: mediaMaxMb ?? null,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n console.log('');\n console.log(colors.cyan('Image multimodal configuration'));\n console.log('═'.repeat(50));\n\n console.log('');\n console.log(colors.cyan('Image understanding (vision)'));\n if (understandingPrimary) {\n const parsed = parseModelRef(understandingPrimary);\n const configured = parsed ? await isProviderConfigured(parsed.provider) : false;\n const status = configured ? colors.green('OK') : colors.yellow('(provider not configured)');\n console.log(` Primary: ${understandingPrimary} ${status}`);\n } else {\n console.log(` Primary: ${colors.gray('(not set — inferred from keys / defaults)')}`);\n }\n for (let i = 0; i < understandingFallbacks.length; i++) {\n const fb = understandingFallbacks[i]!;\n const parsed = parseModelRef(fb);\n const configured = parsed ? await isProviderConfigured(parsed.provider) : false;\n const status = configured ? colors.green('OK') : colors.yellow('?');\n console.log(` Fallback ${i + 1}: ${fb} ${status}`);\n }\n\n console.log('');\n console.log(colors.cyan('Image generation'));\n if (generationPrimary) {\n const parsed = parseModelRef(generationPrimary);\n const configured = parsed ? await isProviderConfigured(parsed.provider) : false;\n const status = configured ? colors.green('OK') : colors.yellow('(provider not configured)');\n console.log(` Primary: ${generationPrimary} ${status}`);\n } else {\n console.log(` Primary: ${colors.gray('(not set — defaults to openai/gpt-image-1)')}`);\n }\n for (let i = 0; i < generationFallbacks.length; i++) {\n const fb = generationFallbacks[i]!;\n const parsed = parseModelRef(fb);\n const configured = parsed ? await isProviderConfigured(parsed.provider) : false;\n const status = configured ? colors.green('OK') : colors.yellow('?');\n console.log(` Fallback ${i + 1}: ${fb} ${status}`);\n }\n\n console.log('');\n console.log(colors.cyan('General'));\n console.log(` Max image size: ${mediaMaxMb ? `${mediaMaxMb} MB` : colors.gray('(default)')}`);\n\n console.log('');\n console.log('═'.repeat(50));\n console.log(\n colors.gray(\n 'Use \"xopc image set-understanding\" / \"xopc image set-generation\" to set primary models.',\n ),\n );\n console.log('');\n });\n\n cmd\n .command('set-understanding <modelRef>')\n .description('Set the primary image understanding (vision) model')\n .action(async (modelRef: string) => {\n const parsed = parseModelRef(modelRef);\n if (!parsed) {\n console.error(\n colors.red(`Invalid model reference: \"${modelRef}\". Use \"provider/model\" format.`),\n );\n process.exit(1);\n }\n\n const configured = await isProviderConfigured(parsed.provider);\n if (!configured) {\n console.warn(\n colors.yellow(\n `Provider \"${parsed.provider}\" is not configured. Set the API key before using this model.`,\n ),\n );\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n\n const existingFallbacks = modelFallbacksToArray(config.agents.defaults.imageModel);\n if (existingFallbacks.length > 0) {\n config.agents.defaults.imageModel = {\n primary: modelRef,\n fallbacks: existingFallbacks,\n };\n } else {\n config.agents.defaults.imageModel = modelRef;\n }\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Image understanding model set to: ${modelRef}`));\n });\n\n cmd\n .command('set-generation <modelRef>')\n .description('Set the primary image generation model')\n .action(async (modelRef: string) => {\n const parsed = parseModelRef(modelRef);\n if (!parsed) {\n console.error(\n colors.red(`Invalid model reference: \"${modelRef}\". Use \"provider/model\" format.`),\n );\n process.exit(1);\n }\n\n const configured = await isProviderConfigured(parsed.provider);\n if (!configured) {\n console.warn(\n colors.yellow(\n `Provider \"${parsed.provider}\" is not configured. Set the API key before using this model.`,\n ),\n );\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n\n const existingFallbacks = modelFallbacksToArray(config.agents.defaults.imageGenerationModel);\n if (existingFallbacks.length > 0) {\n config.agents.defaults.imageGenerationModel = {\n primary: modelRef,\n fallbacks: existingFallbacks,\n };\n } else {\n config.agents.defaults.imageGenerationModel = modelRef;\n }\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Image generation model set to: ${modelRef}`));\n });\n\n cmd\n .command('add-fallback <type> <modelRef>')\n .description('Add a fallback model (type: \"understanding\" or \"generation\")')\n .action(async (type: string, modelRef: string) => {\n if (type !== 'understanding' && type !== 'generation') {\n console.error(colors.red('Type must be \"understanding\" or \"generation\".'));\n process.exit(1);\n }\n\n const parsed = parseModelRef(modelRef);\n if (!parsed) {\n console.error(\n colors.red(`Invalid model reference: \"${modelRef}\". Use \"provider/model\" format.`),\n );\n process.exit(1);\n }\n\n const configured = await isProviderConfigured(parsed.provider);\n if (!configured) {\n console.warn(colors.yellow(`Provider \"${parsed.provider}\" is not configured.`));\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n\n const configKey = type === 'understanding' ? 'imageModel' : 'imageGenerationModel';\n const current = config.agents.defaults[configKey];\n const primary = resolveAgentModelPrimaryValue(current);\n const fallbacks = [...resolveAgentModelFallbackValues(current)];\n\n if (!primary) {\n const hint =\n type === 'understanding'\n ? 'xopc image set-understanding <model>'\n : 'xopc image set-generation <model>';\n console.error(colors.red(`No primary model set for image ${type}. Set it first: ${hint}`));\n process.exit(1);\n }\n\n if (fallbacks.includes(modelRef)) {\n console.warn(colors.yellow(`\"${modelRef}\" is already in the fallback list.`));\n return;\n }\n\n fallbacks.push(modelRef);\n config.agents.defaults[configKey] = { primary, fallbacks };\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Added fallback for image ${type}: ${modelRef}`));\n console.log(colors.gray(` Fallback chain: ${primary} -> ${fallbacks.join(' -> ')}`));\n });\n\n cmd\n .command('remove-fallback <type> <index>')\n .description('Remove a fallback model by index (0-based)')\n .action(async (type: string, indexStr: string) => {\n if (type !== 'understanding' && type !== 'generation') {\n console.error(colors.red('Type must be \"understanding\" or \"generation\".'));\n process.exit(1);\n }\n\n const index = parseInt(indexStr, 10);\n if (Number.isNaN(index) || index < 0) {\n console.error(colors.red('Index must be a non-negative integer.'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n const configKey = type === 'understanding' ? 'imageModel' : 'imageGenerationModel';\n const current = config.agents?.defaults?.[configKey];\n const primary = resolveAgentModelPrimaryValue(current);\n const fallbacks = [...resolveAgentModelFallbackValues(current)];\n\n if (index >= fallbacks.length) {\n console.error(\n colors.red(`Fallback index ${index} out of range (${fallbacks.length} fallbacks).`),\n );\n process.exit(1);\n }\n\n const removed = fallbacks.splice(index, 1)[0];\n\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n\n if (fallbacks.length > 0 && primary) {\n config.agents.defaults[configKey] = { primary, fallbacks };\n } else if (primary) {\n config.agents.defaults[configKey] = primary;\n }\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Removed fallback: ${removed}`));\n });\n\n cmd\n .command('providers')\n .description('List registered image-generation providers and their capabilities')\n .option('--json', 'Output as JSON')\n .action(async (opts: { json?: boolean }) => {\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n\n const summaries = listImageGenerationProvidersSummary(config);\n const rows = summaries.map((s) => {\n const provider = getImageGenerationProvider(s.id, config);\n let configured = false;\n try {\n configured = provider?.isConfigured?.({ cfg: config }) === true;\n } catch {\n configured = false;\n }\n return {\n id: s.id,\n label: s.label ?? s.id,\n defaultModel: s.defaultModel ?? null,\n models: s.models,\n aliases: s.aliases ?? [],\n capabilities: s.capabilities ?? null,\n configured,\n };\n });\n\n if (opts.json) {\n console.log(JSON.stringify(rows, null, 2));\n return;\n }\n\n console.log('');\n console.log(colors.cyan('Image-generation providers'));\n console.log('═'.repeat(60));\n\n if (rows.length === 0) {\n console.log('');\n console.log(\n colors.yellow(\n ' No image-generation providers registered. Check `extensions/<vendor>/` and bundled.ts.',\n ),\n );\n console.log('');\n return;\n }\n\n for (const row of rows) {\n const statusIcon = row.configured ? colors.green('OK') : colors.yellow('?');\n const statusText = row.configured ? 'configured' : 'missing API key';\n console.log('');\n console.log(` ${statusIcon} ${row.label} (${row.id}) — ${statusText}`);\n if (row.defaultModel) console.log(` Default: ${row.defaultModel}`);\n if (row.models.length > 0) {\n console.log(` Models: ${row.models.map((m) => `${row.id}/${m}`).join(', ')}`);\n }\n if (row.aliases.length > 0) {\n console.log(` Aliases: ${row.aliases.join(', ')}`);\n }\n }\n\n console.log('');\n console.log('═'.repeat(60));\n console.log(\n colors.gray(\n 'Use `xopc image set-generation <provider/model>` to set the primary model, ' +\n '`xopc auth set <provider>` to configure API keys.',\n ),\n );\n console.log('');\n });\n\n cmd\n .command('set-max-size <mb>')\n .description('Set maximum image size in MB')\n .action(async (mbStr: string) => {\n const mb = parseFloat(mbStr);\n if (Number.isNaN(mb) || mb <= 0) {\n console.error(colors.red('Size must be a positive number (in MB).'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n config.agents.defaults.mediaMaxMb = mb;\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Max image size set to: ${mb} MB`));\n });\n\n cmd\n .command('set-timeout <ms>')\n .description('Set the per-request timeout (ms) for image generation; 0 to clear')\n .action(async (msStr: string) => {\n const ms = parseInt(msStr, 10);\n if (Number.isNaN(ms) || ms < 0) {\n console.error(colors.red('Timeout must be a non-negative integer (ms).'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) config.agents = { defaults: {} } as typeof config.agents;\n if (!config.agents.defaults) config.agents.defaults = {} as typeof config.agents.defaults;\n\n const current = config.agents.defaults.imageGenerationModel;\n const primary = resolveAgentModelPrimaryValue(current);\n const fallbacks = resolveAgentModelFallbackValues(current);\n const autoProviderFallback =\n typeof current === 'object' && current !== null && !Array.isArray(current)\n ? (current as { autoProviderFallback?: boolean }).autoProviderFallback === true\n : false;\n\n if (ms === 0) {\n // Clear timeout but keep other knobs.\n if (primary && fallbacks.length === 0 && !autoProviderFallback) {\n config.agents.defaults.imageGenerationModel = primary;\n } else if (primary || fallbacks.length > 0) {\n config.agents.defaults.imageGenerationModel = {\n ...(primary ? { primary } : {}),\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n ...(autoProviderFallback ? { autoProviderFallback: true } : {}),\n };\n } else {\n delete (config.agents.defaults as Record<string, unknown>).imageGenerationModel;\n }\n await saveConfig(config, configPath);\n console.log(colors.green('Image generation timeout cleared.'));\n return;\n }\n\n config.agents.defaults.imageGenerationModel = {\n ...(primary ? { primary } : {}),\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n ...(autoProviderFallback ? { autoProviderFallback: true } : {}),\n timeoutMs: ms,\n };\n await saveConfig(config, configPath);\n console.log(colors.green(`Image generation timeout set to: ${ms}ms`));\n });\n\n cmd\n .command('set-auto-fallback <on-or-off>')\n .description('Enable / disable sweeping every configured provider when primary chain fails')\n .action(async (value: string) => {\n const v = value.trim().toLowerCase();\n const enable = v === 'on' || v === 'true' || v === '1' || v === 'yes';\n const disable = v === 'off' || v === 'false' || v === '0' || v === 'no';\n if (!enable && !disable) {\n console.error(colors.red('Value must be \"on\" or \"off\".'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) config.agents = { defaults: {} } as typeof config.agents;\n if (!config.agents.defaults) config.agents.defaults = {} as typeof config.agents.defaults;\n\n const current = config.agents.defaults.imageGenerationModel;\n const primary = resolveAgentModelPrimaryValue(current);\n const fallbacks = resolveAgentModelFallbackValues(current);\n const timeoutMs =\n typeof current === 'object' && current !== null && !Array.isArray(current)\n ? (current as { timeoutMs?: number }).timeoutMs\n : undefined;\n\n if (disable) {\n if (primary && fallbacks.length === 0 && !timeoutMs) {\n config.agents.defaults.imageGenerationModel = primary;\n } else if (primary || fallbacks.length > 0 || timeoutMs) {\n config.agents.defaults.imageGenerationModel = {\n ...(primary ? { primary } : {}),\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n ...(timeoutMs ? { timeoutMs } : {}),\n };\n } else {\n delete (config.agents.defaults as Record<string, unknown>).imageGenerationModel;\n }\n await saveConfig(config, configPath);\n console.log(colors.green('Image generation auto-fallback disabled.'));\n return;\n }\n\n config.agents.defaults.imageGenerationModel = {\n ...(primary ? { primary } : {}),\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n ...(timeoutMs ? { timeoutMs } : {}),\n autoProviderFallback: true,\n };\n await saveConfig(config, configPath);\n console.log(colors.green('Image generation auto-fallback enabled.'));\n });\n\n cmd\n .command('generate <prompt...>')\n .description('Generate one or more images and save them to disk')\n .option('--model <ref>', 'Model ref (provider/model); falls back to configured primary')\n .option('--size <size>', 'Image size, e.g. 1024x1024')\n .option('--count <n>', 'Number of images to generate', (v) => parseInt(v, 10), 1)\n .option('--output <dir>', 'Output directory (default: ./generated-images)')\n .option('--timeout <ms>', 'Per-call timeout (ms)', (v) => parseInt(v, 10))\n .action(\n async (\n promptParts: string[],\n opts: { model?: string; size?: string; count?: number; output?: string; timeout?: number },\n ) => {\n const prompt = promptParts.join(' ').trim();\n if (!prompt) {\n console.error(colors.red('Prompt is required.'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n const outputDir = resolvePath(opts.output ?? './generated-images');\n await mkdir(outputDir, { recursive: true });\n\n const count = Number.isFinite(opts.count) && (opts.count ?? 0) > 0 ? Math.floor(opts.count!) : 1;\n\n try {\n const result = await generateImage({\n prompt,\n cfg: config,\n ...(opts.model ? { modelRef: opts.model } : {}),\n ...(opts.size ? { size: opts.size } : {}),\n count,\n ...(typeof opts.timeout === 'number' && opts.timeout > 0 ? { timeoutMs: opts.timeout } : {}),\n });\n\n const writtenPaths: string[] = [];\n for (let i = 0; i < result.images.length; i++) {\n const img = result.images[i];\n const fileName = img.fileName?.trim() || `image-${i + 1}.png`;\n const full = join(outputDir, fileName);\n await writeFile(full, img.buffer);\n writtenPaths.push(full);\n }\n\n console.log('');\n console.log(\n colors.green(\n `Generated ${result.images.length} image${result.images.length === 1 ? '' : 's'} (model: ${result.model}).`,\n ),\n );\n for (const p of writtenPaths) console.log(` - ${p}`);\n console.log('');\n } catch (err) {\n console.error(colors.red(`Image generation failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n },\n );\n\n return cmd;\n}\n\nregister({\n id: 'image',\n name: 'image',\n description: 'Configure image generation and understanding models',\n factory: createImageCommand,\n metadata: {\n category: 'utility',\n examples: [\n 'xopc image status',\n 'xopc image set-understanding openai/gpt-4o',\n 'xopc image set-generation openai/gpt-image-1',\n 'xopc image providers',\n ],\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"image.js","names":["resolvePath"],"sources":["../../../../src/cli/commands/image.ts"],"sourcesContent":["import { mkdir, writeFile } from 'node:fs/promises';\nimport { join, resolve as resolvePath } from 'node:path';\nimport { Command } from 'commander';\nimport { loadConfig, saveConfig } from '../../config/loader.js';\nimport { parseModelRef, type AgentModelConfig } from '../../config/schema.js';\nimport {\n resolveAgentModelPrimaryValue,\n resolveAgentModelFallbackValues,\n} from '../../config/model-input.js';\nimport { isProviderConfigured } from '../../providers/index.js';\nimport {\n generateImage,\n getImageGenerationProvider,\n listImageGenerationProvidersSummary,\n} from '../../agent/image/index.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\nimport { colors } from '../utils/colors.js';\nimport { getContextWithOpts } from '../context.js';\n\nfunction modelRefToString(model?: AgentModelConfig): string | null {\n if (!model) {\n return null;\n }\n return resolveAgentModelPrimaryValue(model) ?? null;\n}\n\nfunction modelFallbacksToArray(model?: AgentModelConfig): string[] {\n return resolveAgentModelFallbackValues(model);\n}\n\nfunction createImageCommand(_ctx: CLIContext): Command {\n const cmd = new Command('image')\n .description('Configure image generation and understanding models')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc image status # Show current image config',\n 'xopc image set-understanding openai/gpt-4o # Set image understanding model',\n 'xopc image set-generation openai/gpt-image-1 # Set image generation model',\n 'xopc image add-fallback understanding anthropic/claude-sonnet-4-5',\n 'xopc image add-fallback generation dashscope/wan2.7-image-pro',\n 'xopc image remove-fallback understanding 0 # Remove first fallback',\n 'xopc image providers # List available providers',\n ]),\n );\n\n cmd\n .command('status')\n .description('Show current image model configuration')\n .option('--json', 'Output as JSON')\n .action(async (opts: { json?: boolean }) => {\n const ctx = getContextWithOpts();\n const config = loadConfig(ctx.configPath);\n const defaults = config.agents?.defaults;\n\n const understandingPrimary = modelRefToString(defaults?.imageModel);\n const understandingFallbacks = modelFallbacksToArray(defaults?.imageModel);\n const generationPrimary = modelRefToString(defaults?.imageGenerationModel);\n const generationFallbacks = modelFallbacksToArray(defaults?.imageGenerationModel);\n const mediaMaxMb = defaults?.mediaMaxMb;\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n imageUnderstanding: {\n primary: understandingPrimary,\n fallbacks: understandingFallbacks,\n },\n imageGeneration: {\n primary: generationPrimary,\n fallbacks: generationFallbacks,\n },\n mediaMaxMb: mediaMaxMb ?? null,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n console.log('');\n console.log(colors.cyan('Image multimodal configuration'));\n console.log('═'.repeat(50));\n\n console.log('');\n console.log(colors.cyan('Image understanding (vision)'));\n if (understandingPrimary) {\n const parsed = parseModelRef(understandingPrimary);\n const configured = parsed ? await isProviderConfigured(parsed.provider) : false;\n const status = configured ? colors.green('OK') : colors.yellow('(provider not configured)');\n console.log(` Primary: ${understandingPrimary} ${status}`);\n } else {\n console.log(` Primary: ${colors.gray('(not set — inferred from keys / defaults)')}`);\n }\n for (let i = 0; i < understandingFallbacks.length; i++) {\n const fb = understandingFallbacks[i]!;\n const parsed = parseModelRef(fb);\n const configured = parsed ? await isProviderConfigured(parsed.provider) : false;\n const status = configured ? colors.green('OK') : colors.yellow('?');\n console.log(` Fallback ${i + 1}: ${fb} ${status}`);\n }\n\n console.log('');\n console.log(colors.cyan('Image generation'));\n if (generationPrimary) {\n const parsed = parseModelRef(generationPrimary);\n const configured = parsed ? await isProviderConfigured(parsed.provider) : false;\n const status = configured ? colors.green('OK') : colors.yellow('(provider not configured)');\n console.log(` Primary: ${generationPrimary} ${status}`);\n } else {\n console.log(` Primary: ${colors.gray('(not set — defaults to openai/gpt-image-1)')}`);\n }\n for (let i = 0; i < generationFallbacks.length; i++) {\n const fb = generationFallbacks[i]!;\n const parsed = parseModelRef(fb);\n const configured = parsed ? await isProviderConfigured(parsed.provider) : false;\n const status = configured ? colors.green('OK') : colors.yellow('?');\n console.log(` Fallback ${i + 1}: ${fb} ${status}`);\n }\n\n console.log('');\n console.log(colors.cyan('General'));\n console.log(` Max image size: ${mediaMaxMb ? `${mediaMaxMb} MB` : colors.gray('(default)')}`);\n\n console.log('');\n console.log('═'.repeat(50));\n console.log(\n colors.gray(\n 'Use \"xopc image set-understanding\" / \"xopc image set-generation\" to set primary models.',\n ),\n );\n console.log('');\n });\n\n cmd\n .command('set-understanding <modelRef>')\n .description('Set the primary image understanding (vision) model')\n .action(async (modelRef: string) => {\n const parsed = parseModelRef(modelRef);\n if (!parsed) {\n console.error(\n colors.red(`Invalid model reference: \"${modelRef}\". Use \"provider/model\" format.`),\n );\n process.exit(1);\n }\n\n const configured = await isProviderConfigured(parsed.provider);\n if (!configured) {\n console.warn(\n colors.yellow(\n `Provider \"${parsed.provider}\" is not configured. Set the API key before using this model.`,\n ),\n );\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n\n const existingFallbacks = modelFallbacksToArray(config.agents.defaults.imageModel);\n config.agents.defaults.imageModel =\n existingFallbacks.length > 0\n ? { primary: modelRef, fallbacks: existingFallbacks }\n : { primary: modelRef };\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Image understanding model set to: ${modelRef}`));\n });\n\n cmd\n .command('set-generation <modelRef>')\n .description('Set the primary image generation model')\n .action(async (modelRef: string) => {\n const parsed = parseModelRef(modelRef);\n if (!parsed) {\n console.error(\n colors.red(`Invalid model reference: \"${modelRef}\". Use \"provider/model\" format.`),\n );\n process.exit(1);\n }\n\n const configured = await isProviderConfigured(parsed.provider);\n if (!configured) {\n console.warn(\n colors.yellow(\n `Provider \"${parsed.provider}\" is not configured. Set the API key before using this model.`,\n ),\n );\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n\n const existingFallbacks = modelFallbacksToArray(config.agents.defaults.imageGenerationModel);\n config.agents.defaults.imageGenerationModel =\n existingFallbacks.length > 0\n ? { primary: modelRef, fallbacks: existingFallbacks }\n : { primary: modelRef };\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Image generation model set to: ${modelRef}`));\n });\n\n cmd\n .command('add-fallback <type> <modelRef>')\n .description('Add a fallback model (type: \"understanding\" or \"generation\")')\n .action(async (type: string, modelRef: string) => {\n if (type !== 'understanding' && type !== 'generation') {\n console.error(colors.red('Type must be \"understanding\" or \"generation\".'));\n process.exit(1);\n }\n\n const parsed = parseModelRef(modelRef);\n if (!parsed) {\n console.error(\n colors.red(`Invalid model reference: \"${modelRef}\". Use \"provider/model\" format.`),\n );\n process.exit(1);\n }\n\n const configured = await isProviderConfigured(parsed.provider);\n if (!configured) {\n console.warn(colors.yellow(`Provider \"${parsed.provider}\" is not configured.`));\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n\n const configKey = type === 'understanding' ? 'imageModel' : 'imageGenerationModel';\n const current = config.agents.defaults[configKey];\n const primary = resolveAgentModelPrimaryValue(current);\n const fallbacks = [...resolveAgentModelFallbackValues(current)];\n\n if (!primary) {\n const hint =\n type === 'understanding'\n ? 'xopc image set-understanding <model>'\n : 'xopc image set-generation <model>';\n console.error(colors.red(`No primary model set for image ${type}. Set it first: ${hint}`));\n process.exit(1);\n }\n\n if (fallbacks.includes(modelRef)) {\n console.warn(colors.yellow(`\"${modelRef}\" is already in the fallback list.`));\n return;\n }\n\n fallbacks.push(modelRef);\n config.agents.defaults[configKey] = { primary, fallbacks };\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Added fallback for image ${type}: ${modelRef}`));\n console.log(colors.gray(` Fallback chain: ${primary} -> ${fallbacks.join(' -> ')}`));\n });\n\n cmd\n .command('remove-fallback <type> <index>')\n .description('Remove a fallback model by index (0-based)')\n .action(async (type: string, indexStr: string) => {\n if (type !== 'understanding' && type !== 'generation') {\n console.error(colors.red('Type must be \"understanding\" or \"generation\".'));\n process.exit(1);\n }\n\n const index = parseInt(indexStr, 10);\n if (Number.isNaN(index) || index < 0) {\n console.error(colors.red('Index must be a non-negative integer.'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n const configKey = type === 'understanding' ? 'imageModel' : 'imageGenerationModel';\n const current = config.agents?.defaults?.[configKey];\n const primary = resolveAgentModelPrimaryValue(current);\n const fallbacks = [...resolveAgentModelFallbackValues(current)];\n\n if (index >= fallbacks.length) {\n console.error(\n colors.red(`Fallback index ${index} out of range (${fallbacks.length} fallbacks).`),\n );\n process.exit(1);\n }\n\n const removed = fallbacks.splice(index, 1)[0];\n\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n\n if (primary) {\n config.agents.defaults[configKey] =\n fallbacks.length > 0 ? { primary, fallbacks } : { primary };\n }\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Removed fallback: ${removed}`));\n });\n\n cmd\n .command('providers')\n .description('List registered image-generation providers and their capabilities')\n .option('--json', 'Output as JSON')\n .action(async (opts: { json?: boolean }) => {\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n\n const summaries = listImageGenerationProvidersSummary(config);\n const rows = summaries.map((s) => {\n const provider = getImageGenerationProvider(s.id, config);\n let configured = false;\n try {\n configured = provider?.isConfigured?.({ cfg: config }) === true;\n } catch {\n configured = false;\n }\n return {\n id: s.id,\n label: s.label ?? s.id,\n defaultModel: s.defaultModel ?? null,\n models: s.models,\n aliases: s.aliases ?? [],\n capabilities: s.capabilities ?? null,\n configured,\n };\n });\n\n if (opts.json) {\n console.log(JSON.stringify(rows, null, 2));\n return;\n }\n\n console.log('');\n console.log(colors.cyan('Image-generation providers'));\n console.log('═'.repeat(60));\n\n if (rows.length === 0) {\n console.log('');\n console.log(\n colors.yellow(\n ' No image-generation providers registered. Check `extensions/<vendor>/` and bundled.ts.',\n ),\n );\n console.log('');\n return;\n }\n\n for (const row of rows) {\n const statusIcon = row.configured ? colors.green('OK') : colors.yellow('?');\n const statusText = row.configured ? 'configured' : 'missing API key';\n console.log('');\n console.log(` ${statusIcon} ${row.label} (${row.id}) — ${statusText}`);\n if (row.defaultModel) console.log(` Default: ${row.defaultModel}`);\n if (row.models.length > 0) {\n console.log(` Models: ${row.models.map((m) => `${row.id}/${m}`).join(', ')}`);\n }\n if (row.aliases.length > 0) {\n console.log(` Aliases: ${row.aliases.join(', ')}`);\n }\n }\n\n console.log('');\n console.log('═'.repeat(60));\n console.log(\n colors.gray(\n 'Use `xopc image set-generation <provider/model>` to set the primary model, ' +\n '`xopc auth set <provider>` to configure API keys.',\n ),\n );\n console.log('');\n });\n\n cmd\n .command('set-max-size <mb>')\n .description('Set maximum image size in MB')\n .action(async (mbStr: string) => {\n const mb = parseFloat(mbStr);\n if (Number.isNaN(mb) || mb <= 0) {\n console.error(colors.red('Size must be a positive number (in MB).'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n config.agents.defaults.mediaMaxMb = mb;\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Max image size set to: ${mb} MB`));\n });\n\n cmd\n .command('set-timeout <ms>')\n .description('Set the per-request timeout (ms) for image generation; 0 to clear')\n .action(async (msStr: string) => {\n const ms = parseInt(msStr, 10);\n if (Number.isNaN(ms) || ms < 0) {\n console.error(colors.red('Timeout must be a non-negative integer (ms).'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) config.agents = { defaults: {} } as typeof config.agents;\n if (!config.agents.defaults) config.agents.defaults = {} as typeof config.agents.defaults;\n\n const current = config.agents.defaults.imageGenerationModel;\n const primary = resolveAgentModelPrimaryValue(current);\n if (!primary) {\n console.error(\n colors.red('No image generation model is configured. Run `xopc image set-generation <provider/model>` first.'),\n );\n process.exit(1);\n }\n const fallbacks = resolveAgentModelFallbackValues(current);\n const autoProviderFallback = current?.autoProviderFallback === true;\n\n if (ms === 0) {\n config.agents.defaults.imageGenerationModel = {\n primary,\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n ...(autoProviderFallback ? { autoProviderFallback: true } : {}),\n };\n await saveConfig(config, configPath);\n console.log(colors.green('Image generation timeout cleared.'));\n return;\n }\n\n config.agents.defaults.imageGenerationModel = {\n primary,\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n ...(autoProviderFallback ? { autoProviderFallback: true } : {}),\n timeoutMs: ms,\n };\n await saveConfig(config, configPath);\n console.log(colors.green(`Image generation timeout set to: ${ms}ms`));\n });\n\n cmd\n .command('set-auto-fallback <on-or-off>')\n .description('Enable / disable sweeping every configured provider when primary chain fails')\n .action(async (value: string) => {\n const v = value.trim().toLowerCase();\n const enable = v === 'on' || v === 'true' || v === '1' || v === 'yes';\n const disable = v === 'off' || v === 'false' || v === '0' || v === 'no';\n if (!enable && !disable) {\n console.error(colors.red('Value must be \"on\" or \"off\".'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) config.agents = { defaults: {} } as typeof config.agents;\n if (!config.agents.defaults) config.agents.defaults = {} as typeof config.agents.defaults;\n\n const current = config.agents.defaults.imageGenerationModel;\n const primary = resolveAgentModelPrimaryValue(current);\n if (!primary) {\n console.error(\n colors.red('No image generation model is configured. Run `xopc image set-generation <provider/model>` first.'),\n );\n process.exit(1);\n }\n const fallbacks = resolveAgentModelFallbackValues(current);\n const timeoutMs = current?.timeoutMs;\n\n if (disable) {\n config.agents.defaults.imageGenerationModel = {\n primary,\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n ...(timeoutMs ? { timeoutMs } : {}),\n };\n await saveConfig(config, configPath);\n console.log(colors.green('Image generation auto-fallback disabled.'));\n return;\n }\n\n config.agents.defaults.imageGenerationModel = {\n primary,\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n ...(timeoutMs ? { timeoutMs } : {}),\n autoProviderFallback: true,\n };\n await saveConfig(config, configPath);\n console.log(colors.green('Image generation auto-fallback enabled.'));\n });\n\n cmd\n .command('generate <prompt...>')\n .description('Generate one or more images and save them to disk')\n .option('--model <ref>', 'Model ref (provider/model); falls back to configured primary')\n .option('--size <size>', 'Image size, e.g. 1024x1024')\n .option('--count <n>', 'Number of images to generate', (v) => parseInt(v, 10), 1)\n .option('--output <dir>', 'Output directory (default: ./generated-images)')\n .option('--timeout <ms>', 'Per-call timeout (ms)', (v) => parseInt(v, 10))\n .action(\n async (\n promptParts: string[],\n opts: { model?: string; size?: string; count?: number; output?: string; timeout?: number },\n ) => {\n const prompt = promptParts.join(' ').trim();\n if (!prompt) {\n console.error(colors.red('Prompt is required.'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n const outputDir = resolvePath(opts.output ?? './generated-images');\n await mkdir(outputDir, { recursive: true });\n\n const count = Number.isFinite(opts.count) && (opts.count ?? 0) > 0 ? Math.floor(opts.count!) : 1;\n\n try {\n const result = await generateImage({\n prompt,\n cfg: config,\n ...(opts.model ? { modelRef: opts.model } : {}),\n ...(opts.size ? { size: opts.size } : {}),\n count,\n ...(typeof opts.timeout === 'number' && opts.timeout > 0 ? { timeoutMs: opts.timeout } : {}),\n });\n\n const writtenPaths: string[] = [];\n for (let i = 0; i < result.images.length; i++) {\n const img = result.images[i];\n const fileName = img.fileName?.trim() || `image-${i + 1}.png`;\n const full = join(outputDir, fileName);\n await writeFile(full, img.buffer);\n writtenPaths.push(full);\n }\n\n console.log('');\n console.log(\n colors.green(\n `Generated ${result.images.length} image${result.images.length === 1 ? '' : 's'} (model: ${result.model}).`,\n ),\n );\n for (const p of writtenPaths) console.log(` - ${p}`);\n console.log('');\n } catch (err) {\n console.error(colors.red(`Image generation failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n },\n );\n\n return cmd;\n}\n\nregister({\n id: 'image',\n name: 'image',\n description: 'Configure image generation and understanding models',\n factory: createImageCommand,\n metadata: {\n category: 'utility',\n examples: [\n 'xopc image status',\n 'xopc image set-understanding openai/gpt-4o',\n 'xopc image set-generation openai/gpt-image-1',\n 'xopc image providers',\n ],\n },\n});\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { getContextWithOpts } from "../../context.js";
2
- import { getSessionManager } from "../../utils/session.js";
2
+ import { getSessionIndex } from "../../utils/session.js";
3
3
  //#region src/cli/commands/session/utils.ts
4
4
  /**
5
5
  * Session command utilities
@@ -9,7 +9,7 @@ import { getSessionManager } from "../../utils/session.js";
9
9
  */
10
10
  async function getManager() {
11
11
  getContextWithOpts();
12
- return getSessionManager();
12
+ return getSessionIndex();
13
13
  }
14
14
  /**
15
15
  * Collect multiple option values into array
@@ -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 '../../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"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../../../src/cli/commands/session/utils.ts"],"sourcesContent":["/**\n * Session command utilities\n */\n\nimport { getSessionIndex } 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 getSessionIndex();\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,iBAAiB;;;;;AAM1B,SAAgB,QAAQ,OAAe,UAA8B;AACnE,QAAO,SAAS,OAAO,CAAC,MAAM,CAAC"}
@@ -4,7 +4,7 @@ import { formatExamples, register } from "../registry.js";
4
4
  import "../../config/index.js";
5
5
  import { normalizeUpdateChannel } from "../../infra/update-channels.js";
6
6
  import { compareSemver, detectInstallKind, resolveNpmChannelTag, resolvePackageRoot } from "../../infra/update-check.js";
7
- import { spawn } from "node:child_process";
7
+ import { formatGlobalInstallFailure, resolveGlobalInstallSpec, resolveGlobalManager, runGlobalPackageInstall } from "../../infra/update-global.js";
8
8
  import { Command } from "commander";
9
9
  //#region src/cli/commands/update.ts
10
10
  init_package_version();
@@ -86,10 +86,9 @@ function createUpdateCommand(_ctx) {
86
86
  return;
87
87
  }
88
88
  }
89
- const packageManager = detectGlobalPackageManager();
90
- const spec = `@xopcai/xopc@${resolved.version}`;
89
+ const packageManager = await resolveGlobalManager({ root });
90
+ const spec = resolveGlobalInstallSpec({ version: resolved.version });
91
91
  if (!options.json) console.log(`Installing ${spec} via ${packageManager}...`);
92
- const installArgs = buildInstallArgs(packageManager, spec);
93
92
  const { acquireUpdateLock } = await import("../../infra/update-lock.js");
94
93
  const lock = process.env.XOPC_AUTO_UPDATE ? { release: async () => {} } : await acquireUpdateLock("cli");
95
94
  if (!lock) {
@@ -102,72 +101,53 @@ function createUpdateCommand(_ctx) {
102
101
  else console.error(`❌ ${message}`);
103
102
  process.exit(1);
104
103
  }
105
- let exitCode;
104
+ let installResult;
106
105
  try {
107
- exitCode = await runInstallCommand(installArgs);
106
+ installResult = await runGlobalPackageInstall({
107
+ manager: packageManager,
108
+ spec,
109
+ pkgRoot: root,
110
+ echoToTerminal: !options.json
111
+ });
108
112
  } finally {
109
113
  await lock.release();
110
114
  }
111
- if (exitCode === 0) if (options.json) console.log(JSON.stringify({
115
+ if (installResult.exitCode === 0) if (options.json) console.log(JSON.stringify({
112
116
  status: "ok",
113
117
  previousVersion: PACKAGE_VERSION,
114
118
  installedVersion: resolved.version,
115
119
  channel: resolved.tag,
116
- packageManager
120
+ packageManager: installResult.packageManager
117
121
  }));
118
122
  else {
119
123
  console.log(`✅ Updated to v${resolved.version}`);
120
124
  console.log("Restart the gateway to use the new version: xopc gateway restart");
121
125
  }
122
126
  else {
127
+ const message = formatGlobalInstallFailure({
128
+ packageManager: installResult.packageManager,
129
+ spec,
130
+ exitCode: installResult.exitCode,
131
+ stderr: installResult.stderr,
132
+ usedFallback: installResult.usedFallback
133
+ });
123
134
  if (options.json) console.log(JSON.stringify({
124
135
  status: "error",
125
136
  reason: "install-failed",
126
- exitCode,
127
- packageManager
137
+ exitCode: installResult.exitCode,
138
+ packageManager: installResult.packageManager,
139
+ usedFallback: installResult.usedFallback,
140
+ stderrTail: installResult.stderr.trim().slice(-4e3) || void 0,
141
+ message
128
142
  }));
129
143
  else {
130
- console.error(`❌ Update failed (exit code ${exitCode})`);
131
- console.error(`Try manually: ${packageManager} install -g ${spec}`);
144
+ console.error(`❌ Update failed (exit code ${installResult.exitCode})`);
145
+ console.error(message);
132
146
  }
133
147
  process.exit(1);
134
148
  }
135
149
  });
136
150
  }
137
- /**
138
- * Detect which package manager was used to install xopc globally.
139
- * Checks common indicators: npm_config_user_agent, process.env, argv paths.
140
- */
141
- function detectGlobalPackageManager() {
142
- if ((process.env.npm_config_user_agent ?? "").startsWith("pnpm/")) return "pnpm";
143
- return "npm";
144
- }
145
- function buildInstallArgs(manager, spec) {
146
- if (manager === "pnpm") return [
147
- "pnpm",
148
- "add",
149
- "-g",
150
- spec
151
- ];
152
- return [
153
- "npm",
154
- "install",
155
- "-g",
156
- spec,
157
- "--no-fund",
158
- "--no-audit"
159
- ];
160
- }
161
- function runInstallCommand(argv) {
162
- return new Promise((resolve) => {
163
- const child = spawn(argv[0], argv.slice(1), {
164
- stdio: "inherit",
165
- env: process.env
166
- });
167
- child.on("error", () => resolve(1));
168
- child.on("exit", (code) => resolve(code ?? 1));
169
- });
170
- }
171
151
  register({
172
152
  id: "update",
173
153
  name: "update",
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","names":[],"sources":["../../../../src/cli/commands/update.ts"],"sourcesContent":["// src/cli/commands/update.ts\n\nimport { Command } from 'commander';\nimport { spawn } from 'node:child_process';\n\nimport { loadConfig } from '../../config/index.js';\nimport { PACKAGE_VERSION } from '../../package-version.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\nimport { normalizeUpdateChannel, DEFAULT_PACKAGE_CHANNEL } from '../../infra/update-channels.js';\nimport {\n resolveNpmChannelTag,\n compareSemver,\n detectInstallKind,\n resolvePackageRoot,\n} from '../../infra/update-check.js';\n\nfunction createUpdateCommand(_ctx: CLIContext): Command {\n return new Command('update')\n .description('Check for and install xopc updates')\n .option('--check', 'Only check for updates without installing')\n .option('--yes', 'Skip confirmation prompts')\n .option('--channel <channel>', 'Update channel: stable, beta, or dev (default: from config, else stable)')\n .option('--json', 'Output results as JSON')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc update',\n 'xopc update --check',\n 'xopc update --channel beta',\n 'xopc update --yes',\n 'xopc update --json',\n ]),\n )\n .action(\n async (options: { check?: boolean; yes?: boolean; channel?: string; json?: boolean }) => {\n const fromCli = options.channel;\n const fromConfig = (() => {\n try {\n return loadConfig().update?.channel;\n } catch {\n return undefined;\n }\n })();\n const channel = normalizeUpdateChannel(fromCli ?? fromConfig) ?? DEFAULT_PACKAGE_CHANNEL;\n\n // Check current install kind\n const root = await resolvePackageRoot();\n if (root) {\n const installKind = await detectInstallKind(root);\n if (installKind === 'git') {\n const message = 'Running from a git checkout. Use `git pull` to update instead.';\n if (options.json) {\n console.log(JSON.stringify({ status: 'skipped', reason: 'git-checkout', message }));\n } else {\n console.log(message);\n }\n return;\n }\n }\n\n if (!options.json) {\n console.log(`Checking for updates (channel: ${channel})...`);\n }\n\n const resolved = await resolveNpmChannelTag({ channel });\n if (!resolved.version) {\n const message = 'Could not reach npm registry. Check your network connection.';\n if (options.json) {\n console.log(JSON.stringify({ status: 'error', reason: 'registry-unreachable', message }));\n } else {\n console.error(message);\n }\n process.exit(1);\n }\n\n const comparison = compareSemver(PACKAGE_VERSION, resolved.version);\n if (comparison === null || comparison >= 0) {\n const message = `Already up to date: v${PACKAGE_VERSION} (${resolved.tag}: v${resolved.version})`;\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'up-to-date',\n currentVersion: PACKAGE_VERSION,\n latestVersion: resolved.version,\n channel: resolved.tag,\n }),\n );\n } else {\n console.log(`✅ ${message}`);\n }\n return;\n }\n\n if (options.check) {\n const message = `Update available: v${PACKAGE_VERSION} → v${resolved.version} (${resolved.tag})`;\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'update-available',\n currentVersion: PACKAGE_VERSION,\n latestVersion: resolved.version,\n channel: resolved.tag,\n }),\n );\n } else {\n console.log(`📦 ${message}`);\n console.log('Run `xopc update` to install.');\n }\n return;\n }\n\n if (!options.yes && !process.env.XOPC_AUTO_UPDATE) {\n const { confirm } = await import('@inquirer/prompts');\n const shouldUpdate = await confirm({\n message: `Update from v${PACKAGE_VERSION} to v${resolved.version} (${resolved.tag})?`,\n default: true,\n });\n if (!shouldUpdate) {\n console.log('Update cancelled.');\n return;\n }\n }\n\n const packageManager = detectGlobalPackageManager();\n const spec = `@xopcai/xopc@${resolved.version}`;\n\n if (!options.json) {\n console.log(`Installing ${spec} via ${packageManager}...`);\n }\n\n const installArgs = buildInstallArgs(packageManager, spec);\n\n // Gateway / auto-update spawn this CLI with XOPC_AUTO_UPDATE=1 after acquiring the lock.\n const { acquireUpdateLock } = await import('../../infra/update-lock.js');\n const lock = process.env.XOPC_AUTO_UPDATE\n ? { release: async () => {} }\n : await acquireUpdateLock('cli');\n if (!lock) {\n const message = 'Another update is already in progress. Try again later.';\n if (options.json) {\n console.log(JSON.stringify({ status: 'error', reason: 'lock-held', message }));\n } else {\n console.error(`❌ ${message}`);\n }\n process.exit(1);\n }\n\n let exitCode: number;\n try {\n exitCode = await runInstallCommand(installArgs);\n } finally {\n await lock.release();\n }\n\n if (exitCode === 0) {\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'ok',\n previousVersion: PACKAGE_VERSION,\n installedVersion: resolved.version,\n channel: resolved.tag,\n packageManager,\n }),\n );\n } else {\n console.log(`✅ Updated to v${resolved.version}`);\n console.log('Restart the gateway to use the new version: xopc gateway restart');\n }\n } else {\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'error',\n reason: 'install-failed',\n exitCode,\n packageManager,\n }),\n );\n } else {\n console.error(`❌ Update failed (exit code ${exitCode})`);\n console.error(`Try manually: ${packageManager} install -g ${spec}`);\n }\n process.exit(1);\n }\n },\n );\n}\n\n/**\n * Detect which package manager was used to install xopc globally.\n * Checks common indicators: npm_config_user_agent, process.env, argv paths.\n */\nfunction detectGlobalPackageManager(): 'npm' | 'pnpm' {\n const userAgent = process.env.npm_config_user_agent ?? '';\n if (userAgent.startsWith('pnpm/')) return 'pnpm';\n return 'npm';\n}\n\nfunction buildInstallArgs(manager: 'npm' | 'pnpm', spec: string): string[] {\n if (manager === 'pnpm') {\n return ['pnpm', 'add', '-g', spec];\n }\n return ['npm', 'install', '-g', spec, '--no-fund', '--no-audit'];\n}\n\nfunction runInstallCommand(argv: string[]): Promise<number> {\n return new Promise((resolve) => {\n const child = spawn(argv[0], argv.slice(1), {\n stdio: 'inherit',\n env: process.env,\n });\n child.on('error', () => resolve(1));\n child.on('exit', (code) => resolve(code ?? 1));\n });\n}\n\nregister({\n id: 'update',\n name: 'update',\n description: 'Check for and install xopc updates',\n factory: createUpdateCommand,\n metadata: {\n category: 'maintenance',\n examples: [\n 'xopc update',\n 'xopc update --check',\n 'xopc update --channel beta',\n 'xopc update --yes --json',\n ],\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"update.js","names":[],"sources":["../../../../src/cli/commands/update.ts"],"sourcesContent":["// src/cli/commands/update.ts\n\nimport { Command } from 'commander';\n\nimport { loadConfig } from '../../config/index.js';\nimport {\n formatGlobalInstallFailure,\n resolveGlobalInstallSpec,\n resolveGlobalManager,\n runGlobalPackageInstall,\n} from '../../infra/update-global.js';\nimport { normalizeUpdateChannel, DEFAULT_PACKAGE_CHANNEL } from '../../infra/update-channels.js';\nimport {\n resolveNpmChannelTag,\n compareSemver,\n detectInstallKind,\n resolvePackageRoot,\n} from '../../infra/update-check.js';\nimport { PACKAGE_VERSION } from '../../package-version.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\n\nfunction createUpdateCommand(_ctx: CLIContext): Command {\n return new Command('update')\n .description('Check for and install xopc updates')\n .option('--check', 'Only check for updates without installing')\n .option('--yes', 'Skip confirmation prompts')\n .option('--channel <channel>', 'Update channel: stable, beta, or dev (default: from config, else stable)')\n .option('--json', 'Output results as JSON')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc update',\n 'xopc update --check',\n 'xopc update --channel beta',\n 'xopc update --yes',\n 'xopc update --json',\n ]),\n )\n .action(\n async (options: { check?: boolean; yes?: boolean; channel?: string; json?: boolean }) => {\n const fromCli = options.channel;\n const fromConfig = (() => {\n try {\n return loadConfig().update?.channel;\n } catch {\n return undefined;\n }\n })();\n const channel = normalizeUpdateChannel(fromCli ?? fromConfig) ?? DEFAULT_PACKAGE_CHANNEL;\n\n const root = await resolvePackageRoot();\n if (root) {\n const installKind = await detectInstallKind(root);\n if (installKind === 'git') {\n const message = 'Running from a git checkout. Use `git pull` to update instead.';\n if (options.json) {\n console.log(JSON.stringify({ status: 'skipped', reason: 'git-checkout', message }));\n } else {\n console.log(message);\n }\n return;\n }\n }\n\n if (!options.json) {\n console.log(`Checking for updates (channel: ${channel})...`);\n }\n\n const resolved = await resolveNpmChannelTag({ channel });\n if (!resolved.version) {\n const message = 'Could not reach npm registry. Check your network connection.';\n if (options.json) {\n console.log(JSON.stringify({ status: 'error', reason: 'registry-unreachable', message }));\n } else {\n console.error(message);\n }\n process.exit(1);\n }\n\n const comparison = compareSemver(PACKAGE_VERSION, resolved.version);\n if (comparison === null || comparison >= 0) {\n const message = `Already up to date: v${PACKAGE_VERSION} (${resolved.tag}: v${resolved.version})`;\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'up-to-date',\n currentVersion: PACKAGE_VERSION,\n latestVersion: resolved.version,\n channel: resolved.tag,\n }),\n );\n } else {\n console.log(`✅ ${message}`);\n }\n return;\n }\n\n if (options.check) {\n const message = `Update available: v${PACKAGE_VERSION} → v${resolved.version} (${resolved.tag})`;\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'update-available',\n currentVersion: PACKAGE_VERSION,\n latestVersion: resolved.version,\n channel: resolved.tag,\n }),\n );\n } else {\n console.log(`📦 ${message}`);\n console.log('Run `xopc update` to install.');\n }\n return;\n }\n\n if (!options.yes && !process.env.XOPC_AUTO_UPDATE) {\n const { confirm } = await import('@inquirer/prompts');\n const shouldUpdate = await confirm({\n message: `Update from v${PACKAGE_VERSION} to v${resolved.version} (${resolved.tag})?`,\n default: true,\n });\n if (!shouldUpdate) {\n console.log('Update cancelled.');\n return;\n }\n }\n\n const packageManager = await resolveGlobalManager({ root });\n const spec = resolveGlobalInstallSpec({ version: resolved.version });\n\n if (!options.json) {\n console.log(`Installing ${spec} via ${packageManager}...`);\n }\n\n const { acquireUpdateLock } = await import('../../infra/update-lock.js');\n const lock = process.env.XOPC_AUTO_UPDATE\n ? { release: async () => {} }\n : await acquireUpdateLock('cli');\n if (!lock) {\n const message = 'Another update is already in progress. Try again later.';\n if (options.json) {\n console.log(JSON.stringify({ status: 'error', reason: 'lock-held', message }));\n } else {\n console.error(`❌ ${message}`);\n }\n process.exit(1);\n }\n\n let installResult: Awaited<ReturnType<typeof runGlobalPackageInstall>>;\n try {\n installResult = await runGlobalPackageInstall({\n manager: packageManager,\n spec,\n pkgRoot: root,\n echoToTerminal: !options.json,\n });\n } finally {\n await lock.release();\n }\n\n if (installResult.exitCode === 0) {\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'ok',\n previousVersion: PACKAGE_VERSION,\n installedVersion: resolved.version,\n channel: resolved.tag,\n packageManager: installResult.packageManager,\n }),\n );\n } else {\n console.log(`✅ Updated to v${resolved.version}`);\n console.log('Restart the gateway to use the new version: xopc gateway restart');\n }\n } else {\n const message = formatGlobalInstallFailure({\n packageManager: installResult.packageManager,\n spec,\n exitCode: installResult.exitCode,\n stderr: installResult.stderr,\n usedFallback: installResult.usedFallback,\n });\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'error',\n reason: 'install-failed',\n exitCode: installResult.exitCode,\n packageManager: installResult.packageManager,\n usedFallback: installResult.usedFallback,\n stderrTail: installResult.stderr.trim().slice(-4000) || undefined,\n message,\n }),\n );\n } else {\n console.error(`❌ Update failed (exit code ${installResult.exitCode})`);\n console.error(message);\n }\n process.exit(1);\n }\n },\n );\n}\n\nregister({\n id: 'update',\n name: 'update',\n description: 'Check for and install xopc updates',\n factory: createUpdateCommand,\n metadata: {\n category: 'maintenance',\n examples: [\n 'xopc update',\n 'xopc update --check',\n 'xopc update --channel beta',\n 'xopc update --yes --json',\n ],\n },\n});\n"],"mappings":"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"}
@@ -7,11 +7,6 @@ import { SessionIndex } from '../../session/index.js';
7
7
  * Eliminates repeated initialization boilerplate
8
8
  */
9
9
  export declare function getSessionIndex(): Promise<SessionIndex>;
10
- /**
11
- * Get session manager and handle errors consistently
12
- */
13
- /** @deprecated Use {@link getSessionIndex}. */
14
- export declare const getSessionManager: typeof getSessionIndex;
15
10
  export declare function getSessionIndexSafe(): Promise<{
16
11
  manager: SessionIndex;
17
12
  error: null;