@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,490 @@
1
+ import { DoomToolCall, DoomToolResult, renderToolHeading } from "@agimon-ai/doompi-ui/toolChrome";
2
+ //#region src/tui/workflow/workflowToolRender.ts
3
+ const COLLAPSED_CATALOG_ROWS = 6;
4
+ const COLLAPSED_DETAIL_LINES = 8;
5
+ function asRecord(value) {
6
+ if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
7
+ return value;
8
+ }
9
+ function inlineText(value) {
10
+ let normalized = "";
11
+ for (const character of value) {
12
+ const code = character.codePointAt(0) ?? 0;
13
+ normalized += code <= 31 || code === 127 ? " " : character;
14
+ }
15
+ return normalized.replace(/\s+/gu, " ").trim();
16
+ }
17
+ function readString(record, key) {
18
+ const value = record?.[key];
19
+ if (typeof value !== "string") return void 0;
20
+ return inlineText(value) || void 0;
21
+ }
22
+ function readNumber(record, key) {
23
+ const value = record?.[key];
24
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
25
+ }
26
+ function readBoolean(record, key) {
27
+ const value = record?.[key];
28
+ return typeof value === "boolean" ? value : void 0;
29
+ }
30
+ function readStringArray(record, key) {
31
+ const value = record?.[key];
32
+ if (!Array.isArray(value)) return [];
33
+ return value.filter((item) => typeof item === "string");
34
+ }
35
+ function parseJsonRecord(text) {
36
+ if (!text) return void 0;
37
+ try {
38
+ return asRecord(JSON.parse(text));
39
+ } catch {
40
+ return;
41
+ }
42
+ }
43
+ function textBlocks(result) {
44
+ if (!Array.isArray(result.content)) return [];
45
+ return result.content.flatMap((item) => {
46
+ const record = asRecord(item);
47
+ return record?.type === "text" && typeof record.text === "string" ? [record.text] : [];
48
+ });
49
+ }
50
+ function detailLines(result) {
51
+ return textBlocks(result).flatMap((block) => block.split("\n")).map((line) => line.trimEnd()).filter((line) => line.length > 0);
52
+ }
53
+ function firstPayload(result) {
54
+ return parseJsonRecord(textBlocks(result)[0]);
55
+ }
56
+ function plural(count, singular, pluralForm = `${singular}s`) {
57
+ return count === 1 ? singular : pluralForm;
58
+ }
59
+ function labelValue(label, value, theme) {
60
+ return `${theme.fg("dim", `${label} `)}${theme.fg("text", value)}`;
61
+ }
62
+ function targetScope(args) {
63
+ const runKey = readString(args, "runKey");
64
+ if (!runKey) return void 0;
65
+ const workspace = readString(args, "workspace");
66
+ return workspace ? `${workspace}/${runKey}` : runKey;
67
+ }
68
+ function toolAction(toolName, args) {
69
+ if (toolName === "list_workflows") return "list";
70
+ if (toolName === "launch_workflow") return "launch";
71
+ return readString(args, "action") ?? "run";
72
+ }
73
+ function toolTarget(toolName, args) {
74
+ if (toolName === "list_workflows") return readString(args, "directory");
75
+ if (toolName === "launch_workflow") return readString(args, "workflowPath");
76
+ return targetScope(args);
77
+ }
78
+ function renderResult(lines, theme, expanded) {
79
+ return new DoomToolResult(lines, theme, { wrap: expanded });
80
+ }
81
+ function hiddenDetailLine(hidden, theme) {
82
+ return theme.fg("dim", `… ${hidden} more · ctrl+o`);
83
+ }
84
+ function statusTimestamp(value) {
85
+ return value.replace("T", " ").replace(/\.\d{3}Z$/, "Z");
86
+ }
87
+ function workflowNameFromPath(path) {
88
+ if (!path) return "workflow";
89
+ const filename = path.split("/").at(-1) ?? path;
90
+ return filename.replace(/\.workflow\.ya?ml$/u, "") || filename;
91
+ }
92
+ function callMetadata(toolName, args, theme) {
93
+ const values = [];
94
+ if (toolName === "list_workflows") {
95
+ const page = readNumber(args, "page");
96
+ const pageSize = readNumber(args, "pageSize");
97
+ if (page !== void 0) values.push(`page ${page}`);
98
+ if (pageSize !== void 0) values.push(`${pageSize}/page`);
99
+ if (readString(args, "filter")) values.push("filtered");
100
+ const tags = readStringArray(args, "tags");
101
+ if (tags.length > 0) values.push(`${tags.length} ${plural(tags.length, "tag")}`);
102
+ } else if (toolName === "launch_workflow") {
103
+ const job = readString(args, "job");
104
+ const runner = readString(args, "runner");
105
+ const workspace = readString(args, "workspace");
106
+ const inputCount = Object.keys(asRecord(args.inputs) ?? {}).length;
107
+ const environmentCount = Object.keys(asRecord(args.env) ?? {}).length;
108
+ if (workspace) values.push(`workspace ${workspace}`);
109
+ if (job) values.push(`job ${job}`);
110
+ if (runner) values.push(`runner ${runner}`);
111
+ if (readBoolean(args, "dryRun")) values.push("dry run");
112
+ if (readString(args, "prompt")) values.push("with prompt");
113
+ if (inputCount > 0) values.push(`${inputCount} ${plural(inputCount, "input")}`);
114
+ if (environmentCount > 0) values.push(`${environmentCount} env`);
115
+ } else {
116
+ if (readString(args, "expectedRunId")) values.push("generation checked");
117
+ if (readString(args, "reason")) values.push("with reason");
118
+ if (readBoolean(args, "dryRun")) values.push("dry run");
119
+ if (readString(args, "job")) values.push("job override");
120
+ if (readString(args, "runner")) values.push("runner override");
121
+ }
122
+ return values.map((value) => theme.fg("dim", value));
123
+ }
124
+ function renderWorkflowToolCall(toolName, args, theme) {
125
+ const action = toolAction(toolName, args);
126
+ const target = toolTarget(toolName, args);
127
+ const metadata = callMetadata(toolName, args, theme);
128
+ const purpose = [
129
+ theme.bold(action),
130
+ target ? theme.fg("muted", target) : void 0,
131
+ ...metadata
132
+ ].filter((part) => !!part).join(theme.fg("dim", " · "));
133
+ return new DoomToolCall(renderToolHeading("workflow", purpose, theme));
134
+ }
135
+ function parseCatalog(payload) {
136
+ if (!Array.isArray(payload?.workflows)) return void 0;
137
+ const workflows = payload.workflows.flatMap((value) => {
138
+ const record = asRecord(value);
139
+ const path = readString(record, "path");
140
+ if (!record || !path) return [];
141
+ return [{
142
+ description: readString(record, "description") ?? "",
143
+ name: readString(record, "name") ?? "",
144
+ path,
145
+ tags: readStringArray(record, "tags")
146
+ }];
147
+ });
148
+ const tags = Array.isArray(payload.tags) ? payload.tags.flatMap((value) => {
149
+ const record = asRecord(value);
150
+ const tag = readString(record, "tag");
151
+ const count = readNumber(record, "count");
152
+ return tag && count !== void 0 ? [{
153
+ count,
154
+ tag
155
+ }] : [];
156
+ }) : [];
157
+ return {
158
+ directory: readString(payload, "directory"),
159
+ page: readNumber(payload, "page") ?? 1,
160
+ pageSize: readNumber(payload, "pageSize") ?? workflows.length,
161
+ tags,
162
+ total: readNumber(payload, "total") ?? workflows.length,
163
+ totalPages: readNumber(payload, "totalPages") ?? (workflows.length > 0 ? 1 : 0),
164
+ workflows
165
+ };
166
+ }
167
+ function catalogItemLines(item, expanded, theme) {
168
+ const name = item.name || workflowNameFromPath(item.path);
169
+ const lines = [`${theme.fg("accent", "›")} ${theme.bold(name)} ${theme.fg("muted", `· ${item.path}`)}`];
170
+ if (!expanded) return lines;
171
+ if (item.description) lines.push(` ${theme.fg("text", item.description)}`);
172
+ if (item.tags.length > 0) lines.push(` ${labelValue("tags", item.tags.join(", "), theme)}`);
173
+ return lines;
174
+ }
175
+ function renderCatalogResult(result, options, theme) {
176
+ const catalog = parseCatalog(firstPayload(result));
177
+ if (!catalog) return void 0;
178
+ const pageLabel = `page ${catalog.page}/${catalog.totalPages}`;
179
+ const summary = `${theme.fg(catalog.total > 0 ? "success" : "muted", catalog.total > 0 ? "✓" : "○")} ${theme.bold(`${catalog.total} ${plural(catalog.total, "workflow")}`)} ${theme.fg("dim", `· ${pageLabel}`)}`;
180
+ const shown = options.expanded ? catalog.workflows : catalog.workflows.slice(0, COLLAPSED_CATALOG_ROWS);
181
+ const lines = [summary, ...shown.flatMap((item) => catalogItemLines(item, options.expanded, theme))];
182
+ const hidden = catalog.workflows.length - shown.length;
183
+ if (hidden > 0) lines.push(hiddenDetailLine(hidden, theme));
184
+ if (options.expanded) {
185
+ if (catalog.tags.length > 0) {
186
+ const tags = catalog.tags.map(({ count, tag }) => `${tag} (${count})`).join(", ");
187
+ lines.push(labelValue("available tags", tags, theme));
188
+ }
189
+ if (catalog.directory) lines.push(labelValue("directory", catalog.directory, theme));
190
+ lines.push(labelValue("page size", String(catalog.pageSize), theme));
191
+ }
192
+ return renderResult(lines, theme, options.expanded);
193
+ }
194
+ function readWorkflowState(record) {
195
+ const stage = readString(record, "effectiveStage") ?? readString(record, "stage") ?? "unknown";
196
+ const outcome = readString(record, "effectiveOutcome") ?? readString(record, "outcome");
197
+ const executionState = readString(record, "executionState");
198
+ if (outcome === "interrupted") return {
199
+ color: "warning",
200
+ glyph: "!",
201
+ label: "interrupted"
202
+ };
203
+ if (stage === "error" || outcome === "failed") return {
204
+ color: "error",
205
+ glyph: "✗",
206
+ label: "failed"
207
+ };
208
+ if (stage === "completed" && outcome === "skipped") return {
209
+ color: "muted",
210
+ glyph: "○",
211
+ label: "skipped"
212
+ };
213
+ if (stage === "completed") return {
214
+ color: "success",
215
+ glyph: "✓",
216
+ label: "completed"
217
+ };
218
+ if (executionState === "paused") return {
219
+ color: "warning",
220
+ glyph: "Ⅱ",
221
+ label: "paused"
222
+ };
223
+ if (executionState === "pause_requested") return {
224
+ color: "warning",
225
+ glyph: "◐",
226
+ label: "pause requested"
227
+ };
228
+ if (executionState === "resume_requested") return {
229
+ color: "warning",
230
+ glyph: "◐",
231
+ label: "resume requested"
232
+ };
233
+ if (stage === "running") return {
234
+ color: "accent",
235
+ glyph: "◐",
236
+ label: "running"
237
+ };
238
+ return {
239
+ color: "muted",
240
+ glyph: "○",
241
+ label: stage
242
+ };
243
+ }
244
+ function recordScope(record) {
245
+ const runKey = readString(record, "runKey") ?? "unknown run";
246
+ const workspace = readString(record, "workspace");
247
+ return workspace ? `${workspace}/${runKey}` : runKey;
248
+ }
249
+ function currentActivity(record, theme) {
250
+ const cursor = asRecord(record.executionCursor);
251
+ const job = readString(cursor, "job") ?? readString(record, "job");
252
+ const step = readString(cursor, "stepName");
253
+ const phase = readString(cursor, "phase");
254
+ if (!job && !step && !phase) return void 0;
255
+ const context = job ?? phase ?? "workflow";
256
+ return ` ${theme.fg("muted", `[${context}]`)} ${theme.fg("text", step ?? phase ?? "running")}`;
257
+ }
258
+ function launcherLabel(record) {
259
+ const launcher = asRecord(record.launcher);
260
+ const type = readString(launcher, "type");
261
+ if (!type) return void 0;
262
+ const identity = readString(launcher, "sessionName") ?? readString(launcher, "workspaceId");
263
+ return identity ? `${type} ${identity}` : type;
264
+ }
265
+ function workflowRecordLines(record, expanded, theme) {
266
+ const runKey = readString(record, "runKey");
267
+ const stage = readString(record, "stage");
268
+ if (!runKey || !stage) return void 0;
269
+ const state = readWorkflowState(record);
270
+ const displayName = readString(record, "displayName") ?? runKey;
271
+ const lines = [`${theme.fg(state.color, state.glyph)} ${theme.bold(displayName)} ${theme.fg("dim", `· ${recordScope(record)} ·`)} ${theme.fg(state.color, state.label)}`];
272
+ const activity = currentActivity(record, theme);
273
+ if (activity) lines.push(activity);
274
+ const failure = readString(record, "errorMessage") ?? readString(record, "failureReason");
275
+ if (failure) lines.push(`${theme.fg("error", "error")} ${theme.fg("text", failure)}`);
276
+ const staleReason = readString(record, "staleReason");
277
+ if (staleReason) lines.push(`${theme.fg("warning", "stale")} ${theme.fg("text", staleReason)}`);
278
+ const conciseMetadata = [
279
+ readString(record, "runner") ? `runner ${readString(record, "runner")}` : void 0,
280
+ readBoolean(record, "dryRun") ? "dry run" : void 0,
281
+ readNumber(record, "exitCode") !== void 0 ? `exit ${readNumber(record, "exitCode")}` : void 0,
282
+ readString(record, "startedAt") ? `started ${statusTimestamp(readString(record, "startedAt") ?? "")}` : void 0
283
+ ].filter((value) => !!value);
284
+ if (conciseMetadata.length > 0) lines.push(theme.fg("dim", conciseMetadata.join(" · ")));
285
+ if (!expanded) return lines;
286
+ const detailedValues = [
287
+ ["workflow", readString(record, "workflowPath")],
288
+ ["workflow id", readString(record, "workflowId")],
289
+ ["run id", readString(record, "runId")],
290
+ ["launcher", launcherLabel(record)],
291
+ ["job", readString(record, "job")],
292
+ ["outcome", readString(record, "effectiveOutcome") ?? readString(record, "outcome")],
293
+ ["finished", readString(record, "finishedAt") ? statusTimestamp(readString(record, "finishedAt") ?? "") : void 0],
294
+ ["pid", readNumber(record, "pid")?.toString()],
295
+ ["repair", readString(record, "activeRepairId") ? `#${readString(record, "activeRepairId")}` : void 0],
296
+ ["worktree", readString(record, "worktreeBranch") ?? readString(record, "worktreePath")]
297
+ ];
298
+ for (const [label, value] of detailedValues) if (value) lines.push(labelValue(label, value, theme));
299
+ return lines;
300
+ }
301
+ function renderStatusResult(result, options, theme) {
302
+ const payload = firstPayload(result);
303
+ if (!payload) return void 0;
304
+ const lines = workflowRecordLines(payload, options.expanded, theme);
305
+ return lines ? renderResult(lines, theme, options.expanded) : void 0;
306
+ }
307
+ function nestedRequestedAt(payload) {
308
+ return readString(asRecord(payload?.request), "requestedAt") ?? readString(payload, "requestedAt");
309
+ }
310
+ function renderControlResult(action, args, result, options, theme) {
311
+ const payload = firstPayload(result);
312
+ const scope = targetScope(args) ?? readString(payload, "runKey") ?? "workflow";
313
+ const payloadWorkspace = readString(payload, "workspace");
314
+ const resolvedScope = payloadWorkspace && !scope.includes("/") ? `${payloadWorkspace}/${scope}` : scope;
315
+ const lines = [`${theme.fg("warning", "◐")} ${theme.bold(`${action} requested`)} ${theme.fg("dim", `· ${resolvedScope}`)}`];
316
+ const requestedAt = nestedRequestedAt(payload);
317
+ if (requestedAt) lines.push(labelValue("requested", statusTimestamp(requestedAt), theme));
318
+ if (options.expanded) lines.push(theme.fg("dim", "verify the transition with workflow_run status"));
319
+ return renderResult(lines, theme, options.expanded);
320
+ }
321
+ function matchLine(text, pattern) {
322
+ return text.match(pattern)?.[1]?.trim();
323
+ }
324
+ function launchSummary(text, args) {
325
+ const startedName = matchLine(text, /^Started (.+) in workspace .+\.$/mu);
326
+ const workspace = matchLine(text, /^Started .+ in workspace (.+)\.$/mu) ?? readString(args, "workspace");
327
+ const runKey = matchLine(text, /^Run key:\s*(.+)$/mu);
328
+ const path = readString(args, "workflowPath");
329
+ const name = startedName ?? workflowNameFromPath(path);
330
+ const scope = runKey ? workspace ? `${workspace}/${runKey}` : runKey : workspace ?? path ?? "workflow";
331
+ if (/Workflow completed successfully/iu.test(text)) return {
332
+ name,
333
+ scope,
334
+ state: {
335
+ color: "success",
336
+ glyph: "✓",
337
+ label: "completed"
338
+ }
339
+ };
340
+ if (/Workflow skipped/iu.test(text)) return {
341
+ name,
342
+ scope,
343
+ state: {
344
+ color: "muted",
345
+ glyph: "○",
346
+ label: "skipped"
347
+ }
348
+ };
349
+ if (/no run was registered/iu.test(text)) return {
350
+ name,
351
+ scope,
352
+ state: {
353
+ color: "warning",
354
+ glyph: "◐",
355
+ label: "starting · run key pending"
356
+ }
357
+ };
358
+ return {
359
+ name,
360
+ scope,
361
+ state: {
362
+ color: "accent",
363
+ glyph: "◐",
364
+ label: runKey ? "started" : "launch accepted"
365
+ }
366
+ };
367
+ }
368
+ function renderLaunchResult(args, result, options, theme) {
369
+ const summary = launchSummary(textBlocks(result).join("\n"), args);
370
+ const lines = [`${theme.fg(summary.state.color, summary.state.glyph)} ${theme.bold(summary.name)} ${theme.fg("dim", `· ${summary.scope} ·`)} ${theme.fg(summary.state.color, summary.state.label)}`];
371
+ const metadata = [
372
+ readString(args, "job") ? `job ${readString(args, "job")}` : void 0,
373
+ readString(args, "runner") ? `runner ${readString(args, "runner")}` : void 0,
374
+ readBoolean(args, "dryRun") ? "dry run" : void 0
375
+ ].filter((value) => !!value);
376
+ if (metadata.length > 0) lines.push(theme.fg("dim", metadata.join(" · ")));
377
+ if (options.expanded) {
378
+ const details = detailLines(result).filter((line) => !line.startsWith("Next steps for the agent:"));
379
+ if (details.length > 0) lines.push(...details);
380
+ }
381
+ return renderResult(lines, theme, options.expanded);
382
+ }
383
+ function splitEvidence(text) {
384
+ const sections = [];
385
+ let current;
386
+ for (const line of text.split("\n")) {
387
+ const match = line.match(/^--- (.+) ---$/u);
388
+ if (match?.[1]) {
389
+ current = {
390
+ body: [],
391
+ name: match[1]
392
+ };
393
+ sections.push(current);
394
+ continue;
395
+ }
396
+ current?.body.push(line);
397
+ }
398
+ return sections;
399
+ }
400
+ function recoveryRecord(sections) {
401
+ return parseJsonRecord(sections.find((section) => section.name === "run.json")?.body.join("\n"));
402
+ }
403
+ function renderRecoveryEvidenceResult(args, result, options, theme) {
404
+ const sections = splitEvidence(textBlocks(result).join("\n"));
405
+ const record = recoveryRecord(sections);
406
+ const recordLines = record ? workflowRecordLines(record, options.expanded, theme) : void 0;
407
+ const evidenceSections = sections.filter((section) => section.name !== "run.json");
408
+ const scope = targetScope(args) ?? "workflow";
409
+ const lines = recordLines ?? [`${theme.fg("success", "✓")} ${theme.bold("recovery evidence")} ${theme.fg("dim", `· ${scope}`)}`];
410
+ const names = evidenceSections.map((section) => section.name);
411
+ lines.push(names.length > 0 ? labelValue("evidence", names.join(", "), theme) : theme.fg("muted", "no durable evidence files recorded"));
412
+ if (options.expanded) for (const section of evidenceSections) lines.push(theme.bold(section.name), ...section.body.filter((line) => line.length > 0));
413
+ return renderResult(lines, theme, options.expanded);
414
+ }
415
+ function renderSimpleActionResult(action, args, result, options, theme) {
416
+ const scope = targetScope(args) ?? "workflow";
417
+ const actionLabel = {
418
+ follow: "following output",
419
+ open: "launcher opened",
420
+ recover: readBoolean(args, "dryRun") ? "recovery dry run finished" : "recovery accepted",
421
+ tail: "launcher output checked"
422
+ };
423
+ const state = action === "recover" ? {
424
+ color: "accent",
425
+ glyph: "◐",
426
+ label: actionLabel[action] ?? action
427
+ } : {
428
+ color: "success",
429
+ glyph: "✓",
430
+ label: actionLabel[action] ?? action
431
+ };
432
+ const lines = [`${theme.fg(state.color, state.glyph)} ${theme.bold(state.label)} ${theme.fg("dim", `· ${scope}`)}`];
433
+ const details = detailLines(result);
434
+ if (action === "tail") {
435
+ const stageLine = details.find((line) => line.startsWith("Stage:"));
436
+ const workflowLine = details.find((line) => line.startsWith("Workflow:"));
437
+ if (workflowLine) lines.push(workflowLine);
438
+ if (stageLine) lines.push(stageLine);
439
+ }
440
+ if (options.expanded && details.length > 0) lines.push(...details);
441
+ return renderResult(lines, theme, options.expanded);
442
+ }
443
+ function renderFailure(toolName, args, result, options, theme) {
444
+ const action = toolAction(toolName, args);
445
+ const target = toolTarget(toolName, args);
446
+ const summary = `${theme.fg("error", "✗")} ${theme.bold(`${action} failed`)}${target ? theme.fg("dim", ` · ${target}`) : ""}`;
447
+ const details = detailLines(result);
448
+ const shown = options.expanded ? details : details.slice(0, COLLAPSED_DETAIL_LINES);
449
+ const lines = [summary, ...shown.length > 0 ? shown : [theme.fg("error", "Unknown workflow error")]];
450
+ const hidden = details.length - shown.length;
451
+ if (hidden > 0) lines.push(hiddenDetailLine(hidden, theme));
452
+ return renderResult(lines, theme, options.expanded);
453
+ }
454
+ function renderPartial(toolName, args, result, options, theme) {
455
+ const details = detailLines(result);
456
+ const shown = details.slice(-4);
457
+ const action = toolAction(toolName, args);
458
+ const target = toolTarget(toolName, args);
459
+ const summary = `${theme.fg("accent", "◐")} ${theme.bold(action)}${target ? theme.fg("dim", ` · ${target}`) : ""}`;
460
+ const hidden = details.length - shown.length;
461
+ const lines = [summary];
462
+ if (hidden > 0) lines.push(theme.fg("dim", `… ${hidden} earlier`));
463
+ lines.push(...shown);
464
+ return renderResult(lines, theme, options.expanded);
465
+ }
466
+ function renderFallback(result, options, theme) {
467
+ const details = detailLines(result);
468
+ if (details.length === 0) return renderResult([theme.fg("muted", "No workflow output.")], theme, options.expanded);
469
+ const shown = options.expanded ? details : details.slice(0, COLLAPSED_DETAIL_LINES);
470
+ const lines = [...shown];
471
+ const hidden = details.length - shown.length;
472
+ if (hidden > 0) lines.push(hiddenDetailLine(hidden, theme));
473
+ return renderResult(lines, theme, options.expanded);
474
+ }
475
+ function renderWorkflowToolResult(toolName, args, result, options, theme) {
476
+ if (options.isPartial) return renderPartial(toolName, args, result, options, theme);
477
+ if (options.isError === true || result.isError === true) return renderFailure(toolName, args, result, options, theme);
478
+ if (toolName === "list_workflows") return renderCatalogResult(result, options, theme) ?? renderFallback(result, options, theme);
479
+ if (toolName === "launch_workflow") return renderLaunchResult(args, result, options, theme);
480
+ const action = readString(args, "action");
481
+ if (action === "status") return renderStatusResult(result, options, theme) ?? renderFallback(result, options, theme);
482
+ if (action === "pause" || action === "resume" || action === "stop") return renderControlResult(action, args, result, options, theme);
483
+ if (action === "recovery-evidence") return renderRecoveryEvidenceResult(args, result, options, theme);
484
+ if (action === "follow" || action === "open" || action === "recover" || action === "tail") return renderSimpleActionResult(action, args, result, options, theme);
485
+ return renderFallback(result, options, theme);
486
+ }
487
+ //#endregion
488
+ export { renderWorkflowToolCall, renderWorkflowToolResult };
489
+
490
+ //# sourceMappingURL=workflowToolRender.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflowToolRender.mjs","names":[],"sources":["../../../../src/tui/workflow/workflowToolRender.ts"],"sourcesContent":["import { DoomToolCall, DoomToolResult, renderToolHeading } from '@agimon-ai/doompi-ui/toolChrome';\nimport type { Theme, ThemeColor } from '@earendil-works/pi-coding-agent';\nimport type { Component } from '@earendil-works/pi-tui';\n\nexport type WorkflowToolName = 'launch_workflow' | 'list_workflows' | 'workflow_run';\nexport type WorkflowPiToolName = WorkflowToolName;\n\ninterface WorkflowToolResultLike {\n content?: unknown;\n isError?: boolean;\n}\n\ninterface WorkflowToolRenderOptions {\n expanded: boolean;\n isError?: boolean;\n isPartial?: boolean;\n}\n\ntype JsonRecord = Record<string, unknown>;\n\ntype WorkflowState = {\n color: ThemeColor;\n glyph: string;\n label: string;\n};\n\ninterface WorkflowCatalogItem {\n description: string;\n name: string;\n path: string;\n tags: string[];\n}\n\ninterface WorkflowCatalog {\n directory?: string;\n page: number;\n pageSize: number;\n tags: Array<{ count: number; tag: string }>;\n total: number;\n totalPages: number;\n workflows: WorkflowCatalogItem[];\n}\n\ninterface EvidenceSection {\n body: string[];\n name: string;\n}\n\nconst COLLAPSED_CATALOG_ROWS = 6;\nconst COLLAPSED_DETAIL_LINES = 8;\nconst PARTIAL_DETAIL_LINES = 4;\n\nfunction asRecord(value: unknown): JsonRecord | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n return value as JsonRecord;\n}\n\nfunction inlineText(value: string): string {\n let normalized = '';\n for (const character of value) {\n const code = character.codePointAt(0) ?? 0;\n normalized += code <= 31 || code === 127 ? ' ' : character;\n }\n return normalized.replace(/\\s+/gu, ' ').trim();\n}\n\nfunction readString(record: JsonRecord | undefined, key: string): string | undefined {\n const value = record?.[key];\n if (typeof value !== 'string') return undefined;\n return inlineText(value) || undefined;\n}\n\nfunction readNumber(record: JsonRecord | undefined, key: string): number | undefined {\n const value = record?.[key];\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction readBoolean(record: JsonRecord | undefined, key: string): boolean | undefined {\n const value = record?.[key];\n return typeof value === 'boolean' ? value : undefined;\n}\n\nfunction readStringArray(record: JsonRecord | undefined, key: string): string[] {\n const value = record?.[key];\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is string => typeof item === 'string');\n}\n\nfunction parseJsonRecord(text: string | undefined): JsonRecord | undefined {\n if (!text) return undefined;\n try {\n return asRecord(JSON.parse(text));\n } catch {\n return undefined;\n }\n}\n\nfunction textBlocks(result: WorkflowToolResultLike): string[] {\n if (!Array.isArray(result.content)) return [];\n return result.content.flatMap((item) => {\n const record = asRecord(item);\n return record?.type === 'text' && typeof record.text === 'string' ? [record.text] : [];\n });\n}\n\nfunction detailLines(result: WorkflowToolResultLike): string[] {\n return textBlocks(result)\n .flatMap((block) => block.split('\\n'))\n .map((line) => line.trimEnd())\n .filter((line) => line.length > 0);\n}\n\nfunction firstPayload(result: WorkflowToolResultLike): JsonRecord | undefined {\n return parseJsonRecord(textBlocks(result)[0]);\n}\n\nfunction plural(count: number, singular: string, pluralForm = `${singular}s`): string {\n return count === 1 ? singular : pluralForm;\n}\n\nfunction labelValue(label: string, value: string, theme: Theme): string {\n return `${theme.fg('dim', `${label} `)}${theme.fg('text', value)}`;\n}\n\nfunction targetScope(args: Record<string, unknown>): string | undefined {\n const runKey = readString(args, 'runKey');\n if (!runKey) return undefined;\n const workspace = readString(args, 'workspace');\n return workspace ? `${workspace}/${runKey}` : runKey;\n}\n\nfunction toolAction(toolName: WorkflowPiToolName, args: Record<string, unknown>): string {\n if (toolName === 'list_workflows') return 'list';\n if (toolName === 'launch_workflow') return 'launch';\n return readString(args, 'action') ?? 'run';\n}\n\nfunction toolTarget(toolName: WorkflowPiToolName, args: Record<string, unknown>): string | undefined {\n if (toolName === 'list_workflows') return readString(args, 'directory');\n if (toolName === 'launch_workflow') return readString(args, 'workflowPath');\n return targetScope(args);\n}\n\nfunction renderResult(lines: readonly string[], theme: Theme, expanded: boolean): Component {\n return new DoomToolResult(lines, theme, { wrap: expanded });\n}\n\nfunction hiddenDetailLine(hidden: number, theme: Theme): string {\n return theme.fg('dim', `… ${hidden} more · ctrl+o`);\n}\n\nfunction statusTimestamp(value: string): string {\n return value.replace('T', ' ').replace(/\\.\\d{3}Z$/, 'Z');\n}\n\nfunction workflowNameFromPath(path: string | undefined): string {\n if (!path) return 'workflow';\n const filename = path.split('/').at(-1) ?? path;\n return filename.replace(/\\.workflow\\.ya?ml$/u, '') || filename;\n}\n\nfunction callMetadata(toolName: WorkflowPiToolName, args: Record<string, unknown>, theme: Theme): string[] {\n const values: string[] = [];\n\n if (toolName === 'list_workflows') {\n const page = readNumber(args, 'page');\n const pageSize = readNumber(args, 'pageSize');\n if (page !== undefined) values.push(`page ${page}`);\n if (pageSize !== undefined) values.push(`${pageSize}/page`);\n if (readString(args, 'filter')) values.push('filtered');\n const tags = readStringArray(args, 'tags');\n if (tags.length > 0) values.push(`${tags.length} ${plural(tags.length, 'tag')}`);\n } else if (toolName === 'launch_workflow') {\n const job = readString(args, 'job');\n const runner = readString(args, 'runner');\n const workspace = readString(args, 'workspace');\n const inputCount = Object.keys(asRecord(args.inputs) ?? {}).length;\n const environmentCount = Object.keys(asRecord(args.env) ?? {}).length;\n if (workspace) values.push(`workspace ${workspace}`);\n if (job) values.push(`job ${job}`);\n if (runner) values.push(`runner ${runner}`);\n if (readBoolean(args, 'dryRun')) values.push('dry run');\n if (readString(args, 'prompt')) values.push('with prompt');\n if (inputCount > 0) values.push(`${inputCount} ${plural(inputCount, 'input')}`);\n if (environmentCount > 0) values.push(`${environmentCount} env`);\n } else {\n const expectedRunId = readString(args, 'expectedRunId');\n if (expectedRunId) values.push('generation checked');\n if (readString(args, 'reason')) values.push('with reason');\n if (readBoolean(args, 'dryRun')) values.push('dry run');\n if (readString(args, 'job')) values.push('job override');\n if (readString(args, 'runner')) values.push('runner override');\n }\n\n return values.map((value) => theme.fg('dim', value));\n}\n\nexport function renderWorkflowToolCall(\n toolName: WorkflowPiToolName,\n args: Record<string, unknown>,\n theme: Theme,\n): Component {\n const action = toolAction(toolName, args);\n const target = toolTarget(toolName, args);\n const metadata = callMetadata(toolName, args, theme);\n const purpose = [theme.bold(action), target ? theme.fg('muted', target) : undefined, ...metadata]\n .filter((part): part is string => !!part)\n .join(theme.fg('dim', ' · '));\n return new DoomToolCall(renderToolHeading('workflow', purpose, theme));\n}\n\nfunction parseCatalog(payload: JsonRecord | undefined): WorkflowCatalog | undefined {\n if (!Array.isArray(payload?.workflows)) return undefined;\n\n const workflows = payload.workflows.flatMap((value) => {\n const record = asRecord(value);\n const path = readString(record, 'path');\n if (!record || !path) return [];\n return [\n {\n description: readString(record, 'description') ?? '',\n name: readString(record, 'name') ?? '',\n path,\n tags: readStringArray(record, 'tags'),\n },\n ];\n });\n const tags = Array.isArray(payload.tags)\n ? payload.tags.flatMap((value) => {\n const record = asRecord(value);\n const tag = readString(record, 'tag');\n const count = readNumber(record, 'count');\n return tag && count !== undefined ? [{ count, tag }] : [];\n })\n : [];\n\n return {\n directory: readString(payload, 'directory'),\n page: readNumber(payload, 'page') ?? 1,\n pageSize: readNumber(payload, 'pageSize') ?? workflows.length,\n tags,\n total: readNumber(payload, 'total') ?? workflows.length,\n totalPages: readNumber(payload, 'totalPages') ?? (workflows.length > 0 ? 1 : 0),\n workflows,\n };\n}\n\nfunction catalogItemLines(item: WorkflowCatalogItem, expanded: boolean, theme: Theme): string[] {\n const name = item.name || workflowNameFromPath(item.path);\n const lines = [`${theme.fg('accent', '›')} ${theme.bold(name)} ${theme.fg('muted', `· ${item.path}`)}`];\n if (!expanded) return lines;\n if (item.description) lines.push(` ${theme.fg('text', item.description)}`);\n if (item.tags.length > 0) lines.push(` ${labelValue('tags', item.tags.join(', '), theme)}`);\n return lines;\n}\n\nfunction renderCatalogResult(\n result: WorkflowToolResultLike,\n options: WorkflowToolRenderOptions,\n theme: Theme,\n): Component | undefined {\n const catalog = parseCatalog(firstPayload(result));\n if (!catalog) return undefined;\n\n const pageLabel = `page ${catalog.page}/${catalog.totalPages}`;\n const summary = `${theme.fg(catalog.total > 0 ? 'success' : 'muted', catalog.total > 0 ? '✓' : '○')} ${theme.bold(\n `${catalog.total} ${plural(catalog.total, 'workflow')}`,\n )} ${theme.fg('dim', `· ${pageLabel}`)}`;\n const shown = options.expanded ? catalog.workflows : catalog.workflows.slice(0, COLLAPSED_CATALOG_ROWS);\n const lines = [summary, ...shown.flatMap((item) => catalogItemLines(item, options.expanded, theme))];\n const hidden = catalog.workflows.length - shown.length;\n if (hidden > 0) lines.push(hiddenDetailLine(hidden, theme));\n\n if (options.expanded) {\n if (catalog.tags.length > 0) {\n const tags = catalog.tags.map(({ count, tag }) => `${tag} (${count})`).join(', ');\n lines.push(labelValue('available tags', tags, theme));\n }\n if (catalog.directory) lines.push(labelValue('directory', catalog.directory, theme));\n lines.push(labelValue('page size', String(catalog.pageSize), theme));\n }\n\n return renderResult(lines, theme, options.expanded);\n}\n\nfunction readWorkflowState(record: JsonRecord): WorkflowState {\n const stage = readString(record, 'effectiveStage') ?? readString(record, 'stage') ?? 'unknown';\n const outcome = readString(record, 'effectiveOutcome') ?? readString(record, 'outcome');\n const executionState = readString(record, 'executionState');\n\n if (outcome === 'interrupted') return { color: 'warning', glyph: '!', label: 'interrupted' };\n if (stage === 'error' || outcome === 'failed') return { color: 'error', glyph: '✗', label: 'failed' };\n if (stage === 'completed' && outcome === 'skipped') return { color: 'muted', glyph: '○', label: 'skipped' };\n if (stage === 'completed') return { color: 'success', glyph: '✓', label: 'completed' };\n if (executionState === 'paused') return { color: 'warning', glyph: 'Ⅱ', label: 'paused' };\n if (executionState === 'pause_requested') return { color: 'warning', glyph: '◐', label: 'pause requested' };\n if (executionState === 'resume_requested') return { color: 'warning', glyph: '◐', label: 'resume requested' };\n if (stage === 'running') return { color: 'accent', glyph: '◐', label: 'running' };\n return { color: 'muted', glyph: '○', label: stage };\n}\n\nfunction recordScope(record: JsonRecord): string {\n const runKey = readString(record, 'runKey') ?? 'unknown run';\n const workspace = readString(record, 'workspace');\n return workspace ? `${workspace}/${runKey}` : runKey;\n}\n\nfunction currentActivity(record: JsonRecord, theme: Theme): string | undefined {\n const cursor = asRecord(record.executionCursor);\n const job = readString(cursor, 'job') ?? readString(record, 'job');\n const step = readString(cursor, 'stepName');\n const phase = readString(cursor, 'phase');\n if (!job && !step && !phase) return undefined;\n const context = job ?? phase ?? 'workflow';\n return ` ${theme.fg('muted', `[${context}]`)} ${theme.fg('text', step ?? phase ?? 'running')}`;\n}\n\nfunction launcherLabel(record: JsonRecord): string | undefined {\n const launcher = asRecord(record.launcher);\n const type = readString(launcher, 'type');\n if (!type) return undefined;\n const identity = readString(launcher, 'sessionName') ?? readString(launcher, 'workspaceId');\n return identity ? `${type} ${identity}` : type;\n}\n\nfunction workflowRecordLines(record: JsonRecord, expanded: boolean, theme: Theme): string[] | undefined {\n const runKey = readString(record, 'runKey');\n const stage = readString(record, 'stage');\n if (!runKey || !stage) return undefined;\n\n const state = readWorkflowState(record);\n const displayName = readString(record, 'displayName') ?? runKey;\n const heading = `${theme.fg(state.color, state.glyph)} ${theme.bold(displayName)} ${theme.fg(\n 'dim',\n `· ${recordScope(record)} ·`,\n )} ${theme.fg(state.color, state.label)}`;\n const lines = [heading];\n const activity = currentActivity(record, theme);\n if (activity) lines.push(activity);\n\n const failure = readString(record, 'errorMessage') ?? readString(record, 'failureReason');\n if (failure) lines.push(`${theme.fg('error', 'error')} ${theme.fg('text', failure)}`);\n const staleReason = readString(record, 'staleReason');\n if (staleReason) lines.push(`${theme.fg('warning', 'stale')} ${theme.fg('text', staleReason)}`);\n\n const conciseMetadata = [\n readString(record, 'runner') ? `runner ${readString(record, 'runner')}` : undefined,\n readBoolean(record, 'dryRun') ? 'dry run' : undefined,\n readNumber(record, 'exitCode') !== undefined ? `exit ${readNumber(record, 'exitCode')}` : undefined,\n readString(record, 'startedAt') ? `started ${statusTimestamp(readString(record, 'startedAt') ?? '')}` : undefined,\n ].filter((value): value is string => !!value);\n if (conciseMetadata.length > 0) lines.push(theme.fg('dim', conciseMetadata.join(' · ')));\n\n if (!expanded) return lines;\n\n const detailedValues: Array<[string, string | undefined]> = [\n ['workflow', readString(record, 'workflowPath')],\n ['workflow id', readString(record, 'workflowId')],\n ['run id', readString(record, 'runId')],\n ['launcher', launcherLabel(record)],\n ['job', readString(record, 'job')],\n ['outcome', readString(record, 'effectiveOutcome') ?? readString(record, 'outcome')],\n [\n 'finished',\n readString(record, 'finishedAt') ? statusTimestamp(readString(record, 'finishedAt') ?? '') : undefined,\n ],\n ['pid', readNumber(record, 'pid')?.toString()],\n ['repair', readString(record, 'activeRepairId') ? `#${readString(record, 'activeRepairId')}` : undefined],\n ['worktree', readString(record, 'worktreeBranch') ?? readString(record, 'worktreePath')],\n ];\n for (const [label, value] of detailedValues) {\n if (value) lines.push(labelValue(label, value, theme));\n }\n return lines;\n}\n\nfunction renderStatusResult(\n result: WorkflowToolResultLike,\n options: WorkflowToolRenderOptions,\n theme: Theme,\n): Component | undefined {\n const payload = firstPayload(result);\n if (!payload) return undefined;\n const lines = workflowRecordLines(payload, options.expanded, theme);\n return lines ? renderResult(lines, theme, options.expanded) : undefined;\n}\n\nfunction nestedRequestedAt(payload: JsonRecord | undefined): string | undefined {\n return readString(asRecord(payload?.request), 'requestedAt') ?? readString(payload, 'requestedAt');\n}\n\nfunction renderControlResult(\n action: string,\n args: Record<string, unknown>,\n result: WorkflowToolResultLike,\n options: WorkflowToolRenderOptions,\n theme: Theme,\n): Component {\n const payload = firstPayload(result);\n const scope = targetScope(args) ?? readString(payload, 'runKey') ?? 'workflow';\n const payloadWorkspace = readString(payload, 'workspace');\n const resolvedScope = payloadWorkspace && !scope.includes('/') ? `${payloadWorkspace}/${scope}` : scope;\n const lines = [\n `${theme.fg('warning', '◐')} ${theme.bold(`${action} requested`)} ${theme.fg('dim', `· ${resolvedScope}`)}`,\n ];\n const requestedAt = nestedRequestedAt(payload);\n if (requestedAt) lines.push(labelValue('requested', statusTimestamp(requestedAt), theme));\n if (options.expanded) lines.push(theme.fg('dim', 'verify the transition with workflow_run status'));\n return renderResult(lines, theme, options.expanded);\n}\n\nfunction matchLine(text: string, pattern: RegExp): string | undefined {\n return text.match(pattern)?.[1]?.trim();\n}\n\nfunction launchSummary(\n text: string,\n args: Record<string, unknown>,\n): { name: string; scope: string; state: WorkflowState } {\n const startedName = matchLine(text, /^Started (.+) in workspace .+\\.$/mu);\n const workspace = matchLine(text, /^Started .+ in workspace (.+)\\.$/mu) ?? readString(args, 'workspace');\n const runKey = matchLine(text, /^Run key:\\s*(.+)$/mu);\n const path = readString(args, 'workflowPath');\n const name = startedName ?? workflowNameFromPath(path);\n const scope = runKey ? (workspace ? `${workspace}/${runKey}` : runKey) : (workspace ?? path ?? 'workflow');\n\n if (/Workflow completed successfully/iu.test(text)) {\n return { name, scope, state: { color: 'success', glyph: '✓', label: 'completed' } };\n }\n if (/Workflow skipped/iu.test(text)) {\n return { name, scope, state: { color: 'muted', glyph: '○', label: 'skipped' } };\n }\n if (/no run was registered/iu.test(text)) {\n return { name, scope, state: { color: 'warning', glyph: '◐', label: 'starting · run key pending' } };\n }\n return { name, scope, state: { color: 'accent', glyph: '◐', label: runKey ? 'started' : 'launch accepted' } };\n}\n\nfunction renderLaunchResult(\n args: Record<string, unknown>,\n result: WorkflowToolResultLike,\n options: WorkflowToolRenderOptions,\n theme: Theme,\n): Component {\n const blocks = textBlocks(result);\n const text = blocks.join('\\n');\n const summary = launchSummary(text, args);\n const lines = [\n `${theme.fg(summary.state.color, summary.state.glyph)} ${theme.bold(summary.name)} ${theme.fg(\n 'dim',\n `· ${summary.scope} ·`,\n )} ${theme.fg(summary.state.color, summary.state.label)}`,\n ];\n const metadata = [\n readString(args, 'job') ? `job ${readString(args, 'job')}` : undefined,\n readString(args, 'runner') ? `runner ${readString(args, 'runner')}` : undefined,\n readBoolean(args, 'dryRun') ? 'dry run' : undefined,\n ].filter((value): value is string => !!value);\n if (metadata.length > 0) lines.push(theme.fg('dim', metadata.join(' · ')));\n if (options.expanded) {\n const details = detailLines(result).filter((line) => !line.startsWith('Next steps for the agent:'));\n if (details.length > 0) lines.push(...details);\n }\n return renderResult(lines, theme, options.expanded);\n}\n\nfunction splitEvidence(text: string): EvidenceSection[] {\n const sections: EvidenceSection[] = [];\n let current: EvidenceSection | undefined;\n for (const line of text.split('\\n')) {\n const match = line.match(/^--- (.+) ---$/u);\n if (match?.[1]) {\n current = { body: [], name: match[1] };\n sections.push(current);\n continue;\n }\n current?.body.push(line);\n }\n return sections;\n}\n\nfunction recoveryRecord(sections: EvidenceSection[]): JsonRecord | undefined {\n const runSection = sections.find((section) => section.name === 'run.json');\n return parseJsonRecord(runSection?.body.join('\\n'));\n}\n\nfunction renderRecoveryEvidenceResult(\n args: Record<string, unknown>,\n result: WorkflowToolResultLike,\n options: WorkflowToolRenderOptions,\n theme: Theme,\n): Component {\n const text = textBlocks(result).join('\\n');\n const sections = splitEvidence(text);\n const record = recoveryRecord(sections);\n const recordLines = record ? workflowRecordLines(record, options.expanded, theme) : undefined;\n const evidenceSections = sections.filter((section) => section.name !== 'run.json');\n const scope = targetScope(args) ?? 'workflow';\n const lines = recordLines ?? [\n `${theme.fg('success', '✓')} ${theme.bold('recovery evidence')} ${theme.fg('dim', `· ${scope}`)}`,\n ];\n const names = evidenceSections.map((section) => section.name);\n lines.push(\n names.length > 0\n ? labelValue('evidence', names.join(', '), theme)\n : theme.fg('muted', 'no durable evidence files recorded'),\n );\n\n if (options.expanded) {\n for (const section of evidenceSections) {\n lines.push(theme.bold(section.name), ...section.body.filter((line) => line.length > 0));\n }\n }\n return renderResult(lines, theme, options.expanded);\n}\n\nfunction renderSimpleActionResult(\n action: string,\n args: Record<string, unknown>,\n result: WorkflowToolResultLike,\n options: WorkflowToolRenderOptions,\n theme: Theme,\n): Component {\n const scope = targetScope(args) ?? 'workflow';\n const actionLabel: Record<string, string> = {\n follow: 'following output',\n open: 'launcher opened',\n recover: readBoolean(args, 'dryRun') ? 'recovery dry run finished' : 'recovery accepted',\n tail: 'launcher output checked',\n };\n const state: WorkflowState =\n action === 'recover'\n ? { color: 'accent', glyph: '◐', label: actionLabel[action] ?? action }\n : { color: 'success', glyph: '✓', label: actionLabel[action] ?? action };\n const lines = [`${theme.fg(state.color, state.glyph)} ${theme.bold(state.label)} ${theme.fg('dim', `· ${scope}`)}`];\n const details = detailLines(result);\n if (action === 'tail') {\n const stageLine = details.find((line) => line.startsWith('Stage:'));\n const workflowLine = details.find((line) => line.startsWith('Workflow:'));\n if (workflowLine) lines.push(workflowLine);\n if (stageLine) lines.push(stageLine);\n }\n if (options.expanded && details.length > 0) lines.push(...details);\n return renderResult(lines, theme, options.expanded);\n}\n\nfunction renderFailure(\n toolName: WorkflowPiToolName,\n args: Record<string, unknown>,\n result: WorkflowToolResultLike,\n options: WorkflowToolRenderOptions,\n theme: Theme,\n): Component {\n const action = toolAction(toolName, args);\n const target = toolTarget(toolName, args);\n const summary = `${theme.fg('error', '✗')} ${theme.bold(`${action} failed`)}${\n target ? theme.fg('dim', ` · ${target}`) : ''\n }`;\n const details = detailLines(result);\n const shown = options.expanded ? details : details.slice(0, COLLAPSED_DETAIL_LINES);\n const lines = [summary, ...(shown.length > 0 ? shown : [theme.fg('error', 'Unknown workflow error')])];\n const hidden = details.length - shown.length;\n if (hidden > 0) lines.push(hiddenDetailLine(hidden, theme));\n return renderResult(lines, theme, options.expanded);\n}\n\nfunction renderPartial(\n toolName: WorkflowPiToolName,\n args: Record<string, unknown>,\n result: WorkflowToolResultLike,\n options: WorkflowToolRenderOptions,\n theme: Theme,\n): Component {\n const details = detailLines(result);\n const shown = details.slice(-PARTIAL_DETAIL_LINES);\n const action = toolAction(toolName, args);\n const target = toolTarget(toolName, args);\n const summary = `${theme.fg('accent', '◐')} ${theme.bold(action)}${target ? theme.fg('dim', ` · ${target}`) : ''}`;\n const hidden = details.length - shown.length;\n const lines = [summary];\n if (hidden > 0) lines.push(theme.fg('dim', `… ${hidden} earlier`));\n lines.push(...shown);\n return renderResult(lines, theme, options.expanded);\n}\n\nfunction renderFallback(result: WorkflowToolResultLike, options: WorkflowToolRenderOptions, theme: Theme): Component {\n const details = detailLines(result);\n if (details.length === 0) return renderResult([theme.fg('muted', 'No workflow output.')], theme, options.expanded);\n const shown = options.expanded ? details : details.slice(0, COLLAPSED_DETAIL_LINES);\n const lines = [...shown];\n const hidden = details.length - shown.length;\n if (hidden > 0) lines.push(hiddenDetailLine(hidden, theme));\n return renderResult(lines, theme, options.expanded);\n}\n\nexport function renderWorkflowToolResult(\n toolName: WorkflowPiToolName,\n args: Record<string, unknown>,\n result: WorkflowToolResultLike,\n options: WorkflowToolRenderOptions,\n theme: Theme,\n): Component {\n if (options.isPartial) return renderPartial(toolName, args, result, options, theme);\n if (options.isError === true || result.isError === true) {\n return renderFailure(toolName, args, result, options, theme);\n }\n\n if (toolName === 'list_workflows') {\n return renderCatalogResult(result, options, theme) ?? renderFallback(result, options, theme);\n }\n if (toolName === 'launch_workflow') return renderLaunchResult(args, result, options, theme);\n\n const action = readString(args, 'action');\n if (action === 'status') {\n return renderStatusResult(result, options, theme) ?? renderFallback(result, options, theme);\n }\n if (action === 'pause' || action === 'resume' || action === 'stop') {\n return renderControlResult(action, args, result, options, theme);\n }\n if (action === 'recovery-evidence') {\n return renderRecoveryEvidenceResult(args, result, options, theme);\n }\n if (action === 'follow' || action === 'open' || action === 'recover' || action === 'tail') {\n return renderSimpleActionResult(action, args, result, options, theme);\n }\n return renderFallback(result, options, theme);\n}\n"],"mappings":"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"}