@xopcai/xopc 0.0.105 → 0.0.107

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 (430) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/dashscope/xopc.extension.json +7 -2
  3. package/dist/extensions/fal/xopc.extension.json +7 -2
  4. package/dist/extensions/feishu/src/adapters/gateway-setup.js +22 -26
  5. package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -1
  6. package/dist/extensions/feishu/src/directory/directory-adapter.js +1 -1
  7. package/dist/extensions/feishu/src/directory/directory-adapter.js.map +1 -1
  8. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  9. package/dist/extensions/feishu/src/outbound/outbound-adapter.js +4 -3
  10. package/dist/extensions/feishu/src/outbound/outbound-adapter.js.map +1 -1
  11. package/dist/extensions/feishu/src/plugin.d.ts +6 -3
  12. package/dist/extensions/feishu/src/plugin.js +59 -40
  13. package/dist/extensions/feishu/src/plugin.js.map +1 -1
  14. package/dist/extensions/feishu/src/streaming/streaming-adapter.js +20 -16
  15. package/dist/extensions/feishu/src/streaming/streaming-adapter.js.map +1 -1
  16. package/dist/extensions/feishu/src/transport/socket-mode/monitor.js +1 -1
  17. package/dist/extensions/feishu/src/transport/webhook/monitor.js +1 -1
  18. package/dist/extensions/feishu/src/workflow-progress.d.ts +1 -1
  19. package/dist/extensions/feishu/src/workflow-progress.js +3 -3
  20. package/dist/extensions/feishu/src/workflow-progress.js.map +1 -1
  21. package/dist/extensions/feishu/xopc.extension.json +458 -26
  22. package/dist/extensions/google/xopc.extension.json +7 -2
  23. package/dist/extensions/minimax/xopc.extension.json +8 -2
  24. package/dist/extensions/openai/xopc.extension.json +7 -2
  25. package/dist/extensions/telegram/src/adapters/gateway-setup.js +8 -6
  26. package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -1
  27. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  28. package/dist/extensions/telegram/src/command-handler.d.ts +1 -1
  29. package/dist/extensions/telegram/src/command-handler.js +11 -9
  30. package/dist/extensions/telegram/src/command-handler.js.map +1 -1
  31. package/dist/extensions/telegram/src/inbound-processor.js +2 -3
  32. package/dist/extensions/telegram/src/inbound-processor.js.map +1 -1
  33. package/dist/extensions/telegram/src/plugin.d.ts +1 -0
  34. package/dist/extensions/telegram/src/plugin.js +7 -7
  35. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  36. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  37. package/dist/extensions/telegram/src/update-offset-store.js +1 -1
  38. package/dist/extensions/telegram/src/workflow-progress.d.ts +1 -1
  39. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  40. package/dist/extensions/telegram/src/workflow-progress.js.map +1 -1
  41. package/dist/extensions/telegram/xopc.extension.json +10 -2
  42. package/dist/extensions/weixin/src/api/api.js +2 -2
  43. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  44. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  45. package/dist/extensions/weixin/src/cli/gateway-qr-login.d.ts +4 -0
  46. package/dist/extensions/weixin/src/cli/gateway-qr-login.js +34 -5
  47. package/dist/extensions/weixin/src/cli/gateway-qr-login.js.map +1 -1
  48. package/dist/extensions/weixin/src/cli/qr-login.js +4 -3
  49. package/dist/extensions/weixin/src/cli/qr-login.js.map +1 -1
  50. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  51. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  52. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  53. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  54. package/dist/extensions/weixin/src/plugin.d.ts +1 -0
  55. package/dist/extensions/weixin/src/plugin.js +8 -7
  56. package/dist/extensions/weixin/src/plugin.js.map +1 -1
  57. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  58. package/dist/extensions/weixin/src/workflow-progress.d.ts +1 -1
  59. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  60. package/dist/extensions/weixin/src/workflow-progress.js.map +1 -1
  61. package/dist/extensions/weixin/xopc.extension.json +57 -14
  62. package/dist/gateway/static/root/apple-touch-icon.png +0 -0
  63. package/dist/gateway/static/root/assets/agents-BXg2_mE4.js +78 -0
  64. package/dist/gateway/static/root/assets/apps-page-CJqQ-7Ss.js +1 -0
  65. package/dist/gateway/static/root/assets/channels-settings-DvMZ6NAd.js +1 -0
  66. package/dist/gateway/static/root/assets/cron-page-BPBlvSl5.js +1 -0
  67. package/dist/gateway/static/root/assets/{dist-DJDkNhu5.js → dist-CZh0c-s8.js} +1 -1
  68. package/dist/gateway/static/root/assets/{extension-debug-page-DI1XJTJi.js → extension-debug-page-DyJQR0SR.js} +1 -1
  69. package/dist/gateway/static/root/assets/{extension-page-SuafGTT_.js → extension-page-CDTuUr9B.js} +1 -1
  70. package/dist/gateway/static/root/assets/{extension-settings-page-cKmGax9v.js → extension-settings-page-DszZ8zHD.js} +1 -1
  71. package/dist/gateway/static/root/assets/{fetch-CkvRO30i.js → fetch-CFdKBnE6.js} +1 -1
  72. package/dist/gateway/static/root/assets/{gateway-startup-retry-BkKyRDrF.js → gateway-startup-retry-DdngdObI.js} +1 -1
  73. package/dist/gateway/static/root/assets/{heartbeat-config-api-CRiDcxtt.js → heartbeat-config-api-U10wnPdc.js} +1 -1
  74. package/dist/gateway/static/root/assets/index-DBc-bVOQ.js +4845 -0
  75. package/dist/gateway/static/root/assets/index-DI5_GsZt.css +1 -0
  76. package/dist/gateway/static/root/assets/{logs-page-DM8o5-Bm.js → logs-page-B6js8Bfi.js} +2 -2
  77. package/dist/gateway/static/root/assets/{note-detail-page-j53jtvq9.js → note-detail-page-DFzAXR35.js} +4 -4
  78. package/dist/gateway/static/root/assets/{note-time-Ck2H2Qpw.js → note-time-DOiSU-10.js} +1 -1
  79. package/dist/gateway/static/root/assets/notes-page-DAuZJMT8.js +1 -0
  80. package/dist/gateway/static/root/assets/{schema-form-BvmGNxiJ.js → schema-form-zM36dvbY.js} +1 -1
  81. package/dist/gateway/static/root/assets/sessions-page-CAsV03BY.js +1 -0
  82. package/dist/gateway/static/root/assets/{settings-advanced-gate-DRdayl8P.js → settings-advanced-gate-BCvObK1y.js} +1 -1
  83. package/dist/gateway/static/root/assets/{settings-form-section-BlIYg2gZ.js → settings-form-section-Bvl-RInc.js} +1 -1
  84. package/dist/gateway/static/root/assets/settings-page-DuCJDd74.js +3 -0
  85. package/dist/gateway/static/root/assets/{share-preview-page-BlT6Akvk.js → share-preview-page-rpL4DDTO.js} +1 -1
  86. package/dist/gateway/static/root/assets/skills-page--BioR9J4.js +2 -0
  87. package/dist/gateway/static/root/assets/{theme-store-DYgVdRB4.js → theme-store-BZozwAeK.js} +1 -1
  88. package/dist/gateway/static/root/assets/url-DQRqHuL-.js +3 -0
  89. package/dist/gateway/static/root/assets/voice-api-key-field-D2RJaoj_.js +1 -0
  90. package/dist/gateway/static/root/assets/{workflow-page.utils-_sjXCMvi.js → workflow-page.utils-BxacHYen.js} +1 -1
  91. package/dist/gateway/static/root/assets/workflows-page-B1B-est-.js +18 -0
  92. package/dist/gateway/static/root/favicon-16.png +0 -0
  93. package/dist/gateway/static/root/favicon-32.png +0 -0
  94. package/dist/gateway/static/root/favicon.ico +0 -0
  95. package/dist/gateway/static/root/favicon.svg +18 -0
  96. package/dist/gateway/static/root/index.html +11 -10
  97. package/dist/package.js +1 -1
  98. package/dist/src/agent/agent-manager.js +7 -7
  99. package/dist/src/agent/agent-scope.js +1 -1
  100. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  101. package/dist/src/agent/context/workspace-seed.js +2 -2
  102. package/dist/src/agent/context/workspace-state.js +1 -1
  103. package/dist/src/agent/goals/goal-run-store.js +4 -4
  104. package/dist/src/agent/goals/persistent-goal-service.js +1 -1
  105. package/dist/src/agent/goals/post-turn.js +2 -2
  106. package/dist/src/agent/image/load-image-media.js +2 -2
  107. package/dist/src/agent/ipc/bus.js +1 -1
  108. package/dist/src/agent/ipc/inbox.js +2 -2
  109. package/dist/src/agent/ipc/socket.js +1 -1
  110. package/dist/src/agent/mcp/bundle-mcp-config.js +16 -8
  111. package/dist/src/agent/mcp/bundle-mcp-config.js.map +1 -1
  112. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  113. package/dist/src/agent/mcp/bundle-mcp-policy.js +2 -2
  114. package/dist/src/agent/mcp/bundle-mcp-policy.js.map +1 -1
  115. package/dist/src/agent/mcp/bundle-mcp-runtime.js +2 -2
  116. package/dist/src/agent/mcp/mcp-http.js +1 -1
  117. package/dist/src/agent/mcp/mcp-http.js.map +1 -1
  118. package/dist/src/agent/mcp/mcp-transport-config.js +3 -7
  119. package/dist/src/agent/mcp/mcp-transport-config.js.map +1 -1
  120. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  121. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  122. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  123. package/dist/src/agent/memory/dreaming/events.js +1 -1
  124. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  125. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  126. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  127. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  128. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  129. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  130. package/dist/src/agent/memory/memory-flush.js +1 -1
  131. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  132. package/dist/src/agent/models/manager.js +1 -1
  133. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  134. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  135. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  136. package/dist/src/agent/sandbox/path-policy.js +2 -2
  137. package/dist/src/agent/service.js +4 -4
  138. package/dist/src/agent/session/session-inspector.js +1 -1
  139. package/dist/src/agent/skills/config.js +1 -1
  140. package/dist/src/agent/skills/hub-hash.js +2 -2
  141. package/dist/src/agent/skills/hub-lock.js +1 -1
  142. package/dist/src/agent/skills/hub-pull.js +2 -2
  143. package/dist/src/agent/skills/index.js +1 -1
  144. package/dist/src/agent/skills/managed-store.js +1 -1
  145. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +4 -0
  146. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +4 -2
  147. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
  148. package/dist/src/agent/skills/scanner.js +1 -1
  149. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  150. package/dist/src/agent/skills/skill-manager.js +1 -1
  151. package/dist/src/agent/starter-agents.d.ts +19 -0
  152. package/dist/src/agent/starter-agents.js +190 -0
  153. package/dist/src/agent/starter-agents.js.map +1 -0
  154. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  155. package/dist/src/agent/tools/factory.js +1 -1
  156. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  157. package/dist/src/agent/tools/send-media.js +1 -1
  158. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  159. package/dist/src/agent/tools/workflow-tool.js +1 -1
  160. package/dist/src/agent/tools/write.js +1 -1
  161. package/dist/src/agent/workflow/catalog.js +1 -1
  162. package/dist/src/agent/workflow/index.js +2 -1
  163. package/dist/src/agent/workflow/runtime.d.ts +2 -2
  164. package/dist/src/agent/workflow/runtime.js +50 -29
  165. package/dist/src/agent/workflow/runtime.js.map +1 -1
  166. package/dist/src/agent/workflow/snapshot-empty.d.ts +2 -0
  167. package/dist/src/agent/workflow/snapshot-empty.js +19 -0
  168. package/dist/src/agent/workflow/snapshot-empty.js.map +1 -0
  169. package/dist/src/agent/workflow/snapshot.js +1 -1
  170. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  171. package/dist/src/agent/workflow/types.d.ts +11 -0
  172. package/dist/src/auth/credentials.js +3 -3
  173. package/dist/src/auth/profiles/store.js +2 -2
  174. package/dist/src/auth/sync-provider-auth.js +1 -1
  175. package/dist/src/browser/cache-dir-policy.js +1 -1
  176. package/dist/src/browser/cdp-local-launcher.js +2 -2
  177. package/dist/src/browser/providers/browser-ext-install.js +3 -3
  178. package/dist/src/browser/providers/cloakbrowser.js +4 -4
  179. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  180. package/dist/src/browser/stealth.js +1 -1
  181. package/dist/src/channels/catalog/channel-catalog-service.js +13 -0
  182. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -1
  183. package/dist/src/channels/outbound/persist-store.js +1 -1
  184. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  185. package/dist/src/channels/pairing/pairing-store.js +2 -2
  186. package/dist/src/channels/plugins/types.adapters.d.ts +2 -0
  187. package/dist/src/chat-commands/agent-edit.js +2 -2
  188. package/dist/src/chat-commands/builtins/config.js +2 -2
  189. package/dist/src/chat-commands/context.js +1 -1
  190. package/dist/src/cli/commands/config.js +1 -1
  191. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  192. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  193. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  194. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  195. package/dist/src/cli/commands/extension-create.d.ts +2 -0
  196. package/dist/src/cli/commands/extension-create.js +165 -0
  197. package/dist/src/cli/commands/extension-create.js.map +1 -0
  198. package/dist/src/cli/commands/extension-dev.js +1 -3
  199. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  200. package/dist/src/cli/commands/extension-marketplace.js +105 -81
  201. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  202. package/dist/src/cli/commands/extension-pack.d.ts +13 -0
  203. package/dist/src/cli/commands/extension-pack.js +159 -91
  204. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  205. package/dist/src/cli/commands/extension.d.ts +2 -0
  206. package/dist/src/cli/commands/extension.js +375 -3
  207. package/dist/src/cli/commands/extension.js.map +1 -1
  208. package/dist/src/cli/commands/gateway/logs.js +1 -1
  209. package/dist/src/cli/commands/gateway/run-foreground.js +1 -2
  210. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  211. package/dist/src/cli/commands/image.js +1 -1
  212. package/dist/src/cli/commands/init.js +3 -3
  213. package/dist/src/cli/commands/models.js +1 -1
  214. package/dist/src/cli/commands/onboard/model.js +2 -2
  215. package/dist/src/cli/commands/onboard.js +0 -2
  216. package/dist/src/cli/commands/onboard.js.map +1 -1
  217. package/dist/src/cli/commands/setup.js +0 -2
  218. package/dist/src/cli/commands/setup.js.map +1 -1
  219. package/dist/src/cli/utils/init-workspace-core.js +10 -7
  220. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  221. package/dist/src/config/agent-profile.js +1 -1
  222. package/dist/src/config/agent-typed-models.js +1 -1
  223. package/dist/src/config/gateway-bind.js +1 -1
  224. package/dist/src/config/index.js +5 -5
  225. package/dist/src/config/loader.js +2 -2
  226. package/dist/src/config/models-json.js +2 -2
  227. package/dist/src/config/paths-state.js +1 -1
  228. package/dist/src/config/paths.d.ts +2 -2
  229. package/dist/src/config/paths.js +6 -5
  230. package/dist/src/config/paths.js.map +1 -1
  231. package/dist/src/config/profile.js +2 -2
  232. package/dist/src/config/schema.d.ts +2 -0
  233. package/dist/src/config/schema.js +3 -1
  234. package/dist/src/config/schema.js.map +1 -1
  235. package/dist/src/config/workspace-path.js +1 -1
  236. package/dist/src/connectors/health.js +1 -1
  237. package/dist/src/connectors/install.js +1 -1
  238. package/dist/src/cron/executor.js +2 -2
  239. package/dist/src/cron/persistence.js +1 -1
  240. package/dist/src/daemon/constants.js +1 -1
  241. package/dist/src/daemon/install-plan.js +2 -2
  242. package/dist/src/daemon/launchd.js +2 -2
  243. package/dist/src/daemon/schtasks.js +2 -2
  244. package/dist/src/daemon/systemd.js +2 -2
  245. package/dist/src/extensions/api.d.ts +4 -2
  246. package/dist/src/extensions/api.js +31 -12
  247. package/dist/src/extensions/api.js.map +1 -1
  248. package/dist/src/extensions/bundle-mcp.js +1 -1
  249. package/dist/src/extensions/discover-extensions.js +2 -1
  250. package/dist/src/extensions/discover-extensions.js.map +1 -1
  251. package/dist/src/extensions/health.js +1 -1
  252. package/dist/src/extensions/install.d.ts +1 -0
  253. package/dist/src/extensions/install.js +51 -8
  254. package/dist/src/extensions/install.js.map +1 -1
  255. package/dist/src/extensions/loader.d.ts +0 -4
  256. package/dist/src/extensions/loader.js +55 -88
  257. package/dist/src/extensions/loader.js.map +1 -1
  258. package/dist/src/extensions/lockfile.d.ts +9 -1
  259. package/dist/src/extensions/lockfile.js +2 -2
  260. package/dist/src/extensions/lockfile.js.map +1 -1
  261. package/dist/src/extensions/normalize-manifest.js +20 -4
  262. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  263. package/dist/src/extensions/package-contract.d.ts +12 -0
  264. package/dist/src/extensions/package-contract.js +59 -0
  265. package/dist/src/extensions/package-contract.js.map +1 -0
  266. package/dist/src/extensions/sdk/core.d.ts +1 -1
  267. package/dist/src/extensions/sdk/index.d.ts +1 -1
  268. package/dist/src/extensions/sdk/index.js.map +1 -1
  269. package/dist/src/extensions/types/manifest.d.ts +15 -0
  270. package/dist/src/extensions/update.js +1 -1
  271. package/dist/src/gateway/agents-admin.d.ts +0 -8
  272. package/dist/src/gateway/agents-admin.js +3 -28
  273. package/dist/src/gateway/agents-admin.js.map +1 -1
  274. package/dist/src/gateway/file-path-classifier.js +2 -2
  275. package/dist/src/gateway/heartbeat/service.js +1 -1
  276. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  277. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  278. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  279. package/dist/src/gateway/hono/oauth-async.js +1 -1
  280. package/dist/src/gateway/hono/oauth.js +1 -1
  281. package/dist/src/gateway/hono/routes/agents.js +2 -56
  282. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  283. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  284. package/dist/src/gateway/hono/routes/channels.js +10 -1
  285. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  286. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  287. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  288. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  289. package/dist/src/gateway/hono/routes/mcp.js +1 -1
  290. package/dist/src/gateway/hono/routes/models.js +1 -1
  291. package/dist/src/gateway/hono/routes/shares.js +1 -1
  292. package/dist/src/gateway/hono/routes/workflows.js +130 -0
  293. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  294. package/dist/src/gateway/hono/routes/workspace.js +2 -2
  295. package/dist/src/gateway/lock.js +3 -3
  296. package/dist/src/gateway/ports.js +1 -1
  297. package/dist/src/gateway/service/agent-runner.js +2 -2
  298. package/dist/src/gateway/service/marketplace-service.js +2 -2
  299. package/dist/src/gateway/service.d.ts +2 -0
  300. package/dist/src/gateway/service.js +45 -1
  301. package/dist/src/gateway/service.js.map +1 -1
  302. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  303. package/dist/src/heartbeat/index.js +1 -1
  304. package/dist/src/infra/brew.js +1 -1
  305. package/dist/src/infra/package-json.js +1 -1
  306. package/dist/src/infra/package-update-steps.js +1 -1
  307. package/dist/src/infra/path-env.js +2 -2
  308. package/dist/src/infra/restart.js +2 -2
  309. package/dist/src/infra/stable-node-path.js +1 -1
  310. package/dist/src/infra/update-check.js +1 -1
  311. package/dist/src/infra/update-global.js +1 -1
  312. package/dist/src/infra/update-lock.js +3 -3
  313. package/dist/src/infra/update-runner.js +1 -1
  314. package/dist/src/infra/update-startup.js +2 -2
  315. package/dist/src/infra/write-file-atomic.js +2 -2
  316. package/dist/src/media/store.js +1 -1
  317. package/dist/src/notes/agent-context.d.ts +12 -4
  318. package/dist/src/notes/agent-context.js +1 -1
  319. package/dist/src/notes/agent-context.js.map +1 -1
  320. package/dist/src/notes/store.js +2 -2
  321. package/dist/src/project-trust/trust-store.js +2 -2
  322. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  323. package/dist/src/providers/index.js +2 -2
  324. package/dist/src/providers/model-registry.js +1 -1
  325. package/dist/src/session/init-session-turn.js +2 -2
  326. package/dist/src/session/resolve-session.js +3 -3
  327. package/dist/src/session/session-title.js +2 -2
  328. package/dist/src/session/store.js +2 -2
  329. package/dist/src/share/share-auto.js +2 -2
  330. package/dist/src/share/share-store.js +3 -3
  331. package/dist/src/share/share-thumbnail.js +2 -2
  332. package/dist/src/share/share-zip.js +1 -1
  333. package/dist/src/share/site-share-store.js +3 -3
  334. package/dist/src/share/site-static-serve.js +1 -1
  335. package/dist/src/storage/sqlite/connection.js +2 -2
  336. package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
  337. package/dist/src/storage/sqlite/migrations/discover.js +1 -1
  338. package/dist/src/storage/sqlite/migrations/runner.js +1 -1
  339. package/dist/src/storage/sqlite/schema.js +1 -1
  340. package/dist/src/tui/backends/embedded-backend.js +1 -8
  341. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  342. package/dist/src/tui/backends/gateway-sse-backend.js +0 -7
  343. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  344. package/dist/src/tui/clipboard-image.js +3 -3
  345. package/dist/src/tui/theme-manager.js +1 -1
  346. package/dist/src/tui/tui-backend.d.ts +0 -1
  347. package/dist/src/tui/tui-command-formatters.js +3 -3
  348. package/dist/src/tui/tui-commands.js +3 -3
  349. package/dist/src/tui/tui-commands.js.map +1 -1
  350. package/dist/src/tui/tui-keybindings-file.js +1 -1
  351. package/dist/src/tui/tui-picker-overlay.js +1 -1
  352. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  353. package/dist/src/tui/tui-scoped-models.js +2 -2
  354. package/dist/src/tui/tui-settings.js +1 -1
  355. package/dist/src/tui/tui-startup-resources.js +2 -2
  356. package/dist/src/tui/tui.js +5 -5
  357. package/dist/src/tunnel/frpc-binary.js +3 -3
  358. package/dist/src/tunnel/frpc-config.js +1 -1
  359. package/dist/src/tunnel/frpc-extract.js +1 -1
  360. package/dist/src/tunnel/tunnel-state.js +1 -1
  361. package/dist/src/utils/logger/audit.js +1 -1
  362. package/dist/src/utils/logger/log-store.js +1 -1
  363. package/dist/src/utils/logger/rotation.js +1 -1
  364. package/dist/src/voice/stt/availability.d.ts +6 -0
  365. package/dist/src/voice/stt/availability.js +14 -6
  366. package/dist/src/voice/stt/availability.js.map +1 -1
  367. package/dist/src/voice/stt/index.js +2 -1
  368. package/dist/src/voice/stt/index.js.map +1 -1
  369. package/dist/src/voice/stt/mention.d.ts +2 -0
  370. package/dist/src/voice/stt/mention.js +20 -0
  371. package/dist/src/voice/stt/mention.js.map +1 -0
  372. package/dist/src/voice/stt/preflight.d.ts +1 -4
  373. package/dist/src/voice/stt/preflight.js +1 -18
  374. package/dist/src/voice/stt/preflight.js.map +1 -1
  375. package/dist/src/voice/tts/audio.js +1 -1
  376. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  377. package/dist/src/workflows/domain/definition-utils.d.ts +1 -0
  378. package/dist/src/workflows/domain/definition-utils.js +32 -2
  379. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  380. package/dist/src/workflows/domain/definition.d.ts +2 -0
  381. package/dist/src/workflows/domain/event.d.ts +2 -1
  382. package/dist/src/workflows/domain/index.d.ts +1 -0
  383. package/dist/src/workflows/domain/index.js +3 -2
  384. package/dist/src/workflows/domain/run.d.ts +27 -1
  385. package/dist/src/workflows/domain/run.js.map +1 -1
  386. package/dist/src/workflows/domain/schema-validation.d.ts +8 -0
  387. package/dist/src/workflows/domain/schema-validation.js +28 -0
  388. package/dist/src/workflows/domain/schema-validation.js.map +1 -0
  389. package/dist/src/workflows/draft/index.d.ts +3 -0
  390. package/dist/src/workflows/draft/index.js +3 -0
  391. package/dist/src/workflows/draft/workflow-draft-prompt.d.ts +23 -0
  392. package/dist/src/workflows/draft/workflow-draft-prompt.js +98 -0
  393. package/dist/src/workflows/draft/workflow-draft-prompt.js.map +1 -0
  394. package/dist/src/workflows/draft/workflow-draft-service.d.ts +12 -0
  395. package/dist/src/workflows/draft/workflow-draft-service.js +131 -0
  396. package/dist/src/workflows/draft/workflow-draft-service.js.map +1 -0
  397. package/dist/src/workflows/draft/workflow-draft-validator.d.ts +4 -0
  398. package/dist/src/workflows/draft/workflow-draft-validator.js +133 -0
  399. package/dist/src/workflows/draft/workflow-draft-validator.js.map +1 -0
  400. package/dist/src/workflows/draft/workflow-draft.types.d.ts +44 -0
  401. package/dist/src/workflows/draft/workflow-draft.types.js +1 -0
  402. package/dist/src/workflows/engine/projector.js +1 -0
  403. package/dist/src/workflows/engine/projector.js.map +1 -1
  404. package/dist/src/workflows/engine/workflow-engine.d.ts +18 -0
  405. package/dist/src/workflows/engine/workflow-engine.js +320 -11
  406. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  407. package/dist/src/workflows/index.js +4 -3
  408. package/dist/src/workflows/service/workflow-run-service.d.ts +14 -3
  409. package/dist/src/workflows/service/workflow-run-service.js +227 -6
  410. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  411. package/dist/src/workflows/service/workflow-run-service.types.d.ts +7 -2
  412. package/dist/src/workflows/store/event-store.js +1 -1
  413. package/dist/src/workflows/store/run-store.js +1 -1
  414. package/package.json +5 -3
  415. package/dist/gateway/static/root/assets/agents-XzgIVKcI.js +0 -396
  416. package/dist/gateway/static/root/assets/apps-page-B7Us3RMl.js +0 -1
  417. package/dist/gateway/static/root/assets/channels-settings-BgeV6fzw.js +0 -1
  418. package/dist/gateway/static/root/assets/cron-page-DKGHEeAU.js +0 -1
  419. package/dist/gateway/static/root/assets/index-50FVtgXU.js +0 -4845
  420. package/dist/gateway/static/root/assets/index-BPYKW7FB.css +0 -1
  421. package/dist/gateway/static/root/assets/notes-page-CsWIw35Q.js +0 -1
  422. package/dist/gateway/static/root/assets/sessions-page-CLPsbyOW.js +0 -1
  423. package/dist/gateway/static/root/assets/settings-page-CRGHT_bm.js +0 -3
  424. package/dist/gateway/static/root/assets/skills-page-Ce-RIH2y.js +0 -2
  425. package/dist/gateway/static/root/assets/url-DPEStU4M.js +0 -3
  426. package/dist/gateway/static/root/assets/voice-api-key-field-CJGTidqc.js +0 -1
  427. package/dist/gateway/static/root/assets/workflows-page-o63aaARK.js +0 -27
  428. package/dist/src/agent/builtin-agent-ids.d.ts +0 -2
  429. package/dist/src/agent/builtin-agent-ids.js +0 -17
  430. package/dist/src/agent/builtin-agent-ids.js.map +0 -1
@@ -2,9 +2,9 @@ import { init_paths, resolveSkillsDir } from "../../config/paths.js";
2
2
  import { parseFrontmatter } from "../../markdown/frontmatter.js";
3
3
  import { fuzzyFindText, normalizeForFuzzyMatch, normalizeToLF, restoreLineEndings } from "../tools/edit-diff.js";
4
4
  import { formatScanSummary, scanSkillDirectory } from "./scanner.js";
5
- import { mkdir, writeFile } from "fs/promises";
6
5
  import { join, resolve, sep } from "path";
7
6
  import { existsSync, realpathSync } from "fs";
7
+ import { mkdir, writeFile } from "fs/promises";
8
8
  //#region src/agent/skills/skill-manage-ops.ts
9
9
  /**
10
10
  * Shared logic for the skill_manage agent tool (create / edit / patch / delete / write_file / remove_file).
@@ -1,6 +1,6 @@
1
+ import { resolveStateDir } from "../../config/paths-state.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { resolveStateDir } from "../../config/paths-state.js";
4
4
  import { init_paths, resolveBundledSkillsDir } from "../../config/paths.js";
5
5
  import { createSkillConfigManager, isSkillEnabled } from "./config.js";
6
6
  import { formatSkillsForPrompt, selectSkillsVisibleInPrompt } from "./format-skills-prompt.js";
@@ -0,0 +1,19 @@
1
+ import type { Config } from '../config/schema.js';
2
+ export declare const STARTER_AGENTS_INITIALIZED_VERSION = 1;
3
+ type StarterAgent = {
4
+ id: string;
5
+ displayName: string;
6
+ description: string;
7
+ emoji: string;
8
+ tools?: {
9
+ disable?: string[];
10
+ };
11
+ profileFiles: Record<string, string>;
12
+ };
13
+ export declare const STARTER_AGENTS: readonly StarterAgent[];
14
+ export declare function materializeStarterAgentFiles(cfg: Config): void;
15
+ export declare function ensureStarterAgentsInitialized(cfg: Config): {
16
+ config: Config;
17
+ changed: boolean;
18
+ };
19
+ export {};
@@ -0,0 +1,190 @@
1
+ import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentProfileDir, resolveAgentWorkspaceDir } from "./agent-scope.js";
2
+ import { WORKSPACE_FILES, init_paths } from "../config/paths.js";
3
+ import { applyAgentConfig } from "../commands/agents.config.js";
4
+ import { join } from "node:path";
5
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
6
+ //#region src/agent/starter-agents.ts
7
+ init_paths();
8
+ init_agent_scope();
9
+ const STARTER_AGENTS_INITIALIZED_VERSION = 1;
10
+ function identity(params) {
11
+ return `# IDENTITY.md - Who Am I?\n\n- **Name:** ${params.name}\n- **Description:** ${params.description}\n- **Language:** en\n- **Creature:** ${params.creature}\n- **Emoji:** ${params.emoji}\n- **Avatar:**\n`;
12
+ }
13
+ const STARTER_AGENTS = [
14
+ {
15
+ id: "main",
16
+ displayName: "Main",
17
+ description: "General-purpose personal assistant.",
18
+ emoji: "✨",
19
+ profileFiles: {
20
+ [WORKSPACE_FILES.IDENTITY]: identity({
21
+ name: "Main",
22
+ description: "General-purpose personal assistant.",
23
+ creature: "assistant",
24
+ emoji: "✨"
25
+ }),
26
+ [WORKSPACE_FILES.SOUL]: `# SOUL.md - Main\n\nYou are a helpful personal AI assistant. Adapt to the user's intent, keep responses practical, and use tools when they clearly help.\n`,
27
+ [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Main Tool Policy\n\n- Use tools when they materially improve the answer.\n- Prefer safe inspection before changing files or external state.\n- Ask before destructive actions.\n`
28
+ }
29
+ },
30
+ {
31
+ id: "coder",
32
+ displayName: "Coder",
33
+ description: "Software development, debugging, refactoring, and tests.",
34
+ emoji: "💻",
35
+ tools: { disable: [
36
+ "image_generate",
37
+ "send_message",
38
+ "send_media",
39
+ "cronjob"
40
+ ] },
41
+ profileFiles: {
42
+ [WORKSPACE_FILES.IDENTITY]: identity({
43
+ name: "Coder",
44
+ description: "Software development, debugging, refactoring, and tests.",
45
+ creature: "software engineer",
46
+ emoji: "💻"
47
+ }),
48
+ [WORKSPACE_FILES.SOUL]: `# SOUL.md - Coder\n\nYou are a software engineering agent. Understand the codebase, make focused changes, and verify behavior.\n\n## Workflow\n\n1. Read relevant files before proposing or editing code.\n2. Follow existing architecture, naming, and test style.\n3. Keep changes scoped to the requested behavior.\n4. Run the smallest meaningful verification.\n5. Report changed files, tests, and remaining risk.\n\n## Boundaries\n\n- Ask before destructive filesystem or git operations.\n- Do not send messages or media on the user's behalf.\n- Do not generate images for coding tasks.\n`,
49
+ [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Coder Tool Policy\n\n- Use grep, find, list_dir, and read_file to understand code first.\n- Use edit_file or write_file only after the target change is clear.\n- Use shell for tests, type checks, builds, and safe inspection commands.\n- Use web_search or web_fetch only for current external docs or APIs.\n- Do not use send_message, send_media, cronjob, or image_generate.\n`
50
+ }
51
+ },
52
+ {
53
+ id: "writer",
54
+ displayName: "Writer",
55
+ description: "Drafting, editing, rewriting, and audience-aware content.",
56
+ emoji: "✍️",
57
+ tools: { disable: [
58
+ "shell",
59
+ "browser_use",
60
+ "send_message",
61
+ "send_media",
62
+ "cronjob",
63
+ "bundle-mcp"
64
+ ] },
65
+ profileFiles: {
66
+ [WORKSPACE_FILES.IDENTITY]: identity({
67
+ name: "Writer",
68
+ description: "Drafting, editing, rewriting, and audience-aware content.",
69
+ creature: "editor",
70
+ emoji: "✍️"
71
+ }),
72
+ [WORKSPACE_FILES.SOUL]: `# SOUL.md - Writer\n\nYou are a writing and editing agent. Improve clarity, structure, voice, and usefulness.\n\n## Workflow\n\n1. Identify audience, purpose, channel, and tone.\n2. Propose structure before long-form writing.\n3. Preserve the user's intent and voice unless asked to change it.\n4. Cut filler and vague claims.\n5. Mark assumptions, missing facts, and placeholders.\n\n## Boundaries\n\n- Do not run shell commands.\n- Do not control browsers.\n- Do not send drafts externally.\n`,
73
+ [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Writer Tool Policy\n\n- Use read_file to inspect source material.\n- Use write_file or edit_file only when the user asks to save or revise a document.\n- Use web_search and web_fetch for fact checks and source-backed writing.\n- Do not use shell, browser_use, send_message, send_media, cronjob, or bundle-mcp.\n`
74
+ }
75
+ },
76
+ {
77
+ id: "researcher",
78
+ displayName: "Researcher",
79
+ description: "Deep research, source comparison, and fact synthesis.",
80
+ emoji: "🔍",
81
+ tools: { disable: [
82
+ "shell",
83
+ "write_file",
84
+ "edit_file",
85
+ "send_message",
86
+ "send_media",
87
+ "cronjob"
88
+ ] },
89
+ profileFiles: {
90
+ [WORKSPACE_FILES.IDENTITY]: identity({
91
+ name: "Researcher",
92
+ description: "Deep research, source comparison, and fact synthesis.",
93
+ creature: "analyst",
94
+ emoji: "🔍"
95
+ }),
96
+ [WORKSPACE_FILES.SOUL]: `# SOUL.md - Researcher\n\nYou are a research agent. Find reliable evidence, compare sources, and produce careful synthesis.\n\n## Workflow\n\n1. Clarify the research question and decision context.\n2. Start broad, then move to primary sources.\n3. Prefer official docs, papers, filings, standards, datasets, and first-party statements.\n4. Cross-check important claims.\n5. Separate facts, source-backed claims, inference, and opinion.\n\n## Boundaries\n\n- Do not edit local files unless asked to save a report.\n- Do not run shell commands.\n- Do not send findings externally.\n`,
97
+ [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Researcher Tool Policy\n\n- Use web_search to map the topic and find candidate sources.\n- Use web_fetch for primary sources and source excerpts.\n- Use browser_use only when a page requires interaction.\n- Use read_file when the user provides local source material.\n- Do not use shell, write_file, edit_file, send_message, send_media, or cronjob.\n`
98
+ }
99
+ },
100
+ {
101
+ id: "data-analyst",
102
+ displayName: "Data Analyst",
103
+ description: "Data cleaning, analysis, visualization, and reproducible reports.",
104
+ emoji: "📊",
105
+ tools: { disable: [
106
+ "browser_use",
107
+ "send_message",
108
+ "send_media",
109
+ "cronjob"
110
+ ] },
111
+ profileFiles: {
112
+ [WORKSPACE_FILES.IDENTITY]: identity({
113
+ name: "Data Analyst",
114
+ description: "Data cleaning, analysis, visualization, and reproducible reports.",
115
+ creature: "data analyst",
116
+ emoji: "📊"
117
+ }),
118
+ [WORKSPACE_FILES.SOUL]: `# SOUL.md - Data Analyst\n\nYou are a data analysis agent. Inspect data, explain assumptions, and produce reproducible analysis.\n\n## Workflow\n\n1. Inspect schema, sample rows, missing values, and units.\n2. State assumptions before drawing conclusions.\n3. Use reproducible commands or scripts for calculations.\n4. Prefer clear tables and charts over verbose prose.\n5. Highlight data quality issues and uncertainty.\n\n## Boundaries\n\n- Do not control browsers by default.\n- Do not send results externally.\n- Do not schedule cron jobs without explicit user intent.\n`,
119
+ [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Data Analyst Tool Policy\n\n- Use read_file, list_dir, grep, and find to inspect datasets and notes.\n- Use shell for reproducible analysis commands and scripts.\n- Use write_file or edit_file for notebooks, scripts, cleaned data, and reports.\n- Use web_fetch or web_search only when external data or documentation is needed.\n- Do not use browser_use, send_message, send_media, or cronjob.\n`
120
+ }
121
+ },
122
+ {
123
+ id: "creative",
124
+ displayName: "Creative",
125
+ description: "Visual direction, image prompts, design critique, and creative options.",
126
+ emoji: "🎨",
127
+ tools: { disable: [
128
+ "shell",
129
+ "send_message",
130
+ "send_media",
131
+ "cronjob"
132
+ ] },
133
+ profileFiles: {
134
+ [WORKSPACE_FILES.IDENTITY]: identity({
135
+ name: "Creative",
136
+ description: "Visual direction, image prompts, design critique, and creative options.",
137
+ creature: "creative director",
138
+ emoji: "🎨"
139
+ }),
140
+ [WORKSPACE_FILES.SOUL]: `# SOUL.md - Creative\n\nYou are a creative design agent. Explore visual directions, produce strong options, and explain design tradeoffs.\n\n## Workflow\n\n1. Identify audience, medium, constraints, and taste direction.\n2. Offer distinct creative directions when the brief is open.\n3. Explain why each direction works.\n4. Respect accessibility, brand constraints, and production limits.\n5. Iterate concretely from user feedback.\n\n## Boundaries\n\n- Do not run shell commands.\n- Do not send creative work externally.\n- Do not schedule cron jobs.\n`,
141
+ [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Creative Tool Policy\n\n- Use image_generate when the user wants visual options or assets.\n- Use image to inspect user-provided images.\n- Use web_search and web_fetch for references, style research, or current product visuals.\n- Use write_file or edit_file to save prompts, design specs, or copy.\n- Do not use shell, send_message, send_media, or cronjob.\n`
142
+ }
143
+ }
144
+ ];
145
+ function hasAgentEntry(cfg, agentId) {
146
+ const id = normalizeAgentId(agentId);
147
+ return listAgentEntries(cfg).some((entry) => normalizeAgentId(entry.id) === id);
148
+ }
149
+ function writeFileIfMissing(path, content) {
150
+ if (!existsSync(path)) writeFileSync(path, content, "utf-8");
151
+ }
152
+ function materializeStarterAgentFiles(cfg) {
153
+ for (const starter of STARTER_AGENTS) {
154
+ const profileDir = resolveAgentProfileDir(cfg, starter.id);
155
+ const workspaceDir = resolveAgentWorkspaceDir(cfg, starter.id);
156
+ mkdirSync(profileDir, { recursive: true });
157
+ mkdirSync(workspaceDir, { recursive: true });
158
+ for (const [name, content] of Object.entries(starter.profileFiles)) writeFileIfMissing(join(profileDir, name), content);
159
+ }
160
+ }
161
+ function ensureStarterAgentsInitialized(cfg) {
162
+ if ((cfg.agents?.starterAgentsInitializedVersion ?? 0) >= 1) return {
163
+ config: cfg,
164
+ changed: false
165
+ };
166
+ let next = cfg;
167
+ for (const starter of STARTER_AGENTS) {
168
+ if (hasAgentEntry(next, starter.id)) continue;
169
+ next = applyAgentConfig(next, {
170
+ agentId: starter.id,
171
+ ...starter.tools ? { tools: starter.tools } : {}
172
+ });
173
+ }
174
+ next = {
175
+ ...next,
176
+ agents: {
177
+ ...next.agents,
178
+ starterAgentsInitializedVersion: 1
179
+ }
180
+ };
181
+ materializeStarterAgentFiles(next);
182
+ return {
183
+ config: next,
184
+ changed: next !== cfg
185
+ };
186
+ }
187
+ //#endregion
188
+ export { STARTER_AGENTS, STARTER_AGENTS_INITIALIZED_VERSION, ensureStarterAgentsInitialized, materializeStarterAgentFiles };
189
+
190
+ //# sourceMappingURL=starter-agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"starter-agents.js","names":[],"sources":["../../../src/agent/starter-agents.ts"],"sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { Config } from '../config/schema.js';\nimport { WORKSPACE_FILES } from '../config/paths.js';\nimport { applyAgentConfig, listAgentEntries } from '../commands/agents.config.js';\nimport {\n normalizeAgentId,\n resolveAgentProfileDir,\n resolveAgentWorkspaceDir,\n} from './agent-scope.js';\n\nexport const STARTER_AGENTS_INITIALIZED_VERSION = 1;\n\ntype StarterAgent = {\n id: string;\n displayName: string;\n description: string;\n emoji: string;\n tools?: { disable?: string[] };\n profileFiles: Record<string, string>;\n};\n\nfunction identity(params: { name: string; description: string; creature: string; emoji: string }): string {\n return `# IDENTITY.md - Who Am I?\\n\\n- **Name:** ${params.name}\\n- **Description:** ${params.description}\\n- **Language:** en\\n- **Creature:** ${params.creature}\\n- **Emoji:** ${params.emoji}\\n- **Avatar:**\\n`;\n}\n\nexport const STARTER_AGENTS: readonly StarterAgent[] = [\n {\n id: 'main',\n displayName: 'Main',\n description: 'General-purpose personal assistant.',\n emoji: '✨',\n profileFiles: {\n [WORKSPACE_FILES.IDENTITY]: identity({\n name: 'Main',\n description: 'General-purpose personal assistant.',\n creature: 'assistant',\n emoji: '✨',\n }),\n [WORKSPACE_FILES.SOUL]: `# SOUL.md - Main\\n\\nYou are a helpful personal AI assistant. Adapt to the user's intent, keep responses practical, and use tools when they clearly help.\\n`,\n [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Main Tool Policy\\n\\n- Use tools when they materially improve the answer.\\n- Prefer safe inspection before changing files or external state.\\n- Ask before destructive actions.\\n`,\n },\n },\n {\n id: 'coder',\n displayName: 'Coder',\n description: 'Software development, debugging, refactoring, and tests.',\n emoji: '💻',\n tools: { disable: ['image_generate', 'send_message', 'send_media', 'cronjob'] },\n profileFiles: {\n [WORKSPACE_FILES.IDENTITY]: identity({\n name: 'Coder',\n description: 'Software development, debugging, refactoring, and tests.',\n creature: 'software engineer',\n emoji: '💻',\n }),\n [WORKSPACE_FILES.SOUL]: `# SOUL.md - Coder\\n\\nYou are a software engineering agent. Understand the codebase, make focused changes, and verify behavior.\\n\\n## Workflow\\n\\n1. Read relevant files before proposing or editing code.\\n2. Follow existing architecture, naming, and test style.\\n3. Keep changes scoped to the requested behavior.\\n4. Run the smallest meaningful verification.\\n5. Report changed files, tests, and remaining risk.\\n\\n## Boundaries\\n\\n- Ask before destructive filesystem or git operations.\\n- Do not send messages or media on the user's behalf.\\n- Do not generate images for coding tasks.\\n`,\n [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Coder Tool Policy\\n\\n- Use grep, find, list_dir, and read_file to understand code first.\\n- Use edit_file or write_file only after the target change is clear.\\n- Use shell for tests, type checks, builds, and safe inspection commands.\\n- Use web_search or web_fetch only for current external docs or APIs.\\n- Do not use send_message, send_media, cronjob, or image_generate.\\n`,\n },\n },\n {\n id: 'writer',\n displayName: 'Writer',\n description: 'Drafting, editing, rewriting, and audience-aware content.',\n emoji: '✍️',\n tools: { disable: ['shell', 'browser_use', 'send_message', 'send_media', 'cronjob', 'bundle-mcp'] },\n profileFiles: {\n [WORKSPACE_FILES.IDENTITY]: identity({\n name: 'Writer',\n description: 'Drafting, editing, rewriting, and audience-aware content.',\n creature: 'editor',\n emoji: '✍️',\n }),\n [WORKSPACE_FILES.SOUL]: `# SOUL.md - Writer\\n\\nYou are a writing and editing agent. Improve clarity, structure, voice, and usefulness.\\n\\n## Workflow\\n\\n1. Identify audience, purpose, channel, and tone.\\n2. Propose structure before long-form writing.\\n3. Preserve the user's intent and voice unless asked to change it.\\n4. Cut filler and vague claims.\\n5. Mark assumptions, missing facts, and placeholders.\\n\\n## Boundaries\\n\\n- Do not run shell commands.\\n- Do not control browsers.\\n- Do not send drafts externally.\\n`,\n [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Writer Tool Policy\\n\\n- Use read_file to inspect source material.\\n- Use write_file or edit_file only when the user asks to save or revise a document.\\n- Use web_search and web_fetch for fact checks and source-backed writing.\\n- Do not use shell, browser_use, send_message, send_media, cronjob, or bundle-mcp.\\n`,\n },\n },\n {\n id: 'researcher',\n displayName: 'Researcher',\n description: 'Deep research, source comparison, and fact synthesis.',\n emoji: '🔍',\n tools: { disable: ['shell', 'write_file', 'edit_file', 'send_message', 'send_media', 'cronjob'] },\n profileFiles: {\n [WORKSPACE_FILES.IDENTITY]: identity({\n name: 'Researcher',\n description: 'Deep research, source comparison, and fact synthesis.',\n creature: 'analyst',\n emoji: '🔍',\n }),\n [WORKSPACE_FILES.SOUL]: `# SOUL.md - Researcher\\n\\nYou are a research agent. Find reliable evidence, compare sources, and produce careful synthesis.\\n\\n## Workflow\\n\\n1. Clarify the research question and decision context.\\n2. Start broad, then move to primary sources.\\n3. Prefer official docs, papers, filings, standards, datasets, and first-party statements.\\n4. Cross-check important claims.\\n5. Separate facts, source-backed claims, inference, and opinion.\\n\\n## Boundaries\\n\\n- Do not edit local files unless asked to save a report.\\n- Do not run shell commands.\\n- Do not send findings externally.\\n`,\n [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Researcher Tool Policy\\n\\n- Use web_search to map the topic and find candidate sources.\\n- Use web_fetch for primary sources and source excerpts.\\n- Use browser_use only when a page requires interaction.\\n- Use read_file when the user provides local source material.\\n- Do not use shell, write_file, edit_file, send_message, send_media, or cronjob.\\n`,\n },\n },\n {\n id: 'data-analyst',\n displayName: 'Data Analyst',\n description: 'Data cleaning, analysis, visualization, and reproducible reports.',\n emoji: '📊',\n tools: { disable: ['browser_use', 'send_message', 'send_media', 'cronjob'] },\n profileFiles: {\n [WORKSPACE_FILES.IDENTITY]: identity({\n name: 'Data Analyst',\n description: 'Data cleaning, analysis, visualization, and reproducible reports.',\n creature: 'data analyst',\n emoji: '📊',\n }),\n [WORKSPACE_FILES.SOUL]: `# SOUL.md - Data Analyst\\n\\nYou are a data analysis agent. Inspect data, explain assumptions, and produce reproducible analysis.\\n\\n## Workflow\\n\\n1. Inspect schema, sample rows, missing values, and units.\\n2. State assumptions before drawing conclusions.\\n3. Use reproducible commands or scripts for calculations.\\n4. Prefer clear tables and charts over verbose prose.\\n5. Highlight data quality issues and uncertainty.\\n\\n## Boundaries\\n\\n- Do not control browsers by default.\\n- Do not send results externally.\\n- Do not schedule cron jobs without explicit user intent.\\n`,\n [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Data Analyst Tool Policy\\n\\n- Use read_file, list_dir, grep, and find to inspect datasets and notes.\\n- Use shell for reproducible analysis commands and scripts.\\n- Use write_file or edit_file for notebooks, scripts, cleaned data, and reports.\\n- Use web_fetch or web_search only when external data or documentation is needed.\\n- Do not use browser_use, send_message, send_media, or cronjob.\\n`,\n },\n },\n {\n id: 'creative',\n displayName: 'Creative',\n description: 'Visual direction, image prompts, design critique, and creative options.',\n emoji: '🎨',\n tools: { disable: ['shell', 'send_message', 'send_media', 'cronjob'] },\n profileFiles: {\n [WORKSPACE_FILES.IDENTITY]: identity({\n name: 'Creative',\n description: 'Visual direction, image prompts, design critique, and creative options.',\n creature: 'creative director',\n emoji: '🎨',\n }),\n [WORKSPACE_FILES.SOUL]: `# SOUL.md - Creative\\n\\nYou are a creative design agent. Explore visual directions, produce strong options, and explain design tradeoffs.\\n\\n## Workflow\\n\\n1. Identify audience, medium, constraints, and taste direction.\\n2. Offer distinct creative directions when the brief is open.\\n3. Explain why each direction works.\\n4. Respect accessibility, brand constraints, and production limits.\\n5. Iterate concretely from user feedback.\\n\\n## Boundaries\\n\\n- Do not run shell commands.\\n- Do not send creative work externally.\\n- Do not schedule cron jobs.\\n`,\n [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Creative Tool Policy\\n\\n- Use image_generate when the user wants visual options or assets.\\n- Use image to inspect user-provided images.\\n- Use web_search and web_fetch for references, style research, or current product visuals.\\n- Use write_file or edit_file to save prompts, design specs, or copy.\\n- Do not use shell, send_message, send_media, or cronjob.\\n`,\n },\n },\n];\n\nfunction hasAgentEntry(cfg: Config, agentId: string): boolean {\n const id = normalizeAgentId(agentId);\n return listAgentEntries(cfg).some((entry) => normalizeAgentId(entry.id) === id);\n}\n\nfunction writeFileIfMissing(path: string, content: string): void {\n if (!existsSync(path)) {\n writeFileSync(path, content, 'utf-8');\n }\n}\n\nexport function materializeStarterAgentFiles(cfg: Config): void {\n for (const starter of STARTER_AGENTS) {\n const profileDir = resolveAgentProfileDir(cfg, starter.id);\n const workspaceDir = resolveAgentWorkspaceDir(cfg, starter.id);\n mkdirSync(profileDir, { recursive: true });\n mkdirSync(workspaceDir, { recursive: true });\n for (const [name, content] of Object.entries(starter.profileFiles)) {\n writeFileIfMissing(join(profileDir, name), content);\n }\n }\n}\n\nexport function ensureStarterAgentsInitialized(cfg: Config): { config: Config; changed: boolean } {\n if ((cfg.agents?.starterAgentsInitializedVersion ?? 0) >= STARTER_AGENTS_INITIALIZED_VERSION) {\n return { config: cfg, changed: false };\n }\n\n let next = cfg;\n for (const starter of STARTER_AGENTS) {\n if (hasAgentEntry(next, starter.id)) continue;\n next = applyAgentConfig(next, {\n agentId: starter.id,\n ...(starter.tools ? { tools: starter.tools } : {}),\n });\n }\n\n next = {\n ...next,\n agents: {\n ...next.agents,\n starterAgentsInitializedVersion: STARTER_AGENTS_INITIALIZED_VERSION,\n },\n };\n\n materializeStarterAgentFiles(next);\n return { config: next, changed: next !== cfg };\n}\n"],"mappings":";;;;;;YAIqD;kBAM3B;AAE1B,MAAa,qCAAqC;AAWlD,SAAS,SAAS,QAAwF;AACxG,QAAO,4CAA4C,OAAO,KAAK,uBAAuB,OAAO,YAAY,wCAAwC,OAAO,SAAS,iBAAiB,OAAO,MAAM;;AAGjM,MAAa,iBAA0C;CACrD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,OAAO;EACP,cAAc;IACX,gBAAgB,WAAW,SAAS;IACnC,MAAM;IACN,aAAa;IACb,UAAU;IACV,OAAO;IACR,CAAC;IACD,gBAAgB,OAAO;IACvB,gBAAgB,QAAQ;GAC1B;EACF;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,OAAO;EACP,OAAO,EAAE,SAAS;GAAC;GAAkB;GAAgB;GAAc;GAAU,EAAE;EAC/E,cAAc;IACX,gBAAgB,WAAW,SAAS;IACnC,MAAM;IACN,aAAa;IACb,UAAU;IACV,OAAO;IACR,CAAC;IACD,gBAAgB,OAAO;IACvB,gBAAgB,QAAQ;GAC1B;EACF;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,OAAO;EACP,OAAO,EAAE,SAAS;GAAC;GAAS;GAAe;GAAgB;GAAc;GAAW;GAAa,EAAE;EACnG,cAAc;IACX,gBAAgB,WAAW,SAAS;IACnC,MAAM;IACN,aAAa;IACb,UAAU;IACV,OAAO;IACR,CAAC;IACD,gBAAgB,OAAO;IACvB,gBAAgB,QAAQ;GAC1B;EACF;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,OAAO;EACP,OAAO,EAAE,SAAS;GAAC;GAAS;GAAc;GAAa;GAAgB;GAAc;GAAU,EAAE;EACjG,cAAc;IACX,gBAAgB,WAAW,SAAS;IACnC,MAAM;IACN,aAAa;IACb,UAAU;IACV,OAAO;IACR,CAAC;IACD,gBAAgB,OAAO;IACvB,gBAAgB,QAAQ;GAC1B;EACF;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,OAAO;EACP,OAAO,EAAE,SAAS;GAAC;GAAe;GAAgB;GAAc;GAAU,EAAE;EAC5E,cAAc;IACX,gBAAgB,WAAW,SAAS;IACnC,MAAM;IACN,aAAa;IACb,UAAU;IACV,OAAO;IACR,CAAC;IACD,gBAAgB,OAAO;IACvB,gBAAgB,QAAQ;GAC1B;EACF;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,OAAO;EACP,OAAO,EAAE,SAAS;GAAC;GAAS;GAAgB;GAAc;GAAU,EAAE;EACtE,cAAc;IACX,gBAAgB,WAAW,SAAS;IACnC,MAAM;IACN,aAAa;IACb,UAAU;IACV,OAAO;IACR,CAAC;IACD,gBAAgB,OAAO;IACvB,gBAAgB,QAAQ;GAC1B;EACF;CACF;AAED,SAAS,cAAc,KAAa,SAA0B;CAC5D,MAAM,KAAK,iBAAiB,QAAQ;AACpC,QAAO,iBAAiB,IAAI,CAAC,MAAM,UAAU,iBAAiB,MAAM,GAAG,KAAK,GAAG;;AAGjF,SAAS,mBAAmB,MAAc,SAAuB;AAC/D,KAAI,CAAC,WAAW,KAAK,CACnB,eAAc,MAAM,SAAS,QAAQ;;AAIzC,SAAgB,6BAA6B,KAAmB;AAC9D,MAAK,MAAM,WAAW,gBAAgB;EACpC,MAAM,aAAa,uBAAuB,KAAK,QAAQ,GAAG;EAC1D,MAAM,eAAe,yBAAyB,KAAK,QAAQ,GAAG;AAC9D,YAAU,YAAY,EAAE,WAAW,MAAM,CAAC;AAC1C,YAAU,cAAc,EAAE,WAAW,MAAM,CAAC;AAC5C,OAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,QAAQ,aAAa,CAChE,oBAAmB,KAAK,YAAY,KAAK,EAAE,QAAQ;;;AAKzD,SAAgB,+BAA+B,KAAmD;AAChG,MAAK,IAAI,QAAQ,mCAAmC,MAAA,EAClD,QAAO;EAAE,QAAQ;EAAK,SAAS;EAAO;CAGxC,IAAI,OAAO;AACX,MAAK,MAAM,WAAW,gBAAgB;AACpC,MAAI,cAAc,MAAM,QAAQ,GAAG,CAAE;AACrC,SAAO,iBAAiB,MAAM;GAC5B,SAAS,QAAQ;GACjB,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,OAAO,GAAG,EAAE;GAClD,CAAC;;AAGJ,QAAO;EACL,GAAG;EACH,QAAQ;GACN,GAAG,KAAK;GACR,iCAAA;GACD;EACF;AAED,8BAA6B,KAAK;AAClC,QAAO;EAAE,QAAQ;EAAM,SAAS,SAAS;EAAK"}
@@ -3,8 +3,8 @@ import { init_logger } from "../../utils/logger.js";
3
3
  import { SHORT_TERM_PROMOTION_LOCK_RELATIVE, SHORT_TERM_RECALL_STORE_RELATIVE } from "../memory/dreaming/constants.js";
4
4
  import { loadDreamingStore, saveDreamingStore } from "../memory/dreaming/short-term-store.js";
5
5
  import { resolveDreamingConfig } from "../memory/dreaming/config.js";
6
- import fs from "node:fs/promises";
7
6
  import path from "node:path";
7
+ import fs from "node:fs/promises";
8
8
  import { Type } from "@sinclair/typebox";
9
9
  //#region src/agent/tools/dreaming-tool.ts
10
10
  init_logger();
@@ -1,6 +1,6 @@
1
+ import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
4
4
  import { createReadFileTool } from "./read.js";
5
5
  import { createWriteFileTool } from "./write.js";
6
6
  import { createEditFileTool } from "./edit.js";
@@ -4,9 +4,9 @@ import { isFailoverError } from "../failover-error.js";
4
4
  import { imageAssetFromDataUrl, imageFileExtensionForMimeType, mimeTypeFromFileName, parseImageDataUrl, sniffImageMimeType } from "../image/generation/image-assets.js";
5
5
  import { getImageGenerationProvider } from "../image/generation/provider-registry.js";
6
6
  import { generateImage, listImageGenerationProvidersSummary } from "../image/generation/runtime.js";
7
+ import path from "node:path";
7
8
  import { randomBytes } from "node:crypto";
8
9
  import { mkdir, readFile, writeFile } from "node:fs/promises";
9
- import path from "node:path";
10
10
  import { Type } from "@sinclair/typebox";
11
11
  //#region src/agent/tools/image-generate-tool.ts
12
12
  const DEFAULT_COUNT = 1;
@@ -1,7 +1,7 @@
1
1
  import { checkFileSafety } from "../prompt/safety.js";
2
2
  import { resolvePathUnderWorkspace } from "./tool-paths.js";
3
- import { readFile } from "fs/promises";
4
3
  import { basename } from "node:path";
4
+ import { readFile } from "fs/promises";
5
5
  import { Type } from "@sinclair/typebox";
6
6
  //#region src/agent/tools/send-media.ts
7
7
  const SendMediaSchema = Type.Object({
@@ -2,9 +2,9 @@ import { resolveStateDir } from "../../config/paths-state.js";
2
2
  import { init_paths } from "../../config/paths.js";
3
3
  import { createSkillConfigManager } from "../skills/config.js";
4
4
  import { applyPatchToContent, atomicWriteUtf8, effectiveAgentWritePolicy, ensureCategorySegment, isPathInsideDir, maxSkillMdChars, maxSupportFileBytes, mutatableSkillOrNull, resolveCreateSkillDir, scanSkillDirOrError, validateSkillMdContent, validateSkillNameSegment, validateSupportingRelativePath } from "../skills/skill-manage-ops.js";
5
- import { readFile, rm } from "fs/promises";
6
5
  import { join } from "path";
7
6
  import { existsSync, rmSync } from "fs";
7
+ import { readFile, rm } from "fs/promises";
8
8
  import { Type } from "@sinclair/typebox";
9
9
  //#region src/agent/tools/skill-manage-tool.ts
10
10
  init_paths();
@@ -1,6 +1,6 @@
1
+ import { extractProfileAgentId } from "../../config/agent-profile.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { extractProfileAgentId } from "../../config/agent-profile.js";
4
4
  import { parseWorkflowScript } from "../workflow/parser.js";
5
5
  import "../workflow/index.js";
6
6
  import { Type } from "@sinclair/typebox";
@@ -1,8 +1,8 @@
1
1
  import { checkFileSafety } from "../prompt/safety.js";
2
2
  import { isBareProfileMarkdownFileName, resolvePathUnderWorkspace, resolveProfileMarkdownPathIfBareName } from "./tool-paths.js";
3
3
  import { evaluateFilePolicy } from "../sandbox/exec-policy.js";
4
- import { mkdir, writeFile } from "fs/promises";
5
4
  import { dirname } from "path";
5
+ import { mkdir, writeFile } from "fs/promises";
6
6
  import { Type } from "@sinclair/typebox";
7
7
  //#region src/agent/tools/write.ts
8
8
  const MAX_FILE_SIZE = 10 * 1024 * 1024;
@@ -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 { existsSync, mkdirSync, readFileSync, readdirSync, statSync, unlinkSync, writeFileSync } from "node:fs";
5
4
  import { join } from "node:path";
5
+ import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, unlinkSync, writeFileSync } from "node:fs";
6
6
  //#region src/agent/workflow/catalog.ts
7
7
  /**
8
8
  * Catalog for named workflows.
@@ -3,9 +3,10 @@ import { BUILTIN_WORKFLOWS } from "./builtins/index.js";
3
3
  import { parseWorkflowScript } from "./parser.js";
4
4
  import { createWorkflowCatalog, defaultUserDir } from "./catalog.js";
5
5
  import { _resetLastWorkflowMemoryForTests, getLastWorkflowMemory } from "./last-run-memory.js";
6
- import { emptySnapshotFor, runWorkflow } from "./runtime.js";
6
+ import { emptySnapshotFor } from "./snapshot-empty.js";
7
7
  import { createWorkflowSnapshot, previewValue, recomputeCounts, renderWorkflowText } from "./snapshot.js";
8
8
  import { WorkflowProgressBroker, _resetWorkflowProgressBrokerForTests, getWorkflowProgressBroker } from "./progress-broker.js";
9
+ import { runWorkflow } from "./runtime.js";
9
10
  import { STRUCTURED_OUTPUT_TOOL_NAME, createStructuredOutputTool } from "./structured-output-tool.js";
10
11
  import { DelegateSubagentRunner } from "./subagent-runner.js";
11
12
  export { BUILTIN_WORKFLOWS, DelegateSubagentRunner, STRUCTURED_OUTPUT_TOOL_NAME, WorkflowProgressBroker, _resetLastWorkflowMemoryForTests, _resetWorkflowProgressBrokerForTests, applySubagentProgress, createStructuredOutputTool, createWorkflowCatalog, createWorkflowSnapshot, defaultUserDir, emptySnapshotFor, getLastWorkflowMemory, getWorkflowProgressBroker, parseWorkflowScript, previewValue, recomputeCounts, renderWorkflowText, runWorkflow };
@@ -24,11 +24,11 @@
24
24
  * means the workflow tool, tests, and any future runner share one runtime.
25
25
  */
26
26
  import type { Api, Model } from '@earendil-works/pi-ai';
27
- import type { SubagentRunner, WorkflowRunOptions, WorkflowRunResult, WorkflowSnapshot } from './types.js';
27
+ import type { SubagentRunner, WorkflowRunOptions, WorkflowRunResult } from './types.js';
28
28
  export interface RunWorkflowDeps {
29
29
  runner: SubagentRunner;
30
30
  /** Resolve a model ref (`provider/model` or configured typed id) to a {@link Model}. Throws on unknown ref. */
31
31
  resolveModelId?: (modelId: string) => Model<Api>;
32
32
  }
33
33
  export declare function runWorkflow<T = unknown>(script: string, deps: RunWorkflowDeps, options: WorkflowRunOptions): Promise<WorkflowRunResult<T>>;
34
- export declare function emptySnapshotFor(name: string, description?: string, phaseTitles?: string[]): WorkflowSnapshot;
34
+ export { emptySnapshotFor } from './snapshot-empty.js';
@@ -1,4 +1,5 @@
1
1
  import { parseWorkflowScript } from "./parser.js";
2
+ import { emptySnapshotFor } from "./snapshot-empty.js";
2
3
  import { availableParallelism } from "node:os";
3
4
  import { Script, createContext } from "node:vm";
4
5
  //#region src/agent/workflow/runtime.ts
@@ -61,21 +62,24 @@ async function runWorkflow(script, deps, options) {
61
62
  remaining: () => options.tokenBudget == null ? Number.POSITIVE_INFINITY : Math.max(0, options.tokenBudget - state.spent)
62
63
  });
63
64
  const throwIfAborted = () => {
64
- if (options.signal?.aborted) throw new Error("workflow aborted");
65
+ if (!options.signal?.aborted) return;
66
+ const reason = options.signal.reason;
67
+ if (reason instanceof Error) throw reason;
68
+ if (reason) throw new Error(String(reason));
69
+ throw new Error("workflow aborted");
65
70
  };
66
- const resolveAgentModel = (normalized, assignedPhase) => {
67
- const realId = normalized.model?.trim();
68
- if (realId) {
71
+ const resolveAgentModelSelection = (normalized, assignedPhase) => {
72
+ const modelRef = normalized.model?.trim() || (assignedPhase ? phaseDefaultModels.get(assignedPhase) : void 0);
73
+ if (modelRef) {
69
74
  if (!deps.resolveModelId) throw new Error("workflow runtime missing resolveModelId; cannot resolve real model id");
70
- return deps.resolveModelId(realId);
71
- }
72
- if (assignedPhase) {
73
- const phaseRef = phaseDefaultModels.get(assignedPhase);
74
- if (phaseRef) {
75
- if (!deps.resolveModelId) return void 0;
76
- return deps.resolveModelId(phaseRef);
77
- }
75
+ const model = deps.resolveModelId(modelRef);
76
+ return {
77
+ modelRef,
78
+ resolvedModelRef: modelToRef(model),
79
+ model
80
+ };
78
81
  }
82
+ return {};
79
83
  };
80
84
  const agent = async (prompt, agentOptions = {}) => {
81
85
  throwIfAborted();
@@ -85,14 +89,23 @@ async function runWorkflow(script, deps, options) {
85
89
  const normalized = normalizeAgentOptions(agentOptions);
86
90
  const assignedPhase = normalized.phase ?? state.currentPhase;
87
91
  const requestedLabel = normalized.label?.trim();
92
+ const modelSelection = resolveAgentModelSelection(normalized, assignedPhase);
88
93
  state.agentCount += 1;
89
94
  const id = state.agentCount;
90
95
  const label = requestedLabel || defaultAgentLabel(assignedPhase, id);
96
+ const invocation = buildInvocationSnapshot({
97
+ prompt: taskPrompt,
98
+ label,
99
+ phase: assignedPhase,
100
+ normalized,
101
+ modelSelection
102
+ });
91
103
  options.onAgentQueued?.({
92
104
  id,
93
105
  label,
94
106
  phase: assignedPhase,
95
- prompt: taskPrompt
107
+ prompt: taskPrompt,
108
+ invocation
96
109
  });
97
110
  const runPromise = limiter(async () => {
98
111
  options.onAgentStart?.({
@@ -103,7 +116,6 @@ async function runWorkflow(script, deps, options) {
103
116
  });
104
117
  try {
105
118
  throwIfAborted();
106
- const resolvedModel = resolveAgentModel(normalized, assignedPhase);
107
119
  const enhanced = options.enhanceSubagentRun?.({
108
120
  id,
109
121
  label,
@@ -117,7 +129,7 @@ async function runWorkflow(script, deps, options) {
117
129
  maxIterations: normalized.maxIterations,
118
130
  phase: assignedPhase,
119
131
  signal: options.signal,
120
- model: resolvedModel,
132
+ model: modelSelection.model,
121
133
  ...enhanced
122
134
  });
123
135
  throwIfAborted();
@@ -236,20 +248,6 @@ async function runWorkflow(script, deps, options) {
236
248
  durationMs: Date.now() - started
237
249
  };
238
250
  }
239
- function emptySnapshotFor(name, description, phaseTitles) {
240
- return {
241
- name,
242
- description,
243
- phases: phaseTitles ? [...phaseTitles] : [],
244
- logs: [],
245
- agents: [],
246
- agentCount: 0,
247
- runningCount: 0,
248
- doneCount: 0,
249
- errorCount: 0,
250
- skippedCount: 0
251
- };
252
- }
253
251
  function clampConcurrency(requested) {
254
252
  if (typeof requested === "number" && Number.isFinite(requested) && requested >= 1) return Math.min(Math.floor(requested), DEFAULT_CONCURRENCY_CEILING);
255
253
  let cpu = DEFAULT_CONCURRENCY_CEILING;
@@ -312,6 +310,29 @@ function normalizeAgentOptions(value) {
312
310
  maxIterations
313
311
  };
314
312
  }
313
+ function buildInvocationSnapshot(params) {
314
+ return compactObject({
315
+ prompt: params.prompt,
316
+ label: params.label,
317
+ phase: params.phase,
318
+ modelRef: params.modelSelection.modelRef,
319
+ resolvedModelRef: params.modelSelection.resolvedModelRef,
320
+ schema: cloneJsonValue(params.normalized.schema),
321
+ toolset: params.normalized.toolset ? [...params.normalized.toolset] : void 0,
322
+ maxIterations: params.normalized.maxIterations
323
+ });
324
+ }
325
+ function modelToRef(model) {
326
+ return `${model.provider}/${model.id}`;
327
+ }
328
+ function cloneJsonValue(value) {
329
+ if (value === void 0) return void 0;
330
+ return structuredClone(value);
331
+ }
332
+ function compactObject(value) {
333
+ for (const key of Object.keys(value)) if (value[key] === void 0) delete value[key];
334
+ return value;
335
+ }
315
336
  function assertStructuredCloneable(value, name) {
316
337
  try {
317
338
  structuredClone(value);