@agimon-ai/doompi-workflow 0.0.1-alpha.76 → 0.0.1-alpha.78

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 (332) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +23 -0
  2. package/dist/api-contracts.cjs +7 -0
  3. package/dist/api-contracts.d.cts +2 -0
  4. package/dist/api-contracts.d.mts +2 -0
  5. package/dist/api-contracts.mjs +2 -0
  6. package/dist/extensions/pi.cjs +63 -0
  7. package/dist/extensions/pi.cjs.map +1 -0
  8. package/dist/extensions/pi.d.cts +6 -0
  9. package/dist/extensions/pi.d.cts.map +1 -0
  10. package/dist/extensions/pi.d.mts +6 -0
  11. package/dist/extensions/pi.d.mts.map +1 -0
  12. package/dist/extensions/pi.mjs +58 -0
  13. package/dist/extensions/pi.mjs.map +1 -0
  14. package/dist/extensions/server.cjs +96 -0
  15. package/dist/extensions/server.cjs.map +1 -0
  16. package/dist/extensions/server.d.cts +5 -0
  17. package/dist/extensions/server.d.cts.map +1 -0
  18. package/dist/extensions/server.d.mts +5 -0
  19. package/dist/extensions/server.d.mts.map +1 -0
  20. package/dist/extensions/server.mjs +91 -0
  21. package/dist/extensions/server.mjs.map +1 -0
  22. package/dist/extensions/web.mjs +3219 -0
  23. package/dist/extensions/web.mjs.map +1 -0
  24. package/dist/index.cjs +4 -0
  25. package/dist/index.d.cts +2 -0
  26. package/dist/index.d.mts +2 -0
  27. package/dist/index.mjs +2 -0
  28. package/dist/src/constants/workflow.cjs +32 -0
  29. package/dist/src/constants/workflow.cjs.map +1 -0
  30. package/dist/src/constants/workflow.mjs +21 -0
  31. package/dist/src/constants/workflow.mjs.map +1 -0
  32. package/dist/src/extensions/(backend)/_lib/index.server.cjs +12 -0
  33. package/dist/src/extensions/(backend)/_lib/index.server.cjs.map +1 -0
  34. package/dist/src/extensions/(backend)/_lib/index.server.mjs +12 -0
  35. package/dist/src/extensions/(backend)/_lib/index.server.mjs.map +1 -0
  36. package/dist/src/extensions/(backend)/api/workflow/route.server.cjs +7 -0
  37. package/dist/src/extensions/(backend)/api/workflow/route.server.cjs.map +1 -0
  38. package/dist/src/extensions/(backend)/api/workflow/route.server.mjs +8 -0
  39. package/dist/src/extensions/(backend)/api/workflow/route.server.mjs.map +1 -0
  40. package/dist/src/extensions/(backend)/channel/workflow-catalog.server.cjs +7 -0
  41. package/dist/src/extensions/(backend)/channel/workflow-catalog.server.cjs.map +1 -0
  42. package/dist/src/extensions/(backend)/channel/workflow-catalog.server.mjs +8 -0
  43. package/dist/src/extensions/(backend)/channel/workflow-catalog.server.mjs.map +1 -0
  44. package/dist/src/extensions/(backend)/channel/workflows.server.cjs +7 -0
  45. package/dist/src/extensions/(backend)/channel/workflows.server.cjs.map +1 -0
  46. package/dist/src/extensions/(backend)/channel/workflows.server.mjs +8 -0
  47. package/dist/src/extensions/(backend)/channel/workflows.server.mjs.map +1 -0
  48. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/index.cli.cjs +100 -0
  49. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/index.cli.cjs.map +1 -0
  50. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/index.cli.mjs +100 -0
  51. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/index.cli.mjs.map +1 -0
  52. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/index.server.cjs +11 -0
  53. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/index.server.cjs.map +1 -0
  54. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/index.server.mjs +11 -0
  55. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/index.server.mjs.map +1 -0
  56. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/workflowSkillsResource.cjs +12 -0
  57. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/workflowSkillsResource.cjs.map +1 -0
  58. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/workflowSkillsResource.mjs +12 -0
  59. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/workflowSkillsResource.mjs.map +1 -0
  60. package/dist/src/extensions/workspaces/sessions/(backend)/api/workflow/route.server.cjs +6 -0
  61. package/dist/src/extensions/workspaces/sessions/(backend)/api/workflow/route.server.cjs.map +1 -0
  62. package/dist/src/extensions/workspaces/sessions/(backend)/api/workflow/route.server.mjs +7 -0
  63. package/dist/src/extensions/workspaces/sessions/(backend)/api/workflow/route.server.mjs.map +1 -0
  64. package/dist/src/extensions/workspaces/sessions/(backend)/command/workflow-launch.cli.cjs +6 -0
  65. package/dist/src/extensions/workspaces/sessions/(backend)/command/workflow-launch.cli.cjs.map +1 -0
  66. package/dist/src/extensions/workspaces/sessions/(backend)/command/workflow-launch.cli.mjs +7 -0
  67. package/dist/src/extensions/workspaces/sessions/(backend)/command/workflow-launch.cli.mjs.map +1 -0
  68. package/dist/src/extensions/workspaces/sessions/(backend)/command/workflow-launch.server.cjs +6 -0
  69. package/dist/src/extensions/workspaces/sessions/(backend)/command/workflow-launch.server.cjs.map +1 -0
  70. package/dist/src/extensions/workspaces/sessions/(backend)/command/workflow-launch.server.mjs +7 -0
  71. package/dist/src/extensions/workspaces/sessions/(backend)/command/workflow-launch.server.mjs.map +1 -0
  72. package/dist/src/extensions/workspaces/sessions/(backend)/hook/resources-discover.cli.cjs +6 -0
  73. package/dist/src/extensions/workspaces/sessions/(backend)/hook/resources-discover.cli.cjs.map +1 -0
  74. package/dist/src/extensions/workspaces/sessions/(backend)/hook/resources-discover.cli.mjs +7 -0
  75. package/dist/src/extensions/workspaces/sessions/(backend)/hook/resources-discover.cli.mjs.map +1 -0
  76. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.cjs +6 -0
  77. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.cjs.map +1 -0
  78. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.mjs +7 -0
  79. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.mjs.map +1 -0
  80. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.cjs +6 -0
  81. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.cjs.map +1 -0
  82. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.mjs +7 -0
  83. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.mjs.map +1 -0
  84. package/dist/src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.server.cjs +6 -0
  85. package/dist/src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.server.cjs.map +1 -0
  86. package/dist/src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.server.mjs +7 -0
  87. package/dist/src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.server.mjs.map +1 -0
  88. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-author-workflow.server.cjs +6 -0
  89. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-author-workflow.server.cjs.map +1 -0
  90. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-author-workflow.server.mjs +7 -0
  91. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-author-workflow.server.mjs.map +1 -0
  92. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-workflow.server.cjs +6 -0
  93. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-workflow.server.cjs.map +1 -0
  94. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-workflow.server.mjs +7 -0
  95. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-workflow.server.mjs.map +1 -0
  96. package/dist/src/extensions/workspaces/sessions/(backend)/resource/workflow-recovery.server.cjs +6 -0
  97. package/dist/src/extensions/workspaces/sessions/(backend)/resource/workflow-recovery.server.cjs.map +1 -0
  98. package/dist/src/extensions/workspaces/sessions/(backend)/resource/workflow-recovery.server.mjs +7 -0
  99. package/dist/src/extensions/workspaces/sessions/(backend)/resource/workflow-recovery.server.mjs.map +1 -0
  100. package/dist/src/extensions/workspaces/sessions/(backend)/resource/workflow-skills.cli.cjs +7 -0
  101. package/dist/src/extensions/workspaces/sessions/(backend)/resource/workflow-skills.cli.cjs.map +1 -0
  102. package/dist/src/extensions/workspaces/sessions/(backend)/resource/workflow-skills.cli.mjs +8 -0
  103. package/dist/src/extensions/workspaces/sessions/(backend)/resource/workflow-skills.cli.mjs.map +1 -0
  104. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs +15 -0
  105. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs.map +1 -0
  106. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs +16 -0
  107. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs.map +1 -0
  108. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs +17 -0
  109. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs.map +1 -0
  110. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs +18 -0
  111. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs.map +1 -0
  112. package/dist/src/extensions/workspaces/sessions/(backend)/shortcut/workflow-panel.cli.cjs +6 -0
  113. package/dist/src/extensions/workspaces/sessions/(backend)/shortcut/workflow-panel.cli.cjs.map +1 -0
  114. package/dist/src/extensions/workspaces/sessions/(backend)/shortcut/workflow-panel.cli.mjs +7 -0
  115. package/dist/src/extensions/workspaces/sessions/(backend)/shortcut/workflow-panel.cli.mjs.map +1 -0
  116. package/dist/src/extensions/workspaces/sessions/(backend)/shortcut/workflow-view-close.cli.cjs +6 -0
  117. package/dist/src/extensions/workspaces/sessions/(backend)/shortcut/workflow-view-close.cli.cjs.map +1 -0
  118. package/dist/src/extensions/workspaces/sessions/(backend)/shortcut/workflow-view-close.cli.mjs +7 -0
  119. package/dist/src/extensions/workspaces/sessions/(backend)/shortcut/workflow-view-close.cli.mjs.map +1 -0
  120. package/dist/src/extensions/workspaces/sessions/(backend)/tool/launch-workflow.server.cjs +6 -0
  121. package/dist/src/extensions/workspaces/sessions/(backend)/tool/launch-workflow.server.cjs.map +1 -0
  122. package/dist/src/extensions/workspaces/sessions/(backend)/tool/launch-workflow.server.mjs +7 -0
  123. package/dist/src/extensions/workspaces/sessions/(backend)/tool/launch-workflow.server.mjs.map +1 -0
  124. package/dist/src/extensions/workspaces/sessions/(backend)/tool/list-workflows.server.cjs +6 -0
  125. package/dist/src/extensions/workspaces/sessions/(backend)/tool/list-workflows.server.cjs.map +1 -0
  126. package/dist/src/extensions/workspaces/sessions/(backend)/tool/list-workflows.server.mjs +7 -0
  127. package/dist/src/extensions/workspaces/sessions/(backend)/tool/list-workflows.server.mjs.map +1 -0
  128. package/dist/src/extensions/workspaces/sessions/(backend)/tool/workflow-run.server.cjs +6 -0
  129. package/dist/src/extensions/workspaces/sessions/(backend)/tool/workflow-run.server.cjs.map +1 -0
  130. package/dist/src/extensions/workspaces/sessions/(backend)/tool/workflow-run.server.mjs +7 -0
  131. package/dist/src/extensions/workspaces/sessions/(backend)/tool/workflow-run.server.mjs.map +1 -0
  132. package/dist/src/extensions/workspaces/sessions/(backend)/tool/workflow.cli.cjs +6 -0
  133. package/dist/src/extensions/workspaces/sessions/(backend)/tool/workflow.cli.cjs.map +1 -0
  134. package/dist/src/extensions/workspaces/sessions/(backend)/tool/workflow.cli.mjs +7 -0
  135. package/dist/src/extensions/workspaces/sessions/(backend)/tool/workflow.cli.mjs.map +1 -0
  136. package/dist/src/extensions/workspaces/sessions/(backend)/tool-restriction/workflow.cli.cjs +6 -0
  137. package/dist/src/extensions/workspaces/sessions/(backend)/tool-restriction/workflow.cli.cjs.map +1 -0
  138. package/dist/src/extensions/workspaces/sessions/(backend)/tool-restriction/workflow.cli.mjs +7 -0
  139. package/dist/src/extensions/workspaces/sessions/(backend)/tool-restriction/workflow.cli.mjs.map +1 -0
  140. package/dist/src/extensions/workspaces/sessions/(backend)/tool-restriction/workflow.server.cjs +6 -0
  141. package/dist/src/extensions/workspaces/sessions/(backend)/tool-restriction/workflow.server.cjs.map +1 -0
  142. package/dist/src/extensions/workspaces/sessions/(backend)/tool-restriction/workflow.server.mjs +7 -0
  143. package/dist/src/extensions/workspaces/sessions/(backend)/tool-restriction/workflow.server.mjs.map +1 -0
  144. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/workflowFinishedRenderer.cjs +50 -0
  145. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/workflowFinishedRenderer.cjs.map +1 -0
  146. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/workflowFinishedRenderer.mjs +47 -0
  147. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/workflowFinishedRenderer.mjs.map +1 -0
  148. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/workflowStepRenderer.cjs +36 -0
  149. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/workflowStepRenderer.cjs.map +1 -0
  150. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/workflowStepRenderer.mjs +35 -0
  151. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/workflowStepRenderer.mjs.map +1 -0
  152. package/dist/src/extensions/workspaces/sessions/(frontend)/message/workflow-finished.cli.cjs +7 -0
  153. package/dist/src/extensions/workspaces/sessions/(frontend)/message/workflow-finished.cli.cjs.map +1 -0
  154. package/dist/src/extensions/workspaces/sessions/(frontend)/message/workflow-finished.cli.mjs +8 -0
  155. package/dist/src/extensions/workspaces/sessions/(frontend)/message/workflow-finished.cli.mjs.map +1 -0
  156. package/dist/src/extensions/workspaces/sessions/(frontend)/message/workflow-step.cli.cjs +7 -0
  157. package/dist/src/extensions/workspaces/sessions/(frontend)/message/workflow-step.cli.cjs.map +1 -0
  158. package/dist/src/extensions/workspaces/sessions/(frontend)/message/workflow-step.cli.mjs +8 -0
  159. package/dist/src/extensions/workspaces/sessions/(frontend)/message/workflow-step.cli.mjs.map +1 -0
  160. package/dist/src/schemas/apiContracts.cjs +330 -0
  161. package/dist/src/schemas/apiContracts.cjs.map +1 -0
  162. package/dist/src/schemas/apiContracts.d.cts +53 -0
  163. package/dist/src/schemas/apiContracts.d.cts.map +1 -0
  164. package/dist/src/schemas/apiContracts.d.mts +53 -0
  165. package/dist/src/schemas/apiContracts.d.mts.map +1 -0
  166. package/dist/src/schemas/apiContracts.mjs +327 -0
  167. package/dist/src/schemas/apiContracts.mjs.map +1 -0
  168. package/dist/src/schemas/workflowPi.cjs +77 -0
  169. package/dist/src/schemas/workflowPi.cjs.map +1 -0
  170. package/dist/src/schemas/workflowPi.d.cts +1 -0
  171. package/dist/src/schemas/workflowPi.d.mts +1 -0
  172. package/dist/src/schemas/workflowPi.mjs +74 -0
  173. package/dist/src/schemas/workflowPi.mjs.map +1 -0
  174. package/dist/src/services/backgroundWork/index.cjs +61 -0
  175. package/dist/src/services/backgroundWork/index.cjs.map +1 -0
  176. package/dist/src/services/backgroundWork/index.mjs +61 -0
  177. package/dist/src/services/backgroundWork/index.mjs.map +1 -0
  178. package/dist/src/services/piToolBridge/index.cjs +205 -0
  179. package/dist/src/services/piToolBridge/index.cjs.map +1 -0
  180. package/dist/src/services/piToolBridge/index.mjs +195 -0
  181. package/dist/src/services/piToolBridge/index.mjs.map +1 -0
  182. package/dist/src/services/serverRuntime/index.cjs +387 -0
  183. package/dist/src/services/serverRuntime/index.cjs.map +1 -0
  184. package/dist/src/services/serverRuntime/index.mjs +387 -0
  185. package/dist/src/services/serverRuntime/index.mjs.map +1 -0
  186. package/dist/src/services/webWorkflowCatalog/index.cjs +53 -0
  187. package/dist/src/services/webWorkflowCatalog/index.cjs.map +1 -0
  188. package/dist/src/services/webWorkflowCatalog/index.mjs +52 -0
  189. package/dist/src/services/webWorkflowCatalog/index.mjs.map +1 -0
  190. package/dist/src/services/workflowCatalogChannel/index.cjs +74 -0
  191. package/dist/src/services/workflowCatalogChannel/index.cjs.map +1 -0
  192. package/dist/src/services/workflowCatalogChannel/index.mjs +74 -0
  193. package/dist/src/services/workflowCatalogChannel/index.mjs.map +1 -0
  194. package/dist/src/services/workflowCatalogDeps/index.cjs +25 -0
  195. package/dist/src/services/workflowCatalogDeps/index.cjs.map +1 -0
  196. package/dist/src/services/workflowCatalogDeps/index.mjs +25 -0
  197. package/dist/src/services/workflowCatalogDeps/index.mjs.map +1 -0
  198. package/dist/src/services/workflowExecution/index.cjs +205 -0
  199. package/dist/src/services/workflowExecution/index.cjs.map +1 -0
  200. package/dist/src/services/workflowExecution/index.d.cts +6 -0
  201. package/dist/src/services/workflowExecution/index.d.mts +6 -0
  202. package/dist/src/services/workflowExecution/index.mjs +200 -0
  203. package/dist/src/services/workflowExecution/index.mjs.map +1 -0
  204. package/dist/src/services/workflowFence/index.cjs +170 -0
  205. package/dist/src/services/workflowFence/index.cjs.map +1 -0
  206. package/dist/src/services/workflowFence/index.mjs +166 -0
  207. package/dist/src/services/workflowFence/index.mjs.map +1 -0
  208. package/dist/src/services/workflowHubApi/index.cjs +415 -0
  209. package/dist/src/services/workflowHubApi/index.cjs.map +1 -0
  210. package/dist/src/services/workflowHubApi/index.mjs +411 -0
  211. package/dist/src/services/workflowHubApi/index.mjs.map +1 -0
  212. package/dist/src/services/workflowLaunchCommand/index.cjs +121 -0
  213. package/dist/src/services/workflowLaunchCommand/index.cjs.map +1 -0
  214. package/dist/src/services/workflowLaunchCommand/index.d.cts +52 -0
  215. package/dist/src/services/workflowLaunchCommand/index.d.cts.map +1 -0
  216. package/dist/src/services/workflowLaunchCommand/index.d.mts +52 -0
  217. package/dist/src/services/workflowLaunchCommand/index.d.mts.map +1 -0
  218. package/dist/src/services/workflowLaunchCommand/index.mjs +118 -0
  219. package/dist/src/services/workflowLaunchCommand/index.mjs.map +1 -0
  220. package/dist/src/services/workflowLauncher/index.cjs +181 -0
  221. package/dist/src/services/workflowLauncher/index.cjs.map +1 -0
  222. package/dist/src/services/workflowLauncher/index.mjs +177 -0
  223. package/dist/src/services/workflowLauncher/index.mjs.map +1 -0
  224. package/dist/src/services/workflowNarration/index.cjs +19 -0
  225. package/dist/src/services/workflowNarration/index.cjs.map +1 -0
  226. package/dist/src/services/workflowNarration/index.mjs +19 -0
  227. package/dist/src/services/workflowNarration/index.mjs.map +1 -0
  228. package/dist/src/services/workflowResource/index.cjs +27 -0
  229. package/dist/src/services/workflowResource/index.cjs.map +1 -0
  230. package/dist/src/services/workflowResource/index.mjs +24 -0
  231. package/dist/src/services/workflowResource/index.mjs.map +1 -0
  232. package/dist/src/services/workflowRuns/index.cjs +333 -0
  233. package/dist/src/services/workflowRuns/index.cjs.map +1 -0
  234. package/dist/src/services/workflowRuns/index.mjs +319 -0
  235. package/dist/src/services/workflowRuns/index.mjs.map +1 -0
  236. package/dist/src/services/workflowTerminal/index.cjs +69 -0
  237. package/dist/src/services/workflowTerminal/index.cjs.map +1 -0
  238. package/dist/src/services/workflowTerminal/index.mjs +69 -0
  239. package/dist/src/services/workflowTerminal/index.mjs.map +1 -0
  240. package/dist/src/services/workflowTools/index.cjs +221 -0
  241. package/dist/src/services/workflowTools/index.cjs.map +1 -0
  242. package/dist/src/services/workflowTools/index.mjs +221 -0
  243. package/dist/src/services/workflowTools/index.mjs.map +1 -0
  244. package/dist/src/services/workflowWatcher/index.cjs +78 -0
  245. package/dist/src/services/workflowWatcher/index.cjs.map +1 -0
  246. package/dist/src/services/workflowWatcher/index.mjs +74 -0
  247. package/dist/src/services/workflowWatcher/index.mjs.map +1 -0
  248. package/dist/src/services/workflowsHubChannel/index.cjs +58 -0
  249. package/dist/src/services/workflowsHubChannel/index.cjs.map +1 -0
  250. package/dist/src/services/workflowsHubChannel/index.mjs +58 -0
  251. package/dist/src/services/workflowsHubChannel/index.mjs.map +1 -0
  252. package/dist/src/tui/leader.cjs +84 -0
  253. package/dist/src/tui/leader.cjs.map +1 -0
  254. package/dist/src/tui/leader.mjs +83 -0
  255. package/dist/src/tui/leader.mjs.map +1 -0
  256. package/dist/src/tui/workflow/doomOverlay.cjs +159 -0
  257. package/dist/src/tui/workflow/doomOverlay.cjs.map +1 -0
  258. package/dist/src/tui/workflow/doomOverlay.mjs +157 -0
  259. package/dist/src/tui/workflow/doomOverlay.mjs.map +1 -0
  260. package/dist/src/tui/workflow/overlayText.cjs +83 -0
  261. package/dist/src/tui/workflow/overlayText.cjs.map +1 -0
  262. package/dist/src/tui/workflow/overlayText.mjs +78 -0
  263. package/dist/src/tui/workflow/overlayText.mjs.map +1 -0
  264. package/dist/src/tui/workflow/rendering.cjs +22 -0
  265. package/dist/src/tui/workflow/rendering.cjs.map +1 -0
  266. package/dist/src/tui/workflow/rendering.mjs +20 -0
  267. package/dist/src/tui/workflow/rendering.mjs.map +1 -0
  268. package/dist/src/tui/workflow/workflowCatalog.cjs +336 -0
  269. package/dist/src/tui/workflow/workflowCatalog.cjs.map +1 -0
  270. package/dist/src/tui/workflow/workflowCatalog.mjs +333 -0
  271. package/dist/src/tui/workflow/workflowCatalog.mjs.map +1 -0
  272. package/dist/src/tui/workflow/workflowFinishedMessage.cjs +50 -0
  273. package/dist/src/tui/workflow/workflowFinishedMessage.cjs.map +1 -0
  274. package/dist/src/tui/workflow/workflowFinishedMessage.mjs +47 -0
  275. package/dist/src/tui/workflow/workflowFinishedMessage.mjs.map +1 -0
  276. package/dist/src/tui/workflow/workflowInspector.cjs +276 -0
  277. package/dist/src/tui/workflow/workflowInspector.cjs.map +1 -0
  278. package/dist/src/tui/workflow/workflowInspector.mjs +276 -0
  279. package/dist/src/tui/workflow/workflowInspector.mjs.map +1 -0
  280. package/dist/src/tui/workflow/workflowOverlay.cjs +126 -0
  281. package/dist/src/tui/workflow/workflowOverlay.cjs.map +1 -0
  282. package/dist/src/tui/workflow/workflowOverlay.mjs +125 -0
  283. package/dist/src/tui/workflow/workflowOverlay.mjs.map +1 -0
  284. package/dist/src/tui/workflow/workflowPicker.cjs +138 -0
  285. package/dist/src/tui/workflow/workflowPicker.cjs.map +1 -0
  286. package/dist/src/tui/workflow/workflowPicker.mjs +136 -0
  287. package/dist/src/tui/workflow/workflowPicker.mjs.map +1 -0
  288. package/dist/src/tui/workflow/workflowProgressOverlay.cjs +197 -0
  289. package/dist/src/tui/workflow/workflowProgressOverlay.cjs.map +1 -0
  290. package/dist/src/tui/workflow/workflowProgressOverlay.mjs +192 -0
  291. package/dist/src/tui/workflow/workflowProgressOverlay.mjs.map +1 -0
  292. package/dist/src/tui/workflow/workflowPrompt.cjs +142 -0
  293. package/dist/src/tui/workflow/workflowPrompt.cjs.map +1 -0
  294. package/dist/src/tui/workflow/workflowPrompt.mjs +139 -0
  295. package/dist/src/tui/workflow/workflowPrompt.mjs.map +1 -0
  296. package/dist/src/tui/workflow/workflowRunPanel.cjs +95 -0
  297. package/dist/src/tui/workflow/workflowRunPanel.cjs.map +1 -0
  298. package/dist/src/tui/workflow/workflowRunPanel.mjs +94 -0
  299. package/dist/src/tui/workflow/workflowRunPanel.mjs.map +1 -0
  300. package/dist/src/tui/workflow/workflowStatusRow.cjs +20 -0
  301. package/dist/src/tui/workflow/workflowStatusRow.cjs.map +1 -0
  302. package/dist/src/tui/workflow/workflowStatusRow.mjs +20 -0
  303. package/dist/src/tui/workflow/workflowStatusRow.mjs.map +1 -0
  304. package/dist/src/tui/workflow/workflowStepMessage.cjs +32 -0
  305. package/dist/src/tui/workflow/workflowStepMessage.cjs.map +1 -0
  306. package/dist/src/tui/workflow/workflowStepMessage.mjs +31 -0
  307. package/dist/src/tui/workflow/workflowStepMessage.mjs.map +1 -0
  308. package/dist/src/tui/workflow/workflowToolRender.cjs +491 -0
  309. package/dist/src/tui/workflow/workflowToolRender.cjs.map +1 -0
  310. package/dist/src/tui/workflow/workflowToolRender.mjs +490 -0
  311. package/dist/src/tui/workflow/workflowToolRender.mjs.map +1 -0
  312. package/dist/src/tui/workflowRuntime.cjs +1934 -0
  313. package/dist/src/tui/workflowRuntime.cjs.map +1 -0
  314. package/dist/src/tui/workflowRuntime.d.cts +33 -0
  315. package/dist/src/tui/workflowRuntime.d.cts.map +1 -0
  316. package/dist/src/tui/workflowRuntime.d.mts +33 -0
  317. package/dist/src/tui/workflowRuntime.d.mts.map +1 -0
  318. package/dist/src/tui/workflowRuntime.mjs +1930 -0
  319. package/dist/src/tui/workflowRuntime.mjs.map +1 -0
  320. package/dist/src/types/apiRoutes.cjs +82 -0
  321. package/dist/src/types/apiRoutes.cjs.map +1 -0
  322. package/dist/src/types/apiRoutes.mjs +80 -0
  323. package/dist/src/types/apiRoutes.mjs.map +1 -0
  324. package/dist/src/types/webWorkflowTerminal.cjs +23 -0
  325. package/dist/src/types/webWorkflowTerminal.cjs.map +1 -0
  326. package/dist/src/types/webWorkflowTerminal.mjs +22 -0
  327. package/dist/src/types/webWorkflowTerminal.mjs.map +1 -0
  328. package/dist/src/types/webWorkflows.cjs +8 -0
  329. package/dist/src/types/webWorkflows.cjs.map +1 -0
  330. package/dist/src/types/webWorkflows.mjs +7 -0
  331. package/dist/src/types/webWorkflows.mjs.map +1 -0
  332. package/package.json +8 -8
@@ -0,0 +1,387 @@
1
+ import { parseWorkflowLaunchCommand } from "../workflowLaunchCommand/index.mjs";
2
+ import { readWorkflowSkill } from "../workflowResource/index.mjs";
3
+ import { registerRunProvider } from "../backgroundWork/index.mjs";
4
+ import { createWorkflowCatalogReader, presentWorkflowCatalog } from "../webWorkflowCatalog/index.mjs";
5
+ import { defaultCatalogDeps } from "../workflowCatalogDeps/index.mjs";
6
+ import { presentWorkflowRuns, runBelongsToSession } from "../workflowRuns/index.mjs";
7
+ import { readWorkflowRuns } from "../workflowWatcher/index.mjs";
8
+ import { WORKFLOW_CATALOG_TYPE, WORKFLOW_RUNS_TYPE } from "../../types/webWorkflows.mjs";
9
+ import { createEmbeddedWorkflowFeature } from "@agimon-ai/workflow-mcp";
10
+ import { z } from "zod";
11
+ import { defineMinorMode, serverMinorModes } from "@agimon-ai/doompi-minor-mode";
12
+ //#region src/services/serverRuntime/index.ts
13
+ const SOURCE = "@agimon-ai/doompi-workflow";
14
+ const WORKFLOW_MODE_ID = "workflow";
15
+ const LIST_TOOL = "list_workflows";
16
+ const LAUNCH_TOOL = "launch_workflow";
17
+ const RUN_TOOL = "workflow_run";
18
+ function callResult(value) {
19
+ const content = [];
20
+ if (typeof value === "object" && value !== null && "content" in value && Array.isArray(value.content)) for (const item of value.content) {
21
+ if (typeof item !== "object" || item === null || !("type" in item)) continue;
22
+ const record = item;
23
+ if (record.type === "text" && typeof record.text === "string") content.push({
24
+ type: "text",
25
+ text: record.text
26
+ });
27
+ else if (record.type === "image" && typeof record.data === "string" && typeof record.mimeType === "string") content.push({
28
+ type: "image",
29
+ data: record.data,
30
+ mimeType: record.mimeType
31
+ });
32
+ }
33
+ if (content.length === 0) content.push({
34
+ type: "text",
35
+ text: JSON.stringify(value, null, 2)
36
+ });
37
+ return {
38
+ content,
39
+ details: value
40
+ };
41
+ }
42
+ function createWorkflowServerRuntime(host, serverHost) {
43
+ if (serverHost.context.directEvents === void 0) throw new Error("Workflow headless facet requires the session direct event bus.");
44
+ const directEvents = serverHost.context.directEvents;
45
+ let runProvider;
46
+ const catalogReader = createWorkflowCatalogReader(defaultCatalogDeps());
47
+ const publishLifecycle = async (executionContext) => {
48
+ const records = readWorkflowRuns({ environment: executionContext.environment }).filter((run) => runBelongsToSession(run, executionContext.sessionId));
49
+ const activeItems = records.filter((run) => run.view.stage === "running" && run.view.stale !== true).map((run) => ({
50
+ id: `${run.view.workspace}/${run.view.runKey}`,
51
+ sessionId: executionContext.sessionId
52
+ }));
53
+ runProvider?.update(activeItems);
54
+ const runs = presentWorkflowRuns(records.map((run) => run.view), Date.now());
55
+ directEvents.publish(WORKFLOW_RUNS_TYPE, executionContext.sessionId, { runs });
56
+ try {
57
+ directEvents.publish(WORKFLOW_CATALOG_TYPE, executionContext.sessionId, {
58
+ cwd: executionContext.cwd,
59
+ workflows: presentWorkflowCatalog(await catalogReader.read(executionContext.cwd))
60
+ });
61
+ } catch (error) {
62
+ const warning = error instanceof Error ? error.message : String(error);
63
+ directEvents.publish(WORKFLOW_CATALOG_TYPE, executionContext.sessionId, {
64
+ cwd: executionContext.cwd,
65
+ workflows: [],
66
+ warning
67
+ });
68
+ }
69
+ return activeItems.length > 0;
70
+ };
71
+ const feature = createEmbeddedWorkflowFeature();
72
+ let control;
73
+ let controlDisposers = [];
74
+ const disposeControl = () => {
75
+ for (const dispose of controlDisposers.splice(0)) dispose();
76
+ control?.dispose();
77
+ control = void 0;
78
+ };
79
+ let modeOwner;
80
+ const modeSelected = () => (host.context.selection.state?.["minor-mode"] ?? []).includes(WORKFLOW_MODE_ID);
81
+ const modeState = () => {
82
+ const active = modeSelected();
83
+ return {
84
+ activation: active ? "active" : "inactive",
85
+ condition: "ready",
86
+ ...active ? { detail: "workflow tools available" } : {},
87
+ actions: [{
88
+ id: "activate",
89
+ enabled: !active,
90
+ ...!active ? {} : { disabledReason: "Workflow mode is active." }
91
+ }, {
92
+ id: "deactivate",
93
+ enabled: active,
94
+ ...active ? {} : { disabledReason: "Workflow mode is inactive." }
95
+ }]
96
+ };
97
+ };
98
+ const selectMode = async (enabled) => {
99
+ const modes = (host.context.selection.state?.["minor-mode"] ?? []).filter((mode) => mode !== WORKFLOW_MODE_ID);
100
+ await host.changeSelection({
101
+ axis: "state",
102
+ key: "minor-mode",
103
+ values: enabled ? [...modes, WORKFLOW_MODE_ID] : modes
104
+ });
105
+ modeOwner?.publish();
106
+ };
107
+ modeOwner = defineMinorMode({
108
+ descriptor: {
109
+ source: SOURCE,
110
+ id: WORKFLOW_MODE_ID,
111
+ label: "Workflow",
112
+ description: "Workflow discovery, launch, inspection, control, and recovery tools.",
113
+ order: 20,
114
+ actions: [{
115
+ id: "activate",
116
+ label: "Activate",
117
+ description: "Enable workflow tools for this session.",
118
+ contexts: ["headless"],
119
+ parameters: []
120
+ }, {
121
+ id: "deactivate",
122
+ label: "Deactivate",
123
+ description: "Disable workflow tools without stopping active runs.",
124
+ contexts: ["headless"],
125
+ parameters: []
126
+ }]
127
+ },
128
+ state: modeState,
129
+ async handleAction(_runtime, actionId, _argumentsValue, execution) {
130
+ execution.signal.throwIfAborted();
131
+ if (actionId === "activate") {
132
+ await selectMode(true);
133
+ return { message: "Workflow mode activated." };
134
+ }
135
+ if (actionId === "deactivate") {
136
+ await selectMode(false);
137
+ return { message: "Workflow mode deactivated." };
138
+ }
139
+ throw new Error(`Unknown workflow mode action: ${actionId}`);
140
+ }
141
+ }).createOwner(void 0);
142
+ return {
143
+ services: [serverMinorModes([modeOwner]), (context) => {
144
+ const provider = registerRunProvider(context);
145
+ runProvider = provider;
146
+ return () => {
147
+ provider.dispose();
148
+ if (runProvider === provider) runProvider = void 0;
149
+ };
150
+ }],
151
+ toolRestrictions: [{
152
+ when: { state: { "minor-mode": WORKFLOW_MODE_ID } },
153
+ allowedTools: [
154
+ LIST_TOOL,
155
+ LAUNCH_TOOL,
156
+ RUN_TOOL
157
+ ]
158
+ }],
159
+ hooks: [{
160
+ event: "tool_execution_end",
161
+ handle: async (_event, executionContext) => {
162
+ await publishLifecycle(executionContext);
163
+ }
164
+ }, {
165
+ when: {
166
+ state: { "minor-mode": WORKFLOW_MODE_ID },
167
+ attribution: {
168
+ kind: "minor",
169
+ mode: WORKFLOW_MODE_ID
170
+ }
171
+ },
172
+ event: "session_shutdown",
173
+ handle: disposeControl
174
+ }],
175
+ resources: [
176
+ {
177
+ when: {
178
+ state: { "minor-mode": WORKFLOW_MODE_ID },
179
+ attribution: {
180
+ kind: "minor",
181
+ mode: WORKFLOW_MODE_ID
182
+ }
183
+ },
184
+ name: "doompi-author-workflow",
185
+ kind: "skill",
186
+ read: () => readWorkflowSkill("doompi-author-workflow")
187
+ },
188
+ {
189
+ when: {
190
+ state: { "minor-mode": WORKFLOW_MODE_ID },
191
+ attribution: {
192
+ kind: "minor",
193
+ mode: WORKFLOW_MODE_ID
194
+ }
195
+ },
196
+ name: "doompi-use-workflow",
197
+ kind: "skill",
198
+ read: () => readWorkflowSkill("doompi-use-workflow")
199
+ },
200
+ {
201
+ when: {
202
+ state: { "minor-mode": WORKFLOW_MODE_ID },
203
+ attribution: {
204
+ kind: "minor",
205
+ mode: WORKFLOW_MODE_ID
206
+ }
207
+ },
208
+ name: "workflow-recovery",
209
+ kind: "skill",
210
+ read: () => readWorkflowSkill("workflow-recovery")
211
+ }
212
+ ],
213
+ activities: [{
214
+ when: {
215
+ state: { "minor-mode": WORKFLOW_MODE_ID },
216
+ attribution: {
217
+ kind: "minor",
218
+ mode: WORKFLOW_MODE_ID
219
+ }
220
+ },
221
+ name: SOURCE,
222
+ async start(executionContext) {
223
+ const reportFailure = (error) => {
224
+ process.emitWarning(`Could not publish headless workflow state: ${String(error)}`);
225
+ };
226
+ const stopFor = (ownedControl) => () => {
227
+ publishLifecycle(executionContext).then((active) => {
228
+ if (!active && !modeSelected() && control === ownedControl) disposeControl();
229
+ }).catch(reportFailure);
230
+ };
231
+ if (control !== void 0) {
232
+ const ownedControl = control;
233
+ await publishLifecycle(executionContext);
234
+ return stopFor(ownedControl);
235
+ }
236
+ control = feature.createRunControl({});
237
+ const ownedControl = control;
238
+ const refresh = () => {
239
+ publishLifecycle(executionContext).then((active) => {
240
+ if (!active && !modeSelected() && control === ownedControl) disposeControl();
241
+ }).catch(reportFailure);
242
+ };
243
+ controlDisposers = [
244
+ ownedControl.on("runStarted", refresh),
245
+ ownedControl.on("runUpdated", refresh),
246
+ ownedControl.on("runFinished", refresh)
247
+ ];
248
+ try {
249
+ await ownedControl.start();
250
+ await publishLifecycle(executionContext);
251
+ return stopFor(ownedControl);
252
+ } catch (error) {
253
+ if (control === ownedControl) disposeControl();
254
+ throw error;
255
+ }
256
+ }
257
+ }],
258
+ tools: [
259
+ {
260
+ when: {
261
+ state: { "minor-mode": WORKFLOW_MODE_ID },
262
+ attribution: {
263
+ kind: "minor",
264
+ mode: WORKFLOW_MODE_ID
265
+ }
266
+ },
267
+ name: LIST_TOOL,
268
+ label: "List Workflows",
269
+ description: "List workflow definitions available in this repository.",
270
+ parameters: z.toJSONSchema(feature.listWorkflowsTool.getInputSchema()),
271
+ executionMode: "serial",
272
+ async execute(_toolCallId, parameters, signal) {
273
+ signal?.throwIfAborted();
274
+ return callResult(await feature.listWorkflowsTool.execute(parameters));
275
+ }
276
+ },
277
+ {
278
+ when: {
279
+ state: { "minor-mode": WORKFLOW_MODE_ID },
280
+ attribution: {
281
+ kind: "minor",
282
+ mode: WORKFLOW_MODE_ID
283
+ }
284
+ },
285
+ name: LAUNCH_TOOL,
286
+ label: "Launch Workflow",
287
+ description: "Start a workflow run and return its recorded launch result.",
288
+ parameters: z.toJSONSchema(feature.runTool.getInputSchema()),
289
+ executionMode: "serial",
290
+ async execute(_toolCallId, parameters, signal) {
291
+ signal?.throwIfAborted();
292
+ return callResult(await feature.runTool.execute(parameters));
293
+ }
294
+ },
295
+ {
296
+ when: {
297
+ state: { "minor-mode": WORKFLOW_MODE_ID },
298
+ attribution: {
299
+ kind: "minor",
300
+ mode: WORKFLOW_MODE_ID
301
+ }
302
+ },
303
+ name: RUN_TOOL,
304
+ label: "Workflow Run",
305
+ description: "Inspect the status of a workflow run or request cooperative control.",
306
+ parameters: {
307
+ type: "object",
308
+ properties: {
309
+ action: {
310
+ type: "string",
311
+ enum: [
312
+ "status",
313
+ "pause",
314
+ "resume",
315
+ "stop"
316
+ ]
317
+ },
318
+ runKey: {
319
+ type: "string",
320
+ minLength: 1
321
+ },
322
+ workspace: { type: "string" },
323
+ reason: { type: "string" },
324
+ expectedRunId: { type: "string" }
325
+ },
326
+ required: ["action", "runKey"],
327
+ additionalProperties: false
328
+ },
329
+ executionMode: "serial",
330
+ async execute(_toolCallId, parameters, signal) {
331
+ signal?.throwIfAborted();
332
+ const input = parameters;
333
+ const runs = readWorkflowRuns({ environment: host.context.environment }).filter((run) => runBelongsToSession(run, host.context.sessionId) && run.view.runKey === input.runKey && (input.workspace === void 0 || run.view.workspace === input.workspace));
334
+ if (runs.length !== 1) return {
335
+ ...callResult({ error: runs.length === 0 ? "Workflow run was not found in this session." : "Specify the workspace for this run key." }),
336
+ isError: true
337
+ };
338
+ const run = runs[0].view;
339
+ if (input.action === "status") return callResult(run);
340
+ if (!control) return callResult({ error: "Workflow activity is not active." });
341
+ if (typeof input.expectedRunId !== "string" || input.expectedRunId.length === 0) return callResult({ error: "expectedRunId is required for workflow control." });
342
+ return callResult(input.action === "pause" ? await control.pause(input.runKey, input.expectedRunId, input.workspace, input.reason) : input.action === "resume" ? await control.resume(input.runKey, input.expectedRunId, input.workspace) : await control.stop(input.runKey, input.expectedRunId, input.workspace, input.reason));
343
+ }
344
+ }
345
+ ],
346
+ commands: [{
347
+ when: {
348
+ state: { "minor-mode": WORKFLOW_MODE_ID },
349
+ attribution: {
350
+ kind: "minor",
351
+ mode: WORKFLOW_MODE_ID
352
+ }
353
+ },
354
+ name: "workflow-launch",
355
+ description: "Launch a workflow from a slash command.",
356
+ async execute(args, execution) {
357
+ const parsed = parseWorkflowLaunchCommand(args);
358
+ if ("error" in parsed) {
359
+ await execution.client.notify({
360
+ body: parsed.error,
361
+ level: "error"
362
+ });
363
+ return;
364
+ }
365
+ const rendered = callResult(await feature.runTool.execute({
366
+ workflowPath: parsed.workflow,
367
+ ...parsed.runner === void 0 ? {} : { runner: parsed.runner },
368
+ ...Object.keys(parsed.inputs).length === 0 ? {} : { inputs: parsed.inputs },
369
+ ...parsed.prompt === void 0 ? {} : { prompt: parsed.prompt }
370
+ })).content.find((entry) => entry.type === "text");
371
+ await execution.client.notify({
372
+ body: rendered?.type === "text" ? rendered.text : "Workflow launch requested.",
373
+ level: "info"
374
+ });
375
+ }
376
+ }],
377
+ onDispose() {
378
+ disposeControl();
379
+ runProvider?.dispose();
380
+ runProvider = void 0;
381
+ }
382
+ };
383
+ }
384
+ //#endregion
385
+ export { createWorkflowServerRuntime };
386
+
387
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["skill"],"sources":["../../../../src/services/serverRuntime/index.ts"],"sourcesContent":["import {\n type DoomHeadlessExecutionContext,\n type DoomHeadlessContent,\n type DoomHeadlessToolResult,\n} from '@agimon-ai/doompi-core/headless';\nimport { serverMinorModes } from '@agimon-ai/doompi-minor-mode';\nimport { defineMinorMode, type MinorModeOwner, type MinorModeState } from '@agimon-ai/doompi-minor-mode';\nimport { createEmbeddedWorkflowFeature } from '@agimon-ai/workflow-mcp';\nimport { z } from 'zod';\n\nimport { registerRunProvider, type RunProviderHandle } from '../../services/backgroundWork';\nimport { createWorkflowCatalogReader, presentWorkflowCatalog } from '../../services/webWorkflowCatalog';\nimport { defaultCatalogDeps } from '../../services/workflowCatalogDeps';\nimport { parseWorkflowLaunchCommand } from '../../services/workflowLaunchCommand';\nimport { readWorkflowSkill as skill } from '../../services/workflowResource';\nimport { presentWorkflowRuns, runBelongsToSession } from '../../services/workflowRuns';\nimport { readWorkflowRuns } from '../../services/workflowWatcher';\nimport { WORKFLOW_CATALOG_TYPE, WORKFLOW_RUNS_TYPE } from '../../types/webWorkflows';\n\nconst SOURCE = '@agimon-ai/doompi-workflow';\nconst WORKFLOW_MODE_ID = 'workflow';\nconst LIST_TOOL = 'list_workflows';\nconst LAUNCH_TOOL = 'launch_workflow';\nconst RUN_TOOL = 'workflow_run';\n\nfunction callResult(value: unknown): DoomHeadlessToolResult {\n const content: DoomHeadlessContent[] = [];\n if (typeof value === 'object' && value !== null && 'content' in value && Array.isArray(value.content)) {\n for (const item of value.content) {\n if (typeof item !== 'object' || item === null || !('type' in item)) continue;\n const record = item as Record<string, unknown>;\n if (record.type === 'text' && typeof record.text === 'string') content.push({ type: 'text', text: record.text });\n else if (record.type === 'image' && typeof record.data === 'string' && typeof record.mimeType === 'string') {\n content.push({ type: 'image', data: record.data, mimeType: record.mimeType });\n }\n }\n }\n if (content.length === 0) content.push({ type: 'text', text: JSON.stringify(value, null, 2) });\n return { content, details: value };\n}\n\nimport { type DoomHeadlessHostService } from '@agimon-ai/doompi-core/headless';\nimport { type DoomServerHostService, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/server-facet';\nexport function createWorkflowServerRuntime(\n host: DoomHeadlessHostService,\n serverHost: DoomServerHostService,\n): DoomServerSessionPlugin {\n if (serverHost.context.directEvents === undefined)\n throw new Error('Workflow headless facet requires the session direct event bus.');\n const directEvents = serverHost.context.directEvents;\n let runProvider: RunProviderHandle | undefined;\n const catalogReader = createWorkflowCatalogReader(defaultCatalogDeps());\n const publishLifecycle = async (executionContext: typeof host.context): Promise<boolean> => {\n const records = readWorkflowRuns({ environment: executionContext.environment }).filter((run) =>\n runBelongsToSession(run, executionContext.sessionId),\n );\n const activeItems = records\n .filter((run) => run.view.stage === 'running' && run.view.stale !== true)\n .map((run) => ({ id: `${run.view.workspace}/${run.view.runKey}`, sessionId: executionContext.sessionId }));\n runProvider?.update(activeItems);\n const runs = presentWorkflowRuns(\n records.map((run) => run.view),\n Date.now(),\n );\n directEvents.publish(WORKFLOW_RUNS_TYPE, executionContext.sessionId, { runs });\n try {\n directEvents.publish(WORKFLOW_CATALOG_TYPE, executionContext.sessionId, {\n cwd: executionContext.cwd,\n workflows: presentWorkflowCatalog(await catalogReader.read(executionContext.cwd)),\n });\n } catch (error) {\n const warning = error instanceof Error ? error.message : String(error);\n directEvents.publish(WORKFLOW_CATALOG_TYPE, executionContext.sessionId, {\n cwd: executionContext.cwd,\n workflows: [],\n warning,\n });\n }\n return activeItems.length > 0;\n };\n const feature = createEmbeddedWorkflowFeature();\n let control: ReturnType<typeof feature.createRunControl> | undefined;\n let controlDisposers: (() => void)[] = [];\n const disposeControl = (): void => {\n for (const dispose of controlDisposers.splice(0)) dispose();\n control?.dispose();\n control = undefined;\n };\n let modeOwner: MinorModeOwner | undefined;\n const modeSelected = (): boolean => (host.context.selection.state?.['minor-mode'] ?? []).includes(WORKFLOW_MODE_ID);\n const modeState = (): MinorModeState => {\n const active = modeSelected();\n return {\n activation: active ? 'active' : 'inactive',\n condition: 'ready',\n ...(active ? { detail: 'workflow tools available' } : {}),\n actions: [\n { id: 'activate', enabled: !active, ...(!active ? {} : { disabledReason: 'Workflow mode is active.' }) },\n { id: 'deactivate', enabled: active, ...(active ? {} : { disabledReason: 'Workflow mode is inactive.' }) },\n ],\n };\n };\n const selectMode = async (enabled: boolean): Promise<void> => {\n const modes = (host.context.selection.state?.['minor-mode'] ?? []).filter((mode) => mode !== WORKFLOW_MODE_ID);\n await host.changeSelection({\n axis: 'state',\n key: 'minor-mode',\n values: enabled ? [...modes, WORKFLOW_MODE_ID] : modes,\n });\n modeOwner?.publish();\n };\n modeOwner = defineMinorMode({\n descriptor: {\n source: SOURCE,\n id: WORKFLOW_MODE_ID,\n label: 'Workflow',\n description: 'Workflow discovery, launch, inspection, control, and recovery tools.',\n order: 20,\n actions: [\n {\n id: 'activate',\n label: 'Activate',\n description: 'Enable workflow tools for this session.',\n contexts: ['headless'],\n parameters: [],\n },\n {\n id: 'deactivate',\n label: 'Deactivate',\n description: 'Disable workflow tools without stopping active runs.',\n contexts: ['headless'],\n parameters: [],\n },\n ],\n },\n state: modeState,\n async handleAction(_runtime, actionId, _argumentsValue, execution) {\n execution.signal.throwIfAborted();\n if (actionId === 'activate') {\n await selectMode(true);\n return { message: 'Workflow mode activated.' };\n }\n if (actionId === 'deactivate') {\n await selectMode(false);\n return { message: 'Workflow mode deactivated.' };\n }\n throw new Error(`Unknown workflow mode action: ${actionId}`);\n },\n }).createOwner(undefined);\n return {\n services: [\n serverMinorModes([modeOwner]),\n (context) => {\n const provider = registerRunProvider(context);\n runProvider = provider;\n return () => {\n provider.dispose();\n if (runProvider === provider) runProvider = undefined;\n };\n },\n ],\n toolRestrictions: [\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID } },\n allowedTools: [LIST_TOOL, LAUNCH_TOOL, RUN_TOOL],\n },\n ],\n hooks: [\n {\n event: 'tool_execution_end',\n handle: async (_event, executionContext) => {\n await publishLifecycle(executionContext);\n },\n },\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n event: 'session_shutdown',\n handle: disposeControl,\n },\n ],\n resources: [\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: 'doompi-author-workflow',\n kind: 'skill',\n read: () => skill('doompi-author-workflow'),\n },\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: 'doompi-use-workflow',\n kind: 'skill',\n read: () => skill('doompi-use-workflow'),\n },\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: 'workflow-recovery',\n kind: 'skill',\n read: () => skill('workflow-recovery'),\n },\n ],\n activities: [\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: SOURCE,\n async start(executionContext) {\n const reportFailure = (error: unknown): void => {\n process.emitWarning(`Could not publish headless workflow state: ${String(error)}`);\n };\n const stopFor =\n (ownedControl: NonNullable<typeof control>): (() => void) =>\n () => {\n void publishLifecycle(executionContext)\n .then((active) => {\n if (!active && !modeSelected() && control === ownedControl) disposeControl();\n })\n .catch(reportFailure);\n };\n if (control !== undefined) {\n const ownedControl = control;\n await publishLifecycle(executionContext);\n return stopFor(ownedControl);\n }\n control = feature.createRunControl({});\n const ownedControl = control;\n const refresh = (): void => {\n void publishLifecycle(executionContext)\n .then((active) => {\n if (!active && !modeSelected() && control === ownedControl) disposeControl();\n })\n .catch(reportFailure);\n };\n controlDisposers = [\n ownedControl.on('runStarted', refresh),\n ownedControl.on('runUpdated', refresh),\n ownedControl.on('runFinished', refresh),\n ];\n try {\n await ownedControl.start();\n await publishLifecycle(executionContext);\n return stopFor(ownedControl);\n } catch (error) {\n if (control === ownedControl) disposeControl();\n throw error;\n }\n },\n },\n ],\n tools: [\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: LIST_TOOL,\n label: 'List Workflows',\n description: 'List workflow definitions available in this repository.',\n parameters: z.toJSONSchema(feature.listWorkflowsTool.getInputSchema()),\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal) {\n signal?.throwIfAborted();\n return callResult(\n await feature.listWorkflowsTool.execute(\n parameters as Parameters<typeof feature.listWorkflowsTool.execute>[0],\n ),\n );\n },\n },\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: LAUNCH_TOOL,\n label: 'Launch Workflow',\n description: 'Start a workflow run and return its recorded launch result.',\n parameters: z.toJSONSchema(feature.runTool.getInputSchema()),\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal) {\n signal?.throwIfAborted();\n return callResult(await feature.runTool.execute(parameters as Parameters<typeof feature.runTool.execute>[0]));\n },\n },\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: RUN_TOOL,\n label: 'Workflow Run',\n description: 'Inspect the status of a workflow run or request cooperative control.',\n parameters: {\n type: 'object',\n properties: {\n action: { type: 'string', enum: ['status', 'pause', 'resume', 'stop'] },\n runKey: { type: 'string', minLength: 1 },\n workspace: { type: 'string' },\n reason: { type: 'string' },\n expectedRunId: { type: 'string' },\n },\n required: ['action', 'runKey'],\n additionalProperties: false,\n },\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal) {\n signal?.throwIfAborted();\n const input = parameters as unknown as {\n action: 'status' | 'pause' | 'resume' | 'stop';\n runKey: string;\n workspace?: string;\n reason?: string;\n expectedRunId?: string;\n };\n const runs = readWorkflowRuns({ environment: host.context.environment }).filter(\n (run) =>\n runBelongsToSession(run, host.context.sessionId) &&\n run.view.runKey === input.runKey &&\n (input.workspace === undefined || run.view.workspace === input.workspace),\n );\n if (runs.length !== 1)\n return {\n ...callResult({\n error:\n runs.length === 0\n ? 'Workflow run was not found in this session.'\n : 'Specify the workspace for this run key.',\n }),\n isError: true,\n };\n const run = runs[0]!.view;\n if (input.action === 'status') return callResult(run);\n if (!control) return callResult({ error: 'Workflow activity is not active.' });\n if (typeof input.expectedRunId !== 'string' || input.expectedRunId.length === 0) {\n return callResult({ error: 'expectedRunId is required for workflow control.' });\n }\n const request =\n input.action === 'pause'\n ? await control.pause(input.runKey, input.expectedRunId, input.workspace, input.reason)\n : input.action === 'resume'\n ? await control.resume(input.runKey, input.expectedRunId, input.workspace)\n : await control.stop(input.runKey, input.expectedRunId, input.workspace, input.reason);\n return callResult(request);\n },\n },\n ],\n commands: [\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: 'workflow-launch',\n description: 'Launch a workflow from a slash command.',\n async execute(args: string, execution: DoomHeadlessExecutionContext) {\n const parsed = parseWorkflowLaunchCommand(args);\n if ('error' in parsed) {\n await execution.client.notify({ body: parsed.error, level: 'error' });\n return;\n }\n const result = await feature.runTool.execute({\n workflowPath: parsed.workflow,\n ...(parsed.runner === undefined ? {} : { runner: parsed.runner }),\n ...(Object.keys(parsed.inputs).length === 0 ? {} : { inputs: parsed.inputs }),\n ...(parsed.prompt === undefined ? {} : { prompt: parsed.prompt }),\n });\n const rendered = callResult(result).content.find((entry) => entry.type === 'text');\n await execution.client.notify({\n body: rendered?.type === 'text' ? rendered.text : 'Workflow launch requested.',\n level: 'info',\n });\n },\n },\n ],\n onDispose() {\n disposeControl();\n runProvider?.dispose();\n runProvider = undefined;\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ //#region src/services/webWorkflowCatalog/index.ts
2
+ function unchanged(left, right) {
3
+ return left !== void 0 && right !== void 0 && left.size === right.size && left.modifiedAt === right.modifiedAt;
4
+ }
5
+ function createWorkflowCatalogReader(deps) {
6
+ const cache = /* @__PURE__ */ new Map();
7
+ const detailFor = (path) => {
8
+ const stamp = deps.stamp(path);
9
+ const cached = cache.get(path);
10
+ if (cached && unchanged(cached.stamp, stamp)) return cached.detail;
11
+ const detail = deps.summarize(path);
12
+ if (stamp !== void 0) cache.set(path, {
13
+ stamp,
14
+ detail
15
+ });
16
+ return detail;
17
+ };
18
+ return {
19
+ async read(directory) {
20
+ return (await deps.list(directory)).map((entry) => {
21
+ const detail = detailFor(entry.path);
22
+ return {
23
+ path: entry.path,
24
+ relativePath: entry.relativePath,
25
+ name: entry.name === "" ? entry.relativePath : entry.name,
26
+ description: entry.description,
27
+ tags: entry.tags,
28
+ triggers: detail.triggers,
29
+ inputs: detail.inputs,
30
+ jobs: detail.jobs,
31
+ artifacts: detail.artifacts,
32
+ ...detail.runners === void 0 ? {} : { runners: detail.runners },
33
+ ...detail.error === void 0 ? {} : { error: detail.error }
34
+ };
35
+ });
36
+ },
37
+ forget(keep) {
38
+ for (const path of cache.keys()) if (!keep.has(path)) cache.delete(path);
39
+ }
40
+ };
41
+ }
42
+ /** The launchable rows first, then the ones that would not parse, name ordered. */
43
+ function presentWorkflowCatalog(entries) {
44
+ return [...entries].sort((left, right) => {
45
+ if (left.error === void 0 !== (right.error === void 0)) return left.error === void 0 ? -1 : 1;
46
+ return left.name.localeCompare(right.name);
47
+ });
48
+ }
49
+ //#endregion
50
+ exports.createWorkflowCatalogReader = createWorkflowCatalogReader;
51
+ exports.presentWorkflowCatalog = presentWorkflowCatalog;
52
+
53
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/services/webWorkflowCatalog/index.ts"],"sourcesContent":["import type {\n WorkflowCatalogArtifactView,\n WorkflowCatalogEntryView,\n WorkflowCatalogInputView,\n WorkflowCatalogJobView,\n} from '../../types/webWorkflows';\n/**\n * The cockpit's view of the workflows a session can launch.\n *\n * The engine already reads a repository's workflow files and parses one of\n * them into triggers, inputs, jobs, artifacts and compatible runners, so this\n * module only shapes that answer for the wire and remembers what it read.\n *\n * WHY A CACHE:\n * A session reads the catalog for its initial projection and when its lifecycle\n * publishes a workflow update. Entries are kept per path and reused while the\n * file's size and modification time are unchanged, which is the same test a\n * build tool makes and costs one stat per file.\n */\n\n/** What the engine reports for one workflow file before it is parsed. */\nexport interface CatalogListEntry {\n path: string;\n relativePath: string;\n name: string;\n description: string;\n tags: string[];\n}\n\n/** One file's parsed detail, or the reason it could not be read. */\nexport interface CatalogDetail {\n triggers: string[];\n inputs: WorkflowCatalogInputView[];\n jobs: WorkflowCatalogJobView[];\n artifacts: WorkflowCatalogArtifactView[];\n runners?: string[];\n error?: string;\n}\n\n/** What a file looked like when it was last parsed. */\nexport interface CatalogFileStamp {\n size: number;\n modifiedAt: number;\n}\n\nexport interface WorkflowCatalogReaderDeps {\n /** Every workflow file under a directory. */\n list(directory: string): Promise<CatalogListEntry[]>;\n /** One file's parsed detail; never throws, so a bad file cannot empty a board. */\n summarize(path: string): CatalogDetail;\n /** Size and modification time, or undefined when the file is gone. */\n stamp(path: string): CatalogFileStamp | undefined;\n}\n\ninterface CachedEntry {\n stamp: CatalogFileStamp;\n detail: CatalogDetail;\n}\n\n/** Reads one directory's catalog, reusing what it parsed last time. */\nexport interface WorkflowCatalogReader {\n read(directory: string): Promise<WorkflowCatalogEntryView[]>;\n /** Drops what was parsed for files no longer listed, so a cache cannot grow forever. */\n forget(keep: ReadonlySet<string>): void;\n}\n\nfunction unchanged(left: CatalogFileStamp | undefined, right: CatalogFileStamp | undefined): boolean {\n return left !== undefined && right !== undefined && left.size === right.size && left.modifiedAt === right.modifiedAt;\n}\n\nexport function createWorkflowCatalogReader(deps: WorkflowCatalogReaderDeps): WorkflowCatalogReader {\n const cache = new Map<string, CachedEntry>();\n\n const detailFor = (path: string): CatalogDetail => {\n const stamp = deps.stamp(path);\n const cached = cache.get(path);\n if (cached && unchanged(cached.stamp, stamp)) return cached.detail;\n const detail = deps.summarize(path);\n // A file that vanished between listing and stat is parsed anyway, which\n // answers with its own error; it just cannot be cached against a stamp.\n if (stamp !== undefined) cache.set(path, { stamp, detail });\n return detail;\n };\n\n return {\n async read(directory) {\n const listed = await deps.list(directory);\n return listed.map((entry) => {\n const detail = detailFor(entry.path);\n return {\n path: entry.path,\n relativePath: entry.relativePath,\n name: entry.name === '' ? entry.relativePath : entry.name,\n description: entry.description,\n tags: entry.tags,\n triggers: detail.triggers,\n inputs: detail.inputs,\n jobs: detail.jobs,\n artifacts: detail.artifacts,\n ...(detail.runners === undefined ? {} : { runners: detail.runners }),\n ...(detail.error === undefined ? {} : { error: detail.error }),\n };\n });\n },\n forget(keep) {\n for (const path of cache.keys()) {\n if (!keep.has(path)) cache.delete(path);\n }\n },\n };\n}\n\n/** The launchable rows first, then the ones that would not parse, name ordered. */\nexport function presentWorkflowCatalog(entries: readonly WorkflowCatalogEntryView[]): WorkflowCatalogEntryView[] {\n return [...entries].sort((left, right) => {\n if ((left.error === undefined) !== (right.error === undefined)) return left.error === undefined ? -1 : 1;\n return left.name.localeCompare(right.name);\n });\n}\n"],"mappings":";AAkEA,SAAS,UAAU,MAAoC,OAA8C;CACnG,OAAO,SAAS,KAAA,KAAa,UAAU,KAAA,KAAa,KAAK,SAAS,MAAM,QAAQ,KAAK,eAAe,MAAM;AAC5G;AAEA,SAAgB,4BAA4B,MAAwD;CAClG,MAAM,wBAAQ,IAAI,IAAyB;CAE3C,MAAM,aAAa,SAAgC;EACjD,MAAM,QAAQ,KAAK,MAAM,IAAI;EAC7B,MAAM,SAAS,MAAM,IAAI,IAAI;EAC7B,IAAI,UAAU,UAAU,OAAO,OAAO,KAAK,GAAG,OAAO,OAAO;EAC5D,MAAM,SAAS,KAAK,UAAU,IAAI;EAGlC,IAAI,UAAU,KAAA,GAAW,MAAM,IAAI,MAAM;GAAE;GAAO;EAAO,CAAC;EAC1D,OAAO;CACT;CAEA,OAAO;EACL,MAAM,KAAK,WAAW;GAEpB,QAAO,MADc,KAAK,KAAK,SAAS,EAAA,CAC1B,KAAK,UAAU;IAC3B,MAAM,SAAS,UAAU,MAAM,IAAI;IACnC,OAAO;KACL,MAAM,MAAM;KACZ,cAAc,MAAM;KACpB,MAAM,MAAM,SAAS,KAAK,MAAM,eAAe,MAAM;KACrD,aAAa,MAAM;KACnB,MAAM,MAAM;KACZ,UAAU,OAAO;KACjB,QAAQ,OAAO;KACf,MAAM,OAAO;KACb,WAAW,OAAO;KAClB,GAAI,OAAO,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,OAAO,QAAQ;KAClE,GAAI,OAAO,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;IAC9D;GACF,CAAC;EACH;EACA,OAAO,MAAM;GACX,KAAK,MAAM,QAAQ,MAAM,KAAK,GAC5B,IAAI,CAAC,KAAK,IAAI,IAAI,GAAG,MAAM,OAAO,IAAI;EAE1C;CACF;AACF;;AAGA,SAAgB,uBAAuB,SAA0E;CAC/G,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,MAAM,UAAU;EACxC,IAAK,KAAK,UAAU,KAAA,OAAgB,MAAM,UAAU,KAAA,IAAY,OAAO,KAAK,UAAU,KAAA,IAAY,KAAK;EACvG,OAAO,KAAK,KAAK,cAAc,MAAM,IAAI;CAC3C,CAAC;AACH"}
@@ -0,0 +1,52 @@
1
+ //#region src/services/webWorkflowCatalog/index.ts
2
+ function unchanged(left, right) {
3
+ return left !== void 0 && right !== void 0 && left.size === right.size && left.modifiedAt === right.modifiedAt;
4
+ }
5
+ function createWorkflowCatalogReader(deps) {
6
+ const cache = /* @__PURE__ */ new Map();
7
+ const detailFor = (path) => {
8
+ const stamp = deps.stamp(path);
9
+ const cached = cache.get(path);
10
+ if (cached && unchanged(cached.stamp, stamp)) return cached.detail;
11
+ const detail = deps.summarize(path);
12
+ if (stamp !== void 0) cache.set(path, {
13
+ stamp,
14
+ detail
15
+ });
16
+ return detail;
17
+ };
18
+ return {
19
+ async read(directory) {
20
+ return (await deps.list(directory)).map((entry) => {
21
+ const detail = detailFor(entry.path);
22
+ return {
23
+ path: entry.path,
24
+ relativePath: entry.relativePath,
25
+ name: entry.name === "" ? entry.relativePath : entry.name,
26
+ description: entry.description,
27
+ tags: entry.tags,
28
+ triggers: detail.triggers,
29
+ inputs: detail.inputs,
30
+ jobs: detail.jobs,
31
+ artifacts: detail.artifacts,
32
+ ...detail.runners === void 0 ? {} : { runners: detail.runners },
33
+ ...detail.error === void 0 ? {} : { error: detail.error }
34
+ };
35
+ });
36
+ },
37
+ forget(keep) {
38
+ for (const path of cache.keys()) if (!keep.has(path)) cache.delete(path);
39
+ }
40
+ };
41
+ }
42
+ /** The launchable rows first, then the ones that would not parse, name ordered. */
43
+ function presentWorkflowCatalog(entries) {
44
+ return [...entries].sort((left, right) => {
45
+ if (left.error === void 0 !== (right.error === void 0)) return left.error === void 0 ? -1 : 1;
46
+ return left.name.localeCompare(right.name);
47
+ });
48
+ }
49
+ //#endregion
50
+ export { createWorkflowCatalogReader, presentWorkflowCatalog };
51
+
52
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/webWorkflowCatalog/index.ts"],"sourcesContent":["import type {\n WorkflowCatalogArtifactView,\n WorkflowCatalogEntryView,\n WorkflowCatalogInputView,\n WorkflowCatalogJobView,\n} from '../../types/webWorkflows';\n/**\n * The cockpit's view of the workflows a session can launch.\n *\n * The engine already reads a repository's workflow files and parses one of\n * them into triggers, inputs, jobs, artifacts and compatible runners, so this\n * module only shapes that answer for the wire and remembers what it read.\n *\n * WHY A CACHE:\n * A session reads the catalog for its initial projection and when its lifecycle\n * publishes a workflow update. Entries are kept per path and reused while the\n * file's size and modification time are unchanged, which is the same test a\n * build tool makes and costs one stat per file.\n */\n\n/** What the engine reports for one workflow file before it is parsed. */\nexport interface CatalogListEntry {\n path: string;\n relativePath: string;\n name: string;\n description: string;\n tags: string[];\n}\n\n/** One file's parsed detail, or the reason it could not be read. */\nexport interface CatalogDetail {\n triggers: string[];\n inputs: WorkflowCatalogInputView[];\n jobs: WorkflowCatalogJobView[];\n artifacts: WorkflowCatalogArtifactView[];\n runners?: string[];\n error?: string;\n}\n\n/** What a file looked like when it was last parsed. */\nexport interface CatalogFileStamp {\n size: number;\n modifiedAt: number;\n}\n\nexport interface WorkflowCatalogReaderDeps {\n /** Every workflow file under a directory. */\n list(directory: string): Promise<CatalogListEntry[]>;\n /** One file's parsed detail; never throws, so a bad file cannot empty a board. */\n summarize(path: string): CatalogDetail;\n /** Size and modification time, or undefined when the file is gone. */\n stamp(path: string): CatalogFileStamp | undefined;\n}\n\ninterface CachedEntry {\n stamp: CatalogFileStamp;\n detail: CatalogDetail;\n}\n\n/** Reads one directory's catalog, reusing what it parsed last time. */\nexport interface WorkflowCatalogReader {\n read(directory: string): Promise<WorkflowCatalogEntryView[]>;\n /** Drops what was parsed for files no longer listed, so a cache cannot grow forever. */\n forget(keep: ReadonlySet<string>): void;\n}\n\nfunction unchanged(left: CatalogFileStamp | undefined, right: CatalogFileStamp | undefined): boolean {\n return left !== undefined && right !== undefined && left.size === right.size && left.modifiedAt === right.modifiedAt;\n}\n\nexport function createWorkflowCatalogReader(deps: WorkflowCatalogReaderDeps): WorkflowCatalogReader {\n const cache = new Map<string, CachedEntry>();\n\n const detailFor = (path: string): CatalogDetail => {\n const stamp = deps.stamp(path);\n const cached = cache.get(path);\n if (cached && unchanged(cached.stamp, stamp)) return cached.detail;\n const detail = deps.summarize(path);\n // A file that vanished between listing and stat is parsed anyway, which\n // answers with its own error; it just cannot be cached against a stamp.\n if (stamp !== undefined) cache.set(path, { stamp, detail });\n return detail;\n };\n\n return {\n async read(directory) {\n const listed = await deps.list(directory);\n return listed.map((entry) => {\n const detail = detailFor(entry.path);\n return {\n path: entry.path,\n relativePath: entry.relativePath,\n name: entry.name === '' ? entry.relativePath : entry.name,\n description: entry.description,\n tags: entry.tags,\n triggers: detail.triggers,\n inputs: detail.inputs,\n jobs: detail.jobs,\n artifacts: detail.artifacts,\n ...(detail.runners === undefined ? {} : { runners: detail.runners }),\n ...(detail.error === undefined ? {} : { error: detail.error }),\n };\n });\n },\n forget(keep) {\n for (const path of cache.keys()) {\n if (!keep.has(path)) cache.delete(path);\n }\n },\n };\n}\n\n/** The launchable rows first, then the ones that would not parse, name ordered. */\nexport function presentWorkflowCatalog(entries: readonly WorkflowCatalogEntryView[]): WorkflowCatalogEntryView[] {\n return [...entries].sort((left, right) => {\n if ((left.error === undefined) !== (right.error === undefined)) return left.error === undefined ? -1 : 1;\n return left.name.localeCompare(right.name);\n });\n}\n"],"mappings":";AAkEA,SAAS,UAAU,MAAoC,OAA8C;CACnG,OAAO,SAAS,KAAA,KAAa,UAAU,KAAA,KAAa,KAAK,SAAS,MAAM,QAAQ,KAAK,eAAe,MAAM;AAC5G;AAEA,SAAgB,4BAA4B,MAAwD;CAClG,MAAM,wBAAQ,IAAI,IAAyB;CAE3C,MAAM,aAAa,SAAgC;EACjD,MAAM,QAAQ,KAAK,MAAM,IAAI;EAC7B,MAAM,SAAS,MAAM,IAAI,IAAI;EAC7B,IAAI,UAAU,UAAU,OAAO,OAAO,KAAK,GAAG,OAAO,OAAO;EAC5D,MAAM,SAAS,KAAK,UAAU,IAAI;EAGlC,IAAI,UAAU,KAAA,GAAW,MAAM,IAAI,MAAM;GAAE;GAAO;EAAO,CAAC;EAC1D,OAAO;CACT;CAEA,OAAO;EACL,MAAM,KAAK,WAAW;GAEpB,QAAO,MADc,KAAK,KAAK,SAAS,EAAA,CAC1B,KAAK,UAAU;IAC3B,MAAM,SAAS,UAAU,MAAM,IAAI;IACnC,OAAO;KACL,MAAM,MAAM;KACZ,cAAc,MAAM;KACpB,MAAM,MAAM,SAAS,KAAK,MAAM,eAAe,MAAM;KACrD,aAAa,MAAM;KACnB,MAAM,MAAM;KACZ,UAAU,OAAO;KACjB,QAAQ,OAAO;KACf,MAAM,OAAO;KACb,WAAW,OAAO;KAClB,GAAI,OAAO,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,OAAO,QAAQ;KAClE,GAAI,OAAO,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;IAC9D;GACF,CAAC;EACH;EACA,OAAO,MAAM;GACX,KAAK,MAAM,QAAQ,MAAM,KAAK,GAC5B,IAAI,CAAC,KAAK,IAAI,IAAI,GAAG,MAAM,OAAO,IAAI;EAE1C;CACF;AACF;;AAGA,SAAgB,uBAAuB,SAA0E;CAC/G,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,MAAM,UAAU;EACxC,IAAK,KAAK,UAAU,KAAA,OAAgB,MAAM,UAAU,KAAA,IAAY,OAAO,KAAK,UAAU,KAAA,IAAY,KAAK;EACvG,OAAO,KAAK,KAAK,cAAc,MAAM,IAAI;CAC3C,CAAC;AACH"}
@@ -0,0 +1,74 @@
1
+ const require_index = require("../webWorkflowCatalog/index.cjs");
2
+ const require_index$1 = require("../workflowCatalogDeps/index.cjs");
3
+ const require_webWorkflows = require("../../types/webWorkflows.cjs");
4
+ //#region src/services/workflowCatalogChannel/index.ts
5
+ /**
6
+ * The workflow catalog channel. Durable state seeds a session once, then
7
+ * session lifecycle events deliver updates over the direct event bus.
8
+ */
9
+ function createWorkflowCatalogChannel(options = {}) {
10
+ const reader = require_index.createWorkflowCatalogReader(options.deps ?? require_index$1.defaultCatalogDeps());
11
+ return {
12
+ frameType: require_webWorkflows.WORKFLOW_CATALOG_TYPE,
13
+ start(host) {
14
+ const scopes = /* @__PURE__ */ new Map();
15
+ const latest = /* @__PURE__ */ new Map();
16
+ const subscriptions = /* @__PURE__ */ new Map();
17
+ const publish = (scope, payload) => {
18
+ latest.set(scope.sessionId, payload);
19
+ host.publish(scope.sessionId, payload);
20
+ };
21
+ const readInitial = async (scope) => {
22
+ let payload;
23
+ try {
24
+ payload = {
25
+ cwd: scope.cwd,
26
+ workflows: require_index.presentWorkflowCatalog(await reader.read(scope.cwd))
27
+ };
28
+ } catch (error) {
29
+ const warning = error instanceof Error ? error.message : String(error);
30
+ payload = {
31
+ cwd: scope.cwd,
32
+ workflows: [],
33
+ warning
34
+ };
35
+ host.onNotice(`workflow catalog for ${scope.cwd} is unavailable (${warning})`);
36
+ }
37
+ if (scopes.get(scope.sessionId) === scope) publish(scope, payload);
38
+ };
39
+ return {
40
+ payloadFor(scope) {
41
+ return scopes.has(scope.sessionId) ? latest.get(scope.sessionId) : void 0;
42
+ },
43
+ sessionAdded(scope) {
44
+ scopes.set(scope.sessionId, scope);
45
+ subscriptions.get(scope.sessionId)?.();
46
+ const unsubscribe = host.directEvents.subscribe(require_webWorkflows.WORKFLOW_CATALOG_TYPE, scope.sessionId, (value) => {
47
+ if (isWorkflowCatalogPayload(value)) publish(scope, value);
48
+ }, { replayLatest: true });
49
+ subscriptions.set(scope.sessionId, unsubscribe);
50
+ readInitial(scope);
51
+ },
52
+ sessionRemoved(sessionId) {
53
+ subscriptions.get(sessionId)?.();
54
+ subscriptions.delete(sessionId);
55
+ scopes.delete(sessionId);
56
+ latest.delete(sessionId);
57
+ },
58
+ close() {
59
+ for (const unsubscribe of subscriptions.values()) unsubscribe();
60
+ subscriptions.clear();
61
+ scopes.clear();
62
+ latest.clear();
63
+ }
64
+ };
65
+ }
66
+ };
67
+ }
68
+ function isWorkflowCatalogPayload(value) {
69
+ return typeof value === "object" && value !== null && typeof value.cwd === "string" && Array.isArray(value.workflows);
70
+ }
71
+ //#endregion
72
+ exports.createWorkflowCatalogChannel = createWorkflowCatalogChannel;
73
+
74
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["createWorkflowCatalogReader","defaultCatalogDeps","WORKFLOW_CATALOG_TYPE","presentWorkflowCatalog"],"sources":["../../../../src/services/workflowCatalogChannel/index.ts"],"sourcesContent":["import type { DoomHubChannelSource, DoomHubSessionScope, DoomHubChannel } from '@agimon-ai/doompi-core/hub-channel';\n\nimport {\n createWorkflowCatalogReader,\n presentWorkflowCatalog,\n type WorkflowCatalogReaderDeps,\n} from '../../services/webWorkflowCatalog';\nimport { defaultCatalogDeps } from '../../services/workflowCatalogDeps';\nimport { WORKFLOW_CATALOG_TYPE, type WorkflowCatalogPayload } from '../../types/webWorkflows';\n\nexport interface WorkflowCatalogChannelOptions {\n deps?: WorkflowCatalogReaderDeps;\n}\n\n/**\n * The workflow catalog channel. Durable state seeds a session once, then\n * session lifecycle events deliver updates over the direct event bus.\n */\nexport function createWorkflowCatalogChannel(options: WorkflowCatalogChannelOptions = {}): DoomHubChannel {\n const reader = createWorkflowCatalogReader(options.deps ?? defaultCatalogDeps());\n return {\n frameType: WORKFLOW_CATALOG_TYPE,\n start(host) {\n const scopes = new Map<string, DoomHubSessionScope>();\n const latest = new Map<string, WorkflowCatalogPayload>();\n const subscriptions = new Map<string, () => void>();\n const publish = (scope: DoomHubSessionScope, payload: WorkflowCatalogPayload): void => {\n latest.set(scope.sessionId, payload);\n host.publish(scope.sessionId, payload);\n };\n const readInitial = async (scope: DoomHubSessionScope): Promise<void> => {\n let payload: WorkflowCatalogPayload;\n try {\n payload = {\n cwd: scope.cwd,\n workflows: presentWorkflowCatalog(await reader.read(scope.cwd)),\n };\n } catch (error) {\n const warning = error instanceof Error ? error.message : String(error);\n payload = { cwd: scope.cwd, workflows: [], warning };\n host.onNotice(`workflow catalog for ${scope.cwd} is unavailable (${warning})`);\n }\n if (scopes.get(scope.sessionId) === scope) publish(scope, payload);\n };\n const source: DoomHubChannelSource = {\n payloadFor(scope) {\n return scopes.has(scope.sessionId) ? latest.get(scope.sessionId) : undefined;\n },\n sessionAdded(scope) {\n scopes.set(scope.sessionId, scope);\n subscriptions.get(scope.sessionId)?.();\n const unsubscribe = host.directEvents.subscribe(\n WORKFLOW_CATALOG_TYPE,\n scope.sessionId,\n (value) => {\n if (isWorkflowCatalogPayload(value)) publish(scope, value);\n },\n { replayLatest: true },\n );\n subscriptions.set(scope.sessionId, unsubscribe);\n void readInitial(scope);\n },\n sessionRemoved(sessionId) {\n subscriptions.get(sessionId)?.();\n subscriptions.delete(sessionId);\n scopes.delete(sessionId);\n latest.delete(sessionId);\n },\n close() {\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n scopes.clear();\n latest.clear();\n },\n };\n return source;\n },\n };\n}\n\nfunction isWorkflowCatalogPayload(value: unknown): value is WorkflowCatalogPayload {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { cwd?: unknown }).cwd === 'string' &&\n Array.isArray((value as { workflows?: unknown }).workflows)\n );\n}\n"],"mappings":";;;;;;;;AAkBA,SAAgB,6BAA6B,UAAyC,CAAC,GAAmB;CACxG,MAAM,SAASA,cAAAA,4BAA4B,QAAQ,QAAQC,gBAAAA,mBAAmB,CAAC;CAC/E,OAAO;EACL,WAAWC,qBAAAA;EACX,MAAM,MAAM;GACV,MAAM,yBAAS,IAAI,IAAiC;GACpD,MAAM,yBAAS,IAAI,IAAoC;GACvD,MAAM,gCAAgB,IAAI,IAAwB;GAClD,MAAM,WAAW,OAA4B,YAA0C;IACrF,OAAO,IAAI,MAAM,WAAW,OAAO;IACnC,KAAK,QAAQ,MAAM,WAAW,OAAO;GACvC;GACA,MAAM,cAAc,OAAO,UAA8C;IACvE,IAAI;IACJ,IAAI;KACF,UAAU;MACR,KAAK,MAAM;MACX,WAAWC,cAAAA,uBAAuB,MAAM,OAAO,KAAK,MAAM,GAAG,CAAC;KAChE;IACF,SAAS,OAAO;KACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;KACrE,UAAU;MAAE,KAAK,MAAM;MAAK,WAAW,CAAC;MAAG;KAAQ;KACnD,KAAK,SAAS,wBAAwB,MAAM,IAAI,mBAAmB,QAAQ,EAAE;IAC/E;IACA,IAAI,OAAO,IAAI,MAAM,SAAS,MAAM,OAAO,QAAQ,OAAO,OAAO;GACnE;GAgCA,OAAO;IA9BL,WAAW,OAAO;KAChB,OAAO,OAAO,IAAI,MAAM,SAAS,IAAI,OAAO,IAAI,MAAM,SAAS,IAAI,KAAA;IACrE;IACA,aAAa,OAAO;KAClB,OAAO,IAAI,MAAM,WAAW,KAAK;KACjC,cAAc,IAAI,MAAM,SAAS,CAAC,GAAG;KACrC,MAAM,cAAc,KAAK,aAAa,UACpCD,qBAAAA,uBACA,MAAM,YACL,UAAU;MACT,IAAI,yBAAyB,KAAK,GAAG,QAAQ,OAAO,KAAK;KAC3D,GACA,EAAE,cAAc,KAAK,CACvB;KACA,cAAc,IAAI,MAAM,WAAW,WAAW;KAC9C,YAAiB,KAAK;IACxB;IACA,eAAe,WAAW;KACxB,cAAc,IAAI,SAAS,CAAC,GAAG;KAC/B,cAAc,OAAO,SAAS;KAC9B,OAAO,OAAO,SAAS;KACvB,OAAO,OAAO,SAAS;IACzB;IACA,QAAQ;KACN,KAAK,MAAM,eAAe,cAAc,OAAO,GAAG,YAAY;KAC9D,cAAc,MAAM;KACpB,OAAO,MAAM;KACb,OAAO,MAAM;IACf;GAEU;EACd;CACF;AACF;AAEA,SAAS,yBAAyB,OAAiD;CACjF,OACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAA4B,QAAQ,YAC5C,MAAM,QAAS,MAAkC,SAAS;AAE9D"}