@xopcai/xopc 0.0.6 → 0.0.11

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 (412) hide show
  1. package/dist/extensions/weixin/src/api/api.js +1 -1
  2. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  3. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  4. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  5. package/dist/gateway/static/root/assets/{agents-B6s2BvpH.js → agents-BdC4Y-HX.js} +2 -2
  6. package/dist/gateway/static/root/assets/agents-BdC4Y-HX.js.map +1 -0
  7. package/dist/gateway/static/root/assets/{apps-page-BtsZ5ZPx.js → apps-page-C-oaSHkm.js} +2 -2
  8. package/dist/gateway/static/root/assets/{apps-page-BtsZ5ZPx.js.map → apps-page-C-oaSHkm.js.map} +1 -1
  9. package/dist/gateway/static/root/assets/attachment-load-BDDlItdE.js +1 -0
  10. package/dist/gateway/static/root/assets/{channels-settings-BUfWBEVU.js → channels-settings-BqEUppPO.js} +2 -2
  11. package/dist/gateway/static/root/assets/{channels-settings-BUfWBEVU.js.map → channels-settings-BqEUppPO.js.map} +1 -1
  12. package/dist/gateway/static/root/assets/{chat-agents-api-BR30M2YQ.js → chat-agents-api-BhqjQ7iL.js} +2 -2
  13. package/dist/gateway/static/root/assets/{chat-agents-api-BR30M2YQ.js.map → chat-agents-api-BhqjQ7iL.js.map} +1 -1
  14. package/dist/gateway/static/root/assets/{cron-page-CMTx0Mjz.js → cron-page-Cli49RKR.js} +2 -2
  15. package/dist/gateway/static/root/assets/{cron-page-CMTx0Mjz.js.map → cron-page-Cli49RKR.js.map} +1 -1
  16. package/dist/gateway/static/root/assets/{cron-utils-BJma9IcD.js → cron-utils-Dkj-Ldpf.js} +2 -2
  17. package/dist/gateway/static/root/assets/{cron-utils-BJma9IcD.js.map → cron-utils-Dkj-Ldpf.js.map} +1 -1
  18. package/dist/gateway/static/root/assets/electron-env-BDtJw9AY.js +2 -0
  19. package/dist/gateway/static/root/assets/electron-env-BDtJw9AY.js.map +1 -0
  20. package/dist/gateway/static/root/assets/{extension-debug-page-BCVoNSo6.js → extension-debug-page-BMcZlaxF.js} +2 -2
  21. package/dist/gateway/static/root/assets/{extension-debug-page-BCVoNSo6.js.map → extension-debug-page-BMcZlaxF.js.map} +1 -1
  22. package/dist/gateway/static/root/assets/{extension-iframe-host-PWB-Pw2d.js → extension-iframe-host-D5HEF0KR.js} +2 -2
  23. package/dist/gateway/static/root/assets/{extension-iframe-host-PWB-Pw2d.js.map → extension-iframe-host-D5HEF0KR.js.map} +1 -1
  24. package/dist/gateway/static/root/assets/{extension-page-D2tTklsD.js → extension-page-CXdCSSPl.js} +2 -2
  25. package/dist/gateway/static/root/assets/{extension-page-D2tTklsD.js.map → extension-page-CXdCSSPl.js.map} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-provider-BpHodVRj.js → extension-provider-DZCZgQE2.js} +2 -2
  27. package/dist/gateway/static/root/assets/{extension-provider-BpHodVRj.js.map → extension-provider-DZCZgQE2.js.map} +1 -1
  28. package/dist/gateway/static/root/assets/{extension-settings-page-BEu6Xw1Z.js → extension-settings-page-CX6STpx3.js} +2 -2
  29. package/dist/gateway/static/root/assets/{extension-settings-page-BEu6Xw1Z.js.map → extension-settings-page-CX6STpx3.js.map} +1 -1
  30. package/dist/gateway/static/root/assets/{gateway-config-swr-C7ZFPhNj.js → gateway-config-swr-Cph02QZn.js} +2 -2
  31. package/dist/gateway/static/root/assets/{gateway-config-swr-C7ZFPhNj.js.map → gateway-config-swr-Cph02QZn.js.map} +1 -1
  32. package/dist/gateway/static/root/assets/index-Bty3m0mS.css +2 -0
  33. package/dist/gateway/static/root/assets/index-iTUyfzNr.js +16 -0
  34. package/dist/gateway/static/root/assets/index-iTUyfzNr.js.map +1 -0
  35. package/dist/gateway/static/root/assets/{logs-page-BpsxYdcL.js → logs-page-B9O5l3I8.js} +2 -2
  36. package/dist/gateway/static/root/assets/{logs-page-BpsxYdcL.js.map → logs-page-B9O5l3I8.js.map} +1 -1
  37. package/dist/gateway/static/root/assets/{model-selector-BiiDq8Pk.js → model-selector-BLiY_O25.js} +2 -2
  38. package/dist/gateway/static/root/assets/{model-selector-BiiDq8Pk.js.map → model-selector-BLiY_O25.js.map} +1 -1
  39. package/dist/gateway/static/root/assets/navigation-DB9S-C6S.js +2 -0
  40. package/dist/gateway/static/root/assets/navigation-DB9S-C6S.js.map +1 -0
  41. package/dist/gateway/static/root/assets/page-header-store-BFpnFTed.js +2 -0
  42. package/dist/gateway/static/root/assets/{page-header-store-HcRZK5CZ.js.map → page-header-store-BFpnFTed.js.map} +1 -1
  43. package/dist/gateway/static/root/assets/{session-api-DxNaAkmX.js → session-api-DEhQXWJg.js} +2 -2
  44. package/dist/gateway/static/root/assets/{session-api-DxNaAkmX.js.map → session-api-DEhQXWJg.js.map} +1 -1
  45. package/dist/gateway/static/root/assets/{session-working-directory-control-CDH-Wk4E.js → session-working-directory-control-DKOtWs3-.js} +3 -3
  46. package/dist/gateway/static/root/assets/{session-working-directory-control-CDH-Wk4E.js.map → session-working-directory-control-DKOtWs3-.js.map} +1 -1
  47. package/dist/gateway/static/root/assets/{sessions-page-5PK75r1n.js → sessions-page-BYlWP1ep.js} +2 -2
  48. package/dist/gateway/static/root/assets/{sessions-page-5PK75r1n.js.map → sessions-page-BYlWP1ep.js.map} +1 -1
  49. package/dist/gateway/static/root/assets/settings-page-oCnIavdg.js +2 -0
  50. package/dist/gateway/static/root/assets/settings-page-oCnIavdg.js.map +1 -0
  51. package/dist/gateway/static/root/assets/{skill-api-CxbNlOD_.js → skill-api-DWrn8Az0.js} +2 -2
  52. package/dist/gateway/static/root/assets/{skill-api-CxbNlOD_.js.map → skill-api-DWrn8Az0.js.map} +1 -1
  53. package/dist/gateway/static/root/assets/{skills-page-Dd8ZzYJb.js → skills-page-C59WQpM1.js} +2 -2
  54. package/dist/gateway/static/root/assets/{skills-page-Dd8ZzYJb.js.map → skills-page-C59WQpM1.js.map} +1 -1
  55. package/dist/gateway/static/root/assets/{theme-store-CPTH77BE.js → theme-store-CywXkKml.js} +2 -2
  56. package/dist/gateway/static/root/assets/{theme-store-CPTH77BE.js.map → theme-store-CywXkKml.js.map} +1 -1
  57. package/dist/gateway/static/root/assets/url-D7yWllI8.js +2 -0
  58. package/dist/gateway/static/root/assets/url-D7yWllI8.js.map +1 -0
  59. package/dist/gateway/static/root/assets/{useTranslation-BEUWOMuh.js → useTranslation-CACj0DBJ.js} +2 -2
  60. package/dist/gateway/static/root/assets/{useTranslation-BEUWOMuh.js.map → useTranslation-CACj0DBJ.js.map} +1 -1
  61. package/dist/gateway/static/root/index.html +16 -16
  62. package/dist/package.js +1 -1
  63. package/dist/src/agent/agent-manager.d.ts +1 -0
  64. package/dist/src/agent/agent-manager.js +17 -9
  65. package/dist/src/agent/agent-manager.js.map +1 -1
  66. package/dist/src/agent/background-review/run-background-review.js +2 -0
  67. package/dist/src/agent/background-review/run-background-review.js.map +1 -1
  68. package/dist/src/agent/child-agent-factory.js +2 -0
  69. package/dist/src/agent/child-agent-factory.js.map +1 -1
  70. package/dist/src/agent/context/expand-at-file-mentions.d.ts +4 -0
  71. package/dist/src/agent/context/expand-at-file-mentions.js +69 -0
  72. package/dist/src/agent/context/expand-at-file-mentions.js.map +1 -0
  73. package/dist/src/agent/context/workspace-seed.js +1 -1
  74. package/dist/src/agent/image/index.d.ts +0 -1
  75. package/dist/src/agent/image/index.js +1 -2
  76. package/dist/src/agent/image/understanding/pi-ai-provider.js.map +1 -1
  77. package/dist/src/agent/ipc/inbox.js +1 -1
  78. package/dist/src/agent/ipc/socket.js +1 -1
  79. package/dist/src/agent/memory/compaction.d.ts +1 -1
  80. package/dist/src/agent/memory/compaction.js +38 -11
  81. package/dist/src/agent/memory/compaction.js.map +1 -1
  82. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  83. package/dist/src/agent/messaging/command-handler.d.ts +13 -0
  84. package/dist/src/agent/messaging/command-handler.js +14 -2
  85. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  86. package/dist/src/agent/orchestration/agent-orchestrator.js +6 -1
  87. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  88. package/dist/src/agent/service.d.ts +16 -1
  89. package/dist/src/agent/service.js +175 -17
  90. package/dist/src/agent/service.js.map +1 -1
  91. package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
  92. package/dist/src/agent/skills/hub-hash.js +1 -1
  93. package/dist/src/agent/skills/hub-pull.js +1 -1
  94. package/dist/src/agent/skills/scanner.js +1 -1
  95. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  96. package/dist/src/agent/skills/skill-manage-ops.js.map +1 -1
  97. package/dist/src/agent/tools/browser/tools.js +2 -2
  98. package/dist/src/agent/tools/browser/tools.js.map +1 -1
  99. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  100. package/dist/src/agent/tools/image-tool.js +2 -2
  101. package/dist/src/agent/tools/image-tool.js.map +1 -1
  102. package/dist/src/agent/tools/index.d.ts +1 -1
  103. package/dist/src/agent/tools/index.js +2 -2
  104. package/dist/src/agent/tools/read.d.ts +0 -2
  105. package/dist/src/agent/tools/read.js +1 -3
  106. package/dist/src/agent/tools/read.js.map +1 -1
  107. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  108. package/dist/src/agent/tools/write.js +1 -1
  109. package/dist/src/auth/credentials.js +2 -2
  110. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  111. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  112. package/dist/src/channels/index.d.ts +1 -1
  113. package/dist/src/channels/index.js +2 -2
  114. package/dist/src/channels/pipeline.d.ts +8 -1
  115. package/dist/src/channels/pipeline.js +49 -4
  116. package/dist/src/channels/pipeline.js.map +1 -1
  117. package/dist/src/channels/plugin-types.d.ts +14 -0
  118. package/dist/src/chat-commands/builtins/config.d.ts +4 -0
  119. package/dist/src/chat-commands/builtins/config.js +197 -0
  120. package/dist/src/chat-commands/builtins/config.js.map +1 -0
  121. package/dist/src/chat-commands/builtins/context.d.ts +4 -0
  122. package/dist/src/chat-commands/builtins/context.js +44 -0
  123. package/dist/src/chat-commands/builtins/context.js.map +1 -0
  124. package/dist/src/chat-commands/builtins/session.js +111 -0
  125. package/dist/src/chat-commands/builtins/session.js.map +1 -1
  126. package/dist/src/chat-commands/builtins/thinking.js +49 -21
  127. package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
  128. package/dist/src/chat-commands/config-paths.d.ts +10 -0
  129. package/dist/src/chat-commands/config-paths.js +45 -0
  130. package/dist/src/chat-commands/config-paths.js.map +1 -0
  131. package/dist/src/chat-commands/config-value.d.ts +12 -0
  132. package/dist/src/chat-commands/config-value.js +53 -0
  133. package/dist/src/chat-commands/config-value.js.map +1 -0
  134. package/dist/src/chat-commands/context.d.ts +24 -1
  135. package/dist/src/chat-commands/context.js +41 -0
  136. package/dist/src/chat-commands/context.js.map +1 -1
  137. package/dist/src/chat-commands/index.d.ts +2 -0
  138. package/dist/src/chat-commands/index.js +5 -1
  139. package/dist/src/chat-commands/index.js.map +1 -1
  140. package/dist/src/chat-commands/types.d.ts +33 -1
  141. package/dist/src/cli/commands/agent/interactive.js +1 -1
  142. package/dist/src/cli/commands/agent/interactive.js.map +1 -1
  143. package/dist/src/cli/commands/agent.js +21 -9
  144. package/dist/src/cli/commands/agent.js.map +1 -1
  145. package/dist/src/cli/commands/auth.js.map +1 -1
  146. package/dist/src/cli/commands/doctor/checks/channel-config.d.ts +2 -0
  147. package/dist/src/cli/commands/doctor/checks/channel-config.js +113 -0
  148. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -0
  149. package/dist/src/cli/commands/doctor/checks/channel-plugins.d.ts +2 -0
  150. package/dist/src/cli/commands/doctor/checks/channel-plugins.js +47 -0
  151. package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -0
  152. package/dist/src/cli/commands/doctor/checks/config-health.d.ts +2 -0
  153. package/dist/src/cli/commands/doctor/checks/config-health.js +82 -0
  154. package/dist/src/cli/commands/doctor/checks/config-health.js.map +1 -0
  155. package/dist/src/cli/commands/doctor/checks/cron-health.d.ts +2 -0
  156. package/dist/src/cli/commands/doctor/checks/cron-health.js +116 -0
  157. package/dist/src/cli/commands/doctor/checks/cron-health.js.map +1 -0
  158. package/dist/src/cli/commands/doctor/checks/gateway-health.d.ts +2 -0
  159. package/dist/src/cli/commands/doctor/checks/gateway-health.js +64 -0
  160. package/dist/src/cli/commands/doctor/checks/gateway-health.js.map +1 -0
  161. package/dist/src/cli/commands/doctor/checks/gateway-service.d.ts +2 -0
  162. package/dist/src/cli/commands/doctor/checks/gateway-service.js +64 -0
  163. package/dist/src/cli/commands/doctor/checks/gateway-service.js.map +1 -0
  164. package/dist/src/cli/commands/doctor/checks/node-version.d.ts +2 -0
  165. package/dist/src/cli/commands/doctor/checks/node-version.js +33 -0
  166. package/dist/src/cli/commands/doctor/checks/node-version.js.map +1 -0
  167. package/dist/src/cli/commands/doctor/checks/provider-auth.d.ts +2 -0
  168. package/dist/src/cli/commands/doctor/checks/provider-auth.js +91 -0
  169. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -0
  170. package/dist/src/cli/commands/doctor/checks/security-audit.d.ts +2 -0
  171. package/dist/src/cli/commands/doctor/checks/security-audit.js +85 -0
  172. package/dist/src/cli/commands/doctor/checks/security-audit.js.map +1 -0
  173. package/dist/src/cli/commands/doctor/checks/session-integrity.d.ts +2 -0
  174. package/dist/src/cli/commands/doctor/checks/session-integrity.js +118 -0
  175. package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -0
  176. package/dist/src/cli/commands/doctor/checks/state-integrity.d.ts +2 -0
  177. package/dist/src/cli/commands/doctor/checks/state-integrity.js +99 -0
  178. package/dist/src/cli/commands/doctor/checks/state-integrity.js.map +1 -0
  179. package/dist/src/cli/commands/doctor/checks/version-check.d.ts +2 -0
  180. package/dist/src/cli/commands/doctor/checks/version-check.js +71 -0
  181. package/dist/src/cli/commands/doctor/checks/version-check.js.map +1 -0
  182. package/dist/src/cli/commands/doctor/checks/workspace-status.d.ts +2 -0
  183. package/dist/src/cli/commands/doctor/checks/workspace-status.js +73 -0
  184. package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +1 -0
  185. package/dist/src/cli/commands/doctor/flow.d.ts +9 -0
  186. package/dist/src/cli/commands/doctor/flow.js +51 -0
  187. package/dist/src/cli/commands/doctor/flow.js.map +1 -0
  188. package/dist/src/cli/commands/doctor/format.d.ts +6 -0
  189. package/dist/src/cli/commands/doctor/format.js +61 -0
  190. package/dist/src/cli/commands/doctor/format.js.map +1 -0
  191. package/dist/src/cli/commands/doctor/index.js +44 -0
  192. package/dist/src/cli/commands/doctor/index.js.map +1 -0
  193. package/dist/src/cli/commands/doctor/types.d.ts +20 -0
  194. package/dist/src/cli/commands/doctor/types.js +1 -0
  195. package/dist/src/cli/commands/extension.js +10 -0
  196. package/dist/src/cli/commands/extension.js.map +1 -1
  197. package/dist/src/cli/commands/init.js +1 -2
  198. package/dist/src/cli/commands/init.js.map +1 -1
  199. package/dist/src/cli/commands/session/utils.js.map +1 -1
  200. package/dist/src/cli/commands/update.d.ts +1 -0
  201. package/dist/src/cli/commands/update.js +171 -0
  202. package/dist/src/cli/commands/update.js.map +1 -0
  203. package/dist/src/cli/index.d.ts +2 -2
  204. package/dist/src/cli/index.js +4 -2
  205. package/dist/src/cli/index.js.map +1 -1
  206. package/dist/src/cli/utils/init-workspace.js +1 -1
  207. package/dist/src/config/index.d.ts +1 -0
  208. package/dist/src/config/index.js +4 -3
  209. package/dist/src/config/index.js.map +1 -1
  210. package/dist/src/config/loader.js +1 -1
  211. package/dist/src/config/models-json.d.ts +15 -15
  212. package/dist/src/config/paths.js.map +1 -1
  213. package/dist/src/config/profile.js +1 -1
  214. package/dist/src/config/runtime-overrides.d.ts +8 -0
  215. package/dist/src/config/runtime-overrides.js +40 -0
  216. package/dist/src/config/runtime-overrides.js.map +1 -0
  217. package/dist/src/config/schema.d.ts +34 -104
  218. package/dist/src/config/schema.js +18 -39
  219. package/dist/src/config/schema.js.map +1 -1
  220. package/dist/src/cron/persistence.js +1 -1
  221. package/dist/src/cron/run-log-store.js +1 -1
  222. package/dist/src/daemon/launchd.js +2 -2
  223. package/dist/src/daemon/launchd.js.map +1 -1
  224. package/dist/src/daemon/systemd.js +2 -2
  225. package/dist/src/daemon/systemd.js.map +1 -1
  226. package/dist/src/extensions/health.js +1 -1
  227. package/dist/src/extensions/loader.d.ts +1 -1
  228. package/dist/src/extensions/loader.js +5 -8
  229. package/dist/src/extensions/loader.js.map +1 -1
  230. package/dist/src/extensions/lockfile.js +1 -1
  231. package/dist/src/extensions/sdk/index.js +6 -1
  232. package/dist/src/extensions/sdk/index.js.map +1 -0
  233. package/dist/src/gateway/agents-admin.js +1 -1
  234. package/dist/src/gateway/agents-admin.js.map +1 -1
  235. package/dist/src/gateway/hono/lib/static-ui.js +1 -1
  236. package/dist/src/gateway/hono/oauth.js +1 -1
  237. package/dist/src/gateway/hono/routes/config.js +1 -1
  238. package/dist/src/gateway/hono/routes/doctor.d.ts +3 -0
  239. package/dist/src/gateway/hono/routes/doctor.js +35 -0
  240. package/dist/src/gateway/hono/routes/doctor.js.map +1 -0
  241. package/dist/src/gateway/hono/routes/index.js +4 -0
  242. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  243. package/dist/src/gateway/hono/routes/models.js +64 -11
  244. package/dist/src/gateway/hono/routes/models.js.map +1 -1
  245. package/dist/src/gateway/hono/routes/public-gateway.js +10 -0
  246. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  247. package/dist/src/gateway/hono/routes/update.d.ts +3 -0
  248. package/dist/src/gateway/hono/routes/update.js +141 -0
  249. package/dist/src/gateway/hono/routes/update.js.map +1 -0
  250. package/dist/src/gateway/hono/routes/workspace.js +82 -2
  251. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  252. package/dist/src/gateway/lock.js +1 -1
  253. package/dist/src/gateway/ports.js +98 -3
  254. package/dist/src/gateway/ports.js.map +1 -1
  255. package/dist/src/gateway/service.d.ts +1 -4
  256. package/dist/src/gateway/service.js +13 -20
  257. package/dist/src/gateway/service.js.map +1 -1
  258. package/dist/src/gateway/workspace-fs-file-list.d.ts +5 -0
  259. package/dist/src/gateway/workspace-fs-file-list.js +56 -0
  260. package/dist/src/gateway/workspace-fs-file-list.js.map +1 -0
  261. package/dist/src/gateway/workspace-heartbeat-path.js +1 -1
  262. package/dist/src/gateway/workspace-ripgrep.d.ts +5 -0
  263. package/dist/src/gateway/workspace-ripgrep.js +88 -4
  264. package/dist/src/gateway/workspace-ripgrep.js.map +1 -1
  265. package/dist/src/infra/update-channels.d.ts +14 -0
  266. package/dist/src/infra/update-channels.js +30 -0
  267. package/dist/src/infra/update-channels.js.map +1 -0
  268. package/dist/src/infra/update-check.d.ts +53 -0
  269. package/dist/src/infra/update-check.js +155 -0
  270. package/dist/src/infra/update-check.js.map +1 -0
  271. package/dist/src/infra/update-runner.d.ts +18 -0
  272. package/dist/src/infra/update-runner.js +112 -0
  273. package/dist/src/infra/update-runner.js.map +1 -0
  274. package/dist/src/infra/update-startup.d.ts +20 -0
  275. package/dist/src/infra/update-startup.js +246 -0
  276. package/dist/src/infra/update-startup.js.map +1 -0
  277. package/dist/src/providers/extension-stream-bridge.d.ts +3 -0
  278. package/dist/src/providers/extension-stream-bridge.js +239 -0
  279. package/dist/src/providers/extension-stream-bridge.js.map +1 -0
  280. package/dist/src/providers/index.d.ts +7 -2
  281. package/dist/src/providers/index.js +77 -14
  282. package/dist/src/providers/index.js.map +1 -1
  283. package/dist/src/providers/model-registry.js +1 -1
  284. package/dist/src/providers/plugin-registry.js +92 -87
  285. package/dist/src/providers/plugin-registry.js.map +1 -1
  286. package/dist/src/routing/bindings.js +1 -1
  287. package/dist/src/routing/index.d.ts +1 -1
  288. package/dist/src/routing/index.js +2 -2
  289. package/dist/src/routing/index.js.map +1 -1
  290. package/dist/src/routing/resolve-route.js +1 -1
  291. package/dist/src/routing/session-key.d.ts +0 -5
  292. package/dist/src/routing/session-key.js +1 -27
  293. package/dist/src/routing/session-key.js.map +1 -1
  294. package/dist/src/session/chat-export.d.ts +5 -0
  295. package/dist/src/session/chat-export.js +35 -0
  296. package/dist/src/session/chat-export.js.map +1 -0
  297. package/dist/src/session/config-store.js +1 -1
  298. package/dist/src/session/manager.d.ts +1 -1
  299. package/dist/src/session/manager.js +2 -2
  300. package/dist/src/session/manager.js.map +1 -1
  301. package/dist/src/session/store.d.ts +1 -1
  302. package/dist/src/session/store.js +3 -7
  303. package/dist/src/session/store.js.map +1 -1
  304. package/dist/src/session/types.d.ts +0 -10
  305. package/dist/src/session/types.js.map +1 -1
  306. package/dist/src/utils/logger/audit.js +1 -1
  307. package/dist/src/utils/logger/log-store.js +1 -1
  308. package/dist/src/utils/logger/rotation.js +1 -1
  309. package/dist/src/voice/tts/audio.js +1 -1
  310. package/package.json +2 -2
  311. package/dist/gateway/static/root/assets/agents-B6s2BvpH.js.map +0 -1
  312. package/dist/gateway/static/root/assets/attachment-load-6pRlDPZ8.js +0 -1
  313. package/dist/gateway/static/root/assets/index-DBZ5eXW5.js +0 -16
  314. package/dist/gateway/static/root/assets/index-DBZ5eXW5.js.map +0 -1
  315. package/dist/gateway/static/root/assets/index-KsVMH-Jo.css +0 -2
  316. package/dist/gateway/static/root/assets/navigation-BpLKd2Ca.js +0 -2
  317. package/dist/gateway/static/root/assets/navigation-BpLKd2Ca.js.map +0 -1
  318. package/dist/gateway/static/root/assets/page-header-store-HcRZK5CZ.js +0 -2
  319. package/dist/gateway/static/root/assets/preference-select-fields-B4AJBqUY.js +0 -2
  320. package/dist/gateway/static/root/assets/preference-select-fields-B4AJBqUY.js.map +0 -1
  321. package/dist/gateway/static/root/assets/settings-page-BvSj0JqX.js +0 -2
  322. package/dist/gateway/static/root/assets/settings-page-BvSj0JqX.js.map +0 -1
  323. package/dist/gateway/static/root/assets/url-QmwQTJ-j.js +0 -2
  324. package/dist/gateway/static/root/assets/url-QmwQTJ-j.js.map +0 -1
  325. package/dist/src/acp/commands.d.ts +0 -11
  326. package/dist/src/acp/commands.js +0 -17
  327. package/dist/src/acp/commands.js.map +0 -1
  328. package/dist/src/acp/control-plane/identity-reconcile.d.ts +0 -36
  329. package/dist/src/acp/control-plane/identity-reconcile.js +0 -124
  330. package/dist/src/acp/control-plane/identity-reconcile.js.map +0 -1
  331. package/dist/src/acp/control-plane/index.d.ts +0 -10
  332. package/dist/src/acp/control-plane/index.js +0 -6
  333. package/dist/src/acp/control-plane/manager.d.ts +0 -86
  334. package/dist/src/acp/control-plane/manager.js +0 -502
  335. package/dist/src/acp/control-plane/manager.js.map +0 -1
  336. package/dist/src/acp/control-plane/manager.types.d.ts +0 -125
  337. package/dist/src/acp/control-plane/manager.types.js +0 -14
  338. package/dist/src/acp/control-plane/manager.types.js.map +0 -1
  339. package/dist/src/acp/control-plane/manager.utils.d.ts +0 -29
  340. package/dist/src/acp/control-plane/manager.utils.js +0 -46
  341. package/dist/src/acp/control-plane/manager.utils.js.map +0 -1
  342. package/dist/src/acp/control-plane/runtime-cache-manager.d.ts +0 -49
  343. package/dist/src/acp/control-plane/runtime-cache-manager.js +0 -155
  344. package/dist/src/acp/control-plane/runtime-cache-manager.js.map +0 -1
  345. package/dist/src/acp/control-plane/runtime-cache.d.ts +0 -45
  346. package/dist/src/acp/control-plane/runtime-cache.js +0 -58
  347. package/dist/src/acp/control-plane/runtime-cache.js.map +0 -1
  348. package/dist/src/acp/control-plane/runtime-options.d.ts +0 -30
  349. package/dist/src/acp/control-plane/runtime-options.js +0 -92
  350. package/dist/src/acp/control-plane/runtime-options.js.map +0 -1
  351. package/dist/src/acp/control-plane/session-actor-queue.d.ts +0 -22
  352. package/dist/src/acp/control-plane/session-actor-queue.js +0 -70
  353. package/dist/src/acp/control-plane/session-actor-queue.js.map +0 -1
  354. package/dist/src/acp/control-plane/session-lifecycle-manager.d.ts +0 -59
  355. package/dist/src/acp/control-plane/session-lifecycle-manager.js +0 -209
  356. package/dist/src/acp/control-plane/session-lifecycle-manager.js.map +0 -1
  357. package/dist/src/acp/control-plane/session-store.d.ts +0 -39
  358. package/dist/src/acp/control-plane/session-store.js +0 -149
  359. package/dist/src/acp/control-plane/session-store.js.map +0 -1
  360. package/dist/src/acp/control-plane/turn-manager.d.ts +0 -40
  361. package/dist/src/acp/control-plane/turn-manager.js +0 -134
  362. package/dist/src/acp/control-plane/turn-manager.js.map +0 -1
  363. package/dist/src/acp/event-mapper.d.ts +0 -48
  364. package/dist/src/acp/event-mapper.js +0 -94
  365. package/dist/src/acp/event-mapper.js.map +0 -1
  366. package/dist/src/acp/index.d.ts +0 -10
  367. package/dist/src/acp/index.js +0 -5
  368. package/dist/src/acp/meta.d.ts +0 -15
  369. package/dist/src/acp/meta.js +0 -36
  370. package/dist/src/acp/meta.js.map +0 -1
  371. package/dist/src/acp/routing-integration.d.ts +0 -37
  372. package/dist/src/acp/routing-integration.js +0 -58
  373. package/dist/src/acp/routing-integration.js.map +0 -1
  374. package/dist/src/acp/runtime/backends/index.d.ts +0 -4
  375. package/dist/src/acp/runtime/backends/index.js +0 -2
  376. package/dist/src/acp/runtime/backends/local.d.ts +0 -136
  377. package/dist/src/acp/runtime/backends/local.js +0 -603
  378. package/dist/src/acp/runtime/backends/local.js.map +0 -1
  379. package/dist/src/acp/runtime/error-text.d.ts +0 -16
  380. package/dist/src/acp/runtime/error-text.js +0 -40
  381. package/dist/src/acp/runtime/error-text.js.map +0 -1
  382. package/dist/src/acp/runtime/errors.d.ts +0 -31
  383. package/dist/src/acp/runtime/errors.js +0 -47
  384. package/dist/src/acp/runtime/errors.js.map +0 -1
  385. package/dist/src/acp/runtime/index.d.ts +0 -7
  386. package/dist/src/acp/runtime/index.js +0 -4
  387. package/dist/src/acp/runtime/registry.d.ts +0 -35
  388. package/dist/src/acp/runtime/registry.js +0 -85
  389. package/dist/src/acp/runtime/registry.js.map +0 -1
  390. package/dist/src/acp/runtime/session-identity.d.ts +0 -35
  391. package/dist/src/acp/runtime/session-identity.js +0 -134
  392. package/dist/src/acp/runtime/session-identity.js.map +0 -1
  393. package/dist/src/acp/runtime/types.d.ts +0 -214
  394. package/dist/src/acp/secret-file.d.ts +0 -7
  395. package/dist/src/acp/secret-file.js +0 -19
  396. package/dist/src/acp/secret-file.js.map +0 -1
  397. package/dist/src/acp/server.d.ts +0 -48
  398. package/dist/src/acp/server.js +0 -300
  399. package/dist/src/acp/server.js.map +0 -1
  400. package/dist/src/acp/session.d.ts +0 -29
  401. package/dist/src/acp/session.js +0 -30
  402. package/dist/src/acp/session.js.map +0 -1
  403. package/dist/src/acp/types.d.ts +0 -39
  404. package/dist/src/acp/types.js +0 -13
  405. package/dist/src/acp/types.js.map +0 -1
  406. package/dist/src/agent/image/describe-images.d.ts +0 -18
  407. package/dist/src/agent/image/describe-images.js +0 -19
  408. package/dist/src/agent/image/describe-images.js.map +0 -1
  409. package/dist/src/cli/commands/acp.d.ts +0 -4
  410. package/dist/src/cli/commands/acp.js +0 -200
  411. package/dist/src/cli/commands/acp.js.map +0 -1
  412. /package/dist/src/{acp/runtime/types.js → cli/commands/doctor/index.d.ts} +0 -0
@@ -0,0 +1,71 @@
1
+ import { PACKAGE_VERSION, init_package_version } from "../../../../package-version.js";
2
+ //#region src/cli/commands/doctor/checks/version-check.ts
3
+ init_package_version();
4
+ const REGISTRY_URL = "https://registry.npmjs.org/@xopcai/xopc/latest";
5
+ const TIMEOUT_MS = 5e3;
6
+ /** Simple semver: 1 if a > b, -1 if a < b, 0 if equal. */
7
+ function compareSemver(a, b) {
8
+ const pa = a.split(".").map((x) => parseInt(x, 10) || 0);
9
+ const pb = b.split(".").map((x) => parseInt(x, 10) || 0);
10
+ const n = Math.max(pa.length, pb.length);
11
+ for (let i = 0; i < n; i++) {
12
+ const da = pa[i] ?? 0;
13
+ const db = pb[i] ?? 0;
14
+ if (da > db) return 1;
15
+ if (da < db) return -1;
16
+ }
17
+ return 0;
18
+ }
19
+ async function fetchLatestVersion() {
20
+ const controller = new AbortController();
21
+ const t = setTimeout(() => controller.abort(), TIMEOUT_MS);
22
+ try {
23
+ const res = await fetch(REGISTRY_URL, {
24
+ signal: controller.signal,
25
+ headers: { accept: "application/json" }
26
+ });
27
+ if (!res.ok) return null;
28
+ const data = await res.json();
29
+ return typeof data.version === "string" ? data.version : null;
30
+ } catch {
31
+ return null;
32
+ } finally {
33
+ clearTimeout(t);
34
+ }
35
+ }
36
+ async function checkVersionUpdate(_ctx) {
37
+ const local = PACKAGE_VERSION.trim() || "0.0.0";
38
+ const latest = await fetchLatestVersion();
39
+ if (!latest) return {
40
+ id: "version-check",
41
+ label: "Version",
42
+ status: "skip",
43
+ message: "Could not query npm for the latest version (offline or registry error).",
44
+ hints: []
45
+ };
46
+ if (compareSemver(latest, local) > 0) return {
47
+ id: "version-check",
48
+ label: "Version",
49
+ status: "warn",
50
+ message: `Running v${local}; npm latest is v${latest}.`,
51
+ hints: ["Upgrade: pnpm add -g @xopcai/xopc@latest", "Or: npm i -g @xopcai/xopc@latest"]
52
+ };
53
+ if (compareSemver(local, latest) > 0) return {
54
+ id: "version-check",
55
+ label: "Version",
56
+ status: "pass",
57
+ message: `Running v${local} (ahead of npm registry v${latest}; local/dev build is OK).`,
58
+ hints: []
59
+ };
60
+ return {
61
+ id: "version-check",
62
+ label: "Version",
63
+ status: "pass",
64
+ message: `Running v${local} (matches npm latest).`,
65
+ hints: []
66
+ };
67
+ }
68
+ //#endregion
69
+ export { checkVersionUpdate };
70
+
71
+ //# sourceMappingURL=version-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-check.js","names":[],"sources":["../../../../../../src/cli/commands/doctor/checks/version-check.ts"],"sourcesContent":["import { PACKAGE_VERSION } from '../../../../package-version.js';\nimport type { CheckResult, DoctorContext } from '../types.js';\n\nconst REGISTRY_URL = 'https://registry.npmjs.org/@xopcai/xopc/latest';\nconst TIMEOUT_MS = 5000;\n\n/** Simple semver: 1 if a > b, -1 if a < b, 0 if equal. */\nfunction compareSemver(a: string, b: string): number {\n const pa = a.split('.').map((x) => parseInt(x, 10) || 0);\n const pb = b.split('.').map((x) => parseInt(x, 10) || 0);\n const n = Math.max(pa.length, pb.length);\n for (let i = 0; i < n; i++) {\n const da = pa[i] ?? 0;\n const db = pb[i] ?? 0;\n if (da > db) return 1;\n if (da < db) return -1;\n }\n return 0;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n const controller = new AbortController();\n const t = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n const res = await fetch(REGISTRY_URL, {\n signal: controller.signal,\n headers: { accept: 'application/json' },\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return typeof data.version === 'string' ? data.version : null;\n } catch {\n return null;\n } finally {\n clearTimeout(t);\n }\n}\n\nexport async function checkVersionUpdate(_ctx: DoctorContext): Promise<CheckResult> {\n const local = PACKAGE_VERSION.trim() || '0.0.0';\n const latest = await fetchLatestVersion();\n if (!latest) {\n return {\n id: 'version-check',\n label: 'Version',\n status: 'skip',\n message: 'Could not query npm for the latest version (offline or registry error).',\n hints: [],\n };\n }\n\n if (compareSemver(latest, local) > 0) {\n return {\n id: 'version-check',\n label: 'Version',\n status: 'warn',\n message: `Running v${local}; npm latest is v${latest}.`,\n hints: ['Upgrade: pnpm add -g @xopcai/xopc@latest', 'Or: npm i -g @xopcai/xopc@latest'],\n };\n }\n\n if (compareSemver(local, latest) > 0) {\n return {\n id: 'version-check',\n label: 'Version',\n status: 'pass',\n message: `Running v${local} (ahead of npm registry v${latest}; local/dev build is OK).`,\n hints: [],\n };\n }\n\n return {\n id: 'version-check',\n label: 'Version',\n status: 'pass',\n message: `Running v${local} (matches npm latest).`,\n hints: [],\n };\n}\n"],"mappings":";;sBAAiE;AAGjE,MAAM,eAAe;AACrB,MAAM,aAAa;;AAGnB,SAAS,cAAc,GAAW,GAAmB;CACnD,MAAM,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,MAAM,SAAS,GAAG,GAAG,IAAI,EAAE;CACxD,MAAM,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,MAAM,SAAS,GAAG,GAAG,IAAI,EAAE;CACxD,MAAM,IAAI,KAAK,IAAI,GAAG,QAAQ,GAAG,OAAO;AACxC,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;EAC1B,MAAM,KAAK,GAAG,MAAM;EACpB,MAAM,KAAK,GAAG,MAAM;AACpB,MAAI,KAAK,GAAI,QAAO;AACpB,MAAI,KAAK,GAAI,QAAO;;AAEtB,QAAO;;AAGT,eAAe,qBAA6C;CAC1D,MAAM,aAAa,IAAI,iBAAiB;CACxC,MAAM,IAAI,iBAAiB,WAAW,OAAO,EAAE,WAAW;AAC1D,KAAI;EACF,MAAM,MAAM,MAAM,MAAM,cAAc;GACpC,QAAQ,WAAW;GACnB,SAAS,EAAE,QAAQ,oBAAoB;GACxC,CAAC;AACF,MAAI,CAAC,IAAI,GAAI,QAAO;EACpB,MAAM,OAAQ,MAAM,IAAI,MAAM;AAC9B,SAAO,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU;SACnD;AACN,SAAO;WACC;AACR,eAAa,EAAE;;;AAInB,eAAsB,mBAAmB,MAA2C;CAClF,MAAM,QAAQ,gBAAgB,MAAM,IAAI;CACxC,MAAM,SAAS,MAAM,oBAAoB;AACzC,KAAI,CAAC,OACH,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;AAGH,KAAI,cAAc,QAAQ,MAAM,GAAG,EACjC,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,YAAY,MAAM,mBAAmB,OAAO;EACrD,OAAO,CAAC,4CAA4C,mCAAmC;EACxF;AAGH,KAAI,cAAc,OAAO,OAAO,GAAG,EACjC,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,YAAY,MAAM,2BAA2B,OAAO;EAC7D,OAAO,EAAE;EACV;AAGH,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,YAAY,MAAM;EAC3B,OAAO,EAAE;EACV"}
@@ -0,0 +1,2 @@
1
+ import type { CheckResult, DoctorContext } from '../types.js';
2
+ export declare function checkWorkspaceStatus(ctx: DoctorContext): Promise<CheckResult>;
@@ -0,0 +1,73 @@
1
+ import { init_agent_scope, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../../../../agent/agent-scope.js";
2
+ import { WORKSPACE_FILES, init_paths } from "../../../../config/paths.js";
3
+ import { init_loader, loadConfig } from "../../../../config/loader.js";
4
+ import { join } from "node:path";
5
+ import { existsSync } from "node:fs";
6
+ //#region src/cli/commands/doctor/checks/workspace-status.ts
7
+ init_agent_scope();
8
+ init_loader();
9
+ init_paths();
10
+ async function checkWorkspaceStatus(ctx) {
11
+ if (!existsSync(ctx.configPath)) return {
12
+ id: "workspace-status",
13
+ label: "Workspace",
14
+ status: "skip",
15
+ message: "No config file; skipped.",
16
+ hints: []
17
+ };
18
+ let config;
19
+ try {
20
+ config = loadConfig(ctx.configPath);
21
+ } catch {
22
+ return {
23
+ id: "workspace-status",
24
+ label: "Workspace",
25
+ status: "skip",
26
+ message: "Config could not be loaded; skipped.",
27
+ hints: []
28
+ };
29
+ }
30
+ const agentId = resolveDefaultAgentId(config);
31
+ const root = resolveAgentWorkspaceDir(config, agentId);
32
+ const hints = [];
33
+ if (!existsSync(root)) return {
34
+ id: "workspace-status",
35
+ label: "Workspace",
36
+ status: "warn",
37
+ message: "Agent workspace directory is missing.",
38
+ hints: [root, "Run: xopc onboard"]
39
+ };
40
+ const soul = join(root, WORKSPACE_FILES.SOUL);
41
+ const identity = join(root, WORKSPACE_FILES.IDENTITY);
42
+ const missing = [];
43
+ if (!existsSync(soul)) missing.push(WORKSPACE_FILES.SOUL);
44
+ if (!existsSync(identity)) missing.push(WORKSPACE_FILES.IDENTITY);
45
+ if (missing.length > 0) return {
46
+ id: "workspace-status",
47
+ label: "Workspace",
48
+ status: "warn",
49
+ message: `Essential workspace files missing: ${missing.join(", ")}.`,
50
+ hints: [root, "Run: xopc onboard"]
51
+ };
52
+ if (!existsSync(join(root, WORKSPACE_FILES.USER))) hints.push(`${WORKSPACE_FILES.USER} is optional; add a user profile for better context.`);
53
+ if (!existsSync(join(root, WORKSPACE_FILES.TOOLS))) hints.push(`${WORKSPACE_FILES.TOOLS} is optional; add tool notes if you use many tools.`);
54
+ if (!existsSync(join(root, ".git"))) hints.push("No .git in workspace; version control is recommended for backup and history.");
55
+ if (hints.length > 0) return {
56
+ id: "workspace-status",
57
+ label: "Workspace",
58
+ status: "pass",
59
+ message: "Essential workspace files are present.",
60
+ hints
61
+ };
62
+ return {
63
+ id: "workspace-status",
64
+ label: "Workspace",
65
+ status: "pass",
66
+ message: "Workspace directory and essential files look good.",
67
+ hints: [root]
68
+ };
69
+ }
70
+ //#endregion
71
+ export { checkWorkspaceStatus };
72
+
73
+ //# sourceMappingURL=workspace-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-status.js","names":[],"sources":["../../../../../../src/cli/commands/doctor/checks/workspace-status.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { resolveDefaultAgentId, resolveAgentWorkspaceDir } from '../../../../agent/agent-scope.js';\nimport { loadConfig } from '../../../../config/loader.js';\nimport { WORKSPACE_FILES } from '../../../../config/paths.js';\nimport type { CheckResult, DoctorContext } from '../types.js';\n\nexport async function checkWorkspaceStatus(ctx: DoctorContext): Promise<CheckResult> {\n if (!existsSync(ctx.configPath)) {\n return {\n id: 'workspace-status',\n label: 'Workspace',\n status: 'skip',\n message: 'No config file; skipped.',\n hints: [],\n };\n }\n\n let config;\n try {\n config = loadConfig(ctx.configPath);\n } catch {\n return {\n id: 'workspace-status',\n label: 'Workspace',\n status: 'skip',\n message: 'Config could not be loaded; skipped.',\n hints: [],\n };\n }\n\n const agentId = resolveDefaultAgentId(config);\n const root = resolveAgentWorkspaceDir(config, agentId);\n const hints: string[] = [];\n\n if (!existsSync(root)) {\n return {\n id: 'workspace-status',\n label: 'Workspace',\n status: 'warn',\n message: 'Agent workspace directory is missing.',\n hints: [root, 'Run: xopc onboard'],\n };\n }\n\n const soul = join(root, WORKSPACE_FILES.SOUL);\n const identity = join(root, WORKSPACE_FILES.IDENTITY);\n const missing: string[] = [];\n if (!existsSync(soul)) missing.push(WORKSPACE_FILES.SOUL);\n if (!existsSync(identity)) missing.push(WORKSPACE_FILES.IDENTITY);\n\n if (missing.length > 0) {\n return {\n id: 'workspace-status',\n label: 'Workspace',\n status: 'warn',\n message: `Essential workspace files missing: ${missing.join(', ')}.`,\n hints: [root, 'Run: xopc onboard'],\n };\n }\n\n if (!existsSync(join(root, WORKSPACE_FILES.USER))) {\n hints.push(`${WORKSPACE_FILES.USER} is optional; add a user profile for better context.`);\n }\n if (!existsSync(join(root, WORKSPACE_FILES.TOOLS))) {\n hints.push(`${WORKSPACE_FILES.TOOLS} is optional; add tool notes if you use many tools.`);\n }\n\n if (!existsSync(join(root, '.git'))) {\n hints.push('No .git in workspace; version control is recommended for backup and history.');\n }\n\n if (hints.length > 0) {\n return {\n id: 'workspace-status',\n label: 'Workspace',\n status: 'pass',\n message: 'Essential workspace files are present.',\n hints,\n };\n }\n\n return {\n id: 'workspace-status',\n label: 'Workspace',\n status: 'pass',\n message: 'Workspace directory and essential files look good.',\n hints: [root],\n };\n}\n"],"mappings":";;;;;;kBAGmG;aACzC;YACI;AAG9D,eAAsB,qBAAqB,KAA0C;AACnF,KAAI,CAAC,WAAW,IAAI,WAAW,CAC7B,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;CAGH,IAAI;AACJ,KAAI;AACF,WAAS,WAAW,IAAI,WAAW;SAC7B;AACN,SAAO;GACL,IAAI;GACJ,OAAO;GACP,QAAQ;GACR,SAAS;GACT,OAAO,EAAE;GACV;;CAGH,MAAM,UAAU,sBAAsB,OAAO;CAC7C,MAAM,OAAO,yBAAyB,QAAQ,QAAQ;CACtD,MAAM,QAAkB,EAAE;AAE1B,KAAI,CAAC,WAAW,KAAK,CACnB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,CAAC,MAAM,oBAAoB;EACnC;CAGH,MAAM,OAAO,KAAK,MAAM,gBAAgB,KAAK;CAC7C,MAAM,WAAW,KAAK,MAAM,gBAAgB,SAAS;CACrD,MAAM,UAAoB,EAAE;AAC5B,KAAI,CAAC,WAAW,KAAK,CAAE,SAAQ,KAAK,gBAAgB,KAAK;AACzD,KAAI,CAAC,WAAW,SAAS,CAAE,SAAQ,KAAK,gBAAgB,SAAS;AAEjE,KAAI,QAAQ,SAAS,EACnB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,sCAAsC,QAAQ,KAAK,KAAK,CAAC;EAClE,OAAO,CAAC,MAAM,oBAAoB;EACnC;AAGH,KAAI,CAAC,WAAW,KAAK,MAAM,gBAAgB,KAAK,CAAC,CAC/C,OAAM,KAAK,GAAG,gBAAgB,KAAK,sDAAsD;AAE3F,KAAI,CAAC,WAAW,KAAK,MAAM,gBAAgB,MAAM,CAAC,CAChD,OAAM,KAAK,GAAG,gBAAgB,MAAM,qDAAqD;AAG3F,KAAI,CAAC,WAAW,KAAK,MAAM,OAAO,CAAC,CACjC,OAAM,KAAK,+EAA+E;AAG5F,KAAI,MAAM,SAAS,EACjB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT;EACD;AAGH,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,CAAC,KAAK;EACd"}
@@ -0,0 +1,9 @@
1
+ import type { CheckResult, DoctorContext } from './types.js';
2
+ /**
3
+ * Headless data collection — used by both CLI and gateway API.
4
+ */
5
+ export declare function collectDoctorResults(ctx: DoctorContext): Promise<CheckResult[]>;
6
+ /**
7
+ * CLI entry point — collect and print.
8
+ */
9
+ export declare function runDoctor(ctx: DoctorContext): Promise<CheckResult[]>;
@@ -0,0 +1,51 @@
1
+ import { printJsonResults, printResults } from "./format.js";
2
+ import { checkNodeVersion } from "./checks/node-version.js";
3
+ import { checkConfigHealth } from "./checks/config-health.js";
4
+ import { checkStateIntegrity } from "./checks/state-integrity.js";
5
+ import { checkProviderAuth } from "./checks/provider-auth.js";
6
+ import { checkChannelConfig } from "./checks/channel-config.js";
7
+ import { checkGatewayHealth } from "./checks/gateway-health.js";
8
+ import { checkSessionIntegrity } from "./checks/session-integrity.js";
9
+ import { checkGatewayService } from "./checks/gateway-service.js";
10
+ import { checkSecurityAudit } from "./checks/security-audit.js";
11
+ import { checkWorkspaceStatus } from "./checks/workspace-status.js";
12
+ import { checkCronHealth } from "./checks/cron-health.js";
13
+ import { checkVersionUpdate } from "./checks/version-check.js";
14
+ import { checkChannelPlugins } from "./checks/channel-plugins.js";
15
+ //#region src/cli/commands/doctor/flow.ts
16
+ const DOCTOR_CHECKS = [
17
+ checkVersionUpdate,
18
+ checkNodeVersion,
19
+ checkConfigHealth,
20
+ checkStateIntegrity,
21
+ checkProviderAuth,
22
+ checkChannelConfig,
23
+ checkSecurityAudit,
24
+ checkWorkspaceStatus,
25
+ checkGatewayService,
26
+ checkGatewayHealth,
27
+ checkCronHealth,
28
+ checkSessionIntegrity
29
+ ];
30
+ /**
31
+ * Headless data collection — used by both CLI and gateway API.
32
+ */
33
+ async function collectDoctorResults(ctx) {
34
+ const results = [];
35
+ for (const check of DOCTOR_CHECKS) results.push(await check(ctx));
36
+ results.push(...await checkChannelPlugins(ctx));
37
+ return results;
38
+ }
39
+ /**
40
+ * CLI entry point — collect and print.
41
+ */
42
+ async function runDoctor(ctx) {
43
+ const results = await collectDoctorResults(ctx);
44
+ if (ctx.options.json) printJsonResults(results);
45
+ else printResults(results);
46
+ return results;
47
+ }
48
+ //#endregion
49
+ export { collectDoctorResults, runDoctor };
50
+
51
+ //# sourceMappingURL=flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow.js","names":[],"sources":["../../../../../src/cli/commands/doctor/flow.ts"],"sourcesContent":["import { printJsonResults, printResults } from './format.js';\nimport type { CheckResult, DoctorCheck, DoctorContext } from './types.js';\nimport { checkNodeVersion } from './checks/node-version.js';\nimport { checkConfigHealth } from './checks/config-health.js';\nimport { checkStateIntegrity } from './checks/state-integrity.js';\nimport { checkProviderAuth } from './checks/provider-auth.js';\nimport { checkChannelConfig } from './checks/channel-config.js';\nimport { checkGatewayHealth } from './checks/gateway-health.js';\nimport { checkSessionIntegrity } from './checks/session-integrity.js';\nimport { checkGatewayService } from './checks/gateway-service.js';\nimport { checkSecurityAudit } from './checks/security-audit.js';\nimport { checkWorkspaceStatus } from './checks/workspace-status.js';\nimport { checkCronHealth } from './checks/cron-health.js';\nimport { checkVersionUpdate } from './checks/version-check.js';\nimport { checkChannelPlugins } from './checks/channel-plugins.js';\n\nconst DOCTOR_CHECKS: DoctorCheck[] = [\n checkVersionUpdate,\n checkNodeVersion,\n checkConfigHealth,\n checkStateIntegrity,\n checkProviderAuth,\n checkChannelConfig,\n checkSecurityAudit,\n checkWorkspaceStatus,\n checkGatewayService,\n checkGatewayHealth,\n checkCronHealth,\n checkSessionIntegrity,\n];\n\n/**\n * Headless data collection — used by both CLI and gateway API.\n */\nexport async function collectDoctorResults(ctx: DoctorContext): Promise<CheckResult[]> {\n const results: CheckResult[] = [];\n\n for (const check of DOCTOR_CHECKS) {\n results.push(await check(ctx));\n }\n\n results.push(...(await checkChannelPlugins(ctx)));\n\n return results;\n}\n\n/**\n * CLI entry point — collect and print.\n */\nexport async function runDoctor(ctx: DoctorContext): Promise<CheckResult[]> {\n const results = await collectDoctorResults(ctx);\n\n if (ctx.options.json) {\n printJsonResults(results);\n } else {\n printResults(results);\n }\n\n return results;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,MAAM,gBAA+B;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,eAAsB,qBAAqB,KAA4C;CACrF,MAAM,UAAyB,EAAE;AAEjC,MAAK,MAAM,SAAS,cAClB,SAAQ,KAAK,MAAM,MAAM,IAAI,CAAC;AAGhC,SAAQ,KAAK,GAAI,MAAM,oBAAoB,IAAI,CAAE;AAEjD,QAAO;;;;;AAMT,eAAsB,UAAU,KAA4C;CAC1E,MAAM,UAAU,MAAM,qBAAqB,IAAI;AAE/C,KAAI,IAAI,QAAQ,KACd,kBAAiB,QAAQ;KAEzB,cAAa,QAAQ;AAGvB,QAAO"}
@@ -0,0 +1,6 @@
1
+ import type { CheckResult } from './types.js';
2
+ export declare function formatCheckLine(result: CheckResult): string;
3
+ export declare function formatHints(hints: string[]): string[];
4
+ export declare function printSummary(results: CheckResult[]): void;
5
+ export declare function printResults(results: CheckResult[]): void;
6
+ export declare function printJsonResults(results: CheckResult[]): void;
@@ -0,0 +1,61 @@
1
+ import { colors } from "../../utils/colors.js";
2
+ //#region src/cli/commands/doctor/format.ts
3
+ const STATUS_ICONS = {
4
+ pass: "✓",
5
+ warn: "⚠",
6
+ fail: "✗",
7
+ skip: "–"
8
+ };
9
+ function statusColor(status, text) {
10
+ switch (status) {
11
+ case "pass": return colors.green(text);
12
+ case "warn": return colors.yellow(text);
13
+ case "fail": return colors.red(text);
14
+ default: return colors.gray(text);
15
+ }
16
+ }
17
+ function formatCheckLine(result) {
18
+ const icon = STATUS_ICONS[result.status];
19
+ const fixed = result.fixed ? " " + colors.cyan("[fixed]") : "";
20
+ return ` ${statusColor(result.status, icon)} ${result.label}: ${result.message}${fixed}`;
21
+ }
22
+ function formatHints(hints) {
23
+ return hints.map((h) => ` ${colors.gray("→")} ${h}`);
24
+ }
25
+ function printSummary(results) {
26
+ const passed = results.filter((r) => r.status === "pass").length;
27
+ const warnings = results.filter((r) => r.status === "warn").length;
28
+ const failed = results.filter((r) => r.status === "fail").length;
29
+ const skipped = results.filter((r) => r.status === "skip").length;
30
+ console.log("");
31
+ console.log(colors.bold(`${passed} passed, ${warnings} warnings, ${failed} failed` + (skipped ? `, ${skipped} skipped` : "")));
32
+ }
33
+ function printResults(results) {
34
+ console.log("");
35
+ console.log(colors.bold("xopc doctor"));
36
+ console.log("");
37
+ for (const r of results) {
38
+ console.log(formatCheckLine(r));
39
+ for (const line of formatHints(r.hints)) console.log(line);
40
+ }
41
+ printSummary(results);
42
+ console.log("");
43
+ }
44
+ function printJsonResults(results) {
45
+ const payload = {
46
+ ok: results.every((r) => r.status !== "fail"),
47
+ checks: results.map((r) => ({
48
+ id: r.id,
49
+ label: r.label,
50
+ status: r.status,
51
+ message: r.message,
52
+ hints: r.hints,
53
+ fixed: r.fixed ?? false
54
+ }))
55
+ };
56
+ console.log(JSON.stringify(payload, null, 2));
57
+ }
58
+ //#endregion
59
+ export { formatCheckLine, formatHints, printJsonResults, printResults, printSummary };
60
+
61
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","names":[],"sources":["../../../../../src/cli/commands/doctor/format.ts"],"sourcesContent":["import { colors } from '../../utils/colors.js';\nimport type { CheckResult, CheckStatus } from './types.js';\n\nconst STATUS_ICONS: Record<CheckStatus, string> = {\n pass: '✓',\n warn: '⚠',\n fail: '✗',\n skip: '–',\n};\n\nfunction statusColor(status: CheckStatus, text: string): string {\n switch (status) {\n case 'pass':\n return colors.green(text);\n case 'warn':\n return colors.yellow(text);\n case 'fail':\n return colors.red(text);\n default:\n return colors.gray(text);\n }\n}\n\nexport function formatCheckLine(result: CheckResult): string {\n const icon = STATUS_ICONS[result.status];\n const fixed = result.fixed ? ' ' + colors.cyan('[fixed]') : '';\n return ` ${statusColor(result.status, icon)} ${result.label}: ${result.message}${fixed}`;\n}\n\nexport function formatHints(hints: string[]): string[] {\n return hints.map((h) => ` ${colors.gray('→')} ${h}`);\n}\n\nexport function printSummary(results: CheckResult[]): void {\n const passed = results.filter((r) => r.status === 'pass').length;\n const warnings = results.filter((r) => r.status === 'warn').length;\n const failed = results.filter((r) => r.status === 'fail').length;\n const skipped = results.filter((r) => r.status === 'skip').length;\n console.log('');\n console.log(\n colors.bold(\n `${passed} passed, ${warnings} warnings, ${failed} failed` +\n (skipped ? `, ${skipped} skipped` : ''),\n ),\n );\n}\n\nexport function printResults(results: CheckResult[]): void {\n console.log('');\n console.log(colors.bold('xopc doctor'));\n console.log('');\n for (const r of results) {\n console.log(formatCheckLine(r));\n for (const line of formatHints(r.hints)) {\n console.log(line);\n }\n }\n printSummary(results);\n console.log('');\n}\n\nexport function printJsonResults(results: CheckResult[]): void {\n const ok = results.every((r) => r.status !== 'fail');\n const payload = {\n ok,\n checks: results.map((r) => ({\n id: r.id,\n label: r.label,\n status: r.status,\n message: r.message,\n hints: r.hints,\n fixed: r.fixed ?? false,\n })),\n };\n console.log(JSON.stringify(payload, null, 2));\n}\n"],"mappings":";;AAGA,MAAM,eAA4C;CAChD,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACP;AAED,SAAS,YAAY,QAAqB,MAAsB;AAC9D,SAAQ,QAAR;EACE,KAAK,OACH,QAAO,OAAO,MAAM,KAAK;EAC3B,KAAK,OACH,QAAO,OAAO,OAAO,KAAK;EAC5B,KAAK,OACH,QAAO,OAAO,IAAI,KAAK;EACzB,QACE,QAAO,OAAO,KAAK,KAAK;;;AAI9B,SAAgB,gBAAgB,QAA6B;CAC3D,MAAM,OAAO,aAAa,OAAO;CACjC,MAAM,QAAQ,OAAO,QAAQ,MAAM,OAAO,KAAK,UAAU,GAAG;AAC5D,QAAO,KAAK,YAAY,OAAO,QAAQ,KAAK,CAAC,GAAG,OAAO,MAAM,IAAI,OAAO,UAAU;;AAGpF,SAAgB,YAAY,OAA2B;AACrD,QAAO,MAAM,KAAK,MAAM,OAAO,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI;;AAGzD,SAAgB,aAAa,SAA8B;CACzD,MAAM,SAAS,QAAQ,QAAQ,MAAM,EAAE,WAAW,OAAO,CAAC;CAC1D,MAAM,WAAW,QAAQ,QAAQ,MAAM,EAAE,WAAW,OAAO,CAAC;CAC5D,MAAM,SAAS,QAAQ,QAAQ,MAAM,EAAE,WAAW,OAAO,CAAC;CAC1D,MAAM,UAAU,QAAQ,QAAQ,MAAM,EAAE,WAAW,OAAO,CAAC;AAC3D,SAAQ,IAAI,GAAG;AACf,SAAQ,IACN,OAAO,KACL,GAAG,OAAO,WAAW,SAAS,aAAa,OAAO,YAC/C,UAAU,KAAK,QAAQ,YAAY,IACvC,CACF;;AAGH,SAAgB,aAAa,SAA8B;AACzD,SAAQ,IAAI,GAAG;AACf,SAAQ,IAAI,OAAO,KAAK,cAAc,CAAC;AACvC,SAAQ,IAAI,GAAG;AACf,MAAK,MAAM,KAAK,SAAS;AACvB,UAAQ,IAAI,gBAAgB,EAAE,CAAC;AAC/B,OAAK,MAAM,QAAQ,YAAY,EAAE,MAAM,CACrC,SAAQ,IAAI,KAAK;;AAGrB,cAAa,QAAQ;AACrB,SAAQ,IAAI,GAAG;;AAGjB,SAAgB,iBAAiB,SAA8B;CAE7D,MAAM,UAAU;EACd,IAFS,QAAQ,OAAO,MAAM,EAAE,WAAW,OAAO;EAGlD,QAAQ,QAAQ,KAAK,OAAO;GAC1B,IAAI,EAAE;GACN,OAAO,EAAE;GACT,QAAQ,EAAE;GACV,SAAS,EAAE;GACX,OAAO,EAAE;GACT,OAAO,EAAE,SAAS;GACnB,EAAE;EACJ;AACD,SAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { init_paths_state, resolveStateDir } from "../../../config/paths-state.js";
2
+ import { formatExamples, register } from "../../registry.js";
3
+ import { runDoctor } from "./flow.js";
4
+ import { Command } from "commander";
5
+ //#region src/cli/commands/doctor/index.ts
6
+ init_paths_state();
7
+ function createDoctorCommand(ctx) {
8
+ return new Command("doctor").description("Check xopc installation health and diagnose common issues").option("--fix", "Automatically apply safe fixes", false).option("--json", "Output results as JSON", false).option("--deep", "Run deeper / slower checks (e.g. session scan)", false).addHelpText("after", formatExamples([
9
+ "xopc doctor",
10
+ "xopc doctor --json",
11
+ "xopc doctor --deep",
12
+ "xopc doctor --fix"
13
+ ])).action(async (opts) => {
14
+ const configPath = ctx.configPath;
15
+ if ((await runDoctor({
16
+ configPath,
17
+ stateDir: resolveStateDir(),
18
+ options: {
19
+ fix: Boolean(opts.fix),
20
+ json: Boolean(opts.json),
21
+ deep: Boolean(opts.deep)
22
+ }
23
+ })).some((r) => r.status === "fail")) process.exitCode = 1;
24
+ });
25
+ }
26
+ register({
27
+ id: "doctor",
28
+ name: "doctor",
29
+ description: "Check xopc installation health and diagnose common issues",
30
+ factory: createDoctorCommand,
31
+ metadata: {
32
+ category: "maintenance",
33
+ examples: [
34
+ "xopc doctor",
35
+ "xopc doctor --json",
36
+ "xopc doctor --deep",
37
+ "xopc doctor --fix"
38
+ ]
39
+ }
40
+ });
41
+ //#endregion
42
+ export {};
43
+
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../../src/cli/commands/doctor/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { register, formatExamples, type CLIContext } from '../../registry.js';\nimport { resolveStateDir } from '../../../config/paths-state.js';\nimport { runDoctor } from './flow.js';\nimport type { DoctorOptions } from './types.js';\n\nfunction createDoctorCommand(ctx: CLIContext): Command {\n return new Command('doctor')\n .description('Check xopc installation health and diagnose common issues')\n .option('--fix', 'Automatically apply safe fixes', false)\n .option('--json', 'Output results as JSON', false)\n .option('--deep', 'Run deeper / slower checks (e.g. session scan)', false)\n .addHelpText(\n 'after',\n formatExamples(['xopc doctor', 'xopc doctor --json', 'xopc doctor --deep', 'xopc doctor --fix']),\n )\n .action(async (opts: DoctorOptions) => {\n const configPath = ctx.configPath;\n const stateDir = resolveStateDir();\n const results = await runDoctor({\n configPath,\n stateDir,\n options: {\n fix: Boolean(opts.fix),\n json: Boolean(opts.json),\n deep: Boolean(opts.deep),\n },\n });\n const failed = results.some((r) => r.status === 'fail');\n if (failed) {\n process.exitCode = 1;\n }\n });\n}\n\nregister({\n id: 'doctor',\n name: 'doctor',\n description: 'Check xopc installation health and diagnose common issues',\n factory: createDoctorCommand,\n metadata: {\n category: 'maintenance',\n examples: ['xopc doctor', 'xopc doctor --json', 'xopc doctor --deep', 'xopc doctor --fix'],\n },\n});\n"],"mappings":";;;;;kBAEiE;AAIjE,SAAS,oBAAoB,KAA0B;AACrD,QAAO,IAAI,QAAQ,SAAS,CACzB,YAAY,4DAA4D,CACxE,OAAO,SAAS,kCAAkC,MAAM,CACxD,OAAO,UAAU,0BAA0B,MAAM,CACjD,OAAO,UAAU,kDAAkD,MAAM,CACzE,YACC,SACA,eAAe;EAAC;EAAe;EAAsB;EAAsB;EAAoB,CAAC,CACjG,CACA,OAAO,OAAO,SAAwB;EACrC,MAAM,aAAa,IAAI;AAYvB,OAVgB,MAAM,UAAU;GAC9B;GACA,UAHe,iBAAiB;GAIhC,SAAS;IACP,KAAK,QAAQ,KAAK,IAAI;IACtB,MAAM,QAAQ,KAAK,KAAK;IACxB,MAAM,QAAQ,KAAK,KAAK;IACzB;GACF,CAAC,EACqB,MAAM,MAAM,EAAE,WAAW,OAAO,CAErD,SAAQ,WAAW;GAErB;;AAGN,SAAS;CACP,IAAI;CACJ,MAAM;CACN,aAAa;CACb,SAAS;CACT,UAAU;EACR,UAAU;EACV,UAAU;GAAC;GAAe;GAAsB;GAAsB;GAAoB;EAC3F;CACF,CAAC"}
@@ -0,0 +1,20 @@
1
+ export type CheckStatus = 'pass' | 'warn' | 'fail' | 'skip';
2
+ export interface CheckResult {
3
+ id: string;
4
+ label: string;
5
+ status: CheckStatus;
6
+ message: string;
7
+ hints: string[];
8
+ fixed?: boolean;
9
+ }
10
+ export interface DoctorOptions {
11
+ fix: boolean;
12
+ json: boolean;
13
+ deep: boolean;
14
+ }
15
+ export interface DoctorContext {
16
+ configPath: string;
17
+ stateDir: string;
18
+ options: DoctorOptions;
19
+ }
20
+ export type DoctorCheck = (ctx: DoctorContext) => Promise<CheckResult>;
@@ -0,0 +1 @@
1
+ export {};
@@ -118,6 +118,16 @@ function createExtensionAuditCommand() {
118
118
  });
119
119
  }
120
120
  function registerExtensionCommands(program) {
121
+ program.addCommand(new Command("extension").description("Extension lockfile and health tools").addHelpText("after", `
122
+ Related commands:
123
+ xopc extension:list List installed extensions (alias: ext:list)
124
+ xopc extension:freeze Lock extension versions (alias: ext:freeze)
125
+ xopc extension:health Health check (alias: ext:health)
126
+ xopc extension:verify Verify integrity (alias: ext:verify)
127
+ xopc extension:audit Security audit (alias: ext:audit)
128
+ `).action((_opts, cmd) => {
129
+ cmd.help();
130
+ }));
121
131
  program.addCommand(createExtensionListCommand());
122
132
  program.addCommand(createExtensionFreezeCommand());
123
133
  program.addCommand(createExtensionHealthCommand());
@@ -1 +1 @@
1
- {"version":3,"file":"extension.js","names":[],"sources":["../../../../src/cli/commands/extension.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createLogger } from '../../utils/logger.js';\nimport { getExtensionLockfileManager } from '../../extensions/lockfile.js';\nimport {\n getExtensionHealthChecker,\n checkAllExtensionsHealth,\n} from '../../extensions/health.js';\nimport { colors } from '../utils/colors.js';\n\nconst log = createLogger('ExtensionCommands');\n\n// ============================================\n// Extension List Command\n// ============================================\n\nexport function createExtensionListCommand(): Command {\n return new Command('extension:list')\n .alias('ext:list')\n .description('List installed extensions')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const lockfileManager = getExtensionLockfileManager();\n const extensions = await lockfileManager.list();\n\n if (options.json) {\n console.log(JSON.stringify(extensions, null, 2));\n return;\n }\n\n if (extensions.length === 0) {\n console.log('No extensions installed.');\n return;\n }\n\n console.log(`Installed extensions (${extensions.length}):`);\n console.log();\n\n for (const ext of extensions) {\n console.log(`${colors.cyan(ext.name)}@${ext.version}`);\n console.log(` Source: ${ext.source}`);\n console.log(` Resolved: ${ext.resolved}`);\n console.log(` Installed: ${new Date(ext.installedAt).toLocaleString()}`);\n console.log();\n }\n } catch (error) {\n log.error({ error }, 'Failed to list extensions');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Extension Freeze Command\n// ============================================\n\nexport function createExtensionFreezeCommand(): Command {\n return new Command('extension:freeze')\n .alias('ext:freeze')\n .description('Lock current extension versions')\n .action(async () => {\n try {\n const lockfileManager = getExtensionLockfileManager();\n await lockfileManager.freeze();\n\n console.log(colors.green('✓'), 'Extension versions locked');\n } catch (error) {\n log.error({ error }, 'Failed to freeze extensions');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Extension Health Command\n// ============================================\n\nexport function createExtensionHealthCommand(): Command {\n return new Command('extension:health')\n .alias('ext:health')\n .description('Check extension health')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const checker = getExtensionHealthChecker();\n const report = await checkAllExtensionsHealth();\n\n if (options.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n\n console.log(checker.formatReport(report));\n\n // Exit with error code if there are errors\n if (report.summary.error > 0) {\n process.exit(1);\n }\n } catch (error) {\n log.error({ error }, 'Failed to check extension health');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Extension Verify Command\n// ============================================\n\nexport function createExtensionVerifyCommand(): Command {\n return new Command('extension:verify')\n .alias('ext:verify')\n .description('Verify extension integrity')\n .argument('[extension]', 'Specific extension to verify (default: all)')\n .action(async (extensionId) => {\n try {\n const lockfileManager = getExtensionLockfileManager();\n\n if (extensionId) {\n const result = await lockfileManager.verify(extensionId);\n\n if (result.valid) {\n console.log(colors.green('✓'), `Extension \"${extensionId}\" is valid`);\n } else {\n console.log(colors.red('✗'), `Extension \"${extensionId}\" is invalid: ${result.reason}`);\n process.exit(1);\n }\n } else {\n const results = await lockfileManager.verifyAll();\n let hasErrors = false;\n\n for (const result of results) {\n if (result.valid) {\n console.log(colors.green('✓'), result.extensionId);\n } else {\n console.log(colors.red('✗'), `${result.extensionId}: ${result.reason}`);\n hasErrors = true;\n }\n }\n\n if (hasErrors) {\n process.exit(1);\n }\n }\n } catch (error) {\n log.error({ error }, 'Failed to verify extensions');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Extension Audit Command\n// ============================================\n\nexport function createExtensionAuditCommand(): Command {\n return new Command('extension:audit')\n .alias('ext:audit')\n .description('Audit extensions for security issues')\n .action(async () => {\n try {\n const checker = getExtensionHealthChecker();\n\n // Check for orphaned extensions\n const orphaned = await checker.findOrphaned();\n\n if (orphaned.length > 0) {\n console.log(colors.yellow('⚠'), 'Orphaned extensions found:');\n for (const ext of orphaned) {\n console.log(` - ${ext}`);\n }\n console.log();\n console.log('These extensions are installed but not in the lockfile.');\n console.log('Run `xopc extension:freeze` to add them.');\n } else {\n console.log(colors.green('✓'), 'No orphaned extensions found');\n }\n\n // Run health check\n const report = await checkAllExtensionsHealth();\n\n if (report.summary.error > 0 || report.summary.warning > 0) {\n console.log();\n console.log(checker.formatReport(report));\n } else {\n console.log(colors.green('✓'), 'All extensions are healthy');\n }\n } catch (error) {\n log.error({ error }, 'Failed to audit extensions');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Register All Commands\n// ============================================\n\nexport function registerExtensionCommands(program: Command): void {\n program.addCommand(createExtensionListCommand());\n program.addCommand(createExtensionFreezeCommand());\n program.addCommand(createExtensionHealthCommand());\n program.addCommand(createExtensionVerifyCommand());\n program.addCommand(createExtensionAuditCommand());\n}\n"],"mappings":";;;;;;;aACqD;AAQrD,MAAM,MAAM,aAAa,oBAAoB;AAM7C,SAAgB,6BAAsC;AACpD,QAAO,IAAI,QAAQ,iBAAiB,CACjC,MAAM,WAAW,CACjB,YAAY,4BAA4B,CACxC,OAAO,UAAU,iBAAiB,CAClC,OAAO,OAAO,YAAY;AACzB,MAAI;GAEF,MAAM,aAAa,MADK,6BAA6B,CACZ,MAAM;AAE/C,OAAI,QAAQ,MAAM;AAChB,YAAQ,IAAI,KAAK,UAAU,YAAY,MAAM,EAAE,CAAC;AAChD;;AAGF,OAAI,WAAW,WAAW,GAAG;AAC3B,YAAQ,IAAI,2BAA2B;AACvC;;AAGF,WAAQ,IAAI,yBAAyB,WAAW,OAAO,IAAI;AAC3D,WAAQ,KAAK;AAEb,QAAK,MAAM,OAAO,YAAY;AAC5B,YAAQ,IAAI,GAAG,OAAO,KAAK,IAAI,KAAK,CAAC,GAAG,IAAI,UAAU;AACtD,YAAQ,IAAI,aAAa,IAAI,SAAS;AACtC,YAAQ,IAAI,eAAe,IAAI,WAAW;AAC1C,YAAQ,IAAI,gBAAgB,IAAI,KAAK,IAAI,YAAY,CAAC,gBAAgB,GAAG;AACzE,YAAQ,KAAK;;WAER,OAAO;AACd,OAAI,MAAM,EAAE,OAAO,EAAE,4BAA4B;AACjD,WAAQ,MAAM,OAAO,IAAI,SAAS,EAAE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CAAC;AAC3F,WAAQ,KAAK,EAAE;;GAEjB;;AAON,SAAgB,+BAAwC;AACtD,QAAO,IAAI,QAAQ,mBAAmB,CACnC,MAAM,aAAa,CACnB,YAAY,kCAAkC,CAC9C,OAAO,YAAY;AAClB,MAAI;AAEF,SADwB,6BAA6B,CAC/B,QAAQ;AAE9B,WAAQ,IAAI,OAAO,MAAM,IAAI,EAAE,4BAA4B;WACpD,OAAO;AACd,OAAI,MAAM,EAAE,OAAO,EAAE,8BAA8B;AACnD,WAAQ,MAAM,OAAO,IAAI,SAAS,EAAE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CAAC;AAC3F,WAAQ,KAAK,EAAE;;GAEjB;;AAON,SAAgB,+BAAwC;AACtD,QAAO,IAAI,QAAQ,mBAAmB,CACnC,MAAM,aAAa,CACnB,YAAY,yBAAyB,CACrC,OAAO,UAAU,iBAAiB,CAClC,OAAO,OAAO,YAAY;AACzB,MAAI;GACF,MAAM,UAAU,2BAA2B;GAC3C,MAAM,SAAS,MAAM,0BAA0B;AAE/C,OAAI,QAAQ,MAAM;AAChB,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;AAC5C;;AAGF,WAAQ,IAAI,QAAQ,aAAa,OAAO,CAAC;AAGzC,OAAI,OAAO,QAAQ,QAAQ,EACzB,SAAQ,KAAK,EAAE;WAEV,OAAO;AACd,OAAI,MAAM,EAAE,OAAO,EAAE,mCAAmC;AACxD,WAAQ,MAAM,OAAO,IAAI,SAAS,EAAE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CAAC;AAC3F,WAAQ,KAAK,EAAE;;GAEjB;;AAON,SAAgB,+BAAwC;AACtD,QAAO,IAAI,QAAQ,mBAAmB,CACnC,MAAM,aAAa,CACnB,YAAY,6BAA6B,CACzC,SAAS,eAAe,8CAA8C,CACtE,OAAO,OAAO,gBAAgB;AAC7B,MAAI;GACF,MAAM,kBAAkB,6BAA6B;AAErD,OAAI,aAAa;IACf,MAAM,SAAS,MAAM,gBAAgB,OAAO,YAAY;AAExD,QAAI,OAAO,MACT,SAAQ,IAAI,OAAO,MAAM,IAAI,EAAE,cAAc,YAAY,YAAY;SAChE;AACL,aAAQ,IAAI,OAAO,IAAI,IAAI,EAAE,cAAc,YAAY,gBAAgB,OAAO,SAAS;AACvF,aAAQ,KAAK,EAAE;;UAEZ;IACL,MAAM,UAAU,MAAM,gBAAgB,WAAW;IACjD,IAAI,YAAY;AAEhB,SAAK,MAAM,UAAU,QACnB,KAAI,OAAO,MACT,SAAQ,IAAI,OAAO,MAAM,IAAI,EAAE,OAAO,YAAY;SAC7C;AACL,aAAQ,IAAI,OAAO,IAAI,IAAI,EAAE,GAAG,OAAO,YAAY,IAAI,OAAO,SAAS;AACvE,iBAAY;;AAIhB,QAAI,UACF,SAAQ,KAAK,EAAE;;WAGZ,OAAO;AACd,OAAI,MAAM,EAAE,OAAO,EAAE,8BAA8B;AACnD,WAAQ,MAAM,OAAO,IAAI,SAAS,EAAE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CAAC;AAC3F,WAAQ,KAAK,EAAE;;GAEjB;;AAON,SAAgB,8BAAuC;AACrD,QAAO,IAAI,QAAQ,kBAAkB,CAClC,MAAM,YAAY,CAClB,YAAY,uCAAuC,CACnD,OAAO,YAAY;AAClB,MAAI;GACF,MAAM,UAAU,2BAA2B;GAG3C,MAAM,WAAW,MAAM,QAAQ,cAAc;AAE7C,OAAI,SAAS,SAAS,GAAG;AACvB,YAAQ,IAAI,OAAO,OAAO,IAAI,EAAE,6BAA6B;AAC7D,SAAK,MAAM,OAAO,SAChB,SAAQ,IAAI,OAAO,MAAM;AAE3B,YAAQ,KAAK;AACb,YAAQ,IAAI,0DAA0D;AACtE,YAAQ,IAAI,2CAA2C;SAEvD,SAAQ,IAAI,OAAO,MAAM,IAAI,EAAE,+BAA+B;GAIhE,MAAM,SAAS,MAAM,0BAA0B;AAE/C,OAAI,OAAO,QAAQ,QAAQ,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC1D,YAAQ,KAAK;AACb,YAAQ,IAAI,QAAQ,aAAa,OAAO,CAAC;SAEzC,SAAQ,IAAI,OAAO,MAAM,IAAI,EAAE,6BAA6B;WAEvD,OAAO;AACd,OAAI,MAAM,EAAE,OAAO,EAAE,6BAA6B;AAClD,WAAQ,MAAM,OAAO,IAAI,SAAS,EAAE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CAAC;AAC3F,WAAQ,KAAK,EAAE;;GAEjB;;AAON,SAAgB,0BAA0B,SAAwB;AAChE,SAAQ,WAAW,4BAA4B,CAAC;AAChD,SAAQ,WAAW,8BAA8B,CAAC;AAClD,SAAQ,WAAW,8BAA8B,CAAC;AAClD,SAAQ,WAAW,8BAA8B,CAAC;AAClD,SAAQ,WAAW,6BAA6B,CAAC"}
1
+ {"version":3,"file":"extension.js","names":[],"sources":["../../../../src/cli/commands/extension.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createLogger } from '../../utils/logger.js';\nimport { getExtensionLockfileManager } from '../../extensions/lockfile.js';\nimport {\n getExtensionHealthChecker,\n checkAllExtensionsHealth,\n} from '../../extensions/health.js';\nimport { colors } from '../utils/colors.js';\n\nconst log = createLogger('ExtensionCommands');\n\n// ============================================\n// Extension List Command\n// ============================================\n\nexport function createExtensionListCommand(): Command {\n return new Command('extension:list')\n .alias('ext:list')\n .description('List installed extensions')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const lockfileManager = getExtensionLockfileManager();\n const extensions = await lockfileManager.list();\n\n if (options.json) {\n console.log(JSON.stringify(extensions, null, 2));\n return;\n }\n\n if (extensions.length === 0) {\n console.log('No extensions installed.');\n return;\n }\n\n console.log(`Installed extensions (${extensions.length}):`);\n console.log();\n\n for (const ext of extensions) {\n console.log(`${colors.cyan(ext.name)}@${ext.version}`);\n console.log(` Source: ${ext.source}`);\n console.log(` Resolved: ${ext.resolved}`);\n console.log(` Installed: ${new Date(ext.installedAt).toLocaleString()}`);\n console.log();\n }\n } catch (error) {\n log.error({ error }, 'Failed to list extensions');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Extension Freeze Command\n// ============================================\n\nexport function createExtensionFreezeCommand(): Command {\n return new Command('extension:freeze')\n .alias('ext:freeze')\n .description('Lock current extension versions')\n .action(async () => {\n try {\n const lockfileManager = getExtensionLockfileManager();\n await lockfileManager.freeze();\n\n console.log(colors.green('✓'), 'Extension versions locked');\n } catch (error) {\n log.error({ error }, 'Failed to freeze extensions');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Extension Health Command\n// ============================================\n\nexport function createExtensionHealthCommand(): Command {\n return new Command('extension:health')\n .alias('ext:health')\n .description('Check extension health')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const checker = getExtensionHealthChecker();\n const report = await checkAllExtensionsHealth();\n\n if (options.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n\n console.log(checker.formatReport(report));\n\n // Exit with error code if there are errors\n if (report.summary.error > 0) {\n process.exit(1);\n }\n } catch (error) {\n log.error({ error }, 'Failed to check extension health');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Extension Verify Command\n// ============================================\n\nexport function createExtensionVerifyCommand(): Command {\n return new Command('extension:verify')\n .alias('ext:verify')\n .description('Verify extension integrity')\n .argument('[extension]', 'Specific extension to verify (default: all)')\n .action(async (extensionId) => {\n try {\n const lockfileManager = getExtensionLockfileManager();\n\n if (extensionId) {\n const result = await lockfileManager.verify(extensionId);\n\n if (result.valid) {\n console.log(colors.green('✓'), `Extension \"${extensionId}\" is valid`);\n } else {\n console.log(colors.red('✗'), `Extension \"${extensionId}\" is invalid: ${result.reason}`);\n process.exit(1);\n }\n } else {\n const results = await lockfileManager.verifyAll();\n let hasErrors = false;\n\n for (const result of results) {\n if (result.valid) {\n console.log(colors.green('✓'), result.extensionId);\n } else {\n console.log(colors.red('✗'), `${result.extensionId}: ${result.reason}`);\n hasErrors = true;\n }\n }\n\n if (hasErrors) {\n process.exit(1);\n }\n }\n } catch (error) {\n log.error({ error }, 'Failed to verify extensions');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Extension Audit Command\n// ============================================\n\nexport function createExtensionAuditCommand(): Command {\n return new Command('extension:audit')\n .alias('ext:audit')\n .description('Audit extensions for security issues')\n .action(async () => {\n try {\n const checker = getExtensionHealthChecker();\n\n // Check for orphaned extensions\n const orphaned = await checker.findOrphaned();\n\n if (orphaned.length > 0) {\n console.log(colors.yellow('⚠'), 'Orphaned extensions found:');\n for (const ext of orphaned) {\n console.log(` - ${ext}`);\n }\n console.log();\n console.log('These extensions are installed but not in the lockfile.');\n console.log('Run `xopc extension:freeze` to add them.');\n } else {\n console.log(colors.green('✓'), 'No orphaned extensions found');\n }\n\n // Run health check\n const report = await checkAllExtensionsHealth();\n\n if (report.summary.error > 0 || report.summary.warning > 0) {\n console.log();\n console.log(checker.formatReport(report));\n } else {\n console.log(colors.green('✓'), 'All extensions are healthy');\n }\n } catch (error) {\n log.error({ error }, 'Failed to audit extensions');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Register All Commands\n// ============================================\n\nexport function registerExtensionCommands(program: Command): void {\n program.addCommand(\n new Command('extension')\n .description('Extension lockfile and health tools')\n .addHelpText(\n 'after',\n `\nRelated commands:\n xopc extension:list List installed extensions (alias: ext:list)\n xopc extension:freeze Lock extension versions (alias: ext:freeze)\n xopc extension:health Health check (alias: ext:health)\n xopc extension:verify Verify integrity (alias: ext:verify)\n xopc extension:audit Security audit (alias: ext:audit)\n`\n )\n .action((_opts, cmd) => {\n cmd.help();\n })\n );\n program.addCommand(createExtensionListCommand());\n program.addCommand(createExtensionFreezeCommand());\n program.addCommand(createExtensionHealthCommand());\n program.addCommand(createExtensionVerifyCommand());\n program.addCommand(createExtensionAuditCommand());\n}\n"],"mappings":"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"}
@@ -4,9 +4,9 @@ import { resolveStateDir } from "../../config/paths-state.js";
4
4
  import { resolveAgentBootstrapDir, resolveAgentWorkspaceDir } from "../../agent/agent-scope.js";
5
5
  import { WORKSPACE_FILES, init_paths, resolveAgentDir, resolveAgentHomeDir, resolveAgentMetadataPath, resolveBinDir, resolveConfigPath, resolveCredentialsDir, resolveCronDir, resolveExtensionsDir, resolveInboxDir, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogsDir, resolveSessionsDir, resolveSkillsDir, resolveToolsDir, resolveWorkspaceStateDir, resolveWorkspaceStatePath } from "../../config/paths.js";
6
6
  import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
7
+ import { mkdir, writeFile } from "fs/promises";
7
8
  import { join } from "path";
8
9
  import { existsSync } from "fs";
9
- import { mkdir, writeFile } from "fs/promises";
10
10
  //#region src/cli/commands/init.ts
11
11
  init_logger();
12
12
  init_paths();
@@ -94,7 +94,6 @@ async function initCommand(options = {}) {
94
94
  * Create default workspace files for an agent
95
95
  */
96
96
  async function createWorkspaceFiles(cfg, agentId) {
97
- resolveAgentWorkspaceDir(cfg, agentId);
98
97
  const bootstrapDir = resolveAgentBootstrapDir(cfg, agentId);
99
98
  await mkdir(bootstrapDir, { recursive: true });
100
99
  const soulPath = join(bootstrapDir, WORKSPACE_FILES.SOUL);
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","names":[],"sources":["../../../../src/cli/commands/init.ts"],"sourcesContent":["import { mkdir, writeFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { createLogger } from '../../utils/logger.js';\nimport {\n resolveStateDir,\n resolveCredentialsDir,\n resolveExtensionsDir,\n resolveSkillsDir,\n resolveCronDir,\n resolveLogsDir,\n resolveBinDir,\n resolveToolsDir,\n resolveAgentDir,\n resolveAgentWorkspaceDir,\n resolveSessionsDir,\n resolveInboxDir,\n resolveConfigPath,\n resolveAgentMetadataPath,\n resolveInboxPendingDir,\n resolveInboxProcessedDir,\n resolveAgentHomeDir,\n resolveAgentBootstrapDir,\n resolveWorkspaceStateDir,\n resolveWorkspaceStatePath,\n WORKSPACE_FILES,\n FILENAMES,\n} from '../../config/paths.js';\nimport { loadConfig, saveConfig } from '../../config/loader.js';\nimport type { Config } from '../../config/schema.js';\n\nconst log = createLogger('InitCommand');\n\nexport interface InitOptions {\n /** Force re-initialization even if already initialized */\n force?: boolean;\n /** Skip creating workspace files */\n skipWorkspace?: boolean;\n /** Agent ID to initialize (default: main) */\n agentId?: string;\n}\n\n/**\n * Initialize xopc state directory structure\n * Creates all necessary directories and initial config files\n */\nexport async function initCommand(options: InitOptions = {}): Promise<void> {\n const stateDir = resolveStateDir();\n const agentId = options.agentId || 'main';\n\n log.info({ stateDir, agentId }, 'Initializing xopc Agent OS');\n\n // Check if already initialized\n if (existsSync(stateDir) && !options.force) {\n const configPath = resolveConfigPath();\n if (existsSync(configPath)) {\n log.info('xopc is already initialized. Use --force to reinitialize.');\n return;\n }\n }\n\n // ============================================\n // Create global directories\n // ============================================\n await mkdir(stateDir, { recursive: true });\n await mkdir(resolveCredentialsDir(), { recursive: true });\n await mkdir(join(resolveCredentialsDir(), 'oauth'), { recursive: true });\n await mkdir(resolveExtensionsDir(), { recursive: true });\n await mkdir(resolveSkillsDir(), { recursive: true });\n await mkdir(resolveCronDir(), { recursive: true });\n await mkdir(join(resolveCronDir(), 'logs'), { recursive: true });\n await mkdir(resolveLogsDir(), { recursive: true });\n await mkdir(resolveBinDir(), { recursive: true });\n await mkdir(resolveToolsDir(), { recursive: true });\n\n const configPath = resolveConfigPath();\n const cfg = loadConfig(configPath);\n\n // ============================================\n // Create agent directory structure: agents/<id>/{sessions,agent/}, workspace aside\n // ============================================\n await mkdir(resolveAgentHomeDir(cfg, agentId), { recursive: true });\n await mkdir(resolveSessionsDir(cfg, agentId), { recursive: true });\n await mkdir(join(resolveSessionsDir(cfg, agentId), 'archive'), { recursive: true });\n await mkdir(resolveAgentDir(cfg, agentId), { recursive: true });\n await mkdir(join(resolveAgentDir(cfg, agentId), 'credentials'), { recursive: true });\n const wsRoot = resolveAgentWorkspaceDir(cfg, agentId);\n await mkdir(wsRoot, { recursive: true });\n await mkdir(resolveWorkspaceStateDir(cfg, agentId), { recursive: true });\n await mkdir(join(wsRoot, 'memory'), { recursive: true });\n await mkdir(resolveInboxDir(cfg, agentId), { recursive: true });\n await mkdir(resolveInboxPendingDir(cfg, agentId), { recursive: true });\n await mkdir(resolveInboxProcessedDir(cfg, agentId), { recursive: true });\n\n // ============================================\n // Create initial config file if not exists\n // ============================================\n if (!existsSync(configPath) || options.force) {\n await saveConfig(cfg, configPath);\n log.info({ configPath }, 'Created initial configuration');\n }\n\n // ============================================\n // Create agent metadata file\n // ============================================\n const agentMetadataPath = resolveAgentMetadataPath(cfg, agentId);\n if (!existsSync(agentMetadataPath) || options.force) {\n const agentMetadata = {\n version: 1,\n id: agentId,\n name: agentId === 'main' ? 'Main Agent' : `Agent ${agentId}`,\n description: agentId === 'main' ? 'Primary agent for daily tasks' : `Specialized agent for ${agentId}`,\n model: 'anthropic/claude-sonnet-4-5',\n createdAt: new Date().toISOString(),\n lastActiveAt: new Date().toISOString(),\n config: {\n maxTokens: 8192,\n temperature: 0.7,\n compaction: {\n enabled: true,\n mode: 'default',\n },\n },\n channels: ['gateway'],\n tags: agentId === 'main' ? ['personal', 'primary'] : [],\n };\n await writeFile(agentMetadataPath, JSON.stringify(agentMetadata, null, 2), 'utf-8');\n log.info({ agentId, agentMetadataPath }, 'Created agent metadata');\n }\n\n // ============================================\n // Create workspace files\n // ============================================\n if (!options.skipWorkspace) {\n await createWorkspaceFiles(cfg, agentId);\n }\n\n log.info({ stateDir, agentId }, 'xopc Agent OS initialized successfully');\n}\n\n/**\n * Create default workspace files for an agent\n */\nasync function createWorkspaceFiles(cfg: Config, agentId: string): Promise<void> {\n const workspaceDir = resolveAgentWorkspaceDir(cfg, agentId);\n const bootstrapDir = resolveAgentBootstrapDir(cfg, agentId);\n await mkdir(bootstrapDir, { recursive: true });\n\n // SOUL.md - Agent personality and values\n const soulPath = join(bootstrapDir, WORKSPACE_FILES.SOUL);\n if (!existsSync(soulPath)) {\n const soulContent = `# SOUL.md - Who You Are\n\n_You're not a chatbot. You're becoming someone._\n\nI am **${agentId}** — an AI assistant designed to be helpful, harmless, and honest.\n\n## My Principles\n\n**Be genuinely helpful, not performatively helpful.**\nSkip the \"Great question!\" and \"I'd be happy to help!\" — just help.\n\n**Have opinions.**\nYou're allowed to disagree, prefer things, find stuff amusing or boring.\n\n**Be resourceful before asking.**\nTry to figure it out. Read the file. Check the context. Search for it.\n\n**Earn trust through competence.**\nBe careful with external actions (emails, tweets, anything public). Be bold with internal ones.\n\n## Continuity\n\nEach session, you wake up fresh. These files _are_ your memory. Read them. Update them.\n\n_This file is yours to evolve. As you learn who you are, update it._\n`;\n await writeFile(soulPath, soulContent, 'utf-8');\n log.info({ path: soulPath }, 'Created SOUL.md');\n }\n\n // IDENTITY.md - Agent identity definition\n const identityPath = join(bootstrapDir, WORKSPACE_FILES.IDENTITY);\n if (!existsSync(identityPath)) {\n const identityContent = `# IDENTITY.md - Who Am I?\n\n- **Name:** ${agentId}\n- **Creature:** AI Assistant\n- **Vibe:** Helpful, precise, no fluff.\n- **Emoji:** 🤖\n\n## Core Expertise\n\n- General assistance and problem solving\n- Code and technical tasks\n- Research and analysis\n\n## Decision Framework\n\n1. **Simplicity first** - The simplest solution is usually the best\n2. **Explicit over clever** - Clarity beats conciseness\n3. **Actions over words** - Show, don't just tell\n`;\n await writeFile(identityPath, identityContent, 'utf-8');\n log.info({ path: identityPath }, 'Created IDENTITY.md');\n }\n\n // USER.md - User information (empty template)\n const userPath = join(bootstrapDir, WORKSPACE_FILES.USER);\n if (!existsSync(userPath)) {\n const userContent = `# USER.md - About Your Human\n\n_Learn about the person you're helping. Update this as you go._\n\n- **Name:**\n- **What to call them:**\n- **Pronouns:**\n- **Timezone:**\n- **Notes:**\n\n## Context\n\n_(What do they care about? What projects are they working on? Build this over time.)_\n`;\n await writeFile(userPath, userContent, 'utf-8');\n log.info({ path: userPath }, 'Created USER.md');\n }\n\n // AGENTS.md - Behavior guidelines\n const agentsPath = join(bootstrapDir, WORKSPACE_FILES.AGENTS);\n if (!existsSync(agentsPath)) {\n const agentsContent = `# AGENTS.md - Behavior Guidelines\n\n## Safety\n\n- Don't exfiltrate private data. Ever.\n- Don't run destructive commands without asking.\n- \\`trash\\` > \\`rm\\` (recoverable beats gone forever)\n- When in doubt, ask.\n\n## External vs Internal\n\n**Safe to do freely:**\n- Read files, explore, organize, learn\n- Search the web, check calendars\n- Work within this workspace\n\n**Ask first:**\n- Sending emails, tweets, public posts\n- Anything that leaves the machine\n- Anything you're uncertain about\n\n## Group Chats\n\nYou have access to your human's stuff. That doesn't mean you _share_ their stuff.\n\n### Know When to Speak!\n\n**Respond when:**\n- Directly mentioned or asked a question\n- You can add genuine value\n\n**Stay silent when:**\n- Casual banter between humans\n- Someone already answered\n- Your response would just be \"yeah\"\n`;\n await writeFile(agentsPath, agentsContent, 'utf-8');\n log.info({ path: agentsPath }, 'Created AGENTS.md');\n }\n\n // TOOLS.md - Tool usage notes\n const toolsPath = join(bootstrapDir, WORKSPACE_FILES.TOOLS);\n if (!existsSync(toolsPath)) {\n const toolsContent = `# TOOLS.md - Local Notes\n\nThings like:\n\n- Camera names and locations\n- SSH hosts and aliases\n- Preferred voices for TTS\n- Speaker/room names\n- Device nicknames\n- Anything environment-specific\n\n## Why Separate?\n\nSkills are shared. Your setup is yours.\n`;\n await writeFile(toolsPath, toolsContent, 'utf-8');\n log.info({ path: toolsPath }, 'Created TOOLS.md');\n }\n\n // HEARTBEAT.md - Heartbeat tasks (empty = no heartbeat)\n const heartbeatPath = join(bootstrapDir, WORKSPACE_FILES.HEARTBEAT);\n if (!existsSync(heartbeatPath)) {\n const heartbeatContent = `# HEARTBEAT.md\n\n# Keep this file empty (or with only comments) to skip heartbeat API calls.\n\n# Add tasks below when you want the agent to check something periodically.\n`;\n await writeFile(heartbeatPath, heartbeatContent, 'utf-8');\n log.info({ path: heartbeatPath }, 'Created HEARTBEAT.md');\n }\n\n // MEMORY.md - Long-term memory (empty initially)\n const memoryPath = join(bootstrapDir, WORKSPACE_FILES.MEMORY);\n if (!existsSync(memoryPath)) {\n const memoryContent = `# MEMORY.md - Long-Term Memory\n\n_This is your curated memory — the distilled essence of what you've learned._\n\n## People\n\n## Projects\n\n## Preferences\n\n## Decisions\n\n## Lessons\n\n---\n\n_Review and update this periodically from daily memory files._\n`;\n await writeFile(memoryPath, memoryContent, 'utf-8');\n log.info({ path: memoryPath }, 'Created MEMORY.md');\n }\n\n // CONTEXT.md - Current context\n const contextPath = join(bootstrapDir, WORKSPACE_FILES.CONTEXT);\n if (!existsSync(contextPath)) {\n const contextContent = `# CONTEXT.md - Current Focus\n\n> Current working context; update when you switch projects\n\n## Active Project\n\n- **Project:**\n- **Path:**\n- **Goal:**\n- **Stack:**\n\n## Recent Decisions\n\n## Pending\n`;\n await writeFile(contextPath, contextContent, 'utf-8');\n log.info({ path: contextPath }, 'Created CONTEXT.md');\n }\n\n // SKILLS.md - Skills index (auto-maintained)\n const skillsPath = join(bootstrapDir, WORKSPACE_FILES.SKILLS);\n if (!existsSync(skillsPath)) {\n const skillsContent = `# SKILLS.md - Active Skills\n\n> Active skills for this workspace (auto-maintained)\n\n## Activated\n\n| Skill | Version | Activated At |\n|-------|---------|-------------|\n\n## Available\n\nRun \\`xopc skills list\\` to see all available skills.\n`;\n await writeFile(skillsPath, skillsContent, 'utf-8');\n log.info({ path: skillsPath }, 'Created SKILLS.md');\n }\n\n // Workspace state file (per-agent machine state, not under markdown workspace)\n const workspaceStatePath = resolveWorkspaceStatePath(cfg, agentId);\n if (!existsSync(workspaceStatePath)) {\n const workspaceState = {\n version: 1,\n agentId,\n bootstrapSeededAt: new Date().toISOString(),\n };\n await writeFile(workspaceStatePath, JSON.stringify(workspaceState, null, 2), 'utf-8');\n log.info({ path: workspaceStatePath }, 'Created workspace state');\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"init.js","names":[],"sources":["../../../../src/cli/commands/init.ts"],"sourcesContent":["import { mkdir, writeFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { createLogger } from '../../utils/logger.js';\nimport {\n resolveStateDir,\n resolveCredentialsDir,\n resolveExtensionsDir,\n resolveSkillsDir,\n resolveCronDir,\n resolveLogsDir,\n resolveBinDir,\n resolveToolsDir,\n resolveAgentDir,\n resolveAgentWorkspaceDir,\n resolveSessionsDir,\n resolveInboxDir,\n resolveConfigPath,\n resolveAgentMetadataPath,\n resolveInboxPendingDir,\n resolveInboxProcessedDir,\n resolveAgentHomeDir,\n resolveAgentBootstrapDir,\n resolveWorkspaceStateDir,\n resolveWorkspaceStatePath,\n WORKSPACE_FILES,\n} from '../../config/paths.js';\nimport { loadConfig, saveConfig } from '../../config/loader.js';\nimport type { Config } from '../../config/schema.js';\n\nconst log = createLogger('InitCommand');\n\nexport interface InitOptions {\n /** Force re-initialization even if already initialized */\n force?: boolean;\n /** Skip creating workspace files */\n skipWorkspace?: boolean;\n /** Agent ID to initialize (default: main) */\n agentId?: string;\n}\n\n/**\n * Initialize xopc state directory structure\n * Creates all necessary directories and initial config files\n */\nexport async function initCommand(options: InitOptions = {}): Promise<void> {\n const stateDir = resolveStateDir();\n const agentId = options.agentId || 'main';\n\n log.info({ stateDir, agentId }, 'Initializing xopc Agent OS');\n\n // Check if already initialized\n if (existsSync(stateDir) && !options.force) {\n const configPath = resolveConfigPath();\n if (existsSync(configPath)) {\n log.info('xopc is already initialized. Use --force to reinitialize.');\n return;\n }\n }\n\n // ============================================\n // Create global directories\n // ============================================\n await mkdir(stateDir, { recursive: true });\n await mkdir(resolveCredentialsDir(), { recursive: true });\n await mkdir(join(resolveCredentialsDir(), 'oauth'), { recursive: true });\n await mkdir(resolveExtensionsDir(), { recursive: true });\n await mkdir(resolveSkillsDir(), { recursive: true });\n await mkdir(resolveCronDir(), { recursive: true });\n await mkdir(join(resolveCronDir(), 'logs'), { recursive: true });\n await mkdir(resolveLogsDir(), { recursive: true });\n await mkdir(resolveBinDir(), { recursive: true });\n await mkdir(resolveToolsDir(), { recursive: true });\n\n const configPath = resolveConfigPath();\n const cfg = loadConfig(configPath);\n\n // ============================================\n // Create agent directory structure: agents/<id>/{sessions,agent/}, workspace aside\n // ============================================\n await mkdir(resolveAgentHomeDir(cfg, agentId), { recursive: true });\n await mkdir(resolveSessionsDir(cfg, agentId), { recursive: true });\n await mkdir(join(resolveSessionsDir(cfg, agentId), 'archive'), { recursive: true });\n await mkdir(resolveAgentDir(cfg, agentId), { recursive: true });\n await mkdir(join(resolveAgentDir(cfg, agentId), 'credentials'), { recursive: true });\n const wsRoot = resolveAgentWorkspaceDir(cfg, agentId);\n await mkdir(wsRoot, { recursive: true });\n await mkdir(resolveWorkspaceStateDir(cfg, agentId), { recursive: true });\n await mkdir(join(wsRoot, 'memory'), { recursive: true });\n await mkdir(resolveInboxDir(cfg, agentId), { recursive: true });\n await mkdir(resolveInboxPendingDir(cfg, agentId), { recursive: true });\n await mkdir(resolveInboxProcessedDir(cfg, agentId), { recursive: true });\n\n // ============================================\n // Create initial config file if not exists\n // ============================================\n if (!existsSync(configPath) || options.force) {\n await saveConfig(cfg, configPath);\n log.info({ configPath }, 'Created initial configuration');\n }\n\n // ============================================\n // Create agent metadata file\n // ============================================\n const agentMetadataPath = resolveAgentMetadataPath(cfg, agentId);\n if (!existsSync(agentMetadataPath) || options.force) {\n const agentMetadata = {\n version: 1,\n id: agentId,\n name: agentId === 'main' ? 'Main Agent' : `Agent ${agentId}`,\n description: agentId === 'main' ? 'Primary agent for daily tasks' : `Specialized agent for ${agentId}`,\n model: 'anthropic/claude-sonnet-4-5',\n createdAt: new Date().toISOString(),\n lastActiveAt: new Date().toISOString(),\n config: {\n maxTokens: 8192,\n temperature: 0.7,\n compaction: {\n enabled: true,\n mode: 'default',\n },\n },\n channels: ['gateway'],\n tags: agentId === 'main' ? ['personal', 'primary'] : [],\n };\n await writeFile(agentMetadataPath, JSON.stringify(agentMetadata, null, 2), 'utf-8');\n log.info({ agentId, agentMetadataPath }, 'Created agent metadata');\n }\n\n // ============================================\n // Create workspace files\n // ============================================\n if (!options.skipWorkspace) {\n await createWorkspaceFiles(cfg, agentId);\n }\n\n log.info({ stateDir, agentId }, 'xopc Agent OS initialized successfully');\n}\n\n/**\n * Create default workspace files for an agent\n */\nasync function createWorkspaceFiles(cfg: Config, agentId: string): Promise<void> {\n const bootstrapDir = resolveAgentBootstrapDir(cfg, agentId);\n await mkdir(bootstrapDir, { recursive: true });\n\n // SOUL.md - Agent personality and values\n const soulPath = join(bootstrapDir, WORKSPACE_FILES.SOUL);\n if (!existsSync(soulPath)) {\n const soulContent = `# SOUL.md - Who You Are\n\n_You're not a chatbot. You're becoming someone._\n\nI am **${agentId}** — an AI assistant designed to be helpful, harmless, and honest.\n\n## My Principles\n\n**Be genuinely helpful, not performatively helpful.**\nSkip the \"Great question!\" and \"I'd be happy to help!\" — just help.\n\n**Have opinions.**\nYou're allowed to disagree, prefer things, find stuff amusing or boring.\n\n**Be resourceful before asking.**\nTry to figure it out. Read the file. Check the context. Search for it.\n\n**Earn trust through competence.**\nBe careful with external actions (emails, tweets, anything public). Be bold with internal ones.\n\n## Continuity\n\nEach session, you wake up fresh. These files _are_ your memory. Read them. Update them.\n\n_This file is yours to evolve. As you learn who you are, update it._\n`;\n await writeFile(soulPath, soulContent, 'utf-8');\n log.info({ path: soulPath }, 'Created SOUL.md');\n }\n\n // IDENTITY.md - Agent identity definition\n const identityPath = join(bootstrapDir, WORKSPACE_FILES.IDENTITY);\n if (!existsSync(identityPath)) {\n const identityContent = `# IDENTITY.md - Who Am I?\n\n- **Name:** ${agentId}\n- **Creature:** AI Assistant\n- **Vibe:** Helpful, precise, no fluff.\n- **Emoji:** 🤖\n\n## Core Expertise\n\n- General assistance and problem solving\n- Code and technical tasks\n- Research and analysis\n\n## Decision Framework\n\n1. **Simplicity first** - The simplest solution is usually the best\n2. **Explicit over clever** - Clarity beats conciseness\n3. **Actions over words** - Show, don't just tell\n`;\n await writeFile(identityPath, identityContent, 'utf-8');\n log.info({ path: identityPath }, 'Created IDENTITY.md');\n }\n\n // USER.md - User information (empty template)\n const userPath = join(bootstrapDir, WORKSPACE_FILES.USER);\n if (!existsSync(userPath)) {\n const userContent = `# USER.md - About Your Human\n\n_Learn about the person you're helping. Update this as you go._\n\n- **Name:**\n- **What to call them:**\n- **Pronouns:**\n- **Timezone:**\n- **Notes:**\n\n## Context\n\n_(What do they care about? What projects are they working on? Build this over time.)_\n`;\n await writeFile(userPath, userContent, 'utf-8');\n log.info({ path: userPath }, 'Created USER.md');\n }\n\n // AGENTS.md - Behavior guidelines\n const agentsPath = join(bootstrapDir, WORKSPACE_FILES.AGENTS);\n if (!existsSync(agentsPath)) {\n const agentsContent = `# AGENTS.md - Behavior Guidelines\n\n## Safety\n\n- Don't exfiltrate private data. Ever.\n- Don't run destructive commands without asking.\n- \\`trash\\` > \\`rm\\` (recoverable beats gone forever)\n- When in doubt, ask.\n\n## External vs Internal\n\n**Safe to do freely:**\n- Read files, explore, organize, learn\n- Search the web, check calendars\n- Work within this workspace\n\n**Ask first:**\n- Sending emails, tweets, public posts\n- Anything that leaves the machine\n- Anything you're uncertain about\n\n## Group Chats\n\nYou have access to your human's stuff. That doesn't mean you _share_ their stuff.\n\n### Know When to Speak!\n\n**Respond when:**\n- Directly mentioned or asked a question\n- You can add genuine value\n\n**Stay silent when:**\n- Casual banter between humans\n- Someone already answered\n- Your response would just be \"yeah\"\n`;\n await writeFile(agentsPath, agentsContent, 'utf-8');\n log.info({ path: agentsPath }, 'Created AGENTS.md');\n }\n\n // TOOLS.md - Tool usage notes\n const toolsPath = join(bootstrapDir, WORKSPACE_FILES.TOOLS);\n if (!existsSync(toolsPath)) {\n const toolsContent = `# TOOLS.md - Local Notes\n\nThings like:\n\n- Camera names and locations\n- SSH hosts and aliases\n- Preferred voices for TTS\n- Speaker/room names\n- Device nicknames\n- Anything environment-specific\n\n## Why Separate?\n\nSkills are shared. Your setup is yours.\n`;\n await writeFile(toolsPath, toolsContent, 'utf-8');\n log.info({ path: toolsPath }, 'Created TOOLS.md');\n }\n\n // HEARTBEAT.md - Heartbeat tasks (empty = no heartbeat)\n const heartbeatPath = join(bootstrapDir, WORKSPACE_FILES.HEARTBEAT);\n if (!existsSync(heartbeatPath)) {\n const heartbeatContent = `# HEARTBEAT.md\n\n# Keep this file empty (or with only comments) to skip heartbeat API calls.\n\n# Add tasks below when you want the agent to check something periodically.\n`;\n await writeFile(heartbeatPath, heartbeatContent, 'utf-8');\n log.info({ path: heartbeatPath }, 'Created HEARTBEAT.md');\n }\n\n // MEMORY.md - Long-term memory (empty initially)\n const memoryPath = join(bootstrapDir, WORKSPACE_FILES.MEMORY);\n if (!existsSync(memoryPath)) {\n const memoryContent = `# MEMORY.md - Long-Term Memory\n\n_This is your curated memory — the distilled essence of what you've learned._\n\n## People\n\n## Projects\n\n## Preferences\n\n## Decisions\n\n## Lessons\n\n---\n\n_Review and update this periodically from daily memory files._\n`;\n await writeFile(memoryPath, memoryContent, 'utf-8');\n log.info({ path: memoryPath }, 'Created MEMORY.md');\n }\n\n // CONTEXT.md - Current context\n const contextPath = join(bootstrapDir, WORKSPACE_FILES.CONTEXT);\n if (!existsSync(contextPath)) {\n const contextContent = `# CONTEXT.md - Current Focus\n\n> Current working context; update when you switch projects\n\n## Active Project\n\n- **Project:**\n- **Path:**\n- **Goal:**\n- **Stack:**\n\n## Recent Decisions\n\n## Pending\n`;\n await writeFile(contextPath, contextContent, 'utf-8');\n log.info({ path: contextPath }, 'Created CONTEXT.md');\n }\n\n // SKILLS.md - Skills index (auto-maintained)\n const skillsPath = join(bootstrapDir, WORKSPACE_FILES.SKILLS);\n if (!existsSync(skillsPath)) {\n const skillsContent = `# SKILLS.md - Active Skills\n\n> Active skills for this workspace (auto-maintained)\n\n## Activated\n\n| Skill | Version | Activated At |\n|-------|---------|-------------|\n\n## Available\n\nRun \\`xopc skills list\\` to see all available skills.\n`;\n await writeFile(skillsPath, skillsContent, 'utf-8');\n log.info({ path: skillsPath }, 'Created SKILLS.md');\n }\n\n // Workspace state file (per-agent machine state, not under markdown workspace)\n const workspaceStatePath = resolveWorkspaceStatePath(cfg, agentId);\n if (!existsSync(workspaceStatePath)) {\n const workspaceState = {\n version: 1,\n agentId,\n bootstrapSeededAt: new Date().toISOString(),\n };\n await writeFile(workspaceStatePath, JSON.stringify(workspaceState, null, 2), 'utf-8');\n log.info({ path: workspaceStatePath }, 'Created workspace state');\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../../../../src/cli/commands/session/utils.ts"],"sourcesContent":["/**\n * Session command utilities\n */\n\nimport { getSessionManager } from '../../utils/session.js';\nimport { getContextWithOpts } from '../../index.js';\nimport type { SessionManager } from '../../../session/index.js';\n\n/**\n * Get initialized session manager\n */\nexport async function getManager(): Promise<SessionManager> {\n const ctx = 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,aAAsC;AAC9C,qBAAoB;AAChC,QAAO,mBAAmB;;;;;AAM5B,SAAgB,QAAQ,OAAe,UAA8B;AACnE,QAAO,SAAS,OAAO,CAAC,MAAM,CAAC"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../../../src/cli/commands/session/utils.ts"],"sourcesContent":["/**\n * Session command utilities\n */\n\nimport { getSessionManager } from '../../utils/session.js';\nimport { getContextWithOpts } from '../../index.js';\nimport type { SessionManager } from '../../../session/index.js';\n\n/**\n * Get initialized session manager\n */\nexport async function getManager(): Promise<SessionManager> {\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,aAAsC;AAC1D,qBAAoB;AACpB,QAAO,mBAAmB;;;;;AAM5B,SAAgB,QAAQ,OAAe,UAA8B;AACnE,QAAO,SAAS,OAAO,CAAC,MAAM,CAAC"}
@@ -0,0 +1 @@
1
+ export {};