@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
@@ -15,6 +15,8 @@ export interface WorkflowDefinition {
15
15
  title: string;
16
16
  description: string;
17
17
  version: string;
18
+ contentHash?: string;
19
+ runtimeHash?: string;
18
20
  inputSchema?: JsonSchema;
19
21
  outputSchema?: JsonSchema;
20
22
  phases: WorkflowPhaseDefinition[];
@@ -1,5 +1,5 @@
1
1
  import type { WorkflowArtifactRef, WorkflowResultEnvelope } from './result.js';
2
- import type { WorkflowRun, WorkflowRunError } from './run.js';
2
+ import type { WorkflowAgentInvocationSnapshot, WorkflowRun, WorkflowRunError } from './run.js';
3
3
  export type WorkflowEventType = 'run_queued' | 'run_started' | 'phase_started' | 'phase_completed' | 'agent_queued' | 'agent_started' | 'agent_step_started' | 'agent_step_completed' | 'agent_completed' | 'log_appended' | 'artifact_created' | 'run_completed' | 'run_failed' | 'run_cancelled';
4
4
  export interface WorkflowEventEnvelope<T = WorkflowEventPayload> {
5
5
  id: string;
@@ -29,6 +29,7 @@ export interface AgentQueuedPayload {
29
29
  phaseId?: string;
30
30
  prompt?: string;
31
31
  sessionKey: string;
32
+ invocation?: WorkflowAgentInvocationSnapshot;
32
33
  }
33
34
  export interface AgentStartedPayload {
34
35
  agentId: string;
@@ -5,3 +5,4 @@ export * from './result.js';
5
5
  export * from './run.js';
6
6
  export * from './command.js';
7
7
  export * from './validation.js';
8
+ export * from './schema-validation.js';
@@ -1,4 +1,5 @@
1
- import { DEFAULT_WORKFLOW_CONCURRENCY, DEFAULT_WORKFLOW_MAX_SUBAGENTS, DEFAULT_WORKFLOW_TIMEOUT_SEC, buildWorkflowDefinition, normalizeWorkflowDefinitionId, toWorkflowDefinitionTitle } from "./definition-utils.js";
1
+ import { DEFAULT_WORKFLOW_CONCURRENCY, DEFAULT_WORKFLOW_MAX_SUBAGENTS, DEFAULT_WORKFLOW_TIMEOUT_SEC, buildWorkflowDefinition, hashWorkflowStableValue, normalizeWorkflowDefinitionId, toWorkflowDefinitionTitle } from "./definition-utils.js";
2
2
  import { isTerminalWorkflowRunStatus } from "./run.js";
3
3
  import { validateWorkflowDefinitionInput } from "./validation.js";
4
- export { DEFAULT_WORKFLOW_CONCURRENCY, DEFAULT_WORKFLOW_MAX_SUBAGENTS, DEFAULT_WORKFLOW_TIMEOUT_SEC, buildWorkflowDefinition, isTerminalWorkflowRunStatus, normalizeWorkflowDefinitionId, toWorkflowDefinitionTitle, validateWorkflowDefinitionInput };
4
+ import { validateWorkflowJsonSchema } from "./schema-validation.js";
5
+ export { DEFAULT_WORKFLOW_CONCURRENCY, DEFAULT_WORKFLOW_MAX_SUBAGENTS, DEFAULT_WORKFLOW_TIMEOUT_SEC, buildWorkflowDefinition, hashWorkflowStableValue, isTerminalWorkflowRunStatus, normalizeWorkflowDefinitionId, toWorkflowDefinitionTitle, validateWorkflowDefinitionInput, validateWorkflowJsonSchema };
@@ -1,4 +1,4 @@
1
- import type { WorkflowDefinitionEstimatedAgents } from './definition.js';
1
+ import type { WorkflowDefinitionDefaults, WorkflowDefinitionEstimatedAgents, WorkflowPermissionPolicy, WorkflowResourceRefs } from './definition.js';
2
2
  import type { WorkflowArtifactRef, WorkflowResultEnvelope } from './result.js';
3
3
  export type WorkflowRunStatus = 'queued' | 'running' | 'succeeded' | 'failed' | 'cancelled' | 'timeout';
4
4
  export declare function isTerminalWorkflowRunStatus(status: WorkflowRunStatus): boolean;
@@ -24,12 +24,22 @@ export interface WorkflowRunMetadata {
24
24
  triggerSource: WorkflowRunSource['kind'];
25
25
  agentId?: string;
26
26
  retryOfRunId?: string;
27
+ replay?: WorkflowRunReplayMetadata;
27
28
  definition: WorkflowRunDefinitionSnapshot;
28
29
  input?: WorkflowRunInputEnvelope;
29
30
  correlation?: WorkflowRunCorrelation;
30
31
  origin?: WorkflowRunOrigin;
31
32
  schedule?: WorkflowRunScheduleMetadata;
32
33
  }
34
+ export type WorkflowRunReplayScope = 'failed_agents' | 'failed_phases';
35
+ export interface WorkflowRunReplayMetadata {
36
+ sourceRunId: string;
37
+ scope: WorkflowRunReplayScope;
38
+ phaseIds?: string[];
39
+ agentIds: string[];
40
+ targetCount: number;
41
+ createdAtMs: number;
42
+ }
33
43
  export interface WorkflowRunInputEnvelope {
34
44
  payload: unknown;
35
45
  goal?: string;
@@ -61,9 +71,14 @@ export interface WorkflowRunDefinitionSnapshot {
61
71
  name: string;
62
72
  title: string;
63
73
  version: string;
74
+ contentHash?: string;
75
+ runtimeHash?: string;
64
76
  source: 'builtin' | 'user';
65
77
  tags: string[];
66
78
  phaseCount: number;
79
+ defaults?: WorkflowDefinitionDefaults;
80
+ permissions?: WorkflowPermissionPolicy;
81
+ resources?: WorkflowResourceRefs;
67
82
  estimatedAgents?: WorkflowDefinitionEstimatedAgents;
68
83
  }
69
84
  export type WorkflowRunSource = {
@@ -147,6 +162,7 @@ export interface WorkflowAgentView {
147
162
  phaseId?: string;
148
163
  status: WorkflowAgentStatus;
149
164
  prompt?: string;
165
+ invocation?: WorkflowAgentInvocationSnapshot;
150
166
  sessionKey: string;
151
167
  transcriptMessageCount: number;
152
168
  currentStep?: string;
@@ -156,6 +172,16 @@ export interface WorkflowAgentView {
156
172
  completedAtMs?: number;
157
173
  steps: WorkflowAgentStepView[];
158
174
  }
175
+ export interface WorkflowAgentInvocationSnapshot {
176
+ prompt: string;
177
+ label: string;
178
+ phase?: string;
179
+ modelRef?: string;
180
+ resolvedModelRef?: string;
181
+ schema?: unknown;
182
+ toolset?: string[];
183
+ maxIterations?: number;
184
+ }
159
185
  export type WorkflowAgentStepStatus = 'running' | 'done' | 'error';
160
186
  export interface WorkflowAgentStepView {
161
187
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","names":[],"sources":["../../../../src/workflows/domain/run.ts"],"sourcesContent":["import type { WorkflowDefinitionEstimatedAgents } from './definition.js';\nimport type { WorkflowArtifactRef, WorkflowResultEnvelope } from './result.js';\n\nexport type WorkflowRunStatus =\n | 'queued'\n | 'running'\n | 'succeeded'\n | 'failed'\n | 'cancelled'\n | 'timeout';\n\nconst TERMINAL_WORKFLOW_RUN_STATUSES = new Set<WorkflowRunStatus>([\n 'succeeded',\n 'failed',\n 'cancelled',\n 'timeout',\n]);\n\nexport function isTerminalWorkflowRunStatus(status: WorkflowRunStatus): boolean {\n return TERMINAL_WORKFLOW_RUN_STATUSES.has(status);\n}\n\nexport interface WorkflowRun {\n id: string;\n definitionId: string;\n definitionVersion: string;\n title: string;\n goal: string;\n input: unknown;\n status: WorkflowRunStatus;\n source: WorkflowRunSource;\n metadata?: WorkflowRunMetadata;\n result?: WorkflowResultEnvelope;\n error?: WorkflowRunError;\n metrics: WorkflowRunMetrics;\n createdAtMs: number;\n startedAtMs?: number;\n completedAtMs?: number;\n}\n\nexport interface WorkflowRunMetadata {\n sessionKey: string;\n triggerSource: WorkflowRunSource['kind'];\n agentId?: string;\n retryOfRunId?: string;\n definition: WorkflowRunDefinitionSnapshot;\n input?: WorkflowRunInputEnvelope;\n correlation?: WorkflowRunCorrelation;\n origin?: WorkflowRunOrigin;\n schedule?: WorkflowRunScheduleMetadata;\n}\n\nexport interface WorkflowRunInputEnvelope {\n payload: unknown;\n goal?: string;\n variables?: Record<string, unknown>;\n context?: Record<string, unknown>;\n}\n\nexport interface WorkflowRunCorrelation {\n idempotencyKey?: string;\n requestId?: string;\n traceId?: string;\n parentRunId?: string;\n}\n\nexport interface WorkflowRunOrigin {\n channel: string;\n sessionKey?: string;\n chatId?: string;\n messageId?: string;\n scheduleId?: string;\n fireId?: string;\n requestId?: string;\n}\n\nexport interface WorkflowRunScheduleMetadata {\n scheduleId: string;\n fireId?: string;\n scheduledAtMs?: number;\n}\n\nexport interface WorkflowRunDefinitionSnapshot {\n id: string;\n name: string;\n title: string;\n version: string;\n source: 'builtin' | 'user';\n tags: string[];\n phaseCount: number;\n estimatedAgents?: WorkflowDefinitionEstimatedAgents;\n}\n\nexport type WorkflowRunSource =\n | { kind: 'chat'; sessionKey: string; messageId?: string }\n | { kind: 'webui'; sessionKey?: string; requestId?: string }\n | { kind: 'cron'; scheduleId: string; fireId?: string; scheduledAtMs?: number }\n | { kind: 'api'; requestId?: string; idempotencyKey?: string }\n | { kind: 'im'; channel: string; chatId: string; messageId?: string; userId?: string };\n\nexport interface WorkflowRunMetrics {\n agentCount: number;\n doneAgentCount: number;\n errorAgentCount: number;\n skippedAgentCount: number;\n artifactCount: number;\n durationMs?: number;\n}\n\nexport interface WorkflowRunError {\n code: WorkflowRunErrorCode;\n message: string;\n detail?: string;\n recoverable: boolean;\n}\n\nexport type WorkflowRunErrorCode =\n | 'definition_not_found'\n | 'invalid_input'\n | 'runtime_error'\n | 'timeout'\n | 'cancelled'\n | 'result_validation_failed'\n | 'agent_quota_exceeded';\n\nexport interface WorkflowRunControls {\n canCancel: boolean;\n canRetry: boolean;\n canArchive: boolean;\n}\n\nexport interface WorkflowRunSummary {\n id: string;\n definitionId: string;\n title: string;\n status: WorkflowRunStatus;\n source: WorkflowRunSource;\n metadata?: WorkflowRunMetadata;\n createdAtMs: number;\n startedAtMs?: number;\n completedAtMs?: number;\n metrics: WorkflowRunMetrics;\n}\n\nexport interface WorkflowRunView {\n run: WorkflowRun;\n phases: WorkflowPhaseView[];\n agents: WorkflowAgentView[];\n logs: WorkflowLogEntry[];\n artifacts: WorkflowArtifactRef[];\n timeline: WorkflowTimelineItem[];\n controls: WorkflowRunControls;\n}\n\nexport type WorkflowPhaseStatus = 'pending' | 'running' | 'completed' | 'failed';\n\nexport interface WorkflowPhaseView {\n id: string;\n title: string;\n status: WorkflowPhaseStatus;\n startedAtMs?: number;\n completedAtMs?: number;\n agentIds: string[];\n}\n\nexport type WorkflowAgentStatus = 'queued' | 'running' | 'done' | 'error' | 'skipped';\n\nexport interface WorkflowAgentView {\n id: string;\n label: string;\n phaseId?: string;\n status: WorkflowAgentStatus;\n prompt?: string;\n sessionKey: string;\n transcriptMessageCount: number;\n currentStep?: string;\n resultPreview?: string;\n error?: string;\n startedAtMs?: number;\n completedAtMs?: number;\n steps: WorkflowAgentStepView[];\n}\n\nexport type WorkflowAgentStepStatus = 'running' | 'done' | 'error';\n\nexport interface WorkflowAgentStepView {\n id: string;\n label: string;\n kind: 'tool' | 'llm' | 'thinking';\n toolName?: string;\n detail?: string;\n status: WorkflowAgentStepStatus;\n resultPreview?: string;\n error?: string;\n startedAtMs?: number;\n completedAtMs?: number;\n}\n\nexport interface WorkflowLogEntry {\n sequence: number;\n message: string;\n createdAtMs: number;\n}\n\nexport interface WorkflowTimelineItem {\n sequence: number;\n type: string;\n title: string;\n createdAtMs: number;\n}\n"],"mappings":";AAWA,MAAM,iCAAiC,IAAI,IAAuB;CAChE;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,4BAA4B,QAAoC;AAC9E,QAAO,+BAA+B,IAAI,OAAO"}
1
+ {"version":3,"file":"run.js","names":[],"sources":["../../../../src/workflows/domain/run.ts"],"sourcesContent":["import type { WorkflowDefinitionDefaults, WorkflowDefinitionEstimatedAgents, WorkflowPermissionPolicy, WorkflowResourceRefs } from './definition.js';\nimport type { WorkflowArtifactRef, WorkflowResultEnvelope } from './result.js';\n\nexport type WorkflowRunStatus =\n | 'queued'\n | 'running'\n | 'succeeded'\n | 'failed'\n | 'cancelled'\n | 'timeout';\n\nconst TERMINAL_WORKFLOW_RUN_STATUSES = new Set<WorkflowRunStatus>([\n 'succeeded',\n 'failed',\n 'cancelled',\n 'timeout',\n]);\n\nexport function isTerminalWorkflowRunStatus(status: WorkflowRunStatus): boolean {\n return TERMINAL_WORKFLOW_RUN_STATUSES.has(status);\n}\n\nexport interface WorkflowRun {\n id: string;\n definitionId: string;\n definitionVersion: string;\n title: string;\n goal: string;\n input: unknown;\n status: WorkflowRunStatus;\n source: WorkflowRunSource;\n metadata?: WorkflowRunMetadata;\n result?: WorkflowResultEnvelope;\n error?: WorkflowRunError;\n metrics: WorkflowRunMetrics;\n createdAtMs: number;\n startedAtMs?: number;\n completedAtMs?: number;\n}\n\nexport interface WorkflowRunMetadata {\n sessionKey: string;\n triggerSource: WorkflowRunSource['kind'];\n agentId?: string;\n retryOfRunId?: string;\n replay?: WorkflowRunReplayMetadata;\n definition: WorkflowRunDefinitionSnapshot;\n input?: WorkflowRunInputEnvelope;\n correlation?: WorkflowRunCorrelation;\n origin?: WorkflowRunOrigin;\n schedule?: WorkflowRunScheduleMetadata;\n}\n\nexport type WorkflowRunReplayScope = 'failed_agents' | 'failed_phases';\n\nexport interface WorkflowRunReplayMetadata {\n sourceRunId: string;\n scope: WorkflowRunReplayScope;\n phaseIds?: string[];\n agentIds: string[];\n targetCount: number;\n createdAtMs: number;\n}\n\nexport interface WorkflowRunInputEnvelope {\n payload: unknown;\n goal?: string;\n variables?: Record<string, unknown>;\n context?: Record<string, unknown>;\n}\n\nexport interface WorkflowRunCorrelation {\n idempotencyKey?: string;\n requestId?: string;\n traceId?: string;\n parentRunId?: string;\n}\n\nexport interface WorkflowRunOrigin {\n channel: string;\n sessionKey?: string;\n chatId?: string;\n messageId?: string;\n scheduleId?: string;\n fireId?: string;\n requestId?: string;\n}\n\nexport interface WorkflowRunScheduleMetadata {\n scheduleId: string;\n fireId?: string;\n scheduledAtMs?: number;\n}\n\nexport interface WorkflowRunDefinitionSnapshot {\n id: string;\n name: string;\n title: string;\n version: string;\n contentHash?: string;\n runtimeHash?: string;\n source: 'builtin' | 'user';\n tags: string[];\n phaseCount: number;\n defaults?: WorkflowDefinitionDefaults;\n permissions?: WorkflowPermissionPolicy;\n resources?: WorkflowResourceRefs;\n estimatedAgents?: WorkflowDefinitionEstimatedAgents;\n}\n\nexport type WorkflowRunSource =\n | { kind: 'chat'; sessionKey: string; messageId?: string }\n | { kind: 'webui'; sessionKey?: string; requestId?: string }\n | { kind: 'cron'; scheduleId: string; fireId?: string; scheduledAtMs?: number }\n | { kind: 'api'; requestId?: string; idempotencyKey?: string }\n | { kind: 'im'; channel: string; chatId: string; messageId?: string; userId?: string };\n\nexport interface WorkflowRunMetrics {\n agentCount: number;\n doneAgentCount: number;\n errorAgentCount: number;\n skippedAgentCount: number;\n artifactCount: number;\n durationMs?: number;\n}\n\nexport interface WorkflowRunError {\n code: WorkflowRunErrorCode;\n message: string;\n detail?: string;\n recoverable: boolean;\n}\n\nexport type WorkflowRunErrorCode =\n | 'definition_not_found'\n | 'invalid_input'\n | 'runtime_error'\n | 'timeout'\n | 'cancelled'\n | 'result_validation_failed'\n | 'agent_quota_exceeded';\n\nexport interface WorkflowRunControls {\n canCancel: boolean;\n canRetry: boolean;\n canArchive: boolean;\n}\n\nexport interface WorkflowRunSummary {\n id: string;\n definitionId: string;\n title: string;\n status: WorkflowRunStatus;\n source: WorkflowRunSource;\n metadata?: WorkflowRunMetadata;\n createdAtMs: number;\n startedAtMs?: number;\n completedAtMs?: number;\n metrics: WorkflowRunMetrics;\n}\n\nexport interface WorkflowRunView {\n run: WorkflowRun;\n phases: WorkflowPhaseView[];\n agents: WorkflowAgentView[];\n logs: WorkflowLogEntry[];\n artifacts: WorkflowArtifactRef[];\n timeline: WorkflowTimelineItem[];\n controls: WorkflowRunControls;\n}\n\nexport type WorkflowPhaseStatus = 'pending' | 'running' | 'completed' | 'failed';\n\nexport interface WorkflowPhaseView {\n id: string;\n title: string;\n status: WorkflowPhaseStatus;\n startedAtMs?: number;\n completedAtMs?: number;\n agentIds: string[];\n}\n\nexport type WorkflowAgentStatus = 'queued' | 'running' | 'done' | 'error' | 'skipped';\n\nexport interface WorkflowAgentView {\n id: string;\n label: string;\n phaseId?: string;\n status: WorkflowAgentStatus;\n prompt?: string;\n invocation?: WorkflowAgentInvocationSnapshot;\n sessionKey: string;\n transcriptMessageCount: number;\n currentStep?: string;\n resultPreview?: string;\n error?: string;\n startedAtMs?: number;\n completedAtMs?: number;\n steps: WorkflowAgentStepView[];\n}\n\nexport interface WorkflowAgentInvocationSnapshot {\n prompt: string;\n label: string;\n phase?: string;\n modelRef?: string;\n resolvedModelRef?: string;\n schema?: unknown;\n toolset?: string[];\n maxIterations?: number;\n}\n\nexport type WorkflowAgentStepStatus = 'running' | 'done' | 'error';\n\nexport interface WorkflowAgentStepView {\n id: string;\n label: string;\n kind: 'tool' | 'llm' | 'thinking';\n toolName?: string;\n detail?: string;\n status: WorkflowAgentStepStatus;\n resultPreview?: string;\n error?: string;\n startedAtMs?: number;\n completedAtMs?: number;\n}\n\nexport interface WorkflowLogEntry {\n sequence: number;\n message: string;\n createdAtMs: number;\n}\n\nexport interface WorkflowTimelineItem {\n sequence: number;\n type: string;\n title: string;\n createdAtMs: number;\n}\n"],"mappings":";AAWA,MAAM,iCAAiC,IAAI,IAAuB;CAChE;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,4BAA4B,QAAoC;AAC9E,QAAO,+BAA+B,IAAI,OAAO"}
@@ -0,0 +1,8 @@
1
+ import { type ErrorObject } from 'ajv';
2
+ import type { JsonSchema } from './definition.js';
3
+ export interface WorkflowSchemaValidationResult {
4
+ ok: boolean;
5
+ message?: string;
6
+ errors?: ErrorObject[];
7
+ }
8
+ export declare function validateWorkflowJsonSchema(schema: JsonSchema | undefined, value: unknown): WorkflowSchemaValidationResult;
@@ -0,0 +1,28 @@
1
+ import Ajv from "ajv";
2
+ //#region src/workflows/domain/schema-validation.ts
3
+ const ajv = new Ajv({
4
+ allErrors: true,
5
+ strict: false
6
+ });
7
+ function validateWorkflowJsonSchema(schema, value) {
8
+ if (!schema) return { ok: true };
9
+ let validate;
10
+ try {
11
+ validate = ajv.compile(schema);
12
+ } catch (err) {
13
+ return {
14
+ ok: false,
15
+ message: `Invalid workflow schema: ${err instanceof Error ? err.message : String(err)}`
16
+ };
17
+ }
18
+ if (validate(value)) return { ok: true };
19
+ return {
20
+ ok: false,
21
+ message: ajv.errorsText(validate.errors, { separator: "; " }),
22
+ errors: validate.errors ?? void 0
23
+ };
24
+ }
25
+ //#endregion
26
+ export { validateWorkflowJsonSchema };
27
+
28
+ //# sourceMappingURL=schema-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validation.js","names":[],"sources":["../../../../src/workflows/domain/schema-validation.ts"],"sourcesContent":["import Ajv, { type ErrorObject } from 'ajv';\n\nimport type { JsonSchema } from './definition.js';\n\nconst ajv = new Ajv({ allErrors: true, strict: false });\n\nexport interface WorkflowSchemaValidationResult {\n ok: boolean;\n message?: string;\n errors?: ErrorObject[];\n}\n\nexport function validateWorkflowJsonSchema(\n schema: JsonSchema | undefined,\n value: unknown,\n): WorkflowSchemaValidationResult {\n if (!schema) {\n return { ok: true };\n }\n\n let validate: ReturnType<typeof ajv.compile>;\n try {\n validate = ajv.compile(schema);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { ok: false, message: `Invalid workflow schema: ${message}` };\n }\n\n if (validate(value)) {\n return { ok: true };\n }\n\n return {\n ok: false,\n message: ajv.errorsText(validate.errors, { separator: '; ' }),\n errors: validate.errors ?? undefined,\n };\n}\n"],"mappings":";;AAIA,MAAM,MAAM,IAAI,IAAI;CAAE,WAAW;CAAM,QAAQ;CAAO,CAAC;AAQvD,SAAgB,2BACd,QACA,OACgC;AAChC,KAAI,CAAC,OACH,QAAO,EAAE,IAAI,MAAM;CAGrB,IAAI;AACJ,KAAI;AACF,aAAW,IAAI,QAAQ,OAAO;UACvB,KAAK;AAEZ,SAAO;GAAE,IAAI;GAAO,SAAS,4BADb,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;GACI;;AAGtE,KAAI,SAAS,MAAM,CACjB,QAAO,EAAE,IAAI,MAAM;AAGrB,QAAO;EACL,IAAI;EACJ,SAAS,IAAI,WAAW,SAAS,QAAQ,EAAE,WAAW,MAAM,CAAC;EAC7D,QAAQ,SAAS,UAAU,KAAA;EAC5B"}
@@ -0,0 +1,3 @@
1
+ export * from './workflow-draft-service.js';
2
+ export * from './workflow-draft.types.js';
3
+ export * from './workflow-draft-validator.js';
@@ -0,0 +1,3 @@
1
+ import { buildWorkflowDraftResponse, lintWorkflowDraft, parseGeneratedWorkflowDraft } from "./workflow-draft-validator.js";
2
+ import { WorkflowDraftService, resolveDraftModelRef } from "./workflow-draft-service.js";
3
+ export { WorkflowDraftService, buildWorkflowDraftResponse, lintWorkflowDraft, parseGeneratedWorkflowDraft, resolveDraftModelRef };
@@ -0,0 +1,23 @@
1
+ import type { WorkflowDraftConstraints, WorkflowDraftMode } from './workflow-draft.types.js';
2
+ export interface WorkflowDraftRepairIssue {
3
+ source: 'parse' | 'validation' | 'lint';
4
+ severity: 'error' | 'warning';
5
+ code: string;
6
+ message: string;
7
+ line?: number;
8
+ column?: number;
9
+ }
10
+ export declare function buildWorkflowDraftPrompt(params: {
11
+ prompt: string;
12
+ language?: 'en' | 'zh';
13
+ mode: WorkflowDraftMode;
14
+ existingScript?: string;
15
+ constraints?: WorkflowDraftConstraints;
16
+ }): string;
17
+ export declare function buildWorkflowDraftRepairPrompt(params: {
18
+ prompt: string;
19
+ language?: 'en' | 'zh';
20
+ constraints?: WorkflowDraftConstraints;
21
+ previousOutput: string;
22
+ issues: WorkflowDraftRepairIssue[];
23
+ }): string;
@@ -0,0 +1,98 @@
1
+ //#region src/workflows/draft/workflow-draft-prompt.ts
2
+ function buildWorkflowDraftPrompt(params) {
3
+ return `You generate xopc workflow drafts. Return ONLY a JSON object, no markdown.
4
+
5
+ JSON shape:
6
+ {
7
+ "name": "lowercase_snake_case",
8
+ "script": "workflow JavaScript DSL",
9
+ "manifest": {
10
+ "title": "Human title",
11
+ "description": "What it does",
12
+ "version": "1.0.0",
13
+ "inputSchema": { "type": "object", "properties": {}, "required": [] },
14
+ "outputSchema": { "type": "object", "properties": { "summary": { "type": "string" } }, "required": ["summary"] },
15
+ "defaults": { "concurrency": 2, "timeoutSec": 1800, "maxSubagents": 8 },
16
+ "permissions": { "network": false, "fileSystem": "read", "approvalRequired": false },
17
+ "tags": ["custom"],
18
+ "whenToUse": "When to use this workflow"
19
+ },
20
+ "explanation": "Short explanation",
21
+ "assumptions": ["..."],
22
+ "risks": ["..."]
23
+ }
24
+
25
+ DSL rules:
26
+ - script MUST start with: export const meta = { name, description, phases, tags, estimatedAgents }
27
+ - The top-level JSON "name" MUST exactly equal script meta.name.
28
+ - Use only these globals: phase(title), agent(prompt, opts), parallel([() => agent(...)]), pipeline(items, ...stages), log(message), budget, args.
29
+ - Read user inputs from args, e.g. args.goal, args.branch, args.audience.
30
+ - Each agent needs a clear label.
31
+ - Keep concurrency conservative; prefer 2-4.
32
+ - Return a WorkflowResultEnvelope-like object: { summary, sections, followUps?, structuredOutput? }.
33
+ - Do not use import, require, eval, Function, process.env, fs, http, fetch.
34
+ - If network/write/destructive behavior is requested, mark manifest.permissions.approvalRequired = true.
35
+ - Keep script self-contained and valid JavaScript.
36
+
37
+ Mode: ${params.mode}
38
+ Language for user-facing copy: ${params.language ?? "en"}
39
+ Constraints:
40
+ ${JSON.stringify(params.constraints ?? {}, null, 2)}
41
+
42
+ ${params.existingScript ? `Existing script to improve:\n${params.existingScript.slice(0, 12e3)}\n` : ""}
43
+
44
+ User request:
45
+ ${params.prompt.slice(0, 8e3)}
46
+ `;
47
+ }
48
+ function buildWorkflowDraftRepairPrompt(params) {
49
+ return `You must repair an xopc workflow draft so it passes validation. Return ONLY a corrected JSON object, no markdown.
50
+
51
+ Required JSON shape is unchanged:
52
+ {
53
+ "name": "lowercase_snake_case",
54
+ "script": "workflow JavaScript DSL",
55
+ "manifest": {
56
+ "title": "Human title",
57
+ "description": "What it does",
58
+ "version": "1.0.0",
59
+ "inputSchema": { "type": "object", "properties": {}, "required": [] },
60
+ "outputSchema": { "type": "object", "properties": { "summary": { "type": "string" } }, "required": ["summary"] },
61
+ "defaults": { "concurrency": 2, "timeoutSec": 1800, "maxSubagents": 8 },
62
+ "permissions": { "network": false, "fileSystem": "read", "approvalRequired": false },
63
+ "tags": ["custom"],
64
+ "whenToUse": "When to use this workflow"
65
+ },
66
+ "explanation": "Short explanation",
67
+ "assumptions": ["..."],
68
+ "risks": ["..."]
69
+ }
70
+
71
+ Hard requirements:
72
+ - The output MUST be valid JSON.
73
+ - JSON name MUST be lowercase snake_case and MUST exactly equal script meta.name.
74
+ - script MUST be valid JavaScript for the xopc workflow DSL.
75
+ - script MUST start with export const meta = { ... } and include phases, tags, estimatedAgents.
76
+ - Use only these globals: phase(title), agent(prompt, opts), parallel([() => agent(...)]), pipeline(items, ...stages), log(message), budget, args.
77
+ - Do not use import, require, eval, Function, process.env, fs, http, fetch.
78
+ - Respect the constraints exactly. If network is disabled, manifest.permissions.network must be false.
79
+ - Preserve the user's intent while making the smallest change needed to pass validation.
80
+
81
+ Language for user-facing copy: ${params.language ?? "en"}
82
+ Constraints:
83
+ ${JSON.stringify(params.constraints ?? {}, null, 2)}
84
+
85
+ Validation and lint issues to fix:
86
+ ${JSON.stringify(params.issues, null, 2)}
87
+
88
+ Original user request:
89
+ ${params.prompt.slice(0, 8e3)}
90
+
91
+ Previous model output:
92
+ ${params.previousOutput.slice(0, 12e3)}
93
+ `;
94
+ }
95
+ //#endregion
96
+ export { buildWorkflowDraftPrompt, buildWorkflowDraftRepairPrompt };
97
+
98
+ //# sourceMappingURL=workflow-draft-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-draft-prompt.js","names":[],"sources":["../../../../src/workflows/draft/workflow-draft-prompt.ts"],"sourcesContent":["import type { WorkflowDraftConstraints, WorkflowDraftMode } from './workflow-draft.types.js';\n\nexport interface WorkflowDraftRepairIssue {\n source: 'parse' | 'validation' | 'lint';\n severity: 'error' | 'warning';\n code: string;\n message: string;\n line?: number;\n column?: number;\n}\n\nexport function buildWorkflowDraftPrompt(params: {\n prompt: string;\n language?: 'en' | 'zh';\n mode: WorkflowDraftMode;\n existingScript?: string;\n constraints?: WorkflowDraftConstraints;\n}): string {\n return `You generate xopc workflow drafts. Return ONLY a JSON object, no markdown.\n\nJSON shape:\n{\n \"name\": \"lowercase_snake_case\",\n \"script\": \"workflow JavaScript DSL\",\n \"manifest\": {\n \"title\": \"Human title\",\n \"description\": \"What it does\",\n \"version\": \"1.0.0\",\n \"inputSchema\": { \"type\": \"object\", \"properties\": {}, \"required\": [] },\n \"outputSchema\": { \"type\": \"object\", \"properties\": { \"summary\": { \"type\": \"string\" } }, \"required\": [\"summary\"] },\n \"defaults\": { \"concurrency\": 2, \"timeoutSec\": 1800, \"maxSubagents\": 8 },\n \"permissions\": { \"network\": false, \"fileSystem\": \"read\", \"approvalRequired\": false },\n \"tags\": [\"custom\"],\n \"whenToUse\": \"When to use this workflow\"\n },\n \"explanation\": \"Short explanation\",\n \"assumptions\": [\"...\"],\n \"risks\": [\"...\"]\n}\n\nDSL rules:\n- script MUST start with: export const meta = { name, description, phases, tags, estimatedAgents }\n- The top-level JSON \"name\" MUST exactly equal script meta.name.\n- Use only these globals: phase(title), agent(prompt, opts), parallel([() => agent(...)]), pipeline(items, ...stages), log(message), budget, args.\n- Read user inputs from args, e.g. args.goal, args.branch, args.audience.\n- Each agent needs a clear label.\n- Keep concurrency conservative; prefer 2-4.\n- Return a WorkflowResultEnvelope-like object: { summary, sections, followUps?, structuredOutput? }.\n- Do not use import, require, eval, Function, process.env, fs, http, fetch.\n- If network/write/destructive behavior is requested, mark manifest.permissions.approvalRequired = true.\n- Keep script self-contained and valid JavaScript.\n\nMode: ${params.mode}\nLanguage for user-facing copy: ${params.language ?? 'en'}\nConstraints:\n${JSON.stringify(params.constraints ?? {}, null, 2)}\n\n${params.existingScript ? `Existing script to improve:\\n${params.existingScript.slice(0, 12000)}\\n` : ''}\n\nUser request:\n${params.prompt.slice(0, 8000)}\n`;\n}\n\nexport function buildWorkflowDraftRepairPrompt(params: {\n prompt: string;\n language?: 'en' | 'zh';\n constraints?: WorkflowDraftConstraints;\n previousOutput: string;\n issues: WorkflowDraftRepairIssue[];\n}): string {\n return `You must repair an xopc workflow draft so it passes validation. Return ONLY a corrected JSON object, no markdown.\n\nRequired JSON shape is unchanged:\n{\n \"name\": \"lowercase_snake_case\",\n \"script\": \"workflow JavaScript DSL\",\n \"manifest\": {\n \"title\": \"Human title\",\n \"description\": \"What it does\",\n \"version\": \"1.0.0\",\n \"inputSchema\": { \"type\": \"object\", \"properties\": {}, \"required\": [] },\n \"outputSchema\": { \"type\": \"object\", \"properties\": { \"summary\": { \"type\": \"string\" } }, \"required\": [\"summary\"] },\n \"defaults\": { \"concurrency\": 2, \"timeoutSec\": 1800, \"maxSubagents\": 8 },\n \"permissions\": { \"network\": false, \"fileSystem\": \"read\", \"approvalRequired\": false },\n \"tags\": [\"custom\"],\n \"whenToUse\": \"When to use this workflow\"\n },\n \"explanation\": \"Short explanation\",\n \"assumptions\": [\"...\"],\n \"risks\": [\"...\"]\n}\n\nHard requirements:\n- The output MUST be valid JSON.\n- JSON name MUST be lowercase snake_case and MUST exactly equal script meta.name.\n- script MUST be valid JavaScript for the xopc workflow DSL.\n- script MUST start with export const meta = { ... } and include phases, tags, estimatedAgents.\n- Use only these globals: phase(title), agent(prompt, opts), parallel([() => agent(...)]), pipeline(items, ...stages), log(message), budget, args.\n- Do not use import, require, eval, Function, process.env, fs, http, fetch.\n- Respect the constraints exactly. If network is disabled, manifest.permissions.network must be false.\n- Preserve the user's intent while making the smallest change needed to pass validation.\n\nLanguage for user-facing copy: ${params.language ?? 'en'}\nConstraints:\n${JSON.stringify(params.constraints ?? {}, null, 2)}\n\nValidation and lint issues to fix:\n${JSON.stringify(params.issues, null, 2)}\n\nOriginal user request:\n${params.prompt.slice(0, 8000)}\n\nPrevious model output:\n${params.previousOutput.slice(0, 12000)}\n`;\n}\n"],"mappings":";AAWA,SAAgB,yBAAyB,QAM9B;AACT,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAkCD,OAAO,KAAK;iCACa,OAAO,YAAY,KAAK;;EAEvD,KAAK,UAAU,OAAO,eAAe,EAAE,EAAE,MAAM,EAAE,CAAC;;EAElD,OAAO,iBAAiB,gCAAgC,OAAO,eAAe,MAAM,GAAG,KAAM,CAAC,MAAM,GAAG;;;EAGvG,OAAO,OAAO,MAAM,GAAG,IAAK,CAAC;;;AAI/B,SAAgB,+BAA+B,QAMpC;AACT,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAgCwB,OAAO,YAAY,KAAK;;EAEvD,KAAK,UAAU,OAAO,eAAe,EAAE,EAAE,MAAM,EAAE,CAAC;;;EAGlD,KAAK,UAAU,OAAO,QAAQ,MAAM,EAAE,CAAC;;;EAGvC,OAAO,OAAO,MAAM,GAAG,IAAK,CAAC;;;EAG7B,OAAO,eAAe,MAAM,GAAG,KAAM,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Config } from '../../config/schema.js';
2
+ import type { CreateWorkflowDraftRequest, WorkflowDraftResponse } from './workflow-draft.types.js';
3
+ export interface WorkflowDraftServiceOptions {
4
+ config: Config;
5
+ maxRepairAttempts?: number;
6
+ }
7
+ export declare class WorkflowDraftService {
8
+ private readonly options;
9
+ constructor(options: WorkflowDraftServiceOptions);
10
+ createDraft(request: CreateWorkflowDraftRequest, signal?: AbortSignal): Promise<WorkflowDraftResponse>;
11
+ }
12
+ export declare function resolveDraftModelRef(config: Config, agentId: string): string;
@@ -0,0 +1,131 @@
1
+ import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
2
+ import { createLogger } from "../../utils/logger/index.js";
3
+ import { init_logger } from "../../utils/logger.js";
4
+ import { getDefaultModelSync, init_providers, resolveModel } from "../../providers/index.js";
5
+ import { resolveModelRef } from "../../config/agent-typed-models.js";
6
+ import { buildWorkflowDraftPrompt, buildWorkflowDraftRepairPrompt } from "./workflow-draft-prompt.js";
7
+ import { buildWorkflowDraftResponse, parseGeneratedWorkflowDraft } from "./workflow-draft-validator.js";
8
+ import { complete } from "@earendil-works/pi-ai";
9
+ //#region src/workflows/draft/workflow-draft-service.ts
10
+ init_schema();
11
+ init_providers();
12
+ init_logger();
13
+ const log = createLogger("WorkflowDraft");
14
+ const DEFAULT_MAX_REPAIR_ATTEMPTS = 2;
15
+ var WorkflowDraftService = class {
16
+ constructor(options) {
17
+ this.options = options;
18
+ }
19
+ async createDraft(request, signal) {
20
+ const prompt = request.prompt.trim();
21
+ if (!prompt) throw new Error("prompt is required");
22
+ const modelRef = resolveDraftModelRef(this.options.config, request.agentId);
23
+ const model = resolveModel(modelRef);
24
+ const maxRepairAttempts = this.options.maxRepairAttempts ?? DEFAULT_MAX_REPAIR_ATTEMPTS;
25
+ let messageContent = buildWorkflowDraftPrompt({
26
+ prompt,
27
+ language: request.language,
28
+ mode: request.mode ?? (request.existingScript ? "improve" : "create"),
29
+ existingScript: request.existingScript,
30
+ constraints: request.constraints
31
+ });
32
+ let lastIssues = [];
33
+ let lastText = "";
34
+ for (let attempt = 0; attempt <= maxRepairAttempts; attempt += 1) {
35
+ lastText = extractText(await complete(model, { messages: [{
36
+ role: "user",
37
+ content: messageContent,
38
+ timestamp: Date.now()
39
+ }] }, {
40
+ maxTokens: 4096,
41
+ temperature: attempt === 0 ? .25 : .1,
42
+ signal
43
+ }));
44
+ try {
45
+ const response = buildWorkflowDraftResponse(parseGeneratedWorkflowDraft(lastText), request.constraints);
46
+ const blockingIssues = getBlockingDraftIssues(response);
47
+ if (blockingIssues.length === 0) return {
48
+ ...response,
49
+ repairAttempts: attempt
50
+ };
51
+ lastIssues = blockingIssues;
52
+ } catch (err) {
53
+ lastIssues = [{
54
+ source: "parse",
55
+ severity: "error",
56
+ code: "invalid_model_output",
57
+ message: err instanceof Error ? err.message : String(err)
58
+ }];
59
+ }
60
+ if (attempt >= maxRepairAttempts) break;
61
+ log.warn({
62
+ modelRef,
63
+ attempt: attempt + 1,
64
+ issueCount: lastIssues.length,
65
+ preview: lastText.slice(0, 500)
66
+ }, "Workflow draft validation failed; asking model to repair");
67
+ messageContent = buildWorkflowDraftRepairPrompt({
68
+ prompt,
69
+ language: request.language,
70
+ constraints: request.constraints,
71
+ previousOutput: lastText,
72
+ issues: lastIssues
73
+ });
74
+ }
75
+ const message = `Unable to generate a valid workflow draft after ${maxRepairAttempts + 1} attempts: ${formatRepairIssues(lastIssues)}`;
76
+ log.warn({
77
+ modelRef,
78
+ issues: lastIssues,
79
+ preview: lastText.slice(0, 500)
80
+ }, message);
81
+ throw new Error(message);
82
+ }
83
+ };
84
+ function resolveDraftModelRef(config, agentId) {
85
+ try {
86
+ return resolveModelRef(config, agentId, "large");
87
+ } catch {
88
+ return getAgentDefaultModelRef(config) ?? getDefaultModelSync(config);
89
+ }
90
+ }
91
+ function extractText(result) {
92
+ const content = result.content;
93
+ if (typeof content === "string") return content;
94
+ if (Array.isArray(content)) return content.map((item) => {
95
+ if (item && typeof item === "object" && item.type === "text") return String(item.text ?? "");
96
+ return "";
97
+ }).join("");
98
+ return "";
99
+ }
100
+ function getBlockingDraftIssues(response) {
101
+ const validationIssues = [...response.validation.errors.map((issue) => ({
102
+ source: "validation",
103
+ severity: "error",
104
+ code: issue.code,
105
+ message: issue.message,
106
+ line: issue.line,
107
+ column: issue.column
108
+ })), ...response.validation.warnings.map((issue) => ({
109
+ source: "validation",
110
+ severity: "warning",
111
+ code: issue.code,
112
+ message: issue.message,
113
+ line: issue.line,
114
+ column: issue.column
115
+ }))];
116
+ const lintIssues = response.lint.filter((issue) => issue.severity === "error").map((issue) => ({
117
+ source: "lint",
118
+ severity: issue.severity,
119
+ code: issue.code,
120
+ message: issue.message
121
+ }));
122
+ return [...validationIssues, ...lintIssues];
123
+ }
124
+ function formatRepairIssues(issues) {
125
+ if (issues.length === 0) return "unknown validation failure";
126
+ return issues.slice(0, 5).map((issue) => `${issue.source}:${issue.code}: ${issue.message}`).join("; ");
127
+ }
128
+ //#endregion
129
+ export { WorkflowDraftService, resolveDraftModelRef };
130
+
131
+ //# sourceMappingURL=workflow-draft-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-draft-service.js","names":[],"sources":["../../../../src/workflows/draft/workflow-draft-service.ts"],"sourcesContent":["import { complete, type UserMessage } from '@earendil-works/pi-ai';\n\nimport { resolveModelRef } from '../../config/agent-typed-models.js';\nimport { getAgentDefaultModelRef } from '../../config/schema.js';\nimport type { Config } from '../../config/schema.js';\nimport { getDefaultModelSync, resolveModel } from '../../providers/index.js';\nimport { createLogger } from '../../utils/logger.js';\n\nimport {\n buildWorkflowDraftPrompt,\n buildWorkflowDraftRepairPrompt,\n type WorkflowDraftRepairIssue,\n} from './workflow-draft-prompt.js';\nimport type { CreateWorkflowDraftRequest, WorkflowDraftResponse } from './workflow-draft.types.js';\nimport { buildWorkflowDraftResponse, parseGeneratedWorkflowDraft } from './workflow-draft-validator.js';\n\nconst log = createLogger('WorkflowDraft');\nconst DEFAULT_MAX_REPAIR_ATTEMPTS = 2;\n\nexport interface WorkflowDraftServiceOptions {\n config: Config;\n maxRepairAttempts?: number;\n}\n\nexport class WorkflowDraftService {\n constructor(private readonly options: WorkflowDraftServiceOptions) {}\n\n async createDraft(request: CreateWorkflowDraftRequest, signal?: AbortSignal): Promise<WorkflowDraftResponse> {\n const prompt = request.prompt.trim();\n if (!prompt) throw new Error('prompt is required');\n const modelRef = resolveDraftModelRef(this.options.config, request.agentId);\n const model = resolveModel(modelRef);\n const maxRepairAttempts = this.options.maxRepairAttempts ?? DEFAULT_MAX_REPAIR_ATTEMPTS;\n let messageContent = buildWorkflowDraftPrompt({\n prompt,\n language: request.language,\n mode: request.mode ?? (request.existingScript ? 'improve' : 'create'),\n existingScript: request.existingScript,\n constraints: request.constraints,\n });\n let lastIssues: WorkflowDraftRepairIssue[] = [];\n let lastText = '';\n\n for (let attempt = 0; attempt <= maxRepairAttempts; attempt += 1) {\n const userMsg: UserMessage = {\n role: 'user',\n content: messageContent,\n timestamp: Date.now(),\n };\n const result = await complete(\n model,\n { messages: [userMsg] },\n { maxTokens: 4096, temperature: attempt === 0 ? 0.25 : 0.1, signal: signal as AbortSignal },\n );\n lastText = extractText(result);\n try {\n const draft = parseGeneratedWorkflowDraft(lastText);\n const response = buildWorkflowDraftResponse(draft, request.constraints);\n const blockingIssues = getBlockingDraftIssues(response);\n if (blockingIssues.length === 0) {\n return { ...response, repairAttempts: attempt };\n }\n lastIssues = blockingIssues;\n } catch (err) {\n lastIssues = [{\n source: 'parse',\n severity: 'error',\n code: 'invalid_model_output',\n message: err instanceof Error ? err.message : String(err),\n }];\n }\n\n if (attempt >= maxRepairAttempts) break;\n log.warn(\n { modelRef, attempt: attempt + 1, issueCount: lastIssues.length, preview: lastText.slice(0, 500) },\n 'Workflow draft validation failed; asking model to repair',\n );\n messageContent = buildWorkflowDraftRepairPrompt({\n prompt,\n language: request.language,\n constraints: request.constraints,\n previousOutput: lastText,\n issues: lastIssues,\n });\n }\n\n const message = `Unable to generate a valid workflow draft after ${maxRepairAttempts + 1} attempts: ${formatRepairIssues(lastIssues)}`;\n log.warn({ modelRef, issues: lastIssues, preview: lastText.slice(0, 500) }, message);\n throw new Error(message);\n }\n}\n\nexport function resolveDraftModelRef(config: Config, agentId: string): string {\n try {\n return resolveModelRef(config, agentId, 'large');\n } catch {\n return getAgentDefaultModelRef(config) ?? getDefaultModelSync(config);\n }\n}\n\nfunction extractText(result: unknown): string {\n const content = (result as { content?: unknown }).content;\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content.map((item) => {\n if (item && typeof item === 'object' && (item as { type?: string }).type === 'text') {\n return String((item as { text?: string }).text ?? '');\n }\n return '';\n }).join('');\n }\n return '';\n}\n\nfunction getBlockingDraftIssues(response: WorkflowDraftResponse): WorkflowDraftRepairIssue[] {\n const validationIssues: WorkflowDraftRepairIssue[] = [\n ...response.validation.errors.map((issue) => ({\n source: 'validation' as const,\n severity: 'error' as const,\n code: issue.code,\n message: issue.message,\n line: issue.line,\n column: issue.column,\n })),\n ...response.validation.warnings.map((issue) => ({\n source: 'validation' as const,\n severity: 'warning' as const,\n code: issue.code,\n message: issue.message,\n line: issue.line,\n column: issue.column,\n })),\n ];\n const lintIssues = response.lint\n .filter((issue) => issue.severity === 'error')\n .map((issue) => ({\n source: 'lint' as const,\n severity: issue.severity,\n code: issue.code,\n message: issue.message,\n }));\n return [...validationIssues, ...lintIssues];\n}\n\nfunction formatRepairIssues(issues: WorkflowDraftRepairIssue[]): string {\n if (issues.length === 0) return 'unknown validation failure';\n return issues.slice(0, 5).map((issue) => `${issue.source}:${issue.code}: ${issue.message}`).join('; ');\n}\n"],"mappings":";;;;;;;;;aAGiE;gBAEY;aACxB;AAUrD,MAAM,MAAM,aAAa,gBAAgB;AACzC,MAAM,8BAA8B;AAOpC,IAAa,uBAAb,MAAkC;CAChC,YAAY,SAAuD;AAAtC,OAAA,UAAA;;CAE7B,MAAM,YAAY,SAAqC,QAAsD;EAC3G,MAAM,SAAS,QAAQ,OAAO,MAAM;AACpC,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,qBAAqB;EAClD,MAAM,WAAW,qBAAqB,KAAK,QAAQ,QAAQ,QAAQ,QAAQ;EAC3E,MAAM,QAAQ,aAAa,SAAS;EACpC,MAAM,oBAAoB,KAAK,QAAQ,qBAAqB;EAC5D,IAAI,iBAAiB,yBAAyB;GAC5C;GACA,UAAU,QAAQ;GAClB,MAAM,QAAQ,SAAS,QAAQ,iBAAiB,YAAY;GAC5D,gBAAgB,QAAQ;GACxB,aAAa,QAAQ;GACtB,CAAC;EACF,IAAI,aAAyC,EAAE;EAC/C,IAAI,WAAW;AAEf,OAAK,IAAI,UAAU,GAAG,WAAW,mBAAmB,WAAW,GAAG;AAWhE,cAAW,YAAY,MALF,SACnB,OACA,EAAE,UAAU,CAAC;IANb,MAAM;IACN,SAAS;IACT,WAAW,KAAK,KAAK;IAID,CAAC,EAAE,EACvB;IAAE,WAAW;IAAM,aAAa,YAAY,IAAI,MAAO;IAAa;IAAuB,CAC5F,CAC6B;AAC9B,OAAI;IAEF,MAAM,WAAW,2BADH,4BAA4B,SACO,EAAE,QAAQ,YAAY;IACvE,MAAM,iBAAiB,uBAAuB,SAAS;AACvD,QAAI,eAAe,WAAW,EAC5B,QAAO;KAAE,GAAG;KAAU,gBAAgB;KAAS;AAEjD,iBAAa;YACN,KAAK;AACZ,iBAAa,CAAC;KACZ,QAAQ;KACR,UAAU;KACV,MAAM;KACN,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;KAC1D,CAAC;;AAGJ,OAAI,WAAW,kBAAmB;AAClC,OAAI,KACF;IAAE;IAAU,SAAS,UAAU;IAAG,YAAY,WAAW;IAAQ,SAAS,SAAS,MAAM,GAAG,IAAI;IAAE,EAClG,2DACD;AACD,oBAAiB,+BAA+B;IAC9C;IACA,UAAU,QAAQ;IAClB,aAAa,QAAQ;IACrB,gBAAgB;IAChB,QAAQ;IACT,CAAC;;EAGJ,MAAM,UAAU,mDAAmD,oBAAoB,EAAE,aAAa,mBAAmB,WAAW;AACpI,MAAI,KAAK;GAAE;GAAU,QAAQ;GAAY,SAAS,SAAS,MAAM,GAAG,IAAI;GAAE,EAAE,QAAQ;AACpF,QAAM,IAAI,MAAM,QAAQ;;;AAI5B,SAAgB,qBAAqB,QAAgB,SAAyB;AAC5E,KAAI;AACF,SAAO,gBAAgB,QAAQ,SAAS,QAAQ;SAC1C;AACN,SAAO,wBAAwB,OAAO,IAAI,oBAAoB,OAAO;;;AAIzE,SAAS,YAAY,QAAyB;CAC5C,MAAM,UAAW,OAAiC;AAClD,KAAI,OAAO,YAAY,SAAU,QAAO;AACxC,KAAI,MAAM,QAAQ,QAAQ,CACxB,QAAO,QAAQ,KAAK,SAAS;AAC3B,MAAI,QAAQ,OAAO,SAAS,YAAa,KAA2B,SAAS,OAC3E,QAAO,OAAQ,KAA2B,QAAQ,GAAG;AAEvD,SAAO;GACP,CAAC,KAAK,GAAG;AAEb,QAAO;;AAGT,SAAS,uBAAuB,UAA6D;CAC3F,MAAM,mBAA+C,CACnD,GAAG,SAAS,WAAW,OAAO,KAAK,WAAW;EAC5C,QAAQ;EACR,UAAU;EACV,MAAM,MAAM;EACZ,SAAS,MAAM;EACf,MAAM,MAAM;EACZ,QAAQ,MAAM;EACf,EAAE,EACH,GAAG,SAAS,WAAW,SAAS,KAAK,WAAW;EAC9C,QAAQ;EACR,UAAU;EACV,MAAM,MAAM;EACZ,SAAS,MAAM;EACf,MAAM,MAAM;EACZ,QAAQ,MAAM;EACf,EAAE,CACJ;CACD,MAAM,aAAa,SAAS,KACzB,QAAQ,UAAU,MAAM,aAAa,QAAQ,CAC7C,KAAK,WAAW;EACf,QAAQ;EACR,UAAU,MAAM;EAChB,MAAM,MAAM;EACZ,SAAS,MAAM;EAChB,EAAE;AACL,QAAO,CAAC,GAAG,kBAAkB,GAAG,WAAW;;AAG7C,SAAS,mBAAmB,QAA4C;AACtE,KAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAO,OAAO,MAAM,GAAG,EAAE,CAAC,KAAK,UAAU,GAAG,MAAM,OAAO,GAAG,MAAM,KAAK,IAAI,MAAM,UAAU,CAAC,KAAK,KAAK"}
@@ -0,0 +1,4 @@
1
+ import type { GeneratedWorkflowDraft, WorkflowDraftConstraints, WorkflowDraftLintIssue, WorkflowDraftResponse } from './workflow-draft.types.js';
2
+ export declare function parseGeneratedWorkflowDraft(raw: string): GeneratedWorkflowDraft;
3
+ export declare function buildWorkflowDraftResponse(draft: GeneratedWorkflowDraft, constraints?: WorkflowDraftConstraints): WorkflowDraftResponse;
4
+ export declare function lintWorkflowDraft(draft: GeneratedWorkflowDraft, constraints?: WorkflowDraftConstraints): WorkflowDraftLintIssue[];
@@ -0,0 +1,133 @@
1
+ import { validateWorkflowDefinitionInput } from "../domain/validation.js";
2
+ import { randomUUID } from "node:crypto";
3
+ //#region src/workflows/draft/workflow-draft-validator.ts
4
+ function parseGeneratedWorkflowDraft(raw) {
5
+ const json = extractJsonObject(raw);
6
+ const parsed = JSON.parse(json);
7
+ return {
8
+ name: normalizeWorkflowName(String(parsed.name ?? "custom_workflow")),
9
+ script: String(parsed.script ?? "").trim(),
10
+ manifest: normalizeManifest(parsed.manifest),
11
+ explanation: String(parsed.explanation ?? ""),
12
+ assumptions: stringArray(parsed.assumptions),
13
+ risks: stringArray(parsed.risks)
14
+ };
15
+ }
16
+ function buildWorkflowDraftResponse(draft, constraints) {
17
+ const validation = validateWorkflowDefinitionInput({
18
+ name: draft.name,
19
+ script: draft.script
20
+ });
21
+ const lint = lintWorkflowDraft(draft, constraints);
22
+ return {
23
+ draftId: randomUUID(),
24
+ repairAttempts: 0,
25
+ ...draft,
26
+ permissionsSummary: summarizePermissions(draft.manifest),
27
+ validation,
28
+ lint,
29
+ suggestedInputs: suggestedInputsFromManifest(draft.manifest)
30
+ };
31
+ }
32
+ function lintWorkflowDraft(draft, constraints) {
33
+ const issues = [];
34
+ const { manifest, script } = draft;
35
+ if (!manifest.inputSchema) issues.push({
36
+ severity: "warning",
37
+ code: "missing_input_schema",
38
+ message: "Draft does not define an input schema."
39
+ });
40
+ if (!manifest.outputSchema) issues.push({
41
+ severity: "warning",
42
+ code: "missing_output_schema",
43
+ message: "Draft does not define an output schema."
44
+ });
45
+ if (manifest.permissions?.network && constraints?.allowNetwork === false) issues.push({
46
+ severity: "error",
47
+ code: "unsafe_permission",
48
+ message: "Draft requests network access, but network is disabled by constraints."
49
+ });
50
+ if (manifest.permissions?.fileSystem === "write" && constraints?.fileSystem !== "write") issues.push({
51
+ severity: "warning",
52
+ code: "unsafe_permission",
53
+ message: "Draft requests filesystem write access."
54
+ });
55
+ const phaseCount = (script.match(/\bphase\s*\(/g) ?? []).length;
56
+ if (constraints?.maxPhases && phaseCount > constraints.maxPhases) issues.push({
57
+ severity: "warning",
58
+ code: "too_many_agents",
59
+ message: `Draft has ${phaseCount} phases, above requested ${constraints.maxPhases}.`
60
+ });
61
+ const agentCount = (script.match(/\bagent\s*\(/g) ?? []).length;
62
+ if (constraints?.maxSubagents && agentCount > constraints.maxSubagents) issues.push({
63
+ severity: "warning",
64
+ code: "too_many_agents",
65
+ message: `Draft starts ${agentCount} agents, above requested ${constraints.maxSubagents}.`
66
+ });
67
+ if (/parallel\s*\([^[]/.test(script)) issues.push({
68
+ severity: "warning",
69
+ code: "unbounded_parallelism",
70
+ message: "parallel() should receive a bounded array of thunks."
71
+ });
72
+ if (constraints?.allowedTools?.length) {
73
+ const unknown = collectToolsetNames(script).filter((tool) => !constraints.allowedTools.includes(tool));
74
+ for (const tool of [...new Set(unknown)]) issues.push({
75
+ severity: "warning",
76
+ code: "unknown_tool",
77
+ message: `Tool '${tool}' is outside the requested allowlist.`
78
+ });
79
+ }
80
+ return issues;
81
+ }
82
+ function extractJsonObject(raw) {
83
+ const trimmed = raw.trim();
84
+ if (trimmed.startsWith("{") && trimmed.endsWith("}")) return trimmed;
85
+ const fenced = trimmed.match(/```(?:json)?\s*([\s\S]*?)```/i)?.[1]?.trim();
86
+ if (fenced?.startsWith("{")) return fenced;
87
+ const start = trimmed.indexOf("{");
88
+ const end = trimmed.lastIndexOf("}");
89
+ if (start >= 0 && end > start) return trimmed.slice(start, end + 1);
90
+ throw new Error("Model did not return a JSON object.");
91
+ }
92
+ function normalizeManifest(value) {
93
+ if (!value || typeof value !== "object" || Array.isArray(value)) return {};
94
+ return value;
95
+ }
96
+ function stringArray(value) {
97
+ return Array.isArray(value) ? value.map((item) => String(item)).filter(Boolean) : [];
98
+ }
99
+ function normalizeWorkflowName(value) {
100
+ const normalized = value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "");
101
+ return /^[a-z]/.test(normalized) ? normalized : `workflow_${normalized || "draft"}`;
102
+ }
103
+ function summarizePermissions(manifest) {
104
+ const permissions = manifest.permissions;
105
+ if (!permissions) return ["No explicit permissions requested."];
106
+ const out = [];
107
+ if (permissions.tools?.length) out.push(`Tools: ${permissions.tools.join(", ")}`);
108
+ if (permissions.network != null) out.push(`Network: ${permissions.network ? "enabled" : "disabled"}`);
109
+ if (permissions.fileSystem) out.push(`Filesystem: ${permissions.fileSystem}`);
110
+ if (permissions.approvalRequired) out.push("Approval required");
111
+ return out.length > 0 ? out : ["No explicit permissions requested."];
112
+ }
113
+ function suggestedInputsFromManifest(manifest) {
114
+ const properties = manifest.inputSchema?.properties;
115
+ if (!properties) return void 0;
116
+ return Object.entries(properties).slice(0, 8).map(([key, schema]) => ({
117
+ key,
118
+ label: typeof schema.title === "string" ? schema.title : key,
119
+ example: typeof schema.default === "string" ? schema.default : schema.description ?? ""
120
+ }));
121
+ }
122
+ function collectToolsetNames(script) {
123
+ const out = [];
124
+ for (const match of script.matchAll(/toolset\s*:\s*\[([^\]]*)\]/g)) {
125
+ const body = match[1] ?? "";
126
+ for (const item of body.matchAll(/['"]([^'"]+)['"]/g)) out.push(item[1] ?? "");
127
+ }
128
+ return out.filter(Boolean);
129
+ }
130
+ //#endregion
131
+ export { buildWorkflowDraftResponse, lintWorkflowDraft, parseGeneratedWorkflowDraft };
132
+
133
+ //# sourceMappingURL=workflow-draft-validator.js.map