@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
@@ -0,0 +1,947 @@
1
+ // Behavior tests for the WorkflowTaskThread organism: progress header,
2
+ // per-variant card previews, the expand gesture (T06: headers expand or are
3
+ // plain rows — selection died with the Inspect drill-down), the AGENT_CALL
4
+ // transcript affordance (D-T02-2), empty states (DD-006), and the in-thread
5
+ // HITL section (S10/T06 — including the in-card human_input review gate).
6
+ //
7
+ // GUARDRAIL (S5 rationale): the entire file renders WITHOUT a StigmerProvider.
8
+ // Any component reaching for a client hook (the child's agentExecution.*
9
+ // submit path) would throw — so a passing render plus the hitl spies
10
+ // receiving decisions proves in-card gates route through the WORKFLOW-level
11
+ // wiring only. (WorkflowFileReviewList streams its child itself and therefore
12
+ // NEEDS the provider — it is stubbed at the module seam here; its own suite
13
+ // covers the real child-derived rendering. The review gate's inline-payload
14
+ // path is provider-free by design — useReviewPayload touches the client only
15
+ // for artifact-backed payloads — so the human_input tests exercise the REAL
16
+ // gate.)
17
+
18
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
19
+ import { render, screen, fireEvent, cleanup, within } from "@testing-library/react";
20
+ import { create } from "@bufbuild/protobuf";
21
+ import { WorkflowTaskKind } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/enum_pb";
22
+ import {
23
+ WorkflowPendingApprovalSchema,
24
+ WorkflowPendingFileReviewSchema,
25
+ } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
26
+ import type {
27
+ WorkflowPendingApproval,
28
+ WorkflowPendingFileReview,
29
+ WorkflowTask,
30
+ } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
31
+ import {
32
+ ApprovalRequestedPayloadSchema,
33
+ ApprovalResolvedPayloadSchema,
34
+ } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/event_pb";
35
+ import { ApprovalAction } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
36
+ import type { DerivedTaskState } from "../../internal/store/workflow-execution-event-store";
37
+ import type { WorkflowFileDecisionSubmit } from "../WorkflowFileReviewList";
38
+ import { formatMetaChips } from "../format-utils";
39
+ import { WorkflowTaskThread, type WorkflowThreadHitl } from "../thread/WorkflowTaskThread";
40
+
41
+ // Streams its child (needs the provider this guardrail file deliberately
42
+ // omits) — stubbed to prove the seam: the gating card hands it the
43
+ // task-scoped references and the workflow-level decision submit.
44
+ vi.mock("../WorkflowFileReviewList", () => ({
45
+ WorkflowFileReviewList: ({
46
+ pendingFileReviews,
47
+ onSubmitFileDecision,
48
+ }: {
49
+ pendingFileReviews: readonly WorkflowPendingFileReview[];
50
+ onSubmitFileDecision: WorkflowFileDecisionSubmit;
51
+ }) => (
52
+ <div data-testid="file-review-list-stub">
53
+ {pendingFileReviews.map((ref) => (
54
+ <button
55
+ key={ref.childAgentExecutionId}
56
+ type="button"
57
+ onClick={() =>
58
+ onSubmitFileDecision(
59
+ ref.childAgentExecutionId,
60
+ ref.changeSetId[0] ?? "",
61
+ 1 as never,
62
+ )
63
+ }
64
+ >
65
+ decide-files-{ref.childAgentExecutionId}
66
+ </button>
67
+ ))}
68
+ </div>
69
+ ),
70
+ }));
71
+
72
+ // Spy-wrapped passthrough: every card render calls formatMetaChips with the
73
+ // item's own metric fields, so its call log is a per-card render probe (the
74
+ // memoized cards have no other module seam to observe bails through).
75
+ vi.mock("../format-utils", async (importOriginal) => {
76
+ const original = await importOriginal<typeof import("../format-utils")>();
77
+ return { ...original, formatMetaChips: vi.fn(original.formatMetaChips) };
78
+ });
79
+
80
+ beforeEach(() => {
81
+ // useAutoScroll depends on browser APIs absent in happy-dom.
82
+ vi.stubGlobal(
83
+ "IntersectionObserver",
84
+ vi.fn(() => ({
85
+ observe: vi.fn(),
86
+ unobserve: vi.fn(),
87
+ disconnect: vi.fn(),
88
+ })),
89
+ );
90
+ vi.stubGlobal(
91
+ "ResizeObserver",
92
+ vi.fn(() => ({ observe: vi.fn(), unobserve: vi.fn(), disconnect: vi.fn() })),
93
+ );
94
+ });
95
+
96
+ afterEach(() => {
97
+ cleanup();
98
+ vi.unstubAllGlobals();
99
+ });
100
+
101
+ function taskState(overrides: Partial<DerivedTaskState> & { taskName: string }): DerivedTaskState {
102
+ return {
103
+ taskKind: WorkflowTaskKind.http_call,
104
+ status: "completed",
105
+ durationMs: 1_500,
106
+ costMicros: 0n,
107
+ tokensUsed: 0n,
108
+ attemptNumber: 1,
109
+ error: "",
110
+ childExecutionId: "",
111
+ agentSlug: "",
112
+ currentToolName: "",
113
+ messagesCount: 0,
114
+ toolCallsCount: 0,
115
+ inputSummary: null,
116
+ outputSummary: null,
117
+ approvalRequest: null,
118
+ approvalResolution: null,
119
+ ...overrides,
120
+ };
121
+ }
122
+
123
+ function statesOf(...states: DerivedTaskState[]): ReadonlyMap<string, DerivedTaskState> {
124
+ return new Map(states.map((s) => [s.taskName, s]));
125
+ }
126
+
127
+ /**
128
+ * All card root elements, in thread order. Since T06 a preview-kind card's
129
+ * header is a plain layout row (no role) — the shell's `data-cursor-target`
130
+ * is the stable, gesture-independent handle on a card.
131
+ */
132
+ function cardRoots(container: HTMLElement): HTMLElement[] {
133
+ return Array.from(
134
+ container.querySelectorAll<HTMLElement>(
135
+ '[data-cursor-target="workflow-task-row"]',
136
+ ),
137
+ );
138
+ }
139
+
140
+ /** The card root whose header names the task. */
141
+ function cardRootOf(container: HTMLElement, taskName: string): HTMLElement {
142
+ const root = cardRoots(container).find((el) =>
143
+ el.textContent?.includes(taskName),
144
+ );
145
+ if (!root) throw new Error(`no card rendered for task "${taskName}"`);
146
+ return root;
147
+ }
148
+
149
+ describe("WorkflowTaskThread", () => {
150
+ it("renders the streaming empty state while running with no tasks yet", () => {
151
+ render(
152
+ <WorkflowTaskThread taskStates={new Map()} totalTasks={0} isRunning />,
153
+ );
154
+ expect(screen.getByText("Waiting for the first task to start…")).toBeTruthy();
155
+ });
156
+
157
+ it("renders the terminal empty state for event-less finished executions", () => {
158
+ render(
159
+ <WorkflowTaskThread
160
+ taskStates={new Map()}
161
+ totalTasks={0}
162
+ isRunning={false}
163
+ />,
164
+ );
165
+ expect(
166
+ screen.getByText("No task activity was recorded for this execution."),
167
+ ).toBeTruthy();
168
+ });
169
+
170
+ it("shows progress with total and active counts", () => {
171
+ render(
172
+ <WorkflowTaskThread
173
+ taskStates={statesOf(
174
+ taskState({ taskName: "a", status: "completed" }),
175
+ taskState({ taskName: "b", status: "running" }),
176
+ )}
177
+ totalTasks={5}
178
+ isRunning
179
+ />,
180
+ );
181
+ expect(screen.getByText("1 of 5 tasks")).toBeTruthy();
182
+ expect(screen.getByText("1 active")).toBeTruthy();
183
+ });
184
+
185
+ it("renders one card per task in map order with kind labels", () => {
186
+ const { container } = render(
187
+ <WorkflowTaskThread
188
+ taskStates={statesOf(
189
+ taskState({ taskName: "fetch-data" }),
190
+ taskState({ taskName: "notify", taskKind: WorkflowTaskKind.notification }),
191
+ )}
192
+ totalTasks={2}
193
+ isRunning={false}
194
+ />,
195
+ );
196
+ const cards = cardRoots(container);
197
+ expect(cards[0].textContent).toContain("fetch-data");
198
+ expect(cards[0].textContent).toContain("HTTP Call");
199
+ expect(cards[1].textContent).toContain("notify");
200
+ expect(cards[1].textContent).toContain("Notification");
201
+ });
202
+
203
+ it("previews the live agent on a running AGENT_CALL card", () => {
204
+ const { container } = render(
205
+ <WorkflowTaskThread
206
+ taskStates={statesOf(
207
+ taskState({
208
+ taskName: "call-writer",
209
+ taskKind: WorkflowTaskKind.agent_call,
210
+ status: "running",
211
+ agentSlug: "blog-writer",
212
+ currentToolName: "web_search",
213
+ messagesCount: 7,
214
+ toolCallsCount: 3,
215
+ }),
216
+ )}
217
+ totalTasks={1}
218
+ isRunning
219
+ />,
220
+ );
221
+ const card = cardRootOf(container, "call-writer");
222
+ expect(card.textContent).toContain("blog-writer");
223
+ expect(card.textContent).toContain("running web_search");
224
+ expect(card.textContent).toContain("7 msgs · 3 tools");
225
+ });
226
+
227
+ it("previews the first error line on a failed card and shows the attempt count", () => {
228
+ const { container } = render(
229
+ <WorkflowTaskThread
230
+ taskStates={statesOf(
231
+ taskState({
232
+ taskName: "flaky",
233
+ status: "failed",
234
+ attemptNumber: 3,
235
+ error: "connection refused\nlong stack trace",
236
+ }),
237
+ )}
238
+ totalTasks={1}
239
+ isRunning={false}
240
+ />,
241
+ );
242
+ const card = cardRootOf(container, "flaky");
243
+ // The header previews only the first line; the always-visible body of
244
+ // this preview-kind card carries the rest (asserted in its own test).
245
+ expect(within(card).getAllByText(/connection refused/).length).toBeGreaterThan(0);
246
+ expect(card.textContent).toContain("attempt 3");
247
+ });
248
+
249
+ it("previews waiting approval regardless of variant", () => {
250
+ const { container } = render(
251
+ <WorkflowTaskThread
252
+ taskStates={statesOf(
253
+ taskState({
254
+ taskName: "review-gate",
255
+ taskKind: WorkflowTaskKind.human_input,
256
+ status: "waiting_approval",
257
+ }),
258
+ )}
259
+ totalTasks={1}
260
+ isRunning
261
+ />,
262
+ );
263
+ expect(cardRootOf(container, "review-gate").textContent).toContain(
264
+ "Awaiting approval",
265
+ );
266
+ });
267
+
268
+ it("renders no selection or Inspect affordance — the card IS the surface (T06)", () => {
269
+ const { container } = render(
270
+ <WorkflowTaskThread
271
+ taskStates={statesOf(taskState({ taskName: "fetch-data" }))}
272
+ totalTasks={1}
273
+ isRunning={false}
274
+ />,
275
+ );
276
+ // A preview-kind card renders NO interactive header at all: no
277
+ // aria-pressed select gesture, no magnifier — nothing to click but the
278
+ // body's own affordances.
279
+ expect(screen.queryByRole("button")).toBeNull();
280
+ expect(container.querySelector("[aria-pressed]")).toBeNull();
281
+ });
282
+
283
+ it("renders an always-visible preview body for an AGENT_CALL (no chevron, T04) and opens the transcript", () => {
284
+ const onOpenAgentExecution = vi.fn();
285
+ render(
286
+ <WorkflowTaskThread
287
+ taskStates={statesOf(
288
+ taskState({
289
+ taskName: "call-writer",
290
+ taskKind: WorkflowTaskKind.agent_call,
291
+ status: "completed",
292
+ agentSlug: "blog-writer",
293
+ childExecutionId: "aex_child_1",
294
+ costMicros: 120_000n,
295
+ tokensUsed: 4_200n,
296
+ }),
297
+ )}
298
+ totalTasks={1}
299
+ isRunning={false}
300
+ onOpenAgentExecution={onOpenAgentExecution}
301
+ />,
302
+ );
303
+
304
+ // Preview-kind cards carry no expand chevron — the body is always
305
+ // visible (the session preview-card model).
306
+ expect(screen.queryByRole("button", { name: "Expand call-writer" })).toBeNull();
307
+
308
+ fireEvent.click(screen.getByRole("button", { name: "Open transcript" }));
309
+ expect(onOpenAgentExecution).toHaveBeenCalledWith("aex_child_1", "call-writer");
310
+ });
311
+
312
+ it("renders the task's output in the always-visible body from the snapshot (T04)", () => {
313
+ render(
314
+ <WorkflowTaskThread
315
+ taskStates={statesOf(
316
+ taskState({
317
+ taskName: "check_order",
318
+ taskKind: WorkflowTaskKind.validate,
319
+ status: "completed",
320
+ outputSummary: { valid: true },
321
+ }),
322
+ )}
323
+ totalTasks={1}
324
+ isRunning={false}
325
+ taskSnapshotsByName={
326
+ new Map([
327
+ [
328
+ "check_order",
329
+ {
330
+ taskName: "check_order",
331
+ output: { valid: true, errors: [], data: { total: 120 } },
332
+ artifactIds: [],
333
+ } as unknown as WorkflowTask,
334
+ ],
335
+ ])
336
+ }
337
+ />,
338
+ );
339
+
340
+ // The collapsed line names the verdict; the body renders the FULL
341
+ // snapshot output without any expand gesture.
342
+ expect(screen.getByText("valid")).toBeTruthy();
343
+ expect(screen.getByText("Output")).toBeTruthy();
344
+ expect(screen.getByText("Valid")).toBeTruthy(); // humanized key
345
+ // Full-snapshot data — no truncation banner.
346
+ expect(screen.queryByText(/truncated summary/)).toBeNull();
347
+ });
348
+
349
+ it("falls back to the truncated event summary with an honesty banner when no snapshot is available (T04)", () => {
350
+ render(
351
+ <WorkflowTaskThread
352
+ taskStates={statesOf(
353
+ taskState({
354
+ taskName: "total",
355
+ taskKind: WorkflowTaskKind.transform,
356
+ status: "completed",
357
+ outputSummary: { result: 42 },
358
+ }),
359
+ )}
360
+ totalTasks={1}
361
+ isRunning={false}
362
+ />,
363
+ );
364
+
365
+ expect(screen.getByText("Output")).toBeTruthy();
366
+ expect(screen.getByText(/truncated summary/)).toBeTruthy();
367
+ expect(screen.getByText("Result")).toBeTruthy(); // humanized key
368
+ });
369
+
370
+ it("shows the task input in a summary-kind card's chevron detail (T04)", () => {
371
+ // `wait` is one of the few kinds still in summary disclosure after the
372
+ // T05 coverage expansion — the chevron-detail input path lives there.
373
+ render(
374
+ <WorkflowTaskThread
375
+ taskStates={statesOf(
376
+ taskState({
377
+ taskName: "brief_pause",
378
+ taskKind: WorkflowTaskKind.wait,
379
+ status: "completed",
380
+ inputSummary: { duration: "10s" },
381
+ }),
382
+ )}
383
+ totalTasks={1}
384
+ isRunning={false}
385
+ />,
386
+ );
387
+
388
+ // Summary-kind cards expand from the header itself (the session card's
389
+ // own gesture — T06); the detail carries the input.
390
+ const header = screen.getByRole("button", { name: /^brief_pause/ });
391
+ expect(header.getAttribute("aria-expanded")).toBe("false");
392
+ fireEvent.click(header);
393
+ expect(screen.getByText("Input")).toBeTruthy();
394
+ expect(screen.getByText("10s")).toBeTruthy();
395
+ });
396
+
397
+ it("shows the full error in the always-visible body of a failed preview-kind card (T05)", () => {
398
+ // http_call is a preview kind since T05 — a failure needs no expand
399
+ // gesture: the header carries the first line, the body the full error.
400
+ render(
401
+ <WorkflowTaskThread
402
+ taskStates={statesOf(
403
+ taskState({
404
+ taskName: "flaky",
405
+ status: "failed",
406
+ error: "connection refused\nat dial tcp 10.0.0.1:443",
407
+ }),
408
+ )}
409
+ totalTasks={1}
410
+ isRunning={false}
411
+ />,
412
+ );
413
+ expect(screen.queryByRole("button", { name: "Expand flaky" })).toBeNull();
414
+ expect(screen.getByText(/at dial tcp 10\.0\.0\.1:443/)).toBeTruthy();
415
+ });
416
+
417
+ it("shows the full error in a summary-kind card's expanded body", () => {
418
+ render(
419
+ <WorkflowTaskThread
420
+ taskStates={statesOf(
421
+ taskState({
422
+ taskName: "flaky",
423
+ taskKind: WorkflowTaskKind.wait,
424
+ status: "failed",
425
+ error: "connection refused\nat dial tcp 10.0.0.1:443",
426
+ }),
427
+ )}
428
+ totalTasks={1}
429
+ isRunning={false}
430
+ />,
431
+ );
432
+ fireEvent.click(screen.getByRole("button", { name: /^flaky/ }));
433
+ expect(screen.getByText(/at dial tcp 10\.0\.0\.1:443/)).toBeTruthy();
434
+ });
435
+
436
+ it("keeps a card's expanded state across streaming updates (no remount)", () => {
437
+ const running = () =>
438
+ statesOf(
439
+ taskState({ taskName: "settled", taskKind: WorkflowTaskKind.wait }),
440
+ taskState({ taskName: "live", status: "running", messagesCount: 1 }),
441
+ );
442
+ const { rerender } = render(
443
+ <WorkflowTaskThread
444
+ taskStates={running()}
445
+ totalTasks={2}
446
+ isRunning
447
+ />,
448
+ );
449
+ fireEvent.click(screen.getByRole("button", { name: /^settled/ }));
450
+ expect(
451
+ screen
452
+ .getByRole("button", { name: /^settled/ })
453
+ .getAttribute("aria-expanded"),
454
+ ).toBe("true");
455
+
456
+ // A fresh map (as the store produces per event append) with only the
457
+ // live task changed must not reset the settled card's local state.
458
+ rerender(
459
+ <WorkflowTaskThread
460
+ taskStates={statesOf(
461
+ taskState({ taskName: "settled", taskKind: WorkflowTaskKind.wait }),
462
+ taskState({ taskName: "live", status: "running", messagesCount: 2 }),
463
+ )}
464
+ totalTasks={2}
465
+ isRunning
466
+ />,
467
+ );
468
+ expect(
469
+ screen
470
+ .getByRole("button", { name: /^settled/ })
471
+ .getAttribute("aria-expanded"),
472
+ ).toBe("true");
473
+ });
474
+
475
+ it("a streaming append re-renders only the changed card — snapshot-map bodies never invalidate siblings (T04 perf probe)", () => {
476
+ // Both cards are I/O-bearing preview kinds with always-visible bodies
477
+ // fed from the SAME snapshot map. The formatMetaChips spy fires once
478
+ // per card render, so its call log is the per-card render probe.
479
+ const snapshots = new Map<string, WorkflowTask>([
480
+ [
481
+ "settled-check",
482
+ {
483
+ taskName: "settled-check",
484
+ output: { valid: true },
485
+ artifactIds: [],
486
+ } as unknown as WorkflowTask,
487
+ ],
488
+ ]);
489
+ const mkStates = (liveTokens: bigint) =>
490
+ statesOf(
491
+ taskState({
492
+ taskName: "settled-check",
493
+ taskKind: WorkflowTaskKind.validate,
494
+ status: "completed",
495
+ // Distinctive duration → uniquely identifiable in the call log.
496
+ durationMs: 7_777,
497
+ }),
498
+ taskState({
499
+ taskName: "live-llm",
500
+ taskKind: WorkflowTaskKind.llm_call,
501
+ status: "running",
502
+ durationMs: 0,
503
+ tokensUsed: liveTokens,
504
+ }),
505
+ );
506
+
507
+ const { rerender } = render(
508
+ <WorkflowTaskThread
509
+ taskStates={mkStates(100n)}
510
+ totalTasks={2}
511
+ isRunning
512
+ taskSnapshotsByName={snapshots}
513
+ />,
514
+ );
515
+
516
+ const probe = vi.mocked(formatMetaChips);
517
+ probe.mockClear();
518
+ // A fresh map (as the store produces per event append) touching ONLY
519
+ // the live task. The settled card's item keeps identity (structural
520
+ // sharing), its snapshot lookup is unchanged, so its memo must bail.
521
+ rerender(
522
+ <WorkflowTaskThread
523
+ taskStates={mkStates(200n)}
524
+ totalTasks={2}
525
+ isRunning
526
+ taskSnapshotsByName={snapshots}
527
+ />,
528
+ );
529
+
530
+ const renderedDurations = probe.mock.calls.map((c) => c[0]?.durationMs);
531
+ // The live card re-rendered (its token count moved)…
532
+ expect(renderedDurations).toContain(0);
533
+ // …but the settled preview-body card bailed (DD-009/DD-010).
534
+ expect(renderedDurations).not.toContain(7_777);
535
+ });
536
+
537
+ it("renders a fan-out as overlapping running cards in first-started order (D-T02-1)", () => {
538
+ // The concurrency shape of the fan-out fixture (four branches live at
539
+ // once after prepare settled): the flat model shows parallelism as
540
+ // multiple simultaneously-running cards under an honest progress line.
541
+ const { container } = render(
542
+ <WorkflowTaskThread
543
+ taskStates={statesOf(
544
+ taskState({ taskName: "prepare", status: "completed" }),
545
+ taskState({ taskName: "fetch-us", status: "running" }),
546
+ taskState({ taskName: "fetch-eu", status: "running" }),
547
+ taskState({ taskName: "fetch-apac", status: "running" }),
548
+ taskState({ taskName: "fetch-latam", status: "running" }),
549
+ )}
550
+ totalTasks={6}
551
+ isRunning
552
+ />,
553
+ );
554
+
555
+ const cards = cardRoots(container);
556
+ const expectedOrder = [
557
+ "prepare",
558
+ "fetch-us",
559
+ "fetch-eu",
560
+ "fetch-apac",
561
+ "fetch-latam",
562
+ ];
563
+ expect(cards).toHaveLength(expectedOrder.length);
564
+ expectedOrder.forEach((name, i) => {
565
+ expect(cards[i].textContent?.startsWith(name)).toBe(true);
566
+ });
567
+ expect(screen.getByText("1 of 6 tasks")).toBeTruthy();
568
+ expect(screen.getByText("4 active")).toBeTruthy();
569
+ });
570
+
571
+ it("mounts the jump-to-latest affordance (hidden while following)", () => {
572
+ const { container } = render(
573
+ <WorkflowTaskThread
574
+ taskStates={statesOf(taskState({ taskName: "a" }))}
575
+ totalTasks={1}
576
+ isRunning
577
+ />,
578
+ );
579
+ // Following is the initial auto-scroll state, so the button is mounted
580
+ // but aria-hidden (it fades in only once the user scrolls up) — query
581
+ // by attribute, not by role, since it is out of the a11y tree.
582
+ const button = container.querySelector('[aria-label="Jump to latest"]');
583
+ expect(button).toBeTruthy();
584
+ expect(button?.getAttribute("aria-hidden")).toBe("true");
585
+ });
586
+ });
587
+
588
+ // ---------------------------------------------------------------------------
589
+ // In-thread HITL (S10)
590
+ // ---------------------------------------------------------------------------
591
+
592
+ function makeHitl(overrides: Partial<WorkflowThreadHitl> = {}): WorkflowThreadHitl {
593
+ return {
594
+ submitApproval: vi.fn(),
595
+ approvalSubmittingToolCallIds: new Set<string>(),
596
+ approvalErrorsByToolCallId: new Map<string, Error>(),
597
+ submitTaskApproval: vi.fn(),
598
+ taskApprovalSubmittingTaskNames: new Set<string>(),
599
+ taskApprovalErrorsByTaskName: new Map<string, Error>(),
600
+ submitFileDecision: vi.fn(),
601
+ fileDecisionSubmittingKeys: new Set<string>(),
602
+ fileDecisionErrorsByKey: new Map<string, Error>(),
603
+ ...overrides,
604
+ };
605
+ }
606
+
607
+ function pendingApproval(
608
+ childId: string,
609
+ toolCallId: string,
610
+ toolName = "delete_repository",
611
+ ): WorkflowPendingApproval {
612
+ return create(WorkflowPendingApprovalSchema, {
613
+ childAgentExecutionId: childId,
614
+ approval: {
615
+ toolCallId,
616
+ toolName,
617
+ message: `Run ${toolName}?`,
618
+ argsPreview: '{"target": "acme/repo"}',
619
+ requestedAt: "2026-07-16T00:00:00Z",
620
+ },
621
+ });
622
+ }
623
+
624
+ function pendingFileReview(
625
+ childId: string,
626
+ changeSetIds: string[] = ["cs-1"],
627
+ ): WorkflowPendingFileReview {
628
+ return create(WorkflowPendingFileReviewSchema, {
629
+ childAgentExecutionId: childId,
630
+ changeSetId: changeSetIds,
631
+ });
632
+ }
633
+
634
+ /** A gating AGENT_CALL task bound to its child execution. */
635
+ function gatedAgentCall(taskName: string, childId: string): DerivedTaskState {
636
+ return taskState({
637
+ taskName,
638
+ taskKind: WorkflowTaskKind.agent_call,
639
+ status: "waiting_approval",
640
+ durationMs: 0,
641
+ childExecutionId: childId,
642
+ agentSlug: "helper",
643
+ });
644
+ }
645
+
646
+ /**
647
+ * A gating human_input task carrying its captured `approval_requested`
648
+ * payload — the shape the store derives once the gate's event arrives.
649
+ */
650
+ function gatedHumanInput(
651
+ taskName: string,
652
+ overrides: Partial<DerivedTaskState> = {},
653
+ ): DerivedTaskState {
654
+ return taskState({
655
+ taskName,
656
+ taskKind: WorkflowTaskKind.human_input,
657
+ status: "waiting_approval",
658
+ durationMs: 0,
659
+ approvalRequest: create(ApprovalRequestedPayloadSchema, {
660
+ prompt: "Ship the release?",
661
+ outcomes: [
662
+ { name: "ship", label: "Ship It" },
663
+ { name: "hold", label: "Hold" },
664
+ ],
665
+ }),
666
+ ...overrides,
667
+ });
668
+ }
669
+
670
+ describe("WorkflowTaskThread — in-thread HITL (S10)", () => {
671
+ it("renders the canonical ApprovalCard on the gating card, visible WITHOUT expanding, and routes the decision through the workflow-level submit", () => {
672
+ const hitl = makeHitl();
673
+ render(
674
+ <WorkflowTaskThread
675
+ taskStates={statesOf(gatedAgentCall("call-helper", "aex_1"))}
676
+ totalTasks={1}
677
+ isRunning
678
+ hitl={hitl}
679
+ pendingApprovals={[pendingApproval("aex_1", "tc-1")]}
680
+ />,
681
+ );
682
+
683
+ // The decision surface is present with no expand gesture at all —
684
+ // agent_call is a preview-kind card and carries no chevron (T04).
685
+ expect(
686
+ screen.queryByRole("button", { name: "Expand call-helper" }),
687
+ ).toBeNull();
688
+ const card = screen.getByRole("alert", {
689
+ name: "Approval required for delete_repository",
690
+ });
691
+ expect(card).toBeTruthy();
692
+
693
+ fireEvent.click(within(card).getByRole("button", { name: "Approve" }));
694
+ expect(hitl.submitApproval).toHaveBeenCalledWith(
695
+ "tc-1",
696
+ ApprovalAction.APPROVE,
697
+ undefined,
698
+ );
699
+ });
700
+
701
+ it("scopes each gate to its owning card when parallel children gate at once", () => {
702
+ const { container } = render(
703
+ <WorkflowTaskThread
704
+ taskStates={statesOf(
705
+ gatedAgentCall("call-a", "aex_a"),
706
+ gatedAgentCall("call-b", "aex_b"),
707
+ )}
708
+ totalTasks={2}
709
+ isRunning
710
+ hitl={makeHitl()}
711
+ pendingApprovals={[
712
+ pendingApproval("aex_a", "tc-a", "tool_for_a"),
713
+ pendingApproval("aex_b", "tc-b", "tool_for_b"),
714
+ ]}
715
+ />,
716
+ );
717
+
718
+ expect(
719
+ within(cardRootOf(container, "call-a")).getByRole("alert", {
720
+ name: "Approval required for tool_for_a",
721
+ }),
722
+ ).toBeTruthy();
723
+ expect(
724
+ within(cardRootOf(container, "call-b")).getByRole("alert", {
725
+ name: "Approval required for tool_for_b",
726
+ }),
727
+ ).toBeTruthy();
728
+ expect(
729
+ within(cardRootOf(container, "call-a")).queryByRole("alert", {
730
+ name: "Approval required for tool_for_b",
731
+ }),
732
+ ).toBeNull();
733
+ });
734
+
735
+ it("hands the card's file-review references to WorkflowFileReviewList filtered to its child, decisions on the workflow path", () => {
736
+ const hitl = makeHitl();
737
+ render(
738
+ <WorkflowTaskThread
739
+ taskStates={statesOf(gatedAgentCall("call-helper", "aex_1"))}
740
+ totalTasks={1}
741
+ isRunning
742
+ hitl={hitl}
743
+ pendingFileReviews={[
744
+ pendingFileReview("aex_1", ["cs-1"]),
745
+ // Another child's reference must NOT reach this card's list.
746
+ pendingFileReview("aex_other", ["cs-9"]),
747
+ ]}
748
+ />,
749
+ );
750
+
751
+ const stub = screen.getByTestId("file-review-list-stub");
752
+ expect(within(stub).getByText("decide-files-aex_1")).toBeTruthy();
753
+ expect(within(stub).queryByText("decide-files-aex_other")).toBeNull();
754
+
755
+ fireEvent.click(within(stub).getByText("decide-files-aex_1"));
756
+ expect(hitl.submitFileDecision).toHaveBeenCalledWith("aex_1", "cs-1", 1);
757
+ });
758
+
759
+ it("renders the FULL review gate on a pending human_input card and routes the decision through the workflow-level submit (T06)", () => {
760
+ const hitl = makeHitl();
761
+ render(
762
+ <WorkflowTaskThread
763
+ taskStates={statesOf(gatedHumanInput("review-gate"))}
764
+ totalTasks={1}
765
+ isRunning
766
+ hitl={hitl}
767
+ />,
768
+ );
769
+
770
+ // The real decision surface — prompt, configured outcomes — right on
771
+ // the card, no drill-down gesture in between.
772
+ const form = screen.getByRole("form", {
773
+ name: "Approval decision for review-gate",
774
+ });
775
+ expect(within(form).getByText("Ship the release?")).toBeTruthy();
776
+
777
+ fireEvent.click(within(form).getByRole("button", { name: "Ship It" }));
778
+ expect(hitl.submitTaskApproval).toHaveBeenCalledWith(
779
+ "review-gate",
780
+ "ship",
781
+ undefined,
782
+ undefined,
783
+ );
784
+ });
785
+
786
+ it("degrades to an honest waiting notice when the gate's request payload was never captured (snapshot fallback path)", () => {
787
+ render(
788
+ <WorkflowTaskThread
789
+ taskStates={statesOf(
790
+ taskState({
791
+ taskName: "review-gate",
792
+ taskKind: WorkflowTaskKind.human_input,
793
+ status: "waiting_approval",
794
+ durationMs: 0,
795
+ // No approvalRequest: an event-less mount (terminal snapshot
796
+ // fallback) cannot present review material it does not have.
797
+ }),
798
+ )}
799
+ totalTasks={1}
800
+ isRunning
801
+ hitl={makeHitl()}
802
+ />,
803
+ );
804
+
805
+ expect(screen.getByText("Review required to continue this run.")).toBeTruthy();
806
+ expect(screen.queryByRole("form")).toBeNull();
807
+ });
808
+
809
+ it("reports a resolved gate's decision read-only in the card body — never a second decision surface (T06)", () => {
810
+ render(
811
+ <WorkflowTaskThread
812
+ taskStates={statesOf(
813
+ gatedHumanInput("review-gate", {
814
+ status: "completed",
815
+ durationMs: 900,
816
+ approvalResolution: create(ApprovalResolvedPayloadSchema, {
817
+ resolvedBy: "alice",
818
+ comment: "LGTM",
819
+ waitDurationMs: 30_000n,
820
+ }),
821
+ }),
822
+ )}
823
+ totalTasks={1}
824
+ isRunning={false}
825
+ hitl={makeHitl()}
826
+ taskSnapshotsByName={
827
+ new Map([
828
+ [
829
+ "review-gate",
830
+ {
831
+ taskName: "review-gate",
832
+ // The canonical decision record: the runner persists the
833
+ // reviewer's response as the task output.
834
+ output: { outcome: "ship", reviewer: "alice", comment: "LGTM" },
835
+ artifactIds: [],
836
+ } as unknown as WorkflowTask,
837
+ ],
838
+ ])
839
+ }
840
+ />,
841
+ );
842
+
843
+ // The decision report renders the chosen outcome's configured label…
844
+ expect(screen.getByText("Ship It")).toBeTruthy();
845
+ expect(screen.getByText(/alice/)).toBeTruthy();
846
+ // …and no decision-collecting form is offered again.
847
+ expect(screen.queryByRole("form")).toBeNull();
848
+ });
849
+
850
+ it("offers the child transcript when an agent-call gates with no surfaced snapshot gates (the cloud refetch window / the OSS steady state)", () => {
851
+ const onOpenAgentExecution = vi.fn();
852
+ render(
853
+ <WorkflowTaskThread
854
+ taskStates={statesOf(gatedAgentCall("call-helper", "aex_1"))}
855
+ totalTasks={1}
856
+ isRunning
857
+ onOpenAgentExecution={onOpenAgentExecution}
858
+ hitl={makeHitl()}
859
+ pendingApprovals={[]}
860
+ pendingFileReviews={[]}
861
+ />,
862
+ );
863
+
864
+ expect(
865
+ screen.getByText(/The called agent is waiting for an approval/),
866
+ ).toBeTruthy();
867
+ fireEvent.click(screen.getByRole("button", { name: "Open transcript" }));
868
+ expect(onOpenAgentExecution).toHaveBeenCalledWith("aex_1", "call-helper");
869
+ });
870
+
871
+ it("stays read-only when hitl is omitted (DD-011), even with gates surfaced", () => {
872
+ render(
873
+ <WorkflowTaskThread
874
+ taskStates={statesOf(
875
+ gatedAgentCall("call-helper", "aex_1"),
876
+ gatedHumanInput("review-gate"),
877
+ )}
878
+ totalTasks={2}
879
+ isRunning
880
+ pendingApprovals={[pendingApproval("aex_1", "tc-1")]}
881
+ />,
882
+ );
883
+
884
+ expect(screen.queryByRole("alert")).toBeNull();
885
+ expect(screen.queryByRole("form")).toBeNull();
886
+ expect(screen.queryByText(/waiting for an approval/)).toBeNull();
887
+ });
888
+
889
+ it("surfaces a gate's failed decision in-card, keyed to its toolCallId", () => {
890
+ render(
891
+ <WorkflowTaskThread
892
+ taskStates={statesOf(gatedAgentCall("call-helper", "aex_1"))}
893
+ totalTasks={1}
894
+ isRunning
895
+ hitl={makeHitl({
896
+ approvalErrorsByToolCallId: new Map([
897
+ ["tc-1", new Error("boom-42: gate submit failed")],
898
+ ]),
899
+ })}
900
+ pendingApprovals={[pendingApproval("aex_1", "tc-1")]}
901
+ />,
902
+ );
903
+
904
+ expect(screen.getByText(/boom-42: gate submit failed/)).toBeTruthy();
905
+ });
906
+
907
+ it("re-renders only the gating card when gate state churns (sibling memo probe)", () => {
908
+ const taskStates = statesOf(
909
+ // Distinctive metrics make the settled card's formatMetaChips calls
910
+ // uniquely identifiable in the probe's call log.
911
+ taskState({ taskName: "settled", durationMs: 7_777 }),
912
+ gatedAgentCall("call-helper", "aex_1"),
913
+ );
914
+ const approvals = [pendingApproval("aex_1", "tc-1")];
915
+
916
+ const { rerender } = render(
917
+ <WorkflowTaskThread
918
+ taskStates={taskStates}
919
+ totalTasks={2}
920
+ isRunning
921
+ hitl={makeHitl()}
922
+ pendingApprovals={approvals}
923
+ />,
924
+ );
925
+
926
+ const probe = vi.mocked(formatMetaChips);
927
+ probe.mockClear();
928
+
929
+ // A decision goes in flight: the actions hook re-materializes the bundle
930
+ // (fresh submitting Set) — exactly the churn streaming decisions cause.
931
+ rerender(
932
+ <WorkflowTaskThread
933
+ taskStates={taskStates}
934
+ totalTasks={2}
935
+ isRunning
936
+ hitl={makeHitl({ approvalSubmittingToolCallIds: new Set(["tc-1"]) })}
937
+ pendingApprovals={approvals}
938
+ />,
939
+ );
940
+
941
+ const renderedDurations = probe.mock.calls.map((c) => c[0]?.durationMs);
942
+ // The gating card re-rendered (its spinner state moved)…
943
+ expect(renderedDurations).toContain(0);
944
+ // …but the settled sibling bailed (DD-009/DD-010).
945
+ expect(renderedDurations).not.toContain(7_777);
946
+ });
947
+ });