@xopcai/xopc 0.0.121 → 0.0.122

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 (293) hide show
  1. package/README.md +23 -3
  2. package/README.zh-CN.md +23 -3
  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-4AW4JgSU.js → agent-avatar-dicebear-CK3s5cJo.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-SsQrj9B-.js +2 -0
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-CE6GkGU2.js → app-management-settings-panel-CWsNHtTs.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-BmaUjghw.js → appearance-settings-C4b8y6iZ.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-CYb6fame.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-CX4_KWut.js → archive-plugin-DAtNW3Ia.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-jf-PIIUU.js → attachment-load-Dm-RY54y.js} +1 -1
  12. package/dist/gateway/static/root/assets/automation-suggestion-card-BKHewSVT.js +1 -0
  13. package/dist/gateway/static/root/assets/automations-page-DpOOq1nk.js +1 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-DG9XQikd.js → binary-plugins-BG6Xnk71.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-Up_VIxLJ.js → block-editor-DfndiO3h.js} +28 -28
  16. package/dist/gateway/static/root/assets/browser-settings-page-9nXxgh4u.js +8 -0
  17. package/dist/gateway/static/root/assets/{capability-presets-api-CGM4OyMw.js → capability-presets-api-Cx93GLdw.js} +1 -1
  18. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-CzWt0LBb.js → capability-presets-settings-panel-D528_YFy.js} +1 -1
  19. package/dist/gateway/static/root/assets/{channel-recipient-api-BEByL4_o.js → channel-recipient-api-DdPTtEs8.js} +1 -1
  20. package/dist/gateway/static/root/assets/channels-settings-Ck-3h5lI.js +1 -0
  21. package/dist/gateway/static/root/assets/connectors-page-DL-fAqE_.js +2 -0
  22. package/dist/gateway/static/root/assets/directory-picker-path-field-D835EHJd.js +1 -0
  23. package/dist/gateway/static/root/assets/dreaming-settings-CCa1F7Fg.js +1 -0
  24. package/dist/gateway/static/root/assets/{extension-debug-page-DZxa_j7-.js → extension-debug-page-W2ITCPSA.js} +1 -1
  25. package/dist/gateway/static/root/assets/{extension-page-CseziW53.js → extension-page-DrvUytvn.js} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-settings-page-B_9J-xyo.js → extension-settings-page-qM8aLT5u.js} +1 -1
  27. package/dist/gateway/static/root/assets/{fetch-Cs4ck8zA.js → fetch-ovkvM8KQ.js} +1 -1
  28. package/dist/gateway/static/root/assets/{gateway-config-api-Dl223a7r.js → gateway-config-api-BB3biuD0.js} +1 -1
  29. package/dist/gateway/static/root/assets/gateway-settings-mmmnIH27.js +1 -0
  30. package/dist/gateway/static/root/assets/{gateway-startup-retry-IvePwjFE.js → gateway-startup-retry-CanQ8UcR.js} +1 -1
  31. package/dist/gateway/static/root/assets/goal-create-dialog-CNqNdEkQ.js +1 -0
  32. package/dist/gateway/static/root/assets/goal-detail-page-Ceu5zrN6.js +1 -0
  33. package/dist/gateway/static/root/assets/{goals-config-api-CUCP6yCl.js → goals-config-api-BBOX6mUl.js} +1 -1
  34. package/dist/gateway/static/root/assets/goals-page-BP1kfvWv.js +2 -0
  35. package/dist/gateway/static/root/assets/{goals-settings-Dj87qPxv.js → goals-settings-Bh3A7OZV.js} +1 -1
  36. package/dist/gateway/static/root/assets/heartbeat-settings-YoYgKlfX.js +1 -0
  37. package/dist/gateway/static/root/assets/index-DdqSO9R2.js +191 -0
  38. package/dist/gateway/static/root/assets/index-jGB-2nI-.css +1 -0
  39. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DJgYw0nB.js → keyboard-shortcuts-settings-B4TKJHla.js} +1 -1
  40. package/dist/gateway/static/root/assets/logs-page-BgVk5DvZ.js +2 -0
  41. package/dist/gateway/static/root/assets/{markdown-split-gnQ_EiGo.js → markdown-split-DcFtdLci.js} +1 -1
  42. package/dist/gateway/static/root/assets/{media-plugins-CQV-mgJn.js → media-plugins-B6SmeLVB.js} +1 -1
  43. package/dist/gateway/static/root/assets/messages-B5O4OIEo.js +3 -0
  44. package/dist/gateway/static/root/assets/models-hub-panel-BU0x8PGP.js +2 -0
  45. package/dist/gateway/static/root/assets/notes-page-D6JYVP4I.js +1 -0
  46. package/dist/gateway/static/root/assets/notes-workbench-mqRJYnJS.js +2 -0
  47. package/dist/gateway/static/root/assets/{preview-open-alternatives-BPMXC-2u.js → preview-open-alternatives-C29O19s7.js} +1 -1
  48. package/dist/gateway/static/root/assets/project-detail-page-DOTgzoeh.js +1 -0
  49. package/dist/gateway/static/root/assets/projects-page-DGUIb4y5.js +1 -0
  50. package/dist/gateway/static/root/assets/remote-access-hub-DVKKUj3u.js +1 -0
  51. package/dist/gateway/static/root/assets/{save-bar-controls-BEHqwZjz.js → save-bar-controls-B4ad9GfB.js} +1 -1
  52. package/dist/gateway/static/root/assets/{schedule-field-CMY25m97.js → schedule-field-DdYncfLR.js} +1 -1
  53. package/dist/gateway/static/root/assets/{schema-form-CxjxsFfg.js → schema-form-BMTrDE-7.js} +1 -1
  54. package/dist/gateway/static/root/assets/segmented-styles-BL8oLBEp.js +1 -0
  55. package/dist/gateway/static/root/assets/sessions-page-BVbzUWxW.js +1 -0
  56. package/dist/gateway/static/root/assets/settings-advanced-gate-DrNNoSqE.js +1 -0
  57. package/dist/gateway/static/root/assets/{settings-collapsible-section-s-kiLAxP.js → settings-collapsible-section-MwTW2eK4.js} +1 -1
  58. package/dist/gateway/static/root/assets/{settings-form-section-CIxIEYxU.js → settings-form-section-Dg6LBbcr.js} +1 -1
  59. package/dist/gateway/static/root/assets/settings-page-CMDqgeMR.js +1 -0
  60. package/dist/gateway/static/root/assets/settings-page-layout-BX4T-OLF.js +1 -0
  61. package/dist/gateway/static/root/assets/setup-status-panel-Ce1pcFtR.js +1 -0
  62. package/dist/gateway/static/root/assets/share-preview-page-DWE-dUFh.js +2 -0
  63. package/dist/gateway/static/root/assets/shares-settings-aKSraR8l.js +1 -0
  64. package/dist/gateway/static/root/assets/skill-reload-api-CS-FU_B-.js +1 -0
  65. package/dist/gateway/static/root/assets/skills-page-BaF3u0LA.js +2 -0
  66. package/dist/gateway/static/root/assets/{system-settings-panel-Czjf0kLJ.js → system-settings-panel-Dd6Y35Cm.js} +1 -1
  67. package/dist/gateway/static/root/assets/{typed-models-lib-Cmt8SYdI.js → typed-models-lib-Cx6XV5A2.js} +1 -1
  68. package/dist/gateway/static/root/assets/{use-channel-catalog-DyM-ckEQ.js → use-channel-catalog-D4sMbmy7.js} +1 -1
  69. package/dist/gateway/static/root/assets/{user-profile-settings-panel-BygLv8vm.js → user-profile-settings-panel-Bx-hjMQc.js} +1 -1
  70. package/dist/gateway/static/root/assets/{utils-CloW8coB.js → utils-D7b_vZnv.js} +1 -1
  71. package/dist/gateway/static/root/assets/voice-api-key-field-CkhbRt1q.js +1 -0
  72. package/dist/gateway/static/root/assets/workflow-run-setup-panel--TdohF5N.js +3 -0
  73. package/dist/gateway/static/root/assets/workflow-start-dialog-B0lavx_o.js +1 -0
  74. package/dist/gateway/static/root/assets/workflows-page-CZR05Bu_.js +18 -0
  75. package/dist/gateway/static/root/index.html +5 -5
  76. package/dist/package.js +1 -1
  77. package/dist/src/agent/agent-manager.d.ts +2 -0
  78. package/dist/src/agent/agent-manager.js +47 -7
  79. package/dist/src/agent/agent-manager.js.map +1 -1
  80. package/dist/src/agent/context/project-context.d.ts +19 -0
  81. package/dist/src/agent/context/project-context.js +90 -0
  82. package/dist/src/agent/context/project-context.js.map +1 -0
  83. package/dist/src/agent/goals/goal-locale.js +2 -2
  84. package/dist/src/agent/memory/types.d.ts +1 -0
  85. package/dist/src/agent/prompt/service-prompt-builder.d.ts +1 -0
  86. package/dist/src/agent/prompt/service-prompt-builder.js +2 -0
  87. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  88. package/dist/src/agent/prompt/system-prompt-params.d.ts +2 -0
  89. package/dist/src/agent/prompt/system-prompt-params.js +1 -0
  90. package/dist/src/agent/prompt/system-prompt-params.js.map +1 -1
  91. package/dist/src/agent/prompt/system-prompt.d.ts +1 -0
  92. package/dist/src/agent/prompt/system-prompt.js +2 -1
  93. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  94. package/dist/src/agent/service.js +4 -3
  95. package/dist/src/agent/service.js.map +1 -1
  96. package/dist/src/agent/session/session-config-service.js +6 -1
  97. package/dist/src/agent/session/session-config-service.js.map +1 -1
  98. package/dist/src/agent/session/session-hydrator.js +7 -3
  99. package/dist/src/agent/session/session-hydrator.js.map +1 -1
  100. package/dist/src/agent/session/session-inspector.js +9 -5
  101. package/dist/src/agent/session/session-inspector.js.map +1 -1
  102. package/dist/src/agent/starter-agents.js +5 -34
  103. package/dist/src/agent/starter-agents.js.map +1 -1
  104. package/dist/src/agent/workflow/index.js +2 -2
  105. package/dist/src/agent/workflow/runtime.js +1 -1
  106. package/dist/src/automations/api/routes.js +13 -2
  107. package/dist/src/automations/api/routes.js.map +1 -1
  108. package/dist/src/automations/domain/types.d.ts +2 -0
  109. package/dist/src/automations/domain/validation.d.ts +3 -0
  110. package/dist/src/automations/domain/validation.js +1 -0
  111. package/dist/src/automations/domain/validation.js.map +1 -1
  112. package/dist/src/automations/draft/automation-draft-validator.d.ts +1 -0
  113. package/dist/src/automations/service/action-executor.js +3 -1
  114. package/dist/src/automations/service/action-executor.js.map +1 -1
  115. package/dist/src/automations/service/automation-service.d.ts +4 -1
  116. package/dist/src/automations/service/automation-service.js +2 -2
  117. package/dist/src/automations/service/automation-service.js.map +1 -1
  118. package/dist/src/automations/storage/automation-repository.d.ts +3 -1
  119. package/dist/src/automations/storage/automation-repository.js +7 -5
  120. package/dist/src/automations/storage/automation-repository.js.map +1 -1
  121. package/dist/src/automations/storage/automation-run-repository.d.ts +1 -0
  122. package/dist/src/automations/storage/automation-run-repository.js +12 -1
  123. package/dist/src/automations/storage/automation-run-repository.js.map +1 -1
  124. package/dist/src/chat-commands/context.js +2 -1
  125. package/dist/src/chat-commands/context.js.map +1 -1
  126. package/dist/src/cli/command-loaders.js +1 -0
  127. package/dist/src/cli/command-loaders.js.map +1 -1
  128. package/dist/src/cli/command-manifest.js +4 -0
  129. package/dist/src/cli/command-manifest.js.map +1 -1
  130. package/dist/src/cli/commands/agent.js +2 -2
  131. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  132. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  133. package/dist/src/cli/commands/goal.js +27 -4
  134. package/dist/src/cli/commands/goal.js.map +1 -1
  135. package/dist/src/cli/commands/models.js +1 -1
  136. package/dist/src/cli/commands/onboard.js +1 -1
  137. package/dist/src/cli/commands/profile.js +1 -1
  138. package/dist/src/cli/commands/project.d.ts +4 -0
  139. package/dist/src/cli/commands/project.js +239 -0
  140. package/dist/src/cli/commands/project.js.map +1 -0
  141. package/dist/src/cli/commands/tunnel.js +1 -1
  142. package/dist/src/cli/commands/update.js +1 -1
  143. package/dist/src/cli/extension-cli-register.js +1 -1
  144. package/dist/src/config/agent-profile.js +1 -1
  145. package/dist/src/config/index.js +1 -1
  146. package/dist/src/gateway/agents-admin.js +1 -1
  147. package/dist/src/gateway/hono/routes/goals.js +51 -4
  148. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  149. package/dist/src/gateway/hono/routes/index.js +2 -0
  150. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  151. package/dist/src/gateway/hono/routes/memory.js +5 -1
  152. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  153. package/dist/src/gateway/hono/routes/notes.js +5 -0
  154. package/dist/src/gateway/hono/routes/notes.js.map +1 -1
  155. package/dist/src/gateway/hono/routes/projects.d.ts +3 -0
  156. package/dist/src/gateway/hono/routes/projects.js +578 -0
  157. package/dist/src/gateway/hono/routes/projects.js.map +1 -0
  158. package/dist/src/gateway/hono/routes/sessions.js +47 -7
  159. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  160. package/dist/src/gateway/hono/routes/workflows.js +27 -4
  161. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  162. package/dist/src/gateway/run-loop.js +1 -1
  163. package/dist/src/gateway/service.d.ts +3 -0
  164. package/dist/src/gateway/service.js +10 -3
  165. package/dist/src/gateway/service.js.map +1 -1
  166. package/dist/src/goals/goal-service.d.ts +1 -1
  167. package/dist/src/goals/goal-service.js +2 -1
  168. package/dist/src/goals/goal-service.js.map +1 -1
  169. package/dist/src/goals/goal-store.d.ts +1 -1
  170. package/dist/src/goals/goal-store.js +12 -6
  171. package/dist/src/goals/goal-store.js.map +1 -1
  172. package/dist/src/goals/goal-workflow-judge.js +1 -1
  173. package/dist/src/goals/types.d.ts +3 -0
  174. package/dist/src/i18n/goals-bundle.js +1 -1
  175. package/dist/src/i18n/index.js +1 -1
  176. package/dist/src/i18n/share-tool-bundle.js +2 -2
  177. package/dist/src/mcp/channel-bridge.js +1 -1
  178. package/dist/src/notes/agent-context.js +2 -2
  179. package/dist/src/projects/automation-bind.d.ts +1 -0
  180. package/dist/src/projects/automation-bind.js +16 -0
  181. package/dist/src/projects/automation-bind.js.map +1 -0
  182. package/dist/src/projects/goal-bind.d.ts +4 -0
  183. package/dist/src/projects/goal-bind.js +40 -0
  184. package/dist/src/projects/goal-bind.js.map +1 -0
  185. package/dist/src/projects/index.d.ts +11 -0
  186. package/dist/src/projects/index.js +11 -0
  187. package/dist/src/projects/memory-bind.d.ts +1 -0
  188. package/dist/src/projects/memory-bind.js +16 -0
  189. package/dist/src/projects/memory-bind.js.map +1 -0
  190. package/dist/src/projects/project-agent.d.ts +10 -0
  191. package/dist/src/projects/project-agent.js +27 -0
  192. package/dist/src/projects/project-agent.js.map +1 -0
  193. package/dist/src/projects/project-loop.d.ts +58 -0
  194. package/dist/src/projects/project-loop.js +118 -0
  195. package/dist/src/projects/project-loop.js.map +1 -0
  196. package/dist/src/projects/project-service.d.ts +26 -0
  197. package/dist/src/projects/project-service.js +94 -0
  198. package/dist/src/projects/project-service.js.map +1 -0
  199. package/dist/src/projects/project-store.d.ts +31 -0
  200. package/dist/src/projects/project-store.js +193 -0
  201. package/dist/src/projects/project-store.js.map +1 -0
  202. package/dist/src/projects/session-bind.d.ts +5 -0
  203. package/dist/src/projects/session-bind.js +46 -0
  204. package/dist/src/projects/session-bind.js.map +1 -0
  205. package/dist/src/projects/types.d.ts +60 -0
  206. package/dist/src/projects/types.js +1 -0
  207. package/dist/src/projects/workflow-bind.d.ts +1 -0
  208. package/dist/src/projects/workflow-bind.js +16 -0
  209. package/dist/src/projects/workflow-bind.js.map +1 -0
  210. package/dist/src/projects/workspace.d.ts +5 -0
  211. package/dist/src/projects/workspace.js +25 -0
  212. package/dist/src/projects/workspace.js.map +1 -0
  213. package/dist/src/session/index.d.ts +1 -1
  214. package/dist/src/session/index.js +3 -3
  215. package/dist/src/session/session-workspace.d.ts +4 -2
  216. package/dist/src/session/session-workspace.js +10 -3
  217. package/dist/src/session/session-workspace.js.map +1 -1
  218. package/dist/src/session/types.d.ts +3 -0
  219. package/dist/src/session/types.js.map +1 -1
  220. package/dist/src/storage/sqlite/memory-records-repository.d.ts +3 -0
  221. package/dist/src/storage/sqlite/memory-records-repository.js +16 -5
  222. package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -1
  223. package/dist/src/storage/sqlite/migrations/019_projects.sql +40 -0
  224. package/dist/src/storage/sqlite/migrations/020_project_default_agent.sql +1 -0
  225. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  226. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  227. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  228. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  229. package/dist/src/storage/sqlite/notes-repository.js +20 -4
  230. package/dist/src/storage/sqlite/notes-repository.js.map +1 -1
  231. package/dist/src/storage/sqlite/row-mappers.d.ts +2 -0
  232. package/dist/src/storage/sqlite/row-mappers.js +2 -0
  233. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  234. package/dist/src/storage/sqlite/schema.js +1 -1
  235. package/dist/src/storage/sqlite/session-repository.js +10 -5
  236. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  237. package/dist/src/storage/sqlite/transcript-repository.js +8 -0
  238. package/dist/src/storage/sqlite/transcript-repository.js.map +1 -1
  239. package/dist/src/tui/backends/embedded-backend.js +1 -1
  240. package/dist/src/tui/tui-commands.js +145 -0
  241. package/dist/src/tui/tui-commands.js.map +1 -1
  242. package/dist/src/workflows/domain/run.d.ts +1 -0
  243. package/dist/src/workflows/domain/run.js.map +1 -1
  244. package/dist/src/workflows/index.js +1 -1
  245. package/dist/src/workflows/service/workflow-run-service.d.ts +1 -0
  246. package/dist/src/workflows/service/workflow-run-service.js +18 -4
  247. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  248. package/dist/src/workflows/service/workflow-run-service.types.d.ts +2 -0
  249. package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -0
  250. package/dist/src/workflows/service/workflow-session-bridge.js +3 -0
  251. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  252. package/dist/src/workflows/store/run-index-store.d.ts +1 -0
  253. package/dist/src/workflows/store/run-index-store.js +13 -3
  254. package/dist/src/workflows/store/run-index-store.js.map +1 -1
  255. package/dist/src/workflows/store/run-store.d.ts +3 -1
  256. package/dist/src/workflows/store/run-store.js +5 -2
  257. package/dist/src/workflows/store/run-store.js.map +1 -1
  258. package/package.json +10 -1
  259. package/dist/gateway/static/root/assets/agents-2SVUUPlp.js +0 -2
  260. package/dist/gateway/static/root/assets/apps-page-BWeQ1I49.js +0 -1
  261. package/dist/gateway/static/root/assets/automation-suggestion-card-BHk5rtJz.js +0 -1
  262. package/dist/gateway/static/root/assets/automations-page-QHotl53D.js +0 -1
  263. package/dist/gateway/static/root/assets/browser-settings-page-Cmwi6IIQ.js +0 -8
  264. package/dist/gateway/static/root/assets/channels-settings-BOMCUe2J.js +0 -1
  265. package/dist/gateway/static/root/assets/connectors-page-C-Dexk_F.js +0 -2
  266. package/dist/gateway/static/root/assets/dreaming-settings-WPEj8pir.js +0 -1
  267. package/dist/gateway/static/root/assets/gateway-settings-DdzbtW9R.js +0 -1
  268. package/dist/gateway/static/root/assets/goal-detail-page-Dxldogms.js +0 -1
  269. package/dist/gateway/static/root/assets/goals-page-DU5Nd6Xp.js +0 -2
  270. package/dist/gateway/static/root/assets/heartbeat-settings-Cgm5JmwH.js +0 -1
  271. package/dist/gateway/static/root/assets/index-BU1pvxmS.js +0 -191
  272. package/dist/gateway/static/root/assets/index-l54WfSqe.css +0 -1
  273. package/dist/gateway/static/root/assets/logs-page-C10aS4XO.js +0 -2
  274. package/dist/gateway/static/root/assets/messages-C6Kc4Jhf.js +0 -3
  275. package/dist/gateway/static/root/assets/models-hub-panel-B35CAfg6.js +0 -2
  276. package/dist/gateway/static/root/assets/note-detail-page-Brlwse8x.js +0 -2
  277. package/dist/gateway/static/root/assets/note-image-lightbox-BthwKjLA.js +0 -1
  278. package/dist/gateway/static/root/assets/note-time-hm6JO_Wi.js +0 -1
  279. package/dist/gateway/static/root/assets/notes-page-CoAwRc7L.js +0 -1
  280. package/dist/gateway/static/root/assets/remote-access-hub-B36RQ05h.js +0 -1
  281. package/dist/gateway/static/root/assets/sessions-page-73THChnj.js +0 -1
  282. package/dist/gateway/static/root/assets/settings-advanced-gate-CR9VsY-R.js +0 -1
  283. package/dist/gateway/static/root/assets/settings-page-BJ1AhfKI.js +0 -1
  284. package/dist/gateway/static/root/assets/settings-page-layout--6qT7ZJa.js +0 -1
  285. package/dist/gateway/static/root/assets/setup-status-panel-C1TtS1vJ.js +0 -1
  286. package/dist/gateway/static/root/assets/share-preview-page-BZADSbS1.js +0 -2
  287. package/dist/gateway/static/root/assets/shares-settings-gqC8Rmhy.js +0 -1
  288. package/dist/gateway/static/root/assets/skill-reload-api-C9P-WYvS.js +0 -1
  289. package/dist/gateway/static/root/assets/skills-page-CEpSvOhF.js +0 -2
  290. package/dist/gateway/static/root/assets/voice-api-key-field-BsoqJba6.js +0 -1
  291. package/dist/gateway/static/root/assets/voice-player-store-DduWlJYV.js +0 -1
  292. package/dist/gateway/static/root/assets/workflow-run-setup-panel-CcQeX6l5.js +0 -3
  293. package/dist/gateway/static/root/assets/workflows-page-CeA8A9Ef.js +0 -18
@@ -4,6 +4,9 @@ import { GoalService } from "../../goals/goal-service.js";
4
4
  import "../../goals/index.js";
5
5
  import "../../storage/sqlite/index.js";
6
6
  import { formatExamples, register } from "../registry.js";
7
+ import { ProjectService } from "../../projects/project-service.js";
8
+ import { resolveProjectAgentId } from "../../projects/project-agent.js";
9
+ import "../../projects/index.js";
7
10
  import { Command } from "commander";
8
11
  //#region src/cli/commands/goal.ts
9
12
  init_loader();
@@ -37,6 +40,17 @@ function printGoal(goal) {
37
40
  });
38
41
  }
39
42
  }
43
+ function resolveProjectId(raw) {
44
+ const ref = raw?.trim();
45
+ if (!ref) return void 0;
46
+ const projects = new ProjectService();
47
+ const project = projects.get(ref) ?? projects.getBySlug(ref);
48
+ if (!project) {
49
+ console.error(`Project not found: ${ref}`);
50
+ process.exit(1);
51
+ }
52
+ return project.id;
53
+ }
40
54
  function createGoalCommand(ctx) {
41
55
  const cmd = new Command("goal").description("Manage durable goals").addHelpText("after", formatExamples([
42
56
  "xopc goal list",
@@ -48,12 +62,13 @@ function createGoalCommand(ctx) {
48
62
  "xopc goal checklist add <goal-id> \"Tests pass\"",
49
63
  "xopc goal evidence add <goal-id> \"CI passed\" --kind test"
50
64
  ]));
51
- cmd.addCommand(new Command("list").description("List goals").option("--status <status>", "Filter status (comma-separated)").option("--agent-id <id>", "Filter by agent id").option("--session-key <key>", "Filter by linked session").option("--limit <n>", "Maximum rows", "20").action(async (options) => {
65
+ cmd.addCommand(new Command("list").description("List goals").option("--status <status>", "Filter status (comma-separated)").option("--agent-id <id>", "Filter by agent id").option("--session-key <key>", "Filter by linked session").option("--project <id-or-slug>", "Filter by project").option("--limit <n>", "Maximum rows", "20").action(async (options) => {
52
66
  await withGoals(ctx, async (goals) => {
53
67
  const rows = goals.list({
54
68
  status: options.status?.split(",").map((s) => s.trim()).filter(Boolean),
55
69
  agentId: options.agentId,
56
70
  sessionKey: options.sessionKey,
71
+ projectId: resolveProjectId(options.project),
57
72
  limit: Number(options.limit) || 20
58
73
  });
59
74
  if (!rows.length) {
@@ -64,17 +79,25 @@ function createGoalCommand(ctx) {
64
79
  rows.forEach((goal) => console.log(`${summarize(goal)}\n`));
65
80
  });
66
81
  }));
67
- cmd.addCommand(new Command("new").description("Create a goal").argument("<title>", "Goal title").option("--session-key <key>", "Link to a session key").option("--agent-id <id>", "Agent id").option("--max-turns <n>", "Turn budget").option("--priority <level>", "low, normal, or high", "normal").action(async (title, options) => {
82
+ cmd.addCommand(new Command("new").description("Create a goal").argument("<title>", "Goal title").option("--session-key <key>", "Link to a session key").option("--agent-id <id>", "Agent id").option("--max-turns <n>", "Turn budget").option("--priority <level>", "low, normal, or high", "normal").option("--project <id-or-slug>", "Attach the goal to a project").action(async (title, options) => {
68
83
  const cfg = loadConfig(ctx.configPath);
69
84
  await withGoals(ctx, async (goals) => {
85
+ const projectId = resolveProjectId(options.project);
86
+ const agentId = options.sessionKey && !options.agentId ? void 0 : resolveProjectAgentId({
87
+ config: cfg,
88
+ projects: new ProjectService(),
89
+ explicitAgentId: options.agentId,
90
+ projectId
91
+ });
70
92
  const goal = goals.create({
71
93
  title,
72
94
  sessionKey: options.sessionKey,
73
- agentId: options.agentId,
95
+ agentId,
74
96
  priority: options.priority === "low" || options.priority === "high" ? options.priority : "normal",
75
97
  maxTurns: options.maxTurns ? Number(options.maxTurns) : void 0,
76
98
  config: cfg,
77
- source: "cli"
99
+ source: "cli",
100
+ projectId
78
101
  });
79
102
  console.log(`Created goal ${goal.id}`);
80
103
  console.log(` ${goal.title}`);
@@ -1 +1 @@
1
- {"version":3,"file":"goal.js","names":[],"sources":["../../../../src/cli/commands/goal.ts"],"sourcesContent":["import { Command } from 'commander';\n\nimport { loadConfig } from '../../config/loader.js';\nimport { closeXopcDatabase, openXopcDatabase } from '../../storage/sqlite/index.js';\nimport { GoalService, type GoalEvidence, type GoalWithDetails } from '../../goals/index.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\n\ntype EvidenceKind = GoalEvidence['kind'];\n\nfunction parseEvidenceKind(raw: string | undefined): EvidenceKind {\n if (\n raw === 'file' ||\n raw === 'diff' ||\n raw === 'command' ||\n raw === 'test' ||\n raw === 'link' ||\n raw === 'message' ||\n raw === 'artifact'\n ) {\n return raw;\n }\n return 'message';\n}\n\nfunction summarize(goal: GoalWithDetails): string {\n const done = goal.checklist.filter((it) => it.status === 'completed' || it.status === 'impossible').length;\n const progress = goal.checklist.length ? ` · checklist ${done}/${goal.checklist.length}` : '';\n const next = goal.nextAction ? `\\n Next: ${goal.nextAction}` : '';\n const blocked = goal.blockedReason ? `\\n Blocked: ${goal.blockedReason}` : '';\n return ` ${goal.id} [${goal.status}] ${goal.title}\\n Agent: ${goal.agentId} · turns ${goal.turnsUsed}/${goal.maxTurns}${progress}${next}${blocked}`;\n}\n\nasync function withGoals<T>(ctx: CLIContext, fn: (goals: GoalService) => Promise<T> | T): Promise<T> {\n openXopcDatabase();\n try {\n return await fn(new GoalService());\n } finally {\n closeXopcDatabase();\n }\n}\n\nfunction printGoal(goal: GoalWithDetails): void {\n console.log(summarize(goal));\n if (goal.checklist.length) {\n console.log('\\nChecklist:');\n goal.checklist.forEach((it, index) => {\n const marker = it.status === 'completed' ? '[x]' : it.status === 'impossible' ? '[!]' : '[ ]';\n const evidence = it.evidenceSummary ? ` (${it.evidenceSummary})` : '';\n console.log(` ${index + 1}. ${marker} ${it.text}${evidence}`);\n });\n }\n}\n\nfunction createGoalCommand(ctx: CLIContext): Command {\n const cmd = new Command('goal')\n .description('Manage durable goals')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc goal list',\n 'xopc goal new \"Ship v0.2 release\"',\n 'xopc goal show <goal-id>',\n 'xopc goal pause <goal-id>',\n 'xopc goal resume <goal-id>',\n 'xopc goal archive <goal-id>',\n 'xopc goal checklist add <goal-id> \"Tests pass\"',\n 'xopc goal evidence add <goal-id> \"CI passed\" --kind test',\n ]),\n );\n\n cmd.addCommand(\n new Command('list')\n .description('List goals')\n .option('--status <status>', 'Filter status (comma-separated)')\n .option('--agent-id <id>', 'Filter by agent id')\n .option('--session-key <key>', 'Filter by linked session')\n .option('--limit <n>', 'Maximum rows', '20')\n .action(async (options) => {\n await withGoals(ctx, async (goals) => {\n const rows = goals.list({\n status: options.status?.split(',').map((s: string) => s.trim()).filter(Boolean),\n agentId: options.agentId,\n sessionKey: options.sessionKey,\n limit: Number(options.limit) || 20,\n });\n if (!rows.length) {\n console.log('No goals.');\n return;\n }\n console.log('Goals:\\n');\n rows.forEach((goal) => console.log(`${summarize(goal)}\\n`));\n });\n }),\n );\n\n cmd.addCommand(\n new Command('new')\n .description('Create a goal')\n .argument('<title>', 'Goal title')\n .option('--session-key <key>', 'Link to a session key')\n .option('--agent-id <id>', 'Agent id')\n .option('--max-turns <n>', 'Turn budget')\n .option('--priority <level>', 'low, normal, or high', 'normal')\n .action(async (title, options) => {\n const cfg = loadConfig(ctx.configPath);\n await withGoals(ctx, async (goals) => {\n const goal = goals.create({\n title,\n sessionKey: options.sessionKey,\n agentId: options.agentId,\n priority: options.priority === 'low' || options.priority === 'high' ? options.priority : 'normal',\n maxTurns: options.maxTurns ? Number(options.maxTurns) : undefined,\n config: cfg,\n source: 'cli',\n });\n console.log(`Created goal ${goal.id}`);\n console.log(` ${goal.title}`);\n });\n }),\n );\n\n cmd.addCommand(\n new Command('show')\n .description('Show a goal')\n .argument('<goal-id>', 'Goal id')\n .action(async (goalId) => {\n await withGoals(ctx, async (goals) => {\n const goal = goals.get(goalId);\n if (!goal) {\n console.error(`Goal not found: ${goalId}`);\n process.exit(1);\n }\n printGoal(goal);\n });\n }),\n );\n\n for (const [name, description] of [\n ['pause', 'Pause a goal'],\n ['resume', 'Resume a goal'],\n ['archive', 'Archive a goal'],\n ] as const) {\n cmd.addCommand(\n new Command(name)\n .description(description)\n .argument('<goal-id>', 'Goal id')\n .action(async (goalId) => {\n await withGoals(ctx, async (goals) => {\n const goal =\n name === 'pause' ? goals.pause(goalId) : name === 'resume' ? goals.resume(goalId) : goals.archive(goalId);\n if (!goal) {\n console.error(`Goal not found: ${goalId}`);\n process.exit(1);\n }\n console.log(`${description}: ${goal.title}`);\n });\n }),\n );\n }\n\n cmd.addCommand(\n new Command('runs')\n .description('List goal runs')\n .argument('<goal-id>', 'Goal id')\n .option('--limit <n>', 'Maximum rows', '20')\n .action(async (goalId, options) => {\n await withGoals(ctx, async (goals) => {\n const runs = goals.listRuns(goalId, Number(options.limit) || 20);\n if (!runs.length) {\n console.log('No runs.');\n return;\n }\n runs.forEach((run) => {\n const at = new Date(run.finishedAt ?? run.startedAt).toISOString();\n console.log(` ${run.id} [${run.verdict ?? run.status}] ${at}`);\n if (run.reason) console.log(` ${run.reason}`);\n });\n });\n }),\n );\n\n const checklist = new Command('checklist').description('Manage goal checklist');\n checklist.addCommand(\n new Command('add')\n .argument('<goal-id>', 'Goal id')\n .argument('<text>', 'Checklist item')\n .action(async (goalId, text) => {\n await withGoals(ctx, async (goals) => {\n const goal = goals.updateChecklist(goalId, { type: 'add', text });\n if (!goal) {\n console.error(`Goal not found: ${goalId}`);\n process.exit(1);\n }\n console.log(`Added checklist item to ${goal.title}`);\n });\n }),\n );\n checklist.addCommand(\n new Command('mark')\n .argument('<goal-id>', 'Goal id')\n .argument('<number>', '1-based checklist item number')\n .argument('<status>', 'pending, completed, or impossible')\n .action(async (goalId, number, status) => {\n await withGoals(ctx, async (goals) => {\n const goal = goals.get(goalId);\n const item = goal?.checklist[Number(number) - 1];\n if (!goal || !item) {\n console.error(`Checklist item not found: ${number}`);\n process.exit(1);\n }\n if (status !== 'pending' && status !== 'completed' && status !== 'impossible') {\n console.error('Status must be pending, completed, or impossible');\n process.exit(1);\n }\n goals.updateChecklist(goalId, { type: 'mark', itemId: item.id, status });\n console.log(`Marked item #${number} ${status}`);\n });\n }),\n );\n cmd.addCommand(checklist);\n\n const evidence = new Command('evidence').description('Manage goal evidence');\n evidence.addCommand(\n new Command('list')\n .argument('<goal-id>', 'Goal id')\n .option('--limit <n>', 'Maximum rows', '20')\n .action(async (goalId, options) => {\n await withGoals(ctx, async (goals) => {\n if (!goals.get(goalId)) {\n console.error(`Goal not found: ${goalId}`);\n process.exit(1);\n }\n const rows = goals.listEvidence(goalId, Number(options.limit) || 20);\n if (!rows.length) {\n console.log('No evidence.');\n return;\n }\n rows.forEach((item) => {\n const at = new Date(item.createdAt).toISOString();\n console.log(` ${item.id} [${item.kind}] ${item.title} · ${at}`);\n if (item.uri) console.log(` URI: ${item.uri}`);\n if (item.summary) console.log(` ${item.summary}`);\n });\n });\n }),\n );\n evidence.addCommand(\n new Command('add')\n .argument('<goal-id>', 'Goal id')\n .argument('<title>', 'Evidence title')\n .option('--kind <kind>', 'file, diff, command, test, link, message, or artifact', 'message')\n .option('--summary <text>', 'Evidence summary')\n .option('--uri <uri>', 'URI or local path')\n .action(async (goalId, title, options) => {\n await withGoals(ctx, async (goals) => {\n if (!goals.get(goalId)) {\n console.error(`Goal not found: ${goalId}`);\n process.exit(1);\n }\n const evidence = goals.addEvidence({\n goalId,\n kind: parseEvidenceKind(options.kind),\n title,\n summary: typeof options.summary === 'string' ? options.summary : undefined,\n uri: typeof options.uri === 'string' ? options.uri : undefined,\n });\n console.log(`Added evidence ${evidence.id}`);\n console.log(` [${evidence.kind}] ${evidence.title}`);\n });\n }),\n );\n cmd.addCommand(evidence);\n\n return cmd;\n}\n\nregister({\n id: 'goal',\n name: 'goal',\n description: 'Manage durable goals',\n factory: createGoalCommand,\n metadata: {\n category: 'utility',\n examples: ['xopc goal list', 'xopc goal new \"Ship the release\"', 'xopc goal show <goal-id>'],\n },\n});\n\nexport { createGoalCommand };\n"],"mappings":"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"}
1
+ {"version":3,"file":"goal.js","names":[],"sources":["../../../../src/cli/commands/goal.ts"],"sourcesContent":["import { Command } from 'commander';\n\nimport { loadConfig } from '../../config/loader.js';\nimport { closeXopcDatabase, openXopcDatabase } from '../../storage/sqlite/index.js';\nimport { GoalService, type GoalEvidence, type GoalWithDetails } from '../../goals/index.js';\nimport { ProjectService, resolveProjectAgentId } from '../../projects/index.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\n\ntype EvidenceKind = GoalEvidence['kind'];\n\nfunction parseEvidenceKind(raw: string | undefined): EvidenceKind {\n if (\n raw === 'file' ||\n raw === 'diff' ||\n raw === 'command' ||\n raw === 'test' ||\n raw === 'link' ||\n raw === 'message' ||\n raw === 'artifact'\n ) {\n return raw;\n }\n return 'message';\n}\n\nfunction summarize(goal: GoalWithDetails): string {\n const done = goal.checklist.filter((it) => it.status === 'completed' || it.status === 'impossible').length;\n const progress = goal.checklist.length ? ` · checklist ${done}/${goal.checklist.length}` : '';\n const next = goal.nextAction ? `\\n Next: ${goal.nextAction}` : '';\n const blocked = goal.blockedReason ? `\\n Blocked: ${goal.blockedReason}` : '';\n return ` ${goal.id} [${goal.status}] ${goal.title}\\n Agent: ${goal.agentId} · turns ${goal.turnsUsed}/${goal.maxTurns}${progress}${next}${blocked}`;\n}\n\nasync function withGoals<T>(ctx: CLIContext, fn: (goals: GoalService) => Promise<T> | T): Promise<T> {\n openXopcDatabase();\n try {\n return await fn(new GoalService());\n } finally {\n closeXopcDatabase();\n }\n}\n\nfunction printGoal(goal: GoalWithDetails): void {\n console.log(summarize(goal));\n if (goal.checklist.length) {\n console.log('\\nChecklist:');\n goal.checklist.forEach((it, index) => {\n const marker = it.status === 'completed' ? '[x]' : it.status === 'impossible' ? '[!]' : '[ ]';\n const evidence = it.evidenceSummary ? ` (${it.evidenceSummary})` : '';\n console.log(` ${index + 1}. ${marker} ${it.text}${evidence}`);\n });\n }\n}\n\nfunction resolveProjectId(raw: string | undefined): string | undefined {\n const ref = raw?.trim();\n if (!ref) return undefined;\n const projects = new ProjectService();\n const project = projects.get(ref) ?? projects.getBySlug(ref);\n if (!project) {\n console.error(`Project not found: ${ref}`);\n process.exit(1);\n }\n return project.id;\n}\n\nfunction createGoalCommand(ctx: CLIContext): Command {\n const cmd = new Command('goal')\n .description('Manage durable goals')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc goal list',\n 'xopc goal new \"Ship v0.2 release\"',\n 'xopc goal show <goal-id>',\n 'xopc goal pause <goal-id>',\n 'xopc goal resume <goal-id>',\n 'xopc goal archive <goal-id>',\n 'xopc goal checklist add <goal-id> \"Tests pass\"',\n 'xopc goal evidence add <goal-id> \"CI passed\" --kind test',\n ]),\n );\n\n cmd.addCommand(\n new Command('list')\n .description('List goals')\n .option('--status <status>', 'Filter status (comma-separated)')\n .option('--agent-id <id>', 'Filter by agent id')\n .option('--session-key <key>', 'Filter by linked session')\n .option('--project <id-or-slug>', 'Filter by project')\n .option('--limit <n>', 'Maximum rows', '20')\n .action(async (options) => {\n await withGoals(ctx, async (goals) => {\n const rows = goals.list({\n status: options.status?.split(',').map((s: string) => s.trim()).filter(Boolean),\n agentId: options.agentId,\n sessionKey: options.sessionKey,\n projectId: resolveProjectId(options.project),\n limit: Number(options.limit) || 20,\n });\n if (!rows.length) {\n console.log('No goals.');\n return;\n }\n console.log('Goals:\\n');\n rows.forEach((goal) => console.log(`${summarize(goal)}\\n`));\n });\n }),\n );\n\n cmd.addCommand(\n new Command('new')\n .description('Create a goal')\n .argument('<title>', 'Goal title')\n .option('--session-key <key>', 'Link to a session key')\n .option('--agent-id <id>', 'Agent id')\n .option('--max-turns <n>', 'Turn budget')\n .option('--priority <level>', 'low, normal, or high', 'normal')\n .option('--project <id-or-slug>', 'Attach the goal to a project')\n .action(async (title, options) => {\n const cfg = loadConfig(ctx.configPath);\n await withGoals(ctx, async (goals) => {\n const projectId = resolveProjectId(options.project);\n const agentId = options.sessionKey && !options.agentId\n ? undefined\n : resolveProjectAgentId({\n config: cfg,\n projects: new ProjectService(),\n explicitAgentId: options.agentId,\n projectId,\n });\n const goal = goals.create({\n title,\n sessionKey: options.sessionKey,\n agentId,\n priority: options.priority === 'low' || options.priority === 'high' ? options.priority : 'normal',\n maxTurns: options.maxTurns ? Number(options.maxTurns) : undefined,\n config: cfg,\n source: 'cli',\n projectId,\n });\n console.log(`Created goal ${goal.id}`);\n console.log(` ${goal.title}`);\n });\n }),\n );\n\n cmd.addCommand(\n new Command('show')\n .description('Show a goal')\n .argument('<goal-id>', 'Goal id')\n .action(async (goalId) => {\n await withGoals(ctx, async (goals) => {\n const goal = goals.get(goalId);\n if (!goal) {\n console.error(`Goal not found: ${goalId}`);\n process.exit(1);\n }\n printGoal(goal);\n });\n }),\n );\n\n for (const [name, description] of [\n ['pause', 'Pause a goal'],\n ['resume', 'Resume a goal'],\n ['archive', 'Archive a goal'],\n ] as const) {\n cmd.addCommand(\n new Command(name)\n .description(description)\n .argument('<goal-id>', 'Goal id')\n .action(async (goalId) => {\n await withGoals(ctx, async (goals) => {\n const goal =\n name === 'pause' ? goals.pause(goalId) : name === 'resume' ? goals.resume(goalId) : goals.archive(goalId);\n if (!goal) {\n console.error(`Goal not found: ${goalId}`);\n process.exit(1);\n }\n console.log(`${description}: ${goal.title}`);\n });\n }),\n );\n }\n\n cmd.addCommand(\n new Command('runs')\n .description('List goal runs')\n .argument('<goal-id>', 'Goal id')\n .option('--limit <n>', 'Maximum rows', '20')\n .action(async (goalId, options) => {\n await withGoals(ctx, async (goals) => {\n const runs = goals.listRuns(goalId, Number(options.limit) || 20);\n if (!runs.length) {\n console.log('No runs.');\n return;\n }\n runs.forEach((run) => {\n const at = new Date(run.finishedAt ?? run.startedAt).toISOString();\n console.log(` ${run.id} [${run.verdict ?? run.status}] ${at}`);\n if (run.reason) console.log(` ${run.reason}`);\n });\n });\n }),\n );\n\n const checklist = new Command('checklist').description('Manage goal checklist');\n checklist.addCommand(\n new Command('add')\n .argument('<goal-id>', 'Goal id')\n .argument('<text>', 'Checklist item')\n .action(async (goalId, text) => {\n await withGoals(ctx, async (goals) => {\n const goal = goals.updateChecklist(goalId, { type: 'add', text });\n if (!goal) {\n console.error(`Goal not found: ${goalId}`);\n process.exit(1);\n }\n console.log(`Added checklist item to ${goal.title}`);\n });\n }),\n );\n checklist.addCommand(\n new Command('mark')\n .argument('<goal-id>', 'Goal id')\n .argument('<number>', '1-based checklist item number')\n .argument('<status>', 'pending, completed, or impossible')\n .action(async (goalId, number, status) => {\n await withGoals(ctx, async (goals) => {\n const goal = goals.get(goalId);\n const item = goal?.checklist[Number(number) - 1];\n if (!goal || !item) {\n console.error(`Checklist item not found: ${number}`);\n process.exit(1);\n }\n if (status !== 'pending' && status !== 'completed' && status !== 'impossible') {\n console.error('Status must be pending, completed, or impossible');\n process.exit(1);\n }\n goals.updateChecklist(goalId, { type: 'mark', itemId: item.id, status });\n console.log(`Marked item #${number} ${status}`);\n });\n }),\n );\n cmd.addCommand(checklist);\n\n const evidence = new Command('evidence').description('Manage goal evidence');\n evidence.addCommand(\n new Command('list')\n .argument('<goal-id>', 'Goal id')\n .option('--limit <n>', 'Maximum rows', '20')\n .action(async (goalId, options) => {\n await withGoals(ctx, async (goals) => {\n if (!goals.get(goalId)) {\n console.error(`Goal not found: ${goalId}`);\n process.exit(1);\n }\n const rows = goals.listEvidence(goalId, Number(options.limit) || 20);\n if (!rows.length) {\n console.log('No evidence.');\n return;\n }\n rows.forEach((item) => {\n const at = new Date(item.createdAt).toISOString();\n console.log(` ${item.id} [${item.kind}] ${item.title} · ${at}`);\n if (item.uri) console.log(` URI: ${item.uri}`);\n if (item.summary) console.log(` ${item.summary}`);\n });\n });\n }),\n );\n evidence.addCommand(\n new Command('add')\n .argument('<goal-id>', 'Goal id')\n .argument('<title>', 'Evidence title')\n .option('--kind <kind>', 'file, diff, command, test, link, message, or artifact', 'message')\n .option('--summary <text>', 'Evidence summary')\n .option('--uri <uri>', 'URI or local path')\n .action(async (goalId, title, options) => {\n await withGoals(ctx, async (goals) => {\n if (!goals.get(goalId)) {\n console.error(`Goal not found: ${goalId}`);\n process.exit(1);\n }\n const evidence = goals.addEvidence({\n goalId,\n kind: parseEvidenceKind(options.kind),\n title,\n summary: typeof options.summary === 'string' ? options.summary : undefined,\n uri: typeof options.uri === 'string' ? options.uri : undefined,\n });\n console.log(`Added evidence ${evidence.id}`);\n console.log(` [${evidence.kind}] ${evidence.title}`);\n });\n }),\n );\n cmd.addCommand(evidence);\n\n return cmd;\n}\n\nregister({\n id: 'goal',\n name: 'goal',\n description: 'Manage durable goals',\n factory: createGoalCommand,\n metadata: {\n category: 'utility',\n examples: ['xopc goal list', 'xopc goal new \"Ship the release\"', 'xopc goal show <goal-id>'],\n },\n});\n\nexport { createGoalCommand };\n"],"mappings":"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"}
@@ -2,9 +2,9 @@ import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
2
2
  import { loadConfig, saveConfig } from "../../config/loader.js";
3
3
  import { CredentialResolver, init_credentials } from "../../auth/credentials.js";
4
4
  import { getAllModels, getAvailableModels, getConfiguredProviders, getProviderAuthState, getProviderDisplayName, init_providers, isProviderConfigured, providerSupportsApiKey, providerSupportsOAuth, resolveModel } from "../../providers/index.js";
5
- import "../../config/index.js";
6
5
  import { formatExamples, register } from "../registry.js";
7
6
  import { getContextWithOpts } from "../context.js";
7
+ import "../../config/index.js";
8
8
  import { prepareUpdateGlobalDefaults } from "../../gateway/global-defaults-admin.js";
9
9
  import { colors } from "../utils/colors.js";
10
10
  import { runCliOAuthLogin } from "../utils/oauth-login.js";
@@ -1,8 +1,8 @@
1
1
  import { ConfigSchema, init_schema } from "../../config/schema.js";
2
2
  import { saveConfig } from "../../config/loader.js";
3
3
  import { resolveGatewayLocalClientHost } from "../../config/gateway-bind.js";
4
- import "../../config/index.js";
5
4
  import { formatExamples, register } from "../registry.js";
5
+ import "../../config/index.js";
6
6
  import { colors } from "../utils/colors.js";
7
7
  import { initWorkspace } from "../utils/init-workspace.js";
8
8
  import { setupModel } from "./onboard/model.js";
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { createProfile, deleteProfile, getCurrentProfile, getSwitchCommand, listProfiles, resolveProfileStateDir } from "../../config/profile.js";
4
3
  import { formatExamples, register } from "../registry.js";
4
+ import { createProfile, deleteProfile, getCurrentProfile, getSwitchCommand, listProfiles, resolveProfileStateDir } from "../../config/profile.js";
5
5
  import { colors } from "../utils/colors.js";
6
6
  import { Command } from "commander";
7
7
  import Table from "cli-table3";
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ import { type CLIContext } from '../registry.js';
3
+ declare function createProjectCommand(ctx: CLIContext): Command;
4
+ export { createProjectCommand };
@@ -0,0 +1,239 @@
1
+ import { init_loader, loadConfig } from "../../config/loader.js";
2
+ import { closeXopcDatabase, isXopcDatabaseOpen, openXopcDatabase } from "../../storage/sqlite/connection.js";
3
+ import { GoalService } from "../../goals/goal-service.js";
4
+ import "../../goals/index.js";
5
+ import { getSessionMetadata } from "../../storage/sqlite/session-repository.js";
6
+ import "../../storage/sqlite/index.js";
7
+ import { formatExamples, register } from "../registry.js";
8
+ import { ProjectService } from "../../projects/project-service.js";
9
+ import { isValidProjectAgentId, normalizeProjectAgentId } from "../../projects/project-agent.js";
10
+ import "../../projects/index.js";
11
+ import { Command } from "commander";
12
+ //#region src/cli/commands/project.ts
13
+ init_loader();
14
+ function parseStatus(raw) {
15
+ return raw === "active" || raw === "paused" || raw === "archived" ? raw : void 0;
16
+ }
17
+ async function withProjects(_ctx, fn) {
18
+ const wasOpen = isXopcDatabaseOpen();
19
+ if (!wasOpen) openXopcDatabase();
20
+ try {
21
+ return await fn(new ProjectService());
22
+ } finally {
23
+ if (!wasOpen) closeXopcDatabase();
24
+ }
25
+ }
26
+ function resolveProject(projects, ref) {
27
+ return projects.get(ref) ?? projects.getBySlug(ref);
28
+ }
29
+ function formatProject(project) {
30
+ const counts = [
31
+ project.sessionCount != null ? `sessions ${project.sessionCount}` : void 0,
32
+ project.goalCount != null ? `goals ${project.goalCount}` : void 0,
33
+ project.activeGoalCount != null ? `active goals ${project.activeGoalCount}` : void 0
34
+ ].filter(Boolean).join(" | ");
35
+ return [
36
+ `${project.id} [${project.status}] ${project.name}`,
37
+ ` Slug: ${project.slug}`,
38
+ project.defaultAgentId ? ` Default agent: ${project.defaultAgentId}` : " Default agent: global default",
39
+ project.description ? ` Description: ${project.description}` : void 0,
40
+ project.workspaceRoot ? ` Workspace: ${project.workspaceRoot}` : void 0,
41
+ counts ? ` ${counts}` : void 0,
42
+ ` Updated: ${new Date(project.updatedAt).toISOString()}`
43
+ ].filter(Boolean).join("\n");
44
+ }
45
+ function createProjectCommand(ctx) {
46
+ const cmd = new Command("project").description("Manage long-running projects").addHelpText("after", formatExamples([
47
+ "xopc project list",
48
+ "xopc project new xopc --workspace ~/develop/github/xopc",
49
+ "xopc project show xopc",
50
+ "xopc project attach-session <session-key> xopc",
51
+ "xopc project attach-goal <goal-id> xopc"
52
+ ]));
53
+ cmd.addCommand(new Command("list").description("List projects").option("--status <status>", "active, paused, or archived").option("--search <query>", "Search by name, slug, or description").option("--limit <n>", "Maximum rows", "20").option("--json", "Output JSON").action(async (options) => {
54
+ await withProjects(ctx, (projects) => {
55
+ const result = projects.list({
56
+ status: parseStatus(options.status),
57
+ search: options.search,
58
+ limit: Number(options.limit) || 20
59
+ });
60
+ if (options.json) {
61
+ console.log(JSON.stringify(result, null, 2));
62
+ return;
63
+ }
64
+ if (!result.items.length) {
65
+ console.log("No projects.");
66
+ return;
67
+ }
68
+ console.log("Projects:\n");
69
+ for (const project of result.items) console.log(`${formatProject(project)}\n`);
70
+ });
71
+ }));
72
+ cmd.addCommand(new Command("new").description("Create a project").argument("<name>", "Project name").option("--description <text>", "Project description").option("--default-agent <id>", "Default agent id for new project sessions and goals").option("--workspace <path>", "Project workspace root").option("--brief <text>", "Project brief").option("--instructions <text>", "Project instructions").option("--json", "Output JSON").action(async (name, options) => {
73
+ const cfg = loadConfig(ctx.configPath);
74
+ const defaultAgentId = normalizeProjectAgentId(options.defaultAgent);
75
+ if (!isValidProjectAgentId(cfg, defaultAgentId)) {
76
+ console.error(`Agent not found: ${options.defaultAgent}`);
77
+ process.exit(1);
78
+ }
79
+ await withProjects(ctx, (projects) => {
80
+ const project = projects.create({
81
+ name,
82
+ description: options.description,
83
+ defaultAgentId,
84
+ workspaceRoot: options.workspace,
85
+ brief: options.brief,
86
+ instructions: options.instructions
87
+ });
88
+ if (options.json) {
89
+ console.log(JSON.stringify(project, null, 2));
90
+ return;
91
+ }
92
+ console.log(`Created project ${project.id}`);
93
+ console.log(` ${project.name} (${project.slug})`);
94
+ });
95
+ }));
96
+ cmd.addCommand(new Command("show").description("Show project details").argument("<project>", "Project id or slug").option("--json", "Output JSON").action(async (projectRef, options) => {
97
+ await withProjects(ctx, (projects) => {
98
+ const project = resolveProject(projects, projectRef);
99
+ const detailed = project ? projects.getWithDetails(project.id) : null;
100
+ if (!detailed) {
101
+ console.error(`Project not found: ${projectRef}`);
102
+ process.exit(1);
103
+ }
104
+ if (options.json) {
105
+ console.log(JSON.stringify(detailed, null, 2));
106
+ return;
107
+ }
108
+ console.log(formatProject(detailed));
109
+ if (detailed.brief) console.log(`\nBrief:\n${detailed.brief}`);
110
+ if (detailed.instructions) console.log(`\nInstructions:\n${detailed.instructions}`);
111
+ });
112
+ }));
113
+ cmd.addCommand(new Command("update").description("Update a project").argument("<project>", "Project id or slug").option("--name <name>", "New name").option("--description <text>", "Project description").option("--default-agent <id>", "Default agent id for new project sessions and goals").option("--clear-default-agent", "Clear project default agent").option("--status <status>", "active, paused, or archived").option("--workspace <path>", "Project workspace root").option("--brief <text>", "Project brief").option("--instructions <text>", "Project instructions").action(async (projectRef, options) => {
114
+ const cfg = loadConfig(ctx.configPath);
115
+ const defaultAgentId = options.clearDefaultAgent ? null : normalizeProjectAgentId(options.defaultAgent);
116
+ if (defaultAgentId && !isValidProjectAgentId(cfg, defaultAgentId)) {
117
+ console.error(`Agent not found: ${options.defaultAgent}`);
118
+ process.exit(1);
119
+ }
120
+ await withProjects(ctx, (projects) => {
121
+ const project = resolveProject(projects, projectRef);
122
+ if (!project) {
123
+ console.error(`Project not found: ${projectRef}`);
124
+ process.exit(1);
125
+ }
126
+ const updated = projects.update(project.id, {
127
+ name: options.name,
128
+ description: options.description,
129
+ ...options.clearDefaultAgent || options.defaultAgent !== void 0 ? { defaultAgentId } : {},
130
+ status: parseStatus(options.status),
131
+ workspaceRoot: options.workspace,
132
+ brief: options.brief,
133
+ instructions: options.instructions
134
+ });
135
+ console.log(`Updated project ${updated.id}`);
136
+ });
137
+ }));
138
+ cmd.addCommand(new Command("archive").description("Archive a project").argument("<project>", "Project id or slug").action(async (projectRef) => {
139
+ await withProjects(ctx, (projects) => {
140
+ const project = resolveProject(projects, projectRef);
141
+ if (!project) {
142
+ console.error(`Project not found: ${projectRef}`);
143
+ process.exit(1);
144
+ }
145
+ projects.update(project.id, { status: "archived" });
146
+ console.log(`Archived project ${project.name}`);
147
+ });
148
+ }));
149
+ cmd.addCommand(new Command("attach-session").description("Attach a session to a project").argument("<session-key>", "Session key").argument("<project>", "Project id or slug").action(async (sessionKey, projectRef) => {
150
+ await withProjects(ctx, (projects) => {
151
+ const project = resolveProject(projects, projectRef);
152
+ if (!project) {
153
+ console.error(`Project not found: ${projectRef}`);
154
+ process.exit(1);
155
+ }
156
+ projects.attachSession(sessionKey, project.id);
157
+ console.log(`Attached session to ${project.name}`);
158
+ });
159
+ }));
160
+ cmd.addCommand(new Command("detach-session").description("Detach a session from its project").argument("<session-key>", "Session key").action(async (sessionKey) => {
161
+ await withProjects(ctx, (projects) => {
162
+ projects.detachSession(sessionKey);
163
+ console.log("Detached session from project.");
164
+ });
165
+ }));
166
+ cmd.addCommand(new Command("attach-goal").description("Attach a goal to a project").argument("<goal-id>", "Goal id").argument("<project>", "Project id or slug").action(async (goalId, projectRef) => {
167
+ await withProjects(ctx, (projects) => {
168
+ const project = resolveProject(projects, projectRef);
169
+ if (!project) {
170
+ console.error(`Project not found: ${projectRef}`);
171
+ process.exit(1);
172
+ }
173
+ projects.attachGoal(goalId, project.id);
174
+ console.log(`Attached goal to ${project.name}`);
175
+ });
176
+ }));
177
+ cmd.addCommand(new Command("detach-goal").description("Detach a goal from its project").argument("<goal-id>", "Goal id").action(async (goalId) => {
178
+ await withProjects(ctx, (projects) => {
179
+ projects.detachGoal(goalId);
180
+ console.log("Detached goal from project.");
181
+ });
182
+ }));
183
+ cmd.addCommand(new Command("sessions").description("List sessions in a project").argument("<project>", "Project id or slug").option("--limit <n>", "Maximum rows", "20").action(async (projectRef, options) => {
184
+ await withProjects(ctx, (projects) => {
185
+ const project = resolveProject(projects, projectRef);
186
+ if (!project) {
187
+ console.error(`Project not found: ${projectRef}`);
188
+ process.exit(1);
189
+ }
190
+ const keys = projects.listSessionKeys(project.id, Number(options.limit) || 20);
191
+ if (!keys.length) {
192
+ console.log("No sessions.");
193
+ return;
194
+ }
195
+ for (const key of keys) {
196
+ const session = getSessionMetadata(key);
197
+ const label = session?.name ? ` - ${session.name}` : "";
198
+ console.log(`${key}${label}`);
199
+ }
200
+ });
201
+ }));
202
+ cmd.addCommand(new Command("goals").description("List goals in a project").argument("<project>", "Project id or slug").option("--limit <n>", "Maximum rows", "20").action(async (projectRef, options) => {
203
+ await withProjects(ctx, (projects) => {
204
+ const project = resolveProject(projects, projectRef);
205
+ if (!project) {
206
+ console.error(`Project not found: ${projectRef}`);
207
+ process.exit(1);
208
+ }
209
+ const goals = new GoalService().list({
210
+ projectId: project.id,
211
+ limit: Number(options.limit) || 20
212
+ });
213
+ if (!goals.length) {
214
+ console.log("No goals.");
215
+ return;
216
+ }
217
+ for (const goal of goals) console.log(`${goal.id} [${goal.status}] ${goal.title}`);
218
+ });
219
+ }));
220
+ return cmd;
221
+ }
222
+ register({
223
+ id: "project",
224
+ name: "project",
225
+ description: "Manage long-running projects",
226
+ factory: createProjectCommand,
227
+ metadata: {
228
+ category: "utility",
229
+ examples: [
230
+ "xopc project list",
231
+ "xopc project new xopc",
232
+ "xopc project show <project>"
233
+ ]
234
+ }
235
+ });
236
+ //#endregion
237
+ export { createProjectCommand };
238
+
239
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","names":[],"sources":["../../../../src/cli/commands/project.ts"],"sourcesContent":["import { Command } from 'commander';\n\nimport { loadConfig } from '../../config/loader.js';\nimport {\n isValidProjectAgentId,\n normalizeProjectAgentId,\n ProjectService,\n type Project,\n type ProjectStatus,\n} from '../../projects/index.js';\nimport {\n closeXopcDatabase,\n getSessionMetadata,\n isXopcDatabaseOpen,\n openXopcDatabase,\n} from '../../storage/sqlite/index.js';\nimport { GoalService } from '../../goals/index.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\n\nfunction parseStatus(raw: string | undefined): ProjectStatus | undefined {\n return raw === 'active' || raw === 'paused' || raw === 'archived' ? raw : undefined;\n}\n\nasync function withProjects<T>(_ctx: CLIContext, fn: (projects: ProjectService) => Promise<T> | T): Promise<T> {\n const wasOpen = isXopcDatabaseOpen();\n if (!wasOpen) openXopcDatabase();\n try {\n return await fn(new ProjectService());\n } finally {\n if (!wasOpen) closeXopcDatabase();\n }\n}\n\nfunction resolveProject(projects: ProjectService, ref: string): Project | null {\n return projects.get(ref) ?? projects.getBySlug(ref);\n}\n\nfunction formatProject(project: Project & { sessionCount?: number; goalCount?: number; activeGoalCount?: number }): string {\n const counts = [\n project.sessionCount != null ? `sessions ${project.sessionCount}` : undefined,\n project.goalCount != null ? `goals ${project.goalCount}` : undefined,\n project.activeGoalCount != null ? `active goals ${project.activeGoalCount}` : undefined,\n ].filter(Boolean).join(' | ');\n const lines = [\n `${project.id} [${project.status}] ${project.name}`,\n ` Slug: ${project.slug}`,\n project.defaultAgentId ? ` Default agent: ${project.defaultAgentId}` : ' Default agent: global default',\n project.description ? ` Description: ${project.description}` : undefined,\n project.workspaceRoot ? ` Workspace: ${project.workspaceRoot}` : undefined,\n counts ? ` ${counts}` : undefined,\n ` Updated: ${new Date(project.updatedAt).toISOString()}`,\n ];\n return lines.filter(Boolean).join('\\n');\n}\n\nfunction createProjectCommand(ctx: CLIContext): Command {\n const cmd = new Command('project')\n .description('Manage long-running projects')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc project list',\n 'xopc project new xopc --workspace ~/develop/github/xopc',\n 'xopc project show xopc',\n 'xopc project attach-session <session-key> xopc',\n 'xopc project attach-goal <goal-id> xopc',\n ]),\n );\n\n cmd.addCommand(\n new Command('list')\n .description('List projects')\n .option('--status <status>', 'active, paused, or archived')\n .option('--search <query>', 'Search by name, slug, or description')\n .option('--limit <n>', 'Maximum rows', '20')\n .option('--json', 'Output JSON')\n .action(async (options) => {\n await withProjects(ctx, (projects) => {\n const result = projects.list({\n status: parseStatus(options.status),\n search: options.search,\n limit: Number(options.limit) || 20,\n });\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n if (!result.items.length) {\n console.log('No projects.');\n return;\n }\n console.log('Projects:\\n');\n for (const project of result.items) {\n console.log(`${formatProject(project)}\\n`);\n }\n });\n }),\n );\n\n cmd.addCommand(\n new Command('new')\n .description('Create a project')\n .argument('<name>', 'Project name')\n .option('--description <text>', 'Project description')\n .option('--default-agent <id>', 'Default agent id for new project sessions and goals')\n .option('--workspace <path>', 'Project workspace root')\n .option('--brief <text>', 'Project brief')\n .option('--instructions <text>', 'Project instructions')\n .option('--json', 'Output JSON')\n .action(async (name, options) => {\n const cfg = loadConfig(ctx.configPath);\n const defaultAgentId = normalizeProjectAgentId(options.defaultAgent);\n if (!isValidProjectAgentId(cfg, defaultAgentId)) {\n console.error(`Agent not found: ${options.defaultAgent}`);\n process.exit(1);\n }\n await withProjects(ctx, (projects) => {\n const project = projects.create({\n name,\n description: options.description,\n defaultAgentId,\n workspaceRoot: options.workspace,\n brief: options.brief,\n instructions: options.instructions,\n });\n if (options.json) {\n console.log(JSON.stringify(project, null, 2));\n return;\n }\n console.log(`Created project ${project.id}`);\n console.log(` ${project.name} (${project.slug})`);\n });\n }),\n );\n\n cmd.addCommand(\n new Command('show')\n .description('Show project details')\n .argument('<project>', 'Project id or slug')\n .option('--json', 'Output JSON')\n .action(async (projectRef, options) => {\n await withProjects(ctx, (projects) => {\n const project = resolveProject(projects, projectRef);\n const detailed = project ? projects.getWithDetails(project.id) : null;\n if (!detailed) {\n console.error(`Project not found: ${projectRef}`);\n process.exit(1);\n }\n if (options.json) {\n console.log(JSON.stringify(detailed, null, 2));\n return;\n }\n console.log(formatProject(detailed));\n if (detailed.brief) console.log(`\\nBrief:\\n${detailed.brief}`);\n if (detailed.instructions) console.log(`\\nInstructions:\\n${detailed.instructions}`);\n });\n }),\n );\n\n cmd.addCommand(\n new Command('update')\n .description('Update a project')\n .argument('<project>', 'Project id or slug')\n .option('--name <name>', 'New name')\n .option('--description <text>', 'Project description')\n .option('--default-agent <id>', 'Default agent id for new project sessions and goals')\n .option('--clear-default-agent', 'Clear project default agent')\n .option('--status <status>', 'active, paused, or archived')\n .option('--workspace <path>', 'Project workspace root')\n .option('--brief <text>', 'Project brief')\n .option('--instructions <text>', 'Project instructions')\n .action(async (projectRef, options) => {\n const cfg = loadConfig(ctx.configPath);\n const defaultAgentId = options.clearDefaultAgent ? null : normalizeProjectAgentId(options.defaultAgent);\n if (defaultAgentId && !isValidProjectAgentId(cfg, defaultAgentId)) {\n console.error(`Agent not found: ${options.defaultAgent}`);\n process.exit(1);\n }\n await withProjects(ctx, (projects) => {\n const project = resolveProject(projects, projectRef);\n if (!project) {\n console.error(`Project not found: ${projectRef}`);\n process.exit(1);\n }\n const updated = projects.update(project.id, {\n name: options.name,\n description: options.description,\n ...(options.clearDefaultAgent || options.defaultAgent !== undefined ? { defaultAgentId } : {}),\n status: parseStatus(options.status),\n workspaceRoot: options.workspace,\n brief: options.brief,\n instructions: options.instructions,\n });\n console.log(`Updated project ${updated.id}`);\n });\n }),\n );\n\n cmd.addCommand(\n new Command('archive')\n .description('Archive a project')\n .argument('<project>', 'Project id or slug')\n .action(async (projectRef) => {\n await withProjects(ctx, (projects) => {\n const project = resolveProject(projects, projectRef);\n if (!project) {\n console.error(`Project not found: ${projectRef}`);\n process.exit(1);\n }\n projects.update(project.id, { status: 'archived' });\n console.log(`Archived project ${project.name}`);\n });\n }),\n );\n\n cmd.addCommand(\n new Command('attach-session')\n .description('Attach a session to a project')\n .argument('<session-key>', 'Session key')\n .argument('<project>', 'Project id or slug')\n .action(async (sessionKey, projectRef) => {\n await withProjects(ctx, (projects) => {\n const project = resolveProject(projects, projectRef);\n if (!project) {\n console.error(`Project not found: ${projectRef}`);\n process.exit(1);\n }\n projects.attachSession(sessionKey, project.id);\n console.log(`Attached session to ${project.name}`);\n });\n }),\n );\n\n cmd.addCommand(\n new Command('detach-session')\n .description('Detach a session from its project')\n .argument('<session-key>', 'Session key')\n .action(async (sessionKey) => {\n await withProjects(ctx, (projects) => {\n projects.detachSession(sessionKey);\n console.log('Detached session from project.');\n });\n }),\n );\n\n cmd.addCommand(\n new Command('attach-goal')\n .description('Attach a goal to a project')\n .argument('<goal-id>', 'Goal id')\n .argument('<project>', 'Project id or slug')\n .action(async (goalId, projectRef) => {\n await withProjects(ctx, (projects) => {\n const project = resolveProject(projects, projectRef);\n if (!project) {\n console.error(`Project not found: ${projectRef}`);\n process.exit(1);\n }\n projects.attachGoal(goalId, project.id);\n console.log(`Attached goal to ${project.name}`);\n });\n }),\n );\n\n cmd.addCommand(\n new Command('detach-goal')\n .description('Detach a goal from its project')\n .argument('<goal-id>', 'Goal id')\n .action(async (goalId) => {\n await withProjects(ctx, (projects) => {\n projects.detachGoal(goalId);\n console.log('Detached goal from project.');\n });\n }),\n );\n\n cmd.addCommand(\n new Command('sessions')\n .description('List sessions in a project')\n .argument('<project>', 'Project id or slug')\n .option('--limit <n>', 'Maximum rows', '20')\n .action(async (projectRef, options) => {\n await withProjects(ctx, (projects) => {\n const project = resolveProject(projects, projectRef);\n if (!project) {\n console.error(`Project not found: ${projectRef}`);\n process.exit(1);\n }\n const keys = projects.listSessionKeys(project.id, Number(options.limit) || 20);\n if (!keys.length) {\n console.log('No sessions.');\n return;\n }\n for (const key of keys) {\n const session = getSessionMetadata(key);\n const label = session?.name ? ` - ${session.name}` : '';\n console.log(`${key}${label}`);\n }\n });\n }),\n );\n\n cmd.addCommand(\n new Command('goals')\n .description('List goals in a project')\n .argument('<project>', 'Project id or slug')\n .option('--limit <n>', 'Maximum rows', '20')\n .action(async (projectRef, options) => {\n await withProjects(ctx, (projects) => {\n const project = resolveProject(projects, projectRef);\n if (!project) {\n console.error(`Project not found: ${projectRef}`);\n process.exit(1);\n }\n const goals = new GoalService().list({ projectId: project.id, limit: Number(options.limit) || 20 });\n if (!goals.length) {\n console.log('No goals.');\n return;\n }\n for (const goal of goals) {\n console.log(`${goal.id} [${goal.status}] ${goal.title}`);\n }\n });\n }),\n );\n\n return cmd;\n}\n\nregister({\n id: 'project',\n name: 'project',\n description: 'Manage long-running projects',\n factory: createProjectCommand,\n metadata: {\n category: 'utility',\n examples: ['xopc project list', 'xopc project new xopc', 'xopc project show <project>'],\n },\n});\n\nexport { createProjectCommand };\n"],"mappings":"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"}
@@ -3,8 +3,8 @@ import { init_logger } from "../../utils/logger.js";
3
3
  import { loadConfig, saveConfig } from "../../config/loader.js";
4
4
  import { resolveGatewayEffectiveHost } from "../../config/gateway-bind.js";
5
5
  import { loadTunnelState } from "../../tunnel/tunnel-state.js";
6
- import "../../config/index.js";
7
6
  import { formatExamples, register } from "../registry.js";
7
+ import "../../config/index.js";
8
8
  import { TUNNEL_RISK_SUMMARY_LINES, TunnelConsentError, assertTunnelMayStart, hasValidTunnelConsent } from "../../tunnel/consent.js";
9
9
  import { resolveTunnelBrokerUrl, resolveTunnelRegistrationSecret } from "../../tunnel/env.js";
10
10
  import { ensureFrpcBinary } from "../../tunnel/frpc-binary.js";
@@ -1,7 +1,7 @@
1
1
  import { PACKAGE_VERSION, init_package_version } from "../../package-version.js";
2
2
  import { loadConfig } from "../../config/loader.js";
3
- import "../../config/index.js";
4
3
  import { formatExamples, register } from "../registry.js";
4
+ import "../../config/index.js";
5
5
  import { acquireUpdateLock } from "../../infra/update-lock.js";
6
6
  import { normalizeUpdateChannel } from "../../infra/update-channels.js";
7
7
  import { compareSemver, resolveNpmChannelTag } from "../../infra/update-check.js";
@@ -4,9 +4,9 @@ import { ExtensionLoader } from "../extensions/loader.js";
4
4
  import "../extensions/index.js";
5
5
  import { MessageBus } from "../infra/bus/queue.js";
6
6
  import "../infra/bus/index.js";
7
+ import { createDefaultContext } from "./registry.js";
7
8
  import { getWorkspacePath } from "../config/workspace-path-helpers.js";
8
9
  import "../config/index.js";
9
- import { createDefaultContext } from "./registry.js";
10
10
  import { registerExtensionCliProgram } from "../extensions/sdk/channel-helpers.js";
11
11
  import { join } from "path";
12
12
  //#region src/cli/extension-cli-register.ts
@@ -1,6 +1,6 @@
1
- import { init_agent_scope, normalizeAgentId, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
2
1
  import { resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
3
2
  import "../agent-manifest/index.js";
3
+ import { init_agent_scope, normalizeAgentId, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
4
4
  import { init_session_key, parseSessionKey } from "../routing/session-key.js";
5
5
  import { agentExists, getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
6
6
  //#region src/config/agent-profile.ts
@@ -13,10 +13,10 @@ import { clearConfigValueCache, getAllowedCommands, getCacheStats, init_resolve_
13
13
  import { CustomModelSchema, ModelOverrideSchema, ModelsJsonSchema, OpenAICompatSchema, OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema, OpenRouterRoutingSchema, ProviderConfigSchema, VercelGatewayRoutingSchema, getDefaultModelValues, init_models_json, loadModelsJson, modelsJsonExists, saveModelsJson, validateModelsConfig } from "./models-json.js";
14
14
  import { canonicalizeConfiguredMcpServer, isKnownCliMcpTypeAlias, normalizeConfiguredMcpServers, resolveXopcMcpTransportAlias } from "./mcp-config-normalize.js";
15
15
  import { formatThinkingLevels, listThinkingLevels, normalizeElevatedMode, normalizeReasoningLevel, normalizeThinkLevel, normalizeVerboseLevel, thinkLevelToNumber } from "../agent/transcript/thinking-types.js";
16
- import { diffConfigPaths } from "./diff.js";
17
16
  import { getWorkspacePath } from "./workspace-path-helpers.js";
18
17
  import { listAgentProfileMarkdownDirs, listAgentWorkspaceDirs } from "./workspace-dirs.js";
19
18
  import { ProfileManager, createProfile, deleteProfile, getCurrentProfile, getProfileManager, getProfileNameFromDir, getSwitchCommand, listProfiles, resolveProfileStateDir } from "./profile.js";
19
+ import { diffConfigPaths } from "./diff.js";
20
20
  import { BASE_RELOAD_RULES, buildReloadPlan, matchReloadRule } from "./rules.js";
21
21
  import { ConfigHotReloader } from "./reload.js";
22
22
  //#region src/config/index.ts
@@ -1,5 +1,5 @@
1
- import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, resolveUserPath, validateAgentIdForNewAgent } from "../agent/agent-scope.js";
2
1
  import { resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
2
+ import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, resolveUserPath, validateAgentIdForNewAgent } from "../agent/agent-scope.js";
3
3
  import { resolveEffectiveAgentProfile } from "../config/agent-profile.js";
4
4
  import { WORKSPACE_FILES, init_paths, resolveUserProfilePath } from "../config/paths.js";
5
5
  import { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES, REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET } from "../agent/context/workspace.js";