@stigmer/react 0.5.1 → 1.0.0

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,675 @@
1
+ import type { JsonObject } from "@bufbuild/protobuf";
2
+ import type { WorkflowTaskKind } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/enum_pb";
3
+ import type { TopologyNodeCategory } from "./useWorkflowTopology";
4
+ import type {
5
+ WorkflowGraphModel,
6
+ WorkflowGraphNode,
7
+ WorkflowGraphEdge,
8
+ } from "./workflow-graph-model";
9
+ import { START_NODE_ID, END_NODE_ID } from "./workflow-graph-model";
10
+
11
+ // ---------------------------------------------------------------------------
12
+ // GraphCommand interface
13
+ // ---------------------------------------------------------------------------
14
+
15
+ /**
16
+ * A reversible mutation on a {@link WorkflowGraphModel}.
17
+ *
18
+ * Commands are the only way to mutate the graph in canvas mode.
19
+ * Each command knows how to apply itself and how to undo itself,
20
+ * enabling a full undo/redo stack without storing model snapshots.
21
+ */
22
+ export interface GraphCommand {
23
+ readonly type: string;
24
+ readonly description: string;
25
+ apply(model: WorkflowGraphModel): WorkflowGraphModel;
26
+ undo(model: WorkflowGraphModel): WorkflowGraphModel;
27
+ }
28
+
29
+ // ---------------------------------------------------------------------------
30
+ // AddNodeCommand
31
+ // ---------------------------------------------------------------------------
32
+
33
+ export class AddNodeCommand implements GraphCommand {
34
+ readonly type = "add_node";
35
+ readonly description: string;
36
+ private readonly node: WorkflowGraphNode;
37
+ private readonly autoEdge: WorkflowGraphEdge | null;
38
+
39
+ /**
40
+ * @param node The node to add.
41
+ * @param autoEdge Optional edge to create alongside the node
42
+ * (e.g. __start__ -> first task on an empty canvas).
43
+ */
44
+ constructor(node: WorkflowGraphNode, autoEdge: WorkflowGraphEdge | null = null) {
45
+ this.node = node;
46
+ this.autoEdge = autoEdge;
47
+ this.description = `Add task "${node.taskName}"`;
48
+ }
49
+
50
+ apply(model: WorkflowGraphModel): WorkflowGraphModel {
51
+ const nodes = [...model.nodes, this.node];
52
+ const edges = this.autoEdge ? [...model.edges, this.autoEdge] : [...model.edges];
53
+ return { ...model, nodes, edges };
54
+ }
55
+
56
+ undo(model: WorkflowGraphModel): WorkflowGraphModel {
57
+ const nodes = model.nodes.filter((n) => n.id !== this.node.id);
58
+ const edgeIdsToRemove = new Set<string>([
59
+ ...(this.autoEdge ? [this.autoEdge.id] : []),
60
+ ]);
61
+ const edges = edgeIdsToRemove.size > 0
62
+ ? model.edges.filter((e) => !edgeIdsToRemove.has(e.id))
63
+ : [...model.edges];
64
+ return { ...model, nodes, edges };
65
+ }
66
+ }
67
+
68
+ // ---------------------------------------------------------------------------
69
+ // DeleteNodeCommand
70
+ // ---------------------------------------------------------------------------
71
+
72
+ export class DeleteNodeCommand implements GraphCommand {
73
+ readonly type = "delete_node";
74
+ readonly description: string;
75
+ private readonly nodeId: string;
76
+ private removedNode: WorkflowGraphNode | null = null;
77
+ private removedEdges: WorkflowGraphEdge[] = [];
78
+
79
+ constructor(nodeId: string, taskName: string) {
80
+ this.nodeId = nodeId;
81
+ this.description = `Delete task "${taskName}"`;
82
+ }
83
+
84
+ apply(model: WorkflowGraphModel): WorkflowGraphModel {
85
+ this.removedNode = model.nodes.find((n) => n.id === this.nodeId) ?? null;
86
+ this.removedEdges = model.edges.filter(
87
+ (e) => e.source === this.nodeId || e.target === this.nodeId,
88
+ );
89
+
90
+ const nodes = model.nodes.filter((n) => n.id !== this.nodeId);
91
+ const removedEdgeIds = new Set(this.removedEdges.map((e) => e.id));
92
+ const edges = model.edges.filter((e) => !removedEdgeIds.has(e.id));
93
+
94
+ return { ...model, nodes, edges };
95
+ }
96
+
97
+ undo(model: WorkflowGraphModel): WorkflowGraphModel {
98
+ if (!this.removedNode) return model;
99
+ const nodes = [...model.nodes, this.removedNode];
100
+ const edges = [...model.edges, ...this.removedEdges];
101
+ return { ...model, nodes, edges };
102
+ }
103
+ }
104
+
105
+ // ---------------------------------------------------------------------------
106
+ // AddEdgeCommand
107
+ // ---------------------------------------------------------------------------
108
+
109
+ export class AddEdgeCommand implements GraphCommand {
110
+ readonly type = "add_edge";
111
+ readonly description: string;
112
+ private readonly edge: WorkflowGraphEdge;
113
+
114
+ constructor(edge: WorkflowGraphEdge) {
115
+ this.edge = edge;
116
+ this.description = `Connect "${edge.source}" → "${edge.target}"`;
117
+ }
118
+
119
+ apply(model: WorkflowGraphModel): WorkflowGraphModel {
120
+ return { ...model, edges: [...model.edges, this.edge] };
121
+ }
122
+
123
+ undo(model: WorkflowGraphModel): WorkflowGraphModel {
124
+ return { ...model, edges: model.edges.filter((e) => e.id !== this.edge.id) };
125
+ }
126
+ }
127
+
128
+ // ---------------------------------------------------------------------------
129
+ // DeleteEdgeCommand
130
+ // ---------------------------------------------------------------------------
131
+
132
+ export class DeleteEdgeCommand implements GraphCommand {
133
+ readonly type = "delete_edge";
134
+ readonly description: string;
135
+ private readonly edgeId: string;
136
+ private removedEdge: WorkflowGraphEdge | null = null;
137
+
138
+ constructor(edgeId: string) {
139
+ this.edgeId = edgeId;
140
+ this.description = `Delete connection`;
141
+ }
142
+
143
+ apply(model: WorkflowGraphModel): WorkflowGraphModel {
144
+ this.removedEdge = model.edges.find((e) => e.id === this.edgeId) ?? null;
145
+ return { ...model, edges: model.edges.filter((e) => e.id !== this.edgeId) };
146
+ }
147
+
148
+ undo(model: WorkflowGraphModel): WorkflowGraphModel {
149
+ if (!this.removedEdge) return model;
150
+ return { ...model, edges: [...model.edges, this.removedEdge] };
151
+ }
152
+ }
153
+
154
+ // ---------------------------------------------------------------------------
155
+ // MoveNodesCommand
156
+ // ---------------------------------------------------------------------------
157
+
158
+ interface NodePosition {
159
+ readonly id: string;
160
+ readonly x: number;
161
+ readonly y: number;
162
+ }
163
+
164
+ export class MoveNodesCommand implements GraphCommand {
165
+ readonly type = "move_nodes";
166
+ readonly description: string;
167
+ private readonly oldPositions: readonly NodePosition[];
168
+ private readonly newPositions: readonly NodePosition[];
169
+
170
+ constructor(oldPositions: readonly NodePosition[], newPositions: readonly NodePosition[]) {
171
+ this.oldPositions = oldPositions;
172
+ this.newPositions = newPositions;
173
+ this.description = oldPositions.length === 1
174
+ ? `Move task`
175
+ : `Move ${oldPositions.length} tasks`;
176
+ }
177
+
178
+ apply(model: WorkflowGraphModel): WorkflowGraphModel {
179
+ return applyPositions(model, this.newPositions);
180
+ }
181
+
182
+ undo(model: WorkflowGraphModel): WorkflowGraphModel {
183
+ return applyPositions(model, this.oldPositions);
184
+ }
185
+ }
186
+
187
+ function applyPositions(
188
+ model: WorkflowGraphModel,
189
+ positions: readonly NodePosition[],
190
+ ): WorkflowGraphModel {
191
+ const posMap = new Map(positions.map((p) => [p.id, { x: p.x, y: p.y }]));
192
+ const nodes = model.nodes.map((n) => {
193
+ const pos = posMap.get(n.id);
194
+ return pos ? { ...n, position: pos } : n;
195
+ });
196
+ return { ...model, nodes };
197
+ }
198
+
199
+ // ---------------------------------------------------------------------------
200
+ // CompoundCommand
201
+ // ---------------------------------------------------------------------------
202
+
203
+ /**
204
+ * Groups multiple commands into a single undo/redo unit.
205
+ *
206
+ * Applied in order, undone in reverse order.
207
+ */
208
+ export class CompoundCommand implements GraphCommand {
209
+ readonly type = "compound";
210
+ readonly description: string;
211
+ private readonly commands: readonly GraphCommand[];
212
+
213
+ constructor(description: string, commands: readonly GraphCommand[]) {
214
+ this.description = description;
215
+ this.commands = commands;
216
+ }
217
+
218
+ apply(model: WorkflowGraphModel): WorkflowGraphModel {
219
+ let current = model;
220
+ for (const cmd of this.commands) {
221
+ current = cmd.apply(current);
222
+ }
223
+ return current;
224
+ }
225
+
226
+ undo(model: WorkflowGraphModel): WorkflowGraphModel {
227
+ let current = model;
228
+ for (let i = this.commands.length - 1; i >= 0; i--) {
229
+ current = this.commands[i].undo(current);
230
+ }
231
+ return current;
232
+ }
233
+ }
234
+
235
+ // ---------------------------------------------------------------------------
236
+ // UpdateNodeFieldCommand
237
+ // ---------------------------------------------------------------------------
238
+
239
+ /**
240
+ * Updates a single field path within a node's `config` object.
241
+ *
242
+ * Stores the previous value at that path for precise undo.
243
+ * Supports dot-separated paths for nested fields (e.g., "response_schema.type").
244
+ */
245
+ export class UpdateNodeFieldCommand implements GraphCommand {
246
+ readonly type = "update_node_field";
247
+ readonly description: string;
248
+ private readonly nodeId: string;
249
+ private readonly fieldPath: string;
250
+ private readonly newValue: unknown;
251
+ private oldValue: unknown = undefined;
252
+
253
+ constructor(nodeId: string, fieldPath: string, newValue: unknown, taskName: string) {
254
+ this.nodeId = nodeId;
255
+ this.fieldPath = fieldPath;
256
+ this.newValue = newValue;
257
+ this.description = `Update "${taskName}" field "${fieldPath}"`;
258
+ }
259
+
260
+ apply(model: WorkflowGraphModel): WorkflowGraphModel {
261
+ const node = model.nodes.find((n) => n.id === this.nodeId);
262
+ if (!node) return model;
263
+
264
+ this.oldValue = getNestedValue(node.config as Record<string, unknown>, this.fieldPath);
265
+ const newConfig = setNestedValue(
266
+ node.config as Record<string, unknown>,
267
+ this.fieldPath,
268
+ this.newValue,
269
+ ) as JsonObject;
270
+
271
+ const nodes = model.nodes.map((n) =>
272
+ n.id === this.nodeId ? { ...n, config: newConfig } : n,
273
+ );
274
+ return { ...model, nodes };
275
+ }
276
+
277
+ undo(model: WorkflowGraphModel): WorkflowGraphModel {
278
+ const node = model.nodes.find((n) => n.id === this.nodeId);
279
+ if (!node) return model;
280
+
281
+ const restoredConfig = this.oldValue === undefined
282
+ ? deleteNestedValue(node.config as Record<string, unknown>, this.fieldPath) as JsonObject
283
+ : setNestedValue(node.config as Record<string, unknown>, this.fieldPath, this.oldValue) as JsonObject;
284
+
285
+ const nodes = model.nodes.map((n) =>
286
+ n.id === this.nodeId ? { ...n, config: restoredConfig } : n,
287
+ );
288
+ return { ...model, nodes };
289
+ }
290
+ }
291
+
292
+ // ---------------------------------------------------------------------------
293
+ // RenameNodeCommand
294
+ // ---------------------------------------------------------------------------
295
+
296
+ /**
297
+ * Renames a task node, updating its `id`, `taskName`, and all references
298
+ * in edges (source/target) and other nodes' `flow.then` values.
299
+ *
300
+ * Atomic: undo restores all references to the old name.
301
+ */
302
+ export class RenameNodeCommand implements GraphCommand {
303
+ readonly type = "rename_node";
304
+ readonly description: string;
305
+ private readonly oldName: string;
306
+ private readonly newName: string;
307
+
308
+ constructor(oldName: string, newName: string) {
309
+ this.oldName = oldName;
310
+ this.newName = newName;
311
+ this.description = `Rename "${oldName}" to "${newName}"`;
312
+ }
313
+
314
+ apply(model: WorkflowGraphModel): WorkflowGraphModel {
315
+ return this.rename(model, this.oldName, this.newName);
316
+ }
317
+
318
+ undo(model: WorkflowGraphModel): WorkflowGraphModel {
319
+ return this.rename(model, this.newName, this.oldName);
320
+ }
321
+
322
+ private rename(model: WorkflowGraphModel, from: string, to: string): WorkflowGraphModel {
323
+ const nodes = model.nodes.map((n) => {
324
+ if (n.id === from) {
325
+ return { ...n, id: to, taskName: to };
326
+ }
327
+ if (n.flow?.then === from) {
328
+ return { ...n, flow: { then: to } };
329
+ }
330
+ return n;
331
+ });
332
+
333
+ const edges = model.edges.map((e) => {
334
+ const sourceMatch = e.source === from;
335
+ const targetMatch = e.target === from;
336
+ if (!sourceMatch && !targetMatch) return e;
337
+ return {
338
+ ...e,
339
+ ...(sourceMatch && { source: to }),
340
+ ...(targetMatch && { target: to }),
341
+ };
342
+ });
343
+
344
+ return { ...model, nodes, edges };
345
+ }
346
+ }
347
+
348
+ // ---------------------------------------------------------------------------
349
+ // UpdateNodeMetaCommand
350
+ // ---------------------------------------------------------------------------
351
+
352
+ /** Which meta property is being updated. */
353
+ export type NodeMetaField = "export" | "flow";
354
+
355
+ /**
356
+ * Updates non-config node properties: `export.as` or `flow.then`.
357
+ *
358
+ * Lightweight command for small property mutations that don't touch
359
+ * the task_config object.
360
+ */
361
+ export class UpdateNodeMetaCommand implements GraphCommand {
362
+ readonly type = "update_node_meta";
363
+ readonly description: string;
364
+ private readonly nodeId: string;
365
+ private readonly field: NodeMetaField;
366
+ private readonly newValue: string | undefined;
367
+ private oldValue: string | undefined = undefined;
368
+
369
+ constructor(nodeId: string, field: NodeMetaField, newValue: string | undefined, taskName: string) {
370
+ this.nodeId = nodeId;
371
+ this.field = field;
372
+ this.newValue = newValue;
373
+ this.description = `Update "${taskName}" ${field}`;
374
+ }
375
+
376
+ apply(model: WorkflowGraphModel): WorkflowGraphModel {
377
+ const node = model.nodes.find((n) => n.id === this.nodeId);
378
+ if (!node) return model;
379
+
380
+ if (this.field === "export") {
381
+ this.oldValue = node.export?.as;
382
+ const exportVal = this.newValue ? { as: this.newValue } : undefined;
383
+ const nodes = model.nodes.map((n) =>
384
+ n.id === this.nodeId ? { ...n, export: exportVal } : n,
385
+ );
386
+ return { ...model, nodes };
387
+ }
388
+
389
+ // field === "flow"
390
+ this.oldValue = node.flow?.then;
391
+ const flowVal = this.newValue ? { then: this.newValue } : undefined;
392
+ const nodes = model.nodes.map((n) =>
393
+ n.id === this.nodeId ? { ...n, flow: flowVal } : n,
394
+ );
395
+ return { ...model, nodes };
396
+ }
397
+
398
+ undo(model: WorkflowGraphModel): WorkflowGraphModel {
399
+ const node = model.nodes.find((n) => n.id === this.nodeId);
400
+ if (!node) return model;
401
+
402
+ if (this.field === "export") {
403
+ const exportVal = this.oldValue ? { as: this.oldValue } : undefined;
404
+ const nodes = model.nodes.map((n) =>
405
+ n.id === this.nodeId ? { ...n, export: exportVal } : n,
406
+ );
407
+ return { ...model, nodes };
408
+ }
409
+
410
+ // field === "flow"
411
+ const flowVal = this.oldValue ? { then: this.oldValue } : undefined;
412
+ const nodes = model.nodes.map((n) =>
413
+ n.id === this.nodeId ? { ...n, flow: flowVal } : n,
414
+ );
415
+ return { ...model, nodes };
416
+ }
417
+ }
418
+
419
+ // ---------------------------------------------------------------------------
420
+ // MigrateBranchHandleCommand
421
+ // ---------------------------------------------------------------------------
422
+
423
+ /**
424
+ * Updates the `sourceHandle` of all edges from a node's old handle ID
425
+ * to a new handle ID. Used when a switch_case case or human_input outcome
426
+ * is renamed (AD-T15-B4: name-based handle IDs).
427
+ */
428
+ export class MigrateBranchHandleCommand implements GraphCommand {
429
+ readonly type = "migrate_branch_handle";
430
+ readonly description: string;
431
+ private readonly nodeId: string;
432
+ private readonly oldHandleId: string;
433
+ private readonly newHandleId: string;
434
+
435
+ constructor(nodeId: string, oldHandleId: string, newHandleId: string) {
436
+ this.nodeId = nodeId;
437
+ this.oldHandleId = oldHandleId;
438
+ this.newHandleId = newHandleId;
439
+ this.description = `Rename handle "${oldHandleId}" to "${newHandleId}"`;
440
+ }
441
+
442
+ apply(model: WorkflowGraphModel): WorkflowGraphModel {
443
+ return this.migrate(model, this.oldHandleId, this.newHandleId);
444
+ }
445
+
446
+ undo(model: WorkflowGraphModel): WorkflowGraphModel {
447
+ return this.migrate(model, this.newHandleId, this.oldHandleId);
448
+ }
449
+
450
+ private migrate(
451
+ model: WorkflowGraphModel,
452
+ from: string,
453
+ to: string,
454
+ ): WorkflowGraphModel {
455
+ const edges = model.edges.map((e) =>
456
+ e.source === this.nodeId && e.sourceHandle === from
457
+ ? { ...e, sourceHandle: to, label: to.includes("_") ? to.split("_").slice(1).join("_") : e.label }
458
+ : e,
459
+ );
460
+ return { ...model, edges };
461
+ }
462
+ }
463
+
464
+ // ---------------------------------------------------------------------------
465
+ // DuplicateNodeCommand
466
+ // ---------------------------------------------------------------------------
467
+
468
+ const DUPLICATE_OFFSET = { x: 30, y: 30 };
469
+
470
+ /**
471
+ * Duplicates a task node with a new unique name and offset position.
472
+ *
473
+ * Deep-clones the source node's config. Does not duplicate edges — the user
474
+ * connects the duplicate manually. This matches the behavior of n8n and
475
+ * Retool canvas editors where duplicating edges would create ambiguous topology.
476
+ */
477
+ export class DuplicateNodeCommand implements GraphCommand {
478
+ readonly type = "duplicate_node";
479
+ readonly description: string;
480
+ private readonly sourceNodeId: string;
481
+ readonly newTaskName: string;
482
+
483
+ constructor(sourceNodeId: string, newTaskName: string) {
484
+ this.sourceNodeId = sourceNodeId;
485
+ this.newTaskName = newTaskName;
486
+ this.description = `Duplicate task "${sourceNodeId}" as "${newTaskName}"`;
487
+ }
488
+
489
+ apply(model: WorkflowGraphModel): WorkflowGraphModel {
490
+ const source = model.nodes.find((n) => n.id === this.sourceNodeId);
491
+ if (!source) return model;
492
+
493
+ const clone: WorkflowGraphNode = {
494
+ ...source,
495
+ id: this.newTaskName,
496
+ taskName: this.newTaskName,
497
+ config: structuredClone(source.config),
498
+ position: {
499
+ x: source.position.x + DUPLICATE_OFFSET.x,
500
+ y: source.position.y + DUPLICATE_OFFSET.y,
501
+ },
502
+ export: undefined,
503
+ flow: undefined,
504
+ };
505
+
506
+ return { ...model, nodes: [...model.nodes, clone] };
507
+ }
508
+
509
+ undo(model: WorkflowGraphModel): WorkflowGraphModel {
510
+ return {
511
+ ...model,
512
+ nodes: model.nodes.filter((n) => n.id !== this.newTaskName),
513
+ };
514
+ }
515
+ }
516
+
517
+ // ---------------------------------------------------------------------------
518
+ // Nested value utilities for UpdateNodeFieldCommand
519
+ // ---------------------------------------------------------------------------
520
+
521
+ function getNestedValue(obj: Record<string, unknown>, path: string): unknown {
522
+ const keys = path.split(".");
523
+ let current: unknown = obj;
524
+ for (const key of keys) {
525
+ if (current == null || typeof current !== "object") return undefined;
526
+ current = (current as Record<string, unknown>)[key];
527
+ }
528
+ return current;
529
+ }
530
+
531
+ function setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): Record<string, unknown> {
532
+ const keys = path.split(".");
533
+ if (keys.length === 1) {
534
+ return { ...obj, [keys[0]]: value };
535
+ }
536
+ const [head, ...rest] = keys;
537
+ const child = (obj[head] != null && typeof obj[head] === "object")
538
+ ? obj[head] as Record<string, unknown>
539
+ : {};
540
+ return { ...obj, [head]: setNestedValue(child, rest.join("."), value) };
541
+ }
542
+
543
+ function deleteNestedValue(obj: Record<string, unknown>, path: string): Record<string, unknown> {
544
+ const keys = path.split(".");
545
+ if (keys.length === 1) {
546
+ const { [keys[0]]: _, ...rest } = obj;
547
+ return rest;
548
+ }
549
+ const [head, ...restKeys] = keys;
550
+ const child = (obj[head] != null && typeof obj[head] === "object")
551
+ ? obj[head] as Record<string, unknown>
552
+ : {};
553
+ return { ...obj, [head]: deleteNestedValue(child, restKeys.join(".")) };
554
+ }
555
+
556
+ // ---------------------------------------------------------------------------
557
+ // GraphHistory
558
+ // ---------------------------------------------------------------------------
559
+
560
+ const MAX_HISTORY_SIZE = 50;
561
+
562
+ /**
563
+ * Manages a stack of {@link GraphCommand}s over a {@link WorkflowGraphModel},
564
+ * supporting undo and redo with a bounded history.
565
+ *
566
+ * Pure TypeScript — no React dependencies.
567
+ */
568
+ export class GraphHistory {
569
+ private model: WorkflowGraphModel;
570
+ private undoStack: GraphCommand[] = [];
571
+ private redoStack: GraphCommand[] = [];
572
+
573
+ constructor(initialModel: WorkflowGraphModel) {
574
+ this.model = initialModel;
575
+ }
576
+
577
+ get current(): WorkflowGraphModel {
578
+ return this.model;
579
+ }
580
+
581
+ get canUndo(): boolean {
582
+ return this.undoStack.length > 0;
583
+ }
584
+
585
+ get canRedo(): boolean {
586
+ return this.redoStack.length > 0;
587
+ }
588
+
589
+ dispatch(command: GraphCommand): WorkflowGraphModel {
590
+ this.model = command.apply(this.model);
591
+ this.undoStack.push(command);
592
+ if (this.undoStack.length > MAX_HISTORY_SIZE) {
593
+ this.undoStack.shift();
594
+ }
595
+ this.redoStack = [];
596
+ return this.model;
597
+ }
598
+
599
+ undo(): WorkflowGraphModel {
600
+ const command = this.undoStack.pop();
601
+ if (!command) return this.model;
602
+ this.model = command.undo(this.model);
603
+ this.redoStack.push(command);
604
+ return this.model;
605
+ }
606
+
607
+ redo(): WorkflowGraphModel {
608
+ const command = this.redoStack.pop();
609
+ if (!command) return this.model;
610
+ this.model = command.apply(this.model);
611
+ this.undoStack.push(command);
612
+ return this.model;
613
+ }
614
+
615
+ reset(model: WorkflowGraphModel): void {
616
+ this.model = model;
617
+ this.undoStack = [];
618
+ this.redoStack = [];
619
+ }
620
+ }
621
+
622
+ // ---------------------------------------------------------------------------
623
+ // Factory helpers
624
+ // ---------------------------------------------------------------------------
625
+
626
+ let edgeIdCounter = 0;
627
+
628
+ /** Generates a unique edge ID for new canvas edges. */
629
+ export function generateEdgeId(): string {
630
+ return `e_canvas_${Date.now()}_${edgeIdCounter++}`;
631
+ }
632
+
633
+ /**
634
+ * Generates a unique task name for a newly dropped task kind.
635
+ *
636
+ * Strategy: `{kind}_{N}` where N is the lowest positive integer
637
+ * that avoids collision with existing task names.
638
+ */
639
+ export function generateTaskName(
640
+ kindString: string,
641
+ existingNames: ReadonlySet<string>,
642
+ ): string {
643
+ let n = 1;
644
+ while (existingNames.has(`${kindString}_${n}`)) {
645
+ n++;
646
+ }
647
+ return `${kindString}_${n}`;
648
+ }
649
+
650
+ /**
651
+ * Creates a {@link WorkflowGraphNode} for a newly dropped task.
652
+ */
653
+ export function createTaskNode(
654
+ taskName: string,
655
+ kind: WorkflowTaskKind,
656
+ kindString: string,
657
+ category: TopologyNodeCategory,
658
+ position: { x: number; y: number },
659
+ ): WorkflowGraphNode {
660
+ return {
661
+ id: taskName,
662
+ taskName,
663
+ kind,
664
+ category,
665
+ config: {} as JsonObject,
666
+ position,
667
+ };
668
+ }
669
+
670
+ /**
671
+ * Returns the set of node IDs that are sentinel (non-deletable) nodes.
672
+ */
673
+ export function isSentinelNode(nodeId: string): boolean {
674
+ return nodeId === START_NODE_ID || nodeId === END_NODE_ID;
675
+ }