@stigmer/react 3.1.16 → 3.2.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 (824) hide show
  1. package/README.md +16 -1
  2. package/agent-instance/AgentInstanceList.d.ts.map +1 -1
  3. package/agent-instance/AgentInstanceList.js +11 -3
  4. package/agent-instance/AgentInstanceList.js.map +1 -1
  5. package/channel/AgentChannelsPanel.d.ts +60 -0
  6. package/channel/AgentChannelsPanel.d.ts.map +1 -0
  7. package/channel/AgentChannelsPanel.js +255 -0
  8. package/channel/AgentChannelsPanel.js.map +1 -0
  9. package/channel/ChannelConversationsDialog.d.ts +41 -0
  10. package/channel/ChannelConversationsDialog.d.ts.map +1 -0
  11. package/channel/ChannelConversationsDialog.js +94 -0
  12. package/channel/ChannelConversationsDialog.js.map +1 -0
  13. package/channel/ChannelCredentialsDialog.d.ts +37 -0
  14. package/channel/ChannelCredentialsDialog.d.ts.map +1 -0
  15. package/channel/ChannelCredentialsDialog.js +75 -0
  16. package/channel/ChannelCredentialsDialog.js.map +1 -0
  17. package/channel/ChannelToolCredentials.d.ts +31 -0
  18. package/channel/ChannelToolCredentials.d.ts.map +1 -0
  19. package/channel/ChannelToolCredentials.js +41 -0
  20. package/channel/ChannelToolCredentials.js.map +1 -0
  21. package/channel/ConnectSlackDialog.d.ts +61 -0
  22. package/channel/ConnectSlackDialog.d.ts.map +1 -0
  23. package/channel/ConnectSlackDialog.js +238 -0
  24. package/channel/ConnectSlackDialog.js.map +1 -0
  25. package/channel/ConnectWhatsAppDialog.d.ts +70 -0
  26. package/channel/ConnectWhatsAppDialog.d.ts.map +1 -0
  27. package/channel/ConnectWhatsAppDialog.js +256 -0
  28. package/channel/ConnectWhatsAppDialog.js.map +1 -0
  29. package/channel/SlackMarkIcon.d.ts +11 -0
  30. package/channel/SlackMarkIcon.d.ts.map +1 -0
  31. package/channel/SlackMarkIcon.js +13 -0
  32. package/channel/SlackMarkIcon.js.map +1 -0
  33. package/channel/WhatsAppMarkIcon.d.ts +12 -0
  34. package/channel/WhatsAppMarkIcon.d.ts.map +1 -0
  35. package/channel/WhatsAppMarkIcon.js +14 -0
  36. package/channel/WhatsAppMarkIcon.js.map +1 -0
  37. package/channel/connect/ServingAppSection.d.ts +57 -0
  38. package/channel/connect/ServingAppSection.d.ts.map +1 -0
  39. package/channel/connect/ServingAppSection.js +49 -0
  40. package/channel/connect/ServingAppSection.js.map +1 -0
  41. package/channel/connect/ToolCredentialsSection.d.ts +20 -0
  42. package/channel/connect/ToolCredentialsSection.d.ts.map +1 -0
  43. package/channel/connect/ToolCredentialsSection.js +22 -0
  44. package/channel/connect/ToolCredentialsSection.js.map +1 -0
  45. package/channel/connect/VerbatimRefusal.d.ts +16 -0
  46. package/channel/connect/VerbatimRefusal.d.ts.map +1 -0
  47. package/channel/connect/VerbatimRefusal.js +18 -0
  48. package/channel/connect/VerbatimRefusal.js.map +1 -0
  49. package/channel/connect/icons.d.ts +16 -0
  50. package/channel/connect/icons.d.ts.map +1 -0
  51. package/channel/connect/icons.js +21 -0
  52. package/channel/connect/icons.js.map +1 -0
  53. package/channel/index.d.ts +36 -0
  54. package/channel/index.d.ts.map +1 -0
  55. package/channel/index.js +19 -0
  56. package/channel/index.js.map +1 -0
  57. package/channel/providerPresentation.d.ts +44 -0
  58. package/channel/providerPresentation.d.ts.map +1 -0
  59. package/channel/providerPresentation.js +106 -0
  60. package/channel/providerPresentation.js.map +1 -0
  61. package/channel/providers.d.ts +62 -0
  62. package/channel/providers.d.ts.map +1 -0
  63. package/channel/providers.js +26 -0
  64. package/channel/providers.js.map +1 -0
  65. package/channel/useAgentChannel.d.ts +31 -0
  66. package/channel/useAgentChannel.d.ts.map +1 -0
  67. package/channel/useAgentChannel.js +34 -0
  68. package/channel/useAgentChannel.js.map +1 -0
  69. package/channel/useAgentChannelList.d.ts +43 -0
  70. package/channel/useAgentChannelList.d.ts.map +1 -0
  71. package/channel/useAgentChannelList.js +39 -0
  72. package/channel/useAgentChannelList.js.map +1 -0
  73. package/channel/useChannelSessions.d.ts +47 -0
  74. package/channel/useChannelSessions.d.ts.map +1 -0
  75. package/channel/useChannelSessions.js +38 -0
  76. package/channel/useChannelSessions.js.map +1 -0
  77. package/channel/useChannelToolReadiness.d.ts +23 -0
  78. package/channel/useChannelToolReadiness.d.ts.map +1 -0
  79. package/channel/useChannelToolReadiness.js +28 -0
  80. package/channel/useChannelToolReadiness.js.map +1 -0
  81. package/channel/useConnectSlackChannel.d.ts +75 -0
  82. package/channel/useConnectSlackChannel.d.ts.map +1 -0
  83. package/channel/useConnectSlackChannel.js +115 -0
  84. package/channel/useConnectSlackChannel.js.map +1 -0
  85. package/channel/useCreateAgentChannel.d.ts +42 -0
  86. package/channel/useCreateAgentChannel.d.ts.map +1 -0
  87. package/channel/useCreateAgentChannel.js +48 -0
  88. package/channel/useCreateAgentChannel.js.map +1 -0
  89. package/channel/useDeleteAgentChannel.d.ts +40 -0
  90. package/channel/useDeleteAgentChannel.d.ts.map +1 -0
  91. package/channel/useDeleteAgentChannel.js +44 -0
  92. package/channel/useDeleteAgentChannel.js.map +1 -0
  93. package/channel/useInstallChannel.d.ts +60 -0
  94. package/channel/useInstallChannel.d.ts.map +1 -0
  95. package/channel/useInstallChannel.js +63 -0
  96. package/channel/useInstallChannel.js.map +1 -0
  97. package/channel/useOrgAgentChannelList.d.ts +32 -0
  98. package/channel/useOrgAgentChannelList.d.ts.map +1 -0
  99. package/channel/useOrgAgentChannelList.js +29 -0
  100. package/channel/useOrgAgentChannelList.js.map +1 -0
  101. package/channel/useSaveAgentChannel.d.ts +63 -0
  102. package/channel/useSaveAgentChannel.d.ts.map +1 -0
  103. package/channel/useSaveAgentChannel.js +104 -0
  104. package/channel/useSaveAgentChannel.js.map +1 -0
  105. package/channel-app/ChannelAppDetailPanel.d.ts +46 -0
  106. package/channel-app/ChannelAppDetailPanel.d.ts.map +1 -0
  107. package/channel-app/ChannelAppDetailPanel.js +142 -0
  108. package/channel-app/ChannelAppDetailPanel.js.map +1 -0
  109. package/channel-app/ChannelAppListPanel.d.ts +36 -0
  110. package/channel-app/ChannelAppListPanel.d.ts.map +1 -0
  111. package/channel-app/ChannelAppListPanel.js +63 -0
  112. package/channel-app/ChannelAppListPanel.js.map +1 -0
  113. package/channel-app/CreateChannelAppForm.d.ts +54 -0
  114. package/channel-app/CreateChannelAppForm.d.ts.map +1 -0
  115. package/channel-app/CreateChannelAppForm.js +140 -0
  116. package/channel-app/CreateChannelAppForm.js.map +1 -0
  117. package/channel-app/index.d.ts +18 -0
  118. package/channel-app/index.d.ts.map +1 -0
  119. package/channel-app/index.js +10 -0
  120. package/channel-app/index.js.map +1 -0
  121. package/channel-app/internal.d.ts +33 -0
  122. package/channel-app/internal.d.ts.map +1 -0
  123. package/channel-app/internal.js +44 -0
  124. package/channel-app/internal.js.map +1 -0
  125. package/channel-app/slackAppSetup.d.ts +80 -0
  126. package/channel-app/slackAppSetup.d.ts.map +1 -0
  127. package/channel-app/slackAppSetup.js +123 -0
  128. package/channel-app/slackAppSetup.js.map +1 -0
  129. package/channel-app/useChannelAppList.d.ts +35 -0
  130. package/channel-app/useChannelAppList.d.ts.map +1 -0
  131. package/channel-app/useChannelAppList.js +34 -0
  132. package/channel-app/useChannelAppList.js.map +1 -0
  133. package/channel-app/useCreateChannelApp.d.ts +39 -0
  134. package/channel-app/useCreateChannelApp.d.ts.map +1 -0
  135. package/channel-app/useCreateChannelApp.js +50 -0
  136. package/channel-app/useCreateChannelApp.js.map +1 -0
  137. package/channel-app/useDeleteChannelApp.d.ts +31 -0
  138. package/channel-app/useDeleteChannelApp.d.ts.map +1 -0
  139. package/channel-app/useDeleteChannelApp.js +43 -0
  140. package/channel-app/useDeleteChannelApp.js.map +1 -0
  141. package/channel-app/useUpdateChannelApp.d.ts +39 -0
  142. package/channel-app/useUpdateChannelApp.d.ts.map +1 -0
  143. package/channel-app/useUpdateChannelApp.js +50 -0
  144. package/channel-app/useUpdateChannelApp.js.map +1 -0
  145. package/channel-app/whatsappAppSetup.d.ts +51 -0
  146. package/channel-app/whatsappAppSetup.d.ts.map +1 -0
  147. package/channel-app/whatsappAppSetup.js +57 -0
  148. package/channel-app/whatsappAppSetup.js.map +1 -0
  149. package/environment/index.d.ts +2 -0
  150. package/environment/index.d.ts.map +1 -1
  151. package/environment/index.js +1 -0
  152. package/environment/index.js.map +1 -1
  153. package/environment/useToolCredentialsReadiness.d.ts +52 -0
  154. package/environment/useToolCredentialsReadiness.d.ts.map +1 -0
  155. package/environment/useToolCredentialsReadiness.js +84 -0
  156. package/environment/useToolCredentialsReadiness.js.map +1 -0
  157. package/execution/ArtifactContentBody.d.ts.map +1 -1
  158. package/execution/ArtifactContentBody.js +5 -21
  159. package/execution/ArtifactContentBody.js.map +1 -1
  160. package/execution/ArtifactFileContent.d.ts +28 -0
  161. package/execution/ArtifactFileContent.d.ts.map +1 -0
  162. package/execution/ArtifactFileContent.js +36 -0
  163. package/execution/ArtifactFileContent.js.map +1 -0
  164. package/execution/ArtifactRow.d.ts +8 -20
  165. package/execution/ArtifactRow.d.ts.map +1 -1
  166. package/execution/ArtifactRow.js +12 -45
  167. package/execution/ArtifactRow.js.map +1 -1
  168. package/execution/ArtifactRowView.d.ts +43 -0
  169. package/execution/ArtifactRowView.d.ts.map +1 -0
  170. package/execution/ArtifactRowView.js +35 -0
  171. package/execution/ArtifactRowView.js.map +1 -0
  172. package/execution/FileChangesView.d.ts.map +1 -1
  173. package/execution/FileChangesView.js +1 -61
  174. package/execution/FileChangesView.js.map +1 -1
  175. package/execution/SubAgentSection.d.ts.map +1 -1
  176. package/execution/SubAgentSection.js +4 -15
  177. package/execution/SubAgentSection.js.map +1 -1
  178. package/execution/ToolCallItem.d.ts.map +1 -1
  179. package/execution/ToolCallItem.js +16 -61
  180. package/execution/ToolCallItem.js.map +1 -1
  181. package/execution/agent-execution-document.d.ts +31 -0
  182. package/execution/agent-execution-document.d.ts.map +1 -0
  183. package/execution/agent-execution-document.js +48 -0
  184. package/execution/agent-execution-document.js.map +1 -0
  185. package/{session → execution}/artifact-document.d.ts +2 -3
  186. package/execution/artifact-document.d.ts.map +1 -0
  187. package/execution/artifact-document.js +23 -0
  188. package/execution/artifact-document.js.map +1 -0
  189. package/execution/artifact-row-item.d.ts +56 -0
  190. package/execution/artifact-row-item.d.ts.map +1 -0
  191. package/execution/artifact-row-item.js +57 -0
  192. package/execution/artifact-row-item.js.map +1 -0
  193. package/execution/deriveExecutionFileChanges.d.ts +55 -0
  194. package/execution/deriveExecutionFileChanges.d.ts.map +1 -0
  195. package/execution/deriveExecutionFileChanges.js +216 -0
  196. package/execution/deriveExecutionFileChanges.js.map +1 -0
  197. package/execution/file-change-document.d.ts +22 -0
  198. package/execution/file-change-document.d.ts.map +1 -0
  199. package/execution/file-change-document.js +34 -0
  200. package/execution/file-change-document.js.map +1 -0
  201. package/execution/index.d.ts +14 -0
  202. package/execution/index.d.ts.map +1 -1
  203. package/execution/index.js +9 -0
  204. package/execution/index.js.map +1 -1
  205. package/execution/useArtifactContentById.d.ts +61 -0
  206. package/execution/useArtifactContentById.d.ts.map +1 -0
  207. package/execution/useArtifactContentById.js +63 -0
  208. package/execution/useArtifactContentById.js.map +1 -0
  209. package/execution/useArtifactDownload.d.ts +4 -3
  210. package/execution/useArtifactDownload.d.ts.map +1 -1
  211. package/execution/useArtifactDownload.js +4 -3
  212. package/execution/useArtifactDownload.js.map +1 -1
  213. package/execution/useCreateAgentExecution.d.ts +1 -1
  214. package/execution/useLiveAgentExecution.d.ts +59 -0
  215. package/execution/useLiveAgentExecution.d.ts.map +1 -0
  216. package/execution/useLiveAgentExecution.js +73 -0
  217. package/execution/useLiveAgentExecution.js.map +1 -0
  218. package/index.d.ts +15 -10
  219. package/index.d.ts.map +1 -1
  220. package/index.js +21 -6
  221. package/index.js.map +1 -1
  222. package/internal/DecisionButton.d.ts +4 -3
  223. package/internal/DecisionButton.d.ts.map +1 -1
  224. package/internal/DecisionButton.js +4 -3
  225. package/internal/DecisionButton.js.map +1 -1
  226. package/internal/oauthPopup.d.ts +101 -0
  227. package/internal/oauthPopup.d.ts.map +1 -0
  228. package/internal/oauthPopup.js +208 -0
  229. package/internal/oauthPopup.js.map +1 -0
  230. package/internal/store/index.d.ts +0 -2
  231. package/internal/store/index.d.ts.map +1 -1
  232. package/internal/store/index.js +0 -1
  233. package/internal/store/index.js.map +1 -1
  234. package/internal/store/workflow-execution-event-store.d.ts +34 -1
  235. package/internal/store/workflow-execution-event-store.d.ts.map +1 -1
  236. package/internal/store/workflow-execution-event-store.js +81 -3
  237. package/internal/store/workflow-execution-event-store.js.map +1 -1
  238. package/internal/store/workspace-file-selection-store.d.ts +1 -2
  239. package/internal/store/workspace-file-selection-store.d.ts.map +1 -1
  240. package/internal/store/workspace-file-selection-store.js +2 -5
  241. package/internal/store/workspace-file-selection-store.js.map +1 -1
  242. package/internal/thread-card/ThreadCardShell.d.ts +91 -0
  243. package/internal/thread-card/ThreadCardShell.d.ts.map +1 -0
  244. package/internal/thread-card/ThreadCardShell.js +41 -0
  245. package/internal/thread-card/ThreadCardShell.js.map +1 -0
  246. package/internal/thread-card/glyphs.d.ts +34 -0
  247. package/internal/thread-card/glyphs.d.ts.map +1 -0
  248. package/internal/thread-card/glyphs.js +50 -0
  249. package/internal/thread-card/glyphs.js.map +1 -0
  250. package/internal/thread-card/index.d.ts +3 -0
  251. package/internal/thread-card/index.d.ts.map +1 -0
  252. package/internal/thread-card/index.js +3 -0
  253. package/internal/thread-card/index.js.map +1 -0
  254. package/internal/useRevealLine.d.ts +2 -2
  255. package/internal/useRevealLine.js +2 -2
  256. package/mcp-server/OAuthCallbackHandler.js +1 -1
  257. package/mcp-server/OAuthCallbackHandler.js.map +1 -1
  258. package/mcp-server/useMcpServerOAuthConnect.d.ts +4 -23
  259. package/mcp-server/useMcpServerOAuthConnect.d.ts.map +1 -1
  260. package/mcp-server/useMcpServerOAuthConnect.js +12 -145
  261. package/mcp-server/useMcpServerOAuthConnect.js.map +1 -1
  262. package/package.json +4 -4
  263. package/provider.d.ts +32 -0
  264. package/provider.d.ts.map +1 -1
  265. package/provider.js +25 -1
  266. package/provider.js.map +1 -1
  267. package/session/NewSessionViewer.d.ts.map +1 -1
  268. package/session/NewSessionViewer.js +0 -1
  269. package/session/NewSessionViewer.js.map +1 -1
  270. package/session/SessionPanelChip.d.ts +7 -22
  271. package/session/SessionPanelChip.d.ts.map +1 -1
  272. package/session/SessionPanelChip.js +8 -36
  273. package/session/SessionPanelChip.js.map +1 -1
  274. package/session/SessionViewer.d.ts +7 -4
  275. package/session/SessionViewer.d.ts.map +1 -1
  276. package/session/SessionViewer.js +32 -30
  277. package/session/SessionViewer.js.map +1 -1
  278. package/session/audience.d.ts +15 -1
  279. package/session/audience.d.ts.map +1 -1
  280. package/session/channelOrigin.d.ts +33 -0
  281. package/session/channelOrigin.d.ts.map +1 -0
  282. package/session/channelOrigin.js +36 -0
  283. package/session/channelOrigin.js.map +1 -0
  284. package/session/facets/index.d.ts +0 -2
  285. package/session/facets/index.d.ts.map +1 -1
  286. package/session/facets/index.js +0 -1
  287. package/session/facets/index.js.map +1 -1
  288. package/session/index.d.ts +2 -2
  289. package/session/index.d.ts.map +1 -1
  290. package/session/index.js +5 -3
  291. package/session/index.js.map +1 -1
  292. package/session/useSessionFileChanges.d.ts +10 -34
  293. package/session/useSessionFileChanges.d.ts.map +1 -1
  294. package/session/useSessionFileChanges.js +9 -141
  295. package/session/useSessionFileChanges.js.map +1 -1
  296. package/session/useSessionPanel.d.ts +5 -15
  297. package/session/useSessionPanel.d.ts.map +1 -1
  298. package/session/useSessionPanel.js +3 -35
  299. package/session/useSessionPanel.js.map +1 -1
  300. package/session/useSessionRailViews.d.ts +3 -6
  301. package/session/useSessionRailViews.d.ts.map +1 -1
  302. package/session/useSessionRailViews.js +3 -17
  303. package/session/useSessionRailViews.js.map +1 -1
  304. package/settings/ChannelAppsSection.d.ts +13 -0
  305. package/settings/ChannelAppsSection.d.ts.map +1 -0
  306. package/settings/ChannelAppsSection.js +48 -0
  307. package/settings/ChannelAppsSection.js.map +1 -0
  308. package/settings/index.d.ts +1 -0
  309. package/settings/index.d.ts.map +1 -1
  310. package/settings/index.js +1 -0
  311. package/settings/index.js.map +1 -1
  312. package/settings/settings-nav.d.ts.map +1 -1
  313. package/settings/settings-nav.js +6 -1
  314. package/settings/settings-nav.js.map +1 -1
  315. package/sharing/AgentShareList.d.ts.map +1 -1
  316. package/sharing/AgentShareList.js +11 -3
  317. package/sharing/AgentShareList.js.map +1 -1
  318. package/sharing/ShareAgentDialog.js +1 -1
  319. package/sharing/useShareToolReadiness.d.ts +9 -38
  320. package/sharing/useShareToolReadiness.d.ts.map +1 -1
  321. package/sharing/useShareToolReadiness.js +7 -72
  322. package/sharing/useShareToolReadiness.js.map +1 -1
  323. package/src/__tests__/provider-container.layout.test.tsx +165 -0
  324. package/src/__tests__/provider-theme-scope.test.tsx +31 -0
  325. package/src/agent-instance/AgentInstanceList.tsx +60 -42
  326. package/src/agent-instance/__tests__/AgentInstanceList.test.tsx +161 -0
  327. package/src/channel/AgentChannelsPanel.tsx +688 -0
  328. package/src/channel/ChannelConversationsDialog.tsx +267 -0
  329. package/src/channel/ChannelCredentialsDialog.tsx +219 -0
  330. package/src/channel/ChannelToolCredentials.tsx +124 -0
  331. package/src/channel/ConnectSlackDialog.tsx +611 -0
  332. package/src/channel/ConnectWhatsAppDialog.tsx +624 -0
  333. package/src/channel/SlackMarkIcon.tsx +21 -0
  334. package/src/channel/WhatsAppMarkIcon.tsx +22 -0
  335. package/src/channel/__tests__/AgentChannelsPanel.test.tsx +638 -0
  336. package/src/channel/__tests__/ChannelConversationsDialog.test.tsx +114 -0
  337. package/src/channel/__tests__/ChannelCredentialsDialog.test.tsx +240 -0
  338. package/src/channel/__tests__/ConnectSlackDialog.test.tsx +659 -0
  339. package/src/channel/__tests__/ConnectWhatsAppDialog.test.tsx +564 -0
  340. package/src/channel/__tests__/providers.test.ts +118 -0
  341. package/src/channel/__tests__/useAgentChannel.test.tsx +116 -0
  342. package/src/channel/__tests__/useAgentChannelList.test.tsx +166 -0
  343. package/src/channel/__tests__/useChannelSessions.test.tsx +95 -0
  344. package/src/channel/__tests__/useChannelToolReadiness.test.tsx +158 -0
  345. package/src/channel/__tests__/useConnectSlackChannel.test.tsx +276 -0
  346. package/src/channel/__tests__/useDeleteAgentChannel.test.tsx +97 -0
  347. package/src/channel/__tests__/useInstallChannel.test.tsx +177 -0
  348. package/src/channel/__tests__/useSaveAgentChannel.test.tsx +294 -0
  349. package/src/channel/connect/ServingAppSection.tsx +185 -0
  350. package/src/channel/connect/ToolCredentialsSection.tsx +67 -0
  351. package/src/channel/connect/VerbatimRefusal.tsx +27 -0
  352. package/src/channel/connect/icons.tsx +42 -0
  353. package/src/channel/index.ts +65 -0
  354. package/src/channel/providerPresentation.ts +154 -0
  355. package/src/channel/providers.ts +73 -0
  356. package/src/channel/useAgentChannel.ts +58 -0
  357. package/src/channel/useAgentChannelList.ts +69 -0
  358. package/src/channel/useChannelSessions.ts +73 -0
  359. package/src/channel/useChannelToolReadiness.ts +39 -0
  360. package/src/channel/useConnectSlackChannel.ts +195 -0
  361. package/src/channel/useCreateAgentChannel.ts +73 -0
  362. package/src/channel/useDeleteAgentChannel.ts +71 -0
  363. package/src/channel/useInstallChannel.ts +117 -0
  364. package/src/channel/useOrgAgentChannelList.ts +60 -0
  365. package/src/channel/useSaveAgentChannel.ts +133 -0
  366. package/src/channel-app/ChannelAppDetailPanel.tsx +510 -0
  367. package/src/channel-app/ChannelAppListPanel.tsx +201 -0
  368. package/src/channel-app/CreateChannelAppForm.tsx +529 -0
  369. package/src/channel-app/__tests__/channelAppWhatsApp.test.tsx +270 -0
  370. package/src/channel-app/__tests__/slackAppSetup.test.ts +75 -0
  371. package/src/channel-app/__tests__/useChannelAppHooks.test.tsx +157 -0
  372. package/src/channel-app/__tests__/whatsappAppSetup.test.ts +39 -0
  373. package/src/channel-app/index.ts +30 -0
  374. package/src/channel-app/internal.tsx +180 -0
  375. package/src/channel-app/slackAppSetup.ts +153 -0
  376. package/src/channel-app/useChannelAppList.ts +59 -0
  377. package/src/channel-app/useCreateChannelApp.ts +70 -0
  378. package/src/channel-app/useDeleteChannelApp.ts +62 -0
  379. package/src/channel-app/useUpdateChannelApp.ts +70 -0
  380. package/src/channel-app/whatsappAppSetup.ts +62 -0
  381. package/src/environment/index.ts +2 -0
  382. package/src/environment/useToolCredentialsReadiness.ts +122 -0
  383. package/src/execution/ArtifactContentBody.tsx +6 -88
  384. package/src/execution/ArtifactFileContent.tsx +110 -0
  385. package/src/execution/ArtifactRow.tsx +28 -118
  386. package/src/execution/ArtifactRowView.tsx +137 -0
  387. package/src/execution/FileChangesView.tsx +4 -69
  388. package/src/execution/SubAgentSection.tsx +2 -36
  389. package/src/execution/ToolCallItem.tsx +48 -175
  390. package/src/execution/__tests__/ArtifactFileContent.test.tsx +60 -0
  391. package/src/execution/__tests__/ArtifactRowView.test.tsx +78 -0
  392. package/src/execution/__tests__/agent-execution-document.test.ts +45 -0
  393. package/src/execution/__tests__/artifact-row-item.test.ts +128 -0
  394. package/src/execution/__tests__/deriveExecutionFileChanges.test.ts +270 -0
  395. package/src/execution/__tests__/useArtifactContentById.test.tsx +85 -0
  396. package/src/execution/__tests__/useLiveAgentExecution.test.tsx +202 -0
  397. package/src/execution/agent-execution-document.ts +54 -0
  398. package/src/execution/artifact-document.ts +24 -0
  399. package/src/execution/artifact-row-item.ts +97 -0
  400. package/src/execution/deriveExecutionFileChanges.ts +237 -0
  401. package/src/execution/file-change-document.ts +37 -0
  402. package/src/execution/index.ts +36 -0
  403. package/src/execution/useArtifactContentById.ts +120 -0
  404. package/src/execution/useArtifactDownload.ts +4 -3
  405. package/src/execution/useCreateAgentExecution.ts +1 -1
  406. package/src/execution/useLiveAgentExecution.ts +127 -0
  407. package/src/index.ts +155 -11
  408. package/src/internal/DecisionButton.tsx +4 -3
  409. package/src/internal/__tests__/ThreadCardShell.test.tsx +105 -0
  410. package/src/internal/__tests__/oauthPopup.test.ts +245 -0
  411. package/src/internal/oauthPopup.ts +261 -0
  412. package/src/internal/store/__tests__/workflow-execution-event-store.test.ts +375 -5
  413. package/src/internal/store/index.ts +0 -3
  414. package/src/internal/store/workflow-execution-event-store.ts +123 -4
  415. package/src/internal/store/workspace-file-selection-store.ts +2 -5
  416. package/src/internal/thread-card/ThreadCardShell.tsx +189 -0
  417. package/src/internal/thread-card/glyphs.tsx +108 -0
  418. package/src/internal/thread-card/index.ts +19 -0
  419. package/src/internal/useRevealLine.ts +2 -2
  420. package/src/mcp-server/OAuthCallbackHandler.tsx +2 -2
  421. package/src/mcp-server/useMcpServerOAuthConnect.ts +22 -184
  422. package/src/provider.tsx +42 -0
  423. package/src/session/NewSessionViewer.tsx +0 -1
  424. package/src/session/SessionPanelChip.tsx +10 -96
  425. package/src/session/SessionViewer.tsx +170 -144
  426. package/src/session/__tests__/SessionViewer-artifactTabs.test.tsx +1 -1
  427. package/src/session/__tests__/observerAudience.test.tsx +241 -0
  428. package/src/session/__tests__/useSessionPanel.test.ts +6 -61
  429. package/src/session/__tests__/useSessionRailViews.test.tsx +5 -27
  430. package/src/session/audience.ts +15 -1
  431. package/src/session/channelOrigin.ts +45 -0
  432. package/src/session/facets/index.ts +0 -3
  433. package/src/session/index.ts +9 -6
  434. package/src/session/useSessionFileChanges.ts +12 -153
  435. package/src/session/useSessionPanel.ts +8 -51
  436. package/src/session/useSessionRailViews.tsx +2 -27
  437. package/src/settings/ChannelAppsSection.tsx +133 -0
  438. package/src/settings/index.ts +1 -0
  439. package/src/settings/settings-nav.ts +6 -0
  440. package/src/sharing/AgentShareList.tsx +85 -64
  441. package/src/sharing/ShareAgentDialog.tsx +1 -1
  442. package/src/sharing/__tests__/AgentShareList.test.tsx +92 -12
  443. package/src/sharing/useShareToolReadiness.ts +13 -101
  444. package/src/styles.css +14 -0
  445. package/src/workflow/WorkflowAgentExecutionDocument.tsx +283 -0
  446. package/src/workflow/WorkflowApprovalList.tsx +158 -0
  447. package/src/workflow/WorkflowArtifactDocument.tsx +257 -0
  448. package/src/workflow/WorkflowExecutionGraph.tsx +40 -78
  449. package/src/workflow/WorkflowExecutionViewer.tsx +610 -287
  450. package/src/workflow/WorkflowFileReviewList.tsx +1 -1
  451. package/src/workflow/WorkflowTaskApprovalCard.tsx +5 -4
  452. package/src/workflow/WorkflowTaskApprovalSummary.tsx +6 -6
  453. package/src/workflow/__tests__/WorkflowAgentExecutionDocument.test.tsx +651 -0
  454. package/src/workflow/__tests__/WorkflowApprovalList.test.tsx +229 -0
  455. package/src/workflow/__tests__/WorkflowArtifactDocument.test.tsx +90 -0
  456. package/src/workflow/__tests__/WorkflowArtifactsTab.test.tsx +85 -0
  457. package/src/workflow/__tests__/WorkflowChangesTab.test.tsx +113 -0
  458. package/src/workflow/__tests__/WorkflowExecutionViewer.approvals.test.tsx +473 -0
  459. package/src/workflow/__tests__/WorkflowExecutionViewer.reconciliation.test.tsx +632 -0
  460. package/src/workflow/__tests__/WorkflowTaskApprovalSummary.test.tsx +1 -1
  461. package/src/workflow/__tests__/WorkflowTaskThread.test.tsx +947 -0
  462. package/src/workflow/__tests__/WorkflowUsageTab.test.tsx +163 -0
  463. package/src/workflow/__tests__/agent-call-live-experience.test.ts +6 -53
  464. package/src/workflow/__tests__/derive-execution-overlays.test.ts +4 -0
  465. package/src/workflow/__tests__/deriveWorkflowArtifactItems.test.ts +71 -0
  466. package/src/workflow/__tests__/deriveWorkflowUsageItems.test.ts +132 -0
  467. package/src/workflow/__tests__/execution-graph.test.ts +8 -0
  468. package/src/workflow/__tests__/project-thread-items.test.ts +428 -0
  469. package/src/workflow/__tests__/structured-data-viewer.test.tsx +1 -1
  470. package/src/workflow/__tests__/task-approval.test.ts +149 -0
  471. package/src/workflow/__tests__/task-detail-io.test.ts +40 -0
  472. package/src/workflow/__tests__/task-presentation.test.ts +479 -0
  473. package/src/workflow/__tests__/useActiveTaskName.test.ts +4 -0
  474. package/src/workflow/__tests__/useApprovalBoundary.test.ts +158 -0
  475. package/src/workflow/__tests__/useExecutionAnnouncements.test.ts +4 -0
  476. package/src/workflow/__tests__/useFollowExecution.test.ts +2 -89
  477. package/src/workflow/__tests__/useWorkflowExecutionFileChanges.test.tsx +412 -0
  478. package/src/workflow/__tests__/useWorkflowExecutionPanel.test.ts +297 -0
  479. package/src/workflow/__tests__/useWorkflowExecutionRailViews.test.tsx +115 -0
  480. package/src/workflow/deriveWorkflowArtifactItems.ts +59 -0
  481. package/src/workflow/deriveWorkflowUsageItems.ts +73 -0
  482. package/src/workflow/diagnosis-document.ts +31 -0
  483. package/src/workflow/execution/index.ts +0 -15
  484. package/src/workflow/facets/WorkflowArtifactsTab.tsx +99 -0
  485. package/src/workflow/facets/WorkflowChangesTab.tsx +129 -0
  486. package/src/workflow/facets/WorkflowUsageTab.tsx +258 -0
  487. package/src/workflow/format-utils.ts +2 -3
  488. package/src/workflow/index.ts +106 -62
  489. package/src/workflow/inspector/index.ts +0 -4
  490. package/src/workflow/instance/WorkflowInstanceList.tsx +59 -41
  491. package/src/workflow/instance/__tests__/WorkflowInstanceList.test.tsx +156 -0
  492. package/src/workflow/task-detail/index.ts +11 -0
  493. package/src/workflow/task-detail/task-approval.ts +158 -0
  494. package/src/workflow/task-detail/task-detail-io.ts +65 -0
  495. package/src/workflow/thread/WorkflowTaskThread.tsx +845 -0
  496. package/src/workflow/thread/project-thread-items.ts +235 -0
  497. package/src/workflow/thread/task-presentation.ts +427 -0
  498. package/src/workflow/thread/thread-presentation.ts +59 -0
  499. package/src/workflow/thread/useWorkflowThreadItems.ts +34 -0
  500. package/src/workflow/useApprovalBoundary.ts +72 -0
  501. package/src/workflow/useFollowExecution.ts +0 -26
  502. package/src/workflow/useWorkflowArtifactDownload.ts +68 -0
  503. package/src/workflow/useWorkflowExecutionActions.ts +3 -2
  504. package/src/workflow/useWorkflowExecutionFileChanges.ts +341 -0
  505. package/src/workflow/useWorkflowExecutionGraph.ts +3 -43
  506. package/src/workflow/useWorkflowExecutionPanel.ts +292 -0
  507. package/src/workflow/useWorkflowExecutionRailViews.tsx +173 -0
  508. package/src/workspace/FileViewer.tsx +3 -3
  509. package/src/workspace/PanelChip.tsx +103 -0
  510. package/src/workspace/WorkspaceSurface.tsx +50 -6
  511. package/src/workspace/__tests__/WorkspaceSurface.test.tsx +110 -0
  512. package/src/workspace/index.ts +3 -0
  513. package/styles.css +1 -1
  514. package/workflow/WorkflowAgentExecutionDocument.d.ts +79 -0
  515. package/workflow/WorkflowAgentExecutionDocument.d.ts.map +1 -0
  516. package/workflow/WorkflowAgentExecutionDocument.js +87 -0
  517. package/workflow/WorkflowAgentExecutionDocument.js.map +1 -0
  518. package/workflow/WorkflowApprovalList.d.ts +62 -0
  519. package/workflow/WorkflowApprovalList.d.ts.map +1 -0
  520. package/workflow/WorkflowApprovalList.js +52 -0
  521. package/workflow/WorkflowApprovalList.js.map +1 -0
  522. package/workflow/WorkflowArtifactDocument.d.ts +29 -0
  523. package/workflow/WorkflowArtifactDocument.d.ts.map +1 -0
  524. package/workflow/WorkflowArtifactDocument.js +89 -0
  525. package/workflow/WorkflowArtifactDocument.js.map +1 -0
  526. package/workflow/WorkflowExecutionGraph.d.ts +15 -13
  527. package/workflow/WorkflowExecutionGraph.d.ts.map +1 -1
  528. package/workflow/WorkflowExecutionGraph.js +18 -53
  529. package/workflow/WorkflowExecutionGraph.js.map +1 -1
  530. package/workflow/WorkflowExecutionViewer.d.ts +8 -5
  531. package/workflow/WorkflowExecutionViewer.d.ts.map +1 -1
  532. package/workflow/WorkflowExecutionViewer.js +329 -54
  533. package/workflow/WorkflowExecutionViewer.js.map +1 -1
  534. package/workflow/WorkflowFileReviewList.d.ts +1 -1
  535. package/workflow/WorkflowFileReviewList.js +1 -1
  536. package/workflow/WorkflowTaskApprovalCard.d.ts +4 -3
  537. package/workflow/WorkflowTaskApprovalCard.d.ts.map +1 -1
  538. package/workflow/WorkflowTaskApprovalCard.js +5 -4
  539. package/workflow/WorkflowTaskApprovalCard.js.map +1 -1
  540. package/workflow/WorkflowTaskApprovalSummary.d.ts +6 -6
  541. package/workflow/WorkflowTaskApprovalSummary.js +5 -5
  542. package/workflow/deriveWorkflowArtifactItems.d.ts +30 -0
  543. package/workflow/deriveWorkflowArtifactItems.d.ts.map +1 -0
  544. package/workflow/deriveWorkflowArtifactItems.js +38 -0
  545. package/workflow/deriveWorkflowArtifactItems.js.map +1 -0
  546. package/workflow/deriveWorkflowUsageItems.d.ts +36 -0
  547. package/workflow/deriveWorkflowUsageItems.d.ts.map +1 -0
  548. package/workflow/deriveWorkflowUsageItems.js +50 -0
  549. package/workflow/deriveWorkflowUsageItems.js.map +1 -0
  550. package/workflow/diagnosis-document.d.ts +17 -0
  551. package/workflow/diagnosis-document.d.ts.map +1 -0
  552. package/workflow/diagnosis-document.js +29 -0
  553. package/workflow/diagnosis-document.js.map +1 -0
  554. package/workflow/execution/index.d.ts +0 -2
  555. package/workflow/execution/index.d.ts.map +1 -1
  556. package/workflow/execution/index.js +0 -2
  557. package/workflow/execution/index.js.map +1 -1
  558. package/workflow/facets/WorkflowArtifactsTab.d.ts +26 -0
  559. package/workflow/facets/WorkflowArtifactsTab.d.ts.map +1 -0
  560. package/workflow/facets/WorkflowArtifactsTab.js +34 -0
  561. package/workflow/facets/WorkflowArtifactsTab.js.map +1 -0
  562. package/workflow/facets/WorkflowChangesTab.d.ts +37 -0
  563. package/workflow/facets/WorkflowChangesTab.d.ts.map +1 -0
  564. package/workflow/facets/WorkflowChangesTab.js +50 -0
  565. package/workflow/facets/WorkflowChangesTab.js.map +1 -0
  566. package/workflow/facets/WorkflowUsageTab.d.ts +27 -0
  567. package/workflow/facets/WorkflowUsageTab.d.ts.map +1 -0
  568. package/workflow/facets/WorkflowUsageTab.js +87 -0
  569. package/workflow/facets/WorkflowUsageTab.js.map +1 -0
  570. package/workflow/format-utils.d.ts +2 -3
  571. package/workflow/format-utils.d.ts.map +1 -1
  572. package/workflow/format-utils.js +2 -3
  573. package/workflow/format-utils.js.map +1 -1
  574. package/workflow/index.d.ts +21 -10
  575. package/workflow/index.d.ts.map +1 -1
  576. package/workflow/index.js +29 -14
  577. package/workflow/index.js.map +1 -1
  578. package/workflow/inspector/index.d.ts +0 -2
  579. package/workflow/inspector/index.d.ts.map +1 -1
  580. package/workflow/inspector/index.js +0 -2
  581. package/workflow/inspector/index.js.map +1 -1
  582. package/workflow/instance/WorkflowInstanceList.d.ts.map +1 -1
  583. package/workflow/instance/WorkflowInstanceList.js +11 -3
  584. package/workflow/instance/WorkflowInstanceList.js.map +1 -1
  585. package/workflow/task-detail/StructuredDataViewer.d.ts.map +1 -0
  586. package/workflow/task-detail/StructuredDataViewer.js.map +1 -0
  587. package/workflow/task-detail/index.d.ts +4 -0
  588. package/workflow/task-detail/index.d.ts.map +1 -0
  589. package/workflow/task-detail/index.js +4 -0
  590. package/workflow/task-detail/index.js.map +1 -0
  591. package/workflow/task-detail/task-approval.d.ts +89 -0
  592. package/workflow/task-detail/task-approval.d.ts.map +1 -0
  593. package/workflow/task-detail/task-approval.js +84 -0
  594. package/workflow/task-detail/task-approval.js.map +1 -0
  595. package/workflow/task-detail/task-detail-io.d.ts +39 -0
  596. package/workflow/task-detail/task-detail-io.d.ts.map +1 -0
  597. package/workflow/task-detail/task-detail-io.js +42 -0
  598. package/workflow/task-detail/task-detail-io.js.map +1 -0
  599. package/workflow/thread/WorkflowTaskThread.d.ts +91 -0
  600. package/workflow/thread/WorkflowTaskThread.d.ts.map +1 -0
  601. package/workflow/thread/WorkflowTaskThread.js +318 -0
  602. package/workflow/thread/WorkflowTaskThread.js.map +1 -0
  603. package/workflow/thread/project-thread-items.d.ts +108 -0
  604. package/workflow/thread/project-thread-items.d.ts.map +1 -0
  605. package/workflow/thread/project-thread-items.js +126 -0
  606. package/workflow/thread/project-thread-items.js.map +1 -0
  607. package/workflow/thread/task-presentation.d.ts +73 -0
  608. package/workflow/thread/task-presentation.d.ts.map +1 -0
  609. package/workflow/thread/task-presentation.js +331 -0
  610. package/workflow/thread/task-presentation.js.map +1 -0
  611. package/workflow/thread/thread-presentation.d.ts +28 -0
  612. package/workflow/thread/thread-presentation.d.ts.map +1 -0
  613. package/workflow/thread/thread-presentation.js +28 -0
  614. package/workflow/thread/thread-presentation.js.map +1 -0
  615. package/workflow/thread/useWorkflowThreadItems.d.ts +16 -0
  616. package/workflow/thread/useWorkflowThreadItems.d.ts.map +1 -0
  617. package/workflow/thread/useWorkflowThreadItems.js +22 -0
  618. package/workflow/thread/useWorkflowThreadItems.js.map +1 -0
  619. package/workflow/useApprovalBoundary.d.ts +38 -0
  620. package/workflow/useApprovalBoundary.d.ts.map +1 -0
  621. package/workflow/useApprovalBoundary.js +55 -0
  622. package/workflow/useApprovalBoundary.js.map +1 -0
  623. package/workflow/useFollowExecution.d.ts +0 -20
  624. package/workflow/useFollowExecution.d.ts.map +1 -1
  625. package/workflow/useFollowExecution.js +0 -17
  626. package/workflow/useFollowExecution.js.map +1 -1
  627. package/workflow/useWorkflowArtifactDownload.d.ts +28 -0
  628. package/workflow/useWorkflowArtifactDownload.d.ts.map +1 -0
  629. package/workflow/useWorkflowArtifactDownload.js +45 -0
  630. package/workflow/useWorkflowArtifactDownload.js.map +1 -0
  631. package/workflow/useWorkflowExecutionActions.d.ts +3 -2
  632. package/workflow/useWorkflowExecutionActions.d.ts.map +1 -1
  633. package/workflow/useWorkflowExecutionActions.js.map +1 -1
  634. package/workflow/useWorkflowExecutionFileChanges.d.ts +107 -0
  635. package/workflow/useWorkflowExecutionFileChanges.d.ts.map +1 -0
  636. package/workflow/useWorkflowExecutionFileChanges.js +244 -0
  637. package/workflow/useWorkflowExecutionFileChanges.js.map +1 -0
  638. package/workflow/useWorkflowExecutionGraph.d.ts +1 -14
  639. package/workflow/useWorkflowExecutionGraph.d.ts.map +1 -1
  640. package/workflow/useWorkflowExecutionGraph.js +2 -25
  641. package/workflow/useWorkflowExecutionGraph.js.map +1 -1
  642. package/workflow/useWorkflowExecutionPanel.d.ts +108 -0
  643. package/workflow/useWorkflowExecutionPanel.d.ts.map +1 -0
  644. package/workflow/useWorkflowExecutionPanel.js +103 -0
  645. package/workflow/useWorkflowExecutionPanel.js.map +1 -0
  646. package/workflow/useWorkflowExecutionRailViews.d.ts +46 -0
  647. package/workflow/useWorkflowExecutionRailViews.d.ts.map +1 -0
  648. package/workflow/useWorkflowExecutionRailViews.js +81 -0
  649. package/workflow/useWorkflowExecutionRailViews.js.map +1 -0
  650. package/workspace/FileViewer.d.ts +1 -1
  651. package/workspace/FileViewer.js +3 -3
  652. package/workspace/FileViewer.js.map +1 -1
  653. package/workspace/PanelChip.d.ts +27 -0
  654. package/workspace/PanelChip.d.ts.map +1 -0
  655. package/workspace/PanelChip.js +42 -0
  656. package/workspace/PanelChip.js.map +1 -0
  657. package/workspace/WorkspaceSurface.d.ts +25 -1
  658. package/workspace/WorkspaceSurface.d.ts.map +1 -1
  659. package/workspace/WorkspaceSurface.js +21 -9
  660. package/workspace/WorkspaceSurface.js.map +1 -1
  661. package/workspace/index.d.ts +3 -1
  662. package/workspace/index.d.ts.map +1 -1
  663. package/workspace/index.js +1 -0
  664. package/workspace/index.js.map +1 -1
  665. package/execution/ThreadSelectionContext.d.ts +0 -17
  666. package/execution/ThreadSelectionContext.d.ts.map +0 -1
  667. package/execution/ThreadSelectionContext.js +0 -18
  668. package/execution/ThreadSelectionContext.js.map +0 -1
  669. package/execution/useThreadSelection.d.ts +0 -35
  670. package/execution/useThreadSelection.d.ts.map +0 -1
  671. package/execution/useThreadSelection.js +0 -65
  672. package/execution/useThreadSelection.js.map +0 -1
  673. package/internal/store/selection-store.d.ts +0 -53
  674. package/internal/store/selection-store.d.ts.map +0 -1
  675. package/internal/store/selection-store.js +0 -88
  676. package/internal/store/selection-store.js.map +0 -1
  677. package/session/artifact-document.d.ts.map +0 -1
  678. package/session/artifact-document.js +0 -22
  679. package/session/artifact-document.js.map +0 -1
  680. package/session/facets/InspectTab.d.ts +0 -13
  681. package/session/facets/InspectTab.d.ts.map +0 -1
  682. package/session/facets/InspectTab.js +0 -19
  683. package/session/facets/InspectTab.js.map +0 -1
  684. package/src/execution/ThreadSelectionContext.tsx +0 -20
  685. package/src/execution/useThreadSelection.ts +0 -95
  686. package/src/internal/store/__tests__/selection-store.test.ts +0 -115
  687. package/src/internal/store/selection-store.ts +0 -112
  688. package/src/session/artifact-document.ts +0 -23
  689. package/src/session/facets/InspectTab.tsx +0 -57
  690. package/src/workflow/WorkflowExecutionApprovalCard.tsx +0 -154
  691. package/src/workflow/WorkflowExecutionArtifactPanel.tsx +0 -107
  692. package/src/workflow/WorkflowExecutionCostPanel.tsx +0 -120
  693. package/src/workflow/WorkflowExecutionTaskPanel.tsx +0 -129
  694. package/src/workflow/WorkflowExecutionTimeline.tsx +0 -151
  695. package/src/workflow/WorkflowExecutionTimelineEvent.tsx +0 -497
  696. package/src/workflow/__tests__/ExecutionInspector.test.tsx +0 -155
  697. package/src/workflow/__tests__/WorkflowExecutionApprovalCard.test.tsx +0 -129
  698. package/src/workflow/__tests__/derive-task-detail.test.ts +0 -1265
  699. package/src/workflow/__tests__/derive-waterfall-entries.test.ts +0 -521
  700. package/src/workflow/__tests__/execution-inspector.test.tsx +0 -332
  701. package/src/workflow/execution/derive-waterfall-entries.ts +0 -377
  702. package/src/workflow/execution/useWaterfallEntries.ts +0 -125
  703. package/src/workflow/execution-inspector/AgentCallTab.tsx +0 -169
  704. package/src/workflow/execution-inspector/ErrorTab.tsx +0 -110
  705. package/src/workflow/execution-inspector/EventLogTab.tsx +0 -79
  706. package/src/workflow/execution-inspector/ExecutionInspector.tsx +0 -341
  707. package/src/workflow/execution-inspector/InputOutputTab.tsx +0 -325
  708. package/src/workflow/execution-inspector/RetriesTab.tsx +0 -68
  709. package/src/workflow/execution-inspector/SummaryTab.tsx +0 -62
  710. package/src/workflow/execution-inspector/derive-task-detail.ts +0 -584
  711. package/src/workflow/execution-inspector/index.ts +0 -14
  712. package/src/workflow/execution-inspector/useExecutionTaskDetail.ts +0 -55
  713. package/src/workflow/inspector/ExecutionInspectorAdapter.tsx +0 -40
  714. package/src/workflow/waterfall/WaterfallBar.tsx +0 -167
  715. package/src/workflow/waterfall/WaterfallRow.tsx +0 -112
  716. package/src/workflow/waterfall/WaterfallScale.tsx +0 -52
  717. package/src/workflow/waterfall/WaterfallTimeline.tsx +0 -138
  718. package/src/workflow/waterfall/WaterfallTooltip.tsx +0 -74
  719. package/src/workflow/waterfall/index.ts +0 -5
  720. package/workflow/WorkflowExecutionApprovalCard.d.ts +0 -34
  721. package/workflow/WorkflowExecutionApprovalCard.d.ts.map +0 -1
  722. package/workflow/WorkflowExecutionApprovalCard.js +0 -46
  723. package/workflow/WorkflowExecutionApprovalCard.js.map +0 -1
  724. package/workflow/WorkflowExecutionArtifactPanel.d.ts +0 -15
  725. package/workflow/WorkflowExecutionArtifactPanel.d.ts.map +0 -1
  726. package/workflow/WorkflowExecutionArtifactPanel.js +0 -46
  727. package/workflow/WorkflowExecutionArtifactPanel.js.map +0 -1
  728. package/workflow/WorkflowExecutionCostPanel.d.ts +0 -18
  729. package/workflow/WorkflowExecutionCostPanel.d.ts.map +0 -1
  730. package/workflow/WorkflowExecutionCostPanel.js +0 -31
  731. package/workflow/WorkflowExecutionCostPanel.js.map +0 -1
  732. package/workflow/WorkflowExecutionTaskPanel.d.ts +0 -24
  733. package/workflow/WorkflowExecutionTaskPanel.d.ts.map +0 -1
  734. package/workflow/WorkflowExecutionTaskPanel.js +0 -51
  735. package/workflow/WorkflowExecutionTaskPanel.js.map +0 -1
  736. package/workflow/WorkflowExecutionTimeline.d.ts +0 -42
  737. package/workflow/WorkflowExecutionTimeline.d.ts.map +0 -1
  738. package/workflow/WorkflowExecutionTimeline.js +0 -52
  739. package/workflow/WorkflowExecutionTimeline.js.map +0 -1
  740. package/workflow/WorkflowExecutionTimelineEvent.d.ts +0 -25
  741. package/workflow/WorkflowExecutionTimelineEvent.d.ts.map +0 -1
  742. package/workflow/WorkflowExecutionTimelineEvent.js +0 -179
  743. package/workflow/WorkflowExecutionTimelineEvent.js.map +0 -1
  744. package/workflow/execution/derive-waterfall-entries.d.ts +0 -85
  745. package/workflow/execution/derive-waterfall-entries.d.ts.map +0 -1
  746. package/workflow/execution/derive-waterfall-entries.js +0 -268
  747. package/workflow/execution/derive-waterfall-entries.js.map +0 -1
  748. package/workflow/execution/useWaterfallEntries.d.ts +0 -25
  749. package/workflow/execution/useWaterfallEntries.d.ts.map +0 -1
  750. package/workflow/execution/useWaterfallEntries.js +0 -67
  751. package/workflow/execution/useWaterfallEntries.js.map +0 -1
  752. package/workflow/execution-inspector/AgentCallTab.d.ts +0 -21
  753. package/workflow/execution-inspector/AgentCallTab.d.ts.map +0 -1
  754. package/workflow/execution-inspector/AgentCallTab.js +0 -36
  755. package/workflow/execution-inspector/AgentCallTab.js.map +0 -1
  756. package/workflow/execution-inspector/ErrorTab.d.ts +0 -9
  757. package/workflow/execution-inspector/ErrorTab.d.ts.map +0 -1
  758. package/workflow/execution-inspector/ErrorTab.js +0 -29
  759. package/workflow/execution-inspector/ErrorTab.js.map +0 -1
  760. package/workflow/execution-inspector/EventLogTab.d.ts +0 -11
  761. package/workflow/execution-inspector/EventLogTab.d.ts.map +0 -1
  762. package/workflow/execution-inspector/EventLogTab.js +0 -47
  763. package/workflow/execution-inspector/EventLogTab.js.map +0 -1
  764. package/workflow/execution-inspector/ExecutionInspector.d.ts +0 -69
  765. package/workflow/execution-inspector/ExecutionInspector.d.ts.map +0 -1
  766. package/workflow/execution-inspector/ExecutionInspector.js +0 -145
  767. package/workflow/execution-inspector/ExecutionInspector.js.map +0 -1
  768. package/workflow/execution-inspector/InputOutputTab.d.ts +0 -20
  769. package/workflow/execution-inspector/InputOutputTab.d.ts.map +0 -1
  770. package/workflow/execution-inspector/InputOutputTab.js +0 -124
  771. package/workflow/execution-inspector/InputOutputTab.js.map +0 -1
  772. package/workflow/execution-inspector/RetriesTab.d.ts +0 -7
  773. package/workflow/execution-inspector/RetriesTab.d.ts.map +0 -1
  774. package/workflow/execution-inspector/RetriesTab.js +0 -11
  775. package/workflow/execution-inspector/RetriesTab.js.map +0 -1
  776. package/workflow/execution-inspector/StructuredDataViewer.d.ts.map +0 -1
  777. package/workflow/execution-inspector/StructuredDataViewer.js.map +0 -1
  778. package/workflow/execution-inspector/SummaryTab.d.ts +0 -7
  779. package/workflow/execution-inspector/SummaryTab.d.ts.map +0 -1
  780. package/workflow/execution-inspector/SummaryTab.js +0 -10
  781. package/workflow/execution-inspector/SummaryTab.js.map +0 -1
  782. package/workflow/execution-inspector/derive-task-detail.d.ts +0 -140
  783. package/workflow/execution-inspector/derive-task-detail.d.ts.map +0 -1
  784. package/workflow/execution-inspector/derive-task-detail.js +0 -366
  785. package/workflow/execution-inspector/derive-task-detail.js.map +0 -1
  786. package/workflow/execution-inspector/index.d.ts +0 -4
  787. package/workflow/execution-inspector/index.d.ts.map +0 -1
  788. package/workflow/execution-inspector/index.js +0 -4
  789. package/workflow/execution-inspector/index.js.map +0 -1
  790. package/workflow/execution-inspector/useExecutionTaskDetail.d.ts +0 -38
  791. package/workflow/execution-inspector/useExecutionTaskDetail.d.ts.map +0 -1
  792. package/workflow/execution-inspector/useExecutionTaskDetail.js +0 -37
  793. package/workflow/execution-inspector/useExecutionTaskDetail.js.map +0 -1
  794. package/workflow/inspector/ExecutionInspectorAdapter.d.ts +0 -26
  795. package/workflow/inspector/ExecutionInspectorAdapter.d.ts.map +0 -1
  796. package/workflow/inspector/ExecutionInspectorAdapter.js +0 -23
  797. package/workflow/inspector/ExecutionInspectorAdapter.js.map +0 -1
  798. package/workflow/waterfall/WaterfallBar.d.ts +0 -19
  799. package/workflow/waterfall/WaterfallBar.d.ts.map +0 -1
  800. package/workflow/waterfall/WaterfallBar.js +0 -70
  801. package/workflow/waterfall/WaterfallBar.js.map +0 -1
  802. package/workflow/waterfall/WaterfallRow.d.ts +0 -18
  803. package/workflow/waterfall/WaterfallRow.d.ts.map +0 -1
  804. package/workflow/waterfall/WaterfallRow.js +0 -45
  805. package/workflow/waterfall/WaterfallRow.js.map +0 -1
  806. package/workflow/waterfall/WaterfallScale.d.ts +0 -14
  807. package/workflow/waterfall/WaterfallScale.d.ts.map +0 -1
  808. package/workflow/waterfall/WaterfallScale.js +0 -22
  809. package/workflow/waterfall/WaterfallScale.js.map +0 -1
  810. package/workflow/waterfall/WaterfallTimeline.d.ts +0 -46
  811. package/workflow/waterfall/WaterfallTimeline.d.ts.map +0 -1
  812. package/workflow/waterfall/WaterfallTimeline.js +0 -60
  813. package/workflow/waterfall/WaterfallTimeline.js.map +0 -1
  814. package/workflow/waterfall/WaterfallTooltip.d.ts +0 -15
  815. package/workflow/waterfall/WaterfallTooltip.d.ts.map +0 -1
  816. package/workflow/waterfall/WaterfallTooltip.js +0 -20
  817. package/workflow/waterfall/WaterfallTooltip.js.map +0 -1
  818. package/workflow/waterfall/index.d.ts +0 -6
  819. package/workflow/waterfall/index.d.ts.map +0 -1
  820. package/workflow/waterfall/index.js +0 -6
  821. package/workflow/waterfall/index.js.map +0 -1
  822. /package/src/workflow/{execution-inspector → task-detail}/StructuredDataViewer.tsx +0 -0
  823. /package/workflow/{execution-inspector → task-detail}/StructuredDataViewer.d.ts +0 -0
  824. /package/workflow/{execution-inspector → task-detail}/StructuredDataViewer.js +0 -0
@@ -3,27 +3,95 @@
3
3
  import { memo, useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
5
  import { WorkflowTaskStatus, ExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/enum_pb";
6
+ import type { WorkflowTask } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
6
7
  import { WorkflowTaskKind } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/enum_pb";
7
8
  import { useWorkflowExecution } from "./useWorkflowExecution.js";
8
9
  import { useWorkflowExecutionEventStream } from "./useWorkflowExecutionEventStream.js";
9
10
  import { useWorkflowExecutionArtifacts } from "./useWorkflowExecutionArtifacts.js";
11
+ import {
12
+ useWorkflowExecutionFileChanges,
13
+ type UseWorkflowExecutionFileChangesReturn,
14
+ } from "./useWorkflowExecutionFileChanges.js";
10
15
  import { useWorkflowExecutionActions } from "./useWorkflowExecutionActions.js";
11
16
  import { WorkflowExecutionHeader } from "./WorkflowExecutionHeader.js";
12
- import { WorkflowExecutionTimeline, type WorkflowExecutionTimelineProps } from "./WorkflowExecutionTimeline.js";
13
- import { WaterfallTimeline } from "./waterfall/index.js";
14
- import { WorkflowExecutionCostPanel } from "./WorkflowExecutionCostPanel.js";
15
- import { WorkflowExecutionArtifactPanel } from "./WorkflowExecutionArtifactPanel.js";
16
17
  import { WorkflowRepairCard } from "./WorkflowRepairCard.js";
17
18
  import { WorkflowExecutionGraph } from "./WorkflowExecutionGraph.js";
18
- import type { DerivedTaskState } from "../internal/store/workflow-execution-event-store.js";
19
- import { ExecutionInspector } from "./execution-inspector/index.js";
19
+ import type { DerivedCostSummary, DerivedTaskState } from "../internal/store/workflow-execution-event-store.js";
20
20
  import { ExecutionComparisonPicker } from "./execution-comparison/ExecutionComparisonPicker.js";
21
21
  import { ExecutionComparisonView } from "./execution-comparison/ExecutionComparisonView.js";
22
- import { WorkflowExecutionApprovalCard } from "./WorkflowExecutionApprovalCard.js";
23
- import { WorkflowFileReviewList, type WorkflowFileDecisionSubmit } from "./WorkflowFileReviewList.js";
24
- import type { WorkflowPendingApproval, WorkflowPendingFileReview } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
25
- import type { ApprovalAction } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
22
+ import type { Artifact } from "@stigmer/protos/ai/stigmer/agentic/artifact/v1/api_pb";
26
23
  import { ResizableSplit } from "../internal/ResizableSplit.js";
24
+ import { useWorkspaceEditors } from "../internal/store/index.js";
25
+ import { ARTIFACT_DOCUMENT_ENTRY_ID } from "../execution/artifact-document.js";
26
+ import {
27
+ FILE_CHANGE_DOCUMENT_ENTRY_ID,
28
+ fileChangeTabPath,
29
+ } from "../execution/file-change-document.js";
30
+ import {
31
+ AGENT_EXECUTION_DOCUMENT_ENTRY_ID,
32
+ parseAgentExecutionTabPath,
33
+ } from "../execution/agent-execution-document.js";
34
+ import { FileChangeDiff } from "../execution/FileChangesView.js";
35
+ import {
36
+ WorkflowAgentExecutionDocument,
37
+ type WorkflowAgentExecutionHitl,
38
+ } from "./WorkflowAgentExecutionDocument.js";
39
+ import {
40
+ WorkspaceSurface,
41
+ type SurfaceVirtualDocument,
42
+ } from "../workspace/WorkspaceSurface.js";
43
+ import { PanelChip } from "../workspace/PanelChip.js";
44
+ import {
45
+ useWorkflowExecutionPanel,
46
+ workflowArtifactTabPath,
47
+ type WorkflowExecutionPanelController,
48
+ } from "./useWorkflowExecutionPanel.js";
49
+ import { useWorkflowExecutionRailViews } from "./useWorkflowExecutionRailViews.js";
50
+ import {
51
+ DIAGNOSIS_DOCUMENT_ENTRY_ID,
52
+ DIAGNOSIS_DOCUMENT_PATH,
53
+ } from "./diagnosis-document.js";
54
+ import { WorkflowArtifactDocument } from "./WorkflowArtifactDocument.js";
55
+ import {
56
+ WorkflowTaskThread,
57
+ type WorkflowThreadHitl,
58
+ } from "./thread/WorkflowTaskThread.js";
59
+ import { useExecutionAnnouncements } from "./useExecutionAnnouncements.js";
60
+ import {
61
+ useApprovalBoundary,
62
+ type ApprovalBoundaryCrossing,
63
+ } from "./useApprovalBoundary.js";
64
+
65
+ // ---------------------------------------------------------------------------
66
+ // Center-column view (S9: Thread | Graph toggle; Thread is the default)
67
+ // ---------------------------------------------------------------------------
68
+
69
+ /** The center-column view of the execution viewer. */
70
+ type CenterView = "thread" | "graph";
71
+
72
+ // Versioned key (S9). The unversioned S8 key is deliberately ABANDONED, not
73
+ // migrated: S8 shipped the thread as an opt-in preview with Graph as the
74
+ // default, so a stored S8 value records exploration of that preview — not a
75
+ // deliberate preference against the thread-primary product direction. The
76
+ // version bump gives every user one fresh landing on the new default;
77
+ // choices made from there persist.
78
+ const CENTER_VIEW_STORAGE_KEY = "stgm-wf-exec-center-view.v2";
79
+ const LEGACY_CENTER_VIEW_STORAGE_KEY = "stgm-wf-exec-center-view";
80
+
81
+ /**
82
+ * Read the persisted center view, defaulting to the thread (the T02
83
+ * thread-primary pivot). Same lazy-`useState` + `localStorage` pattern as
84
+ * `ResizableSplit`'s persisted width.
85
+ */
86
+ function readStoredCenterView(): CenterView {
87
+ try {
88
+ const stored = localStorage.getItem(CENTER_VIEW_STORAGE_KEY);
89
+ if (stored === "thread" || stored === "graph") return stored;
90
+ } catch {
91
+ /* localStorage may be unavailable */
92
+ }
93
+ return "thread";
94
+ }
27
95
 
28
96
  /** Props for {@link WorkflowExecutionViewer}. */
29
97
  export interface WorkflowExecutionViewerProps {
@@ -43,8 +111,6 @@ export interface WorkflowExecutionViewerProps {
43
111
  * application handles navigation to the workflow editor (DD-004).
44
112
  */
45
113
  readonly onNavigateToWorkflowEditor?: (yaml: string, workflowSlug: string) => void;
46
- /** Additional action elements to render in the sidebar inspector footer. */
47
- readonly additionalActions?: ReactNode;
48
114
  /**
49
115
  * Host-supplied action elements rendered in the header action group
50
116
  * (e.g. a Share control). Routing/auth-agnostic per DD-004.
@@ -64,9 +130,14 @@ export interface WorkflowExecutionViewerProps {
64
130
  /**
65
131
  * Top-level composed viewer for a single workflow execution.
66
132
  *
67
- * Wires together all execution hooks and sub-components into a
68
- * two-region layout: an event timeline (main area) and a context
69
- * sidebar (tasks, budget, artifacts).
133
+ * Wires together all execution hooks and sub-components into a two-column
134
+ * layout: the center column (the session-style task thread by default, with
135
+ * the DAG graph behind a view toggle — a passive visualization) and a single
136
+ * collapsible `WorkspaceSurface` panel carrying the execution-level facets
137
+ * (Artifacts/Changes/Usage on the rail) and the rich documents (transcripts,
138
+ * diffs, artifacts, AI diagnosis in the editor area). A task's detail —
139
+ * preview, I/O, errors, and every HITL decision surface — lives on its
140
+ * thread card, the single home for task data (T06).
70
141
  *
71
142
  * This component is designed to work identically whether rendered
72
143
  * in the Stigmer Console or embedded in a third-party dashboard.
@@ -85,7 +156,6 @@ export const WorkflowExecutionViewer = memo(function WorkflowExecutionViewer({
85
156
  org,
86
157
  onNavigateToAgentExecution,
87
158
  onNavigateToWorkflowEditor,
88
- additionalActions,
89
159
  headerActions,
90
160
  nodesDraggable,
91
161
  className,
@@ -165,6 +235,14 @@ export const WorkflowExecutionViewer = memo(function WorkflowExecutionViewer({
165
235
  currentToolName: "",
166
236
  messagesCount: 0,
167
237
  toolCallsCount: 0,
238
+ // No event log → no truncated summaries and no gate record. The
239
+ // card body still renders full I/O from this same snapshot
240
+ // (`status.tasks[]`), so the fallback path is never a blank card
241
+ // (T04); a decided human_input degrades to its raw output there.
242
+ inputSummary: null,
243
+ outputSummary: null,
244
+ approvalRequest: null,
245
+ approvalResolution: null,
168
246
  });
169
247
  }
170
248
  return map;
@@ -173,37 +251,160 @@ export const WorkflowExecutionViewer = memo(function WorkflowExecutionViewer({
173
251
  const effectiveTaskStates = fallbackTaskStates ?? taskStates;
174
252
  const effectiveTotalTasks = fallbackTaskStates ? fallbackTaskStates.size : totalTasks;
175
253
 
176
- const executionDurationMs = useMemo(() => {
177
- const startedAt = execution?.status?.startedAt;
178
- const completedAt = execution?.status?.completedAt;
179
- if (startedAt && completedAt) {
180
- return new Date(completedAt).getTime() - new Date(startedAt).getTime();
254
+ // Per-task snapshot lookup for the thread cards' I/O bodies (T04): an
255
+ // O(1) map, rebuilt only when the snapshot refetches — never on stream
256
+ // event appends — so memoized cards keep bailing during streaming.
257
+ const taskSnapshotsByName = useMemo(():
258
+ | ReadonlyMap<string, WorkflowTask>
259
+ | undefined => {
260
+ const tasks = execution?.status?.tasks;
261
+ if (!tasks || tasks.length === 0) return undefined;
262
+ const map = new Map<string, WorkflowTask>();
263
+ for (const t of tasks) {
264
+ if (t.taskName) map.set(t.taskName, t);
181
265
  }
182
- return undefined;
183
- }, [execution?.status?.startedAt, execution?.status?.completedAt]);
266
+ return map;
267
+ }, [execution?.status?.tasks]);
184
268
 
185
- const {
186
- artifacts,
187
- isLoading: isLoadingArtifacts,
188
- } = useWorkflowExecutionArtifacts(executionId);
269
+ const { artifacts } = useWorkflowExecutionArtifacts(executionId);
270
+
271
+ // File-change rollup across AGENT_CALL children (Changes facet). Owner-level
272
+ // like the artifacts hook — the fetched children must survive panel
273
+ // collapse/expand cycles (the panel's content unmounts while collapsed).
274
+ const fileChangesState = useWorkflowExecutionFileChanges({
275
+ executionId,
276
+ taskStates: effectiveTaskStates,
277
+ taskSnapshots: execution?.status?.tasks,
278
+ });
189
279
 
190
280
  const actions = useWorkflowExecutionActions(executionId, {
191
281
  onSuccess: refetchExecution,
192
282
  });
193
283
 
194
- const [selectedTaskName, setSelectedTaskName] = useState<string | null>(null);
195
- const [showDiagnosis, setShowDiagnosis] = useState(false);
284
+ // The child-gate HITL wiring ONE bundle from the single actions
285
+ // instance, narrowed to the six child-gate fields, consumed by the
286
+ // in-place transcript documents (S5, as `WorkflowAgentExecutionHitl`), so
287
+ // a gate's spinner/error is pixel-identical on every surface. Deps are
288
+ // the individual fields (DD-010): the bundle's ref must survive unrelated
289
+ // churn on `actions` (a lifecycle action's isSubmitting flip), so
290
+ // consumers re-render only when a gate's own in-flight/error state moves.
291
+ const childGateHitl = useMemo<WorkflowAgentExecutionHitl>(
292
+ () => ({
293
+ submitApproval: actions.submitApproval,
294
+ approvalSubmittingToolCallIds: actions.approvalSubmittingToolCallIds,
295
+ approvalErrorsByToolCallId: actions.approvalErrorsByToolCallId,
296
+ submitFileDecision: actions.submitFileDecision,
297
+ fileDecisionSubmittingKeys: actions.fileDecisionSubmittingKeys,
298
+ fileDecisionErrorsByKey: actions.fileDecisionErrorsByKey,
299
+ }),
300
+ [
301
+ actions.submitApproval,
302
+ actions.approvalSubmittingToolCallIds,
303
+ actions.approvalErrorsByToolCallId,
304
+ actions.submitFileDecision,
305
+ actions.fileDecisionSubmittingKeys,
306
+ actions.fileDecisionErrorsByKey,
307
+ ],
308
+ );
309
+
310
+ // The thread's HITL bundle (T06): the child-gate fields PLUS the
311
+ // task-level (human_input) approval wiring — since the gating card is
312
+ // the only decision surface, the thread carries all three gate kinds.
313
+ // A separate memo from `childGateHitl` so a human_input decision's
314
+ // in-flight flip re-renders the gating card, never the open transcript
315
+ // documents (DD-010).
316
+ const threadHitl = useMemo<WorkflowThreadHitl>(
317
+ () => ({
318
+ ...childGateHitl,
319
+ submitTaskApproval: actions.submitTaskApproval,
320
+ taskApprovalSubmittingTaskNames: actions.taskApprovalSubmittingTaskNames,
321
+ taskApprovalErrorsByTaskName: actions.taskApprovalErrorsByTaskName,
322
+ }),
323
+ [
324
+ childGateHitl,
325
+ actions.submitTaskApproval,
326
+ actions.taskApprovalSubmittingTaskNames,
327
+ actions.taskApprovalErrorsByTaskName,
328
+ ],
329
+ );
330
+
331
+ // The execution-level workspace panel (facets + virtual document
332
+ // tabs). The controller lives at the owner level — the editors-store
333
+ // SUBSCRIPTION stays inside ExecutionWorkspacePanel so tab churn re-renders
334
+ // only the panel subtree, never the streaming graph (DD-009/DD-010).
335
+ const panel = useWorkflowExecutionPanel();
336
+
196
337
  const [showComparePicker, setShowComparePicker] = useState(false);
197
338
  const [compareTargetId, setCompareTargetId] = useState<string | null>(null);
198
339
 
199
- const handleDiagnose = useCallback(() => {
200
- setShowDiagnosis(true);
340
+ // Center-column view (S8/S9). Both views stay mounted with the inactive
341
+ // one CSS-hidden — the `collapsedPane` discipline — so toggling never
342
+ // remounts React Flow or drops the event stream (DD-009).
343
+ const [centerView, setCenterView] = useState<CenterView>(readStoredCenterView);
344
+ const handleCenterViewChange = useCallback((view: CenterView) => {
345
+ setCenterView(view);
346
+ try {
347
+ localStorage.setItem(CENTER_VIEW_STORAGE_KEY, view);
348
+ } catch {
349
+ /* quota or security error */
350
+ }
201
351
  }, []);
202
352
 
203
- const handleCloseDiagnosis = useCallback(() => {
204
- setShowDiagnosis(false);
353
+ // One-time cleanup of the abandoned S8 key (an effect, not the read path —
354
+ // reads must stay side-effect-free).
355
+ useEffect(() => {
356
+ try {
357
+ localStorage.removeItem(LEGACY_CENTER_VIEW_STORAGE_KEY);
358
+ } catch {
359
+ /* localStorage may be unavailable */
360
+ }
205
361
  }, []);
206
362
 
363
+ // Screen reader announcements for task state changes. Owned by the viewer
364
+ // (not the graph): `display:none` removes content from the accessibility
365
+ // tree, so a live region inside the CSS-hidden graph would go silent in
366
+ // Thread view. One always-visible announcer serves both center views.
367
+ const announcement = useExecutionAnnouncements(effectiveTaskStates);
368
+
369
+ // Terminal-phase snapshot refetch (T04, DD-T04-4). While a run streams,
370
+ // the cards' collapsed lines and bodies work from the TRUNCATED event
371
+ // summaries; the full per-task output lands on `status.tasks[]` only when
372
+ // the runner persists the terminal snapshot. The stream store's stage is
373
+ // the live end-of-run signal (`"complete"` on the terminal event) — the
374
+ // snapshot's own `phase` cannot be the trigger, since it only moves on a
375
+ // refetch (the circularity behind the stale "Pending" header, R1-5).
376
+ // Scoped to the live→complete TRANSITION: a terminal-replay mount starts
377
+ // at "complete" without ever streaming and already fetched a settled
378
+ // snapshot, so it must not refetch again.
379
+ const prevStreamStageRef = useRef(streamState.stage);
380
+ useEffect(() => {
381
+ const prev = prevStreamStageRef.current;
382
+ prevStreamStageRef.current = streamState.stage;
383
+ if (
384
+ streamState.stage === "complete" &&
385
+ (prev === "streaming" || prev === "reconnecting")
386
+ ) {
387
+ refetchExecution();
388
+ }
389
+ }, [streamState.stage, refetchExecution]);
390
+
391
+ // Snapshot freshness across HITL boundaries (S9, the drawer's
392
+ // replacement). A `waiting_approval` boundary crossing — in EITHER
393
+ // direction — means the mount snapshot's gate lists are stale → refetch
394
+ // (stale-while-revalidate; no skeleton): the thread's in-card gates read
395
+ // those lists. No auto-select accompanies it (T06 — selection is gone):
396
+ // the gating card is amber, carries its decision surface, and the aria
397
+ // announcer + auto-follow + jump-to-latest cover attention. Gated on
398
+ // `isRunning` so terminal-execution history replay (which crosses the
399
+ // boundary for long-decided gates) never refetches.
400
+ const handleApprovalBoundary = useCallback(
401
+ (_crossing: ApprovalBoundaryCrossing) => {
402
+ refetchExecution();
403
+ },
404
+ [refetchExecution],
405
+ );
406
+ useApprovalBoundary(effectiveTaskStates, isRunning, handleApprovalBoundary);
407
+
207
408
  const handleOpenComparePicker = useCallback(() => {
208
409
  setShowComparePicker(true);
209
410
  }, []);
@@ -272,10 +473,26 @@ export const WorkflowExecutionViewer = memo(function WorkflowExecutionViewer({
272
473
  streamState={streamState}
273
474
  costSummary={costSummary}
274
475
  actions={actions}
275
- onDiagnose={org ? handleDiagnose : undefined}
276
- isDiagnosing={showDiagnosis}
476
+ // Diagnose opens (or focuses) the singleton diagnosis document tab —
477
+ // the tab itself is the "diagnosis is active" state, so there is no
478
+ // owner-level isDiagnosing boolean to keep in sync (SSOT).
479
+ onDiagnose={org ? panel.openDiagnosis : undefined}
277
480
  onCompare={handleOpenComparePicker}
278
- headerActions={headerActions}
481
+ headerActions={
482
+ <>
483
+ {headerActions}
484
+ {/* The panel's always-mounted toggle — always-on now that the
485
+ Usage facet gives the panel data-independent content (its
486
+ empty state is honest even before any usage accrues). The
487
+ badge stays the artifact count: artifacts are countable
488
+ collateral, usage is a continuous quantity. */}
489
+ <PanelChip
490
+ isOpen={panel.isOpen}
491
+ onToggle={panel.isOpen ? panel.closePanel : panel.openPanel}
492
+ badgeCount={artifacts.length}
493
+ />
494
+ </>
495
+ }
279
496
  />
280
497
 
281
498
  {/* Comparison picker dialog */}
@@ -329,102 +546,340 @@ export const WorkflowExecutionViewer = memo(function WorkflowExecutionViewer({
329
546
  </div>
330
547
  )}
331
548
 
332
- <div className="flex min-h-0 flex-1 flex-col">
333
- {/* Primary area: Execution graph + resizable inspector */}
334
- <ResizableSplit
335
- defaultSize={showDiagnosis ? 440 : 384}
336
- minSize={280}
337
- maxSize={800}
338
- storageKey="stgm-wf-exec-inspector-width"
339
- primary={
340
- <WorkflowExecutionGraph
549
+ {/* Outer split: the graph-dominant content vs. the execution workspace
550
+ panel. Toggling goes through `collapsedPane` (CSS, not conditional
551
+ structure) so both children keep stable tree positions and an
552
+ open/close never remounts the React Flow graph or reconnects the
553
+ event stream (DD-009) — the same invariant the session viewer's
554
+ panel split holds for its conversation. */}
555
+ <ResizableSplit
556
+ resizablePane="secondary"
557
+ collapsedPane={panel.isOpen ? "none" : "secondary"}
558
+ defaultSize={560}
559
+ minSize={360}
560
+ maxSize={960}
561
+ storageKey="stgm-wf-exec-panel-width"
562
+ ariaLabel="Resize execution panel"
563
+ className="min-h-0 flex-1"
564
+ primary={
565
+ <div className="flex h-full min-h-0 flex-1 flex-col">
566
+ {/* Center-column view switcher (S8). Graph is the default; the
567
+ thread is the session-style card-per-task view (T02 pivot). */}
568
+ <CenterViewSwitcher view={centerView} onChange={handleCenterViewChange} />
569
+
570
+ {/* One always-visible live region for task state changes — see the
571
+ ownership note on `announcement` above. */}
572
+ <div role="log" aria-live="polite" aria-atomic="false" className="sr-only">
573
+ {announcement}
574
+ </div>
575
+
576
+ {/* Primary area: thread and graph, both mounted, inactive one
577
+ CSS-hidden (stable tree positions — no React Flow remount, no
578
+ stream reconnect, expanded cards survive a toggle). The thread
579
+ card is the single home for a task's detail (T06); the graph is
580
+ a passive topology visualization. */}
581
+ <div
582
+ data-center-view="thread"
583
+ className={cn("min-h-0 flex-1", centerView !== "thread" && "hidden")}
584
+ >
585
+ <WorkflowTaskThread
586
+ taskStates={effectiveTaskStates}
587
+ totalTasks={effectiveTotalTasks}
588
+ isRunning={isRunning}
589
+ onOpenAgentExecution={panel.openAgentExecution}
590
+ // In-card HITL (S10/T06): all three gate kinds decide on the
591
+ // gating card, backed by the snapshot gate lists (kept fresh
592
+ // by the approval boundary's refetch above).
593
+ hitl={threadHitl}
594
+ pendingApprovals={execution?.status?.pendingApprovals}
595
+ pendingFileReviews={execution?.status?.pendingFileReviews}
596
+ // Full per-task I/O for the card bodies (T04) — an O(1)
597
+ // per-card snapshot lookup.
598
+ taskSnapshotsByName={taskSnapshotsByName}
599
+ className="h-full"
600
+ />
601
+ </div>
602
+ <div
603
+ data-center-view="graph"
604
+ className={cn("min-h-0 flex-1", centerView !== "graph" && "hidden")}
605
+ >
606
+ <WorkflowExecutionGraph
607
+ executionId={executionId}
608
+ execution={execution}
609
+ taskStates={effectiveTaskStates}
610
+ // Gated on the graph being visible: camera moves against a
611
+ // display:none (zero-size) viewport are degenerate.
612
+ followExecution={isRunning && centerView === "graph"}
613
+ // The viewer owns the one always-visible announcer above; the
614
+ // graph's own would go silent while CSS-hidden in Thread view.
615
+ announceTaskStates={false}
616
+ nodesDraggable={nodesDraggable}
617
+ className="h-full"
618
+ />
619
+ </div>
620
+ </div>
621
+ }
622
+ secondary={
623
+ // Content unmounts while collapsed (matching the session panel
624
+ // region); the editors store lives on the controller, so open tabs
625
+ // survive a collapse/expand cycle.
626
+ panel.isOpen ? (
627
+ <ExecutionWorkspacePanel
628
+ panel={panel}
341
629
  executionId={executionId}
342
- execution={execution}
630
+ org={org}
631
+ artifacts={artifacts}
632
+ fileChangesState={fileChangesState}
633
+ costSummary={costSummary}
343
634
  taskStates={effectiveTaskStates}
344
- onTaskSelect={setSelectedTaskName}
345
- onAutoSelectTask={setSelectedTaskName}
346
- followExecution={isRunning}
347
- nodesDraggable={nodesDraggable}
348
- className="h-full"
635
+ onNavigateToAgentExecution={onNavigateToAgentExecution}
636
+ onApplyFix={onNavigateToWorkflowEditor ? handleApplyFix : undefined}
637
+ transcriptHitl={childGateHitl}
349
638
  />
350
- }
351
- secondary={
352
- <aside className="flex h-full flex-col overflow-hidden">
353
- {showDiagnosis && org ? (
639
+ ) : null
640
+ }
641
+ />
642
+ </>
643
+ )}
644
+ </div>
645
+ );
646
+ });
647
+
648
+ // ---------------------------------------------------------------------------
649
+ // Execution workspace panel — WorkspaceSurface + facets (Artifacts/Changes/Usage)
650
+ // ---------------------------------------------------------------------------
651
+
652
+ /**
653
+ * The workflow analog of the session viewer's panel region: subscribes to the
654
+ * open-editor group (keeping that subscription out of the streaming owner),
655
+ * assembles the rail facets, and resolves open virtual-document tabs back to
656
+ * their records (artifact tabs → `Artifact`, file-change tabs → the current
657
+ * net `FileChange`, transcript tabs → their child id, the diagnosis tab →
658
+ * `WorkflowRepairCard`).
659
+ */
660
+ function ExecutionWorkspacePanel({
661
+ panel,
662
+ executionId,
663
+ org,
664
+ artifacts,
665
+ fileChangesState,
666
+ costSummary,
667
+ taskStates,
668
+ onNavigateToAgentExecution,
669
+ onApplyFix,
670
+ transcriptHitl,
671
+ }: {
672
+ readonly panel: WorkflowExecutionPanelController;
673
+ readonly executionId: string;
674
+ readonly org?: string;
675
+ readonly artifacts: readonly Artifact[];
676
+ readonly fileChangesState: UseWorkflowExecutionFileChangesReturn;
677
+ readonly costSummary: DerivedCostSummary;
678
+ readonly taskStates: ReadonlyMap<string, DerivedTaskState>;
679
+ readonly onNavigateToAgentExecution?: (agentExecutionId: string) => void;
680
+ /** "Apply Fix" from the diagnosis document — host-routed (DD-004). */
681
+ readonly onApplyFix?: (yaml: string) => void;
682
+ /** Workflow-level HITL wiring for open transcript documents (S5). */
683
+ readonly transcriptHitl: WorkflowAgentExecutionHitl;
684
+ }) {
685
+ const { editors, activeFile } = useWorkspaceEditors(panel.editorsStore);
686
+
687
+ // The Changes list highlights the row of the open diff tab — only a
688
+ // file-change document's path counts (an artifact tab must not highlight a
689
+ // coincidentally-named change).
690
+ const activeFileChangePath =
691
+ activeFile?.entryId === FILE_CHANGE_DOCUMENT_ENTRY_ID
692
+ ? activeFile.path
693
+ : null;
694
+
695
+ const railViews = useWorkflowExecutionRailViews({
696
+ artifacts,
697
+ onOpenArtifact: panel.openArtifact,
698
+ onActivateArtifact: panel.pinArtifact,
699
+ fileChanges: fileChangesState.fileChanges,
700
+ fileChangesLoading: fileChangesState.isLoading,
701
+ fileChangesRefetching: fileChangesState.isRefetching,
702
+ fileChangesError: fileChangesState.error,
703
+ activeFileChangePath,
704
+ onOpenFileChange: panel.openFileChange,
705
+ costSummary,
706
+ taskStates,
707
+ });
708
+
709
+ // Resolve open artifact tabs to their records by the same tab-path identity
710
+ // used to open them (single source of truth). A tab whose artifact vanished
711
+ // (e.g. expired and dropped from a refetch) degrades to an honest notice
712
+ // rather than vanishing.
713
+ const artifactByTabPath = useMemo(
714
+ () => new Map(artifacts.map((a) => [workflowArtifactTabPath(a), a])),
715
+ [artifacts],
716
+ );
717
+ // File-change tabs resolve the same way: tab path → net FileChange. The
718
+ // rollup is re-derived at task boundaries, so an open tab always renders
719
+ // the CURRENT net diff for its path (never a stale copy captured at open
720
+ // time); a path that dropped out of the rollup degrades to a notice.
721
+ const fileChangeByTabPath = useMemo(
722
+ () =>
723
+ new Map(
724
+ fileChangesState.fileChanges.map((c) => [fileChangeTabPath(c), c]),
725
+ ),
726
+ [fileChangesState.fileChanges],
727
+ );
728
+ const virtualDocuments = useMemo<readonly SurfaceVirtualDocument[]>(
729
+ () =>
730
+ editors
731
+ .filter(
732
+ (editor) =>
733
+ editor.entryId === ARTIFACT_DOCUMENT_ENTRY_ID ||
734
+ editor.entryId === FILE_CHANGE_DOCUMENT_ENTRY_ID ||
735
+ editor.entryId === AGENT_EXECUTION_DOCUMENT_ENTRY_ID ||
736
+ editor.entryId === DIAGNOSIS_DOCUMENT_ENTRY_ID,
737
+ )
738
+ .map((editor) => {
739
+ if (editor.entryId === DIAGNOSIS_DOCUMENT_ENTRY_ID) {
740
+ // The singleton AI-diagnosis conversation (opened by the header's
741
+ // Diagnose button via `panel.openDiagnosis`). Keyed by the fixed
742
+ // path so the streaming diagnosis flow survives unrelated editor
743
+ // churn; its close button closes the tab — the tab IS the
744
+ // "diagnosis is active" state.
745
+ return {
746
+ entryId: DIAGNOSIS_DOCUMENT_ENTRY_ID,
747
+ path: editor.path,
748
+ content: (
354
749
  <WorkflowRepairCard
750
+ key={editor.path}
355
751
  executionId={executionId}
356
- org={org}
357
- onApplyFix={onNavigateToWorkflowEditor ? handleApplyFix : undefined}
358
- onClose={handleCloseDiagnosis}
359
- className="h-full"
752
+ org={org ?? ""}
753
+ onApplyFix={onApplyFix}
754
+ onClose={() =>
755
+ panel.closeEditor(
756
+ DIAGNOSIS_DOCUMENT_ENTRY_ID,
757
+ DIAGNOSIS_DOCUMENT_PATH,
758
+ )
759
+ }
360
760
  />
361
- ) : (
362
- <div className="flex min-h-0 flex-1 flex-col overflow-hidden">
363
- <ExecutionInspector
364
- selectedTaskName={selectedTaskName}
365
- events={events}
366
- taskStates={effectiveTaskStates}
367
- taskSnapshots={execution?.status?.tasks ?? undefined}
368
- onNavigateToAgentExecution={onNavigateToAgentExecution}
369
- pendingApprovals={execution?.status?.pendingApprovals}
370
- onSubmitApproval={actions.submitApproval}
371
- approvalSubmittingToolCallIds={actions.approvalSubmittingToolCallIds}
372
- approvalErrorsByToolCallId={actions.approvalErrorsByToolCallId}
373
- onSubmitTaskApproval={actions.submitTaskApproval}
374
- taskApprovalSubmittingTaskNames={actions.taskApprovalSubmittingTaskNames}
375
- taskApprovalErrorsByTaskName={actions.taskApprovalErrorsByTaskName}
376
- className="min-h-0 flex-1"
377
- />
378
-
379
- <div className="border-t border-[var(--stgm-border,#e5e5e5)]">
380
- <WorkflowExecutionCostPanel costSummary={costSummary} />
381
- </div>
382
-
383
- {artifacts.length > 0 && (
384
- <div className="border-t border-[var(--stgm-border,#e5e5e5)]">
385
- <WorkflowExecutionArtifactPanel artifacts={artifacts} />
386
- </div>
387
- )}
388
-
389
- {additionalActions && (
390
- <div className="border-t border-[var(--stgm-border,#e5e5e5)] px-3 py-2">
391
- {additionalActions}
392
- </div>
393
- )}
761
+ ),
762
+ };
763
+ }
764
+ if (editor.entryId === AGENT_EXECUTION_DOCUMENT_ENTRY_ID) {
765
+ // The tab path CARRIES the child id (no lookup map — unlike the
766
+ // artifact/change families, a transcript needs only its id to
767
+ // fetch/stream itself). The suffix is the AGENT_CALL task name;
768
+ // its live state provides the agent slug for the header.
769
+ const childExecutionId = parseAgentExecutionTabPath(editor.path);
770
+ const taskName = editor.path.slice(childExecutionId.length + 1);
771
+ return {
772
+ entryId: AGENT_EXECUTION_DOCUMENT_ENTRY_ID,
773
+ path: editor.path,
774
+ // Keyed by tab path so the mounted fetch/stream survives
775
+ // unrelated editors churn while this tab stays active.
776
+ content: (
777
+ <WorkflowAgentExecutionDocument
778
+ key={editor.path}
779
+ childExecutionId={childExecutionId}
780
+ taskName={taskName}
781
+ agentSlug={taskStates.get(taskName)?.agentSlug || undefined}
782
+ onNavigateToAgentExecution={onNavigateToAgentExecution}
783
+ hitl={transcriptHitl}
784
+ />
785
+ ),
786
+ };
787
+ }
788
+ if (editor.entryId === FILE_CHANGE_DOCUMENT_ENTRY_ID) {
789
+ const change = fileChangeByTabPath.get(editor.path);
790
+ return {
791
+ entryId: FILE_CHANGE_DOCUMENT_ENTRY_ID,
792
+ path: editor.path,
793
+ content: change ? (
794
+ <div className="mx-auto w-full max-w-5xl px-4 py-4">
795
+ <FileChangeDiff key={editor.path} change={change} />
394
796
  </div>
395
- )}
396
- </aside>
797
+ ) : (
798
+ <FileChangeUnavailableNotice />
799
+ ),
800
+ };
397
801
  }
398
- />
399
-
400
- {/* Bottom panel: Waterfall (default) + Event Log tabs */}
401
- <ExecutionBottomPanel
402
- events={events}
403
- streamState={streamState}
404
- executionStartIso={execution.status?.startedAt ?? ""}
405
- executionDurationMs={executionDurationMs}
406
- selectedTaskName={selectedTaskName}
407
- onTaskSelect={setSelectedTaskName}
408
- onNavigateToAgentExecution={onNavigateToAgentExecution}
409
- taskStates={effectiveTaskStates}
410
- onSubmitTaskApproval={actions.submitTaskApproval}
411
- taskApprovalSubmittingTaskNames={actions.taskApprovalSubmittingTaskNames}
412
- taskApprovalErrorsByTaskName={actions.taskApprovalErrorsByTaskName}
413
- pendingApprovals={execution?.status?.pendingApprovals}
414
- onSubmitApproval={actions.submitApproval}
415
- approvalSubmittingToolCallIds={actions.approvalSubmittingToolCallIds}
416
- approvalErrorsByToolCallId={actions.approvalErrorsByToolCallId}
417
- pendingFileReviews={execution?.status?.pendingFileReviews}
418
- onSubmitFileDecision={actions.submitFileDecision}
419
- fileDecisionSubmittingKeys={actions.fileDecisionSubmittingKeys}
420
- fileDecisionErrorsByKey={actions.fileDecisionErrorsByKey}
421
- />
422
- </div>
423
- </>
424
- )}
802
+ const artifact = artifactByTabPath.get(editor.path);
803
+ return {
804
+ entryId: ARTIFACT_DOCUMENT_ENTRY_ID,
805
+ path: editor.path,
806
+ content: artifact ? (
807
+ <WorkflowArtifactDocument key={editor.path} artifact={artifact} />
808
+ ) : (
809
+ <ArtifactUnavailableNotice />
810
+ ),
811
+ };
812
+ }),
813
+ [
814
+ editors,
815
+ artifactByTabPath,
816
+ fileChangeByTabPath,
817
+ taskStates,
818
+ onNavigateToAgentExecution,
819
+ transcriptHitl,
820
+ executionId,
821
+ org,
822
+ onApplyFix,
823
+ panel.closeEditor,
824
+ ],
825
+ );
826
+
827
+ return (
828
+ <WorkspaceSurface
829
+ entries={[]}
830
+ lister={undefined}
831
+ reader={undefined}
832
+ // Facet-only rail until a workspace-source slice wires a lister —
833
+ // inert Explorer/Search icons would be dishonest chrome here.
834
+ builtInViews={[]}
835
+ view={panel.view}
836
+ onViewChange={panel.setView}
837
+ extraViews={railViews}
838
+ virtualDocuments={virtualDocuments}
839
+ editors={editors}
840
+ selectedFile={activeFile}
841
+ onOpenFile={panel.openFile}
842
+ onActivateEditor={panel.activateEditor}
843
+ onPinEditor={panel.pinEditor}
844
+ onCloseEditor={panel.closeEditor}
845
+ onCollapse={panel.closePanel}
846
+ className="h-full"
847
+ />
848
+ );
849
+ }
850
+
851
+ function FileChangeUnavailableNotice() {
852
+ return (
853
+ <div
854
+ role="status"
855
+ className="mx-auto flex w-full max-w-3xl flex-col items-center gap-1 px-4 py-8 text-center"
856
+ >
857
+ <p className="text-xs font-medium text-foreground">
858
+ This file change is no longer available.
859
+ </p>
860
+ <p className="text-xs text-muted-foreground">
861
+ The rollup was refreshed and this file no longer appears among the
862
+ execution&apos;s changes.
863
+ </p>
425
864
  </div>
426
865
  );
427
- });
866
+ }
867
+
868
+ function ArtifactUnavailableNotice() {
869
+ return (
870
+ <div
871
+ role="status"
872
+ className="mx-auto flex w-full max-w-3xl flex-col items-center gap-1 px-4 py-8 text-center"
873
+ >
874
+ <p className="text-xs font-medium text-foreground">
875
+ This artifact is no longer available.
876
+ </p>
877
+ <p className="text-xs text-muted-foreground">
878
+ It may have expired or been removed from storage.
879
+ </p>
880
+ </div>
881
+ );
882
+ }
428
883
 
429
884
  function LoadingSkeleton() {
430
885
  return (
@@ -446,178 +901,43 @@ function LoadingSkeleton() {
446
901
 
447
902
 
448
903
  // ---------------------------------------------------------------------------
449
- // Tabbed bottom panel: Waterfall + Event Log + Approvals
904
+ // Center-column view switcher (S9: Thread | Graph thread-primary order)
450
905
  // ---------------------------------------------------------------------------
451
906
 
452
- type BottomTab = "waterfall" | "events" | "approvals";
453
-
454
- function ExecutionBottomPanel({
455
- events,
456
- streamState,
457
- executionStartIso,
458
- executionDurationMs,
459
- selectedTaskName,
460
- onTaskSelect,
461
- onNavigateToAgentExecution,
462
- taskStates,
463
- onSubmitTaskApproval,
464
- taskApprovalSubmittingTaskNames,
465
- taskApprovalErrorsByTaskName,
466
- pendingApprovals,
467
- onSubmitApproval,
468
- approvalSubmittingToolCallIds,
469
- approvalErrorsByToolCallId,
470
- pendingFileReviews,
471
- onSubmitFileDecision,
472
- fileDecisionSubmittingKeys,
473
- fileDecisionErrorsByKey,
907
+ /**
908
+ * Slim segmented control above the center column. A radiogroup (the two
909
+ * views are mutually exclusive), matching the facet rail's radio semantics.
910
+ * Thread leads: it is the primary view (T02 pivot); the DAG is the
911
+ * secondary, topology-oriented lens.
912
+ */
913
+ function CenterViewSwitcher({
914
+ view,
915
+ onChange,
474
916
  }: {
475
- events: WorkflowExecutionTimelineProps["events"];
476
- streamState: WorkflowExecutionTimelineProps["streamState"];
477
- executionStartIso: string;
478
- executionDurationMs?: number;
479
- selectedTaskName: string | null;
480
- onTaskSelect: (taskName: string) => void;
481
- onNavigateToAgentExecution?: (id: string) => void;
482
- taskStates: ReadonlyMap<string, DerivedTaskState>;
483
- onSubmitTaskApproval: WorkflowExecutionTimelineProps["onSubmitTaskApproval"];
484
- taskApprovalSubmittingTaskNames: ReadonlySet<string>;
485
- taskApprovalErrorsByTaskName: ReadonlyMap<string, Error>;
486
- pendingApprovals?: readonly WorkflowPendingApproval[];
487
- onSubmitApproval?: (toolCallId: string, action: ApprovalAction, comment?: string) => Promise<unknown>;
488
- approvalSubmittingToolCallIds: ReadonlySet<string>;
489
- approvalErrorsByToolCallId: ReadonlyMap<string, Error>;
490
- pendingFileReviews?: readonly WorkflowPendingFileReview[];
491
- onSubmitFileDecision: WorkflowFileDecisionSubmit;
492
- fileDecisionSubmittingKeys: ReadonlySet<string>;
493
- fileDecisionErrorsByKey: ReadonlyMap<string, Error>;
917
+ readonly view: CenterView;
918
+ readonly onChange: (view: CenterView) => void;
494
919
  }) {
495
- const [collapsed, setCollapsed] = useState(false);
496
- const [activeTab, setActiveTab] = useState<BottomTab>("waterfall");
497
- const prevHitlCountRef = useRef(0);
498
-
499
- const approvalCount = pendingApprovals?.length ?? 0;
500
- const fileReviewCount = pendingFileReviews?.length ?? 0;
501
- // Both HITL kinds (tool approvals + file reviews) share the one "Approvals" tab.
502
- const hitlCount = approvalCount + fileReviewCount;
503
- const hasHitl = hitlCount > 0;
504
-
505
- // Auto-switch to the Approvals tab when a new HITL gate (approval or file
506
- // review) arrives; leave it when everything is resolved.
507
- useEffect(() => {
508
- if (hitlCount > prevHitlCountRef.current && hitlCount > 0) {
509
- setActiveTab("approvals");
510
- setCollapsed(false);
511
- }
512
- if (hitlCount === 0 && activeTab === "approvals") {
513
- setActiveTab("waterfall");
514
- }
515
- prevHitlCountRef.current = hitlCount;
516
- }, [hitlCount, activeTab]);
517
-
518
920
  return (
519
- <div className="border-t border-[var(--stgm-border,#e5e5e5)]">
520
- {/* Tab bar */}
521
- <div className="flex items-center gap-0 border-b border-[var(--stgm-border,#e5e5e5)]">
522
- <button
523
- type="button"
524
- onClick={() => setCollapsed(!collapsed)}
525
- className="flex items-center gap-1.5 px-3 py-1.5 text-xs text-[var(--stgm-muted-foreground,#737373)] hover:bg-[var(--stgm-muted,#f5f5f5)]"
526
- aria-label={collapsed ? "Expand bottom panel" : "Collapse bottom panel"}
527
- >
528
- <svg
529
- width="10"
530
- height="10"
531
- viewBox="0 0 10 10"
532
- className={cn("transition-transform", !collapsed && "rotate-180")}
533
- aria-hidden="true"
534
- >
535
- <path d="M2 4L5 7L8 4" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
536
- </svg>
537
- </button>
538
-
539
- <TabButton
540
- label="Waterfall"
541
- isActive={activeTab === "waterfall"}
542
- onClick={() => { setActiveTab("waterfall"); setCollapsed(false); }}
543
- />
544
- <TabButton
545
- label={`Events (${events.length})`}
546
- isActive={activeTab === "events"}
547
- onClick={() => { setActiveTab("events"); setCollapsed(false); }}
548
- />
549
- {hasHitl && (
550
- <TabButton
551
- label={`Approvals (${hitlCount})`}
552
- isActive={activeTab === "approvals"}
553
- onClick={() => { setActiveTab("approvals"); setCollapsed(false); }}
554
- />
555
- )}
556
- </div>
557
-
558
- {/* Panel content */}
559
- {!collapsed && (
560
- <div className="h-52">
561
- {activeTab === "waterfall" && (
562
- <WaterfallTimeline
563
- events={events}
564
- streamState={streamState}
565
- executionStartIso={executionStartIso}
566
- executionDurationMs={executionDurationMs}
567
- selectedTaskName={selectedTaskName}
568
- onTaskSelect={onTaskSelect}
569
- className="h-full"
570
- />
571
- )}
572
- {activeTab === "events" && (
573
- <WorkflowExecutionTimeline
574
- events={events}
575
- streamState={streamState}
576
- onNavigateToAgentExecution={onNavigateToAgentExecution}
577
- taskStates={taskStates}
578
- onSubmitTaskApproval={onSubmitTaskApproval}
579
- taskApprovalSubmittingTaskNames={taskApprovalSubmittingTaskNames}
580
- taskApprovalErrorsByTaskName={taskApprovalErrorsByTaskName}
581
- className="h-full"
582
- />
583
- )}
584
- {activeTab === "approvals" && (
585
- <div className="h-full overflow-y-auto px-4 py-3">
586
- <div className="space-y-3">
587
- {pendingApprovals && onSubmitApproval && pendingApprovals.map((pa) => {
588
- const toolCallId = pa.approval?.toolCallId ?? "";
589
- return (
590
- <WorkflowExecutionApprovalCard
591
- key={toolCallId || pa.childAgentExecutionId}
592
- prompt={pa.approval?.message || `Tool "${pa.approval?.toolName}" requires approval`}
593
- toolCallId={toolCallId}
594
- approvers={[]}
595
- timeoutSeconds={0}
596
- onSubmitApproval={onSubmitApproval}
597
- isSubmitting={approvalSubmittingToolCallIds.has(toolCallId)}
598
- error={approvalErrorsByToolCallId.get(toolCallId) ?? null}
599
- />
600
- );
601
- })}
602
- {pendingFileReviews && pendingFileReviews.length > 0 && (
603
- <WorkflowFileReviewList
604
- pendingFileReviews={pendingFileReviews}
605
- onSubmitFileDecision={onSubmitFileDecision}
606
- submittingDecisionKeys={fileDecisionSubmittingKeys}
607
- decisionErrors={fileDecisionErrorsByKey}
608
- onNavigateToAgentExecution={onNavigateToAgentExecution}
609
- />
610
- )}
611
- </div>
612
- </div>
613
- )}
614
- </div>
615
- )}
921
+ <div
922
+ role="radiogroup"
923
+ aria-label="Center view"
924
+ className="flex items-center gap-0.5 border-b border-[var(--stgm-border,#e5e5e5)] px-2 py-1"
925
+ >
926
+ <CenterViewButton
927
+ label="Thread"
928
+ isActive={view === "thread"}
929
+ onClick={() => onChange("thread")}
930
+ />
931
+ <CenterViewButton
932
+ label="Graph"
933
+ isActive={view === "graph"}
934
+ onClick={() => onChange("graph")}
935
+ />
616
936
  </div>
617
937
  );
618
938
  }
619
939
 
620
- function TabButton({
940
+ function CenterViewButton({
621
941
  label,
622
942
  isActive,
623
943
  onClick,
@@ -629,11 +949,13 @@ function TabButton({
629
949
  return (
630
950
  <button
631
951
  type="button"
952
+ role="radio"
953
+ aria-checked={isActive}
632
954
  onClick={onClick}
633
955
  className={cn(
634
- "px-3 py-1.5 text-xs font-medium transition-colors",
956
+ "rounded px-2 py-0.5 text-xs font-medium transition-colors",
635
957
  isActive
636
- ? "border-b-2 border-[var(--stgm-primary,#3b82f6)] text-[var(--stgm-foreground,#171717)]"
958
+ ? "bg-[var(--stgm-muted,#f5f5f5)] text-[var(--stgm-foreground,#171717)]"
637
959
  : "text-[var(--stgm-muted-foreground,#737373)] hover:text-[var(--stgm-foreground,#171717)]",
638
960
  )}
639
961
  >
@@ -641,3 +963,4 @@ function TabButton({
641
963
  </button>
642
964
  );
643
965
  }
966
+