@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
@@ -1,12 +1,14 @@
1
- import { init_schema, parseModelRef } from "../../../config/schema.js";
2
1
  import { init_agent_scope, normalizeAgentId } from "../../../agent/agent-scope.js";
2
+ import { init_localized_text, normalizeLocalizedText } from "../../../config/localized-text.js";
3
+ import { init_schema, parseModelRef } from "../../../config/schema.js";
3
4
  import { init_providers, isProviderConfigured, resolveModel } from "../../../providers/index.js";
4
5
  import { getVoiceModelsConfig } from "../../../config/voice.js";
5
- import { agentModelFallbacksToArray, agentModelRefToString } from "../lib/agent-model.js";
6
6
  import { deleteAgentAvatarFile, finalizeCreateAgentDirs, listAgentProfileFiles, listGatewayAgents, prepareCreateAgent, prepareCreateAgentsBatch, prepareDeleteAgent, prepareUpdateAgent, readAgentAvatarFile, readAgentProfileFile, runAfterDeletePurge, writeAgentAvatarFromBase64, writeAgentProfileFile } from "../../agents-admin.js";
7
7
  import { resolveImageGenerationCapabilities, resolveImageUnderstandingCapabilities } from "../../image-capabilities.js";
8
+ import { agentModelFallbacksToArray, agentModelRefToString } from "../lib/agent-model.js";
8
9
  //#region src/gateway/hono/routes/agents.ts
9
10
  init_schema();
11
+ init_localized_text();
10
12
  init_providers();
11
13
  init_agent_scope();
12
14
  function parseProfileFiles(raw) {
@@ -22,14 +24,29 @@ function parseProfileFiles(raw) {
22
24
  function isParseError(value) {
23
25
  return typeof value === "object" && value !== null && "error" in value && typeof value.error === "string";
24
26
  }
27
+ function parseLocalizedText(raw, fieldName) {
28
+ if (raw === void 0) return;
29
+ if (typeof raw === "string") return raw;
30
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw)) return { error: `${fieldName} must be a string or locale map` };
31
+ const localized = {};
32
+ for (const [locale, text] of Object.entries(raw)) {
33
+ if (typeof text !== "string") return { error: `${fieldName}.${locale} must be a string` };
34
+ localized[locale] = text;
35
+ }
36
+ return normalizeLocalizedText(localized);
37
+ }
25
38
  function parseCreateAgentBody(raw) {
26
39
  if (raw === null || typeof raw !== "object" || Array.isArray(raw)) return { error: "each agent must be an object" };
27
40
  const body = raw;
28
- const name = typeof body.name === "string" ? body.name : "";
41
+ const parsedName = parseLocalizedText(body.name, "name");
42
+ if (isParseError(parsedName)) return parsedName;
43
+ const parsedDescription = parseLocalizedText(body.description, "description");
44
+ if (isParseError(parsedDescription)) return parsedDescription;
45
+ const name = parsedName ?? "";
29
46
  const workspace = typeof body.workspace === "string" ? body.workspace : "";
30
47
  const model = typeof body.model === "string" ? body.model : void 0;
31
48
  const agentDir = typeof body.agentDir === "string" ? body.agentDir : void 0;
32
- const description = typeof body.description === "string" ? body.description : void 0;
49
+ const description = parsedDescription;
33
50
  const id = typeof body.id === "string" ? body.id : void 0;
34
51
  const toolsDisable = Array.isArray(body.toolsDisable) ? body.toolsDisable.map((x) => String(x).trim()).filter(Boolean) : void 0;
35
52
  let profileFiles;
@@ -38,6 +55,7 @@ function parseCreateAgentBody(raw) {
38
55
  if (isParseError(parsed)) return parsed;
39
56
  profileFiles = parsed;
40
57
  }
58
+ const cloneFrom = typeof body.cloneFrom === "string" ? body.cloneFrom : void 0;
41
59
  return {
42
60
  name,
43
61
  workspace,
@@ -46,14 +64,15 @@ function parseCreateAgentBody(raw) {
46
64
  ...id !== void 0 ? { id } : {},
47
65
  ...description !== void 0 ? { description } : {},
48
66
  ...toolsDisable !== void 0 ? { toolsDisable } : {},
49
- ...profileFiles !== void 0 ? { profileFiles } : {}
67
+ ...profileFiles !== void 0 ? { profileFiles } : {},
68
+ ...cloneFrom !== void 0 ? { cloneFrom } : {}
50
69
  };
51
70
  }
52
71
  function registerAgentsRoutes(authenticated, deps) {
53
72
  const { service, strictRateLimitMiddleware } = deps;
54
73
  authenticated.get("/api/agents", async (c) => {
55
74
  const cfg = service.currentConfig;
56
- const payload = await listGatewayAgents(cfg);
75
+ const payload = await listGatewayAgents(cfg, { locale: c.req.query("locale") || c.req.header("Accept-Language")?.split(",")[0]?.trim() });
57
76
  return c.json({
58
77
  ok: true,
59
78
  payload
@@ -104,7 +123,7 @@ function registerAgentsRoutes(authenticated, deps) {
104
123
  }, finalized.status ?? 400);
105
124
  agentIds.push(item.agentId);
106
125
  }
107
- const agentsPayload = await listGatewayAgents(cfg);
126
+ const agentsPayload = await listGatewayAgents(cfg, { locale: c.req.query("locale") || c.req.header("Accept-Language")?.split(",")[0]?.trim() });
108
127
  return c.json({
109
128
  ok: true,
110
129
  payload: {
@@ -139,12 +158,16 @@ function registerAgentsRoutes(authenticated, deps) {
139
158
  ok: false,
140
159
  error: { message: save.error ?? "save failed" }
141
160
  }, 500);
142
- const finalized = await finalizeCreateAgentDirs(service.currentConfig, agentId, { ...parsed.profileFiles !== void 0 ? { profileFiles: parsed.profileFiles } : {} });
161
+ const finalized = await finalizeCreateAgentDirs(service.currentConfig, agentId, {
162
+ ...parsed.profileFiles !== void 0 ? { profileFiles: parsed.profileFiles } : {},
163
+ ...parsed.cloneFrom ? { cloneFrom: parsed.cloneFrom } : {}
164
+ });
143
165
  if (finalized.ok === false) return c.json({
144
166
  ok: false,
145
167
  error: { message: finalized.error }
146
168
  }, finalized.status ?? 400);
147
- const agentsPayload = await listGatewayAgents(service.currentConfig);
169
+ const locale = c.req.query("locale") || c.req.header("Accept-Language")?.split(",")[0]?.trim();
170
+ const agentsPayload = await listGatewayAgents(service.currentConfig, { locale });
148
171
  return c.json({
149
172
  ok: true,
150
173
  payload: {
@@ -166,9 +189,27 @@ function registerAgentsRoutes(authenticated, deps) {
166
189
  }
167
190
  const skillsPatch = body.skills === null ? null : Array.isArray(body.skills) ? body.skills.map((x) => String(x).trim()).filter(Boolean) : void 0;
168
191
  const toolsDisablePatch = body.toolsDisable === null ? null : Array.isArray(body.toolsDisable) ? body.toolsDisable.map((x) => String(x).trim()).filter(Boolean) : void 0;
169
- const descriptionPatch = Object.hasOwn(body, "description") ? body.description === null ? null : typeof body.description === "string" ? body.description : void 0 : void 0;
192
+ let namePatch;
193
+ if (Object.hasOwn(body, "name")) {
194
+ const parsedName = parseLocalizedText(body.name, "name");
195
+ if (isParseError(parsedName)) return c.json({
196
+ ok: false,
197
+ error: { message: parsedName.error }
198
+ }, 400);
199
+ namePatch = parsedName;
200
+ }
201
+ let descriptionPatch;
202
+ if (Object.hasOwn(body, "description")) if (body.description === null) descriptionPatch = null;
203
+ else {
204
+ const parsedDescription = parseLocalizedText(body.description, "description");
205
+ if (isParseError(parsedDescription)) return c.json({
206
+ ok: false,
207
+ error: { message: parsedDescription.error }
208
+ }, 400);
209
+ descriptionPatch = parsedDescription;
210
+ }
170
211
  const prep = prepareUpdateAgent(service.currentConfig, id, {
171
- name: typeof body.name === "string" ? body.name : void 0,
212
+ name: namePatch,
172
213
  ...descriptionPatch !== void 0 ? { description: descriptionPatch } : {},
173
214
  workspace: typeof body.workspace === "string" ? body.workspace : void 0,
174
215
  model: body.model === null ? null : typeof body.model === "string" ? body.model : void 0,
@@ -186,7 +227,8 @@ function registerAgentsRoutes(authenticated, deps) {
186
227
  ok: false,
187
228
  error: { message: save.error ?? "save failed" }
188
229
  }, 500);
189
- const agentsPayload = await listGatewayAgents(service.currentConfig);
230
+ const locale = c.req.query("locale") || c.req.header("Accept-Language")?.split(",")[0]?.trim();
231
+ const agentsPayload = await listGatewayAgents(service.currentConfig, { locale });
190
232
  return c.json({
191
233
  ok: true,
192
234
  payload: agentsPayload
@@ -207,7 +249,8 @@ function registerAgentsRoutes(authenticated, deps) {
207
249
  error: { message: save.error ?? "save failed" }
208
250
  }, 500);
209
251
  if (purge) await runAfterDeletePurge(service.currentConfig, agentId);
210
- const agentsPayload = await listGatewayAgents(service.currentConfig);
252
+ const locale = c.req.query("locale") || c.req.header("Accept-Language")?.split(",")[0]?.trim();
253
+ const agentsPayload = await listGatewayAgents(service.currentConfig, { locale });
211
254
  return c.json({
212
255
  ok: true,
213
256
  payload: {
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","names":[],"sources":["../../../../../src/gateway/hono/routes/agents.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { type Config, parseModelRef } from '../../../config/schema.js';\nimport { getVoiceModelsConfig } from '../../../config/voice.js';\nimport {\n isProviderConfigured,\n resolveModel,\n} from '../../../providers/index.js';\nimport { normalizeAgentId } from '../../../agent/agent-scope.js';\nimport {\n deleteAgentAvatarFile,\n finalizeCreateAgentDirs,\n listAgentProfileFiles,\n listGatewayAgents,\n prepareCreateAgent,\n prepareCreateAgentsBatch,\n prepareDeleteAgent,\n prepareUpdateAgent,\n readAgentAvatarFile,\n readAgentProfileFile,\n runAfterDeletePurge,\n writeAgentAvatarFromBase64,\n writeAgentProfileFile,\n type CreateAgentBody,\n} from '../../agents-admin.js';\nimport {\n resolveImageGenerationCapabilities,\n resolveImageUnderstandingCapabilities,\n} from '../../image-capabilities.js';\nimport {\n agentModelFallbacksToArray,\n agentModelRefToString,\n} from '../lib/agent-model.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction parseProfileFiles(raw: unknown): Record<string, string> | undefined | { error: string } {\n if (raw === undefined) {\n return undefined;\n }\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n return { error: 'profileFiles must be an object' };\n }\n const profileFiles: Record<string, string> = {};\n for (const [name, content] of Object.entries(raw as Record<string, unknown>)) {\n if (typeof content !== 'string') {\n return { error: `profileFiles[\"${name}\"] must be a string` };\n }\n profileFiles[name] = content;\n }\n return profileFiles;\n}\n\nfunction isParseError(value: unknown): value is { error: string } {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'error' in value &&\n typeof (value as { error: string }).error === 'string'\n );\n}\n\nfunction parseCreateAgentBody(raw: unknown): CreateAgentBody | { error: string } {\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n return { error: 'each agent must be an object' };\n }\n const body = raw as Record<string, unknown>;\n const name = typeof body.name === 'string' ? body.name : '';\n const workspace = typeof body.workspace === 'string' ? body.workspace : '';\n const model = typeof body.model === 'string' ? body.model : undefined;\n const agentDir = typeof body.agentDir === 'string' ? body.agentDir : undefined;\n const description = typeof body.description === 'string' ? body.description : undefined;\n const id = typeof body.id === 'string' ? body.id : undefined;\n const toolsDisable = Array.isArray(body.toolsDisable)\n ? body.toolsDisable.map((x: unknown) => String(x).trim()).filter(Boolean)\n : undefined;\n let profileFiles: Record<string, string> | undefined;\n if (Object.hasOwn(body, 'profileFiles')) {\n const parsed = parseProfileFiles(body.profileFiles);\n if (isParseError(parsed)) {\n return parsed;\n }\n profileFiles = parsed;\n }\n return {\n name,\n workspace,\n ...(model !== undefined ? { model } : {}),\n ...(agentDir !== undefined ? { agentDir } : {}),\n ...(id !== undefined ? { id } : {}),\n ...(description !== undefined ? { description } : {}),\n ...(toolsDisable !== undefined ? { toolsDisable } : {}),\n ...(profileFiles !== undefined ? { profileFiles } : {}),\n };\n}\n\nexport function registerAgentsRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n authenticated.get('/api/agents', async (c) => {\n const cfg = service.currentConfig as Config;\n const payload = await listGatewayAgents(cfg);\n return c.json({ ok: true, payload });\n });\n\n authenticated.post('/api/agents/batch', strictRateLimitMiddleware, async (c) => {\n let body: Record<string, unknown> = {};\n try {\n body = (await c.req.json()) as Record<string, unknown>;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const rawAgents = body.agents;\n if (!Array.isArray(rawAgents)) {\n return c.json({ ok: false, error: { message: 'agents must be an array' } }, 400);\n }\n const parsedAgents: CreateAgentBody[] = [];\n for (const raw of rawAgents) {\n const parsed = parseCreateAgentBody(raw);\n if ('error' in parsed) {\n return c.json({ ok: false, error: { message: parsed.error } }, 400);\n }\n parsedAgents.push(parsed);\n }\n const prep = prepareCreateAgentsBatch(service.currentConfig as Config, parsedAgents);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const { nextConfig, created } = prep.data;\n const save = await service.saveConfig(nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n const cfg = service.currentConfig as Config;\n const agentIds: string[] = [];\n for (const item of created) {\n const finalized = await finalizeCreateAgentDirs(cfg, item.agentId, {\n ...(item.profileFiles !== undefined ? { profileFiles: item.profileFiles } : {}),\n });\n if (finalized.ok === false) {\n return c.json({ ok: false, error: { message: finalized.error } }, finalized.status ?? 400);\n }\n agentIds.push(item.agentId);\n }\n const agentsPayload = await listGatewayAgents(cfg);\n return c.json({\n ok: true,\n payload: {\n agentIds,\n agents: agentsPayload,\n },\n });\n });\n\n authenticated.post('/api/agents', strictRateLimitMiddleware, async (c) => {\n let body: Record<string, unknown> = {};\n try {\n body = (await c.req.json()) as Record<string, unknown>;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const parsed = parseCreateAgentBody(body);\n if ('error' in parsed) {\n return c.json({ ok: false, error: { message: parsed.error } }, 400);\n }\n const prep = prepareCreateAgent(service.currentConfig as Config, parsed);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const { nextConfig, agentId } = prep.data;\n const save = await service.saveConfig(nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n const finalized = await finalizeCreateAgentDirs(service.currentConfig as Config, agentId, {\n ...(parsed.profileFiles !== undefined ? { profileFiles: parsed.profileFiles } : {}),\n });\n if (finalized.ok === false) {\n return c.json({ ok: false, error: { message: finalized.error } }, finalized.status ?? 400);\n }\n const agentsPayload = await listGatewayAgents(service.currentConfig as Config);\n return c.json({\n ok: true,\n payload: {\n agentId,\n agents: agentsPayload,\n },\n });\n });\n\n authenticated.patch('/api/agents/:id', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n let body: Record<string, unknown> = {};\n try {\n body = (await c.req.json()) as Record<string, unknown>;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const skillsPatch =\n body.skills === null\n ? null\n : Array.isArray(body.skills)\n ? body.skills.map((x: unknown) => String(x).trim()).filter(Boolean)\n : undefined;\n const toolsDisablePatch =\n body.toolsDisable === null\n ? null\n : Array.isArray(body.toolsDisable)\n ? body.toolsDisable.map((x: unknown) => String(x).trim()).filter(Boolean)\n : undefined;\n\n const descriptionPatch: string | null | undefined = Object.hasOwn(body, 'description')\n ? body.description === null\n ? null\n : typeof body.description === 'string'\n ? body.description\n : undefined\n : undefined;\n\n const prep = prepareUpdateAgent(service.currentConfig as Config, id, {\n name: typeof body.name === 'string' ? body.name : undefined,\n ...(descriptionPatch !== undefined ? { description: descriptionPatch } : {}),\n workspace: typeof body.workspace === 'string' ? body.workspace : undefined,\n model:\n body.model === null\n ? null\n : typeof body.model === 'string'\n ? body.model\n : undefined,\n agentDir:\n body.agentDir === null\n ? null\n : typeof body.agentDir === 'string'\n ? body.agentDir\n : undefined,\n setDefault: body.setDefault === true,\n ...(skillsPatch !== undefined ? { skills: skillsPatch } : {}),\n ...(toolsDisablePatch !== undefined ? { toolsDisable: toolsDisablePatch } : {}),\n });\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const save = await service.saveConfig(prep.data.nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n const agentsPayload = await listGatewayAgents(service.currentConfig as Config);\n return c.json({ ok: true, payload: agentsPayload });\n });\n\n authenticated.delete('/api/agents/:id', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const purge = c.req.query('purge') === '1' || c.req.query('purge') === 'true';\n const prep = prepareDeleteAgent(service.currentConfig as Config, id);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const { nextConfig, agentId } = prep.data;\n const save = await service.saveConfig(nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n if (purge) {\n await runAfterDeletePurge(service.currentConfig as Config, agentId);\n }\n const agentsPayload = await listGatewayAgents(service.currentConfig as Config);\n return c.json({\n ok: true,\n payload: { agentId, purged: purge, agents: agentsPayload },\n });\n });\n\n authenticated.get('/api/agents/:id/avatar', async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const res = await readAgentAvatarFile(service.currentConfig as Config, id);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return new Response(res.data.buffer, {\n status: 200,\n headers: {\n 'Content-Type': res.data.contentType,\n 'Cache-Control': 'private, max-age=3600',\n },\n });\n });\n\n authenticated.put('/api/agents/:id/avatar', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n let body: Record<string, unknown> = {};\n try {\n body = (await c.req.json()) as Record<string, unknown>;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const base64 = typeof body.base64 === 'string' ? body.base64 : '';\n const mimeType = typeof body.mimeType === 'string' ? body.mimeType : '';\n const res = await writeAgentAvatarFromBase64(service.currentConfig as Config, id, base64, mimeType);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: { agentId: res.data.agentId } });\n });\n\n authenticated.delete('/api/agents/:id/avatar', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const res = await deleteAgentAvatarFile(service.currentConfig as Config, id);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: { agentId: res.data.agentId } });\n });\n\n authenticated.get('/api/agents/:id/files', async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const res = await listAgentProfileFiles(service.currentConfig as Config, id);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: res.data });\n });\n\n authenticated.get('/api/agents/:id/files/:name', async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const name = decodeURIComponent(c.req.param('name') ?? '');\n const res = await readAgentProfileFile(service.currentConfig as Config, id, name);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: { agentId: res.data.agentId, name, content: res.data.content } });\n });\n\n authenticated.put('/api/agents/:id/files/:name', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const name = decodeURIComponent(c.req.param('name') ?? '');\n let content = '';\n try {\n const body = (await c.req.json()) as { content?: unknown };\n content = typeof body.content === 'string' ? body.content : '';\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const res = await writeAgentProfileFile(service.currentConfig as Config, id, name, content);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: { agentId: res.data.agentId, name } });\n });\n\n // GET /api/voice/models - Get available STT/TTS models\n authenticated.get('/api/voice/models', (c) => {\n const models = getVoiceModelsConfig();\n return c.json({ ok: true, payload: { models } });\n });\n\n authenticated.get('/api/image/capabilities', async (c) => {\n const config = service.currentConfig as Config;\n const imageGenerationProviders = await resolveImageGenerationCapabilities(config);\n const imageUnderstandingProviders = await resolveImageUnderstandingCapabilities(config);\n return c.json({\n ok: true,\n payload: {\n current: {\n imageModel: agentModelRefToString(config.agents?.defaults?.imageModel) ?? null,\n imageModelFallbacks: agentModelFallbacksToArray(config.agents?.defaults?.imageModel),\n imageGenerationModel: agentModelRefToString(config.agents?.defaults?.imageGenerationModel) ?? null,\n imageGenerationModelFallbacks: agentModelFallbacksToArray(\n config.agents?.defaults?.imageGenerationModel,\n ),\n mediaMaxMb: config.agents?.defaults?.mediaMaxMb ?? null,\n },\n imageGeneration: { providers: imageGenerationProviders },\n imageUnderstanding: { providers: imageUnderstandingProviders },\n },\n });\n });\n\n authenticated.post('/api/image/validate-model', strictRateLimitMiddleware, async (c) => {\n let body: { modelRef?: unknown };\n try {\n body = (await c.req.json()) as { modelRef?: unknown };\n } catch {\n return c.json({ ok: false, error: 'Invalid JSON' }, 400);\n }\n const modelRef = body.modelRef;\n if (!modelRef || typeof modelRef !== 'string') {\n return c.json({ ok: false, error: 'modelRef is required' }, 400);\n }\n\n const parsed = parseModelRef(modelRef);\n if (!parsed) {\n return c.json({\n ok: true,\n payload: {\n valid: false,\n reason: 'invalid_format',\n message: 'Model reference must be in \"provider/model\" format',\n },\n });\n }\n\n const configured = await isProviderConfigured(parsed.provider);\n if (!configured) {\n return c.json({\n ok: true,\n payload: {\n valid: false,\n reason: 'provider_not_configured',\n message: `Provider \"${parsed.provider}\" is not configured. Set the API key first.`,\n provider: parsed.provider,\n },\n });\n }\n\n try {\n resolveModel(modelRef);\n } catch {\n return c.json({\n ok: true,\n payload: {\n valid: false,\n reason: 'model_not_found',\n message: `Model not found in registry: ${modelRef}`,\n provider: parsed.provider,\n model: parsed.model,\n },\n });\n }\n\n return c.json({\n ok: true,\n payload: {\n valid: true,\n provider: parsed.provider,\n model: parsed.model,\n },\n });\n });\n\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"agents.js","names":[],"sources":["../../../../../src/gateway/hono/routes/agents.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { type Config, parseModelRef } from '../../../config/schema.js';\nimport type { LocalizedText } from '../../../config/localized-text.js';\nimport { normalizeLocalizedText } from '../../../config/localized-text.js';\nimport { getVoiceModelsConfig } from '../../../config/voice.js';\nimport {\n isProviderConfigured,\n resolveModel,\n} from '../../../providers/index.js';\nimport { normalizeAgentId } from '../../../agent/agent-scope.js';\nimport {\n deleteAgentAvatarFile,\n finalizeCreateAgentDirs,\n listAgentProfileFiles,\n listGatewayAgents,\n prepareCreateAgent,\n prepareCreateAgentsBatch,\n prepareDeleteAgent,\n prepareUpdateAgent,\n readAgentAvatarFile,\n readAgentProfileFile,\n runAfterDeletePurge,\n writeAgentAvatarFromBase64,\n writeAgentProfileFile,\n type CreateAgentBody,\n} from '../../agents-admin.js';\nimport {\n resolveImageGenerationCapabilities,\n resolveImageUnderstandingCapabilities,\n} from '../../image-capabilities.js';\nimport {\n agentModelFallbacksToArray,\n agentModelRefToString,\n} from '../lib/agent-model.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction parseProfileFiles(raw: unknown): Record<string, string> | undefined | { error: string } {\n if (raw === undefined) {\n return undefined;\n }\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n return { error: 'profileFiles must be an object' };\n }\n const profileFiles: Record<string, string> = {};\n for (const [name, content] of Object.entries(raw as Record<string, unknown>)) {\n if (typeof content !== 'string') {\n return { error: `profileFiles[\"${name}\"] must be a string` };\n }\n profileFiles[name] = content;\n }\n return profileFiles;\n}\n\nfunction isParseError(value: unknown): value is { error: string } {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'error' in value &&\n typeof (value as { error: string }).error === 'string'\n );\n}\n\nfunction parseLocalizedText(raw: unknown, fieldName: string): LocalizedText | undefined | { error: string } {\n if (raw === undefined) {\n return undefined;\n }\n if (typeof raw === 'string') {\n return raw;\n }\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n return { error: `${fieldName} must be a string or locale map` };\n }\n const localized: Record<string, string> = {};\n for (const [locale, text] of Object.entries(raw as Record<string, unknown>)) {\n if (typeof text !== 'string') {\n return { error: `${fieldName}.${locale} must be a string` };\n }\n localized[locale] = text;\n }\n const normalized = normalizeLocalizedText(localized);\n return normalized;\n}\n\nfunction parseCreateAgentBody(raw: unknown): CreateAgentBody | { error: string } {\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n return { error: 'each agent must be an object' };\n }\n const body = raw as Record<string, unknown>;\n const parsedName = parseLocalizedText(body.name, 'name');\n if (isParseError(parsedName)) {\n return parsedName;\n }\n const parsedDescription = parseLocalizedText(body.description, 'description');\n if (isParseError(parsedDescription)) {\n return parsedDescription;\n }\n const name = parsedName ?? '';\n const workspace = typeof body.workspace === 'string' ? body.workspace : '';\n const model = typeof body.model === 'string' ? body.model : undefined;\n const agentDir = typeof body.agentDir === 'string' ? body.agentDir : undefined;\n const description = parsedDescription;\n const id = typeof body.id === 'string' ? body.id : undefined;\n const toolsDisable = Array.isArray(body.toolsDisable)\n ? body.toolsDisable.map((x: unknown) => String(x).trim()).filter(Boolean)\n : undefined;\n let profileFiles: Record<string, string> | undefined;\n if (Object.hasOwn(body, 'profileFiles')) {\n const parsed = parseProfileFiles(body.profileFiles);\n if (isParseError(parsed)) {\n return parsed;\n }\n profileFiles = parsed;\n }\n const cloneFrom = typeof body.cloneFrom === 'string' ? body.cloneFrom : undefined;\n return {\n name,\n workspace,\n ...(model !== undefined ? { model } : {}),\n ...(agentDir !== undefined ? { agentDir } : {}),\n ...(id !== undefined ? { id } : {}),\n ...(description !== undefined ? { description } : {}),\n ...(toolsDisable !== undefined ? { toolsDisable } : {}),\n ...(profileFiles !== undefined ? { profileFiles } : {}),\n ...(cloneFrom !== undefined ? { cloneFrom } : {}),\n };\n}\n\nexport function registerAgentsRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n authenticated.get('/api/agents', async (c) => {\n const cfg = service.currentConfig as Config;\n const locale = c.req.query('locale') || c.req.header('Accept-Language')?.split(',')[0]?.trim();\n const payload = await listGatewayAgents(cfg, { locale });\n return c.json({ ok: true, payload });\n });\n\n authenticated.post('/api/agents/batch', strictRateLimitMiddleware, async (c) => {\n let body: Record<string, unknown> = {};\n try {\n body = (await c.req.json()) as Record<string, unknown>;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const rawAgents = body.agents;\n if (!Array.isArray(rawAgents)) {\n return c.json({ ok: false, error: { message: 'agents must be an array' } }, 400);\n }\n const parsedAgents: CreateAgentBody[] = [];\n for (const raw of rawAgents) {\n const parsed = parseCreateAgentBody(raw);\n if ('error' in parsed) {\n return c.json({ ok: false, error: { message: parsed.error } }, 400);\n }\n parsedAgents.push(parsed);\n }\n const prep = prepareCreateAgentsBatch(service.currentConfig as Config, parsedAgents);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const { nextConfig, created } = prep.data;\n const save = await service.saveConfig(nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n const cfg = service.currentConfig as Config;\n const agentIds: string[] = [];\n for (const item of created) {\n const finalized = await finalizeCreateAgentDirs(cfg, item.agentId, {\n ...(item.profileFiles !== undefined ? { profileFiles: item.profileFiles } : {}),\n });\n if (finalized.ok === false) {\n return c.json({ ok: false, error: { message: finalized.error } }, finalized.status ?? 400);\n }\n agentIds.push(item.agentId);\n }\n const locale = c.req.query('locale') || c.req.header('Accept-Language')?.split(',')[0]?.trim();\n const agentsPayload = await listGatewayAgents(cfg, { locale });\n return c.json({\n ok: true,\n payload: {\n agentIds,\n agents: agentsPayload,\n },\n });\n });\n\n authenticated.post('/api/agents', strictRateLimitMiddleware, async (c) => {\n let body: Record<string, unknown> = {};\n try {\n body = (await c.req.json()) as Record<string, unknown>;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const parsed = parseCreateAgentBody(body);\n if ('error' in parsed) {\n return c.json({ ok: false, error: { message: parsed.error } }, 400);\n }\n const prep = prepareCreateAgent(service.currentConfig as Config, parsed);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const { nextConfig, agentId } = prep.data;\n const save = await service.saveConfig(nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n const finalized = await finalizeCreateAgentDirs(service.currentConfig as Config, agentId, {\n ...(parsed.profileFiles !== undefined ? { profileFiles: parsed.profileFiles } : {}),\n ...(parsed.cloneFrom ? { cloneFrom: parsed.cloneFrom } : {}),\n });\n if (finalized.ok === false) {\n return c.json({ ok: false, error: { message: finalized.error } }, finalized.status ?? 400);\n }\n const locale = c.req.query('locale') || c.req.header('Accept-Language')?.split(',')[0]?.trim();\n const agentsPayload = await listGatewayAgents(service.currentConfig as Config, { locale });\n return c.json({\n ok: true,\n payload: {\n agentId,\n agents: agentsPayload,\n },\n });\n });\n\n authenticated.patch('/api/agents/:id', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n let body: Record<string, unknown> = {};\n try {\n body = (await c.req.json()) as Record<string, unknown>;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const skillsPatch =\n body.skills === null\n ? null\n : Array.isArray(body.skills)\n ? body.skills.map((x: unknown) => String(x).trim()).filter(Boolean)\n : undefined;\n const toolsDisablePatch =\n body.toolsDisable === null\n ? null\n : Array.isArray(body.toolsDisable)\n ? body.toolsDisable.map((x: unknown) => String(x).trim()).filter(Boolean)\n : undefined;\n\n let namePatch: LocalizedText | undefined;\n if (Object.hasOwn(body, 'name')) {\n const parsedName = parseLocalizedText(body.name, 'name');\n if (isParseError(parsedName)) {\n return c.json({ ok: false, error: { message: parsedName.error } }, 400);\n }\n namePatch = parsedName;\n }\n let descriptionPatch: LocalizedText | null | undefined;\n if (Object.hasOwn(body, 'description')) {\n if (body.description === null) {\n descriptionPatch = null;\n } else {\n const parsedDescription = parseLocalizedText(body.description, 'description');\n if (isParseError(parsedDescription)) {\n return c.json({ ok: false, error: { message: parsedDescription.error } }, 400);\n }\n descriptionPatch = parsedDescription;\n }\n }\n\n const prep = prepareUpdateAgent(service.currentConfig as Config, id, {\n name: namePatch,\n ...(descriptionPatch !== undefined ? { description: descriptionPatch } : {}),\n workspace: typeof body.workspace === 'string' ? body.workspace : undefined,\n model:\n body.model === null\n ? null\n : typeof body.model === 'string'\n ? body.model\n : undefined,\n agentDir:\n body.agentDir === null\n ? null\n : typeof body.agentDir === 'string'\n ? body.agentDir\n : undefined,\n setDefault: body.setDefault === true,\n ...(skillsPatch !== undefined ? { skills: skillsPatch } : {}),\n ...(toolsDisablePatch !== undefined ? { toolsDisable: toolsDisablePatch } : {}),\n });\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const save = await service.saveConfig(prep.data.nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n const locale = c.req.query('locale') || c.req.header('Accept-Language')?.split(',')[0]?.trim();\n const agentsPayload = await listGatewayAgents(service.currentConfig as Config, { locale });\n return c.json({ ok: true, payload: agentsPayload });\n });\n\n authenticated.delete('/api/agents/:id', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const purge = c.req.query('purge') === '1' || c.req.query('purge') === 'true';\n const prep = prepareDeleteAgent(service.currentConfig as Config, id);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const { nextConfig, agentId } = prep.data;\n const save = await service.saveConfig(nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n if (purge) {\n await runAfterDeletePurge(service.currentConfig as Config, agentId);\n }\n const locale = c.req.query('locale') || c.req.header('Accept-Language')?.split(',')[0]?.trim();\n const agentsPayload = await listGatewayAgents(service.currentConfig as Config, { locale });\n return c.json({\n ok: true,\n payload: { agentId, purged: purge, agents: agentsPayload },\n });\n });\n\n authenticated.get('/api/agents/:id/avatar', async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const res = await readAgentAvatarFile(service.currentConfig as Config, id);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return new Response(res.data.buffer, {\n status: 200,\n headers: {\n 'Content-Type': res.data.contentType,\n 'Cache-Control': 'private, max-age=3600',\n },\n });\n });\n\n authenticated.put('/api/agents/:id/avatar', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n let body: Record<string, unknown> = {};\n try {\n body = (await c.req.json()) as Record<string, unknown>;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const base64 = typeof body.base64 === 'string' ? body.base64 : '';\n const mimeType = typeof body.mimeType === 'string' ? body.mimeType : '';\n const res = await writeAgentAvatarFromBase64(service.currentConfig as Config, id, base64, mimeType);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: { agentId: res.data.agentId } });\n });\n\n authenticated.delete('/api/agents/:id/avatar', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const res = await deleteAgentAvatarFile(service.currentConfig as Config, id);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: { agentId: res.data.agentId } });\n });\n\n authenticated.get('/api/agents/:id/files', async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const res = await listAgentProfileFiles(service.currentConfig as Config, id);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: res.data });\n });\n\n authenticated.get('/api/agents/:id/files/:name', async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const name = decodeURIComponent(c.req.param('name') ?? '');\n const res = await readAgentProfileFile(service.currentConfig as Config, id, name);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: { agentId: res.data.agentId, name, content: res.data.content } });\n });\n\n authenticated.put('/api/agents/:id/files/:name', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const name = decodeURIComponent(c.req.param('name') ?? '');\n let content = '';\n try {\n const body = (await c.req.json()) as { content?: unknown };\n content = typeof body.content === 'string' ? body.content : '';\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const res = await writeAgentProfileFile(service.currentConfig as Config, id, name, content);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: { agentId: res.data.agentId, name } });\n });\n\n // GET /api/voice/models - Get available STT/TTS models\n authenticated.get('/api/voice/models', (c) => {\n const models = getVoiceModelsConfig();\n return c.json({ ok: true, payload: { models } });\n });\n\n authenticated.get('/api/image/capabilities', async (c) => {\n const config = service.currentConfig as Config;\n const imageGenerationProviders = await resolveImageGenerationCapabilities(config);\n const imageUnderstandingProviders = await resolveImageUnderstandingCapabilities(config);\n return c.json({\n ok: true,\n payload: {\n current: {\n imageModel: agentModelRefToString(config.agents?.defaults?.imageModel) ?? null,\n imageModelFallbacks: agentModelFallbacksToArray(config.agents?.defaults?.imageModel),\n imageGenerationModel: agentModelRefToString(config.agents?.defaults?.imageGenerationModel) ?? null,\n imageGenerationModelFallbacks: agentModelFallbacksToArray(\n config.agents?.defaults?.imageGenerationModel,\n ),\n mediaMaxMb: config.agents?.defaults?.mediaMaxMb ?? null,\n },\n imageGeneration: { providers: imageGenerationProviders },\n imageUnderstanding: { providers: imageUnderstandingProviders },\n },\n });\n });\n\n authenticated.post('/api/image/validate-model', strictRateLimitMiddleware, async (c) => {\n let body: { modelRef?: unknown };\n try {\n body = (await c.req.json()) as { modelRef?: unknown };\n } catch {\n return c.json({ ok: false, error: 'Invalid JSON' }, 400);\n }\n const modelRef = body.modelRef;\n if (!modelRef || typeof modelRef !== 'string') {\n return c.json({ ok: false, error: 'modelRef is required' }, 400);\n }\n\n const parsed = parseModelRef(modelRef);\n if (!parsed) {\n return c.json({\n ok: true,\n payload: {\n valid: false,\n reason: 'invalid_format',\n message: 'Model reference must be in \"provider/model\" format',\n },\n });\n }\n\n const configured = await isProviderConfigured(parsed.provider);\n if (!configured) {\n return c.json({\n ok: true,\n payload: {\n valid: false,\n reason: 'provider_not_configured',\n message: `Provider \"${parsed.provider}\" is not configured. Set the API key first.`,\n provider: parsed.provider,\n },\n });\n }\n\n try {\n resolveModel(modelRef);\n } catch {\n return c.json({\n ok: true,\n payload: {\n valid: false,\n reason: 'model_not_found',\n message: `Model not found in registry: ${modelRef}`,\n provider: parsed.provider,\n model: parsed.model,\n },\n });\n }\n\n return c.json({\n ok: true,\n payload: {\n valid: true,\n provider: parsed.provider,\n model: parsed.model,\n },\n });\n });\n\n}\n"],"mappings":";;;;;;;;;aAEuE;qBAEI;gBAKtC;kBAC4B;AA2BjE,SAAS,kBAAkB,KAAsE;AAC/F,KAAI,QAAQ,KAAA,EACV;AAEF,KAAI,QAAQ,QAAQ,OAAO,QAAQ,YAAY,MAAM,QAAQ,IAAI,CAC/D,QAAO,EAAE,OAAO,kCAAkC;CAEpD,MAAM,eAAuC,EAAE;AAC/C,MAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,IAA+B,EAAE;AAC5E,MAAI,OAAO,YAAY,SACrB,QAAO,EAAE,OAAO,iBAAiB,KAAK,sBAAsB;AAE9D,eAAa,QAAQ;;AAEvB,QAAO;;AAGT,SAAS,aAAa,OAA4C;AAChE,QACE,OAAO,UAAU,YACjB,UAAU,QACV,WAAW,SACX,OAAQ,MAA4B,UAAU;;AAIlD,SAAS,mBAAmB,KAAc,WAAkE;AAC1G,KAAI,QAAQ,KAAA,EACV;AAEF,KAAI,OAAO,QAAQ,SACjB,QAAO;AAET,KAAI,QAAQ,QAAQ,OAAO,QAAQ,YAAY,MAAM,QAAQ,IAAI,CAC/D,QAAO,EAAE,OAAO,GAAG,UAAU,kCAAkC;CAEjE,MAAM,YAAoC,EAAE;AAC5C,MAAK,MAAM,CAAC,QAAQ,SAAS,OAAO,QAAQ,IAA+B,EAAE;AAC3E,MAAI,OAAO,SAAS,SAClB,QAAO,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,oBAAoB;AAE7D,YAAU,UAAU;;AAGtB,QADmB,uBAAuB,UACzB;;AAGnB,SAAS,qBAAqB,KAAmD;AAC/E,KAAI,QAAQ,QAAQ,OAAO,QAAQ,YAAY,MAAM,QAAQ,IAAI,CAC/D,QAAO,EAAE,OAAO,gCAAgC;CAElD,MAAM,OAAO;CACb,MAAM,aAAa,mBAAmB,KAAK,MAAM,OAAO;AACxD,KAAI,aAAa,WAAW,CAC1B,QAAO;CAET,MAAM,oBAAoB,mBAAmB,KAAK,aAAa,cAAc;AAC7E,KAAI,aAAa,kBAAkB,CACjC,QAAO;CAET,MAAM,OAAO,cAAc;CAC3B,MAAM,YAAY,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;CACxE,MAAM,QAAQ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,KAAA;CAC5D,MAAM,WAAW,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW,KAAA;CACrE,MAAM,cAAc;CACpB,MAAM,KAAK,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK,KAAA;CACnD,MAAM,eAAe,MAAM,QAAQ,KAAK,aAAa,GACjD,KAAK,aAAa,KAAK,MAAe,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,QAAQ,GACvE,KAAA;CACJ,IAAI;AACJ,KAAI,OAAO,OAAO,MAAM,eAAe,EAAE;EACvC,MAAM,SAAS,kBAAkB,KAAK,aAAa;AACnD,MAAI,aAAa,OAAO,CACtB,QAAO;AAET,iBAAe;;CAEjB,MAAM,YAAY,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY,KAAA;AACxE,QAAO;EACL;EACA;EACA,GAAI,UAAU,KAAA,IAAY,EAAE,OAAO,GAAG,EAAE;EACxC,GAAI,aAAa,KAAA,IAAY,EAAE,UAAU,GAAG,EAAE;EAC9C,GAAI,OAAO,KAAA,IAAY,EAAE,IAAI,GAAG,EAAE;EAClC,GAAI,gBAAgB,KAAA,IAAY,EAAE,aAAa,GAAG,EAAE;EACpD,GAAI,iBAAiB,KAAA,IAAY,EAAE,cAAc,GAAG,EAAE;EACtD,GAAI,iBAAiB,KAAA,IAAY,EAAE,cAAc,GAAG,EAAE;EACtD,GAAI,cAAc,KAAA,IAAY,EAAE,WAAW,GAAG,EAAE;EACjD;;AAGH,SAAgB,qBAAqB,eAAqB,MAAoC;CAC5F,MAAM,EAAE,SAAS,8BAA8B;AAE/C,eAAc,IAAI,eAAe,OAAO,MAAM;EAC5C,MAAM,MAAM,QAAQ;EAEpB,MAAM,UAAU,MAAM,kBAAkB,KAAK,EAAE,QADhC,EAAE,IAAI,MAAM,SAAS,IAAI,EAAE,IAAI,OAAO,kBAAkB,EAAE,MAAM,IAAI,CAAC,IAAI,MAAM,EACvC,CAAC;AACxD,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM;GAAS,CAAC;GACpC;AAEF,eAAc,KAAK,qBAAqB,2BAA2B,OAAO,MAAM;EAC9E,IAAI,OAAgC,EAAE;AACtC,MAAI;AACF,UAAQ,MAAM,EAAE,IAAI,MAAM;UACpB;AACN,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,gBAAgB;IAAE,EAAE,IAAI;;EAEvE,MAAM,YAAY,KAAK;AACvB,MAAI,CAAC,MAAM,QAAQ,UAAU,CAC3B,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,2BAA2B;GAAE,EAAE,IAAI;EAElF,MAAM,eAAkC,EAAE;AAC1C,OAAK,MAAM,OAAO,WAAW;GAC3B,MAAM,SAAS,qBAAqB,IAAI;AACxC,OAAI,WAAW,OACb,QAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,OAAO,OAAO;IAAE,EAAE,IAAI;AAErE,gBAAa,KAAK,OAAO;;EAE3B,MAAM,OAAO,yBAAyB,QAAQ,eAAyB,aAAa;AACpF,MAAI,KAAK,OAAO,MACd,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,KAAK,OAAO;GAAE,EAAE,KAAK,UAAU,IAAI;EAElF,MAAM,EAAE,YAAY,YAAY,KAAK;EACrC,MAAM,OAAO,MAAM,QAAQ,WAAW,WAAW;AACjD,MAAI,CAAC,KAAK,MACR,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,KAAK,SAAS,eAAe;GAAE,EAAE,IAAI;EAEpF,MAAM,MAAM,QAAQ;EACpB,MAAM,WAAqB,EAAE;AAC7B,OAAK,MAAM,QAAQ,SAAS;GAC1B,MAAM,YAAY,MAAM,wBAAwB,KAAK,KAAK,SAAS,EACjE,GAAI,KAAK,iBAAiB,KAAA,IAAY,EAAE,cAAc,KAAK,cAAc,GAAG,EAAE,EAC/E,CAAC;AACF,OAAI,UAAU,OAAO,MACnB,QAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,UAAU,OAAO;IAAE,EAAE,UAAU,UAAU,IAAI;AAE5F,YAAS,KAAK,KAAK,QAAQ;;EAG7B,MAAM,gBAAgB,MAAM,kBAAkB,KAAK,EAAE,QADtC,EAAE,IAAI,MAAM,SAAS,IAAI,EAAE,IAAI,OAAO,kBAAkB,EAAE,MAAM,IAAI,CAAC,IAAI,MAAM,EACjC,CAAC;AAC9D,SAAO,EAAE,KAAK;GACZ,IAAI;GACJ,SAAS;IACP;IACA,QAAQ;IACT;GACF,CAAC;GACF;AAEF,eAAc,KAAK,eAAe,2BAA2B,OAAO,MAAM;EACxE,IAAI,OAAgC,EAAE;AACtC,MAAI;AACF,UAAQ,MAAM,EAAE,IAAI,MAAM;UACpB;AACN,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,gBAAgB;IAAE,EAAE,IAAI;;EAEvE,MAAM,SAAS,qBAAqB,KAAK;AACzC,MAAI,WAAW,OACb,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,OAAO,OAAO;GAAE,EAAE,IAAI;EAErE,MAAM,OAAO,mBAAmB,QAAQ,eAAyB,OAAO;AACxE,MAAI,KAAK,OAAO,MACd,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,KAAK,OAAO;GAAE,EAAE,KAAK,UAAU,IAAI;EAElF,MAAM,EAAE,YAAY,YAAY,KAAK;EACrC,MAAM,OAAO,MAAM,QAAQ,WAAW,WAAW;AACjD,MAAI,CAAC,KAAK,MACR,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,KAAK,SAAS,eAAe;GAAE,EAAE,IAAI;EAEpF,MAAM,YAAY,MAAM,wBAAwB,QAAQ,eAAyB,SAAS;GACxF,GAAI,OAAO,iBAAiB,KAAA,IAAY,EAAE,cAAc,OAAO,cAAc,GAAG,EAAE;GAClF,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,WAAW,GAAG,EAAE;GAC5D,CAAC;AACF,MAAI,UAAU,OAAO,MACnB,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,UAAU,OAAO;GAAE,EAAE,UAAU,UAAU,IAAI;EAE5F,MAAM,SAAS,EAAE,IAAI,MAAM,SAAS,IAAI,EAAE,IAAI,OAAO,kBAAkB,EAAE,MAAM,IAAI,CAAC,IAAI,MAAM;EAC9F,MAAM,gBAAgB,MAAM,kBAAkB,QAAQ,eAAyB,EAAE,QAAQ,CAAC;AAC1F,SAAO,EAAE,KAAK;GACZ,IAAI;GACJ,SAAS;IACP;IACA,QAAQ;IACT;GACF,CAAC;GACF;AAEF,eAAc,MAAM,mBAAmB,2BAA2B,OAAO,MAAM;EAC7E,MAAM,KAAK,iBAAiB,EAAE,IAAI,MAAM,KAAK,IAAI,GAAG;EACpD,IAAI,OAAgC,EAAE;AACtC,MAAI;AACF,UAAQ,MAAM,EAAE,IAAI,MAAM;UACpB;AACN,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,gBAAgB;IAAE,EAAE,IAAI;;EAEvE,MAAM,cACJ,KAAK,WAAW,OACZ,OACA,MAAM,QAAQ,KAAK,OAAO,GACxB,KAAK,OAAO,KAAK,MAAe,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,QAAQ,GACjE,KAAA;EACR,MAAM,oBACJ,KAAK,iBAAiB,OAClB,OACA,MAAM,QAAQ,KAAK,aAAa,GAC9B,KAAK,aAAa,KAAK,MAAe,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,QAAQ,GACvE,KAAA;EAER,IAAI;AACJ,MAAI,OAAO,OAAO,MAAM,OAAO,EAAE;GAC/B,MAAM,aAAa,mBAAmB,KAAK,MAAM,OAAO;AACxD,OAAI,aAAa,WAAW,CAC1B,QAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,WAAW,OAAO;IAAE,EAAE,IAAI;AAEzE,eAAY;;EAEd,IAAI;AACJ,MAAI,OAAO,OAAO,MAAM,cAAc,CACpC,KAAI,KAAK,gBAAgB,KACvB,oBAAmB;OACd;GACL,MAAM,oBAAoB,mBAAmB,KAAK,aAAa,cAAc;AAC7E,OAAI,aAAa,kBAAkB,CACjC,QAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,kBAAkB,OAAO;IAAE,EAAE,IAAI;AAEhF,sBAAmB;;EAIvB,MAAM,OAAO,mBAAmB,QAAQ,eAAyB,IAAI;GACnE,MAAM;GACN,GAAI,qBAAqB,KAAA,IAAY,EAAE,aAAa,kBAAkB,GAAG,EAAE;GAC3E,WAAW,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY,KAAA;GACjE,OACE,KAAK,UAAU,OACX,OACA,OAAO,KAAK,UAAU,WACpB,KAAK,QACL,KAAA;GACR,UACE,KAAK,aAAa,OACd,OACA,OAAO,KAAK,aAAa,WACvB,KAAK,WACL,KAAA;GACR,YAAY,KAAK,eAAe;GAChC,GAAI,gBAAgB,KAAA,IAAY,EAAE,QAAQ,aAAa,GAAG,EAAE;GAC5D,GAAI,sBAAsB,KAAA,IAAY,EAAE,cAAc,mBAAmB,GAAG,EAAE;GAC/E,CAAC;AACF,MAAI,KAAK,OAAO,MACd,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,KAAK,OAAO;GAAE,EAAE,KAAK,UAAU,IAAI;EAElF,MAAM,OAAO,MAAM,QAAQ,WAAW,KAAK,KAAK,WAAW;AAC3D,MAAI,CAAC,KAAK,MACR,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,KAAK,SAAS,eAAe;GAAE,EAAE,IAAI;EAEpF,MAAM,SAAS,EAAE,IAAI,MAAM,SAAS,IAAI,EAAE,IAAI,OAAO,kBAAkB,EAAE,MAAM,IAAI,CAAC,IAAI,MAAM;EAC9F,MAAM,gBAAgB,MAAM,kBAAkB,QAAQ,eAAyB,EAAE,QAAQ,CAAC;AAC1F,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS;GAAe,CAAC;GACnD;AAEF,eAAc,OAAO,mBAAmB,2BAA2B,OAAO,MAAM;EAC9E,MAAM,KAAK,iBAAiB,EAAE,IAAI,MAAM,KAAK,IAAI,GAAG;EACpD,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,KAAK,OAAO,EAAE,IAAI,MAAM,QAAQ,KAAK;EACvE,MAAM,OAAO,mBAAmB,QAAQ,eAAyB,GAAG;AACpE,MAAI,KAAK,OAAO,MACd,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,KAAK,OAAO;GAAE,EAAE,KAAK,UAAU,IAAI;EAElF,MAAM,EAAE,YAAY,YAAY,KAAK;EACrC,MAAM,OAAO,MAAM,QAAQ,WAAW,WAAW;AACjD,MAAI,CAAC,KAAK,MACR,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,KAAK,SAAS,eAAe;GAAE,EAAE,IAAI;AAEpF,MAAI,MACF,OAAM,oBAAoB,QAAQ,eAAyB,QAAQ;EAErE,MAAM,SAAS,EAAE,IAAI,MAAM,SAAS,IAAI,EAAE,IAAI,OAAO,kBAAkB,EAAE,MAAM,IAAI,CAAC,IAAI,MAAM;EAC9F,MAAM,gBAAgB,MAAM,kBAAkB,QAAQ,eAAyB,EAAE,QAAQ,CAAC;AAC1F,SAAO,EAAE,KAAK;GACZ,IAAI;GACJ,SAAS;IAAE;IAAS,QAAQ;IAAO,QAAQ;IAAe;GAC3D,CAAC;GACF;AAEF,eAAc,IAAI,0BAA0B,OAAO,MAAM;EACvD,MAAM,KAAK,iBAAiB,EAAE,IAAI,MAAM,KAAK,IAAI,GAAG;EACpD,MAAM,MAAM,MAAM,oBAAoB,QAAQ,eAAyB,GAAG;AAC1E,MAAI,IAAI,OAAO,MACb,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,IAAI,OAAO;GAAE,EAAE,IAAI,UAAU,IAAI;AAEhF,SAAO,IAAI,SAAS,IAAI,KAAK,QAAQ;GACnC,QAAQ;GACR,SAAS;IACP,gBAAgB,IAAI,KAAK;IACzB,iBAAiB;IAClB;GACF,CAAC;GACF;AAEF,eAAc,IAAI,0BAA0B,2BAA2B,OAAO,MAAM;EAClF,MAAM,KAAK,iBAAiB,EAAE,IAAI,MAAM,KAAK,IAAI,GAAG;EACpD,IAAI,OAAgC,EAAE;AACtC,MAAI;AACF,UAAQ,MAAM,EAAE,IAAI,MAAM;UACpB;AACN,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,gBAAgB;IAAE,EAAE,IAAI;;EAEvE,MAAM,SAAS,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;EAC/D,MAAM,WAAW,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW;EACrE,MAAM,MAAM,MAAM,2BAA2B,QAAQ,eAAyB,IAAI,QAAQ,SAAS;AACnG,MAAI,IAAI,OAAO,MACb,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,IAAI,OAAO;GAAE,EAAE,IAAI,UAAU,IAAI;AAEhF,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,EAAE,SAAS,IAAI,KAAK,SAAS;GAAE,CAAC;GACnE;AAEF,eAAc,OAAO,0BAA0B,2BAA2B,OAAO,MAAM;EACrF,MAAM,KAAK,iBAAiB,EAAE,IAAI,MAAM,KAAK,IAAI,GAAG;EACpD,MAAM,MAAM,MAAM,sBAAsB,QAAQ,eAAyB,GAAG;AAC5E,MAAI,IAAI,OAAO,MACb,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,IAAI,OAAO;GAAE,EAAE,IAAI,UAAU,IAAI;AAEhF,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,EAAE,SAAS,IAAI,KAAK,SAAS;GAAE,CAAC;GACnE;AAEF,eAAc,IAAI,yBAAyB,OAAO,MAAM;EACtD,MAAM,KAAK,iBAAiB,EAAE,IAAI,MAAM,KAAK,IAAI,GAAG;EACpD,MAAM,MAAM,MAAM,sBAAsB,QAAQ,eAAyB,GAAG;AAC5E,MAAI,IAAI,OAAO,MACb,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,IAAI,OAAO;GAAE,EAAE,IAAI,UAAU,IAAI;AAEhF,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,IAAI;GAAM,CAAC;GAC9C;AAEF,eAAc,IAAI,+BAA+B,OAAO,MAAM;EAC5D,MAAM,KAAK,iBAAiB,EAAE,IAAI,MAAM,KAAK,IAAI,GAAG;EACpD,MAAM,OAAO,mBAAmB,EAAE,IAAI,MAAM,OAAO,IAAI,GAAG;EAC1D,MAAM,MAAM,MAAM,qBAAqB,QAAQ,eAAyB,IAAI,KAAK;AACjF,MAAI,IAAI,OAAO,MACb,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,IAAI,OAAO;GAAE,EAAE,IAAI,UAAU,IAAI;AAEhF,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS;IAAE,SAAS,IAAI,KAAK;IAAS;IAAM,SAAS,IAAI,KAAK;IAAS;GAAE,CAAC;GACpG;AAEF,eAAc,IAAI,+BAA+B,2BAA2B,OAAO,MAAM;EACvF,MAAM,KAAK,iBAAiB,EAAE,IAAI,MAAM,KAAK,IAAI,GAAG;EACpD,MAAM,OAAO,mBAAmB,EAAE,IAAI,MAAM,OAAO,IAAI,GAAG;EAC1D,IAAI,UAAU;AACd,MAAI;GACF,MAAM,OAAQ,MAAM,EAAE,IAAI,MAAM;AAChC,aAAU,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU;UACtD;AACN,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,gBAAgB;IAAE,EAAE,IAAI;;EAEvE,MAAM,MAAM,MAAM,sBAAsB,QAAQ,eAAyB,IAAI,MAAM,QAAQ;AAC3F,MAAI,IAAI,OAAO,MACb,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,IAAI,OAAO;GAAE,EAAE,IAAI,UAAU,IAAI;AAEhF,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS;IAAE,SAAS,IAAI,KAAK;IAAS;IAAM;GAAE,CAAC;GACzE;AAGF,eAAc,IAAI,sBAAsB,MAAM;EAC5C,MAAM,SAAS,sBAAsB;AACrC,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,EAAE,QAAQ;GAAE,CAAC;GAChD;AAEF,eAAc,IAAI,2BAA2B,OAAO,MAAM;EACxD,MAAM,SAAS,QAAQ;EACvB,MAAM,2BAA2B,MAAM,mCAAmC,OAAO;EACjF,MAAM,8BAA8B,MAAM,sCAAsC,OAAO;AACvF,SAAO,EAAE,KAAK;GACZ,IAAI;GACJ,SAAS;IACP,SAAS;KACP,YAAY,sBAAsB,OAAO,QAAQ,UAAU,WAAW,IAAI;KAC1E,qBAAqB,2BAA2B,OAAO,QAAQ,UAAU,WAAW;KACpF,sBAAsB,sBAAsB,OAAO,QAAQ,UAAU,qBAAqB,IAAI;KAC9F,+BAA+B,2BAC7B,OAAO,QAAQ,UAAU,qBAC1B;KACD,YAAY,OAAO,QAAQ,UAAU,cAAc;KACpD;IACD,iBAAiB,EAAE,WAAW,0BAA0B;IACxD,oBAAoB,EAAE,WAAW,6BAA6B;IAC/D;GACF,CAAC;GACF;AAEF,eAAc,KAAK,6BAA6B,2BAA2B,OAAO,MAAM;EACtF,IAAI;AACJ,MAAI;AACF,UAAQ,MAAM,EAAE,IAAI,MAAM;UACpB;AACN,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO;IAAgB,EAAE,IAAI;;EAE1D,MAAM,WAAW,KAAK;AACtB,MAAI,CAAC,YAAY,OAAO,aAAa,SACnC,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO;GAAwB,EAAE,IAAI;EAGlE,MAAM,SAAS,cAAc,SAAS;AACtC,MAAI,CAAC,OACH,QAAO,EAAE,KAAK;GACZ,IAAI;GACJ,SAAS;IACP,OAAO;IACP,QAAQ;IACR,SAAS;IACV;GACF,CAAC;AAIJ,MAAI,CAAC,MADoB,qBAAqB,OAAO,SAAS,CAE5D,QAAO,EAAE,KAAK;GACZ,IAAI;GACJ,SAAS;IACP,OAAO;IACP,QAAQ;IACR,SAAS,aAAa,OAAO,SAAS;IACtC,UAAU,OAAO;IAClB;GACF,CAAC;AAGJ,MAAI;AACF,gBAAa,SAAS;UAChB;AACN,UAAO,EAAE,KAAK;IACZ,IAAI;IACJ,SAAS;KACP,OAAO;KACP,QAAQ;KACR,SAAS,gCAAgC;KACzC,UAAU,OAAO;KACjB,OAAO,OAAO;KACf;IACF,CAAC;;AAGJ,SAAO,EAAE,KAAK;GACZ,IAAI;GACJ,SAAS;IACP,OAAO;IACP,UAAU,OAAO;IACjB,OAAO,OAAO;IACf;GACF,CAAC;GACF"}
@@ -7,8 +7,8 @@ import { createOAuthHandler } from "../oauth.js";
7
7
  import { createOAuthAsyncHandler } from "../oauth-async.js";
8
8
  import { extensionAssetMimeType } from "../lib/extension-assets.js";
9
9
  import { loadExtensionStore, saveExtensionStore } from "../lib/extension-store.js";
10
- import { relative, resolve } from "node:path";
11
10
  import { existsSync, readFileSync, statSync } from "node:fs";
11
+ import { relative, resolve } from "node:path";
12
12
  //#region src/gateway/hono/routes/auth-registry-extensions.ts
13
13
  init_providers();
14
14
  const EXTENSION_ASSET_CSP = "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; connect-src 'none'; frame-ancestors 'self'; frame-src 'none'; base-uri 'none'; object-src 'none'; form-action 'none'";
@@ -1,5 +1,5 @@
1
- import { normalizePatchAgentImageGenerationModel, normalizePatchAgentModel, normalizePatchTypedModels } from "../../lib/agent-model.js";
2
1
  import { isMaskedSecretPatchValue } from "../../lib/mask-secret-length.js";
2
+ import { normalizePatchAgentImageGenerationModel, normalizePatchAgentModel, normalizePatchTypedModels } from "../../lib/agent-model.js";
3
3
  //#region src/gateway/hono/routes/config-patch/agents.ts
4
4
  function applyAgentsPatch(config, body) {
5
5
  if (!body.agents?.defaults) return;
@@ -1,5 +1,5 @@
1
- import { BindingsConfigSchema, McpConfigSchema, init_schema } from "../../../../config/schema.js";
2
1
  import { CredentialResolver, init_credentials } from "../../../../auth/credentials.js";
2
+ import { BindingsConfigSchema, McpConfigSchema, init_schema } from "../../../../config/schema.js";
3
3
  import { canonicalizeConfiguredMcpServer } from "../../../../config/mcp-config-normalize.js";
4
4
  import { mergeCronConfigPatch, mergeGatewaySkillsMarketplacePatch, mergeGoalsConfigPatch, mergeSessionConfigPatch, mergeUpdateConfigPatch } from "../../../../config/web-patch.js";
5
5
  import { assertGatewayAuthConfigured, resolveGatewayAuth } from "../../../auth.js";
@@ -5,8 +5,8 @@ import { getWorkspacePath } from "../../../config/workspace-path-helpers.js";
5
5
  import { parseDreamingLastRunFile } from "../../../agent/memory/dreaming/last-run.js";
6
6
  import { readDreamingEvents } from "../../../agent/memory/dreaming/events.js";
7
7
  import { previewDreamingDeepPromotion } from "../../../agent/memory/dreaming/preview.js";
8
- import path from "node:path";
9
8
  import fs from "node:fs/promises";
9
+ import path from "node:path";
10
10
  //#region src/gateway/hono/routes/dreaming.ts
11
11
  function isRecord(v) {
12
12
  return v !== null && typeof v === "object" && !Array.isArray(v);
@@ -1,8 +1,8 @@
1
1
  import { createLogger } from "../../../utils/logger/index.js";
2
2
  import { init_logger } from "../../../utils/logger.js";
3
- import * as os$1 from "node:os";
4
- import * as path$1 from "node:path";
5
3
  import { readdir, realpath, stat } from "node:fs/promises";
4
+ import * as path$1 from "node:path";
5
+ import * as os$1 from "node:os";
6
6
  //#region src/gateway/hono/routes/host-fs.ts
7
7
  init_logger();
8
8
  const log = createLogger("HostFs");
@@ -1,8 +1,8 @@
1
1
  import { resolveModelsJsonPath } from "../../../config/paths.js";
2
+ import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
2
3
  import { init_resolve_config_value, testApiKeyResolution } from "../../../config/resolve-config-value.js";
3
4
  import { init_models_json, loadModelsJson, saveModelsJson, validateModelsConfig } from "../../../config/models-json.js";
4
5
  import { getModelRegistry } from "../../../providers/model-registry.js";
5
- import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
6
6
  import { getProviderRegistry, init_plugin_registry } from "../../../providers/plugin-registry.js";
7
7
  import { PROVIDER_META, getAllModels, getAllProviders, getAvailableModels, getProviderAuthState, init_providers, isProviderConfigured } from "../../../providers/index.js";
8
8
  import { getImageGenerationProvider } from "../../../agent/image/generation/provider-registry.js";
@@ -13,8 +13,8 @@ import { getClientIpFromHeaders } from "../../security/loopback.js";
13
13
  import { renderFolderLandingPage, renderShareExpiredPage, renderShareLandingPage } from "../../../share/share-landing.js";
14
14
  import { consumeSharePublicLimit } from "../../../share/share-rate-limit.js";
15
15
  import { createZipStream, planDirectoryFiles } from "../../../share/share-zip.js";
16
- import { createReadStream } from "node:fs";
17
16
  import { createHash } from "node:crypto";
17
+ import { createReadStream } from "node:fs";
18
18
  import { stat } from "node:fs/promises";
19
19
  import { Readable } from "node:stream";
20
20
  //#region src/gateway/hono/routes/shares.ts
@@ -5,61 +5,22 @@ import { loadConfig } from "../../../config/loader.js";
5
5
  import "../../../config/index.js";
6
6
  import { acquireUpdateLock } from "../../../infra/update-lock.js";
7
7
  import { normalizeUpdateChannel } from "../../../infra/update-channels.js";
8
- import { detectInstallKind, resolvePackageRoot } from "../../../infra/update-check.js";
9
8
  import { getUpdateAvailable, runGatewayUpdateCheck } from "../../../infra/update-startup.js";
10
- import { runAutoUpdateCommand, runAutoUpdateCommandWithProgress } from "../../../infra/update-runner.js";
9
+ import { formatUpdateApiResult, runGatewayUpdateWithPostSteps } from "../../../infra/update-runner.js";
11
10
  import { streamSSE } from "hono/streaming";
12
11
  //#region src/gateway/hono/routes/update.ts
13
12
  init_package_version();
14
13
  init_logger();
15
14
  const log = createLogger("GatewayUpdate");
16
- function parseUpdateCliJson(stdout) {
17
- const t = stdout.trim();
18
- if (!t) return null;
19
- try {
20
- const parsed = JSON.parse(t);
21
- return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null;
22
- } catch {
23
- const lines = t.split("\n").filter(Boolean);
24
- for (let i = lines.length - 1; i >= 0; i--) {
25
- const line = lines[i].trim();
26
- if (!line.startsWith("{")) continue;
27
- try {
28
- const parsed = JSON.parse(line);
29
- if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) return parsed;
30
- } catch {}
31
- }
32
- }
33
- return null;
34
- }
35
- function isPreconditionFail(x) {
36
- return !x.ok;
37
- }
38
- async function npmUpdatePreconditions(service) {
39
- const channel = normalizeUpdateChannel(loadConfig(service.getHealth().configPath).update?.channel) ?? "stable";
40
- const root = await resolvePackageRoot();
41
- if (root) {
42
- if (await detectInstallKind(root) === "git") return {
43
- ok: false,
44
- status: 400,
45
- body: {
46
- ok: false,
47
- error: "git-checkout",
48
- message: "Running from a git checkout. Use `git pull` in the repo, or install from npm to use one-click update."
49
- }
50
- };
51
- }
15
+ function mapUpdateFailure(result, channel) {
16
+ const apiResult = formatUpdateApiResult(result, channel);
52
17
  return {
53
- ok: true,
54
- channel,
55
- root
18
+ apiResult,
19
+ message: typeof apiResult.message === "string" ? apiResult.message : result.reason ?? "Update failed"
56
20
  };
57
21
  }
58
22
  function registerUpdateRoutes(authenticated, deps) {
59
23
  const { strictRateLimitMiddleware, service } = deps;
60
- /**
61
- * GET /api/update/status
62
- */
63
24
  authenticated.get("/api/update/status", (c) => {
64
25
  const update = getUpdateAvailable();
65
26
  return c.json({
@@ -72,9 +33,6 @@ function registerUpdateRoutes(authenticated, deps) {
72
33
  }
73
34
  });
74
35
  });
75
- /**
76
- * POST /api/update/check
77
- */
78
36
  authenticated.post("/api/update/check", strictRateLimitMiddleware, async (c) => {
79
37
  await runGatewayUpdateCheck({
80
38
  config: loadConfig(service.getHealth().configPath),
@@ -94,55 +52,49 @@ function registerUpdateRoutes(authenticated, deps) {
94
52
  }
95
53
  });
96
54
  });
97
- /**
98
- * POST /api/update/run — one-click npm install (OpenClaw-style). Rejects git checkouts.
99
- */
100
55
  authenticated.post("/api/update/run", strictRateLimitMiddleware, async (c) => {
101
- const pre = await npmUpdatePreconditions(service);
102
- if (isPreconditionFail(pre)) return c.json(pre.body, pre.status);
56
+ const channel = normalizeUpdateChannel(loadConfig(service.getHealth().configPath).update?.channel) ?? "stable";
103
57
  const lock = await acquireUpdateLock("gateway");
104
58
  if (!lock) return c.json({
105
59
  ok: false,
106
60
  error: "busy",
107
61
  message: "Another update is already in progress."
108
62
  }, 409);
109
- const { channel, root } = pre;
110
63
  try {
111
- log.info({ channel }, "Gateway: starting one-click npm update");
112
- const result = await runAutoUpdateCommand({
64
+ log.info({ channel }, "Gateway: starting in-process update");
65
+ const result = await runGatewayUpdateWithPostSteps({
113
66
  channel,
114
- root
67
+ cwd: process.cwd(),
68
+ argv1: process.argv[1],
69
+ triggerInProcessRestart: () => service.triggerGatewayProcessRestart()
115
70
  });
116
- const parsed = parseUpdateCliJson(result.stdout ?? "");
117
- if (result.ok && parsed?.status === "skipped" && parsed?.reason === "git-checkout") return c.json({
118
- ok: false,
119
- error: "git-checkout",
120
- message: String(parsed.message ?? "Git checkout — use git pull instead.")
121
- }, 400);
122
- if (!result.ok) {
123
- const installMessage = typeof parsed?.message === "string" ? parsed.message : typeof parsed?.stderrTail === "string" ? parsed.stderrTail : void 0;
71
+ const apiResult = formatUpdateApiResult(result, channel);
72
+ if (result.status === "error") {
73
+ const { message } = mapUpdateFailure(result, channel);
124
74
  log.warn({
125
75
  channel,
126
- exitCode: result.exitCode,
127
76
  reason: result.reason
128
- }, "Gateway: one-click npm update failed");
77
+ }, "Gateway: update failed");
129
78
  return c.json({
130
79
  ok: false,
131
80
  error: "update-failed",
132
- message: installMessage || result.stderr?.trim() || result.reason || `Update exited with code ${result.exitCode ?? "unknown"}`,
133
- result: parsed
81
+ message,
82
+ result: apiResult
134
83
  });
135
84
  }
136
- log.info({ channel }, "Gateway: one-click npm update finished");
85
+ log.info({
86
+ channel,
87
+ mode: result.mode
88
+ }, "Gateway: update finished");
137
89
  return c.json({
138
90
  ok: true,
139
- result: parsed
91
+ result: apiResult
140
92
  });
141
93
  } catch (err) {
142
94
  log.error({
143
95
  err,
144
96
  channel
145
- }, "Gateway: one-click npm update threw");
97
+ }, "Gateway: update threw");
146
98
  return c.json({
147
99
  ok: false,
148
100
  error: "internal",
@@ -152,13 +104,8 @@ function registerUpdateRoutes(authenticated, deps) {
152
104
  await lock.release();
153
105
  }
154
106
  });
155
- /**
156
- * POST /api/update/run/stream — SSE-streamed npm update with progress lines.
157
- */
158
107
  authenticated.post("/api/update/run/stream", strictRateLimitMiddleware, async (c) => {
159
- const pre = await npmUpdatePreconditions(service);
160
- if (isPreconditionFail(pre)) return c.json(pre.body, pre.status);
161
- const { channel, root } = pre;
108
+ const channel = normalizeUpdateChannel(loadConfig(service.getHealth().configPath).update?.channel) ?? "stable";
162
109
  return streamSSE(c, async (stream) => {
163
110
  const lock = await acquireUpdateLock("gateway");
164
111
  if (!lock) {
@@ -173,42 +120,43 @@ function registerUpdateRoutes(authenticated, deps) {
173
120
  return;
174
121
  }
175
122
  try {
176
- log.info({ channel }, "Gateway: starting streamed one-click npm update");
177
- const result = await runAutoUpdateCommandWithProgress({
123
+ log.info({ channel }, "Gateway: starting streamed in-process update");
124
+ const result = await runGatewayUpdateWithPostSteps({
178
125
  channel,
179
- root,
180
- onProgress: async (line, source) => {
181
- await stream.writeSSE({
182
- event: "progress",
183
- data: JSON.stringify({
184
- line,
185
- source
186
- })
187
- });
126
+ cwd: process.cwd(),
127
+ argv1: process.argv[1],
128
+ triggerInProcessRestart: () => service.triggerGatewayProcessRestart(),
129
+ progress: {
130
+ onStepStart: async (step) => {
131
+ await stream.writeSSE({
132
+ event: "progress",
133
+ data: JSON.stringify({
134
+ line: `[${step.index + 1}/${step.total}] ${step.name}: ${step.command}`,
135
+ source: "stdout"
136
+ })
137
+ });
138
+ },
139
+ onStepComplete: async (step) => {
140
+ if (step.stderrTail) await stream.writeSSE({
141
+ event: "progress",
142
+ data: JSON.stringify({
143
+ line: step.stderrTail,
144
+ source: "stderr"
145
+ })
146
+ });
147
+ }
188
148
  }
189
149
  });
190
- const parsed = parseUpdateCliJson(result.stdout ?? "");
191
- if (result.ok && parsed?.status === "skipped" && parsed?.reason === "git-checkout") {
192
- await stream.writeSSE({
193
- event: "result",
194
- data: JSON.stringify({
195
- ok: false,
196
- error: "git-checkout",
197
- message: String(parsed.message ?? "Git checkout — use git pull instead.")
198
- })
199
- });
200
- return;
201
- }
202
- if (!result.ok) {
203
- const installMessage = typeof parsed?.message === "string" ? parsed.message : typeof parsed?.stderrTail === "string" ? parsed.stderrTail : void 0;
150
+ const apiResult = formatUpdateApiResult(result, channel);
151
+ if (result.status === "error") {
152
+ const { message } = mapUpdateFailure(result, channel);
204
153
  await stream.writeSSE({
205
154
  event: "result",
206
155
  data: JSON.stringify({
207
156
  ok: false,
208
157
  error: "update-failed",
209
- message: installMessage || result.stderr?.trim() || result.reason || `Update exited with code ${result.exitCode ?? "unknown"}`,
210
- result: parsed,
211
- exitCode: result.exitCode,
158
+ message,
159
+ result: apiResult,
212
160
  reason: result.reason
213
161
  })
214
162
  });
@@ -218,14 +166,14 @@ function registerUpdateRoutes(authenticated, deps) {
218
166
  event: "result",
219
167
  data: JSON.stringify({
220
168
  ok: true,
221
- result: parsed
169
+ result: apiResult
222
170
  })
223
171
  });
224
172
  } catch (err) {
225
173
  log.error({
226
174
  err,
227
175
  channel
228
- }, "Gateway: streamed npm update threw");
176
+ }, "Gateway: streamed update threw");
229
177
  await stream.writeSSE({
230
178
  event: "result",
231
179
  data: JSON.stringify({