@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,8 +1,8 @@
1
1
  import { init_paths_state, resolveStateDir } from "../../config/paths-state.js";
2
2
  import { BUILTIN_WORKFLOWS } from "./builtins/index.js";
3
3
  import { parseWorkflowScript } from "./parser.js";
4
- import { join } from "node:path";
5
4
  import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, unlinkSync, writeFileSync } from "node:fs";
5
+ import { join } from "node:path";
6
6
  //#region src/agent/workflow/catalog.ts
7
7
  /**
8
8
  * Catalog for named workflows.
@@ -13,9 +13,9 @@ function workflowStepLabel(toolName, args) {
13
13
  else if (n === "edit_file") label = "Edit file";
14
14
  else if (n === "web_fetch") label = "Fetch URL";
15
15
  else if (n === "open_url") label = "Open URL";
16
+ else if (n === "grep" || n === "rg" || n === "file_grep") label = "Search files";
16
17
  else if (n === "web_search" || n === "brave_search" || n.includes("search")) label = "Search web";
17
18
  else if (n === "read_file" || n.includes("read_file") || n.includes("file_read")) label = "Read file";
18
- else if (n === "grep" || n === "rg") label = "Search files";
19
19
  else if (n === "delegate_task" || n === "workflow") label = toolName;
20
20
  const detail = extractStepDetail(n, args);
21
21
  return detail ? {
@@ -35,7 +35,7 @@ function extractStepDetail(toolKey, args) {
35
35
  if (typeof v === "string" && v.trim()) return truncate(v.trim());
36
36
  }
37
37
  if (toolKey === "shell" && typeof args.command === "string" && args.command.trim()) return truncate(args.command.trim());
38
- if ((toolKey.includes("search") || toolKey === "grep" || toolKey === "rg") && typeof args.query === "string" && args.query.trim()) return truncate(args.query.trim());
38
+ if ((toolKey.includes("search") || toolKey === "grep" || toolKey === "rg" || toolKey === "file_grep") && typeof args.query === "string" && args.query.trim()) return truncate(args.query.trim());
39
39
  if (typeof args.url === "string" && args.url.trim()) return truncate(args.url.trim());
40
40
  }
41
41
  function truncate(text) {
@@ -1 +1 @@
1
- {"version":3,"file":"step-labels.js","names":[],"sources":["../../../../src/agent/workflow/step-labels.ts"],"sourcesContent":["/**\n * Human-readable labels for workflow subagent tool steps (server-side snapshot).\n * Mirrors the web `tool-friendly-title` rules so IM/TUI and gateway stay aligned.\n */\n\nconst MAX_DETAIL_LEN = 120;\n\nexport function workflowStepLabel(\n toolName: string,\n args: Record<string, unknown>,\n): { label: string; detail?: string } {\n const n = toolName.toLowerCase().replace(/-/g, '_').trim();\n let label = toolName.trim() || 'tool';\n if (n === 'shell') label = 'Run command';\n else if (n === 'list_dir' || n === 'ls') label = 'List directory';\n else if (n === 'write_file') label = 'Write file';\n else if (n === 'edit_file') label = 'Edit file';\n else if (n === 'web_fetch') label = 'Fetch URL';\n else if (n === 'open_url') label = 'Open URL';\n else if (n === 'web_search' || n === 'brave_search' || n.includes('search')) label = 'Search web';\n else if (n === 'read_file' || n.includes('read_file') || n.includes('file_read')) label = 'Read file';\n else if (n === 'grep' || n === 'rg') label = 'Search files';\n else if (n === 'delegate_task' || n === 'workflow') label = toolName;\n\n const detail = extractStepDetail(n, args);\n return detail ? { label, detail } : { label };\n}\n\nfunction extractStepDetail(toolKey: string, args: Record<string, unknown>): string | undefined {\n const pathKeys = ['path', 'file_path', 'filePath', 'target_file', 'targetFile'];\n for (const key of pathKeys) {\n const v = args[key];\n if (typeof v === 'string' && v.trim()) return truncate(v.trim());\n }\n if (toolKey === 'shell' && typeof args.command === 'string' && args.command.trim()) {\n return truncate(args.command.trim());\n }\n if (\n (toolKey.includes('search') || toolKey === 'grep' || toolKey === 'rg') &&\n typeof args.query === 'string' &&\n args.query.trim()\n ) {\n return truncate(args.query.trim());\n }\n if (typeof args.url === 'string' && args.url.trim()) return truncate(args.url.trim());\n return undefined;\n}\n\nfunction truncate(text: string): string {\n if (text.length <= MAX_DETAIL_LEN) return text;\n return `${text.slice(0, MAX_DETAIL_LEN - 1)}…`;\n}\n"],"mappings":";;;;;AAKA,MAAM,iBAAiB;AAEvB,SAAgB,kBACd,UACA,MACoC;CACpC,MAAM,IAAI,SAAS,aAAa,CAAC,QAAQ,MAAM,IAAI,CAAC,MAAM;CAC1D,IAAI,QAAQ,SAAS,MAAM,IAAI;AAC/B,KAAI,MAAM,QAAS,SAAQ;UAClB,MAAM,cAAc,MAAM,KAAM,SAAQ;UACxC,MAAM,aAAc,SAAQ;UAC5B,MAAM,YAAa,SAAQ;UAC3B,MAAM,YAAa,SAAQ;UAC3B,MAAM,WAAY,SAAQ;UAC1B,MAAM,gBAAgB,MAAM,kBAAkB,EAAE,SAAS,SAAS,CAAE,SAAQ;UAC5E,MAAM,eAAe,EAAE,SAAS,YAAY,IAAI,EAAE,SAAS,YAAY,CAAE,SAAQ;UACjF,MAAM,UAAU,MAAM,KAAM,SAAQ;UACpC,MAAM,mBAAmB,MAAM,WAAY,SAAQ;CAE5D,MAAM,SAAS,kBAAkB,GAAG,KAAK;AACzC,QAAO,SAAS;EAAE;EAAO;EAAQ,GAAG,EAAE,OAAO;;AAG/C,SAAS,kBAAkB,SAAiB,MAAmD;AAE7F,MAAK,MAAM,OAAO;EADA;EAAQ;EAAa;EAAY;EAAe;EACxC,EAAE;EAC1B,MAAM,IAAI,KAAK;AACf,MAAI,OAAO,MAAM,YAAY,EAAE,MAAM,CAAE,QAAO,SAAS,EAAE,MAAM,CAAC;;AAElE,KAAI,YAAY,WAAW,OAAO,KAAK,YAAY,YAAY,KAAK,QAAQ,MAAM,CAChF,QAAO,SAAS,KAAK,QAAQ,MAAM,CAAC;AAEtC,MACG,QAAQ,SAAS,SAAS,IAAI,YAAY,UAAU,YAAY,SACjE,OAAO,KAAK,UAAU,YACtB,KAAK,MAAM,MAAM,CAEjB,QAAO,SAAS,KAAK,MAAM,MAAM,CAAC;AAEpC,KAAI,OAAO,KAAK,QAAQ,YAAY,KAAK,IAAI,MAAM,CAAE,QAAO,SAAS,KAAK,IAAI,MAAM,CAAC;;AAIvF,SAAS,SAAS,MAAsB;AACtC,KAAI,KAAK,UAAU,eAAgB,QAAO;AAC1C,QAAO,GAAG,KAAK,MAAM,GAAG,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"step-labels.js","names":[],"sources":["../../../../src/agent/workflow/step-labels.ts"],"sourcesContent":["/**\n * Human-readable labels for workflow subagent tool steps (server-side snapshot).\n * Mirrors the web `tool-friendly-title` rules so IM/TUI and gateway stay aligned.\n */\n\nconst MAX_DETAIL_LEN = 120;\n\nexport function workflowStepLabel(\n toolName: string,\n args: Record<string, unknown>,\n): { label: string; detail?: string } {\n const n = toolName.toLowerCase().replace(/-/g, '_').trim();\n let label = toolName.trim() || 'tool';\n if (n === 'shell') label = 'Run command';\n else if (n === 'list_dir' || n === 'ls') label = 'List directory';\n else if (n === 'write_file') label = 'Write file';\n else if (n === 'edit_file') label = 'Edit file';\n else if (n === 'web_fetch') label = 'Fetch URL';\n else if (n === 'open_url') label = 'Open URL';\n else if (n === 'grep' || n === 'rg' || n === 'file_grep') label = 'Search files';\n else if (n === 'web_search' || n === 'brave_search' || n.includes('search')) label = 'Search web';\n else if (n === 'read_file' || n.includes('read_file') || n.includes('file_read')) label = 'Read file';\n else if (n === 'delegate_task' || n === 'workflow') label = toolName;\n\n const detail = extractStepDetail(n, args);\n return detail ? { label, detail } : { label };\n}\n\nfunction extractStepDetail(toolKey: string, args: Record<string, unknown>): string | undefined {\n const pathKeys = ['path', 'file_path', 'filePath', 'target_file', 'targetFile'];\n for (const key of pathKeys) {\n const v = args[key];\n if (typeof v === 'string' && v.trim()) return truncate(v.trim());\n }\n if (toolKey === 'shell' && typeof args.command === 'string' && args.command.trim()) {\n return truncate(args.command.trim());\n }\n if (\n (toolKey.includes('search') || toolKey === 'grep' || toolKey === 'rg' || toolKey === 'file_grep') &&\n typeof args.query === 'string' &&\n args.query.trim()\n ) {\n return truncate(args.query.trim());\n }\n if (typeof args.url === 'string' && args.url.trim()) return truncate(args.url.trim());\n return undefined;\n}\n\nfunction truncate(text: string): string {\n if (text.length <= MAX_DETAIL_LEN) return text;\n return `${text.slice(0, MAX_DETAIL_LEN - 1)}…`;\n}\n"],"mappings":";;;;;AAKA,MAAM,iBAAiB;AAEvB,SAAgB,kBACd,UACA,MACoC;CACpC,MAAM,IAAI,SAAS,aAAa,CAAC,QAAQ,MAAM,IAAI,CAAC,MAAM;CAC1D,IAAI,QAAQ,SAAS,MAAM,IAAI;AAC/B,KAAI,MAAM,QAAS,SAAQ;UAClB,MAAM,cAAc,MAAM,KAAM,SAAQ;UACxC,MAAM,aAAc,SAAQ;UAC5B,MAAM,YAAa,SAAQ;UAC3B,MAAM,YAAa,SAAQ;UAC3B,MAAM,WAAY,SAAQ;UAC1B,MAAM,UAAU,MAAM,QAAQ,MAAM,YAAa,SAAQ;UACzD,MAAM,gBAAgB,MAAM,kBAAkB,EAAE,SAAS,SAAS,CAAE,SAAQ;UAC5E,MAAM,eAAe,EAAE,SAAS,YAAY,IAAI,EAAE,SAAS,YAAY,CAAE,SAAQ;UACjF,MAAM,mBAAmB,MAAM,WAAY,SAAQ;CAE5D,MAAM,SAAS,kBAAkB,GAAG,KAAK;AACzC,QAAO,SAAS;EAAE;EAAO;EAAQ,GAAG,EAAE,OAAO;;AAG/C,SAAS,kBAAkB,SAAiB,MAAmD;AAE7F,MAAK,MAAM,OAAO;EADA;EAAQ;EAAa;EAAY;EAAe;EACxC,EAAE;EAC1B,MAAM,IAAI,KAAK;AACf,MAAI,OAAO,MAAM,YAAY,EAAE,MAAM,CAAE,QAAO,SAAS,EAAE,MAAM,CAAC;;AAElE,KAAI,YAAY,WAAW,OAAO,KAAK,YAAY,YAAY,KAAK,QAAQ,MAAM,CAChF,QAAO,SAAS,KAAK,QAAQ,MAAM,CAAC;AAEtC,MACG,QAAQ,SAAS,SAAS,IAAI,YAAY,UAAU,YAAY,QAAQ,YAAY,gBACrF,OAAO,KAAK,UAAU,YACtB,KAAK,MAAM,MAAM,CAEjB,QAAO,SAAS,KAAK,MAAM,MAAM,CAAC;AAEpC,KAAI,OAAO,KAAK,QAAQ,YAAY,KAAK,IAAI,MAAM,CAAE,QAAO,SAAS,KAAK,IAAI,MAAM,CAAC;;AAIvF,SAAS,SAAS,MAAsB;AACtC,KAAI,KAAK,UAAU,eAAgB,QAAO;AAC1C,QAAO,GAAG,KAAK,MAAM,GAAG,iBAAiB,EAAE,CAAC"}
@@ -122,7 +122,9 @@ function mapChildProgressEvent(event) {
122
122
  type: "tool_end",
123
123
  toolCallId: event.toolCallId ?? "",
124
124
  toolName: event.toolName ?? "tool",
125
- isError: Boolean(event.isError)
125
+ isError: Boolean(event.isError),
126
+ resultPreview: event.resultPreview,
127
+ error: event.error
126
128
  };
127
129
  case "iteration": return {
128
130
  type: "iteration",
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-runner.js","names":[],"sources":["../../../../src/agent/workflow/subagent-runner.ts"],"sourcesContent":["/**\n * Adapter: spawns one isolated child agent per `agent()` call from a workflow.\n *\n * Wraps the existing `createDelegateChildHandle` so the workflow runtime stays\n * decoupled from the LLM stack (it sees only the `SubagentRunner` interface).\n *\n * Key behaviour:\n * - When `opts.schema` is provided, we inject `structured_output` into the child\n * tool set and unwrap the captured value on success. If the subagent finishes\n * without ever calling `structured_output`, we treat it as failure (`null`).\n * - Failures and aborts resolve to `null`. The workflow runtime continues — this\n * matches the pi-dynamic-workflows contract and keeps fan-out pipelines robust.\n * - We do NOT mutate `createDelegateChildHandle` — we just leverage its\n * `buildChildTools` injection point.\n */\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type { Api, Model } from '@earendil-works/pi-ai';\n\nimport type { Config } from '../../config/schema.js';\nimport type { MessageBus } from '../../infra/bus/index.js';\nimport { createLogger } from '../../utils/logger.js';\n\nimport {\n type BuildChildToolsOptions,\n createDelegateChildHandle,\n type DelegateChildHandleOptions,\n} from '../child-agent-factory.js';\nimport {\n DEFAULT_DELEGATE_TOOLS,\n DELEGATE_BLOCKED_TOOLS,\n} from '../tools/delegate-tool.js';\nimport type { ToolExecutorConfig } from '../tools/executor.js';\n\nimport {\n createStructuredOutputTool,\n STRUCTURED_OUTPUT_TOOL_NAME,\n type StructuredOutputCapture,\n} from './structured-output-tool.js';\nimport type { SubagentRunOptions, SubagentRunner, SubagentProgressEvent } from './types.js';\n\nconst log = createLogger('workflow-subagent-runner');\n\nconst DEFAULT_MAX_ITERATIONS = 30;\n\nexport interface DelegateSubagentRunnerDeps {\n workspace: string;\n bus: MessageBus;\n /** Resolves the default subagent model (typically the parent agent's primary model). */\n getDefaultModel: () => Model<Api>;\n getConfig: () => Config | undefined;\n toolExecutorConfig?: Partial<ToolExecutorConfig>;\n /**\n * Provided by the workflow tool from `AgentToolsFactory` — mirrors how\n * `delegate-tool` is wired (avoids importing `tools/factory.ts` here and\n * breaking the existing factory ↔ delegate-tool ↔ child-agent-factory\n * dependency contract).\n */\n buildChildTools: (opts: BuildChildToolsOptions) => AgentTool<any, any>[];\n}\n\nexport class DelegateSubagentRunner implements SubagentRunner {\n constructor(private readonly deps: DelegateSubagentRunnerDeps) {}\n\n async run<T = string>(prompt: string, opts: SubagentRunOptions<T>): Promise<T | null> {\n if (opts.signal?.aborted) return null;\n\n const capture: StructuredOutputCapture<T> = { called: false, value: undefined };\n const wantStructured = Boolean(opts.schema);\n\n const allowed = resolveAllowedToolNames(opts.allowedToolNames, wantStructured);\n const model = opts.model ?? safeResolveDefaultModel(this.deps.getDefaultModel);\n if (!model) {\n log.warn({ label: opts.label }, 'subagent run skipped: no primary model resolved');\n return null;\n }\n\n const fullPrompt = buildPrompt(prompt, opts, wantStructured);\n const streamMode = resolveSubagentStreamMode(this.deps.getConfig);\n\n const childOptions: DelegateChildHandleOptions = {\n workspace: this.deps.workspace,\n goal: fullPrompt,\n allowedToolNames: allowed,\n maxIterations: opts.maxIterations ?? DEFAULT_MAX_ITERATIONS,\n model,\n bus: this.deps.bus,\n getConfig: this.deps.getConfig,\n toolExecutorConfig: this.deps.toolExecutorConfig,\n buildChildTools: (childOpts) => {\n const base = this.deps.buildChildTools(childOpts);\n if (!wantStructured || !opts.schema) return base;\n // Replace any existing tool with the same name so the per-run capture wins.\n const filtered = base.filter((t) => t.name !== STRUCTURED_OUTPUT_TOOL_NAME);\n return [\n ...filtered,\n createStructuredOutputTool({ schema: opts.schema, capture }) as unknown as AgentTool<any, any>,\n ];\n },\n progressHooks:\n opts.onProgress && streamMode !== 'off'\n ? {\n mode: streamMode === 'full' ? 'full' : 'steps',\n onProgress: (event) => {\n opts.onProgress?.(mapChildProgressEvent(event));\n },\n }\n : undefined,\n };\n\n const handle = createDelegateChildHandle(childOptions);\n const onAbort = () => handle.abort();\n opts.signal?.addEventListener('abort', onAbort, { once: true });\n\n try {\n const { summary } = await handle.run();\n if (opts.signal?.aborted) return null;\n\n if (wantStructured) {\n if (!capture.called) {\n log.warn({ label: opts.label }, 'subagent finished without calling structured_output');\n return null;\n }\n return capture.value as T;\n }\n return summary as unknown as T;\n } catch (e) {\n if (opts.rethrow) throw e;\n const msg = e instanceof Error ? e.message : String(e);\n log.warn({ err: e, label: opts.label, errorMessage: msg }, `subagent run failed: ${msg}`);\n return null;\n } finally {\n opts.signal?.removeEventListener('abort', onAbort);\n }\n }\n}\n\nfunction resolveAllowedToolNames(\n requested: string[] | undefined,\n wantStructured: boolean,\n): string[] {\n const base = requested && requested.length > 0 ? requested : [...DEFAULT_DELEGATE_TOOLS];\n const filtered = base\n .map((s) => String(s).trim())\n .filter((s) => s.length > 0)\n .filter((s) => !DELEGATE_BLOCKED_TOOLS.has(s));\n if (wantStructured && !filtered.includes(STRUCTURED_OUTPUT_TOOL_NAME)) {\n filtered.push(STRUCTURED_OUTPUT_TOOL_NAME);\n }\n return [...new Set(filtered)];\n}\n\nfunction buildPrompt(prompt: string, opts: SubagentRunOptions<unknown>, structured: boolean): string {\n const parts: string[] = [];\n if (opts.instructions?.trim()) parts.push(opts.instructions.trim());\n if (opts.label) parts.push(`Task label: ${opts.label}`);\n if (opts.phase) parts.push(`Workflow phase: ${opts.phase}`);\n parts.push(prompt);\n if (structured) {\n parts.push(\n [\n 'Final output contract:',\n '- Your final action MUST be a structured_output tool call.',\n '- The structured_output arguments are the return value of this subagent.',\n '- Do not emit a prose final answer instead of structured_output.',\n '- If you need to inspect files or run commands first, do so, then call structured_output exactly once.',\n ].join('\\n'),\n );\n }\n return parts.join('\\n\\n');\n}\n\nfunction safeResolveDefaultModel(get: () => Model<Api>): Model<Api> | null {\n try {\n return get();\n } catch (e) {\n log.warn({ err: e }, 'failed to resolve default subagent model');\n return null;\n }\n}\n\nfunction resolveSubagentStreamMode(\n getConfig: () => Config | undefined,\n): 'off' | 'steps' | 'full' {\n const mode = getConfig()?.agents?.defaults?.workflow?.subagentStream;\n if (mode === 'off' || mode === 'steps' || mode === 'full') return mode;\n return 'steps';\n}\n\nfunction mapChildProgressEvent(event: {\n type: 'tool_start' | 'tool_end' | 'iteration' | 'text_delta' | 'thinking_delta';\n toolCallId?: string;\n toolName?: string;\n args?: Record<string, unknown>;\n isError?: boolean;\n count?: number;\n max?: number;\n delta?: string;\n}): SubagentProgressEvent {\n switch (event.type) {\n case 'tool_start':\n return {\n type: 'tool_start',\n toolCallId: event.toolCallId ?? '',\n toolName: event.toolName ?? 'tool',\n args: event.args ?? {},\n };\n case 'tool_end':\n return {\n type: 'tool_end',\n toolCallId: event.toolCallId ?? '',\n toolName: event.toolName ?? 'tool',\n isError: Boolean(event.isError),\n };\n case 'iteration':\n return {\n type: 'iteration',\n count: event.count ?? 0,\n max: event.max ?? 0,\n };\n case 'text_delta':\n return { type: 'text_delta', delta: event.delta ?? '' };\n case 'thinking_delta':\n return { type: 'thinking_delta', delta: event.delta ?? '' };\n default:\n return { type: 'text_delta', delta: '' };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"subagent-runner.js","names":[],"sources":["../../../../src/agent/workflow/subagent-runner.ts"],"sourcesContent":["/**\n * Adapter: spawns one isolated child agent per `agent()` call from a workflow.\n *\n * Wraps the existing `createDelegateChildHandle` so the workflow runtime stays\n * decoupled from the LLM stack (it sees only the `SubagentRunner` interface).\n *\n * Key behaviour:\n * - When `opts.schema` is provided, we inject `structured_output` into the child\n * tool set and unwrap the captured value on success. If the subagent finishes\n * without ever calling `structured_output`, we treat it as failure (`null`).\n * - Failures and aborts resolve to `null`. The workflow runtime continues — this\n * matches the pi-dynamic-workflows contract and keeps fan-out pipelines robust.\n * - We do NOT mutate `createDelegateChildHandle` — we just leverage its\n * `buildChildTools` injection point.\n */\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type { Api, Model } from '@earendil-works/pi-ai';\n\nimport type { Config } from '../../config/schema.js';\nimport type { MessageBus } from '../../infra/bus/index.js';\nimport { createLogger } from '../../utils/logger.js';\n\nimport {\n type BuildChildToolsOptions,\n createDelegateChildHandle,\n type DelegateChildHandleOptions,\n} from '../child-agent-factory.js';\nimport {\n DEFAULT_DELEGATE_TOOLS,\n DELEGATE_BLOCKED_TOOLS,\n} from '../tools/delegate-tool.js';\nimport type { ToolExecutorConfig } from '../tools/executor.js';\n\nimport {\n createStructuredOutputTool,\n STRUCTURED_OUTPUT_TOOL_NAME,\n type StructuredOutputCapture,\n} from './structured-output-tool.js';\nimport type { SubagentRunOptions, SubagentRunner, SubagentProgressEvent } from './types.js';\n\nconst log = createLogger('workflow-subagent-runner');\n\nconst DEFAULT_MAX_ITERATIONS = 30;\n\nexport interface DelegateSubagentRunnerDeps {\n workspace: string;\n bus: MessageBus;\n /** Resolves the default subagent model (typically the parent agent's primary model). */\n getDefaultModel: () => Model<Api>;\n getConfig: () => Config | undefined;\n toolExecutorConfig?: Partial<ToolExecutorConfig>;\n /**\n * Provided by the workflow tool from `AgentToolsFactory` — mirrors how\n * `delegate-tool` is wired (avoids importing `tools/factory.ts` here and\n * breaking the existing factory ↔ delegate-tool ↔ child-agent-factory\n * dependency contract).\n */\n buildChildTools: (opts: BuildChildToolsOptions) => AgentTool<any, any>[];\n}\n\nexport class DelegateSubagentRunner implements SubagentRunner {\n constructor(private readonly deps: DelegateSubagentRunnerDeps) {}\n\n async run<T = string>(prompt: string, opts: SubagentRunOptions<T>): Promise<T | null> {\n if (opts.signal?.aborted) return null;\n\n const capture: StructuredOutputCapture<T> = { called: false, value: undefined };\n const wantStructured = Boolean(opts.schema);\n\n const allowed = resolveAllowedToolNames(opts.allowedToolNames, wantStructured);\n const model = opts.model ?? safeResolveDefaultModel(this.deps.getDefaultModel);\n if (!model) {\n log.warn({ label: opts.label }, 'subagent run skipped: no primary model resolved');\n return null;\n }\n\n const fullPrompt = buildPrompt(prompt, opts, wantStructured);\n const streamMode = resolveSubagentStreamMode(this.deps.getConfig);\n\n const childOptions: DelegateChildHandleOptions = {\n workspace: this.deps.workspace,\n goal: fullPrompt,\n allowedToolNames: allowed,\n maxIterations: opts.maxIterations ?? DEFAULT_MAX_ITERATIONS,\n model,\n bus: this.deps.bus,\n getConfig: this.deps.getConfig,\n toolExecutorConfig: this.deps.toolExecutorConfig,\n buildChildTools: (childOpts) => {\n const base = this.deps.buildChildTools(childOpts);\n if (!wantStructured || !opts.schema) return base;\n // Replace any existing tool with the same name so the per-run capture wins.\n const filtered = base.filter((t) => t.name !== STRUCTURED_OUTPUT_TOOL_NAME);\n return [\n ...filtered,\n createStructuredOutputTool({ schema: opts.schema, capture }) as unknown as AgentTool<any, any>,\n ];\n },\n progressHooks:\n opts.onProgress && streamMode !== 'off'\n ? {\n mode: streamMode === 'full' ? 'full' : 'steps',\n onProgress: (event) => {\n opts.onProgress?.(mapChildProgressEvent(event));\n },\n }\n : undefined,\n };\n\n const handle = createDelegateChildHandle(childOptions);\n const onAbort = () => handle.abort();\n opts.signal?.addEventListener('abort', onAbort, { once: true });\n\n try {\n const { summary } = await handle.run();\n if (opts.signal?.aborted) return null;\n\n if (wantStructured) {\n if (!capture.called) {\n log.warn({ label: opts.label }, 'subagent finished without calling structured_output');\n return null;\n }\n return capture.value as T;\n }\n return summary as unknown as T;\n } catch (e) {\n if (opts.rethrow) throw e;\n const msg = e instanceof Error ? e.message : String(e);\n log.warn({ err: e, label: opts.label, errorMessage: msg }, `subagent run failed: ${msg}`);\n return null;\n } finally {\n opts.signal?.removeEventListener('abort', onAbort);\n }\n }\n}\n\nfunction resolveAllowedToolNames(\n requested: string[] | undefined,\n wantStructured: boolean,\n): string[] {\n const base = requested && requested.length > 0 ? requested : [...DEFAULT_DELEGATE_TOOLS];\n const filtered = base\n .map((s) => String(s).trim())\n .filter((s) => s.length > 0)\n .filter((s) => !DELEGATE_BLOCKED_TOOLS.has(s));\n if (wantStructured && !filtered.includes(STRUCTURED_OUTPUT_TOOL_NAME)) {\n filtered.push(STRUCTURED_OUTPUT_TOOL_NAME);\n }\n return [...new Set(filtered)];\n}\n\nfunction buildPrompt(prompt: string, opts: SubagentRunOptions<unknown>, structured: boolean): string {\n const parts: string[] = [];\n if (opts.instructions?.trim()) parts.push(opts.instructions.trim());\n if (opts.label) parts.push(`Task label: ${opts.label}`);\n if (opts.phase) parts.push(`Workflow phase: ${opts.phase}`);\n parts.push(prompt);\n if (structured) {\n parts.push(\n [\n 'Final output contract:',\n '- Your final action MUST be a structured_output tool call.',\n '- The structured_output arguments are the return value of this subagent.',\n '- Do not emit a prose final answer instead of structured_output.',\n '- If you need to inspect files or run commands first, do so, then call structured_output exactly once.',\n ].join('\\n'),\n );\n }\n return parts.join('\\n\\n');\n}\n\nfunction safeResolveDefaultModel(get: () => Model<Api>): Model<Api> | null {\n try {\n return get();\n } catch (e) {\n log.warn({ err: e }, 'failed to resolve default subagent model');\n return null;\n }\n}\n\nfunction resolveSubagentStreamMode(\n getConfig: () => Config | undefined,\n): 'off' | 'steps' | 'full' {\n const mode = getConfig()?.agents?.defaults?.workflow?.subagentStream;\n if (mode === 'off' || mode === 'steps' || mode === 'full') return mode;\n return 'steps';\n}\n\nfunction mapChildProgressEvent(event: {\n type: 'tool_start' | 'tool_end' | 'iteration' | 'text_delta' | 'thinking_delta';\n toolCallId?: string;\n toolName?: string;\n args?: Record<string, unknown>;\n isError?: boolean;\n resultPreview?: string;\n error?: string;\n count?: number;\n max?: number;\n delta?: string;\n}): SubagentProgressEvent {\n switch (event.type) {\n case 'tool_start':\n return {\n type: 'tool_start',\n toolCallId: event.toolCallId ?? '',\n toolName: event.toolName ?? 'tool',\n args: event.args ?? {},\n };\n case 'tool_end':\n return {\n type: 'tool_end',\n toolCallId: event.toolCallId ?? '',\n toolName: event.toolName ?? 'tool',\n isError: Boolean(event.isError),\n resultPreview: event.resultPreview,\n error: event.error,\n };\n case 'iteration':\n return {\n type: 'iteration',\n count: event.count ?? 0,\n max: event.max ?? 0,\n };\n case 'text_delta':\n return { type: 'text_delta', delta: event.delta ?? '' };\n case 'thinking_delta':\n return { type: 'thinking_delta', delta: event.delta ?? '' };\n default:\n return { type: 'text_delta', delta: '' };\n }\n}\n"],"mappings":"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"}
@@ -64,6 +64,8 @@ export interface WorkflowAgentStep {
64
64
  label: string;
65
65
  detail?: string;
66
66
  status: WorkflowAgentStepStatus;
67
+ resultPreview?: string;
68
+ error?: string;
67
69
  startedAtMs?: number;
68
70
  durationMs?: number;
69
71
  }
@@ -134,6 +136,8 @@ export type SubagentProgressEvent = {
134
136
  toolCallId: string;
135
137
  toolName: string;
136
138
  isError: boolean;
139
+ resultPreview?: string;
140
+ error?: string;
137
141
  } | {
138
142
  type: 'iteration';
139
143
  count: number;
@@ -1,11 +1,11 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
2
3
  import { createLogger } from "../utils/logger/index.js";
3
4
  import { init_logger } from "../utils/logger.js";
4
- import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveCredentialsDir, resolveOAuthPath } from "../config/paths.js";
5
- import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
6
5
  import { getApiKeyFromEnv, init_env_keys } from "../providers/env-keys.js";
7
- import { dirname, join } from "path";
6
+ import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveCredentialsDir, resolveOAuthPath } from "../config/paths.js";
8
7
  import { mkdir, readFile, rm } from "fs/promises";
8
+ import { dirname, join } from "path";
9
9
  //#region src/auth/credentials.ts
10
10
  function getCredentialResolver(options) {
11
11
  return new CredentialResolver(options);
@@ -1,6 +1,6 @@
1
1
  import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
2
- import path from "node:path";
3
2
  import { chmodSync, existsSync, mkdirSync, readFileSync } from "node:fs";
3
+ import path from "node:path";
4
4
  import { homedir } from "os";
5
5
  //#region src/auth/profiles/store.ts
6
6
  /**
@@ -1,7 +1,7 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
3
2
  import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveOAuthPath } from "../config/paths.js";
4
3
  import { init_loader, loadConfig } from "../config/loader.js";
4
+ import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
5
5
  import { existsSync, readFileSync } from "node:fs";
6
6
  //#region src/auth/sync-provider-auth.ts
7
7
  /**
@@ -1,6 +1,6 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { homedir } from "node:os";
3
2
  import { isAbsolute, relative, resolve, sep } from "node:path";
3
+ import { homedir } from "node:os";
4
4
  //#region src/browser/cache-dir-policy.ts
5
5
  function expandHome(input) {
6
6
  if (input === "~") return homedir();
@@ -2,10 +2,10 @@ import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { loadPlaywrightCoreModule } from "./providers/playwright-doctor.js";
4
4
  import { pickFreePort } from "./free-port.js";
5
- import { homedir, platform } from "node:os";
6
- import { join } from "node:path";
7
5
  import { existsSync } from "node:fs";
8
6
  import { mkdir, rm } from "node:fs/promises";
7
+ import { join } from "node:path";
8
+ import { homedir, platform } from "node:os";
9
9
  import { spawn } from "node:child_process";
10
10
  //#region src/browser/cdp-local-launcher.ts
11
11
  /**
@@ -1,13 +1,13 @@
1
1
  import { PACKAGE_VERSION, init_package_version } from "../../package-version.js";
2
- import { assertCacheDir, init_cache_dir_policy } from "../cache-dir-policy.js";
2
+ import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
3
3
  import { createLogger } from "../../utils/logger/index.js";
4
4
  import { init_logger } from "../../utils/logger.js";
5
5
  import { init_paths, resolveBinDir } from "../../config/paths.js";
6
- import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
6
+ import { assertCacheDir, init_cache_dir_policy } from "../cache-dir-policy.js";
7
7
  import { resolvePackageRoot } from "../../infra/update-check.js";
8
- import { dirname, join } from "node:path";
9
8
  import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
10
9
  import { readFile, readdir, rm } from "node:fs/promises";
10
+ import { dirname, join } from "node:path";
11
11
  import { spawn } from "node:child_process";
12
12
  import { fileURLToPath } from "node:url";
13
13
  //#region src/browser/providers/browser-ext-install.ts
@@ -1,15 +1,15 @@
1
- import { assertCacheDir, expandHome, init_cache_dir_policy } from "../cache-dir-policy.js";
2
1
  import { createLogger } from "../../utils/logger/index.js";
3
2
  import { init_logger } from "../../utils/logger.js";
4
3
  import { init_paths, resolveBinDir } from "../../config/paths.js";
4
+ import { assertCacheDir, expandHome, init_cache_dir_policy } from "../cache-dir-policy.js";
5
5
  import { loadPlaywrightCoreModule } from "./playwright-doctor.js";
6
6
  import { WEBDRIVER_OVERRIDE_SCRIPT, buildStealthArgs, filterCloakBrowserExtraArgs, generateFingerprintSeed, makeExecutable, removeQuarantineAttr } from "../stealth.js";
7
7
  import { pickFreePort } from "../free-port.js";
8
- import { arch, platform, tmpdir } from "node:os";
9
- import { join, resolve } from "node:path";
10
- import { createReadStream, createWriteStream } from "node:fs";
11
8
  import { createHash } from "node:crypto";
9
+ import { createReadStream, createWriteStream } from "node:fs";
12
10
  import { mkdir, mkdtemp, rm, stat } from "node:fs/promises";
11
+ import { join, resolve } from "node:path";
12
+ import { arch, platform, tmpdir } from "node:os";
13
13
  import { spawn } from "node:child_process";
14
14
  import { Readable, Transform } from "node:stream";
15
15
  import AdmZip from "adm-zip";
@@ -1,7 +1,7 @@
1
1
  import { createRequire } from "node:module";
2
- import { dirname, join } from "node:path";
3
2
  import { existsSync } from "node:fs";
4
3
  import { stat } from "node:fs/promises";
4
+ import { dirname, join } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  //#region src/browser/providers/playwright-doctor.ts
7
7
  /** Root directory of the `playwright-core` package (Electron extraResources or node_modules). */
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
- import { platform } from "node:os";
4
3
  import { chmod, stat } from "node:fs/promises";
4
+ import { platform } from "node:os";
5
5
  import { exec } from "node:child_process";
6
6
  import { promisify } from "node:util";
7
7
  //#region src/browser/stealth.ts
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { join, resolve } from "path";
4
3
  import { mkdir, writeFile } from "fs/promises";
4
+ import { join, resolve } from "path";
5
5
  import { randomBytes } from "crypto";
6
6
  //#region src/channels/attachments/inbound-persist.ts
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { join, resolve } from "path";
4
3
  import { mkdir, writeFile } from "fs/promises";
4
+ import { join, resolve } from "path";
5
5
  import { randomBytes } from "crypto";
6
6
  //#region src/channels/attachments/outbound-tts-persist.ts
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
2
+ import { randomUUID } from "node:crypto";
2
3
  import { join } from "path";
3
4
  import { existsSync, mkdirSync, readFileSync } from "fs";
4
- import { randomUUID } from "node:crypto";
5
5
  //#region src/channels/outbound/persist-store.ts
6
6
  /**
7
7
  * Durable outbound queue (crash recovery): JSON file under agent internal dir.
@@ -1,5 +1,5 @@
1
- import path from "node:path";
2
1
  import fs from "node:fs";
2
+ import path from "node:path";
3
3
  //#region src/channels/pairing/allow-from-file.ts
4
4
  function readAllowFromFile(filePath) {
5
5
  try {
@@ -1,8 +1,8 @@
1
1
  import { appendAllowFromIdSync } from "./allow-from-file.js";
2
2
  import "./pairing-constants.js";
3
- import path from "node:path";
4
- import fs from "node:fs";
5
3
  import crypto from "node:crypto";
4
+ import fs from "node:fs";
5
+ import path from "node:path";
6
6
  //#region src/channels/pairing/pairing-store.ts
7
7
  const PAIRING_CODE_LENGTH = 8;
8
8
  const PAIRING_CODE_ALPHABET = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
@@ -0,0 +1,4 @@
1
+ /**
2
+ * /agent-edit — open the current chat as an agent profile editing session.
3
+ */
4
+ export declare function registerAgentEditCommand(): void;
@@ -0,0 +1,136 @@
1
+ import { init_agent_scope, normalizeAgentId, resolveAgentProfileDir } from "../agent/agent-scope.js";
2
+ import { WORKSPACE_FILES, init_paths } from "../config/paths.js";
3
+ import { init_agent_session_key, resolveAgentIdFromSessionKey } from "../routing/agent-session-key.js";
4
+ import { commandRegistry } from "./registry.js";
5
+ import { readFile } from "node:fs/promises";
6
+ import { join } from "node:path";
7
+ //#region src/chat-commands/agent-edit.ts
8
+ /**
9
+ * /agent-edit — open the current chat as an agent profile editing session.
10
+ */
11
+ init_agent_session_key();
12
+ init_agent_scope();
13
+ init_paths();
14
+ const PROFILE_FILE_NAMES = [
15
+ WORKSPACE_FILES.SOUL,
16
+ WORKSPACE_FILES.IDENTITY,
17
+ WORKSPACE_FILES.USER,
18
+ WORKSPACE_FILES.TOOLS,
19
+ WORKSPACE_FILES.AGENTS,
20
+ WORKSPACE_FILES.HEARTBEAT,
21
+ WORKSPACE_FILES.MEMORY,
22
+ WORKSPACE_FILES.BOOTSTRAP
23
+ ];
24
+ const DEFAULT_PREVIEW_CHARS = 900;
25
+ const MAX_PREVIEW_CHARS = 4e3;
26
+ function parseArgs(args) {
27
+ const trimmed = args.trim();
28
+ if (!trimmed) return { previewChars: DEFAULT_PREVIEW_CHARS };
29
+ const parts = trimmed.split(/\s+/);
30
+ let fileName;
31
+ let previewChars = DEFAULT_PREVIEW_CHARS;
32
+ for (const part of parts) {
33
+ const limitMatch = /^--limit=(\d+)$/.exec(part);
34
+ if (limitMatch) {
35
+ previewChars = Math.min(Number(limitMatch[1]), MAX_PREVIEW_CHARS);
36
+ continue;
37
+ }
38
+ if (!fileName) fileName = part;
39
+ }
40
+ return {
41
+ fileName,
42
+ previewChars
43
+ };
44
+ }
45
+ function normalizeProfileFileName(input) {
46
+ if (!input) return;
47
+ const basename = input.trim().replace(/\\/g, "/").split("/").pop();
48
+ return PROFILE_FILE_NAMES.find((name) => name.toLowerCase() === basename?.toLowerCase());
49
+ }
50
+ async function readPreview(path, limit) {
51
+ try {
52
+ const trimmed = (await readFile(path, "utf-8")).trimEnd();
53
+ if (trimmed.length <= limit) return {
54
+ content: trimmed,
55
+ missing: false
56
+ };
57
+ return {
58
+ content: `${trimmed.slice(0, limit)}\n\n… truncated, ask me to read the full file before editing …`,
59
+ missing: false
60
+ };
61
+ } catch {
62
+ return {
63
+ content: "",
64
+ missing: true
65
+ };
66
+ }
67
+ }
68
+ function buildEditInstructions(agentId, fileNames) {
69
+ const files = fileNames.map((name) => `\`${name}\``).join(", ");
70
+ return [
71
+ `You are editing agent \`${agentId}\`.`,
72
+ "",
73
+ "Tell me what to change, or say things like:",
74
+ "- “Refine `SOUL.md` to sound warmer and more concise.”",
75
+ "- “Update `IDENTITY.md` so this agent is focused on data analysis.”",
76
+ "- “Read `SOUL.md` first, propose changes, then write them back.”",
77
+ "",
78
+ `Editable profile files: ${files}.`,
79
+ "I can read and update these by bare filename with `read_file`, `edit_file`, and `write_file`."
80
+ ].join("\n");
81
+ }
82
+ const agentEditCommand = {
83
+ id: "agent.edit",
84
+ name: "agent-edit",
85
+ aliases: ["agentedit"],
86
+ description: "Show editable profile files for the current agent and prepare this chat for profile edits.",
87
+ category: "system",
88
+ scope: [
89
+ "global",
90
+ "private",
91
+ "group"
92
+ ],
93
+ acceptsArgs: true,
94
+ examples: [
95
+ "/agent-edit",
96
+ "/agent-edit SOUL.md",
97
+ "/agent-edit IDENTITY.md --limit=2000"
98
+ ],
99
+ handler: async (ctx, args) => {
100
+ await ctx.setTyping(true);
101
+ const { fileName: rawFileName, previewChars } = parseArgs(args);
102
+ const fileName = normalizeProfileFileName(rawFileName);
103
+ if (rawFileName && !fileName) return {
104
+ content: `⚠️ Unsupported profile file: \`${rawFileName}\`. Use one of: ${PROFILE_FILE_NAMES.map((name) => `\`${name}\``).join(", ")}.`,
105
+ success: false
106
+ };
107
+ const agentId = normalizeAgentId(resolveAgentIdFromSessionKey(ctx.sessionKey));
108
+ const profileDir = resolveAgentProfileDir(ctx.config, agentId);
109
+ const namesToShow = fileName ? [fileName] : [WORKSPACE_FILES.SOUL, WORKSPACE_FILES.IDENTITY];
110
+ const sections = [];
111
+ for (const name of namesToShow) {
112
+ const preview = await readPreview(join(profileDir, name), previewChars);
113
+ if (preview.missing) sections.push(`## ${name}\n_missing_`);
114
+ else sections.push(`## ${name}\n\`\`\`markdown\n${preview.content}\n\`\`\``);
115
+ }
116
+ return {
117
+ content: [
118
+ "🛠️ Agent editor mode",
119
+ "",
120
+ buildEditInstructions(agentId, PROFILE_FILE_NAMES),
121
+ "",
122
+ `Profile directory: \`${profileDir}\``,
123
+ "",
124
+ ...sections
125
+ ].join("\n"),
126
+ success: true
127
+ };
128
+ }
129
+ };
130
+ function registerAgentEditCommand() {
131
+ commandRegistry.register(agentEditCommand);
132
+ }
133
+ //#endregion
134
+ export { registerAgentEditCommand };
135
+
136
+ //# sourceMappingURL=agent-edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-edit.js","names":[],"sources":["../../../src/chat-commands/agent-edit.ts"],"sourcesContent":["/**\n * /agent-edit — open the current chat as an agent profile editing session.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport type { CommandContext, CommandDefinition } from './types.js';\nimport { commandRegistry } from './registry.js';\nimport { resolveAgentIdFromSessionKey } from '../routing/agent-session-key.js';\nimport { normalizeAgentId, resolveAgentProfileDir } from '../agent/agent-scope.js';\nimport { WORKSPACE_FILES } from '../config/paths.js';\n\nconst PROFILE_FILE_NAMES = [\n WORKSPACE_FILES.SOUL,\n WORKSPACE_FILES.IDENTITY,\n WORKSPACE_FILES.USER,\n WORKSPACE_FILES.TOOLS,\n WORKSPACE_FILES.AGENTS,\n WORKSPACE_FILES.HEARTBEAT,\n WORKSPACE_FILES.MEMORY,\n WORKSPACE_FILES.BOOTSTRAP,\n] as const;\n\nconst DEFAULT_PREVIEW_CHARS = 900;\nconst MAX_PREVIEW_CHARS = 4_000;\n\nfunction parseArgs(args: string): { fileName?: string; previewChars: number } {\n const trimmed = args.trim();\n if (!trimmed) {\n return { previewChars: DEFAULT_PREVIEW_CHARS };\n }\n\n const parts = trimmed.split(/\\s+/);\n let fileName: string | undefined;\n let previewChars = DEFAULT_PREVIEW_CHARS;\n\n for (const part of parts) {\n const limitMatch = /^--limit=(\\d+)$/.exec(part);\n if (limitMatch) {\n previewChars = Math.min(Number(limitMatch[1]), MAX_PREVIEW_CHARS);\n continue;\n }\n if (!fileName) {\n fileName = part;\n }\n }\n\n return { fileName, previewChars };\n}\n\nfunction normalizeProfileFileName(input: string | undefined): string | undefined {\n if (!input) {\n return undefined;\n }\n const basename = input.trim().replace(/\\\\/g, '/').split('/').pop();\n const matched = PROFILE_FILE_NAMES.find((name) => name.toLowerCase() === basename?.toLowerCase());\n return matched;\n}\n\nasync function readPreview(path: string, limit: number): Promise<{ content: string; missing: boolean }> {\n try {\n const content = await readFile(path, 'utf-8');\n const trimmed = content.trimEnd();\n if (trimmed.length <= limit) {\n return { content: trimmed, missing: false };\n }\n return {\n content: `${trimmed.slice(0, limit)}\\n\\n… truncated, ask me to read the full file before editing …`,\n missing: false,\n };\n } catch {\n return { content: '', missing: true };\n }\n}\n\nfunction buildEditInstructions(agentId: string, fileNames: readonly string[]): string {\n const files = fileNames.map((name) => `\\`${name}\\``).join(', ');\n return [\n `You are editing agent \\`${agentId}\\`.`,\n '',\n 'Tell me what to change, or say things like:',\n '- “Refine `SOUL.md` to sound warmer and more concise.”',\n '- “Update `IDENTITY.md` so this agent is focused on data analysis.”',\n '- “Read `SOUL.md` first, propose changes, then write them back.”',\n '',\n `Editable profile files: ${files}.`,\n 'I can read and update these by bare filename with `read_file`, `edit_file`, and `write_file`.',\n ].join('\\n');\n}\n\nconst agentEditCommand: CommandDefinition = {\n id: 'agent.edit',\n name: 'agent-edit',\n aliases: ['agentedit'],\n description: 'Show editable profile files for the current agent and prepare this chat for profile edits.',\n category: 'system',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: ['/agent-edit', '/agent-edit SOUL.md', '/agent-edit IDENTITY.md --limit=2000'],\n handler: async (ctx: CommandContext, args: string) => {\n await ctx.setTyping(true);\n\n const { fileName: rawFileName, previewChars } = parseArgs(args);\n const fileName = normalizeProfileFileName(rawFileName);\n if (rawFileName && !fileName) {\n return {\n content: `⚠️ Unsupported profile file: \\`${rawFileName}\\`. Use one of: ${PROFILE_FILE_NAMES.map((name) => `\\`${name}\\``).join(', ')}.`,\n success: false,\n };\n }\n\n const agentId = normalizeAgentId(resolveAgentIdFromSessionKey(ctx.sessionKey));\n const profileDir = resolveAgentProfileDir(ctx.config, agentId);\n const namesToShow = fileName ? [fileName] : [WORKSPACE_FILES.SOUL, WORKSPACE_FILES.IDENTITY];\n\n const sections: string[] = [];\n for (const name of namesToShow) {\n const preview = await readPreview(join(profileDir, name), previewChars);\n if (preview.missing) {\n sections.push(`## ${name}\\n_missing_`);\n } else {\n sections.push(`## ${name}\\n\\`\\`\\`markdown\\n${preview.content}\\n\\`\\`\\``);\n }\n }\n\n return {\n content: [\n '🛠️ Agent editor mode',\n '',\n buildEditInstructions(agentId, PROFILE_FILE_NAMES),\n '',\n `Profile directory: \\`${profileDir}\\``,\n '',\n ...sections,\n ].join('\\n'),\n success: true,\n };\n },\n};\n\nexport function registerAgentEditCommand(): void {\n commandRegistry.register(agentEditCommand);\n}\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { ConfigSchema, init_schema } from "../../config/schema.js";
2
- import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
3
1
  import { createLogger } from "../../utils/logger/index.js";
4
2
  import { init_logger } from "../../utils/logger.js";
5
3
  import { init_paths, resolveConfigPath } from "../../config/paths.js";
4
+ import { ConfigSchema, init_schema } from "../../config/schema.js";
6
5
  import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
6
+ import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
7
7
  import { commandRegistry } from "../registry.js";
8
8
  import { resolveAllowlistMatchSimple } from "../../channels/security.js";
9
9
  import { parseConfigValue } from "../config-value.js";
@@ -4,8 +4,8 @@ import { init_loader, saveConfig } from "../config/loader.js";
4
4
  import { effectiveWorkspacePathForSession } from "../session/session-workspace.js";
5
5
  import { getRoutingInfo, getSessionDisplayName } from "./session-key.js";
6
6
  import { wrapMarkdownExportAsHtml } from "../session/chat-export.js";
7
- import { join } from "path";
8
7
  import { mkdir, writeFile } from "fs/promises";
8
+ import { join } from "path";
9
9
  //#region src/chat-commands/context.ts
10
10
  init_logger();
11
11
  init_loader();
@@ -20,6 +20,7 @@ export { registerContextCommands } from './builtins/context.js';
20
20
  export { registerGoalCommand } from './builtins/goal.js';
21
21
  export { registerSubgoalCommand } from './builtins/subgoal.js';
22
22
  export { registerWorkflowCommands } from './builtins/workflow.js';
23
+ export { registerAgentEditCommand } from './agent-edit.js';
23
24
  /**
24
25
  * Initialize the command system with all built-in commands
25
26
  */
@@ -11,6 +11,7 @@ import { registerContextCommands } from "./builtins/context.js";
11
11
  import { registerGoalCommand } from "./builtins/goal.js";
12
12
  import { registerSubgoalCommand } from "./builtins/subgoal.js";
13
13
  import { registerWorkflowCommands } from "./builtins/workflow.js";
14
+ import { registerAgentEditCommand } from "./agent-edit.js";
14
15
  import { CommandContextImpl, createCommandContext } from "./context.js";
15
16
  //#region src/chat-commands/index.ts
16
17
  /**
@@ -33,8 +34,9 @@ function initializeCommands() {
33
34
  registerGoalCommand();
34
35
  registerSubgoalCommand();
35
36
  registerWorkflowCommands();
37
+ registerAgentEditCommand();
36
38
  }
37
39
  //#endregion
38
- export { CommandContextImpl, CommandRegistry, commandRegistry, createCommandContext, generateSessionKey, getRoutingInfo, getSessionDisplayName, initializeCommands, isValidSessionKey, normalizeTelegramCommandName, parseSessionKey, parseSlashCommand, registerConfigCommand, registerContextCommands, registerGoalCommand, registerModelCommands, registerSessionCommands, registerSubgoalCommand, registerSystemCommands, registerTTSCommands, registerThinkingCommands, registerWorkflowCommands };
40
+ export { CommandContextImpl, CommandRegistry, commandRegistry, createCommandContext, generateSessionKey, getRoutingInfo, getSessionDisplayName, initializeCommands, isValidSessionKey, normalizeTelegramCommandName, parseSessionKey, parseSlashCommand, registerAgentEditCommand, registerConfigCommand, registerContextCommands, registerGoalCommand, registerModelCommands, registerSessionCommands, registerSubgoalCommand, registerSystemCommands, registerTTSCommands, registerThinkingCommands, registerWorkflowCommands };
39
41
 
40
42
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/chat-commands/index.ts"],"sourcesContent":["/**\n * Unified Command System\n *\n * Provides a platform-agnostic command system that works across\n * Telegram, Feishu, Web UI, CLI, and other channel surfaces.\n */\n\n// Built-in Commands (import first to avoid circular deps)\nimport { registerSessionCommands } from './builtins/session.js';\nimport { registerModelCommands } from './builtins/model.js';\nimport { registerSystemCommands } from './builtins/system.js';\nimport { registerTTSCommands } from './builtins/tts.js';\nimport { registerThinkingCommands } from './builtins/thinking.js';\nimport { registerConfigCommand } from './builtins/config.js';\nimport { registerContextCommands } from './builtins/context.js';\nimport { registerGoalCommand } from './builtins/goal.js';\nimport { registerSubgoalCommand } from './builtins/subgoal.js';\nimport { registerWorkflowCommands } from './builtins/workflow.js';\n\n// Types\nexport type {\n MessageSource,\n UnifiedMessage,\n PlatformMetadata,\n MessageAttachment,\n CommandDefinition,\n CommandCategory,\n CommandScope,\n CommandHandler,\n CommandResult,\n CommandContext,\n ReplyOptions,\n UIComponent,\n ButtonGroup,\n SelectMenu,\n ModelPicker,\n UsageDisplay,\n SessionList,\n TextInput,\n ProviderInfo,\n ModelInfo,\n UsageStats,\n SessionInfo,\n PlatformFeature,\n ChannelAdapter,\n ReplyPayload,\n} from './types.js';\n\n// Session Key\nexport {\n generateSessionKey,\n parseSessionKey,\n isValidSessionKey,\n getSessionDisplayName,\n getRoutingInfo,\n type SessionKeyContext,\n} from './session-key.js';\n\n// Command parsing helpers\nexport { normalizeTelegramCommandName, parseSlashCommand } from './command-parse.js';\n\n// Registry\nexport { CommandRegistry, commandRegistry } from './registry.js';\nexport type { CommandRegistry as CommandRegistryType } from './types.js';\n\n// Context\nexport { CommandContextImpl, createCommandContext } from './context.js';\n\n// Built-in Commands\nexport { registerSessionCommands } from './builtins/session.js';\nexport { registerModelCommands } from './builtins/model.js';\nexport { registerSystemCommands } from './builtins/system.js';\nexport { registerTTSCommands } from './builtins/tts.js';\nexport { registerThinkingCommands } from './builtins/thinking.js';\nexport { registerConfigCommand } from './builtins/config.js';\nexport { registerContextCommands } from './builtins/context.js';\nexport { registerGoalCommand } from './builtins/goal.js';\nexport { registerSubgoalCommand } from './builtins/subgoal.js';\nexport { registerWorkflowCommands } from './builtins/workflow.js';\n\n/**\n * Initialize the command system with all built-in commands\n */\nexport function initializeCommands(): void {\n registerSessionCommands();\n registerModelCommands();\n registerSystemCommands();\n registerConfigCommand();\n registerContextCommands();\n registerTTSCommands();\n registerThinkingCommands();\n registerGoalCommand();\n registerSubgoalCommand();\n registerWorkflowCommands();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAmFA,SAAgB,qBAA2B;AACzC,0BAAyB;AACzB,wBAAuB;AACvB,yBAAwB;AACxB,wBAAuB;AACvB,0BAAyB;AACzB,sBAAqB;AACrB,2BAA0B;AAC1B,sBAAqB;AACrB,yBAAwB;AACxB,2BAA0B"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/chat-commands/index.ts"],"sourcesContent":["/**\n * Unified Command System\n *\n * Provides a platform-agnostic command system that works across\n * Telegram, Feishu, Web UI, CLI, and other channel surfaces.\n */\n\n// Built-in Commands (import first to avoid circular deps)\nimport { registerSessionCommands } from './builtins/session.js';\nimport { registerModelCommands } from './builtins/model.js';\nimport { registerSystemCommands } from './builtins/system.js';\nimport { registerTTSCommands } from './builtins/tts.js';\nimport { registerThinkingCommands } from './builtins/thinking.js';\nimport { registerConfigCommand } from './builtins/config.js';\nimport { registerContextCommands } from './builtins/context.js';\nimport { registerGoalCommand } from './builtins/goal.js';\nimport { registerSubgoalCommand } from './builtins/subgoal.js';\nimport { registerWorkflowCommands } from './builtins/workflow.js';\nimport { registerAgentEditCommand } from './agent-edit.js';\n\n// Types\nexport type {\n MessageSource,\n UnifiedMessage,\n PlatformMetadata,\n MessageAttachment,\n CommandDefinition,\n CommandCategory,\n CommandScope,\n CommandHandler,\n CommandResult,\n CommandContext,\n ReplyOptions,\n UIComponent,\n ButtonGroup,\n SelectMenu,\n ModelPicker,\n UsageDisplay,\n SessionList,\n TextInput,\n ProviderInfo,\n ModelInfo,\n UsageStats,\n SessionInfo,\n PlatformFeature,\n ChannelAdapter,\n ReplyPayload,\n} from './types.js';\n\n// Session Key\nexport {\n generateSessionKey,\n parseSessionKey,\n isValidSessionKey,\n getSessionDisplayName,\n getRoutingInfo,\n type SessionKeyContext,\n} from './session-key.js';\n\n// Command parsing helpers\nexport { normalizeTelegramCommandName, parseSlashCommand } from './command-parse.js';\n\n// Registry\nexport { CommandRegistry, commandRegistry } from './registry.js';\nexport type { CommandRegistry as CommandRegistryType } from './types.js';\n\n// Context\nexport { CommandContextImpl, createCommandContext } from './context.js';\n\n// Built-in Commands\nexport { registerSessionCommands } from './builtins/session.js';\nexport { registerModelCommands } from './builtins/model.js';\nexport { registerSystemCommands } from './builtins/system.js';\nexport { registerTTSCommands } from './builtins/tts.js';\nexport { registerThinkingCommands } from './builtins/thinking.js';\nexport { registerConfigCommand } from './builtins/config.js';\nexport { registerContextCommands } from './builtins/context.js';\nexport { registerGoalCommand } from './builtins/goal.js';\nexport { registerSubgoalCommand } from './builtins/subgoal.js';\nexport { registerWorkflowCommands } from './builtins/workflow.js';\nexport { registerAgentEditCommand } from './agent-edit.js';\n\n/**\n * Initialize the command system with all built-in commands\n */\nexport function initializeCommands(): void {\n registerSessionCommands();\n registerModelCommands();\n registerSystemCommands();\n registerConfigCommand();\n registerContextCommands();\n registerTTSCommands();\n registerThinkingCommands();\n registerGoalCommand();\n registerSubgoalCommand();\n registerWorkflowCommands();\n registerAgentEditCommand();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAqFA,SAAgB,qBAA2B;AACzC,0BAAyB;AACzB,wBAAuB;AACvB,yBAAwB;AACxB,wBAAuB;AACvB,0BAAyB;AACzB,sBAAqB;AACrB,2BAA0B;AAC1B,sBAAqB;AACrB,yBAAwB;AACxB,2BAA0B;AAC1B,2BAA0B"}
@@ -1,8 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { version } from "../../package.js";
3
3
  import "./cli-log-level-preset.js";
4
+ import { ensureXopcCliOnPath } from "../infra/path-env.js";
4
5
  import { formatRootHelp } from "./command-manifest.js";
5
6
  //#region src/cli/bin.ts
7
+ ensureXopcCliOnPath();
6
8
  function printRootHelp() {
7
9
  console.log(formatRootHelp());
8
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","names":["pkg.version"],"sources":["../../../src/cli/bin.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * CLI entry: log-level preset must run before any module that initializes the logger.\n * (Bundlers may reorder imports in `index.ts`; this file stays dependency-minimal.)\n */\nimport './cli-log-level-preset.js';\n\nimport pkg from '../../package.json' with { type: 'json' };\nimport { formatRootHelp } from './command-manifest.js';\n\nfunction printRootHelp(): void {\n console.log(formatRootHelp());\n}\n\nconst rootArgs = process.argv.slice(2).filter((arg) => arg !== '--');\nif (rootArgs.length === 1 && (rootArgs[0] === '--version' || rootArgs[0] === '-V')) {\n console.log(pkg.version);\n process.exit(0);\n}\nif (rootArgs.length === 1 && (rootArgs[0] === '--help' || rootArgs[0] === '-h' || rootArgs[0] === 'help')) {\n printRootHelp();\n process.exit(0);\n}\n\nconst filteredArgv = process.argv.filter((arg, index) => {\n if (arg !== '--') return true;\n return index < 2;\n});\n\nconst { tryRunGatewayRunFastPath } = await import('./gateway-run-fast-path.js');\nif (await tryRunGatewayRunFastPath(filteredArgv)) {\n process.exit(typeof process.exitCode === 'number' ? process.exitCode : 0);\n}\n\nconst { runCli } = await import('./index.js');\nawait runCli(process.argv);\n"],"mappings":";;;;;AAUA,SAAS,gBAAsB;AAC7B,SAAQ,IAAI,gBAAgB,CAAC;;AAG/B,MAAM,WAAW,QAAQ,KAAK,MAAM,EAAE,CAAC,QAAQ,QAAQ,QAAQ,KAAK;AACpE,IAAI,SAAS,WAAW,MAAM,SAAS,OAAO,eAAe,SAAS,OAAO,OAAO;AAClF,SAAQ,IAAIA,QAAY;AACxB,SAAQ,KAAK,EAAE;;AAEjB,IAAI,SAAS,WAAW,MAAM,SAAS,OAAO,YAAY,SAAS,OAAO,QAAQ,SAAS,OAAO,SAAS;AACzG,gBAAe;AACf,SAAQ,KAAK,EAAE;;AAGjB,MAAM,eAAe,QAAQ,KAAK,QAAQ,KAAK,UAAU;AACvD,KAAI,QAAQ,KAAM,QAAO;AACzB,QAAO,QAAQ;EACf;AAEF,MAAM,EAAE,6BAA6B,MAAM,OAAO;AAClD,IAAI,MAAM,yBAAyB,aAAa,CAC9C,SAAQ,KAAK,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW,EAAE;AAG3E,MAAM,EAAE,WAAW,MAAM,OAAO;AAChC,MAAM,OAAO,QAAQ,KAAK"}
1
+ {"version":3,"file":"bin.js","names":["pkg.version"],"sources":["../../../src/cli/bin.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * CLI entry: log-level preset must run before any module that initializes the logger.\n * (Bundlers may reorder imports in `index.ts`; this file stays dependency-minimal.)\n */\nimport './cli-log-level-preset.js';\n\nimport pkg from '../../package.json' with { type: 'json' };\nimport { ensureXopcCliOnPath } from '../infra/path-env.js';\nimport { formatRootHelp } from './command-manifest.js';\n\nensureXopcCliOnPath();\n\nfunction printRootHelp(): void {\n console.log(formatRootHelp());\n}\n\nconst rootArgs = process.argv.slice(2).filter((arg) => arg !== '--');\nif (rootArgs.length === 1 && (rootArgs[0] === '--version' || rootArgs[0] === '-V')) {\n console.log(pkg.version);\n process.exit(0);\n}\nif (rootArgs.length === 1 && (rootArgs[0] === '--help' || rootArgs[0] === '-h' || rootArgs[0] === 'help')) {\n printRootHelp();\n process.exit(0);\n}\n\nconst filteredArgv = process.argv.filter((arg, index) => {\n if (arg !== '--') return true;\n return index < 2;\n});\n\nconst { tryRunGatewayRunFastPath } = await import('./gateway-run-fast-path.js');\nif (await tryRunGatewayRunFastPath(filteredArgv)) {\n process.exit(typeof process.exitCode === 'number' ? process.exitCode : 0);\n}\n\nconst { runCli } = await import('./index.js');\nawait runCli(process.argv);\n"],"mappings":";;;;;;AAWA,qBAAqB;AAErB,SAAS,gBAAsB;AAC7B,SAAQ,IAAI,gBAAgB,CAAC;;AAG/B,MAAM,WAAW,QAAQ,KAAK,MAAM,EAAE,CAAC,QAAQ,QAAQ,QAAQ,KAAK;AACpE,IAAI,SAAS,WAAW,MAAM,SAAS,OAAO,eAAe,SAAS,OAAO,OAAO;AAClF,SAAQ,IAAIA,QAAY;AACxB,SAAQ,KAAK,EAAE;;AAEjB,IAAI,SAAS,WAAW,MAAM,SAAS,OAAO,YAAY,SAAS,OAAO,QAAQ,SAAS,OAAO,SAAS;AACzG,gBAAe;AACf,SAAQ,KAAK,EAAE;;AAGjB,MAAM,eAAe,QAAQ,KAAK,QAAQ,KAAK,UAAU;AACvD,KAAI,QAAQ,KAAM,QAAO;AACzB,QAAO,QAAQ;EACf;AAEF,MAAM,EAAE,6BAA6B,MAAM,OAAO;AAClD,IAAI,MAAM,yBAAyB,aAAa,CAC9C,SAAQ,KAAK,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW,EAAE;AAG3E,MAAM,EAAE,WAAW,MAAM,OAAO;AAChC,MAAM,OAAO,QAAQ,KAAK"}
@@ -1,5 +1,5 @@
1
- import { ConfigSchema, init_schema } from "../../config/schema.js";
2
1
  import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
2
+ import { ConfigSchema, init_schema } from "../../config/schema.js";
3
3
  import { resolveGatewayLocalClientHost } from "../../config/gateway-bind.js";
4
4
  import { formatExamples, register } from "../registry.js";
5
5
  import { existsSync, readFileSync } from "fs";