@stigmer/react 3.12.1 → 3.12.3

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 (708) hide show
  1. package/access/ManageAccessDialog.d.ts.map +1 -1
  2. package/access/ManageAccessDialog.js +8 -19
  3. package/access/ManageAccessDialog.js.map +1 -1
  4. package/activity/format-relative-time.d.ts +11 -9
  5. package/activity/format-relative-time.d.ts.map +1 -1
  6. package/activity/format-relative-time.js +11 -9
  7. package/activity/format-relative-time.js.map +1 -1
  8. package/agent/steps/CapabilitiesStep.js +5 -2
  9. package/agent/steps/CapabilitiesStep.js.map +1 -1
  10. package/agent/steps/IdentityStep.d.ts.map +1 -1
  11. package/agent/steps/IdentityStep.js +6 -5
  12. package/agent/steps/IdentityStep.js.map +1 -1
  13. package/agent-instance/CreateAgentInstanceDialog.d.ts.map +1 -1
  14. package/agent-instance/CreateAgentInstanceDialog.js +15 -20
  15. package/agent-instance/CreateAgentInstanceDialog.js.map +1 -1
  16. package/api-key/ApiKeyCreatedAlert.d.ts.map +1 -1
  17. package/api-key/ApiKeyCreatedAlert.js +12 -20
  18. package/api-key/ApiKeyCreatedAlert.js.map +1 -1
  19. package/api-key/ApiKeyListPanel.d.ts.map +1 -1
  20. package/api-key/ApiKeyListPanel.js +3 -23
  21. package/api-key/ApiKeyListPanel.js.map +1 -1
  22. package/api-key/CreateApiKeyForm.d.ts.map +1 -1
  23. package/api-key/CreateApiKeyForm.js +6 -10
  24. package/api-key/CreateApiKeyForm.js.map +1 -1
  25. package/approval-defaults-context.d.ts +47 -0
  26. package/approval-defaults-context.d.ts.map +1 -0
  27. package/approval-defaults-context.js +27 -0
  28. package/approval-defaults-context.js.map +1 -0
  29. package/attachment/AttachmentImageLightbox.d.ts.map +1 -1
  30. package/attachment/AttachmentImageLightbox.js +8 -23
  31. package/attachment/AttachmentImageLightbox.js.map +1 -1
  32. package/attachment/index.d.ts +2 -0
  33. package/attachment/index.d.ts.map +1 -1
  34. package/attachment/index.js +1 -0
  35. package/attachment/index.js.map +1 -1
  36. package/attachment/vision-preflight.d.ts +113 -0
  37. package/attachment/vision-preflight.d.ts.map +1 -0
  38. package/attachment/vision-preflight.js +143 -0
  39. package/attachment/vision-preflight.js.map +1 -0
  40. package/billing/AutoRechargeCard.d.ts.map +1 -1
  41. package/billing/AutoRechargeCard.js +3 -2
  42. package/billing/AutoRechargeCard.js.map +1 -1
  43. package/billing/BillingSection.d.ts.map +1 -1
  44. package/billing/BillingSection.js +3 -2
  45. package/billing/BillingSection.js.map +1 -1
  46. package/channel/ChannelConversationsDialog.d.ts.map +1 -1
  47. package/channel/ChannelConversationsDialog.js +6 -21
  48. package/channel/ChannelConversationsDialog.js.map +1 -1
  49. package/channel/ChannelCredentialsDialog.d.ts.map +1 -1
  50. package/channel/ChannelCredentialsDialog.js +10 -21
  51. package/channel/ChannelCredentialsDialog.js.map +1 -1
  52. package/channel/ChannelTemplatesDialog.d.ts.map +1 -1
  53. package/channel/ChannelTemplatesDialog.js +7 -22
  54. package/channel/ChannelTemplatesDialog.js.map +1 -1
  55. package/channel/ConnectSlackDialog.d.ts.map +1 -1
  56. package/channel/ConnectSlackDialog.js +10 -23
  57. package/channel/ConnectSlackDialog.js.map +1 -1
  58. package/channel/ConnectWhatsAppDialog.d.ts.map +1 -1
  59. package/channel/ConnectWhatsAppDialog.js +10 -23
  60. package/channel/ConnectWhatsAppDialog.js.map +1 -1
  61. package/channel/useChannelSessions.d.ts.map +1 -1
  62. package/channel/useChannelSessions.js.map +1 -1
  63. package/channel-app/ChannelAppDetailPanel.d.ts.map +1 -1
  64. package/channel-app/ChannelAppDetailPanel.js +8 -5
  65. package/channel-app/ChannelAppDetailPanel.js.map +1 -1
  66. package/channel-app/CreateChannelAppForm.d.ts.map +1 -1
  67. package/channel-app/CreateChannelAppForm.js +12 -7
  68. package/channel-app/CreateChannelAppForm.js.map +1 -1
  69. package/channel-app/internal.d.ts +0 -1
  70. package/channel-app/internal.d.ts.map +1 -1
  71. package/channel-app/internal.js +5 -10
  72. package/channel-app/internal.js.map +1 -1
  73. package/composer/ComposerToolbar.js +2 -1
  74. package/composer/ComposerToolbar.js.map +1 -1
  75. package/composer/SessionComposer.d.ts +1 -1
  76. package/composer/SessionComposer.d.ts.map +1 -1
  77. package/composer/SessionComposer.js +120 -13
  78. package/composer/SessionComposer.js.map +1 -1
  79. package/composer/icons.d.ts +0 -1
  80. package/composer/icons.d.ts.map +1 -1
  81. package/composer/icons.js +0 -3
  82. package/composer/icons.js.map +1 -1
  83. package/conversation/ConversationAttentionBanner.d.ts +23 -6
  84. package/conversation/ConversationAttentionBanner.d.ts.map +1 -1
  85. package/conversation/ConversationAttentionBanner.js +25 -10
  86. package/conversation/ConversationAttentionBanner.js.map +1 -1
  87. package/conversation/ConversationComposer.js +1 -1
  88. package/conversation/ConversationComposer.js.map +1 -1
  89. package/conversation/ConversationListPane.d.ts.map +1 -1
  90. package/conversation/ConversationListPane.js +28 -8
  91. package/conversation/ConversationListPane.js.map +1 -1
  92. package/conversation/ConversationsWorkbench.d.ts.map +1 -1
  93. package/conversation/ConversationsWorkbench.js +1 -1
  94. package/conversation/ConversationsWorkbench.js.map +1 -1
  95. package/cursor-accounts/MemberCoverageTable.js +3 -14
  96. package/cursor-accounts/MemberCoverageTable.js.map +1 -1
  97. package/dashboard/DashboardFailedRuns.d.ts.map +1 -1
  98. package/dashboard/DashboardFailedRuns.js +2 -14
  99. package/dashboard/DashboardFailedRuns.js.map +1 -1
  100. package/environment/CreateEnvironmentForm.d.ts.map +1 -1
  101. package/environment/CreateEnvironmentForm.js +4 -8
  102. package/environment/CreateEnvironmentForm.js.map +1 -1
  103. package/environment/EnvVarForm.d.ts.map +1 -1
  104. package/environment/EnvVarForm.js +2 -4
  105. package/environment/EnvVarForm.js.map +1 -1
  106. package/environment/EnvironmentVariableEditor.d.ts.map +1 -1
  107. package/environment/EnvironmentVariableEditor.js +5 -7
  108. package/environment/EnvironmentVariableEditor.js.map +1 -1
  109. package/execution/ApprovalCard.d.ts.map +1 -1
  110. package/execution/ApprovalCard.js +13 -3
  111. package/execution/ApprovalCard.js.map +1 -1
  112. package/execution/ArtifactApplyButton.d.ts.map +1 -1
  113. package/execution/ArtifactApplyButton.js +2 -4
  114. package/execution/ArtifactApplyButton.js.map +1 -1
  115. package/execution/ArtifactPreviewModal.d.ts.map +1 -1
  116. package/execution/ArtifactPreviewModal.js +11 -17
  117. package/execution/ArtifactPreviewModal.js.map +1 -1
  118. package/execution/ExecutionErrorNotice.d.ts +36 -0
  119. package/execution/ExecutionErrorNotice.d.ts.map +1 -0
  120. package/execution/ExecutionErrorNotice.js +39 -0
  121. package/execution/ExecutionErrorNotice.js.map +1 -0
  122. package/execution/FilePathLink.d.ts.map +1 -1
  123. package/execution/FilePathLink.js +5 -8
  124. package/execution/FilePathLink.js.map +1 -1
  125. package/execution/FileReviewCard.d.ts.map +1 -1
  126. package/execution/FileReviewCard.js +1 -6
  127. package/execution/FileReviewCard.js.map +1 -1
  128. package/execution/FollowUpInput.d.ts.map +1 -1
  129. package/execution/FollowUpInput.js +1 -3
  130. package/execution/FollowUpInput.js.map +1 -1
  131. package/execution/LivenessStatusLine.d.ts +40 -0
  132. package/execution/LivenessStatusLine.d.ts.map +1 -0
  133. package/execution/LivenessStatusLine.js +34 -0
  134. package/execution/LivenessStatusLine.js.map +1 -0
  135. package/execution/MessageEntry.d.ts.map +1 -1
  136. package/execution/MessageEntry.js +31 -3
  137. package/execution/MessageEntry.js.map +1 -1
  138. package/execution/MessageThread.d.ts +25 -0
  139. package/execution/MessageThread.d.ts.map +1 -1
  140. package/execution/MessageThread.js +51 -36
  141. package/execution/MessageThread.js.map +1 -1
  142. package/execution/SetupProgress.d.ts.map +1 -1
  143. package/execution/SetupProgress.js +1 -1
  144. package/execution/SetupProgress.js.map +1 -1
  145. package/execution/SubAgentSection.d.ts.map +1 -1
  146. package/execution/SubAgentSection.js +9 -7
  147. package/execution/SubAgentSection.js.map +1 -1
  148. package/execution/TerminalSession.d.ts +30 -0
  149. package/execution/TerminalSession.d.ts.map +1 -1
  150. package/execution/TerminalSession.js +37 -1
  151. package/execution/TerminalSession.js.map +1 -1
  152. package/execution/ToolCallDetail.d.ts +9 -0
  153. package/execution/ToolCallDetail.d.ts.map +1 -1
  154. package/execution/ToolCallDetail.js +16 -0
  155. package/execution/ToolCallDetail.js.map +1 -1
  156. package/execution/ToolCallItem.d.ts +23 -7
  157. package/execution/ToolCallItem.d.ts.map +1 -1
  158. package/execution/ToolCallItem.js +120 -35
  159. package/execution/ToolCallItem.js.map +1 -1
  160. package/execution/ToolRunGroup.d.ts.map +1 -1
  161. package/execution/ToolRunGroup.js +11 -11
  162. package/execution/ToolRunGroup.js.map +1 -1
  163. package/execution/WriteBackCard.d.ts.map +1 -1
  164. package/execution/WriteBackCard.js +5 -20
  165. package/execution/WriteBackCard.js.map +1 -1
  166. package/execution/index.d.ts +7 -3
  167. package/execution/index.d.ts.map +1 -1
  168. package/execution/index.js +4 -2
  169. package/execution/index.js.map +1 -1
  170. package/execution/tool-categories.d.ts +93 -7
  171. package/execution/tool-categories.d.ts.map +1 -1
  172. package/execution/tool-categories.js +141 -5
  173. package/execution/tool-categories.js.map +1 -1
  174. package/execution/tool-presenter.d.ts +32 -1
  175. package/execution/tool-presenter.d.ts.map +1 -1
  176. package/execution/tool-presenter.js +10 -2
  177. package/execution/tool-presenter.js.map +1 -1
  178. package/execution/useArtifactInspection.d.ts.map +1 -1
  179. package/execution/useArtifactInspection.js +4 -7
  180. package/execution/useArtifactInspection.js.map +1 -1
  181. package/iam-policy/GrantAccessForm.d.ts.map +1 -1
  182. package/iam-policy/GrantAccessForm.js +2 -4
  183. package/iam-policy/GrantAccessForm.js.map +1 -1
  184. package/iam-policy/OrgMembersPanel.d.ts.map +1 -1
  185. package/iam-policy/OrgMembersPanel.js +3 -5
  186. package/iam-policy/OrgMembersPanel.js.map +1 -1
  187. package/iam-policy/RoleSelector.d.ts.map +1 -1
  188. package/iam-policy/RoleSelector.js +7 -1
  189. package/iam-policy/RoleSelector.js.map +1 -1
  190. package/identity-provider/CreateIdentityProviderForm.d.ts.map +1 -1
  191. package/identity-provider/CreateIdentityProviderForm.js +6 -9
  192. package/identity-provider/CreateIdentityProviderForm.js.map +1 -1
  193. package/identity-provider/IdentityProviderDetailPanel.d.ts.map +1 -1
  194. package/identity-provider/IdentityProviderDetailPanel.js +17 -26
  195. package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
  196. package/identity-provider/IdentityProviderListPanel.d.ts.map +1 -1
  197. package/identity-provider/IdentityProviderListPanel.js +2 -4
  198. package/identity-provider/IdentityProviderListPanel.js.map +1 -1
  199. package/identity-provider/IdentityProviderWizard.d.ts.map +1 -1
  200. package/identity-provider/IdentityProviderWizard.js +8 -7
  201. package/identity-provider/IdentityProviderWizard.js.map +1 -1
  202. package/identity-provider/SsoLoginPrompt.js +5 -6
  203. package/identity-provider/SsoLoginPrompt.js.map +1 -1
  204. package/index.d.ts +9 -8
  205. package/index.d.ts.map +1 -1
  206. package/index.js +4 -4
  207. package/index.js.map +1 -1
  208. package/internal/DecisionButton.d.ts.map +1 -1
  209. package/internal/DecisionButton.js +1 -6
  210. package/internal/DecisionButton.js.map +1 -1
  211. package/internal/DialogShell.d.ts +77 -0
  212. package/internal/DialogShell.d.ts.map +1 -0
  213. package/internal/DialogShell.js +77 -0
  214. package/internal/DialogShell.js.map +1 -0
  215. package/internal/SpinnerIcon.d.ts +22 -0
  216. package/internal/SpinnerIcon.d.ts.map +1 -0
  217. package/internal/SpinnerIcon.js +23 -0
  218. package/internal/SpinnerIcon.js.map +1 -0
  219. package/internal/select-element-text.d.ts +11 -0
  220. package/internal/select-element-text.d.ts.map +1 -0
  221. package/internal/select-element-text.js +19 -0
  222. package/internal/select-element-text.js.map +1 -0
  223. package/internal/thread-card/ThreadCardShell.d.ts +27 -10
  224. package/internal/thread-card/ThreadCardShell.d.ts.map +1 -1
  225. package/internal/thread-card/ThreadCardShell.js +11 -5
  226. package/internal/thread-card/ThreadCardShell.js.map +1 -1
  227. package/internal/thread-card/glyphs.d.ts +11 -2
  228. package/internal/thread-card/glyphs.d.ts.map +1 -1
  229. package/internal/thread-card/glyphs.js +9 -3
  230. package/internal/thread-card/glyphs.js.map +1 -1
  231. package/internal/thread-card/index.d.ts +1 -1
  232. package/internal/thread-card/index.d.ts.map +1 -1
  233. package/internal/thread-card/index.js.map +1 -1
  234. package/internal/useCopyFeedback.d.ts +28 -0
  235. package/internal/useCopyFeedback.d.ts.map +1 -0
  236. package/internal/useCopyFeedback.js +40 -0
  237. package/internal/useCopyFeedback.js.map +1 -0
  238. package/invitation/InvitationCreatedAlert.d.ts.map +1 -1
  239. package/invitation/InvitationCreatedAlert.js +12 -19
  240. package/invitation/InvitationCreatedAlert.js.map +1 -1
  241. package/invitation/InvitationManager.d.ts.map +1 -1
  242. package/invitation/InvitationManager.js +14 -21
  243. package/invitation/InvitationManager.js.map +1 -1
  244. package/invitation/InvitationRedemption.d.ts.map +1 -1
  245. package/invitation/InvitationRedemption.js +2 -4
  246. package/invitation/InvitationRedemption.js.map +1 -1
  247. package/library/useExportResource.d.ts.map +1 -1
  248. package/library/useExportResource.js +16 -27
  249. package/library/useExportResource.js.map +1 -1
  250. package/manifest/ApplyManifestDialog.d.ts.map +1 -1
  251. package/manifest/ApplyManifestDialog.js +7 -17
  252. package/manifest/ApplyManifestDialog.js.map +1 -1
  253. package/manifest/EditResourceYamlDialog.d.ts.map +1 -1
  254. package/manifest/EditResourceYamlDialog.js +3 -19
  255. package/manifest/EditResourceYamlDialog.js.map +1 -1
  256. package/mcp-server/DefinitionDriftNotice.d.ts +42 -0
  257. package/mcp-server/DefinitionDriftNotice.d.ts.map +1 -0
  258. package/mcp-server/DefinitionDriftNotice.js +52 -0
  259. package/mcp-server/DefinitionDriftNotice.js.map +1 -0
  260. package/mcp-server/McpServerConnectDialog.d.ts.map +1 -1
  261. package/mcp-server/McpServerConnectDialog.js +8 -20
  262. package/mcp-server/McpServerConnectDialog.js.map +1 -1
  263. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  264. package/mcp-server/McpServerDetailView.js +50 -28
  265. package/mcp-server/McpServerDetailView.js.map +1 -1
  266. package/mcp-server/OAuthAppForm.d.ts.map +1 -1
  267. package/mcp-server/OAuthAppForm.js +2 -4
  268. package/mcp-server/OAuthAppForm.js.map +1 -1
  269. package/mcp-server/internal/definitionDrift.d.ts +39 -0
  270. package/mcp-server/internal/definitionDrift.d.ts.map +1 -0
  271. package/mcp-server/internal/definitionDrift.js +122 -0
  272. package/mcp-server/internal/definitionDrift.js.map +1 -0
  273. package/mcp-server/internal/mcpServerToInput.d.ts.map +1 -1
  274. package/mcp-server/internal/mcpServerToInput.js +3 -0
  275. package/mcp-server/internal/mcpServerToInput.js.map +1 -1
  276. package/mcp-server/steps/EnvironmentAuthStep.d.ts.map +1 -1
  277. package/mcp-server/steps/EnvironmentAuthStep.js +8 -4
  278. package/mcp-server/steps/EnvironmentAuthStep.js.map +1 -1
  279. package/mcp-server/steps/IdentityTransportStep.d.ts.map +1 -1
  280. package/mcp-server/steps/IdentityTransportStep.js +5 -4
  281. package/mcp-server/steps/IdentityTransportStep.js.map +1 -1
  282. package/mcp-server/useMcpServerConnect.d.ts +1 -1
  283. package/mcp-server/useMcpServerDefinitionDrift.d.ts +44 -0
  284. package/mcp-server/useMcpServerDefinitionDrift.d.ts.map +1 -0
  285. package/mcp-server/useMcpServerDefinitionDrift.js +61 -0
  286. package/mcp-server/useMcpServerDefinitionDrift.js.map +1 -0
  287. package/models/ModelRegistryContext.d.ts +7 -1
  288. package/models/ModelRegistryContext.d.ts.map +1 -1
  289. package/models/ModelRegistryContext.js.map +1 -1
  290. package/models/ModelSelector.js +9 -1
  291. package/models/ModelSelector.js.map +1 -1
  292. package/models/index.d.ts +2 -2
  293. package/models/index.d.ts.map +1 -1
  294. package/models/index.js +1 -1
  295. package/models/index.js.map +1 -1
  296. package/models/registry.d.ts +88 -6
  297. package/models/registry.d.ts.map +1 -1
  298. package/models/registry.js +133 -27
  299. package/models/registry.js.map +1 -1
  300. package/models/useModelRegistry.d.ts +7 -1
  301. package/models/useModelRegistry.d.ts.map +1 -1
  302. package/models/useModelRegistry.js +3 -2
  303. package/models/useModelRegistry.js.map +1 -1
  304. package/oauth-app/CreateOAuthAppForm.d.ts.map +1 -1
  305. package/oauth-app/CreateOAuthAppForm.js +4 -5
  306. package/oauth-app/CreateOAuthAppForm.js.map +1 -1
  307. package/oauth-app/OAuthAppDetailPanel.d.ts.map +1 -1
  308. package/oauth-app/OAuthAppDetailPanel.js +5 -6
  309. package/oauth-app/OAuthAppDetailPanel.js.map +1 -1
  310. package/organization/CreateOrganizationForm.d.ts.map +1 -1
  311. package/organization/CreateOrganizationForm.js +5 -9
  312. package/organization/CreateOrganizationForm.js.map +1 -1
  313. package/organization/OrgProfilePanel.d.ts.map +1 -1
  314. package/organization/OrgProfilePanel.js +7 -16
  315. package/organization/OrgProfilePanel.js.map +1 -1
  316. package/package.json +4 -4
  317. package/platform-client/CreatePlatformClientForm.d.ts.map +1 -1
  318. package/platform-client/CreatePlatformClientForm.js +5 -6
  319. package/platform-client/CreatePlatformClientForm.js.map +1 -1
  320. package/platform-client/PlatformClientDetailPanel.d.ts.map +1 -1
  321. package/platform-client/PlatformClientDetailPanel.js +6 -7
  322. package/platform-client/PlatformClientDetailPanel.js.map +1 -1
  323. package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
  324. package/platform-client/PlatformClientListPanel.js +2 -4
  325. package/platform-client/PlatformClientListPanel.js.map +1 -1
  326. package/platform-client/PlatformClientSecretAlert.d.ts.map +1 -1
  327. package/platform-client/PlatformClientSecretAlert.js +18 -25
  328. package/platform-client/PlatformClientSecretAlert.js.map +1 -1
  329. package/provider.d.ts +34 -1
  330. package/provider.d.ts.map +1 -1
  331. package/provider.js +14 -7
  332. package/provider.js.map +1 -1
  333. package/resource-creation/WizardNav.d.ts.map +1 -1
  334. package/resource-creation/WizardNav.js +2 -4
  335. package/resource-creation/WizardNav.js.map +1 -1
  336. package/resource-detail/ConfirmDialog.d.ts +2 -3
  337. package/resource-detail/ConfirmDialog.d.ts.map +1 -1
  338. package/resource-detail/ConfirmDialog.js +8 -20
  339. package/resource-detail/ConfirmDialog.js.map +1 -1
  340. package/resource-detail/useCopyResource.d.ts +4 -3
  341. package/resource-detail/useCopyResource.d.ts.map +1 -1
  342. package/resource-detail/useCopyResource.js +10 -19
  343. package/resource-detail/useCopyResource.js.map +1 -1
  344. package/schedule/ScheduleDetailView.d.ts.map +1 -1
  345. package/schedule/ScheduleDetailView.js +2 -4
  346. package/schedule/ScheduleDetailView.js.map +1 -1
  347. package/schedule/ScheduleForm.d.ts.map +1 -1
  348. package/schedule/ScheduleForm.js +6 -7
  349. package/schedule/ScheduleForm.js.map +1 -1
  350. package/session/NewSessionViewer.d.ts +52 -2
  351. package/session/NewSessionViewer.d.ts.map +1 -1
  352. package/session/NewSessionViewer.js +21 -6
  353. package/session/NewSessionViewer.js.map +1 -1
  354. package/session/SessionViewer.d.ts +63 -2
  355. package/session/SessionViewer.d.ts.map +1 -1
  356. package/session/SessionViewer.js +43 -17
  357. package/session/SessionViewer.js.map +1 -1
  358. package/session/audience.d.ts +17 -0
  359. package/session/audience.d.ts.map +1 -1
  360. package/session/index.d.ts +2 -1
  361. package/session/index.d.ts.map +1 -1
  362. package/session/index.js.map +1 -1
  363. package/session/run-config.d.ts +50 -0
  364. package/session/run-config.d.ts.map +1 -0
  365. package/session/run-config.js +15 -0
  366. package/session/run-config.js.map +1 -0
  367. package/session/useNewSessionFlow.d.ts +11 -0
  368. package/session/useNewSessionFlow.d.ts.map +1 -1
  369. package/session/useNewSessionFlow.js +29 -2
  370. package/session/useNewSessionFlow.js.map +1 -1
  371. package/session/useSessionConversation.d.ts +7 -7
  372. package/session/useSessionConversation.d.ts.map +1 -1
  373. package/session/useSessionConversation.js +2 -0
  374. package/session/useSessionConversation.js.map +1 -1
  375. package/session/useSessionPageFlow.d.ts +18 -4
  376. package/session/useSessionPageFlow.d.ts.map +1 -1
  377. package/session/useSessionPageFlow.js +33 -6
  378. package/session/useSessionPageFlow.js.map +1 -1
  379. package/session/useSessionPanel.d.ts +37 -2
  380. package/session/useSessionPanel.d.ts.map +1 -1
  381. package/session/useSessionPanel.js +44 -10
  382. package/session/useSessionPanel.js.map +1 -1
  383. package/settings/ApiKeysSection.d.ts.map +1 -1
  384. package/settings/ApiKeysSection.js +3 -2
  385. package/settings/ApiKeysSection.js.map +1 -1
  386. package/settings/ChannelAppsSection.d.ts.map +1 -1
  387. package/settings/ChannelAppsSection.js +3 -2
  388. package/settings/ChannelAppsSection.js.map +1 -1
  389. package/settings/EnvironmentsSection.js +5 -3
  390. package/settings/EnvironmentsSection.js.map +1 -1
  391. package/settings/IdentityProvidersSection.d.ts.map +1 -1
  392. package/settings/IdentityProvidersSection.js +3 -2
  393. package/settings/IdentityProvidersSection.js.map +1 -1
  394. package/settings/InvitationsSection.d.ts.map +1 -1
  395. package/settings/InvitationsSection.js +3 -1
  396. package/settings/InvitationsSection.js.map +1 -1
  397. package/settings/MembersSection.d.ts.map +1 -1
  398. package/settings/MembersSection.js +3 -1
  399. package/settings/MembersSection.js.map +1 -1
  400. package/settings/OAuthAppsSection.d.ts.map +1 -1
  401. package/settings/OAuthAppsSection.js +3 -2
  402. package/settings/OAuthAppsSection.js.map +1 -1
  403. package/settings/OrgProfileSection.d.ts.map +1 -1
  404. package/settings/OrgProfileSection.js +3 -2
  405. package/settings/OrgProfileSection.js.map +1 -1
  406. package/settings/PlatformClientsSection.d.ts.map +1 -1
  407. package/settings/PlatformClientsSection.js +3 -2
  408. package/settings/PlatformClientsSection.js.map +1 -1
  409. package/settings/UsageSection.d.ts.map +1 -1
  410. package/settings/UsageSection.js +3 -1
  411. package/settings/UsageSection.js.map +1 -1
  412. package/sharing/ShareAgentDialog.d.ts.map +1 -1
  413. package/sharing/ShareAgentDialog.js +19 -26
  414. package/sharing/ShareAgentDialog.js.map +1 -1
  415. package/sidebar/chrome.d.ts +3 -4
  416. package/sidebar/chrome.d.ts.map +1 -1
  417. package/sidebar/chrome.js +5 -4
  418. package/sidebar/chrome.js.map +1 -1
  419. package/skill/SkillDiffDialog.d.ts.map +1 -1
  420. package/skill/SkillDiffDialog.js +5 -21
  421. package/skill/SkillDiffDialog.js.map +1 -1
  422. package/src/access/ManageAccessDialog.tsx +14 -28
  423. package/src/activity/format-relative-time.ts +11 -9
  424. package/src/agent/steps/CapabilitiesStep.tsx +6 -3
  425. package/src/agent/steps/IdentityStep.tsx +19 -12
  426. package/src/agent-instance/CreateAgentInstanceDialog.tsx +29 -33
  427. package/src/api-key/ApiKeyCreatedAlert.tsx +10 -19
  428. package/src/api-key/ApiKeyListPanel.tsx +3 -39
  429. package/src/api-key/CreateApiKeyForm.tsx +12 -26
  430. package/src/approval-defaults-context.ts +56 -0
  431. package/src/attachment/AttachmentImageLightbox.tsx +13 -36
  432. package/src/attachment/__tests__/vision-preflight.test.ts +311 -0
  433. package/src/attachment/index.ts +12 -0
  434. package/src/attachment/vision-preflight.ts +236 -0
  435. package/src/billing/AutoRechargeCard.tsx +5 -4
  436. package/src/billing/BillingSection.tsx +4 -3
  437. package/src/channel/ChannelConversationsDialog.tsx +14 -29
  438. package/src/channel/ChannelCredentialsDialog.tsx +19 -29
  439. package/src/channel/ChannelTemplatesDialog.tsx +16 -31
  440. package/src/channel/ConnectSlackDialog.tsx +19 -31
  441. package/src/channel/ConnectWhatsAppDialog.tsx +19 -31
  442. package/src/channel/useChannelSessions.ts +3 -0
  443. package/src/channel-app/ChannelAppDetailPanel.tsx +15 -12
  444. package/src/channel-app/CreateChannelAppForm.tsx +17 -12
  445. package/src/channel-app/internal.tsx +5 -25
  446. package/src/composer/ComposerToolbar.tsx +1 -1
  447. package/src/composer/SessionComposer.tsx +160 -13
  448. package/src/composer/__tests__/SessionComposer-modelCoherence.test.tsx +220 -0
  449. package/src/composer/__tests__/SessionComposer-visionPreflight.test.tsx +222 -0
  450. package/src/composer/icons.tsx +0 -18
  451. package/src/conversation/ConversationAttentionBanner.tsx +64 -19
  452. package/src/conversation/ConversationComposer.tsx +1 -1
  453. package/src/conversation/ConversationListPane.tsx +46 -20
  454. package/src/conversation/ConversationsWorkbench.tsx +1 -0
  455. package/src/conversation/__tests__/ConversationAttentionBanner.test.tsx +76 -2
  456. package/src/conversation/__tests__/ConversationListPane.test.tsx +15 -4
  457. package/src/cursor-accounts/MemberCoverageTable.tsx +3 -14
  458. package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +2 -10
  459. package/src/dashboard/DashboardFailedRuns.tsx +2 -12
  460. package/src/environment/CreateEnvironmentForm.tsx +8 -27
  461. package/src/environment/EnvVarForm.tsx +2 -18
  462. package/src/environment/EnvironmentVariableEditor.tsx +5 -21
  463. package/src/execution/ApprovalCard.tsx +23 -2
  464. package/src/execution/ArtifactApplyButton.tsx +2 -17
  465. package/src/execution/ArtifactPreviewModal.tsx +15 -27
  466. package/src/execution/ExecutionErrorNotice.tsx +99 -0
  467. package/src/execution/FilePathLink.tsx +5 -9
  468. package/src/execution/FileReviewCard.tsx +1 -20
  469. package/src/execution/FollowUpInput.tsx +1 -16
  470. package/src/execution/LivenessStatusLine.tsx +59 -0
  471. package/src/execution/MessageEntry.tsx +136 -25
  472. package/src/execution/MessageThread.tsx +84 -83
  473. package/src/execution/SetupProgress.tsx +5 -1
  474. package/src/execution/SubAgentSection.tsx +9 -20
  475. package/src/execution/TerminalSession.tsx +97 -10
  476. package/src/execution/ToolCallDetail.tsx +19 -0
  477. package/src/execution/ToolCallItem.tsx +175 -44
  478. package/src/execution/ToolRunGroup.tsx +30 -32
  479. package/src/execution/WriteBackCard.tsx +5 -24
  480. package/src/execution/__tests__/MessageEntry-copy.test.tsx +125 -0
  481. package/src/execution/__tests__/MessageThread.test.tsx +97 -0
  482. package/src/execution/__tests__/TerminalSession.test.tsx +71 -1
  483. package/src/execution/__tests__/ToolCallDetail.test.tsx +33 -1
  484. package/src/execution/__tests__/ToolCallItem.test.tsx +299 -11
  485. package/src/execution/__tests__/ToolRunGroup.test.tsx +41 -9
  486. package/src/execution/__tests__/intent-title.test.tsx +221 -0
  487. package/src/execution/__tests__/message-thread-slots.test.tsx +92 -0
  488. package/src/execution/__tests__/tool-presenter.test.tsx +41 -4
  489. package/src/execution/index.ts +11 -2
  490. package/src/execution/tool-categories.ts +195 -9
  491. package/src/execution/tool-presenter.ts +44 -2
  492. package/src/execution/useArtifactInspection.ts +4 -8
  493. package/src/iam-policy/GrantAccessForm.tsx +2 -18
  494. package/src/iam-policy/OrgMembersPanel.tsx +3 -19
  495. package/src/iam-policy/RoleSelector.tsx +8 -1
  496. package/src/identity-provider/CreateIdentityProviderForm.tsx +13 -31
  497. package/src/identity-provider/IdentityProviderDetailPanel.tsx +24 -49
  498. package/src/identity-provider/IdentityProviderListPanel.tsx +2 -18
  499. package/src/identity-provider/IdentityProviderWizard.tsx +15 -32
  500. package/src/identity-provider/SsoLoginPrompt.tsx +6 -21
  501. package/src/index.ts +26 -1
  502. package/src/internal/DecisionButton.tsx +1 -20
  503. package/src/internal/DialogShell.tsx +169 -0
  504. package/src/internal/SpinnerIcon.tsx +42 -0
  505. package/src/internal/__tests__/DialogShell.test.tsx +223 -0
  506. package/src/internal/__tests__/ThreadCardShell.test.tsx +43 -7
  507. package/src/internal/__tests__/useCopyFeedback.test.ts +92 -0
  508. package/src/internal/select-element-text.ts +17 -0
  509. package/src/internal/thread-card/ThreadCardShell.tsx +53 -21
  510. package/src/internal/thread-card/glyphs.tsx +24 -3
  511. package/src/internal/thread-card/index.ts +1 -0
  512. package/src/internal/useCopyFeedback.ts +61 -0
  513. package/src/invitation/InvitationCreatedAlert.tsx +10 -18
  514. package/src/invitation/InvitationManager.tsx +23 -34
  515. package/src/invitation/InvitationRedemption.tsx +2 -18
  516. package/src/library/useExportResource.ts +15 -29
  517. package/src/manifest/ApplyManifestDialog.tsx +8 -26
  518. package/src/manifest/EditResourceYamlDialog.tsx +4 -31
  519. package/src/mcp-server/DefinitionDriftNotice.tsx +120 -0
  520. package/src/mcp-server/McpServerConnectDialog.tsx +15 -29
  521. package/src/mcp-server/McpServerDetailView.tsx +69 -49
  522. package/src/mcp-server/OAuthAppForm.tsx +2 -18
  523. package/src/mcp-server/__tests__/DefinitionDriftNotice.test.tsx +57 -0
  524. package/src/mcp-server/__tests__/definitionDrift.test.ts +245 -0
  525. package/src/mcp-server/__tests__/mcpServerToInput.test.ts +201 -0
  526. package/src/mcp-server/__tests__/useMcpServerDefinitionDrift.test.tsx +173 -0
  527. package/src/mcp-server/internal/definitionDrift.ts +158 -0
  528. package/src/mcp-server/internal/mcpServerToInput.ts +3 -0
  529. package/src/mcp-server/steps/EnvironmentAuthStep.tsx +19 -19
  530. package/src/mcp-server/steps/IdentityTransportStep.tsx +24 -23
  531. package/src/mcp-server/useMcpServerConnect.ts +1 -1
  532. package/src/mcp-server/useMcpServerDefinitionDrift.ts +95 -0
  533. package/src/models/ModelRegistryContext.ts +7 -1
  534. package/src/models/ModelSelector.tsx +37 -0
  535. package/src/models/__tests__/ModelSelector-visionIndicator.test.tsx +129 -0
  536. package/src/models/__tests__/resolveDefaultModel.test.ts +115 -0
  537. package/src/models/__tests__/useModelRegistry.test.tsx +99 -4
  538. package/src/models/index.ts +2 -2
  539. package/src/models/registry.ts +196 -29
  540. package/src/models/useModelRegistry.ts +10 -2
  541. package/src/oauth-app/CreateOAuthAppForm.tsx +16 -31
  542. package/src/oauth-app/OAuthAppDetailPanel.tsx +16 -31
  543. package/src/organization/CreateOrganizationForm.tsx +10 -29
  544. package/src/organization/OrgProfilePanel.tsx +13 -44
  545. package/src/platform-client/CreatePlatformClientForm.tsx +9 -29
  546. package/src/platform-client/PlatformClientDetailPanel.tsx +10 -30
  547. package/src/platform-client/PlatformClientListPanel.tsx +2 -18
  548. package/src/platform-client/PlatformClientSecretAlert.tsx +26 -55
  549. package/src/provider.tsx +76 -33
  550. package/src/resource-creation/WizardNav.tsx +2 -18
  551. package/src/resource-detail/ConfirmDialog.tsx +9 -30
  552. package/src/resource-detail/useCopyResource.ts +17 -23
  553. package/src/schedule/ScheduleDetailView.tsx +2 -18
  554. package/src/schedule/ScheduleForm.tsx +19 -34
  555. package/src/session/NewSessionViewer.tsx +85 -7
  556. package/src/session/SessionViewer.tsx +120 -17
  557. package/src/session/__tests__/audienceWiring.test.tsx +76 -0
  558. package/src/session/__tests__/panelNegotiation.test.tsx +302 -0
  559. package/src/session/__tests__/useNewSessionFlow.test.tsx +134 -5
  560. package/src/session/__tests__/useSessionPageFlow.autoApprove.test.tsx +74 -0
  561. package/src/session/__tests__/useSessionPageFlow.runConfig.test.tsx +157 -0
  562. package/src/session/__tests__/useSessionPanel.test.ts +114 -0
  563. package/src/session/audience.ts +18 -0
  564. package/src/session/index.ts +2 -1
  565. package/src/session/run-config.ts +59 -0
  566. package/src/session/useNewSessionFlow.ts +39 -2
  567. package/src/session/useSessionConversation.ts +10 -8
  568. package/src/session/useSessionPageFlow.ts +51 -10
  569. package/src/session/useSessionPanel.ts +91 -10
  570. package/src/settings/ApiKeysSection.tsx +4 -3
  571. package/src/settings/ChannelAppsSection.tsx +4 -3
  572. package/src/settings/EnvironmentsSection.tsx +8 -5
  573. package/src/settings/IdentityProvidersSection.tsx +4 -3
  574. package/src/settings/InvitationsSection.tsx +4 -2
  575. package/src/settings/MembersSection.tsx +4 -2
  576. package/src/settings/OAuthAppsSection.tsx +4 -3
  577. package/src/settings/OrgProfileSection.tsx +4 -3
  578. package/src/settings/PlatformClientsSection.tsx +4 -3
  579. package/src/settings/UsageSection.tsx +4 -2
  580. package/src/sharing/ShareAgentDialog.tsx +33 -37
  581. package/src/sidebar/__tests__/WorkspaceSidebar.test.tsx +4 -1
  582. package/src/sidebar/chrome.tsx +6 -6
  583. package/src/skill/SkillDiffDialog.tsx +13 -36
  584. package/src/styles.css +43 -0
  585. package/src/version-history/VersionTimelineEntry.tsx +1 -21
  586. package/src/workflow/FailedRunsWidget.tsx +2 -9
  587. package/src/workflow/PendingApprovalsWidget.tsx +2 -9
  588. package/src/workflow/ViewYamlDialog.tsx +21 -55
  589. package/src/workflow/WorkflowArchitectDialog.tsx +17 -68
  590. package/src/workflow/WorkflowArtifactDocument.tsx +5 -9
  591. package/src/workflow/WorkflowCanvasEditor.tsx +2 -0
  592. package/src/workflow/WorkflowCanvasInner.tsx +14 -1
  593. package/src/workflow/WorkflowDiffGraph.tsx +7 -1
  594. package/src/workflow/WorkflowExecutionViewer.tsx +88 -11
  595. package/src/workflow/WorkflowExplainDialog.tsx +18 -60
  596. package/src/workflow/WorkflowGraphFullscreenDialog.tsx +14 -26
  597. package/src/workflow/WorkflowOverviewGraph.tsx +9 -1
  598. package/src/workflow/WorkflowRefinePanel.tsx +2 -18
  599. package/src/workflow/WorkflowRepairCard.tsx +2 -18
  600. package/src/workflow/WorkflowRunDialog.tsx +23 -70
  601. package/src/workflow/WorkflowTaskApprovalSummary.tsx +2 -17
  602. package/src/workflow/WorkflowVersionBadge.tsx +4 -13
  603. package/src/workflow/WorkflowVersionTimeline.tsx +1 -25
  604. package/src/workflow/__tests__/panelNegotiation.test.tsx +230 -0
  605. package/src/workflow/__tests__/useWorkflowCanvas.dirty.test.tsx +178 -0
  606. package/src/workflow/__tests__/useWorkflowCanvas.drag.test.tsx +224 -0
  607. package/src/workflow/__tests__/useWorkflowExecutionPanel.test.ts +100 -0
  608. package/src/workflow/execution-comparison/ExecutionComparisonPicker.tsx +20 -41
  609. package/src/workflow/execution-history/ExecutionHistoryTable.tsx +1 -25
  610. package/src/workflow/index.ts +1 -0
  611. package/src/workflow/instance/CreateWorkflowInstanceDialog.tsx +14 -27
  612. package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +2 -1
  613. package/src/workflow/picker/BranchAddPopover.tsx +4 -3
  614. package/src/workflow/templates/WorkflowTemplatePreview.tsx +18 -28
  615. package/src/workflow/useApprovalBoundary.ts +1 -1
  616. package/src/workflow/useWorkflowCanvas.ts +114 -11
  617. package/src/workflow/useWorkflowExecutionPanel.ts +95 -13
  618. package/styles.css +1 -1
  619. package/version-history/VersionTimelineEntry.d.ts.map +1 -1
  620. package/version-history/VersionTimelineEntry.js +1 -23
  621. package/version-history/VersionTimelineEntry.js.map +1 -1
  622. package/workflow/CanvasTransitionEdge.d.ts +1 -1
  623. package/workflow/FailedRunsWidget.d.ts.map +1 -1
  624. package/workflow/FailedRunsWidget.js +2 -11
  625. package/workflow/FailedRunsWidget.js.map +1 -1
  626. package/workflow/PendingApprovalsWidget.d.ts.map +1 -1
  627. package/workflow/PendingApprovalsWidget.js +2 -11
  628. package/workflow/PendingApprovalsWidget.js.map +1 -1
  629. package/workflow/ViewYamlDialog.d.ts.map +1 -1
  630. package/workflow/ViewYamlDialog.js +14 -49
  631. package/workflow/ViewYamlDialog.js.map +1 -1
  632. package/workflow/WorkflowArchitectDialog.d.ts.map +1 -1
  633. package/workflow/WorkflowArchitectDialog.js +10 -33
  634. package/workflow/WorkflowArchitectDialog.js.map +1 -1
  635. package/workflow/WorkflowArtifactDocument.d.ts.map +1 -1
  636. package/workflow/WorkflowArtifactDocument.js +5 -8
  637. package/workflow/WorkflowArtifactDocument.js.map +1 -1
  638. package/workflow/WorkflowCanvasEditor.d.ts.map +1 -1
  639. package/workflow/WorkflowCanvasEditor.js +1 -1
  640. package/workflow/WorkflowCanvasEditor.js.map +1 -1
  641. package/workflow/WorkflowCanvasInner.d.ts +4 -2
  642. package/workflow/WorkflowCanvasInner.d.ts.map +1 -1
  643. package/workflow/WorkflowCanvasInner.js +7 -3
  644. package/workflow/WorkflowCanvasInner.js.map +1 -1
  645. package/workflow/WorkflowDiffGraph.js +6 -2
  646. package/workflow/WorkflowDiffGraph.js.map +1 -1
  647. package/workflow/WorkflowExecutionViewer.d.ts +51 -0
  648. package/workflow/WorkflowExecutionViewer.d.ts.map +1 -1
  649. package/workflow/WorkflowExecutionViewer.js +23 -6
  650. package/workflow/WorkflowExecutionViewer.js.map +1 -1
  651. package/workflow/WorkflowExplainDialog.d.ts.map +1 -1
  652. package/workflow/WorkflowExplainDialog.js +10 -28
  653. package/workflow/WorkflowExplainDialog.js.map +1 -1
  654. package/workflow/WorkflowGraphFullscreenDialog.d.ts.map +1 -1
  655. package/workflow/WorkflowGraphFullscreenDialog.js +11 -17
  656. package/workflow/WorkflowGraphFullscreenDialog.js.map +1 -1
  657. package/workflow/WorkflowOverviewGraph.js +8 -2
  658. package/workflow/WorkflowOverviewGraph.js.map +1 -1
  659. package/workflow/WorkflowRefinePanel.d.ts.map +1 -1
  660. package/workflow/WorkflowRefinePanel.js +2 -4
  661. package/workflow/WorkflowRefinePanel.js.map +1 -1
  662. package/workflow/WorkflowRepairCard.d.ts.map +1 -1
  663. package/workflow/WorkflowRepairCard.js +2 -4
  664. package/workflow/WorkflowRepairCard.js.map +1 -1
  665. package/workflow/WorkflowRunDialog.d.ts.map +1 -1
  666. package/workflow/WorkflowRunDialog.js +14 -35
  667. package/workflow/WorkflowRunDialog.js.map +1 -1
  668. package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
  669. package/workflow/WorkflowTaskApprovalSummary.js +2 -4
  670. package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
  671. package/workflow/WorkflowVersionBadge.d.ts.map +1 -1
  672. package/workflow/WorkflowVersionBadge.js +4 -13
  673. package/workflow/WorkflowVersionBadge.js.map +1 -1
  674. package/workflow/WorkflowVersionTimeline.d.ts.map +1 -1
  675. package/workflow/WorkflowVersionTimeline.js +1 -26
  676. package/workflow/WorkflowVersionTimeline.js.map +1 -1
  677. package/workflow/execution-comparison/ExecutionComparisonPicker.d.ts.map +1 -1
  678. package/workflow/execution-comparison/ExecutionComparisonPicker.js +14 -40
  679. package/workflow/execution-comparison/ExecutionComparisonPicker.js.map +1 -1
  680. package/workflow/execution-history/ExecutionHistoryTable.d.ts.map +1 -1
  681. package/workflow/execution-history/ExecutionHistoryTable.js +1 -24
  682. package/workflow/execution-history/ExecutionHistoryTable.js.map +1 -1
  683. package/workflow/index.d.ts +1 -1
  684. package/workflow/index.d.ts.map +1 -1
  685. package/workflow/index.js.map +1 -1
  686. package/workflow/instance/CreateWorkflowInstanceDialog.d.ts.map +1 -1
  687. package/workflow/instance/CreateWorkflowInstanceDialog.js +7 -20
  688. package/workflow/instance/CreateWorkflowInstanceDialog.js.map +1 -1
  689. package/workflow/instance/WorkflowInstanceDetailPanel.d.ts.map +1 -1
  690. package/workflow/instance/WorkflowInstanceDetailPanel.js +1 -1
  691. package/workflow/instance/WorkflowInstanceDetailPanel.js.map +1 -1
  692. package/workflow/picker/BranchAddPopover.d.ts.map +1 -1
  693. package/workflow/picker/BranchAddPopover.js +3 -2
  694. package/workflow/picker/BranchAddPopover.js.map +1 -1
  695. package/workflow/templates/WorkflowTemplatePreview.d.ts +1 -1
  696. package/workflow/templates/WorkflowTemplatePreview.d.ts.map +1 -1
  697. package/workflow/templates/WorkflowTemplatePreview.js +10 -22
  698. package/workflow/templates/WorkflowTemplatePreview.js.map +1 -1
  699. package/workflow/useApprovalBoundary.d.ts +1 -1
  700. package/workflow/useApprovalBoundary.js +1 -1
  701. package/workflow/useWorkflowCanvas.d.ts +5 -1
  702. package/workflow/useWorkflowCanvas.d.ts.map +1 -1
  703. package/workflow/useWorkflowCanvas.js +99 -13
  704. package/workflow/useWorkflowCanvas.js.map +1 -1
  705. package/workflow/useWorkflowExecutionPanel.d.ts +38 -2
  706. package/workflow/useWorkflowExecutionPanel.d.ts.map +1 -1
  707. package/workflow/useWorkflowExecutionPanel.js +46 -13
  708. package/workflow/useWorkflowExecutionPanel.js.map +1 -1
@@ -15,21 +15,24 @@ import {
15
15
  ThreadCardShell,
16
16
  ThreadCardHeader,
17
17
  ThreadCardBody,
18
+ type ThreadCardVariant,
18
19
  SpinnerIcon,
19
20
  ClockIcon,
20
- CheckCircleIcon,
21
21
  XCircleIcon,
22
22
  DotIcon,
23
23
  SlashCircleIcon,
24
24
  } from "../internal/thread-card/index.js";
25
- import { ToolCallDetail, formatDuration } from "./ToolCallDetail.js";
25
+ import { TerminalTail } from "./TerminalSession.js";
26
+ import { ToolCallDetail, formatHeaderDuration } from "./ToolCallDetail.js";
26
27
  import { SubAgentSection } from "./SubAgentSection.js";
27
28
  import { ApprovalCardBody } from "./ApprovalCard.js";
28
29
  import { useApproval } from "./ApprovalContext.js";
29
30
  import { useFileReviewRowState } from "./FileReviewContext.js";
30
31
  import type { FileReviewRowState } from "./file-review-status.js";
31
32
  import { FilePathLink } from "./FilePathLink.js";
32
- import { isFileCategory, type ToolCategory } from "./tool-categories.js";
33
+ // ToolChrome is type-only here so the doc link below resolves; the strict
34
+ // tsdoc gate (tsdoc:check) guards it against removal.
35
+ import { isFileCategory, type ToolCategory, type ToolChrome } from "./tool-categories.js";
33
36
  import { useToolPresentation } from "./tool-presenter.js";
34
37
  import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
35
38
 
@@ -63,18 +66,25 @@ export interface ToolCallItemProps {
63
66
  /**
64
67
  * Renders a single tool call as a row in the tool call group.
65
68
  *
66
- * Three rendering modes, set by one rule — **does the body carry content the
67
- * one-line row cannot?**
69
+ * Four rendering modes, set by one rule — **does the body carry content the
70
+ * one-line row cannot, and does it stay content once the call settles?**
68
71
  *
69
72
  * - **Non-expandable** (completed/skipped Read): a static `<div>` row with a
70
73
  * clickable {@link FilePathLink}. The path IS the complete information.
71
- * - **Preview** (content-bearing: shell / edit / write / fetch / web-search /
74
+ * - **Preview** (content-bearing: edit / write / fetch / web-search /
72
75
  * unknown / mcp): a plain (non-button) header above an **always-visible**
73
76
  * {@link ToolCallDetail} body — Cursor-style "previews aren't collapsible".
74
77
  * There is no header chevron; each content block self-bounds with its own
75
- * single in-place reveal (`RevealToggle`), so a long diff or output
76
- * never floods the thread. The body is suppressed only for an `empty` result
77
- * (e.g. a no-output shell), which stays a clean one-line row.
78
+ * single in-place reveal (`RevealToggle`), so a long diff or output
79
+ * never floods the thread. The body is suppressed only for an `empty` result,
80
+ * which stays a clean one-line row.
81
+ * - **Tail** (shell): live like preview — the full terminal session streams in
82
+ * view while the command runs or awaits its gate — but a *successful* settle
83
+ * collapses the row to a {@link TerminalTail} teaser (the `$ command` line
84
+ * plus a dimmed tail of the last output lines) behind the header chevron.
85
+ * A settled failure stays open: error output is content, not context. A
86
+ * result that isn't a terminal session (e.g. an offloaded `outputRef`)
87
+ * falls back to the preview layout — never hide evidence we cannot condense.
78
88
  * - **Summary / sub-agent** (read / list / search / delete / think, and
79
89
  * sub-agent delegations): a chevron-gated `div[role=button]` header that
80
90
  * discloses a body hidden by default — {@link ToolCallDetail}, a
@@ -86,9 +96,18 @@ export interface ToolCallItemProps {
86
96
  * content-overflow reveal — never govern the same body, which is what removes
87
97
  * the old "expand, then Show more" double control.
88
98
  *
99
+ * Orthogonal to the layout modes is the **chrome tier** (the density axis,
100
+ * stigmer#274): metadata-only categories (read / list / search / think)
101
+ * render as quiet unboxed lines — no card frame — while content-bearing
102
+ * categories keep their cards. A quiet row escalates to a card while gated
103
+ * or failed; its disclosed body renders under a light left rail instead of a
104
+ * border. See {@link ToolChrome}.
105
+ *
89
106
  * Shows category-aware labels (e.g., "Shell", "Read", "Edit") with
90
107
  * the primary argument as a subtitle, a category-specific icon, and
91
- * an inline approval decision badge when applicable.
108
+ * an inline approval decision badge when applicable. A shell row whose
109
+ * call carries a model-authored intent phrase is titled with that phrase
110
+ * instead — the command becomes the subtitle (stigmer#276).
92
111
  *
93
112
  * Wrapped in `React.memo` — structural sharing (DD-009/010) preserves
94
113
  * the `ToolCall` reference when unchanged, so a settled row skips
@@ -110,11 +129,18 @@ export const ToolCallItem = memo(function ToolCallItem({
110
129
  useRenderTracer("ToolCallItem", { status: toolCall.status, id: toolCall.id });
111
130
 
112
131
  const status = mapToolCallStatus(toolCall);
132
+ const isRunning = status === "running";
133
+ // Success is the silent default: a completed row renders NO status icon —
134
+ // a green check on every settled row teaches the eye to ignore status
135
+ // entirely, so state is shown only when it says something (running, gated,
136
+ // failed, interrupted). Failure shouts; success is quiet (stigmer#274).
113
137
  const StatusIcon = STATUS_ICON[status];
114
- const duration = formatDuration(toolCall.startedAt, toolCall.completedAt);
138
+ // Header chips only when the duration carries information (>= 1s); the
139
+ // sub-second chips were noise pinned to the least interesting rows.
140
+ const duration = formatHeaderDuration(toolCall.startedAt, toolCall.completedAt);
115
141
  const isSubAgent = subAgentExecution != null;
116
142
 
117
- const { category, label, primaryArg, result, resultSummary, disclosure } =
143
+ const { category, label, intent, title, primaryArg, result, resultSummary, disclosure, chrome } =
118
144
  useToolPresentation(toolCall);
119
145
  const CategoryIcon = CATEGORY_ICON[category];
120
146
 
@@ -122,20 +148,39 @@ export const ToolCallItem = memo(function ToolCallItem({
122
148
  // or null. Drives the inline approval panel and forces the row open.
123
149
  const approval = useApproval(toolCall.id);
124
150
 
125
- // The card-level disclosure for *summary* rows (preview rows ignore ittheir
126
- // body is always visible). Force-open only while the row carries live or
127
- // actionable content: while it runs, or while it awaits approval; a manual
128
- // toggle takes over from there. Called unconditionally to honour the rules of
129
- // hooks even though preview rows do not read `expanded`.
151
+ // Tail rows (shell): a settled failure keeps the row openthe error output
152
+ // is the content the user needs next, so it must never settle into a dimmed
153
+ // teaser. Detected on the result, not just the status: a command that
154
+ // "completed" with a non-zero exit is a failure to the reader.
155
+ const isTailCategory = !isSubAgent && disclosure === "tail";
156
+ const tailFailed =
157
+ isTailCategory &&
158
+ (toolCall.status === ToolCallStatus.TOOL_CALL_FAILED ||
159
+ result.type === "error" ||
160
+ (result.type === "terminal" &&
161
+ result.exitCode !== undefined &&
162
+ result.exitCode !== 0));
163
+
164
+ // The card-level disclosure for *summary* and *tail* rows (preview rows
165
+ // ignore it — their body is always visible). Force-open only while the row
166
+ // carries live or actionable content: while it runs, while it awaits
167
+ // approval, or (tail rows) while it shows a failure; a manual toggle takes
168
+ // over from there. Called unconditionally to honour the rules of hooks even
169
+ // though preview rows do not read `expanded`.
130
170
  const autoOpen =
131
- toolCall.status === ToolCallStatus.TOOL_CALL_RUNNING || approval != null;
171
+ toolCall.status === ToolCallStatus.TOOL_CALL_RUNNING ||
172
+ approval != null ||
173
+ tailFailed;
132
174
  const [expanded, handleToggle] = useAutoDisclosure(autoOpen, {
133
175
  initialOpen: defaultExpanded || autoOpen,
134
176
  });
135
177
 
178
+ // Sub-agents title the row with their subject; every other row titles with
179
+ // the resolved presentation `title` (host label override > model-authored
180
+ // shell intent > category label, stigmer#276).
136
181
  const displayLabel = isSubAgent
137
182
  ? subAgentExecution.subject || subAgentExecution.name || label
138
- : label;
183
+ : title;
139
184
 
140
185
  const approvalBadge = getApprovalBadge(toolCall);
141
186
 
@@ -165,6 +210,24 @@ export const ToolCallItem = memo(function ToolCallItem({
165
210
  const gateAccent =
166
211
  approval != null ? (category === "delete" ? "destructive" : "warning") : null;
167
212
 
213
+ // The chrome tier (the density axis, stigmer#274): metadata-only rows
214
+ // (read / list / search / think) render as quiet unboxed lines — no card
215
+ // frame — so the conversation reads as prose with quiet evidence attached.
216
+ // A row escalates to a card while it carries something a bare line cannot:
217
+ // a pending gate (the decision surface, including its accent) or a failure
218
+ // (error output is content). Running deliberately does NOT escalate — a
219
+ // quiet row's in-flight state rides its label and status glyph, not a
220
+ // frame. Nested rows (inside an expanded fold chip) stay divider rows:
221
+ // their container owns the frame.
222
+ const rowFailed =
223
+ toolCall.status === ToolCallStatus.TOOL_CALL_FAILED ||
224
+ result.type === "error";
225
+ const variant: ThreadCardVariant = !bordered
226
+ ? "row"
227
+ : chrome === "quiet" && !isSubAgent && approval == null && !rowFailed
228
+ ? "quiet"
229
+ : "card";
230
+
168
231
  // Completed/skipped Read items are non-expandable — the clickable
169
232
  // path in the row is the complete information. Failed reads remain
170
233
  // expandable to show the error.
@@ -205,12 +268,14 @@ export const ToolCallItem = memo(function ToolCallItem({
205
268
  </span>
206
269
  )}
207
270
 
208
- <span
209
- className={cn("stg:shrink-0", STATUS_COLOR[status])}
210
- aria-hidden="true"
211
- >
212
- <StatusIcon />
213
- </span>
271
+ {StatusIcon && (
272
+ <span
273
+ className={cn("stg:shrink-0", STATUS_COLOR[status])}
274
+ aria-hidden="true"
275
+ >
276
+ <StatusIcon />
277
+ </span>
278
+ )}
214
279
 
215
280
  {duration && (
216
281
  <span className="stg:shrink-0 stg:tabular-nums stg:text-muted-foreground">
@@ -223,7 +288,7 @@ export const ToolCallItem = memo(function ToolCallItem({
223
288
  if (isNonExpandableRead) {
224
289
  return (
225
290
  <ThreadCardShell
226
- bordered={bordered}
291
+ variant={variant}
227
292
  accent={gateAccent}
228
293
  cursorTarget="tool-call-row"
229
294
  className={className}
@@ -248,11 +313,17 @@ export const ToolCallItem = memo(function ToolCallItem({
248
313
  );
249
314
  }
250
315
 
251
- // Shell shows neither a command subtitle nor an exit summary in the header —
252
- // both live in the terminal session body below, so the header stays minimal
253
- // (icon + label + status + duration).
254
- const displaySubtitle =
255
- isSubAgent || category === "shell" ? null : primaryArg;
316
+ // Shell headers stay minimal (icon + label + status + duration) the
317
+ // command and exit summary live in the terminal session body EXCEPT when
318
+ // the model authored an intent title (stigmer#276): the title then says
319
+ // *why*, so the command surfaces as the secondary text and a fully
320
+ // collapsed row still reads like a narrated log. Intent-less shell rows
321
+ // render byte-identically to before.
322
+ const displaySubtitle = isSubAgent
323
+ ? null
324
+ : category === "shell"
325
+ ? (intent ? primaryArg : null)
326
+ : primaryArg;
256
327
 
257
328
  // For file tools the subtitle is a path: render it filename-first through
258
329
  // FilePathLink (full path on hover) rather than the raw, often-absolute string
@@ -260,13 +331,24 @@ export const ToolCallItem = memo(function ToolCallItem({
260
331
  const subtitleIsFilePath =
261
332
  !isSubAgent && primaryArg != null && isFileCategory(category);
262
333
 
263
- // Preview categories (shell, edit, write, fetch, web-search, unknown, mcp)
264
- // render their body ALWAYS Cursor-style "previews aren't collapsible"so
265
- // no header chevron competes with the body's own in-place reveal. Summary
334
+ // A tail row condenses only a terminal session. While gated it renders like
335
+ // preview decision actions are never hidden behind a chevron and any
336
+ // other result shape (an offloaded outputRef, bare error text) falls back to
337
+ // preview too: never hide evidence the tail cannot honestly condense.
338
+ const tailSession =
339
+ isTailCategory && approval == null && result.type === "terminal"
340
+ ? result
341
+ : null;
342
+
343
+ // Preview categories (edit, write, fetch, web-search, unknown, mcp) render
344
+ // their body ALWAYS — Cursor-style "previews aren't collapsible" — so no
345
+ // header chevron competes with the body's own in-place reveal. Summary
266
346
  // categories and sub-agents keep the chevron: their body is genuinely hidden
267
347
  // by default, so the chevron has a real job. The two disclosure axes
268
348
  // (card-level chevron vs. content-overflow reveal) never govern one body.
269
- const isPreviewCategory = !isSubAgent && disclosure === "preview";
349
+ const isPreviewLayout =
350
+ !isSubAgent &&
351
+ (disclosure === "preview" || (isTailCategory && tailSession == null));
270
352
 
271
353
  // The disclosed body, shared by both layouts: a pending gate decides inline,
272
354
  // a sub-agent shows its delegation, otherwise the category detail.
@@ -298,7 +380,15 @@ export const ToolCallItem = memo(function ToolCallItem({
298
380
  </span>
299
381
 
300
382
  <span className="stg:min-w-0 stg:flex-1 stg:flex stg:items-baseline stg:gap-1.5 stg:overflow-hidden">
301
- <span className="stg:shrink-0 stg:font-medium stg:text-foreground">
383
+ {/* While the call runs, the label carries the ambient-liveness sweep
384
+ (stigmer#277) — the shimmer class owns `color`, so it replaces
385
+ (never joins) the static color utility. */}
386
+ <span
387
+ className={cn(
388
+ "stg:shrink-0 stg:font-medium",
389
+ isRunning ? "stgm-shimmer-label" : "stg:text-foreground",
390
+ )}
391
+ >
302
392
  {displayLabel}
303
393
  </span>
304
394
  {subtitleIsFilePath && primaryArg ? (
@@ -340,20 +430,56 @@ export const ToolCallItem = memo(function ToolCallItem({
340
430
 
341
431
  // Preview layout: a plain (non-button) header above an always-visible body.
342
432
  // The body renders only when it has something to show — a pending gate, or a
343
- // non-empty result — so a no-output shell (which normalizes to an `empty`
344
- // result) stays a clean one-line row, never an empty padded box.
345
- if (isPreviewCategory) {
433
+ // non-empty result — so a tool that produced nothing stays a clean one-line
434
+ // row, never an empty padded box.
435
+ if (isPreviewLayout) {
346
436
  const showBody = approval != null || result.type !== "empty";
347
437
  return (
348
438
  <ThreadCardShell
349
- bordered={bordered}
439
+ variant={variant}
350
440
  accent={gateAccent}
351
441
  cursorTarget="tool-call-row"
352
442
  className={className}
353
443
  >
354
444
  <ThreadCardHeader>{headerInner}</ThreadCardHeader>
355
445
  {showBody && (
446
+ <ThreadCardBody cursorTarget="tool-preview" rail={variant === "quiet"}>
447
+ {body}
448
+ </ThreadCardBody>
449
+ )}
450
+ </ThreadCardShell>
451
+ );
452
+ }
453
+
454
+ // Tail layout: a chevron-gated header whose body is never fully hidden —
455
+ // expanded it is the live/full terminal session, collapsed it is the dimmed
456
+ // TerminalTail teaser. useAutoDisclosure keeps it open while the command
457
+ // runs and settles a *successful* session closed (tailFailed holds a failed
458
+ // one open); a manual toggle always wins.
459
+ if (tailSession) {
460
+ return (
461
+ <ThreadCardShell
462
+ variant={variant}
463
+ accent={gateAccent}
464
+ cursorTarget="tool-call-row"
465
+ className={className}
466
+ >
467
+ <ThreadCardHeader
468
+ gesture={{ kind: "expand", expanded, onToggle: handleToggle }}
469
+ >
470
+ {headerInner}
471
+ </ThreadCardHeader>
472
+ {expanded ? (
356
473
  <ThreadCardBody cursorTarget="tool-preview">{body}</ThreadCardBody>
474
+ ) : (
475
+ <ThreadCardBody>
476
+ <TerminalTail
477
+ command={tailSession.command}
478
+ stdout={tailSession.stdout}
479
+ stderr={tailSession.stderr}
480
+ exitCode={tailSession.exitCode}
481
+ />
482
+ </ThreadCardBody>
357
483
  )}
358
484
  </ThreadCardShell>
359
485
  );
@@ -364,7 +490,7 @@ export const ToolCallItem = memo(function ToolCallItem({
364
490
  // header with Enter/Space keyboard parity and the chevron.
365
491
  return (
366
492
  <ThreadCardShell
367
- bordered={bordered}
493
+ variant={variant}
368
494
  accent={gateAccent}
369
495
  cursorTarget="tool-call-row"
370
496
  className={className}
@@ -373,7 +499,9 @@ export const ToolCallItem = memo(function ToolCallItem({
373
499
  {headerInner}
374
500
  </ThreadCardHeader>
375
501
 
376
- {expanded && <ThreadCardBody>{body}</ThreadCardBody>}
502
+ {expanded && (
503
+ <ThreadCardBody rail={variant === "quiet"}>{body}</ThreadCardBody>
504
+ )}
377
505
  </ThreadCardShell>
378
506
  );
379
507
  });
@@ -595,11 +723,14 @@ function McpPlugIcon() {
595
723
  // Status icons — the shared thread-card glyph set (T05)
596
724
  // ---------------------------------------------------------------------------
597
725
 
598
- const STATUS_ICON: Record<ItemStatus, () => React.JSX.Element> = {
726
+ // `completed` is deliberately iconless success is the silent default, so
727
+ // the states that remain visible (spinner, clock, cross, slash) all carry
728
+ // real signal (stigmer#274).
729
+ const STATUS_ICON: Record<ItemStatus, (() => React.JSX.Element) | null> = {
599
730
  running: SpinnerIcon,
600
731
  waiting: ClockIcon,
601
732
  failed: XCircleIcon,
602
- completed: CheckCircleIcon,
733
+ completed: null,
603
734
  pending: DotIcon,
604
735
  interrupted: SlashCircleIcon,
605
736
  };
@@ -12,6 +12,7 @@ import { useAutoDisclosure } from "../internal/useAutoDisclosure.js";
12
12
  import { ApprovalContext } from "./ApprovalContext.js";
13
13
  import { ToolCallItem, CATEGORY_ICON } from "./ToolCallItem.js";
14
14
  import type { ToolCategory } from "./tool-categories.js";
15
+ import { SpinnerIcon } from "../internal/thread-card/glyphs.js";
15
16
 
16
17
  /** Props for {@link ToolRunGroup}. */
17
18
  export interface ToolRunGroupProps {
@@ -59,8 +60,9 @@ export const ToolRunGroup = memo(function ToolRunGroup({
59
60
  useRenderTracer("ToolRunGroup", { category, count: toolCalls.length });
60
61
 
61
62
  const status = deriveAggregateStatus(toolCalls);
63
+ const isShimmering = status === "running";
62
64
  const isActive =
63
- status === "running" || status === "waiting" || status === "pending";
65
+ isShimmering || status === "waiting" || status === "pending";
64
66
 
65
67
  // A gate raised inside a folded run must be reachable without a click. Reads
66
68
  // are ungated by default, but a presenter override (or future policy) could
@@ -87,11 +89,12 @@ export const ToolRunGroup = memo(function ToolRunGroup({
87
89
  role="group"
88
90
  aria-label={label}
89
91
  data-cursor-target="tool-run-group"
90
- className={cn(
91
- "stg:rounded-lg stg:border stg:border-border-prominent stg:overflow-hidden",
92
- className,
93
- )}
92
+ className={className}
94
93
  >
94
+ {/* Quiet chrome (stigmer#274): the folded run is metadata-only by
95
+ construction (its categories are the quiet set), so the chip renders
96
+ as an unboxed line — same tier as the lone read/list/search rows it
97
+ folds — never a bordered card shouting over the conversation. */}
95
98
  <button
96
99
  type="button"
97
100
  aria-expanded={expanded}
@@ -99,26 +102,36 @@ export const ToolRunGroup = memo(function ToolRunGroup({
99
102
  className={cn(
100
103
  "stg:flex stg:w-full stg:cursor-pointer stg:items-center stg:gap-2 stg:px-2.5 stg:py-1.5 stg:text-left stg:text-xs stg:text-muted-foreground stg:transition-colors",
101
104
  "stg:hover:bg-muted-subtle",
102
- // ring-inset so the card's overflow-hidden does not clip the focus ring.
103
105
  "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-inset stg:focus-visible:ring-ring",
104
106
  )}
105
107
  >
106
108
  <span className="stg:shrink-0 stg:text-muted-foreground" aria-hidden="true">
107
109
  <Icon />
108
110
  </span>
109
- <span className="stg:min-w-0 stg:flex-1 stg:truncate stg:font-medium stg:text-foreground">
111
+ {/* A running fold carries the ambient-liveness sweep on its label
112
+ (stigmer#277); the shimmer class owns `color`, so it replaces the
113
+ static color utility rather than fighting it. */}
114
+ <span
115
+ className={cn(
116
+ "stg:min-w-0 stg:flex-1 stg:truncate stg:font-medium",
117
+ isShimmering ? "stgm-shimmer-label" : "stg:text-foreground",
118
+ )}
119
+ >
110
120
  {label}
111
121
  </span>
112
- <span className={cn("stg:shrink-0", STATUS_COLOR[status])} aria-hidden="true">
113
- <StatusIcon />
114
- </span>
122
+ {StatusIcon && (
123
+ <span className={cn("stg:shrink-0", STATUS_COLOR[status])} aria-hidden="true">
124
+ <StatusIcon />
125
+ </span>
126
+ )}
115
127
  <ChevronIcon expanded={expanded} />
116
128
  </button>
117
129
 
118
130
  {expanded && (
119
- <div className="stg:border-t stg:border-border-muted">
120
- {/* The chip is already the card; its children render as
121
- divider-separated rows (bordered={false}) to avoid a card-in-a-card. */}
131
+ // With no card frame, the disclosed rows sit under a light left rail
132
+ // (the quiet-tier body containment, mirroring ThreadCardBody's rail)
133
+ // as divider-separated rows their container owns the frame.
134
+ <div className="stg:ml-1.5 stg:border-l-2 stg:border-border-muted stg:pl-2">
122
135
  {toolCalls.map((tc) => (
123
136
  <ToolCallItem key={tc.id || tc.name} toolCall={tc} bordered={false} />
124
137
  ))}
@@ -228,11 +241,13 @@ const STATUS_COLOR: Record<AggregateStatus, string> = {
228
241
  pending: "stg:text-muted-foreground",
229
242
  };
230
243
 
231
- const STATUS_ICON: Record<AggregateStatus, () => React.JSX.Element> = {
244
+ // `completed` is deliberately iconless success is the silent default,
245
+ // matching the tool rows' own status vocabulary (stigmer#274).
246
+ const STATUS_ICON: Record<AggregateStatus, (() => React.JSX.Element) | null> = {
232
247
  running: SpinnerIcon,
233
248
  waiting: ClockIcon,
234
249
  failed: XCircleIcon,
235
- completed: CheckCircleIcon,
250
+ completed: null,
236
251
  pending: DotIcon,
237
252
  };
238
253
 
@@ -240,14 +255,6 @@ const STATUS_ICON: Record<AggregateStatus, () => React.JSX.Element> = {
240
255
  // Inline SVG icons — kept inline for SDK independence (codebase pattern)
241
256
  // ---------------------------------------------------------------------------
242
257
 
243
- function SpinnerIcon() {
244
- return (
245
- <svg width="10" height="10" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" className="stg:animate-spin">
246
- <path d="M6 1.5A4.5 4.5 0 1 1 1.5 6" strokeLinecap="round" />
247
- </svg>
248
- );
249
- }
250
-
251
258
  function ClockIcon() {
252
259
  return (
253
260
  <svg width="10" height="10" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
@@ -257,15 +264,6 @@ function ClockIcon() {
257
264
  );
258
265
  }
259
266
 
260
- function CheckCircleIcon() {
261
- return (
262
- <svg width="10" height="10" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
263
- <circle cx="6" cy="6" r="4.5" />
264
- <path d="M4 6L5.5 7.5L8 4.5" />
265
- </svg>
266
- );
267
- }
268
-
269
267
  function XCircleIcon() {
270
268
  return (
271
269
  <svg width="10" height="10" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
@@ -1,12 +1,13 @@
1
1
  "use client";
2
2
 
3
- import { useCallback, useEffect, useRef, useState } from "react";
3
+ import { useCallback } from "react";
4
4
  import type { WorkspaceWriteBack } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
5
5
  import { WorkspaceWriteBackPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
6
6
  import { cn } from "@stigmer/theme";
7
7
  import { DiffSummary } from "../version-history/DiffSummary.js";
8
8
  import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
9
9
  import { TruncatedText } from "../internal/truncated-text.js";
10
+ import { useCopyFeedback } from "../internal/useCopyFeedback.js";
10
11
  import {
11
12
  parseDiffStatSummary,
12
13
  trailingDiffStatLine,
@@ -202,9 +203,6 @@ function PullRequestRow({ url, number }: { url: string; number: number }) {
202
203
  // Branch row — info + sibling hover-revealed copy control
203
204
  // ---------------------------------------------------------------------------
204
205
 
205
- /** How long the copy control shows its "copied" confirmation. */
206
- const COPIED_FEEDBACK_MS = 2000;
207
-
208
206
  function BranchRow({
209
207
  branchName,
210
208
  baseBranch,
@@ -212,27 +210,10 @@ function BranchRow({
212
210
  branchName: string;
213
211
  baseBranch: string;
214
212
  }) {
215
- const [copied, setCopied] = useState(false);
216
-
217
- // Clear the pending feedback timer on unmount so a resolved copy never
218
- // sets state on an unmounted component (same guard as useArtifactCopy).
219
- const copiedTimer = useRef<ReturnType<typeof setTimeout> | null>(null);
220
- useEffect(() => {
221
- return () => {
222
- if (copiedTimer.current !== null) clearTimeout(copiedTimer.current);
223
- };
224
- }, []);
225
-
213
+ const { copy, copied } = useCopyFeedback();
226
214
  const handleCopy = useCallback(() => {
227
- navigator.clipboard.writeText(branchName).then(() => {
228
- setCopied(true);
229
- if (copiedTimer.current !== null) clearTimeout(copiedTimer.current);
230
- copiedTimer.current = setTimeout(
231
- () => setCopied(false),
232
- COPIED_FEEDBACK_MS,
233
- );
234
- });
235
- }, [branchName]);
215
+ void copy(branchName);
216
+ }, [copy, branchName]);
236
217
 
237
218
  return (
238
219
  <div className="stg:group stg:flex stg:items-stretch">