@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
@@ -37,6 +37,8 @@ function makeToolCall(opts: {
37
37
  mcpServerSlug?: string;
38
38
  status?: ToolCallStatus;
39
39
  fileChangeSetId?: string;
40
+ startedAt?: string;
41
+ completedAt?: string;
40
42
  }): ToolCall {
41
43
  return create(ToolCallSchema, {
42
44
  id: opts.id ?? opts.name,
@@ -46,6 +48,8 @@ function makeToolCall(opts: {
46
48
  mcpServerSlug: opts.mcpServerSlug ?? "",
47
49
  status: opts.status ?? ToolCallStatus.TOOL_CALL_COMPLETED,
48
50
  fileChangeSetId: opts.fileChangeSetId ?? "",
51
+ startedAt: opts.startedAt ?? "",
52
+ completedAt: opts.completedAt ?? "",
49
53
  });
50
54
  }
51
55
 
@@ -190,10 +194,10 @@ describe("ToolCallItem disclosure", () => {
190
194
  expect(container.querySelector("table")).not.toBeNull();
191
195
  });
192
196
 
193
- it("renders a settled shell as an always-visible terminal session, no chevron", () => {
194
- // Shell is a `preview` category: its output IS the information. The body
195
- // reads as one terminal session — the `$ command` prompt line leads, with
196
- // its output below visible without any disclosure click.
197
+ it("settles a successful shell into a collapsed dimmed tail behind a chevron", () => {
198
+ // Shell is the `tail` category: a settled success collapses to the
199
+ // TerminalTail teaser — the `$ command` line plus the last output lines at
200
+ // reduced contrastwith the header chevron as the expand control.
197
201
  const { container } = render(
198
202
  <ToolCallItem
199
203
  toolCall={makeToolCall({
@@ -203,13 +207,17 @@ describe("ToolCallItem disclosure", () => {
203
207
  })}
204
208
  />,
205
209
  );
206
- expect(hasHeaderChevron(container)).toBe(false);
207
- expect(previewBody(container)).not.toBeNull();
210
+ expect(hasHeaderChevron(container)).toBe(true);
211
+ expect(isExpanded(container)).toBe(false);
212
+ expect(
213
+ container.querySelector('[data-cursor-target="terminal-tail"]'),
214
+ ).not.toBeNull();
215
+ expect(
216
+ container.querySelector('[data-cursor-target="terminal-session"]'),
217
+ ).toBeNull();
218
+ // The teaser still carries the evidence: intent and last output.
208
219
  expect(container.textContent).toContain("$ echo hello");
209
220
  expect(screen.getByText("hello")).toBeTruthy();
210
- expect(
211
- container.querySelectorAll('[data-cursor-target="terminal-session"]'),
212
- ).toHaveLength(1);
213
221
  });
214
222
 
215
223
  it("renders a settled MCP tool's result inline with no chevron", () => {
@@ -248,7 +256,10 @@ describe("ToolCallItem disclosure", () => {
248
256
  expect(container.textContent).toContain("exit 2");
249
257
  });
250
258
 
251
- it("renders a running shell as a single terminal session block, no chevron", () => {
259
+ it("streams a running shell's full session in view (force-open, collapsible)", () => {
260
+ // The auto-open-while-running behaviour is untouched by the tail settle:
261
+ // an active command shows its output streaming. The chevron is present —
262
+ // a user may collapse a noisy long-running command, and their choice wins.
252
263
  const { container } = render(
253
264
  <ToolCallItem
254
265
  toolCall={makeToolCall({
@@ -259,12 +270,105 @@ describe("ToolCallItem disclosure", () => {
259
270
  })}
260
271
  />,
261
272
  );
262
- expect(hasHeaderChevron(container)).toBe(false);
273
+ expect(hasHeaderChevron(container)).toBe(true);
274
+ expect(isExpanded(container)).toBe(true);
263
275
  expect(
264
276
  container.querySelectorAll('[data-cursor-target="terminal-session"]'),
265
277
  ).toHaveLength(1);
266
278
  });
267
279
 
280
+ // --- Tail settle lifecycle (issue #275) ------------------------------------
281
+
282
+ it("collapses a running shell to the dimmed tail the moment it succeeds", () => {
283
+ const running = makeToolCall({
284
+ id: "tc-sh",
285
+ name: "Shell",
286
+ args: { command: "make build" },
287
+ result: "compiling…",
288
+ status: ToolCallStatus.TOOL_CALL_RUNNING,
289
+ });
290
+ const { container, rerender } = render(<ToolCallItem toolCall={running} />);
291
+ expect(isExpanded(container)).toBe(true);
292
+
293
+ rerender(
294
+ <ToolCallItem
295
+ toolCall={makeToolCall({
296
+ id: "tc-sh",
297
+ name: "Shell",
298
+ args: { command: "make build" },
299
+ result: "compiling…\nBUILD OK",
300
+ status: ToolCallStatus.TOOL_CALL_COMPLETED,
301
+ })}
302
+ />,
303
+ );
304
+ expect(isExpanded(container)).toBe(false);
305
+ expect(
306
+ container.querySelector('[data-cursor-target="terminal-tail"]'),
307
+ ).not.toBeNull();
308
+ expect(container.textContent).toContain("BUILD OK");
309
+ });
310
+
311
+ it("keeps a failed shell open — error output is content, not context", () => {
312
+ // A non-zero exit means the output is what the user needs next; the row
313
+ // must never settle into the dimmed teaser. The exit marker in the result
314
+ // string is the failure signal (status stays COMPLETED on the wire).
315
+ const { container } = render(
316
+ <ToolCallItem
317
+ toolCall={makeToolCall({
318
+ name: "Shell",
319
+ args: { command: "make build" },
320
+ result: "error: no rule\n[Command failed with exit code 2]",
321
+ })}
322
+ />,
323
+ );
324
+ expect(hasHeaderChevron(container)).toBe(true);
325
+ expect(isExpanded(container)).toBe(true);
326
+ expect(
327
+ container.querySelector('[data-cursor-target="terminal-session"]'),
328
+ ).not.toBeNull();
329
+ expect(container.textContent).toContain("exit 2");
330
+ });
331
+
332
+ it("keeps only the last lines in the collapsed tail, with an honest hidden-count", () => {
333
+ const output = ["one", "two", "three", "four", "five"].join("\n");
334
+ const { container } = render(
335
+ <ToolCallItem
336
+ toolCall={makeToolCall({
337
+ name: "Shell",
338
+ args: { command: "seq 5" },
339
+ result: output,
340
+ })}
341
+ />,
342
+ );
343
+ const tail = container.querySelector('[data-cursor-target="terminal-tail"]')!;
344
+ expect(tail.textContent).toContain("five");
345
+ expect(tail.textContent).toContain("three");
346
+ expect(tail.textContent).not.toContain("one");
347
+ expect(tail.textContent).toContain("+2 lines");
348
+ });
349
+
350
+ it("expands a collapsed tail to the full session on click, and the choice sticks", () => {
351
+ const settled = makeToolCall({
352
+ id: "tc-sh2",
353
+ name: "Shell",
354
+ args: { command: "echo hi" },
355
+ result: "hi",
356
+ });
357
+ const { container, rerender } = render(<ToolCallItem toolCall={settled} />);
358
+ expect(isExpanded(container)).toBe(false);
359
+
360
+ fireEvent.click(rowHeaderToggle(container)!);
361
+ expect(isExpanded(container)).toBe(true);
362
+ expect(
363
+ container.querySelector('[data-cursor-target="terminal-session"]'),
364
+ ).not.toBeNull();
365
+
366
+ // A stream frame re-rendering the same settled call never recollapses a
367
+ // row the user opened (useAutoDisclosure: the manual toggle wins).
368
+ rerender(<ToolCallItem toolCall={settled} />);
369
+ expect(isExpanded(container)).toBe(true);
370
+ });
371
+
268
372
  it("suppresses the body for a content-bearing tool that produced nothing", () => {
269
373
  // The regression guard: a preview-category tool whose result normalizes to
270
374
  // `empty` (no output) must stay a clean one-line row, never an empty padded
@@ -473,6 +577,190 @@ describe("ToolCallItem disclosure", () => {
473
577
  });
474
578
  });
475
579
 
580
+ // ---------------------------------------------------------------------------
581
+ // Density tier — quiet unboxed lines for metadata-only rows (stigmer#274)
582
+ // ---------------------------------------------------------------------------
583
+
584
+ function rowRoot(container: HTMLElement): HTMLElement {
585
+ return container.querySelector('[data-cursor-target="tool-call-row"]')!;
586
+ }
587
+ function isQuietLine(container: HTMLElement): boolean {
588
+ const cls = rowRoot(container).className;
589
+ return !cls.includes("stg:rounded-lg") && !cls.includes("stg:border-b");
590
+ }
591
+
592
+ describe("ToolCallItem density tier", () => {
593
+ it("renders metadata-only rows as quiet unboxed lines (read / list / search / think)", () => {
594
+ const cases: ToolCall[] = [
595
+ makeToolCall({ name: "Read", args: { path: "/a.ts" } }),
596
+ makeToolCall({ name: "ls", args: { path: "/src" } }),
597
+ makeToolCall({ name: "Grep", args: { pattern: "foo" }, result: "2 matches" }),
598
+ makeToolCall({ name: "think", args: { thought: "considering options" } }),
599
+ ];
600
+ for (const tc of cases) {
601
+ const { container, unmount } = render(<ToolCallItem toolCall={tc} />);
602
+ expect(isQuietLine(container), `${tc.name} should be a quiet line`).toBe(true);
603
+ unmount();
604
+ }
605
+ });
606
+
607
+ it("keeps content-bearing rows as cards (shell / edit)", () => {
608
+ const cases: ToolCall[] = [
609
+ makeToolCall({ name: "Shell", args: { command: "echo hi" }, result: "hi" }),
610
+ makeToolCall({
611
+ name: "StrReplace",
612
+ args: { path: "/a.ts", old_string: "a", new_string: "b" },
613
+ }),
614
+ ];
615
+ for (const tc of cases) {
616
+ const { container, unmount } = render(<ToolCallItem toolCall={tc} />);
617
+ expect(rowRoot(container).className, `${tc.name} should stay a card`).toContain(
618
+ "stg:border-border-prominent",
619
+ );
620
+ unmount();
621
+ }
622
+ });
623
+
624
+ it("escalates a quiet row to a card when it fails — error output is content", () => {
625
+ const failed = makeToolCall({
626
+ name: "Read",
627
+ args: { path: "/a.ts" },
628
+ status: ToolCallStatus.TOOL_CALL_FAILED,
629
+ result: '{"status":"error","message":"permission denied"}',
630
+ });
631
+ const { container } = render(<ToolCallItem toolCall={failed} />);
632
+ expect(rowRoot(container).className).toContain("stg:border-border-prominent");
633
+ });
634
+
635
+ it("escalates a quiet row to a card while gated — a decision surface is never frameless", () => {
636
+ const gated = makeToolCall({
637
+ id: "tc-read-gated",
638
+ name: "Read",
639
+ args: { path: "/secret" },
640
+ status: ToolCallStatus.TOOL_CALL_WAITING_APPROVAL,
641
+ });
642
+ const approval: PendingApproval = create(PendingApprovalSchema, {
643
+ toolCallId: "tc-read-gated",
644
+ toolName: "Read",
645
+ argsPreview: '{"path":"/secret"}',
646
+ });
647
+ const ctx: ApprovalContextValue = {
648
+ approvalsByToolCallId: new Map([["tc-read-gated", approval]]),
649
+ onSubmit: () => {},
650
+ submittingIds: new Set(),
651
+ errorsByToolCallId: new Map(),
652
+ };
653
+ const { container } = render(
654
+ <ApprovalContext.Provider value={ctx}>
655
+ <ToolCallItem toolCall={gated} />
656
+ </ApprovalContext.Provider>,
657
+ );
658
+ const cls = rowRoot(container).className;
659
+ expect(cls).toContain("stg:border-border-prominent");
660
+ expect(cls).toContain("stg:border-l-warning");
661
+ });
662
+
663
+ it("stays a quiet line while running — the in-flight state rides the label, not a frame", () => {
664
+ const running = makeToolCall({
665
+ name: "Read",
666
+ args: { path: "/a.ts" },
667
+ status: ToolCallStatus.TOOL_CALL_RUNNING,
668
+ });
669
+ const { container } = render(<ToolCallItem toolCall={running} />);
670
+ expect(isQuietLine(container)).toBe(true);
671
+ expect(container.querySelector(".stg\\:animate-spin")).not.toBeNull();
672
+ });
673
+
674
+ it("sweeps the running label with the ambient-liveness shimmer, settled labels stay static", () => {
675
+ const running = makeToolCall({
676
+ name: "Shell",
677
+ args: { command: "sleep 5" },
678
+ status: ToolCallStatus.TOOL_CALL_RUNNING,
679
+ });
680
+ const { container, rerender } = render(<ToolCallItem toolCall={running} />);
681
+ expect(container.querySelector(".stgm-shimmer-label")?.textContent).toBe("Shell");
682
+
683
+ const settled = makeToolCall({
684
+ name: "Shell",
685
+ args: { command: "sleep 5" },
686
+ result: "done",
687
+ });
688
+ rerender(<ToolCallItem toolCall={settled} />);
689
+ expect(container.querySelector(".stgm-shimmer-label")).toBeNull();
690
+ });
691
+
692
+ it("contains a quiet row's disclosed body under a left rail instead of a border", () => {
693
+ // Grep is a summary category with a real result body: expanding the quiet
694
+ // line must bound the body with the rail (the ThinkingMessage precedent),
695
+ // never leave it bleeding into the thread.
696
+ const tc = makeToolCall({
697
+ name: "Grep",
698
+ args: { pattern: "foo" },
699
+ result: "src/a.ts:1: foo",
700
+ });
701
+ const { container } = render(<ToolCallItem toolCall={tc} />);
702
+ fireEvent.click(rowHeaderToggle(container)!);
703
+ expect(container.querySelector(".stg\\:border-l-2")).not.toBeNull();
704
+ });
705
+ });
706
+
707
+ // ---------------------------------------------------------------------------
708
+ // Status vocabulary — success is silent, everything visible carries signal
709
+ // ---------------------------------------------------------------------------
710
+
711
+ describe("ToolCallItem status vocabulary", () => {
712
+ it("renders no status icon on a completed row — success is the silent default", () => {
713
+ const { container } = render(
714
+ <ToolCallItem
715
+ toolCall={makeToolCall({ name: "Shell", args: { command: "echo hi" }, result: "hi" })}
716
+ />,
717
+ );
718
+ expect(container.querySelector(".stg\\:text-success")).toBeNull();
719
+ });
720
+
721
+ it("keeps the failed icon — failure shouts", () => {
722
+ const { container } = render(
723
+ <ToolCallItem
724
+ toolCall={makeToolCall({
725
+ name: "Shell",
726
+ args: { command: "false" },
727
+ status: ToolCallStatus.TOOL_CALL_FAILED,
728
+ })}
729
+ />,
730
+ );
731
+ expect(container.querySelector(".stg\\:text-destructive")).not.toBeNull();
732
+ });
733
+ });
734
+
735
+ // ---------------------------------------------------------------------------
736
+ // Duration chips — shown only when they carry information (>= 1s)
737
+ // ---------------------------------------------------------------------------
738
+
739
+ describe("ToolCallItem duration chip", () => {
740
+ it("suppresses a sub-second duration — the chip would be noise", () => {
741
+ const tc = makeToolCall({
742
+ name: "Read",
743
+ args: { path: "/a.ts" },
744
+ startedAt: "2026-08-13T10:00:00.000Z",
745
+ completedAt: "2026-08-13T10:00:00.400Z",
746
+ });
747
+ render(<ToolCallItem toolCall={tc} />);
748
+ expect(screen.queryByText("400ms")).toBeNull();
749
+ });
750
+
751
+ it("shows a duration of a second or more — it carries information", () => {
752
+ const tc = makeToolCall({
753
+ name: "Shell",
754
+ args: { command: "sleep 2" },
755
+ result: "",
756
+ startedAt: "2026-08-13T10:00:00.000Z",
757
+ completedAt: "2026-08-13T10:00:02.500Z",
758
+ });
759
+ render(<ToolCallItem toolCall={tc} />);
760
+ expect(screen.getByText("2.5s")).toBeTruthy();
761
+ });
762
+ });
763
+
476
764
  // ---------------------------------------------------------------------------
477
765
  // File-review badge — a stamped edit row's live review state
478
766
  // ---------------------------------------------------------------------------
@@ -90,9 +90,12 @@ describe("ToolRunGroup", () => {
90
90
  );
91
91
  expect(container.querySelector(".stg\\:animate-spin")).toBeNull();
92
92
  expect(chipExpanded(container)).toBe(false);
93
- // The aggregate resolves to the terminal branch (completed chip in
94
- // text-success), not the non-terminal pending fallback (muted dot).
95
- expect(container.querySelector(".stg\\:text-success")).not.toBeNull();
93
+ // The aggregate resolves to the terminal branch which is silent
94
+ // (completed renders NO status icon, stigmer#274) — not the non-terminal
95
+ // pending fallback, which renders its muted dot as a third header svg
96
+ // beside the category icon and chevron.
97
+ const headerSvgs = container.querySelectorAll("button svg");
98
+ expect(headerSvgs.length).toBe(2);
96
99
  expect(screen.getByText("Read 2 files")).toBeTruthy();
97
100
  });
98
101
 
@@ -121,7 +124,7 @@ describe("ToolRunGroup", () => {
121
124
  expect(screen.getByLabelText("Approve")).toBeTruthy();
122
125
  });
123
126
 
124
- it("is a bordered card whose expanded children are borderless divider rows", () => {
127
+ it("is a quiet unboxed line whose expanded children sit under a left rail as divider rows", () => {
125
128
  const { container } = render(
126
129
  <ToolRunGroup
127
130
  category="read"
@@ -129,15 +132,20 @@ describe("ToolRunGroup", () => {
129
132
  />,
130
133
  );
131
134
 
135
+ // Quiet chrome (stigmer#274): the fold is metadata-only by construction,
136
+ // so the chip must never render as a bordered card shouting over the
137
+ // conversation. Class presence only — actual rendering is guarded by the
138
+ // layer-invariant + e2e computed-style tests (happy-dom does not resolve
139
+ // `@layer`).
132
140
  const chip = container.querySelector('[data-cursor-target="tool-run-group"]')!;
133
- expect(chip.className).toContain("stg:rounded-lg");
134
- // Class presence only — actual rendering is guarded by the layer-invariant +
135
- // e2e computed-style tests (happy-dom does not resolve `@layer`).
136
- expect(chip.className).toContain("stg:border-border-prominent");
141
+ expect(chip.className).not.toContain("stg:rounded-lg");
142
+ expect(chip.className).not.toContain("stg:border-border-prominent");
137
143
 
138
144
  fireEvent.click(screen.getByText("Read 2 files"));
139
145
 
140
- // The chip is the card; its child rows are dividers, never nested cards.
146
+ // With no card frame, the rail container owns the boundary; child rows
147
+ // are dividers, never nested cards.
148
+ expect(container.querySelector(".stg\\:border-l-2")).not.toBeNull();
141
149
  const rows = container.querySelectorAll('[data-cursor-target="tool-call-row"]');
142
150
  expect(rows.length).toBe(2);
143
151
  for (const row of rows) {
@@ -146,6 +154,30 @@ describe("ToolRunGroup", () => {
146
154
  }
147
155
  });
148
156
 
157
+ it("renders no status icon once the run settles successfully — success is silent", () => {
158
+ const { container } = render(
159
+ <ToolRunGroup
160
+ category="read"
161
+ toolCalls={[makeRead("r1", "/a.ts"), makeRead("r2", "/b.ts")]}
162
+ />,
163
+ );
164
+ // Header svgs: the category icon and the chevron — no green check.
165
+ expect(container.querySelectorAll("button svg").length).toBe(2);
166
+ });
167
+
168
+ it("keeps the failed icon when a folded call failed — failure shouts", () => {
169
+ const { container } = render(
170
+ <ToolRunGroup
171
+ category="read"
172
+ toolCalls={[
173
+ makeRead("r1", "/a.ts"),
174
+ makeRead("r2", "/b.ts", ToolCallStatus.TOOL_CALL_FAILED),
175
+ ]}
176
+ />,
177
+ );
178
+ expect(container.querySelector(".stg\\:text-destructive")).not.toBeNull();
179
+ });
180
+
149
181
  it("honours a custom label formatter", () => {
150
182
  render(
151
183
  <ToolRunGroup
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Model-authored intent titles for shell tool calls (stigmer#276).
3
+ *
4
+ * The extraction contract is pinned by the cross-surface fixture
5
+ * test/fixtures/tool-view/intent-title.json — the same file the runner's
6
+ * tool-intent middleware tests assert against, so the wire key and the
7
+ * kind-scoping can never drift between the writer and the readers.
8
+ */
9
+
10
+ import { readFileSync } from "node:fs";
11
+ import { dirname, resolve } from "node:path";
12
+ import { fileURLToPath } from "node:url";
13
+ import { describe, it, expect, afterEach } from "vitest";
14
+ import { render, screen, cleanup } from "@testing-library/react";
15
+ import { renderHook } from "@testing-library/react";
16
+ import { create, type JsonObject } from "@bufbuild/protobuf";
17
+ import {
18
+ ToolCallSchema,
19
+ type ToolCall,
20
+ } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
21
+ import { PendingApprovalSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/approval_pb";
22
+ import { ToolCallStatus, ToolKind } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
23
+ import {
24
+ extractShellIntent,
25
+ extractShellIntentFromPreview,
26
+ SHELL_INTENT_ARG_FIELD,
27
+ } from "../tool-categories";
28
+ import { useToolPresentation, registerToolPresenter } from "../tool-presenter";
29
+ import { ToolCallItem } from "../ToolCallItem";
30
+ import { ApprovalCardHeader } from "../ApprovalCard";
31
+
32
+ afterEach(cleanup);
33
+
34
+ const here = dirname(fileURLToPath(import.meta.url));
35
+ const fixturePath = resolve(here, "../../../../../test/fixtures/tool-view/intent-title.json");
36
+
37
+ interface IntentFixture {
38
+ argField: string;
39
+ cases: Array<{
40
+ name: string;
41
+ mcpServerSlug: string;
42
+ args: Record<string, unknown>;
43
+ intent: string | null;
44
+ }>;
45
+ }
46
+
47
+ const fixture = JSON.parse(readFileSync(fixturePath, "utf8")) as IntentFixture;
48
+
49
+ function makeToolCall(opts: {
50
+ name: string;
51
+ args?: Record<string, unknown>;
52
+ mcpServerSlug?: string;
53
+ status?: ToolCallStatus;
54
+ }): ToolCall {
55
+ return create(ToolCallSchema, {
56
+ id: opts.name,
57
+ name: opts.name,
58
+ args: (opts.args ?? {}) as JsonObject,
59
+ mcpServerSlug: opts.mcpServerSlug ?? "",
60
+ status: opts.status ?? ToolCallStatus.TOOL_CALL_COMPLETED,
61
+ });
62
+ }
63
+
64
+ describe("intent-title fixture contract", () => {
65
+ it("pins the wire key shared with the runner middleware", () => {
66
+ expect(SHELL_INTENT_ARG_FIELD).toBe(fixture.argField);
67
+ });
68
+
69
+ it.each(fixture.cases.map((c, i) => [i, c] as const))(
70
+ "case %#: %j",
71
+ (_i, c) => {
72
+ const tc = makeToolCall({
73
+ name: c.name,
74
+ args: c.args,
75
+ mcpServerSlug: c.mcpServerSlug,
76
+ });
77
+ expect(extractShellIntent(tc)).toBe(c.intent);
78
+ },
79
+ );
80
+ });
81
+
82
+ describe("extractShellIntentFromPreview", () => {
83
+ it("mirrors the ToolCall extraction on a JSON args preview", () => {
84
+ expect(
85
+ extractShellIntentFromPreview(
86
+ "execute",
87
+ JSON.stringify({ command: "make check", [SHELL_INTENT_ARG_FIELD]: "Verify the build" }),
88
+ ),
89
+ ).toBe("Verify the build");
90
+ });
91
+
92
+ it("prefers the denormalized wire kind over the name", () => {
93
+ // A shell tool whose NAME the classifier does not recognize still
94
+ // resolves via the wire kind — matching extractPrimaryArgFromPreview.
95
+ expect(
96
+ extractShellIntentFromPreview(
97
+ "custom_runner",
98
+ JSON.stringify({ command: "ls", [SHELL_INTENT_ARG_FIELD]: "List files" }),
99
+ "",
100
+ ToolKind.SHELL,
101
+ ),
102
+ ).toBe("List files");
103
+ });
104
+
105
+ it("returns null for malformed previews and non-shell kinds", () => {
106
+ expect(extractShellIntentFromPreview("execute", "not json{")).toBeNull();
107
+ expect(extractShellIntentFromPreview("execute", "")).toBeNull();
108
+ expect(
109
+ extractShellIntentFromPreview(
110
+ "read_file",
111
+ JSON.stringify({ file_path: "a", [SHELL_INTENT_ARG_FIELD]: "x" }),
112
+ ),
113
+ ).toBeNull();
114
+ });
115
+ });
116
+
117
+ describe("useToolPresentation title precedence", () => {
118
+ it("titles a shell row with the model-authored intent", () => {
119
+ const tc = makeToolCall({
120
+ name: "Shell",
121
+ args: { command: "npm test", [SHELL_INTENT_ARG_FIELD]: "Run the test suite" },
122
+ });
123
+ const { result } = renderHook(() => useToolPresentation(tc));
124
+
125
+ expect(result.current.intent).toBe("Run the test suite");
126
+ expect(result.current.title).toBe("Run the test suite");
127
+ // The short kind label is unchanged — chips and badges keep "Shell".
128
+ expect(result.current.label).toBe("Shell");
129
+ });
130
+
131
+ it("falls back to the category label when no intent is present", () => {
132
+ const tc = makeToolCall({ name: "Shell", args: { command: "ls" } });
133
+ const { result } = renderHook(() => useToolPresentation(tc));
134
+
135
+ expect(result.current.intent).toBeNull();
136
+ expect(result.current.title).toBe("Shell");
137
+ });
138
+
139
+ it("a registered presenter label override outranks the intent", () => {
140
+ const dispose = registerToolPresenter(ToolKind.SHELL, {
141
+ label: () => "Run command",
142
+ });
143
+ try {
144
+ const tc = makeToolCall({
145
+ name: "Shell",
146
+ args: { command: "ls", [SHELL_INTENT_ARG_FIELD]: "List files" },
147
+ });
148
+ const { result } = renderHook(() => useToolPresentation(tc));
149
+
150
+ expect(result.current.title).toBe("Run command");
151
+ expect(result.current.intent).toBe("List files");
152
+ } finally {
153
+ dispose();
154
+ }
155
+ });
156
+ });
157
+
158
+ describe("ToolCallItem shell header", () => {
159
+ function headerOf(container: HTMLElement): Element {
160
+ const row = container.querySelector('[data-cursor-target="tool-call-row"]')!;
161
+ return row.firstElementChild!;
162
+ }
163
+
164
+ it("renders the intent as the title and the command as the subtitle", () => {
165
+ const tc = makeToolCall({
166
+ name: "Shell",
167
+ args: {
168
+ command: "npx vitest run src/parser",
169
+ [SHELL_INTENT_ARG_FIELD]: "Run unit tests for the parser",
170
+ },
171
+ });
172
+ const { container } = render(<ToolCallItem toolCall={tc} />);
173
+
174
+ const header = headerOf(container);
175
+ expect(header.textContent).toContain("Run unit tests for the parser");
176
+ expect(header.textContent).toContain("npx vitest run src/parser");
177
+ expect(header.textContent).not.toContain("Shell");
178
+ });
179
+
180
+ it("renders an intent-less shell row exactly as before: bare label, no subtitle", () => {
181
+ const tc = makeToolCall({
182
+ name: "Shell",
183
+ args: { command: "ls -la" },
184
+ });
185
+ const { container } = render(<ToolCallItem toolCall={tc} />);
186
+
187
+ const header = headerOf(container);
188
+ expect(header.textContent).toContain("Shell");
189
+ // The command lives in the terminal body only — never in the header.
190
+ expect(header.textContent).not.toContain("ls -la");
191
+ });
192
+ });
193
+
194
+ describe("ApprovalCardHeader shell title", () => {
195
+ it("titles a gated shell call with the intent phrase", () => {
196
+ const pending = create(PendingApprovalSchema, {
197
+ toolCallId: "tc-1",
198
+ toolName: "execute",
199
+ toolKind: ToolKind.SHELL,
200
+ argsPreview: JSON.stringify({
201
+ command: "rm -rf build",
202
+ [SHELL_INTENT_ARG_FIELD]: "Clean the build directory",
203
+ }),
204
+ });
205
+ render(<ApprovalCardHeader pendingApproval={pending} />);
206
+
207
+ expect(screen.getByText("Clean the build directory")).toBeDefined();
208
+ });
209
+
210
+ it("keeps the bare category label when no intent is present", () => {
211
+ const pending = create(PendingApprovalSchema, {
212
+ toolCallId: "tc-2",
213
+ toolName: "execute",
214
+ toolKind: ToolKind.SHELL,
215
+ argsPreview: JSON.stringify({ command: "rm -rf build" }),
216
+ });
217
+ render(<ApprovalCardHeader pendingApproval={pending} />);
218
+
219
+ expect(screen.getByText("Shell")).toBeDefined();
220
+ });
221
+ });