@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
@@ -28,9 +28,11 @@ import {
28
28
  import { MessageThread, type MessageThreadSlots } from "../MessageThread";
29
29
  import type { MessageEntryProps } from "../MessageEntry";
30
30
  import type { ApprovalCardProps } from "../ApprovalCard";
31
+ import type { ExecutionErrorNoticeProps } from "../ExecutionErrorNotice";
31
32
  import type { TodoCardProps } from "../TodoCard";
32
33
  import type { TodoRowProps } from "../TodoList";
33
34
  import type { SetupProgressProps } from "../SetupProgress";
35
+ import type { LivenessStatusLineProps } from "../LivenessStatusLine";
34
36
  import type { PlanCompletionCardProps } from "../PlanCompletionCard";
35
37
  import type { PlanArtifactCardProps } from "../PlanArtifactCard";
36
38
  import type { PlanStreamingCardProps } from "../PlanStreamingCard";
@@ -110,6 +112,7 @@ function makeExecution(opts: {
110
112
  todos?: Record<string, { content: string; status: TodoStatus }>;
111
113
  pendingApprovalToolCallId?: string;
112
114
  planArtifactName?: string;
115
+ error?: string;
113
116
  }): AgentExecution {
114
117
  const exec = create(AgentExecutionSchema);
115
118
 
@@ -128,6 +131,9 @@ function makeExecution(opts: {
128
131
 
129
132
  const status = create(AgentExecutionStatusSchema);
130
133
  status.phase = opts.phase ?? ExecutionPhase.EXECUTION_COMPLETED;
134
+ if (opts.error) {
135
+ status.error = opts.error;
136
+ }
131
137
 
132
138
  const aiMsg = create(AgentMessageSchema);
133
139
  aiMsg.type = MessageType.MESSAGE_AI;
@@ -312,6 +318,28 @@ describe("MessageThread slots", () => {
312
318
  expect(screen.getByTestId("custom-setup").textContent).toBe("waiting");
313
319
  });
314
320
 
321
+ it("renders the LivenessStatusLine slot while the execution is live between events", () => {
322
+ const CustomLiveness = ({ label }: LivenessStatusLineProps) => (
323
+ <div data-testid="custom-liveness">{label ?? "custom-live"}</div>
324
+ );
325
+
326
+ const exec = makeExecution({
327
+ id: "e-live",
328
+ phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
329
+ aiContent: "thinking about it",
330
+ });
331
+
332
+ render(
333
+ <MessageThread
334
+ executions={[]}
335
+ activeStreamExecution={exec}
336
+ slots={{ LivenessStatusLine: CustomLiveness }}
337
+ />,
338
+ );
339
+
340
+ expect(screen.getByTestId("custom-liveness").textContent).toBe("custom-live");
341
+ });
342
+
315
343
  it("renders the PlanCompletionCard slot for an artifact-less completed Plan turn", () => {
316
344
  const CustomCompletion = ({ onImplement }: PlanCompletionCardProps) => (
317
345
  <button type="button" data-testid="custom-completion" onClick={onImplement}>
@@ -390,6 +418,70 @@ describe("MessageThread slots", () => {
390
418
  );
391
419
  });
392
420
 
421
+ it("renders the ExecutionErrorNotice slot with the retry wiring intact", () => {
422
+ const onRetryExecution = vi.fn();
423
+ const CustomNotice = ({ error, retryMessage, onRetry }: ExecutionErrorNoticeProps) => (
424
+ <div data-testid="custom-error-notice">
425
+ <span>{error}</span>
426
+ {onRetry && retryMessage && (
427
+ <button type="button" onClick={() => onRetry(retryMessage)}>
428
+ switch engine and retry
429
+ </button>
430
+ )}
431
+ </div>
432
+ );
433
+
434
+ render(
435
+ <MessageThread
436
+ executions={[
437
+ makeExecution({
438
+ id: "e-failed",
439
+ specMessage: "prompt text",
440
+ phase: ExecutionPhase.EXECUTION_FAILED,
441
+ error: "model capacity exhausted",
442
+ }),
443
+ ]}
444
+ onRetryExecution={onRetryExecution}
445
+ slots={{ ExecutionErrorNotice: CustomNotice }}
446
+ />,
447
+ );
448
+
449
+ const notice = screen.getByTestId("custom-error-notice");
450
+ expect(notice.textContent).toContain("model capacity exhausted");
451
+ // The built-in's clamp toggle must not render alongside the override.
452
+ expect(screen.queryByRole("button", { name: "Show more" })).toBeNull();
453
+
454
+ // The slot's retry contract is identical to the built-in's: it resends
455
+ // the originating message.
456
+ fireEvent.click(screen.getByRole("button", { name: "switch engine and retry" }));
457
+ expect(onRetryExecution).toHaveBeenCalledWith("prompt text");
458
+ });
459
+
460
+ it("falls back to the built-in ExecutionErrorNotice when the slot is omitted", () => {
461
+ const onRetryExecution = vi.fn();
462
+
463
+ render(
464
+ <MessageThread
465
+ executions={[
466
+ makeExecution({
467
+ id: "e-failed",
468
+ specMessage: "prompt text",
469
+ phase: ExecutionPhase.EXECUTION_FAILED,
470
+ error: "model capacity exhausted",
471
+ }),
472
+ ]}
473
+ onRetryExecution={onRetryExecution}
474
+ />,
475
+ );
476
+
477
+ // The built-in renders as a destructive alert with clamp + Retry.
478
+ const alert = screen.getByRole("alert");
479
+ expect(alert.textContent).toContain("model capacity exhausted");
480
+ expect(screen.getByRole("button", { name: "Show more" })).toBeTruthy();
481
+ fireEvent.click(screen.getByRole("button", { name: "Retry" }));
482
+ expect(onRetryExecution).toHaveBeenCalledWith("prompt text");
483
+ });
484
+
393
485
  // -------------------------------------------------------------------------
394
486
  // Backward compatibility and memo guarantees
395
487
  // -------------------------------------------------------------------------
@@ -78,8 +78,9 @@ describe("useToolPresentation", () => {
78
78
 
79
79
  describe("disclosure", () => {
80
80
  it("keeps known compact tools as summary", () => {
81
- // Shell/edit/write are intentionally excluded — they are `preview`
82
- // categories (output / diff is the information), asserted separately below.
81
+ // Shell/edit/write are intentionally excluded — shell is the `tail`
82
+ // category and edit/write are `preview` categories (output / diff is
83
+ // the information), asserted separately below.
83
84
  for (const name of ["Read", "Grep", "Glob"]) {
84
85
  const tc = makeToolCall({ name, args: { path: "/x", command: "ls", pattern: "p" } });
85
86
  const { result } = renderHook(() => useToolPresentation(tc));
@@ -98,11 +99,25 @@ describe("useToolPresentation", () => {
98
99
  }
99
100
  });
100
101
 
101
- it("keeps a shell tool's output as a persistent preview", () => {
102
+ it("gives shell the tail disclosure (live preview, dimmed-tail settle)", () => {
102
103
  const tc = makeToolCall({ name: "Shell", args: { command: "ls" }, result: "files" });
103
104
  const { result } = renderHook(() => useToolPresentation(tc));
104
105
  expect(result.current.category).toBe("shell");
105
- expect(result.current.disclosure).toBe("preview");
106
+ expect(result.current.disclosure).toBe("tail");
107
+ });
108
+
109
+ it("lets a host restore the always-expanded shell preview via the registry", () => {
110
+ // The one-line opt-out for hosts that prefer the pre-tail behaviour.
111
+ const dispose = registerToolPresenter(ToolKind.SHELL, {
112
+ disclosure: () => "preview",
113
+ });
114
+ try {
115
+ const tc = makeToolCall({ name: "Shell", args: { command: "ls" }, result: "files" });
116
+ const { result } = renderHook(() => useToolPresentation(tc));
117
+ expect(result.current.disclosure).toBe("preview");
118
+ } finally {
119
+ dispose();
120
+ }
106
121
  });
107
122
 
108
123
  it("foregrounds MCP tools as preview", () => {
@@ -140,6 +155,28 @@ describe("useToolPresentation", () => {
140
155
  });
141
156
  });
142
157
 
158
+ describe("chrome", () => {
159
+ it("quiets metadata-only categories and keeps content-bearing ones as cards", () => {
160
+ const quiet = makeToolCall({ name: "Read", args: { path: "/x" } });
161
+ const card = makeToolCall({ name: "Shell", args: { command: "ls" }, result: "files" });
162
+ expect(renderHook(() => useToolPresentation(quiet)).result.current.chrome).toBe("quiet");
163
+ expect(renderHook(() => useToolPresentation(card)).result.current.chrome).toBe("card");
164
+ });
165
+
166
+ it("lets a registered presenter restore the boxed look for a kind", () => {
167
+ const dispose = registerToolPresenter(ToolKind.FILE_READ, {
168
+ chrome: () => "card",
169
+ });
170
+ try {
171
+ const tc = makeToolCall({ name: "Read", args: { path: "/x" } });
172
+ const { result } = renderHook(() => useToolPresentation(tc));
173
+ expect(result.current.chrome).toBe("card");
174
+ } finally {
175
+ dispose();
176
+ }
177
+ });
178
+ });
179
+
143
180
  describe("runGroupable", () => {
144
181
  it("folds read-only repetitive categories", () => {
145
182
  for (const name of ["Read", "Grep", "Glob"]) {
@@ -127,6 +127,9 @@ export type { InteractionModeBadgeProps } from "./InteractionModeBadge.js";
127
127
  export { SetupProgress } from "./SetupProgress.js";
128
128
  export type { SetupProgressProps } from "./SetupProgress.js";
129
129
 
130
+ export { LivenessStatusLine } from "./LivenessStatusLine.js";
131
+ export type { LivenessStatusLineProps } from "./LivenessStatusLine.js";
132
+
130
133
  export { ToolCallGroup } from "./ToolCallGroup.js";
131
134
  export type { ToolCallGroupProps } from "./ToolCallGroup.js";
132
135
 
@@ -154,8 +157,8 @@ export type { ToolArgsViewProps } from "./ToolArgsView.js";
154
157
  export { ResultView, summarizeResultView } from "./ResultView.js";
155
158
  export type { ResultViewProps } from "./ResultView.js";
156
159
 
157
- export { TerminalSession } from "./TerminalSession.js";
158
- export type { TerminalSessionProps } from "./TerminalSession.js";
160
+ export { TerminalSession, TerminalTail } from "./TerminalSession.js";
161
+ export type { TerminalSessionProps, TerminalTailProps } from "./TerminalSession.js";
159
162
 
160
163
  export {
161
164
  useToolPresentation,
@@ -204,6 +207,9 @@ export type {
204
207
  ThreadContentColumn,
205
208
  } from "./MessageThread.js";
206
209
 
210
+ export { ExecutionErrorNotice } from "./ExecutionErrorNotice.js";
211
+ export type { ExecutionErrorNoticeProps } from "./ExecutionErrorNotice.js";
212
+
207
213
  export { ThreadSkeleton } from "./ThreadSkeleton.js";
208
214
  export type { ThreadSkeletonProps } from "./ThreadSkeleton.js";
209
215
 
@@ -334,6 +340,9 @@ export {
334
340
  toolKindToCategoryInfo,
335
341
  extractPrimaryArg,
336
342
  extractPrimaryArgFromPreview,
343
+ extractShellIntent,
344
+ extractShellIntentFromPreview,
345
+ SHELL_INTENT_ARG_FIELD,
337
346
  humanizeToolName,
338
347
  defaultDisclosureForCategory,
339
348
  isRunGroupableCategory,
@@ -36,16 +36,67 @@ export type ToolCategory =
36
36
  * `Search … 2 matches`). The full detail is one click away.
37
37
  * - `"preview"` — the row renders its result body **always** (no card chevron),
38
38
  * because the one-liner cannot convey what happened so the content itself IS
39
- * the information (a shell command's output, an MCP result such as a
40
- * screenshot, a fetched page, a web-search answer, or an unrecognised tool's
41
- * output). The body's own in-place reveal expands it beyond the height budget.
39
+ * the information (an MCP result such as a screenshot, a fetched page, a
40
+ * web-search answer, or an unrecognised tool's output). The body's own
41
+ * in-place reveal expands it beyond the height budget.
42
+ * - `"tail"` — live like `"preview"`, settled like a teaser: while the tool
43
+ * runs (or awaits approval) the full body streams in view; once it settles
44
+ * successfully the row collapses to a dimmed tail of its last output lines —
45
+ * at-a-glance evidence that it ran and what it printed last — expanding on
46
+ * demand via the header chevron. A settled *failure* stays open: error
47
+ * output is content, not context. Shell is the canonical tail category — a
48
+ * working session's compile/validate loops would otherwise dominate the
49
+ * transcript at full contrast (Cursor's chat is the reference UX).
42
50
  *
43
51
  * This is the *disclosure* axis (how much of a result to show); it is
44
52
  * orthogonal to {@link isRunGroupableCategory} (whether consecutive same-kind
45
53
  * calls fold into one chip). A category can be result-rich but never folded
46
54
  * (`shell`), or foldable but never previewed (`read`).
47
55
  */
48
- export type ToolDisclosure = "summary" | "preview";
56
+ export type ToolDisclosure = "summary" | "preview" | "tail";
57
+
58
+ /**
59
+ * How much *chrome* a tool row carries in the thread — the density axis,
60
+ * orthogonal to {@link ToolDisclosure} (how much of the result to show).
61
+ *
62
+ * - `"card"` — a self-contained bordered card. For content-bearing rows
63
+ * (shell, edit, fetch, MCP), where the body is real evidence worth a frame.
64
+ * - `"quiet"` — an unboxed single text line, no border, no card. For
65
+ * metadata-only rows (read / list / search / think) whose label + argument
66
+ * already tell the whole story: a 4 ms directory listing must not shout as
67
+ * loudly as a 3-minute shell run (Cursor's chat is the reference UX — prose
68
+ * with quiet evidence attached, not a stack of equally-loud widgets).
69
+ *
70
+ * This is the *settled default*. A row escalates to `"card"` regardless of
71
+ * category while it carries something the quiet line cannot: a pending
72
+ * approval gate (a decision surface) or a failure (error output is content).
73
+ * That escalation is owned by the component layer and is deliberately not
74
+ * override-able — a gate must never render without its frame.
75
+ */
76
+ export type ToolChrome = "card" | "quiet";
77
+
78
+ /**
79
+ * Categories whose settled summary row IS the complete information, rendered
80
+ * as quiet unboxed lines by default. Mirrors {@link RUN_GROUPABLE_CATEGORIES}
81
+ * plus `think` (a thought's row reads like narration, not evidence) — the
82
+ * same low-signal set, on the chrome axis instead of the folding axis.
83
+ */
84
+ const QUIET_CATEGORIES: ReadonlySet<ToolCategory> = new Set<ToolCategory>([
85
+ "read",
86
+ "list",
87
+ "search",
88
+ "think",
89
+ ]);
90
+
91
+ /**
92
+ * Returns the default {@link ToolChrome} for a presentation category.
93
+ * Consumers can override per {@link ToolKind} via {@link registerToolPresenter}
94
+ * (`chrome: () => "card"` to restore the boxed look for a kind), exactly like
95
+ * the disclosure axis.
96
+ */
97
+ export function defaultChromeForCategory(category: ToolCategory): ToolChrome {
98
+ return QUIET_CATEGORIES.has(category) ? "quiet" : "card";
99
+ }
49
100
 
50
101
  /**
51
102
  * Categories whose result is foregrounded as a persistent bounded preview by
@@ -60,7 +111,6 @@ export type ToolDisclosure = "summary" | "preview";
60
111
  * under control even in turns with many edits.
61
112
  */
62
113
  const PREVIEW_CATEGORIES: ReadonlySet<ToolCategory> = new Set<ToolCategory>([
63
- "shell",
64
114
  "edit",
65
115
  "write",
66
116
  "mcp",
@@ -69,6 +119,18 @@ const PREVIEW_CATEGORIES: ReadonlySet<ToolCategory> = new Set<ToolCategory>([
69
119
  "unknown",
70
120
  ]);
71
121
 
122
+ /**
123
+ * Categories that stream in full while live but settle to a dimmed tail of
124
+ * their last output lines (see the `"tail"` arm of {@link ToolDisclosure}).
125
+ * Today that is shell alone: its output is evidence worth keeping at a
126
+ * glance, but rarely worth reading line by line once the command succeeded.
127
+ * Consumers can restore the always-expanded preview per kind via
128
+ * {@link registerToolPresenter} (`disclosure: () => "preview"`).
129
+ */
130
+ const TAIL_CATEGORIES: ReadonlySet<ToolCategory> = new Set<ToolCategory>([
131
+ "shell",
132
+ ]);
133
+
72
134
  /**
73
135
  * Low-signal categories whose consecutive runs fold into a single collapsible
74
136
  * "Read 5 files" chip in the thread. These are the read-only, repetitive
@@ -84,13 +146,15 @@ const RUN_GROUPABLE_CATEGORIES: ReadonlySet<ToolCategory> = new Set<ToolCategory
84
146
 
85
147
  /**
86
148
  * Returns the default inline {@link ToolDisclosure} for a presentation
87
- * category. This is the headless policy behind the thread's "keep a live
88
- * preview for shell/MCP/unknown, keep generic tools compact" behaviour;
89
- * consumers can override per {@link ToolKind} via {@link registerToolPresenter}.
149
+ * category. This is the headless policy behind the thread's "collapse settled
150
+ * shell to a dimmed tail, keep a live preview for MCP/unknown, keep generic
151
+ * tools compact" behaviour; consumers can override per {@link ToolKind} via
152
+ * {@link registerToolPresenter}.
90
153
  */
91
154
  export function defaultDisclosureForCategory(
92
155
  category: ToolCategory,
93
156
  ): ToolDisclosure {
157
+ if (TAIL_CATEGORIES.has(category)) return "tail";
94
158
  return PREVIEW_CATEGORIES.has(category) ? "preview" : "summary";
95
159
  }
96
160
 
@@ -128,6 +192,14 @@ export interface ToolCategoryInfo {
128
192
  readonly primaryArgField: string;
129
193
  /** Fallback argument keys tried when the primary key is absent. */
130
194
  readonly fallbackArgFields: readonly string[];
195
+ /**
196
+ * JSON argument key carrying a model-authored intent phrase for this kind
197
+ * (stigmer#276), or `undefined` for kinds without one. Shell is the only
198
+ * carrier today: both harnesses converge on `description` — the Cursor
199
+ * harness's built-in Shell tool ships it natively, and the native harness's
200
+ * tool-intent middleware adds it to the `execute` schema at bind time.
201
+ */
202
+ readonly intentArgField?: string;
131
203
  }
132
204
 
133
205
  interface KindDisplayEntry {
@@ -135,6 +207,7 @@ interface KindDisplayEntry {
135
207
  readonly label: string;
136
208
  readonly primaryField: string;
137
209
  readonly fallbackFields?: readonly string[];
210
+ readonly intentField?: string;
138
211
  }
139
212
 
140
213
  // Presentation metadata per ToolKind. Classification (name -> kind) is owned by
@@ -145,7 +218,7 @@ const KIND_DISPLAY: Partial<Record<ToolKind, KindDisplayEntry>> = {
145
218
  [ToolKind.FILE_WRITE]: { category: "write", label: "Write", primaryField: "path", fallbackFields: ["file_path", "file", "filename"] },
146
219
  [ToolKind.FILE_EDIT]: { category: "edit", label: "Edit", primaryField: "path", fallbackFields: ["file_path", "file", "filename"] },
147
220
  [ToolKind.FILE_DELETE]: { category: "delete", label: "Delete", primaryField: "path", fallbackFields: ["file_path", "file", "filename"] },
148
- [ToolKind.SHELL]: { category: "shell", label: "Shell", primaryField: "command" },
221
+ [ToolKind.SHELL]: { category: "shell", label: "Shell", primaryField: "command", intentField: "description" },
149
222
  [ToolKind.SEARCH]: { category: "search", label: "Search", primaryField: "pattern", fallbackFields: ["query", "q"] },
150
223
  [ToolKind.LIST]: { category: "list", label: "List", primaryField: "path" },
151
224
  [ToolKind.FETCH]: { category: "fetch", label: "Fetch", primaryField: "url", fallbackFields: ["uri"] },
@@ -200,6 +273,7 @@ export function toolKindToCategoryInfo(
200
273
  label: entry.label,
201
274
  primaryArgField: entry.primaryField,
202
275
  fallbackArgFields: entry.fallbackFields ?? [],
276
+ ...(entry.intentField ? { intentArgField: entry.intentField } : {}),
203
277
  };
204
278
  }
205
279
 
@@ -376,6 +450,118 @@ export function extractPrimaryArgFromPreview(
376
450
  }
377
451
  }
378
452
 
453
+ /**
454
+ * Extracts the model-authored intent phrase from a tool call's args
455
+ * (stigmer#276), or `null` when the kind carries none / the model omitted it.
456
+ *
457
+ * The intent is presentation metadata authored by the model *for the user* —
458
+ * "Run unit tests for the parser" — rendered as the row title in place of the
459
+ * bare category label. Extraction is kind-scoped via
460
+ * {@link ToolCategoryInfo.intentArgField} (shell-only today) so a same-named
461
+ * REAL argument on another kind (e.g. the sub-agent task tool's
462
+ * `description`, which is its subject) is never misread as an intent.
463
+ */
464
+ export function extractIntent(toolCall: ToolCall): string | null {
465
+ const info = resolveToolCategoryFromCall(toolCall);
466
+ if (!info.intentArgField || !toolCall.args) return null;
467
+ const value = toolCall.args[info.intentArgField];
468
+ return typeof value === "string" && value.length > 0 ? value : null;
469
+ }
470
+
471
+ /**
472
+ * {@link extractIntent} for surfaces that carry a JSON `argsPreview` string
473
+ * instead of a full {@link ToolCall} — notably `PendingApproval`. Same
474
+ * kind-scoping; returns `null` on parse failure or when absent.
475
+ */
476
+ export function extractIntentFromPreview(
477
+ toolName: string,
478
+ argsPreview: string,
479
+ mcpServerSlug?: string,
480
+ toolKind?: ToolKind,
481
+ ): string | null {
482
+ if (!argsPreview) return null;
483
+
484
+ const info =
485
+ toolKind !== undefined
486
+ ? resolveToolCategoryFromKind(toolKind, toolName, mcpServerSlug)
487
+ : resolveToolCategory(toolName, mcpServerSlug);
488
+ if (!info.intentArgField) return null;
489
+
490
+ try {
491
+ const parsed = JSON.parse(argsPreview);
492
+ if (typeof parsed !== "object" || parsed === null) return null;
493
+ const value = (parsed as Record<string, unknown>)[info.intentArgField];
494
+ return typeof value === "string" && value.length > 0 ? value : null;
495
+ } catch {
496
+ return null;
497
+ }
498
+ }
499
+
500
+ /**
501
+ * The tool-call argument that carries a model-authored intent phrase for
502
+ * SHELL tools (stigmer#276) — a short human description of what the command
503
+ * does and why, rendered as the row title with the command as secondary text.
504
+ *
505
+ * Two writers populate it, converged on one wire key by design: the native
506
+ * harness's tool-intent middleware (`backend/services/runner/src/middleware/
507
+ * tool-intent.ts`, `INTENT_ARG`) extends the shell tool's bind-time schema
508
+ * with it, and the Cursor harness's built-in Shell tool carries it natively.
509
+ * The shared, machine-checked contract is
510
+ * `test/fixtures/tool-view/intent-title.json` — keep all three in lockstep.
511
+ */
512
+ export const SHELL_INTENT_ARG_FIELD = "description";
513
+
514
+ /**
515
+ * The intent-title extraction core: SHELL-kind-scoped on purpose, because
516
+ * `description` means other things on other tools (a task tool's description
517
+ * is the sub-agent subject, never a row title). Blank and non-string values
518
+ * degrade to null — the caller falls back to the category label.
519
+ */
520
+ function extractIntentFromArgs(kind: ToolKind, args: JsonObject | undefined): string | null {
521
+ if (kind !== ToolKind.SHELL || !args) return null;
522
+ const value = args[SHELL_INTENT_ARG_FIELD];
523
+ if (typeof value !== "string") return null;
524
+ const trimmed = value.trim();
525
+ return trimmed.length > 0 ? trimmed : null;
526
+ }
527
+
528
+ /**
529
+ * Extracts the model-authored intent phrase from a SHELL tool call, or null
530
+ * when absent (legacy executions, models that skipped the optional arg, and
531
+ * every non-shell kind). See {@link SHELL_INTENT_ARG_FIELD}.
532
+ */
533
+ export function extractShellIntent(toolCall: ToolCall): string | null {
534
+ return extractIntentFromArgs(resolveToolKind(toolCall), toolCall.args);
535
+ }
536
+
537
+ /**
538
+ * Preview-string twin of {@link extractShellIntent} for surfaces that carry a
539
+ * `PendingApproval` (JSON `argsPreview`) instead of a full {@link ToolCall} —
540
+ * mirrors {@link extractPrimaryArgFromPreview}'s kind resolution.
541
+ */
542
+ export function extractShellIntentFromPreview(
543
+ toolName: string,
544
+ argsPreview: string,
545
+ mcpServerSlug?: string,
546
+ toolKind?: ToolKind,
547
+ ): string | null {
548
+ if (!argsPreview) return null;
549
+
550
+ const kind =
551
+ toolKind !== undefined && toolKind !== ToolKind.UNSPECIFIED
552
+ ? toolKind
553
+ : resolveToolKindByName(toolName, mcpServerSlug);
554
+ if (kind !== ToolKind.SHELL) return null;
555
+
556
+ try {
557
+ const parsed = JSON.parse(argsPreview);
558
+ if (typeof parsed !== "object" || parsed === null) return null;
559
+ return extractIntentFromArgs(kind, parsed as JsonObject);
560
+ } catch {
561
+ return null;
562
+ }
563
+ }
564
+
379
565
  const WRITE_CONTENT_FIELDS = [
380
566
  "contents",
381
567
  "content",
@@ -19,10 +19,12 @@ import type { ToolResultView } from "@stigmer/sdk";
19
19
  import {
20
20
  resolveToolCategoryFromCall,
21
21
  extractPrimaryArg,
22
+ extractShellIntent,
23
+ defaultChromeForCategory,
22
24
  defaultDisclosureForCategory,
23
25
  isRunGroupableCategory,
24
26
  } from "./tool-categories.js";
25
- import type { ToolCategory, ToolDisclosure } from "./tool-categories.js";
27
+ import type { ToolCategory, ToolChrome, ToolDisclosure } from "./tool-categories.js";
26
28
  import { summarizeResultView } from "./ResultView.js";
27
29
 
28
30
  /** Optional per-kind overrides for label, summary, disclosure, and run-grouping. */
@@ -37,6 +39,15 @@ export interface ToolPresenter {
37
39
  * (`() => "preview"`) without forking the components.
38
40
  */
39
41
  readonly disclosure?: (toolCall: ToolCall, result: ToolResultView) => ToolDisclosure;
42
+ /**
43
+ * Overrides the default chrome tier — quiet unboxed line vs bordered card
44
+ * (see {@link ToolChrome}). Use to restore the boxed look for a kind
45
+ * (`() => "card"`) or to quiet a chatty custom tool (`() => "quiet"`).
46
+ * A pending approval gate or a failure always escalates the row to a card
47
+ * regardless of this override — a decision surface and error output must
48
+ * never render frameless.
49
+ */
50
+ readonly chrome?: (toolCall: ToolCall, result: ToolResultView) => ToolChrome;
40
51
  /**
41
52
  * Overrides whether consecutive same-kind calls fold into one collapsible
42
53
  * "Read 5 files" chip. Use to fold a chatty custom tool (`() => true`) or to
@@ -114,6 +125,21 @@ export interface ToolPresentation {
114
125
  readonly category: ToolCategory;
115
126
  /** Display label, e.g. "Edit", "Shell". */
116
127
  readonly label: string;
128
+ /**
129
+ * The model-authored intent phrase for a SHELL call (stigmer#276), or null
130
+ * when absent (legacy executions, skipped optional arg, non-shell kinds).
131
+ * Raw extraction — precedence against overrides is resolved in
132
+ * {@link ToolPresentation.title}.
133
+ */
134
+ readonly intent: string | null;
135
+ /**
136
+ * The row title: a registered presenter's `label` override wins (a host's
137
+ * explicit wording is never displaced by model output), then the
138
+ * model-authored {@link intent}, then the category {@link label}. Renderers
139
+ * that title a row use this; {@link label} stays the short kind label for
140
+ * chips and badges.
141
+ */
142
+ readonly title: string;
117
143
  /** Primary argument (path, command, pattern...), or null. */
118
144
  readonly primaryArg: string | null;
119
145
  /** Normalized result view for rendering with {@link ResultView}. */
@@ -127,6 +153,13 @@ export interface ToolPresentation {
127
153
  * default.
128
154
  */
129
155
  readonly disclosure: ToolDisclosure;
156
+ /**
157
+ * Default chrome tier for this tool — `"quiet"` renders an unboxed line,
158
+ * `"card"` a bordered card (see {@link ToolChrome}). A pending gate or a
159
+ * failure escalates to `"card"` in the component layer; this is the
160
+ * *settled* default.
161
+ */
162
+ readonly chrome: ToolChrome;
130
163
  /**
131
164
  * Whether consecutive same-kind calls fold into one collapsible chip — the
132
165
  * run-grouping axis, orthogonal to {@link disclosure}. See
@@ -149,12 +182,18 @@ export function useToolPresentation(toolCall: ToolCall): ToolPresentation {
149
182
  const result = normalizeToolResult(toolCall);
150
183
  const override = registry.get(kind);
151
184
 
152
- const label = override?.label?.(toolCall) ?? categoryInfo.label;
185
+ const overrideLabel = override?.label?.(toolCall);
186
+ const label = overrideLabel ?? categoryInfo.label;
187
+ const intent = extractShellIntent(toolCall);
188
+ const title = overrideLabel ?? intent ?? categoryInfo.label;
153
189
  const resultSummary =
154
190
  override?.summary?.(toolCall, result) ?? summarizeResultView(result);
155
191
  const disclosure =
156
192
  override?.disclosure?.(toolCall, result) ??
157
193
  defaultDisclosureForCategory(categoryInfo.category);
194
+ const chrome =
195
+ override?.chrome?.(toolCall, result) ??
196
+ defaultChromeForCategory(categoryInfo.category);
158
197
  const runGroupable =
159
198
  override?.runGroupable?.(toolCall) ??
160
199
  isRunGroupableCategory(categoryInfo.category);
@@ -163,10 +202,13 @@ export function useToolPresentation(toolCall: ToolCall): ToolPresentation {
163
202
  kind,
164
203
  category: categoryInfo.category,
165
204
  label,
205
+ intent,
206
+ title,
166
207
  primaryArg: extractPrimaryArg(toolCall),
167
208
  result,
168
209
  resultSummary,
169
210
  disclosure,
211
+ chrome,
170
212
  runGroupable,
171
213
  };
172
214
  }, [toolCall]);
@@ -12,8 +12,7 @@ import {
12
12
  useApplyResource,
13
13
  type ApplyResourceResult,
14
14
  } from "../library/useApplyResource.js";
15
-
16
- const COPIED_FEEDBACK_MS = 2000;
15
+ import { useCopyFeedback } from "../internal/useCopyFeedback.js";
17
16
 
18
17
  /** Options for {@link useArtifactInspection}. */
19
18
  export interface UseArtifactInspectionOptions {
@@ -198,14 +197,11 @@ export function useArtifactInspection(
198
197
 
199
198
  // --- Copy -----------------------------------------------------------------
200
199
 
201
- const [copied, setCopied] = useState(false);
200
+ const { copy: copyToClipboard, copied } = useCopyFeedback();
202
201
  const copy = useCallback(() => {
203
202
  if (!content) return;
204
- void navigator.clipboard.writeText(content).then(() => {
205
- setCopied(true);
206
- setTimeout(() => setCopied(false), COPIED_FEEDBACK_MS);
207
- });
208
- }, [content]);
203
+ void copyToClipboard(content);
204
+ }, [content, copyToClipboard]);
209
205
 
210
206
  return useMemo(
211
207
  () => ({
@@ -12,6 +12,7 @@ import { getUserMessage, iamRoleToString } from "@stigmer/sdk";
12
12
  import { useCreateIamPolicy } from "./useCreateIamPolicy.js";
13
13
  import { RoleSelector } from "./RoleSelector.js";
14
14
  import { PrincipalPicker, type SelectedPrincipal } from "./PrincipalPicker.js";
15
+ import { SpinnerIcon } from "../internal/SpinnerIcon.js";
15
16
 
16
17
  /** Props for {@link GrantAccessForm}. */
17
18
  export interface GrantAccessFormProps {
@@ -151,7 +152,7 @@ export function GrantAccessForm({
151
152
  "stg:disabled:pointer-events-none stg:disabled:opacity-40",
152
153
  )}
153
154
  >
154
- {isCreating && <SpinnerIcon />}
155
+ {isCreating && <SpinnerIcon size={12} />}
155
156
  Grant access
156
157
  </button>
157
158
 
@@ -174,20 +175,3 @@ export function GrantAccessForm({
174
175
  );
175
176
  }
176
177
 
177
- function SpinnerIcon() {
178
- return (
179
- <svg
180
- width="12"
181
- height="12"
182
- viewBox="0 0 16 16"
183
- fill="none"
184
- stroke="currentColor"
185
- strokeWidth="2"
186
- strokeLinecap="round"
187
- className="stg:animate-spin"
188
- aria-hidden="true"
189
- >
190
- <path d="M8 2a6 6 0 1 0 6 6" />
191
- </svg>
192
- );
193
- }