@xopcai/xopc 0.0.89 → 0.0.90

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 (384) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  3. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  4. package/dist/extensions/telegram/src/plugin.js +1 -1
  5. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  6. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  7. package/dist/extensions/telegram/xopc.extension.json +1 -1
  8. package/dist/extensions/weixin/src/api/api.js +2 -2
  9. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  10. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  11. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  12. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  13. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  14. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  15. package/dist/extensions/weixin/src/plugin.js +1 -1
  16. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  17. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  18. package/dist/gateway/static/root/assets/agents-cPvvYLXo.js +222 -0
  19. package/dist/gateway/static/root/assets/apps-page-Bk1_P5FJ.js +1 -0
  20. package/dist/gateway/static/root/assets/channels-settings-CZoeQwHz.js +1 -0
  21. package/dist/gateway/static/root/assets/{channels-status-swr-DaHGkRF1.js → channels-status-swr-BrtH2VzC.js} +1 -1
  22. package/dist/gateway/static/root/assets/circle-check-C23XjkUj.js +1 -0
  23. package/dist/gateway/static/root/assets/cron-api-CyqbgfHM.js +1 -0
  24. package/dist/gateway/static/root/assets/cron-dreaming-jobs-Ip703-qM.js +2 -0
  25. package/dist/gateway/static/root/assets/cron-page-BpLdiQN8.js +1 -0
  26. package/dist/gateway/static/root/assets/dist-BpAiK86n.js +1 -0
  27. package/dist/gateway/static/root/assets/{extension-debug-page-CtuKJ9tE.js → extension-debug-page-D6Ak0STa.js} +1 -1
  28. package/dist/gateway/static/root/assets/{extension-page-ykzjOkR5.js → extension-page-Q0P3d6DW.js} +1 -1
  29. package/dist/gateway/static/root/assets/{extension-settings-page-Ce2qrdpO.js → extension-settings-page-CL55LwU_.js} +1 -1
  30. package/dist/gateway/static/root/assets/eye-DAfL1U7M.js +1 -0
  31. package/dist/gateway/static/root/assets/{fetch-C9FFJjuH.js → fetch-Dqa9iTWl.js} +1 -1
  32. package/dist/gateway/static/root/assets/{field-primitives-BFcrNeTU.js → field-primitives-HUR6JElP.js} +1 -1
  33. package/dist/gateway/static/root/assets/{heartbeat-config-api-CEg4Vr9R.js → heartbeat-config-api-DusckjUX.js} +1 -1
  34. package/dist/gateway/static/root/assets/{index-CZfy9oxs.js → index-BYcGfwcE.js} +97 -97
  35. package/dist/gateway/static/root/assets/index-V7MQ7834.css +1 -0
  36. package/dist/gateway/static/root/assets/logs-page-_HcZ2fgK.js +1 -0
  37. package/dist/gateway/static/root/assets/sessions-page-iezSMjho.js +1 -0
  38. package/dist/gateway/static/root/assets/{settings-form-section-BqdzA28u.js → settings-form-section-a0qGVOlr.js} +1 -1
  39. package/dist/gateway/static/root/assets/settings-page-C9_nYQwM.js +3 -0
  40. package/dist/gateway/static/root/assets/{share-preview-page-Di5Bzh4g.js → share-preview-page-DExl7CJy.js} +1 -1
  41. package/dist/gateway/static/root/assets/skills-page-BlgGD93t.js +2 -0
  42. package/dist/gateway/static/root/assets/{theme-store-CNqbmTNV.js → theme-store-C0Ehmdo5.js} +1 -1
  43. package/dist/gateway/static/root/assets/url-fxyYANfA.js +3 -0
  44. package/dist/gateway/static/root/assets/{utils-BWm2tG2w.js → utils-DRQryzdn.js} +1 -1
  45. package/dist/gateway/static/root/assets/voice-api-key-field-D0viACE2.js +1 -0
  46. package/dist/gateway/static/root/assets/workflow-page.utils-DnG8JBhV.js +1 -0
  47. package/dist/gateway/static/root/assets/workflows-page-BvMobnJP.js +27 -0
  48. package/dist/gateway/static/root/index.html +7 -5
  49. package/dist/package.js +1 -1
  50. package/dist/src/agent/agent-manager.js +7 -7
  51. package/dist/src/agent/agent-scope.js +1 -1
  52. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  53. package/dist/src/agent/context/workspace-seed.js +2 -2
  54. package/dist/src/agent/goals/goal-run-store.js +4 -4
  55. package/dist/src/agent/goals/persistent-goal-service.js +1 -1
  56. package/dist/src/agent/goals/post-turn.js +2 -2
  57. package/dist/src/agent/image/load-image-media.js +2 -2
  58. package/dist/src/agent/ipc/bus.js +1 -1
  59. package/dist/src/agent/ipc/inbox.js +2 -2
  60. package/dist/src/agent/ipc/socket.js +1 -1
  61. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  62. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  63. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  64. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  65. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  66. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  67. package/dist/src/agent/memory/dreaming/events.js +1 -1
  68. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  69. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  70. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  71. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  72. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  73. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  74. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  75. package/dist/src/agent/models/manager.js +1 -1
  76. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  77. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  78. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  79. package/dist/src/agent/sandbox/path-policy.js +2 -2
  80. package/dist/src/agent/service/build-direct-message-content.js +1 -1
  81. package/dist/src/agent/service.js +4 -4
  82. package/dist/src/agent/session/session-inspector.js +1 -1
  83. package/dist/src/agent/skills/config.js +1 -1
  84. package/dist/src/agent/skills/hub-hash.js +2 -2
  85. package/dist/src/agent/skills/hub-lock.js +1 -1
  86. package/dist/src/agent/skills/hub-pull.js +2 -2
  87. package/dist/src/agent/skills/index.js +1 -1
  88. package/dist/src/agent/skills/managed-store.js +1 -1
  89. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +20 -18
  90. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  91. package/dist/src/agent/skills/scanner.js +1 -1
  92. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  93. package/dist/src/agent/skills/skill-manager.js +1 -1
  94. package/dist/src/agent/tools/cronjob-tool.d.ts +6 -0
  95. package/dist/src/agent/tools/cronjob-tool.js +74 -9
  96. package/dist/src/agent/tools/cronjob-tool.js.map +1 -1
  97. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  98. package/dist/src/agent/tools/edit.d.ts +5 -1
  99. package/dist/src/agent/tools/edit.js +7 -5
  100. package/dist/src/agent/tools/edit.js.map +1 -1
  101. package/dist/src/agent/tools/factory.js +3 -3
  102. package/dist/src/agent/tools/factory.js.map +1 -1
  103. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  104. package/dist/src/agent/tools/send-media.js +1 -1
  105. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  106. package/dist/src/agent/tools/workflow-tool.js +1 -1
  107. package/dist/src/agent/tools/write.d.ts +5 -1
  108. package/dist/src/agent/tools/write.js +8 -6
  109. package/dist/src/agent/tools/write.js.map +1 -1
  110. package/dist/src/agent/workflow/agent-progress.js +2 -0
  111. package/dist/src/agent/workflow/agent-progress.js.map +1 -1
  112. package/dist/src/agent/workflow/builtins/client-proposal.d.ts +12 -0
  113. package/dist/src/agent/workflow/builtins/client-proposal.js +155 -0
  114. package/dist/src/agent/workflow/builtins/client-proposal.js.map +1 -0
  115. package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +12 -0
  116. package/dist/src/agent/workflow/builtins/competitor-scan.js +150 -0
  117. package/dist/src/agent/workflow/builtins/competitor-scan.js.map +1 -0
  118. package/dist/src/agent/workflow/builtins/content-draft.d.ts +13 -0
  119. package/dist/src/agent/workflow/builtins/content-draft.js +146 -0
  120. package/dist/src/agent/workflow/builtins/content-draft.js.map +1 -0
  121. package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +11 -0
  122. package/dist/src/agent/workflow/builtins/content-repurpose.js +137 -0
  123. package/dist/src/agent/workflow/builtins/content-repurpose.js.map +1 -0
  124. package/dist/src/agent/workflow/builtins/decision-compare.d.ts +13 -0
  125. package/dist/src/agent/workflow/builtins/decision-compare.js +173 -0
  126. package/dist/src/agent/workflow/builtins/decision-compare.js.map +1 -0
  127. package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +11 -0
  128. package/dist/src/agent/workflow/builtins/inbox-triage.js +148 -0
  129. package/dist/src/agent/workflow/builtins/inbox-triage.js.map +1 -0
  130. package/dist/src/agent/workflow/builtins/index.d.ts +10 -1
  131. package/dist/src/agent/workflow/builtins/index.js +46 -1
  132. package/dist/src/agent/workflow/builtins/index.js.map +1 -1
  133. package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +12 -0
  134. package/dist/src/agent/workflow/builtins/meeting-prep.js +144 -0
  135. package/dist/src/agent/workflow/builtins/meeting-prep.js.map +1 -0
  136. package/dist/src/agent/workflow/builtins/offer-design.d.ts +12 -0
  137. package/dist/src/agent/workflow/builtins/offer-design.js +161 -0
  138. package/dist/src/agent/workflow/builtins/offer-design.js.map +1 -0
  139. package/dist/src/agent/workflow/builtins/weekly-review.d.ts +12 -0
  140. package/dist/src/agent/workflow/builtins/weekly-review.js +131 -0
  141. package/dist/src/agent/workflow/builtins/weekly-review.js.map +1 -0
  142. package/dist/src/agent/workflow/catalog.js +1 -1
  143. package/dist/src/agent/workflow/step-labels.js +2 -2
  144. package/dist/src/agent/workflow/step-labels.js.map +1 -1
  145. package/dist/src/agent/workflow/subagent-runner.js +3 -1
  146. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  147. package/dist/src/agent/workflow/types.d.ts +4 -0
  148. package/dist/src/auth/credentials.js +3 -3
  149. package/dist/src/auth/profiles/store.js +1 -1
  150. package/dist/src/auth/sync-provider-auth.js +1 -1
  151. package/dist/src/browser/cache-dir-policy.js +1 -1
  152. package/dist/src/browser/cdp-local-launcher.js +2 -2
  153. package/dist/src/browser/providers/browser-ext-install.js +3 -3
  154. package/dist/src/browser/providers/cloakbrowser.js +4 -4
  155. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  156. package/dist/src/browser/stealth.js +1 -1
  157. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  158. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  159. package/dist/src/channels/outbound/persist-store.js +1 -1
  160. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  161. package/dist/src/channels/pairing/pairing-store.js +2 -2
  162. package/dist/src/chat-commands/agent-edit.d.ts +4 -0
  163. package/dist/src/chat-commands/agent-edit.js +136 -0
  164. package/dist/src/chat-commands/agent-edit.js.map +1 -0
  165. package/dist/src/chat-commands/builtins/config.js +2 -2
  166. package/dist/src/chat-commands/context.js +1 -1
  167. package/dist/src/chat-commands/index.d.ts +1 -0
  168. package/dist/src/chat-commands/index.js +3 -1
  169. package/dist/src/chat-commands/index.js.map +1 -1
  170. package/dist/src/cli/bin.js +2 -0
  171. package/dist/src/cli/bin.js.map +1 -1
  172. package/dist/src/cli/commands/config.js +1 -1
  173. package/dist/src/cli/commands/cron.js +42 -3
  174. package/dist/src/cli/commands/cron.js.map +1 -1
  175. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  176. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  177. package/dist/src/cli/commands/doctor/checks/session-integrity.js +79 -56
  178. package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -1
  179. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  180. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  181. package/dist/src/cli/commands/extension-dev.js +1 -1
  182. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  183. package/dist/src/cli/commands/extension-pack.js +1 -1
  184. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  185. package/dist/src/cli/commands/gateway/logs.js +1 -1
  186. package/dist/src/cli/commands/image.js +1 -1
  187. package/dist/src/cli/commands/init.js +4 -4
  188. package/dist/src/cli/commands/onboard.js +1 -1
  189. package/dist/src/cli/commands/update.js +86 -79
  190. package/dist/src/cli/commands/update.js.map +1 -1
  191. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  192. package/dist/src/commands/agents.config.d.ts +3 -2
  193. package/dist/src/commands/agents.config.js +5 -2
  194. package/dist/src/commands/agents.config.js.map +1 -1
  195. package/dist/src/config/agent-profile.js +1 -1
  196. package/dist/src/config/agent-typed-models.d.ts +2 -7
  197. package/dist/src/config/agent-typed-models.js +3 -14
  198. package/dist/src/config/agent-typed-models.js.map +1 -1
  199. package/dist/src/config/gateway-bind.js +1 -1
  200. package/dist/src/config/index.js +5 -5
  201. package/dist/src/config/loader.js +2 -2
  202. package/dist/src/config/localized-text.d.ts +6 -0
  203. package/dist/src/config/localized-text.js +42 -0
  204. package/dist/src/config/localized-text.js.map +1 -0
  205. package/dist/src/config/models-json.d.ts +6 -6
  206. package/dist/src/config/models-json.js +2 -2
  207. package/dist/src/config/paths-state.js +1 -1
  208. package/dist/src/config/profile.js +2 -2
  209. package/dist/src/config/schema.d.ts +6 -21
  210. package/dist/src/config/schema.js +4 -4
  211. package/dist/src/config/schema.js.map +1 -1
  212. package/dist/src/config/workspace-path.js +1 -1
  213. package/dist/src/cron/executor.d.ts +2 -0
  214. package/dist/src/cron/executor.js +113 -3
  215. package/dist/src/cron/executor.js.map +1 -1
  216. package/dist/src/cron/persistence.js +1 -1
  217. package/dist/src/cron/run-log-store.js +1 -1
  218. package/dist/src/cron/types.d.ts +8 -1
  219. package/dist/src/cron/validation.d.ts +4 -0
  220. package/dist/src/cron/validation.js +4 -3
  221. package/dist/src/cron/validation.js.map +1 -1
  222. package/dist/src/cron/workflow-run-completion.d.ts +23 -0
  223. package/dist/src/cron/workflow-run-completion.js +72 -0
  224. package/dist/src/cron/workflow-run-completion.js.map +1 -0
  225. package/dist/src/daemon/constants.js +1 -1
  226. package/dist/src/daemon/install-plan.js +2 -2
  227. package/dist/src/daemon/launchd.js +2 -2
  228. package/dist/src/daemon/schtasks.js +2 -2
  229. package/dist/src/daemon/systemd.js +2 -2
  230. package/dist/src/extensions/bundle-mcp.js +1 -1
  231. package/dist/src/extensions/discover-extensions.js +1 -1
  232. package/dist/src/extensions/health.js +1 -1
  233. package/dist/src/extensions/loader.js +1 -1
  234. package/dist/src/extensions/lockfile.js +2 -2
  235. package/dist/src/extensions/update.d.ts +51 -0
  236. package/dist/src/extensions/update.js +260 -0
  237. package/dist/src/extensions/update.js.map +1 -0
  238. package/dist/src/gateway/agents-admin.d.ts +15 -8
  239. package/dist/src/gateway/agents-admin.js +78 -29
  240. package/dist/src/gateway/agents-admin.js.map +1 -1
  241. package/dist/src/gateway/file-path-classifier.js +2 -2
  242. package/dist/src/gateway/heartbeat/service.js +1 -1
  243. package/dist/src/gateway/hono/lib/config-payload.d.ts +5 -0
  244. package/dist/src/gateway/hono/lib/config-payload.js +3 -2
  245. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  246. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  247. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  248. package/dist/src/gateway/hono/middleware/auth.d.ts +2 -0
  249. package/dist/src/gateway/hono/middleware/auth.js +12 -7
  250. package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
  251. package/dist/src/gateway/hono/oauth.js +1 -1
  252. package/dist/src/gateway/hono/routes/agents.js +56 -13
  253. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  254. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  255. package/dist/src/gateway/hono/routes/config-patch/agents.js +1 -1
  256. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  257. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  258. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  259. package/dist/src/gateway/hono/routes/models.js +1 -1
  260. package/dist/src/gateway/hono/routes/shares.js +1 -1
  261. package/dist/src/gateway/hono/routes/update.js +55 -107
  262. package/dist/src/gateway/hono/routes/update.js.map +1 -1
  263. package/dist/src/gateway/hono/routes/workflows.js +3 -1
  264. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  265. package/dist/src/gateway/hono/routes/workspace.js +4 -4
  266. package/dist/src/gateway/lock.js +3 -3
  267. package/dist/src/gateway/ports.js +1 -1
  268. package/dist/src/gateway/server.js +2 -0
  269. package/dist/src/gateway/server.js.map +1 -1
  270. package/dist/src/gateway/service/agent-runner.js +2 -2
  271. package/dist/src/gateway/service/marketplace-service.js +2 -2
  272. package/dist/src/gateway/service.js +3 -2
  273. package/dist/src/gateway/service.js.map +1 -1
  274. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  275. package/dist/src/heartbeat/index.js +1 -1
  276. package/dist/src/infra/brew.d.ts +4 -0
  277. package/dist/src/infra/brew.js +20 -0
  278. package/dist/src/infra/brew.js.map +1 -0
  279. package/dist/src/infra/package-json.d.ts +2 -0
  280. package/dist/src/infra/package-json.js +23 -0
  281. package/dist/src/infra/package-json.js.map +1 -0
  282. package/dist/src/infra/package-update-steps.d.ts +35 -0
  283. package/dist/src/infra/package-update-steps.js +304 -0
  284. package/dist/src/infra/package-update-steps.js.map +1 -0
  285. package/dist/src/infra/path-env.d.ts +11 -0
  286. package/dist/src/infra/path-env.js +90 -0
  287. package/dist/src/infra/path-env.js.map +1 -0
  288. package/dist/src/infra/path-prepend.d.ts +7 -0
  289. package/dist/src/infra/path-prepend.js +44 -0
  290. package/dist/src/infra/path-prepend.js.map +1 -0
  291. package/dist/src/infra/restart.js +2 -2
  292. package/dist/src/infra/stable-node-path.d.ts +2 -0
  293. package/dist/src/infra/stable-node-path.js +28 -0
  294. package/dist/src/infra/stable-node-path.js.map +1 -0
  295. package/dist/src/infra/update-check.js +1 -1
  296. package/dist/src/infra/update-global.d.ts +30 -23
  297. package/dist/src/infra/update-global.js +114 -65
  298. package/dist/src/infra/update-global.js.map +1 -1
  299. package/dist/src/infra/update-lock.js +3 -3
  300. package/dist/src/infra/update-log.d.ts +1 -0
  301. package/dist/src/infra/update-log.js +12 -0
  302. package/dist/src/infra/update-log.js.map +1 -0
  303. package/dist/src/infra/update-restart.d.ts +20 -0
  304. package/dist/src/infra/update-restart.js +165 -0
  305. package/dist/src/infra/update-restart.js.map +1 -0
  306. package/dist/src/infra/update-runner.d.ts +89 -1
  307. package/dist/src/infra/update-runner.js +604 -173
  308. package/dist/src/infra/update-runner.js.map +1 -1
  309. package/dist/src/infra/update-startup.d.ts +3 -0
  310. package/dist/src/infra/update-startup.js +10 -6
  311. package/dist/src/infra/update-startup.js.map +1 -1
  312. package/dist/src/infra/write-file-atomic.js +2 -2
  313. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  314. package/dist/src/providers/index.js +2 -2
  315. package/dist/src/providers/model-registry.js +1 -1
  316. package/dist/src/routing/resolve-route.d.ts +3 -1
  317. package/dist/src/routing/resolve-route.js.map +1 -1
  318. package/dist/src/session/config-store.js +2 -2
  319. package/dist/src/session/init-session-turn.js +2 -2
  320. package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
  321. package/dist/src/session/parity/sessions-json-file.js +1 -1
  322. package/dist/src/session/parity/transcript-file-lock.js +2 -2
  323. package/dist/src/session/parity/transcript-paths.js +1 -1
  324. package/dist/src/session/resolve-session.js +4 -4
  325. package/dist/src/session/search-index-cache.js +1 -1
  326. package/dist/src/session/search-index.js +1 -1
  327. package/dist/src/session/session-title.js +2 -2
  328. package/dist/src/session/store.d.ts +5 -3
  329. package/dist/src/session/store.js +71 -25
  330. package/dist/src/session/store.js.map +1 -1
  331. package/dist/src/share/share-auto.js +2 -2
  332. package/dist/src/share/share-store.js +3 -3
  333. package/dist/src/share/share-thumbnail.js +2 -2
  334. package/dist/src/share/share-zip.js +1 -1
  335. package/dist/src/share/site-share-store.js +3 -3
  336. package/dist/src/share/site-static-serve.js +1 -1
  337. package/dist/src/tui/clipboard-image.js +3 -3
  338. package/dist/src/tui/theme-manager.js +1 -1
  339. package/dist/src/tui/tui-keybindings-file.js +1 -1
  340. package/dist/src/tui/tui-scoped-models.js +2 -2
  341. package/dist/src/tui/tui-settings.js +1 -1
  342. package/dist/src/tui/tui.js +3 -3
  343. package/dist/src/tunnel/frpc-binary.js +3 -3
  344. package/dist/src/tunnel/frpc-config.js +1 -1
  345. package/dist/src/tunnel/frpc-extract.js +1 -1
  346. package/dist/src/tunnel/tunnel-state.js +1 -1
  347. package/dist/src/utils/logger/audit.js +1 -1
  348. package/dist/src/utils/logger/log-store.js +1 -1
  349. package/dist/src/utils/logger/rotation.js +1 -1
  350. package/dist/src/utils/logger/stats.d.ts +1 -1
  351. package/dist/src/voice/tts/audio.js +1 -1
  352. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  353. package/dist/src/workflows/domain/event.d.ts +3 -0
  354. package/dist/src/workflows/domain/run.d.ts +3 -0
  355. package/dist/src/workflows/domain/run.js.map +1 -1
  356. package/dist/src/workflows/engine/projector.js +17 -0
  357. package/dist/src/workflows/engine/projector.js.map +1 -1
  358. package/dist/src/workflows/engine/workflow-engine.js +127 -0
  359. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  360. package/dist/src/workflows/index.js +1 -1
  361. package/dist/src/workflows/service/run-view-to-snapshot.js +3 -1
  362. package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
  363. package/dist/src/workflows/service/workflow-run-service.d.ts +1 -0
  364. package/dist/src/workflows/service/workflow-run-service.js +4 -1
  365. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  366. package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
  367. package/dist/src/workflows/store/event-store.js +1 -1
  368. package/dist/src/workflows/store/run-store.js +1 -1
  369. package/package.json +1 -1
  370. package/dist/gateway/static/root/assets/agents-B6PJB07W.js +0 -222
  371. package/dist/gateway/static/root/assets/apps-page-BOr0B1wv.js +0 -1
  372. package/dist/gateway/static/root/assets/channels-settings-BelUKggl.js +0 -1
  373. package/dist/gateway/static/root/assets/cron-api-CjOg-BIj.js +0 -1
  374. package/dist/gateway/static/root/assets/cron-dreaming-jobs-DueM3rBz.js +0 -2
  375. package/dist/gateway/static/root/assets/cron-page-DhoZmZXb.js +0 -1
  376. package/dist/gateway/static/root/assets/dist-6LecgDx5.js +0 -1
  377. package/dist/gateway/static/root/assets/index-CiN1cQiQ.css +0 -1
  378. package/dist/gateway/static/root/assets/logs-page-BwWLfqvd.js +0 -1
  379. package/dist/gateway/static/root/assets/sessions-page-DV5WN8uk.js +0 -1
  380. package/dist/gateway/static/root/assets/settings-page-CfOBRbPX.js +0 -3
  381. package/dist/gateway/static/root/assets/skills-page-D0H5Kaxg.js +0 -2
  382. package/dist/gateway/static/root/assets/url-aYn-Rj1C.js +0 -7
  383. package/dist/gateway/static/root/assets/voice-api-key-field-X2UfnHeq.js +0 -1
  384. 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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"}
@@ -1,8 +1,8 @@
1
1
  import { ConfigSchema, init_schema } from "../../config/schema.js";
2
2
  import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
3
- import { dirname, join } from "node:path";
4
- import { existsSync, mkdirSync, readFileSync } from "node:fs";
5
3
  import { randomBytes } from "node:crypto";
4
+ import { existsSync, mkdirSync, readFileSync } from "node:fs";
5
+ import { dirname, join } from "node:path";
6
6
  //#region src/cli/utils/init-workspace-core.ts
7
7
  init_schema();
8
8
  init_loader();
@@ -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,10 +1,12 @@
1
1
  import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentHomeDir, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agent/agent-scope.js";
2
+ import { init_localized_text, normalizeLocalizedText } from "../config/localized-text.js";
2
3
  import { existsSync } from "node:fs";
3
4
  import { rm } from "node:fs/promises";
4
5
  //#region src/commands/agents.config.ts
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,5 +1,5 @@
1
- import { getAgentDefaultModelRef, init_schema } from "./schema.js";
2
1
  import { init_agent_scope, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
2
+ import { getAgentDefaultModelRef, init_schema } from "./schema.js";
3
3
  import { init_session_key, parseSessionKey } from "../routing/session-key.js";
4
4
  import { agentExists, getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
5
5
  //#region src/config/agent-profile.ts
@@ -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"}
@@ -1,7 +1,7 @@
1
1
  import { getTailnetIPv4Sync } from "../infra/tailscale.js";
2
2
  import { isLoopbackHost } from "../gateway/host.js";
3
- import net from "node:net";
4
3
  import { existsSync } from "node:fs";
4
+ import net from "node:net";
5
5
  //#region src/config/gateway-bind.ts
6
6
  function resolveGatewayBindMode(cfg, bindOverride) {
7
7
  if (bindOverride) return bindOverride;
@@ -1,15 +1,15 @@
1
- import { TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema } from "../../extensions/telegram/src/config-schema.js";
2
- import { WeixinAccountConfigSchema, WeixinConfigSchema } from "../../extensions/weixin/src/config-schema.js";
3
- import { AgentConfigSchema, AgentDefaultsSchema, AgentImageGenerationModelSchema, AgentModelRefSchema, AgentTypedModelSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, CronConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, 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, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultModelRef, init_schema, parseModelRef } from "./schema.js";
4
- import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.js";
5
1
  import { ENV_VARS, resolveHomeDir, resolveStateDir } from "./paths-state.js";
6
2
  import { expandWorkspacePathString, init_workspace_path, normalizeWorkspaceDir, resolveWorkspaceRoot } from "./workspace-path.js";
7
3
  import { resolveDefaultAgentWorkspaceDir } from "./workspace-defaults.js";
8
4
  import { resolveAgentDir as resolveAgentDir$1, resolveAgentHomeDir as resolveAgentHomeDir$1, resolveAgentWorkspaceDir, resolveSessionsDir as resolveSessionsDir$1 } from "../agent/agent-scope.js";
9
- import { extractProfileAgentId, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "./agent-profile.js";
10
5
  import { resolveSessionFilePath, resolveSessionTranscriptPathInDir } from "../session/parity/transcript-paths.js";
11
6
  import { FILENAMES, WORKSPACE_FILES, existsSync, init_paths, resolveAgentAuthProfilesPath, resolveAgentDir, resolveAgentHomeDir, resolveAgentMetadataPath, resolveAgentProfileDir, resolveAgentProfileMarkdownPath, resolveAuthProfilesPath, resolveBinDir, resolveBundledExtensionsDir, resolveBundledSkillsDir, resolveConfigPath, resolveCredentialsDir, resolveCronDir, resolveCronJobsPath, resolveCronLogPath, resolveCronLogsDir, resolveCronRunsDir, resolveExtensionSdkPath, resolveExtensionsDir, resolveExtensionsLockPath, resolveInboxDir, resolveInboxMessagePath, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogPath, resolveLogsDir, resolveMemoryDir, resolveMemoryPath, resolveModelsJsonPath, resolveNodeBinDir, resolveNodeBinPath, resolveNodeToolsDir, resolveNpmBinPath, resolveOAuthPath, resolvePidPath, resolveSessionTranscriptPath, resolveSessionsArchiveDir, resolveSessionsDir, resolveSessionsMapPath, resolveSkillPath, resolveSkillsCachePath, resolveSkillsDir, resolveSkillsLockPath, resolveSocketPath, resolveStatusPath, resolveToolsDir, resolveWorkspaceExtensionsDir, resolveWorkspaceFile, resolveWorkspaceStateDir, resolveWorkspaceStatePath, resolveXopcBinPath } from "./paths.js";
7
+ import { TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema } from "../../extensions/telegram/src/config-schema.js";
8
+ import { WeixinAccountConfigSchema, WeixinConfigSchema } from "../../extensions/weixin/src/config-schema.js";
9
+ import { AgentConfigSchema, AgentDefaultsSchema, AgentImageGenerationModelSchema, AgentModelRefSchema, AgentTypedModelSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, CronConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, 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, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultModelRef, init_schema, parseModelRef } from "./schema.js";
12
10
  import { init_loader, loadConfig, registerChannelConfigValidator, saveConfig } from "./loader.js";
11
+ import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.js";
12
+ import { extractProfileAgentId, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "./agent-profile.js";
13
13
  import { clearConfigValueCache, getAllowedCommands, getCacheStats, init_resolve_config_value, resolveConfigValue, resolveHeaders, testApiKeyResolution } from "./resolve-config-value.js";
14
14
  import { CustomModelSchema, ModelOverrideSchema, ModelsJsonSchema, OpenAICompatSchema, OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema, OpenRouterRoutingSchema, ProviderConfigSchema, VercelGatewayRoutingSchema, getDefaultModelValues, init_models_json, loadModelsJson, modelsJsonExists, saveModelsJson, validateModelsConfig } from "./models-json.js";
15
15
  import { canonicalizeConfiguredMcpServer, isKnownCliMcpTypeAlias, normalizeConfiguredMcpServers, resolveXopcMcpTransportAlias } from "./mcp-config-normalize.js";
@@ -1,9 +1,9 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { ConfigSchema, init_schema } from "./schema.js";
2
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
3
3
  import { createLogger } from "../utils/logger/index.js";
4
4
  import { init_logger } from "../utils/logger.js";
5
5
  import { init_paths, resolveConfigPath } from "./paths.js";
6
- import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
6
+ import { ConfigSchema, init_schema } from "./schema.js";
7
7
  import { dirname } from "path";
8
8
  import { existsSync, mkdirSync, promises, readFileSync } from "fs";
9
9
  import { config } from "dotenv";
@@ -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"}