@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
@@ -6,6 +6,7 @@ import { ConfigureMenu, type ConfigureMenuItem } from "./ConfigureMenu";
6
6
  import { ModelSelector } from "../models/ModelSelector";
7
7
  import { HarnessSelector } from "../models/HarnessSelector";
8
8
  import type { HarnessOption } from "../models/harness";
9
+ import { InteractionModePicker, type InteractionModeOption } from "./InteractionModePicker";
9
10
  import {
10
11
  PaperclipIcon,
11
12
  WorkspaceIcon,
@@ -48,6 +49,12 @@ export interface ComposerToolbarProps {
48
49
  readonly harness?: HarnessOption;
49
50
  readonly onHarnessChange: (harness: HarnessOption) => void;
50
51
 
52
+ // -- Interaction mode picker ------------------------------------------------
53
+
54
+ readonly showInteractionModePicker: boolean;
55
+ readonly interactionMode?: InteractionModeOption;
56
+ readonly onInteractionModeChange: (mode: InteractionModeOption) => void;
57
+
51
58
  // -- Model selector -------------------------------------------------------
52
59
 
53
60
  readonly showModelSelector: boolean;
@@ -89,6 +96,9 @@ export function ComposerToolbar({
89
96
  showHarnessSelector,
90
97
  harness,
91
98
  onHarnessChange,
99
+ showInteractionModePicker,
100
+ interactionMode,
101
+ onInteractionModeChange,
92
102
  showModelSelector,
93
103
  modelId,
94
104
  onModelChange,
@@ -96,7 +106,7 @@ export function ComposerToolbar({
96
106
  const hasTier1 = showAttach || showWorkspace;
97
107
  const hasTier2 = configureItems.length > 0;
98
108
  const showHarnessSeparate = showHarnessSelector && !showModelSelector;
99
- const hasExecParams = showHarnessSeparate || showModelSelector;
109
+ const hasExecParams = showHarnessSeparate || showInteractionModePicker || showModelSelector;
100
110
 
101
111
  return (
102
112
  <div className="flex items-center justify-between gap-2 border-t border-border-muted px-3 py-2">
@@ -169,6 +179,14 @@ export function ComposerToolbar({
169
179
  />
170
180
  )}
171
181
 
182
+ {showInteractionModePicker && (
183
+ <InteractionModePicker
184
+ value={interactionMode ?? "agent"}
185
+ onValueChange={onInteractionModeChange}
186
+ disabled={disabled}
187
+ />
188
+ )}
189
+
172
190
  {showModelSelector && (
173
191
  <ModelSelector
174
192
  value={modelId}
@@ -0,0 +1,189 @@
1
+ "use client";
2
+
3
+ import { useCallback, useState } from "react";
4
+ import { Popover } from "@base-ui/react/popover";
5
+ import { cn } from "@stigmer/theme";
6
+ import { useStigmerPortalContainer } from "../portal-container";
7
+
8
+ /**
9
+ * Interaction mode options for agent executions.
10
+ *
11
+ * Maps to `InteractionMode` proto enum values (excluding UNSPECIFIED):
12
+ * - `"agent"` → `INTERACTION_MODE_AGENT` (full tool access)
13
+ * - `"plan"` → `INTERACTION_MODE_PLAN` (read-only analysis)
14
+ */
15
+ export type InteractionModeOption = "agent" | "plan";
16
+
17
+ const OPTIONS: readonly InteractionModeOption[] = ["agent", "plan"];
18
+
19
+ const MODE_META: Record<
20
+ InteractionModeOption,
21
+ { label: string; description: string }
22
+ > = {
23
+ agent: {
24
+ label: "Agent",
25
+ description: "Full tool access — read, write, and execute",
26
+ },
27
+ plan: {
28
+ label: "Plan",
29
+ description: "Read-only analysis — search and reason only",
30
+ },
31
+ };
32
+
33
+ /** Props for {@link InteractionModePicker}. */
34
+ export interface InteractionModePickerProps {
35
+ /** Currently selected interaction mode. */
36
+ readonly value: InteractionModeOption;
37
+ /** Called when the user picks a different mode. */
38
+ readonly onValueChange: (mode: InteractionModeOption) => void;
39
+ /** Additional CSS class names for the trigger button. */
40
+ readonly className?: string;
41
+ /** When true, disables the picker. */
42
+ readonly disabled?: boolean;
43
+ }
44
+
45
+ /**
46
+ * Compact dropdown for choosing the execution interaction mode.
47
+ *
48
+ * Renders a trigger button showing the current mode label with a
49
+ * chevron, and a popover with the available options. Each option
50
+ * shows a label and a short description.
51
+ *
52
+ * Designed to scale to additional modes (e.g. Ask) without layout
53
+ * changes. Uses `@base-ui/react` Popover for positioning and portal
54
+ * rendering, matching the pattern used by {@link ModelSelector}.
55
+ *
56
+ * @example
57
+ * ```tsx
58
+ * function ComposerToolbar() {
59
+ * const [mode, setMode] = useState<InteractionModeOption>("agent");
60
+ * return <InteractionModePicker value={mode} onValueChange={setMode} />;
61
+ * }
62
+ * ```
63
+ */
64
+ export function InteractionModePicker({
65
+ value,
66
+ onValueChange,
67
+ className,
68
+ disabled,
69
+ }: InteractionModePickerProps) {
70
+ const portalContainer = useStigmerPortalContainer();
71
+ const [open, setOpen] = useState(false);
72
+
73
+ const select = useCallback(
74
+ (mode: InteractionModeOption) => {
75
+ onValueChange(mode);
76
+ setOpen(false);
77
+ },
78
+ [onValueChange],
79
+ );
80
+
81
+ const handleKeyDown = useCallback(
82
+ (e: React.KeyboardEvent) => {
83
+ const idx = OPTIONS.indexOf(value);
84
+ let next: number | undefined;
85
+
86
+ switch (e.key) {
87
+ case "ArrowDown":
88
+ e.preventDefault();
89
+ next = idx < OPTIONS.length - 1 ? idx + 1 : 0;
90
+ break;
91
+ case "ArrowUp":
92
+ e.preventDefault();
93
+ next = idx > 0 ? idx - 1 : OPTIONS.length - 1;
94
+ break;
95
+ case "Escape":
96
+ e.preventDefault();
97
+ setOpen(false);
98
+ return;
99
+ }
100
+
101
+ if (next !== undefined) {
102
+ select(OPTIONS[next]);
103
+ }
104
+ },
105
+ [value, select],
106
+ );
107
+
108
+ return (
109
+ <Popover.Root open={open} onOpenChange={setOpen}>
110
+ <Popover.Trigger
111
+ disabled={disabled}
112
+ className={cn(
113
+ "inline-flex items-center gap-1 rounded-md px-2 py-1.5 text-xs transition-colors",
114
+ "text-muted-foreground hover:text-foreground hover:bg-accent-hover",
115
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
116
+ "disabled:pointer-events-none disabled:opacity-50",
117
+ className,
118
+ )}
119
+ >
120
+ <span className="font-medium text-foreground">
121
+ {MODE_META[value].label}
122
+ </span>
123
+ <ChevronIcon />
124
+ </Popover.Trigger>
125
+
126
+ <Popover.Portal container={portalContainer}>
127
+ <Popover.Positioner sideOffset={4}>
128
+ <Popover.Popup
129
+ role="listbox"
130
+ aria-label="Interaction mode"
131
+ onKeyDown={handleKeyDown}
132
+ className={cn(
133
+ "z-50 w-56 rounded-lg border border-border bg-popover p-1 shadow-md",
134
+ "animate-in fade-in-0 zoom-in-95",
135
+ )}
136
+ >
137
+ {OPTIONS.map((option) => {
138
+ const meta = MODE_META[option];
139
+ const isActive = value === option;
140
+
141
+ return (
142
+ <button
143
+ key={option}
144
+ type="button"
145
+ role="option"
146
+ aria-selected={isActive}
147
+ onClick={() => select(option)}
148
+ className={cn(
149
+ "flex w-full flex-col gap-0.5 rounded-md px-2.5 py-2 text-left transition-colors",
150
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
151
+ isActive
152
+ ? "bg-accent text-foreground"
153
+ : "text-foreground hover:bg-accent-hover",
154
+ )}
155
+ >
156
+ <span className="text-xs font-medium">{meta.label}</span>
157
+ <span className="text-[0.65rem] leading-snug text-muted-foreground">
158
+ {meta.description}
159
+ </span>
160
+ </button>
161
+ );
162
+ })}
163
+ </Popover.Popup>
164
+ </Popover.Positioner>
165
+ </Popover.Portal>
166
+ </Popover.Root>
167
+ );
168
+ }
169
+
170
+ function ChevronIcon() {
171
+ return (
172
+ <svg
173
+ width="12"
174
+ height="12"
175
+ viewBox="0 0 12 12"
176
+ fill="none"
177
+ className="shrink-0 text-muted-foreground"
178
+ aria-hidden="true"
179
+ >
180
+ <path
181
+ d="M3 4.5L6 7.5L9 4.5"
182
+ stroke="currentColor"
183
+ strokeWidth="1.5"
184
+ strokeLinecap="round"
185
+ strokeLinejoin="round"
186
+ />
187
+ </svg>
188
+ );
189
+ }
@@ -1,12 +1,13 @@
1
1
  "use client";
2
2
 
3
- import { memo, useCallback, useEffect, useMemo, useRef, useState, type DragEvent, type KeyboardEvent } from "react";
3
+ import { forwardRef, memo, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState, type DragEvent, type KeyboardEvent } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
5
  import { getUserMessage, type AttachmentInput, type EnvVarInput, type McpServerUsageInput, type ResourceRef } from "@stigmer/sdk";
6
6
  import { useComposer } from "./useComposer";
7
7
  import { ComposerToolbar } from "./ComposerToolbar";
8
8
  import { type ConfigureMenuItem } from "./ConfigureMenu";
9
9
  import type { HarnessOption } from "../models/harness";
10
+ import type { InteractionModeOption } from "./InteractionModePicker";
10
11
  import { parseModelKey } from "../models/registry";
11
12
  import { ContextChip, type ChipItem } from "./ContextChip";
12
13
  import { WorkspaceEditor } from "../workspace/WorkspaceEditor";
@@ -51,6 +52,33 @@ import {
51
52
  ResolveSpinner,
52
53
  } from "./icons";
53
54
 
55
+ /**
56
+ * Imperative handle exposed by {@link SessionComposer} via `ref`.
57
+ *
58
+ * Allows parent components to programmatically set the composer's
59
+ * message text and focus the textarea. Used for features like
60
+ * "Build from Plan" where a CTA outside the composer needs to
61
+ * pre-fill and focus the input.
62
+ *
63
+ * @example
64
+ * ```tsx
65
+ * const composerRef = useRef<SessionComposerHandle>(null);
66
+ *
67
+ * function handleBuildFromPlan() {
68
+ * composerRef.current?.setMessage("Implement the plan above");
69
+ * composerRef.current?.focus();
70
+ * }
71
+ *
72
+ * <SessionComposer ref={composerRef} onSubmit={handleSubmit} />
73
+ * ```
74
+ */
75
+ export interface SessionComposerHandle {
76
+ /** Replace the composer's message text. */
77
+ setMessage(message: string): void;
78
+ /** Focus the composer's textarea. */
79
+ focus(): void;
80
+ }
81
+
54
82
  /**
55
83
  * Context provided to `onSubmit` at the moment of submission.
56
84
  *
@@ -83,6 +111,16 @@ export interface SessionComposerSubmitContext {
83
111
  * `undefined` when no files were attached.
84
112
  */
85
113
  readonly attachments?: AttachmentInput[];
114
+ /**
115
+ * Interaction mode selected by the user for this execution.
116
+ *
117
+ * - `"agent"` (default): full tool access — read, write, create, delete.
118
+ * - `"plan"`: read-only analysis — read, search, list only.
119
+ *
120
+ * `undefined` when no mode picker is shown (defaults to `"agent"`).
121
+ * Pass to execution creation as `execution_config.interaction_mode`.
122
+ */
123
+ readonly interactionMode?: InteractionModeOption;
86
124
  }
87
125
 
88
126
  /** Props for {@link SessionComposer}. */
@@ -120,6 +158,22 @@ export interface SessionComposerProps {
120
158
  /** Show the harness selector in the toolbar. @default false */
121
159
  readonly showHarnessSelector?: boolean;
122
160
 
161
+ /**
162
+ * Currently selected interaction mode.
163
+ *
164
+ * When `onInteractionModeChange` is provided, renders a mode picker
165
+ * in the toolbar. Defaults to `"agent"` when omitted.
166
+ */
167
+ readonly interactionMode?: InteractionModeOption;
168
+ /**
169
+ * Called when the user switches the interaction mode.
170
+ *
171
+ * Providing this callback enables the mode picker in the toolbar.
172
+ */
173
+ readonly onInteractionModeChange?: (mode: InteractionModeOption) => void;
174
+ /** Show the interaction mode picker in the toolbar. @default false */
175
+ readonly showInteractionModePicker?: boolean;
176
+
123
177
  /** Initial model ID for the model selector. */
124
178
  readonly defaultModelId?: string;
125
179
  /** Called when the user changes the selected model. */
@@ -384,13 +438,16 @@ export interface SessionComposerProps {
384
438
  * />
385
439
  * ```
386
440
  */
387
- export const SessionComposer = memo(function SessionComposer({
441
+ const SessionComposerInner = forwardRef<SessionComposerHandle, SessionComposerProps>(function SessionComposer({
388
442
  onSubmit,
389
443
  isSubmitting = false,
390
444
  disabled = false,
391
445
  harness,
392
446
  onHarnessChange,
393
447
  showHarnessSelector = false,
448
+ interactionMode,
449
+ onInteractionModeChange,
450
+ showInteractionModePicker = false,
394
451
  defaultModelId,
395
452
  onModelChange,
396
453
  showModelSelector = true,
@@ -420,7 +477,7 @@ export const SessionComposer = memo(function SessionComposer({
420
477
  autoFocus = false,
421
478
  ariaLabel = "Send message",
422
479
  className,
423
- }: SessionComposerProps) {
480
+ }, ref) {
424
481
  useRenderTracer("SessionComposer", { disabled, isSubmitting });
425
482
 
426
483
  const [modelId, setModelIdRaw] = useState<string | undefined>(defaultModelId);
@@ -655,12 +712,17 @@ export const SessionComposer = memo(function SessionComposer({
655
712
  const hasEnv = Object.keys(env).length > 0;
656
713
  const hasAttachments =
657
714
  attachmentInputs !== undefined && attachmentInputs.length > 0;
715
+ const effectiveMode =
716
+ showInteractionModePicker && interactionMode
717
+ ? interactionMode
718
+ : undefined;
658
719
 
659
720
  const context: SessionComposerSubmitContext | undefined =
660
- hasEnv || hasAttachments
721
+ hasEnv || hasAttachments || effectiveMode
661
722
  ? {
662
723
  runtimeEnv: hasEnv ? env : undefined,
663
724
  attachments: hasAttachments ? attachmentInputs : undefined,
725
+ interactionMode: effectiveMode,
664
726
  }
665
727
  : undefined;
666
728
 
@@ -673,7 +735,7 @@ export const SessionComposer = memo(function SessionComposer({
673
735
  attachments.clear();
674
736
  }
675
737
  },
676
- [onSubmit, modelId, stigmer, agentSetup.state, mcpSetup.pendingRuntimeEnv, sessionVariables, enableAttachments, attachments, personalEnv],
738
+ [onSubmit, modelId, stigmer, agentSetup.state, mcpSetup.pendingRuntimeEnv, sessionVariables, enableAttachments, attachments, personalEnv, showInteractionModePicker, interactionMode],
677
739
  );
678
740
 
679
741
  const composer = useComposer({
@@ -681,6 +743,11 @@ export const SessionComposer = memo(function SessionComposer({
681
743
  disabled: isDisabled,
682
744
  });
683
745
 
746
+ useImperativeHandle(ref, () => ({
747
+ setMessage: composer.setMessage,
748
+ focus: () => composer.textareaRef.current?.focus(),
749
+ }), [composer.setMessage, composer.textareaRef]);
750
+
684
751
  const handleModelChange = useCallback(
685
752
  (id: string) => {
686
753
  setModelId(id);
@@ -696,6 +763,13 @@ export const SessionComposer = memo(function SessionComposer({
696
763
  [onHarnessChange],
697
764
  );
698
765
 
766
+ const handleInteractionModeChange = useCallback(
767
+ (mode: InteractionModeOption) => {
768
+ onInteractionModeChange?.(mode);
769
+ },
770
+ [onInteractionModeChange],
771
+ );
772
+
699
773
  const handleDisplayNameResolved = useCallback(
700
774
  (key: string, name: string) => {
701
775
  setDisplayNames((prev) => {
@@ -1197,7 +1271,6 @@ export const SessionComposer = memo(function SessionComposer({
1197
1271
  <div className="relative">
1198
1272
  <AgentPicker
1199
1273
  org={org!}
1200
- scope="all"
1201
1274
  value={agentRef ?? null}
1202
1275
  onChange={handleAgentSelect}
1203
1276
  onDisplayNameResolved={handleDisplayNameResolved}
@@ -1218,7 +1291,6 @@ export const SessionComposer = memo(function SessionComposer({
1218
1291
  return (
1219
1292
  <McpServerPicker
1220
1293
  org={org!}
1221
- scope="all"
1222
1294
  setup={{
1223
1295
  entries: mcpSetup.entries,
1224
1296
  onServerAdded: (ref) => mcpSetup.addServer(ref),
@@ -1241,7 +1313,6 @@ export const SessionComposer = memo(function SessionComposer({
1241
1313
  return (
1242
1314
  <SkillPicker
1243
1315
  org={org!}
1244
- scope="all"
1245
1316
  value={skillRefs ?? []}
1246
1317
  onChange={onSkillRefsChange!}
1247
1318
  onDisplayNameResolved={handleDisplayNameResolved}
@@ -1478,6 +1549,9 @@ export const SessionComposer = memo(function SessionComposer({
1478
1549
  showHarnessSelector={showHarnessSelector}
1479
1550
  harness={harness}
1480
1551
  onHarnessChange={handleHarnessChange}
1552
+ showInteractionModePicker={showInteractionModePicker}
1553
+ interactionMode={interactionMode}
1554
+ onInteractionModeChange={handleInteractionModeChange}
1481
1555
  showModelSelector={showModelSelector}
1482
1556
  modelId={modelId}
1483
1557
  onModelChange={handleModelChange}
@@ -1487,6 +1561,9 @@ export const SessionComposer = memo(function SessionComposer({
1487
1561
  );
1488
1562
  });
1489
1563
 
1564
+ export const SessionComposer = memo(SessionComposerInner);
1565
+
1566
+
1490
1567
  // ---------------------------------------------------------------------------
1491
1568
  // Agent setup error — secret-flow guidance or generic fallback
1492
1569
  // ---------------------------------------------------------------------------
@@ -5,15 +5,20 @@ describe("SessionComposer — memo isolation", () => {
5
5
  it("is wrapped in React.memo (shallow prop comparison)", () => {
6
6
  // React.memo returns an exotic component with $$typeof set to
7
7
  // Symbol.for("react.memo") and a `type` field pointing at the
8
- // inner function. Regular function components have neither.
8
+ // inner component. For forwardRef components the inner type is an
9
+ // object (the forwardRef exotic), not a plain function.
9
10
  const memoSymbol = Symbol.for("react.memo");
10
- const typed = SessionComposer as unknown as { $$typeof: symbol; type: Function; compare: unknown };
11
+ const typed = SessionComposer as unknown as { $$typeof: symbol; type: unknown; compare: unknown };
11
12
 
12
13
  expect(typed.$$typeof).toBe(memoSymbol);
13
- expect(typeof typed.type).toBe("function");
14
- // The transform may rename the inner function to avoid shadowing
15
- // the outer `const SessionComposer` binding (e.g. "SessionComposer2").
16
- expect(typed.type.name).toMatch(/^SessionComposer/);
14
+ expect(typed.type).toBeTruthy();
15
+
16
+ const innerType = typed.type as { $$typeof?: symbol; render?: Function };
17
+ if (typeof typed.type === "function") {
18
+ expect((typed.type as Function).name).toMatch(/^SessionComposer/);
19
+ } else {
20
+ expect(innerType.$$typeof).toBe(Symbol.for("react.forward_ref"));
21
+ }
17
22
  });
18
23
 
19
24
  it("uses default shallow comparison (no custom areEqual)", () => {
@@ -3,6 +3,13 @@ export type { UseComposerOptions, UseComposerReturn } from "./useComposer";
3
3
 
4
4
  export { SessionComposer } from "./SessionComposer";
5
5
  export type {
6
+ SessionComposerHandle,
6
7
  SessionComposerProps,
7
8
  SessionComposerSubmitContext,
8
9
  } from "./SessionComposer";
10
+
11
+ export { InteractionModePicker } from "./InteractionModePicker";
12
+ export type {
13
+ InteractionModePickerProps,
14
+ InteractionModeOption,
15
+ } from "./InteractionModePicker";
@@ -0,0 +1,109 @@
1
+ "use client";
2
+
3
+ import { memo } from "react";
4
+ import { cn } from "@stigmer/theme";
5
+ import type { DashboardFailedRun } from "./types";
6
+
7
+ export interface DashboardFailedRunsProps {
8
+ readonly failedRuns: readonly DashboardFailedRun[];
9
+ readonly isLoading: boolean;
10
+ /** Called when the user clicks "View" on a failed run. */
11
+ readonly onViewClick?: (id: string, type: DashboardFailedRun["type"]) => void;
12
+ readonly className?: string;
13
+ }
14
+
15
+ function timeAgo(date: Date): string {
16
+ const seconds = Math.floor((Date.now() - date.getTime()) / 1000);
17
+ if (seconds < 60) return "just now";
18
+ const minutes = Math.floor(seconds / 60);
19
+ if (minutes < 60) return `${minutes}m ago`;
20
+ const hours = Math.floor(minutes / 60);
21
+ if (hours < 24) return `${hours}h ago`;
22
+ const days = Math.floor(hours / 24);
23
+ return `${days}d ago`;
24
+ }
25
+
26
+ /**
27
+ * Widget showing recent failed executions from both agent and workflow
28
+ * domains, interleaved by timestamp.
29
+ *
30
+ * Each row includes a type badge (Agent / Workflow), the execution name,
31
+ * a truncated error, and a relative timestamp.
32
+ *
33
+ * @since Unified Platform Dashboard
34
+ */
35
+ export const DashboardFailedRuns = memo(function DashboardFailedRuns({
36
+ failedRuns,
37
+ isLoading,
38
+ onViewClick,
39
+ className,
40
+ }: DashboardFailedRunsProps) {
41
+ if (isLoading) {
42
+ return (
43
+ <div
44
+ className={cn("rounded-lg border border-border bg-card p-4", className)}
45
+ aria-busy="true"
46
+ >
47
+ <div className="mb-3 h-4 w-32 animate-pulse rounded bg-muted" />
48
+ <div className="space-y-2">
49
+ {Array.from({ length: 3 }, (_, i) => (
50
+ <div key={i} className="h-10 animate-pulse rounded bg-muted/50" />
51
+ ))}
52
+ </div>
53
+ </div>
54
+ );
55
+ }
56
+
57
+ return (
58
+ <div className={cn("rounded-lg border border-border bg-card p-4", className)}>
59
+ <h3 className="mb-3 text-sm font-semibold text-foreground">
60
+ Recent Failures
61
+ </h3>
62
+ {failedRuns.length === 0 ? (
63
+ <p className="py-6 text-center text-xs text-muted-foreground">
64
+ No recent failures
65
+ </p>
66
+ ) : (
67
+ <ul className="space-y-1.5" role="list">
68
+ {failedRuns.map((run) => (
69
+ <li
70
+ key={run.id}
71
+ className="flex items-start gap-2 rounded-md px-2 py-1.5 text-xs hover:bg-muted/50"
72
+ >
73
+ <span
74
+ className={cn(
75
+ "mt-0.5 shrink-0 rounded px-1 py-0.5 text-[10px] font-medium leading-none",
76
+ run.type === "agent_execution"
77
+ ? "bg-primary/10 text-primary"
78
+ : "bg-muted text-muted-foreground",
79
+ )}
80
+ >
81
+ {run.type === "agent_execution" ? "Agent" : "Workflow"}
82
+ </span>
83
+ <div className="min-w-0 flex-1">
84
+ <p className="truncate font-medium text-foreground">
85
+ {run.name}
86
+ </p>
87
+ {run.error && (
88
+ <p className="truncate text-muted-foreground">{run.error}</p>
89
+ )}
90
+ </div>
91
+ <span className="shrink-0 text-muted-foreground">
92
+ {timeAgo(run.failedAt)}
93
+ </span>
94
+ {onViewClick && (
95
+ <button
96
+ type="button"
97
+ onClick={() => onViewClick(run.id, run.type)}
98
+ className="shrink-0 text-primary hover:underline"
99
+ >
100
+ View
101
+ </button>
102
+ )}
103
+ </li>
104
+ ))}
105
+ </ul>
106
+ )}
107
+ </div>
108
+ );
109
+ });