@xopcai/xopc 0.0.117 → 0.0.119

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 (590) hide show
  1. package/README.md +26 -24
  2. package/README.zh-CN.md +46 -42
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/telegram/xopc.extension.json +1 -1
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BBLhJ2C6.js → agent-avatar-dicebear-CU8J6zou.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-B0hkpLhP.js +2 -0
  7. package/dist/gateway/static/root/assets/app-management-settings-panel-B9vfYoEr.js +1 -0
  8. package/dist/gateway/static/root/assets/appearance-settings-ClOzIO24.js +1 -0
  9. package/dist/gateway/static/root/assets/{apps-page-DdDx0V4z.js → apps-page-DU0dz9Zo.js} +1 -1
  10. package/dist/gateway/static/root/assets/{archive-plugin-DZsVqMhU.js → archive-plugin-BkVIgZzA.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-CIol6JWX.js → attachment-load-CaCMWh1D.js} +1 -1
  12. package/dist/gateway/static/root/assets/automation-suggestion-card-DhGDpKP3.js +1 -0
  13. package/dist/gateway/static/root/assets/automations-page-CTedroVo.js +1 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-B3UauMfp.js → binary-plugins-B4TO_bsn.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-2HJoFchH.js → block-editor-DJRWwWNI.js} +6 -6
  16. package/dist/gateway/static/root/assets/browser-settings-page-FCDwOOBK.js +8 -0
  17. package/dist/gateway/static/root/assets/capability-presets-api-Befi89CL.js +1 -0
  18. package/dist/gateway/static/root/assets/capability-presets-settings-panel-_G8eb2vJ.js +1 -0
  19. package/dist/gateway/static/root/assets/channel-recipient-api-BNSuJb5f.js +1 -0
  20. package/dist/gateway/static/root/assets/channels-settings-C3d5JBJX.js +1 -0
  21. package/dist/gateway/static/root/assets/cn-BQ_8x0bT.js +1 -0
  22. package/dist/gateway/static/root/assets/connectors-page-yaUNvt5u.js +2 -0
  23. package/dist/gateway/static/root/assets/cron-expression-B3B1eqnr.js +2 -0
  24. package/dist/gateway/static/root/assets/dreaming-settings-DNrdg1Ve.js +1 -0
  25. package/dist/gateway/static/root/assets/{extension-debug-page-DX5WRE_t.js → extension-debug-page-DYh402XV.js} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-page-Buah7Bw-.js → extension-page-Cr_TizrN.js} +1 -1
  27. package/dist/gateway/static/root/assets/{extension-settings-page-DuroLVnf.js → extension-settings-page-BU1KoKRj.js} +1 -1
  28. package/dist/gateway/static/root/assets/{fetch-B5zdl27C.js → fetch-Y7AEX4H3.js} +1 -1
  29. package/dist/gateway/static/root/assets/format-cron-label-arqgGlVV.js +1 -0
  30. package/dist/gateway/static/root/assets/{gateway-config-api-gT4ZhE7h.js → gateway-config-api-RbMmAOpX.js} +1 -1
  31. package/dist/gateway/static/root/assets/gateway-settings-C79wkXef.js +1 -0
  32. package/dist/gateway/static/root/assets/{gateway-startup-retry-B3kL8KGY.js → gateway-startup-retry-DiD_Tx4N.js} +1 -1
  33. package/dist/gateway/static/root/assets/goal-detail-page-9paXuHdo.js +1 -0
  34. package/dist/gateway/static/root/assets/{goals-config-api-AR-fVh0P.js → goals-config-api-DqxVi0p5.js} +1 -1
  35. package/dist/gateway/static/root/assets/{goals-page-Cpb21ezg.js → goals-page-CS0R-Af2.js} +2 -2
  36. package/dist/gateway/static/root/assets/goals-settings-CSuzZ8Ae.js +1 -0
  37. package/dist/gateway/static/root/assets/heartbeat-settings-DXPaYJm3.js +1 -0
  38. package/dist/gateway/static/root/assets/index-BoKafJIZ.js +191 -0
  39. package/dist/gateway/static/root/assets/index-CArhCcYn.css +1 -0
  40. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-Dvg53qnd.js +1 -0
  41. package/dist/gateway/static/root/assets/{logs-page-DefCgF4o.js → logs-page-DLXPcksQ.js} +2 -2
  42. package/dist/gateway/static/root/assets/{markdown-split-ChbR9LGO.js → markdown-split-CpHxbtWJ.js} +1 -1
  43. package/dist/gateway/static/root/assets/{media-plugins-B82oP80n.js → media-plugins-SFPQRSxq.js} +1 -1
  44. package/dist/gateway/static/root/assets/messages-CrDHEbss.js +3 -0
  45. package/dist/gateway/static/root/assets/models-hub-panel-BDF2iyRk.js +2 -0
  46. package/dist/gateway/static/root/assets/note-detail-page-CSb_hwig.js +2 -0
  47. package/dist/gateway/static/root/assets/{note-image-lightbox-CDknITM3.js → note-image-lightbox-BUYURRgn.js} +1 -1
  48. package/dist/gateway/static/root/assets/notes-page-BsIBSFyZ.js +1 -0
  49. package/dist/gateway/static/root/assets/{preview-open-alternatives-DV3xQsWB.js → preview-open-alternatives-BHz9iWYA.js} +1 -1
  50. package/dist/gateway/static/root/assets/remote-access-hub-CwzSovcS.js +1 -0
  51. package/dist/gateway/static/root/assets/{save-bar-controls-BODCXnvY.js → save-bar-controls-CefkOlRg.js} +1 -1
  52. package/dist/gateway/static/root/assets/schedule-field-CmTRoOcE.js +1 -0
  53. package/dist/gateway/static/root/assets/{schema-form-qtfEI6QM.js → schema-form-FMKv1vGu.js} +1 -1
  54. package/dist/gateway/static/root/assets/sessions-page-PHmX-NmA.js +1 -0
  55. package/dist/gateway/static/root/assets/settings-advanced-gate-BRAeKJN4.js +1 -0
  56. package/dist/gateway/static/root/assets/{settings-collapsible-section-BHZKjVcS.js → settings-collapsible-section-BouO6JTi.js} +1 -1
  57. package/dist/gateway/static/root/assets/{settings-form-section-5i35D-J1.js → settings-form-section-D-4lBl6X.js} +1 -1
  58. package/dist/gateway/static/root/assets/settings-page-KKrbFjy8.js +1 -0
  59. package/dist/gateway/static/root/assets/settings-page-layout-BJ4Gsef5.js +1 -0
  60. package/dist/gateway/static/root/assets/setup-status-panel-CrUjHPQo.js +1 -0
  61. package/dist/gateway/static/root/assets/{share-preview-page-B0H63tDv.js → share-preview-page-BDy2btRN.js} +1 -1
  62. package/dist/gateway/static/root/assets/shares-settings-B18OBmH5.js +1 -0
  63. package/dist/gateway/static/root/assets/skill-reload-api-C28-2uKQ.js +1 -0
  64. package/dist/gateway/static/root/assets/skills-page-Bm2ebkwl.js +2 -0
  65. package/dist/gateway/static/root/assets/system-settings-panel-CRngrlnZ.js +1 -0
  66. package/dist/gateway/static/root/assets/typed-models-lib-BltBc0b-.js +1 -0
  67. package/dist/gateway/static/root/assets/{use-channel-catalog-BCjP_VHb.js → use-channel-catalog-CjN-51e6.js} +1 -1
  68. package/dist/gateway/static/root/assets/user-profile-settings-panel-DJ1dKwZy.js +1 -0
  69. package/dist/gateway/static/root/assets/utils-B5M5-YvK.js +1 -0
  70. package/dist/gateway/static/root/assets/voice-api-key-field-CeEevm7z.js +1 -0
  71. package/dist/gateway/static/root/assets/{voice-player-store-BlF9V05n.js → voice-player-store-B7ykUlHM.js} +1 -1
  72. package/dist/gateway/static/root/assets/workflow-run-setup-panel-C4PzUQjB.js +3 -0
  73. package/dist/gateway/static/root/assets/workflows-page-BL84_-Ky.js +18 -0
  74. package/dist/gateway/static/root/index.html +6 -7
  75. package/dist/package.js +1 -1
  76. package/dist/src/agent/agent-manager.d.ts +4 -5
  77. package/dist/src/agent/agent-manager.js +6 -9
  78. package/dist/src/agent/agent-manager.js.map +1 -1
  79. package/dist/src/agent/agent-scope.js +0 -2
  80. package/dist/src/agent/agent-scope.js.map +1 -1
  81. package/dist/src/agent/background-review/prompts.d.ts +2 -2
  82. package/dist/src/agent/background-review/prompts.js +2 -2
  83. package/dist/src/agent/background-review/prompts.js.map +1 -1
  84. package/dist/src/agent/background-review/settings.d.ts +1 -1
  85. package/dist/src/agent/background-review/settings.js +7 -8
  86. package/dist/src/agent/background-review/settings.js.map +1 -1
  87. package/dist/src/agent/bootstrap/bootstrap-cache.d.ts +1 -0
  88. package/dist/src/agent/bootstrap/bootstrap-cache.js +4 -3
  89. package/dist/src/agent/bootstrap/bootstrap-cache.js.map +1 -1
  90. package/dist/src/agent/bootstrap/bootstrap-files.d.ts +4 -0
  91. package/dist/src/agent/bootstrap/bootstrap-files.js +4 -3
  92. package/dist/src/agent/bootstrap/bootstrap-files.js.map +1 -1
  93. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +4 -2
  94. package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
  95. package/dist/src/agent/bootstrap/load-bootstrap-files.d.ts +2 -1
  96. package/dist/src/agent/bootstrap/load-bootstrap-files.js +17 -16
  97. package/dist/src/agent/bootstrap/load-bootstrap-files.js.map +1 -1
  98. package/dist/src/agent/bootstrap/types.d.ts +1 -1
  99. package/dist/src/agent/context/workspace-templates/AGENTS.md +1 -1
  100. package/dist/src/agent/context/workspace.d.ts +4 -2
  101. package/dist/src/agent/context/workspace.js +5 -4
  102. package/dist/src/agent/context/workspace.js.map +1 -1
  103. package/dist/src/agent/embedded/run-for-session.js +106 -15
  104. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  105. package/dist/src/agent/fallback/candidates.d.ts +0 -8
  106. package/dist/src/agent/fallback/candidates.js +10 -11
  107. package/dist/src/agent/fallback/candidates.js.map +1 -1
  108. package/dist/src/agent/index.js +1 -1
  109. package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -3
  110. package/dist/src/agent/lifecycle/handlers/compaction.js +1 -16
  111. package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
  112. package/dist/src/agent/lifecycle/progress.d.ts +0 -1
  113. package/dist/src/agent/lifecycle/progress.js +1 -6
  114. package/dist/src/agent/lifecycle/progress.js.map +1 -1
  115. package/dist/src/agent/lifecycle/timeout-wrapper.d.ts +1 -2
  116. package/dist/src/agent/lifecycle/timeout-wrapper.js +1 -7
  117. package/dist/src/agent/lifecycle/timeout-wrapper.js.map +1 -1
  118. package/dist/src/agent/memory/builtin-memory-store.d.ts +4 -2
  119. package/dist/src/agent/memory/builtin-memory-store.js +11 -6
  120. package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
  121. package/dist/src/agent/memory/builtin-provider.js +36 -7
  122. package/dist/src/agent/memory/builtin-provider.js.map +1 -1
  123. package/dist/src/agent/memory/candidate-extractor.d.ts +6 -0
  124. package/dist/src/agent/memory/candidate-extractor.js +60 -0
  125. package/dist/src/agent/memory/candidate-extractor.js.map +1 -0
  126. package/dist/src/agent/memory/manager.d.ts +2 -1
  127. package/dist/src/agent/memory/manager.js +27 -3
  128. package/dist/src/agent/memory/manager.js.map +1 -1
  129. package/dist/src/agent/memory/memory-config.js +3 -0
  130. package/dist/src/agent/memory/memory-config.js.map +1 -1
  131. package/dist/src/agent/memory/prefetch-coordinator.js.map +1 -1
  132. package/dist/src/agent/memory/types.d.ts +27 -4
  133. package/dist/src/agent/middleware/self-verify.d.ts +0 -1
  134. package/dist/src/agent/middleware/self-verify.js +0 -2
  135. package/dist/src/agent/middleware/self-verify.js.map +1 -1
  136. package/dist/src/agent/models/index.d.ts +1 -1
  137. package/dist/src/agent/models/manager.d.ts +4 -20
  138. package/dist/src/agent/models/manager.js +9 -126
  139. package/dist/src/agent/models/manager.js.map +1 -1
  140. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +0 -4
  141. package/dist/src/agent/orchestration/agent-orchestrator.js +1 -9
  142. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  143. package/dist/src/agent/prompt/memory/index.d.ts +4 -2
  144. package/dist/src/agent/prompt/memory/index.js +18 -12
  145. package/dist/src/agent/prompt/memory/index.js.map +1 -1
  146. package/dist/src/agent/prompt/sections/memory-skills.js +1 -1
  147. package/dist/src/agent/prompt/sections/memory-skills.js.map +1 -1
  148. package/dist/src/agent/prompt/sections/tooling.js +2 -2
  149. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  150. package/dist/src/agent/prompt/service-prompt-builder.d.ts +0 -1
  151. package/dist/src/agent/prompt/service-prompt-builder.js +4 -31
  152. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  153. package/dist/src/agent/prompt/subagent-context.js +1 -1
  154. package/dist/src/agent/prompt/subagent-context.js.map +1 -1
  155. package/dist/src/agent/prompt/types.d.ts +1 -1
  156. package/dist/src/agent/reply/post-compaction-context.js +1 -3
  157. package/dist/src/agent/reply/post-compaction-context.js.map +1 -1
  158. package/dist/src/agent/reply/startup-context.js +1 -5
  159. package/dist/src/agent/reply/startup-context.js.map +1 -1
  160. package/dist/src/agent/service.d.ts +4 -12
  161. package/dist/src/agent/service.js +10 -48
  162. package/dist/src/agent/service.js.map +1 -1
  163. package/dist/src/agent/service.types.d.ts +2 -2
  164. package/dist/src/agent/session/session-config-service.d.ts +11 -11
  165. package/dist/src/agent/session/session-config-service.js +14 -14
  166. package/dist/src/agent/session/session-config-service.js.map +1 -1
  167. package/dist/src/agent/session/session-inspector.js +3 -2
  168. package/dist/src/agent/session/session-inspector.js.map +1 -1
  169. package/dist/src/agent/starter-agents.js +12 -12
  170. package/dist/src/agent/starter-agents.js.map +1 -1
  171. package/dist/src/agent/tools/automation-tool.d.ts +14 -0
  172. package/dist/src/agent/tools/automation-tool.js +102 -0
  173. package/dist/src/agent/tools/automation-tool.js.map +1 -0
  174. package/dist/src/agent/tools/curated-memory-tool.js +57 -2
  175. package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
  176. package/dist/src/agent/tools/delegate-tool.js +1 -1
  177. package/dist/src/agent/tools/delegate-tool.js.map +1 -1
  178. package/dist/src/agent/tools/factory.d.ts +3 -3
  179. package/dist/src/agent/tools/factory.js +2 -2
  180. package/dist/src/agent/tools/factory.js.map +1 -1
  181. package/dist/src/agent/tools/index.d.ts +1 -1
  182. package/dist/src/agent/tools/index.js +2 -2
  183. package/dist/src/agent/tools/web-extract.js +6 -8
  184. package/dist/src/agent/tools/web-extract.js.map +1 -1
  185. package/dist/src/agent-manifest/index.js +2 -2
  186. package/dist/src/agent-manifest/resolver.d.ts +4 -2
  187. package/dist/src/agent-manifest/resolver.js +6 -3
  188. package/dist/src/agent-manifest/resolver.js.map +1 -1
  189. package/dist/src/agent-manifest/schema.d.ts +238 -0
  190. package/dist/src/agent-manifest/schema.js +16 -5
  191. package/dist/src/agent-manifest/schema.js.map +1 -1
  192. package/dist/src/agent-manifest/validator.d.ts +3 -2
  193. package/dist/src/agent-manifest/validator.js +2 -1
  194. package/dist/src/agent-manifest/validator.js.map +1 -1
  195. package/dist/src/ai-assist/text-assist.d.ts +1 -1
  196. package/dist/src/ai-assist/text-assist.js +56 -0
  197. package/dist/src/ai-assist/text-assist.js.map +1 -1
  198. package/dist/src/auth/profiles/store.js.map +1 -1
  199. package/dist/src/automations/api/routes.d.ts +3 -0
  200. package/dist/src/automations/api/routes.js +193 -0
  201. package/dist/src/automations/api/routes.js.map +1 -0
  202. package/dist/src/automations/domain/index.d.ts +3 -0
  203. package/dist/src/automations/domain/index.js +3 -0
  204. package/dist/src/automations/domain/schedule.d.ts +4 -0
  205. package/dist/src/automations/domain/schedule.js +37 -0
  206. package/dist/src/automations/domain/schedule.js.map +1 -0
  207. package/dist/src/automations/domain/types.d.ts +160 -0
  208. package/dist/src/automations/domain/validation.d.ts +370 -0
  209. package/dist/src/automations/domain/validation.js +149 -0
  210. package/dist/src/automations/domain/validation.js.map +1 -0
  211. package/dist/src/automations/draft/automation-draft-prompt.d.ts +26 -0
  212. package/dist/src/automations/draft/automation-draft-prompt.js +127 -0
  213. package/dist/src/automations/draft/automation-draft-prompt.js.map +1 -0
  214. package/dist/src/automations/draft/automation-draft-service.d.ts +12 -0
  215. package/dist/src/automations/draft/automation-draft-service.js +135 -0
  216. package/dist/src/automations/draft/automation-draft-service.js.map +1 -0
  217. package/dist/src/automations/draft/automation-draft-validator.d.ts +99 -0
  218. package/dist/src/automations/draft/automation-draft-validator.js +105 -0
  219. package/dist/src/automations/draft/automation-draft-validator.js.map +1 -0
  220. package/dist/src/automations/draft/automation-draft.types.d.ts +40 -0
  221. package/dist/src/automations/draft/index.d.ts +3 -0
  222. package/dist/src/automations/draft/index.js +3 -0
  223. package/dist/src/automations/index.d.ts +3 -0
  224. package/dist/src/automations/index.js +8 -0
  225. package/dist/src/automations/product-events.d.ts +5 -0
  226. package/dist/src/automations/product-events.js +21 -0
  227. package/dist/src/automations/product-events.js.map +1 -0
  228. package/dist/src/automations/service/action-executor.d.ts +9 -0
  229. package/dist/src/automations/service/action-executor.js +157 -0
  230. package/dist/src/automations/service/action-executor.js.map +1 -0
  231. package/dist/src/automations/service/automation-service.d.ts +54 -0
  232. package/dist/src/automations/service/automation-service.js +404 -0
  233. package/dist/src/automations/service/automation-service.js.map +1 -0
  234. package/dist/src/automations/service/index.d.ts +2 -0
  235. package/dist/src/automations/service/index.js +3 -0
  236. package/dist/src/automations/storage/automation-repository.d.ts +6 -0
  237. package/dist/src/automations/storage/automation-repository.js +61 -0
  238. package/dist/src/automations/storage/automation-repository.js.map +1 -0
  239. package/dist/src/automations/storage/automation-run-repository.d.ts +17 -0
  240. package/dist/src/automations/storage/automation-run-repository.js +130 -0
  241. package/dist/src/automations/storage/automation-run-repository.js.map +1 -0
  242. package/dist/src/automations/storage/index.d.ts +2 -0
  243. package/dist/src/automations/storage/index.js +3 -0
  244. package/dist/src/channels/pipeline.d.ts +1 -1
  245. package/dist/src/channels/pipeline.js.map +1 -1
  246. package/dist/src/channels/plugin-types.d.ts +3 -0
  247. package/dist/src/chat-commands/agent-edit.js +0 -1
  248. package/dist/src/chat-commands/agent-edit.js.map +1 -1
  249. package/dist/src/chat-commands/builtins/model.js +2 -2
  250. package/dist/src/chat-commands/builtins/model.js.map +1 -1
  251. package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
  252. package/dist/src/cli/command-catalog.js +0 -39
  253. package/dist/src/cli/command-catalog.js.map +1 -1
  254. package/dist/src/cli/command-loaders.js +0 -1
  255. package/dist/src/cli/command-loaders.js.map +1 -1
  256. package/dist/src/cli/command-manifest.d.ts +1 -1
  257. package/dist/src/cli/command-manifest.js +1 -5
  258. package/dist/src/cli/command-manifest.js.map +1 -1
  259. package/dist/src/cli/commands/agents.js +7 -6
  260. package/dist/src/cli/commands/agents.js.map +1 -1
  261. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  262. package/dist/src/cli/commands/doctor/checks/{cron-health.d.ts → migrations.d.ts} +1 -1
  263. package/dist/src/cli/commands/doctor/checks/migrations.js +40 -0
  264. package/dist/src/cli/commands/doctor/checks/migrations.js.map +1 -0
  265. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -0
  266. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
  267. package/dist/src/cli/commands/doctor/checks/workspace-status.js +0 -1
  268. package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +1 -1
  269. package/dist/src/cli/commands/doctor/flow.js +2 -2
  270. package/dist/src/cli/commands/doctor/flow.js.map +1 -1
  271. package/dist/src/cli/commands/gateway/call.js +2 -2
  272. package/dist/src/cli/commands/gateway/call.js.map +1 -1
  273. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  274. package/dist/src/cli/commands/gateway/run-foreground.js +4 -2
  275. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  276. package/dist/src/cli/commands/init.js +33 -14
  277. package/dist/src/cli/commands/init.js.map +1 -1
  278. package/dist/src/cli/commands/models.js +13 -31
  279. package/dist/src/cli/commands/models.js.map +1 -1
  280. package/dist/src/cli/commands/onboard/model.js +17 -10
  281. package/dist/src/cli/commands/onboard/model.js.map +1 -1
  282. package/dist/src/cli/commands/onboard.js +2 -2
  283. package/dist/src/cli/commands/onboard.js.map +1 -1
  284. package/dist/src/cli/commands/tui.js +26 -4
  285. package/dist/src/cli/commands/tui.js.map +1 -1
  286. package/dist/src/cli/index.d.ts +1 -0
  287. package/dist/src/cli/index.js +10 -5
  288. package/dist/src/cli/index.js.map +1 -1
  289. package/dist/src/cli/registry.js +1 -1
  290. package/dist/src/cli/registry.js.map +1 -1
  291. package/dist/src/cli/templates.d.ts +1 -1
  292. package/dist/src/cli/templates.js +1 -11
  293. package/dist/src/cli/templates.js.map +1 -1
  294. package/dist/src/cli/utils/init-workspace-core.js +2 -0
  295. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  296. package/dist/src/commands/agents.config.d.ts +9 -0
  297. package/dist/src/commands/agents.config.js +42 -12
  298. package/dist/src/commands/agents.config.js.map +1 -1
  299. package/dist/src/config/agent-profile.js +5 -3
  300. package/dist/src/config/agent-profile.js.map +1 -1
  301. package/dist/src/config/agent-typed-models.js +3 -5
  302. package/dist/src/config/agent-typed-models.js.map +1 -1
  303. package/dist/src/config/config-surface.d.ts +3 -0
  304. package/dist/src/config/index.d.ts +0 -1
  305. package/dist/src/config/index.js +3 -3
  306. package/dist/src/config/index.js.map +1 -1
  307. package/dist/src/config/paths.d.ts +8 -10
  308. package/dist/src/config/paths.js +16 -16
  309. package/dist/src/config/paths.js.map +1 -1
  310. package/dist/src/config/profile.js +0 -1
  311. package/dist/src/config/profile.js.map +1 -1
  312. package/dist/src/config/rules.js +0 -5
  313. package/dist/src/config/rules.js.map +1 -1
  314. package/dist/src/config/schema.d.ts +45 -44
  315. package/dist/src/config/schema.js +68 -52
  316. package/dist/src/config/schema.js.map +1 -1
  317. package/dist/src/config/web-patch.d.ts +0 -12
  318. package/dist/src/config/web-patch.js +2 -29
  319. package/dist/src/config/web-patch.js.map +1 -1
  320. package/dist/src/extensions/api.d.ts +2 -0
  321. package/dist/src/extensions/api.js +10 -0
  322. package/dist/src/extensions/api.js.map +1 -1
  323. package/dist/src/extensions/extension-registry-impl.d.ts +4 -1
  324. package/dist/src/extensions/extension-registry-impl.js +8 -0
  325. package/dist/src/extensions/extension-registry-impl.js.map +1 -1
  326. package/dist/src/extensions/loader.d.ts +3 -3
  327. package/dist/src/extensions/loader.js +3 -3
  328. package/dist/src/extensions/loader.js.map +1 -1
  329. package/dist/src/extensions/sdk/testing.d.ts +2 -0
  330. package/dist/src/extensions/sdk/testing.js +7 -0
  331. package/dist/src/extensions/sdk/testing.js.map +1 -1
  332. package/dist/src/extensions/types/core.d.ts +10 -1
  333. package/dist/src/extensions/types/index.d.ts +1 -1
  334. package/dist/src/extensions/types/{phase4.d.ts → registration.d.ts} +2 -2
  335. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  336. package/dist/src/gateway/agent-builtin-tools.js +1 -1
  337. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  338. package/dist/src/gateway/agents-admin.d.ts +8 -0
  339. package/dist/src/gateway/agents-admin.js +63 -34
  340. package/dist/src/gateway/agents-admin.js.map +1 -1
  341. package/dist/src/gateway/capability-presets-admin.d.ts +1 -0
  342. package/dist/src/gateway/capability-presets-admin.js +19 -10
  343. package/dist/src/gateway/capability-presets-admin.js.map +1 -1
  344. package/dist/src/gateway/chat-stream/mapper.js +9 -2
  345. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  346. package/dist/src/gateway/dreaming-automation-reconciler.d.ts +11 -0
  347. package/dist/src/gateway/dreaming-automation-reconciler.js +105 -0
  348. package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -0
  349. package/dist/src/gateway/global-defaults-admin.d.ts +36 -0
  350. package/dist/src/gateway/global-defaults-admin.js +146 -0
  351. package/dist/src/gateway/global-defaults-admin.js.map +1 -0
  352. package/dist/src/gateway/heartbeat/service.d.ts +0 -2
  353. package/dist/src/gateway/heartbeat/service.js +0 -7
  354. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  355. package/dist/src/gateway/hono/lib/config-payload.d.ts +5 -6
  356. package/dist/src/gateway/hono/lib/config-payload.js +2 -2
  357. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  358. package/dist/src/gateway/hono/routes/agents.js +33 -1
  359. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  360. package/dist/src/gateway/hono/routes/commands-skills.js +4 -5
  361. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  362. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +1 -1
  363. package/dist/src/gateway/hono/routes/config-patch/misc.js +12 -6
  364. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
  365. package/dist/src/gateway/hono/routes/dreaming.js +27 -37
  366. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  367. package/dist/src/gateway/hono/routes/global-defaults.d.ts +3 -0
  368. package/dist/src/gateway/hono/routes/global-defaults.js +61 -0
  369. package/dist/src/gateway/hono/routes/global-defaults.js.map +1 -0
  370. package/dist/src/gateway/hono/routes/home.d.ts +2 -2
  371. package/dist/src/gateway/hono/routes/home.js +34 -25
  372. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  373. package/dist/src/gateway/hono/routes/lazy-bundles.js +21 -9
  374. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  375. package/dist/src/gateway/hono/routes/memory.js +75 -4
  376. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  377. package/dist/src/gateway/hono/routes/migrations.d.ts +3 -0
  378. package/dist/src/gateway/hono/routes/migrations.js +35 -0
  379. package/dist/src/gateway/hono/routes/migrations.js.map +1 -0
  380. package/dist/src/gateway/hono/routes/models.js +1 -1
  381. package/dist/src/gateway/hono/routes/public-gateway.js +2 -1
  382. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  383. package/dist/src/gateway/hono/routes/sessions.js +14 -0
  384. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  385. package/dist/src/gateway/run-loop.js +2 -0
  386. package/dist/src/gateway/run-loop.js.map +1 -1
  387. package/dist/src/gateway/security/operator-scopes.js +5 -1
  388. package/dist/src/gateway/security/operator-scopes.js.map +1 -1
  389. package/dist/src/gateway/service/config-coordinator.d.ts +4 -4
  390. package/dist/src/gateway/service/config-coordinator.js +14 -8
  391. package/dist/src/gateway/service/config-coordinator.js.map +1 -1
  392. package/dist/src/gateway/service/marketplace-service.d.ts +4 -4
  393. package/dist/src/gateway/service/marketplace-service.js +11 -7
  394. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  395. package/dist/src/gateway/service/sessions-api.d.ts +2 -1
  396. package/dist/src/gateway/service/sessions-api.js +6 -1
  397. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  398. package/dist/src/gateway/service.d.ts +7 -3
  399. package/dist/src/gateway/service.js +61 -27
  400. package/dist/src/gateway/service.js.map +1 -1
  401. package/dist/src/goals/goal-service.js +45 -4
  402. package/dist/src/goals/goal-service.js.map +1 -1
  403. package/dist/src/infra/update-restart.js +1 -1
  404. package/dist/src/migrations/config/default-capability-preset.d.ts +10 -0
  405. package/dist/src/migrations/config/default-capability-preset.js +135 -0
  406. package/dist/src/migrations/config/default-capability-preset.js.map +1 -0
  407. package/dist/src/migrations/index.d.ts +4 -0
  408. package/dist/src/migrations/index.js +4 -0
  409. package/dist/src/migrations/registry.d.ts +8 -0
  410. package/dist/src/migrations/registry.js +18 -0
  411. package/dist/src/migrations/registry.js.map +1 -0
  412. package/dist/src/migrations/runner.d.ts +17 -0
  413. package/dist/src/migrations/runner.js +191 -0
  414. package/dist/src/migrations/runner.js.map +1 -0
  415. package/dist/src/migrations/types.d.ts +34 -0
  416. package/dist/src/notes/service.js +27 -2
  417. package/dist/src/notes/service.js.map +1 -1
  418. package/dist/src/providers/index.d.ts +4 -5
  419. package/dist/src/providers/index.js +16 -16
  420. package/dist/src/providers/index.js.map +1 -1
  421. package/dist/src/providers/model-registry.d.ts +0 -1
  422. package/dist/src/providers/model-registry.js +0 -3
  423. package/dist/src/providers/model-registry.js.map +1 -1
  424. package/dist/src/routing/resolve-tui-session-key.d.ts +3 -0
  425. package/dist/src/routing/resolve-tui-session-key.js +14 -3
  426. package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
  427. package/dist/src/session/session-workspace.js +2 -7
  428. package/dist/src/session/session-workspace.js.map +1 -1
  429. package/dist/src/session/store.js +0 -5
  430. package/dist/src/session/store.js.map +1 -1
  431. package/dist/src/session/transcript-outline.d.ts +47 -0
  432. package/dist/src/session/transcript-outline.js +481 -0
  433. package/dist/src/session/transcript-outline.js.map +1 -0
  434. package/dist/src/storage/sqlite/index.d.ts +1 -3
  435. package/dist/src/storage/sqlite/index.js +2 -4
  436. package/dist/src/storage/sqlite/memory-index-repository.d.ts +1 -0
  437. package/dist/src/storage/sqlite/memory-index-repository.js +15 -14
  438. package/dist/src/storage/sqlite/memory-index-repository.js.map +1 -1
  439. package/dist/src/storage/sqlite/memory-records-repository.d.ts +44 -1
  440. package/dist/src/storage/sqlite/memory-records-repository.js +164 -20
  441. package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -1
  442. package/dist/src/storage/sqlite/migrations/014_memory_record_governance.sql +10 -0
  443. package/dist/src/storage/sqlite/migrations/015_memory_trace_feedback.sql +4 -0
  444. package/dist/src/storage/sqlite/migrations/016_automations.sql +47 -0
  445. package/dist/src/storage/sqlite/migrations/017_automation_run_events.sql +14 -0
  446. package/dist/src/storage/sqlite/migrations/018_automation_safety.sql +1 -0
  447. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  448. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  449. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  450. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  451. package/dist/src/storage/sqlite/schema.js +1 -1
  452. package/dist/src/storage/sqlite/schema.sql +56 -46
  453. package/dist/src/tui/backends/embedded-backend.d.ts +9 -0
  454. package/dist/src/tui/backends/embedded-backend.js +55 -27
  455. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  456. package/dist/src/tui/backends/gateway-sse-backend.d.ts +4 -0
  457. package/dist/src/tui/backends/gateway-sse-backend.js +30 -3
  458. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  459. package/dist/src/tui/components/tui-header.d.ts +0 -1
  460. package/dist/src/tui/components/tui-header.js +3 -8
  461. package/dist/src/tui/components/tui-header.js.map +1 -1
  462. package/dist/src/tui/tui-backend.d.ts +4 -0
  463. package/dist/src/tui/tui-commands.d.ts +5 -0
  464. package/dist/src/tui/tui-commands.js +43 -0
  465. package/dist/src/tui/tui-commands.js.map +1 -1
  466. package/dist/src/tui/tui-startup-resources.js +2 -1
  467. package/dist/src/tui/tui-startup-resources.js.map +1 -1
  468. package/dist/src/tui/tui-startup-text.js +12 -12
  469. package/dist/src/tui/tui-startup-text.js.map +1 -1
  470. package/dist/src/tui/tui-transcript-tree.d.ts +1 -1
  471. package/dist/src/tui/tui-transcript-tree.js +17 -257
  472. package/dist/src/tui/tui-transcript-tree.js.map +1 -1
  473. package/dist/src/tui/tui-types.d.ts +2 -0
  474. package/dist/src/tui/tui-types.js.map +1 -1
  475. package/dist/src/tui/tui.js +11 -3
  476. package/dist/src/tui/tui.js.map +1 -1
  477. package/dist/src/workflows/domain/index.js +1 -1
  478. package/dist/src/workflows/domain/run.d.ts +7 -7
  479. package/dist/src/workflows/domain/run.js.map +1 -1
  480. package/dist/src/workflows/index.js +2 -2
  481. package/dist/src/workflows/service/workflow-run-service.d.ts +2 -0
  482. package/dist/src/workflows/service/workflow-run-service.js +31 -9
  483. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  484. package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -1
  485. package/package.json +4 -2
  486. package/dist/gateway/static/root/assets/agents-C6xgagZd.js +0 -71
  487. package/dist/gateway/static/root/assets/app-management-settings-panel-CBpLONvG.js +0 -1
  488. package/dist/gateway/static/root/assets/appearance-settings-CGcc54yj.js +0 -1
  489. package/dist/gateway/static/root/assets/browser-settings-page-CUOO-PQk.js +0 -8
  490. package/dist/gateway/static/root/assets/capability-presets-api-XQoMTI0A.js +0 -1
  491. package/dist/gateway/static/root/assets/capability-presets-settings-panel-CfqF-kGr.js +0 -1
  492. package/dist/gateway/static/root/assets/channels-settings-BYyRzsex.js +0 -1
  493. package/dist/gateway/static/root/assets/cn-JdwAhgNB.js +0 -1
  494. package/dist/gateway/static/root/assets/connectors-page-DIvEz4NX.js +0 -2
  495. package/dist/gateway/static/root/assets/createLucideIcon-DPHK1VkS.js +0 -1
  496. package/dist/gateway/static/root/assets/cron-api-R41aQCX9.js +0 -1
  497. package/dist/gateway/static/root/assets/cron-dreaming-jobs-nCMWCf0p.js +0 -1
  498. package/dist/gateway/static/root/assets/cron-page-D97nFqQD.js +0 -3
  499. package/dist/gateway/static/root/assets/dreaming-settings-Bceaw1PG.js +0 -1
  500. package/dist/gateway/static/root/assets/format-cron-label-BsotZDO5.js +0 -2
  501. package/dist/gateway/static/root/assets/format-interval-label-Dn_QKIqb.js +0 -1
  502. package/dist/gateway/static/root/assets/gateway-settings-iISWAZRm.js +0 -1
  503. package/dist/gateway/static/root/assets/goal-detail-page-DCUROLMQ.js +0 -1
  504. package/dist/gateway/static/root/assets/goals-settings-CPAuFwoD.js +0 -1
  505. package/dist/gateway/static/root/assets/heartbeat-config-api-D7bKFEeO.js +0 -1
  506. package/dist/gateway/static/root/assets/heartbeat-settings-CC69vNx0.js +0 -1
  507. package/dist/gateway/static/root/assets/index-CwhK8qCh.js +0 -122
  508. package/dist/gateway/static/root/assets/index-CyfhARL-.css +0 -1
  509. package/dist/gateway/static/root/assets/interval-presets-0DtsnxE0.js +0 -1
  510. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-BPREtN8B.js +0 -1
  511. package/dist/gateway/static/root/assets/messages-Cf1O9JB0.js +0 -3
  512. package/dist/gateway/static/root/assets/models-hub-panel-DmKiIihT.js +0 -2
  513. package/dist/gateway/static/root/assets/note-detail-page-CxxfLRJZ.js +0 -2
  514. package/dist/gateway/static/root/assets/notes-page-X2slSx7V.js +0 -1
  515. package/dist/gateway/static/root/assets/remote-access-hub-BvmUWqgu.js +0 -1
  516. package/dist/gateway/static/root/assets/schedule-field-CgJSCD3B.js +0 -1
  517. package/dist/gateway/static/root/assets/sessions-page-B0yESuuL.js +0 -1
  518. package/dist/gateway/static/root/assets/settings-advanced-gate-q2M8RKOo.js +0 -1
  519. package/dist/gateway/static/root/assets/settings-page-CGozabLD.js +0 -1
  520. package/dist/gateway/static/root/assets/setup-status-panel-FoOSe6nU.js +0 -1
  521. package/dist/gateway/static/root/assets/shares-settings-Cy5zWyYQ.js +0 -1
  522. package/dist/gateway/static/root/assets/skill-reload-api-DaZNFro9.js +0 -1
  523. package/dist/gateway/static/root/assets/skills-page-CnwtUzvw.js +0 -2
  524. package/dist/gateway/static/root/assets/system-settings-panel-DXs2VmBt.js +0 -1
  525. package/dist/gateway/static/root/assets/typed-models-lib-4gPuydz_.js +0 -1
  526. package/dist/gateway/static/root/assets/voice-api-key-field-DvKiOglO.js +0 -1
  527. package/dist/gateway/static/root/assets/workflows-page-CAVZcONQ.js +0 -18
  528. package/dist/src/agent/context/workspace-templates/USER.md +0 -24
  529. package/dist/src/agent/fallback/error.d.ts +0 -22
  530. package/dist/src/agent/fallback/error.js +0 -32
  531. package/dist/src/agent/fallback/error.js.map +0 -1
  532. package/dist/src/agent/fallback/index.d.ts +0 -5
  533. package/dist/src/agent/fallback/index.js +0 -9
  534. package/dist/src/agent/fallback/index.js.map +0 -1
  535. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +0 -29
  536. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +0 -76
  537. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +0 -1
  538. package/dist/src/agent/service/reconcile-dreaming-cron.d.ts +0 -6
  539. package/dist/src/agent/service/reconcile-dreaming-cron.js +0 -84
  540. package/dist/src/agent/service/reconcile-dreaming-cron.js.map +0 -1
  541. package/dist/src/agent/tools/cronjob-tool.d.ts +0 -29
  542. package/dist/src/agent/tools/cronjob-tool.js +0 -274
  543. package/dist/src/agent/tools/cronjob-tool.js.map +0 -1
  544. package/dist/src/cli/commands/cron-cli.d.ts +0 -2
  545. package/dist/src/cli/commands/cron-cli.js +0 -15
  546. package/dist/src/cli/commands/cron-cli.js.map +0 -1
  547. package/dist/src/cli/commands/cron.d.ts +0 -4
  548. package/dist/src/cli/commands/cron.js +0 -188
  549. package/dist/src/cli/commands/cron.js.map +0 -1
  550. package/dist/src/cli/commands/doctor/checks/cron-health.js +0 -35
  551. package/dist/src/cli/commands/doctor/checks/cron-health.js.map +0 -1
  552. package/dist/src/cron/execution-types.d.ts +0 -42
  553. package/dist/src/cron/executor.d.ts +0 -67
  554. package/dist/src/cron/executor.js +0 -669
  555. package/dist/src/cron/executor.js.map +0 -1
  556. package/dist/src/cron/index.d.ts +0 -7
  557. package/dist/src/cron/index.js +0 -7
  558. package/dist/src/cron/job-content.d.ts +0 -5
  559. package/dist/src/cron/job-content.js +0 -15
  560. package/dist/src/cron/job-content.js.map +0 -1
  561. package/dist/src/cron/run-log-store.d.ts +0 -12
  562. package/dist/src/cron/run-log-store.js +0 -58
  563. package/dist/src/cron/run-log-store.js.map +0 -1
  564. package/dist/src/cron/schedule.d.ts +0 -10
  565. package/dist/src/cron/schedule.js +0 -85
  566. package/dist/src/cron/schedule.js.map +0 -1
  567. package/dist/src/cron/service.d.ts +0 -58
  568. package/dist/src/cron/service.js +0 -419
  569. package/dist/src/cron/service.js.map +0 -1
  570. package/dist/src/cron/types.d.ts +0 -183
  571. package/dist/src/cron/validation.d.ts +0 -500
  572. package/dist/src/cron/validation.js +0 -192
  573. package/dist/src/cron/validation.js.map +0 -1
  574. package/dist/src/cron/workflow-run-completion.d.ts +0 -23
  575. package/dist/src/cron/workflow-run-completion.js +0 -72
  576. package/dist/src/cron/workflow-run-completion.js.map +0 -1
  577. package/dist/src/extensions/types/phase4.js +0 -1
  578. package/dist/src/gateway/hono/routes/cron.d.ts +0 -3
  579. package/dist/src/gateway/hono/routes/cron.js +0 -109
  580. package/dist/src/gateway/hono/routes/cron.js.map +0 -1
  581. package/dist/src/storage/sqlite/cron-job-repository.d.ts +0 -6
  582. package/dist/src/storage/sqlite/cron-job-repository.js +0 -70
  583. package/dist/src/storage/sqlite/cron-job-repository.js.map +0 -1
  584. package/dist/src/storage/sqlite/cron-run-repository.d.ts +0 -5
  585. package/dist/src/storage/sqlite/cron-run-repository.js +0 -96
  586. package/dist/src/storage/sqlite/cron-run-repository.js.map +0 -1
  587. /package/dist/src/{cron → automations/domain}/types.js +0 -0
  588. /package/dist/src/{config/defaults.d.ts → automations/draft/automation-draft.types.js} +0 -0
  589. /package/dist/src/{config/defaults.js → extensions/types/registration.js} +0 -0
  590. /package/dist/src/{cron/execution-types.js → migrations/types.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"thinking.js","names":[],"sources":["../../../../src/chat-commands/builtins/thinking.ts"],"sourcesContent":["/**\n * Thinking Commands\n * \n * Built-in commands for thinking ability management:\n * - /think - Set thinking level\n * - /reasoning - Set reasoning visibility\n * - /verbose - Set verbose mode\n * - /status - Show current status (including thinking/reasoning/verbose)\n */\n\nimport type { CommandDefinition, CommandContext } from '../types.js';\nimport { commandRegistry } from '../registry.js';\nimport {\n normalizeThinkLevel,\n normalizeReasoningLevel,\n normalizeVerboseLevel,\n formatThinkingLevels,\n type ThinkLevel,\n type ReasoningLevel,\n type VerboseLevel,\n} from '../../agent/transcript/thinking-types.js';\nimport type { SessionConfigStore } from '../../session/index.js';\n\nasync function _stripSessionAgentFields(\n store: SessionConfigStore | undefined,\n sessionKey: string,\n fields: Array<'thinkingLevel' | 'reasoningLevel' | 'verboseLevel'>,\n): Promise<void> {\n if (!store) return;\n const existing = await store.get(sessionKey);\n if (!existing) return;\n const next = { ...existing };\n for (const f of fields) {\n delete next[f];\n }\n const restKeys = Object.keys(next).filter((k) => k !== 'updatedAt');\n if (restKeys.length === 0) {\n await store.delete(sessionKey);\n } else {\n await store.set(sessionKey, next);\n }\n}\n\nasync function setSessionAgentField<K extends 'thinkingLevel' | 'reasoningLevel' | 'verboseLevel'>(\n store: SessionConfigStore | undefined,\n sessionKey: string,\n field: K,\n value: K extends 'thinkingLevel' ? ThinkLevel : K extends 'reasoningLevel' ? ReasoningLevel : VerboseLevel,\n): Promise<void> {\n if (!store) return;\n const existing = (await store.get(sessionKey)) ?? {};\n await store.set(sessionKey, { ...existing, [field]: value });\n}\n\n// Think command\nconst thinkCommand: CommandDefinition = {\n id: 'agent.think',\n name: 'think',\n description: 'Set thinking level (usage: /think <level>)',\n category: 'model',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: ['/think', '/think high', '/think off', '/think adaptive'],\n handler: async (ctx: CommandContext, args: string) => {\n await ctx.setTyping(true);\n\n if (!args.trim()) {\n // Show current thinking level\n const currentLevel = await ctx.getThinkingLevel?.();\n \n return {\n content: `🧠 *Thinking Level*\\n\\n` +\n `Current: *${currentLevel || 'default'}*\\n\\n` +\n `Available levels:\\n` +\n `• off - No thinking\\n` +\n `• minimal - Minimal thinking\\n` +\n `• low - Low thinking\\n` +\n `• medium - Medium thinking (default)\\n` +\n `• high - High thinking\\n` +\n `• xhigh - Extra high (certain models)\\n` +\n `• adaptive - Auto-adjust based on task\\n\\n` +\n `Usage: /think <level>\\n` +\n `Example: /think high`,\n success: true,\n };\n }\n \n // Parse and validate the level\n const level = normalizeThinkLevel(args.trim());\n if (!level) {\n const levels = formatThinkingLevels();\n return {\n content: `❌ Invalid thinking level: ${args}\\n\\n` +\n `Available levels: ${levels}\\n\\n` +\n `Usage: /think <level>\\n` +\n `Example: /think high`,\n success: false,\n };\n }\n \n await setSessionAgentField(ctx.getSessionConfigStore?.(), ctx.sessionKey, 'thinkingLevel', level);\n ctx.syncAgentThinkingLevel?.(level);\n\n const levelDescriptions: Record<ThinkLevel, string> = {\n off: 'No thinking',\n minimal: 'Minimal thinking effort',\n low: 'Low thinking effort',\n medium: 'Medium thinking effort',\n high: 'High thinking effort',\n xhigh: 'Extra high thinking effort',\n adaptive: 'Auto-adjust based on task complexity',\n };\n \n return {\n content: `🧠 *Thinking Level Set*\\n\\n` +\n `Level: *${level}*\\n` +\n `${levelDescriptions[level]}\\n\\n` +\n `Applies for this gateway process (until restart). Persists only if you use /config set.`,\n success: true,\n };\n },\n};\n\n// Reasoning command\nconst reasoningCommand: CommandDefinition = {\n id: 'agent.reasoning',\n name: 'reasoning',\n description: 'Set reasoning visibility (usage: /reasoning <mode>)',\n category: 'model',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: ['/reasoning', '/reasoning on', '/reasoning stream', '/reasoning off'],\n handler: async (ctx: CommandContext, args: string) => {\n await ctx.setTyping(true);\n\n if (!args.trim()) {\n // Show current reasoning level\n const currentLevel = await ctx.getReasoningLevel?.();\n \n return {\n content: `💭 *Reasoning Visibility*\\n\\n` +\n `Current: *${currentLevel || 'default'}*\\n\\n` +\n `Available modes:\\n` +\n `• off - Hide reasoning\\n` +\n `• on - Show reasoning after completion\\n` +\n `• stream - Stream reasoning in real-time\\n\\n` +\n `Usage: /reasoning <mode>\\n` +\n `Example: /reasoning stream`,\n success: true,\n };\n }\n \n // Parse and validate the level\n const level = normalizeReasoningLevel(args.trim());\n if (!level) {\n return {\n content: `❌ Invalid reasoning mode: ${args}\\n\\n` +\n `Available modes: off, on, stream\\n\\n` +\n `Usage: /reasoning <mode>\\n` +\n `Example: /reasoning stream`,\n success: false,\n };\n }\n \n await setSessionAgentField(ctx.getSessionConfigStore?.(), ctx.sessionKey, 'reasoningLevel', level);\n\n const modeDescriptions: Record<ReasoningLevel, string> = {\n off: 'Hide reasoning from user',\n on: 'Show reasoning after completion',\n stream: 'Stream reasoning in real-time',\n };\n \n return {\n content: `💭 *Reasoning Visibility Set*\\n\\n` +\n `Mode: *${level}*\\n` +\n `${modeDescriptions[level]}\\n\\n` +\n `Applies for this gateway process (until restart). Persists only if you use /config set.`,\n success: true,\n };\n },\n};\n\n// Verbose command\nconst verboseCommand: CommandDefinition = {\n id: 'agent.verbose',\n name: 'verbose',\n description: 'Toggle verbose mode (usage: /verbose [on|off|full])',\n category: 'model',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: ['/verbose', '/verbose on', '/verbose off', '/verbose full'],\n handler: async (ctx: CommandContext, args: string) => {\n await ctx.setTyping(true);\n\n if (!args.trim()) {\n // Toggle verbose mode\n const currentLevel = await ctx.getVerboseLevel?.();\n const newLevel: VerboseLevel = currentLevel === 'on' ? 'off' : 'on';\n\n await setSessionAgentField(ctx.getSessionConfigStore?.(), ctx.sessionKey, 'verboseLevel', newLevel);\n\n return {\n content: `📝 *Verbose Mode*\\n\\n` +\n `Mode: *${newLevel}*\\n\\n` +\n `${newLevel === 'on' ? 'Verbose output enabled (process lifetime).' : 'Verbose output disabled (process lifetime).'}`,\n success: true,\n };\n }\n \n // Parse and validate the level\n const level = normalizeVerboseLevel(args.trim());\n if (!level) {\n return {\n content: `❌ Invalid verbose mode: ${args}\\n\\n` +\n `Available modes: off, on, full\\n\\n` +\n `Usage: /verbose [mode]\\n` +\n `Example: /verbose on`,\n success: false,\n };\n }\n \n await setSessionAgentField(ctx.getSessionConfigStore?.(), ctx.sessionKey, 'verboseLevel', level);\n\n const modeDescriptions: Record<VerboseLevel, string> = {\n off: 'Minimal output',\n on: 'Normal verbose output',\n full: 'Full verbose output with all details',\n };\n\n return {\n content: `📝 *Verbose Mode Set*\\n\\n` +\n `Mode: *${level}*\\n` +\n `${modeDescriptions[level]}\\n\\n` +\n `Applies for this gateway process (until restart). Persists only if you use /config set.`,\n success: true,\n };\n },\n};\n\n// Status command - enhanced to show thinking/reasoning/verbose\nconst enhancedStatusCommand: CommandDefinition = {\n id: 'agent.status',\n name: 'status',\n description: 'Show current agent status including thinking settings',\n category: 'system',\n scope: ['global', 'private', 'group'],\n handler: async (ctx: CommandContext) => {\n await ctx.setTyping(true);\n\n const currentModel = ctx.getCurrentModel();\n const thinkingLevel = await ctx.getThinkingLevel?.();\n const reasoningLevel = await ctx.getReasoningLevel?.();\n const verboseLevel = await ctx.getVerboseLevel?.();\n const usage = await ctx.getUsage();\n \n // Build status message\n const lines = [\n '📊 *Agent Status*',\n '',\n `🤖 *Model:* \\`${currentModel}\\``,\n `🧠 *Thinking:* \\`${thinkingLevel || 'default'}\\``,\n `💭 *Reasoning:* \\`${reasoningLevel || 'default'}\\``,\n `📝 *Verbose:* \\`${verboseLevel || 'default'}\\``,\n '',\n '---',\n '',\n '📈 *Session Usage*',\n `💬 Messages: ${usage.messageCount}`,\n `📥 Prompt: ${usage.promptTokens.toLocaleString()} tokens`,\n `📤 Completion: ${usage.completionTokens.toLocaleString()} tokens`,\n `📊 Total: ${usage.totalTokens.toLocaleString()} tokens`,\n ];\n \n return {\n content: lines.join('\\n'),\n success: true,\n };\n },\n};\n\n// Register all thinking commands\nexport function registerThinkingCommands(): void {\n commandRegistry.register(thinkCommand);\n commandRegistry.register(reasoningCommand);\n commandRegistry.register(verboseCommand);\n commandRegistry.register(enhancedStatusCommand);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"thinking.js","names":[],"sources":["../../../../src/chat-commands/builtins/thinking.ts"],"sourcesContent":["/**\n * Thinking Commands\n * \n * Built-in commands for thinking ability management:\n * - /think - Set thinking level\n * - /reasoning - Set reasoning visibility\n * - /verbose - Set verbose mode\n * - /status - Show current status (including thinking/reasoning/verbose)\n */\n\nimport type { CommandDefinition, CommandContext } from '../types.js';\nimport { commandRegistry } from '../registry.js';\nimport {\n normalizeThinkLevel,\n normalizeReasoningLevel,\n normalizeVerboseLevel,\n formatThinkingLevels,\n type ThinkLevel,\n type ReasoningLevel,\n type VerboseLevel,\n} from '../../agent/transcript/thinking-types.js';\nimport type { SessionConfigStore } from '../../session/index.js';\n\nasync function setSessionAgentField<K extends 'thinkingLevel' | 'reasoningLevel' | 'verboseLevel'>(\n store: SessionConfigStore | undefined,\n sessionKey: string,\n field: K,\n value: K extends 'thinkingLevel' ? ThinkLevel : K extends 'reasoningLevel' ? ReasoningLevel : VerboseLevel,\n): Promise<void> {\n if (!store) return;\n const existing = (await store.get(sessionKey)) ?? {};\n await store.set(sessionKey, { ...existing, [field]: value });\n}\n\n// Think command\nconst thinkCommand: CommandDefinition = {\n id: 'agent.think',\n name: 'think',\n description: 'Set thinking level (usage: /think <level>)',\n category: 'model',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: ['/think', '/think high', '/think off', '/think adaptive'],\n handler: async (ctx: CommandContext, args: string) => {\n await ctx.setTyping(true);\n\n if (!args.trim()) {\n // Show current thinking level\n const currentLevel = await ctx.getThinkingLevel?.();\n \n return {\n content: `🧠 *Thinking Level*\\n\\n` +\n `Current: *${currentLevel || 'default'}*\\n\\n` +\n `Available levels:\\n` +\n `• off - No thinking\\n` +\n `• minimal - Minimal thinking\\n` +\n `• low - Low thinking\\n` +\n `• medium - Medium thinking (default)\\n` +\n `• high - High thinking\\n` +\n `• xhigh - Extra high (certain models)\\n` +\n `• adaptive - Auto-adjust based on task\\n\\n` +\n `Usage: /think <level>\\n` +\n `Example: /think high`,\n success: true,\n };\n }\n \n // Parse and validate the level\n const level = normalizeThinkLevel(args.trim());\n if (!level) {\n const levels = formatThinkingLevels();\n return {\n content: `❌ Invalid thinking level: ${args}\\n\\n` +\n `Available levels: ${levels}\\n\\n` +\n `Usage: /think <level>\\n` +\n `Example: /think high`,\n success: false,\n };\n }\n \n await setSessionAgentField(ctx.getSessionConfigStore?.(), ctx.sessionKey, 'thinkingLevel', level);\n ctx.syncAgentThinkingLevel?.(level);\n\n const levelDescriptions: Record<ThinkLevel, string> = {\n off: 'No thinking',\n minimal: 'Minimal thinking effort',\n low: 'Low thinking effort',\n medium: 'Medium thinking effort',\n high: 'High thinking effort',\n xhigh: 'Extra high thinking effort',\n adaptive: 'Auto-adjust based on task complexity',\n };\n \n return {\n content: `🧠 *Thinking Level Set*\\n\\n` +\n `Level: *${level}*\\n` +\n `${levelDescriptions[level]}\\n\\n` +\n `Applies for this gateway process (until restart). Persists only if you use /config set.`,\n success: true,\n };\n },\n};\n\n// Reasoning command\nconst reasoningCommand: CommandDefinition = {\n id: 'agent.reasoning',\n name: 'reasoning',\n description: 'Set reasoning visibility (usage: /reasoning <mode>)',\n category: 'model',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: ['/reasoning', '/reasoning on', '/reasoning stream', '/reasoning off'],\n handler: async (ctx: CommandContext, args: string) => {\n await ctx.setTyping(true);\n\n if (!args.trim()) {\n // Show current reasoning level\n const currentLevel = await ctx.getReasoningLevel?.();\n \n return {\n content: `💭 *Reasoning Visibility*\\n\\n` +\n `Current: *${currentLevel || 'default'}*\\n\\n` +\n `Available modes:\\n` +\n `• off - Hide reasoning\\n` +\n `• on - Show reasoning after completion\\n` +\n `• stream - Stream reasoning in real-time\\n\\n` +\n `Usage: /reasoning <mode>\\n` +\n `Example: /reasoning stream`,\n success: true,\n };\n }\n \n // Parse and validate the level\n const level = normalizeReasoningLevel(args.trim());\n if (!level) {\n return {\n content: `❌ Invalid reasoning mode: ${args}\\n\\n` +\n `Available modes: off, on, stream\\n\\n` +\n `Usage: /reasoning <mode>\\n` +\n `Example: /reasoning stream`,\n success: false,\n };\n }\n \n await setSessionAgentField(ctx.getSessionConfigStore?.(), ctx.sessionKey, 'reasoningLevel', level);\n\n const modeDescriptions: Record<ReasoningLevel, string> = {\n off: 'Hide reasoning from user',\n on: 'Show reasoning after completion',\n stream: 'Stream reasoning in real-time',\n };\n \n return {\n content: `💭 *Reasoning Visibility Set*\\n\\n` +\n `Mode: *${level}*\\n` +\n `${modeDescriptions[level]}\\n\\n` +\n `Applies for this gateway process (until restart). Persists only if you use /config set.`,\n success: true,\n };\n },\n};\n\n// Verbose command\nconst verboseCommand: CommandDefinition = {\n id: 'agent.verbose',\n name: 'verbose',\n description: 'Toggle verbose mode (usage: /verbose [on|off|full])',\n category: 'model',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: ['/verbose', '/verbose on', '/verbose off', '/verbose full'],\n handler: async (ctx: CommandContext, args: string) => {\n await ctx.setTyping(true);\n\n if (!args.trim()) {\n // Toggle verbose mode\n const currentLevel = await ctx.getVerboseLevel?.();\n const newLevel: VerboseLevel = currentLevel === 'on' ? 'off' : 'on';\n\n await setSessionAgentField(ctx.getSessionConfigStore?.(), ctx.sessionKey, 'verboseLevel', newLevel);\n\n return {\n content: `📝 *Verbose Mode*\\n\\n` +\n `Mode: *${newLevel}*\\n\\n` +\n `${newLevel === 'on' ? 'Verbose output enabled (process lifetime).' : 'Verbose output disabled (process lifetime).'}`,\n success: true,\n };\n }\n \n // Parse and validate the level\n const level = normalizeVerboseLevel(args.trim());\n if (!level) {\n return {\n content: `❌ Invalid verbose mode: ${args}\\n\\n` +\n `Available modes: off, on, full\\n\\n` +\n `Usage: /verbose [mode]\\n` +\n `Example: /verbose on`,\n success: false,\n };\n }\n \n await setSessionAgentField(ctx.getSessionConfigStore?.(), ctx.sessionKey, 'verboseLevel', level);\n\n const modeDescriptions: Record<VerboseLevel, string> = {\n off: 'Minimal output',\n on: 'Normal verbose output',\n full: 'Full verbose output with all details',\n };\n\n return {\n content: `📝 *Verbose Mode Set*\\n\\n` +\n `Mode: *${level}*\\n` +\n `${modeDescriptions[level]}\\n\\n` +\n `Applies for this gateway process (until restart). Persists only if you use /config set.`,\n success: true,\n };\n },\n};\n\n// Status command - enhanced to show thinking/reasoning/verbose\nconst enhancedStatusCommand: CommandDefinition = {\n id: 'agent.status',\n name: 'status',\n description: 'Show current agent status including thinking settings',\n category: 'system',\n scope: ['global', 'private', 'group'],\n handler: async (ctx: CommandContext) => {\n await ctx.setTyping(true);\n\n const currentModel = ctx.getCurrentModel();\n const thinkingLevel = await ctx.getThinkingLevel?.();\n const reasoningLevel = await ctx.getReasoningLevel?.();\n const verboseLevel = await ctx.getVerboseLevel?.();\n const usage = await ctx.getUsage();\n \n // Build status message\n const lines = [\n '📊 *Agent Status*',\n '',\n `🤖 *Model:* \\`${currentModel}\\``,\n `🧠 *Thinking:* \\`${thinkingLevel || 'default'}\\``,\n `💭 *Reasoning:* \\`${reasoningLevel || 'default'}\\``,\n `📝 *Verbose:* \\`${verboseLevel || 'default'}\\``,\n '',\n '---',\n '',\n '📈 *Session Usage*',\n `💬 Messages: ${usage.messageCount}`,\n `📥 Prompt: ${usage.promptTokens.toLocaleString()} tokens`,\n `📤 Completion: ${usage.completionTokens.toLocaleString()} tokens`,\n `📊 Total: ${usage.totalTokens.toLocaleString()} tokens`,\n ];\n \n return {\n content: lines.join('\\n'),\n success: true,\n };\n },\n};\n\n// Register all thinking commands\nexport function registerThinkingCommands(): void {\n commandRegistry.register(thinkCommand);\n commandRegistry.register(reasoningCommand);\n commandRegistry.register(verboseCommand);\n commandRegistry.register(enhancedStatusCommand);\n}\n"],"mappings":"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"}
@@ -36,45 +36,6 @@ const cliCommandCatalog = [
36
36
  commandPath: ["onboard"],
37
37
  policy: { loadExtensions: "never" }
38
38
  },
39
- {
40
- commandPath: ["cron"],
41
- policy: { loadExtensions: "never" }
42
- },
43
- {
44
- commandPath: ["cron", "list"],
45
- exact: true,
46
- policy: { loadExtensions: "never" }
47
- },
48
- {
49
- commandPath: ["cron", "add"],
50
- exact: true,
51
- policy: { loadExtensions: "never" }
52
- },
53
- {
54
- commandPath: ["cron", "remove"],
55
- exact: true,
56
- policy: { loadExtensions: "never" }
57
- },
58
- {
59
- commandPath: ["cron", "enable"],
60
- exact: true,
61
- policy: { loadExtensions: "never" }
62
- },
63
- {
64
- commandPath: ["cron", "disable"],
65
- exact: true,
66
- policy: { loadExtensions: "never" }
67
- },
68
- {
69
- commandPath: ["cron", "run"],
70
- exact: true,
71
- policy: { loadExtensions: "never" }
72
- },
73
- {
74
- commandPath: ["cron", "trigger"],
75
- exact: true,
76
- policy: { loadExtensions: "never" }
77
- },
78
39
  {
79
40
  commandPath: ["goal"],
80
41
  policy: { loadExtensions: "never" }
@@ -1 +1 @@
1
- {"version":3,"file":"command-catalog.js","names":[],"sources":["../../../src/cli/command-catalog.ts"],"sourcesContent":["export type CliExtensionLoadPolicy = 'never' | 'when-configured' | 'always';\nexport type CliGatewaySubcommandPolicy = 'lazy' | 'eager';\n\nexport type CliCommandPathPolicy = {\n loadExtensions: CliExtensionLoadPolicy;\n gatewaySubcommands: CliGatewaySubcommandPolicy;\n};\n\nexport type CliCommandCatalogEntry = {\n commandPath: readonly string[];\n exact?: boolean;\n policy?: Partial<CliCommandPathPolicy>;\n};\n\nexport const cliCommandCatalog: readonly CliCommandCatalogEntry[] = [\n { commandPath: ['init'], policy: { loadExtensions: 'never' } },\n { commandPath: ['profile'], policy: { loadExtensions: 'never' } },\n { commandPath: ['profile', 'list'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['profile', 'create'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['profile', 'delete'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['profile', 'switch'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['setup'], policy: { loadExtensions: 'never' } },\n { commandPath: ['onboard'], policy: { loadExtensions: 'never' } },\n { commandPath: ['cron'], policy: { loadExtensions: 'never' } },\n { commandPath: ['cron', 'list'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['cron', 'add'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['cron', 'remove'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['cron', 'enable'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['cron', 'disable'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['cron', 'run'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['cron', 'trigger'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal'], policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'list'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'new'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'show'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'pause'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'resume'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'archive'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'runs'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'checklist'], policy: { loadExtensions: 'never' } },\n { commandPath: ['config'], policy: { loadExtensions: 'never' } },\n { commandPath: ['doctor'], policy: { loadExtensions: 'never' } },\n { commandPath: ['models'], policy: { loadExtensions: 'never' } },\n { commandPath: ['providers'], policy: { loadExtensions: 'never' } },\n { commandPath: ['auth'], policy: { loadExtensions: 'never' } },\n { commandPath: ['logs'], policy: { loadExtensions: 'never' } },\n { commandPath: ['update'], policy: { loadExtensions: 'never' } },\n { commandPath: ['session'], policy: { loadExtensions: 'never' } },\n { commandPath: ['search'], policy: { loadExtensions: 'never' } },\n { commandPath: ['voice'], policy: { loadExtensions: 'never' } },\n { commandPath: ['image'], policy: { loadExtensions: 'never' } },\n { commandPath: ['skills'], policy: { loadExtensions: 'never' } },\n { commandPath: ['tailscale'], policy: { loadExtensions: 'never' } },\n { commandPath: ['tunnel'], policy: { loadExtensions: 'never' } },\n { commandPath: ['browser'], policy: { loadExtensions: 'never' } },\n { commandPath: ['tui'], policy: { loadExtensions: 'when-configured' } },\n { commandPath: ['agent'], policy: { loadExtensions: 'when-configured' } },\n { commandPath: ['channels'], policy: { loadExtensions: 'always' } },\n { commandPath: ['extensions'], policy: { loadExtensions: 'always' } },\n { commandPath: ['agents'], policy: { loadExtensions: 'when-configured' } },\n {\n commandPath: ['gateway'],\n exact: true,\n policy: { loadExtensions: 'never', gatewaySubcommands: 'lazy' },\n },\n { commandPath: ['gateway', 'token'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'status'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'health'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'call'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'probe'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'stop'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'restart'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'logs'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'install'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'uninstall'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'start'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'status'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'stop'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'restart'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'ssh-tunnel'], exact: true, policy: { loadExtensions: 'never' } },\n];\n"],"mappings":"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"}
1
+ {"version":3,"file":"command-catalog.js","names":[],"sources":["../../../src/cli/command-catalog.ts"],"sourcesContent":["export type CliExtensionLoadPolicy = 'never' | 'when-configured' | 'always';\nexport type CliGatewaySubcommandPolicy = 'lazy' | 'eager';\n\nexport type CliCommandPathPolicy = {\n loadExtensions: CliExtensionLoadPolicy;\n gatewaySubcommands: CliGatewaySubcommandPolicy;\n};\n\nexport type CliCommandCatalogEntry = {\n commandPath: readonly string[];\n exact?: boolean;\n policy?: Partial<CliCommandPathPolicy>;\n};\n\nexport const cliCommandCatalog: readonly CliCommandCatalogEntry[] = [\n { commandPath: ['init'], policy: { loadExtensions: 'never' } },\n { commandPath: ['profile'], policy: { loadExtensions: 'never' } },\n { commandPath: ['profile', 'list'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['profile', 'create'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['profile', 'delete'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['profile', 'switch'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['setup'], policy: { loadExtensions: 'never' } },\n { commandPath: ['onboard'], policy: { loadExtensions: 'never' } },\n { commandPath: ['goal'], policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'list'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'new'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'show'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'pause'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'resume'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'archive'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'runs'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'checklist'], policy: { loadExtensions: 'never' } },\n { commandPath: ['config'], policy: { loadExtensions: 'never' } },\n { commandPath: ['doctor'], policy: { loadExtensions: 'never' } },\n { commandPath: ['models'], policy: { loadExtensions: 'never' } },\n { commandPath: ['providers'], policy: { loadExtensions: 'never' } },\n { commandPath: ['auth'], policy: { loadExtensions: 'never' } },\n { commandPath: ['logs'], policy: { loadExtensions: 'never' } },\n { commandPath: ['update'], policy: { loadExtensions: 'never' } },\n { commandPath: ['session'], policy: { loadExtensions: 'never' } },\n { commandPath: ['search'], policy: { loadExtensions: 'never' } },\n { commandPath: ['voice'], policy: { loadExtensions: 'never' } },\n { commandPath: ['image'], policy: { loadExtensions: 'never' } },\n { commandPath: ['skills'], policy: { loadExtensions: 'never' } },\n { commandPath: ['tailscale'], policy: { loadExtensions: 'never' } },\n { commandPath: ['tunnel'], policy: { loadExtensions: 'never' } },\n { commandPath: ['browser'], policy: { loadExtensions: 'never' } },\n { commandPath: ['tui'], policy: { loadExtensions: 'when-configured' } },\n { commandPath: ['agent'], policy: { loadExtensions: 'when-configured' } },\n { commandPath: ['channels'], policy: { loadExtensions: 'always' } },\n { commandPath: ['extensions'], policy: { loadExtensions: 'always' } },\n { commandPath: ['agents'], policy: { loadExtensions: 'when-configured' } },\n {\n commandPath: ['gateway'],\n exact: true,\n policy: { loadExtensions: 'never', gatewaySubcommands: 'lazy' },\n },\n { commandPath: ['gateway', 'token'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'status'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'health'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'call'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'probe'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'stop'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'restart'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'logs'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'install'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'uninstall'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'start'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'status'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'stop'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'restart'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'ssh-tunnel'], exact: true, policy: { loadExtensions: 'never' } },\n];\n"],"mappings":"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"}
@@ -12,7 +12,6 @@ const REGISTRY_COMMAND_MODULES = {
12
12
  gateway: () => import("./commands/gateway.js"),
13
13
  session: () => import("./commands/session.js"),
14
14
  goal: () => import("./commands/goal.js"),
15
- cron: () => import("./commands/cron.js"),
16
15
  config: () => import("./commands/config.js"),
17
16
  doctor: () => import("./commands/doctor/index.js"),
18
17
  image: () => import("./commands/image.js"),
@@ -1 +1 @@
1
- {"version":3,"file":"command-loaders.js","names":[],"sources":["../../../src/cli/command-loaders.ts"],"sourcesContent":["/**\n * Lazy command loaders.\n *\n * Modules here trigger their `register({...})` side effect on import; the\n * caller then mounts the requested command via `registry.installOne` (or via\n * the explicit registrar functions for non-registry commands).\n *\n * Keeping this map static-but-thunked means `bin.ts` short-circuits and\n * `runCli` can resolve a single subcommand without paying for unrelated\n * command modules.\n */\nimport type { Command } from 'commander';\nimport { resolveCliCatalogCommandPath } from './command-path-policy.js';\nimport { shouldLoadExtensionCliForCommandPath } from './command-startup-policy.js';\nimport { registry, type CLIContext } from './registry.js';\n\nexport type CommandLoader = () => Promise<unknown>;\n\nexport const REGISTRY_COMMAND_MODULES: Record<string, CommandLoader> = {\n init: () => import('./commands/init.js'),\n profile: () => import('./commands/profile.js'),\n setup: () => import('./commands/setup.js'),\n onboard: () => import('./commands/onboard.js'),\n agent: () => import('./commands/agent.js'),\n tui: () => import('./commands/tui.js'),\n gateway: () => import('./commands/gateway.js'),\n session: () => import('./commands/session.js'),\n goal: () => import('./commands/goal.js'),\n cron: () => import('./commands/cron.js'),\n config: () => import('./commands/config.js'),\n doctor: () => import('./commands/doctor/index.js'),\n image: () => import('./commands/image.js'),\n channels: () => import('./commands/channels.js'),\n models: () => import('./commands/models.js'),\n providers: () => import('./commands/providers.js'),\n voice: () => import('./commands/voice.js'),\n search: () => import('./commands/search.js'),\n auth: () => import('./commands/auth.js'),\n skills: () => import('./commands/skills.js'),\n browser: () => import('./commands/browser.js'),\n update: () => import('./commands/update.js'),\n logs: () => import('./commands/logs.js'),\n tunnel: () => import('./commands/tunnel.js'),\n tailscale: () => import('./commands/tailscale.js'),\n};\n\nexport interface NonRegistryMatcher {\n matches: (name: string) => boolean;\n load: (program: Command) => Promise<void>;\n}\n\nexport const NON_REGISTRY_COMMAND_MATCHERS: NonRegistryMatcher[] = [\n {\n matches: (name) => name === 'agents' || name.startsWith('agents:'),\n load: async (program) => {\n const { registerAgentsCli } = await import('./commands/agents.js');\n registerAgentsCli(program);\n },\n },\n {\n matches: (name) => name === 'extensions',\n load: async (program) => {\n const { registerExtensionCommands } = await import('./commands/extension.js');\n registerExtensionCommands(program);\n const commandPath = resolveCliCatalogCommandPath(process.argv);\n if (shouldLoadExtensionCliForCommandPath(commandPath)) {\n const { registerExtensionCliCommands } = await import('./extension-cli-register.js');\n await registerExtensionCliCommands(program);\n }\n },\n },\n];\n\nconst FLAGS_WITH_VALUE = new Set(['--config', '--workspace']);\n\n/**\n * Resolve which command module to load based on argv. Skips global flags\n * (`--verbose`/`--config <path>`/`--workspace <path>`) and treats\n * `help <cmd>` as if the user had typed `<cmd>`, so that `xopc help gateway`\n * loads only the gateway module.\n */\nexport function resolveCommandName(argv: string[]): string | undefined {\n let i = 2;\n let firstSubcommand: string | undefined;\n while (i < argv.length) {\n const arg = argv[i];\n if (!arg) {\n i += 1;\n continue;\n }\n if (arg.startsWith('-')) {\n i += FLAGS_WITH_VALUE.has(arg) ? 2 : 1;\n continue;\n }\n if (firstSubcommand === undefined) {\n firstSubcommand = arg;\n if (arg === 'help') {\n i += 1;\n continue;\n }\n return arg;\n }\n return arg;\n }\n return firstSubcommand;\n}\n\nexport async function tryLoadCommand(\n program: Command,\n ctx: CLIContext,\n name: string,\n getCtx?: () => CLIContext,\n): Promise<boolean> {\n const moduleLoader = REGISTRY_COMMAND_MODULES[name];\n if (moduleLoader) {\n await moduleLoader();\n const installed = registry.installOne(program, name, ctx, getCtx);\n if (installed && name === 'gateway') {\n const gatewayCmd = program.commands.find((command) => command.name() === 'gateway');\n if (gatewayCmd) {\n const { prepareGatewayCommandForArgv } = await import('./commands/gateway.js');\n await prepareGatewayCommandForArgv(gatewayCmd, ctx);\n }\n }\n return installed;\n }\n const matcher = NON_REGISTRY_COMMAND_MATCHERS.find((m) => m.matches(name));\n if (matcher) {\n await matcher.load(program);\n return true;\n }\n return false;\n}\n\nexport async function loadAllCommands(\n program: Command,\n ctx: CLIContext,\n getCtx?: () => CLIContext,\n): Promise<void> {\n // Sequential to keep registration order deterministic; registry.install\n // sorts by category and is stable within a category.\n for (const loader of Object.values(REGISTRY_COMMAND_MODULES)) {\n await loader();\n }\n registry.install(program, ctx, getCtx);\n for (const matcher of NON_REGISTRY_COMMAND_MATCHERS) {\n await matcher.load(program);\n }\n const gatewayCmd = program.commands.find((command) => command.name() === 'gateway');\n if (gatewayCmd) {\n const { prepareGatewayCommandForArgv } = await import('./commands/gateway.js');\n await prepareGatewayCommandForArgv(gatewayCmd, ctx);\n }\n}\n"],"mappings":";;;;AAkBA,MAAa,2BAA0D;CACrE,YAAY,OAAO;CACnB,eAAe,OAAO;CACtB,aAAa,OAAO;CACpB,eAAe,OAAO;CACtB,aAAa,OAAO;CACpB,WAAW,OAAO;CAClB,eAAe,OAAO;CACtB,eAAe,OAAO;CACtB,YAAY,OAAO;CACnB,YAAY,OAAO;CACnB,cAAc,OAAO;CACrB,cAAc,OAAO;CACrB,aAAa,OAAO;CACpB,gBAAgB,OAAO;CACvB,cAAc,OAAO;CACrB,iBAAiB,OAAO;CACxB,aAAa,OAAO;CACpB,cAAc,OAAO;CACrB,YAAY,OAAO;CACnB,cAAc,OAAO;CACrB,eAAe,OAAO;CACtB,cAAc,OAAO;CACrB,YAAY,OAAO;CACnB,cAAc,OAAO;CACrB,iBAAiB,OAAO;CACzB;AAOD,MAAa,gCAAsD,CACjE;CACE,UAAU,SAAS,SAAS,YAAY,KAAK,WAAW,UAAU;CAClE,MAAM,OAAO,YAAY;EACvB,MAAM,EAAE,sBAAsB,MAAM,OAAO;AAC3C,oBAAkB,QAAQ;;CAE7B,EACD;CACE,UAAU,SAAS,SAAS;CAC5B,MAAM,OAAO,YAAY;EACvB,MAAM,EAAE,8BAA8B,MAAM,OAAO;AACnD,4BAA0B,QAAQ;AAElC,MAAI,qCADgB,6BAA6B,QAAQ,KACL,CAAC,EAAE;GACrD,MAAM,EAAE,iCAAiC,MAAM,OAAO;AACtD,SAAM,6BAA6B,QAAQ;;;CAGhD,CACF;AAED,MAAM,mBAAmB,IAAI,IAAI,CAAC,YAAY,cAAc,CAAC;;;;;;;AAQ7D,SAAgB,mBAAmB,MAAoC;CACrE,IAAI,IAAI;CACR,IAAI;AACJ,QAAO,IAAI,KAAK,QAAQ;EACtB,MAAM,MAAM,KAAK;AACjB,MAAI,CAAC,KAAK;AACR,QAAK;AACL;;AAEF,MAAI,IAAI,WAAW,IAAI,EAAE;AACvB,QAAK,iBAAiB,IAAI,IAAI,GAAG,IAAI;AACrC;;AAEF,MAAI,oBAAoB,KAAA,GAAW;AACjC,qBAAkB;AAClB,OAAI,QAAQ,QAAQ;AAClB,SAAK;AACL;;AAEF,UAAO;;AAET,SAAO;;AAET,QAAO;;AAGT,eAAsB,eACpB,SACA,KACA,MACA,QACkB;CAClB,MAAM,eAAe,yBAAyB;AAC9C,KAAI,cAAc;AAChB,QAAM,cAAc;EACpB,MAAM,YAAY,SAAS,WAAW,SAAS,MAAM,KAAK,OAAO;AACjE,MAAI,aAAa,SAAS,WAAW;GACnC,MAAM,aAAa,QAAQ,SAAS,MAAM,YAAY,QAAQ,MAAM,KAAK,UAAU;AACnF,OAAI,YAAY;IACd,MAAM,EAAE,iCAAiC,MAAM,OAAO;AACtD,UAAM,6BAA6B,YAAY,IAAI;;;AAGvD,SAAO;;CAET,MAAM,UAAU,8BAA8B,MAAM,MAAM,EAAE,QAAQ,KAAK,CAAC;AAC1E,KAAI,SAAS;AACX,QAAM,QAAQ,KAAK,QAAQ;AAC3B,SAAO;;AAET,QAAO;;AAGT,eAAsB,gBACpB,SACA,KACA,QACe;AAGf,MAAK,MAAM,UAAU,OAAO,OAAO,yBAAyB,CAC1D,OAAM,QAAQ;AAEhB,UAAS,QAAQ,SAAS,KAAK,OAAO;AACtC,MAAK,MAAM,WAAW,8BACpB,OAAM,QAAQ,KAAK,QAAQ;CAE7B,MAAM,aAAa,QAAQ,SAAS,MAAM,YAAY,QAAQ,MAAM,KAAK,UAAU;AACnF,KAAI,YAAY;EACd,MAAM,EAAE,iCAAiC,MAAM,OAAO;AACtD,QAAM,6BAA6B,YAAY,IAAI"}
1
+ {"version":3,"file":"command-loaders.js","names":[],"sources":["../../../src/cli/command-loaders.ts"],"sourcesContent":["/**\n * Lazy command loaders.\n *\n * Modules here trigger their `register({...})` side effect on import; the\n * caller then mounts the requested command via `registry.installOne` (or via\n * the explicit registrar functions for non-registry commands).\n *\n * Keeping this map static-but-thunked means `bin.ts` short-circuits and\n * `runCli` can resolve a single subcommand without paying for unrelated\n * command modules.\n */\nimport type { Command } from 'commander';\nimport { resolveCliCatalogCommandPath } from './command-path-policy.js';\nimport { shouldLoadExtensionCliForCommandPath } from './command-startup-policy.js';\nimport { registry, type CLIContext } from './registry.js';\n\nexport type CommandLoader = () => Promise<unknown>;\n\nexport const REGISTRY_COMMAND_MODULES: Record<string, CommandLoader> = {\n init: () => import('./commands/init.js'),\n profile: () => import('./commands/profile.js'),\n setup: () => import('./commands/setup.js'),\n onboard: () => import('./commands/onboard.js'),\n agent: () => import('./commands/agent.js'),\n tui: () => import('./commands/tui.js'),\n gateway: () => import('./commands/gateway.js'),\n session: () => import('./commands/session.js'),\n goal: () => import('./commands/goal.js'),\n config: () => import('./commands/config.js'),\n doctor: () => import('./commands/doctor/index.js'),\n image: () => import('./commands/image.js'),\n channels: () => import('./commands/channels.js'),\n models: () => import('./commands/models.js'),\n providers: () => import('./commands/providers.js'),\n voice: () => import('./commands/voice.js'),\n search: () => import('./commands/search.js'),\n auth: () => import('./commands/auth.js'),\n skills: () => import('./commands/skills.js'),\n browser: () => import('./commands/browser.js'),\n update: () => import('./commands/update.js'),\n logs: () => import('./commands/logs.js'),\n tunnel: () => import('./commands/tunnel.js'),\n tailscale: () => import('./commands/tailscale.js'),\n};\n\nexport interface NonRegistryMatcher {\n matches: (name: string) => boolean;\n load: (program: Command) => Promise<void>;\n}\n\nexport const NON_REGISTRY_COMMAND_MATCHERS: NonRegistryMatcher[] = [\n {\n matches: (name) => name === 'agents' || name.startsWith('agents:'),\n load: async (program) => {\n const { registerAgentsCli } = await import('./commands/agents.js');\n registerAgentsCli(program);\n },\n },\n {\n matches: (name) => name === 'extensions',\n load: async (program) => {\n const { registerExtensionCommands } = await import('./commands/extension.js');\n registerExtensionCommands(program);\n const commandPath = resolveCliCatalogCommandPath(process.argv);\n if (shouldLoadExtensionCliForCommandPath(commandPath)) {\n const { registerExtensionCliCommands } = await import('./extension-cli-register.js');\n await registerExtensionCliCommands(program);\n }\n },\n },\n];\n\nconst FLAGS_WITH_VALUE = new Set(['--config', '--workspace']);\n\n/**\n * Resolve which command module to load based on argv. Skips global flags\n * (`--verbose`/`--config <path>`/`--workspace <path>`) and treats\n * `help <cmd>` as if the user had typed `<cmd>`, so that `xopc help gateway`\n * loads only the gateway module.\n */\nexport function resolveCommandName(argv: string[]): string | undefined {\n let i = 2;\n let firstSubcommand: string | undefined;\n while (i < argv.length) {\n const arg = argv[i];\n if (!arg) {\n i += 1;\n continue;\n }\n if (arg.startsWith('-')) {\n i += FLAGS_WITH_VALUE.has(arg) ? 2 : 1;\n continue;\n }\n if (firstSubcommand === undefined) {\n firstSubcommand = arg;\n if (arg === 'help') {\n i += 1;\n continue;\n }\n return arg;\n }\n return arg;\n }\n return firstSubcommand;\n}\n\nexport async function tryLoadCommand(\n program: Command,\n ctx: CLIContext,\n name: string,\n getCtx?: () => CLIContext,\n): Promise<boolean> {\n const moduleLoader = REGISTRY_COMMAND_MODULES[name];\n if (moduleLoader) {\n await moduleLoader();\n const installed = registry.installOne(program, name, ctx, getCtx);\n if (installed && name === 'gateway') {\n const gatewayCmd = program.commands.find((command) => command.name() === 'gateway');\n if (gatewayCmd) {\n const { prepareGatewayCommandForArgv } = await import('./commands/gateway.js');\n await prepareGatewayCommandForArgv(gatewayCmd, ctx);\n }\n }\n return installed;\n }\n const matcher = NON_REGISTRY_COMMAND_MATCHERS.find((m) => m.matches(name));\n if (matcher) {\n await matcher.load(program);\n return true;\n }\n return false;\n}\n\nexport async function loadAllCommands(\n program: Command,\n ctx: CLIContext,\n getCtx?: () => CLIContext,\n): Promise<void> {\n // Sequential to keep registration order deterministic; registry.install\n // sorts by category and is stable within a category.\n for (const loader of Object.values(REGISTRY_COMMAND_MODULES)) {\n await loader();\n }\n registry.install(program, ctx, getCtx);\n for (const matcher of NON_REGISTRY_COMMAND_MATCHERS) {\n await matcher.load(program);\n }\n const gatewayCmd = program.commands.find((command) => command.name() === 'gateway');\n if (gatewayCmd) {\n const { prepareGatewayCommandForArgv } = await import('./commands/gateway.js');\n await prepareGatewayCommandForArgv(gatewayCmd, ctx);\n }\n}\n"],"mappings":";;;;AAkBA,MAAa,2BAA0D;CACrE,YAAY,OAAO;CACnB,eAAe,OAAO;CACtB,aAAa,OAAO;CACpB,eAAe,OAAO;CACtB,aAAa,OAAO;CACpB,WAAW,OAAO;CAClB,eAAe,OAAO;CACtB,eAAe,OAAO;CACtB,YAAY,OAAO;CACnB,cAAc,OAAO;CACrB,cAAc,OAAO;CACrB,aAAa,OAAO;CACpB,gBAAgB,OAAO;CACvB,cAAc,OAAO;CACrB,iBAAiB,OAAO;CACxB,aAAa,OAAO;CACpB,cAAc,OAAO;CACrB,YAAY,OAAO;CACnB,cAAc,OAAO;CACrB,eAAe,OAAO;CACtB,cAAc,OAAO;CACrB,YAAY,OAAO;CACnB,cAAc,OAAO;CACrB,iBAAiB,OAAO;CACzB;AAOD,MAAa,gCAAsD,CACjE;CACE,UAAU,SAAS,SAAS,YAAY,KAAK,WAAW,UAAU;CAClE,MAAM,OAAO,YAAY;EACvB,MAAM,EAAE,sBAAsB,MAAM,OAAO;AAC3C,oBAAkB,QAAQ;;CAE7B,EACD;CACE,UAAU,SAAS,SAAS;CAC5B,MAAM,OAAO,YAAY;EACvB,MAAM,EAAE,8BAA8B,MAAM,OAAO;AACnD,4BAA0B,QAAQ;AAElC,MAAI,qCADgB,6BAA6B,QAAQ,KACL,CAAC,EAAE;GACrD,MAAM,EAAE,iCAAiC,MAAM,OAAO;AACtD,SAAM,6BAA6B,QAAQ;;;CAGhD,CACF;AAED,MAAM,mBAAmB,IAAI,IAAI,CAAC,YAAY,cAAc,CAAC;;;;;;;AAQ7D,SAAgB,mBAAmB,MAAoC;CACrE,IAAI,IAAI;CACR,IAAI;AACJ,QAAO,IAAI,KAAK,QAAQ;EACtB,MAAM,MAAM,KAAK;AACjB,MAAI,CAAC,KAAK;AACR,QAAK;AACL;;AAEF,MAAI,IAAI,WAAW,IAAI,EAAE;AACvB,QAAK,iBAAiB,IAAI,IAAI,GAAG,IAAI;AACrC;;AAEF,MAAI,oBAAoB,KAAA,GAAW;AACjC,qBAAkB;AAClB,OAAI,QAAQ,QAAQ;AAClB,SAAK;AACL;;AAEF,UAAO;;AAET,SAAO;;AAET,QAAO;;AAGT,eAAsB,eACpB,SACA,KACA,MACA,QACkB;CAClB,MAAM,eAAe,yBAAyB;AAC9C,KAAI,cAAc;AAChB,QAAM,cAAc;EACpB,MAAM,YAAY,SAAS,WAAW,SAAS,MAAM,KAAK,OAAO;AACjE,MAAI,aAAa,SAAS,WAAW;GACnC,MAAM,aAAa,QAAQ,SAAS,MAAM,YAAY,QAAQ,MAAM,KAAK,UAAU;AACnF,OAAI,YAAY;IACd,MAAM,EAAE,iCAAiC,MAAM,OAAO;AACtD,UAAM,6BAA6B,YAAY,IAAI;;;AAGvD,SAAO;;CAET,MAAM,UAAU,8BAA8B,MAAM,MAAM,EAAE,QAAQ,KAAK,CAAC;AAC1E,KAAI,SAAS;AACX,QAAM,QAAQ,KAAK,QAAQ;AAC3B,SAAO;;AAET,QAAO;;AAGT,eAAsB,gBACpB,SACA,KACA,QACe;AAGf,MAAK,MAAM,UAAU,OAAO,OAAO,yBAAyB,CAC1D,OAAM,QAAQ;AAEhB,UAAS,QAAQ,SAAS,KAAK,OAAO;AACtC,MAAK,MAAM,WAAW,8BACpB,OAAM,QAAQ,KAAK,QAAQ;CAE7B,MAAM,aAAa,QAAQ,SAAS,MAAM,YAAY,QAAQ,MAAM,KAAK,UAAU;AACnF,KAAI,YAAY;EACd,MAAM,EAAE,iCAAiC,MAAM,OAAO;AACtD,QAAM,6BAA6B,YAAY,IAAI"}
@@ -6,7 +6,7 @@ export type RootHelpCommand = {
6
6
  name: string;
7
7
  description: string;
8
8
  };
9
- export declare const ROOT_COMMAND_DESCRIPTION = "Ultra-Lightweight Personal AI Assistant";
9
+ export declare const ROOT_COMMAND_DESCRIPTION = "Ultra-Lightweight Personal AI Assistant. Run `xopc` with no command to open the local TUI.";
10
10
  export declare const ROOT_HELP_OPTIONS: RootHelpOption[];
11
11
  export declare const ROOT_HELP_COMMANDS: RootHelpCommand[];
12
12
  export declare function formatRootHelp(): string;
@@ -1,5 +1,5 @@
1
1
  //#region src/cli/command-manifest.ts
2
- const ROOT_COMMAND_DESCRIPTION = "Ultra-Lightweight Personal AI Assistant";
2
+ const ROOT_COMMAND_DESCRIPTION = "Ultra-Lightweight Personal AI Assistant. Run `xopc` with no command to open the local TUI.";
3
3
  const ROOT_HELP_OPTIONS = [
4
4
  {
5
5
  flags: "-V, --version",
@@ -79,10 +79,6 @@ const ROOT_HELP_COMMANDS = [
79
79
  name: "logs",
80
80
  description: "Manage and query logs"
81
81
  },
82
- {
83
- name: "cron",
84
- description: "Manage scheduled tasks"
85
- },
86
82
  {
87
83
  name: "goal",
88
84
  description: "Manage durable goals"
@@ -1 +1 @@
1
- {"version":3,"file":"command-manifest.js","names":[],"sources":["../../../src/cli/command-manifest.ts"],"sourcesContent":["export type RootHelpOption = {\n flags: string;\n description: string;\n};\n\nexport type RootHelpCommand = {\n name: string;\n description: string;\n};\n\nexport const ROOT_COMMAND_DESCRIPTION = 'Ultra-Lightweight Personal AI Assistant';\n\nexport const ROOT_HELP_OPTIONS: RootHelpOption[] = [\n { flags: '-V, --version', description: 'output the version number' },\n { flags: '--verbose', description: 'Enable verbose logging (default: false)' },\n { flags: '--config <path>', description: 'Config file path' },\n { flags: '--workspace <path>', description: 'Workspace directory' },\n { flags: '-h, --help', description: 'display help for command' },\n];\n\nexport const ROOT_HELP_COMMANDS: RootHelpCommand[] = [\n { name: 'init [options]', description: 'Initialize xopc state directories, config, and agent workspace' },\n { name: 'setup [options]', description: 'Initialize config file and workspace directory' },\n { name: 'profile', description: 'Manage xopc state profiles (~/.xopc vs ~/.xopc-<name>)' },\n { name: 'onboard [options]', description: 'Interactive setup wizard for xopc (gateway uses schema defaults)' },\n { name: 'channels', description: 'Messaging channel configuration' },\n { name: 'auth', description: 'Manage authentication credentials' },\n { name: 'agent [options]', description: 'Chat with the AI agent' },\n { name: 'tui [options]', description: 'Interactive terminal UI (pi-tui)' },\n { name: 'tunnel', description: 'Manage FRP remote access tunnel' },\n { name: 'gateway [options]', description: 'Start the xopc gateway server' },\n { name: 'session', description: 'Session management commands' },\n { name: 'doctor [options]', description: 'Check xopc installation health and diagnose common issues' },\n { name: 'update [options]', description: 'Check for and install xopc updates' },\n { name: 'logs', description: 'Manage and query logs' },\n { name: 'cron', description: 'Manage scheduled tasks' },\n { name: 'goal', description: 'Manage durable goals' },\n { name: 'config [options]', description: 'View and edit configuration' },\n { name: 'image', description: 'Inspect image provider availability' },\n { name: 'models [options]', description: 'List and manage models and model auth' },\n { name: 'providers', description: 'Manage LLM provider credentials (user-friendly hub over `xopc auth`)' },\n { name: 'voice', description: 'Configure text-to-speech (TTS) output' },\n { name: 'search', description: 'Manage web-search providers (brave / tavily / bing / searxng)' },\n { name: 'skills', description: 'Manage skills' },\n { name: 'tailscale', description: 'Tailscale status for gateway remote access' },\n { name: 'browser', description: 'Browser automation commands (uses Playwright)' },\n { name: 'agents', description: 'Manage agents (config + workspace)' },\n { name: 'extensions', description: 'Manage extensions' },\n { name: 'help [command]', description: 'display help for command' },\n];\n\nfunction formatRows(rows: Array<{ label: string; description: string }>): string {\n const labelWidth = Math.max(...rows.map((row) => row.label.length)) + 2;\n return rows.map((row) => ` ${row.label.padEnd(labelWidth)}${row.description}`).join('\\n');\n}\n\nexport function formatRootHelp(): string {\n const options = formatRows(ROOT_HELP_OPTIONS.map((option) => ({ label: option.flags, description: option.description })));\n const commands = formatRows(\n ROOT_HELP_COMMANDS.map((command) => ({ label: command.name, description: command.description })),\n );\n return `Usage: xopc [options] [command]\n\n${ROOT_COMMAND_DESCRIPTION}\n\nOptions:\n${options}\n\nCommands:\n${commands}`;\n}\n"],"mappings":";AAUA,MAAa,2BAA2B;AAExC,MAAa,oBAAsC;CACjD;EAAE,OAAO;EAAiB,aAAa;EAA6B;CACpE;EAAE,OAAO;EAAa,aAAa;EAA2C;CAC9E;EAAE,OAAO;EAAmB,aAAa;EAAoB;CAC7D;EAAE,OAAO;EAAsB,aAAa;EAAuB;CACnE;EAAE,OAAO;EAAc,aAAa;EAA4B;CACjE;AAED,MAAa,qBAAwC;CACnD;EAAE,MAAM;EAAkB,aAAa;EAAkE;CACzG;EAAE,MAAM;EAAmB,aAAa;EAAkD;CAC1F;EAAE,MAAM;EAAW,aAAa;EAA0D;CAC1F;EAAE,MAAM;EAAqB,aAAa;EAAoE;CAC9G;EAAE,MAAM;EAAY,aAAa;EAAmC;CACpE;EAAE,MAAM;EAAQ,aAAa;EAAqC;CAClE;EAAE,MAAM;EAAmB,aAAa;EAA0B;CAClE;EAAE,MAAM;EAAiB,aAAa;EAAoC;CAC1E;EAAE,MAAM;EAAU,aAAa;EAAmC;CAClE;EAAE,MAAM;EAAqB,aAAa;EAAiC;CAC3E;EAAE,MAAM;EAAW,aAAa;EAA+B;CAC/D;EAAE,MAAM;EAAoB,aAAa;EAA6D;CACtG;EAAE,MAAM;EAAoB,aAAa;EAAsC;CAC/E;EAAE,MAAM;EAAQ,aAAa;EAAyB;CACtD;EAAE,MAAM;EAAQ,aAAa;EAA0B;CACvD;EAAE,MAAM;EAAQ,aAAa;EAAwB;CACrD;EAAE,MAAM;EAAoB,aAAa;EAA+B;CACxE;EAAE,MAAM;EAAS,aAAa;EAAuC;CACrE;EAAE,MAAM;EAAoB,aAAa;EAAyC;CAClF;EAAE,MAAM;EAAa,aAAa;EAAwE;CAC1G;EAAE,MAAM;EAAS,aAAa;EAAyC;CACvE;EAAE,MAAM;EAAU,aAAa;EAAiE;CAChG;EAAE,MAAM;EAAU,aAAa;EAAiB;CAChD;EAAE,MAAM;EAAa,aAAa;EAA8C;CAChF;EAAE,MAAM;EAAW,aAAa;EAAiD;CACjF;EAAE,MAAM;EAAU,aAAa;EAAsC;CACrE;EAAE,MAAM;EAAc,aAAa;EAAqB;CACxD;EAAE,MAAM;EAAkB,aAAa;EAA4B;CACpE;AAED,SAAS,WAAW,MAA6D;CAC/E,MAAM,aAAa,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,IAAI,MAAM,OAAO,CAAC,GAAG;AACtE,QAAO,KAAK,KAAK,QAAQ,KAAK,IAAI,MAAM,OAAO,WAAW,GAAG,IAAI,cAAc,CAAC,KAAK,KAAK;;AAG5F,SAAgB,iBAAyB;AAKvC,QAAO;;EAEP,yBAAyB;;;EANT,WAAW,kBAAkB,KAAK,YAAY;EAAE,OAAO,OAAO;EAAO,aAAa,OAAO;EAAa,EAAE,CASjH,CAAC;;;EARS,WACf,mBAAmB,KAAK,aAAa;EAAE,OAAO,QAAQ;EAAM,aAAa,QAAQ;EAAa,EAAE,CAU1F"}
1
+ {"version":3,"file":"command-manifest.js","names":[],"sources":["../../../src/cli/command-manifest.ts"],"sourcesContent":["export type RootHelpOption = {\n flags: string;\n description: string;\n};\n\nexport type RootHelpCommand = {\n name: string;\n description: string;\n};\n\nexport const ROOT_COMMAND_DESCRIPTION = 'Ultra-Lightweight Personal AI Assistant. Run `xopc` with no command to open the local TUI.';\n\nexport const ROOT_HELP_OPTIONS: RootHelpOption[] = [\n { flags: '-V, --version', description: 'output the version number' },\n { flags: '--verbose', description: 'Enable verbose logging (default: false)' },\n { flags: '--config <path>', description: 'Config file path' },\n { flags: '--workspace <path>', description: 'Workspace directory' },\n { flags: '-h, --help', description: 'display help for command' },\n];\n\nexport const ROOT_HELP_COMMANDS: RootHelpCommand[] = [\n { name: 'init [options]', description: 'Initialize xopc state directories, config, and agent workspace' },\n { name: 'setup [options]', description: 'Initialize config file and workspace directory' },\n { name: 'profile', description: 'Manage xopc state profiles (~/.xopc vs ~/.xopc-<name>)' },\n { name: 'onboard [options]', description: 'Interactive setup wizard for xopc (gateway uses schema defaults)' },\n { name: 'channels', description: 'Messaging channel configuration' },\n { name: 'auth', description: 'Manage authentication credentials' },\n { name: 'agent [options]', description: 'Chat with the AI agent' },\n { name: 'tui [options]', description: 'Interactive terminal UI (pi-tui)' },\n { name: 'tunnel', description: 'Manage FRP remote access tunnel' },\n { name: 'gateway [options]', description: 'Start the xopc gateway server' },\n { name: 'session', description: 'Session management commands' },\n { name: 'doctor [options]', description: 'Check xopc installation health and diagnose common issues' },\n { name: 'update [options]', description: 'Check for and install xopc updates' },\n { name: 'logs', description: 'Manage and query logs' },\n { name: 'goal', description: 'Manage durable goals' },\n { name: 'config [options]', description: 'View and edit configuration' },\n { name: 'image', description: 'Inspect image provider availability' },\n { name: 'models [options]', description: 'List and manage models and model auth' },\n { name: 'providers', description: 'Manage LLM provider credentials (user-friendly hub over `xopc auth`)' },\n { name: 'voice', description: 'Configure text-to-speech (TTS) output' },\n { name: 'search', description: 'Manage web-search providers (brave / tavily / bing / searxng)' },\n { name: 'skills', description: 'Manage skills' },\n { name: 'tailscale', description: 'Tailscale status for gateway remote access' },\n { name: 'browser', description: 'Browser automation commands (uses Playwright)' },\n { name: 'agents', description: 'Manage agents (config + workspace)' },\n { name: 'extensions', description: 'Manage extensions' },\n { name: 'help [command]', description: 'display help for command' },\n];\n\nfunction formatRows(rows: Array<{ label: string; description: string }>): string {\n const labelWidth = Math.max(...rows.map((row) => row.label.length)) + 2;\n return rows.map((row) => ` ${row.label.padEnd(labelWidth)}${row.description}`).join('\\n');\n}\n\nexport function formatRootHelp(): string {\n const options = formatRows(ROOT_HELP_OPTIONS.map((option) => ({ label: option.flags, description: option.description })));\n const commands = formatRows(\n ROOT_HELP_COMMANDS.map((command) => ({ label: command.name, description: command.description })),\n );\n return `Usage: xopc [options] [command]\n\n${ROOT_COMMAND_DESCRIPTION}\n\nOptions:\n${options}\n\nCommands:\n${commands}`;\n}\n"],"mappings":";AAUA,MAAa,2BAA2B;AAExC,MAAa,oBAAsC;CACjD;EAAE,OAAO;EAAiB,aAAa;EAA6B;CACpE;EAAE,OAAO;EAAa,aAAa;EAA2C;CAC9E;EAAE,OAAO;EAAmB,aAAa;EAAoB;CAC7D;EAAE,OAAO;EAAsB,aAAa;EAAuB;CACnE;EAAE,OAAO;EAAc,aAAa;EAA4B;CACjE;AAED,MAAa,qBAAwC;CACnD;EAAE,MAAM;EAAkB,aAAa;EAAkE;CACzG;EAAE,MAAM;EAAmB,aAAa;EAAkD;CAC1F;EAAE,MAAM;EAAW,aAAa;EAA0D;CAC1F;EAAE,MAAM;EAAqB,aAAa;EAAoE;CAC9G;EAAE,MAAM;EAAY,aAAa;EAAmC;CACpE;EAAE,MAAM;EAAQ,aAAa;EAAqC;CAClE;EAAE,MAAM;EAAmB,aAAa;EAA0B;CAClE;EAAE,MAAM;EAAiB,aAAa;EAAoC;CAC1E;EAAE,MAAM;EAAU,aAAa;EAAmC;CAClE;EAAE,MAAM;EAAqB,aAAa;EAAiC;CAC3E;EAAE,MAAM;EAAW,aAAa;EAA+B;CAC/D;EAAE,MAAM;EAAoB,aAAa;EAA6D;CACtG;EAAE,MAAM;EAAoB,aAAa;EAAsC;CAC/E;EAAE,MAAM;EAAQ,aAAa;EAAyB;CACtD;EAAE,MAAM;EAAQ,aAAa;EAAwB;CACrD;EAAE,MAAM;EAAoB,aAAa;EAA+B;CACxE;EAAE,MAAM;EAAS,aAAa;EAAuC;CACrE;EAAE,MAAM;EAAoB,aAAa;EAAyC;CAClF;EAAE,MAAM;EAAa,aAAa;EAAwE;CAC1G;EAAE,MAAM;EAAS,aAAa;EAAyC;CACvE;EAAE,MAAM;EAAU,aAAa;EAAiE;CAChG;EAAE,MAAM;EAAU,aAAa;EAAiB;CAChD;EAAE,MAAM;EAAa,aAAa;EAA8C;CAChF;EAAE,MAAM;EAAW,aAAa;EAAiD;CACjF;EAAE,MAAM;EAAU,aAAa;EAAsC;CACrE;EAAE,MAAM;EAAc,aAAa;EAAqB;CACxD;EAAE,MAAM;EAAkB,aAAa;EAA4B;CACpE;AAED,SAAS,WAAW,MAA6D;CAC/E,MAAM,aAAa,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,IAAI,MAAM,OAAO,CAAC,GAAG;AACtE,QAAO,KAAK,KAAK,QAAQ,KAAK,IAAI,MAAM,OAAO,WAAW,GAAG,IAAI,cAAc,CAAC,KAAK,KAAK;;AAG5F,SAAgB,iBAAyB;AAKvC,QAAO;;EAEP,yBAAyB;;;EANT,WAAW,kBAAkB,KAAK,YAAY;EAAE,OAAO,OAAO;EAAO,aAAa,OAAO;EAAa,EAAE,CASjH,CAAC;;;EARS,WACf,mBAAmB,KAAK,aAAa;EAAE,OAAO,QAAQ;EAAM,aAAa,QAAQ;EAAa,EAAE,CAU1F"}
@@ -1,7 +1,7 @@
1
- import { DEFAULT_AGENT_ID, init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, validateAgentIdForNewAgent } from "../../agent/agent-scope.js";
1
+ import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, validateAgentIdForNewAgent } from "../../agent/agent-scope.js";
2
2
  import { init_paths, resolveConfigPath } from "../../config/paths.js";
3
3
  import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
4
- import { applyAgentConfig, findAgentEntryIndex, pruneAgentConfig, removeAgentDirsFromDisk } from "../../commands/agents.config.js";
4
+ import { applyAgentConfig, findAgentEntryIndex, getAgentDeleteBlocker, pruneAgentConfig, removeAgentDirsFromDisk } from "../../commands/agents.config.js";
5
5
  import { seedAgentProfileMarkdownFiles } from "../../agent/context/workspace-seed.js";
6
6
  import { colors } from "../utils/colors.js";
7
7
  import { mkdir } from "node:fs/promises";
@@ -12,9 +12,6 @@ import { mkdir } from "node:fs/promises";
12
12
  init_loader();
13
13
  init_paths();
14
14
  init_agent_scope();
15
- function requireNonMain(id) {
16
- if (normalizeAgentId(id) === "main") throw new Error(`Agent id "${DEFAULT_AGENT_ID}" is reserved for the primary agent.`);
17
- }
18
15
  function registerAgentsCli(program) {
19
16
  const agents = program.command("agents").description("Manage agents (config + workspace)");
20
17
  agents.command("list").description("List configured agents").option("--json", "Output JSON").action(async (opts) => {
@@ -79,7 +76,11 @@ function registerAgentsCli(program) {
79
76
  });
80
77
  agents.command("delete").description("Remove an agent from config (optional on-disk cleanup)").argument("<id>", "Agent id").option("--purge", "Also delete workspace and ~/.xopc/agents/<id> data", false).option("--json", "Output JSON summary").action(async (id, opts) => {
81
78
  const cfg = loadConfig();
82
- requireNonMain(id);
79
+ const blocker = getAgentDeleteBlocker(cfg, id);
80
+ if (blocker) {
81
+ console.error(colors.red("Error:"), blocker);
82
+ process.exit(1);
83
+ }
83
84
  if (findAgentEntryIndex(listAgentEntries(cfg), id) < 0) {
84
85
  console.error(colors.red("Error:"), `Agent "${id}" not found in agents.list`);
85
86
  process.exit(1);
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","names":[],"sources":["../../../../src/cli/commands/agents.ts"],"sourcesContent":["/**\n * `agents` CLI: config is the source of truth for multi-agent paths.\n */\n\nimport { mkdir } from 'node:fs/promises';\nimport { Command } from 'commander';\nimport { loadConfig, saveConfig } from '../../config/loader.js';\nimport { resolveConfigPath } from '../../config/paths.js';\nimport {\n normalizeAgentId,\n resolveAgentDir,\n resolveAgentProfileDir,\n resolveAgentWorkspaceDir,\n resolveDefaultAgentId,\n DEFAULT_AGENT_ID,\n validateAgentIdForNewAgent,\n} from '../../agent/agent-scope.js';\nimport {\n applyAgentConfig,\n findAgentEntryIndex,\n listAgentEntries,\n pruneAgentConfig,\n removeAgentDirsFromDisk,\n} from '../../commands/agents.config.js';\nimport { seedAgentProfileMarkdownFiles } from '../../agent/context/workspace-seed.js';\nimport { colors } from '../utils/colors.js';\n\nfunction requireNonMain(id: string): void {\n if (normalizeAgentId(id) === DEFAULT_AGENT_ID) {\n throw new Error(`Agent id \"${DEFAULT_AGENT_ID}\" is reserved for the primary agent.`);\n }\n}\n\nexport function registerAgentsCli(program: Command): void {\n const agents = program\n .command('agents')\n .description('Manage agents (config + workspace)');\n\n agents\n .command('list')\n .description('List configured agents')\n .option('--json', 'Output JSON')\n .action(async (opts: { json?: boolean }) => {\n const cfg = loadConfig();\n const rows = listAgentEntries(cfg).map((a) => ({\n id: normalizeAgentId(a.id),\n enabled: a.enabled !== false,\n workspace: a.workspace,\n model: a.models.roles[a.models.defaultRole]?.model,\n }));\n const def = resolveDefaultAgentId(cfg);\n if (opts.json) {\n console.log(JSON.stringify({ defaultAgentId: def, agents: rows }, null, 2));\n return;\n }\n console.log(colors.cyan(`Default agent id: ${def}`));\n if (rows.length === 0) {\n console.log('No entries in agents.list (using defaults only).');\n return;\n }\n for (const r of rows) {\n const mark = r.id === def ? ' (default routing)' : '';\n console.log(`- ${r.id}${mark}`);\n }\n });\n\n agents\n .command('add')\n .description('Add or update an agent in config and create workspace / state dirs')\n .argument('<name>', 'Agent display name / id seed')\n .requiredOption('--workspace <dir>', 'Workspace directory for this agent')\n .option('--model <id>', 'Model id (e.g. anthropic/claude-sonnet-4-5)')\n .option('--json', 'Output JSON summary')\n .action(\n async (\n name: string,\n opts: { workspace?: string; model?: string; json?: boolean },\n ) => {\n const cfg = loadConfig();\n const idRes = validateAgentIdForNewAgent(undefined, name);\n if (idRes.ok === false) {\n console.error(colors.red('Error:'), idRes.error);\n process.exit(1);\n }\n const agentId = idRes.agentId;\n\n const workspace = opts.workspace!.trim();\n const next = applyAgentConfig(cfg, {\n agentId,\n workspace,\n ...(opts.model?.trim() ? { model: opts.model.trim() } : {}),\n });\n\n const configPath = resolveConfigPath();\n await saveConfig(next, configPath);\n\n const wsPath = resolveAgentWorkspaceDir(next, agentId);\n const adPath = resolveAgentDir(next, agentId);\n const profilePath = resolveAgentProfileDir(next, agentId);\n await mkdir(wsPath, { recursive: true });\n await mkdir(adPath, { recursive: true });\n await mkdir(profilePath, { recursive: true });\n seedAgentProfileMarkdownFiles(profilePath, wsPath, { displayName: name.trim() });\n\n const payload = { agentId, workspace: wsPath, agentDir: adPath, model: opts.model };\n if (opts.json) {\n console.log(JSON.stringify(payload, null, 2));\n } else {\n console.log(colors.green('✓'), `Configured agent \"${agentId}\"`);\n console.log(` Workspace: ${wsPath}`);\n console.log(` Agent dir: ${adPath}`);\n }\n },\n );\n\n agents\n .command('delete')\n .description('Remove an agent from config (optional on-disk cleanup)')\n .argument('<id>', 'Agent id')\n .option('--purge', 'Also delete workspace and ~/.xopc/agents/<id> data', false)\n .option('--json', 'Output JSON summary')\n .action(async (id: string, opts: { purge?: boolean; json?: boolean }) => {\n const cfg = loadConfig();\n requireNonMain(id);\n const idx = findAgentEntryIndex(listAgentEntries(cfg), id);\n if (idx < 0) {\n console.error(colors.red('Error:'), `Agent \"${id}\" not found in agents.list`);\n process.exit(1);\n }\n const { config: pruned, removedBindings } = pruneAgentConfig(cfg, id);\n await saveConfig(pruned, resolveConfigPath());\n let purged = false;\n if (opts.purge) {\n await removeAgentDirsFromDisk(pruned, id);\n purged = true;\n }\n const payload = { deleted: id, removedBindings, purged };\n if (opts.json) {\n console.log(JSON.stringify(payload, null, 2));\n } else {\n console.log(colors.green('✓'), `Removed agent \"${id}\" from config`);\n if (removedBindings > 0) {\n console.log(` Stripped ${removedBindings} routing binding(s).`);\n }\n if (purged) {\n console.log(' On-disk workspace/state removed.');\n }\n }\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"agents.js","names":[],"sources":["../../../../src/cli/commands/agents.ts"],"sourcesContent":["/**\n * `agents` CLI: config is the source of truth for multi-agent paths.\n */\n\nimport { mkdir } from 'node:fs/promises';\nimport { Command } from 'commander';\nimport { loadConfig, saveConfig } from '../../config/loader.js';\nimport { resolveConfigPath } from '../../config/paths.js';\nimport {\n normalizeAgentId,\n resolveAgentDir,\n resolveAgentProfileDir,\n resolveAgentWorkspaceDir,\n resolveDefaultAgentId,\n validateAgentIdForNewAgent,\n} from '../../agent/agent-scope.js';\nimport {\n applyAgentConfig,\n findAgentEntryIndex,\n getAgentDeleteBlocker,\n listAgentEntries,\n pruneAgentConfig,\n removeAgentDirsFromDisk,\n} from '../../commands/agents.config.js';\nimport { seedAgentProfileMarkdownFiles } from '../../agent/context/workspace-seed.js';\nimport { colors } from '../utils/colors.js';\n\nexport function registerAgentsCli(program: Command): void {\n const agents = program\n .command('agents')\n .description('Manage agents (config + workspace)');\n\n agents\n .command('list')\n .description('List configured agents')\n .option('--json', 'Output JSON')\n .action(async (opts: { json?: boolean }) => {\n const cfg = loadConfig();\n const rows = listAgentEntries(cfg).map((a) => ({\n id: normalizeAgentId(a.id),\n enabled: a.enabled !== false,\n workspace: a.workspace,\n model: a.models.roles[a.models.defaultRole]?.model,\n }));\n const def = resolveDefaultAgentId(cfg);\n if (opts.json) {\n console.log(JSON.stringify({ defaultAgentId: def, agents: rows }, null, 2));\n return;\n }\n console.log(colors.cyan(`Default agent id: ${def}`));\n if (rows.length === 0) {\n console.log('No entries in agents.list (using defaults only).');\n return;\n }\n for (const r of rows) {\n const mark = r.id === def ? ' (default routing)' : '';\n console.log(`- ${r.id}${mark}`);\n }\n });\n\n agents\n .command('add')\n .description('Add or update an agent in config and create workspace / state dirs')\n .argument('<name>', 'Agent display name / id seed')\n .requiredOption('--workspace <dir>', 'Workspace directory for this agent')\n .option('--model <id>', 'Model id (e.g. anthropic/claude-sonnet-4-5)')\n .option('--json', 'Output JSON summary')\n .action(\n async (\n name: string,\n opts: { workspace?: string; model?: string; json?: boolean },\n ) => {\n const cfg = loadConfig();\n const idRes = validateAgentIdForNewAgent(undefined, name);\n if (idRes.ok === false) {\n console.error(colors.red('Error:'), idRes.error);\n process.exit(1);\n }\n const agentId = idRes.agentId;\n\n const workspace = opts.workspace!.trim();\n const next = applyAgentConfig(cfg, {\n agentId,\n workspace,\n ...(opts.model?.trim() ? { model: opts.model.trim() } : {}),\n });\n\n const configPath = resolveConfigPath();\n await saveConfig(next, configPath);\n\n const wsPath = resolveAgentWorkspaceDir(next, agentId);\n const adPath = resolveAgentDir(next, agentId);\n const profilePath = resolveAgentProfileDir(next, agentId);\n await mkdir(wsPath, { recursive: true });\n await mkdir(adPath, { recursive: true });\n await mkdir(profilePath, { recursive: true });\n seedAgentProfileMarkdownFiles(profilePath, wsPath, { displayName: name.trim() });\n\n const payload = { agentId, workspace: wsPath, agentDir: adPath, model: opts.model };\n if (opts.json) {\n console.log(JSON.stringify(payload, null, 2));\n } else {\n console.log(colors.green('✓'), `Configured agent \"${agentId}\"`);\n console.log(` Workspace: ${wsPath}`);\n console.log(` Agent dir: ${adPath}`);\n }\n },\n );\n\n agents\n .command('delete')\n .description('Remove an agent from config (optional on-disk cleanup)')\n .argument('<id>', 'Agent id')\n .option('--purge', 'Also delete workspace and ~/.xopc/agents/<id> data', false)\n .option('--json', 'Output JSON summary')\n .action(async (id: string, opts: { purge?: boolean; json?: boolean }) => {\n const cfg = loadConfig();\n const blocker = getAgentDeleteBlocker(cfg, id);\n if (blocker) {\n console.error(colors.red('Error:'), blocker);\n process.exit(1);\n }\n const idx = findAgentEntryIndex(listAgentEntries(cfg), id);\n if (idx < 0) {\n console.error(colors.red('Error:'), `Agent \"${id}\" not found in agents.list`);\n process.exit(1);\n }\n const { config: pruned, removedBindings } = pruneAgentConfig(cfg, id);\n await saveConfig(pruned, resolveConfigPath());\n let purged = false;\n if (opts.purge) {\n await removeAgentDirsFromDisk(pruned, id);\n purged = true;\n }\n const payload = { deleted: id, removedBindings, purged };\n if (opts.json) {\n console.log(JSON.stringify(payload, null, 2));\n } else {\n console.log(colors.green('✓'), `Removed agent \"${id}\" from config`);\n if (removedBindings > 0) {\n console.log(` Stripped ${removedBindings} routing binding(s).`);\n }\n if (purged) {\n console.log(' On-disk workspace/state removed.');\n }\n }\n });\n}\n"],"mappings":"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"}
@@ -52,7 +52,7 @@ async function checkDatabaseSchema(ctx) {
52
52
  id: "database-schema",
53
53
  label: "Database schema",
54
54
  status: "pass",
55
- message: `SQLite schema v${status.dbVersion} (current release v13).`,
55
+ message: `SQLite schema v${status.dbVersion} (current release v18).`,
56
56
  hints: []
57
57
  };
58
58
  }
@@ -1,2 +1,2 @@
1
1
  import type { CheckResult, DoctorContext } from '../types.js';
2
- export declare function checkCronHealth(ctx: DoctorContext): Promise<CheckResult>;
2
+ export declare function checkMigrations(ctx: DoctorContext): Promise<CheckResult>;
@@ -0,0 +1,40 @@
1
+ import { applyMigrations, detectMigrations } from "../../../../migrations/runner.js";
2
+ //#region src/cli/commands/doctor/checks/migrations.ts
3
+ async function checkMigrations(ctx) {
4
+ const planned = detectMigrations(ctx.configPath, { stateDir: ctx.stateDir });
5
+ if (planned.length === 0) return {
6
+ id: "migrations",
7
+ label: "Migrations",
8
+ status: "pass",
9
+ message: "No pending migrations.",
10
+ hints: [ctx.configPath]
11
+ };
12
+ if (ctx.options.fix) {
13
+ const result = applyMigrations(ctx.configPath, {
14
+ stateDir: ctx.stateDir,
15
+ mode: "doctor-fix"
16
+ });
17
+ const blocking = result.items.filter((item) => item.status === "conflict" || item.status === "error");
18
+ const applied = result.items.filter((item) => item.status === "applied");
19
+ return {
20
+ id: "migrations",
21
+ label: "Migrations",
22
+ status: blocking.length > 0 ? "fail" : "pass",
23
+ message: blocking.length > 0 ? `${applied.length} migration(s) applied; ${blocking.length} need manual attention.` : `${applied.length} migration(s) applied.`,
24
+ hints: result.items.map((item) => `${item.id}: ${item.message}`),
25
+ fixed: applied.length > 0
26
+ };
27
+ }
28
+ const conflicts = planned.filter((item) => item.status === "conflict" || item.status === "error");
29
+ return {
30
+ id: "migrations",
31
+ label: "Migrations",
32
+ status: conflicts.length > 0 ? "fail" : "warn",
33
+ message: conflicts.length > 0 ? `${planned.length} migration(s) pending; ${conflicts.length} need manual attention.` : `${planned.length} safe migration(s) pending.`,
34
+ hints: ["Run: xopc doctor --fix", ...planned.map((item) => `${item.id}: ${item.message}`)]
35
+ };
36
+ }
37
+ //#endregion
38
+ export { checkMigrations };
39
+
40
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","names":[],"sources":["../../../../../../src/cli/commands/doctor/checks/migrations.ts"],"sourcesContent":["import { applyMigrations, detectMigrations } from '../../../../migrations/runner.js';\nimport type { CheckResult, DoctorContext } from '../types.js';\n\nexport async function checkMigrations(ctx: DoctorContext): Promise<CheckResult> {\n const planned = detectMigrations(ctx.configPath, { stateDir: ctx.stateDir });\n if (planned.length === 0) {\n return {\n id: 'migrations',\n label: 'Migrations',\n status: 'pass',\n message: 'No pending migrations.',\n hints: [ctx.configPath],\n };\n }\n\n if (ctx.options.fix) {\n const result = applyMigrations(ctx.configPath, { stateDir: ctx.stateDir, mode: 'doctor-fix' });\n const blocking = result.items.filter((item) => item.status === 'conflict' || item.status === 'error');\n const applied = result.items.filter((item) => item.status === 'applied');\n return {\n id: 'migrations',\n label: 'Migrations',\n status: blocking.length > 0 ? 'fail' : 'pass',\n message: blocking.length > 0\n ? `${applied.length} migration(s) applied; ${blocking.length} need manual attention.`\n : `${applied.length} migration(s) applied.`,\n hints: result.items.map((item) => `${item.id}: ${item.message}`),\n fixed: applied.length > 0,\n };\n }\n\n const conflicts = planned.filter((item) => item.status === 'conflict' || item.status === 'error');\n return {\n id: 'migrations',\n label: 'Migrations',\n status: conflicts.length > 0 ? 'fail' : 'warn',\n message: conflicts.length > 0\n ? `${planned.length} migration(s) pending; ${conflicts.length} need manual attention.`\n : `${planned.length} safe migration(s) pending.`,\n hints: ['Run: xopc doctor --fix', ...planned.map((item) => `${item.id}: ${item.message}`)],\n };\n}\n"],"mappings":";;AAGA,eAAsB,gBAAgB,KAA0C;CAC9E,MAAM,UAAU,iBAAiB,IAAI,YAAY,EAAE,UAAU,IAAI,UAAU,CAAC;AAC5E,KAAI,QAAQ,WAAW,EACrB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,CAAC,IAAI,WAAW;EACxB;AAGH,KAAI,IAAI,QAAQ,KAAK;EACnB,MAAM,SAAS,gBAAgB,IAAI,YAAY;GAAE,UAAU,IAAI;GAAU,MAAM;GAAc,CAAC;EAC9F,MAAM,WAAW,OAAO,MAAM,QAAQ,SAAS,KAAK,WAAW,cAAc,KAAK,WAAW,QAAQ;EACrG,MAAM,UAAU,OAAO,MAAM,QAAQ,SAAS,KAAK,WAAW,UAAU;AACxE,SAAO;GACL,IAAI;GACJ,OAAO;GACP,QAAQ,SAAS,SAAS,IAAI,SAAS;GACvC,SAAS,SAAS,SAAS,IACvB,GAAG,QAAQ,OAAO,yBAAyB,SAAS,OAAO,2BAC3D,GAAG,QAAQ,OAAO;GACtB,OAAO,OAAO,MAAM,KAAK,SAAS,GAAG,KAAK,GAAG,IAAI,KAAK,UAAU;GAChE,OAAO,QAAQ,SAAS;GACzB;;CAGH,MAAM,YAAY,QAAQ,QAAQ,SAAS,KAAK,WAAW,cAAc,KAAK,WAAW,QAAQ;AACjG,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ,UAAU,SAAS,IAAI,SAAS;EACxC,SAAS,UAAU,SAAS,IACxB,GAAG,QAAQ,OAAO,yBAAyB,UAAU,OAAO,2BAC5D,GAAG,QAAQ,OAAO;EACtB,OAAO,CAAC,0BAA0B,GAAG,QAAQ,KAAK,SAAS,GAAG,KAAK,GAAG,IAAI,KAAK,UAAU,CAAC;EAC3F"}
@@ -17,6 +17,7 @@ function collectProviderIdsFromConfig(cfg) {
17
17
  const addRoles = (roles) => {
18
18
  for (const role of Object.values(roles ?? {})) addRef(role.model);
19
19
  };
20
+ for (const preset of Object.values(cfg.agents.capabilityPresets ?? {})) addRoles(preset.models?.roles);
20
21
  const list = cfg.agents?.list;
21
22
  if (Array.isArray(list)) for (const e of list) addRoles(e?.models?.roles);
22
23
  return ids;
@@ -1 +1 @@
1
- {"version":3,"file":"provider-auth.js","names":[],"sources":["../../../../../../src/cli/commands/doctor/checks/provider-auth.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\n\nimport { loadConfig } from '../../../../config/loader.js';\nimport type { Config } from '../../../../config/schema.js';\nimport { parseModelRef, getAgentDefaultModelRef } from '../../../../config/schema.js';\nimport { getApiKeyFromEnv, PROVIDER_ENV_MAP } from '../../../../providers/env-keys.js';\nimport type { CheckResult, DoctorContext } from '../types.js';\n\nfunction collectProviderIdsFromConfig(cfg: Config): Set<string> {\n const ids = new Set<string>();\n\n const addRef = (ref: string | undefined) => {\n if (!ref?.trim()) return;\n const parsed = parseModelRef(ref.trim());\n if (parsed) ids.add(parsed.provider.toLowerCase());\n };\n\n addRef(getAgentDefaultModelRef(cfg));\n\n const addRoles = (roles: Record<string, { model?: string }> | undefined) => {\n for (const role of Object.values(roles ?? {})) {\n addRef(role.model);\n }\n };\n\n const list = cfg.agents?.list;\n if (Array.isArray(list)) {\n for (const e of list) {\n addRoles(e?.models?.roles);\n }\n }\n\n return ids;\n}\n\nfunction anyProviderEnvPresent(): boolean {\n for (const vars of Object.values(PROVIDER_ENV_MAP)) {\n for (const v of vars) {\n if (process.env[v]?.trim()) return true;\n }\n }\n for (const [k, val] of Object.entries(process.env)) {\n if (!val?.trim()) continue;\n if (k.endsWith('_API_KEY') || k.endsWith('_TOKEN')) return true;\n }\n return false;\n}\n\nexport async function checkProviderAuth(ctx: DoctorContext): Promise<CheckResult> {\n if (!existsSync(ctx.configPath)) {\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'skip',\n message: 'No config file; skipped.',\n hints: [],\n };\n }\n\n let cfg: Config;\n try {\n cfg = loadConfig(ctx.configPath);\n } catch {\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'skip',\n message: 'Config could not be loaded; skipped.',\n hints: [],\n };\n }\n\n const fromConfig = collectProviderIdsFromConfig(cfg);\n const checkIds = fromConfig.size > 0 ? [...fromConfig] : Object.keys(PROVIDER_ENV_MAP);\n\n for (const id of checkIds) {\n const key = getApiKeyFromEnv(id);\n if (key?.trim()) {\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'pass',\n message: 'At least one LLM provider API key is available.',\n hints: [],\n };\n }\n }\n\n if (anyProviderEnvPresent()) {\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'pass',\n message: 'Environment contains provider credentials.',\n hints: [],\n };\n }\n\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'warn',\n message: 'No API keys detected for configured providers.',\n hints: ['Set keys via: xopc auth set <provider> <key>', 'Or export the provider env vars from the pi-ai docs.'],\n };\n}\n"],"mappings":";;;;;aAE0D;aAE4B;eACC;AAGvF,SAAS,6BAA6B,KAA0B;CAC9D,MAAM,sBAAM,IAAI,KAAa;CAE7B,MAAM,UAAU,QAA4B;AAC1C,MAAI,CAAC,KAAK,MAAM,CAAE;EAClB,MAAM,SAAS,cAAc,IAAI,MAAM,CAAC;AACxC,MAAI,OAAQ,KAAI,IAAI,OAAO,SAAS,aAAa,CAAC;;AAGpD,QAAO,wBAAwB,IAAI,CAAC;CAEpC,MAAM,YAAY,UAA0D;AAC1E,OAAK,MAAM,QAAQ,OAAO,OAAO,SAAS,EAAE,CAAC,CAC3C,QAAO,KAAK,MAAM;;CAItB,MAAM,OAAO,IAAI,QAAQ;AACzB,KAAI,MAAM,QAAQ,KAAK,CACrB,MAAK,MAAM,KAAK,KACd,UAAS,GAAG,QAAQ,MAAM;AAI9B,QAAO;;AAGT,SAAS,wBAAiC;AACxC,MAAK,MAAM,QAAQ,OAAO,OAAO,iBAAiB,CAChD,MAAK,MAAM,KAAK,KACd,KAAI,QAAQ,IAAI,IAAI,MAAM,CAAE,QAAO;AAGvC,MAAK,MAAM,CAAC,GAAG,QAAQ,OAAO,QAAQ,QAAQ,IAAI,EAAE;AAClD,MAAI,CAAC,KAAK,MAAM,CAAE;AAClB,MAAI,EAAE,SAAS,WAAW,IAAI,EAAE,SAAS,SAAS,CAAE,QAAO;;AAE7D,QAAO;;AAGT,eAAsB,kBAAkB,KAA0C;AAChF,KAAI,CAAC,WAAW,IAAI,WAAW,CAC7B,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;CAGH,IAAI;AACJ,KAAI;AACF,QAAM,WAAW,IAAI,WAAW;SAC1B;AACN,SAAO;GACL,IAAI;GACJ,OAAO;GACP,QAAQ;GACR,SAAS;GACT,OAAO,EAAE;GACV;;CAGH,MAAM,aAAa,6BAA6B,IAAI;CACpD,MAAM,WAAW,WAAW,OAAO,IAAI,CAAC,GAAG,WAAW,GAAG,OAAO,KAAK,iBAAiB;AAEtF,MAAK,MAAM,MAAM,SAEf,KADY,iBAAiB,GACtB,EAAE,MAAM,CACb,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;AAIL,KAAI,uBAAuB,CACzB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;AAGH,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,CAAC,gDAAgD,uDAAuD;EAChH"}
1
+ {"version":3,"file":"provider-auth.js","names":[],"sources":["../../../../../../src/cli/commands/doctor/checks/provider-auth.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\n\nimport { loadConfig } from '../../../../config/loader.js';\nimport type { Config } from '../../../../config/schema.js';\nimport { parseModelRef, getAgentDefaultModelRef } from '../../../../config/schema.js';\nimport { getApiKeyFromEnv, PROVIDER_ENV_MAP } from '../../../../providers/env-keys.js';\nimport type { CheckResult, DoctorContext } from '../types.js';\n\nfunction collectProviderIdsFromConfig(cfg: Config): Set<string> {\n const ids = new Set<string>();\n\n const addRef = (ref: string | undefined) => {\n if (!ref?.trim()) return;\n const parsed = parseModelRef(ref.trim());\n if (parsed) ids.add(parsed.provider.toLowerCase());\n };\n\n addRef(getAgentDefaultModelRef(cfg));\n\n const addRoles = (roles: Record<string, { model?: string }> | undefined) => {\n for (const role of Object.values(roles ?? {})) {\n addRef(role.model);\n }\n };\n\n for (const preset of Object.values(cfg.agents.capabilityPresets ?? {})) {\n addRoles(preset.models?.roles);\n }\n\n const list = cfg.agents?.list;\n if (Array.isArray(list)) {\n for (const e of list) {\n addRoles(e?.models?.roles);\n }\n }\n\n return ids;\n}\n\nfunction anyProviderEnvPresent(): boolean {\n for (const vars of Object.values(PROVIDER_ENV_MAP)) {\n for (const v of vars) {\n if (process.env[v]?.trim()) return true;\n }\n }\n for (const [k, val] of Object.entries(process.env)) {\n if (!val?.trim()) continue;\n if (k.endsWith('_API_KEY') || k.endsWith('_TOKEN')) return true;\n }\n return false;\n}\n\nexport async function checkProviderAuth(ctx: DoctorContext): Promise<CheckResult> {\n if (!existsSync(ctx.configPath)) {\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'skip',\n message: 'No config file; skipped.',\n hints: [],\n };\n }\n\n let cfg: Config;\n try {\n cfg = loadConfig(ctx.configPath);\n } catch {\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'skip',\n message: 'Config could not be loaded; skipped.',\n hints: [],\n };\n }\n\n const fromConfig = collectProviderIdsFromConfig(cfg);\n const checkIds = fromConfig.size > 0 ? [...fromConfig] : Object.keys(PROVIDER_ENV_MAP);\n\n for (const id of checkIds) {\n const key = getApiKeyFromEnv(id);\n if (key?.trim()) {\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'pass',\n message: 'At least one LLM provider API key is available.',\n hints: [],\n };\n }\n }\n\n if (anyProviderEnvPresent()) {\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'pass',\n message: 'Environment contains provider credentials.',\n hints: [],\n };\n }\n\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'warn',\n message: 'No API keys detected for configured providers.',\n hints: ['Set keys via: xopc auth set <provider> <key>', 'Or export the provider env vars from the pi-ai docs.'],\n };\n}\n"],"mappings":";;;;;aAE0D;aAE4B;eACC;AAGvF,SAAS,6BAA6B,KAA0B;CAC9D,MAAM,sBAAM,IAAI,KAAa;CAE7B,MAAM,UAAU,QAA4B;AAC1C,MAAI,CAAC,KAAK,MAAM,CAAE;EAClB,MAAM,SAAS,cAAc,IAAI,MAAM,CAAC;AACxC,MAAI,OAAQ,KAAI,IAAI,OAAO,SAAS,aAAa,CAAC;;AAGpD,QAAO,wBAAwB,IAAI,CAAC;CAEpC,MAAM,YAAY,UAA0D;AAC1E,OAAK,MAAM,QAAQ,OAAO,OAAO,SAAS,EAAE,CAAC,CAC3C,QAAO,KAAK,MAAM;;AAItB,MAAK,MAAM,UAAU,OAAO,OAAO,IAAI,OAAO,qBAAqB,EAAE,CAAC,CACpE,UAAS,OAAO,QAAQ,MAAM;CAGhC,MAAM,OAAO,IAAI,QAAQ;AACzB,KAAI,MAAM,QAAQ,KAAK,CACrB,MAAK,MAAM,KAAK,KACd,UAAS,GAAG,QAAQ,MAAM;AAI9B,QAAO;;AAGT,SAAS,wBAAiC;AACxC,MAAK,MAAM,QAAQ,OAAO,OAAO,iBAAiB,CAChD,MAAK,MAAM,KAAK,KACd,KAAI,QAAQ,IAAI,IAAI,MAAM,CAAE,QAAO;AAGvC,MAAK,MAAM,CAAC,GAAG,QAAQ,OAAO,QAAQ,QAAQ,IAAI,EAAE;AAClD,MAAI,CAAC,KAAK,MAAM,CAAE;AAClB,MAAI,EAAE,SAAS,WAAW,IAAI,EAAE,SAAS,SAAS,CAAE,QAAO;;AAE7D,QAAO;;AAGT,eAAsB,kBAAkB,KAA0C;AAChF,KAAI,CAAC,WAAW,IAAI,WAAW,CAC7B,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;CAGH,IAAI;AACJ,KAAI;AACF,QAAM,WAAW,IAAI,WAAW;SAC1B;AACN,SAAO;GACL,IAAI;GACJ,OAAO;GACP,QAAQ;GACR,SAAS;GACT,OAAO,EAAE;GACV;;CAGH,MAAM,aAAa,6BAA6B,IAAI;CACpD,MAAM,WAAW,WAAW,OAAO,IAAI,CAAC,GAAG,WAAW,GAAG,OAAO,KAAK,iBAAiB;AAEtF,MAAK,MAAM,MAAM,SAEf,KADY,iBAAiB,GACtB,EAAE,MAAM,CACb,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;AAIL,KAAI,uBAAuB,CACzB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;AAGH,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,CAAC,gDAAgD,uDAAuD;EAChH"}
@@ -60,7 +60,6 @@ async function checkWorkspaceStatus(ctx) {
60
60
  "Run: xopc init or xopc onboard"
61
61
  ]
62
62
  };
63
- if (!hasProfileFile(WORKSPACE_FILES.USER)) hints.push(`${WORKSPACE_FILES.USER} is optional; add a user profile for better context.`);
64
63
  if (!hasProfileFile(WORKSPACE_FILES.TOOLS)) hints.push(`${WORKSPACE_FILES.TOOLS} is optional; add tool notes if you use many tools.`);
65
64
  if (!existsSync(join(root, ".git"))) hints.push("No .git in workspace; version control is recommended for backup and history.");
66
65
  if (hints.length > 0) return {
@@ -1 +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, resolveAgentProfileDir, 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 profileRoot = resolveAgentProfileDir(config, agentId);\n const hints: string[] = [];\n\n const hasProfileFile = (name: string): boolean => existsSync(join(profileRoot, name));\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 init or xopc onboard'],\n };\n }\n\n if (!existsSync(profileRoot)) {\n return {\n id: 'workspace-status',\n label: 'Workspace',\n status: 'warn',\n message: 'Agent profile directory is missing.',\n hints: [profileRoot, 'Run: xopc init or xopc onboard'],\n };\n }\n\n const missing: string[] = [];\n if (!hasProfileFile(WORKSPACE_FILES.SOUL)) missing.push(WORKSPACE_FILES.SOUL);\n if (!hasProfileFile(WORKSPACE_FILES.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 profile files missing: ${missing.join(', ')}.`,\n hints: [profileRoot, root, 'Run: xopc init or xopc onboard'],\n };\n }\n\n if (!hasProfileFile(WORKSPACE_FILES.USER)) {\n hints.push(`${WORKSPACE_FILES.USER} is optional; add a user profile for better context.`);\n }\n if (!hasProfileFile(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: 'Markdown workspace and essential profile files are present.',\n hints,\n };\n }\n\n return {\n id: 'workspace-status',\n label: 'Workspace',\n status: 'pass',\n message: 'Markdown workspace and essential profile files look good.',\n hints: [profileRoot, root],\n };\n}\n"],"mappings":";;;;;;kBAG2H;aACjE;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,cAAc,uBAAuB,QAAQ,QAAQ;CAC3D,MAAM,QAAkB,EAAE;CAE1B,MAAM,kBAAkB,SAA0B,WAAW,KAAK,aAAa,KAAK,CAAC;AAErF,KAAI,CAAC,WAAW,KAAK,CACnB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,CAAC,MAAM,iCAAiC;EAChD;AAGH,KAAI,CAAC,WAAW,YAAY,CAC1B,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,CAAC,aAAa,iCAAiC;EACvD;CAGH,MAAM,UAAoB,EAAE;AAC5B,KAAI,CAAC,eAAe,gBAAgB,KAAK,CAAE,SAAQ,KAAK,gBAAgB,KAAK;AAC7E,KAAI,CAAC,eAAe,gBAAgB,SAAS,CAAE,SAAQ,KAAK,gBAAgB,SAAS;AAErF,KAAI,QAAQ,SAAS,EACnB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,oCAAoC,QAAQ,KAAK,KAAK,CAAC;EAChE,OAAO;GAAC;GAAa;GAAM;GAAiC;EAC7D;AAGH,KAAI,CAAC,eAAe,gBAAgB,KAAK,CACvC,OAAM,KAAK,GAAG,gBAAgB,KAAK,sDAAsD;AAE3F,KAAI,CAAC,eAAe,gBAAgB,MAAM,CACxC,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;EACN,SAAS;EACT,OAAO,CAAC,aAAa,KAAK;EAC7B"}
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, resolveAgentProfileDir, 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 profileRoot = resolveAgentProfileDir(config, agentId);\n const hints: string[] = [];\n\n const hasProfileFile = (name: string): boolean => existsSync(join(profileRoot, name));\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 init or xopc onboard'],\n };\n }\n\n if (!existsSync(profileRoot)) {\n return {\n id: 'workspace-status',\n label: 'Workspace',\n status: 'warn',\n message: 'Agent profile directory is missing.',\n hints: [profileRoot, 'Run: xopc init or xopc onboard'],\n };\n }\n\n const missing: string[] = [];\n if (!hasProfileFile(WORKSPACE_FILES.SOUL)) missing.push(WORKSPACE_FILES.SOUL);\n if (!hasProfileFile(WORKSPACE_FILES.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 profile files missing: ${missing.join(', ')}.`,\n hints: [profileRoot, root, 'Run: xopc init or xopc onboard'],\n };\n }\n\n if (!hasProfileFile(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: 'Markdown workspace and essential profile files are present.',\n hints,\n };\n }\n\n return {\n id: 'workspace-status',\n label: 'Workspace',\n status: 'pass',\n message: 'Markdown workspace and essential profile files look good.',\n hints: [profileRoot, root],\n };\n}\n"],"mappings":";;;;;;kBAG2H;aACjE;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,cAAc,uBAAuB,QAAQ,QAAQ;CAC3D,MAAM,QAAkB,EAAE;CAE1B,MAAM,kBAAkB,SAA0B,WAAW,KAAK,aAAa,KAAK,CAAC;AAErF,KAAI,CAAC,WAAW,KAAK,CACnB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,CAAC,MAAM,iCAAiC;EAChD;AAGH,KAAI,CAAC,WAAW,YAAY,CAC1B,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,CAAC,aAAa,iCAAiC;EACvD;CAGH,MAAM,UAAoB,EAAE;AAC5B,KAAI,CAAC,eAAe,gBAAgB,KAAK,CAAE,SAAQ,KAAK,gBAAgB,KAAK;AAC7E,KAAI,CAAC,eAAe,gBAAgB,SAAS,CAAE,SAAQ,KAAK,gBAAgB,SAAS;AAErF,KAAI,QAAQ,SAAS,EACnB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,oCAAoC,QAAQ,KAAK,KAAK,CAAC;EAChE,OAAO;GAAC;GAAa;GAAM;GAAiC;EAC7D;AAGH,KAAI,CAAC,eAAe,gBAAgB,MAAM,CACxC,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;EACN,SAAS;EACT,OAAO,CAAC,aAAa,KAAK;EAC7B"}
@@ -11,13 +11,14 @@ import { checkSessionIntegrity } from "./checks/session-integrity.js";
11
11
  import { checkGatewayService } from "./checks/gateway-service.js";
12
12
  import { checkSecurityAudit } from "./checks/security-audit.js";
13
13
  import { checkWorkspaceStatus } from "./checks/workspace-status.js";
14
- import { checkCronHealth } from "./checks/cron-health.js";
15
14
  import { checkVersionUpdate } from "./checks/version-check.js";
16
15
  import { checkChannelPlugins } from "./checks/channel-plugins.js";
16
+ import { checkMigrations } from "./checks/migrations.js";
17
17
  //#region src/cli/commands/doctor/flow.ts
18
18
  const DOCTOR_CHECKS = [
19
19
  checkVersionUpdate,
20
20
  checkNodeVersion,
21
+ checkMigrations,
21
22
  checkConfigHealth,
22
23
  checkStateIntegrity,
23
24
  checkDatabaseSchema,
@@ -28,7 +29,6 @@ const DOCTOR_CHECKS = [
28
29
  checkWorkspaceStatus,
29
30
  checkGatewayService,
30
31
  checkGatewayHealth,
31
- checkCronHealth,
32
32
  checkSessionIntegrity
33
33
  ];
34
34
  /**
@@ -1 +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 { checkDatabaseSchema } from './checks/database-schema.js';\nimport { checkProviderAuth } from './checks/provider-auth.js';\nimport { checkChannelConfig } from './checks/channel-config.js';\nimport { checkChannelPairingPending } from './checks/channel-pairing-pending.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 checkDatabaseSchema,\n checkProviderAuth,\n checkChannelConfig,\n checkChannelPairingPending,\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 if (ctx.options.security) {\n return [await checkSecurityAudit(ctx)];\n }\n\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, { security: ctx.options.security });\n }\n\n return results;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,MAAM,gBAA+B;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,eAAsB,qBAAqB,KAA4C;AACrF,KAAI,IAAI,QAAQ,SACd,QAAO,CAAC,MAAM,mBAAmB,IAAI,CAAC;CAGxC,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,SAAS,EAAE,UAAU,IAAI,QAAQ,UAAU,CAAC;AAG3D,QAAO"}
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 { checkDatabaseSchema } from './checks/database-schema.js';\nimport { checkProviderAuth } from './checks/provider-auth.js';\nimport { checkChannelConfig } from './checks/channel-config.js';\nimport { checkChannelPairingPending } from './checks/channel-pairing-pending.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 { checkVersionUpdate } from './checks/version-check.js';\nimport { checkChannelPlugins } from './checks/channel-plugins.js';\nimport { checkMigrations } from './checks/migrations.js';\n\nconst DOCTOR_CHECKS: DoctorCheck[] = [\n checkVersionUpdate,\n checkNodeVersion,\n checkMigrations,\n checkConfigHealth,\n checkStateIntegrity,\n checkDatabaseSchema,\n checkProviderAuth,\n checkChannelConfig,\n checkChannelPairingPending,\n checkSecurityAudit,\n checkWorkspaceStatus,\n checkGatewayService,\n checkGatewayHealth,\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 if (ctx.options.security) {\n return [await checkSecurityAudit(ctx)];\n }\n\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, { security: ctx.options.security });\n }\n\n return results;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,MAAM,gBAA+B;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,eAAsB,qBAAqB,KAA4C;AACrF,KAAI,IAAI,QAAQ,SACd,QAAO,CAAC,MAAM,mBAAmB,IAAI,CAAC;CAGxC,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,SAAS,EAAE,UAAU,IAAI,QAAQ,UAAU,CAAC;AAG3D,QAAO"}
@@ -29,9 +29,9 @@ const METHOD_ALIASES = {
29
29
  method: "GET",
30
30
  path: "/api/channels/status"
31
31
  },
32
- cron: {
32
+ automations: {
33
33
  method: "GET",
34
- path: "/api/cron"
34
+ path: "/api/automations"
35
35
  },
36
36
  logs: {
37
37
  method: "GET",
@@ -1 +1 @@
1
- {"version":3,"file":"call.js","names":[],"sources":["../../../../../src/cli/commands/gateway/call.ts"],"sourcesContent":["import { Command } from 'commander';\n\nimport {\n addGatewayClientOptions,\n parseGatewayClientOptions,\n} from '../../utils/gateway-client-options.js';\nimport { getContextWithOpts } from '../../context.js';\nimport { resolveConfigPath } from '../../../config/paths.js';\n\nconst METHOD_ALIASES: Record<string, { method: 'GET' | 'POST'; path: string }> = {\n health: { method: 'GET', path: '/api/health' },\n status: { method: 'GET', path: '/api/status' },\n config: { method: 'GET', path: '/api/config' },\n sessions: { method: 'GET', path: '/api/sessions' },\n models: { method: 'GET', path: '/api/models' },\n channels: { method: 'GET', path: '/api/channels/status' },\n cron: { method: 'GET', path: '/api/cron' },\n logs: { method: 'GET', path: '/api/logs' },\n agents: { method: 'GET', path: '/api/agents' },\n};\n\nexport function createCallCommand(): Command {\n const cmd = new Command('call')\n .description('Call a gateway API method')\n .argument(\n '<method>',\n `Method name or API path. Built-in aliases: ${Object.keys(METHOD_ALIASES).join(', ')}`,\n )\n .option('--params <json>', 'JSON body for POST/PATCH/DELETE requests', '{}')\n .option('--http-method <method>', 'HTTP method when using a raw path', 'GET');\n\n addGatewayClientOptions(cmd);\n\n cmd.action(async (methodArg: string, options: { params?: string; httpMethod?: string }) => {\n const ctx = getContextWithOpts();\n const configPath = ctx.configPath || resolveConfigPath();\n const { callGatewayApi } = await import('../../utils/gateway-client.js');\n const clientOpts = { ...parseGatewayClientOptions(options as Record<string, unknown>), configPath };\n\n const alias = METHOD_ALIASES[methodArg.toLowerCase()];\n let httpMethod: 'GET' | 'POST' | 'PATCH' | 'DELETE';\n let apiPath: string;\n\n if (alias) {\n httpMethod = alias.method;\n apiPath = alias.path;\n } else if (methodArg.startsWith('/')) {\n httpMethod = (options.httpMethod?.toUpperCase() ?? 'GET') as 'GET' | 'POST' | 'PATCH' | 'DELETE';\n apiPath = methodArg;\n } else {\n httpMethod = (options.httpMethod?.toUpperCase() ?? 'GET') as 'GET' | 'POST' | 'PATCH' | 'DELETE';\n apiPath = `/api/${methodArg}`;\n }\n\n let body: unknown | undefined;\n if (httpMethod !== 'GET' && options.params && options.params !== '{}') {\n try {\n body = JSON.parse(options.params);\n } catch {\n console.error(`❌ Invalid JSON in --params: ${options.params}`);\n process.exit(1);\n }\n }\n\n const result = await callGatewayApi(httpMethod, apiPath, clientOpts, body);\n\n if (clientOpts.json || result.ok) {\n console.log(\n JSON.stringify(\n result.ok\n ? result.data\n : { error: result.error, status: result.status, durationMs: result.durationMs },\n null,\n 2,\n ),\n );\n }\n\n if (!result.ok) {\n if (!clientOpts.json) {\n console.error(`❌ Gateway call failed: ${result.error} (status ${result.status}, ${result.durationMs}ms)`);\n }\n process.exit(1);\n }\n });\n\n return cmd;\n}\n"],"mappings":";;;;;YAO6D;AAE7D,MAAM,iBAA2E;CAC/E,QAAQ;EAAE,QAAQ;EAAO,MAAM;EAAe;CAC9C,QAAQ;EAAE,QAAQ;EAAO,MAAM;EAAe;CAC9C,QAAQ;EAAE,QAAQ;EAAO,MAAM;EAAe;CAC9C,UAAU;EAAE,QAAQ;EAAO,MAAM;EAAiB;CAClD,QAAQ;EAAE,QAAQ;EAAO,MAAM;EAAe;CAC9C,UAAU;EAAE,QAAQ;EAAO,MAAM;EAAwB;CACzD,MAAM;EAAE,QAAQ;EAAO,MAAM;EAAa;CAC1C,MAAM;EAAE,QAAQ;EAAO,MAAM;EAAa;CAC1C,QAAQ;EAAE,QAAQ;EAAO,MAAM;EAAe;CAC/C;AAED,SAAgB,oBAA6B;CAC3C,MAAM,MAAM,IAAI,QAAQ,OAAO,CAC5B,YAAY,4BAA4B,CACxC,SACC,YACA,8CAA8C,OAAO,KAAK,eAAe,CAAC,KAAK,KAAK,GACrF,CACA,OAAO,mBAAmB,4CAA4C,KAAK,CAC3E,OAAO,0BAA0B,qCAAqC,MAAM;AAE/E,yBAAwB,IAAI;AAE5B,KAAI,OAAO,OAAO,WAAmB,YAAsD;EAEzF,MAAM,aADM,oBACU,CAAC,cAAc,mBAAmB;EACxD,MAAM,EAAE,mBAAmB,MAAM,OAAO;EACxC,MAAM,aAAa;GAAE,GAAG,0BAA0B,QAAmC;GAAE;GAAY;EAEnG,MAAM,QAAQ,eAAe,UAAU,aAAa;EACpD,IAAI;EACJ,IAAI;AAEJ,MAAI,OAAO;AACT,gBAAa,MAAM;AACnB,aAAU,MAAM;aACP,UAAU,WAAW,IAAI,EAAE;AACpC,gBAAc,QAAQ,YAAY,aAAa,IAAI;AACnD,aAAU;SACL;AACL,gBAAc,QAAQ,YAAY,aAAa,IAAI;AACnD,aAAU,QAAQ;;EAGpB,IAAI;AACJ,MAAI,eAAe,SAAS,QAAQ,UAAU,QAAQ,WAAW,KAC/D,KAAI;AACF,UAAO,KAAK,MAAM,QAAQ,OAAO;UAC3B;AACN,WAAQ,MAAM,+BAA+B,QAAQ,SAAS;AAC9D,WAAQ,KAAK,EAAE;;EAInB,MAAM,SAAS,MAAM,eAAe,YAAY,SAAS,YAAY,KAAK;AAE1E,MAAI,WAAW,QAAQ,OAAO,GAC5B,SAAQ,IACN,KAAK,UACH,OAAO,KACH,OAAO,OACP;GAAE,OAAO,OAAO;GAAO,QAAQ,OAAO;GAAQ,YAAY,OAAO;GAAY,EACjF,MACA,EACD,CACF;AAGH,MAAI,CAAC,OAAO,IAAI;AACd,OAAI,CAAC,WAAW,KACd,SAAQ,MAAM,0BAA0B,OAAO,MAAM,WAAW,OAAO,OAAO,IAAI,OAAO,WAAW,KAAK;AAE3G,WAAQ,KAAK,EAAE;;GAEjB;AAEF,QAAO"}
1
+ {"version":3,"file":"call.js","names":[],"sources":["../../../../../src/cli/commands/gateway/call.ts"],"sourcesContent":["import { Command } from 'commander';\n\nimport {\n addGatewayClientOptions,\n parseGatewayClientOptions,\n} from '../../utils/gateway-client-options.js';\nimport { getContextWithOpts } from '../../context.js';\nimport { resolveConfigPath } from '../../../config/paths.js';\n\nconst METHOD_ALIASES: Record<string, { method: 'GET' | 'POST'; path: string }> = {\n health: { method: 'GET', path: '/api/health' },\n status: { method: 'GET', path: '/api/status' },\n config: { method: 'GET', path: '/api/config' },\n sessions: { method: 'GET', path: '/api/sessions' },\n models: { method: 'GET', path: '/api/models' },\n channels: { method: 'GET', path: '/api/channels/status' },\n automations: { method: 'GET', path: '/api/automations' },\n logs: { method: 'GET', path: '/api/logs' },\n agents: { method: 'GET', path: '/api/agents' },\n};\n\nexport function createCallCommand(): Command {\n const cmd = new Command('call')\n .description('Call a gateway API method')\n .argument(\n '<method>',\n `Method name or API path. Built-in aliases: ${Object.keys(METHOD_ALIASES).join(', ')}`,\n )\n .option('--params <json>', 'JSON body for POST/PATCH/DELETE requests', '{}')\n .option('--http-method <method>', 'HTTP method when using a raw path', 'GET');\n\n addGatewayClientOptions(cmd);\n\n cmd.action(async (methodArg: string, options: { params?: string; httpMethod?: string }) => {\n const ctx = getContextWithOpts();\n const configPath = ctx.configPath || resolveConfigPath();\n const { callGatewayApi } = await import('../../utils/gateway-client.js');\n const clientOpts = { ...parseGatewayClientOptions(options as Record<string, unknown>), configPath };\n\n const alias = METHOD_ALIASES[methodArg.toLowerCase()];\n let httpMethod: 'GET' | 'POST' | 'PATCH' | 'DELETE';\n let apiPath: string;\n\n if (alias) {\n httpMethod = alias.method;\n apiPath = alias.path;\n } else if (methodArg.startsWith('/')) {\n httpMethod = (options.httpMethod?.toUpperCase() ?? 'GET') as 'GET' | 'POST' | 'PATCH' | 'DELETE';\n apiPath = methodArg;\n } else {\n httpMethod = (options.httpMethod?.toUpperCase() ?? 'GET') as 'GET' | 'POST' | 'PATCH' | 'DELETE';\n apiPath = `/api/${methodArg}`;\n }\n\n let body: unknown | undefined;\n if (httpMethod !== 'GET' && options.params && options.params !== '{}') {\n try {\n body = JSON.parse(options.params);\n } catch {\n console.error(`❌ Invalid JSON in --params: ${options.params}`);\n process.exit(1);\n }\n }\n\n const result = await callGatewayApi(httpMethod, apiPath, clientOpts, body);\n\n if (clientOpts.json || result.ok) {\n console.log(\n JSON.stringify(\n result.ok\n ? result.data\n : { error: result.error, status: result.status, durationMs: result.durationMs },\n null,\n 2,\n ),\n );\n }\n\n if (!result.ok) {\n if (!clientOpts.json) {\n console.error(`❌ Gateway call failed: ${result.error} (status ${result.status}, ${result.durationMs}ms)`);\n }\n process.exit(1);\n }\n });\n\n return cmd;\n}\n"],"mappings":";;;;;YAO6D;AAE7D,MAAM,iBAA2E;CAC/E,QAAQ;EAAE,QAAQ;EAAO,MAAM;EAAe;CAC9C,QAAQ;EAAE,QAAQ;EAAO,MAAM;EAAe;CAC9C,QAAQ;EAAE,QAAQ;EAAO,MAAM;EAAe;CAC9C,UAAU;EAAE,QAAQ;EAAO,MAAM;EAAiB;CAClD,QAAQ;EAAE,QAAQ;EAAO,MAAM;EAAe;CAC9C,UAAU;EAAE,QAAQ;EAAO,MAAM;EAAwB;CACzD,aAAa;EAAE,QAAQ;EAAO,MAAM;EAAoB;CACxD,MAAM;EAAE,QAAQ;EAAO,MAAM;EAAa;CAC1C,QAAQ;EAAE,QAAQ;EAAO,MAAM;EAAe;CAC/C;AAED,SAAgB,oBAA6B;CAC3C,MAAM,MAAM,IAAI,QAAQ,OAAO,CAC5B,YAAY,4BAA4B,CACxC,SACC,YACA,8CAA8C,OAAO,KAAK,eAAe,CAAC,KAAK,KAAK,GACrF,CACA,OAAO,mBAAmB,4CAA4C,KAAK,CAC3E,OAAO,0BAA0B,qCAAqC,MAAM;AAE/E,yBAAwB,IAAI;AAE5B,KAAI,OAAO,OAAO,WAAmB,YAAsD;EAEzF,MAAM,aADM,oBACU,CAAC,cAAc,mBAAmB;EACxD,MAAM,EAAE,mBAAmB,MAAM,OAAO;EACxC,MAAM,aAAa;GAAE,GAAG,0BAA0B,QAAmC;GAAE;GAAY;EAEnG,MAAM,QAAQ,eAAe,UAAU,aAAa;EACpD,IAAI;EACJ,IAAI;AAEJ,MAAI,OAAO;AACT,gBAAa,MAAM;AACnB,aAAU,MAAM;aACP,UAAU,WAAW,IAAI,EAAE;AACpC,gBAAc,QAAQ,YAAY,aAAa,IAAI;AACnD,aAAU;SACL;AACL,gBAAc,QAAQ,YAAY,aAAa,IAAI;AACnD,aAAU,QAAQ;;EAGpB,IAAI;AACJ,MAAI,eAAe,SAAS,QAAQ,UAAU,QAAQ,WAAW,KAC/D,KAAI;AACF,UAAO,KAAK,MAAM,QAAQ,OAAO;UAC3B;AACN,WAAQ,MAAM,+BAA+B,QAAQ,SAAS;AAC9D,WAAQ,KAAK,EAAE;;EAInB,MAAM,SAAS,MAAM,eAAe,YAAY,SAAS,YAAY,KAAK;AAE1E,MAAI,WAAW,QAAQ,OAAO,GAC5B,SAAQ,IACN,KAAK,UACH,OAAO,KACH,OAAO,OACP;GAAE,OAAO,OAAO;GAAO,QAAQ,OAAO;GAAQ,YAAY,OAAO;GAAY,EACjF,MACA,EACD,CACF;AAGH,MAAI,CAAC,OAAO,IAAI;AACd,OAAI,CAAC,WAAW,KACd,SAAQ,MAAM,0BAA0B,OAAO,MAAM,WAAW,OAAO,OAAO,IAAI,OAAO,WAAW,KAAK;AAE3G,WAAQ,KAAK,EAAE;;GAEjB;AAEF,QAAO"}
@@ -1,8 +1,8 @@
1
1
  import { init_paths, resolveConfigPath } from "../../../config/paths.js";
2
2
  import { loadConfig } from "../../../config/loader.js";
3
3
  import "../../../config/index.js";
4
- import { isRestartEnabled } from "../../../config/commands.flags.js";
5
4
  import { resolveGatewayService } from "../../../daemon/service.js";
5
+ import { isRestartEnabled } from "../../../config/commands.flags.js";
6
6
  import { authorizeGatewaySigusr1Restart, writeGatewayRestartIntentSync } from "../../../infra/restart.js";
7
7
  import { findVerifiedGatewayListenerPidsOnPortSync, formatGatewayPidList, signalVerifiedGatewayPidSync } from "../../../infra/gateway-processes.js";
8
8
  import { runServiceRestart, runServiceStop } from "./lifecycle-core.js";