@stigmer/react 0.5.0 → 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 (691) 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/ContextChip.d.ts +7 -2
  28. package/composer/ContextChip.d.ts.map +1 -1
  29. package/composer/ContextChip.js +2 -1
  30. package/composer/ContextChip.js.map +1 -1
  31. package/composer/InteractionModePicker.d.ts +40 -0
  32. package/composer/InteractionModePicker.d.ts.map +1 -0
  33. package/composer/InteractionModePicker.js +76 -0
  34. package/composer/InteractionModePicker.js.map +1 -0
  35. package/composer/SessionComposer.d.ts +64 -64
  36. package/composer/SessionComposer.d.ts.map +1 -1
  37. package/composer/SessionComposer.js +52 -11
  38. package/composer/SessionComposer.js.map +1 -1
  39. package/composer/__tests__/SessionComposer-memo.test.js +10 -5
  40. package/composer/__tests__/SessionComposer-memo.test.js.map +1 -1
  41. package/composer/index.d.ts +3 -1
  42. package/composer/index.d.ts.map +1 -1
  43. package/composer/index.js +1 -0
  44. package/composer/index.js.map +1 -1
  45. package/dashboard/DashboardFailedRuns.d.ts +19 -0
  46. package/dashboard/DashboardFailedRuns.d.ts.map +1 -0
  47. package/dashboard/DashboardFailedRuns.js +35 -0
  48. package/dashboard/DashboardFailedRuns.js.map +1 -0
  49. package/dashboard/DashboardKPICards.d.ts +19 -0
  50. package/dashboard/DashboardKPICards.d.ts.map +1 -0
  51. package/dashboard/DashboardKPICards.js +80 -0
  52. package/dashboard/DashboardKPICards.js.map +1 -0
  53. package/dashboard/OperationalDashboard.d.ts +37 -0
  54. package/dashboard/OperationalDashboard.d.ts.map +1 -0
  55. package/dashboard/OperationalDashboard.js +48 -0
  56. package/dashboard/OperationalDashboard.js.map +1 -0
  57. package/dashboard/index.d.ts +8 -0
  58. package/dashboard/index.d.ts.map +1 -0
  59. package/dashboard/index.js +9 -0
  60. package/dashboard/index.js.map +1 -0
  61. package/dashboard/types.d.ts +49 -0
  62. package/dashboard/types.d.ts.map +1 -0
  63. package/dashboard/types.js +2 -0
  64. package/dashboard/types.js.map +1 -0
  65. package/dashboard/useAgentExecutionSummary.d.ts +33 -0
  66. package/dashboard/useAgentExecutionSummary.d.ts.map +1 -0
  67. package/dashboard/useAgentExecutionSummary.js +32 -0
  68. package/dashboard/useAgentExecutionSummary.js.map +1 -0
  69. package/dashboard/useDashboardFailedRuns.d.ts +18 -0
  70. package/dashboard/useDashboardFailedRuns.d.ts.map +1 -0
  71. package/dashboard/useDashboardFailedRuns.js +86 -0
  72. package/dashboard/useDashboardFailedRuns.js.map +1 -0
  73. package/dashboard/useDashboardSummary.d.ts +32 -0
  74. package/dashboard/useDashboardSummary.d.ts.map +1 -0
  75. package/dashboard/useDashboardSummary.js +67 -0
  76. package/dashboard/useDashboardSummary.js.map +1 -0
  77. package/environment/usePersonalEnvironment.d.ts.map +1 -1
  78. package/environment/usePersonalEnvironment.js +1 -0
  79. package/environment/usePersonalEnvironment.js.map +1 -1
  80. package/execution/ContextGauge.d.ts +45 -0
  81. package/execution/ContextGauge.d.ts.map +1 -0
  82. package/execution/ContextGauge.js +82 -0
  83. package/execution/ContextGauge.js.map +1 -0
  84. package/execution/InteractionModeBadge.d.ts +24 -0
  85. package/execution/InteractionModeBadge.d.ts.map +1 -0
  86. package/execution/InteractionModeBadge.js +29 -0
  87. package/execution/InteractionModeBadge.js.map +1 -0
  88. package/execution/MessageThread.d.ts +33 -3
  89. package/execution/MessageThread.d.ts.map +1 -1
  90. package/execution/MessageThread.js +51 -9
  91. package/execution/MessageThread.js.map +1 -1
  92. package/execution/PlanCompletionCard.d.ts +23 -0
  93. package/execution/PlanCompletionCard.d.ts.map +1 -0
  94. package/execution/PlanCompletionCard.js +28 -0
  95. package/execution/PlanCompletionCard.js.map +1 -0
  96. package/execution/SummarizationBadge.d.ts +30 -0
  97. package/execution/SummarizationBadge.d.ts.map +1 -0
  98. package/execution/SummarizationBadge.js +61 -0
  99. package/execution/SummarizationBadge.js.map +1 -0
  100. package/execution/SummarizationCard.d.ts +27 -0
  101. package/execution/SummarizationCard.d.ts.map +1 -0
  102. package/execution/SummarizationCard.js +47 -0
  103. package/execution/SummarizationCard.js.map +1 -0
  104. package/execution/__tests__/PlanCompletionCard.test.d.ts +2 -0
  105. package/execution/__tests__/PlanCompletionCard.test.d.ts.map +1 -0
  106. package/execution/__tests__/PlanCompletionCard.test.js +53 -0
  107. package/execution/__tests__/PlanCompletionCard.test.js.map +1 -0
  108. package/execution/__tests__/buildThreadItems-plan-completion.test.d.ts +2 -0
  109. package/execution/__tests__/buildThreadItems-plan-completion.test.d.ts.map +1 -0
  110. package/execution/__tests__/buildThreadItems-plan-completion.test.js +137 -0
  111. package/execution/__tests__/buildThreadItems-plan-completion.test.js.map +1 -0
  112. package/execution/__tests__/useContextWindow.test.d.ts +2 -0
  113. package/execution/__tests__/useContextWindow.test.d.ts.map +1 -0
  114. package/execution/__tests__/useContextWindow.test.js +121 -0
  115. package/execution/__tests__/useContextWindow.test.js.map +1 -0
  116. package/execution/index.d.ts +12 -0
  117. package/execution/index.d.ts.map +1 -1
  118. package/execution/index.js +6 -0
  119. package/execution/index.js.map +1 -1
  120. package/execution/useContextWindow.d.ts +71 -0
  121. package/execution/useContextWindow.d.ts.map +1 -0
  122. package/execution/useContextWindow.js +91 -0
  123. package/execution/useContextWindow.js.map +1 -0
  124. package/execution/useCreateAgentExecution.d.ts +9 -0
  125. package/execution/useCreateAgentExecution.d.ts.map +1 -1
  126. package/execution/useCreateAgentExecution.js +15 -3
  127. package/execution/useCreateAgentExecution.js.map +1 -1
  128. package/index.d.ts +11 -6
  129. package/index.d.ts.map +1 -1
  130. package/index.js +13 -3
  131. package/index.js.map +1 -1
  132. package/inline-edit/InlineEditKeyValue.d.ts +5 -1
  133. package/inline-edit/InlineEditKeyValue.d.ts.map +1 -1
  134. package/inline-edit/InlineEditKeyValue.js +3 -3
  135. package/inline-edit/InlineEditKeyValue.js.map +1 -1
  136. package/internal/VirtualizedThread.d.ts +2 -1
  137. package/internal/VirtualizedThread.d.ts.map +1 -1
  138. package/internal/VirtualizedThread.js +3 -2
  139. package/internal/VirtualizedThread.js.map +1 -1
  140. package/internal/store/index.d.ts +1 -0
  141. package/internal/store/index.d.ts.map +1 -1
  142. package/internal/store/index.js +1 -0
  143. package/internal/store/index.js.map +1 -1
  144. package/internal/store/workflow-execution-event-store.d.ts +92 -0
  145. package/internal/store/workflow-execution-event-store.d.ts.map +1 -0
  146. package/internal/store/workflow-execution-event-store.js +298 -0
  147. package/internal/store/workflow-execution-event-store.js.map +1 -0
  148. package/internal/useFetch.js +2 -2
  149. package/internal/useFetch.js.map +1 -1
  150. package/library/ScopeToggle.d.ts +13 -9
  151. package/library/ScopeToggle.d.ts.map +1 -1
  152. package/library/ScopeToggle.js +43 -22
  153. package/library/ScopeToggle.js.map +1 -1
  154. package/library/VisibilityToggle.js +14 -5
  155. package/library/VisibilityToggle.js.map +1 -1
  156. package/library/index.d.ts +1 -0
  157. package/library/index.d.ts.map +1 -1
  158. package/library/index.js +1 -0
  159. package/library/index.js.map +1 -1
  160. package/library/useExportResource.d.ts +3 -2
  161. package/library/useExportResource.d.ts.map +1 -1
  162. package/library/useExportResource.js +11 -6
  163. package/library/useExportResource.js.map +1 -1
  164. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  165. package/mcp-server/McpServerDetailView.js +169 -58
  166. package/mcp-server/McpServerDetailView.js.map +1 -1
  167. package/mcp-server/McpServerPicker.d.ts.map +1 -1
  168. package/mcp-server/McpServerPicker.js +4 -2
  169. package/mcp-server/McpServerPicker.js.map +1 -1
  170. package/models/ModelRegistryContext.d.ts +2 -0
  171. package/models/ModelRegistryContext.d.ts.map +1 -1
  172. package/models/ModelRegistryContext.js +1 -0
  173. package/models/ModelRegistryContext.js.map +1 -1
  174. package/models/ModelSelector.d.ts.map +1 -1
  175. package/models/ModelSelector.js +2 -2
  176. package/models/ModelSelector.js.map +1 -1
  177. package/models/__tests__/useModelRegistry.test.js +4 -3
  178. package/models/__tests__/useModelRegistry.test.js.map +1 -1
  179. package/models/useModelRegistry.d.ts +2 -0
  180. package/models/useModelRegistry.d.ts.map +1 -1
  181. package/models/useModelRegistry.js +3 -2
  182. package/models/useModelRegistry.js.map +1 -1
  183. package/package.json +16 -5
  184. package/provider.d.ts.map +1 -1
  185. package/provider.js +232 -22
  186. package/provider.js.map +1 -1
  187. package/resource-detail/ResourceDetailShell.d.ts +1 -1
  188. package/resource-detail/ResourceDetailShell.d.ts.map +1 -1
  189. package/resource-detail/ResourceDetailShell.js +6 -6
  190. package/resource-detail/ResourceDetailShell.js.map +1 -1
  191. package/resource-detail/types.d.ts +23 -0
  192. package/resource-detail/types.d.ts.map +1 -1
  193. package/resource-detail/useDeleteResource.d.ts +1 -1
  194. package/resource-detail/useDeleteResource.d.ts.map +1 -1
  195. package/resource-detail/useDeleteResource.js +5 -0
  196. package/resource-detail/useDeleteResource.js.map +1 -1
  197. package/resource-workbench/components/ResourceWorkbench.d.ts.map +1 -1
  198. package/resource-workbench/components/ResourceWorkbench.js +2 -1
  199. package/resource-workbench/components/ResourceWorkbench.js.map +1 -1
  200. package/session/__tests__/session-spec-converters.test.d.ts +2 -0
  201. package/session/__tests__/session-spec-converters.test.d.ts.map +1 -0
  202. package/session/__tests__/session-spec-converters.test.js +162 -0
  203. package/session/__tests__/session-spec-converters.test.js.map +1 -0
  204. package/session/__tests__/useNewSessionFlow.test.js +2 -2
  205. package/session/__tests__/useNewSessionFlow.test.js.map +1 -1
  206. package/session/__tests__/usePersistedModel.test.js +1 -1
  207. package/session/__tests__/usePersistedModel.test.js.map +1 -1
  208. package/session/group-sessions.d.ts +17 -0
  209. package/session/group-sessions.d.ts.map +1 -1
  210. package/session/group-sessions.js +46 -0
  211. package/session/group-sessions.js.map +1 -1
  212. package/session/index.d.ts +4 -2
  213. package/session/index.d.ts.map +1 -1
  214. package/session/index.js +2 -1
  215. package/session/index.js.map +1 -1
  216. package/session/session-spec-converters.d.ts +24 -0
  217. package/session/session-spec-converters.d.ts.map +1 -0
  218. package/session/session-spec-converters.js +72 -0
  219. package/session/session-spec-converters.js.map +1 -0
  220. package/session/useNewSessionFlow.d.ts.map +1 -1
  221. package/session/useNewSessionFlow.js +1 -0
  222. package/session/useNewSessionFlow.js.map +1 -1
  223. package/session/useSessionConversation.d.ts +7 -0
  224. package/session/useSessionConversation.d.ts.map +1 -1
  225. package/session/useSessionConversation.js +2 -56
  226. package/session/useSessionConversation.js.map +1 -1
  227. package/session/useSessionPageFlow.d.ts +5 -0
  228. package/session/useSessionPageFlow.d.ts.map +1 -1
  229. package/session/useSessionPageFlow.js +21 -6
  230. package/session/useSessionPageFlow.js.map +1 -1
  231. package/session/useSessionSearch.d.ts +57 -0
  232. package/session/useSessionSearch.d.ts.map +1 -0
  233. package/session/useSessionSearch.js +94 -0
  234. package/session/useSessionSearch.js.map +1 -0
  235. package/session/useSessionUsage.d.ts.map +1 -1
  236. package/session/useSessionUsage.js +65 -4
  237. package/session/useSessionUsage.js.map +1 -1
  238. package/settings/UsageSection.d.ts.map +1 -1
  239. package/settings/UsageSection.js +1 -4
  240. package/settings/UsageSection.js.map +1 -1
  241. package/skill/SkillPicker.d.ts.map +1 -1
  242. package/skill/SkillPicker.js +4 -2
  243. package/skill/SkillPicker.js.map +1 -1
  244. package/src/activity/group-activity.ts +65 -0
  245. package/src/activity/index.ts +13 -0
  246. package/src/activity/types.ts +35 -0
  247. package/src/activity/useRecentActivity.ts +131 -0
  248. package/src/agent/AgentPicker.tsx +6 -1
  249. package/src/billing/BillingSection.tsx +3 -2
  250. package/src/composer/ComposerToolbar.tsx +19 -1
  251. package/src/composer/ContextChip.tsx +20 -11
  252. package/src/composer/InteractionModePicker.tsx +189 -0
  253. package/src/composer/SessionComposer.tsx +137 -11
  254. package/src/composer/__tests__/SessionComposer-memo.test.ts +11 -6
  255. package/src/composer/index.ts +7 -0
  256. package/src/dashboard/DashboardFailedRuns.tsx +109 -0
  257. package/src/dashboard/DashboardKPICards.tsx +128 -0
  258. package/src/dashboard/OperationalDashboard.tsx +96 -0
  259. package/src/dashboard/index.ts +37 -0
  260. package/src/dashboard/types.ts +50 -0
  261. package/src/dashboard/useAgentExecutionSummary.ts +71 -0
  262. package/src/dashboard/useDashboardFailedRuns.ts +122 -0
  263. package/src/dashboard/useDashboardSummary.ts +109 -0
  264. package/src/environment/usePersonalEnvironment.ts +1 -0
  265. package/src/execution/ContextGauge.tsx +243 -0
  266. package/src/execution/InteractionModeBadge.tsx +70 -0
  267. package/src/execution/MessageThread.tsx +88 -3
  268. package/src/execution/PlanCompletionCard.tsx +105 -0
  269. package/src/execution/SummarizationBadge.tsx +188 -0
  270. package/src/execution/SummarizationCard.tsx +126 -0
  271. package/src/execution/__tests__/PlanCompletionCard.test.tsx +67 -0
  272. package/src/execution/__tests__/buildThreadItems-plan-completion.test.ts +197 -0
  273. package/src/execution/__tests__/useContextWindow.test.ts +167 -0
  274. package/src/execution/index.ts +22 -0
  275. package/src/execution/useContextWindow.ts +148 -0
  276. package/src/execution/useCreateAgentExecution.ts +26 -3
  277. package/src/index.ts +227 -0
  278. package/src/inline-edit/InlineEditKeyValue.tsx +23 -0
  279. package/src/internal/VirtualizedThread.tsx +4 -1
  280. package/src/internal/store/index.ts +6 -0
  281. package/src/internal/store/workflow-execution-event-store.ts +391 -0
  282. package/src/internal/useFetch.ts +2 -2
  283. package/src/library/ScopeToggle.tsx +88 -20
  284. package/src/library/VisibilityToggle.tsx +54 -13
  285. package/src/library/index.ts +2 -0
  286. package/src/library/useExportResource.ts +12 -9
  287. package/src/mcp-server/McpServerDetailView.tsx +509 -203
  288. package/src/mcp-server/McpServerPicker.tsx +6 -1
  289. package/src/models/ModelRegistryContext.ts +3 -0
  290. package/src/models/ModelSelector.tsx +25 -2
  291. package/src/models/__tests__/useModelRegistry.test.tsx +5 -3
  292. package/src/models/useModelRegistry.ts +5 -2
  293. package/src/provider.tsx +264 -26
  294. package/src/resource-detail/ResourceDetailShell.tsx +21 -4
  295. package/src/resource-detail/types.ts +25 -0
  296. package/src/resource-detail/useDeleteResource.ts +6 -1
  297. package/src/resource-workbench/components/ResourceWorkbench.tsx +4 -0
  298. package/src/session/__tests__/session-spec-converters.test.ts +185 -0
  299. package/src/session/__tests__/useNewSessionFlow.test.tsx +2 -2
  300. package/src/session/__tests__/usePersistedModel.test.tsx +1 -1
  301. package/src/session/group-sessions.ts +65 -0
  302. package/src/session/index.ts +8 -2
  303. package/src/session/session-spec-converters.ts +86 -0
  304. package/src/session/useNewSessionFlow.ts +1 -0
  305. package/src/session/useSessionConversation.ts +13 -64
  306. package/src/session/useSessionPageFlow.ts +29 -7
  307. package/src/session/useSessionSearch.ts +149 -0
  308. package/src/session/useSessionUsage.ts +72 -4
  309. package/src/settings/UsageSection.tsx +1 -9
  310. package/src/skill/SkillPicker.tsx +6 -1
  311. package/src/workflow/ApprovalFormBuilder.tsx +1017 -0
  312. package/src/workflow/BranchConditionBuilder.tsx +451 -0
  313. package/src/workflow/CanvasActionsContext.ts +12 -0
  314. package/src/workflow/CanvasContextMenu.tsx +364 -0
  315. package/src/workflow/CanvasTaskNode.tsx +372 -0
  316. package/src/workflow/CanvasTransitionEdge.tsx +122 -0
  317. package/src/workflow/CostByWorkflowChart.tsx +120 -0
  318. package/src/workflow/ExecutionSummaryWidget.tsx +194 -0
  319. package/src/workflow/ExecutionTrendChart.tsx +157 -0
  320. package/src/workflow/FailedRunsWidget.tsx +109 -0
  321. package/src/workflow/PendingApprovalsWidget.tsx +115 -0
  322. package/src/workflow/TaskConfigForm.tsx +618 -0
  323. package/src/workflow/TaskKindRegistryContext.ts +36 -0
  324. package/src/workflow/TaskPickerPopover.tsx +326 -0
  325. package/src/workflow/WorkflowArchitectDialog.tsx +505 -0
  326. package/src/workflow/WorkflowCanvasEditor.tsx +651 -0
  327. package/src/workflow/WorkflowCanvasInner.tsx +160 -0
  328. package/src/workflow/WorkflowDashboard.tsx +124 -0
  329. package/src/workflow/WorkflowDetailView.tsx +527 -0
  330. package/src/workflow/WorkflowEditorView.tsx +547 -0
  331. package/src/workflow/WorkflowExecutionApprovalCard.tsx +129 -0
  332. package/src/workflow/WorkflowExecutionArtifactPanel.tsx +112 -0
  333. package/src/workflow/WorkflowExecutionCostPanel.tsx +131 -0
  334. package/src/workflow/WorkflowExecutionHeader.tsx +194 -0
  335. package/src/workflow/WorkflowExecutionPhaseBadge.tsx +188 -0
  336. package/src/workflow/WorkflowExecutionTaskPanel.tsx +135 -0
  337. package/src/workflow/WorkflowExecutionTimeline.tsx +118 -0
  338. package/src/workflow/WorkflowExecutionTimelineEvent.tsx +488 -0
  339. package/src/workflow/WorkflowExecutionViewer.tsx +248 -0
  340. package/src/workflow/WorkflowInspectorPanel.tsx +568 -0
  341. package/src/workflow/WorkflowRefinePanel.tsx +411 -0
  342. package/src/workflow/WorkflowRepairCard.tsx +433 -0
  343. package/src/workflow/WorkflowRunDialog.tsx +220 -0
  344. package/src/workflow/WorkflowRunForm.tsx +245 -0
  345. package/src/workflow/WorkflowTaskList.tsx +177 -0
  346. package/src/workflow/WorkflowTaskPalette.tsx +248 -0
  347. package/src/workflow/WorkflowTopologyGraph.tsx +250 -0
  348. package/src/workflow/WorkflowYamlEditor.tsx +271 -0
  349. package/src/workflow/__tests__/starter-workflow-yaml.test.ts +57 -0
  350. package/src/workflow/canvas-constants.ts +87 -0
  351. package/src/workflow/canvas-icons.tsx +36 -0
  352. package/src/workflow/extract-workflow-yaml.ts +87 -0
  353. package/src/workflow/graph-commands.ts +675 -0
  354. package/src/workflow/index.ts +375 -0
  355. package/src/workflow/serialize-workflow-yaml.ts +546 -0
  356. package/src/workflow/starter-workflow-yaml.ts +29 -0
  357. package/src/workflow/types.ts +99 -0
  358. package/src/workflow/useCanvasKeyboardShortcuts.ts +134 -0
  359. package/src/workflow/useDiagnoseExecutionFlow.ts +378 -0
  360. package/src/workflow/useGraphHistory.ts +138 -0
  361. package/src/workflow/usePendingApprovals.ts +89 -0
  362. package/src/workflow/useRefineWorkflowFlow.ts +321 -0
  363. package/src/workflow/useResolveAgentExecutionSession.ts +57 -0
  364. package/src/workflow/useRunWorkflowFlow.ts +235 -0
  365. package/src/workflow/useTaskKindRegistry.ts +135 -0
  366. package/src/workflow/useWorkflow.ts +78 -0
  367. package/src/workflow/useWorkflowArchitectFlow.ts +303 -0
  368. package/src/workflow/useWorkflowCanvas.ts +882 -0
  369. package/src/workflow/useWorkflowCount.ts +66 -0
  370. package/src/workflow/useWorkflowDashboardSummary.ts +71 -0
  371. package/src/workflow/useWorkflowEditor.ts +106 -0
  372. package/src/workflow/useWorkflowExecution.ts +67 -0
  373. package/src/workflow/useWorkflowExecutionActions.ts +179 -0
  374. package/src/workflow/useWorkflowExecutionArtifacts.ts +57 -0
  375. package/src/workflow/useWorkflowExecutionEventLog.ts +111 -0
  376. package/src/workflow/useWorkflowExecutionEventStream.ts +244 -0
  377. package/src/workflow/useWorkflowExecutionList.ts +121 -0
  378. package/src/workflow/useWorkflowInstances.ts +62 -0
  379. package/src/workflow/useWorkflowList.ts +79 -0
  380. package/src/workflow/useWorkflowSave.ts +84 -0
  381. package/src/workflow/useWorkflowTopology.ts +229 -0
  382. package/src/workflow/useWorkflowValidation.ts +329 -0
  383. package/src/workflow/useWorkflowYaml.ts +49 -0
  384. package/src/workflow/workflow-graph-conversions.ts +796 -0
  385. package/src/workflow/workflow-graph-model.ts +83 -0
  386. package/src/workflow/workflow-yaml-diff.ts +132 -0
  387. package/styles.css +1 -1
  388. package/workflow/ApprovalFormBuilder.d.ts +24 -0
  389. package/workflow/ApprovalFormBuilder.d.ts.map +1 -0
  390. package/workflow/ApprovalFormBuilder.js +347 -0
  391. package/workflow/ApprovalFormBuilder.js.map +1 -0
  392. package/workflow/BranchConditionBuilder.d.ts +29 -0
  393. package/workflow/BranchConditionBuilder.d.ts.map +1 -0
  394. package/workflow/BranchConditionBuilder.js +170 -0
  395. package/workflow/BranchConditionBuilder.js.map +1 -0
  396. package/workflow/CanvasActionsContext.d.ts +8 -0
  397. package/workflow/CanvasActionsContext.d.ts.map +1 -0
  398. package/workflow/CanvasActionsContext.js +4 -0
  399. package/workflow/CanvasActionsContext.js.map +1 -0
  400. package/workflow/CanvasContextMenu.d.ts +59 -0
  401. package/workflow/CanvasContextMenu.d.ts.map +1 -0
  402. package/workflow/CanvasContextMenu.js +98 -0
  403. package/workflow/CanvasContextMenu.js.map +1 -0
  404. package/workflow/CanvasTaskNode.d.ts +21 -0
  405. package/workflow/CanvasTaskNode.d.ts.map +1 -0
  406. package/workflow/CanvasTaskNode.js +125 -0
  407. package/workflow/CanvasTaskNode.js.map +1 -0
  408. package/workflow/CanvasTransitionEdge.d.ts +24 -0
  409. package/workflow/CanvasTransitionEdge.d.ts.map +1 -0
  410. package/workflow/CanvasTransitionEdge.js +50 -0
  411. package/workflow/CanvasTransitionEdge.js.map +1 -0
  412. package/workflow/CostByWorkflowChart.d.ts +15 -0
  413. package/workflow/CostByWorkflowChart.d.ts.map +1 -0
  414. package/workflow/CostByWorkflowChart.js +45 -0
  415. package/workflow/CostByWorkflowChart.js.map +1 -0
  416. package/workflow/ExecutionSummaryWidget.d.ts +16 -0
  417. package/workflow/ExecutionSummaryWidget.d.ts.map +1 -0
  418. package/workflow/ExecutionSummaryWidget.js +93 -0
  419. package/workflow/ExecutionSummaryWidget.js.map +1 -0
  420. package/workflow/ExecutionTrendChart.d.ts +14 -0
  421. package/workflow/ExecutionTrendChart.d.ts.map +1 -0
  422. package/workflow/ExecutionTrendChart.js +67 -0
  423. package/workflow/ExecutionTrendChart.js.map +1 -0
  424. package/workflow/FailedRunsWidget.d.ts +19 -0
  425. package/workflow/FailedRunsWidget.d.ts.map +1 -0
  426. package/workflow/FailedRunsWidget.js +37 -0
  427. package/workflow/FailedRunsWidget.js.map +1 -0
  428. package/workflow/PendingApprovalsWidget.d.ts +19 -0
  429. package/workflow/PendingApprovalsWidget.d.ts.map +1 -0
  430. package/workflow/PendingApprovalsWidget.js +35 -0
  431. package/workflow/PendingApprovalsWidget.js.map +1 -0
  432. package/workflow/TaskConfigForm.d.ts +29 -0
  433. package/workflow/TaskConfigForm.d.ts.map +1 -0
  434. package/workflow/TaskConfigForm.js +230 -0
  435. package/workflow/TaskConfigForm.js.map +1 -0
  436. package/workflow/TaskKindRegistryContext.d.ts +24 -0
  437. package/workflow/TaskKindRegistryContext.d.ts.map +1 -0
  438. package/workflow/TaskKindRegistryContext.js +25 -0
  439. package/workflow/TaskKindRegistryContext.js.map +1 -0
  440. package/workflow/TaskPickerPopover.d.ts +33 -0
  441. package/workflow/TaskPickerPopover.d.ts.map +1 -0
  442. package/workflow/TaskPickerPopover.js +110 -0
  443. package/workflow/TaskPickerPopover.js.map +1 -0
  444. package/workflow/WorkflowArchitectDialog.d.ts +48 -0
  445. package/workflow/WorkflowArchitectDialog.d.ts.map +1 -0
  446. package/workflow/WorkflowArchitectDialog.js +129 -0
  447. package/workflow/WorkflowArchitectDialog.js.map +1 -0
  448. package/workflow/WorkflowCanvasEditor.d.ts +38 -0
  449. package/workflow/WorkflowCanvasEditor.d.ts.map +1 -0
  450. package/workflow/WorkflowCanvasEditor.js +287 -0
  451. package/workflow/WorkflowCanvasEditor.js.map +1 -0
  452. package/workflow/WorkflowCanvasInner.d.ts +32 -0
  453. package/workflow/WorkflowCanvasInner.d.ts.map +1 -0
  454. package/workflow/WorkflowCanvasInner.js +49 -0
  455. package/workflow/WorkflowCanvasInner.js.map +1 -0
  456. package/workflow/WorkflowDashboard.d.ts +35 -0
  457. package/workflow/WorkflowDashboard.d.ts.map +1 -0
  458. package/workflow/WorkflowDashboard.js +59 -0
  459. package/workflow/WorkflowDashboard.js.map +1 -0
  460. package/workflow/WorkflowDetailView.d.ts +63 -0
  461. package/workflow/WorkflowDetailView.d.ts.map +1 -0
  462. package/workflow/WorkflowDetailView.js +202 -0
  463. package/workflow/WorkflowDetailView.js.map +1 -0
  464. package/workflow/WorkflowEditorView.d.ts +43 -0
  465. package/workflow/WorkflowEditorView.d.ts.map +1 -0
  466. package/workflow/WorkflowEditorView.js +165 -0
  467. package/workflow/WorkflowEditorView.js.map +1 -0
  468. package/workflow/WorkflowExecutionApprovalCard.d.ts +27 -0
  469. package/workflow/WorkflowExecutionApprovalCard.d.ts.map +1 -0
  470. package/workflow/WorkflowExecutionApprovalCard.js +32 -0
  471. package/workflow/WorkflowExecutionApprovalCard.js.map +1 -0
  472. package/workflow/WorkflowExecutionArtifactPanel.d.ts +15 -0
  473. package/workflow/WorkflowExecutionArtifactPanel.d.ts.map +1 -0
  474. package/workflow/WorkflowExecutionArtifactPanel.js +53 -0
  475. package/workflow/WorkflowExecutionArtifactPanel.js.map +1 -0
  476. package/workflow/WorkflowExecutionCostPanel.d.ts +18 -0
  477. package/workflow/WorkflowExecutionCostPanel.d.ts.map +1 -0
  478. package/workflow/WorkflowExecutionCostPanel.js +44 -0
  479. package/workflow/WorkflowExecutionCostPanel.js.map +1 -0
  480. package/workflow/WorkflowExecutionHeader.d.ts +26 -0
  481. package/workflow/WorkflowExecutionHeader.d.ts.map +1 -0
  482. package/workflow/WorkflowExecutionHeader.js +68 -0
  483. package/workflow/WorkflowExecutionHeader.js.map +1 -0
  484. package/workflow/WorkflowExecutionPhaseBadge.d.ts +23 -0
  485. package/workflow/WorkflowExecutionPhaseBadge.d.ts.map +1 -0
  486. package/workflow/WorkflowExecutionPhaseBadge.js +99 -0
  487. package/workflow/WorkflowExecutionPhaseBadge.js.map +1 -0
  488. package/workflow/WorkflowExecutionTaskPanel.d.ts +24 -0
  489. package/workflow/WorkflowExecutionTaskPanel.d.ts.map +1 -0
  490. package/workflow/WorkflowExecutionTaskPanel.js +59 -0
  491. package/workflow/WorkflowExecutionTaskPanel.js.map +1 -0
  492. package/workflow/WorkflowExecutionTimeline.d.ts +27 -0
  493. package/workflow/WorkflowExecutionTimeline.d.ts.map +1 -0
  494. package/workflow/WorkflowExecutionTimeline.js +51 -0
  495. package/workflow/WorkflowExecutionTimeline.js.map +1 -0
  496. package/workflow/WorkflowExecutionTimelineEvent.d.ts +18 -0
  497. package/workflow/WorkflowExecutionTimelineEvent.d.ts.map +1 -0
  498. package/workflow/WorkflowExecutionTimelineEvent.js +210 -0
  499. package/workflow/WorkflowExecutionTimelineEvent.js.map +1 -0
  500. package/workflow/WorkflowExecutionViewer.d.ts +45 -0
  501. package/workflow/WorkflowExecutionViewer.d.ts.map +1 -0
  502. package/workflow/WorkflowExecutionViewer.js +75 -0
  503. package/workflow/WorkflowExecutionViewer.js.map +1 -0
  504. package/workflow/WorkflowInspectorPanel.d.ts +46 -0
  505. package/workflow/WorkflowInspectorPanel.d.ts.map +1 -0
  506. package/workflow/WorkflowInspectorPanel.js +152 -0
  507. package/workflow/WorkflowInspectorPanel.js.map +1 -0
  508. package/workflow/WorkflowRefinePanel.d.ts +30 -0
  509. package/workflow/WorkflowRefinePanel.d.ts.map +1 -0
  510. package/workflow/WorkflowRefinePanel.js +107 -0
  511. package/workflow/WorkflowRefinePanel.js.map +1 -0
  512. package/workflow/WorkflowRepairCard.d.ts +35 -0
  513. package/workflow/WorkflowRepairCard.d.ts.map +1 -0
  514. package/workflow/WorkflowRepairCard.js +113 -0
  515. package/workflow/WorkflowRepairCard.js.map +1 -0
  516. package/workflow/WorkflowRunDialog.d.ts +51 -0
  517. package/workflow/WorkflowRunDialog.d.ts.map +1 -0
  518. package/workflow/WorkflowRunDialog.js +75 -0
  519. package/workflow/WorkflowRunDialog.js.map +1 -0
  520. package/workflow/WorkflowRunForm.d.ts +62 -0
  521. package/workflow/WorkflowRunForm.d.ts.map +1 -0
  522. package/workflow/WorkflowRunForm.js +64 -0
  523. package/workflow/WorkflowRunForm.js.map +1 -0
  524. package/workflow/WorkflowTaskList.d.ts +25 -0
  525. package/workflow/WorkflowTaskList.d.ts.map +1 -0
  526. package/workflow/WorkflowTaskList.js +89 -0
  527. package/workflow/WorkflowTaskList.js.map +1 -0
  528. package/workflow/WorkflowTaskPalette.d.ts +22 -0
  529. package/workflow/WorkflowTaskPalette.d.ts.map +1 -0
  530. package/workflow/WorkflowTaskPalette.js +83 -0
  531. package/workflow/WorkflowTaskPalette.js.map +1 -0
  532. package/workflow/WorkflowTopologyGraph.d.ts +22 -0
  533. package/workflow/WorkflowTopologyGraph.d.ts.map +1 -0
  534. package/workflow/WorkflowTopologyGraph.js +123 -0
  535. package/workflow/WorkflowTopologyGraph.js.map +1 -0
  536. package/workflow/WorkflowYamlEditor.d.ts +43 -0
  537. package/workflow/WorkflowYamlEditor.d.ts.map +1 -0
  538. package/workflow/WorkflowYamlEditor.js +215 -0
  539. package/workflow/WorkflowYamlEditor.js.map +1 -0
  540. package/workflow/__tests__/starter-workflow-yaml.test.d.ts +2 -0
  541. package/workflow/__tests__/starter-workflow-yaml.test.d.ts.map +1 -0
  542. package/workflow/__tests__/starter-workflow-yaml.test.js +44 -0
  543. package/workflow/__tests__/starter-workflow-yaml.test.js.map +1 -0
  544. package/workflow/canvas-constants.d.ts +56 -0
  545. package/workflow/canvas-constants.d.ts.map +1 -0
  546. package/workflow/canvas-constants.js +74 -0
  547. package/workflow/canvas-constants.js.map +1 -0
  548. package/workflow/canvas-icons.d.ts +13 -0
  549. package/workflow/canvas-icons.d.ts.map +1 -0
  550. package/workflow/canvas-icons.js +21 -0
  551. package/workflow/canvas-icons.js.map +1 -0
  552. package/workflow/extract-workflow-yaml.d.ts +22 -0
  553. package/workflow/extract-workflow-yaml.d.ts.map +1 -0
  554. package/workflow/extract-workflow-yaml.js +63 -0
  555. package/workflow/extract-workflow-yaml.js.map +1 -0
  556. package/workflow/graph-commands.d.ts +209 -0
  557. package/workflow/graph-commands.d.ts.map +1 -0
  558. package/workflow/graph-commands.js +516 -0
  559. package/workflow/graph-commands.js.map +1 -0
  560. package/workflow/index.d.ts +66 -0
  561. package/workflow/index.d.ts.map +1 -0
  562. package/workflow/index.js +88 -0
  563. package/workflow/index.js.map +1 -0
  564. package/workflow/serialize-workflow-yaml.d.ts +39 -0
  565. package/workflow/serialize-workflow-yaml.d.ts.map +1 -0
  566. package/workflow/serialize-workflow-yaml.js +413 -0
  567. package/workflow/serialize-workflow-yaml.js.map +1 -0
  568. package/workflow/starter-workflow-yaml.d.ts +12 -0
  569. package/workflow/starter-workflow-yaml.d.ts.map +1 -0
  570. package/workflow/starter-workflow-yaml.js +30 -0
  571. package/workflow/starter-workflow-yaml.js.map +1 -0
  572. package/workflow/types.d.ts +80 -0
  573. package/workflow/types.d.ts.map +1 -0
  574. package/workflow/types.js +2 -0
  575. package/workflow/types.js.map +1 -0
  576. package/workflow/useCanvasKeyboardShortcuts.d.ts +34 -0
  577. package/workflow/useCanvasKeyboardShortcuts.d.ts.map +1 -0
  578. package/workflow/useCanvasKeyboardShortcuts.js +108 -0
  579. package/workflow/useCanvasKeyboardShortcuts.js.map +1 -0
  580. package/workflow/useDiagnoseExecutionFlow.d.ts +87 -0
  581. package/workflow/useDiagnoseExecutionFlow.d.ts.map +1 -0
  582. package/workflow/useDiagnoseExecutionFlow.js +257 -0
  583. package/workflow/useDiagnoseExecutionFlow.js.map +1 -0
  584. package/workflow/useGraphHistory.d.ts +28 -0
  585. package/workflow/useGraphHistory.d.ts.map +1 -0
  586. package/workflow/useGraphHistory.js +106 -0
  587. package/workflow/useGraphHistory.js.map +1 -0
  588. package/workflow/usePendingApprovals.d.ts +35 -0
  589. package/workflow/usePendingApprovals.d.ts.map +1 -0
  590. package/workflow/usePendingApprovals.js +50 -0
  591. package/workflow/usePendingApprovals.js.map +1 -0
  592. package/workflow/useRefineWorkflowFlow.d.ts +75 -0
  593. package/workflow/useRefineWorkflowFlow.d.ts.map +1 -0
  594. package/workflow/useRefineWorkflowFlow.js +216 -0
  595. package/workflow/useRefineWorkflowFlow.js.map +1 -0
  596. package/workflow/useResolveAgentExecutionSession.d.ts +33 -0
  597. package/workflow/useResolveAgentExecutionSession.d.ts.map +1 -0
  598. package/workflow/useResolveAgentExecutionSession.js +37 -0
  599. package/workflow/useResolveAgentExecutionSession.js.map +1 -0
  600. package/workflow/useRunWorkflowFlow.d.ts +82 -0
  601. package/workflow/useRunWorkflowFlow.d.ts.map +1 -0
  602. package/workflow/useRunWorkflowFlow.js +145 -0
  603. package/workflow/useRunWorkflowFlow.js.map +1 -0
  604. package/workflow/useTaskKindRegistry.d.ts +96 -0
  605. package/workflow/useTaskKindRegistry.d.ts.map +1 -0
  606. package/workflow/useTaskKindRegistry.js +75 -0
  607. package/workflow/useTaskKindRegistry.js.map +1 -0
  608. package/workflow/useWorkflow.d.ts +47 -0
  609. package/workflow/useWorkflow.d.ts.map +1 -0
  610. package/workflow/useWorkflow.js +53 -0
  611. package/workflow/useWorkflow.js.map +1 -0
  612. package/workflow/useWorkflowArchitectFlow.d.ts +96 -0
  613. package/workflow/useWorkflowArchitectFlow.d.ts.map +1 -0
  614. package/workflow/useWorkflowArchitectFlow.js +179 -0
  615. package/workflow/useWorkflowArchitectFlow.js.map +1 -0
  616. package/workflow/useWorkflowCanvas.d.ts +66 -0
  617. package/workflow/useWorkflowCanvas.d.ts.map +1 -0
  618. package/workflow/useWorkflowCanvas.js +628 -0
  619. package/workflow/useWorkflowCanvas.js.map +1 -0
  620. package/workflow/useWorkflowCount.d.ts +47 -0
  621. package/workflow/useWorkflowCount.d.ts.map +1 -0
  622. package/workflow/useWorkflowCount.js +26 -0
  623. package/workflow/useWorkflowCount.js.map +1 -0
  624. package/workflow/useWorkflowDashboardSummary.d.ts +34 -0
  625. package/workflow/useWorkflowDashboardSummary.d.ts.map +1 -0
  626. package/workflow/useWorkflowDashboardSummary.js +33 -0
  627. package/workflow/useWorkflowDashboardSummary.js.map +1 -0
  628. package/workflow/useWorkflowEditor.d.ts +45 -0
  629. package/workflow/useWorkflowEditor.d.ts.map +1 -0
  630. package/workflow/useWorkflowEditor.js +52 -0
  631. package/workflow/useWorkflowEditor.js.map +1 -0
  632. package/workflow/useWorkflowExecution.d.ts +37 -0
  633. package/workflow/useWorkflowExecution.d.ts.map +1 -0
  634. package/workflow/useWorkflowExecution.js +43 -0
  635. package/workflow/useWorkflowExecution.js.map +1 -0
  636. package/workflow/useWorkflowExecutionActions.d.ts +41 -0
  637. package/workflow/useWorkflowExecutionActions.d.ts.map +1 -0
  638. package/workflow/useWorkflowExecutionActions.js +86 -0
  639. package/workflow/useWorkflowExecutionActions.js.map +1 -0
  640. package/workflow/useWorkflowExecutionArtifacts.d.ts +26 -0
  641. package/workflow/useWorkflowExecutionArtifacts.d.ts.map +1 -0
  642. package/workflow/useWorkflowExecutionArtifacts.js +29 -0
  643. package/workflow/useWorkflowExecutionArtifacts.js.map +1 -0
  644. package/workflow/useWorkflowExecutionEventLog.d.ts +47 -0
  645. package/workflow/useWorkflowExecutionEventLog.d.ts.map +1 -0
  646. package/workflow/useWorkflowExecutionEventLog.js +59 -0
  647. package/workflow/useWorkflowExecutionEventLog.js.map +1 -0
  648. package/workflow/useWorkflowExecutionEventStream.d.ts +61 -0
  649. package/workflow/useWorkflowExecutionEventStream.d.ts.map +1 -0
  650. package/workflow/useWorkflowExecutionEventStream.js +161 -0
  651. package/workflow/useWorkflowExecutionEventStream.js.map +1 -0
  652. package/workflow/useWorkflowExecutionList.d.ts +49 -0
  653. package/workflow/useWorkflowExecutionList.d.ts.map +1 -0
  654. package/workflow/useWorkflowExecutionList.js +65 -0
  655. package/workflow/useWorkflowExecutionList.js.map +1 -0
  656. package/workflow/useWorkflowInstances.d.ts +30 -0
  657. package/workflow/useWorkflowInstances.d.ts.map +1 -0
  658. package/workflow/useWorkflowInstances.js +33 -0
  659. package/workflow/useWorkflowInstances.js.map +1 -0
  660. package/workflow/useWorkflowList.d.ts +57 -0
  661. package/workflow/useWorkflowList.d.ts.map +1 -0
  662. package/workflow/useWorkflowList.js +29 -0
  663. package/workflow/useWorkflowList.js.map +1 -0
  664. package/workflow/useWorkflowSave.d.ts +25 -0
  665. package/workflow/useWorkflowSave.d.ts.map +1 -0
  666. package/workflow/useWorkflowSave.js +61 -0
  667. package/workflow/useWorkflowSave.js.map +1 -0
  668. package/workflow/useWorkflowTopology.d.ts +40 -0
  669. package/workflow/useWorkflowTopology.d.ts.map +1 -0
  670. package/workflow/useWorkflowTopology.js +163 -0
  671. package/workflow/useWorkflowTopology.js.map +1 -0
  672. package/workflow/useWorkflowValidation.d.ts +27 -0
  673. package/workflow/useWorkflowValidation.d.ts.map +1 -0
  674. package/workflow/useWorkflowValidation.js +253 -0
  675. package/workflow/useWorkflowValidation.js.map +1 -0
  676. package/workflow/useWorkflowYaml.d.ts +26 -0
  677. package/workflow/useWorkflowYaml.d.ts.map +1 -0
  678. package/workflow/useWorkflowYaml.js +26 -0
  679. package/workflow/useWorkflowYaml.js.map +1 -0
  680. package/workflow/workflow-graph-conversions.d.ts +70 -0
  681. package/workflow/workflow-graph-conversions.d.ts.map +1 -0
  682. package/workflow/workflow-graph-conversions.js +634 -0
  683. package/workflow/workflow-graph-conversions.js.map +1 -0
  684. package/workflow/workflow-graph-model.d.ts +83 -0
  685. package/workflow/workflow-graph-model.d.ts.map +1 -0
  686. package/workflow/workflow-graph-model.js +5 -0
  687. package/workflow/workflow-graph-model.js.map +1 -0
  688. package/workflow/workflow-yaml-diff.d.ts +24 -0
  689. package/workflow/workflow-yaml-diff.d.ts.map +1 -0
  690. package/workflow/workflow-yaml-diff.js +96 -0
  691. package/workflow/workflow-yaml-diff.js.map +1 -0
@@ -21,6 +21,8 @@ import { ScrollFade } from "../internal/ScrollFade";
21
21
  import { McpServerConfigPanel } from "./McpServerConfigPanel";
22
22
  import type { McpServerSetupEntry } from "./mcpServerSetupReducer";
23
23
  import { useMcpServerOAuthConnect } from "./useMcpServerOAuthConnect";
24
+ import { ScopeToggle } from "../library/ScopeToggle";
25
+ import type { ResourceListScope } from "../search";
24
26
 
25
27
  // ---------------------------------------------------------------------------
26
28
  // Setup integration props
@@ -263,8 +265,9 @@ export function McpServerPicker({
263
265
  const instanceId = useId();
264
266
  const listId = `${instanceId}-list`;
265
267
 
268
+ const [activeScope, setActiveScope] = useState<ResourceListScope>(scope ?? "org");
266
269
  const { results, isLoading, error, query, setQuery } =
267
- useMcpServerSearch(org, { scope });
270
+ useMcpServerSearch(org, { scope: activeScope });
268
271
  const oauth = useMcpServerOAuthConnect();
269
272
 
270
273
  const [focusIndex, setFocusIndex] = useState(-1);
@@ -580,6 +583,8 @@ export function McpServerPicker({
580
583
  autoFocus
581
584
  />
582
585
 
586
+ <ScopeToggle value={activeScope} onChange={setActiveScope} disabled={disabled} />
587
+
583
588
  {error && <p className="text-xs text-destructive">{error.message}</p>}
584
589
 
585
590
  {/* Scrollable results list */}
@@ -8,6 +8,8 @@ export interface ModelRegistryState {
8
8
  readonly models: readonly ModelInfo[];
9
9
  readonly isLoading: boolean;
10
10
  readonly error: Error | null;
11
+ /** Retry fetching the model registry. No-op while a fetch is in flight. */
12
+ readonly refetch: () => void;
11
13
  }
12
14
 
13
15
  /**
@@ -21,6 +23,7 @@ export const ModelRegistryContext = createContext<ModelRegistryState>({
21
23
  models: [],
22
24
  isLoading: true,
23
25
  error: null,
26
+ refetch: () => {},
24
27
  });
25
28
 
26
29
  /**
@@ -119,7 +119,7 @@ export function ModelSelector({
119
119
  }
120
120
  }, [initialHarness, isHarnessLocked]);
121
121
 
122
- const { models, featured, defaultModel, getModel, byProvider } = useModelRegistry(
122
+ const { models, featured, defaultModel, getModel, byProvider, isLoading, error, refetch } = useModelRegistry(
123
123
  { harness: activeHarness },
124
124
  );
125
125
 
@@ -393,7 +393,30 @@ export function ModelSelector({
393
393
  aria-label="Available models"
394
394
  className="max-h-72 overflow-y-auto p-1"
395
395
  >
396
- {visibleModels.length === 0 && (
396
+ {visibleModels.length === 0 && isLoading && (
397
+ <div className="flex items-center justify-center gap-2 px-2 py-3">
398
+ <div className="size-3 animate-spin rounded-full border border-muted border-t-primary" />
399
+ <span className="text-xs text-muted-foreground">Loading models…</span>
400
+ </div>
401
+ )}
402
+
403
+ {visibleModels.length === 0 && !isLoading && error != null && (
404
+ <div className="flex flex-col items-center gap-1.5 px-2 py-3">
405
+ <span className="text-xs text-muted-foreground">Failed to load models</span>
406
+ <button
407
+ type="button"
408
+ className={cn(
409
+ "rounded-md border border-border bg-background px-2.5 py-1 text-xs text-foreground",
410
+ "hover:bg-accent-hover transition-colors cursor-pointer",
411
+ )}
412
+ onClick={refetch}
413
+ >
414
+ Retry
415
+ </button>
416
+ </div>
417
+ )}
418
+
419
+ {visibleModels.length === 0 && !isLoading && error == null && (
397
420
  <div className="px-2 py-3 text-center text-xs text-muted-foreground">
398
421
  No models found
399
422
  </div>
@@ -90,8 +90,10 @@ const TEST_REGISTRY_JSON = {
90
90
 
91
91
  const TEST_MODELS: readonly ModelInfo[] = parseRegistryJson(TEST_REGISTRY_JSON);
92
92
 
93
+ const noopRefetch = () => {};
94
+
93
95
  function createWrapper(models: readonly ModelInfo[] = TEST_MODELS) {
94
- const state: ModelRegistryState = { models, isLoading: false, error: null };
96
+ const state: ModelRegistryState = { models, isLoading: false, error: null, refetch: noopRefetch };
95
97
  return function Wrapper({ children }: { children: ReactNode }) {
96
98
  return (
97
99
  <ModelRegistryContext.Provider value={state}>
@@ -285,7 +287,7 @@ describe("useModelRegistry", () => {
285
287
 
286
288
  describe("loading state", () => {
287
289
  it("exposes isLoading from context", () => {
288
- const loadingState: ModelRegistryState = { models: [], isLoading: true, error: null };
290
+ const loadingState: ModelRegistryState = { models: [], isLoading: true, error: null, refetch: noopRefetch };
289
291
  const wrapper = ({ children }: { children: ReactNode }) => (
290
292
  <ModelRegistryContext.Provider value={loadingState}>
291
293
  {children}
@@ -298,7 +300,7 @@ describe("useModelRegistry", () => {
298
300
 
299
301
  it("exposes error from context", () => {
300
302
  const err = new Error("fetch failed");
301
- const errorState: ModelRegistryState = { models: [], isLoading: false, error: err };
303
+ const errorState: ModelRegistryState = { models: [], isLoading: false, error: err, refetch: noopRefetch };
302
304
  const wrapper = ({ children }: { children: ReactNode }) => (
303
305
  <ModelRegistryContext.Provider value={errorState}>
304
306
  {children}
@@ -55,6 +55,8 @@ export interface UseModelRegistryReturn {
55
55
  readonly isLoading: boolean;
56
56
  /** Non-null if the API fetch failed. Models will be empty in this case. */
57
57
  readonly error: Error | null;
58
+ /** Retry fetching the model registry. No-op while a fetch is in flight. */
59
+ readonly refetch: () => void;
58
60
  }
59
61
 
60
62
  /**
@@ -85,7 +87,7 @@ export interface UseModelRegistryReturn {
85
87
  */
86
88
  export function useModelRegistry(options?: UseModelRegistryOptions): UseModelRegistryReturn {
87
89
  const harness = options?.harness;
88
- const { models: allModels, isLoading, error } = useModelRegistryContext();
90
+ const { models: allModels, isLoading, error, refetch } = useModelRegistryContext();
89
91
 
90
92
  return useMemo(() => {
91
93
  const isUnified = harness === undefined;
@@ -143,6 +145,7 @@ export function useModelRegistry(options?: UseModelRegistryOptions): UseModelReg
143
145
  getByKey: (key: string) => byCompoundKey.get(key),
144
146
  isLoading,
145
147
  error,
148
+ refetch,
146
149
  };
147
- }, [harness, allModels, isLoading, error]);
150
+ }, [harness, allModels, isLoading, error, refetch]);
148
151
  }
package/src/provider.tsx CHANGED
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { useEffect, useRef, useState, type ReactNode } from "react";
3
+ import { useCallback, useEffect, useRef, useState, type ReactNode } from "react";
4
4
  import type { Stigmer, DeploymentMode } from "@stigmer/sdk";
5
5
  import { cn, resolvePresetClass } from "@stigmer/theme";
6
6
  import type { ThemePresetId } from "@stigmer/theme";
@@ -12,6 +12,9 @@ import { PortalContainerContext } from "./portal-container";
12
12
  import { ModelRegistryContext } from "./models/ModelRegistryContext";
13
13
  import type { ModelRegistryState } from "./models/ModelRegistryContext";
14
14
  import { fetchModelRegistry } from "./models/registry";
15
+ import { TaskKindRegistryContext } from "./workflow/TaskKindRegistryContext";
16
+ import type { TaskKindRegistryState } from "./workflow/TaskKindRegistryContext";
17
+ import type { TaskKindDescriptor } from "./workflow/types";
15
18
 
16
19
  /** Props for {@link StigmerProvider}. */
17
20
  export interface StigmerProviderProps {
@@ -130,20 +133,23 @@ export function StigmerProvider({
130
133
 
131
134
  const portalContainer = usePortalContainer(resolvedMode, presetClass);
132
135
  const registryState = useModelRegistryFetch(client);
136
+ const taskKindRegistryState = useTaskKindRegistryFetch(client);
133
137
 
134
138
  return (
135
139
  <StigmerContext.Provider value={client}>
136
140
  <DeploymentModeContext.Provider value={deploymentMode}>
137
141
  <ColorModeContext.Provider value={resolvedMode}>
138
142
  <ModelRegistryContext.Provider value={registryState}>
139
- <PortalContainerContext.Provider value={portalContainer}>
140
- <div
141
- className={cn("stgm", presetClass, className)}
142
- data-stgm-color-mode={resolvedMode}
143
- >
144
- {children}
145
- </div>
146
- </PortalContainerContext.Provider>
143
+ <TaskKindRegistryContext.Provider value={taskKindRegistryState}>
144
+ <PortalContainerContext.Provider value={portalContainer}>
145
+ <div
146
+ className={cn("stgm", presetClass, className)}
147
+ data-stgm-color-mode={resolvedMode}
148
+ >
149
+ {children}
150
+ </div>
151
+ </PortalContainerContext.Provider>
152
+ </TaskKindRegistryContext.Provider>
147
153
  </ModelRegistryContext.Provider>
148
154
  </ColorModeContext.Provider>
149
155
  </DeploymentModeContext.Provider>
@@ -151,15 +157,23 @@ export function StigmerProvider({
151
157
  );
152
158
  }
153
159
 
160
+ const RETRY_DELAYS_MS = [1_000, 2_000, 4_000];
161
+ const TOKEN_POLL_INTERVAL_MS = 500;
162
+ const TOKEN_POLL_MAX_MS = 10_000;
163
+
154
164
  /**
155
- * Fetches the model registry from the authenticated API on mount and
156
- * caches the result for the lifetime of the provider.
165
+ * Fetches the model registry from the authenticated API and caches
166
+ * the result for the lifetime of the provider.
157
167
  *
158
- * Uses the client's `baseUrl` and `getAuthCredential()` so the fetch
159
- * is authenticated with the same token the SDK uses for all other calls.
168
+ * Handles the auth race condition where `StigmerProvider` mounts before
169
+ * PKCE authentication is established (e.g. desktop release builds with
170
+ * a fresh localStorage). When the initial token is `null`, polls for
171
+ * a valid token before giving up. Retries on transient failures with
172
+ * exponential backoff. Exposes `refetch` for manual retry from the UI.
160
173
  */
161
174
  function useModelRegistryFetch(client: Stigmer): ModelRegistryState {
162
- const [state, setState] = useState<ModelRegistryState>({
175
+ const [version, setVersion] = useState(0);
176
+ const [state, setState] = useState<Omit<ModelRegistryState, "refetch">>({
163
177
  models: [],
164
178
  isLoading: true,
165
179
  error: null,
@@ -168,31 +182,255 @@ function useModelRegistryFetch(client: Stigmer): ModelRegistryState {
168
182
  const clientRef = useRef(client);
169
183
  clientRef.current = client;
170
184
 
171
- useEffect(() => {
172
- let cancelled = false;
185
+ const fetchAttemptRef = useRef(0);
173
186
 
187
+ const doFetch = useCallback(async (signal: AbortSignal) => {
174
188
  const c = clientRef.current;
175
- c.getAuthCredential()
176
- .then((token) => fetchModelRegistry(c.baseUrl, token, c.fetch))
177
- .then((models) => {
178
- if (!cancelled) {
189
+ let token = await c.getAuthCredential();
190
+
191
+ if (!token) {
192
+ const start = Date.now();
193
+ while (!token && Date.now() - start < TOKEN_POLL_MAX_MS) {
194
+ if (signal.aborted) return;
195
+ await new Promise((r) => setTimeout(r, TOKEN_POLL_INTERVAL_MS));
196
+ if (signal.aborted) return;
197
+ token = await c.getAuthCredential();
198
+ }
199
+ }
200
+
201
+ return fetchModelRegistry(c.baseUrl, token, c.fetch);
202
+ }, []);
203
+
204
+ useEffect(() => {
205
+ const controller = new AbortController();
206
+ const { signal } = controller;
207
+
208
+ fetchAttemptRef.current = 0;
209
+
210
+ const attempt = async () => {
211
+ if (signal.aborted) return;
212
+
213
+ setState((prev) => (prev.isLoading ? prev : { ...prev, isLoading: true }));
214
+
215
+ try {
216
+ const models = await doFetch(signal);
217
+ if (!signal.aborted && models) {
179
218
  setState({ models, isLoading: false, error: null });
219
+ fetchAttemptRef.current = 0;
180
220
  }
181
- })
182
- .catch((err: unknown) => {
183
- if (!cancelled) {
221
+ } catch (err: unknown) {
222
+ if (signal.aborted) return;
223
+
224
+ const retryIdx = fetchAttemptRef.current;
225
+ fetchAttemptRef.current = retryIdx + 1;
226
+
227
+ if (retryIdx < RETRY_DELAYS_MS.length) {
228
+ setTimeout(() => { if (!signal.aborted) attempt(); }, RETRY_DELAYS_MS[retryIdx]);
229
+ } else {
184
230
  setState({
185
231
  models: [],
186
232
  isLoading: false,
187
233
  error: err instanceof Error ? err : new Error(String(err)),
188
234
  });
189
235
  }
190
- });
236
+ }
237
+ };
238
+
239
+ attempt();
240
+
241
+ return () => { controller.abort(); };
242
+ }, [doFetch, version]);
243
+
244
+ const refetch = useCallback(() => {
245
+ setState((prev) => {
246
+ if (prev.isLoading) return prev;
247
+ return { ...prev, isLoading: true, error: null };
248
+ });
249
+ setVersion((v) => v + 1);
250
+ }, []);
251
+
252
+ return { ...state, refetch };
253
+ }
254
+
255
+ // ---------------------------------------------------------------------------
256
+ // Task Kind Registry fetch
257
+ // ---------------------------------------------------------------------------
258
+
259
+ /**
260
+ * Fetch the task kind registry from the authenticated API endpoint.
261
+ *
262
+ * The endpoint returns `{ version, generatedAt, descriptors: [...] }`.
263
+ * Each descriptor maps directly to the `TaskKindDescriptor` interface
264
+ * used by the React SDK's task palette, inspector, and YAML validation.
265
+ */
266
+ async function fetchTaskKindRegistry(
267
+ apiUrl: string,
268
+ token: string | null,
269
+ customFetch?: typeof globalThis.fetch,
270
+ ): Promise<TaskKindDescriptor[]> {
271
+ const doFetch = customFetch ?? globalThis.fetch;
272
+ const headers: Record<string, string> = {};
273
+ if (token) {
274
+ headers["Authorization"] = `Bearer ${token}`;
275
+ }
276
+ const res = await doFetch(`${apiUrl}/v1/proxy/task-kind-registry`, { headers });
277
+ if (!res.ok) throw new Error(`Task kind registry fetch failed: ${res.status}`);
278
+ const data: unknown = await res.json();
279
+ return parseTaskKindRegistryJson(data);
280
+ }
281
+
282
+ const VALID_CATEGORIES = new Set([
283
+ "control_flow", "invocation", "ai", "data", "governance", "event", "unspecified",
284
+ ]);
285
+
286
+ const VALID_FIELD_TYPES = new Set([
287
+ "string", "int32", "float", "bool", "enum", "struct", "repeated", "map", "message",
288
+ ]);
289
+
290
+ function parseTaskKindRegistryJson(data: unknown): TaskKindDescriptor[] {
291
+ if (!data || typeof data !== "object") return [];
292
+ const descriptors = (data as Record<string, unknown>).descriptors;
293
+ if (!Array.isArray(descriptors)) return [];
294
+
295
+ return descriptors
296
+ .filter((d): d is Record<string, unknown> =>
297
+ d != null && typeof d === "object" && typeof (d as Record<string, unknown>).kind === "string",
298
+ )
299
+ .map((d) => ({
300
+ kind: d.kind as string,
301
+ displayName: (d.displayName as string) ?? "",
302
+ description: (d.description as string) ?? "",
303
+ category: VALID_CATEGORIES.has(d.category as string)
304
+ ? (d.category as TaskKindDescriptor["category"])
305
+ : "unspecified",
306
+ icon: (d.icon as string) ?? "",
307
+ configProtoType: (d.configProtoType as string) ?? "",
308
+ fields: Array.isArray(d.fields)
309
+ ? (d.fields as Record<string, unknown>[]).map((f) => ({
310
+ name: (f.name as string) ?? "",
311
+ displayName: (f.displayName as string) ?? "",
312
+ description: (f.description as string) ?? "",
313
+ type: VALID_FIELD_TYPES.has(f.type as string)
314
+ ? (f.type as TaskKindDescriptor["fields"][number]["type"])
315
+ : ("string" as const),
316
+ required: f.required === true,
317
+ isExpression: f.isExpression === true ? true : undefined,
318
+ defaultValue: typeof f.defaultValue === "string" ? f.defaultValue : undefined,
319
+ enumValues: Array.isArray(f.enumValues) ? (f.enumValues as string[]) : undefined,
320
+ groupId: typeof f.groupId === "string" ? f.groupId : undefined,
321
+ fieldNumber: typeof f.fieldNumber === "number" ? f.fieldNumber : 0,
322
+ elementType: typeof f.elementType === "string" ? f.elementType : undefined,
323
+ validationHints: Array.isArray(f.validationHints) ? (f.validationHints as string[]) : undefined,
324
+ }))
325
+ : [],
326
+ fieldGroups: Array.isArray(d.fieldGroups)
327
+ ? (d.fieldGroups as Record<string, unknown>[]).map((g) => ({
328
+ id: (g.id as string) ?? "",
329
+ displayName: (g.displayName as string) ?? "",
330
+ description: typeof g.description === "string" ? g.description : undefined,
331
+ }))
332
+ : [],
333
+ configJsonSchema:
334
+ d.configJsonSchema != null && typeof d.configJsonSchema === "object"
335
+ ? (d.configJsonSchema as Record<string, unknown>)
336
+ : {},
337
+ outputJsonSchema:
338
+ d.outputJsonSchema != null && typeof d.outputJsonSchema === "object"
339
+ ? (d.outputJsonSchema as Record<string, unknown>)
340
+ : undefined,
341
+ yamlExamples: Array.isArray(d.yamlExamples) ? (d.yamlExamples as string[]) : undefined,
342
+ documentationUrl: (d.documentationUrl as string) ?? "",
343
+ isAiNative: d.isAiNative === true,
344
+ requiresExternalService: d.requiresExternalService === true,
345
+ }));
346
+ }
347
+
348
+ /**
349
+ * Fetches the task kind registry from the authenticated API and caches
350
+ * the result for the lifetime of the provider.
351
+ *
352
+ * Follows the same pattern as {@link useModelRegistryFetch}: auth token
353
+ * polling, exponential backoff retries, and `refetch` for manual retry.
354
+ */
355
+ function useTaskKindRegistryFetch(client: Stigmer): TaskKindRegistryState {
356
+ const [version, setVersion] = useState(0);
357
+ const [state, setState] = useState<Omit<TaskKindRegistryState, "refetch">>({
358
+ descriptors: [],
359
+ isLoading: true,
360
+ error: null,
361
+ });
362
+
363
+ const clientRef = useRef(client);
364
+ clientRef.current = client;
365
+
366
+ const fetchAttemptRef = useRef(0);
367
+
368
+ const doFetch = useCallback(async (signal: AbortSignal) => {
369
+ const c = clientRef.current;
370
+ let token = await c.getAuthCredential();
371
+
372
+ if (!token) {
373
+ const start = Date.now();
374
+ while (!token && Date.now() - start < TOKEN_POLL_MAX_MS) {
375
+ if (signal.aborted) return;
376
+ await new Promise((r) => setTimeout(r, TOKEN_POLL_INTERVAL_MS));
377
+ if (signal.aborted) return;
378
+ token = await c.getAuthCredential();
379
+ }
380
+ }
381
+
382
+ return fetchTaskKindRegistry(c.baseUrl, token, c.fetch);
383
+ }, []);
384
+
385
+ useEffect(() => {
386
+ const controller = new AbortController();
387
+ const { signal } = controller;
388
+
389
+ fetchAttemptRef.current = 0;
390
+
391
+ const attempt = async () => {
392
+ if (signal.aborted) return;
393
+
394
+ setState((prev) => (prev.isLoading ? prev : { ...prev, isLoading: true }));
395
+
396
+ try {
397
+ const descriptors = await doFetch(signal);
398
+ if (!signal.aborted && descriptors) {
399
+ setState({ descriptors, isLoading: false, error: null });
400
+ fetchAttemptRef.current = 0;
401
+ }
402
+ } catch (err: unknown) {
403
+ if (signal.aborted) return;
404
+
405
+ const retryIdx = fetchAttemptRef.current;
406
+ fetchAttemptRef.current = retryIdx + 1;
407
+
408
+ if (retryIdx < RETRY_DELAYS_MS.length) {
409
+ setTimeout(() => { if (!signal.aborted) attempt(); }, RETRY_DELAYS_MS[retryIdx]);
410
+ } else {
411
+ setState({
412
+ descriptors: [],
413
+ isLoading: false,
414
+ error: err instanceof Error ? err : new Error(String(err)),
415
+ });
416
+ }
417
+ }
418
+ };
419
+
420
+ attempt();
421
+
422
+ return () => { controller.abort(); };
423
+ }, [doFetch, version]);
191
424
 
192
- return () => { cancelled = true; };
425
+ const refetch = useCallback(() => {
426
+ setState((prev) => {
427
+ if (prev.isLoading) return prev;
428
+ return { ...prev, isLoading: true, error: null };
429
+ });
430
+ setVersion((v) => v + 1);
193
431
  }, []);
194
432
 
195
- return state;
433
+ return { ...state, refetch };
196
434
  }
197
435
 
198
436
  /**
@@ -42,6 +42,8 @@ import type { ResourceDetailShellProps } from "./types";
42
42
  export function ResourceDetailShell({
43
43
  header,
44
44
  visibilityControl,
45
+ headerMetaExtra,
46
+ headerBanner,
45
47
  primaryAction,
46
48
  actions,
47
49
  tabs,
@@ -55,11 +57,14 @@ export function ResourceDetailShell({
55
57
 
56
58
  return (
57
59
  <div className={cn("flex flex-col gap-6", className)}>
60
+ {headerBanner}
61
+
58
62
  {/* Header + Action bar row */}
59
63
  <div className="flex items-start justify-between gap-4">
60
64
  <Header
61
65
  header={header}
62
66
  visibilityControl={visibilityControl}
67
+ metaExtra={headerMetaExtra}
63
68
  />
64
69
  <ResourceActionBar
65
70
  primaryAction={primaryAction}
@@ -92,14 +97,18 @@ export function ResourceDetailShell({
92
97
  function Header({
93
98
  header,
94
99
  visibilityControl,
100
+ metaExtra,
95
101
  }: {
96
102
  readonly header: ResourceDetailShellProps["header"];
97
103
  readonly visibilityControl?: ResourceDetailShellProps["visibilityControl"];
104
+ readonly metaExtra?: ResourceDetailShellProps["headerMetaExtra"];
98
105
  }) {
99
106
  const {
100
107
  name,
108
+ nameElement,
101
109
  org,
102
110
  slug,
111
+ qualifiedSlug,
103
112
  description,
104
113
  iconUrl,
105
114
  icon,
@@ -109,7 +118,7 @@ function Header({
109
118
  statusLabel,
110
119
  } = header;
111
120
 
112
- const showSlug = slug && slug !== name;
121
+ const showSlug = slug && slug !== name && !qualifiedSlug;
113
122
 
114
123
  return (
115
124
  <div className="flex min-w-0 items-start gap-3">
@@ -124,9 +133,11 @@ function Header({
124
133
  ) : null}
125
134
  <div className="min-w-0 flex-1">
126
135
  <div className="flex items-center gap-2">
127
- <h2 className="truncate text-lg font-semibold text-foreground">
128
- {name}
129
- </h2>
136
+ {nameElement ?? (
137
+ <h2 className="truncate text-lg font-semibold text-foreground">
138
+ {name}
139
+ </h2>
140
+ )}
130
141
  {showSlug && (
131
142
  <code className="shrink-0 rounded bg-muted px-1.5 py-0.5 text-xs font-medium text-muted-foreground">
132
143
  {slug}
@@ -140,8 +151,14 @@ function Header({
140
151
  )}
141
152
  {visibilityControl}
142
153
  </div>
154
+ {qualifiedSlug && (
155
+ <span className="mt-0.5 block truncate font-mono text-xs text-muted-foreground">
156
+ {qualifiedSlug}
157
+ </span>
158
+ )}
143
159
  <div className="mt-0.5 flex flex-wrap items-center gap-x-1.5 text-xs text-muted-foreground">
144
160
  {org && <span>{org}</span>}
161
+ {metaExtra}
145
162
  {createdAt && (
146
163
  <>
147
164
  <Dot />
@@ -84,12 +84,23 @@ export interface DetailAction {
84
84
  export interface ResourceHeaderMeta {
85
85
  /** Display name of the resource. */
86
86
  readonly name: string;
87
+ /**
88
+ * Custom element for the name area. When provided, replaces the
89
+ * default `<h2>` rendering — useful for inline-editable names.
90
+ */
91
+ readonly nameElement?: ReactNode;
87
92
  /** Resource ID (opaque string). */
88
93
  readonly id: string;
89
94
  /** Organization slug that owns the resource. */
90
95
  readonly org?: string;
91
96
  /** URL-friendly slug. */
92
97
  readonly slug?: string;
98
+ /**
99
+ * Qualified path shown as a monospace line below the title
100
+ * (e.g., `"acme/my-server"`). When provided, renders beneath the
101
+ * title row — unlike `slug` which appears as a chip beside the name.
102
+ */
103
+ readonly qualifiedSlug?: string;
93
104
  /** Resource description. */
94
105
  readonly description?: string;
95
106
  /** Optional icon URL (e.g. agent icon). */
@@ -145,6 +156,20 @@ export interface ResourceDetailShellProps {
145
156
  */
146
157
  readonly visibilityControl?: ReactNode;
147
158
 
159
+ /**
160
+ * Additional content rendered in the header's metadata line
161
+ * (between org and timestamps). Use for resource-specific
162
+ * indicators like validation state or discovery timestamps.
163
+ */
164
+ readonly headerMetaExtra?: ReactNode;
165
+
166
+ /**
167
+ * Banner content rendered above the header row.
168
+ * Use for validation warnings or other full-width alerts
169
+ * that should appear before the resource title.
170
+ */
171
+ readonly headerBanner?: ReactNode;
172
+
148
173
  /**
149
174
  * Primary action rendered as a visible button in the header area.
150
175
  * Use for the most common action (e.g. "Edit" for agents).
@@ -6,7 +6,7 @@ import { toError } from "../internal/toError";
6
6
  import { toast } from "../feedback/toast";
7
7
 
8
8
  /** Resource types that support deletion from detail pages. */
9
- export type DeletableResourceKind = "agent" | "skill" | "mcpServer" | "runner";
9
+ export type DeletableResourceKind = "agent" | "skill" | "mcpServer" | "runner" | "workflow";
10
10
 
11
11
  export interface UseDeleteResourceReturn {
12
12
  /**
@@ -74,6 +74,9 @@ export function useDeleteResource(
74
74
  case "runner":
75
75
  await stigmer.runner.delete(resourceId);
76
76
  break;
77
+ case "workflow":
78
+ await stigmer.workflow.delete(resourceId);
79
+ break;
77
80
  }
78
81
  toast.success(
79
82
  resourceName
@@ -106,5 +109,7 @@ function kindLabel(kind: DeletableResourceKind): string {
106
109
  return "MCP server";
107
110
  case "runner":
108
111
  return "runner";
112
+ case "workflow":
113
+ return "workflow";
109
114
  }
110
115
  }
@@ -26,6 +26,7 @@ import { BulkActionBar } from "./BulkActionBar";
26
26
  import { ResourceInspector } from "./ResourceInspector";
27
27
  import { EmptyState } from "../../empty-state";
28
28
  import { ResourceAvatar } from "./ResourceAvatar";
29
+ import { ScopeToggle } from "../../library/ScopeToggle";
29
30
 
30
31
  // ---------------------------------------------------------------------------
31
32
  // Props
@@ -306,6 +307,9 @@ export function ResourceWorkbench<TData = SearchResult>({
306
307
  )}
307
308
  />
308
309
  </div>
310
+ {onScopeChange && (
311
+ <ScopeToggle value={controlledScope} onChange={onScopeChange} />
312
+ )}
309
313
  {viewModes.length > 1 && (
310
314
  <ViewSwitcher
311
315
  value={viewMode}