@xopcai/xopc 0.0.120 → 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 (403) 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/dashscope/src/image-generation-provider.d.ts +6 -5
  5. package/dist/extensions/dashscope/src/image-generation-provider.js +40 -64
  6. package/dist/extensions/dashscope/src/image-generation-provider.js.map +1 -1
  7. package/dist/extensions/dashscope/src/index.d.ts +1 -1
  8. package/dist/extensions/dashscope/src/index.js +2 -2
  9. package/dist/extensions/dashscope/xopc.extension.json +3 -2
  10. package/dist/extensions/minimax/src/image-generation-provider.d.ts +7 -5
  11. package/dist/extensions/minimax/src/image-generation-provider.js +43 -37
  12. package/dist/extensions/minimax/src/image-generation-provider.js.map +1 -1
  13. package/dist/extensions/minimax/src/index.d.ts +1 -1
  14. package/dist/extensions/minimax/src/index.js +2 -2
  15. package/dist/extensions/minimax/xopc.extension.json +1 -1
  16. package/dist/extensions/telegram/xopc.extension.json +1 -1
  17. package/dist/gateway/static/root/assets/Combination-HAlzriaz.js +41 -0
  18. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-APTlX9Sq.js → agent-avatar-dicebear-CK3s5cJo.js} +1 -1
  19. package/dist/gateway/static/root/assets/agents-SsQrj9B-.js +2 -0
  20. package/dist/gateway/static/root/assets/{app-management-settings-panel-DTKc5HHT.js → app-management-settings-panel-CWsNHtTs.js} +1 -1
  21. package/dist/gateway/static/root/assets/{appearance-settings-BTciFrE9.js → appearance-settings-C4b8y6iZ.js} +1 -1
  22. package/dist/gateway/static/root/assets/apps-page-CYb6fame.js +1 -0
  23. package/dist/gateway/static/root/assets/{archive-plugin-CiHaUMII.js → archive-plugin-DAtNW3Ia.js} +1 -1
  24. package/dist/gateway/static/root/assets/{attachment-load-t4gSrNjL.js → attachment-load-Dm-RY54y.js} +1 -1
  25. package/dist/gateway/static/root/assets/automation-suggestion-card-BKHewSVT.js +1 -0
  26. package/dist/gateway/static/root/assets/automations-page-DpOOq1nk.js +1 -0
  27. package/dist/gateway/static/root/assets/{binary-plugins-BAbSldW5.js → binary-plugins-BG6Xnk71.js} +1 -1
  28. package/dist/gateway/static/root/assets/{block-editor-BNr_82xl.js → block-editor-DfndiO3h.js} +28 -28
  29. package/dist/gateway/static/root/assets/browser-settings-page-9nXxgh4u.js +8 -0
  30. package/dist/gateway/static/root/assets/{capability-presets-api-tzD702Gg.js → capability-presets-api-Cx93GLdw.js} +1 -1
  31. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-AGhTueAc.js → capability-presets-settings-panel-D528_YFy.js} +1 -1
  32. package/dist/gateway/static/root/assets/{channel-recipient-api-DL_KzwGE.js → channel-recipient-api-DdPTtEs8.js} +1 -1
  33. package/dist/gateway/static/root/assets/channels-settings-Ck-3h5lI.js +1 -0
  34. package/dist/gateway/static/root/assets/connectors-page-DL-fAqE_.js +2 -0
  35. package/dist/gateway/static/root/assets/directory-picker-path-field-D835EHJd.js +1 -0
  36. package/dist/gateway/static/root/assets/dist-Mys7eFJ5.js +1 -0
  37. package/dist/gateway/static/root/assets/dist-wO9a2_ID.js +1 -0
  38. package/dist/gateway/static/root/assets/dreaming-settings-CCa1F7Fg.js +1 -0
  39. package/dist/gateway/static/root/assets/{extension-debug-page-Dl2kO0Sf.js → extension-debug-page-W2ITCPSA.js} +1 -1
  40. package/dist/gateway/static/root/assets/{extension-page-DmbLPsx_.js → extension-page-DrvUytvn.js} +1 -1
  41. package/dist/gateway/static/root/assets/extension-settings-page-qM8aLT5u.js +1 -0
  42. package/dist/gateway/static/root/assets/{fetch-B3ME5Eri.js → fetch-ovkvM8KQ.js} +1 -1
  43. package/dist/gateway/static/root/assets/{gateway-config-api-DI9_BBTo.js → gateway-config-api-BB3biuD0.js} +1 -1
  44. package/dist/gateway/static/root/assets/gateway-settings-mmmnIH27.js +1 -0
  45. package/dist/gateway/static/root/assets/{gateway-startup-retry-CSZQTz6K.js → gateway-startup-retry-CanQ8UcR.js} +1 -1
  46. package/dist/gateway/static/root/assets/goal-create-dialog-CNqNdEkQ.js +1 -0
  47. package/dist/gateway/static/root/assets/goal-detail-page-Ceu5zrN6.js +1 -0
  48. package/dist/gateway/static/root/assets/{goals-config-api-Bhzqrp2w.js → goals-config-api-BBOX6mUl.js} +1 -1
  49. package/dist/gateway/static/root/assets/goals-page-BP1kfvWv.js +2 -0
  50. package/dist/gateway/static/root/assets/goals-settings-Bh3A7OZV.js +1 -0
  51. package/dist/gateway/static/root/assets/heartbeat-settings-YoYgKlfX.js +1 -0
  52. package/dist/gateway/static/root/assets/index-DdqSO9R2.js +191 -0
  53. package/dist/gateway/static/root/assets/index-jGB-2nI-.css +1 -0
  54. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-kMp08SlX.js → keyboard-shortcuts-settings-B4TKJHla.js} +1 -1
  55. package/dist/gateway/static/root/assets/logs-page-BgVk5DvZ.js +2 -0
  56. package/dist/gateway/static/root/assets/{markdown-split-Bc0w40vz.js → markdown-split-DcFtdLci.js} +1 -1
  57. package/dist/gateway/static/root/assets/{media-plugins-DJ_HvgIy.js → media-plugins-B6SmeLVB.js} +1 -1
  58. package/dist/gateway/static/root/assets/messages-B5O4OIEo.js +3 -0
  59. package/dist/gateway/static/root/assets/models-hub-panel-BU0x8PGP.js +2 -0
  60. package/dist/gateway/static/root/assets/notes-page-D6JYVP4I.js +1 -0
  61. package/dist/gateway/static/root/assets/notes-workbench-mqRJYnJS.js +2 -0
  62. package/dist/gateway/static/root/assets/{preview-open-alternatives-BbA7sRd_.js → preview-open-alternatives-C29O19s7.js} +1 -1
  63. package/dist/gateway/static/root/assets/project-detail-page-DOTgzoeh.js +1 -0
  64. package/dist/gateway/static/root/assets/projects-page-DGUIb4y5.js +1 -0
  65. package/dist/gateway/static/root/assets/remote-access-hub-DVKKUj3u.js +1 -0
  66. package/dist/gateway/static/root/assets/{save-bar-controls-Dividh61.js → save-bar-controls-B4ad9GfB.js} +1 -1
  67. package/dist/gateway/static/root/assets/schedule-field-DdYncfLR.js +1 -0
  68. package/dist/gateway/static/root/assets/schema-form-BMTrDE-7.js +1 -0
  69. package/dist/gateway/static/root/assets/segmented-styles-BL8oLBEp.js +1 -0
  70. package/dist/gateway/static/root/assets/sessions-page-BVbzUWxW.js +1 -0
  71. package/dist/gateway/static/root/assets/settings-advanced-gate-DrNNoSqE.js +1 -0
  72. package/dist/gateway/static/root/assets/{settings-collapsible-section-BMCOfuE_.js → settings-collapsible-section-MwTW2eK4.js} +1 -1
  73. package/dist/gateway/static/root/assets/{settings-form-section-DBkGwpIN.js → settings-form-section-Dg6LBbcr.js} +1 -1
  74. package/dist/gateway/static/root/assets/settings-page-CMDqgeMR.js +1 -0
  75. package/dist/gateway/static/root/assets/settings-page-layout-BX4T-OLF.js +1 -0
  76. package/dist/gateway/static/root/assets/setup-status-panel-Ce1pcFtR.js +1 -0
  77. package/dist/gateway/static/root/assets/share-preview-page-DWE-dUFh.js +2 -0
  78. package/dist/gateway/static/root/assets/shares-settings-aKSraR8l.js +1 -0
  79. package/dist/gateway/static/root/assets/skill-reload-api-CS-FU_B-.js +1 -0
  80. package/dist/gateway/static/root/assets/skills-page-BaF3u0LA.js +2 -0
  81. package/dist/gateway/static/root/assets/{system-settings-panel-CrmEnyX4.js → system-settings-panel-Dd6Y35Cm.js} +1 -1
  82. package/dist/gateway/static/root/assets/{typed-models-lib-BAsGn25g.js → typed-models-lib-Cx6XV5A2.js} +1 -1
  83. package/dist/gateway/static/root/assets/{use-channel-catalog-C7vcAoGb.js → use-channel-catalog-D4sMbmy7.js} +1 -1
  84. package/dist/gateway/static/root/assets/user-profile-settings-panel-Bx-hjMQc.js +1 -0
  85. package/dist/gateway/static/root/assets/{utils-Dl9efgnV.js → utils-D7b_vZnv.js} +1 -1
  86. package/dist/gateway/static/root/assets/voice-api-key-field-CkhbRt1q.js +1 -0
  87. package/dist/gateway/static/root/assets/workflow-run-setup-panel--TdohF5N.js +3 -0
  88. package/dist/gateway/static/root/assets/workflow-start-dialog-B0lavx_o.js +1 -0
  89. package/dist/gateway/static/root/assets/workflows-page-CZR05Bu_.js +18 -0
  90. package/dist/gateway/static/root/index.html +7 -8
  91. package/dist/package.js +1 -1
  92. package/dist/src/agent/agent-manager.d.ts +2 -0
  93. package/dist/src/agent/agent-manager.js +47 -7
  94. package/dist/src/agent/agent-manager.js.map +1 -1
  95. package/dist/src/agent/context/project-context.d.ts +19 -0
  96. package/dist/src/agent/context/project-context.js +90 -0
  97. package/dist/src/agent/context/project-context.js.map +1 -0
  98. package/dist/src/agent/embedded/xopc-auth-storage.d.ts +1 -5
  99. package/dist/src/agent/embedded/xopc-auth-storage.js +2 -8
  100. package/dist/src/agent/embedded/xopc-auth-storage.js.map +1 -1
  101. package/dist/src/agent/embedded/xopc-tools-bridge.js +23 -0
  102. package/dist/src/agent/embedded/xopc-tools-bridge.js.map +1 -1
  103. package/dist/src/agent/goals/checklist-judge.js +1 -1
  104. package/dist/src/agent/goals/checklist-judge.js.map +1 -1
  105. package/dist/src/agent/goals/goal-locale.js +2 -2
  106. package/dist/src/agent/goals/judge.js +1 -1
  107. package/dist/src/agent/goals/judge.js.map +1 -1
  108. package/dist/src/agent/image/tool-model-config.d.ts +2 -0
  109. package/dist/src/agent/image/tool-model-config.js +2 -2
  110. package/dist/src/agent/image/tool-model-config.js.map +1 -1
  111. package/dist/src/agent/image/understanding/pi-ai-provider.js +1 -1
  112. package/dist/src/agent/image/understanding/pi-ai-provider.js.map +1 -1
  113. package/dist/src/agent/memory/compaction.d.ts +1 -1
  114. package/dist/src/agent/memory/compaction.js +1 -1
  115. package/dist/src/agent/memory/compaction.js.map +1 -1
  116. package/dist/src/agent/memory/types.d.ts +1 -0
  117. package/dist/src/agent/middleware/self-verify.d.ts +3 -0
  118. package/dist/src/agent/middleware/self-verify.js +18 -0
  119. package/dist/src/agent/middleware/self-verify.js.map +1 -1
  120. package/dist/src/agent/orchestration/agent-event-handler.js +28 -3
  121. package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
  122. package/dist/src/agent/prompt/sections/tooling.js +21 -5
  123. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  124. package/dist/src/agent/prompt/service-prompt-builder.d.ts +1 -0
  125. package/dist/src/agent/prompt/service-prompt-builder.js +3 -0
  126. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  127. package/dist/src/agent/prompt/system-prompt-params.d.ts +2 -0
  128. package/dist/src/agent/prompt/system-prompt-params.js +1 -0
  129. package/dist/src/agent/prompt/system-prompt-params.js.map +1 -1
  130. package/dist/src/agent/prompt/system-prompt.d.ts +2 -0
  131. package/dist/src/agent/prompt/system-prompt.js +14 -1
  132. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  133. package/dist/src/agent/sandbox/path-policy.js +30 -6
  134. package/dist/src/agent/sandbox/path-policy.js.map +1 -1
  135. package/dist/src/agent/service/btw-query.js +1 -1
  136. package/dist/src/agent/service/btw-query.js.map +1 -1
  137. package/dist/src/agent/service.js +4 -3
  138. package/dist/src/agent/service.js.map +1 -1
  139. package/dist/src/agent/session/session-config-service.js +6 -1
  140. package/dist/src/agent/session/session-config-service.js.map +1 -1
  141. package/dist/src/agent/session/session-hydrator.js +7 -3
  142. package/dist/src/agent/session/session-hydrator.js.map +1 -1
  143. package/dist/src/agent/session/session-inspector.js +9 -5
  144. package/dist/src/agent/session/session-inspector.js.map +1 -1
  145. package/dist/src/agent/starter-agents.js +18 -47
  146. package/dist/src/agent/starter-agents.js.map +1 -1
  147. package/dist/src/agent/tools/image-generate-tool.js +12 -1
  148. package/dist/src/agent/tools/image-generate-tool.js.map +1 -1
  149. package/dist/src/agent/tools/session-search-tool.js +1 -1
  150. package/dist/src/agent/tools/session-search-tool.js.map +1 -1
  151. package/dist/src/agent/tools/web-extract.js +1 -1
  152. package/dist/src/agent/tools/web-extract.js.map +1 -1
  153. package/dist/src/agent/workflow/index.js +2 -2
  154. package/dist/src/agent/workflow/runtime.js +1 -1
  155. package/dist/src/agent-manifest/index.js +2 -2
  156. package/dist/src/agent-manifest/schema.d.ts +66 -0
  157. package/dist/src/agent-manifest/schema.js +28 -2
  158. package/dist/src/agent-manifest/schema.js.map +1 -1
  159. package/dist/src/automations/api/routes.js +13 -2
  160. package/dist/src/automations/api/routes.js.map +1 -1
  161. package/dist/src/automations/domain/types.d.ts +2 -0
  162. package/dist/src/automations/domain/validation.d.ts +3 -0
  163. package/dist/src/automations/domain/validation.js +1 -0
  164. package/dist/src/automations/domain/validation.js.map +1 -1
  165. package/dist/src/automations/draft/automation-draft-service.js +1 -1
  166. package/dist/src/automations/draft/automation-draft-service.js.map +1 -1
  167. package/dist/src/automations/draft/automation-draft-validator.d.ts +1 -0
  168. package/dist/src/automations/service/action-executor.js +3 -1
  169. package/dist/src/automations/service/action-executor.js.map +1 -1
  170. package/dist/src/automations/service/automation-service.d.ts +4 -1
  171. package/dist/src/automations/service/automation-service.js +2 -2
  172. package/dist/src/automations/service/automation-service.js.map +1 -1
  173. package/dist/src/automations/storage/automation-repository.d.ts +3 -1
  174. package/dist/src/automations/storage/automation-repository.js +7 -5
  175. package/dist/src/automations/storage/automation-repository.js.map +1 -1
  176. package/dist/src/automations/storage/automation-run-repository.d.ts +1 -0
  177. package/dist/src/automations/storage/automation-run-repository.js +12 -1
  178. package/dist/src/automations/storage/automation-run-repository.js.map +1 -1
  179. package/dist/src/chat-commands/context.js +2 -1
  180. package/dist/src/chat-commands/context.js.map +1 -1
  181. package/dist/src/cli/command-loaders.js +1 -0
  182. package/dist/src/cli/command-loaders.js.map +1 -1
  183. package/dist/src/cli/command-manifest.js +4 -0
  184. package/dist/src/cli/command-manifest.js.map +1 -1
  185. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  186. package/dist/src/cli/commands/goal.js +27 -4
  187. package/dist/src/cli/commands/goal.js.map +1 -1
  188. package/dist/src/cli/commands/onboard/model.js +161 -11
  189. package/dist/src/cli/commands/onboard/model.js.map +1 -1
  190. package/dist/src/cli/commands/project.d.ts +4 -0
  191. package/dist/src/cli/commands/project.js +239 -0
  192. package/dist/src/cli/commands/project.js.map +1 -0
  193. package/dist/src/config/default-model.d.ts +11 -0
  194. package/dist/src/config/default-model.js +19 -0
  195. package/dist/src/config/default-model.js.map +1 -0
  196. package/dist/src/config/index.js +2 -2
  197. package/dist/src/config/schema.d.ts +71 -11
  198. package/dist/src/config/schema.js +57 -22
  199. package/dist/src/config/schema.js.map +1 -1
  200. package/dist/src/connectors/registries/smithery.js +10 -9
  201. package/dist/src/connectors/registries/smithery.js.map +1 -1
  202. package/dist/src/daemon/install-plan.js +2 -1
  203. package/dist/src/daemon/install-plan.js.map +1 -1
  204. package/dist/src/gateway/global-defaults-admin.js +6 -16
  205. package/dist/src/gateway/global-defaults-admin.js.map +1 -1
  206. package/dist/src/gateway/hono/lib/config-payload.d.ts +24 -0
  207. package/dist/src/gateway/hono/routes/agents.js +1 -79
  208. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  209. package/dist/src/gateway/hono/routes/goals.js +51 -4
  210. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  211. package/dist/src/gateway/hono/routes/index.js +2 -0
  212. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  213. package/dist/src/gateway/hono/routes/memory.js +5 -1
  214. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  215. package/dist/src/gateway/hono/routes/models.js +132 -14
  216. package/dist/src/gateway/hono/routes/models.js.map +1 -1
  217. package/dist/src/gateway/hono/routes/notes.js +5 -0
  218. package/dist/src/gateway/hono/routes/notes.js.map +1 -1
  219. package/dist/src/gateway/hono/routes/projects.d.ts +3 -0
  220. package/dist/src/gateway/hono/routes/projects.js +578 -0
  221. package/dist/src/gateway/hono/routes/projects.js.map +1 -0
  222. package/dist/src/gateway/hono/routes/sessions.js +47 -7
  223. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  224. package/dist/src/gateway/hono/routes/voice.js +1 -1
  225. package/dist/src/gateway/hono/routes/voice.js.map +1 -1
  226. package/dist/src/gateway/hono/routes/workflows.js +27 -4
  227. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  228. package/dist/src/gateway/image-capabilities.d.ts +11 -1
  229. package/dist/src/gateway/image-capabilities.js +32 -43
  230. package/dist/src/gateway/image-capabilities.js.map +1 -1
  231. package/dist/src/gateway/service.d.ts +3 -0
  232. package/dist/src/gateway/service.js +10 -3
  233. package/dist/src/gateway/service.js.map +1 -1
  234. package/dist/src/gateway/workspace-editor-path.js +9 -1
  235. package/dist/src/gateway/workspace-editor-path.js.map +1 -1
  236. package/dist/src/generated/bundled-image-generation-providers.d.ts +4 -2
  237. package/dist/src/generated/bundled-image-generation-providers.js +6 -4
  238. package/dist/src/generated/bundled-image-generation-providers.js.map +1 -1
  239. package/dist/src/goals/goal-service.d.ts +1 -1
  240. package/dist/src/goals/goal-service.js +2 -1
  241. package/dist/src/goals/goal-service.js.map +1 -1
  242. package/dist/src/goals/goal-store.d.ts +1 -1
  243. package/dist/src/goals/goal-store.js +12 -6
  244. package/dist/src/goals/goal-store.js.map +1 -1
  245. package/dist/src/goals/goal-workflow-judge.js +1 -1
  246. package/dist/src/goals/types.d.ts +3 -0
  247. package/dist/src/i18n/goals-bundle.js +1 -1
  248. package/dist/src/i18n/index.js +1 -1
  249. package/dist/src/i18n/share-tool-bundle.js +2 -2
  250. package/dist/src/media/paths.js +3 -4
  251. package/dist/src/media/paths.js.map +1 -1
  252. package/dist/src/notes/agent-context.js +2 -2
  253. package/dist/src/notes/service.js +1 -1
  254. package/dist/src/notes/service.js.map +1 -1
  255. package/dist/src/projects/automation-bind.d.ts +1 -0
  256. package/dist/src/projects/automation-bind.js +16 -0
  257. package/dist/src/projects/automation-bind.js.map +1 -0
  258. package/dist/src/projects/goal-bind.d.ts +4 -0
  259. package/dist/src/projects/goal-bind.js +40 -0
  260. package/dist/src/projects/goal-bind.js.map +1 -0
  261. package/dist/src/projects/index.d.ts +11 -0
  262. package/dist/src/projects/index.js +11 -0
  263. package/dist/src/projects/memory-bind.d.ts +1 -0
  264. package/dist/src/projects/memory-bind.js +16 -0
  265. package/dist/src/projects/memory-bind.js.map +1 -0
  266. package/dist/src/projects/project-agent.d.ts +10 -0
  267. package/dist/src/projects/project-agent.js +27 -0
  268. package/dist/src/projects/project-agent.js.map +1 -0
  269. package/dist/src/projects/project-loop.d.ts +58 -0
  270. package/dist/src/projects/project-loop.js +118 -0
  271. package/dist/src/projects/project-loop.js.map +1 -0
  272. package/dist/src/projects/project-service.d.ts +26 -0
  273. package/dist/src/projects/project-service.js +94 -0
  274. package/dist/src/projects/project-service.js.map +1 -0
  275. package/dist/src/projects/project-store.d.ts +31 -0
  276. package/dist/src/projects/project-store.js +193 -0
  277. package/dist/src/projects/project-store.js.map +1 -0
  278. package/dist/src/projects/session-bind.d.ts +5 -0
  279. package/dist/src/projects/session-bind.js +46 -0
  280. package/dist/src/projects/session-bind.js.map +1 -0
  281. package/dist/src/projects/types.d.ts +60 -0
  282. package/dist/src/projects/types.js +1 -0
  283. package/dist/src/projects/workflow-bind.d.ts +1 -0
  284. package/dist/src/projects/workflow-bind.js +16 -0
  285. package/dist/src/projects/workflow-bind.js.map +1 -0
  286. package/dist/src/projects/workspace.d.ts +5 -0
  287. package/dist/src/projects/workspace.js +25 -0
  288. package/dist/src/projects/workspace.js.map +1 -0
  289. package/dist/src/providers/domestic-presets.d.ts +615 -0
  290. package/dist/src/providers/domestic-presets.js +834 -0
  291. package/dist/src/providers/domestic-presets.js.map +1 -0
  292. package/dist/src/providers/env-keys.js +29 -5
  293. package/dist/src/providers/env-keys.js.map +1 -1
  294. package/dist/src/providers/extension-stream-bridge.js +1 -1
  295. package/dist/src/providers/extension-stream-bridge.js.map +1 -1
  296. package/dist/src/providers/index.d.ts +5 -5
  297. package/dist/src/providers/index.js +101 -21
  298. package/dist/src/providers/index.js.map +1 -1
  299. package/dist/src/providers/model-discovery.d.ts +17 -0
  300. package/dist/src/providers/model-discovery.js +61 -0
  301. package/dist/src/providers/model-discovery.js.map +1 -0
  302. package/dist/src/providers/model-registry.d.ts +1 -1
  303. package/dist/src/providers/model-registry.js +1 -1
  304. package/dist/src/providers/model-registry.js.map +1 -1
  305. package/dist/src/providers/presentation.js +185 -14
  306. package/dist/src/providers/presentation.js.map +1 -1
  307. package/dist/src/session/index.d.ts +1 -1
  308. package/dist/src/session/index.js +3 -3
  309. package/dist/src/session/session-title.js +1 -1
  310. package/dist/src/session/session-title.js.map +1 -1
  311. package/dist/src/session/session-workspace.d.ts +4 -2
  312. package/dist/src/session/session-workspace.js +10 -3
  313. package/dist/src/session/session-workspace.js.map +1 -1
  314. package/dist/src/session/types.d.ts +3 -0
  315. package/dist/src/session/types.js.map +1 -1
  316. package/dist/src/storage/sqlite/memory-records-repository.d.ts +3 -0
  317. package/dist/src/storage/sqlite/memory-records-repository.js +16 -5
  318. package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -1
  319. package/dist/src/storage/sqlite/migrations/019_projects.sql +40 -0
  320. package/dist/src/storage/sqlite/migrations/020_project_default_agent.sql +1 -0
  321. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  322. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  323. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  324. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  325. package/dist/src/storage/sqlite/notes-repository.js +20 -4
  326. package/dist/src/storage/sqlite/notes-repository.js.map +1 -1
  327. package/dist/src/storage/sqlite/row-mappers.d.ts +2 -0
  328. package/dist/src/storage/sqlite/row-mappers.js +2 -0
  329. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  330. package/dist/src/storage/sqlite/schema.js +1 -1
  331. package/dist/src/storage/sqlite/session-repository.js +10 -5
  332. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  333. package/dist/src/storage/sqlite/transcript-repository.js +8 -0
  334. package/dist/src/storage/sqlite/transcript-repository.js.map +1 -1
  335. package/dist/src/tui/backends/embedded-backend.js +1 -1
  336. package/dist/src/tui/tui-commands.js +145 -0
  337. package/dist/src/tui/tui-commands.js.map +1 -1
  338. package/dist/src/tui/xopc-tui-keybindings.d.ts +1 -1
  339. package/dist/src/voice/tts/summarize.js +1 -1
  340. package/dist/src/voice/tts/summarize.js.map +1 -1
  341. package/dist/src/workflows/domain/run.d.ts +1 -0
  342. package/dist/src/workflows/domain/run.js.map +1 -1
  343. package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
  344. package/dist/src/workflows/draft/workflow-draft-service.js.map +1 -1
  345. package/dist/src/workflows/index.js +1 -1
  346. package/dist/src/workflows/service/workflow-run-service.d.ts +1 -0
  347. package/dist/src/workflows/service/workflow-run-service.js +18 -4
  348. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  349. package/dist/src/workflows/service/workflow-run-service.types.d.ts +2 -0
  350. package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -0
  351. package/dist/src/workflows/service/workflow-session-bridge.js +3 -0
  352. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  353. package/dist/src/workflows/store/run-index-store.d.ts +1 -0
  354. package/dist/src/workflows/store/run-index-store.js +13 -3
  355. package/dist/src/workflows/store/run-index-store.js.map +1 -1
  356. package/dist/src/workflows/store/run-store.d.ts +3 -1
  357. package/dist/src/workflows/store/run-store.js +5 -2
  358. package/dist/src/workflows/store/run-store.js.map +1 -1
  359. package/package.json +15 -6
  360. package/dist/gateway/static/root/assets/Combination-BzaXOLd9.js +0 -41
  361. package/dist/gateway/static/root/assets/agents-CFW_FS_V.js +0 -2
  362. package/dist/gateway/static/root/assets/apps-page-DT52OrbM.js +0 -1
  363. package/dist/gateway/static/root/assets/automation-suggestion-card-CtysjSoQ.js +0 -1
  364. package/dist/gateway/static/root/assets/automations-page-B2YvT3ES.js +0 -1
  365. package/dist/gateway/static/root/assets/browser-settings-page-BQEXPhDU.js +0 -8
  366. package/dist/gateway/static/root/assets/channels-settings-DRTutLlN.js +0 -1
  367. package/dist/gateway/static/root/assets/connectors-page-DneJVuge.js +0 -2
  368. package/dist/gateway/static/root/assets/dist-By6Rh2ee.js +0 -1
  369. package/dist/gateway/static/root/assets/dist-CkobR7mk.js +0 -1
  370. package/dist/gateway/static/root/assets/dist-DokQNVMQ.js +0 -1
  371. package/dist/gateway/static/root/assets/dreaming-settings-BEwWA1yf.js +0 -1
  372. package/dist/gateway/static/root/assets/extension-settings-page-BS2rx40e.js +0 -1
  373. package/dist/gateway/static/root/assets/gateway-settings-DAFI_T0W.js +0 -1
  374. package/dist/gateway/static/root/assets/goal-detail-page-DLuz4jC9.js +0 -1
  375. package/dist/gateway/static/root/assets/goals-page-DTAfv9Ft.js +0 -2
  376. package/dist/gateway/static/root/assets/goals-settings-CWN2iirQ.js +0 -1
  377. package/dist/gateway/static/root/assets/heartbeat-settings-CkkkHvOi.js +0 -1
  378. package/dist/gateway/static/root/assets/index-CnjzMw5i.js +0 -191
  379. package/dist/gateway/static/root/assets/index-E1QinYKp.css +0 -1
  380. package/dist/gateway/static/root/assets/logs-page-CDXDlS_W.js +0 -2
  381. package/dist/gateway/static/root/assets/messages-CISb1HLv.js +0 -3
  382. package/dist/gateway/static/root/assets/models-hub-panel-BTwxMIgZ.js +0 -2
  383. package/dist/gateway/static/root/assets/note-detail-page-BBfOeB0m.js +0 -2
  384. package/dist/gateway/static/root/assets/note-image-lightbox-4zntqpZq.js +0 -1
  385. package/dist/gateway/static/root/assets/note-time-hm6JO_Wi.js +0 -1
  386. package/dist/gateway/static/root/assets/notes-page-VocWOjoK.js +0 -1
  387. package/dist/gateway/static/root/assets/remote-access-hub-CXwjuD_Q.js +0 -1
  388. package/dist/gateway/static/root/assets/schedule-field-pRheF2CO.js +0 -1
  389. package/dist/gateway/static/root/assets/schema-form-D6PiPxfr.js +0 -1
  390. package/dist/gateway/static/root/assets/sessions-page-CpcVySQK.js +0 -1
  391. package/dist/gateway/static/root/assets/settings-advanced-gate-BVy_TawT.js +0 -1
  392. package/dist/gateway/static/root/assets/settings-page-CZpNyCWn.js +0 -1
  393. package/dist/gateway/static/root/assets/settings-page-layout-NxoW5Y57.js +0 -1
  394. package/dist/gateway/static/root/assets/setup-status-panel-MVHLLu_a.js +0 -1
  395. package/dist/gateway/static/root/assets/share-preview-page-B0suFCfj.js +0 -2
  396. package/dist/gateway/static/root/assets/shares-settings-C6DBbQGo.js +0 -1
  397. package/dist/gateway/static/root/assets/skill-reload-api-6hJmhwSn.js +0 -1
  398. package/dist/gateway/static/root/assets/skills-page-Im1MA0Iw.js +0 -2
  399. package/dist/gateway/static/root/assets/user-profile-settings-panel-QAQWGelF.js +0 -1
  400. package/dist/gateway/static/root/assets/voice-api-key-field-D-6XueTv.js +0 -1
  401. package/dist/gateway/static/root/assets/voice-player-store-CMC5NOJp.js +0 -1
  402. package/dist/gateway/static/root/assets/workflow-run-setup-panel-DVPllR4k.js +0 -3
  403. package/dist/gateway/static/root/assets/workflows-page-B94WISTW.js +0 -18
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","names":["getModelsJsonPath"],"sources":["../../../../../src/cli/commands/onboard/model.ts"],"sourcesContent":["/**\n * Catalog-driven model configuration for onboarding.\n */\n\nimport { confirm, input, select } from '@inquirer/prompts';\n\nimport { CredentialResolver } from '../../../auth/credentials.js';\nimport {\n getModelsJsonPath,\n loadModelsJson,\n saveModelsJson,\n type ModelsJsonConfig,\n} from '../../../config/models-json.js';\nimport type { Config } from '../../../config/schema.js';\nimport { getAgentDefaultModelRef } from '../../../config/schema.js';\nimport { prepareUpdateGlobalDefaults } from '../../../gateway/global-defaults-admin.js';\nimport {\n getAllProviders,\n getApiKeyFromEnv,\n getModelRegistry,\n getModelsByProvider,\n getProviderDisplayName,\n providerSupportsApiKey,\n providerSupportsOAuth,\n} from '../../../providers/index.js';\nimport {\n getProviderHint,\n getRecommendedModelsForProvider,\n sortModelsForPicker,\n sortProvidersForPicker,\n} from '../../../providers/presentation.js';\nimport { listProfilesForProvider } from '../../../auth/profiles/index.js';\nimport { getOAuthProvider } from '../../utils/oauth-providers.js';\nimport { runCliOAuthLogin } from '../../utils/oauth-login.js';\nimport type { CLIContext } from '../../registry.js';\nimport { colors } from '../../utils/colors.js';\n\ntype ModelChoice = { value: string; name: string; description?: string };\ntype CustomApiKind = 'openai-completions' | 'openai-responses' | 'anthropic-messages';\n\nfunction setPrimaryModel(config: Config, workspacePath: string, modelRef: string): Config {\n const id = config.agents.default ?? config.agents.list[0]?.id ?? 'main';\n const index = config.agents.list.findIndex((entry) => entry.id === id);\n let nextConfig = config;\n if (index >= 0) {\n const agent = config.agents.list[index]!;\n const nextList = [...config.agents.list];\n nextList[index] = {\n ...agent,\n workspace: { root: workspacePath },\n };\n nextConfig = { ...config, agents: { ...config.agents, list: nextList } };\n }\n const prep = prepareUpdateGlobalDefaults(nextConfig, {\n models: {\n defaultRole: 'deep',\n roles: { deep: { model: modelRef } },\n },\n });\n if (prep.ok === false) {\n throw new Error(prep.error);\n }\n return prep.data.nextConfig;\n}\n\nfunction formatRecommended(provider: string): string | undefined {\n const labels = getRecommendedModelsForProvider(provider, 3).map((m) => m.name || m.id);\n return labels.length > 0 ? `Recommended: ${labels.join(', ')}` : getProviderHint(provider);\n}\n\nfunction providerChoices(): Array<{ value: string; name: string; description?: string }> {\n const providers = sortProvidersForPicker(getAllProviders());\n const choices = providers.map((provider) => ({\n value: provider,\n name: getProviderDisplayName(provider),\n description: formatRecommended(provider),\n }));\n choices.push({\n value: 'custom-api',\n name: 'Custom API',\n description: 'OpenAI-compatible, OpenAI Responses, or Anthropic-compatible endpoint',\n });\n return choices;\n}\n\nfunction modelChoiceName(choice: ModelChoice): string {\n return choice.description ? `${choice.name} ${colors.gray(choice.description)}` : choice.name;\n}\n\nfunction getModelsForProvider(provider: string): ModelChoice[] {\n return sortModelsForPicker(getModelsByProvider(provider)).map((m) => {\n const badges = [m.reasoning ? 'reasoning' : '', m.input?.includes('image') ? 'vision' : '']\n .filter(Boolean)\n .join(', ');\n return {\n value: `${m.provider}/${m.id}`,\n name: m.name || m.id,\n description: badges || undefined,\n };\n });\n}\n\nasync function doOAuthLogin(provider: string): Promise<boolean> {\n const config = getOAuthProvider(provider);\n if (!config) {\n console.error(`OAuth not supported for provider: ${provider}`);\n return false;\n }\n\n console.log(`\\n🔐 Starting ${config.displayName} OAuth login...`);\n try {\n await runCliOAuthLogin({ provider, onProgress: (message) => console.log(' →', message) });\n return true;\n } catch (error) {\n console.error('❌ OAuth login failed:', error);\n return false;\n }\n}\n\nfunction joinEndpoint(baseUrl: string, suffix: string): string {\n return `${baseUrl.replace(/\\/+$/, '')}/${suffix.replace(/^\\/+/, '')}`;\n}\n\nasync function probeCustomProvider(params: {\n baseUrl: string;\n apiKey: string;\n modelId: string;\n api: CustomApiKind;\n}): Promise<void> {\n const timeout = AbortSignal.timeout(30_000);\n const commonHeaders = {\n 'content-type': 'application/json',\n authorization: `Bearer ${params.apiKey}`,\n };\n\n const request =\n params.api === 'anthropic-messages'\n ? {\n url: joinEndpoint(params.baseUrl, '/messages'),\n headers: { ...commonHeaders, 'anthropic-version': '2023-06-01' },\n body: { model: params.modelId, max_tokens: 1, messages: [{ role: 'user', content: 'ping' }] },\n }\n : params.api === 'openai-responses'\n ? {\n url: joinEndpoint(params.baseUrl, '/responses'),\n headers: commonHeaders,\n body: { model: params.modelId, input: 'ping', max_output_tokens: 1 },\n }\n : {\n url: joinEndpoint(params.baseUrl, '/chat/completions'),\n headers: commonHeaders,\n body: { model: params.modelId, messages: [{ role: 'user', content: 'ping' }], max_tokens: 1 },\n };\n\n const res = await fetch(request.url, {\n method: 'POST',\n headers: request.headers,\n body: JSON.stringify(request.body),\n signal: timeout,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`Probe failed (${res.status}) at ${request.url}${text ? `: ${text.slice(0, 300)}` : ''}`);\n }\n}\n\nfunction defaultProviderIdFromBaseUrl(baseUrl: string): string {\n try {\n const url = new URL(baseUrl);\n return url.hostname\n .replace(/^api\\./, '')\n .split('.')\n .filter(Boolean)\n .slice(0, 2)\n .join('-')\n .toLowerCase()\n .replace(/[^a-z0-9-_]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'custom';\n } catch {\n return 'custom';\n }\n}\n\nfunction validateProviderId(value: string): true | string {\n return /^[a-z0-9]([a-z0-9-_]*[a-z0-9])?$/.test(value)\n ? true\n : 'Use lowercase letters, numbers, hyphens, or underscores; start/end with a letter or number.';\n}\n\nasync function setupCustomApi(config: Config, ctx: CLIContext): Promise<Config> {\n console.log('\\n🔌 Custom API provider\\n');\n\n const baseUrl = (await input({\n message: 'API base URL:',\n default: 'https://api.example.com/v1',\n validate: (value) => URL.canParse(value) || 'Enter a valid URL',\n })).trim();\n\n const apiKey = (await input({\n message: 'API key:',\n validate: (value) => value.trim().length > 0 || 'Required',\n })).trim();\n\n const api = await select<CustomApiKind>({\n message: 'Compatibility:',\n choices: [\n { value: 'openai-completions', name: 'OpenAI-compatible Chat Completions' },\n { value: 'openai-responses', name: 'OpenAI Responses' },\n { value: 'anthropic-messages', name: 'Anthropic Messages' },\n ],\n });\n\n const modelId = (await input({\n message: 'Model ID:',\n validate: (value) => value.trim().length > 0 || 'Required',\n })).trim();\n\n console.log('\\n→ Probing endpoint...');\n await probeCustomProvider({ baseUrl, apiKey, modelId, api });\n console.log(colors.green('✓ Probe succeeded'));\n\n const existingProviders = new Set(getAllProviders());\n const providerId = (await input({\n message: 'Provider ID:',\n default: defaultProviderIdFromBaseUrl(baseUrl),\n validate: (value) => {\n const valid = validateProviderId(value.trim());\n if (valid !== true) return valid;\n if (existingProviders.has(value.trim())) return 'Provider ID already exists; choose a new ID.';\n return true;\n },\n })).trim();\n\n const path = getModelsJsonPath();\n const { config: modelsConfig } = loadModelsJson(path);\n const nextModelsConfig: ModelsJsonConfig = {\n providers: {\n ...(modelsConfig.providers ?? {}),\n [providerId]: {\n baseUrl,\n apiKey,\n api,\n models: [{ id: modelId, name: modelId, api, contextWindow: 128000, input: ['text'] }],\n },\n },\n };\n const saved = saveModelsJson(path, nextModelsConfig);\n if (!saved.success) {\n throw new Error(saved.error || 'Failed to save models.json');\n }\n getModelRegistry().refresh();\n\n const ref = `${providerId}/${modelId}`;\n console.log('\\n✅ Custom model configured:', ref);\n return setPrimaryModel(config, ctx.workspacePath, ref);\n}\n\nasync function ensureProviderCredential(provider: string, providerName: string): Promise<boolean> {\n const existingProfiles = listProfilesForProvider(provider);\n if (existingProfiles.length > 0) {\n console.log(`\\n${colors.green('✓')} Found existing credentials for ${providerName}`);\n return await confirm({ message: 'Use existing credentials?', default: true });\n }\n\n const envKey = getApiKeyFromEnv(provider);\n if (envKey) {\n console.log(`\\n${colors.green('✓')} Found API key for ${providerName} in environment`);\n return true;\n }\n\n const supportsOAuth = providerSupportsOAuth(provider);\n const supportsApiKey = providerSupportsApiKey(provider);\n\n if (supportsOAuth && !supportsApiKey) {\n return await doOAuthLogin(provider);\n }\n\n let useOAuth = false;\n if (supportsOAuth && supportsApiKey) {\n const authMethod = await select<'api_key' | 'oauth'>({\n message: `How would you like to authenticate with ${providerName}?`,\n choices: [\n { value: 'api_key', name: 'API key' },\n { value: 'oauth', name: 'OAuth login' },\n ],\n });\n useOAuth = authMethod === 'oauth';\n }\n\n if (useOAuth) {\n const ok = await doOAuthLogin(provider);\n if (ok) return true;\n console.log('\\n⚠️ OAuth login failed. Enter an API key instead.');\n }\n\n if (!supportsApiKey) return false;\n const apiKey = await input({\n message: `API key for ${providerName}:`,\n validate: (value) => value.trim().length > 0 || 'Required',\n });\n const resolver = new CredentialResolver();\n await resolver.saveApiKey(provider, apiKey.trim(), { profileName: 'default' });\n return true;\n}\n\nexport async function setupModel(existingConfig: Config | null, ctx: CLIContext): Promise<Config> {\n console.log('\\n🤖 Step: AI Model\\n');\n\n const config = existingConfig || ({} as Config);\n const currentModel = getAgentDefaultModelRef(config);\n\n if (currentModel) {\n console.log('Current model:', currentModel);\n const keepCurrent = await confirm({ message: 'Keep using this model?', default: true });\n if (keepCurrent) {\n console.log('✅ Keeping:', currentModel);\n return config;\n }\n }\n\n const provider = await select({\n message: 'Model/auth provider:',\n choices: providerChoices(),\n });\n\n if (provider === 'custom-api') {\n return await setupCustomApi(config, ctx);\n }\n\n const providerName = getProviderDisplayName(provider);\n const credentialOk = await ensureProviderCredential(provider, providerName);\n if (!credentialOk) {\n console.error(`\\n❌ Could not configure credentials for ${providerName}.`);\n return config;\n }\n\n const modelChoices = getModelsForProvider(provider);\n if (modelChoices.length === 0) {\n throw new Error(`No catalog models found for ${providerName}. Add a Custom API provider instead.`);\n }\n\n console.log(`\\n📋 Models for ${providerName}:`);\n const model = await select({\n message: 'Model:',\n choices: modelChoices.map((choice) => ({ ...choice, name: modelChoiceName(choice) })),\n });\n\n console.log('\\n✅ Model configured:', model);\n return setPrimaryModel(config, ctx.workspacePath, model);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"model.js","names":["getModelsJsonPath"],"sources":["../../../../../src/cli/commands/onboard/model.ts"],"sourcesContent":["/**\n * Catalog-driven model configuration for onboarding.\n */\n\nimport { confirm, input, select } from '@inquirer/prompts';\n\nimport { CredentialResolver } from '../../../auth/credentials.js';\nimport {\n getModelsJsonPath,\n loadModelsJson,\n saveModelsJson,\n type ModelsJsonConfig,\n} from '../../../config/models-json.js';\nimport type { Config } from '../../../config/schema.js';\nimport { getAgentDefaultModelRef } from '../../../config/schema.js';\nimport { prepareUpdateGlobalDefaults } from '../../../gateway/global-defaults-admin.js';\nimport {\n getAllProviders,\n getApiKeyFromEnv,\n getModelRegistry,\n getModelsByProvider,\n getProviderDisplayName,\n providerSupportsApiKey,\n providerSupportsOAuth,\n} from '../../../providers/index.js';\nimport {\n getDomesticProviderBaseUrl,\n getDomesticProviderPreset,\n getDomesticProviderPresetIds,\n providerConfigFromDomesticPreset,\n type DomesticProviderPreset,\n} from '../../../providers/domestic-presets.js';\nimport {\n discoverProviderModels,\n isProviderApiDiscoverable,\n type DiscoveredProviderModel,\n} from '../../../providers/model-discovery.js';\nimport {\n getProviderHint,\n getRecommendedModelsForProvider,\n sortModelsForPicker,\n sortProvidersForPicker,\n} from '../../../providers/presentation.js';\nimport { listProfilesForProvider } from '../../../auth/profiles/index.js';\nimport { getOAuthProvider } from '../../utils/oauth-providers.js';\nimport { runCliOAuthLogin } from '../../utils/oauth-login.js';\nimport type { CLIContext } from '../../registry.js';\nimport { colors } from '../../utils/colors.js';\n\ntype ModelChoice = { value: string; name: string; description?: string };\ntype CustomApiKind = 'openai-completions' | 'openai-responses' | 'anthropic-messages';\n\nfunction setPrimaryModel(config: Config, workspacePath: string, modelRef: string): Config {\n const id = config.agents.default ?? config.agents.list[0]?.id ?? 'main';\n const index = config.agents.list.findIndex((entry) => entry.id === id);\n let nextConfig = config;\n if (index >= 0) {\n const agent = config.agents.list[index]!;\n const nextList = [...config.agents.list];\n nextList[index] = {\n ...agent,\n workspace: { root: workspacePath },\n };\n nextConfig = { ...config, agents: { ...config.agents, list: nextList } };\n }\n const prep = prepareUpdateGlobalDefaults(nextConfig, {\n models: {\n defaultRole: 'deep',\n roles: { deep: { model: modelRef } },\n },\n });\n if (prep.ok === false) {\n throw new Error(prep.error);\n }\n return prep.data.nextConfig;\n}\n\nfunction formatRecommended(provider: string): string | undefined {\n const labels = getRecommendedModelsForProvider(provider, 3).map((m) => m.name || m.id);\n return labels.length > 0 ? `Recommended: ${labels.join(', ')}` : getProviderHint(provider);\n}\n\nfunction providerChoices(): Array<{ value: string; name: string; description?: string }> {\n const providers = sortProvidersForPicker([...new Set([...getAllProviders(), ...getDomesticProviderPresetIds()])]);\n const choices = providers.map((provider) => ({\n value: provider,\n name: getDomesticProviderPreset(provider)?.displayName ?? getProviderDisplayName(provider),\n description: formatRecommended(provider),\n }));\n choices.push({\n value: 'custom-api',\n name: 'Custom API',\n description: 'OpenAI-compatible, OpenAI Responses, or Anthropic-compatible endpoint',\n });\n return choices;\n}\n\nfunction modelChoiceName(choice: ModelChoice): string {\n return choice.description ? `${choice.name} ${colors.gray(choice.description)}` : choice.name;\n}\n\nfunction getModelsForProvider(provider: string): ModelChoice[] {\n const catalogModels = sortModelsForPicker(getModelsByProvider(provider)).map((m) => {\n const badges = [m.reasoning ? 'reasoning' : '', m.input?.includes('image') ? 'vision' : '']\n .filter(Boolean)\n .join(', ');\n return {\n value: `${m.provider}/${m.id}`,\n name: m.name || m.id,\n description: badges || undefined,\n };\n });\n if (catalogModels.length > 0) return catalogModels;\n\n const preset = getDomesticProviderPreset(provider);\n if (!preset) return [];\n return preset.models.map((m) => {\n const badges = [m.reasoning ? 'reasoning' : '', m.input?.includes('image') ? 'vision' : '']\n .filter(Boolean)\n .join(', ');\n return {\n value: `${preset.id}/${m.id}`,\n name: m.name || m.id,\n description: badges || undefined,\n };\n });\n}\n\nfunction discoveredModelsToChoices(provider: string, models: DiscoveredProviderModel[]): ModelChoice[] {\n return models\n .filter((model) => !model.id.includes('/'))\n .map((model) => ({\n value: `${provider}/${model.id}`,\n name: model.name || model.id,\n description: 'discovered',\n }));\n}\n\nasync function discoverModelsForOnboard(params: {\n providerId: string;\n baseUrl: string;\n apiKey: string;\n api: CustomApiKind;\n headers?: Record<string, string>;\n}): Promise<ModelChoice[]> {\n if (!isProviderApiDiscoverable(params.api)) return [];\n try {\n console.log('\\n→ Discovering models from /models...');\n const models = await discoverProviderModels({\n providerId: params.providerId,\n baseUrl: params.baseUrl,\n apiKey: params.apiKey,\n api: params.api,\n headers: params.headers,\n });\n const choices = discoveredModelsToChoices(params.providerId, models);\n if (choices.length > 0) {\n console.log(colors.green(`✓ Discovered ${choices.length} models`));\n return choices;\n }\n } catch (error) {\n console.log(colors.gray(`Model discovery unavailable: ${error instanceof Error ? error.message : String(error)}`));\n }\n return [];\n}\n\nasync function doOAuthLogin(provider: string): Promise<boolean> {\n const config = getOAuthProvider(provider);\n if (!config) {\n console.error(`OAuth not supported for provider: ${provider}`);\n return false;\n }\n\n console.log(`\\n🔐 Starting ${config.displayName} OAuth login...`);\n try {\n await runCliOAuthLogin({ provider, onProgress: (message) => console.log(' →', message) });\n return true;\n } catch (error) {\n console.error('❌ OAuth login failed:', error);\n return false;\n }\n}\n\nfunction joinEndpoint(baseUrl: string, suffix: string): string {\n return `${baseUrl.replace(/\\/+$/, '')}/${suffix.replace(/^\\/+/, '')}`;\n}\n\nasync function probeCustomProvider(params: {\n baseUrl: string;\n apiKey: string;\n modelId: string;\n api: CustomApiKind;\n}): Promise<void> {\n const timeout = AbortSignal.timeout(30_000);\n const commonHeaders = {\n 'content-type': 'application/json',\n authorization: `Bearer ${params.apiKey}`,\n };\n\n const request =\n params.api === 'anthropic-messages'\n ? {\n url: joinEndpoint(params.baseUrl, '/messages'),\n headers: { ...commonHeaders, 'anthropic-version': '2023-06-01' },\n body: { model: params.modelId, max_tokens: 1, messages: [{ role: 'user', content: 'ping' }] },\n }\n : params.api === 'openai-responses'\n ? {\n url: joinEndpoint(params.baseUrl, '/responses'),\n headers: commonHeaders,\n body: { model: params.modelId, input: 'ping', max_output_tokens: 1 },\n }\n : {\n url: joinEndpoint(params.baseUrl, '/chat/completions'),\n headers: commonHeaders,\n body: { model: params.modelId, messages: [{ role: 'user', content: 'ping' }], max_tokens: 1 },\n };\n\n const res = await fetch(request.url, {\n method: 'POST',\n headers: request.headers,\n body: JSON.stringify(request.body),\n signal: timeout,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`Probe failed (${res.status}) at ${request.url}${text ? `: ${text.slice(0, 300)}` : ''}`);\n }\n}\n\nfunction defaultProviderIdFromBaseUrl(baseUrl: string): string {\n try {\n const url = new URL(baseUrl);\n return url.hostname\n .replace(/^api\\./, '')\n .split('.')\n .filter(Boolean)\n .slice(0, 2)\n .join('-')\n .toLowerCase()\n .replace(/[^a-z0-9-_]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'custom';\n } catch {\n return 'custom';\n }\n}\n\nfunction validateProviderId(value: string): true | string {\n return /^[a-z0-9]([a-z0-9-_]*[a-z0-9])?$/.test(value)\n ? true\n : 'Use lowercase letters, numbers, hyphens, or underscores; start/end with a letter or number.';\n}\n\nasync function setupCustomApi(config: Config, ctx: CLIContext): Promise<Config> {\n console.log('\\n🔌 Custom API provider\\n');\n\n const baseUrl = (await input({\n message: 'API base URL:',\n default: 'https://api.example.com/v1',\n validate: (value) => URL.canParse(value) || 'Enter a valid URL',\n })).trim();\n\n const apiKey = (await input({\n message: 'API key:',\n validate: (value) => value.trim().length > 0 || 'Required',\n })).trim();\n\n const api = await select<CustomApiKind>({\n message: 'Compatibility:',\n choices: [\n { value: 'openai-completions', name: 'OpenAI-compatible Chat Completions' },\n { value: 'openai-responses', name: 'OpenAI Responses' },\n { value: 'anthropic-messages', name: 'Anthropic Messages' },\n ],\n });\n\n const discoveredChoices = await discoverModelsForOnboard({\n providerId: defaultProviderIdFromBaseUrl(baseUrl),\n baseUrl,\n apiKey,\n api,\n });\n const modelRef =\n discoveredChoices.length > 0\n ? await select({\n message: 'Model:',\n choices: discoveredChoices.map((choice) => ({ ...choice, name: modelChoiceName(choice) })),\n })\n : (await input({\n message: 'Model ID:',\n validate: (value) => value.trim().length > 0 || 'Required',\n })).trim();\n const modelId = modelRef.includes('/') ? modelRef.split('/').slice(1).join('/') : modelRef;\n\n console.log('\\n→ Probing endpoint...');\n await probeCustomProvider({ baseUrl, apiKey, modelId, api });\n console.log(colors.green('✓ Probe succeeded'));\n\n const existingProviders = new Set(getAllProviders());\n const providerId = (await input({\n message: 'Provider ID:',\n default: defaultProviderIdFromBaseUrl(baseUrl),\n validate: (value) => {\n const valid = validateProviderId(value.trim());\n if (valid !== true) return valid;\n if (existingProviders.has(value.trim())) return 'Provider ID already exists; choose a new ID.';\n return true;\n },\n })).trim();\n\n const path = getModelsJsonPath();\n const { config: modelsConfig } = loadModelsJson(path);\n const nextModelsConfig: ModelsJsonConfig = {\n providers: {\n ...(modelsConfig.providers ?? {}),\n [providerId]: {\n baseUrl,\n apiKey,\n api,\n models: (discoveredChoices.length > 0 ? discoveredChoices : [{ value: `${providerId}/${modelId}`, name: modelId }]).map(\n (choice) => {\n const id = choice.value.split('/').slice(1).join('/');\n return { id, name: choice.name, api, contextWindow: 128000, input: ['text'] };\n },\n ),\n },\n },\n };\n const saved = saveModelsJson(path, nextModelsConfig);\n if (!saved.success) {\n throw new Error(saved.error || 'Failed to save models.json');\n }\n getModelRegistry().refresh();\n\n const ref = `${providerId}/${modelId}`;\n console.log('\\n✅ Custom model configured:', ref);\n return setPrimaryModel(config, ctx.workspacePath, ref);\n}\n\nfunction resolvePresetEnvCredential(preset: DomesticProviderPreset): { envVar: string; value: string } | undefined {\n for (const envVar of preset.envVars) {\n const value = process.env[envVar]?.trim();\n if (value) return { envVar, value };\n }\n return undefined;\n}\n\nasync function setupDomesticPreset(\n config: Config,\n ctx: CLIContext,\n preset: DomesticProviderPreset,\n): Promise<Config> {\n console.log(`\\n🇨🇳 ${preset.displayName}\\n`);\n console.log(preset.description);\n if (preset.quirks?.length) {\n for (const quirk of preset.quirks) {\n console.log(colors.gray(`Note: ${quirk}`));\n }\n }\n\n const baseUrlChoice = await select({\n message: 'Endpoint:',\n choices: [\n ...preset.baseUrlPresets.map((entry) => ({\n value: entry.baseUrl,\n name: entry.label,\n description: entry.description ?? entry.baseUrl,\n })),\n { value: 'custom', name: 'Custom URL' },\n ],\n default: getDomesticProviderBaseUrl(preset),\n });\n const baseUrl =\n baseUrlChoice === 'custom'\n ? (await input({\n message: 'API base URL:',\n default: getDomesticProviderBaseUrl(preset),\n validate: (value) => URL.canParse(value) || 'Enter a valid URL',\n })).trim()\n : baseUrlChoice;\n\n const envCredential = resolvePresetEnvCredential(preset);\n if (envCredential) {\n console.log(`\\n${colors.green('✓')} Found ${envCredential.envVar} in environment`);\n }\n const apiKeyConfig = envCredential\n ? envCredential.envVar\n : (await input({\n message: `API key for ${preset.displayName}:`,\n validate: (value) => value.trim().length > 0 || 'Required',\n })).trim();\n const probeApiKey = envCredential?.value ?? apiKeyConfig;\n\n const discoveredChoices = await discoverModelsForOnboard({\n providerId: preset.id,\n baseUrl,\n apiKey: probeApiKey,\n api: preset.api as CustomApiKind,\n headers: preset.headers,\n });\n const modelChoices = discoveredChoices.length > 0 ? discoveredChoices : getModelsForProvider(preset.id);\n const modelRef = await select({\n message: 'Model:',\n choices: modelChoices.map((choice) => ({ ...choice, name: modelChoiceName(choice) })),\n default: `${preset.id}/${preset.defaultModel}`,\n });\n const modelId = modelRef.split('/').slice(1).join('/');\n\n const shouldProbe = await confirm({\n message: 'Probe endpoint now?',\n default: !modelId.includes('your-endpoint-id'),\n });\n if (shouldProbe) {\n try {\n console.log('\\n→ Probing endpoint...');\n await probeCustomProvider({ baseUrl, apiKey: probeApiKey, modelId, api: preset.api as CustomApiKind });\n console.log(colors.green('✓ Probe succeeded'));\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n const continueAnyway = await confirm({ message: 'Save this provider anyway?', default: false });\n if (!continueAnyway) return config;\n }\n }\n\n const path = getModelsJsonPath();\n const { config: modelsConfig } = loadModelsJson(path);\n const nextModelsConfig: ModelsJsonConfig = {\n providers: {\n ...(modelsConfig.providers ?? {}),\n [preset.id]: providerConfigFromDomesticPreset(preset, {\n baseUrl,\n apiKey: apiKeyConfig,\n modelIds: modelChoices.map((choice) => choice.value.split('/').slice(1).join('/')),\n }),\n },\n };\n const saved = saveModelsJson(path, nextModelsConfig);\n if (!saved.success) {\n throw new Error(saved.error || 'Failed to save models.json');\n }\n getModelRegistry().refresh();\n\n console.log('\\n✅ Provider configured:', preset.displayName);\n console.log('✅ Model configured:', modelRef);\n return setPrimaryModel(config, ctx.workspacePath, modelRef);\n}\n\nasync function ensureProviderCredential(provider: string, providerName: string): Promise<boolean> {\n const existingProfiles = listProfilesForProvider(provider);\n if (existingProfiles.length > 0) {\n console.log(`\\n${colors.green('✓')} Found existing credentials for ${providerName}`);\n return await confirm({ message: 'Use existing credentials?', default: true });\n }\n\n const envKey = getApiKeyFromEnv(provider);\n if (envKey) {\n console.log(`\\n${colors.green('✓')} Found API key for ${providerName} in environment`);\n return true;\n }\n\n const supportsOAuth = providerSupportsOAuth(provider);\n const supportsApiKey = providerSupportsApiKey(provider);\n\n if (supportsOAuth && !supportsApiKey) {\n return await doOAuthLogin(provider);\n }\n\n let useOAuth = false;\n if (supportsOAuth && supportsApiKey) {\n const authMethod = await select<'api_key' | 'oauth'>({\n message: `How would you like to authenticate with ${providerName}?`,\n choices: [\n { value: 'api_key', name: 'API key' },\n { value: 'oauth', name: 'OAuth login' },\n ],\n });\n useOAuth = authMethod === 'oauth';\n }\n\n if (useOAuth) {\n const ok = await doOAuthLogin(provider);\n if (ok) return true;\n console.log('\\n⚠️ OAuth login failed. Enter an API key instead.');\n }\n\n if (!supportsApiKey) return false;\n const apiKey = await input({\n message: `API key for ${providerName}:`,\n validate: (value) => value.trim().length > 0 || 'Required',\n });\n const resolver = new CredentialResolver();\n await resolver.saveApiKey(provider, apiKey.trim(), { profileName: 'default' });\n return true;\n}\n\nexport async function setupModel(existingConfig: Config | null, ctx: CLIContext): Promise<Config> {\n console.log('\\n🤖 Step: AI Model\\n');\n\n const config = existingConfig || ({} as Config);\n const currentModel = getAgentDefaultModelRef(config);\n\n if (currentModel) {\n console.log('Current model:', currentModel);\n const keepCurrent = await confirm({ message: 'Keep using this model?', default: true });\n if (keepCurrent) {\n console.log('✅ Keeping:', currentModel);\n return config;\n }\n }\n\n const provider = await select({\n message: 'Model/auth provider:',\n choices: providerChoices(),\n });\n\n if (provider === 'custom-api') {\n return await setupCustomApi(config, ctx);\n }\n\n const domesticPreset = getDomesticProviderPreset(provider);\n if (domesticPreset) {\n return await setupDomesticPreset(config, ctx, domesticPreset);\n }\n\n const providerName = getProviderDisplayName(provider);\n const credentialOk = await ensureProviderCredential(provider, providerName);\n if (!credentialOk) {\n console.error(`\\n❌ Could not configure credentials for ${providerName}.`);\n return config;\n }\n\n const modelChoices = getModelsForProvider(provider);\n if (modelChoices.length === 0) {\n throw new Error(`No catalog models found for ${providerName}. Add a Custom API provider instead.`);\n }\n\n console.log(`\\n📋 Models for ${providerName}:`);\n const model = await select({\n message: 'Model:',\n choices: modelChoices.map((choice) => ({ ...choice, name: modelChoiceName(choice) })),\n });\n\n console.log('\\n✅ Model configured:', model);\n return setPrimaryModel(config, ctx.workspacePath, model);\n}\n"],"mappings":"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"}
@@ -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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"}
@@ -0,0 +1,11 @@
1
+ export declare const DEFAULT_MODEL_ROLE = "deep";
2
+ export declare const DEFAULT_MODEL_REF = "deepseek/deepseek-v4-flash";
3
+ export declare const DEFAULT_AGENT_MODELS: {
4
+ readonly defaultRole: "deep";
5
+ readonly roles: {
6
+ readonly deep: {
7
+ readonly model: "deepseek/deepseek-v4-flash";
8
+ readonly description: "Default model for general agent work.";
9
+ };
10
+ };
11
+ };
@@ -0,0 +1,19 @@
1
+ import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
+ //#region src/config/default-model.ts
3
+ var DEFAULT_MODEL_ROLE, DEFAULT_MODEL_REF, DEFAULT_AGENT_MODELS;
4
+ var init_default_model = __esmMin((() => {
5
+ DEFAULT_MODEL_ROLE = "deep";
6
+ DEFAULT_MODEL_REF = "deepseek/deepseek-v4-flash";
7
+ DEFAULT_AGENT_MODELS = {
8
+ defaultRole: DEFAULT_MODEL_ROLE,
9
+ roles: { [DEFAULT_MODEL_ROLE]: {
10
+ model: DEFAULT_MODEL_REF,
11
+ description: "Default model for general agent work."
12
+ } }
13
+ };
14
+ }));
15
+ //#endregion
16
+ init_default_model();
17
+ export { DEFAULT_AGENT_MODELS, DEFAULT_MODEL_REF, DEFAULT_MODEL_ROLE, init_default_model };
18
+
19
+ //# sourceMappingURL=default-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-model.js","names":[],"sources":["../../../src/config/default-model.ts"],"sourcesContent":["export const DEFAULT_MODEL_ROLE = 'deep';\nexport const DEFAULT_MODEL_REF = 'deepseek/deepseek-v4-flash';\n\nexport const DEFAULT_AGENT_MODELS = {\n defaultRole: DEFAULT_MODEL_ROLE,\n roles: {\n [DEFAULT_MODEL_ROLE]: {\n model: DEFAULT_MODEL_REF,\n description: 'Default model for general agent work.',\n },\n },\n} as const;\n"],"mappings":";;;;AAAa,sBAAqB;AACrB,qBAAoB;AAEpB,wBAAuB;EAClC,aAAa;EACb,OAAO,GACJ,qBAAqB;GACpB,OAAO;GACP,aAAa;GACd,EACF;EACF"}
@@ -1,6 +1,6 @@
1
1
  import { TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema } from "../../extensions/telegram/src/config-schema.js";
2
2
  import { WeixinAccountConfigSchema, WeixinConfigSchema } from "../../extensions/weixin/src/config-schema.js";
3
- import { AgentImageGenerationModelSchema, AgentModelRefSchema, AgentModelsSchema, AgentTypedModelRoleSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, BrowserConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, ConnectorsConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GoalNotificationEventSchema, GoalNotificationTargetSchema, GoalNotificationsConfigSchema, GoalsConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionResetByTypeSchema, SessionResetConfigSchema, SessionResetModeSchema, SessionScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TuiConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultModelRef, init_schema, parseModelRef } from "./schema.js";
3
+ import { AgentImageGenerationModelSchema, AgentModelRefSchema, AgentModelsSchema, AgentTypedModelRoleSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, BrowserConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, ConnectorsConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GoalNotificationEventSchema, GoalNotificationTargetSchema, GoalNotificationsConfigSchema, GoalsConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionResetByTypeSchema, SessionResetConfigSchema, SessionResetModeSchema, SessionScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TuiConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultImageGenerationModelConfig, getAgentDefaultImageModelConfig, getAgentDefaultModelRef, init_schema, parseModelRef } from "./schema.js";
4
4
  import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.js";
5
5
  import { ENV_VARS, XOPC_DB_FILENAME, resolveHomeDir, resolveStateDir, resolveXopcDatabasePath } from "./paths-state.js";
6
6
  import { expandWorkspacePathString, init_workspace_path, normalizeWorkspaceDir, resolveWorkspaceRoot } from "./workspace-path.js";
@@ -27,6 +27,6 @@ init_workspace_path();
27
27
  init_models_json();
28
28
  init_resolve_config_value();
29
29
  //#endregion
30
- export { AgentImageGenerationModelSchema, AgentModelRefSchema, AgentModelsSchema, AgentTypedModelRoleSchema, AgentsConfigSchema, BASE_RELOAD_RULES, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, BrowserConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigHotReloader, ConfigSchema, ConnectorsConfigSchema, CustomModelSchema, ENV_VARS, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, FILENAMES, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GoalNotificationEventSchema, GoalNotificationTargetSchema, GoalNotificationsConfigSchema, GoalsConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelOverrideSchema, ModelsDevConfigSchema, ModelsJsonSchema, OpenAICompatSchema, OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema, OpenRouterRoutingSchema, ProfileManager, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionResetByTypeSchema, SessionResetConfigSchema, SessionResetModeSchema, SessionScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TuiConfigSchema, TunnelConfigSchema, TunnelConsentSchema, USER_MEMORY_FILENAME, USER_PROFILE_FILENAME, UpdateAutoConfigSchema, UpdateConfigSchema, VercelGatewayRoutingSchema, WORKSPACE_FILES, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WeixinAccountConfigSchema, WeixinConfigSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, XOPC_DB_FILENAME, applyConfigOverrides, buildReloadPlan, canonicalizeConfiguredMcpServer, clearConfigValueCache, createProfile, deleteProfile, diffConfigPaths, existsSync, expandWorkspacePathString, extractProfileAgentId, formatThinkingLevels, getAgentDefaultModelRef, getAllowedCommands, getCacheStats, getConfigOverrides, getCurrentProfile, getDefaultModelValues, resolveModelsJsonPath as getModelsJsonPath, getProfileManager, getProfileNameFromDir, getSwitchCommand, getWorkspacePath, isKnownCliMcpTypeAlias, listAgentProfileMarkdownDirs, listAgentWorkspaceDirs, listProfiles, listThinkingLevels, loadConfig, loadModelsJson, matchReloadRule, modelsJsonExists, normalizeConfiguredMcpServers, normalizeElevatedMode, normalizeReasoningLevel, normalizeThinkLevel, normalizeVerboseLevel, normalizeWorkspaceDir, parseModelRef, resetConfigOverrides, resolveAgentAuthProfilesPath, resolveAgentDir, resolveAgentDir$1 as resolveAgentDirFromConfig, resolveAgentHomeDir, resolveAgentHomeDir$1 as resolveAgentHomeDirFromConfig, resolveAgentProfileDir, resolveAgentProfileMarkdownPath, resolveAgentWorkspaceDir, resolveAuthProfilesPath, resolveBinDir, resolveBundledExtensionsDir, resolveBundledSkillsDir, resolveConfigPath, resolveConfigValue, resolveCredentialsDir, resolveDefaultAgentWorkspaceDir, resolveEffectiveAgentManifestForAgent, resolveEffectiveAgentManifestForSession, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession, resolveExtensionSdkPath, resolveExtensionsDir, resolveExtensionsLockPath, resolveHeaders, resolveHomeDir, resolveInboxDir, resolveInboxMessagePath, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogPath, resolveLogsDir, resolveModelsJsonPath, resolveNodeBinDir, resolveNodeBinPath, resolveNodeToolsDir, resolveNpmBinPath, resolveOAuthPath, resolvePidPath, resolveProfileStateDir, resolveSkillPath, resolveSkillsCachePath, resolveSkillsDir, resolveSkillsLockPath, resolveSocketPath, resolveStateDir, resolveStatusPath, resolveToolsDir, resolveUserDir, resolveUserMemoryPath, resolveUserProfilePath, resolveWorkspaceExtensionsDir, resolveWorkspaceFile, resolveWorkspaceRoot, resolveWorkspaceStateDir, resolveWorkspaceStatePath, resolveXopcBinPath, resolveXopcDatabasePath, resolveXopcMcpTransportAlias, saveConfig, saveModelsJson, setConfigOverride, testApiKeyResolution, thinkLevelToNumber, unsetConfigOverride, validateModelsConfig };
30
+ export { AgentImageGenerationModelSchema, AgentModelRefSchema, AgentModelsSchema, AgentTypedModelRoleSchema, AgentsConfigSchema, BASE_RELOAD_RULES, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, BrowserConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigHotReloader, ConfigSchema, ConnectorsConfigSchema, CustomModelSchema, ENV_VARS, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, FILENAMES, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GoalNotificationEventSchema, GoalNotificationTargetSchema, GoalNotificationsConfigSchema, GoalsConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelOverrideSchema, ModelsDevConfigSchema, ModelsJsonSchema, OpenAICompatSchema, OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema, OpenRouterRoutingSchema, ProfileManager, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionResetByTypeSchema, SessionResetConfigSchema, SessionResetModeSchema, SessionScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TuiConfigSchema, TunnelConfigSchema, TunnelConsentSchema, USER_MEMORY_FILENAME, USER_PROFILE_FILENAME, UpdateAutoConfigSchema, UpdateConfigSchema, VercelGatewayRoutingSchema, WORKSPACE_FILES, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WeixinAccountConfigSchema, WeixinConfigSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, XOPC_DB_FILENAME, applyConfigOverrides, buildReloadPlan, canonicalizeConfiguredMcpServer, clearConfigValueCache, createProfile, deleteProfile, diffConfigPaths, existsSync, expandWorkspacePathString, extractProfileAgentId, formatThinkingLevels, getAgentDefaultImageGenerationModelConfig, getAgentDefaultImageModelConfig, getAgentDefaultModelRef, getAllowedCommands, getCacheStats, getConfigOverrides, getCurrentProfile, getDefaultModelValues, resolveModelsJsonPath as getModelsJsonPath, getProfileManager, getProfileNameFromDir, getSwitchCommand, getWorkspacePath, isKnownCliMcpTypeAlias, listAgentProfileMarkdownDirs, listAgentWorkspaceDirs, listProfiles, listThinkingLevels, loadConfig, loadModelsJson, matchReloadRule, modelsJsonExists, normalizeConfiguredMcpServers, normalizeElevatedMode, normalizeReasoningLevel, normalizeThinkLevel, normalizeVerboseLevel, normalizeWorkspaceDir, parseModelRef, resetConfigOverrides, resolveAgentAuthProfilesPath, resolveAgentDir, resolveAgentDir$1 as resolveAgentDirFromConfig, resolveAgentHomeDir, resolveAgentHomeDir$1 as resolveAgentHomeDirFromConfig, resolveAgentProfileDir, resolveAgentProfileMarkdownPath, resolveAgentWorkspaceDir, resolveAuthProfilesPath, resolveBinDir, resolveBundledExtensionsDir, resolveBundledSkillsDir, resolveConfigPath, resolveConfigValue, resolveCredentialsDir, resolveDefaultAgentWorkspaceDir, resolveEffectiveAgentManifestForAgent, resolveEffectiveAgentManifestForSession, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession, resolveExtensionSdkPath, resolveExtensionsDir, resolveExtensionsLockPath, resolveHeaders, resolveHomeDir, resolveInboxDir, resolveInboxMessagePath, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogPath, resolveLogsDir, resolveModelsJsonPath, resolveNodeBinDir, resolveNodeBinPath, resolveNodeToolsDir, resolveNpmBinPath, resolveOAuthPath, resolvePidPath, resolveProfileStateDir, resolveSkillPath, resolveSkillsCachePath, resolveSkillsDir, resolveSkillsLockPath, resolveSocketPath, resolveStateDir, resolveStatusPath, resolveToolsDir, resolveUserDir, resolveUserMemoryPath, resolveUserProfilePath, resolveWorkspaceExtensionsDir, resolveWorkspaceFile, resolveWorkspaceRoot, resolveWorkspaceStateDir, resolveWorkspaceStatePath, resolveXopcBinPath, resolveXopcDatabasePath, resolveXopcMcpTransportAlias, saveConfig, saveModelsJson, setConfigOverride, testApiKeyResolution, thinkLevelToNumber, unsetConfigOverride, validateModelsConfig };
31
31
 
32
32
  //# sourceMappingURL=index.js.map
@@ -9,6 +9,17 @@ export declare const AgentModelRefSchema: z.ZodObject<{
9
9
  fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
10
10
  }, z.core.$strict>;
11
11
  export type AgentModelConfig = z.infer<typeof AgentModelRefSchema>;
12
+ /**
13
+ * Image-generation model ref. {@link AgentModelRefSchema} plus runtime knobs
14
+ * (`timeoutMs`, `autoProviderFallback`) used by the image-generation runtime.
15
+ */
16
+ export declare const AgentImageGenerationModelSchema: z.ZodObject<{
17
+ primary: z.ZodString;
18
+ fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
19
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
20
+ autoProviderFallback: z.ZodOptional<z.ZodBoolean>;
21
+ }, z.core.$strict>;
22
+ export type AgentImageGenerationModelConfig = z.infer<typeof AgentImageGenerationModelSchema>;
12
23
  export declare const AgentTypedModelRoleSchema: z.ZodObject<{
13
24
  description: z.ZodOptional<z.ZodString>;
14
25
  model: z.ZodString;
@@ -22,19 +33,18 @@ export declare const AgentModelsSchema: z.ZodOptional<z.ZodObject<{
22
33
  model: z.ZodString;
23
34
  fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
24
35
  }, z.core.$strict>>>;
36
+ imageModel: z.ZodOptional<z.ZodObject<{
37
+ primary: z.ZodString;
38
+ fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
39
+ }, z.core.$strict>>;
40
+ imageGenerationModel: z.ZodOptional<z.ZodObject<{
41
+ primary: z.ZodString;
42
+ fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
43
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
44
+ autoProviderFallback: z.ZodOptional<z.ZodBoolean>;
45
+ }, z.core.$strict>>;
25
46
  }, z.core.$strict>>;
26
47
  export type AgentModelsConfig = z.infer<typeof AgentModelsSchema>;
27
- /**
28
- * Image-generation model ref. {@link AgentModelRefSchema} plus runtime knobs
29
- * (`timeoutMs`, `autoProviderFallback`) used by the image-generation runtime.
30
- */
31
- export declare const AgentImageGenerationModelSchema: z.ZodObject<{
32
- primary: z.ZodString;
33
- fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
34
- timeoutMs: z.ZodOptional<z.ZodNumber>;
35
- autoProviderFallback: z.ZodOptional<z.ZodBoolean>;
36
- }, z.core.$strict>;
37
- export type AgentImageGenerationModelConfig = z.infer<typeof AgentImageGenerationModelSchema>;
38
48
  export type AgentTypedModel = AgentTypedModelRole & {
39
49
  id: string;
40
50
  };
@@ -54,6 +64,18 @@ export declare const AgentsConfigSchema: z.ZodDefault<z.ZodObject<{
54
64
  fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
55
65
  description: z.ZodOptional<z.ZodString>;
56
66
  }, z.core.$strict>>>;
67
+ imageModel: z.ZodOptional<z.ZodObject<{
68
+ primary: z.ZodString;
69
+ fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
70
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
71
+ autoProviderFallback: z.ZodOptional<z.ZodBoolean>;
72
+ }, z.core.$strict>>;
73
+ imageGenerationModel: z.ZodOptional<z.ZodObject<{
74
+ primary: z.ZodString;
75
+ fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
76
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
77
+ autoProviderFallback: z.ZodOptional<z.ZodBoolean>;
78
+ }, z.core.$strict>>;
57
79
  policy: z.ZodOptional<z.ZodObject<{
58
80
  allowFallbacks: z.ZodOptional<z.ZodBoolean>;
59
81
  maxCostTier: z.ZodOptional<z.ZodEnum<{
@@ -477,6 +499,18 @@ export declare const AgentsConfigSchema: z.ZodDefault<z.ZodObject<{
477
499
  fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
478
500
  description: z.ZodOptional<z.ZodString>;
479
501
  }, z.core.$strict>>>;
502
+ imageModel: z.ZodOptional<z.ZodObject<{
503
+ primary: z.ZodString;
504
+ fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
505
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
506
+ autoProviderFallback: z.ZodOptional<z.ZodBoolean>;
507
+ }, z.core.$strict>>;
508
+ imageGenerationModel: z.ZodOptional<z.ZodObject<{
509
+ primary: z.ZodString;
510
+ fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
511
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
512
+ autoProviderFallback: z.ZodOptional<z.ZodBoolean>;
513
+ }, z.core.$strict>>;
480
514
  policy: z.ZodOptional<z.ZodObject<{
481
515
  allowFallbacks: z.ZodOptional<z.ZodBoolean>;
482
516
  maxCostTier: z.ZodOptional<z.ZodEnum<{
@@ -1660,6 +1694,18 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
1660
1694
  fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
1661
1695
  description: z.ZodOptional<z.ZodString>;
1662
1696
  }, z.core.$strict>>>;
1697
+ imageModel: z.ZodOptional<z.ZodObject<{
1698
+ primary: z.ZodString;
1699
+ fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
1700
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
1701
+ autoProviderFallback: z.ZodOptional<z.ZodBoolean>;
1702
+ }, z.core.$strict>>;
1703
+ imageGenerationModel: z.ZodOptional<z.ZodObject<{
1704
+ primary: z.ZodString;
1705
+ fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
1706
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
1707
+ autoProviderFallback: z.ZodOptional<z.ZodBoolean>;
1708
+ }, z.core.$strict>>;
1663
1709
  policy: z.ZodOptional<z.ZodObject<{
1664
1710
  allowFallbacks: z.ZodOptional<z.ZodBoolean>;
1665
1711
  maxCostTier: z.ZodOptional<z.ZodEnum<{
@@ -2083,6 +2129,18 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
2083
2129
  fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
2084
2130
  description: z.ZodOptional<z.ZodString>;
2085
2131
  }, z.core.$strict>>>;
2132
+ imageModel: z.ZodOptional<z.ZodObject<{
2133
+ primary: z.ZodString;
2134
+ fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
2135
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
2136
+ autoProviderFallback: z.ZodOptional<z.ZodBoolean>;
2137
+ }, z.core.$strict>>;
2138
+ imageGenerationModel: z.ZodOptional<z.ZodObject<{
2139
+ primary: z.ZodString;
2140
+ fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
2141
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
2142
+ autoProviderFallback: z.ZodOptional<z.ZodBoolean>;
2143
+ }, z.core.$strict>>;
2086
2144
  policy: z.ZodOptional<z.ZodObject<{
2087
2145
  allowFallbacks: z.ZodOptional<z.ZodBoolean>;
2088
2146
  maxCostTier: z.ZodOptional<z.ZodEnum<{
@@ -2627,5 +2685,7 @@ export interface ParsedModelRef {
2627
2685
  model: string;
2628
2686
  }
2629
2687
  export declare function getAgentDefaultModelRef(config: Config): string | undefined;
2688
+ export declare function getAgentDefaultImageModelConfig(config: Config): AgentModelConfig | undefined;
2689
+ export declare function getAgentDefaultImageGenerationModelConfig(config: Config): AgentImageGenerationModelConfig | undefined;
2630
2690
  /** `provider/model` or null when invalid. */
2631
2691
  export declare function parseModelRef(ref: string): ParsedModelRef | null;