@stigmer/react 0.5.1 → 1.0.1

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 (625) hide show
  1. package/activity/group-activity.d.ts +13 -0
  2. package/activity/group-activity.d.ts.map +1 -0
  3. package/activity/group-activity.js +54 -0
  4. package/activity/group-activity.js.map +1 -0
  5. package/activity/index.d.ts +4 -0
  6. package/activity/index.d.ts.map +1 -0
  7. package/activity/index.js +3 -0
  8. package/activity/index.js.map +1 -0
  9. package/activity/types.d.ts +34 -0
  10. package/activity/types.d.ts.map +1 -0
  11. package/activity/types.js +2 -0
  12. package/activity/types.js.map +1 -0
  13. package/activity/useRecentActivity.d.ts +35 -0
  14. package/activity/useRecentActivity.d.ts.map +1 -0
  15. package/activity/useRecentActivity.js +73 -0
  16. package/activity/useRecentActivity.js.map +1 -0
  17. package/agent/AgentPicker.d.ts.map +1 -1
  18. package/agent/AgentPicker.js +4 -2
  19. package/agent/AgentPicker.js.map +1 -1
  20. package/billing/BillingSection.d.ts.map +1 -1
  21. package/billing/BillingSection.js +1 -1
  22. package/billing/BillingSection.js.map +1 -1
  23. package/composer/ComposerToolbar.d.ts +5 -1
  24. package/composer/ComposerToolbar.d.ts.map +1 -1
  25. package/composer/ComposerToolbar.js +4 -3
  26. package/composer/ComposerToolbar.js.map +1 -1
  27. package/composer/InteractionModePicker.d.ts +40 -0
  28. package/composer/InteractionModePicker.d.ts.map +1 -0
  29. package/composer/InteractionModePicker.js +76 -0
  30. package/composer/InteractionModePicker.js.map +1 -0
  31. package/composer/SessionComposer.d.ts +53 -64
  32. package/composer/SessionComposer.d.ts.map +1 -1
  33. package/composer/SessionComposer.js +20 -8
  34. package/composer/SessionComposer.js.map +1 -1
  35. package/composer/__tests__/SessionComposer-memo.test.js +10 -5
  36. package/composer/__tests__/SessionComposer-memo.test.js.map +1 -1
  37. package/composer/index.d.ts +3 -1
  38. package/composer/index.d.ts.map +1 -1
  39. package/composer/index.js +1 -0
  40. package/composer/index.js.map +1 -1
  41. package/dashboard/DashboardFailedRuns.d.ts +19 -0
  42. package/dashboard/DashboardFailedRuns.d.ts.map +1 -0
  43. package/dashboard/DashboardFailedRuns.js +35 -0
  44. package/dashboard/DashboardFailedRuns.js.map +1 -0
  45. package/dashboard/DashboardKPICards.d.ts +19 -0
  46. package/dashboard/DashboardKPICards.d.ts.map +1 -0
  47. package/dashboard/DashboardKPICards.js +80 -0
  48. package/dashboard/DashboardKPICards.js.map +1 -0
  49. package/dashboard/OperationalDashboard.d.ts +37 -0
  50. package/dashboard/OperationalDashboard.d.ts.map +1 -0
  51. package/dashboard/OperationalDashboard.js +48 -0
  52. package/dashboard/OperationalDashboard.js.map +1 -0
  53. package/dashboard/index.d.ts +8 -0
  54. package/dashboard/index.d.ts.map +1 -0
  55. package/dashboard/index.js +9 -0
  56. package/dashboard/index.js.map +1 -0
  57. package/dashboard/types.d.ts +49 -0
  58. package/dashboard/types.d.ts.map +1 -0
  59. package/dashboard/types.js +2 -0
  60. package/dashboard/types.js.map +1 -0
  61. package/dashboard/useAgentExecutionSummary.d.ts +33 -0
  62. package/dashboard/useAgentExecutionSummary.d.ts.map +1 -0
  63. package/dashboard/useAgentExecutionSummary.js +32 -0
  64. package/dashboard/useAgentExecutionSummary.js.map +1 -0
  65. package/dashboard/useDashboardFailedRuns.d.ts +18 -0
  66. package/dashboard/useDashboardFailedRuns.d.ts.map +1 -0
  67. package/dashboard/useDashboardFailedRuns.js +86 -0
  68. package/dashboard/useDashboardFailedRuns.js.map +1 -0
  69. package/dashboard/useDashboardSummary.d.ts +32 -0
  70. package/dashboard/useDashboardSummary.d.ts.map +1 -0
  71. package/dashboard/useDashboardSummary.js +67 -0
  72. package/dashboard/useDashboardSummary.js.map +1 -0
  73. package/execution/ContextGauge.d.ts +45 -0
  74. package/execution/ContextGauge.d.ts.map +1 -0
  75. package/execution/ContextGauge.js +82 -0
  76. package/execution/ContextGauge.js.map +1 -0
  77. package/execution/InteractionModeBadge.d.ts +24 -0
  78. package/execution/InteractionModeBadge.d.ts.map +1 -0
  79. package/execution/InteractionModeBadge.js +29 -0
  80. package/execution/InteractionModeBadge.js.map +1 -0
  81. package/execution/MessageThread.d.ts +33 -3
  82. package/execution/MessageThread.d.ts.map +1 -1
  83. package/execution/MessageThread.js +51 -9
  84. package/execution/MessageThread.js.map +1 -1
  85. package/execution/PlanCompletionCard.d.ts +23 -0
  86. package/execution/PlanCompletionCard.d.ts.map +1 -0
  87. package/execution/PlanCompletionCard.js +28 -0
  88. package/execution/PlanCompletionCard.js.map +1 -0
  89. package/execution/SummarizationBadge.d.ts +30 -0
  90. package/execution/SummarizationBadge.d.ts.map +1 -0
  91. package/execution/SummarizationBadge.js +61 -0
  92. package/execution/SummarizationBadge.js.map +1 -0
  93. package/execution/SummarizationCard.d.ts +27 -0
  94. package/execution/SummarizationCard.d.ts.map +1 -0
  95. package/execution/SummarizationCard.js +47 -0
  96. package/execution/SummarizationCard.js.map +1 -0
  97. package/execution/__tests__/PlanCompletionCard.test.d.ts +2 -0
  98. package/execution/__tests__/PlanCompletionCard.test.d.ts.map +1 -0
  99. package/execution/__tests__/PlanCompletionCard.test.js +53 -0
  100. package/execution/__tests__/PlanCompletionCard.test.js.map +1 -0
  101. package/execution/__tests__/buildThreadItems-plan-completion.test.d.ts +2 -0
  102. package/execution/__tests__/buildThreadItems-plan-completion.test.d.ts.map +1 -0
  103. package/execution/__tests__/buildThreadItems-plan-completion.test.js +137 -0
  104. package/execution/__tests__/buildThreadItems-plan-completion.test.js.map +1 -0
  105. package/execution/__tests__/useContextWindow.test.d.ts +2 -0
  106. package/execution/__tests__/useContextWindow.test.d.ts.map +1 -0
  107. package/execution/__tests__/useContextWindow.test.js +121 -0
  108. package/execution/__tests__/useContextWindow.test.js.map +1 -0
  109. package/execution/index.d.ts +12 -0
  110. package/execution/index.d.ts.map +1 -1
  111. package/execution/index.js +6 -0
  112. package/execution/index.js.map +1 -1
  113. package/execution/useContextWindow.d.ts +71 -0
  114. package/execution/useContextWindow.d.ts.map +1 -0
  115. package/execution/useContextWindow.js +91 -0
  116. package/execution/useContextWindow.js.map +1 -0
  117. package/execution/useCreateAgentExecution.d.ts +9 -0
  118. package/execution/useCreateAgentExecution.d.ts.map +1 -1
  119. package/execution/useCreateAgentExecution.js +15 -3
  120. package/execution/useCreateAgentExecution.js.map +1 -1
  121. package/index.d.ts +9 -4
  122. package/index.d.ts.map +1 -1
  123. package/index.js +12 -2
  124. package/index.js.map +1 -1
  125. package/internal/VirtualizedThread.d.ts +2 -1
  126. package/internal/VirtualizedThread.d.ts.map +1 -1
  127. package/internal/VirtualizedThread.js +3 -2
  128. package/internal/VirtualizedThread.js.map +1 -1
  129. package/internal/store/index.d.ts +1 -0
  130. package/internal/store/index.d.ts.map +1 -1
  131. package/internal/store/index.js +1 -0
  132. package/internal/store/index.js.map +1 -1
  133. package/internal/store/workflow-execution-event-store.d.ts +92 -0
  134. package/internal/store/workflow-execution-event-store.d.ts.map +1 -0
  135. package/internal/store/workflow-execution-event-store.js +298 -0
  136. package/internal/store/workflow-execution-event-store.js.map +1 -0
  137. package/library/ScopeToggle.d.ts +13 -9
  138. package/library/ScopeToggle.d.ts.map +1 -1
  139. package/library/ScopeToggle.js +43 -22
  140. package/library/ScopeToggle.js.map +1 -1
  141. package/library/VisibilityToggle.js +14 -5
  142. package/library/VisibilityToggle.js.map +1 -1
  143. package/library/index.d.ts +1 -0
  144. package/library/index.d.ts.map +1 -1
  145. package/library/index.js +1 -0
  146. package/library/index.js.map +1 -1
  147. package/library/useExportResource.d.ts +3 -2
  148. package/library/useExportResource.d.ts.map +1 -1
  149. package/library/useExportResource.js +11 -6
  150. package/library/useExportResource.js.map +1 -1
  151. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  152. package/mcp-server/McpServerDetailView.js +25 -13
  153. package/mcp-server/McpServerDetailView.js.map +1 -1
  154. package/mcp-server/McpServerPicker.d.ts.map +1 -1
  155. package/mcp-server/McpServerPicker.js +4 -2
  156. package/mcp-server/McpServerPicker.js.map +1 -1
  157. package/package.json +16 -5
  158. package/provider.d.ts.map +1 -1
  159. package/provider.js +164 -1
  160. package/provider.js.map +1 -1
  161. package/resource-detail/ResourceDetailShell.d.ts +1 -1
  162. package/resource-detail/ResourceDetailShell.d.ts.map +1 -1
  163. package/resource-detail/ResourceDetailShell.js +6 -6
  164. package/resource-detail/ResourceDetailShell.js.map +1 -1
  165. package/resource-detail/types.d.ts +23 -0
  166. package/resource-detail/types.d.ts.map +1 -1
  167. package/resource-detail/useDeleteResource.d.ts +1 -1
  168. package/resource-detail/useDeleteResource.d.ts.map +1 -1
  169. package/resource-detail/useDeleteResource.js +5 -0
  170. package/resource-detail/useDeleteResource.js.map +1 -1
  171. package/resource-workbench/components/ResourceWorkbench.d.ts.map +1 -1
  172. package/resource-workbench/components/ResourceWorkbench.js +2 -1
  173. package/resource-workbench/components/ResourceWorkbench.js.map +1 -1
  174. package/session/useNewSessionFlow.d.ts.map +1 -1
  175. package/session/useNewSessionFlow.js +1 -0
  176. package/session/useNewSessionFlow.js.map +1 -1
  177. package/session/useSessionConversation.d.ts +7 -0
  178. package/session/useSessionConversation.d.ts.map +1 -1
  179. package/session/useSessionConversation.js +1 -0
  180. package/session/useSessionConversation.js.map +1 -1
  181. package/session/useSessionPageFlow.d.ts.map +1 -1
  182. package/session/useSessionPageFlow.js +1 -0
  183. package/session/useSessionPageFlow.js.map +1 -1
  184. package/session/useSessionUsage.d.ts.map +1 -1
  185. package/session/useSessionUsage.js +65 -4
  186. package/session/useSessionUsage.js.map +1 -1
  187. package/settings/UsageSection.d.ts.map +1 -1
  188. package/settings/UsageSection.js +1 -4
  189. package/settings/UsageSection.js.map +1 -1
  190. package/skill/SkillPicker.d.ts.map +1 -1
  191. package/skill/SkillPicker.js +4 -2
  192. package/skill/SkillPicker.js.map +1 -1
  193. package/src/activity/group-activity.ts +65 -0
  194. package/src/activity/index.ts +13 -0
  195. package/src/activity/types.ts +35 -0
  196. package/src/activity/useRecentActivity.ts +131 -0
  197. package/src/agent/AgentPicker.tsx +6 -1
  198. package/src/billing/BillingSection.tsx +3 -2
  199. package/src/composer/ComposerToolbar.tsx +19 -1
  200. package/src/composer/InteractionModePicker.tsx +189 -0
  201. package/src/composer/SessionComposer.tsx +85 -8
  202. package/src/composer/__tests__/SessionComposer-memo.test.ts +11 -6
  203. package/src/composer/index.ts +7 -0
  204. package/src/dashboard/DashboardFailedRuns.tsx +109 -0
  205. package/src/dashboard/DashboardKPICards.tsx +128 -0
  206. package/src/dashboard/OperationalDashboard.tsx +96 -0
  207. package/src/dashboard/index.ts +37 -0
  208. package/src/dashboard/types.ts +50 -0
  209. package/src/dashboard/useAgentExecutionSummary.ts +71 -0
  210. package/src/dashboard/useDashboardFailedRuns.ts +122 -0
  211. package/src/dashboard/useDashboardSummary.ts +109 -0
  212. package/src/execution/ContextGauge.tsx +243 -0
  213. package/src/execution/InteractionModeBadge.tsx +70 -0
  214. package/src/execution/MessageThread.tsx +88 -3
  215. package/src/execution/PlanCompletionCard.tsx +105 -0
  216. package/src/execution/SummarizationBadge.tsx +188 -0
  217. package/src/execution/SummarizationCard.tsx +126 -0
  218. package/src/execution/__tests__/PlanCompletionCard.test.tsx +67 -0
  219. package/src/execution/__tests__/buildThreadItems-plan-completion.test.ts +197 -0
  220. package/src/execution/__tests__/useContextWindow.test.ts +167 -0
  221. package/src/execution/index.ts +22 -0
  222. package/src/execution/useContextWindow.ts +148 -0
  223. package/src/execution/useCreateAgentExecution.ts +26 -3
  224. package/src/index.ts +222 -0
  225. package/src/internal/VirtualizedThread.tsx +4 -1
  226. package/src/internal/store/index.ts +6 -0
  227. package/src/internal/store/workflow-execution-event-store.ts +391 -0
  228. package/src/library/ScopeToggle.tsx +88 -20
  229. package/src/library/VisibilityToggle.tsx +54 -13
  230. package/src/library/index.ts +2 -0
  231. package/src/library/useExportResource.ts +12 -9
  232. package/src/mcp-server/McpServerDetailView.tsx +80 -148
  233. package/src/mcp-server/McpServerPicker.tsx +6 -1
  234. package/src/provider.tsx +195 -8
  235. package/src/resource-detail/ResourceDetailShell.tsx +21 -4
  236. package/src/resource-detail/types.ts +25 -0
  237. package/src/resource-detail/useDeleteResource.ts +6 -1
  238. package/src/resource-workbench/components/ResourceWorkbench.tsx +4 -0
  239. package/src/session/useNewSessionFlow.ts +1 -0
  240. package/src/session/useSessionConversation.ts +8 -0
  241. package/src/session/useSessionPageFlow.ts +1 -0
  242. package/src/session/useSessionUsage.ts +72 -4
  243. package/src/settings/UsageSection.tsx +1 -9
  244. package/src/skill/SkillPicker.tsx +6 -1
  245. package/src/workflow/ApprovalFormBuilder.tsx +1017 -0
  246. package/src/workflow/BranchConditionBuilder.tsx +451 -0
  247. package/src/workflow/CanvasActionsContext.ts +12 -0
  248. package/src/workflow/CanvasContextMenu.tsx +364 -0
  249. package/src/workflow/CanvasTaskNode.tsx +372 -0
  250. package/src/workflow/CanvasTransitionEdge.tsx +122 -0
  251. package/src/workflow/CostByWorkflowChart.tsx +120 -0
  252. package/src/workflow/ExecutionSummaryWidget.tsx +194 -0
  253. package/src/workflow/ExecutionTrendChart.tsx +157 -0
  254. package/src/workflow/FailedRunsWidget.tsx +109 -0
  255. package/src/workflow/PendingApprovalsWidget.tsx +115 -0
  256. package/src/workflow/TaskConfigForm.tsx +618 -0
  257. package/src/workflow/TaskKindRegistryContext.ts +36 -0
  258. package/src/workflow/TaskPickerPopover.tsx +326 -0
  259. package/src/workflow/WorkflowArchitectDialog.tsx +505 -0
  260. package/src/workflow/WorkflowCanvasEditor.tsx +651 -0
  261. package/src/workflow/WorkflowCanvasInner.tsx +160 -0
  262. package/src/workflow/WorkflowDashboard.tsx +124 -0
  263. package/src/workflow/WorkflowDetailView.tsx +527 -0
  264. package/src/workflow/WorkflowEditorView.tsx +547 -0
  265. package/src/workflow/WorkflowExecutionApprovalCard.tsx +129 -0
  266. package/src/workflow/WorkflowExecutionArtifactPanel.tsx +112 -0
  267. package/src/workflow/WorkflowExecutionCostPanel.tsx +131 -0
  268. package/src/workflow/WorkflowExecutionHeader.tsx +194 -0
  269. package/src/workflow/WorkflowExecutionPhaseBadge.tsx +188 -0
  270. package/src/workflow/WorkflowExecutionTaskPanel.tsx +135 -0
  271. package/src/workflow/WorkflowExecutionTimeline.tsx +118 -0
  272. package/src/workflow/WorkflowExecutionTimelineEvent.tsx +488 -0
  273. package/src/workflow/WorkflowExecutionViewer.tsx +248 -0
  274. package/src/workflow/WorkflowInspectorPanel.tsx +568 -0
  275. package/src/workflow/WorkflowRefinePanel.tsx +411 -0
  276. package/src/workflow/WorkflowRepairCard.tsx +433 -0
  277. package/src/workflow/WorkflowRunDialog.tsx +220 -0
  278. package/src/workflow/WorkflowRunForm.tsx +245 -0
  279. package/src/workflow/WorkflowTaskList.tsx +177 -0
  280. package/src/workflow/WorkflowTaskPalette.tsx +248 -0
  281. package/src/workflow/WorkflowTopologyGraph.tsx +250 -0
  282. package/src/workflow/WorkflowYamlEditor.tsx +271 -0
  283. package/src/workflow/__tests__/starter-workflow-yaml.test.ts +57 -0
  284. package/src/workflow/canvas-constants.ts +87 -0
  285. package/src/workflow/canvas-icons.tsx +36 -0
  286. package/src/workflow/extract-workflow-yaml.ts +87 -0
  287. package/src/workflow/graph-commands.ts +675 -0
  288. package/src/workflow/index.ts +375 -0
  289. package/src/workflow/serialize-workflow-yaml.ts +546 -0
  290. package/src/workflow/starter-workflow-yaml.ts +29 -0
  291. package/src/workflow/types.ts +99 -0
  292. package/src/workflow/useCanvasKeyboardShortcuts.ts +134 -0
  293. package/src/workflow/useDiagnoseExecutionFlow.ts +378 -0
  294. package/src/workflow/useGraphHistory.ts +138 -0
  295. package/src/workflow/usePendingApprovals.ts +89 -0
  296. package/src/workflow/useRefineWorkflowFlow.ts +321 -0
  297. package/src/workflow/useResolveAgentExecutionSession.ts +57 -0
  298. package/src/workflow/useRunWorkflowFlow.ts +235 -0
  299. package/src/workflow/useTaskKindRegistry.ts +135 -0
  300. package/src/workflow/useWorkflow.ts +78 -0
  301. package/src/workflow/useWorkflowArchitectFlow.ts +303 -0
  302. package/src/workflow/useWorkflowCanvas.ts +882 -0
  303. package/src/workflow/useWorkflowCount.ts +66 -0
  304. package/src/workflow/useWorkflowDashboardSummary.ts +71 -0
  305. package/src/workflow/useWorkflowEditor.ts +106 -0
  306. package/src/workflow/useWorkflowExecution.ts +67 -0
  307. package/src/workflow/useWorkflowExecutionActions.ts +179 -0
  308. package/src/workflow/useWorkflowExecutionArtifacts.ts +57 -0
  309. package/src/workflow/useWorkflowExecutionEventLog.ts +111 -0
  310. package/src/workflow/useWorkflowExecutionEventStream.ts +244 -0
  311. package/src/workflow/useWorkflowExecutionList.ts +121 -0
  312. package/src/workflow/useWorkflowInstances.ts +62 -0
  313. package/src/workflow/useWorkflowList.ts +79 -0
  314. package/src/workflow/useWorkflowSave.ts +84 -0
  315. package/src/workflow/useWorkflowTopology.ts +229 -0
  316. package/src/workflow/useWorkflowValidation.ts +329 -0
  317. package/src/workflow/useWorkflowYaml.ts +49 -0
  318. package/src/workflow/workflow-graph-conversions.ts +796 -0
  319. package/src/workflow/workflow-graph-model.ts +83 -0
  320. package/src/workflow/workflow-yaml-diff.ts +132 -0
  321. package/styles.css +1 -1
  322. package/workflow/ApprovalFormBuilder.d.ts +24 -0
  323. package/workflow/ApprovalFormBuilder.d.ts.map +1 -0
  324. package/workflow/ApprovalFormBuilder.js +347 -0
  325. package/workflow/ApprovalFormBuilder.js.map +1 -0
  326. package/workflow/BranchConditionBuilder.d.ts +29 -0
  327. package/workflow/BranchConditionBuilder.d.ts.map +1 -0
  328. package/workflow/BranchConditionBuilder.js +170 -0
  329. package/workflow/BranchConditionBuilder.js.map +1 -0
  330. package/workflow/CanvasActionsContext.d.ts +8 -0
  331. package/workflow/CanvasActionsContext.d.ts.map +1 -0
  332. package/workflow/CanvasActionsContext.js +4 -0
  333. package/workflow/CanvasActionsContext.js.map +1 -0
  334. package/workflow/CanvasContextMenu.d.ts +59 -0
  335. package/workflow/CanvasContextMenu.d.ts.map +1 -0
  336. package/workflow/CanvasContextMenu.js +98 -0
  337. package/workflow/CanvasContextMenu.js.map +1 -0
  338. package/workflow/CanvasTaskNode.d.ts +21 -0
  339. package/workflow/CanvasTaskNode.d.ts.map +1 -0
  340. package/workflow/CanvasTaskNode.js +125 -0
  341. package/workflow/CanvasTaskNode.js.map +1 -0
  342. package/workflow/CanvasTransitionEdge.d.ts +24 -0
  343. package/workflow/CanvasTransitionEdge.d.ts.map +1 -0
  344. package/workflow/CanvasTransitionEdge.js +50 -0
  345. package/workflow/CanvasTransitionEdge.js.map +1 -0
  346. package/workflow/CostByWorkflowChart.d.ts +15 -0
  347. package/workflow/CostByWorkflowChart.d.ts.map +1 -0
  348. package/workflow/CostByWorkflowChart.js +45 -0
  349. package/workflow/CostByWorkflowChart.js.map +1 -0
  350. package/workflow/ExecutionSummaryWidget.d.ts +16 -0
  351. package/workflow/ExecutionSummaryWidget.d.ts.map +1 -0
  352. package/workflow/ExecutionSummaryWidget.js +93 -0
  353. package/workflow/ExecutionSummaryWidget.js.map +1 -0
  354. package/workflow/ExecutionTrendChart.d.ts +14 -0
  355. package/workflow/ExecutionTrendChart.d.ts.map +1 -0
  356. package/workflow/ExecutionTrendChart.js +67 -0
  357. package/workflow/ExecutionTrendChart.js.map +1 -0
  358. package/workflow/FailedRunsWidget.d.ts +19 -0
  359. package/workflow/FailedRunsWidget.d.ts.map +1 -0
  360. package/workflow/FailedRunsWidget.js +37 -0
  361. package/workflow/FailedRunsWidget.js.map +1 -0
  362. package/workflow/PendingApprovalsWidget.d.ts +19 -0
  363. package/workflow/PendingApprovalsWidget.d.ts.map +1 -0
  364. package/workflow/PendingApprovalsWidget.js +35 -0
  365. package/workflow/PendingApprovalsWidget.js.map +1 -0
  366. package/workflow/TaskConfigForm.d.ts +29 -0
  367. package/workflow/TaskConfigForm.d.ts.map +1 -0
  368. package/workflow/TaskConfigForm.js +230 -0
  369. package/workflow/TaskConfigForm.js.map +1 -0
  370. package/workflow/TaskKindRegistryContext.d.ts +24 -0
  371. package/workflow/TaskKindRegistryContext.d.ts.map +1 -0
  372. package/workflow/TaskKindRegistryContext.js +25 -0
  373. package/workflow/TaskKindRegistryContext.js.map +1 -0
  374. package/workflow/TaskPickerPopover.d.ts +33 -0
  375. package/workflow/TaskPickerPopover.d.ts.map +1 -0
  376. package/workflow/TaskPickerPopover.js +110 -0
  377. package/workflow/TaskPickerPopover.js.map +1 -0
  378. package/workflow/WorkflowArchitectDialog.d.ts +48 -0
  379. package/workflow/WorkflowArchitectDialog.d.ts.map +1 -0
  380. package/workflow/WorkflowArchitectDialog.js +129 -0
  381. package/workflow/WorkflowArchitectDialog.js.map +1 -0
  382. package/workflow/WorkflowCanvasEditor.d.ts +38 -0
  383. package/workflow/WorkflowCanvasEditor.d.ts.map +1 -0
  384. package/workflow/WorkflowCanvasEditor.js +287 -0
  385. package/workflow/WorkflowCanvasEditor.js.map +1 -0
  386. package/workflow/WorkflowCanvasInner.d.ts +32 -0
  387. package/workflow/WorkflowCanvasInner.d.ts.map +1 -0
  388. package/workflow/WorkflowCanvasInner.js +49 -0
  389. package/workflow/WorkflowCanvasInner.js.map +1 -0
  390. package/workflow/WorkflowDashboard.d.ts +35 -0
  391. package/workflow/WorkflowDashboard.d.ts.map +1 -0
  392. package/workflow/WorkflowDashboard.js +59 -0
  393. package/workflow/WorkflowDashboard.js.map +1 -0
  394. package/workflow/WorkflowDetailView.d.ts +63 -0
  395. package/workflow/WorkflowDetailView.d.ts.map +1 -0
  396. package/workflow/WorkflowDetailView.js +202 -0
  397. package/workflow/WorkflowDetailView.js.map +1 -0
  398. package/workflow/WorkflowEditorView.d.ts +43 -0
  399. package/workflow/WorkflowEditorView.d.ts.map +1 -0
  400. package/workflow/WorkflowEditorView.js +165 -0
  401. package/workflow/WorkflowEditorView.js.map +1 -0
  402. package/workflow/WorkflowExecutionApprovalCard.d.ts +27 -0
  403. package/workflow/WorkflowExecutionApprovalCard.d.ts.map +1 -0
  404. package/workflow/WorkflowExecutionApprovalCard.js +32 -0
  405. package/workflow/WorkflowExecutionApprovalCard.js.map +1 -0
  406. package/workflow/WorkflowExecutionArtifactPanel.d.ts +15 -0
  407. package/workflow/WorkflowExecutionArtifactPanel.d.ts.map +1 -0
  408. package/workflow/WorkflowExecutionArtifactPanel.js +53 -0
  409. package/workflow/WorkflowExecutionArtifactPanel.js.map +1 -0
  410. package/workflow/WorkflowExecutionCostPanel.d.ts +18 -0
  411. package/workflow/WorkflowExecutionCostPanel.d.ts.map +1 -0
  412. package/workflow/WorkflowExecutionCostPanel.js +44 -0
  413. package/workflow/WorkflowExecutionCostPanel.js.map +1 -0
  414. package/workflow/WorkflowExecutionHeader.d.ts +26 -0
  415. package/workflow/WorkflowExecutionHeader.d.ts.map +1 -0
  416. package/workflow/WorkflowExecutionHeader.js +68 -0
  417. package/workflow/WorkflowExecutionHeader.js.map +1 -0
  418. package/workflow/WorkflowExecutionPhaseBadge.d.ts +23 -0
  419. package/workflow/WorkflowExecutionPhaseBadge.d.ts.map +1 -0
  420. package/workflow/WorkflowExecutionPhaseBadge.js +99 -0
  421. package/workflow/WorkflowExecutionPhaseBadge.js.map +1 -0
  422. package/workflow/WorkflowExecutionTaskPanel.d.ts +24 -0
  423. package/workflow/WorkflowExecutionTaskPanel.d.ts.map +1 -0
  424. package/workflow/WorkflowExecutionTaskPanel.js +59 -0
  425. package/workflow/WorkflowExecutionTaskPanel.js.map +1 -0
  426. package/workflow/WorkflowExecutionTimeline.d.ts +27 -0
  427. package/workflow/WorkflowExecutionTimeline.d.ts.map +1 -0
  428. package/workflow/WorkflowExecutionTimeline.js +51 -0
  429. package/workflow/WorkflowExecutionTimeline.js.map +1 -0
  430. package/workflow/WorkflowExecutionTimelineEvent.d.ts +18 -0
  431. package/workflow/WorkflowExecutionTimelineEvent.d.ts.map +1 -0
  432. package/workflow/WorkflowExecutionTimelineEvent.js +210 -0
  433. package/workflow/WorkflowExecutionTimelineEvent.js.map +1 -0
  434. package/workflow/WorkflowExecutionViewer.d.ts +45 -0
  435. package/workflow/WorkflowExecutionViewer.d.ts.map +1 -0
  436. package/workflow/WorkflowExecutionViewer.js +75 -0
  437. package/workflow/WorkflowExecutionViewer.js.map +1 -0
  438. package/workflow/WorkflowInspectorPanel.d.ts +46 -0
  439. package/workflow/WorkflowInspectorPanel.d.ts.map +1 -0
  440. package/workflow/WorkflowInspectorPanel.js +152 -0
  441. package/workflow/WorkflowInspectorPanel.js.map +1 -0
  442. package/workflow/WorkflowRefinePanel.d.ts +30 -0
  443. package/workflow/WorkflowRefinePanel.d.ts.map +1 -0
  444. package/workflow/WorkflowRefinePanel.js +107 -0
  445. package/workflow/WorkflowRefinePanel.js.map +1 -0
  446. package/workflow/WorkflowRepairCard.d.ts +35 -0
  447. package/workflow/WorkflowRepairCard.d.ts.map +1 -0
  448. package/workflow/WorkflowRepairCard.js +113 -0
  449. package/workflow/WorkflowRepairCard.js.map +1 -0
  450. package/workflow/WorkflowRunDialog.d.ts +51 -0
  451. package/workflow/WorkflowRunDialog.d.ts.map +1 -0
  452. package/workflow/WorkflowRunDialog.js +75 -0
  453. package/workflow/WorkflowRunDialog.js.map +1 -0
  454. package/workflow/WorkflowRunForm.d.ts +62 -0
  455. package/workflow/WorkflowRunForm.d.ts.map +1 -0
  456. package/workflow/WorkflowRunForm.js +64 -0
  457. package/workflow/WorkflowRunForm.js.map +1 -0
  458. package/workflow/WorkflowTaskList.d.ts +25 -0
  459. package/workflow/WorkflowTaskList.d.ts.map +1 -0
  460. package/workflow/WorkflowTaskList.js +89 -0
  461. package/workflow/WorkflowTaskList.js.map +1 -0
  462. package/workflow/WorkflowTaskPalette.d.ts +22 -0
  463. package/workflow/WorkflowTaskPalette.d.ts.map +1 -0
  464. package/workflow/WorkflowTaskPalette.js +83 -0
  465. package/workflow/WorkflowTaskPalette.js.map +1 -0
  466. package/workflow/WorkflowTopologyGraph.d.ts +22 -0
  467. package/workflow/WorkflowTopologyGraph.d.ts.map +1 -0
  468. package/workflow/WorkflowTopologyGraph.js +123 -0
  469. package/workflow/WorkflowTopologyGraph.js.map +1 -0
  470. package/workflow/WorkflowYamlEditor.d.ts +43 -0
  471. package/workflow/WorkflowYamlEditor.d.ts.map +1 -0
  472. package/workflow/WorkflowYamlEditor.js +215 -0
  473. package/workflow/WorkflowYamlEditor.js.map +1 -0
  474. package/workflow/__tests__/starter-workflow-yaml.test.d.ts +2 -0
  475. package/workflow/__tests__/starter-workflow-yaml.test.d.ts.map +1 -0
  476. package/workflow/__tests__/starter-workflow-yaml.test.js +44 -0
  477. package/workflow/__tests__/starter-workflow-yaml.test.js.map +1 -0
  478. package/workflow/canvas-constants.d.ts +56 -0
  479. package/workflow/canvas-constants.d.ts.map +1 -0
  480. package/workflow/canvas-constants.js +74 -0
  481. package/workflow/canvas-constants.js.map +1 -0
  482. package/workflow/canvas-icons.d.ts +13 -0
  483. package/workflow/canvas-icons.d.ts.map +1 -0
  484. package/workflow/canvas-icons.js +21 -0
  485. package/workflow/canvas-icons.js.map +1 -0
  486. package/workflow/extract-workflow-yaml.d.ts +22 -0
  487. package/workflow/extract-workflow-yaml.d.ts.map +1 -0
  488. package/workflow/extract-workflow-yaml.js +63 -0
  489. package/workflow/extract-workflow-yaml.js.map +1 -0
  490. package/workflow/graph-commands.d.ts +209 -0
  491. package/workflow/graph-commands.d.ts.map +1 -0
  492. package/workflow/graph-commands.js +516 -0
  493. package/workflow/graph-commands.js.map +1 -0
  494. package/workflow/index.d.ts +66 -0
  495. package/workflow/index.d.ts.map +1 -0
  496. package/workflow/index.js +88 -0
  497. package/workflow/index.js.map +1 -0
  498. package/workflow/serialize-workflow-yaml.d.ts +39 -0
  499. package/workflow/serialize-workflow-yaml.d.ts.map +1 -0
  500. package/workflow/serialize-workflow-yaml.js +413 -0
  501. package/workflow/serialize-workflow-yaml.js.map +1 -0
  502. package/workflow/starter-workflow-yaml.d.ts +12 -0
  503. package/workflow/starter-workflow-yaml.d.ts.map +1 -0
  504. package/workflow/starter-workflow-yaml.js +30 -0
  505. package/workflow/starter-workflow-yaml.js.map +1 -0
  506. package/workflow/types.d.ts +80 -0
  507. package/workflow/types.d.ts.map +1 -0
  508. package/workflow/types.js +2 -0
  509. package/workflow/types.js.map +1 -0
  510. package/workflow/useCanvasKeyboardShortcuts.d.ts +34 -0
  511. package/workflow/useCanvasKeyboardShortcuts.d.ts.map +1 -0
  512. package/workflow/useCanvasKeyboardShortcuts.js +108 -0
  513. package/workflow/useCanvasKeyboardShortcuts.js.map +1 -0
  514. package/workflow/useDiagnoseExecutionFlow.d.ts +87 -0
  515. package/workflow/useDiagnoseExecutionFlow.d.ts.map +1 -0
  516. package/workflow/useDiagnoseExecutionFlow.js +257 -0
  517. package/workflow/useDiagnoseExecutionFlow.js.map +1 -0
  518. package/workflow/useGraphHistory.d.ts +28 -0
  519. package/workflow/useGraphHistory.d.ts.map +1 -0
  520. package/workflow/useGraphHistory.js +106 -0
  521. package/workflow/useGraphHistory.js.map +1 -0
  522. package/workflow/usePendingApprovals.d.ts +35 -0
  523. package/workflow/usePendingApprovals.d.ts.map +1 -0
  524. package/workflow/usePendingApprovals.js +50 -0
  525. package/workflow/usePendingApprovals.js.map +1 -0
  526. package/workflow/useRefineWorkflowFlow.d.ts +75 -0
  527. package/workflow/useRefineWorkflowFlow.d.ts.map +1 -0
  528. package/workflow/useRefineWorkflowFlow.js +216 -0
  529. package/workflow/useRefineWorkflowFlow.js.map +1 -0
  530. package/workflow/useResolveAgentExecutionSession.d.ts +33 -0
  531. package/workflow/useResolveAgentExecutionSession.d.ts.map +1 -0
  532. package/workflow/useResolveAgentExecutionSession.js +37 -0
  533. package/workflow/useResolveAgentExecutionSession.js.map +1 -0
  534. package/workflow/useRunWorkflowFlow.d.ts +82 -0
  535. package/workflow/useRunWorkflowFlow.d.ts.map +1 -0
  536. package/workflow/useRunWorkflowFlow.js +145 -0
  537. package/workflow/useRunWorkflowFlow.js.map +1 -0
  538. package/workflow/useTaskKindRegistry.d.ts +96 -0
  539. package/workflow/useTaskKindRegistry.d.ts.map +1 -0
  540. package/workflow/useTaskKindRegistry.js +75 -0
  541. package/workflow/useTaskKindRegistry.js.map +1 -0
  542. package/workflow/useWorkflow.d.ts +47 -0
  543. package/workflow/useWorkflow.d.ts.map +1 -0
  544. package/workflow/useWorkflow.js +53 -0
  545. package/workflow/useWorkflow.js.map +1 -0
  546. package/workflow/useWorkflowArchitectFlow.d.ts +96 -0
  547. package/workflow/useWorkflowArchitectFlow.d.ts.map +1 -0
  548. package/workflow/useWorkflowArchitectFlow.js +179 -0
  549. package/workflow/useWorkflowArchitectFlow.js.map +1 -0
  550. package/workflow/useWorkflowCanvas.d.ts +66 -0
  551. package/workflow/useWorkflowCanvas.d.ts.map +1 -0
  552. package/workflow/useWorkflowCanvas.js +628 -0
  553. package/workflow/useWorkflowCanvas.js.map +1 -0
  554. package/workflow/useWorkflowCount.d.ts +47 -0
  555. package/workflow/useWorkflowCount.d.ts.map +1 -0
  556. package/workflow/useWorkflowCount.js +26 -0
  557. package/workflow/useWorkflowCount.js.map +1 -0
  558. package/workflow/useWorkflowDashboardSummary.d.ts +34 -0
  559. package/workflow/useWorkflowDashboardSummary.d.ts.map +1 -0
  560. package/workflow/useWorkflowDashboardSummary.js +33 -0
  561. package/workflow/useWorkflowDashboardSummary.js.map +1 -0
  562. package/workflow/useWorkflowEditor.d.ts +45 -0
  563. package/workflow/useWorkflowEditor.d.ts.map +1 -0
  564. package/workflow/useWorkflowEditor.js +52 -0
  565. package/workflow/useWorkflowEditor.js.map +1 -0
  566. package/workflow/useWorkflowExecution.d.ts +37 -0
  567. package/workflow/useWorkflowExecution.d.ts.map +1 -0
  568. package/workflow/useWorkflowExecution.js +43 -0
  569. package/workflow/useWorkflowExecution.js.map +1 -0
  570. package/workflow/useWorkflowExecutionActions.d.ts +41 -0
  571. package/workflow/useWorkflowExecutionActions.d.ts.map +1 -0
  572. package/workflow/useWorkflowExecutionActions.js +86 -0
  573. package/workflow/useWorkflowExecutionActions.js.map +1 -0
  574. package/workflow/useWorkflowExecutionArtifacts.d.ts +26 -0
  575. package/workflow/useWorkflowExecutionArtifacts.d.ts.map +1 -0
  576. package/workflow/useWorkflowExecutionArtifacts.js +29 -0
  577. package/workflow/useWorkflowExecutionArtifacts.js.map +1 -0
  578. package/workflow/useWorkflowExecutionEventLog.d.ts +47 -0
  579. package/workflow/useWorkflowExecutionEventLog.d.ts.map +1 -0
  580. package/workflow/useWorkflowExecutionEventLog.js +59 -0
  581. package/workflow/useWorkflowExecutionEventLog.js.map +1 -0
  582. package/workflow/useWorkflowExecutionEventStream.d.ts +61 -0
  583. package/workflow/useWorkflowExecutionEventStream.d.ts.map +1 -0
  584. package/workflow/useWorkflowExecutionEventStream.js +161 -0
  585. package/workflow/useWorkflowExecutionEventStream.js.map +1 -0
  586. package/workflow/useWorkflowExecutionList.d.ts +49 -0
  587. package/workflow/useWorkflowExecutionList.d.ts.map +1 -0
  588. package/workflow/useWorkflowExecutionList.js +65 -0
  589. package/workflow/useWorkflowExecutionList.js.map +1 -0
  590. package/workflow/useWorkflowInstances.d.ts +30 -0
  591. package/workflow/useWorkflowInstances.d.ts.map +1 -0
  592. package/workflow/useWorkflowInstances.js +33 -0
  593. package/workflow/useWorkflowInstances.js.map +1 -0
  594. package/workflow/useWorkflowList.d.ts +57 -0
  595. package/workflow/useWorkflowList.d.ts.map +1 -0
  596. package/workflow/useWorkflowList.js +29 -0
  597. package/workflow/useWorkflowList.js.map +1 -0
  598. package/workflow/useWorkflowSave.d.ts +25 -0
  599. package/workflow/useWorkflowSave.d.ts.map +1 -0
  600. package/workflow/useWorkflowSave.js +61 -0
  601. package/workflow/useWorkflowSave.js.map +1 -0
  602. package/workflow/useWorkflowTopology.d.ts +40 -0
  603. package/workflow/useWorkflowTopology.d.ts.map +1 -0
  604. package/workflow/useWorkflowTopology.js +163 -0
  605. package/workflow/useWorkflowTopology.js.map +1 -0
  606. package/workflow/useWorkflowValidation.d.ts +27 -0
  607. package/workflow/useWorkflowValidation.d.ts.map +1 -0
  608. package/workflow/useWorkflowValidation.js +253 -0
  609. package/workflow/useWorkflowValidation.js.map +1 -0
  610. package/workflow/useWorkflowYaml.d.ts +26 -0
  611. package/workflow/useWorkflowYaml.d.ts.map +1 -0
  612. package/workflow/useWorkflowYaml.js +26 -0
  613. package/workflow/useWorkflowYaml.js.map +1 -0
  614. package/workflow/workflow-graph-conversions.d.ts +70 -0
  615. package/workflow/workflow-graph-conversions.d.ts.map +1 -0
  616. package/workflow/workflow-graph-conversions.js +634 -0
  617. package/workflow/workflow-graph-conversions.js.map +1 -0
  618. package/workflow/workflow-graph-model.d.ts +83 -0
  619. package/workflow/workflow-graph-model.d.ts.map +1 -0
  620. package/workflow/workflow-graph-model.js +5 -0
  621. package/workflow/workflow-graph-model.js.map +1 -0
  622. package/workflow/workflow-yaml-diff.d.ts +24 -0
  623. package/workflow/workflow-yaml-diff.d.ts.map +1 -0
  624. package/workflow/workflow-yaml-diff.js +96 -0
  625. package/workflow/workflow-yaml-diff.js.map +1 -0
@@ -0,0 +1,229 @@
1
+ "use client";
2
+
3
+ import { useMemo } from "react";
4
+ import { parse as parseYaml } from "yaml";
5
+
6
+ /** A node in the workflow topology graph. */
7
+ export interface TopologyNode {
8
+ readonly id: string;
9
+ readonly label: string;
10
+ readonly kind: string;
11
+ readonly category: TopologyNodeCategory;
12
+ /** Layout position computed by dagre (set after layout). */
13
+ x: number;
14
+ y: number;
15
+ readonly width: number;
16
+ readonly height: number;
17
+ }
18
+
19
+ /** An edge in the workflow topology graph. */
20
+ export interface TopologyEdge {
21
+ readonly source: string;
22
+ readonly target: string;
23
+ readonly label?: string;
24
+ }
25
+
26
+ export type TopologyNodeCategory =
27
+ | "start"
28
+ | "end"
29
+ | "ai"
30
+ | "control_flow"
31
+ | "invocation"
32
+ | "data"
33
+ | "governance"
34
+ | "event"
35
+ | "unspecified";
36
+
37
+ /** Return value of {@link useWorkflowTopology}. */
38
+ export interface UseWorkflowTopologyReturn {
39
+ readonly nodes: readonly TopologyNode[];
40
+ readonly edges: readonly TopologyEdge[];
41
+ }
42
+
43
+ const AI_KINDS = new Set(["agent_call", "llm_call", "eval"]);
44
+ const CONTROL_FLOW_KINDS = new Set(["switch_case", "for_each", "fork", "try_catch"]);
45
+ const INVOCATION_KINDS = new Set(["http_call", "grpc_call", "activity_call", "run_workflow"]);
46
+ const DATA_KINDS = new Set(["set_vars", "transform"]);
47
+ const GOVERNANCE_KINDS = new Set(["human_input", "validate"]);
48
+ const EVENT_KINDS = new Set(["listen", "wait", "emit_event", "notification", "raise_error"]);
49
+
50
+ const NODE_WIDTH = 180;
51
+ const NODE_HEIGHT = 40;
52
+
53
+ /**
54
+ * Behavior hook that computes a DAG topology from workflow YAML.
55
+ *
56
+ * Parses the YAML into tasks and builds a node + edge graph suitable
57
+ * for rendering. Handles sequential flow, explicit `flow.then` directives,
58
+ * and `switch_case` branching edges.
59
+ *
60
+ * Returns stable refs (DD-010) — the result is memoized and only
61
+ * recomputed when the YAML content changes.
62
+ *
63
+ * @param yaml - The current workflow YAML string (or `null`/empty to skip).
64
+ *
65
+ * @since T10 (YAML Editor with Graph Preview)
66
+ */
67
+ export function useWorkflowTopology(
68
+ yaml: string | null,
69
+ ): UseWorkflowTopologyReturn {
70
+ return useMemo(() => {
71
+ if (!yaml?.trim()) return EMPTY_TOPOLOGY;
72
+
73
+ try {
74
+ return computeTopology(yaml);
75
+ } catch {
76
+ return EMPTY_TOPOLOGY;
77
+ }
78
+ }, [yaml]);
79
+ }
80
+
81
+ const EMPTY_TOPOLOGY: UseWorkflowTopologyReturn = { nodes: [], edges: [] };
82
+
83
+ // ---------------------------------------------------------------------------
84
+ // Topology computation
85
+ // ---------------------------------------------------------------------------
86
+
87
+ interface RawTask {
88
+ name: string;
89
+ kind: string;
90
+ task_config?: Record<string, unknown>;
91
+ taskConfig?: Record<string, unknown>;
92
+ flow?: { then?: string };
93
+ export?: { as?: string };
94
+ }
95
+
96
+ function computeTopology(yaml: string): UseWorkflowTopologyReturn {
97
+ let parsed: unknown;
98
+ try {
99
+ parsed = parseYaml(yaml);
100
+ } catch {
101
+ return EMPTY_TOPOLOGY;
102
+ }
103
+
104
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
105
+ return EMPTY_TOPOLOGY;
106
+ }
107
+
108
+ const doc = parsed as Record<string, unknown>;
109
+ const spec = doc.spec as Record<string, unknown> | undefined;
110
+ if (!spec) return EMPTY_TOPOLOGY;
111
+
112
+ const rawTasks = spec.tasks;
113
+ if (!Array.isArray(rawTasks) || rawTasks.length === 0) return EMPTY_TOPOLOGY;
114
+
115
+ const tasks = rawTasks.filter(
116
+ (t): t is RawTask =>
117
+ t != null && typeof t === "object" && typeof (t as RawTask).name === "string",
118
+ );
119
+
120
+ if (tasks.length === 0) return EMPTY_TOPOLOGY;
121
+
122
+ const nodes: TopologyNode[] = [];
123
+ const edges: TopologyEdge[] = [];
124
+ const taskNameSet = new Set(tasks.map((t) => t.name));
125
+
126
+ const startNode: TopologyNode = {
127
+ id: "__start__",
128
+ label: "Start",
129
+ kind: "start",
130
+ category: "start",
131
+ x: 0, y: 0,
132
+ width: NODE_WIDTH, height: NODE_HEIGHT,
133
+ };
134
+ nodes.push(startNode);
135
+
136
+ for (const task of tasks) {
137
+ nodes.push({
138
+ id: task.name,
139
+ label: task.name,
140
+ kind: task.kind || "unspecified",
141
+ category: categorizeKind(task.kind),
142
+ x: 0, y: 0,
143
+ width: NODE_WIDTH, height: NODE_HEIGHT,
144
+ });
145
+ }
146
+
147
+ // Edge: start → first task
148
+ edges.push({ source: "__start__", target: tasks[0].name });
149
+
150
+ const tasksWithEndFlow = new Set<string>();
151
+
152
+ for (let i = 0; i < tasks.length; i++) {
153
+ const task = tasks[i];
154
+ const thenTarget = task.flow?.then;
155
+
156
+ if (thenTarget === "end") {
157
+ tasksWithEndFlow.add(task.name);
158
+ continue;
159
+ }
160
+
161
+ if (thenTarget && taskNameSet.has(thenTarget)) {
162
+ edges.push({ source: task.name, target: thenTarget });
163
+ continue;
164
+ }
165
+
166
+ // switch_case: add edges for each case
167
+ const config = task.task_config ?? task.taskConfig;
168
+ if (task.kind === "switch_case" && config) {
169
+ const cases = (config as Record<string, unknown>).cases;
170
+ if (Array.isArray(cases)) {
171
+ let hasDefault = false;
172
+ for (const c of cases) {
173
+ if (c && typeof c === "object") {
174
+ const caseObj = c as Record<string, unknown>;
175
+ const caseThen = caseObj.then as string | undefined;
176
+ if (caseThen && taskNameSet.has(caseThen)) {
177
+ edges.push({
178
+ source: task.name,
179
+ target: caseThen,
180
+ label: (caseObj.name as string) || undefined,
181
+ });
182
+ if (!(caseObj.when as string)) hasDefault = true;
183
+ }
184
+ }
185
+ }
186
+ if (!hasDefault && i < tasks.length - 1) {
187
+ edges.push({ source: task.name, target: tasks[i + 1].name });
188
+ }
189
+ continue;
190
+ }
191
+ }
192
+
193
+ // Default: sequential to next task
194
+ if (i < tasks.length - 1) {
195
+ edges.push({ source: task.name, target: tasks[i + 1].name });
196
+ } else {
197
+ tasksWithEndFlow.add(task.name);
198
+ }
199
+ }
200
+
201
+ // Add end node if any tasks flow to "end" or the last task has no explicit successor
202
+ if (tasksWithEndFlow.size > 0) {
203
+ const endNode: TopologyNode = {
204
+ id: "__end__",
205
+ label: "End",
206
+ kind: "end",
207
+ category: "end",
208
+ x: 0, y: 0,
209
+ width: NODE_WIDTH, height: NODE_HEIGHT,
210
+ };
211
+ nodes.push(endNode);
212
+
213
+ for (const name of tasksWithEndFlow) {
214
+ edges.push({ source: name, target: "__end__" });
215
+ }
216
+ }
217
+
218
+ return { nodes, edges };
219
+ }
220
+
221
+ function categorizeKind(kind: string): TopologyNodeCategory {
222
+ if (AI_KINDS.has(kind)) return "ai";
223
+ if (CONTROL_FLOW_KINDS.has(kind)) return "control_flow";
224
+ if (INVOCATION_KINDS.has(kind)) return "invocation";
225
+ if (DATA_KINDS.has(kind)) return "data";
226
+ if (GOVERNANCE_KINDS.has(kind)) return "governance";
227
+ if (EVENT_KINDS.has(kind)) return "event";
228
+ return "unspecified";
229
+ }
@@ -0,0 +1,329 @@
1
+ "use client";
2
+
3
+ import { useMemo, useRef, useState, useEffect } from "react";
4
+ import { parseDocument, type Document, type YAMLMap, type Pair, isMap, isSeq, isScalar } from "yaml";
5
+ import type { Diagnostic } from "@codemirror/lint";
6
+ import type { UseTaskKindRegistryReturn } from "./useTaskKindRegistry";
7
+ import { TASK_NAME_PATTERN, TASK_NAME_PATTERN_ERROR } from "./canvas-constants";
8
+
9
+ /** Return value of {@link useWorkflowValidation}. */
10
+ export interface UseWorkflowValidationReturn {
11
+ /** CodeMirror-compatible diagnostics mapped to source positions. */
12
+ readonly diagnostics: readonly Diagnostic[];
13
+ }
14
+
15
+ const DEBOUNCE_MS = 150;
16
+
17
+ const VALID_TASK_KINDS = new Set([
18
+ "set_vars", "http_call", "grpc_call", "activity_call", "switch_case",
19
+ "for_each", "fork", "try_catch", "listen", "wait", "raise_error",
20
+ "run_workflow", "agent_call", "llm_call", "transform", "human_input",
21
+ "validate", "emit_event", "notification", "eval",
22
+ ]);
23
+
24
+ /**
25
+ * Behavior hook that validates workflow YAML and produces CodeMirror diagnostics.
26
+ *
27
+ * The pipeline runs entirely client-side with 150ms debounce:
28
+ * 1. YAML syntax check (parse errors)
29
+ * 2. Structural validation (required fields: document, tasks)
30
+ * 3. Per-task kind validation (known kinds, required task fields)
31
+ * 4. Task config schema validation (against TaskKindRegistry JSON schemas)
32
+ * 5. Reference validation (flow.then targets, duplicate task names)
33
+ *
34
+ * Each diagnostic is source-mapped to exact character positions using the
35
+ * `yaml` library's CST range information.
36
+ *
37
+ * @param yaml - The current YAML content string.
38
+ * @param registry - The task kind registry for schema validation.
39
+ *
40
+ * @since T10 (YAML Editor with Graph Preview)
41
+ */
42
+ export function useWorkflowValidation(
43
+ yaml: string,
44
+ registry: UseTaskKindRegistryReturn | null,
45
+ ): UseWorkflowValidationReturn {
46
+ const [diagnostics, setDiagnostics] = useState<readonly Diagnostic[]>([]);
47
+ const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
48
+ const registryRef = useRef(registry);
49
+ registryRef.current = registry;
50
+
51
+ useEffect(() => {
52
+ if (timerRef.current) clearTimeout(timerRef.current);
53
+
54
+ timerRef.current = setTimeout(() => {
55
+ const result = validateWorkflowYaml(yaml, registryRef.current);
56
+ setDiagnostics(result);
57
+ }, DEBOUNCE_MS);
58
+
59
+ return () => {
60
+ if (timerRef.current) clearTimeout(timerRef.current);
61
+ };
62
+ }, [yaml]);
63
+
64
+ return useMemo(() => ({ diagnostics }), [diagnostics]);
65
+ }
66
+
67
+ // ---------------------------------------------------------------------------
68
+ // Core validation pipeline
69
+ // ---------------------------------------------------------------------------
70
+
71
+ function validateWorkflowYaml(
72
+ yaml: string,
73
+ registry: UseTaskKindRegistryReturn | null,
74
+ ): Diagnostic[] {
75
+ if (!yaml.trim()) return [];
76
+
77
+ const diags: Diagnostic[] = [];
78
+
79
+ let doc: Document;
80
+ try {
81
+ doc = parseDocument(yaml, { keepSourceTokens: true });
82
+ } catch {
83
+ diags.push({ from: 0, to: Math.min(yaml.length, 1), severity: "error", message: "Invalid YAML syntax" });
84
+ return diags;
85
+ }
86
+
87
+ for (const err of doc.errors) {
88
+ const [from, to] = err.pos ?? [0, 1];
89
+ diags.push({ from, to: Math.max(to, from + 1), severity: "error", message: err.message });
90
+ }
91
+ if (diags.length > 0) return diags;
92
+
93
+ const root = doc.contents;
94
+ if (!isMap(root)) {
95
+ diags.push({ from: 0, to: Math.min(yaml.length, 1), severity: "error", message: "Workflow YAML must be a mapping document" });
96
+ return diags;
97
+ }
98
+
99
+ validateStructure(root, diags, yaml);
100
+ validateTasks(root, diags, yaml, registry);
101
+
102
+ return diags;
103
+ }
104
+
105
+ // ---------------------------------------------------------------------------
106
+ // Structural validation
107
+ // ---------------------------------------------------------------------------
108
+
109
+ function validateStructure(root: YAMLMap, diags: Diagnostic[], yaml: string): void {
110
+ const specNode = findMapValue(root, "spec");
111
+ if (!specNode || !isMap(specNode)) {
112
+ diags.push(diagAtKey(root, "spec", yaml, "error", "Missing required field: spec"));
113
+ return;
114
+ }
115
+
116
+ const docNode = findMapValue(specNode, "document");
117
+ if (!docNode || !isMap(docNode)) {
118
+ diags.push(diagAtKey(specNode, "document", yaml, "error", "Missing required field: spec.document"));
119
+ } else {
120
+ for (const field of ["namespace", "name", "version"] as const) {
121
+ const val = findScalarValue(docNode, field);
122
+ if (!val) {
123
+ diags.push(diagAtKey(docNode, field, yaml, "error", `Missing required field: spec.document.${field}`));
124
+ }
125
+ }
126
+ }
127
+
128
+ const tasksNode = findMapValue(specNode, "tasks");
129
+ if (!tasksNode || !isSeq(tasksNode) || tasksNode.items.length === 0) {
130
+ diags.push(diagAtKey(specNode, "tasks", yaml, "error", "Missing required field: spec.tasks (must be a non-empty list)"));
131
+ }
132
+ }
133
+
134
+ // ---------------------------------------------------------------------------
135
+ // Task-level validation
136
+ // ---------------------------------------------------------------------------
137
+
138
+ function validateTasks(
139
+ root: YAMLMap,
140
+ diags: Diagnostic[],
141
+ yaml: string,
142
+ registry: UseTaskKindRegistryReturn | null,
143
+ ): void {
144
+ const specNode = findMapValue(root, "spec");
145
+ if (!specNode || !isMap(specNode)) return;
146
+
147
+ const tasksNode = findMapValue(specNode, "tasks");
148
+ if (!tasksNode || !isSeq(tasksNode)) return;
149
+
150
+ const taskNames = new Set<string>();
151
+ const allTaskNames: string[] = [];
152
+
153
+ for (const item of tasksNode.items) {
154
+ if (!isMap(item)) continue;
155
+
156
+ const nameNode = findPair(item, "name");
157
+ const nameVal = findScalarValue(item, "name");
158
+ const kindVal = findScalarValue(item, "kind");
159
+
160
+ if (!nameVal) {
161
+ const range = rangeOf(item, yaml);
162
+ diags.push({ from: range[0], to: range[1], severity: "error", message: "Task is missing required field: name" });
163
+ continue;
164
+ }
165
+
166
+ if (!TASK_NAME_PATTERN.test(nameVal)) {
167
+ const range = nameNode ? rangeOfPair(nameNode, yaml) : rangeOf(item, yaml);
168
+ diags.push({ from: range[0], to: range[1], severity: "error", message: `Task name "${nameVal}": ${TASK_NAME_PATTERN_ERROR}` });
169
+ }
170
+
171
+ if (taskNames.has(nameVal)) {
172
+ const range = nameNode ? rangeOfPair(nameNode, yaml) : rangeOf(item, yaml);
173
+ diags.push({ from: range[0], to: range[1], severity: "warning", message: `Duplicate task name: "${nameVal}"` });
174
+ }
175
+ taskNames.add(nameVal);
176
+ allTaskNames.push(nameVal);
177
+
178
+ if (!kindVal) {
179
+ const range = rangeOf(item, yaml);
180
+ diags.push({ from: range[0], to: range[1], severity: "error", message: `Task "${nameVal}" is missing required field: kind` });
181
+ continue;
182
+ }
183
+
184
+ if (!VALID_TASK_KINDS.has(kindVal)) {
185
+ const kindPair = findPair(item, "kind");
186
+ const range = kindPair ? rangeOfPair(kindPair, yaml) : rangeOf(item, yaml);
187
+ diags.push({ from: range[0], to: range[1], severity: "error", message: `Task "${nameVal}" has unknown kind: "${kindVal}"` });
188
+ continue;
189
+ }
190
+
191
+ const configNode = findMapValue(item, "task_config") ?? findMapValue(item, "taskConfig");
192
+ if (!configNode || !isMap(configNode)) {
193
+ const range = rangeOf(item, yaml);
194
+ diags.push({ from: range[0], to: range[1], severity: "error", message: `Task "${nameVal}" is missing required field: task_config` });
195
+ } else if (kindVal === "eval") {
196
+ validateEvalConfig(configNode, nameVal, diags, yaml);
197
+ }
198
+
199
+ validateFlowReferences(item, nameVal, allTaskNames, taskNames, diags, yaml);
200
+ }
201
+
202
+ // Second pass: validate all flow.then references point to existing tasks
203
+ for (const item of tasksNode.items) {
204
+ if (!isMap(item)) continue;
205
+ const nameVal = findScalarValue(item, "name");
206
+ if (!nameVal) continue;
207
+ validateFlowReferencesSecondPass(item, nameVal, taskNames, diags, yaml);
208
+ }
209
+ }
210
+
211
+ function validateFlowReferences(
212
+ _taskNode: YAMLMap,
213
+ _taskName: string,
214
+ _allNames: string[],
215
+ _nameSet: Set<string>,
216
+ _diags: Diagnostic[],
217
+ _yaml: string,
218
+ ): void {
219
+ // Placeholder — forward references are validated in the second pass
220
+ }
221
+
222
+ function validateFlowReferencesSecondPass(
223
+ taskNode: YAMLMap,
224
+ taskName: string,
225
+ taskNames: Set<string>,
226
+ diags: Diagnostic[],
227
+ yaml: string,
228
+ ): void {
229
+ const flowNode = findMapValue(taskNode, "flow");
230
+ if (!flowNode || !isMap(flowNode)) return;
231
+
232
+ const thenVal = findScalarValue(flowNode, "then");
233
+ if (!thenVal || thenVal === "end") return;
234
+
235
+ if (!taskNames.has(thenVal)) {
236
+ const thenPair = findPair(flowNode, "then");
237
+ const range = thenPair ? rangeOfPair(thenPair, yaml) : rangeOf(flowNode, yaml);
238
+ diags.push({
239
+ from: range[0],
240
+ to: range[1],
241
+ severity: "warning",
242
+ message: `Task "${taskName}" flow.then references unknown task "${thenVal}"`,
243
+ });
244
+ }
245
+ }
246
+
247
+ // ---------------------------------------------------------------------------
248
+ // Kind-specific config validation
249
+ // ---------------------------------------------------------------------------
250
+
251
+ function validateEvalConfig(
252
+ configNode: YAMLMap,
253
+ taskName: string,
254
+ diags: Diagnostic[],
255
+ yaml: string,
256
+ ): void {
257
+ for (const field of ["model", "subject", "rubric"] as const) {
258
+ const val = findScalarValue(configNode, field);
259
+ if (!val) {
260
+ diags.push(
261
+ diagAtKey(configNode, field, yaml, "error", `Eval task "${taskName}" is missing required field: ${field}`),
262
+ );
263
+ }
264
+ }
265
+
266
+ const thresholdNode = findMapValue(configNode, "threshold");
267
+ if (thresholdNode && isScalar(thresholdNode)) {
268
+ const num = Number(thresholdNode.value);
269
+ if (!Number.isFinite(num) || num < 0 || num > 1) {
270
+ const pair = findPair(configNode, "threshold");
271
+ const range = pair ? rangeOfPair(pair, yaml) : rangeOf(configNode, yaml);
272
+ diags.push({ from: range[0], to: range[1], severity: "error", message: `Eval task "${taskName}": threshold must be between 0.0 and 1.0` });
273
+ }
274
+ }
275
+ }
276
+
277
+ // ---------------------------------------------------------------------------
278
+ // YAML node helpers
279
+ // ---------------------------------------------------------------------------
280
+
281
+ function findPair(map: YAMLMap, key: string): Pair | undefined {
282
+ for (const item of map.items) {
283
+ if (isScalar(item.key) && item.key.value === key) {
284
+ return item;
285
+ }
286
+ }
287
+ return undefined;
288
+ }
289
+
290
+ function findMapValue(map: YAMLMap, key: string): unknown {
291
+ const pair = findPair(map, key);
292
+ return pair?.value ?? undefined;
293
+ }
294
+
295
+ function findScalarValue(map: YAMLMap, key: string): string | undefined {
296
+ const val = findMapValue(map, key);
297
+ if (isScalar(val) && typeof val.value === "string") return val.value;
298
+ return undefined;
299
+ }
300
+
301
+ function rangeOf(node: unknown, yaml: string): [number, number] {
302
+ if (node && typeof node === "object" && "range" in node) {
303
+ const r = (node as { range?: [number, number, number] }).range;
304
+ if (r) return [r[0], Math.min(r[1], yaml.length)];
305
+ }
306
+ return [0, Math.min(yaml.length, 1)];
307
+ }
308
+
309
+ function rangeOfPair(pair: Pair, yaml: string): [number, number] {
310
+ const keyRange = rangeOf(pair.key, yaml);
311
+ const valRange = rangeOf(pair.value, yaml);
312
+ return [keyRange[0], Math.max(valRange[1], keyRange[1])];
313
+ }
314
+
315
+ function diagAtKey(
316
+ map: YAMLMap,
317
+ key: string,
318
+ yaml: string,
319
+ severity: Diagnostic["severity"],
320
+ message: string,
321
+ ): Diagnostic {
322
+ const pair = findPair(map, key);
323
+ if (pair) {
324
+ const range = rangeOfPair(pair, yaml);
325
+ return { from: range[0], to: range[1], severity, message };
326
+ }
327
+ const range = rangeOf(map, yaml);
328
+ return { from: range[0], to: Math.min(range[0] + 1, yaml.length), severity, message };
329
+ }
@@ -0,0 +1,49 @@
1
+ "use client";
2
+
3
+ import { useMemo } from "react";
4
+ import { useWorkflow } from "./useWorkflow";
5
+ import { serializeWorkflowYaml } from "./serialize-workflow-yaml";
6
+
7
+ /** Return value of {@link useWorkflowYaml}. */
8
+ export interface UseWorkflowYamlReturn {
9
+ /** The workflow resource serialized as canonical YAML, or `null` while loading. */
10
+ readonly yaml: string | null;
11
+ /** `true` while the workflow is being fetched. */
12
+ readonly isLoading: boolean;
13
+ /** Error from the last failed request, or `null` when healthy. */
14
+ readonly error: Error | null;
15
+ /** The resource ID (needed for the save/update path). */
16
+ readonly workflowId: string | null;
17
+ /** Discard cached data and re-fetch the workflow from the server. */
18
+ readonly refetch: () => void;
19
+ }
20
+
21
+ /**
22
+ * Data hook that fetches a Workflow and returns its YAML representation.
23
+ *
24
+ * Composes {@link useWorkflow} with {@link serializeWorkflowYaml} to
25
+ * provide a memoized YAML string ready for editor rendering.
26
+ *
27
+ * @param org - Organization slug, or `null` to skip fetching.
28
+ * @param slug - Workflow slug, or `null` to skip fetching.
29
+ *
30
+ * @since T10 (YAML Editor with Graph Preview)
31
+ */
32
+ export function useWorkflowYaml(
33
+ org: string | null,
34
+ slug: string | null,
35
+ ): UseWorkflowYamlReturn {
36
+ const { workflow, isLoading, error, refetch } = useWorkflow(org, slug);
37
+
38
+ const yaml = useMemo<string | null>(() => {
39
+ if (!workflow) return null;
40
+ return serializeWorkflowYaml(workflow);
41
+ }, [workflow]);
42
+
43
+ const workflowId = workflow?.metadata?.id ?? null;
44
+
45
+ return useMemo(
46
+ () => ({ yaml, isLoading, error, workflowId, refetch }),
47
+ [yaml, isLoading, error, workflowId, refetch],
48
+ );
49
+ }