@xopcai/xopc 0.0.118 → 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 (468) hide show
  1. package/README.md +2 -1
  2. package/README.zh-CN.md +2 -1
  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-dzUrQoeZ.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--wMEL00f.js → apps-page-DU0dz9Zo.js} +1 -1
  10. package/dist/gateway/static/root/assets/{archive-plugin-Cki4SfU2.js → archive-plugin-BkVIgZzA.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-D-KnS2Do.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-D2sgvJja.js → binary-plugins-B4TO_bsn.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-DIq-4Gvb.js → block-editor-DJRWwWNI.js} +28 -28
  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-DYu1KaFQ.js → extension-debug-page-DYh402XV.js} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-page-B3W6QwlZ.js → extension-page-Cr_TizrN.js} +1 -1
  27. package/dist/gateway/static/root/assets/{extension-settings-page-D7VQ-cxE.js → extension-settings-page-BU1KoKRj.js} +1 -1
  28. package/dist/gateway/static/root/assets/{fetch-B7xDPu-R.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-BTBLSeUu.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-CYj9FWCp.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-CQQgzPr3.js → goals-config-api-DqxVi0p5.js} +1 -1
  35. package/dist/gateway/static/root/assets/{goals-page-BHitvJAv.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-C2Uqvae9.js → logs-page-DLXPcksQ.js} +2 -2
  42. package/dist/gateway/static/root/assets/{markdown-split-BwOFrJ2E.js → markdown-split-CpHxbtWJ.js} +1 -1
  43. package/dist/gateway/static/root/assets/{media-plugins-Cnz6Q5G6.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-B-Svpmza.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-Bss4TiwP.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-BRNjdgKq.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-Dub9sy8r.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-BeFLavGi.js → settings-collapsible-section-BouO6JTi.js} +1 -1
  57. package/dist/gateway/static/root/assets/{settings-form-section-dmyaPOTG.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-C8glrdqe.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-DqlWTsDb.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-C73IVZeC.js → voice-api-key-field-CeEevm7z.js} +1 -1
  71. package/dist/gateway/static/root/assets/{voice-player-store-C_ArLJPM.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 +4 -8
  78. package/dist/src/agent/agent-manager.js.map +1 -1
  79. package/dist/src/agent/embedded/run-for-session.js +102 -14
  80. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  81. package/dist/src/agent/fallback/candidates.d.ts +0 -8
  82. package/dist/src/agent/fallback/candidates.js.map +1 -1
  83. package/dist/src/agent/index.js +1 -1
  84. package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -3
  85. package/dist/src/agent/lifecycle/handlers/compaction.js +1 -16
  86. package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
  87. package/dist/src/agent/lifecycle/progress.d.ts +0 -1
  88. package/dist/src/agent/lifecycle/progress.js +1 -6
  89. package/dist/src/agent/lifecycle/progress.js.map +1 -1
  90. package/dist/src/agent/lifecycle/timeout-wrapper.d.ts +1 -2
  91. package/dist/src/agent/lifecycle/timeout-wrapper.js +1 -7
  92. package/dist/src/agent/lifecycle/timeout-wrapper.js.map +1 -1
  93. package/dist/src/agent/middleware/self-verify.d.ts +0 -1
  94. package/dist/src/agent/middleware/self-verify.js +0 -2
  95. package/dist/src/agent/middleware/self-verify.js.map +1 -1
  96. package/dist/src/agent/models/index.d.ts +1 -1
  97. package/dist/src/agent/models/manager.d.ts +4 -20
  98. package/dist/src/agent/models/manager.js +9 -126
  99. package/dist/src/agent/models/manager.js.map +1 -1
  100. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +0 -4
  101. package/dist/src/agent/orchestration/agent-orchestrator.js +1 -9
  102. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  103. package/dist/src/agent/prompt/sections/tooling.js +2 -2
  104. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  105. package/dist/src/agent/prompt/service-prompt-builder.d.ts +0 -1
  106. package/dist/src/agent/prompt/service-prompt-builder.js +0 -12
  107. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  108. package/dist/src/agent/prompt/subagent-context.js +1 -1
  109. package/dist/src/agent/prompt/subagent-context.js.map +1 -1
  110. package/dist/src/agent/prompt/types.d.ts +1 -1
  111. package/dist/src/agent/service.d.ts +1 -9
  112. package/dist/src/agent/service.js +3 -40
  113. package/dist/src/agent/service.js.map +1 -1
  114. package/dist/src/agent/service.types.d.ts +2 -2
  115. package/dist/src/agent/session/session-config-service.d.ts +11 -11
  116. package/dist/src/agent/session/session-config-service.js +14 -14
  117. package/dist/src/agent/session/session-config-service.js.map +1 -1
  118. package/dist/src/agent/session/session-inspector.js +3 -2
  119. package/dist/src/agent/session/session-inspector.js.map +1 -1
  120. package/dist/src/agent/starter-agents.js +12 -12
  121. package/dist/src/agent/starter-agents.js.map +1 -1
  122. package/dist/src/agent/tools/automation-tool.d.ts +14 -0
  123. package/dist/src/agent/tools/automation-tool.js +102 -0
  124. package/dist/src/agent/tools/automation-tool.js.map +1 -0
  125. package/dist/src/agent/tools/delegate-tool.js +1 -1
  126. package/dist/src/agent/tools/delegate-tool.js.map +1 -1
  127. package/dist/src/agent/tools/factory.d.ts +3 -3
  128. package/dist/src/agent/tools/factory.js +2 -2
  129. package/dist/src/agent/tools/factory.js.map +1 -1
  130. package/dist/src/agent/tools/index.d.ts +1 -1
  131. package/dist/src/agent/tools/index.js +2 -2
  132. package/dist/src/agent-manifest/resolver.d.ts +1 -0
  133. package/dist/src/agent-manifest/resolver.js +1 -0
  134. package/dist/src/agent-manifest/resolver.js.map +1 -1
  135. package/dist/src/agent-manifest/schema.d.ts +6 -0
  136. package/dist/src/agent-manifest/schema.js +12 -3
  137. package/dist/src/agent-manifest/schema.js.map +1 -1
  138. package/dist/src/ai-assist/text-assist.d.ts +1 -1
  139. package/dist/src/ai-assist/text-assist.js +56 -0
  140. package/dist/src/ai-assist/text-assist.js.map +1 -1
  141. package/dist/src/auth/profiles/store.js.map +1 -1
  142. package/dist/src/automations/api/routes.d.ts +3 -0
  143. package/dist/src/automations/api/routes.js +193 -0
  144. package/dist/src/automations/api/routes.js.map +1 -0
  145. package/dist/src/automations/domain/index.d.ts +3 -0
  146. package/dist/src/automations/domain/index.js +3 -0
  147. package/dist/src/automations/domain/schedule.d.ts +4 -0
  148. package/dist/src/automations/domain/schedule.js +37 -0
  149. package/dist/src/automations/domain/schedule.js.map +1 -0
  150. package/dist/src/automations/domain/types.d.ts +160 -0
  151. package/dist/src/automations/domain/validation.d.ts +370 -0
  152. package/dist/src/automations/domain/validation.js +149 -0
  153. package/dist/src/automations/domain/validation.js.map +1 -0
  154. package/dist/src/automations/draft/automation-draft-prompt.d.ts +26 -0
  155. package/dist/src/automations/draft/automation-draft-prompt.js +127 -0
  156. package/dist/src/automations/draft/automation-draft-prompt.js.map +1 -0
  157. package/dist/src/automations/draft/automation-draft-service.d.ts +12 -0
  158. package/dist/src/automations/draft/automation-draft-service.js +135 -0
  159. package/dist/src/automations/draft/automation-draft-service.js.map +1 -0
  160. package/dist/src/automations/draft/automation-draft-validator.d.ts +99 -0
  161. package/dist/src/automations/draft/automation-draft-validator.js +105 -0
  162. package/dist/src/automations/draft/automation-draft-validator.js.map +1 -0
  163. package/dist/src/automations/draft/automation-draft.types.d.ts +40 -0
  164. package/dist/src/automations/draft/index.d.ts +3 -0
  165. package/dist/src/automations/draft/index.js +3 -0
  166. package/dist/src/automations/index.d.ts +3 -0
  167. package/dist/src/automations/index.js +8 -0
  168. package/dist/src/automations/product-events.d.ts +5 -0
  169. package/dist/src/automations/product-events.js +21 -0
  170. package/dist/src/automations/product-events.js.map +1 -0
  171. package/dist/src/automations/service/action-executor.d.ts +9 -0
  172. package/dist/src/automations/service/action-executor.js +157 -0
  173. package/dist/src/automations/service/action-executor.js.map +1 -0
  174. package/dist/src/automations/service/automation-service.d.ts +54 -0
  175. package/dist/src/automations/service/automation-service.js +404 -0
  176. package/dist/src/automations/service/automation-service.js.map +1 -0
  177. package/dist/src/automations/service/index.d.ts +2 -0
  178. package/dist/src/automations/service/index.js +3 -0
  179. package/dist/src/automations/storage/automation-repository.d.ts +6 -0
  180. package/dist/src/automations/storage/automation-repository.js +61 -0
  181. package/dist/src/automations/storage/automation-repository.js.map +1 -0
  182. package/dist/src/automations/storage/automation-run-repository.d.ts +17 -0
  183. package/dist/src/automations/storage/automation-run-repository.js +130 -0
  184. package/dist/src/automations/storage/automation-run-repository.js.map +1 -0
  185. package/dist/src/automations/storage/index.d.ts +2 -0
  186. package/dist/src/automations/storage/index.js +3 -0
  187. package/dist/src/channels/plugin-types.d.ts +3 -0
  188. package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
  189. package/dist/src/cli/command-catalog.js +0 -39
  190. package/dist/src/cli/command-catalog.js.map +1 -1
  191. package/dist/src/cli/command-loaders.js +0 -1
  192. package/dist/src/cli/command-loaders.js.map +1 -1
  193. package/dist/src/cli/command-manifest.js +0 -4
  194. package/dist/src/cli/command-manifest.js.map +1 -1
  195. package/dist/src/cli/commands/agents.js +7 -6
  196. package/dist/src/cli/commands/agents.js.map +1 -1
  197. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  198. package/dist/src/cli/commands/doctor/checks/{cron-health.d.ts → migrations.d.ts} +1 -1
  199. package/dist/src/cli/commands/doctor/checks/migrations.js +40 -0
  200. package/dist/src/cli/commands/doctor/checks/migrations.js.map +1 -0
  201. package/dist/src/cli/commands/doctor/flow.js +2 -2
  202. package/dist/src/cli/commands/doctor/flow.js.map +1 -1
  203. package/dist/src/cli/commands/gateway/call.js +2 -2
  204. package/dist/src/cli/commands/gateway/call.js.map +1 -1
  205. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  206. package/dist/src/cli/commands/gateway/run-foreground.js +4 -2
  207. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  208. package/dist/src/cli/commands/init.js +26 -8
  209. package/dist/src/cli/commands/init.js.map +1 -1
  210. package/dist/src/cli/commands/tui.js +24 -2
  211. package/dist/src/cli/commands/tui.js.map +1 -1
  212. package/dist/src/cli/utils/init-workspace-core.js +2 -0
  213. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  214. package/dist/src/commands/agents.config.d.ts +9 -0
  215. package/dist/src/commands/agents.config.js +40 -2
  216. package/dist/src/commands/agents.config.js.map +1 -1
  217. package/dist/src/config/agent-profile.js +4 -3
  218. package/dist/src/config/agent-profile.js.map +1 -1
  219. package/dist/src/config/agent-typed-models.js.map +1 -1
  220. package/dist/src/config/config-surface.d.ts +3 -0
  221. package/dist/src/config/index.d.ts +0 -1
  222. package/dist/src/config/index.js +3 -3
  223. package/dist/src/config/index.js.map +1 -1
  224. package/dist/src/config/paths.d.ts +0 -9
  225. package/dist/src/config/paths.js +1 -14
  226. package/dist/src/config/paths.js.map +1 -1
  227. package/dist/src/config/profile.js +0 -1
  228. package/dist/src/config/profile.js.map +1 -1
  229. package/dist/src/config/rules.js +0 -5
  230. package/dist/src/config/rules.js.map +1 -1
  231. package/dist/src/config/schema.d.ts +13 -12
  232. package/dist/src/config/schema.js +22 -26
  233. package/dist/src/config/schema.js.map +1 -1
  234. package/dist/src/config/web-patch.d.ts +0 -12
  235. package/dist/src/config/web-patch.js +2 -29
  236. package/dist/src/config/web-patch.js.map +1 -1
  237. package/dist/src/extensions/api.d.ts +2 -0
  238. package/dist/src/extensions/api.js +10 -0
  239. package/dist/src/extensions/api.js.map +1 -1
  240. package/dist/src/extensions/extension-registry-impl.d.ts +4 -1
  241. package/dist/src/extensions/extension-registry-impl.js +8 -0
  242. package/dist/src/extensions/extension-registry-impl.js.map +1 -1
  243. package/dist/src/extensions/loader.d.ts +3 -3
  244. package/dist/src/extensions/loader.js +3 -3
  245. package/dist/src/extensions/loader.js.map +1 -1
  246. package/dist/src/extensions/sdk/testing.d.ts +2 -0
  247. package/dist/src/extensions/sdk/testing.js +7 -0
  248. package/dist/src/extensions/sdk/testing.js.map +1 -1
  249. package/dist/src/extensions/types/core.d.ts +10 -1
  250. package/dist/src/extensions/types/index.d.ts +1 -1
  251. package/dist/src/extensions/types/{phase4.d.ts → registration.d.ts} +2 -2
  252. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  253. package/dist/src/gateway/agent-builtin-tools.js +1 -1
  254. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  255. package/dist/src/gateway/agents-admin.d.ts +1 -0
  256. package/dist/src/gateway/agents-admin.js +13 -15
  257. package/dist/src/gateway/agents-admin.js.map +1 -1
  258. package/dist/src/gateway/capability-presets-admin.d.ts +1 -0
  259. package/dist/src/gateway/capability-presets-admin.js +19 -10
  260. package/dist/src/gateway/capability-presets-admin.js.map +1 -1
  261. package/dist/src/gateway/dreaming-automation-reconciler.d.ts +11 -0
  262. package/dist/src/gateway/dreaming-automation-reconciler.js +105 -0
  263. package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -0
  264. package/dist/src/gateway/heartbeat/service.d.ts +0 -2
  265. package/dist/src/gateway/heartbeat/service.js +0 -7
  266. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  267. package/dist/src/gateway/hono/lib/config-payload.d.ts +5 -6
  268. package/dist/src/gateway/hono/lib/config-payload.js +2 -2
  269. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  270. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  271. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +1 -1
  272. package/dist/src/gateway/hono/routes/config-patch/misc.js +12 -6
  273. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
  274. package/dist/src/gateway/hono/routes/dreaming.js +27 -37
  275. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  276. package/dist/src/gateway/hono/routes/home.d.ts +2 -2
  277. package/dist/src/gateway/hono/routes/home.js +34 -25
  278. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  279. package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -6
  280. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  281. package/dist/src/gateway/hono/routes/migrations.d.ts +3 -0
  282. package/dist/src/gateway/hono/routes/migrations.js +35 -0
  283. package/dist/src/gateway/hono/routes/migrations.js.map +1 -0
  284. package/dist/src/gateway/hono/routes/public-gateway.js +2 -1
  285. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  286. package/dist/src/gateway/hono/routes/sessions.js +14 -0
  287. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  288. package/dist/src/gateway/run-loop.js +2 -0
  289. package/dist/src/gateway/run-loop.js.map +1 -1
  290. package/dist/src/gateway/security/operator-scopes.js +5 -1
  291. package/dist/src/gateway/security/operator-scopes.js.map +1 -1
  292. package/dist/src/gateway/service/config-coordinator.d.ts +4 -4
  293. package/dist/src/gateway/service/config-coordinator.js +14 -8
  294. package/dist/src/gateway/service/config-coordinator.js.map +1 -1
  295. package/dist/src/gateway/service/sessions-api.d.ts +2 -1
  296. package/dist/src/gateway/service/sessions-api.js +6 -1
  297. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  298. package/dist/src/gateway/service.d.ts +7 -3
  299. package/dist/src/gateway/service.js +61 -27
  300. package/dist/src/gateway/service.js.map +1 -1
  301. package/dist/src/goals/goal-service.js +45 -4
  302. package/dist/src/goals/goal-service.js.map +1 -1
  303. package/dist/src/infra/update-restart.js +1 -1
  304. package/dist/src/migrations/config/default-capability-preset.d.ts +10 -0
  305. package/dist/src/migrations/config/default-capability-preset.js +135 -0
  306. package/dist/src/migrations/config/default-capability-preset.js.map +1 -0
  307. package/dist/src/migrations/index.d.ts +4 -0
  308. package/dist/src/migrations/index.js +4 -0
  309. package/dist/src/migrations/registry.d.ts +8 -0
  310. package/dist/src/migrations/registry.js +18 -0
  311. package/dist/src/migrations/registry.js.map +1 -0
  312. package/dist/src/migrations/runner.d.ts +17 -0
  313. package/dist/src/migrations/runner.js +191 -0
  314. package/dist/src/migrations/runner.js.map +1 -0
  315. package/dist/src/migrations/types.d.ts +34 -0
  316. package/dist/src/notes/service.js +24 -1
  317. package/dist/src/notes/service.js.map +1 -1
  318. package/dist/src/providers/model-registry.d.ts +0 -1
  319. package/dist/src/providers/model-registry.js +0 -3
  320. package/dist/src/providers/model-registry.js.map +1 -1
  321. package/dist/src/routing/resolve-tui-session-key.d.ts +3 -0
  322. package/dist/src/routing/resolve-tui-session-key.js +14 -3
  323. package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
  324. package/dist/src/session/transcript-outline.d.ts +47 -0
  325. package/dist/src/session/transcript-outline.js +481 -0
  326. package/dist/src/session/transcript-outline.js.map +1 -0
  327. package/dist/src/storage/sqlite/index.d.ts +0 -2
  328. package/dist/src/storage/sqlite/index.js +1 -3
  329. package/dist/src/storage/sqlite/migrations/016_automations.sql +47 -0
  330. package/dist/src/storage/sqlite/migrations/017_automation_run_events.sql +14 -0
  331. package/dist/src/storage/sqlite/migrations/018_automation_safety.sql +1 -0
  332. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  333. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  334. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  335. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  336. package/dist/src/storage/sqlite/schema.js +1 -1
  337. package/dist/src/storage/sqlite/schema.sql +56 -46
  338. package/dist/src/tui/backends/embedded-backend.d.ts +6 -0
  339. package/dist/src/tui/backends/embedded-backend.js +18 -7
  340. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  341. package/dist/src/tui/backends/gateway-sse-backend.d.ts +3 -0
  342. package/dist/src/tui/backends/gateway-sse-backend.js +14 -0
  343. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  344. package/dist/src/tui/tui-backend.d.ts +4 -0
  345. package/dist/src/tui/tui-commands.d.ts +5 -0
  346. package/dist/src/tui/tui-commands.js +43 -0
  347. package/dist/src/tui/tui-commands.js.map +1 -1
  348. package/dist/src/tui/tui-transcript-tree.d.ts +1 -1
  349. package/dist/src/tui/tui-transcript-tree.js +17 -257
  350. package/dist/src/tui/tui-transcript-tree.js.map +1 -1
  351. package/dist/src/tui/tui-types.d.ts +2 -0
  352. package/dist/src/tui/tui-types.js.map +1 -1
  353. package/dist/src/tui/tui.js +7 -2
  354. package/dist/src/tui/tui.js.map +1 -1
  355. package/dist/src/workflows/domain/index.js +1 -1
  356. package/dist/src/workflows/domain/run.d.ts +7 -7
  357. package/dist/src/workflows/domain/run.js.map +1 -1
  358. package/dist/src/workflows/index.js +2 -2
  359. package/dist/src/workflows/service/workflow-run-service.d.ts +2 -0
  360. package/dist/src/workflows/service/workflow-run-service.js +31 -9
  361. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  362. package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -1
  363. package/package.json +4 -2
  364. package/dist/gateway/static/root/assets/agents-BCxZbkOw.js +0 -2
  365. package/dist/gateway/static/root/assets/app-management-settings-panel-bxYJVJpx.js +0 -1
  366. package/dist/gateway/static/root/assets/appearance-settings-BCIykXlI.js +0 -1
  367. package/dist/gateway/static/root/assets/browser-settings-page-DRhKdn81.js +0 -8
  368. package/dist/gateway/static/root/assets/capability-presets-api-CorhiHlg.js +0 -1
  369. package/dist/gateway/static/root/assets/capability-presets-settings-panel-qFx9Jtce.js +0 -1
  370. package/dist/gateway/static/root/assets/channels-settings-BAwAkqIA.js +0 -1
  371. package/dist/gateway/static/root/assets/cn-JdwAhgNB.js +0 -1
  372. package/dist/gateway/static/root/assets/connectors-page-BQLcfitM.js +0 -2
  373. package/dist/gateway/static/root/assets/createLucideIcon-DPHK1VkS.js +0 -1
  374. package/dist/gateway/static/root/assets/cron-api-qGwmL-24.js +0 -1
  375. package/dist/gateway/static/root/assets/cron-dreaming-jobs-nCMWCf0p.js +0 -1
  376. package/dist/gateway/static/root/assets/cron-page-BBWMAj8-.js +0 -3
  377. package/dist/gateway/static/root/assets/dreaming-settings-Dw89Obml.js +0 -1
  378. package/dist/gateway/static/root/assets/format-cron-label-BsotZDO5.js +0 -2
  379. package/dist/gateway/static/root/assets/format-interval-label-BzxafKxR.js +0 -1
  380. package/dist/gateway/static/root/assets/gateway-settings-Cmwy58rS.js +0 -1
  381. package/dist/gateway/static/root/assets/goal-detail-page-l7mu5GWX.js +0 -1
  382. package/dist/gateway/static/root/assets/goals-settings-CYVY4NGp.js +0 -1
  383. package/dist/gateway/static/root/assets/heartbeat-config-api-DriO_CN9.js +0 -1
  384. package/dist/gateway/static/root/assets/heartbeat-settings-CUQTKxg7.js +0 -1
  385. package/dist/gateway/static/root/assets/index-C17Tsd_b.css +0 -1
  386. package/dist/gateway/static/root/assets/index-Cc41r16l.js +0 -191
  387. package/dist/gateway/static/root/assets/interval-presets-DFPCKW_W.js +0 -1
  388. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-CcVcqstx.js +0 -1
  389. package/dist/gateway/static/root/assets/messages-B1iSKjiw.js +0 -3
  390. package/dist/gateway/static/root/assets/models-hub-panel-BfLfcta8.js +0 -2
  391. package/dist/gateway/static/root/assets/note-detail-page-BjwOQBfT.js +0 -2
  392. package/dist/gateway/static/root/assets/notes-page-DktdBiwB.js +0 -1
  393. package/dist/gateway/static/root/assets/remote-access-hub-rfVx96fq.js +0 -1
  394. package/dist/gateway/static/root/assets/schedule-field-CUCKODde.js +0 -1
  395. package/dist/gateway/static/root/assets/sessions-page-DbtMFuuH.js +0 -1
  396. package/dist/gateway/static/root/assets/settings-advanced-gate-5re5gAnP.js +0 -1
  397. package/dist/gateway/static/root/assets/settings-page-D-WMyLlj.js +0 -1
  398. package/dist/gateway/static/root/assets/setup-status-panel-Cl-DEJAU.js +0 -1
  399. package/dist/gateway/static/root/assets/shares-settings-CyPVvbLt.js +0 -1
  400. package/dist/gateway/static/root/assets/skill-reload-api-CleTH1oz.js +0 -1
  401. package/dist/gateway/static/root/assets/skills-page-Ck8hdXqR.js +0 -2
  402. package/dist/gateway/static/root/assets/system-settings-panel-DI-LN_8G.js +0 -1
  403. package/dist/gateway/static/root/assets/typed-models-lib-kX9duch4.js +0 -1
  404. package/dist/gateway/static/root/assets/user-profile-settings-panel-B-UFPMXy.js +0 -1
  405. package/dist/gateway/static/root/assets/utils-Dm0hKalR.js +0 -1
  406. package/dist/gateway/static/root/assets/workflows-page-BtFGp2y_.js +0 -18
  407. package/dist/src/agent/fallback/error.d.ts +0 -22
  408. package/dist/src/agent/fallback/error.js +0 -32
  409. package/dist/src/agent/fallback/error.js.map +0 -1
  410. package/dist/src/agent/fallback/index.d.ts +0 -5
  411. package/dist/src/agent/fallback/index.js +0 -9
  412. package/dist/src/agent/fallback/index.js.map +0 -1
  413. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +0 -29
  414. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +0 -76
  415. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +0 -1
  416. package/dist/src/agent/service/reconcile-dreaming-cron.d.ts +0 -6
  417. package/dist/src/agent/service/reconcile-dreaming-cron.js +0 -84
  418. package/dist/src/agent/service/reconcile-dreaming-cron.js.map +0 -1
  419. package/dist/src/agent/tools/cronjob-tool.d.ts +0 -29
  420. package/dist/src/agent/tools/cronjob-tool.js +0 -274
  421. package/dist/src/agent/tools/cronjob-tool.js.map +0 -1
  422. package/dist/src/cli/commands/cron-cli.d.ts +0 -2
  423. package/dist/src/cli/commands/cron-cli.js +0 -15
  424. package/dist/src/cli/commands/cron-cli.js.map +0 -1
  425. package/dist/src/cli/commands/cron.d.ts +0 -4
  426. package/dist/src/cli/commands/cron.js +0 -188
  427. package/dist/src/cli/commands/cron.js.map +0 -1
  428. package/dist/src/cli/commands/doctor/checks/cron-health.js +0 -35
  429. package/dist/src/cli/commands/doctor/checks/cron-health.js.map +0 -1
  430. package/dist/src/cron/execution-types.d.ts +0 -42
  431. package/dist/src/cron/executor.d.ts +0 -67
  432. package/dist/src/cron/executor.js +0 -669
  433. package/dist/src/cron/executor.js.map +0 -1
  434. package/dist/src/cron/index.d.ts +0 -7
  435. package/dist/src/cron/index.js +0 -7
  436. package/dist/src/cron/job-content.d.ts +0 -5
  437. package/dist/src/cron/job-content.js +0 -15
  438. package/dist/src/cron/job-content.js.map +0 -1
  439. package/dist/src/cron/run-log-store.d.ts +0 -12
  440. package/dist/src/cron/run-log-store.js +0 -58
  441. package/dist/src/cron/run-log-store.js.map +0 -1
  442. package/dist/src/cron/schedule.d.ts +0 -10
  443. package/dist/src/cron/schedule.js +0 -85
  444. package/dist/src/cron/schedule.js.map +0 -1
  445. package/dist/src/cron/service.d.ts +0 -58
  446. package/dist/src/cron/service.js +0 -419
  447. package/dist/src/cron/service.js.map +0 -1
  448. package/dist/src/cron/types.d.ts +0 -183
  449. package/dist/src/cron/validation.d.ts +0 -500
  450. package/dist/src/cron/validation.js +0 -192
  451. package/dist/src/cron/validation.js.map +0 -1
  452. package/dist/src/cron/workflow-run-completion.d.ts +0 -23
  453. package/dist/src/cron/workflow-run-completion.js +0 -72
  454. package/dist/src/cron/workflow-run-completion.js.map +0 -1
  455. package/dist/src/extensions/types/phase4.js +0 -1
  456. package/dist/src/gateway/hono/routes/cron.d.ts +0 -3
  457. package/dist/src/gateway/hono/routes/cron.js +0 -109
  458. package/dist/src/gateway/hono/routes/cron.js.map +0 -1
  459. package/dist/src/storage/sqlite/cron-job-repository.d.ts +0 -6
  460. package/dist/src/storage/sqlite/cron-job-repository.js +0 -70
  461. package/dist/src/storage/sqlite/cron-job-repository.js.map +0 -1
  462. package/dist/src/storage/sqlite/cron-run-repository.d.ts +0 -5
  463. package/dist/src/storage/sqlite/cron-run-repository.js +0 -96
  464. package/dist/src/storage/sqlite/cron-run-repository.js.map +0 -1
  465. /package/dist/src/{cron → automations/domain}/types.js +0 -0
  466. /package/dist/src/{config/defaults.d.ts → automations/draft/automation-draft.types.js} +0 -0
  467. /package/dist/src/{config/defaults.js → extensions/types/registration.js} +0 -0
  468. /package/dist/src/{cron/execution-types.js → migrations/types.js} +0 -0
@@ -0,0 +1,130 @@
1
+ import { getSqliteDatabase, runSqliteWriteTransaction } from "../../storage/sqlite/transaction.js";
2
+ //#region src/automations/storage/automation-run-repository.ts
3
+ const MAX_RUNS_PER_AUTOMATION = 2e3;
4
+ const TRIM_TO_RUNS = 1500;
5
+ function rowToRun(row) {
6
+ return {
7
+ id: row.run_id,
8
+ automationId: row.automation_id,
9
+ automationName: row.automation_name,
10
+ status: row.status,
11
+ triggerSnapshot: JSON.parse(row.trigger_snapshot_json),
12
+ actionSnapshot: JSON.parse(row.action_snapshot_json),
13
+ manual: row.manual !== 0,
14
+ createdAtMs: row.created_at_ms,
15
+ startedAtMs: row.started_at_ms ?? void 0,
16
+ endedAtMs: row.ended_at_ms ?? void 0,
17
+ durationMs: row.duration_ms ?? void 0,
18
+ summary: row.summary ?? void 0,
19
+ error: row.error ?? void 0,
20
+ sessionKey: row.session_key ?? void 0,
21
+ workflowRunId: row.workflow_run_id ?? void 0,
22
+ model: row.model ?? void 0
23
+ };
24
+ }
25
+ function rowToEvent(row) {
26
+ return {
27
+ id: row.event_id,
28
+ runId: row.run_id,
29
+ automationId: row.automation_id,
30
+ type: row.type,
31
+ message: row.message,
32
+ data: row.data_json ? JSON.parse(row.data_json) : void 0,
33
+ createdAtMs: row.created_at_ms
34
+ };
35
+ }
36
+ function trimRuns(db, automationId) {
37
+ const countRow = db.prepare(`SELECT COUNT(*) AS count FROM automation_runs WHERE automation_id = ?`).get(automationId);
38
+ if (countRow.count <= MAX_RUNS_PER_AUTOMATION) return;
39
+ const staleRunIds = db.prepare(`SELECT run_id FROM automation_runs WHERE automation_id = ?
40
+ ORDER BY created_at_ms ASC LIMIT ?`).all(automationId, countRow.count - TRIM_TO_RUNS);
41
+ for (const { run_id: runId } of staleRunIds) {
42
+ db.prepare(`DELETE FROM automation_run_events WHERE run_id = ?`).run(runId);
43
+ db.prepare(`DELETE FROM automation_runs WHERE run_id = ?`).run(runId);
44
+ }
45
+ }
46
+ function appendAutomationRunEvent(event) {
47
+ runSqliteWriteTransaction((db) => {
48
+ db.prepare(`INSERT INTO automation_run_events (
49
+ event_id, run_id, automation_id, type, message, data_json, created_at_ms
50
+ ) VALUES (?, ?, ?, ?, ?, ?, ?)`).run(event.id, event.runId, event.automationId, event.type, event.message, event.data === void 0 ? null : JSON.stringify(event.data), event.createdAtMs);
51
+ });
52
+ }
53
+ function saveAutomationRun(run) {
54
+ runSqliteWriteTransaction((db) => {
55
+ db.prepare(`INSERT OR REPLACE INTO automation_runs (
56
+ run_id, automation_id, automation_name, status, trigger_snapshot_json,
57
+ action_snapshot_json, manual, created_at_ms, started_at_ms, ended_at_ms,
58
+ duration_ms, summary, error, session_key, workflow_run_id, model
59
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(run.id, run.automationId, run.automationName, run.status, JSON.stringify(run.triggerSnapshot), JSON.stringify(run.actionSnapshot), run.manual ? 1 : 0, run.createdAtMs, run.startedAtMs ?? null, run.endedAtMs ?? null, run.durationMs ?? null, run.summary ?? null, run.error ?? null, run.sessionKey ?? null, run.workflowRunId ?? null, run.model ?? null);
60
+ trimRuns(db, run.automationId);
61
+ });
62
+ }
63
+ function listAutomationRunEvents(runId) {
64
+ return getSqliteDatabase().prepare(`SELECT event_id, run_id, automation_id, type, message, data_json, created_at_ms
65
+ FROM automation_run_events
66
+ WHERE run_id = ?
67
+ ORDER BY created_at_ms ASC`).all(runId).map(rowToEvent);
68
+ }
69
+ function getAutomationRun(runId) {
70
+ const row = getSqliteDatabase().prepare(`SELECT run_id, automation_id, automation_name, status, trigger_snapshot_json,
71
+ action_snapshot_json, manual, created_at_ms, started_at_ms, ended_at_ms,
72
+ duration_ms, summary, error, session_key, workflow_run_id, model
73
+ FROM automation_runs
74
+ WHERE run_id = ?`).get(runId);
75
+ return row ? rowToRun(row) : null;
76
+ }
77
+ function listAutomationRuns(options) {
78
+ const limit = Math.min(Math.max(options?.limit ?? 50, 1), 500);
79
+ const db = getSqliteDatabase();
80
+ const base = `SELECT run_id, automation_id, automation_name, status, trigger_snapshot_json,
81
+ action_snapshot_json, manual, created_at_ms, started_at_ms, ended_at_ms,
82
+ duration_ms, summary, error, session_key, workflow_run_id, model
83
+ FROM automation_runs`;
84
+ return (options?.automationId ? db.prepare(`${base} WHERE automation_id = ? ORDER BY created_at_ms DESC LIMIT ?`).all(options.automationId, limit) : db.prepare(`${base} ORDER BY created_at_ms DESC LIMIT ?`).all(limit)).map(rowToRun);
85
+ }
86
+ function listAutomationRunsForProductEvent(options) {
87
+ const limit = Math.min(Math.max(options.limit ?? 10, 1), 100);
88
+ const clauses = [`e.type = 'run.queued'`, `json_extract(e.data_json, '$.event.type') = ?`];
89
+ const params = [options.eventType, limit];
90
+ if (options.source) {
91
+ clauses.push(`json_extract(e.data_json, '$.event.source') = ?`);
92
+ params.splice(params.length - 1, 0, options.source);
93
+ }
94
+ if (options.payloadKey && options.payloadValue !== void 0) {
95
+ clauses.push(`json_extract(e.data_json, '$.event.payload.' || ?) = ?`);
96
+ params.splice(params.length - 1, 0, options.payloadKey, options.payloadValue);
97
+ }
98
+ return getSqliteDatabase().prepare(`SELECT r.run_id, r.automation_id, r.automation_name, r.status, r.trigger_snapshot_json,
99
+ r.action_snapshot_json, r.manual, r.created_at_ms, r.started_at_ms, r.ended_at_ms,
100
+ r.duration_ms, r.summary, r.error, r.session_key, r.workflow_run_id, r.model,
101
+ e.event_id, e.run_id AS event_run_id, e.automation_id AS event_automation_id,
102
+ e.type AS event_type, e.message AS event_message, e.data_json AS event_data_json,
103
+ e.created_at_ms AS event_created_at_ms
104
+ FROM automation_run_events e
105
+ JOIN automation_runs r ON r.run_id = e.run_id
106
+ WHERE ${clauses.join(" AND ")}
107
+ ORDER BY e.created_at_ms DESC
108
+ LIMIT ?`).all(...params).map((row) => ({
109
+ run: rowToRun(row),
110
+ triggerEvent: rowToEvent({
111
+ event_id: row.event_id,
112
+ run_id: row.event_run_id,
113
+ automation_id: row.event_automation_id,
114
+ type: row.event_type,
115
+ message: row.event_message,
116
+ data_json: row.event_data_json,
117
+ created_at_ms: row.event_created_at_ms
118
+ })
119
+ }));
120
+ }
121
+ function deleteAutomationRunsForAutomation(automationId) {
122
+ runSqliteWriteTransaction((db) => {
123
+ db.prepare(`DELETE FROM automation_run_events WHERE automation_id = ?`).run(automationId);
124
+ db.prepare(`DELETE FROM automation_runs WHERE automation_id = ?`).run(automationId);
125
+ });
126
+ }
127
+ //#endregion
128
+ export { appendAutomationRunEvent, deleteAutomationRunsForAutomation, getAutomationRun, listAutomationRunEvents, listAutomationRuns, listAutomationRunsForProductEvent, saveAutomationRun };
129
+
130
+ //# sourceMappingURL=automation-run-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation-run-repository.js","names":[],"sources":["../../../../src/automations/storage/automation-run-repository.ts"],"sourcesContent":["import type { AutomationProductEventRun, AutomationRun, AutomationRunEvent } from '../domain/types.js';\nimport { getSqliteDatabase, runSqliteWriteTransaction } from '../../storage/sqlite/transaction.js';\n\nconst MAX_RUNS_PER_AUTOMATION = 2000;\nconst TRIM_TO_RUNS = 1500;\n\ntype AutomationRunRow = {\n run_id: string;\n automation_id: string;\n automation_name: string;\n status: string;\n trigger_snapshot_json: string;\n action_snapshot_json: string;\n manual: number;\n created_at_ms: number;\n started_at_ms: number | null;\n ended_at_ms: number | null;\n duration_ms: number | null;\n summary: string | null;\n error: string | null;\n session_key: string | null;\n workflow_run_id: string | null;\n model: string | null;\n};\n\ntype AutomationRunEventRow = {\n event_id: string;\n run_id: string;\n automation_id: string;\n type: string;\n message: string;\n data_json: string | null;\n created_at_ms: number;\n};\n\nfunction rowToRun(row: AutomationRunRow): AutomationRun {\n return {\n id: row.run_id,\n automationId: row.automation_id,\n automationName: row.automation_name,\n status: row.status as AutomationRun['status'],\n triggerSnapshot: JSON.parse(row.trigger_snapshot_json),\n actionSnapshot: JSON.parse(row.action_snapshot_json),\n manual: row.manual !== 0,\n createdAtMs: row.created_at_ms,\n startedAtMs: row.started_at_ms ?? undefined,\n endedAtMs: row.ended_at_ms ?? undefined,\n durationMs: row.duration_ms ?? undefined,\n summary: row.summary ?? undefined,\n error: row.error ?? undefined,\n sessionKey: row.session_key ?? undefined,\n workflowRunId: row.workflow_run_id ?? undefined,\n model: row.model ?? undefined,\n };\n}\n\nfunction rowToEvent(row: AutomationRunEventRow): AutomationRunEvent {\n return {\n id: row.event_id,\n runId: row.run_id,\n automationId: row.automation_id,\n type: row.type as AutomationRunEvent['type'],\n message: row.message,\n data: row.data_json ? JSON.parse(row.data_json) : undefined,\n createdAtMs: row.created_at_ms,\n };\n}\n\nfunction trimRuns(db: ReturnType<typeof getSqliteDatabase>, automationId: string): void {\n const countRow = db\n .prepare(`SELECT COUNT(*) AS count FROM automation_runs WHERE automation_id = ?`)\n .get(automationId) as { count: number };\n if (countRow.count <= MAX_RUNS_PER_AUTOMATION) return;\n const staleRunIds = db\n .prepare(\n `SELECT run_id FROM automation_runs WHERE automation_id = ?\n ORDER BY created_at_ms ASC LIMIT ?`,\n )\n .all(automationId, countRow.count - TRIM_TO_RUNS) as { run_id: string }[];\n for (const { run_id: runId } of staleRunIds) {\n db.prepare(`DELETE FROM automation_run_events WHERE run_id = ?`).run(runId);\n db.prepare(`DELETE FROM automation_runs WHERE run_id = ?`).run(runId);\n }\n}\n\nexport function appendAutomationRunEvent(event: AutomationRunEvent): void {\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO automation_run_events (\n event_id, run_id, automation_id, type, message, data_json, created_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n event.id,\n event.runId,\n event.automationId,\n event.type,\n event.message,\n event.data === undefined ? null : JSON.stringify(event.data),\n event.createdAtMs,\n );\n });\n}\n\nexport function saveAutomationRun(run: AutomationRun): void {\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT OR REPLACE INTO automation_runs (\n run_id, automation_id, automation_name, status, trigger_snapshot_json,\n action_snapshot_json, manual, created_at_ms, started_at_ms, ended_at_ms,\n duration_ms, summary, error, session_key, workflow_run_id, model\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n run.id,\n run.automationId,\n run.automationName,\n run.status,\n JSON.stringify(run.triggerSnapshot),\n JSON.stringify(run.actionSnapshot),\n run.manual ? 1 : 0,\n run.createdAtMs,\n run.startedAtMs ?? null,\n run.endedAtMs ?? null,\n run.durationMs ?? null,\n run.summary ?? null,\n run.error ?? null,\n run.sessionKey ?? null,\n run.workflowRunId ?? null,\n run.model ?? null,\n );\n trimRuns(db, run.automationId);\n });\n}\n\nexport function listAutomationRunEvents(runId: string): AutomationRunEvent[] {\n const rows = getSqliteDatabase()\n .prepare(\n `SELECT event_id, run_id, automation_id, type, message, data_json, created_at_ms\n FROM automation_run_events\n WHERE run_id = ?\n ORDER BY created_at_ms ASC`,\n )\n .all(runId) as AutomationRunEventRow[];\n return rows.map(rowToEvent);\n}\n\nexport function getAutomationRun(runId: string): AutomationRun | null {\n const row = getSqliteDatabase()\n .prepare(\n `SELECT run_id, automation_id, automation_name, status, trigger_snapshot_json,\n action_snapshot_json, manual, created_at_ms, started_at_ms, ended_at_ms,\n duration_ms, summary, error, session_key, workflow_run_id, model\n FROM automation_runs\n WHERE run_id = ?`,\n )\n .get(runId) as AutomationRunRow | undefined;\n return row ? rowToRun(row) : null;\n}\n\nexport function listAutomationRuns(options?: {\n automationId?: string;\n limit?: number;\n}): AutomationRun[] {\n const limit = Math.min(Math.max(options?.limit ?? 50, 1), 500);\n const db = getSqliteDatabase();\n const base = `SELECT run_id, automation_id, automation_name, status, trigger_snapshot_json,\n action_snapshot_json, manual, created_at_ms, started_at_ms, ended_at_ms,\n duration_ms, summary, error, session_key, workflow_run_id, model\n FROM automation_runs`;\n const rows = options?.automationId\n ? db.prepare(`${base} WHERE automation_id = ? ORDER BY created_at_ms DESC LIMIT ?`).all(options.automationId, limit)\n : db.prepare(`${base} ORDER BY created_at_ms DESC LIMIT ?`).all(limit);\n return (rows as AutomationRunRow[]).map(rowToRun);\n}\n\nexport function listAutomationRunsForProductEvent(options: {\n eventType: string;\n source?: string;\n payloadKey?: string;\n payloadValue?: string;\n limit?: number;\n}): AutomationProductEventRun[] {\n const limit = Math.min(Math.max(options.limit ?? 10, 1), 100);\n const clauses = [\n `e.type = 'run.queued'`,\n `json_extract(e.data_json, '$.event.type') = ?`,\n ];\n const params: Array<string | number> = [options.eventType, limit];\n\n if (options.source) {\n clauses.push(`json_extract(e.data_json, '$.event.source') = ?`);\n params.splice(params.length - 1, 0, options.source);\n }\n if (options.payloadKey && options.payloadValue !== undefined) {\n clauses.push(`json_extract(e.data_json, '$.event.payload.' || ?) = ?`);\n params.splice(params.length - 1, 0, options.payloadKey, options.payloadValue);\n }\n\n const rows = getSqliteDatabase()\n .prepare(\n `SELECT r.run_id, r.automation_id, r.automation_name, r.status, r.trigger_snapshot_json,\n r.action_snapshot_json, r.manual, r.created_at_ms, r.started_at_ms, r.ended_at_ms,\n r.duration_ms, r.summary, r.error, r.session_key, r.workflow_run_id, r.model,\n e.event_id, e.run_id AS event_run_id, e.automation_id AS event_automation_id,\n e.type AS event_type, e.message AS event_message, e.data_json AS event_data_json,\n e.created_at_ms AS event_created_at_ms\n FROM automation_run_events e\n JOIN automation_runs r ON r.run_id = e.run_id\n WHERE ${clauses.join(' AND ')}\n ORDER BY e.created_at_ms DESC\n LIMIT ?`,\n )\n .all(...params) as Array<AutomationRunRow & {\n event_id: string;\n event_run_id: string;\n event_automation_id: string;\n event_type: string;\n event_message: string;\n event_data_json: string | null;\n event_created_at_ms: number;\n }>;\n\n return rows.map((row) => ({\n run: rowToRun(row),\n triggerEvent: rowToEvent({\n event_id: row.event_id,\n run_id: row.event_run_id,\n automation_id: row.event_automation_id,\n type: row.event_type,\n message: row.event_message,\n data_json: row.event_data_json,\n created_at_ms: row.event_created_at_ms,\n }),\n }));\n}\n\nexport function deleteAutomationRunsForAutomation(automationId: string): void {\n runSqliteWriteTransaction((db) => {\n db.prepare(`DELETE FROM automation_run_events WHERE automation_id = ?`).run(automationId);\n db.prepare(`DELETE FROM automation_runs WHERE automation_id = ?`).run(automationId);\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './automation-repository.js';
2
+ export * from './automation-run-repository.js';
@@ -0,0 +1,3 @@
1
+ import { deleteAutomation, getAutomation, listAutomations, saveAutomation, saveAutomations } from "./automation-repository.js";
2
+ import { appendAutomationRunEvent, deleteAutomationRunsForAutomation, getAutomationRun, listAutomationRunEvents, listAutomationRuns, listAutomationRunsForProductEvent, saveAutomationRun } from "./automation-run-repository.js";
3
+ export { appendAutomationRunEvent, deleteAutomation, deleteAutomationRunsForAutomation, getAutomation, getAutomationRun, listAutomationRunEvents, listAutomationRuns, listAutomationRunsForProductEvent, listAutomations, saveAutomation, saveAutomationRun, saveAutomations };
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import type { Config } from '../config/schema.js';
5
5
  import type { MessageBus } from '../infra/bus/index.js';
6
+ import type { Migration } from '../migrations/types.js';
6
7
  import type { ChannelId, ChannelMeta, ChannelCapabilities } from './plugins/types.core.js';
7
8
  import type { ChannelPairingAdapter, ChannelAllowlistAdapter, ChannelThreadingAdapter, ChannelLifecycleAdapter, ChannelHeartbeatAdapter, ChannelConfiguredBindingProvider, ChannelMessagingAdapter, ChannelDirectoryAdapter, ChannelResolverAdapter, ChannelAuthAdapter, ChannelElevatedAdapter, ChannelExecApprovalAdapter, ChannelAgentPromptAdapter, ChannelSetupWizard, ChannelCronDeliveryAdapter, ChannelCliLoginAdapter, ChannelConfigSurfaceAdapter, ChannelOnboardAdapter, ChannelRuntimeActionAdapter } from './plugins/types.adapters.js';
8
9
  export type { ChannelId, ChatType, ChannelMeta, ChannelCapabilities } from './plugins/types.core.js';
@@ -131,6 +132,8 @@ export interface ChannelPlugin<ResolvedAccount = any> {
131
132
  heartbeat?: ChannelHeartbeatAdapter;
132
133
  agentPrompt?: ChannelAgentPromptAdapter;
133
134
  agentTools?: ChannelAgentTool[];
135
+ /** Optional safe/manual migrations contributed by this channel plugin. */
136
+ migrations?: readonly Migration[];
134
137
  /** Optional doctor health-check contributed by this channel plugin. */
135
138
  doctor?: ChannelDoctorAdapter;
136
139
  }
@@ -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":";;;AA2CA,eAAe,qBACb,OACA,YACA,OACA,OACe;AACf,KAAI,CAAC,MAAO;CACZ,MAAM,WAAY,MAAM,MAAM,IAAI,WAAW,IAAK,EAAE;AACpD,OAAM,MAAM,IAAI,YAAY;EAAE,GAAG;GAAW,QAAQ;EAAO,CAAC;;AAI9D,MAAM,eAAkC;CACtC,IAAI;CACJ,MAAM;CACN,aAAa;CACb,UAAU;CACV,OAAO;EAAC;EAAU;EAAW;EAAQ;CACrC,aAAa;CACb,UAAU;EAAC;EAAU;EAAe;EAAc;EAAkB;CACpE,SAAS,OAAO,KAAqB,SAAiB;AACpD,QAAM,IAAI,UAAU,KAAK;AAEzB,MAAI,CAAC,KAAK,MAAM,CAId,QAAO;GACL,SAAS,oCACM,MAJU,IAAI,oBAAoB,IAIlB,UAAU;GAWzC,SAAS;GACV;EAIH,MAAM,QAAQ,oBAAoB,KAAK,MAAM,CAAC;AAC9C,MAAI,CAAC,MAEH,QAAO;GACL,SAAS,6BAA6B,KAAK,wBAF9B,sBAGgB,CAAC;GAG9B,SAAS;GACV;AAGH,QAAM,qBAAqB,IAAI,yBAAyB,EAAE,IAAI,YAAY,iBAAiB,MAAM;AACjG,MAAI,yBAAyB,MAAM;AAYnC,SAAO;GACL,SAAS,sCACI,MAAM,KACd;IAZL,KAAK;IACL,SAAS;IACT,KAAK;IACL,QAAQ;IACR,MAAM;IACN,OAAO;IACP,UAAU;IAMY,CAAC,OAAO;GAE9B,SAAS;GACV;;CAEJ;AAGD,MAAM,mBAAsC;CAC1C,IAAI;CACJ,MAAM;CACN,aAAa;CACb,UAAU;CACV,OAAO;EAAC;EAAU;EAAW;EAAQ;CACrC,aAAa;CACb,UAAU;EAAC;EAAc;EAAiB;EAAqB;EAAiB;CAChF,SAAS,OAAO,KAAqB,SAAiB;AACpD,QAAM,IAAI,UAAU,KAAK;AAEzB,MAAI,CAAC,KAAK,MAAM,CAId,QAAO;GACL,SAAS,0CACM,MAJU,IAAI,qBAAqB,IAInB,UAAU;GAOzC,SAAS;GACV;EAIH,MAAM,QAAQ,wBAAwB,KAAK,MAAM,CAAC;AAClD,MAAI,CAAC,MACH,QAAO;GACL,SAAS,6BAA6B,KAAK;GAI3C,SAAS;GACV;AAGH,QAAM,qBAAqB,IAAI,yBAAyB,EAAE,IAAI,YAAY,kBAAkB,MAAM;AAQlG,SAAO;GACL,SAAS,2CACG,MAAM,KACb;IARL,KAAK;IACL,IAAI;IACJ,QAAQ;IAMa,CAAC,OAAO;GAE7B,SAAS;GACV;;CAEJ;AAGD,MAAM,iBAAoC;CACxC,IAAI;CACJ,MAAM;CACN,aAAa;CACb,UAAU;CACV,OAAO;EAAC;EAAU;EAAW;EAAQ;CACrC,aAAa;CACb,UAAU;EAAC;EAAY;EAAe;EAAgB;EAAgB;CACtE,SAAS,OAAO,KAAqB,SAAiB;AACpD,QAAM,IAAI,UAAU,KAAK;AAEzB,MAAI,CAAC,KAAK,MAAM,EAAE;GAGhB,MAAM,WAAyB,MADJ,IAAI,mBAAmB,KACF,OAAO,QAAQ;AAE/D,SAAM,qBAAqB,IAAI,yBAAyB,EAAE,IAAI,YAAY,gBAAgB,SAAS;AAEnG,UAAO;IACL,SAAS,+BACG,SAAS,OAChB,aAAa,OAAO,+CAA+C;IACxE,SAAS;IACV;;EAIH,MAAM,QAAQ,sBAAsB,KAAK,MAAM,CAAC;AAChD,MAAI,CAAC,MACH,QAAO;GACL,SAAS,2BAA2B,KAAK;GAIzC,SAAS;GACV;AAGH,QAAM,qBAAqB,IAAI,yBAAyB,EAAE,IAAI,YAAY,gBAAgB,MAAM;AAQhG,SAAO;GACL,SAAS,mCACG,MAAM,KACb;IARL,KAAK;IACL,IAAI;IACJ,MAAM;IAMe,CAAC,OAAO;GAE7B,SAAS;GACV;;CAEJ;AAGD,MAAM,wBAA2C;CAC/C,IAAI;CACJ,MAAM;CACN,aAAa;CACb,UAAU;CACV,OAAO;EAAC;EAAU;EAAW;EAAQ;CACrC,SAAS,OAAO,QAAwB;AACtC,QAAM,IAAI,UAAU,KAAK;EAEzB,MAAM,eAAe,IAAI,iBAAiB;EAC1C,MAAM,gBAAgB,MAAM,IAAI,oBAAoB;EACpD,MAAM,iBAAiB,MAAM,IAAI,qBAAqB;EACtD,MAAM,eAAe,MAAM,IAAI,mBAAmB;EAClD,MAAM,QAAQ,MAAM,IAAI,UAAU;AAoBlC,SAAO;GACL,SAAS;IAjBT;IACA;IACA,iBAAiB,aAAa;IAC9B,oBAAoB,iBAAiB,UAAU;IAC/C,qBAAqB,kBAAkB,UAAU;IACjD,mBAAmB,gBAAgB,UAAU;IAC7C;IACA;IACA;IACA;IACA,gBAAgB,MAAM;IACtB,cAAc,MAAM,aAAa,gBAAgB,CAAC;IAClD,kBAAkB,MAAM,iBAAiB,gBAAgB,CAAC;IAC1D,aAAa,MAAM,YAAY,gBAAgB,CAAC;IAIlC,CAAC,KAAK,KAAK;GACzB,SAAS;GACV;;CAEJ;AAGD,SAAgB,2BAAiC;AAC/C,iBAAgB,SAAS,aAAa;AACtC,iBAAgB,SAAS,iBAAiB;AAC1C,iBAAgB,SAAS,eAAe;AACxC,iBAAgB,SAAS,sBAAsB"}
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":";;;AAuBA,eAAe,qBACb,OACA,YACA,OACA,OACe;AACf,KAAI,CAAC,MAAO;CACZ,MAAM,WAAY,MAAM,MAAM,IAAI,WAAW,IAAK,EAAE;AACpD,OAAM,MAAM,IAAI,YAAY;EAAE,GAAG;GAAW,QAAQ;EAAO,CAAC;;AAI9D,MAAM,eAAkC;CACtC,IAAI;CACJ,MAAM;CACN,aAAa;CACb,UAAU;CACV,OAAO;EAAC;EAAU;EAAW;EAAQ;CACrC,aAAa;CACb,UAAU;EAAC;EAAU;EAAe;EAAc;EAAkB;CACpE,SAAS,OAAO,KAAqB,SAAiB;AACpD,QAAM,IAAI,UAAU,KAAK;AAEzB,MAAI,CAAC,KAAK,MAAM,CAId,QAAO;GACL,SAAS,oCACM,MAJU,IAAI,oBAAoB,IAIlB,UAAU;GAWzC,SAAS;GACV;EAIH,MAAM,QAAQ,oBAAoB,KAAK,MAAM,CAAC;AAC9C,MAAI,CAAC,MAEH,QAAO;GACL,SAAS,6BAA6B,KAAK,wBAF9B,sBAGgB,CAAC;GAG9B,SAAS;GACV;AAGH,QAAM,qBAAqB,IAAI,yBAAyB,EAAE,IAAI,YAAY,iBAAiB,MAAM;AACjG,MAAI,yBAAyB,MAAM;AAYnC,SAAO;GACL,SAAS,sCACI,MAAM,KACd;IAZL,KAAK;IACL,SAAS;IACT,KAAK;IACL,QAAQ;IACR,MAAM;IACN,OAAO;IACP,UAAU;IAMY,CAAC,OAAO;GAE9B,SAAS;GACV;;CAEJ;AAGD,MAAM,mBAAsC;CAC1C,IAAI;CACJ,MAAM;CACN,aAAa;CACb,UAAU;CACV,OAAO;EAAC;EAAU;EAAW;EAAQ;CACrC,aAAa;CACb,UAAU;EAAC;EAAc;EAAiB;EAAqB;EAAiB;CAChF,SAAS,OAAO,KAAqB,SAAiB;AACpD,QAAM,IAAI,UAAU,KAAK;AAEzB,MAAI,CAAC,KAAK,MAAM,CAId,QAAO;GACL,SAAS,0CACM,MAJU,IAAI,qBAAqB,IAInB,UAAU;GAOzC,SAAS;GACV;EAIH,MAAM,QAAQ,wBAAwB,KAAK,MAAM,CAAC;AAClD,MAAI,CAAC,MACH,QAAO;GACL,SAAS,6BAA6B,KAAK;GAI3C,SAAS;GACV;AAGH,QAAM,qBAAqB,IAAI,yBAAyB,EAAE,IAAI,YAAY,kBAAkB,MAAM;AAQlG,SAAO;GACL,SAAS,2CACG,MAAM,KACb;IARL,KAAK;IACL,IAAI;IACJ,QAAQ;IAMa,CAAC,OAAO;GAE7B,SAAS;GACV;;CAEJ;AAGD,MAAM,iBAAoC;CACxC,IAAI;CACJ,MAAM;CACN,aAAa;CACb,UAAU;CACV,OAAO;EAAC;EAAU;EAAW;EAAQ;CACrC,aAAa;CACb,UAAU;EAAC;EAAY;EAAe;EAAgB;EAAgB;CACtE,SAAS,OAAO,KAAqB,SAAiB;AACpD,QAAM,IAAI,UAAU,KAAK;AAEzB,MAAI,CAAC,KAAK,MAAM,EAAE;GAGhB,MAAM,WAAyB,MADJ,IAAI,mBAAmB,KACF,OAAO,QAAQ;AAE/D,SAAM,qBAAqB,IAAI,yBAAyB,EAAE,IAAI,YAAY,gBAAgB,SAAS;AAEnG,UAAO;IACL,SAAS,+BACG,SAAS,OAChB,aAAa,OAAO,+CAA+C;IACxE,SAAS;IACV;;EAIH,MAAM,QAAQ,sBAAsB,KAAK,MAAM,CAAC;AAChD,MAAI,CAAC,MACH,QAAO;GACL,SAAS,2BAA2B,KAAK;GAIzC,SAAS;GACV;AAGH,QAAM,qBAAqB,IAAI,yBAAyB,EAAE,IAAI,YAAY,gBAAgB,MAAM;AAQhG,SAAO;GACL,SAAS,mCACG,MAAM,KACb;IARL,KAAK;IACL,IAAI;IACJ,MAAM;IAMe,CAAC,OAAO;GAE7B,SAAS;GACV;;CAEJ;AAGD,MAAM,wBAA2C;CAC/C,IAAI;CACJ,MAAM;CACN,aAAa;CACb,UAAU;CACV,OAAO;EAAC;EAAU;EAAW;EAAQ;CACrC,SAAS,OAAO,QAAwB;AACtC,QAAM,IAAI,UAAU,KAAK;EAEzB,MAAM,eAAe,IAAI,iBAAiB;EAC1C,MAAM,gBAAgB,MAAM,IAAI,oBAAoB;EACpD,MAAM,iBAAiB,MAAM,IAAI,qBAAqB;EACtD,MAAM,eAAe,MAAM,IAAI,mBAAmB;EAClD,MAAM,QAAQ,MAAM,IAAI,UAAU;AAoBlC,SAAO;GACL,SAAS;IAjBT;IACA;IACA,iBAAiB,aAAa;IAC9B,oBAAoB,iBAAiB,UAAU;IAC/C,qBAAqB,kBAAkB,UAAU;IACjD,mBAAmB,gBAAgB,UAAU;IAC7C;IACA;IACA;IACA;IACA,gBAAgB,MAAM;IACtB,cAAc,MAAM,aAAa,gBAAgB,CAAC;IAClD,kBAAkB,MAAM,iBAAiB,gBAAgB,CAAC;IAC1D,aAAa,MAAM,YAAY,gBAAgB,CAAC;IAIlC,CAAC,KAAK,KAAK;GACzB,SAAS;GACV;;CAEJ;AAGD,SAAgB,2BAAiC;AAC/C,iBAAgB,SAAS,aAAa;AACtC,iBAAgB,SAAS,iBAAiB;AAC1C,iBAAgB,SAAS,eAAe;AACxC,iBAAgB,SAAS,sBAAsB"}
@@ -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"}
@@ -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. 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: '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 v15).`,
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"}
@@ -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
  /**