@xopcai/xopc 0.0.89 → 0.0.91

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 (267) hide show
  1. package/README.md +36 -12
  2. package/README.zh-CN.md +36 -12
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/telegram/xopc.extension.json +1 -1
  5. package/dist/gateway/static/root/assets/Combination-HAlzriaz.js +41 -0
  6. package/dist/gateway/static/root/assets/agents-bVWUlrlD.js +222 -0
  7. package/dist/gateway/static/root/assets/apps-page-CIC8bmvZ.js +1 -0
  8. package/dist/gateway/static/root/assets/{attachment-preview-renderer-CpyoFbs4.js → attachment-preview-renderer-DBAxQXb-.js} +2 -2
  9. package/dist/gateway/static/root/assets/{attachment-process-heavy-CqVriadb.js → attachment-process-heavy-Csq3TrrP.js} +4 -4
  10. package/dist/gateway/static/root/assets/channels-settings-C8G8RAAP.js +1 -0
  11. package/dist/gateway/static/root/assets/{channels-status-swr-DaHGkRF1.js → channels-status-swr-CYWL5DLD.js} +1 -1
  12. package/dist/gateway/static/root/assets/circle-check-C23XjkUj.js +1 -0
  13. package/dist/gateway/static/root/assets/copy-Dv6d4Dvw.js +1 -0
  14. package/dist/gateway/static/root/assets/cron-api-TVqLlGAC.js +1 -0
  15. package/dist/gateway/static/root/assets/cron-dreaming-jobs-Ip703-qM.js +2 -0
  16. package/dist/gateway/static/root/assets/cron-page-BtcFYlvv.js +1 -0
  17. package/dist/gateway/static/root/assets/dist-CUV1uY5f.js +1 -0
  18. package/dist/gateway/static/root/assets/{extension-debug-page-CtuKJ9tE.js → extension-debug-page-mTLHRDp1.js} +1 -1
  19. package/dist/gateway/static/root/assets/{extension-page-ykzjOkR5.js → extension-page-iI8BI7WK.js} +1 -1
  20. package/dist/gateway/static/root/assets/{extension-settings-page-Ce2qrdpO.js → extension-settings-page-ByXcdubM.js} +1 -1
  21. package/dist/gateway/static/root/assets/{fetch-C9FFJjuH.js → fetch-BWtQq_Ys.js} +1 -1
  22. package/dist/gateway/static/root/assets/{field-primitives-BFcrNeTU.js → field-primitives-BsZ-4VT5.js} +1 -1
  23. package/dist/gateway/static/root/assets/{heartbeat-config-api-CEg4Vr9R.js → heartbeat-config-api-WjTsRLCU.js} +1 -1
  24. package/dist/gateway/static/root/assets/{index-CZfy9oxs.js → index-CKkR-v9U.js} +101 -97
  25. package/dist/gateway/static/root/assets/index-VlELBY99.css +1 -0
  26. package/dist/gateway/static/root/assets/logs-page-ClnIpxfd.js +1 -0
  27. package/dist/gateway/static/root/assets/note-detail-page-B91pLkEI.css +1 -0
  28. package/dist/gateway/static/root/assets/note-detail-page-DJ2Mb4x7.js +179 -0
  29. package/dist/gateway/static/root/assets/note-time-JLBPSLzK.js +1 -0
  30. package/dist/gateway/static/root/assets/notes-page-BE-75qz9.js +1 -0
  31. package/dist/gateway/static/root/assets/{pdf-BnEvgIXZ.js → pdf-epILhEOn.js} +1 -1
  32. package/dist/gateway/static/root/assets/preload-helper-zJ_50EbN.js +1 -0
  33. package/dist/gateway/static/root/assets/sessions-page-bJJkWtTl.js +1 -0
  34. package/dist/gateway/static/root/assets/{settings-form-section-BqdzA28u.js → settings-form-section-DSYCknxM.js} +1 -1
  35. package/dist/gateway/static/root/assets/settings-page-WcMXLq2U.js +3 -0
  36. package/dist/gateway/static/root/assets/share-preview-page-awRqs4hV.js +2 -0
  37. package/dist/gateway/static/root/assets/skills-page-Lu-i1JG7.js +2 -0
  38. package/dist/gateway/static/root/assets/{theme-store-CNqbmTNV.js → theme-store-BC-42BoZ.js} +1 -1
  39. package/dist/gateway/static/root/assets/toast-z0toXu32.js +1 -0
  40. package/dist/gateway/static/root/assets/url-CY1RQKTU.js +3 -0
  41. package/dist/gateway/static/root/assets/{utils-BWm2tG2w.js → utils-DX3TQuap.js} +1 -1
  42. package/dist/gateway/static/root/assets/vendor-codemirror-DYoKfS8f.js +45 -0
  43. package/dist/gateway/static/root/assets/voice-api-key-field-B5uKlDqA.js +1 -0
  44. package/dist/gateway/static/root/assets/workflow-page.utils-ClC37yEp.js +1 -0
  45. package/dist/gateway/static/root/assets/workflows-page-C7VhIXtR.js +27 -0
  46. package/dist/gateway/static/root/index.html +11 -7
  47. package/dist/package.js +1 -1
  48. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +20 -18
  49. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  50. package/dist/src/agent/tools/cronjob-tool.d.ts +6 -0
  51. package/dist/src/agent/tools/cronjob-tool.js +74 -9
  52. package/dist/src/agent/tools/cronjob-tool.js.map +1 -1
  53. package/dist/src/agent/tools/edit.d.ts +5 -1
  54. package/dist/src/agent/tools/edit.js +7 -5
  55. package/dist/src/agent/tools/edit.js.map +1 -1
  56. package/dist/src/agent/tools/factory.js +2 -2
  57. package/dist/src/agent/tools/factory.js.map +1 -1
  58. package/dist/src/agent/tools/write.d.ts +5 -1
  59. package/dist/src/agent/tools/write.js +7 -5
  60. package/dist/src/agent/tools/write.js.map +1 -1
  61. package/dist/src/agent/workflow/agent-progress.js +2 -0
  62. package/dist/src/agent/workflow/agent-progress.js.map +1 -1
  63. package/dist/src/agent/workflow/builtins/client-proposal.d.ts +12 -0
  64. package/dist/src/agent/workflow/builtins/client-proposal.js +155 -0
  65. package/dist/src/agent/workflow/builtins/client-proposal.js.map +1 -0
  66. package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +12 -0
  67. package/dist/src/agent/workflow/builtins/competitor-scan.js +150 -0
  68. package/dist/src/agent/workflow/builtins/competitor-scan.js.map +1 -0
  69. package/dist/src/agent/workflow/builtins/content-draft.d.ts +13 -0
  70. package/dist/src/agent/workflow/builtins/content-draft.js +146 -0
  71. package/dist/src/agent/workflow/builtins/content-draft.js.map +1 -0
  72. package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +11 -0
  73. package/dist/src/agent/workflow/builtins/content-repurpose.js +137 -0
  74. package/dist/src/agent/workflow/builtins/content-repurpose.js.map +1 -0
  75. package/dist/src/agent/workflow/builtins/decision-compare.d.ts +13 -0
  76. package/dist/src/agent/workflow/builtins/decision-compare.js +173 -0
  77. package/dist/src/agent/workflow/builtins/decision-compare.js.map +1 -0
  78. package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +11 -0
  79. package/dist/src/agent/workflow/builtins/inbox-triage.js +148 -0
  80. package/dist/src/agent/workflow/builtins/inbox-triage.js.map +1 -0
  81. package/dist/src/agent/workflow/builtins/index.d.ts +10 -1
  82. package/dist/src/agent/workflow/builtins/index.js +46 -1
  83. package/dist/src/agent/workflow/builtins/index.js.map +1 -1
  84. package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +12 -0
  85. package/dist/src/agent/workflow/builtins/meeting-prep.js +144 -0
  86. package/dist/src/agent/workflow/builtins/meeting-prep.js.map +1 -0
  87. package/dist/src/agent/workflow/builtins/offer-design.d.ts +12 -0
  88. package/dist/src/agent/workflow/builtins/offer-design.js +161 -0
  89. package/dist/src/agent/workflow/builtins/offer-design.js.map +1 -0
  90. package/dist/src/agent/workflow/builtins/weekly-review.d.ts +12 -0
  91. package/dist/src/agent/workflow/builtins/weekly-review.js +131 -0
  92. package/dist/src/agent/workflow/builtins/weekly-review.js.map +1 -0
  93. package/dist/src/agent/workflow/step-labels.js +2 -2
  94. package/dist/src/agent/workflow/step-labels.js.map +1 -1
  95. package/dist/src/agent/workflow/subagent-runner.js +3 -1
  96. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  97. package/dist/src/agent/workflow/types.d.ts +4 -0
  98. package/dist/src/chat-commands/agent-edit.d.ts +4 -0
  99. package/dist/src/chat-commands/agent-edit.js +136 -0
  100. package/dist/src/chat-commands/agent-edit.js.map +1 -0
  101. package/dist/src/chat-commands/index.d.ts +1 -0
  102. package/dist/src/chat-commands/index.js +3 -1
  103. package/dist/src/chat-commands/index.js.map +1 -1
  104. package/dist/src/cli/bin.js +2 -0
  105. package/dist/src/cli/bin.js.map +1 -1
  106. package/dist/src/cli/commands/cron.js +42 -3
  107. package/dist/src/cli/commands/cron.js.map +1 -1
  108. package/dist/src/cli/commands/doctor/checks/session-integrity.js +79 -56
  109. package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -1
  110. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  111. package/dist/src/cli/commands/update.js +86 -79
  112. package/dist/src/cli/commands/update.js.map +1 -1
  113. package/dist/src/commands/agents.config.d.ts +3 -2
  114. package/dist/src/commands/agents.config.js +5 -2
  115. package/dist/src/commands/agents.config.js.map +1 -1
  116. package/dist/src/config/agent-typed-models.d.ts +2 -7
  117. package/dist/src/config/agent-typed-models.js +3 -14
  118. package/dist/src/config/agent-typed-models.js.map +1 -1
  119. package/dist/src/config/localized-text.d.ts +6 -0
  120. package/dist/src/config/localized-text.js +42 -0
  121. package/dist/src/config/localized-text.js.map +1 -0
  122. package/dist/src/config/models-json.d.ts +6 -6
  123. package/dist/src/config/schema.d.ts +6 -21
  124. package/dist/src/config/schema.js +4 -4
  125. package/dist/src/config/schema.js.map +1 -1
  126. package/dist/src/cron/executor.d.ts +2 -0
  127. package/dist/src/cron/executor.js +111 -1
  128. package/dist/src/cron/executor.js.map +1 -1
  129. package/dist/src/cron/types.d.ts +8 -1
  130. package/dist/src/cron/validation.d.ts +4 -0
  131. package/dist/src/cron/validation.js +4 -3
  132. package/dist/src/cron/validation.js.map +1 -1
  133. package/dist/src/cron/workflow-run-completion.d.ts +23 -0
  134. package/dist/src/cron/workflow-run-completion.js +72 -0
  135. package/dist/src/cron/workflow-run-completion.js.map +1 -0
  136. package/dist/src/extensions/update.d.ts +51 -0
  137. package/dist/src/extensions/update.js +260 -0
  138. package/dist/src/extensions/update.js.map +1 -0
  139. package/dist/src/gateway/agents-admin.d.ts +15 -8
  140. package/dist/src/gateway/agents-admin.js +77 -28
  141. package/dist/src/gateway/agents-admin.js.map +1 -1
  142. package/dist/src/gateway/heartbeat/service.js +1 -1
  143. package/dist/src/gateway/hono/lib/config-payload.d.ts +6 -0
  144. package/dist/src/gateway/hono/lib/config-payload.js +3 -1
  145. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  146. package/dist/src/gateway/hono/middleware/auth.d.ts +2 -0
  147. package/dist/src/gateway/hono/middleware/auth.js +11 -7
  148. package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
  149. package/dist/src/gateway/hono/routes/agents.js +55 -12
  150. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  151. package/dist/src/gateway/hono/routes/config-patch/agents.js +1 -1
  152. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +2 -2
  153. package/dist/src/gateway/hono/routes/config-patch/gateway.js +12 -0
  154. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -1
  155. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  156. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  157. package/dist/src/gateway/hono/routes/notes.d.ts +3 -0
  158. package/dist/src/gateway/hono/routes/notes.js +274 -0
  159. package/dist/src/gateway/hono/routes/notes.js.map +1 -0
  160. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  161. package/dist/src/gateway/hono/routes/update.js +55 -107
  162. package/dist/src/gateway/hono/routes/update.js.map +1 -1
  163. package/dist/src/gateway/hono/routes/workflows.js +3 -1
  164. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  165. package/dist/src/gateway/server.js +2 -0
  166. package/dist/src/gateway/server.js.map +1 -1
  167. package/dist/src/gateway/service.d.ts +3 -0
  168. package/dist/src/gateway/service.js +12 -1
  169. package/dist/src/gateway/service.js.map +1 -1
  170. package/dist/src/gateway/workspace-ripgrep.d.ts +6 -0
  171. package/dist/src/gateway/workspace-ripgrep.js +62 -11
  172. package/dist/src/gateway/workspace-ripgrep.js.map +1 -1
  173. package/dist/src/heartbeat/index.js +1 -1
  174. package/dist/src/infra/brew.d.ts +4 -0
  175. package/dist/src/infra/brew.js +20 -0
  176. package/dist/src/infra/brew.js.map +1 -0
  177. package/dist/src/infra/package-json.d.ts +2 -0
  178. package/dist/src/infra/package-json.js +23 -0
  179. package/dist/src/infra/package-json.js.map +1 -0
  180. package/dist/src/infra/package-update-steps.d.ts +35 -0
  181. package/dist/src/infra/package-update-steps.js +304 -0
  182. package/dist/src/infra/package-update-steps.js.map +1 -0
  183. package/dist/src/infra/path-env.d.ts +11 -0
  184. package/dist/src/infra/path-env.js +90 -0
  185. package/dist/src/infra/path-env.js.map +1 -0
  186. package/dist/src/infra/path-prepend.d.ts +7 -0
  187. package/dist/src/infra/path-prepend.js +44 -0
  188. package/dist/src/infra/path-prepend.js.map +1 -0
  189. package/dist/src/infra/stable-node-path.d.ts +2 -0
  190. package/dist/src/infra/stable-node-path.js +28 -0
  191. package/dist/src/infra/stable-node-path.js.map +1 -0
  192. package/dist/src/infra/update-global.d.ts +30 -23
  193. package/dist/src/infra/update-global.js +113 -64
  194. package/dist/src/infra/update-global.js.map +1 -1
  195. package/dist/src/infra/update-log.d.ts +1 -0
  196. package/dist/src/infra/update-log.js +12 -0
  197. package/dist/src/infra/update-log.js.map +1 -0
  198. package/dist/src/infra/update-restart.d.ts +20 -0
  199. package/dist/src/infra/update-restart.js +165 -0
  200. package/dist/src/infra/update-restart.js.map +1 -0
  201. package/dist/src/infra/update-runner.d.ts +89 -1
  202. package/dist/src/infra/update-runner.js +604 -173
  203. package/dist/src/infra/update-runner.js.map +1 -1
  204. package/dist/src/infra/update-startup.d.ts +3 -0
  205. package/dist/src/infra/update-startup.js +8 -4
  206. package/dist/src/infra/update-startup.js.map +1 -1
  207. package/dist/src/notes/attachment-ref.d.ts +9 -0
  208. package/dist/src/notes/attachment-ref.js +27 -0
  209. package/dist/src/notes/attachment-ref.js.map +1 -0
  210. package/dist/src/notes/index.d.ts +4 -0
  211. package/dist/src/notes/index.js +4 -0
  212. package/dist/src/notes/note-attachment-sync.d.ts +7 -0
  213. package/dist/src/notes/note-attachment-sync.js +46 -0
  214. package/dist/src/notes/note-attachment-sync.js.map +1 -0
  215. package/dist/src/notes/note-index-meta.d.ts +14 -0
  216. package/dist/src/notes/note-index-meta.js +87 -0
  217. package/dist/src/notes/note-index-meta.js.map +1 -0
  218. package/dist/src/notes/paths.d.ts +5 -0
  219. package/dist/src/notes/paths.js +23 -0
  220. package/dist/src/notes/paths.js.map +1 -0
  221. package/dist/src/notes/service.d.ts +42 -0
  222. package/dist/src/notes/service.js +331 -0
  223. package/dist/src/notes/service.js.map +1 -0
  224. package/dist/src/notes/store.d.ts +33 -0
  225. package/dist/src/notes/store.js +317 -0
  226. package/dist/src/notes/store.js.map +1 -0
  227. package/dist/src/notes/types.d.ts +162 -0
  228. package/dist/src/notes/types.js +1 -0
  229. package/dist/src/routing/resolve-route.d.ts +3 -1
  230. package/dist/src/routing/resolve-route.js.map +1 -1
  231. package/dist/src/session/store.d.ts +5 -3
  232. package/dist/src/session/store.js +66 -20
  233. package/dist/src/session/store.js.map +1 -1
  234. package/dist/src/utils/logger/stats.d.ts +1 -1
  235. package/dist/src/workflows/domain/event.d.ts +3 -0
  236. package/dist/src/workflows/domain/run.d.ts +3 -0
  237. package/dist/src/workflows/domain/run.js.map +1 -1
  238. package/dist/src/workflows/engine/projector.js +17 -0
  239. package/dist/src/workflows/engine/projector.js.map +1 -1
  240. package/dist/src/workflows/engine/workflow-engine.js +127 -0
  241. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  242. package/dist/src/workflows/index.js +1 -1
  243. package/dist/src/workflows/service/run-view-to-snapshot.js +3 -1
  244. package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
  245. package/dist/src/workflows/service/workflow-run-service.d.ts +1 -0
  246. package/dist/src/workflows/service/workflow-run-service.js +4 -1
  247. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  248. package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
  249. package/package.json +1 -1
  250. package/dist/gateway/static/root/assets/agents-B6PJB07W.js +0 -222
  251. package/dist/gateway/static/root/assets/apps-page-BOr0B1wv.js +0 -1
  252. package/dist/gateway/static/root/assets/channels-settings-BelUKggl.js +0 -1
  253. package/dist/gateway/static/root/assets/cron-api-CjOg-BIj.js +0 -1
  254. package/dist/gateway/static/root/assets/cron-dreaming-jobs-DueM3rBz.js +0 -2
  255. package/dist/gateway/static/root/assets/cron-page-DhoZmZXb.js +0 -1
  256. package/dist/gateway/static/root/assets/dist-6LecgDx5.js +0 -1
  257. package/dist/gateway/static/root/assets/dist-BTWC-BTN.js +0 -45
  258. package/dist/gateway/static/root/assets/index-CiN1cQiQ.css +0 -1
  259. package/dist/gateway/static/root/assets/logs-page-BwWLfqvd.js +0 -1
  260. package/dist/gateway/static/root/assets/sessions-page-DV5WN8uk.js +0 -1
  261. package/dist/gateway/static/root/assets/settings-page-CfOBRbPX.js +0 -3
  262. package/dist/gateway/static/root/assets/share-preview-page-Di5Bzh4g.js +0 -2
  263. package/dist/gateway/static/root/assets/skills-page-D0H5Kaxg.js +0 -2
  264. package/dist/gateway/static/root/assets/url-aYn-Rj1C.js +0 -7
  265. package/dist/gateway/static/root/assets/vendor-codemirror-D0yxdRpg.js +0 -58
  266. package/dist/gateway/static/root/assets/voice-api-key-field-X2UfnHeq.js +0 -1
  267. package/dist/gateway/static/root/assets/workflows-page-BOPpO3NG.js +0 -27
@@ -2,14 +2,15 @@ import { PACKAGE_VERSION, init_package_version } from "../../package-version.js"
2
2
  import { loadConfig } from "../../config/loader.js";
3
3
  import { formatExamples, register } from "../registry.js";
4
4
  import "../../config/index.js";
5
+ import { acquireUpdateLock } from "../../infra/update-lock.js";
5
6
  import { normalizeUpdateChannel } from "../../infra/update-channels.js";
6
- import { compareSemver, detectInstallKind, resolveNpmChannelTag, resolvePackageRoot } from "../../infra/update-check.js";
7
- import { formatGlobalInstallFailure, resolveGlobalInstallSpec, resolveGlobalManager, runGlobalPackageInstall } from "../../infra/update-global.js";
7
+ import { compareSemver, resolveNpmChannelTag } from "../../infra/update-check.js";
8
+ import { formatUpdateApiResult, resolveUpdateInstallSurface, runGatewayUpdateWithPostSteps } from "../../infra/update-runner.js";
8
9
  import { Command } from "commander";
9
10
  //#region src/cli/commands/update.ts
10
11
  init_package_version();
11
12
  function createUpdateCommand(_ctx) {
12
- return new Command("update").description("Check for and install xopc updates").option("--check", "Only check for updates without installing").option("--yes", "Skip confirmation prompts").option("--channel <channel>", "Update channel: stable, beta, or dev (default: from config, else stable)").option("--json", "Output results as JSON").addHelpText("after", formatExamples([
13
+ return new Command("update").description("Check for and install xopc updates").option("--check", "Only check for updates without installing").option("--yes", "Skip confirmation prompts").option("--channel <channel>", "Update channel: stable, beta, or dev").option("--json", "Output results as JSON").option("--no-restart", "Skip gateway restart after a successful update").addHelpText("after", formatExamples([
13
14
  "xopc update",
14
15
  "xopc update --check",
15
16
  "xopc update --channel beta",
@@ -25,50 +26,51 @@ function createUpdateCommand(_ctx) {
25
26
  }
26
27
  })();
27
28
  const channel = normalizeUpdateChannel(fromCli ?? fromConfig) ?? "stable";
28
- const root = await resolvePackageRoot();
29
- if (root) {
30
- if (await detectInstallKind(root) === "git") {
31
- const message = "Running from a git checkout. Use `git pull` to update instead.";
29
+ const surface = await resolveUpdateInstallSurface({
30
+ cwd: process.cwd(),
31
+ argv1: process.argv[1]
32
+ });
33
+ if (options.check) {
34
+ if (surface.kind === "git") {
35
+ const message = "Git checkout detected. Run `xopc update` to pull/rebase and build.";
32
36
  if (options.json) console.log(JSON.stringify({
33
- status: "skipped",
34
- reason: "git-checkout",
37
+ status: "git-checkout",
38
+ mode: "git",
35
39
  message
36
40
  }));
37
41
  else console.log(message);
38
42
  return;
39
43
  }
40
- }
41
- if (!options.json) console.log(`Checking for updates (channel: ${channel})...`);
42
- const resolved = await resolveNpmChannelTag({ channel });
43
- if (!resolved.version) {
44
- const message = "Could not reach npm registry. Check your network connection.";
45
- if (options.json) console.log(JSON.stringify({
46
- status: "error",
47
- reason: "registry-unreachable",
48
- message
49
- }));
50
- else console.error(message);
51
- process.exit(1);
52
- }
53
- const comparison = compareSemver(PACKAGE_VERSION, resolved.version);
54
- if (comparison === null || comparison >= 0) {
55
- const message = `Already up to date: v${PACKAGE_VERSION} (${resolved.tag}: v${resolved.version})`;
56
- if (options.json) console.log(JSON.stringify({
57
- status: "up-to-date",
58
- currentVersion: PACKAGE_VERSION,
59
- latestVersion: resolved.version,
60
- channel: resolved.tag
61
- }));
62
- else console.log(`✅ ${message}`);
63
- return;
64
- }
65
- if (options.check) {
44
+ const resolved = await resolveNpmChannelTag({ channel });
45
+ if (!resolved.version) {
46
+ const message = "Could not reach npm registry. Check your network connection.";
47
+ if (options.json) console.log(JSON.stringify({
48
+ status: "error",
49
+ reason: "registry-unreachable",
50
+ message
51
+ }));
52
+ else console.error(message);
53
+ process.exit(1);
54
+ }
55
+ const comparison = compareSemver(PACKAGE_VERSION, resolved.version);
56
+ if (comparison === null || comparison >= 0) {
57
+ const message = `Already up to date: v${PACKAGE_VERSION} (${resolved.tag}: v${resolved.version})`;
58
+ if (options.json) console.log(JSON.stringify({
59
+ status: "up-to-date",
60
+ currentVersion: PACKAGE_VERSION,
61
+ latestVersion: resolved.version,
62
+ channel: resolved.tag
63
+ }));
64
+ else console.log(`✅ ${message}`);
65
+ return;
66
+ }
66
67
  const message = `Update available: v${PACKAGE_VERSION} → v${resolved.version} (${resolved.tag})`;
67
68
  if (options.json) console.log(JSON.stringify({
68
69
  status: "update-available",
69
70
  currentVersion: PACKAGE_VERSION,
70
71
  latestVersion: resolved.version,
71
- channel: resolved.tag
72
+ channel: resolved.tag,
73
+ installSurface: surface.kind
72
74
  }));
73
75
  else {
74
76
  console.log(`📦 ${message}`);
@@ -79,17 +81,13 @@ function createUpdateCommand(_ctx) {
79
81
  if (!options.yes && !process.env.XOPC_AUTO_UPDATE) {
80
82
  const { confirm } = await import("@inquirer/prompts");
81
83
  if (!await confirm({
82
- message: `Update from v${PACKAGE_VERSION} to v${resolved.version} (${resolved.tag})?`,
84
+ message: surface.kind === "git" ? `Update git checkout via ${channel} channel?` : `Update from v${PACKAGE_VERSION} (${channel})?`,
83
85
  default: true
84
86
  })) {
85
87
  console.log("Update cancelled.");
86
88
  return;
87
89
  }
88
90
  }
89
- const packageManager = await resolveGlobalManager({ root });
90
- const spec = resolveGlobalInstallSpec({ version: resolved.version });
91
- if (!options.json) console.log(`Installing ${spec} via ${packageManager}...`);
92
- const { acquireUpdateLock } = await import("../../infra/update-lock.js");
93
91
  const lock = process.env.XOPC_AUTO_UPDATE ? { release: async () => {} } : await acquireUpdateLock("cli");
94
92
  if (!lock) {
95
93
  const message = "Another update is already in progress. Try again later.";
@@ -101,50 +99,59 @@ function createUpdateCommand(_ctx) {
101
99
  else console.error(`❌ ${message}`);
102
100
  process.exit(1);
103
101
  }
104
- let installResult;
105
102
  try {
106
- installResult = await runGlobalPackageInstall({
107
- manager: packageManager,
108
- spec,
109
- pkgRoot: root,
110
- echoToTerminal: !options.json
111
- });
112
- } finally {
113
- await lock.release();
114
- }
115
- if (installResult.exitCode === 0) if (options.json) console.log(JSON.stringify({
116
- status: "ok",
117
- previousVersion: PACKAGE_VERSION,
118
- installedVersion: resolved.version,
119
- channel: resolved.tag,
120
- packageManager: installResult.packageManager
121
- }));
122
- else {
123
- console.log(`✅ Updated to v${resolved.version}`);
124
- console.log("Restart the gateway to use the new version: xopc gateway restart");
125
- }
126
- else {
127
- const message = formatGlobalInstallFailure({
128
- packageManager: installResult.packageManager,
129
- spec,
130
- exitCode: installResult.exitCode,
131
- stderr: installResult.stderr,
132
- usedFallback: installResult.usedFallback
103
+ if (!options.json) console.log(`Running update (channel: ${channel}, surface: ${surface.kind})...`);
104
+ const result = await runGatewayUpdateWithPostSteps({
105
+ channel,
106
+ cwd: process.cwd(),
107
+ argv1: process.argv[1],
108
+ shouldRestart: options.restart !== false,
109
+ progress: options.json ? void 0 : {
110
+ onStepStart: (step) => {
111
+ console.log(`→ [${step.index + 1}/${step.total}] ${step.name}`);
112
+ },
113
+ onStepComplete: (step) => {
114
+ if (step.exitCode !== 0 && step.stderrTail) console.error(step.stderrTail);
115
+ }
116
+ }
133
117
  });
118
+ const apiResult = formatUpdateApiResult(result, channel);
119
+ if (result.status === "ok") {
120
+ if (options.json) console.log(JSON.stringify(apiResult));
121
+ else {
122
+ console.log(`✅ Updated to v${result.after?.version ?? "unknown"} (${result.mode})`);
123
+ const updatedExt = (result.postUpdate?.extensions?.outcomes ?? []).filter((o) => o.status === "updated");
124
+ if (updatedExt.length > 0) console.log(`Extensions synced: ${updatedExt.map((o) => o.extensionId).join(", ")}`);
125
+ const restart = result.postUpdate?.restart;
126
+ if (restart?.ok && restart.mode !== "skipped") console.log(`Gateway restart: ${restart.message ?? restart.mode}`);
127
+ else if (!restart?.ok) console.log(restart?.message ?? "Restart the gateway to use the new version: xopc gateway restart");
128
+ }
129
+ return;
130
+ }
131
+ if (result.status === "skipped") {
132
+ if (options.json) console.log(JSON.stringify({
133
+ status: "skipped",
134
+ reason: result.reason,
135
+ ...apiResult
136
+ }));
137
+ else if (result.reason === "up-to-date") console.log(`✅ Already up to date: v${PACKAGE_VERSION}`);
138
+ else if (result.reason === "dirty") {
139
+ console.error("❌ Git working tree has uncommitted changes. Commit or stash first.");
140
+ process.exit(1);
141
+ } else console.log(`Update skipped: ${result.reason ?? "unknown"}`);
142
+ return;
143
+ }
144
+ const message = typeof apiResult.message === "string" ? apiResult.message : result.reason ?? "Update failed";
134
145
  if (options.json) console.log(JSON.stringify({
135
146
  status: "error",
136
- reason: "install-failed",
137
- exitCode: installResult.exitCode,
138
- packageManager: installResult.packageManager,
139
- usedFallback: installResult.usedFallback,
140
- stderrTail: installResult.stderr.trim().slice(-4e3) || void 0,
141
- message
147
+ reason: result.reason,
148
+ message,
149
+ ...apiResult
142
150
  }));
143
- else {
144
- console.error(`❌ Update failed (exit code ${installResult.exitCode})`);
145
- console.error(message);
146
- }
151
+ else console.error(`❌ Update failed: ${message}`);
147
152
  process.exit(1);
153
+ } finally {
154
+ await lock.release();
148
155
  }
149
156
  });
150
157
  }
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","names":[],"sources":["../../../../src/cli/commands/update.ts"],"sourcesContent":["// src/cli/commands/update.ts\n\nimport { Command } from 'commander';\n\nimport { loadConfig } from '../../config/index.js';\nimport {\n formatGlobalInstallFailure,\n resolveGlobalInstallSpec,\n resolveGlobalManager,\n runGlobalPackageInstall,\n} from '../../infra/update-global.js';\nimport { normalizeUpdateChannel, DEFAULT_PACKAGE_CHANNEL } from '../../infra/update-channels.js';\nimport {\n resolveNpmChannelTag,\n compareSemver,\n detectInstallKind,\n resolvePackageRoot,\n} from '../../infra/update-check.js';\nimport { PACKAGE_VERSION } from '../../package-version.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\n\nfunction createUpdateCommand(_ctx: CLIContext): Command {\n return new Command('update')\n .description('Check for and install xopc updates')\n .option('--check', 'Only check for updates without installing')\n .option('--yes', 'Skip confirmation prompts')\n .option('--channel <channel>', 'Update channel: stable, beta, or dev (default: from config, else stable)')\n .option('--json', 'Output results as JSON')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc update',\n 'xopc update --check',\n 'xopc update --channel beta',\n 'xopc update --yes',\n 'xopc update --json',\n ]),\n )\n .action(\n async (options: { check?: boolean; yes?: boolean; channel?: string; json?: boolean }) => {\n const fromCli = options.channel;\n const fromConfig = (() => {\n try {\n return loadConfig().update?.channel;\n } catch {\n return undefined;\n }\n })();\n const channel = normalizeUpdateChannel(fromCli ?? fromConfig) ?? DEFAULT_PACKAGE_CHANNEL;\n\n const root = await resolvePackageRoot();\n if (root) {\n const installKind = await detectInstallKind(root);\n if (installKind === 'git') {\n const message = 'Running from a git checkout. Use `git pull` to update instead.';\n if (options.json) {\n console.log(JSON.stringify({ status: 'skipped', reason: 'git-checkout', message }));\n } else {\n console.log(message);\n }\n return;\n }\n }\n\n if (!options.json) {\n console.log(`Checking for updates (channel: ${channel})...`);\n }\n\n const resolved = await resolveNpmChannelTag({ channel });\n if (!resolved.version) {\n const message = 'Could not reach npm registry. Check your network connection.';\n if (options.json) {\n console.log(JSON.stringify({ status: 'error', reason: 'registry-unreachable', message }));\n } else {\n console.error(message);\n }\n process.exit(1);\n }\n\n const comparison = compareSemver(PACKAGE_VERSION, resolved.version);\n if (comparison === null || comparison >= 0) {\n const message = `Already up to date: v${PACKAGE_VERSION} (${resolved.tag}: v${resolved.version})`;\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'up-to-date',\n currentVersion: PACKAGE_VERSION,\n latestVersion: resolved.version,\n channel: resolved.tag,\n }),\n );\n } else {\n console.log(`✅ ${message}`);\n }\n return;\n }\n\n if (options.check) {\n const message = `Update available: v${PACKAGE_VERSION} → v${resolved.version} (${resolved.tag})`;\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'update-available',\n currentVersion: PACKAGE_VERSION,\n latestVersion: resolved.version,\n channel: resolved.tag,\n }),\n );\n } else {\n console.log(`📦 ${message}`);\n console.log('Run `xopc update` to install.');\n }\n return;\n }\n\n if (!options.yes && !process.env.XOPC_AUTO_UPDATE) {\n const { confirm } = await import('@inquirer/prompts');\n const shouldUpdate = await confirm({\n message: `Update from v${PACKAGE_VERSION} to v${resolved.version} (${resolved.tag})?`,\n default: true,\n });\n if (!shouldUpdate) {\n console.log('Update cancelled.');\n return;\n }\n }\n\n const packageManager = await resolveGlobalManager({ root });\n const spec = resolveGlobalInstallSpec({ version: resolved.version });\n\n if (!options.json) {\n console.log(`Installing ${spec} via ${packageManager}...`);\n }\n\n const { acquireUpdateLock } = await import('../../infra/update-lock.js');\n const lock = process.env.XOPC_AUTO_UPDATE\n ? { release: async () => {} }\n : await acquireUpdateLock('cli');\n if (!lock) {\n const message = 'Another update is already in progress. Try again later.';\n if (options.json) {\n console.log(JSON.stringify({ status: 'error', reason: 'lock-held', message }));\n } else {\n console.error(`❌ ${message}`);\n }\n process.exit(1);\n }\n\n let installResult: Awaited<ReturnType<typeof runGlobalPackageInstall>>;\n try {\n installResult = await runGlobalPackageInstall({\n manager: packageManager,\n spec,\n pkgRoot: root,\n echoToTerminal: !options.json,\n });\n } finally {\n await lock.release();\n }\n\n if (installResult.exitCode === 0) {\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'ok',\n previousVersion: PACKAGE_VERSION,\n installedVersion: resolved.version,\n channel: resolved.tag,\n packageManager: installResult.packageManager,\n }),\n );\n } else {\n console.log(`✅ Updated to v${resolved.version}`);\n console.log('Restart the gateway to use the new version: xopc gateway restart');\n }\n } else {\n const message = formatGlobalInstallFailure({\n packageManager: installResult.packageManager,\n spec,\n exitCode: installResult.exitCode,\n stderr: installResult.stderr,\n usedFallback: installResult.usedFallback,\n });\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'error',\n reason: 'install-failed',\n exitCode: installResult.exitCode,\n packageManager: installResult.packageManager,\n usedFallback: installResult.usedFallback,\n stderrTail: installResult.stderr.trim().slice(-4000) || undefined,\n message,\n }),\n );\n } else {\n console.error(`❌ Update failed (exit code ${installResult.exitCode})`);\n console.error(message);\n }\n process.exit(1);\n }\n },\n );\n}\n\nregister({\n id: 'update',\n name: 'update',\n description: 'Check for and install xopc updates',\n factory: createUpdateCommand,\n metadata: {\n category: 'maintenance',\n examples: [\n 'xopc update',\n 'xopc update --check',\n 'xopc update --channel beta',\n 'xopc update --yes --json',\n ],\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"update.js","names":[],"sources":["../../../../src/cli/commands/update.ts"],"sourcesContent":["// src/cli/commands/update.ts\n\nimport { Command } from 'commander';\n\nimport { loadConfig } from '../../config/index.js';\nimport { acquireUpdateLock } from '../../infra/update-lock.js';\nimport { normalizeUpdateChannel, DEFAULT_PACKAGE_CHANNEL } from '../../infra/update-channels.js';\nimport {\n resolveNpmChannelTag,\n compareSemver,\n} from '../../infra/update-check.js';\nimport {\n formatUpdateApiResult,\n resolveUpdateInstallSurface,\n runGatewayUpdateWithPostSteps,\n} from '../../infra/update-runner.js';\nimport { PACKAGE_VERSION } from '../../package-version.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\n\nfunction createUpdateCommand(_ctx: CLIContext): Command {\n return new Command('update')\n .description('Check for and install xopc updates')\n .option('--check', 'Only check for updates without installing')\n .option('--yes', 'Skip confirmation prompts')\n .option('--channel <channel>', 'Update channel: stable, beta, or dev')\n .option('--json', 'Output results as JSON')\n .option('--no-restart', 'Skip gateway restart after a successful update')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc update',\n 'xopc update --check',\n 'xopc update --channel beta',\n 'xopc update --yes',\n 'xopc update --json',\n ]),\n )\n .action(\n async (options: {\n check?: boolean;\n yes?: boolean;\n channel?: string;\n json?: boolean;\n restart?: boolean;\n }) => {\n const fromCli = options.channel;\n const fromConfig = (() => {\n try {\n return loadConfig().update?.channel;\n } catch {\n return undefined;\n }\n })();\n const channel = normalizeUpdateChannel(fromCli ?? fromConfig) ?? DEFAULT_PACKAGE_CHANNEL;\n\n const surface = await resolveUpdateInstallSurface({\n cwd: process.cwd(),\n argv1: process.argv[1],\n });\n\n if (options.check) {\n if (surface.kind === 'git') {\n const message = 'Git checkout detected. Run `xopc update` to pull/rebase and build.';\n if (options.json) {\n console.log(JSON.stringify({ status: 'git-checkout', mode: 'git', message }));\n } else {\n console.log(message);\n }\n return;\n }\n\n const resolved = await resolveNpmChannelTag({ channel });\n if (!resolved.version) {\n const message = 'Could not reach npm registry. Check your network connection.';\n if (options.json) {\n console.log(JSON.stringify({ status: 'error', reason: 'registry-unreachable', message }));\n } else {\n console.error(message);\n }\n process.exit(1);\n }\n\n const comparison = compareSemver(PACKAGE_VERSION, resolved.version);\n if (comparison === null || comparison >= 0) {\n const message = `Already up to date: v${PACKAGE_VERSION} (${resolved.tag}: v${resolved.version})`;\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'up-to-date',\n currentVersion: PACKAGE_VERSION,\n latestVersion: resolved.version,\n channel: resolved.tag,\n }),\n );\n } else {\n console.log(`✅ ${message}`);\n }\n return;\n }\n\n const message = `Update available: v${PACKAGE_VERSION} → v${resolved.version} (${resolved.tag})`;\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'update-available',\n currentVersion: PACKAGE_VERSION,\n latestVersion: resolved.version,\n channel: resolved.tag,\n installSurface: surface.kind,\n }),\n );\n } else {\n console.log(`📦 ${message}`);\n console.log('Run `xopc update` to install.');\n }\n return;\n }\n\n if (!options.yes && !process.env.XOPC_AUTO_UPDATE) {\n const { confirm } = await import('@inquirer/prompts');\n const label =\n surface.kind === 'git'\n ? `Update git checkout via ${channel} channel?`\n : `Update from v${PACKAGE_VERSION} (${channel})?`;\n const shouldUpdate = await confirm({ message: label, default: true });\n if (!shouldUpdate) {\n console.log('Update cancelled.');\n return;\n }\n }\n\n const lock = process.env.XOPC_AUTO_UPDATE\n ? { release: async () => {} }\n : await acquireUpdateLock('cli');\n if (!lock) {\n const message = 'Another update is already in progress. Try again later.';\n if (options.json) {\n console.log(JSON.stringify({ status: 'error', reason: 'lock-held', message }));\n } else {\n console.error(`❌ ${message}`);\n }\n process.exit(1);\n }\n\n try {\n if (!options.json) {\n console.log(`Running update (channel: ${channel}, surface: ${surface.kind})...`);\n }\n\n const result = await runGatewayUpdateWithPostSteps({\n channel,\n cwd: process.cwd(),\n argv1: process.argv[1],\n shouldRestart: options.restart !== false,\n progress: options.json\n ? undefined\n : {\n onStepStart: (step) => {\n console.log(`→ [${step.index + 1}/${step.total}] ${step.name}`);\n },\n onStepComplete: (step) => {\n if (step.exitCode !== 0 && step.stderrTail) {\n console.error(step.stderrTail);\n }\n },\n },\n });\n\n const apiResult = formatUpdateApiResult(result, channel);\n if (result.status === 'ok') {\n if (options.json) {\n console.log(JSON.stringify(apiResult));\n } else {\n console.log(`✅ Updated to v${result.after?.version ?? 'unknown'} (${result.mode})`);\n const extOutcomes = result.postUpdate?.extensions?.outcomes ?? [];\n const updatedExt = extOutcomes.filter((o) => o.status === 'updated');\n if (updatedExt.length > 0) {\n console.log(`Extensions synced: ${updatedExt.map((o) => o.extensionId).join(', ')}`);\n }\n const restart = result.postUpdate?.restart;\n if (restart?.ok && restart.mode !== 'skipped') {\n console.log(`Gateway restart: ${restart.message ?? restart.mode}`);\n } else if (!restart?.ok) {\n console.log(\n restart?.message ??\n 'Restart the gateway to use the new version: xopc gateway restart',\n );\n }\n }\n return;\n }\n\n if (result.status === 'skipped') {\n if (options.json) {\n console.log(JSON.stringify({ status: 'skipped', reason: result.reason, ...apiResult }));\n } else if (result.reason === 'up-to-date') {\n console.log(`✅ Already up to date: v${PACKAGE_VERSION}`);\n } else if (result.reason === 'dirty') {\n console.error('❌ Git working tree has uncommitted changes. Commit or stash first.');\n process.exit(1);\n } else {\n console.log(`Update skipped: ${result.reason ?? 'unknown'}`);\n }\n return;\n }\n\n const message =\n typeof apiResult.message === 'string'\n ? apiResult.message\n : result.reason ?? 'Update failed';\n if (options.json) {\n console.log(JSON.stringify({ status: 'error', reason: result.reason, message, ...apiResult }));\n } else {\n console.error(`❌ Update failed: ${message}`);\n }\n process.exit(1);\n } finally {\n await lock.release();\n }\n },\n );\n}\n\nregister({\n id: 'update',\n name: 'update',\n description: 'Check for and install xopc updates',\n factory: createUpdateCommand,\n metadata: {\n category: 'maintenance',\n examples: [\n 'xopc update',\n 'xopc update --check',\n 'xopc update --channel beta',\n 'xopc update --yes --json',\n ],\n },\n});\n"],"mappings":"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"}
@@ -2,14 +2,15 @@
2
2
  * Mutate `agents.list` / bindings when adding or removing agents.
3
3
  */
4
4
  import type { Config } from '../config/schema.js';
5
+ import type { LocalizedText } from '../config/localized-text.js';
5
6
  import { listAgentEntries } from '../agent/agent-scope.js';
6
7
  type AgentEntry = NonNullable<NonNullable<Config['agents']>['list']>[number];
7
8
  export { listAgentEntries };
8
9
  export declare function findAgentEntryIndex(list: AgentEntry[], agentId: string): number;
9
10
  export declare function applyAgentConfig(cfg: Config, params: {
10
11
  agentId: string;
11
- name?: string;
12
- description?: string;
12
+ name?: LocalizedText;
13
+ description?: LocalizedText;
13
14
  workspace?: string;
14
15
  agentDir?: string;
15
16
  model?: string;
@@ -1,3 +1,4 @@
1
+ import { init_localized_text, normalizeLocalizedText } from "../config/localized-text.js";
1
2
  import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentHomeDir, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agent/agent-scope.js";
2
3
  import { existsSync } from "node:fs";
3
4
  import { rm } from "node:fs/promises";
@@ -5,6 +6,7 @@ import { rm } from "node:fs/promises";
5
6
  /**
6
7
  * Mutate `agents.list` / bindings when adding or removing agents.
7
8
  */
9
+ init_localized_text();
8
10
  init_agent_scope();
9
11
  function findAgentEntryIndex(list, agentId) {
10
12
  const id = normalizeAgentId(agentId);
@@ -12,7 +14,8 @@ function findAgentEntryIndex(list, agentId) {
12
14
  }
13
15
  function applyAgentConfig(cfg, params) {
14
16
  const agentId = normalizeAgentId(params.agentId);
15
- const name = params.name?.trim();
17
+ const name = normalizeLocalizedText(params.name);
18
+ const description = normalizeLocalizedText(params.description);
16
19
  const list = listAgentEntries(cfg);
17
20
  const index = findAgentEntryIndex(list, agentId);
18
21
  const base = index >= 0 ? list[index] : {
@@ -23,7 +26,7 @@ function applyAgentConfig(cfg, params) {
23
26
  ...base,
24
27
  enabled: base.enabled ?? true,
25
28
  ...name ? { name } : {},
26
- ...params.description?.trim() ? { description: params.description.trim() } : {},
29
+ ...description ? { description } : {},
27
30
  ...params.workspace ? { workspace: params.workspace } : {},
28
31
  ...params.agentDir ? { agentDir: params.agentDir } : {},
29
32
  ...params.model ? { model: { primary: params.model } } : {}
@@ -1 +1 @@
1
- {"version":3,"file":"agents.config.js","names":[],"sources":["../../../src/commands/agents.config.ts"],"sourcesContent":["/**\n * Mutate `agents.list` / bindings when adding or removing agents.\n */\n\nimport { rm } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\n\nimport type { Config } from '../config/schema.js';\nimport {\n listAgentEntries,\n normalizeAgentId,\n resolveAgentHomeDir,\n resolveAgentWorkspaceDir,\n resolveDefaultAgentId,\n DEFAULT_AGENT_ID,\n} from '../agent/agent-scope.js';\n\ntype AgentEntry = NonNullable<NonNullable<Config['agents']>['list']>[number];\n\nexport { listAgentEntries };\n\nexport function findAgentEntryIndex(list: AgentEntry[], agentId: string): number {\n const id = normalizeAgentId(agentId);\n return list.findIndex((e) => normalizeAgentId(e.id) === id);\n}\n\nexport function applyAgentConfig(\n cfg: Config,\n params: {\n agentId: string;\n name?: string;\n description?: string;\n workspace?: string;\n agentDir?: string;\n model?: string;\n },\n): Config {\n const agentId = normalizeAgentId(params.agentId);\n const name = params.name?.trim();\n const list = listAgentEntries(cfg);\n const index = findAgentEntryIndex(list, agentId);\n const base = index >= 0 ? list[index] : { id: agentId, enabled: true as const };\n const nextEntry: AgentEntry = {\n ...base,\n enabled: base.enabled ?? true,\n ...(name ? { name } : {}),\n ...(params.description?.trim() ? { description: params.description.trim() } : {}),\n ...(params.workspace ? { workspace: params.workspace } : {}),\n ...(params.agentDir ? { agentDir: params.agentDir } : {}),\n ...(params.model ? { model: { primary: params.model } } : {}),\n };\n const nextList = [...list];\n if (index >= 0) {\n nextList[index] = nextEntry;\n } else {\n if (nextList.length === 0 && agentId !== normalizeAgentId(resolveDefaultAgentId(cfg))) {\n nextList.push({ id: resolveDefaultAgentId(cfg), enabled: true });\n }\n nextList.push(nextEntry);\n }\n return {\n ...cfg,\n agents: {\n ...cfg.agents,\n list: nextList,\n },\n };\n}\n\nexport function pruneAgentConfig(\n cfg: Config,\n agentId: string,\n): { config: Config; removedBindings: number } {\n const id = normalizeAgentId(agentId);\n const agents = listAgentEntries(cfg);\n const nextAgentsList = agents.filter((e) => normalizeAgentId(e.id) !== id);\n const nextAgents = nextAgentsList.length > 0 ? nextAgentsList : undefined;\n\n const bindings = cfg.bindings ?? [];\n const filteredBindings = bindings.filter((b) => normalizeAgentId(b.agentId) !== id);\n\n return {\n config: {\n ...cfg,\n agents: nextAgents ? { ...cfg.agents, list: nextAgents } : { ...cfg.agents, list: undefined },\n bindings: filteredBindings,\n },\n removedBindings: bindings.length - filteredBindings.length,\n };\n}\n\nexport async function removeAgentDirsFromDisk(cfg: Config, id: string): Promise<void> {\n const aid = normalizeAgentId(id);\n if (aid === DEFAULT_AGENT_ID) {\n throw new Error('Refusing to delete the main agent home on disk from this command.');\n }\n const home = resolveAgentHomeDir(cfg, aid);\n const ws = resolveAgentWorkspaceDir(cfg, aid);\n if (existsSync(home)) {\n await rm(home, { recursive: true, force: true });\n }\n if (existsSync(ws) && ws !== home) {\n await rm(ws, { recursive: true, force: true });\n }\n}\n"],"mappings":";;;;;;;kBAeiC;AAMjC,SAAgB,oBAAoB,MAAoB,SAAyB;CAC/E,MAAM,KAAK,iBAAiB,QAAQ;AACpC,QAAO,KAAK,WAAW,MAAM,iBAAiB,EAAE,GAAG,KAAK,GAAG;;AAG7D,SAAgB,iBACd,KACA,QAQQ;CACR,MAAM,UAAU,iBAAiB,OAAO,QAAQ;CAChD,MAAM,OAAO,OAAO,MAAM,MAAM;CAChC,MAAM,OAAO,iBAAiB,IAAI;CAClC,MAAM,QAAQ,oBAAoB,MAAM,QAAQ;CAChD,MAAM,OAAO,SAAS,IAAI,KAAK,SAAS;EAAE,IAAI;EAAS,SAAS;EAAe;CAC/E,MAAM,YAAwB;EAC5B,GAAG;EACH,SAAS,KAAK,WAAW;EACzB,GAAI,OAAO,EAAE,MAAM,GAAG,EAAE;EACxB,GAAI,OAAO,aAAa,MAAM,GAAG,EAAE,aAAa,OAAO,YAAY,MAAM,EAAE,GAAG,EAAE;EAChF,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,WAAW,GAAG,EAAE;EAC3D,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,UAAU,GAAG,EAAE;EACxD,GAAI,OAAO,QAAQ,EAAE,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,GAAG,EAAE;EAC7D;CACD,MAAM,WAAW,CAAC,GAAG,KAAK;AAC1B,KAAI,SAAS,EACX,UAAS,SAAS;MACb;AACL,MAAI,SAAS,WAAW,KAAK,YAAY,iBAAiB,sBAAsB,IAAI,CAAC,CACnF,UAAS,KAAK;GAAE,IAAI,sBAAsB,IAAI;GAAE,SAAS;GAAM,CAAC;AAElE,WAAS,KAAK,UAAU;;AAE1B,QAAO;EACL,GAAG;EACH,QAAQ;GACN,GAAG,IAAI;GACP,MAAM;GACP;EACF;;AAGH,SAAgB,iBACd,KACA,SAC6C;CAC7C,MAAM,KAAK,iBAAiB,QAAQ;CAEpC,MAAM,iBADS,iBAAiB,IACH,CAAC,QAAQ,MAAM,iBAAiB,EAAE,GAAG,KAAK,GAAG;CAC1E,MAAM,aAAa,eAAe,SAAS,IAAI,iBAAiB,KAAA;CAEhE,MAAM,WAAW,IAAI,YAAY,EAAE;CACnC,MAAM,mBAAmB,SAAS,QAAQ,MAAM,iBAAiB,EAAE,QAAQ,KAAK,GAAG;AAEnF,QAAO;EACL,QAAQ;GACN,GAAG;GACH,QAAQ,aAAa;IAAE,GAAG,IAAI;IAAQ,MAAM;IAAY,GAAG;IAAE,GAAG,IAAI;IAAQ,MAAM,KAAA;IAAW;GAC7F,UAAU;GACX;EACD,iBAAiB,SAAS,SAAS,iBAAiB;EACrD;;AAGH,eAAsB,wBAAwB,KAAa,IAA2B;CACpF,MAAM,MAAM,iBAAiB,GAAG;AAChC,KAAI,QAAA,OACF,OAAM,IAAI,MAAM,oEAAoE;CAEtF,MAAM,OAAO,oBAAoB,KAAK,IAAI;CAC1C,MAAM,KAAK,yBAAyB,KAAK,IAAI;AAC7C,KAAI,WAAW,KAAK,CAClB,OAAM,GAAG,MAAM;EAAE,WAAW;EAAM,OAAO;EAAM,CAAC;AAElD,KAAI,WAAW,GAAG,IAAI,OAAO,KAC3B,OAAM,GAAG,IAAI;EAAE,WAAW;EAAM,OAAO;EAAM,CAAC"}
1
+ {"version":3,"file":"agents.config.js","names":[],"sources":["../../../src/commands/agents.config.ts"],"sourcesContent":["/**\n * Mutate `agents.list` / bindings when adding or removing agents.\n */\n\nimport { rm } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\n\nimport type { Config } from '../config/schema.js';\nimport type { LocalizedText } from '../config/localized-text.js';\nimport { normalizeLocalizedText } from '../config/localized-text.js';\nimport {\n listAgentEntries,\n normalizeAgentId,\n resolveAgentHomeDir,\n resolveAgentWorkspaceDir,\n resolveDefaultAgentId,\n DEFAULT_AGENT_ID,\n} from '../agent/agent-scope.js';\n\ntype AgentEntry = NonNullable<NonNullable<Config['agents']>['list']>[number];\n\nexport { listAgentEntries };\n\nexport function findAgentEntryIndex(list: AgentEntry[], agentId: string): number {\n const id = normalizeAgentId(agentId);\n return list.findIndex((e) => normalizeAgentId(e.id) === id);\n}\n\nexport function applyAgentConfig(\n cfg: Config,\n params: {\n agentId: string;\n name?: LocalizedText;\n description?: LocalizedText;\n workspace?: string;\n agentDir?: string;\n model?: string;\n },\n): Config {\n const agentId = normalizeAgentId(params.agentId);\n const name = normalizeLocalizedText(params.name);\n const description = normalizeLocalizedText(params.description);\n const list = listAgentEntries(cfg);\n const index = findAgentEntryIndex(list, agentId);\n const base = index >= 0 ? list[index] : { id: agentId, enabled: true as const };\n const nextEntry: AgentEntry = {\n ...base,\n enabled: base.enabled ?? true,\n ...(name ? { name } : {}),\n ...(description ? { description } : {}),\n ...(params.workspace ? { workspace: params.workspace } : {}),\n ...(params.agentDir ? { agentDir: params.agentDir } : {}),\n ...(params.model ? { model: { primary: params.model } } : {}),\n };\n const nextList = [...list];\n if (index >= 0) {\n nextList[index] = nextEntry;\n } else {\n if (nextList.length === 0 && agentId !== normalizeAgentId(resolveDefaultAgentId(cfg))) {\n nextList.push({ id: resolveDefaultAgentId(cfg), enabled: true });\n }\n nextList.push(nextEntry);\n }\n return {\n ...cfg,\n agents: {\n ...cfg.agents,\n list: nextList,\n },\n };\n}\n\nexport function pruneAgentConfig(\n cfg: Config,\n agentId: string,\n): { config: Config; removedBindings: number } {\n const id = normalizeAgentId(agentId);\n const agents = listAgentEntries(cfg);\n const nextAgentsList = agents.filter((e) => normalizeAgentId(e.id) !== id);\n const nextAgents = nextAgentsList.length > 0 ? nextAgentsList : undefined;\n\n const bindings = cfg.bindings ?? [];\n const filteredBindings = bindings.filter((b) => normalizeAgentId(b.agentId) !== id);\n\n return {\n config: {\n ...cfg,\n agents: nextAgents ? { ...cfg.agents, list: nextAgents } : { ...cfg.agents, list: undefined },\n bindings: filteredBindings,\n },\n removedBindings: bindings.length - filteredBindings.length,\n };\n}\n\nexport async function removeAgentDirsFromDisk(cfg: Config, id: string): Promise<void> {\n const aid = normalizeAgentId(id);\n if (aid === DEFAULT_AGENT_ID) {\n throw new Error('Refusing to delete the main agent home on disk from this command.');\n }\n const home = resolveAgentHomeDir(cfg, aid);\n const ws = resolveAgentWorkspaceDir(cfg, aid);\n if (existsSync(home)) {\n await rm(home, { recursive: true, force: true });\n }\n if (existsSync(ws) && ws !== home) {\n await rm(ws, { recursive: true, force: true });\n }\n}\n"],"mappings":";;;;;;;;qBASqE;kBAQpC;AAMjC,SAAgB,oBAAoB,MAAoB,SAAyB;CAC/E,MAAM,KAAK,iBAAiB,QAAQ;AACpC,QAAO,KAAK,WAAW,MAAM,iBAAiB,EAAE,GAAG,KAAK,GAAG;;AAG7D,SAAgB,iBACd,KACA,QAQQ;CACR,MAAM,UAAU,iBAAiB,OAAO,QAAQ;CAChD,MAAM,OAAO,uBAAuB,OAAO,KAAK;CAChD,MAAM,cAAc,uBAAuB,OAAO,YAAY;CAC9D,MAAM,OAAO,iBAAiB,IAAI;CAClC,MAAM,QAAQ,oBAAoB,MAAM,QAAQ;CAChD,MAAM,OAAO,SAAS,IAAI,KAAK,SAAS;EAAE,IAAI;EAAS,SAAS;EAAe;CAC/E,MAAM,YAAwB;EAC5B,GAAG;EACH,SAAS,KAAK,WAAW;EACzB,GAAI,OAAO,EAAE,MAAM,GAAG,EAAE;EACxB,GAAI,cAAc,EAAE,aAAa,GAAG,EAAE;EACtC,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,WAAW,GAAG,EAAE;EAC3D,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,UAAU,GAAG,EAAE;EACxD,GAAI,OAAO,QAAQ,EAAE,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,GAAG,EAAE;EAC7D;CACD,MAAM,WAAW,CAAC,GAAG,KAAK;AAC1B,KAAI,SAAS,EACX,UAAS,SAAS;MACb;AACL,MAAI,SAAS,WAAW,KAAK,YAAY,iBAAiB,sBAAsB,IAAI,CAAC,CACnF,UAAS,KAAK;GAAE,IAAI,sBAAsB,IAAI;GAAE,SAAS;GAAM,CAAC;AAElE,WAAS,KAAK,UAAU;;AAE1B,QAAO;EACL,GAAG;EACH,QAAQ;GACN,GAAG,IAAI;GACP,MAAM;GACP;EACF;;AAGH,SAAgB,iBACd,KACA,SAC6C;CAC7C,MAAM,KAAK,iBAAiB,QAAQ;CAEpC,MAAM,iBADS,iBAAiB,IACH,CAAC,QAAQ,MAAM,iBAAiB,EAAE,GAAG,KAAK,GAAG;CAC1E,MAAM,aAAa,eAAe,SAAS,IAAI,iBAAiB,KAAA;CAEhE,MAAM,WAAW,IAAI,YAAY,EAAE;CACnC,MAAM,mBAAmB,SAAS,QAAQ,MAAM,iBAAiB,EAAE,QAAQ,KAAK,GAAG;AAEnF,QAAO;EACL,QAAQ;GACN,GAAG;GACH,QAAQ,aAAa;IAAE,GAAG,IAAI;IAAQ,MAAM;IAAY,GAAG;IAAE,GAAG,IAAI;IAAQ,MAAM,KAAA;IAAW;GAC7F,UAAU;GACX;EACD,iBAAiB,SAAS,SAAS,iBAAiB;EACrD;;AAGH,eAAsB,wBAAwB,KAAa,IAA2B;CACpF,MAAM,MAAM,iBAAiB,GAAG;AAChC,KAAI,QAAA,OACF,OAAM,IAAI,MAAM,oEAAoE;CAEtF,MAAM,OAAO,oBAAoB,KAAK,IAAI;CAC1C,MAAM,KAAK,yBAAyB,KAAK,IAAI;AAC7C,KAAI,WAAW,KAAK,CAClB,OAAM,GAAG,MAAM;EAAE,WAAW;EAAM,OAAO;EAAM,CAAC;AAElD,KAAI,WAAW,GAAG,IAAI,OAAO,KAC3B,OAAM,GAAG,IAAI;EAAE,WAAW;EAAM,OAAO;EAAM,CAAC"}
@@ -1,14 +1,9 @@
1
1
  /**
2
- * Named model roles (`agents.defaults.models` / `agents.list[].models`).
3
- * Merged per agent id for workflow and other callers.
2
+ * Named model roles from `agents.defaults.models`.
4
3
  */
5
4
  import type { AgentTypedModel, Config } from './schema.js';
6
5
  export type { AgentTypedModel };
7
- /**
8
- * Merge defaults + per-agent typed models. Agent entry wins on same `id`.
9
- */
10
- export declare function mergeTypedModels(defaults?: AgentTypedModel[], entry?: AgentTypedModel[]): Map<string, AgentTypedModel>;
11
- export declare function resolveEffectiveTypedModels(config: Config, agentId: string): Map<string, AgentTypedModel>;
6
+ export declare function resolveEffectiveTypedModels(config: Config, _agentId: string): Map<string, AgentTypedModel>;
12
7
  /** Resolve a typed model id to `provider/model`, or undefined when not configured. */
13
8
  export declare function resolveTypedModelRef(config: Config, agentId: string, typeId: string): string | undefined;
14
9
  /**
@@ -1,22 +1,11 @@
1
1
  import { init_schema, parseModelRef } from "./schema.js";
2
- import { init_agent_scope, listAgentEntries } from "../agent/agent-scope.js";
3
2
  //#region src/config/agent-typed-models.ts
4
- init_agent_scope();
5
3
  init_schema();
6
- /**
7
- * Merge defaults + per-agent typed models. Agent entry wins on same `id`.
8
- */
9
- function mergeTypedModels(defaults, entry) {
4
+ function resolveEffectiveTypedModels(config, _agentId) {
10
5
  const out = /* @__PURE__ */ new Map();
11
- for (const m of defaults ?? []) out.set(m.id, m);
12
- for (const m of entry ?? []) out.set(m.id, m);
6
+ for (const modelRole of config.agents?.defaults?.models ?? []) out.set(modelRole.id, modelRole);
13
7
  return out;
14
8
  }
15
- function resolveEffectiveTypedModels(config, agentId) {
16
- const defaults = config.agents?.defaults?.models;
17
- const entry = listAgentEntries(config).find((a) => a.enabled !== false && a.id.toLowerCase() === agentId.toLowerCase())?.models;
18
- return mergeTypedModels(defaults, entry);
19
- }
20
9
  /** Resolve a typed model id to `provider/model`, or undefined when not configured. */
21
10
  function resolveTypedModelRef(config, agentId, typeId) {
22
11
  return resolveEffectiveTypedModels(config, agentId).get(typeId)?.model?.trim() || void 0;
@@ -48,6 +37,6 @@ function resolveModelRef(config, agentId, ref) {
48
37
  throw new Error("model ref must not be empty");
49
38
  }
50
39
  //#endregion
51
- export { mergeTypedModels, resolveEffectiveTypedModels, resolveModelRef, resolveTypedModelRef };
40
+ export { resolveEffectiveTypedModels, resolveModelRef, resolveTypedModelRef };
52
41
 
53
42
  //# sourceMappingURL=agent-typed-models.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-typed-models.js","names":[],"sources":["../../../src/config/agent-typed-models.ts"],"sourcesContent":["/**\n * Named model roles (`agents.defaults.models` / `agents.list[].models`).\n * Merged per agent id for workflow and other callers.\n */\n\nimport { listAgentEntries } from '../agent/agent-scope.js';\nimport type { AgentTypedModel, Config } from './schema.js';\nimport { parseModelRef } from './schema.js';\n\nexport type { AgentTypedModel };\n\n/**\n * Merge defaults + per-agent typed models. Agent entry wins on same `id`.\n */\nexport function mergeTypedModels(\n defaults?: AgentTypedModel[],\n entry?: AgentTypedModel[],\n): Map<string, AgentTypedModel> {\n const out = new Map<string, AgentTypedModel>();\n for (const m of defaults ?? []) {\n out.set(m.id, m);\n }\n for (const m of entry ?? []) {\n out.set(m.id, m);\n }\n return out;\n}\n\nexport function resolveEffectiveTypedModels(config: Config, agentId: string): Map<string, AgentTypedModel> {\n const defaults = config.agents?.defaults?.models;\n const entry = listAgentEntries(config).find(\n (a) => a.enabled !== false && a.id.toLowerCase() === agentId.toLowerCase(),\n )?.models;\n return mergeTypedModels(defaults, entry);\n}\n\n/** Resolve a typed model id to `provider/model`, or undefined when not configured. */\nexport function resolveTypedModelRef(\n config: Config,\n agentId: string,\n typeId: string,\n): string | undefined {\n const entry = resolveEffectiveTypedModels(config, agentId).get(typeId);\n const ref = entry?.model?.trim();\n return ref || undefined;\n}\n\nfunction parseModelRefInput(ref: string): { directRef?: string; typeId?: string } {\n const trimmed = ref.trim();\n if (!trimmed) {\n return {};\n }\n if (trimmed.includes('/')) {\n return { directRef: trimmed };\n }\n const typeId = trimmed.startsWith('@') ? trimmed.slice(1).trim() : trimmed;\n return typeId ? { typeId } : {};\n}\n\n/**\n * Resolve a model reference: `provider/model`, typed id (`small`), or `@small`.\n * Throws when the ref is invalid or the typed id is unknown.\n */\nexport function resolveModelRef(config: Config, agentId: string, ref: string): string {\n const { directRef, typeId } = parseModelRefInput(ref);\n if (directRef) {\n if (!parseModelRef(directRef)) {\n throw new Error(`model ref must be provider/model format (got '${directRef}')`);\n }\n return directRef;\n }\n if (typeId) {\n const resolved = resolveTypedModelRef(config, agentId, typeId);\n if (resolved) {\n return resolved;\n }\n const available = [...resolveEffectiveTypedModels(config, agentId).keys()];\n const hint =\n available.length > 0 ? ` (available: ${available.join(', ')})` : ' (none configured)';\n throw new Error(`Unknown typed model id '${typeId}' for agent '${agentId}'${hint}`);\n }\n throw new Error('model ref must not be empty');\n}\n"],"mappings":";;;kBAK2D;aAEf;;;;AAO5C,SAAgB,iBACd,UACA,OAC8B;CAC9B,MAAM,sBAAM,IAAI,KAA8B;AAC9C,MAAK,MAAM,KAAK,YAAY,EAAE,CAC5B,KAAI,IAAI,EAAE,IAAI,EAAE;AAElB,MAAK,MAAM,KAAK,SAAS,EAAE,CACzB,KAAI,IAAI,EAAE,IAAI,EAAE;AAElB,QAAO;;AAGT,SAAgB,4BAA4B,QAAgB,SAA+C;CACzG,MAAM,WAAW,OAAO,QAAQ,UAAU;CAC1C,MAAM,QAAQ,iBAAiB,OAAO,CAAC,MACpC,MAAM,EAAE,YAAY,SAAS,EAAE,GAAG,aAAa,KAAK,QAAQ,aAAa,CAC3E,EAAE;AACH,QAAO,iBAAiB,UAAU,MAAM;;;AAI1C,SAAgB,qBACd,QACA,SACA,QACoB;AAGpB,QAFc,4BAA4B,QAAQ,QAAQ,CAAC,IAAI,OAC9C,EAAE,OAAO,MAAM,IAClB,KAAA;;AAGhB,SAAS,mBAAmB,KAAsD;CAChF,MAAM,UAAU,IAAI,MAAM;AAC1B,KAAI,CAAC,QACH,QAAO,EAAE;AAEX,KAAI,QAAQ,SAAS,IAAI,CACvB,QAAO,EAAE,WAAW,SAAS;CAE/B,MAAM,SAAS,QAAQ,WAAW,IAAI,GAAG,QAAQ,MAAM,EAAE,CAAC,MAAM,GAAG;AACnE,QAAO,SAAS,EAAE,QAAQ,GAAG,EAAE;;;;;;AAOjC,SAAgB,gBAAgB,QAAgB,SAAiB,KAAqB;CACpF,MAAM,EAAE,WAAW,WAAW,mBAAmB,IAAI;AACrD,KAAI,WAAW;AACb,MAAI,CAAC,cAAc,UAAU,CAC3B,OAAM,IAAI,MAAM,iDAAiD,UAAU,IAAI;AAEjF,SAAO;;AAET,KAAI,QAAQ;EACV,MAAM,WAAW,qBAAqB,QAAQ,SAAS,OAAO;AAC9D,MAAI,SACF,QAAO;EAET,MAAM,YAAY,CAAC,GAAG,4BAA4B,QAAQ,QAAQ,CAAC,MAAM,CAAC;EAC1E,MAAM,OACJ,UAAU,SAAS,IAAI,gBAAgB,UAAU,KAAK,KAAK,CAAC,KAAK;AACnE,QAAM,IAAI,MAAM,2BAA2B,OAAO,eAAe,QAAQ,GAAG,OAAO;;AAErF,OAAM,IAAI,MAAM,8BAA8B"}
1
+ {"version":3,"file":"agent-typed-models.js","names":[],"sources":["../../../src/config/agent-typed-models.ts"],"sourcesContent":["/**\n * Named model roles from `agents.defaults.models`.\n */\n\nimport type { AgentTypedModel, Config } from './schema.js';\nimport { parseModelRef } from './schema.js';\n\nexport type { AgentTypedModel };\n\nexport function resolveEffectiveTypedModels(config: Config, _agentId: string): Map<string, AgentTypedModel> {\n const out = new Map<string, AgentTypedModel>();\n for (const modelRole of config.agents?.defaults?.models ?? []) {\n out.set(modelRole.id, modelRole);\n }\n return out;\n}\n\n/** Resolve a typed model id to `provider/model`, or undefined when not configured. */\nexport function resolveTypedModelRef(\n config: Config,\n agentId: string,\n typeId: string,\n): string | undefined {\n const entry = resolveEffectiveTypedModels(config, agentId).get(typeId);\n const ref = entry?.model?.trim();\n return ref || undefined;\n}\n\nfunction parseModelRefInput(ref: string): { directRef?: string; typeId?: string } {\n const trimmed = ref.trim();\n if (!trimmed) {\n return {};\n }\n if (trimmed.includes('/')) {\n return { directRef: trimmed };\n }\n const typeId = trimmed.startsWith('@') ? trimmed.slice(1).trim() : trimmed;\n return typeId ? { typeId } : {};\n}\n\n/**\n * Resolve a model reference: `provider/model`, typed id (`small`), or `@small`.\n * Throws when the ref is invalid or the typed id is unknown.\n */\nexport function resolveModelRef(config: Config, agentId: string, ref: string): string {\n const { directRef, typeId } = parseModelRefInput(ref);\n if (directRef) {\n if (!parseModelRef(directRef)) {\n throw new Error(`model ref must be provider/model format (got '${directRef}')`);\n }\n return directRef;\n }\n if (typeId) {\n const resolved = resolveTypedModelRef(config, agentId, typeId);\n if (resolved) {\n return resolved;\n }\n const available = [...resolveEffectiveTypedModels(config, agentId).keys()];\n const hint =\n available.length > 0 ? ` (available: ${available.join(', ')})` : ' (none configured)';\n throw new Error(`Unknown typed model id '${typeId}' for agent '${agentId}'${hint}`);\n }\n throw new Error('model ref must not be empty');\n}\n"],"mappings":";;aAK4C;AAI5C,SAAgB,4BAA4B,QAAgB,UAAgD;CAC1G,MAAM,sBAAM,IAAI,KAA8B;AAC9C,MAAK,MAAM,aAAa,OAAO,QAAQ,UAAU,UAAU,EAAE,CAC3D,KAAI,IAAI,UAAU,IAAI,UAAU;AAElC,QAAO;;;AAIT,SAAgB,qBACd,QACA,SACA,QACoB;AAGpB,QAFc,4BAA4B,QAAQ,QAAQ,CAAC,IAAI,OAC9C,EAAE,OAAO,MAAM,IAClB,KAAA;;AAGhB,SAAS,mBAAmB,KAAsD;CAChF,MAAM,UAAU,IAAI,MAAM;AAC1B,KAAI,CAAC,QACH,QAAO,EAAE;AAEX,KAAI,QAAQ,SAAS,IAAI,CACvB,QAAO,EAAE,WAAW,SAAS;CAE/B,MAAM,SAAS,QAAQ,WAAW,IAAI,GAAG,QAAQ,MAAM,EAAE,CAAC,MAAM,GAAG;AACnE,QAAO,SAAS,EAAE,QAAQ,GAAG,EAAE;;;;;;AAOjC,SAAgB,gBAAgB,QAAgB,SAAiB,KAAqB;CACpF,MAAM,EAAE,WAAW,WAAW,mBAAmB,IAAI;AACrD,KAAI,WAAW;AACb,MAAI,CAAC,cAAc,UAAU,CAC3B,OAAM,IAAI,MAAM,iDAAiD,UAAU,IAAI;AAEjF,SAAO;;AAET,KAAI,QAAQ;EACV,MAAM,WAAW,qBAAqB,QAAQ,SAAS,OAAO;AAC9D,MAAI,SACF,QAAO;EAET,MAAM,YAAY,CAAC,GAAG,4BAA4B,QAAQ,QAAQ,CAAC,MAAM,CAAC;EAC1E,MAAM,OACJ,UAAU,SAAS,IAAI,gBAAgB,UAAU,KAAK,KAAK,CAAC,KAAK;AACnE,QAAM,IAAI,MAAM,2BAA2B,OAAO,eAAe,QAAQ,GAAG,OAAO;;AAErF,OAAM,IAAI,MAAM,8BAA8B"}
@@ -0,0 +1,6 @@
1
+ import { z } from 'zod';
2
+ export type LocalizedTextMap = Record<string, string>;
3
+ export type LocalizedText = string | LocalizedTextMap;
4
+ export declare const LocalizedTextSchema: z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>;
5
+ export declare function normalizeLocalizedText(value: LocalizedText | undefined): LocalizedText | undefined;
6
+ export declare function resolveLocalizedText(value: LocalizedText | undefined, locale: string | undefined, fallbackLocale?: string): string | undefined;
@@ -0,0 +1,42 @@
1
+ import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
+ import { z } from "zod";
3
+ //#region src/config/localized-text.ts
4
+ function normalizeLocalizedText(value) {
5
+ if (typeof value === "string") {
6
+ const trimmed = value.trim();
7
+ return trimmed ? trimmed : void 0;
8
+ }
9
+ if (!value || typeof value !== "object" || Array.isArray(value)) return;
10
+ const entries = Object.entries(value).map(([locale, text]) => [locale.trim(), String(text).trim()]).filter(([locale, text]) => locale.length > 0 && text.length > 0);
11
+ if (entries.length === 0) return;
12
+ return Object.fromEntries(entries);
13
+ }
14
+ function resolveLocalizedText(value, locale, fallbackLocale = "en") {
15
+ if (typeof value === "string") return value.trim() || void 0;
16
+ if (!value || typeof value !== "object" || Array.isArray(value)) return;
17
+ const normalizedLocale = locale?.trim();
18
+ const candidates = [
19
+ normalizedLocale,
20
+ normalizedLocale?.split("-")[0],
21
+ fallbackLocale,
22
+ fallbackLocale.split("-")[0]
23
+ ].filter((candidate) => Boolean(candidate));
24
+ for (const candidate of candidates) {
25
+ const text = value[candidate]?.trim();
26
+ if (text) return text;
27
+ }
28
+ for (const text of Object.values(value)) {
29
+ const trimmed = text.trim();
30
+ if (trimmed) return trimmed;
31
+ }
32
+ }
33
+ var LOCALE_KEY_PATTERN, LocalizedTextSchema;
34
+ var init_localized_text = __esmMin((() => {
35
+ LOCALE_KEY_PATTERN = /^[a-z]{2}(?:-[A-Za-z]{2,8})?$/;
36
+ LocalizedTextSchema = z.union([z.string(), z.record(z.string().regex(LOCALE_KEY_PATTERN), z.string())]);
37
+ }));
38
+ //#endregion
39
+ init_localized_text();
40
+ export { LocalizedTextSchema, init_localized_text, normalizeLocalizedText, resolveLocalizedText };
41
+
42
+ //# sourceMappingURL=localized-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localized-text.js","names":[],"sources":["../../../src/config/localized-text.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport type LocalizedTextMap = Record<string, string>;\nexport type LocalizedText = string | LocalizedTextMap;\n\nconst LOCALE_KEY_PATTERN = /^[a-z]{2}(?:-[A-Za-z]{2,8})?$/;\n\nexport const LocalizedTextSchema = z.union([\n z.string(),\n z.record(z.string().regex(LOCALE_KEY_PATTERN), z.string()),\n]);\n\nexport function normalizeLocalizedText(value: LocalizedText | undefined): LocalizedText | undefined {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\n }\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n const entries = Object.entries(value)\n .map(([locale, text]) => [locale.trim(), String(text).trim()] as const)\n .filter(([locale, text]) => locale.length > 0 && text.length > 0);\n if (entries.length === 0) {\n return undefined;\n }\n return Object.fromEntries(entries);\n}\n\nexport function resolveLocalizedText(\n value: LocalizedText | undefined,\n locale: string | undefined,\n fallbackLocale = 'en',\n): string | undefined {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || undefined;\n }\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n\n const normalizedLocale = locale?.trim();\n const localeBase = normalizedLocale?.split('-')[0];\n const fallbackBase = fallbackLocale.split('-')[0];\n const candidates = [\n normalizedLocale,\n localeBase,\n fallbackLocale,\n fallbackBase,\n ].filter((candidate): candidate is string => Boolean(candidate));\n\n for (const candidate of candidates) {\n const text = value[candidate]?.trim();\n if (text) {\n return text;\n }\n }\n\n for (const text of Object.values(value)) {\n const trimmed = text.trim();\n if (trimmed) {\n return trimmed;\n }\n }\n return undefined;\n}\n"],"mappings":";;;AAYA,SAAgB,uBAAuB,OAA6D;AAClG,KAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,UAAU,MAAM,MAAM;AAC5B,SAAO,UAAU,UAAU,KAAA;;AAE7B,KAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D;CAEF,MAAM,UAAU,OAAO,QAAQ,MAAM,CAClC,KAAK,CAAC,QAAQ,UAAU,CAAC,OAAO,MAAM,EAAE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAU,CACtE,QAAQ,CAAC,QAAQ,UAAU,OAAO,SAAS,KAAK,KAAK,SAAS,EAAE;AACnE,KAAI,QAAQ,WAAW,EACrB;AAEF,QAAO,OAAO,YAAY,QAAQ;;AAGpC,SAAgB,qBACd,OACA,QACA,iBAAiB,MACG;AACpB,KAAI,OAAO,UAAU,SAEnB,QADgB,MAAM,MACR,IAAI,KAAA;AAEpB,KAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D;CAGF,MAAM,mBAAmB,QAAQ,MAAM;CAGvC,MAAM,aAAa;EACjB;EAHiB,kBAAkB,MAAM,IAAI,CAAC;EAK9C;EAJmB,eAAe,MAAM,IAAI,CAAC;EAM9C,CAAC,QAAQ,cAAmC,QAAQ,UAAU,CAAC;AAEhE,MAAK,MAAM,aAAa,YAAY;EAClC,MAAM,OAAO,MAAM,YAAY,MAAM;AACrC,MAAI,KACF,QAAO;;AAIX,MAAK,MAAM,QAAQ,OAAO,OAAO,MAAM,EAAE;EACvC,MAAM,UAAU,KAAK,MAAM;AAC3B,MAAI,QACF,QAAO;;;;;AAzDP,sBAAqB;AAEd,uBAAsB,EAAE,MAAM,CACzC,EAAE,QAAQ,EACV,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,mBAAmB,EAAE,EAAE,QAAQ,CAAC,CAC3D,CAAC"}
@@ -88,8 +88,8 @@ export declare const CustomModelSchema: z.ZodObject<{
88
88
  }>>;
89
89
  reasoning: z.ZodOptional<z.ZodBoolean>;
90
90
  input: z.ZodOptional<z.ZodArray<z.ZodEnum<{
91
- image: "image";
92
91
  text: "text";
92
+ image: "image";
93
93
  }>>>;
94
94
  contextWindow: z.ZodOptional<z.ZodNumber>;
95
95
  maxTokens: z.ZodOptional<z.ZodNumber>;
@@ -133,8 +133,8 @@ export declare const ModelOverrideSchema: z.ZodObject<{
133
133
  name: z.ZodOptional<z.ZodString>;
134
134
  reasoning: z.ZodOptional<z.ZodBoolean>;
135
135
  input: z.ZodOptional<z.ZodArray<z.ZodEnum<{
136
- image: "image";
137
136
  text: "text";
137
+ image: "image";
138
138
  }>>>;
139
139
  contextWindow: z.ZodOptional<z.ZodNumber>;
140
140
  maxTokens: z.ZodOptional<z.ZodNumber>;
@@ -206,8 +206,8 @@ export declare const ProviderConfigSchema: z.ZodObject<{
206
206
  }>>;
207
207
  reasoning: z.ZodOptional<z.ZodBoolean>;
208
208
  input: z.ZodOptional<z.ZodArray<z.ZodEnum<{
209
- image: "image";
210
209
  text: "text";
210
+ image: "image";
211
211
  }>>>;
212
212
  contextWindow: z.ZodOptional<z.ZodNumber>;
213
213
  maxTokens: z.ZodOptional<z.ZodNumber>;
@@ -251,8 +251,8 @@ export declare const ProviderConfigSchema: z.ZodObject<{
251
251
  name: z.ZodOptional<z.ZodString>;
252
252
  reasoning: z.ZodOptional<z.ZodBoolean>;
253
253
  input: z.ZodOptional<z.ZodArray<z.ZodEnum<{
254
- image: "image";
255
254
  text: "text";
255
+ image: "image";
256
256
  }>>>;
257
257
  contextWindow: z.ZodOptional<z.ZodNumber>;
258
258
  maxTokens: z.ZodOptional<z.ZodNumber>;
@@ -326,8 +326,8 @@ export declare const ModelsJsonSchema: z.ZodObject<{
326
326
  }>>;
327
327
  reasoning: z.ZodOptional<z.ZodBoolean>;
328
328
  input: z.ZodOptional<z.ZodArray<z.ZodEnum<{
329
- image: "image";
330
329
  text: "text";
330
+ image: "image";
331
331
  }>>>;
332
332
  contextWindow: z.ZodOptional<z.ZodNumber>;
333
333
  maxTokens: z.ZodOptional<z.ZodNumber>;
@@ -371,8 +371,8 @@ export declare const ModelsJsonSchema: z.ZodObject<{
371
371
  name: z.ZodOptional<z.ZodString>;
372
372
  reasoning: z.ZodOptional<z.ZodBoolean>;
373
373
  input: z.ZodOptional<z.ZodArray<z.ZodEnum<{
374
- image: "image";
375
374
  text: "text";
375
+ image: "image";
376
376
  }>>>;
377
377
  contextWindow: z.ZodOptional<z.ZodNumber>;
378
378
  maxTokens: z.ZodOptional<z.ZodNumber>;
@@ -256,8 +256,8 @@ export declare const AgentDefaultsSchema: z.ZodObject<{
256
256
  export declare const AgentConfigSchema: z.ZodObject<{
257
257
  id: z.ZodString;
258
258
  default: z.ZodOptional<z.ZodBoolean>;
259
- name: z.ZodOptional<z.ZodString>;
260
- description: z.ZodOptional<z.ZodString>;
259
+ name: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>;
260
+ description: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>;
261
261
  enabled: z.ZodDefault<z.ZodBoolean>;
262
262
  workspace: z.ZodOptional<z.ZodString>;
263
263
  agentDir: z.ZodOptional<z.ZodString>;
@@ -265,11 +265,6 @@ export declare const AgentConfigSchema: z.ZodObject<{
265
265
  primary: z.ZodString;
266
266
  fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
267
267
  }, z.core.$strict>>;
268
- models: z.ZodOptional<z.ZodArray<z.ZodObject<{
269
- id: z.ZodString;
270
- description: z.ZodOptional<z.ZodString>;
271
- model: z.ZodString;
272
- }, z.core.$strict>>>;
273
268
  thinkingDefault: z.ZodOptional<z.ZodEnum<{
274
269
  off: "off";
275
270
  minimal: "minimal";
@@ -527,8 +522,8 @@ export declare const AgentsConfigSchema: z.ZodDefault<z.ZodObject<{
527
522
  list: z.ZodOptional<z.ZodArray<z.ZodObject<{
528
523
  id: z.ZodString;
529
524
  default: z.ZodOptional<z.ZodBoolean>;
530
- name: z.ZodOptional<z.ZodString>;
531
- description: z.ZodOptional<z.ZodString>;
525
+ name: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>;
526
+ description: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>;
532
527
  enabled: z.ZodDefault<z.ZodBoolean>;
533
528
  workspace: z.ZodOptional<z.ZodString>;
534
529
  agentDir: z.ZodOptional<z.ZodString>;
@@ -536,11 +531,6 @@ export declare const AgentsConfigSchema: z.ZodDefault<z.ZodObject<{
536
531
  primary: z.ZodString;
537
532
  fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
538
533
  }, z.core.$strict>>;
539
- models: z.ZodOptional<z.ZodArray<z.ZodObject<{
540
- id: z.ZodString;
541
- description: z.ZodOptional<z.ZodString>;
542
- model: z.ZodString;
543
- }, z.core.$strict>>>;
544
534
  thinkingDefault: z.ZodOptional<z.ZodEnum<{
545
535
  off: "off";
546
536
  minimal: "minimal";
@@ -1794,8 +1784,8 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
1794
1784
  list: z.ZodOptional<z.ZodArray<z.ZodObject<{
1795
1785
  id: z.ZodString;
1796
1786
  default: z.ZodOptional<z.ZodBoolean>;
1797
- name: z.ZodOptional<z.ZodString>;
1798
- description: z.ZodOptional<z.ZodString>;
1787
+ name: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>;
1788
+ description: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>;
1799
1789
  enabled: z.ZodDefault<z.ZodBoolean>;
1800
1790
  workspace: z.ZodOptional<z.ZodString>;
1801
1791
  agentDir: z.ZodOptional<z.ZodString>;
@@ -1803,11 +1793,6 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
1803
1793
  primary: z.ZodString;
1804
1794
  fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
1805
1795
  }, z.core.$strict>>;
1806
- models: z.ZodOptional<z.ZodArray<z.ZodObject<{
1807
- id: z.ZodString;
1808
- description: z.ZodOptional<z.ZodString>;
1809
- model: z.ZodString;
1810
- }, z.core.$strict>>>;
1811
1796
  thinkingDefault: z.ZodOptional<z.ZodEnum<{
1812
1797
  off: "off";
1813
1798
  minimal: "minimal";