@xopcai/xopc 0.0.124 → 0.0.125

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 (304) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/Combination-BzaXOLd9.js +41 -0
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-B5uSVAyJ.js → agent-avatar-dicebear-BKDKICZV.js} +1 -1
  5. package/dist/gateway/static/root/assets/agents-BnTB7-c5.js +2 -0
  6. package/dist/gateway/static/root/assets/app-management-settings-panel-DI4BqHKW.js +1 -0
  7. package/dist/gateway/static/root/assets/appearance-settings-6_ie3NQ4.js +1 -0
  8. package/dist/gateway/static/root/assets/apps-page-B6bG65SW.js +1 -0
  9. package/dist/gateway/static/root/assets/{archive-plugin-CXUGRp2i.js → archive-plugin-kUHEJ1HK.js} +1 -1
  10. package/dist/gateway/static/root/assets/{attachment-load-Cmiub3Wg.js → attachment-load-Dm-9prpU.js} +1 -1
  11. package/dist/gateway/static/root/assets/automation-suggestion-card-OTxQTPnC.js +1 -0
  12. package/dist/gateway/static/root/assets/automations-page-1lVbo0dS.js +1 -0
  13. package/dist/gateway/static/root/assets/{binary-plugins-0Izz-N3p.js → binary-plugins-DllA_jQ0.js} +1 -1
  14. package/dist/gateway/static/root/assets/{block-editor-C1Kv0IkJ.js → block-editor-Cm6CWNj1.js} +6 -6
  15. package/dist/gateway/static/root/assets/browser-settings-page-CzDBlOK0.js +8 -0
  16. package/dist/gateway/static/root/assets/capability-presets-api-VJ89b6I2.js +1 -0
  17. package/dist/gateway/static/root/assets/capability-presets-settings-panel-BaPj8wC2.js +1 -0
  18. package/dist/gateway/static/root/assets/{channel-recipient-api-BeA2aVor.js → channel-recipient-api-B5PwBEUx.js} +1 -1
  19. package/dist/gateway/static/root/assets/channels-settings-Df4m7p1k.js +1 -0
  20. package/dist/gateway/static/root/assets/code-editor-gbRgS14t.js +1 -0
  21. package/dist/gateway/static/root/assets/connectors-page-BMTphmHS.js +2 -0
  22. package/dist/gateway/static/root/assets/{directory-picker-path-field-2rjzUu57.js → directory-picker-path-field-DySMzOF6.js} +1 -1
  23. package/dist/gateway/static/root/assets/dist-By6Rh2ee.js +1 -0
  24. package/dist/gateway/static/root/assets/dist-CkobR7mk.js +1 -0
  25. package/dist/gateway/static/root/assets/dist-DokQNVMQ.js +1 -0
  26. package/dist/gateway/static/root/assets/dreaming-settings-D_AjSnV_.js +3 -0
  27. package/dist/gateway/static/root/assets/extension-debug-page-BaM0FpW7.js +1 -0
  28. package/dist/gateway/static/root/assets/extension-page-DuZWVOGA.js +1 -0
  29. package/dist/gateway/static/root/assets/extension-settings-page-DarVtbmJ.js +1 -0
  30. package/dist/gateway/static/root/assets/{fetch-BU5S0Sn7.js → fetch-NFKfkqrd.js} +1 -1
  31. package/dist/gateway/static/root/assets/{gateway-config-api-BIPGwrl1.js → gateway-config-api-CFEm9rgy.js} +1 -1
  32. package/dist/gateway/static/root/assets/gateway-settings-BMk2S5td.js +1 -0
  33. package/dist/gateway/static/root/assets/{gateway-startup-retry-Cd0Zz30N.js → gateway-startup-retry-Dtwh_yGg.js} +1 -1
  34. package/dist/gateway/static/root/assets/goal-create-dialog-BKP7ylcG.js +1 -0
  35. package/dist/gateway/static/root/assets/goal-detail-page-C2cTxf71.js +1 -0
  36. package/dist/gateway/static/root/assets/{goals-config-api-B95KdGMj.js → goals-config-api-DTWZNA_Y.js} +1 -1
  37. package/dist/gateway/static/root/assets/goals-page-CTmA3hWK.js +2 -0
  38. package/dist/gateway/static/root/assets/goals-settings-Bhct0ZT-.js +1 -0
  39. package/dist/gateway/static/root/assets/heartbeat-settings-C-UxSU4a.js +1 -0
  40. package/dist/gateway/static/root/assets/{html-workspace-editor-CQLWDiwE.js → html-workspace-editor-DV90ddkE.js} +1 -1
  41. package/dist/gateway/static/root/assets/index-BNHDd2j1.css +1 -0
  42. package/dist/gateway/static/root/assets/index-BPXLPMuY.js +193 -0
  43. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-DCjy2y4d.js +1 -0
  44. package/dist/gateway/static/root/assets/logs-page-CGc3_CQU.js +2 -0
  45. package/dist/gateway/static/root/assets/{markdown-editor-AssmZFx4.js → markdown-editor-BFOjBBla.js} +2 -2
  46. package/dist/gateway/static/root/assets/markdown-split-BaqxP-GQ.js +1 -0
  47. package/dist/gateway/static/root/assets/{media-plugins-BhIQU5yS.js → media-plugins-DQ_EXloK.js} +1 -1
  48. package/dist/gateway/static/root/assets/messages-CjuIJcZl.js +3 -0
  49. package/dist/gateway/static/root/assets/models-hub-panel-Drz4UQMb.js +2 -0
  50. package/dist/gateway/static/root/assets/notes-page-CY1ylng1.js +1 -0
  51. package/dist/gateway/static/root/assets/notes-workbench-X7IaD--t.js +2 -0
  52. package/dist/gateway/static/root/assets/page-tabs-EIZhLppK.js +1 -0
  53. package/dist/gateway/static/root/assets/{preview-open-alternatives-DGzet1d7.js → preview-open-alternatives-r_uB4Epr.js} +1 -1
  54. package/dist/gateway/static/root/assets/project-detail-page-DE5adRBE.js +1 -0
  55. package/dist/gateway/static/root/assets/projects-page-CuOb1k6F.js +1 -0
  56. package/dist/gateway/static/root/assets/remote-access-hub-BOxNrUVA.js +1 -0
  57. package/dist/gateway/static/root/assets/{save-bar-controls-Cqgb-jqa.js → save-bar-controls-B132Uf-2.js} +1 -1
  58. package/dist/gateway/static/root/assets/{schedule-field-DVZcI8Yt.js → schedule-field-B5qshALm.js} +1 -1
  59. package/dist/gateway/static/root/assets/{schema-form-Bj7sOxC8.js → schema-form-CvLmkdS9.js} +1 -1
  60. package/dist/gateway/static/root/assets/sessions-page-CY0IQcGW.js +1 -0
  61. package/dist/gateway/static/root/assets/settings-advanced-gate-D4NBNVCB.js +1 -0
  62. package/dist/gateway/static/root/assets/{settings-collapsible-section-BmXn-8N6.js → settings-collapsible-section-pRlvqsAf.js} +1 -1
  63. package/dist/gateway/static/root/assets/{settings-form-section-BnqYMWHR.js → settings-form-section-BBYUDLVd.js} +1 -1
  64. package/dist/gateway/static/root/assets/settings-page-DaO7zYZM.js +1 -0
  65. package/dist/gateway/static/root/assets/{settings-page-layout-CdWZU1hd.js → settings-page-layout-D8g9PAek.js} +1 -1
  66. package/dist/gateway/static/root/assets/setup-status-panel-Bks0CLLT.js +1 -0
  67. package/dist/gateway/static/root/assets/{share-preview-page-IB1v8i86.js → share-preview-page-v6-IOp8t.js} +1 -1
  68. package/dist/gateway/static/root/assets/shares-settings-CEZsKm9r.js +1 -0
  69. package/dist/gateway/static/root/assets/skill-reload-api-oTkHbb9W.js +1 -0
  70. package/dist/gateway/static/root/assets/skills-page-DigsbZ6K.js +2 -0
  71. package/dist/gateway/static/root/assets/{system-settings-panel-BxQ384RC.js → system-settings-panel-HUU2FFjM.js} +1 -1
  72. package/dist/gateway/static/root/assets/{typed-models-lib-BkcpvFYO.js → typed-models-lib-AH160QHh.js} +1 -1
  73. package/dist/gateway/static/root/assets/{use-channel-catalog-Cd0FaEQ4.js → use-channel-catalog-BXzDmjCQ.js} +1 -1
  74. package/dist/gateway/static/root/assets/{user-profile-settings-panel-DQ7NnRSY.js → user-profile-settings-panel-DxwnQvQ3.js} +1 -1
  75. package/dist/gateway/static/root/assets/{utils-YKhVf7Ka.js → utils-i5POEtqd.js} +1 -1
  76. package/dist/gateway/static/root/assets/{vendor-codemirror-CNP1wPe7.js → vendor-codemirror-BvNgyE1Q.js} +1 -1
  77. package/dist/gateway/static/root/assets/voice-api-key-field-CEJklEgb.js +1 -0
  78. package/dist/gateway/static/root/assets/work-item-detail-page-CD6FL_Rs.js +1 -0
  79. package/dist/gateway/static/root/assets/workflow-run-setup-panel-ClVVMgN-.js +3 -0
  80. package/dist/gateway/static/root/assets/{workflow-start-dialog-BNJVCWoS.js → workflow-start-dialog-Dv4ZA1T0.js} +1 -1
  81. package/dist/gateway/static/root/assets/workflows-page-OLQiUpoW.js +18 -0
  82. package/dist/gateway/static/root/index.html +8 -7
  83. package/dist/package.js +1 -1
  84. package/dist/src/agent/agent-manager.js +6 -2
  85. package/dist/src/agent/agent-manager.js.map +1 -1
  86. package/dist/src/agent/child-agent-factory.d.ts +2 -0
  87. package/dist/src/agent/child-agent-factory.js +2 -0
  88. package/dist/src/agent/child-agent-factory.js.map +1 -1
  89. package/dist/src/agent/coding/index.d.ts +1 -0
  90. package/dist/src/agent/coding/index.js +2 -0
  91. package/dist/src/agent/coding/turn-diff-tracker.d.ts +67 -0
  92. package/dist/src/agent/coding/turn-diff-tracker.js +233 -0
  93. package/dist/src/agent/coding/turn-diff-tracker.js.map +1 -0
  94. package/dist/src/agent/memory/dreaming/config.d.ts +2 -2
  95. package/dist/src/agent/memory/dreaming/config.js +3 -3
  96. package/dist/src/agent/memory/dreaming/config.js.map +1 -1
  97. package/dist/src/agent/memory/dreaming/constants.d.ts +1 -1
  98. package/dist/src/agent/memory/dreaming/constants.js +1 -1
  99. package/dist/src/agent/memory/dreaming/constants.js.map +1 -1
  100. package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +1 -0
  101. package/dist/src/agent/memory/dreaming/deep-promotion.js +11 -20
  102. package/dist/src/agent/memory/dreaming/deep-promotion.js.map +1 -1
  103. package/dist/src/agent/memory/dreaming/events.d.ts +3 -3
  104. package/dist/src/agent/memory/dreaming/events.js +6 -6
  105. package/dist/src/agent/memory/dreaming/events.js.map +1 -1
  106. package/dist/src/agent/memory/dreaming/last-run.d.ts +2 -2
  107. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  108. package/dist/src/agent/memory/dreaming/last-run.js.map +1 -1
  109. package/dist/src/agent/memory/dreaming/light-sweep.d.ts +1 -1
  110. package/dist/src/agent/memory/dreaming/light-sweep.js +3 -3
  111. package/dist/src/agent/memory/dreaming/light-sweep.js.map +1 -1
  112. package/dist/src/agent/memory/dreaming/preview.d.ts +1 -0
  113. package/dist/src/agent/memory/dreaming/preview.js +2 -2
  114. package/dist/src/agent/memory/dreaming/preview.js.map +1 -1
  115. package/dist/src/agent/memory/dreaming/rem-patterns.d.ts +1 -1
  116. package/dist/src/agent/memory/dreaming/rem-patterns.js +13 -13
  117. package/dist/src/agent/memory/dreaming/rem-patterns.js.map +1 -1
  118. package/dist/src/agent/memory/dreaming/scope.d.ts +14 -0
  119. package/dist/src/agent/memory/dreaming/scope.js +27 -0
  120. package/dist/src/agent/memory/dreaming/scope.js.map +1 -0
  121. package/dist/src/agent/memory/dreaming/short-term-store.d.ts +4 -4
  122. package/dist/src/agent/memory/dreaming/short-term-store.js +17 -17
  123. package/dist/src/agent/memory/dreaming/short-term-store.js.map +1 -1
  124. package/dist/src/agent/orchestration/agent-event-handler.d.ts +2 -0
  125. package/dist/src/agent/orchestration/agent-event-handler.js +13 -0
  126. package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
  127. package/dist/src/agent/orchestration/agent-orchestrator.js +22 -12
  128. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  129. package/dist/src/agent/sandbox/command-validator.js +12 -0
  130. package/dist/src/agent/sandbox/command-validator.js.map +1 -1
  131. package/dist/src/agent/service.d.ts +2 -1
  132. package/dist/src/agent/service.js +18 -6
  133. package/dist/src/agent/service.js.map +1 -1
  134. package/dist/src/agent/session/session-inspector.d.ts +5 -3
  135. package/dist/src/agent/session/session-inspector.js +16 -7
  136. package/dist/src/agent/session/session-inspector.js.map +1 -1
  137. package/dist/src/agent/source-context/types.d.ts +1 -1
  138. package/dist/src/agent/source-context/types.js +1 -1
  139. package/dist/src/agent/source-context/types.js.map +1 -1
  140. package/dist/src/agent/tools/apply-patch.js +116 -62
  141. package/dist/src/agent/tools/apply-patch.js.map +1 -1
  142. package/dist/src/agent/tools/concurrency.d.ts +8 -0
  143. package/dist/src/agent/tools/concurrency.js +31 -0
  144. package/dist/src/agent/tools/concurrency.js.map +1 -0
  145. package/dist/src/agent/tools/dreaming-tool.d.ts +2 -0
  146. package/dist/src/agent/tools/dreaming-tool.js +13 -10
  147. package/dist/src/agent/tools/dreaming-tool.js.map +1 -1
  148. package/dist/src/agent/tools/exec-command.js +4 -0
  149. package/dist/src/agent/tools/exec-command.js.map +1 -1
  150. package/dist/src/agent/tools/executor.d.ts +6 -4
  151. package/dist/src/agent/tools/executor.js +7 -4
  152. package/dist/src/agent/tools/executor.js.map +1 -1
  153. package/dist/src/agent/tools/factory.d.ts +3 -0
  154. package/dist/src/agent/tools/factory.js +7 -1
  155. package/dist/src/agent/tools/factory.js.map +1 -1
  156. package/dist/src/agent/tools/find.js +2 -0
  157. package/dist/src/agent/tools/find.js.map +1 -1
  158. package/dist/src/agent/tools/grep.js +2 -0
  159. package/dist/src/agent/tools/grep.js.map +1 -1
  160. package/dist/src/agent/tools/index.d.ts +2 -0
  161. package/dist/src/agent/tools/index.js +3 -1
  162. package/dist/src/agent/tools/list-dir.js +2 -0
  163. package/dist/src/agent/tools/list-dir.js.map +1 -1
  164. package/dist/src/agent/tools/memory-tool.d.ts +1 -0
  165. package/dist/src/agent/tools/memory-tool.js +2 -2
  166. package/dist/src/agent/tools/memory-tool.js.map +1 -1
  167. package/dist/src/agent/tools/metadata.d.ts +15 -0
  168. package/dist/src/agent/tools/metadata.js +26 -0
  169. package/dist/src/agent/tools/metadata.js.map +1 -0
  170. package/dist/src/agent/tools/read.js +2 -0
  171. package/dist/src/agent/tools/read.js.map +1 -1
  172. package/dist/src/agent/tools/write.js +6 -0
  173. package/dist/src/agent/tools/write.js.map +1 -1
  174. package/dist/src/agent/workflow/subagent-runner.d.ts +1 -0
  175. package/dist/src/agent/workflow/subagent-runner.js +5 -1
  176. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  177. package/dist/src/agent/workflow/workflow-child-tools.js +5 -0
  178. package/dist/src/agent/workflow/workflow-child-tools.js.map +1 -1
  179. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  180. package/dist/src/connectors/health.d.ts +2 -1
  181. package/dist/src/connectors/health.js +59 -1
  182. package/dist/src/connectors/health.js.map +1 -1
  183. package/dist/src/connectors/install.d.ts +1 -0
  184. package/dist/src/connectors/install.js +28 -1
  185. package/dist/src/connectors/install.js.map +1 -1
  186. package/dist/src/connectors/instances.js +7 -0
  187. package/dist/src/connectors/instances.js.map +1 -1
  188. package/dist/src/connectors/materialize.js +2 -1
  189. package/dist/src/connectors/materialize.js.map +1 -1
  190. package/dist/src/connectors/registries/modelscope.js +38 -13
  191. package/dist/src/connectors/registries/modelscope.js.map +1 -1
  192. package/dist/src/connectors/types.d.ts +2 -0
  193. package/dist/src/gateway/dreaming-automation-reconciler.d.ts +1 -0
  194. package/dist/src/gateway/dreaming-automation-reconciler.js +62 -42
  195. package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -1
  196. package/dist/src/gateway/hono/app.js +7 -1
  197. package/dist/src/gateway/hono/app.js.map +1 -1
  198. package/dist/src/gateway/hono/routes/connectors.js +46 -2
  199. package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
  200. package/dist/src/gateway/hono/routes/dreaming.js +111 -66
  201. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  202. package/dist/src/gateway/hono/routes/projects.js +846 -43
  203. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  204. package/dist/src/gateway/hono/routes/sessions.js +1 -0
  205. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  206. package/dist/src/gateway/service.js +17 -8
  207. package/dist/src/gateway/service.js.map +1 -1
  208. package/dist/src/media/store.js +1 -1
  209. package/dist/src/media/store.js.map +1 -1
  210. package/dist/src/media/types.d.ts +1 -1
  211. package/dist/src/media/uri.js +2 -1
  212. package/dist/src/media/uri.js.map +1 -1
  213. package/dist/src/session/session-context-for-llm.d.ts +2 -0
  214. package/dist/src/session/session-context-for-llm.js +14 -1
  215. package/dist/src/session/session-context-for-llm.js.map +1 -1
  216. package/dist/src/session/store.js +2 -2
  217. package/dist/src/session/store.js.map +1 -1
  218. package/dist/src/storage/sqlite/migrations/022_work_items.sql +61 -0
  219. package/dist/src/storage/sqlite/migrations/023_work_item_attachments.sql +15 -0
  220. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  221. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  222. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  223. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  224. package/dist/src/storage/sqlite/schema.js +1 -1
  225. package/dist/src/storage/sqlite/schema.sql +78 -0
  226. package/dist/src/tui/components/assistant-message.js +12 -2
  227. package/dist/src/tui/components/assistant-message.js.map +1 -1
  228. package/dist/src/tui/components/tool-execution.d.ts +8 -0
  229. package/dist/src/tui/components/tool-execution.js +87 -77
  230. package/dist/src/tui/components/tool-execution.js.map +1 -1
  231. package/dist/src/tui/components/visual-truncate.d.ts +1 -0
  232. package/dist/src/tui/components/visual-truncate.js +28 -1
  233. package/dist/src/tui/components/visual-truncate.js.map +1 -1
  234. package/dist/src/tui/tool-summary.d.ts +22 -0
  235. package/dist/src/tui/tool-summary.js +212 -0
  236. package/dist/src/tui/tool-summary.js.map +1 -0
  237. package/dist/src/tui/tui-tool-diff.d.ts +15 -0
  238. package/dist/src/tui/tui-tool-diff.js +178 -7
  239. package/dist/src/tui/tui-tool-diff.js.map +1 -1
  240. package/dist/src/work-items/agent-context.d.ts +3 -0
  241. package/dist/src/work-items/agent-context.js +39 -0
  242. package/dist/src/work-items/agent-context.js.map +1 -0
  243. package/dist/src/work-items/index.d.ts +4 -0
  244. package/dist/src/work-items/index.js +4 -0
  245. package/dist/src/work-items/types.d.ts +112 -0
  246. package/dist/src/work-items/types.js +1 -0
  247. package/dist/src/work-items/work-item-service.d.ts +33 -0
  248. package/dist/src/work-items/work-item-service.js +180 -0
  249. package/dist/src/work-items/work-item-service.js.map +1 -0
  250. package/dist/src/work-items/work-item-store.d.ts +21 -0
  251. package/dist/src/work-items/work-item-store.js +302 -0
  252. package/dist/src/work-items/work-item-store.js.map +1 -0
  253. package/dist/src/workflows/service/workflow-run-service.js +4 -3
  254. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  255. package/dist/src/workflows/service/workflow-session-bridge.js +3 -0
  256. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  257. package/package.json +1 -1
  258. package/dist/gateway/static/root/assets/Combination-HAlzriaz.js +0 -41
  259. package/dist/gateway/static/root/assets/agents-BjIxt67Z.js +0 -2
  260. package/dist/gateway/static/root/assets/app-management-settings-panel-CYCONLIL.js +0 -1
  261. package/dist/gateway/static/root/assets/appearance-settings-Clw3ryKg.js +0 -1
  262. package/dist/gateway/static/root/assets/apps-page-QICTeGjX.js +0 -1
  263. package/dist/gateway/static/root/assets/automation-suggestion-card-CU0-4nQ-.js +0 -1
  264. package/dist/gateway/static/root/assets/automations-page-Car-jtiz.js +0 -1
  265. package/dist/gateway/static/root/assets/browser-settings-page-CMeBJzlS.js +0 -8
  266. package/dist/gateway/static/root/assets/capability-presets-api-BmQTM9Il.js +0 -1
  267. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DZEJEoCF.js +0 -1
  268. package/dist/gateway/static/root/assets/channels-settings-kkW-xFau.js +0 -1
  269. package/dist/gateway/static/root/assets/code-editor-dZTY2dRW.js +0 -1
  270. package/dist/gateway/static/root/assets/connectors-page-BvaQvO5F.js +0 -2
  271. package/dist/gateway/static/root/assets/dist-Mys7eFJ5.js +0 -1
  272. package/dist/gateway/static/root/assets/dist-wO9a2_ID.js +0 -1
  273. package/dist/gateway/static/root/assets/dreaming-settings-DnHO686d.js +0 -1
  274. package/dist/gateway/static/root/assets/extension-debug-page-BGLRuWVN.js +0 -1
  275. package/dist/gateway/static/root/assets/extension-page-D978ePp9.js +0 -1
  276. package/dist/gateway/static/root/assets/extension-settings-page-B6Ih4Swx.js +0 -1
  277. package/dist/gateway/static/root/assets/gateway-settings-CMEA3r5u.js +0 -1
  278. package/dist/gateway/static/root/assets/goal-create-dialog-B-KHKeXN.js +0 -1
  279. package/dist/gateway/static/root/assets/goal-detail-page-BxrSoWdj.js +0 -1
  280. package/dist/gateway/static/root/assets/goals-page-BTJzIl28.js +0 -2
  281. package/dist/gateway/static/root/assets/goals-settings-BJyEuLLm.js +0 -1
  282. package/dist/gateway/static/root/assets/heartbeat-settings-wkOjYNQT.js +0 -1
  283. package/dist/gateway/static/root/assets/index-BLaXr6Ev.css +0 -1
  284. package/dist/gateway/static/root/assets/index-c_9TVr_C.js +0 -191
  285. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-BT8T4DyC.js +0 -1
  286. package/dist/gateway/static/root/assets/logs-page-CrxBJUgI.js +0 -2
  287. package/dist/gateway/static/root/assets/markdown-split-Dv66bO2b.js +0 -1
  288. package/dist/gateway/static/root/assets/messages-O6TAtdFC.js +0 -3
  289. package/dist/gateway/static/root/assets/models-hub-panel-DOOpz6y1.js +0 -2
  290. package/dist/gateway/static/root/assets/notes-page-Br16pK9v.js +0 -1
  291. package/dist/gateway/static/root/assets/notes-workbench-PSJAi0ZC.js +0 -2
  292. package/dist/gateway/static/root/assets/project-detail-page-CIGGgKuw.js +0 -1
  293. package/dist/gateway/static/root/assets/projects-page-B2grhsBt.js +0 -1
  294. package/dist/gateway/static/root/assets/remote-access-hub-CXMORxBD.js +0 -1
  295. package/dist/gateway/static/root/assets/sessions-page-Bi2wkBzU.js +0 -1
  296. package/dist/gateway/static/root/assets/settings-advanced-gate-B1L3G4IA.js +0 -1
  297. package/dist/gateway/static/root/assets/settings-page-BfRSHJmO.js +0 -1
  298. package/dist/gateway/static/root/assets/setup-status-panel-CWtPM7RK.js +0 -1
  299. package/dist/gateway/static/root/assets/shares-settings-ngbsBgij.js +0 -1
  300. package/dist/gateway/static/root/assets/skill-reload-api-BIe442Gv.js +0 -1
  301. package/dist/gateway/static/root/assets/skills-page-BfchZRVa.js +0 -2
  302. package/dist/gateway/static/root/assets/voice-api-key-field-C5Ov8Uk_.js +0 -1
  303. package/dist/gateway/static/root/assets/workflow-run-setup-panel-BYD9BtOq.js +0 -3
  304. package/dist/gateway/static/root/assets/workflows-page-BYF29ANm.js +0 -18
@@ -0,0 +1,302 @@
1
+ import { getSqliteDatabase } from "../storage/sqlite/transaction.js";
2
+ import "../storage/sqlite/index.js";
3
+ import { randomUUID } from "node:crypto";
4
+ //#region src/work-items/work-item-store.ts
5
+ function nowMs() {
6
+ return Date.now();
7
+ }
8
+ function toArray(value) {
9
+ if (value === void 0) return void 0;
10
+ return Array.isArray(value) ? value : [value];
11
+ }
12
+ function clampLimit(value) {
13
+ if (!Number.isFinite(value)) return 50;
14
+ return Math.max(1, Math.min(500, Math.floor(value ?? 50)));
15
+ }
16
+ function normalizeTitle(title) {
17
+ const value = title.trim();
18
+ if (!value) throw new Error("Work item title is required");
19
+ return value;
20
+ }
21
+ function rowToItem(row) {
22
+ return {
23
+ id: row.id,
24
+ projectId: row.project_id,
25
+ title: row.title,
26
+ description: row.description ?? void 0,
27
+ status: row.status,
28
+ priority: row.priority,
29
+ ownerAgentId: row.owner_agent_id ?? void 0,
30
+ nextAction: row.next_action ?? void 0,
31
+ blockedReason: row.blocked_reason ?? void 0,
32
+ dueAt: row.due_at ?? void 0,
33
+ completedAt: row.completed_at ?? void 0,
34
+ archivedAt: row.archived_at ?? void 0,
35
+ createdAt: row.created_at,
36
+ updatedAt: row.updated_at
37
+ };
38
+ }
39
+ function rowToLink(row) {
40
+ return {
41
+ id: row.id,
42
+ workItemId: row.work_item_id,
43
+ kind: row.kind,
44
+ targetId: row.target_id,
45
+ title: row.title ?? void 0,
46
+ statusSnapshot: row.status_snapshot ?? void 0,
47
+ createdAt: row.created_at
48
+ };
49
+ }
50
+ function rowToAttachment(row) {
51
+ return {
52
+ id: row.id,
53
+ workItemId: row.work_item_id,
54
+ mediaUri: row.media_uri,
55
+ mediaId: row.media_id,
56
+ bucket: row.bucket,
57
+ type: row.type,
58
+ mimeType: row.mime_type,
59
+ fileName: row.file_name,
60
+ size: row.size,
61
+ createdAt: row.created_at
62
+ };
63
+ }
64
+ function rowToEvent(row) {
65
+ return {
66
+ id: row.id,
67
+ workItemId: row.work_item_id,
68
+ type: row.type,
69
+ payload: row.payload_json ? JSON.parse(row.payload_json) : void 0,
70
+ createdAt: row.created_at
71
+ };
72
+ }
73
+ function rowToSuggestion(row) {
74
+ return {
75
+ id: row.id,
76
+ workItemId: row.work_item_id,
77
+ sourceKind: row.source_kind,
78
+ sourceId: row.source_id,
79
+ status: row.status,
80
+ patch: JSON.parse(row.patch_json || "{}"),
81
+ progressNote: row.progress_note ?? void 0,
82
+ rationale: row.rationale ?? void 0,
83
+ confidence: row.confidence ?? void 0,
84
+ createdAt: row.created_at,
85
+ appliedAt: row.applied_at ?? void 0,
86
+ dismissedAt: row.dismissed_at ?? void 0
87
+ };
88
+ }
89
+ function comparePriority(left, right) {
90
+ const rank = {
91
+ urgent: 4,
92
+ high: 3,
93
+ normal: 2,
94
+ low: 1
95
+ };
96
+ return rank[left] - rank[right];
97
+ }
98
+ function applyQuery(items, query = {}) {
99
+ const statuses = toArray(query.status);
100
+ const priorities = toArray(query.priority);
101
+ const search = query.search?.trim().toLowerCase();
102
+ let filtered = items.filter((item) => {
103
+ if (!query.includeArchived && item.archivedAt) return false;
104
+ if (statuses?.length && !statuses.includes(item.status)) return false;
105
+ if (priorities?.length && !priorities.includes(item.priority)) return false;
106
+ if (search) {
107
+ if (![
108
+ item.title,
109
+ item.description,
110
+ item.nextAction,
111
+ item.blockedReason
112
+ ].filter(Boolean).join("\n").toLowerCase().includes(search)) return false;
113
+ }
114
+ return true;
115
+ });
116
+ const sortBy = query.sortBy ?? "updatedAt";
117
+ const direction = query.sortOrder === "asc" ? 1 : -1;
118
+ filtered = [...filtered].sort((left, right) => {
119
+ if (sortBy === "priority") return direction * comparePriority(left.priority, right.priority);
120
+ if (sortBy === "status") return direction * left.status.localeCompare(right.status);
121
+ if (sortBy === "createdAt") return direction * (left.createdAt - right.createdAt);
122
+ return direction * (left.updatedAt - right.updatedAt);
123
+ });
124
+ const total = filtered.length;
125
+ const limit = clampLimit(query.limit);
126
+ const offset = Math.max(0, Math.floor(query.offset ?? 0));
127
+ const page = filtered.slice(offset, offset + limit);
128
+ return {
129
+ items: page,
130
+ total,
131
+ limit,
132
+ offset,
133
+ hasMore: offset + page.length < total
134
+ };
135
+ }
136
+ var WorkItemStore = class {
137
+ create(projectId, input) {
138
+ const timestamp = nowMs();
139
+ const item = {
140
+ id: randomUUID(),
141
+ projectId,
142
+ title: normalizeTitle(input.title),
143
+ description: input.description?.trim() || void 0,
144
+ status: input.status ?? "todo",
145
+ priority: input.priority ?? "normal",
146
+ ownerAgentId: input.ownerAgentId?.trim() || void 0,
147
+ nextAction: input.nextAction?.trim() || void 0,
148
+ blockedReason: input.blockedReason?.trim() || void 0,
149
+ dueAt: input.dueAt,
150
+ createdAt: timestamp,
151
+ updatedAt: timestamp
152
+ };
153
+ getSqliteDatabase().prepare(`INSERT INTO work_items
154
+ (id, project_id, title, description, status, priority, owner_agent_id, next_action, blocked_reason, due_at, created_at, updated_at)
155
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(item.id, item.projectId, item.title, item.description ?? null, item.status, item.priority, item.ownerAgentId ?? null, item.nextAction ?? null, item.blockedReason ?? null, item.dueAt ?? null, item.createdAt, item.updatedAt);
156
+ return item;
157
+ }
158
+ get(id) {
159
+ const row = getSqliteDatabase().prepare(`SELECT * FROM work_items WHERE id = ?`).get(id);
160
+ return row ? {
161
+ ...rowToItem(row),
162
+ links: this.listLinks(id),
163
+ attachments: this.listAttachments(id)
164
+ } : null;
165
+ }
166
+ list(projectId, query = {}) {
167
+ const result = applyQuery(getSqliteDatabase().prepare(`SELECT * FROM work_items WHERE project_id = ?`).all(projectId).map(rowToItem), query);
168
+ const linksByItem = this.listLinksForItems(result.items.map((item) => item.id));
169
+ const attachmentsByItem = this.listAttachmentsForItems(result.items.map((item) => item.id));
170
+ return {
171
+ ...result,
172
+ items: result.items.map((item) => ({
173
+ ...item,
174
+ links: linksByItem.get(item.id) ?? [],
175
+ attachments: attachmentsByItem.get(item.id) ?? []
176
+ }))
177
+ };
178
+ }
179
+ update(id, patch) {
180
+ const current = this.get(id);
181
+ if (!current) return null;
182
+ const timestamp = nowMs();
183
+ const nextStatus = patch.status ?? current.status;
184
+ const completedAt = nextStatus === "done" ? current.completedAt ?? timestamp : nextStatus === current.status ? current.completedAt ?? null : null;
185
+ getSqliteDatabase().prepare(`UPDATE work_items
186
+ SET title = ?, description = ?, status = ?, priority = ?, owner_agent_id = ?,
187
+ next_action = ?, blocked_reason = ?, due_at = ?, completed_at = ?, archived_at = ?, updated_at = ?
188
+ WHERE id = ?`).run(patch.title !== void 0 ? normalizeTitle(patch.title) : current.title, patch.description !== void 0 ? patch.description?.trim() || null : current.description ?? null, nextStatus, patch.priority ?? current.priority, patch.ownerAgentId !== void 0 ? patch.ownerAgentId?.trim() || null : current.ownerAgentId ?? null, patch.nextAction !== void 0 ? patch.nextAction?.trim() || null : current.nextAction ?? null, patch.blockedReason !== void 0 ? patch.blockedReason?.trim() || null : current.blockedReason ?? null, patch.dueAt !== void 0 ? patch.dueAt : current.dueAt ?? null, completedAt, patch.archivedAt !== void 0 ? patch.archivedAt : current.archivedAt ?? null, timestamp, id);
189
+ return this.get(id);
190
+ }
191
+ addLink(input) {
192
+ const link = {
193
+ ...input,
194
+ id: randomUUID(),
195
+ createdAt: nowMs()
196
+ };
197
+ getSqliteDatabase().prepare(`INSERT INTO work_item_links (id, work_item_id, kind, target_id, title, status_snapshot, created_at)
198
+ VALUES (?, ?, ?, ?, ?, ?, ?)`).run(link.id, link.workItemId, link.kind, link.targetId, link.title ?? null, link.statusSnapshot ?? null, link.createdAt);
199
+ return link;
200
+ }
201
+ listLinks(workItemId) {
202
+ return getSqliteDatabase().prepare(`SELECT * FROM work_item_links WHERE work_item_id = ? ORDER BY created_at DESC`).all(workItemId).map(rowToLink);
203
+ }
204
+ listLinksForItems(workItemIds) {
205
+ const unique = [...new Set(workItemIds)];
206
+ if (!unique.length) return /* @__PURE__ */ new Map();
207
+ const rows = getSqliteDatabase().prepare(`SELECT * FROM work_item_links WHERE work_item_id IN (${unique.map(() => "?").join(", ")}) ORDER BY created_at DESC`).all(...unique);
208
+ const map = /* @__PURE__ */ new Map();
209
+ for (const row of rows) {
210
+ const list = map.get(row.work_item_id) ?? [];
211
+ list.push(rowToLink(row));
212
+ map.set(row.work_item_id, list);
213
+ }
214
+ return map;
215
+ }
216
+ addAttachment(input) {
217
+ const attachment = {
218
+ ...input,
219
+ id: randomUUID(),
220
+ createdAt: nowMs()
221
+ };
222
+ getSqliteDatabase().prepare(`INSERT INTO work_item_attachments
223
+ (id, work_item_id, media_uri, media_id, bucket, type, mime_type, file_name, size, created_at)
224
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(attachment.id, attachment.workItemId, attachment.mediaUri, attachment.mediaId, attachment.bucket, attachment.type, attachment.mimeType, attachment.fileName, attachment.size, attachment.createdAt);
225
+ return attachment;
226
+ }
227
+ getAttachment(workItemId, attachmentId) {
228
+ const row = getSqliteDatabase().prepare(`SELECT * FROM work_item_attachments WHERE work_item_id = ? AND id = ?`).get(workItemId, attachmentId);
229
+ return row ? rowToAttachment(row) : null;
230
+ }
231
+ listAttachments(workItemId) {
232
+ return getSqliteDatabase().prepare(`SELECT * FROM work_item_attachments WHERE work_item_id = ? ORDER BY created_at DESC`).all(workItemId).map(rowToAttachment);
233
+ }
234
+ listAttachmentsForItems(workItemIds) {
235
+ const unique = [...new Set(workItemIds)];
236
+ if (!unique.length) return /* @__PURE__ */ new Map();
237
+ const rows = getSqliteDatabase().prepare(`SELECT * FROM work_item_attachments WHERE work_item_id IN (${unique.map(() => "?").join(", ")}) ORDER BY created_at DESC`).all(...unique);
238
+ const map = /* @__PURE__ */ new Map();
239
+ for (const row of rows) {
240
+ const list = map.get(row.work_item_id) ?? [];
241
+ list.push(rowToAttachment(row));
242
+ map.set(row.work_item_id, list);
243
+ }
244
+ return map;
245
+ }
246
+ removeAttachment(workItemId, attachmentId) {
247
+ const attachment = this.getAttachment(workItemId, attachmentId);
248
+ if (!attachment) return null;
249
+ getSqliteDatabase().prepare(`DELETE FROM work_item_attachments WHERE work_item_id = ? AND id = ?`).run(workItemId, attachmentId);
250
+ return attachment;
251
+ }
252
+ addEvent(workItemId, type, payload) {
253
+ const event = {
254
+ id: randomUUID(),
255
+ workItemId,
256
+ type,
257
+ payload,
258
+ createdAt: nowMs()
259
+ };
260
+ getSqliteDatabase().prepare(`INSERT INTO work_item_events (id, work_item_id, type, payload_json, created_at) VALUES (?, ?, ?, ?, ?)`).run(event.id, workItemId, type, payload === void 0 ? null : JSON.stringify(payload), event.createdAt);
261
+ return event;
262
+ }
263
+ listEvents(workItemId) {
264
+ return getSqliteDatabase().prepare(`SELECT * FROM work_item_events WHERE work_item_id = ? ORDER BY created_at DESC`).all(workItemId).map(rowToEvent);
265
+ }
266
+ createUpdateSuggestion(workItemId, input) {
267
+ if (!this.get(workItemId)) return null;
268
+ const suggestion = {
269
+ id: randomUUID(),
270
+ workItemId,
271
+ sourceKind: input.sourceKind,
272
+ sourceId: input.sourceId,
273
+ status: "pending",
274
+ patch: input.patch ?? {},
275
+ progressNote: input.progressNote?.trim() || void 0,
276
+ rationale: input.rationale?.trim() || void 0,
277
+ confidence: input.confidence,
278
+ createdAt: nowMs()
279
+ };
280
+ getSqliteDatabase().prepare(`INSERT INTO work_item_update_suggestions
281
+ (id, work_item_id, source_kind, source_id, status, patch_json, progress_note, rationale, confidence, created_at)
282
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(suggestion.id, suggestion.workItemId, suggestion.sourceKind, suggestion.sourceId, suggestion.status, JSON.stringify(suggestion.patch), suggestion.progressNote ?? null, suggestion.rationale ?? null, suggestion.confidence ?? null, suggestion.createdAt);
283
+ return suggestion;
284
+ }
285
+ getUpdateSuggestion(id) {
286
+ const row = getSqliteDatabase().prepare(`SELECT * FROM work_item_update_suggestions WHERE id = ?`).get(id);
287
+ return row ? rowToSuggestion(row) : null;
288
+ }
289
+ listUpdateSuggestions(workItemId, status) {
290
+ return (status ? getSqliteDatabase().prepare(`SELECT * FROM work_item_update_suggestions WHERE work_item_id = ? AND status = ? ORDER BY created_at DESC`).all(workItemId, status) : getSqliteDatabase().prepare(`SELECT * FROM work_item_update_suggestions WHERE work_item_id = ? ORDER BY created_at DESC`).all(workItemId)).map(rowToSuggestion);
291
+ }
292
+ markUpdateSuggestion(id, status) {
293
+ const timestamp = nowMs();
294
+ const column = status === "applied" ? "applied_at" : "dismissed_at";
295
+ getSqliteDatabase().prepare(`UPDATE work_item_update_suggestions SET status = ?, ${column} = ? WHERE id = ? AND status = 'pending'`).run(status, timestamp, id);
296
+ return this.getUpdateSuggestion(id);
297
+ }
298
+ };
299
+ //#endregion
300
+ export { WorkItemStore };
301
+
302
+ //# sourceMappingURL=work-item-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-item-store.js","names":[],"sources":["../../../src/work-items/work-item-store.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { getSqliteDatabase } from '../storage/sqlite/index.js';\nimport type {\n CreateWorkItemUpdateSuggestionInput,\n CreateWorkItemInput,\n UpdateWorkItemInput,\n WorkItem,\n WorkItemAttachment,\n WorkItemEvent,\n WorkItemEventType,\n WorkItemLink,\n WorkItemLinkKind,\n WorkItemListQuery,\n WorkItemListResult,\n WorkItemPriority,\n WorkItemStatus,\n WorkItemUpdateSuggestion,\n WorkItemUpdateSuggestionSourceKind,\n WorkItemUpdateSuggestionStatus,\n} from './types.js';\n\ntype WorkItemRow = {\n id: string;\n project_id: string;\n title: string;\n description: string | null;\n status: string;\n priority: string;\n owner_agent_id: string | null;\n next_action: string | null;\n blocked_reason: string | null;\n due_at: number | null;\n completed_at: number | null;\n archived_at: number | null;\n created_at: number;\n updated_at: number;\n};\n\ntype WorkItemLinkRow = {\n id: string;\n work_item_id: string;\n kind: string;\n target_id: string;\n title: string | null;\n status_snapshot: string | null;\n created_at: number;\n};\n\ntype WorkItemAttachmentRow = {\n id: string;\n work_item_id: string;\n media_uri: string;\n media_id: string;\n bucket: string;\n type: string;\n mime_type: string;\n file_name: string;\n size: number;\n created_at: number;\n};\n\ntype WorkItemEventRow = {\n id: string;\n work_item_id: string;\n type: string;\n payload_json: string | null;\n created_at: number;\n};\n\ntype WorkItemUpdateSuggestionRow = {\n id: string;\n work_item_id: string;\n source_kind: string;\n source_id: string;\n status: string;\n patch_json: string;\n progress_note: string | null;\n rationale: string | null;\n confidence: number | null;\n created_at: number;\n applied_at: number | null;\n dismissed_at: number | null;\n};\n\nfunction nowMs(): number {\n return Date.now();\n}\n\nfunction toArray<T>(value: T | T[] | undefined): T[] | undefined {\n if (value === undefined) return undefined;\n return Array.isArray(value) ? value : [value];\n}\n\nfunction clampLimit(value: number | undefined): number {\n if (!Number.isFinite(value)) return 50;\n return Math.max(1, Math.min(500, Math.floor(value ?? 50)));\n}\n\nfunction normalizeTitle(title: string): string {\n const value = title.trim();\n if (!value) throw new Error('Work item title is required');\n return value;\n}\n\nfunction rowToItem(row: WorkItemRow): WorkItem {\n return {\n id: row.id,\n projectId: row.project_id,\n title: row.title,\n description: row.description ?? undefined,\n status: row.status as WorkItemStatus,\n priority: row.priority as WorkItemPriority,\n ownerAgentId: row.owner_agent_id ?? undefined,\n nextAction: row.next_action ?? undefined,\n blockedReason: row.blocked_reason ?? undefined,\n dueAt: row.due_at ?? undefined,\n completedAt: row.completed_at ?? undefined,\n archivedAt: row.archived_at ?? undefined,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nfunction rowToLink(row: WorkItemLinkRow): WorkItemLink {\n return {\n id: row.id,\n workItemId: row.work_item_id,\n kind: row.kind as WorkItemLinkKind,\n targetId: row.target_id,\n title: row.title ?? undefined,\n statusSnapshot: row.status_snapshot ?? undefined,\n createdAt: row.created_at,\n };\n}\n\nfunction rowToAttachment(row: WorkItemAttachmentRow): WorkItemAttachment {\n return {\n id: row.id,\n workItemId: row.work_item_id,\n mediaUri: row.media_uri,\n mediaId: row.media_id,\n bucket: row.bucket,\n type: row.type as WorkItemAttachment['type'],\n mimeType: row.mime_type,\n fileName: row.file_name,\n size: row.size,\n createdAt: row.created_at,\n };\n}\n\nfunction rowToEvent(row: WorkItemEventRow): WorkItemEvent {\n return {\n id: row.id,\n workItemId: row.work_item_id,\n type: row.type as WorkItemEventType,\n payload: row.payload_json ? JSON.parse(row.payload_json) : undefined,\n createdAt: row.created_at,\n };\n}\n\nfunction rowToSuggestion(row: WorkItemUpdateSuggestionRow): WorkItemUpdateSuggestion {\n return {\n id: row.id,\n workItemId: row.work_item_id,\n sourceKind: row.source_kind as WorkItemUpdateSuggestionSourceKind,\n sourceId: row.source_id,\n status: row.status as WorkItemUpdateSuggestionStatus,\n patch: JSON.parse(row.patch_json || '{}'),\n progressNote: row.progress_note ?? undefined,\n rationale: row.rationale ?? undefined,\n confidence: row.confidence ?? undefined,\n createdAt: row.created_at,\n appliedAt: row.applied_at ?? undefined,\n dismissedAt: row.dismissed_at ?? undefined,\n };\n}\n\nfunction comparePriority(left: WorkItemPriority, right: WorkItemPriority): number {\n const rank: Record<WorkItemPriority, number> = { urgent: 4, high: 3, normal: 2, low: 1 };\n return rank[left] - rank[right];\n}\n\nfunction applyQuery(items: WorkItem[], query: WorkItemListQuery = {}): WorkItemListResult {\n const statuses = toArray(query.status);\n const priorities = toArray(query.priority);\n const search = query.search?.trim().toLowerCase();\n let filtered = items.filter((item) => {\n if (!query.includeArchived && item.archivedAt) return false;\n if (statuses?.length && !statuses.includes(item.status)) return false;\n if (priorities?.length && !priorities.includes(item.priority)) return false;\n if (search) {\n const text = [item.title, item.description, item.nextAction, item.blockedReason].filter(Boolean).join('\\n').toLowerCase();\n if (!text.includes(search)) return false;\n }\n return true;\n });\n\n const sortBy = query.sortBy ?? 'updatedAt';\n const direction = query.sortOrder === 'asc' ? 1 : -1;\n filtered = [...filtered].sort((left, right) => {\n if (sortBy === 'priority') return direction * comparePriority(left.priority, right.priority);\n if (sortBy === 'status') return direction * left.status.localeCompare(right.status);\n if (sortBy === 'createdAt') return direction * (left.createdAt - right.createdAt);\n return direction * (left.updatedAt - right.updatedAt);\n });\n\n const total = filtered.length;\n const limit = clampLimit(query.limit);\n const offset = Math.max(0, Math.floor(query.offset ?? 0));\n const page = filtered.slice(offset, offset + limit);\n return { items: page, total, limit, offset, hasMore: offset + page.length < total };\n}\n\nexport class WorkItemStore {\n create(projectId: string, input: CreateWorkItemInput): WorkItem {\n const timestamp = nowMs();\n const item: WorkItem = {\n id: randomUUID(),\n projectId,\n title: normalizeTitle(input.title),\n description: input.description?.trim() || undefined,\n status: input.status ?? 'todo',\n priority: input.priority ?? 'normal',\n ownerAgentId: input.ownerAgentId?.trim() || undefined,\n nextAction: input.nextAction?.trim() || undefined,\n blockedReason: input.blockedReason?.trim() || undefined,\n dueAt: input.dueAt,\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n getSqliteDatabase()\n .prepare(\n `INSERT INTO work_items\n (id, project_id, title, description, status, priority, owner_agent_id, next_action, blocked_reason, due_at, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n item.id,\n item.projectId,\n item.title,\n item.description ?? null,\n item.status,\n item.priority,\n item.ownerAgentId ?? null,\n item.nextAction ?? null,\n item.blockedReason ?? null,\n item.dueAt ?? null,\n item.createdAt,\n item.updatedAt,\n );\n return item;\n }\n\n get(id: string): WorkItem | null {\n const row = getSqliteDatabase()\n .prepare(`SELECT * FROM work_items WHERE id = ?`)\n .get(id) as WorkItemRow | undefined;\n return row ? { ...rowToItem(row), links: this.listLinks(id), attachments: this.listAttachments(id) } : null;\n }\n\n list(projectId: string, query: WorkItemListQuery = {}): WorkItemListResult {\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM work_items WHERE project_id = ?`)\n .all(projectId) as WorkItemRow[];\n const result = applyQuery(rows.map(rowToItem), query);\n const linksByItem = this.listLinksForItems(result.items.map((item) => item.id));\n const attachmentsByItem = this.listAttachmentsForItems(result.items.map((item) => item.id));\n return {\n ...result,\n items: result.items.map((item) => ({\n ...item,\n links: linksByItem.get(item.id) ?? [],\n attachments: attachmentsByItem.get(item.id) ?? [],\n })),\n };\n }\n\n update(id: string, patch: UpdateWorkItemInput): WorkItem | null {\n const current = this.get(id);\n if (!current) return null;\n const timestamp = nowMs();\n const nextStatus = patch.status ?? current.status;\n const completedAt = nextStatus === 'done'\n ? (current.completedAt ?? timestamp)\n : (nextStatus === current.status ? (current.completedAt ?? null) : null);\n getSqliteDatabase()\n .prepare(\n `UPDATE work_items\n SET title = ?, description = ?, status = ?, priority = ?, owner_agent_id = ?,\n next_action = ?, blocked_reason = ?, due_at = ?, completed_at = ?, archived_at = ?, updated_at = ?\n WHERE id = ?`,\n )\n .run(\n patch.title !== undefined ? normalizeTitle(patch.title) : current.title,\n patch.description !== undefined ? (patch.description?.trim() || null) : (current.description ?? null),\n nextStatus,\n patch.priority ?? current.priority,\n patch.ownerAgentId !== undefined ? (patch.ownerAgentId?.trim() || null) : (current.ownerAgentId ?? null),\n patch.nextAction !== undefined ? (patch.nextAction?.trim() || null) : (current.nextAction ?? null),\n patch.blockedReason !== undefined ? (patch.blockedReason?.trim() || null) : (current.blockedReason ?? null),\n patch.dueAt !== undefined ? patch.dueAt : (current.dueAt ?? null),\n completedAt,\n patch.archivedAt !== undefined ? patch.archivedAt : (current.archivedAt ?? null),\n timestamp,\n id,\n );\n return this.get(id);\n }\n\n addLink(input: Omit<WorkItemLink, 'id' | 'createdAt'>): WorkItemLink {\n const link: WorkItemLink = { ...input, id: randomUUID(), createdAt: nowMs() };\n getSqliteDatabase()\n .prepare(\n `INSERT INTO work_item_links (id, work_item_id, kind, target_id, title, status_snapshot, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(link.id, link.workItemId, link.kind, link.targetId, link.title ?? null, link.statusSnapshot ?? null, link.createdAt);\n return link;\n }\n\n listLinks(workItemId: string): WorkItemLink[] {\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM work_item_links WHERE work_item_id = ? ORDER BY created_at DESC`)\n .all(workItemId) as WorkItemLinkRow[];\n return rows.map(rowToLink);\n }\n\n listLinksForItems(workItemIds: string[]): Map<string, WorkItemLink[]> {\n const unique = [...new Set(workItemIds)];\n if (!unique.length) return new Map();\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM work_item_links WHERE work_item_id IN (${unique.map(() => '?').join(', ')}) ORDER BY created_at DESC`)\n .all(...unique) as WorkItemLinkRow[];\n const map = new Map<string, WorkItemLink[]>();\n for (const row of rows) {\n const list = map.get(row.work_item_id) ?? [];\n list.push(rowToLink(row));\n map.set(row.work_item_id, list);\n }\n return map;\n }\n\n addAttachment(input: Omit<WorkItemAttachment, 'id' | 'createdAt'>): WorkItemAttachment {\n const attachment: WorkItemAttachment = { ...input, id: randomUUID(), createdAt: nowMs() };\n getSqliteDatabase()\n .prepare(\n `INSERT INTO work_item_attachments\n (id, work_item_id, media_uri, media_id, bucket, type, mime_type, file_name, size, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n attachment.id,\n attachment.workItemId,\n attachment.mediaUri,\n attachment.mediaId,\n attachment.bucket,\n attachment.type,\n attachment.mimeType,\n attachment.fileName,\n attachment.size,\n attachment.createdAt,\n );\n return attachment;\n }\n\n getAttachment(workItemId: string, attachmentId: string): WorkItemAttachment | null {\n const row = getSqliteDatabase()\n .prepare(`SELECT * FROM work_item_attachments WHERE work_item_id = ? AND id = ?`)\n .get(workItemId, attachmentId) as WorkItemAttachmentRow | undefined;\n return row ? rowToAttachment(row) : null;\n }\n\n listAttachments(workItemId: string): WorkItemAttachment[] {\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM work_item_attachments WHERE work_item_id = ? ORDER BY created_at DESC`)\n .all(workItemId) as WorkItemAttachmentRow[];\n return rows.map(rowToAttachment);\n }\n\n listAttachmentsForItems(workItemIds: string[]): Map<string, WorkItemAttachment[]> {\n const unique = [...new Set(workItemIds)];\n if (!unique.length) return new Map();\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM work_item_attachments WHERE work_item_id IN (${unique.map(() => '?').join(', ')}) ORDER BY created_at DESC`)\n .all(...unique) as WorkItemAttachmentRow[];\n const map = new Map<string, WorkItemAttachment[]>();\n for (const row of rows) {\n const list = map.get(row.work_item_id) ?? [];\n list.push(rowToAttachment(row));\n map.set(row.work_item_id, list);\n }\n return map;\n }\n\n removeAttachment(workItemId: string, attachmentId: string): WorkItemAttachment | null {\n const attachment = this.getAttachment(workItemId, attachmentId);\n if (!attachment) return null;\n getSqliteDatabase()\n .prepare(`DELETE FROM work_item_attachments WHERE work_item_id = ? AND id = ?`)\n .run(workItemId, attachmentId);\n return attachment;\n }\n\n addEvent(workItemId: string, type: WorkItemEventType, payload?: unknown): WorkItemEvent {\n const event: WorkItemEvent = { id: randomUUID(), workItemId, type, payload, createdAt: nowMs() };\n getSqliteDatabase()\n .prepare(`INSERT INTO work_item_events (id, work_item_id, type, payload_json, created_at) VALUES (?, ?, ?, ?, ?)`)\n .run(event.id, workItemId, type, payload === undefined ? null : JSON.stringify(payload), event.createdAt);\n return event;\n }\n\n listEvents(workItemId: string): WorkItemEvent[] {\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM work_item_events WHERE work_item_id = ? ORDER BY created_at DESC`)\n .all(workItemId) as WorkItemEventRow[];\n return rows.map(rowToEvent);\n }\n\n createUpdateSuggestion(workItemId: string, input: CreateWorkItemUpdateSuggestionInput): WorkItemUpdateSuggestion | null {\n if (!this.get(workItemId)) return null;\n const suggestion: WorkItemUpdateSuggestion = {\n id: randomUUID(),\n workItemId,\n sourceKind: input.sourceKind,\n sourceId: input.sourceId,\n status: 'pending',\n patch: input.patch ?? {},\n progressNote: input.progressNote?.trim() || undefined,\n rationale: input.rationale?.trim() || undefined,\n confidence: input.confidence,\n createdAt: nowMs(),\n };\n getSqliteDatabase()\n .prepare(\n `INSERT INTO work_item_update_suggestions\n (id, work_item_id, source_kind, source_id, status, patch_json, progress_note, rationale, confidence, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n suggestion.id,\n suggestion.workItemId,\n suggestion.sourceKind,\n suggestion.sourceId,\n suggestion.status,\n JSON.stringify(suggestion.patch),\n suggestion.progressNote ?? null,\n suggestion.rationale ?? null,\n suggestion.confidence ?? null,\n suggestion.createdAt,\n );\n return suggestion;\n }\n\n getUpdateSuggestion(id: string): WorkItemUpdateSuggestion | null {\n const row = getSqliteDatabase()\n .prepare(`SELECT * FROM work_item_update_suggestions WHERE id = ?`)\n .get(id) as WorkItemUpdateSuggestionRow | undefined;\n return row ? rowToSuggestion(row) : null;\n }\n\n listUpdateSuggestions(workItemId: string, status?: WorkItemUpdateSuggestionStatus): WorkItemUpdateSuggestion[] {\n const rows = status\n ? getSqliteDatabase()\n .prepare(`SELECT * FROM work_item_update_suggestions WHERE work_item_id = ? AND status = ? ORDER BY created_at DESC`)\n .all(workItemId, status) as WorkItemUpdateSuggestionRow[]\n : getSqliteDatabase()\n .prepare(`SELECT * FROM work_item_update_suggestions WHERE work_item_id = ? ORDER BY created_at DESC`)\n .all(workItemId) as WorkItemUpdateSuggestionRow[];\n return rows.map(rowToSuggestion);\n }\n\n markUpdateSuggestion(id: string, status: Extract<WorkItemUpdateSuggestionStatus, 'applied' | 'dismissed'>): WorkItemUpdateSuggestion | null {\n const timestamp = nowMs();\n const column = status === 'applied' ? 'applied_at' : 'dismissed_at';\n getSqliteDatabase()\n .prepare(`UPDATE work_item_update_suggestions SET status = ?, ${column} = ? WHERE id = ? AND status = 'pending'`)\n .run(status, timestamp, id);\n return this.getUpdateSuggestion(id);\n }\n}\n"],"mappings":"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"}
@@ -333,9 +333,11 @@ var WorkflowRunService = class {
333
333
  }
334
334
  createWorkflowEngine(params) {
335
335
  const gatewayService = this.options.service;
336
+ const profileAgentId = extractProfileAgentId(params.sessionKey, gatewayService.currentConfig);
336
337
  const runner = new DelegateSubagentRunner({
337
338
  workspace: gatewayService.currentWorkspacePath,
338
339
  bus: gatewayService.messageBusInstance,
340
+ agentId: profileAgentId,
339
341
  getDefaultModel: () => resolveModel(gatewayService.agentService.getModelForSession(params.sessionKey)),
340
342
  getConfig: () => gatewayService.currentConfig,
341
343
  sessionStore: gatewayService.sessionIndexInstance.getStore(),
@@ -347,12 +349,11 @@ var WorkflowRunService = class {
347
349
  runStore: params.runStore,
348
350
  runner,
349
351
  resolveModelId: (modelId) => {
350
- const agentId = extractProfileAgentId(params.sessionKey, gatewayService.currentConfig);
351
- return resolveModel(resolveModelRef(gatewayService.currentConfig, agentId, modelId));
352
+ return resolveModel(resolveModelRef(gatewayService.currentConfig, profileAgentId, modelId));
352
353
  },
353
354
  parentSessionKey: params.sessionKey,
354
355
  subagentSessionKeyFactory: ({ runId, agentId }) => {
355
- return `agent:${extractProfileAgentId(params.sessionKey, gatewayService.currentConfig)}:workflow:${runId}:subagent:${agentId}`;
356
+ return `agent:${profileAgentId}:workflow:${runId}:subagent:${agentId}`;
356
357
  },
357
358
  onEventAppended: (event) => {
358
359
  gatewayService.emit("workflow.event.appended", {
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-run-service.js","names":["resolveModelById"],"sources":["../../../../src/workflows/service/workflow-run-service.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\n\nimport type { BuildChildToolsOptions } from '../../agent/child-agent-factory.js';\nimport { publishAutomationProductEvent } from '../../automations/product-events.js';\nimport { extractProfileAgentId } from '../../config/agent-profile.js';\nimport { resolveModelRef } from '../../config/agent-typed-models.js';\nimport type { GatewayWorkflowHost } from '../../gateway/gateway-workflow-host.types.js';\nimport { GoalService } from '../../goals/index.js';\nimport { resolveModel as resolveModelById } from '../../providers/index.js';\nimport { DelegateSubagentRunner } from '../../agent/workflow/subagent-runner.js';\nimport { CatalogWorkflowDefinitionRegistry } from '../registry/catalog-workflow-definition-registry.js';\nimport type { WorkflowDefinitionRegistry } from '../registry/workflow-definition-registry.js';\nimport { validateWorkflowJsonSchema } from '../domain/schema-validation.js';\nimport type {\n WorkflowDefinition,\n WorkflowRunDefinitionSnapshot,\n WorkflowRunInputEnvelope,\n WorkflowRunMetadata,\n WorkflowRunSource,\n} from '../domain/index.js';\nimport { isTerminalWorkflowRunStatus } from '../domain/index.js';\nimport { WorkflowEngine } from '../engine/index.js';\nimport { WorkflowEventStore } from '../store/event-store.js';\nimport { WorkflowRunStore } from '../store/run-store.js';\nimport type { WorkflowSessionBridge } from './workflow-session-bridge.js';\nexport type {\n CancelWorkflowRunResult,\n CancelWorkflowRunServiceParams,\n CancelWorkflowRunServiceResult,\n ReplayWorkflowRunServiceParams,\n RetryWorkflowRunServiceParams,\n StartWorkflowRunServiceParams,\n StartWorkflowRunServiceResult,\n WorkflowRunServiceErrorCode,\n WorkflowRunServiceErrorResult,\n WorkflowRunServiceResult,\n} from './workflow-run-service.types.js';\n\nimport type {\n CancelWorkflowRunResult,\n CancelWorkflowRunServiceParams,\n ReplayWorkflowRunServiceParams,\n RetryWorkflowRunServiceParams,\n StartWorkflowRunServiceParams,\n WorkflowRunServiceResult,\n} from './workflow-run-service.types.js';\nimport type { WorkflowRunReplayMetadata, WorkflowRunReplayScope, WorkflowRunView } from '../domain/run.js';\nimport type { WorkflowReplayAgentTarget } from '../engine/index.js';\n\nexport interface WorkflowRunServiceOptions {\n service: GatewayWorkflowHost;\n sessionBridge: WorkflowSessionBridge;\n buildChildTools: (childOptions: BuildChildToolsOptions) => AgentTool<any, any>[];\n definitionRegistry?: WorkflowDefinitionRegistry;\n}\n\nexport class WorkflowRunService {\n private readonly activeRuns = new Map<string, AbortController>();\n private readonly timeoutHandles = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly definitionRegistry: WorkflowDefinitionRegistry;\n private readonly emittedTerminalAutomationEvents = new Set<string>();\n\n constructor(private readonly options: WorkflowRunServiceOptions) {\n this.definitionRegistry = options.definitionRegistry ?? new CatalogWorkflowDefinitionRegistry();\n }\n\n async startWorkflowRun(params: StartWorkflowRunServiceParams): Promise<WorkflowRunServiceResult> {\n const definition = await this.loadDefinition(params.definitionId);\n if (!definition) {\n return {\n ok: false,\n code: 'definition_not_found',\n message: 'Workflow definition not found',\n httpStatus: 404,\n };\n }\n\n const inputEnvelope = params.inputEnvelope ?? buildWorkflowRunInputEnvelope(params.input, params.goal);\n const inputValidation = validateWorkflowJsonSchema(definition.inputSchema, inputEnvelope.payload);\n if (!inputValidation.ok) {\n return {\n ok: false,\n code: 'invalid_input',\n message: inputValidation.message ?? 'Workflow input did not match input schema',\n httpStatus: 400,\n };\n }\n\n const existingRun = params.idempotencyKey\n ? await this.findRunByIdempotencyKey(params.agentId, params.idempotencyKey)\n : null;\n if (existingRun) {\n return {\n ok: true,\n runId: existingRun.run.id,\n sessionKey: existingRun.run.metadata?.sessionKey ?? '',\n };\n }\n\n const runId = randomUUID();\n const goal = params.goal ?? '';\n const projectId =\n params.projectId?.trim() ||\n (params.goalId ? new GoalService().get(params.goalId)?.projectId : undefined) ||\n (params.parentSessionKey?.trim()\n ? (await this.options.service.sessionIndexInstance.getStore().getMetadata(params.parentSessionKey.trim()))?.projectId\n : undefined);\n const { sessionKey } = await this.options.sessionBridge.prepareRunSession({\n runId,\n agentId: params.agentId,\n definitionId: params.definitionId,\n definitionTitle: definition.title,\n goal,\n parentSessionKey: params.parentSessionKey,\n projectId,\n });\n const source = normalizeWorkflowRunSourceForSession(params.source, sessionKey, params.parentSessionKey);\n const abortController = new AbortController();\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, params.agentId);\n const runStore = new WorkflowRunStore(this.options.service.currentConfig, params.agentId, eventStore);\n const engine = this.createWorkflowEngine({\n eventStore,\n runStore,\n sessionKey,\n });\n const limits = resolveWorkflowRunLimits({\n config: this.options.service.currentConfig,\n definition,\n concurrency: params.concurrency,\n maxSubagents: params.maxSubagents,\n });\n\n this.activeRuns.set(runId, abortController);\n const timeoutHandle = setTimeout(() => {\n abortController.abort(new Error(`workflow timed out after ${limits.timeoutSec}s`));\n }, limits.timeoutSec * 1000);\n this.timeoutHandles.set(runId, timeoutHandle);\n void engine.startRun(definition, {\n runId,\n input: inputEnvelope.payload,\n goal: inputEnvelope.goal ?? params.goal,\n source,\n metadata: buildWorkflowRunMetadata({\n definition,\n agentId: params.agentId,\n goalId: params.goalId,\n projectId,\n sessionKey,\n source,\n input: inputEnvelope,\n retryOfRunId: params.retryOfRunId,\n idempotencyKey: params.idempotencyKey,\n }),\n signal: abortController.signal,\n concurrency: limits.concurrency,\n maxSubagents: limits.maxSubagents,\n tokenBudget: params.tokenBudget,\n timeoutSec: limits.timeoutSec,\n }).catch((err) => {\n this.options.service.emit('workflow.run.error', {\n runId,\n error: err instanceof Error ? err.message : String(err),\n });\n }).finally(() => {\n this.activeRuns.delete(runId);\n const handle = this.timeoutHandles.get(runId);\n if (handle) clearTimeout(handle);\n this.timeoutHandles.delete(runId);\n });\n\n return { ok: true, runId, sessionKey };\n }\n\n async retryWorkflowRun(params: RetryWorkflowRunServiceParams): Promise<WorkflowRunServiceResult> {\n const runStore = this.createRunStore(params.agentId);\n const existing = await runStore.readRunView(params.runId);\n if (!existing) {\n return {\n ok: false,\n code: 'run_not_found',\n message: 'Workflow run not found',\n httpStatus: 404,\n };\n }\n\n const parentSessionKey =\n existing.run.source.kind === 'chat' ? existing.run.source.sessionKey : undefined;\n const projectId = params.projectId?.trim() || existing.run.metadata?.projectId;\n\n return this.startWorkflowRun({\n agentId: params.agentId,\n definitionId: existing.run.definitionId,\n goalId: existing.run.metadata?.goalId,\n projectId,\n input: existing.run.metadata?.input ? undefined : existing.run.input,\n inputEnvelope: existing.run.metadata?.input,\n goal: existing.run.goal,\n source: existing.run.source,\n parentSessionKey,\n retryOfRunId: existing.run.id,\n });\n }\n\n async replayWorkflowRun(params: ReplayWorkflowRunServiceParams): Promise<WorkflowRunServiceResult> {\n const runStore = this.createRunStore(params.agentId);\n const existing = await runStore.readRunView(params.runId);\n if (!existing) {\n return {\n ok: false,\n code: 'run_not_found',\n message: 'Workflow run not found',\n httpStatus: 404,\n };\n }\n\n const definition = await this.loadDefinition(existing.run.definitionId);\n if (!definition) {\n return {\n ok: false,\n code: 'definition_not_found',\n message: 'Workflow definition not found',\n httpStatus: 404,\n };\n }\n\n const targets = resolveWorkflowReplayTargets(existing, params.scope);\n if (targets.targets.length === 0) {\n return {\n ok: false,\n code: 'invalid_state',\n message: params.scope === 'failed_phases'\n ? 'No failed workflow phase is available to replay'\n : 'No failed workflow agent is available to replay',\n httpStatus: 409,\n };\n }\n\n const replayRunId = randomUUID();\n const goal = buildReplayGoal(existing, params.scope, targets.targets.length);\n const parentSessionKey =\n existing.run.source.kind === 'chat' ? existing.run.source.sessionKey : undefined;\n const projectId = existing.run.metadata?.projectId;\n const { sessionKey } = await this.options.sessionBridge.prepareRunSession({\n runId: replayRunId,\n agentId: params.agentId,\n definitionId: existing.run.definitionId,\n definitionTitle: `${definition.title} replay`,\n goal,\n parentSessionKey,\n projectId,\n });\n const source = normalizeWorkflowRunSourceForSession(existing.run.source, sessionKey, parentSessionKey);\n const abortController = new AbortController();\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, params.agentId);\n const replayRunStore = new WorkflowRunStore(this.options.service.currentConfig, params.agentId, eventStore);\n const engine = this.createWorkflowEngine({\n eventStore,\n runStore: replayRunStore,\n sessionKey,\n });\n const limits = resolveWorkflowRunLimits({\n config: this.options.service.currentConfig,\n definition,\n });\n const inputEnvelope = existing.run.metadata?.input ?? buildWorkflowRunInputEnvelope(existing.run.input, existing.run.goal);\n\n this.activeRuns.set(replayRunId, abortController);\n const timeoutHandle = setTimeout(() => {\n abortController.abort(new Error(`workflow timed out after ${limits.timeoutSec}s`));\n }, limits.timeoutSec * 1000);\n this.timeoutHandles.set(replayRunId, timeoutHandle);\n void engine.startReplayRun(definition, {\n runId: replayRunId,\n input: inputEnvelope.payload,\n goal,\n source,\n metadata: buildWorkflowRunMetadata({\n definition,\n agentId: params.agentId,\n goalId: existing.run.metadata?.goalId,\n projectId,\n sessionKey,\n source,\n input: inputEnvelope,\n retryOfRunId: existing.run.id,\n replay: {\n sourceRunId: existing.run.id,\n scope: params.scope,\n phaseIds: targets.phaseIds,\n agentIds: targets.targets.map((target) => target.agentId),\n targetCount: targets.targets.length,\n createdAtMs: Date.now(),\n },\n }),\n signal: abortController.signal,\n concurrency: limits.concurrency,\n maxSubagents: limits.maxSubagents,\n timeoutSec: limits.timeoutSec,\n sourceRunId: existing.run.id,\n replayScope: params.scope,\n targets: targets.targets,\n }).catch((err) => {\n this.options.service.emit('workflow.run.error', {\n runId: replayRunId,\n error: err instanceof Error ? err.message : String(err),\n });\n }).finally(() => {\n this.activeRuns.delete(replayRunId);\n const handle = this.timeoutHandles.get(replayRunId);\n if (handle) clearTimeout(handle);\n this.timeoutHandles.delete(replayRunId);\n });\n\n return { ok: true, runId: replayRunId, sessionKey };\n }\n\n async cancelWorkflowRun(params: CancelWorkflowRunServiceParams): Promise<CancelWorkflowRunResult> {\n const controller = this.activeRuns.get(params.runId);\n if (controller) {\n controller.abort();\n this.activeRuns.delete(params.runId);\n const handle = this.timeoutHandles.get(params.runId);\n if (handle) clearTimeout(handle);\n this.timeoutHandles.delete(params.runId);\n return { ok: true, cancelled: true };\n }\n\n const runStore = this.createRunStore(params.agentId);\n const view = await runStore.readRunView(params.runId);\n if (!view) {\n return {\n ok: false,\n code: 'run_not_found',\n message: 'Workflow run not found',\n httpStatus: 404,\n };\n }\n\n if (isTerminalWorkflowRunStatus(view.run.status)) {\n return { ok: true, cancelled: true, alreadyFinished: true };\n }\n\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, params.agentId);\n await eventStore.append({\n runId: params.runId,\n type: 'run_cancelled',\n payload: { reason: params.reason ?? 'Cancelled by user' },\n });\n const updated = await runStore.rebuildRunView(params.runId);\n if (updated) {\n this.options.service.emit('workflow.run.updated', { runId: params.runId, view: updated });\n void this.options.sessionBridge.handleRunViewUpdated(updated);\n }\n return { ok: true, cancelled: true };\n }\n\n createRunStore(agentId: string): WorkflowRunStore {\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, agentId);\n return new WorkflowRunStore(this.options.service.currentConfig, agentId, eventStore);\n }\n\n async readWorkflowRunView(agentId: string, runId: string) {\n return this.createRunStore(agentId).readRunView(runId);\n }\n\n async reconcileInterruptedRuns(agentId: string): Promise<number> {\n const runStore = this.createRunStore(agentId);\n const summaries = await runStore.listRunSummaries(500);\n let reconciled = 0;\n\n for (const summary of summaries) {\n if (isTerminalWorkflowRunStatus(summary.status) || this.activeRuns.has(summary.id)) {\n continue;\n }\n\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, agentId);\n await eventStore.append({\n runId: summary.id,\n type: 'run_failed',\n payload: {\n error: {\n code: 'runtime_error',\n message: 'Workflow run interrupted by gateway restart',\n recoverable: true,\n },\n },\n });\n const updated = await runStore.rebuildRunView(summary.id);\n if (updated) {\n this.options.service.emit('workflow.run.updated', { runId: summary.id, view: updated });\n void this.options.sessionBridge.handleRunViewUpdated(updated);\n }\n reconciled += 1;\n }\n\n return reconciled;\n }\n\n private loadDefinition(definitionId: string): Promise<WorkflowDefinition | null> {\n return this.definitionRegistry.get(definitionId);\n }\n\n private async findRunByIdempotencyKey(agentId: string, idempotencyKey: string) {\n const runStore = this.createRunStore(agentId);\n const summaries = await runStore.listRunSummaries(500);\n for (const summary of summaries) {\n if (summary.metadata?.correlation?.idempotencyKey !== idempotencyKey) {\n continue;\n }\n return runStore.readRunView(summary.id);\n }\n return null;\n }\n\n private createWorkflowEngine(params: {\n eventStore: WorkflowEventStore;\n runStore: WorkflowRunStore;\n sessionKey: string;\n }): WorkflowEngine {\n const gatewayService = this.options.service;\n const runner = new DelegateSubagentRunner({\n workspace: gatewayService.currentWorkspacePath,\n bus: gatewayService.messageBusInstance,\n getDefaultModel: () => resolveModelById(gatewayService.agentService.getModelForSession(params.sessionKey)),\n getConfig: () => gatewayService.currentConfig,\n sessionStore: gatewayService.sessionIndexInstance.getStore(),\n buildChildTools: (childOptions) => this.options.buildChildTools(childOptions),\n });\n\n return new WorkflowEngine({\n cwd: gatewayService.currentWorkspacePath,\n eventStore: params.eventStore,\n runStore: params.runStore,\n runner,\n resolveModelId: (modelId) => {\n const agentId = extractProfileAgentId(params.sessionKey, gatewayService.currentConfig);\n return resolveModelById(resolveModelRef(gatewayService.currentConfig, agentId, modelId));\n },\n parentSessionKey: params.sessionKey,\n subagentSessionKeyFactory: ({ runId, agentId }) => {\n const profileAgentId = extractProfileAgentId(params.sessionKey, gatewayService.currentConfig);\n return `agent:${profileAgentId}:workflow:${runId}:subagent:${agentId}`;\n },\n onEventAppended: (event) => {\n gatewayService.emit('workflow.event.appended', { runId: event.runId, event });\n },\n onRunViewUpdated: (view) => {\n gatewayService.emit('workflow.run.updated', { runId: view.run.id, view });\n this.publishTerminalWorkflowAutomationEvent(view);\n void this.options.sessionBridge.handleRunViewUpdated(view);\n },\n });\n }\n\n private publishTerminalWorkflowAutomationEvent(view: WorkflowRunView): void {\n if (!isTerminalWorkflowRunStatus(view.run.status)) return;\n if (this.emittedTerminalAutomationEvents.has(view.run.id)) return;\n this.emittedTerminalAutomationEvents.add(view.run.id);\n publishAutomationProductEvent({\n type: 'workflow.run.completed',\n source: 'workflows',\n payload: {\n runId: view.run.id,\n status: view.run.status,\n definitionId: view.run.definitionId,\n title: view.run.title,\n sessionKey: view.run.metadata?.sessionKey,\n sourceKind: view.run.source.kind,\n },\n occurredAtMs: view.run.completedAtMs ?? Date.now(),\n });\n }\n}\n\nfunction normalizeWorkflowRunSourceForSession(\n source: WorkflowRunSource,\n workflowSessionKey: string,\n parentSessionKey?: string,\n): WorkflowRunSource {\n if (parentSessionKey?.trim()) {\n return { kind: 'chat', sessionKey: parentSessionKey.trim() };\n }\n if (source.kind === 'webui') {\n return { ...source, sessionKey: workflowSessionKey };\n }\n if (source.kind === 'chat') {\n return source;\n }\n return source;\n}\n\nexport function buildWorkflowRunInputEnvelope(input: unknown, goal?: string): WorkflowRunInputEnvelope {\n if (isWorkflowRunInputEnvelope(input)) {\n return input;\n }\n return {\n payload: input ?? {},\n goal,\n };\n}\n\nexport function buildWorkflowRunMetadata(params: {\n definition: WorkflowDefinition;\n agentId: string;\n goalId?: string;\n projectId?: string;\n sessionKey: string;\n source: WorkflowRunSource;\n input: WorkflowRunInputEnvelope;\n retryOfRunId?: string;\n idempotencyKey?: string;\n replay?: WorkflowRunReplayMetadata;\n}): WorkflowRunMetadata {\n const goalId = params.goalId?.trim() || undefined;\n const projectId = params.projectId?.trim() || undefined;\n return {\n sessionKey: params.sessionKey,\n triggerSource: params.source.kind,\n agentId: params.agentId,\n projectId,\n retryOfRunId: params.retryOfRunId,\n replay: params.replay,\n definition: buildWorkflowRunDefinitionSnapshot(params.definition),\n input: params.input,\n correlation: {\n idempotencyKey: params.idempotencyKey,\n },\n origin: buildWorkflowRunOrigin(params.source),\n schedule: params.source.kind === 'automation'\n ? { automationId: params.source.automationId, runId: params.source.runId, scheduledAtMs: params.source.scheduledAtMs }\n : undefined,\n goalId,\n };\n}\n\nexport function resolveWorkflowReplayTargets(\n view: WorkflowRunView,\n scope: WorkflowRunReplayScope,\n): { targets: WorkflowReplayAgentTarget[]; phaseIds?: string[] } {\n const phaseTitleById = new Map(view.phases.map((phase) => [phase.id, phase.title]));\n const failedStatuses = new Set(['error', 'skipped']);\n\n if (scope === 'failed_agents') {\n return {\n targets: view.agents\n .filter((agent) => failedStatuses.has(agent.status) && workflowAgentReplayPrompt(agent))\n .map((agent) => ({\n agentId: agent.id,\n label: agent.label,\n phaseId: agent.phaseId,\n phaseTitle: agent.phaseId ? phaseTitleById.get(agent.phaseId) : undefined,\n prompt: workflowAgentReplayPrompt(agent) ?? '',\n invocation: agent.invocation,\n })),\n };\n }\n\n const failedPhaseIds = view.phases\n .filter((phase) => phase.status === 'failed')\n .map((phase) => phase.id);\n const phaseIds = failedPhaseIds.length > 0\n ? failedPhaseIds\n : [...new Set(view.agents.filter((agent) => failedStatuses.has(agent.status) && agent.phaseId).map((agent) => agent.phaseId as string))];\n const phaseIdSet = new Set(phaseIds);\n\n return {\n phaseIds,\n targets: view.agents\n .filter((agent) => agent.phaseId && phaseIdSet.has(agent.phaseId) && workflowAgentReplayPrompt(agent))\n .map((agent) => ({\n agentId: agent.id,\n label: agent.label,\n phaseId: agent.phaseId,\n phaseTitle: agent.phaseId ? phaseTitleById.get(agent.phaseId) : undefined,\n prompt: workflowAgentReplayPrompt(agent) ?? '',\n invocation: agent.invocation,\n })),\n };\n}\n\nfunction workflowAgentReplayPrompt(agent: WorkflowRunView['agents'][number]): string | undefined {\n const invocationPrompt = agent.invocation?.prompt?.trim();\n if (invocationPrompt) return invocationPrompt;\n const prompt = agent.prompt?.trim();\n return prompt || undefined;\n}\n\nexport function buildWorkflowRunDefinitionSnapshot(definition: WorkflowDefinition): WorkflowRunDefinitionSnapshot {\n const snapshot: WorkflowRunDefinitionSnapshot = {\n id: definition.id,\n name: definition.name,\n title: definition.title,\n version: definition.version,\n source: definition.metadata.source,\n tags: [...definition.metadata.tags],\n phaseCount: definition.phases.length,\n defaults: { ...definition.defaults },\n estimatedAgents: definition.metadata.estimatedAgents,\n };\n if (definition.contentHash) snapshot.contentHash = definition.contentHash;\n if (definition.runtimeHash) snapshot.runtimeHash = definition.runtimeHash;\n if (definition.permissions) snapshot.permissions = structuredClone(definition.permissions);\n if (definition.resources) snapshot.resources = structuredClone(definition.resources);\n return snapshot;\n}\n\nfunction resolveWorkflowRunLimits(params: {\n config: import('../../config/schema.js').Config;\n definition: WorkflowDefinition;\n concurrency?: number;\n maxSubagents?: number;\n}): { concurrency: number; maxSubagents: number; timeoutSec: number } {\n const configuredMaxConcurrency = normalizePositiveInt(\n undefined,\n params.definition.defaults.concurrency,\n );\n const configuredMaxSubagents = normalizePositiveInt(\n undefined,\n params.definition.defaults.maxSubagents,\n );\n const configuredTimeoutSec = normalizePositiveInt(\n undefined,\n params.definition.defaults.timeoutSec,\n );\n\n return {\n concurrency: Math.max(\n 1,\n Math.min(\n normalizePositiveInt(params.concurrency, params.definition.defaults.concurrency),\n configuredMaxConcurrency,\n ),\n ),\n maxSubagents: Math.max(\n 1,\n Math.min(\n normalizePositiveInt(params.maxSubagents, params.definition.defaults.maxSubagents),\n configuredMaxSubagents,\n ),\n ),\n timeoutSec: Math.max(1, Math.min(params.definition.defaults.timeoutSec, configuredTimeoutSec)),\n };\n}\n\nfunction normalizePositiveInt(value: number | undefined, fallback: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 1) {\n return fallback;\n }\n return Math.floor(value);\n}\n\nfunction buildReplayGoal(view: WorkflowRunView, scope: WorkflowRunReplayScope, targetCount: number): string {\n const scopeLabel = scope === 'failed_phases' ? 'failed phase' : 'failed agent';\n return `Replay ${targetCount} ${scopeLabel}${targetCount === 1 ? '' : 's'} from workflow run ${view.run.id}: ${view.run.goal}`;\n}\n\nexport function extractWorkflowRunSessionKey(source: WorkflowRunSource): string | null {\n if ('sessionKey' in source && typeof source.sessionKey === 'string' && source.sessionKey.trim()) {\n return source.sessionKey.trim();\n }\n return null;\n}\n\nfunction buildWorkflowRunOrigin(source: WorkflowRunSource): WorkflowRunMetadata['origin'] {\n switch (source.kind) {\n case 'chat':\n return { channel: 'chat', sessionKey: source.sessionKey, messageId: source.messageId };\n case 'webui':\n return { channel: 'webui', sessionKey: source.sessionKey };\n case 'automation':\n return { channel: 'automation', automationId: source.automationId, runId: source.runId };\n case 'api':\n return { channel: 'api', requestId: source.requestId };\n case 'im':\n return { channel: source.channel, chatId: source.chatId, messageId: source.messageId };\n }\n}\n\nfunction isWorkflowRunInputEnvelope(input: unknown): input is WorkflowRunInputEnvelope {\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return false;\n }\n return 'payload' in input || 'variables' in input || 'context' in input;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"workflow-run-service.js","names":["resolveModelById"],"sources":["../../../../src/workflows/service/workflow-run-service.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\n\nimport type { BuildChildToolsOptions } from '../../agent/child-agent-factory.js';\nimport { publishAutomationProductEvent } from '../../automations/product-events.js';\nimport { extractProfileAgentId } from '../../config/agent-profile.js';\nimport { resolveModelRef } from '../../config/agent-typed-models.js';\nimport type { GatewayWorkflowHost } from '../../gateway/gateway-workflow-host.types.js';\nimport { GoalService } from '../../goals/index.js';\nimport { resolveModel as resolveModelById } from '../../providers/index.js';\nimport { DelegateSubagentRunner } from '../../agent/workflow/subagent-runner.js';\nimport { CatalogWorkflowDefinitionRegistry } from '../registry/catalog-workflow-definition-registry.js';\nimport type { WorkflowDefinitionRegistry } from '../registry/workflow-definition-registry.js';\nimport { validateWorkflowJsonSchema } from '../domain/schema-validation.js';\nimport type {\n WorkflowDefinition,\n WorkflowRunDefinitionSnapshot,\n WorkflowRunInputEnvelope,\n WorkflowRunMetadata,\n WorkflowRunSource,\n} from '../domain/index.js';\nimport { isTerminalWorkflowRunStatus } from '../domain/index.js';\nimport { WorkflowEngine } from '../engine/index.js';\nimport { WorkflowEventStore } from '../store/event-store.js';\nimport { WorkflowRunStore } from '../store/run-store.js';\nimport type { WorkflowSessionBridge } from './workflow-session-bridge.js';\nexport type {\n CancelWorkflowRunResult,\n CancelWorkflowRunServiceParams,\n CancelWorkflowRunServiceResult,\n ReplayWorkflowRunServiceParams,\n RetryWorkflowRunServiceParams,\n StartWorkflowRunServiceParams,\n StartWorkflowRunServiceResult,\n WorkflowRunServiceErrorCode,\n WorkflowRunServiceErrorResult,\n WorkflowRunServiceResult,\n} from './workflow-run-service.types.js';\n\nimport type {\n CancelWorkflowRunResult,\n CancelWorkflowRunServiceParams,\n ReplayWorkflowRunServiceParams,\n RetryWorkflowRunServiceParams,\n StartWorkflowRunServiceParams,\n WorkflowRunServiceResult,\n} from './workflow-run-service.types.js';\nimport type { WorkflowRunReplayMetadata, WorkflowRunReplayScope, WorkflowRunView } from '../domain/run.js';\nimport type { WorkflowReplayAgentTarget } from '../engine/index.js';\n\nexport interface WorkflowRunServiceOptions {\n service: GatewayWorkflowHost;\n sessionBridge: WorkflowSessionBridge;\n buildChildTools: (childOptions: BuildChildToolsOptions) => AgentTool<any, any>[];\n definitionRegistry?: WorkflowDefinitionRegistry;\n}\n\nexport class WorkflowRunService {\n private readonly activeRuns = new Map<string, AbortController>();\n private readonly timeoutHandles = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly definitionRegistry: WorkflowDefinitionRegistry;\n private readonly emittedTerminalAutomationEvents = new Set<string>();\n\n constructor(private readonly options: WorkflowRunServiceOptions) {\n this.definitionRegistry = options.definitionRegistry ?? new CatalogWorkflowDefinitionRegistry();\n }\n\n async startWorkflowRun(params: StartWorkflowRunServiceParams): Promise<WorkflowRunServiceResult> {\n const definition = await this.loadDefinition(params.definitionId);\n if (!definition) {\n return {\n ok: false,\n code: 'definition_not_found',\n message: 'Workflow definition not found',\n httpStatus: 404,\n };\n }\n\n const inputEnvelope = params.inputEnvelope ?? buildWorkflowRunInputEnvelope(params.input, params.goal);\n const inputValidation = validateWorkflowJsonSchema(definition.inputSchema, inputEnvelope.payload);\n if (!inputValidation.ok) {\n return {\n ok: false,\n code: 'invalid_input',\n message: inputValidation.message ?? 'Workflow input did not match input schema',\n httpStatus: 400,\n };\n }\n\n const existingRun = params.idempotencyKey\n ? await this.findRunByIdempotencyKey(params.agentId, params.idempotencyKey)\n : null;\n if (existingRun) {\n return {\n ok: true,\n runId: existingRun.run.id,\n sessionKey: existingRun.run.metadata?.sessionKey ?? '',\n };\n }\n\n const runId = randomUUID();\n const goal = params.goal ?? '';\n const projectId =\n params.projectId?.trim() ||\n (params.goalId ? new GoalService().get(params.goalId)?.projectId : undefined) ||\n (params.parentSessionKey?.trim()\n ? (await this.options.service.sessionIndexInstance.getStore().getMetadata(params.parentSessionKey.trim()))?.projectId\n : undefined);\n const { sessionKey } = await this.options.sessionBridge.prepareRunSession({\n runId,\n agentId: params.agentId,\n definitionId: params.definitionId,\n definitionTitle: definition.title,\n goal,\n parentSessionKey: params.parentSessionKey,\n projectId,\n });\n const source = normalizeWorkflowRunSourceForSession(params.source, sessionKey, params.parentSessionKey);\n const abortController = new AbortController();\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, params.agentId);\n const runStore = new WorkflowRunStore(this.options.service.currentConfig, params.agentId, eventStore);\n const engine = this.createWorkflowEngine({\n eventStore,\n runStore,\n sessionKey,\n });\n const limits = resolveWorkflowRunLimits({\n config: this.options.service.currentConfig,\n definition,\n concurrency: params.concurrency,\n maxSubagents: params.maxSubagents,\n });\n\n this.activeRuns.set(runId, abortController);\n const timeoutHandle = setTimeout(() => {\n abortController.abort(new Error(`workflow timed out after ${limits.timeoutSec}s`));\n }, limits.timeoutSec * 1000);\n this.timeoutHandles.set(runId, timeoutHandle);\n void engine.startRun(definition, {\n runId,\n input: inputEnvelope.payload,\n goal: inputEnvelope.goal ?? params.goal,\n source,\n metadata: buildWorkflowRunMetadata({\n definition,\n agentId: params.agentId,\n goalId: params.goalId,\n projectId,\n sessionKey,\n source,\n input: inputEnvelope,\n retryOfRunId: params.retryOfRunId,\n idempotencyKey: params.idempotencyKey,\n }),\n signal: abortController.signal,\n concurrency: limits.concurrency,\n maxSubagents: limits.maxSubagents,\n tokenBudget: params.tokenBudget,\n timeoutSec: limits.timeoutSec,\n }).catch((err) => {\n this.options.service.emit('workflow.run.error', {\n runId,\n error: err instanceof Error ? err.message : String(err),\n });\n }).finally(() => {\n this.activeRuns.delete(runId);\n const handle = this.timeoutHandles.get(runId);\n if (handle) clearTimeout(handle);\n this.timeoutHandles.delete(runId);\n });\n\n return { ok: true, runId, sessionKey };\n }\n\n async retryWorkflowRun(params: RetryWorkflowRunServiceParams): Promise<WorkflowRunServiceResult> {\n const runStore = this.createRunStore(params.agentId);\n const existing = await runStore.readRunView(params.runId);\n if (!existing) {\n return {\n ok: false,\n code: 'run_not_found',\n message: 'Workflow run not found',\n httpStatus: 404,\n };\n }\n\n const parentSessionKey =\n existing.run.source.kind === 'chat' ? existing.run.source.sessionKey : undefined;\n const projectId = params.projectId?.trim() || existing.run.metadata?.projectId;\n\n return this.startWorkflowRun({\n agentId: params.agentId,\n definitionId: existing.run.definitionId,\n goalId: existing.run.metadata?.goalId,\n projectId,\n input: existing.run.metadata?.input ? undefined : existing.run.input,\n inputEnvelope: existing.run.metadata?.input,\n goal: existing.run.goal,\n source: existing.run.source,\n parentSessionKey,\n retryOfRunId: existing.run.id,\n });\n }\n\n async replayWorkflowRun(params: ReplayWorkflowRunServiceParams): Promise<WorkflowRunServiceResult> {\n const runStore = this.createRunStore(params.agentId);\n const existing = await runStore.readRunView(params.runId);\n if (!existing) {\n return {\n ok: false,\n code: 'run_not_found',\n message: 'Workflow run not found',\n httpStatus: 404,\n };\n }\n\n const definition = await this.loadDefinition(existing.run.definitionId);\n if (!definition) {\n return {\n ok: false,\n code: 'definition_not_found',\n message: 'Workflow definition not found',\n httpStatus: 404,\n };\n }\n\n const targets = resolveWorkflowReplayTargets(existing, params.scope);\n if (targets.targets.length === 0) {\n return {\n ok: false,\n code: 'invalid_state',\n message: params.scope === 'failed_phases'\n ? 'No failed workflow phase is available to replay'\n : 'No failed workflow agent is available to replay',\n httpStatus: 409,\n };\n }\n\n const replayRunId = randomUUID();\n const goal = buildReplayGoal(existing, params.scope, targets.targets.length);\n const parentSessionKey =\n existing.run.source.kind === 'chat' ? existing.run.source.sessionKey : undefined;\n const projectId = existing.run.metadata?.projectId;\n const { sessionKey } = await this.options.sessionBridge.prepareRunSession({\n runId: replayRunId,\n agentId: params.agentId,\n definitionId: existing.run.definitionId,\n definitionTitle: `${definition.title} replay`,\n goal,\n parentSessionKey,\n projectId,\n });\n const source = normalizeWorkflowRunSourceForSession(existing.run.source, sessionKey, parentSessionKey);\n const abortController = new AbortController();\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, params.agentId);\n const replayRunStore = new WorkflowRunStore(this.options.service.currentConfig, params.agentId, eventStore);\n const engine = this.createWorkflowEngine({\n eventStore,\n runStore: replayRunStore,\n sessionKey,\n });\n const limits = resolveWorkflowRunLimits({\n config: this.options.service.currentConfig,\n definition,\n });\n const inputEnvelope = existing.run.metadata?.input ?? buildWorkflowRunInputEnvelope(existing.run.input, existing.run.goal);\n\n this.activeRuns.set(replayRunId, abortController);\n const timeoutHandle = setTimeout(() => {\n abortController.abort(new Error(`workflow timed out after ${limits.timeoutSec}s`));\n }, limits.timeoutSec * 1000);\n this.timeoutHandles.set(replayRunId, timeoutHandle);\n void engine.startReplayRun(definition, {\n runId: replayRunId,\n input: inputEnvelope.payload,\n goal,\n source,\n metadata: buildWorkflowRunMetadata({\n definition,\n agentId: params.agentId,\n goalId: existing.run.metadata?.goalId,\n projectId,\n sessionKey,\n source,\n input: inputEnvelope,\n retryOfRunId: existing.run.id,\n replay: {\n sourceRunId: existing.run.id,\n scope: params.scope,\n phaseIds: targets.phaseIds,\n agentIds: targets.targets.map((target) => target.agentId),\n targetCount: targets.targets.length,\n createdAtMs: Date.now(),\n },\n }),\n signal: abortController.signal,\n concurrency: limits.concurrency,\n maxSubagents: limits.maxSubagents,\n timeoutSec: limits.timeoutSec,\n sourceRunId: existing.run.id,\n replayScope: params.scope,\n targets: targets.targets,\n }).catch((err) => {\n this.options.service.emit('workflow.run.error', {\n runId: replayRunId,\n error: err instanceof Error ? err.message : String(err),\n });\n }).finally(() => {\n this.activeRuns.delete(replayRunId);\n const handle = this.timeoutHandles.get(replayRunId);\n if (handle) clearTimeout(handle);\n this.timeoutHandles.delete(replayRunId);\n });\n\n return { ok: true, runId: replayRunId, sessionKey };\n }\n\n async cancelWorkflowRun(params: CancelWorkflowRunServiceParams): Promise<CancelWorkflowRunResult> {\n const controller = this.activeRuns.get(params.runId);\n if (controller) {\n controller.abort();\n this.activeRuns.delete(params.runId);\n const handle = this.timeoutHandles.get(params.runId);\n if (handle) clearTimeout(handle);\n this.timeoutHandles.delete(params.runId);\n return { ok: true, cancelled: true };\n }\n\n const runStore = this.createRunStore(params.agentId);\n const view = await runStore.readRunView(params.runId);\n if (!view) {\n return {\n ok: false,\n code: 'run_not_found',\n message: 'Workflow run not found',\n httpStatus: 404,\n };\n }\n\n if (isTerminalWorkflowRunStatus(view.run.status)) {\n return { ok: true, cancelled: true, alreadyFinished: true };\n }\n\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, params.agentId);\n await eventStore.append({\n runId: params.runId,\n type: 'run_cancelled',\n payload: { reason: params.reason ?? 'Cancelled by user' },\n });\n const updated = await runStore.rebuildRunView(params.runId);\n if (updated) {\n this.options.service.emit('workflow.run.updated', { runId: params.runId, view: updated });\n void this.options.sessionBridge.handleRunViewUpdated(updated);\n }\n return { ok: true, cancelled: true };\n }\n\n createRunStore(agentId: string): WorkflowRunStore {\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, agentId);\n return new WorkflowRunStore(this.options.service.currentConfig, agentId, eventStore);\n }\n\n async readWorkflowRunView(agentId: string, runId: string) {\n return this.createRunStore(agentId).readRunView(runId);\n }\n\n async reconcileInterruptedRuns(agentId: string): Promise<number> {\n const runStore = this.createRunStore(agentId);\n const summaries = await runStore.listRunSummaries(500);\n let reconciled = 0;\n\n for (const summary of summaries) {\n if (isTerminalWorkflowRunStatus(summary.status) || this.activeRuns.has(summary.id)) {\n continue;\n }\n\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, agentId);\n await eventStore.append({\n runId: summary.id,\n type: 'run_failed',\n payload: {\n error: {\n code: 'runtime_error',\n message: 'Workflow run interrupted by gateway restart',\n recoverable: true,\n },\n },\n });\n const updated = await runStore.rebuildRunView(summary.id);\n if (updated) {\n this.options.service.emit('workflow.run.updated', { runId: summary.id, view: updated });\n void this.options.sessionBridge.handleRunViewUpdated(updated);\n }\n reconciled += 1;\n }\n\n return reconciled;\n }\n\n private loadDefinition(definitionId: string): Promise<WorkflowDefinition | null> {\n return this.definitionRegistry.get(definitionId);\n }\n\n private async findRunByIdempotencyKey(agentId: string, idempotencyKey: string) {\n const runStore = this.createRunStore(agentId);\n const summaries = await runStore.listRunSummaries(500);\n for (const summary of summaries) {\n if (summary.metadata?.correlation?.idempotencyKey !== idempotencyKey) {\n continue;\n }\n return runStore.readRunView(summary.id);\n }\n return null;\n }\n\n private createWorkflowEngine(params: {\n eventStore: WorkflowEventStore;\n runStore: WorkflowRunStore;\n sessionKey: string;\n }): WorkflowEngine {\n const gatewayService = this.options.service;\n const profileAgentId = extractProfileAgentId(params.sessionKey, gatewayService.currentConfig);\n const runner = new DelegateSubagentRunner({\n workspace: gatewayService.currentWorkspacePath,\n bus: gatewayService.messageBusInstance,\n agentId: profileAgentId,\n getDefaultModel: () => resolveModelById(gatewayService.agentService.getModelForSession(params.sessionKey)),\n getConfig: () => gatewayService.currentConfig,\n sessionStore: gatewayService.sessionIndexInstance.getStore(),\n buildChildTools: (childOptions) => this.options.buildChildTools(childOptions),\n });\n\n return new WorkflowEngine({\n cwd: gatewayService.currentWorkspacePath,\n eventStore: params.eventStore,\n runStore: params.runStore,\n runner,\n resolveModelId: (modelId) => {\n return resolveModelById(resolveModelRef(gatewayService.currentConfig, profileAgentId, modelId));\n },\n parentSessionKey: params.sessionKey,\n subagentSessionKeyFactory: ({ runId, agentId }) => {\n return `agent:${profileAgentId}:workflow:${runId}:subagent:${agentId}`;\n },\n onEventAppended: (event) => {\n gatewayService.emit('workflow.event.appended', { runId: event.runId, event });\n },\n onRunViewUpdated: (view) => {\n gatewayService.emit('workflow.run.updated', { runId: view.run.id, view });\n this.publishTerminalWorkflowAutomationEvent(view);\n void this.options.sessionBridge.handleRunViewUpdated(view);\n },\n });\n }\n\n private publishTerminalWorkflowAutomationEvent(view: WorkflowRunView): void {\n if (!isTerminalWorkflowRunStatus(view.run.status)) return;\n if (this.emittedTerminalAutomationEvents.has(view.run.id)) return;\n this.emittedTerminalAutomationEvents.add(view.run.id);\n publishAutomationProductEvent({\n type: 'workflow.run.completed',\n source: 'workflows',\n payload: {\n runId: view.run.id,\n status: view.run.status,\n definitionId: view.run.definitionId,\n title: view.run.title,\n sessionKey: view.run.metadata?.sessionKey,\n sourceKind: view.run.source.kind,\n },\n occurredAtMs: view.run.completedAtMs ?? Date.now(),\n });\n }\n}\n\nfunction normalizeWorkflowRunSourceForSession(\n source: WorkflowRunSource,\n workflowSessionKey: string,\n parentSessionKey?: string,\n): WorkflowRunSource {\n if (parentSessionKey?.trim()) {\n return { kind: 'chat', sessionKey: parentSessionKey.trim() };\n }\n if (source.kind === 'webui') {\n return { ...source, sessionKey: workflowSessionKey };\n }\n if (source.kind === 'chat') {\n return source;\n }\n return source;\n}\n\nexport function buildWorkflowRunInputEnvelope(input: unknown, goal?: string): WorkflowRunInputEnvelope {\n if (isWorkflowRunInputEnvelope(input)) {\n return input;\n }\n return {\n payload: input ?? {},\n goal,\n };\n}\n\nexport function buildWorkflowRunMetadata(params: {\n definition: WorkflowDefinition;\n agentId: string;\n goalId?: string;\n projectId?: string;\n sessionKey: string;\n source: WorkflowRunSource;\n input: WorkflowRunInputEnvelope;\n retryOfRunId?: string;\n idempotencyKey?: string;\n replay?: WorkflowRunReplayMetadata;\n}): WorkflowRunMetadata {\n const goalId = params.goalId?.trim() || undefined;\n const projectId = params.projectId?.trim() || undefined;\n return {\n sessionKey: params.sessionKey,\n triggerSource: params.source.kind,\n agentId: params.agentId,\n projectId,\n retryOfRunId: params.retryOfRunId,\n replay: params.replay,\n definition: buildWorkflowRunDefinitionSnapshot(params.definition),\n input: params.input,\n correlation: {\n idempotencyKey: params.idempotencyKey,\n },\n origin: buildWorkflowRunOrigin(params.source),\n schedule: params.source.kind === 'automation'\n ? { automationId: params.source.automationId, runId: params.source.runId, scheduledAtMs: params.source.scheduledAtMs }\n : undefined,\n goalId,\n };\n}\n\nexport function resolveWorkflowReplayTargets(\n view: WorkflowRunView,\n scope: WorkflowRunReplayScope,\n): { targets: WorkflowReplayAgentTarget[]; phaseIds?: string[] } {\n const phaseTitleById = new Map(view.phases.map((phase) => [phase.id, phase.title]));\n const failedStatuses = new Set(['error', 'skipped']);\n\n if (scope === 'failed_agents') {\n return {\n targets: view.agents\n .filter((agent) => failedStatuses.has(agent.status) && workflowAgentReplayPrompt(agent))\n .map((agent) => ({\n agentId: agent.id,\n label: agent.label,\n phaseId: agent.phaseId,\n phaseTitle: agent.phaseId ? phaseTitleById.get(agent.phaseId) : undefined,\n prompt: workflowAgentReplayPrompt(agent) ?? '',\n invocation: agent.invocation,\n })),\n };\n }\n\n const failedPhaseIds = view.phases\n .filter((phase) => phase.status === 'failed')\n .map((phase) => phase.id);\n const phaseIds = failedPhaseIds.length > 0\n ? failedPhaseIds\n : [...new Set(view.agents.filter((agent) => failedStatuses.has(agent.status) && agent.phaseId).map((agent) => agent.phaseId as string))];\n const phaseIdSet = new Set(phaseIds);\n\n return {\n phaseIds,\n targets: view.agents\n .filter((agent) => agent.phaseId && phaseIdSet.has(agent.phaseId) && workflowAgentReplayPrompt(agent))\n .map((agent) => ({\n agentId: agent.id,\n label: agent.label,\n phaseId: agent.phaseId,\n phaseTitle: agent.phaseId ? phaseTitleById.get(agent.phaseId) : undefined,\n prompt: workflowAgentReplayPrompt(agent) ?? '',\n invocation: agent.invocation,\n })),\n };\n}\n\nfunction workflowAgentReplayPrompt(agent: WorkflowRunView['agents'][number]): string | undefined {\n const invocationPrompt = agent.invocation?.prompt?.trim();\n if (invocationPrompt) return invocationPrompt;\n const prompt = agent.prompt?.trim();\n return prompt || undefined;\n}\n\nexport function buildWorkflowRunDefinitionSnapshot(definition: WorkflowDefinition): WorkflowRunDefinitionSnapshot {\n const snapshot: WorkflowRunDefinitionSnapshot = {\n id: definition.id,\n name: definition.name,\n title: definition.title,\n version: definition.version,\n source: definition.metadata.source,\n tags: [...definition.metadata.tags],\n phaseCount: definition.phases.length,\n defaults: { ...definition.defaults },\n estimatedAgents: definition.metadata.estimatedAgents,\n };\n if (definition.contentHash) snapshot.contentHash = definition.contentHash;\n if (definition.runtimeHash) snapshot.runtimeHash = definition.runtimeHash;\n if (definition.permissions) snapshot.permissions = structuredClone(definition.permissions);\n if (definition.resources) snapshot.resources = structuredClone(definition.resources);\n return snapshot;\n}\n\nfunction resolveWorkflowRunLimits(params: {\n config: import('../../config/schema.js').Config;\n definition: WorkflowDefinition;\n concurrency?: number;\n maxSubagents?: number;\n}): { concurrency: number; maxSubagents: number; timeoutSec: number } {\n const configuredMaxConcurrency = normalizePositiveInt(\n undefined,\n params.definition.defaults.concurrency,\n );\n const configuredMaxSubagents = normalizePositiveInt(\n undefined,\n params.definition.defaults.maxSubagents,\n );\n const configuredTimeoutSec = normalizePositiveInt(\n undefined,\n params.definition.defaults.timeoutSec,\n );\n\n return {\n concurrency: Math.max(\n 1,\n Math.min(\n normalizePositiveInt(params.concurrency, params.definition.defaults.concurrency),\n configuredMaxConcurrency,\n ),\n ),\n maxSubagents: Math.max(\n 1,\n Math.min(\n normalizePositiveInt(params.maxSubagents, params.definition.defaults.maxSubagents),\n configuredMaxSubagents,\n ),\n ),\n timeoutSec: Math.max(1, Math.min(params.definition.defaults.timeoutSec, configuredTimeoutSec)),\n };\n}\n\nfunction normalizePositiveInt(value: number | undefined, fallback: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 1) {\n return fallback;\n }\n return Math.floor(value);\n}\n\nfunction buildReplayGoal(view: WorkflowRunView, scope: WorkflowRunReplayScope, targetCount: number): string {\n const scopeLabel = scope === 'failed_phases' ? 'failed phase' : 'failed agent';\n return `Replay ${targetCount} ${scopeLabel}${targetCount === 1 ? '' : 's'} from workflow run ${view.run.id}: ${view.run.goal}`;\n}\n\nexport function extractWorkflowRunSessionKey(source: WorkflowRunSource): string | null {\n if ('sessionKey' in source && typeof source.sessionKey === 'string' && source.sessionKey.trim()) {\n return source.sessionKey.trim();\n }\n return null;\n}\n\nfunction buildWorkflowRunOrigin(source: WorkflowRunSource): WorkflowRunMetadata['origin'] {\n switch (source.kind) {\n case 'chat':\n return { channel: 'chat', sessionKey: source.sessionKey, messageId: source.messageId };\n case 'webui':\n return { channel: 'webui', sessionKey: source.sessionKey };\n case 'automation':\n return { channel: 'automation', automationId: source.automationId, runId: source.runId };\n case 'api':\n return { channel: 'api', requestId: source.requestId };\n case 'im':\n return { channel: source.channel, chatId: source.chatId, messageId: source.messageId };\n }\n}\n\nfunction isWorkflowRunInputEnvelope(input: unknown): input is WorkflowRunInputEnvelope {\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return false;\n }\n return 'payload' in input || 'variables' in input || 'context' in input;\n}\n"],"mappings":"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"}
@@ -61,6 +61,7 @@ var WorkflowSessionBridge = class {
61
61
  if (params.parentSessionKey?.trim()) await this.writeParentRunLink({
62
62
  parentSessionKey: params.parentSessionKey.trim(),
63
63
  runId: params.runId,
64
+ ownerAgentId: params.agentId,
64
65
  workflowSessionKey: sessionKey,
65
66
  definitionId: params.definitionId,
66
67
  goal: params.goal,
@@ -83,6 +84,7 @@ var WorkflowSessionBridge = class {
83
84
  if (parentSessionKey) await this.writeParentRunLink({
84
85
  parentSessionKey,
85
86
  runId,
87
+ ownerAgentId: view.run.metadata?.agentId ?? "",
86
88
  workflowSessionKey: sessionKey,
87
89
  definitionId: view.run.definitionId,
88
90
  goal: view.run.goal,
@@ -139,6 +141,7 @@ var WorkflowSessionBridge = class {
139
141
  data: {
140
142
  kind: WORKFLOW_RUN_LINK_CONTEXT_KIND,
141
143
  runId: params.runId,
144
+ ...params.ownerAgentId ? { ownerAgentId: params.ownerAgentId } : {},
142
145
  workflowSessionKey: params.workflowSessionKey,
143
146
  definitionId: params.definitionId,
144
147
  goal: params.goal,