@stigmer/react 3.12.1 → 3.12.2

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 (658) hide show
  1. package/access/ManageAccessDialog.d.ts.map +1 -1
  2. package/access/ManageAccessDialog.js +7 -2
  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 +10 -2
  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/index.d.ts +2 -0
  30. package/attachment/index.d.ts.map +1 -1
  31. package/attachment/index.js +1 -0
  32. package/attachment/index.js.map +1 -1
  33. package/attachment/vision-preflight.d.ts +113 -0
  34. package/attachment/vision-preflight.d.ts.map +1 -0
  35. package/attachment/vision-preflight.js +143 -0
  36. package/attachment/vision-preflight.js.map +1 -0
  37. package/billing/AutoRechargeCard.d.ts.map +1 -1
  38. package/billing/AutoRechargeCard.js +3 -2
  39. package/billing/AutoRechargeCard.js.map +1 -1
  40. package/billing/BillingSection.d.ts.map +1 -1
  41. package/billing/BillingSection.js +3 -2
  42. package/billing/BillingSection.js.map +1 -1
  43. package/channel/ChannelConversationsDialog.d.ts.map +1 -1
  44. package/channel/ChannelConversationsDialog.js +5 -4
  45. package/channel/ChannelConversationsDialog.js.map +1 -1
  46. package/channel/ChannelCredentialsDialog.d.ts.map +1 -1
  47. package/channel/ChannelCredentialsDialog.js +9 -4
  48. package/channel/ChannelCredentialsDialog.js.map +1 -1
  49. package/channel/ChannelTemplatesDialog.d.ts.map +1 -1
  50. package/channel/ChannelTemplatesDialog.js +5 -4
  51. package/channel/ChannelTemplatesDialog.js.map +1 -1
  52. package/channel/ConnectSlackDialog.d.ts.map +1 -1
  53. package/channel/ConnectSlackDialog.js +9 -4
  54. package/channel/ConnectSlackDialog.js.map +1 -1
  55. package/channel/ConnectWhatsAppDialog.d.ts.map +1 -1
  56. package/channel/ConnectWhatsAppDialog.js +9 -4
  57. package/channel/ConnectWhatsAppDialog.js.map +1 -1
  58. package/channel/useChannelSessions.d.ts.map +1 -1
  59. package/channel/useChannelSessions.js.map +1 -1
  60. package/channel-app/ChannelAppDetailPanel.d.ts.map +1 -1
  61. package/channel-app/ChannelAppDetailPanel.js +8 -5
  62. package/channel-app/ChannelAppDetailPanel.js.map +1 -1
  63. package/channel-app/CreateChannelAppForm.d.ts.map +1 -1
  64. package/channel-app/CreateChannelAppForm.js +12 -7
  65. package/channel-app/CreateChannelAppForm.js.map +1 -1
  66. package/channel-app/internal.d.ts +0 -1
  67. package/channel-app/internal.d.ts.map +1 -1
  68. package/channel-app/internal.js +5 -10
  69. package/channel-app/internal.js.map +1 -1
  70. package/composer/ComposerToolbar.js +2 -1
  71. package/composer/ComposerToolbar.js.map +1 -1
  72. package/composer/SessionComposer.d.ts +1 -1
  73. package/composer/SessionComposer.d.ts.map +1 -1
  74. package/composer/SessionComposer.js +120 -13
  75. package/composer/SessionComposer.js.map +1 -1
  76. package/composer/icons.d.ts +0 -1
  77. package/composer/icons.d.ts.map +1 -1
  78. package/composer/icons.js +0 -3
  79. package/composer/icons.js.map +1 -1
  80. package/conversation/ConversationComposer.js +1 -1
  81. package/conversation/ConversationComposer.js.map +1 -1
  82. package/conversation/ConversationListPane.d.ts.map +1 -1
  83. package/conversation/ConversationListPane.js +3 -2
  84. package/conversation/ConversationListPane.js.map +1 -1
  85. package/cursor-accounts/MemberCoverageTable.js +3 -14
  86. package/cursor-accounts/MemberCoverageTable.js.map +1 -1
  87. package/dashboard/DashboardFailedRuns.d.ts.map +1 -1
  88. package/dashboard/DashboardFailedRuns.js +2 -14
  89. package/dashboard/DashboardFailedRuns.js.map +1 -1
  90. package/environment/CreateEnvironmentForm.d.ts.map +1 -1
  91. package/environment/CreateEnvironmentForm.js +4 -8
  92. package/environment/CreateEnvironmentForm.js.map +1 -1
  93. package/environment/EnvVarForm.d.ts.map +1 -1
  94. package/environment/EnvVarForm.js +2 -4
  95. package/environment/EnvVarForm.js.map +1 -1
  96. package/environment/EnvironmentVariableEditor.d.ts.map +1 -1
  97. package/environment/EnvironmentVariableEditor.js +5 -7
  98. package/environment/EnvironmentVariableEditor.js.map +1 -1
  99. package/execution/ArtifactApplyButton.d.ts.map +1 -1
  100. package/execution/ArtifactApplyButton.js +2 -4
  101. package/execution/ArtifactApplyButton.js.map +1 -1
  102. package/execution/ExecutionErrorNotice.d.ts +36 -0
  103. package/execution/ExecutionErrorNotice.d.ts.map +1 -0
  104. package/execution/ExecutionErrorNotice.js +39 -0
  105. package/execution/ExecutionErrorNotice.js.map +1 -0
  106. package/execution/FilePathLink.d.ts.map +1 -1
  107. package/execution/FilePathLink.js +5 -8
  108. package/execution/FilePathLink.js.map +1 -1
  109. package/execution/FileReviewCard.d.ts.map +1 -1
  110. package/execution/FileReviewCard.js +1 -6
  111. package/execution/FileReviewCard.js.map +1 -1
  112. package/execution/FollowUpInput.d.ts.map +1 -1
  113. package/execution/FollowUpInput.js +1 -3
  114. package/execution/FollowUpInput.js.map +1 -1
  115. package/execution/LivenessStatusLine.d.ts +40 -0
  116. package/execution/LivenessStatusLine.d.ts.map +1 -0
  117. package/execution/LivenessStatusLine.js +34 -0
  118. package/execution/LivenessStatusLine.js.map +1 -0
  119. package/execution/MessageEntry.d.ts.map +1 -1
  120. package/execution/MessageEntry.js +31 -3
  121. package/execution/MessageEntry.js.map +1 -1
  122. package/execution/MessageThread.d.ts +25 -0
  123. package/execution/MessageThread.d.ts.map +1 -1
  124. package/execution/MessageThread.js +51 -36
  125. package/execution/MessageThread.js.map +1 -1
  126. package/execution/SetupProgress.d.ts.map +1 -1
  127. package/execution/SetupProgress.js +1 -1
  128. package/execution/SetupProgress.js.map +1 -1
  129. package/execution/SubAgentSection.d.ts.map +1 -1
  130. package/execution/SubAgentSection.js +9 -7
  131. package/execution/SubAgentSection.js.map +1 -1
  132. package/execution/TerminalSession.d.ts +30 -0
  133. package/execution/TerminalSession.d.ts.map +1 -1
  134. package/execution/TerminalSession.js +37 -1
  135. package/execution/TerminalSession.js.map +1 -1
  136. package/execution/ToolCallDetail.d.ts +9 -0
  137. package/execution/ToolCallDetail.d.ts.map +1 -1
  138. package/execution/ToolCallDetail.js +16 -0
  139. package/execution/ToolCallDetail.js.map +1 -1
  140. package/execution/ToolCallItem.d.ts +20 -6
  141. package/execution/ToolCallItem.d.ts.map +1 -1
  142. package/execution/ToolCallItem.js +102 -29
  143. package/execution/ToolCallItem.js.map +1 -1
  144. package/execution/ToolRunGroup.d.ts.map +1 -1
  145. package/execution/ToolRunGroup.js +11 -11
  146. package/execution/ToolRunGroup.js.map +1 -1
  147. package/execution/WriteBackCard.d.ts.map +1 -1
  148. package/execution/WriteBackCard.js +5 -20
  149. package/execution/WriteBackCard.js.map +1 -1
  150. package/execution/index.d.ts +6 -2
  151. package/execution/index.d.ts.map +1 -1
  152. package/execution/index.js +3 -1
  153. package/execution/index.js.map +1 -1
  154. package/execution/tool-categories.d.ts +42 -7
  155. package/execution/tool-categories.d.ts.map +1 -1
  156. package/execution/tool-categories.js +38 -4
  157. package/execution/tool-categories.js.map +1 -1
  158. package/execution/tool-presenter.d.ts +17 -1
  159. package/execution/tool-presenter.d.ts.map +1 -1
  160. package/execution/tool-presenter.js +4 -1
  161. package/execution/tool-presenter.js.map +1 -1
  162. package/execution/useArtifactInspection.d.ts.map +1 -1
  163. package/execution/useArtifactInspection.js +4 -7
  164. package/execution/useArtifactInspection.js.map +1 -1
  165. package/iam-policy/GrantAccessForm.d.ts.map +1 -1
  166. package/iam-policy/GrantAccessForm.js +2 -4
  167. package/iam-policy/GrantAccessForm.js.map +1 -1
  168. package/iam-policy/OrgMembersPanel.d.ts.map +1 -1
  169. package/iam-policy/OrgMembersPanel.js +3 -5
  170. package/iam-policy/OrgMembersPanel.js.map +1 -1
  171. package/iam-policy/RoleSelector.d.ts.map +1 -1
  172. package/iam-policy/RoleSelector.js +7 -1
  173. package/iam-policy/RoleSelector.js.map +1 -1
  174. package/identity-provider/CreateIdentityProviderForm.d.ts.map +1 -1
  175. package/identity-provider/CreateIdentityProviderForm.js +6 -9
  176. package/identity-provider/CreateIdentityProviderForm.js.map +1 -1
  177. package/identity-provider/IdentityProviderDetailPanel.d.ts.map +1 -1
  178. package/identity-provider/IdentityProviderDetailPanel.js +17 -26
  179. package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
  180. package/identity-provider/IdentityProviderListPanel.d.ts.map +1 -1
  181. package/identity-provider/IdentityProviderListPanel.js +2 -4
  182. package/identity-provider/IdentityProviderListPanel.js.map +1 -1
  183. package/identity-provider/IdentityProviderWizard.d.ts.map +1 -1
  184. package/identity-provider/IdentityProviderWizard.js +8 -7
  185. package/identity-provider/IdentityProviderWizard.js.map +1 -1
  186. package/identity-provider/SsoLoginPrompt.js +5 -6
  187. package/identity-provider/SsoLoginPrompt.js.map +1 -1
  188. package/index.d.ts +9 -8
  189. package/index.d.ts.map +1 -1
  190. package/index.js +4 -4
  191. package/index.js.map +1 -1
  192. package/internal/DecisionButton.d.ts.map +1 -1
  193. package/internal/DecisionButton.js +1 -6
  194. package/internal/DecisionButton.js.map +1 -1
  195. package/internal/SpinnerIcon.d.ts +22 -0
  196. package/internal/SpinnerIcon.d.ts.map +1 -0
  197. package/internal/SpinnerIcon.js +23 -0
  198. package/internal/SpinnerIcon.js.map +1 -0
  199. package/internal/select-element-text.d.ts +11 -0
  200. package/internal/select-element-text.d.ts.map +1 -0
  201. package/internal/select-element-text.js +19 -0
  202. package/internal/select-element-text.js.map +1 -0
  203. package/internal/thread-card/ThreadCardShell.d.ts +27 -10
  204. package/internal/thread-card/ThreadCardShell.d.ts.map +1 -1
  205. package/internal/thread-card/ThreadCardShell.js +11 -5
  206. package/internal/thread-card/ThreadCardShell.js.map +1 -1
  207. package/internal/thread-card/glyphs.d.ts +11 -2
  208. package/internal/thread-card/glyphs.d.ts.map +1 -1
  209. package/internal/thread-card/glyphs.js +9 -3
  210. package/internal/thread-card/glyphs.js.map +1 -1
  211. package/internal/thread-card/index.d.ts +1 -1
  212. package/internal/thread-card/index.d.ts.map +1 -1
  213. package/internal/thread-card/index.js.map +1 -1
  214. package/internal/useCopyFeedback.d.ts +28 -0
  215. package/internal/useCopyFeedback.d.ts.map +1 -0
  216. package/internal/useCopyFeedback.js +40 -0
  217. package/internal/useCopyFeedback.js.map +1 -0
  218. package/invitation/InvitationCreatedAlert.d.ts.map +1 -1
  219. package/invitation/InvitationCreatedAlert.js +12 -19
  220. package/invitation/InvitationCreatedAlert.js.map +1 -1
  221. package/invitation/InvitationManager.d.ts.map +1 -1
  222. package/invitation/InvitationManager.js +14 -21
  223. package/invitation/InvitationManager.js.map +1 -1
  224. package/invitation/InvitationRedemption.d.ts.map +1 -1
  225. package/invitation/InvitationRedemption.js +2 -4
  226. package/invitation/InvitationRedemption.js.map +1 -1
  227. package/library/useExportResource.d.ts.map +1 -1
  228. package/library/useExportResource.js +16 -27
  229. package/library/useExportResource.js.map +1 -1
  230. package/manifest/ApplyManifestDialog.js +1 -1
  231. package/manifest/EditResourceYamlDialog.js +1 -1
  232. package/mcp-server/DefinitionDriftNotice.d.ts +42 -0
  233. package/mcp-server/DefinitionDriftNotice.d.ts.map +1 -0
  234. package/mcp-server/DefinitionDriftNotice.js +52 -0
  235. package/mcp-server/DefinitionDriftNotice.js.map +1 -0
  236. package/mcp-server/McpServerConnectDialog.js +1 -1
  237. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  238. package/mcp-server/McpServerDetailView.js +47 -14
  239. package/mcp-server/McpServerDetailView.js.map +1 -1
  240. package/mcp-server/OAuthAppForm.d.ts.map +1 -1
  241. package/mcp-server/OAuthAppForm.js +2 -4
  242. package/mcp-server/OAuthAppForm.js.map +1 -1
  243. package/mcp-server/internal/definitionDrift.d.ts +39 -0
  244. package/mcp-server/internal/definitionDrift.d.ts.map +1 -0
  245. package/mcp-server/internal/definitionDrift.js +122 -0
  246. package/mcp-server/internal/definitionDrift.js.map +1 -0
  247. package/mcp-server/internal/mcpServerToInput.d.ts.map +1 -1
  248. package/mcp-server/internal/mcpServerToInput.js +3 -0
  249. package/mcp-server/internal/mcpServerToInput.js.map +1 -1
  250. package/mcp-server/steps/EnvironmentAuthStep.d.ts.map +1 -1
  251. package/mcp-server/steps/EnvironmentAuthStep.js +8 -4
  252. package/mcp-server/steps/EnvironmentAuthStep.js.map +1 -1
  253. package/mcp-server/steps/IdentityTransportStep.d.ts.map +1 -1
  254. package/mcp-server/steps/IdentityTransportStep.js +5 -4
  255. package/mcp-server/steps/IdentityTransportStep.js.map +1 -1
  256. package/mcp-server/useMcpServerConnect.d.ts +1 -1
  257. package/mcp-server/useMcpServerDefinitionDrift.d.ts +44 -0
  258. package/mcp-server/useMcpServerDefinitionDrift.d.ts.map +1 -0
  259. package/mcp-server/useMcpServerDefinitionDrift.js +61 -0
  260. package/mcp-server/useMcpServerDefinitionDrift.js.map +1 -0
  261. package/models/ModelRegistryContext.d.ts +7 -1
  262. package/models/ModelRegistryContext.d.ts.map +1 -1
  263. package/models/ModelRegistryContext.js.map +1 -1
  264. package/models/ModelSelector.js +9 -1
  265. package/models/ModelSelector.js.map +1 -1
  266. package/models/index.d.ts +2 -2
  267. package/models/index.d.ts.map +1 -1
  268. package/models/index.js +1 -1
  269. package/models/index.js.map +1 -1
  270. package/models/registry.d.ts +88 -6
  271. package/models/registry.d.ts.map +1 -1
  272. package/models/registry.js +133 -27
  273. package/models/registry.js.map +1 -1
  274. package/models/useModelRegistry.d.ts +7 -1
  275. package/models/useModelRegistry.d.ts.map +1 -1
  276. package/models/useModelRegistry.js +3 -2
  277. package/models/useModelRegistry.js.map +1 -1
  278. package/oauth-app/CreateOAuthAppForm.d.ts.map +1 -1
  279. package/oauth-app/CreateOAuthAppForm.js +4 -5
  280. package/oauth-app/CreateOAuthAppForm.js.map +1 -1
  281. package/oauth-app/OAuthAppDetailPanel.d.ts.map +1 -1
  282. package/oauth-app/OAuthAppDetailPanel.js +5 -6
  283. package/oauth-app/OAuthAppDetailPanel.js.map +1 -1
  284. package/organization/CreateOrganizationForm.d.ts.map +1 -1
  285. package/organization/CreateOrganizationForm.js +5 -9
  286. package/organization/CreateOrganizationForm.js.map +1 -1
  287. package/organization/OrgProfilePanel.d.ts.map +1 -1
  288. package/organization/OrgProfilePanel.js +7 -16
  289. package/organization/OrgProfilePanel.js.map +1 -1
  290. package/package.json +4 -4
  291. package/platform-client/CreatePlatformClientForm.d.ts.map +1 -1
  292. package/platform-client/CreatePlatformClientForm.js +5 -6
  293. package/platform-client/CreatePlatformClientForm.js.map +1 -1
  294. package/platform-client/PlatformClientDetailPanel.d.ts.map +1 -1
  295. package/platform-client/PlatformClientDetailPanel.js +6 -7
  296. package/platform-client/PlatformClientDetailPanel.js.map +1 -1
  297. package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
  298. package/platform-client/PlatformClientListPanel.js +2 -4
  299. package/platform-client/PlatformClientListPanel.js.map +1 -1
  300. package/platform-client/PlatformClientSecretAlert.d.ts.map +1 -1
  301. package/platform-client/PlatformClientSecretAlert.js +18 -25
  302. package/platform-client/PlatformClientSecretAlert.js.map +1 -1
  303. package/provider.d.ts +34 -1
  304. package/provider.d.ts.map +1 -1
  305. package/provider.js +14 -7
  306. package/provider.js.map +1 -1
  307. package/resource-creation/WizardNav.d.ts.map +1 -1
  308. package/resource-creation/WizardNav.js +2 -4
  309. package/resource-creation/WizardNav.js.map +1 -1
  310. package/resource-detail/ConfirmDialog.js +1 -1
  311. package/resource-detail/useCopyResource.d.ts +4 -3
  312. package/resource-detail/useCopyResource.d.ts.map +1 -1
  313. package/resource-detail/useCopyResource.js +10 -19
  314. package/resource-detail/useCopyResource.js.map +1 -1
  315. package/schedule/ScheduleDetailView.d.ts.map +1 -1
  316. package/schedule/ScheduleDetailView.js +2 -4
  317. package/schedule/ScheduleDetailView.js.map +1 -1
  318. package/schedule/ScheduleForm.d.ts.map +1 -1
  319. package/schedule/ScheduleForm.js +6 -7
  320. package/schedule/ScheduleForm.js.map +1 -1
  321. package/session/NewSessionViewer.d.ts +52 -2
  322. package/session/NewSessionViewer.d.ts.map +1 -1
  323. package/session/NewSessionViewer.js +21 -6
  324. package/session/NewSessionViewer.js.map +1 -1
  325. package/session/SessionViewer.d.ts +63 -2
  326. package/session/SessionViewer.d.ts.map +1 -1
  327. package/session/SessionViewer.js +43 -17
  328. package/session/SessionViewer.js.map +1 -1
  329. package/session/audience.d.ts +17 -0
  330. package/session/audience.d.ts.map +1 -1
  331. package/session/index.d.ts +2 -1
  332. package/session/index.d.ts.map +1 -1
  333. package/session/index.js.map +1 -1
  334. package/session/run-config.d.ts +50 -0
  335. package/session/run-config.d.ts.map +1 -0
  336. package/session/run-config.js +15 -0
  337. package/session/run-config.js.map +1 -0
  338. package/session/useNewSessionFlow.d.ts +11 -0
  339. package/session/useNewSessionFlow.d.ts.map +1 -1
  340. package/session/useNewSessionFlow.js +29 -2
  341. package/session/useNewSessionFlow.js.map +1 -1
  342. package/session/useSessionConversation.d.ts +7 -7
  343. package/session/useSessionConversation.d.ts.map +1 -1
  344. package/session/useSessionConversation.js +2 -0
  345. package/session/useSessionConversation.js.map +1 -1
  346. package/session/useSessionPageFlow.d.ts +18 -4
  347. package/session/useSessionPageFlow.d.ts.map +1 -1
  348. package/session/useSessionPageFlow.js +33 -6
  349. package/session/useSessionPageFlow.js.map +1 -1
  350. package/session/useSessionPanel.d.ts +37 -2
  351. package/session/useSessionPanel.d.ts.map +1 -1
  352. package/session/useSessionPanel.js +44 -10
  353. package/session/useSessionPanel.js.map +1 -1
  354. package/settings/ApiKeysSection.d.ts.map +1 -1
  355. package/settings/ApiKeysSection.js +3 -2
  356. package/settings/ApiKeysSection.js.map +1 -1
  357. package/settings/ChannelAppsSection.d.ts.map +1 -1
  358. package/settings/ChannelAppsSection.js +3 -2
  359. package/settings/ChannelAppsSection.js.map +1 -1
  360. package/settings/EnvironmentsSection.js +5 -3
  361. package/settings/EnvironmentsSection.js.map +1 -1
  362. package/settings/IdentityProvidersSection.d.ts.map +1 -1
  363. package/settings/IdentityProvidersSection.js +3 -2
  364. package/settings/IdentityProvidersSection.js.map +1 -1
  365. package/settings/InvitationsSection.d.ts.map +1 -1
  366. package/settings/InvitationsSection.js +3 -1
  367. package/settings/InvitationsSection.js.map +1 -1
  368. package/settings/MembersSection.d.ts.map +1 -1
  369. package/settings/MembersSection.js +3 -1
  370. package/settings/MembersSection.js.map +1 -1
  371. package/settings/OAuthAppsSection.d.ts.map +1 -1
  372. package/settings/OAuthAppsSection.js +3 -2
  373. package/settings/OAuthAppsSection.js.map +1 -1
  374. package/settings/OrgProfileSection.d.ts.map +1 -1
  375. package/settings/OrgProfileSection.js +3 -2
  376. package/settings/OrgProfileSection.js.map +1 -1
  377. package/settings/PlatformClientsSection.d.ts.map +1 -1
  378. package/settings/PlatformClientsSection.js +3 -2
  379. package/settings/PlatformClientsSection.js.map +1 -1
  380. package/settings/UsageSection.d.ts.map +1 -1
  381. package/settings/UsageSection.js +3 -1
  382. package/settings/UsageSection.js.map +1 -1
  383. package/sharing/ShareAgentDialog.d.ts.map +1 -1
  384. package/sharing/ShareAgentDialog.js +18 -7
  385. package/sharing/ShareAgentDialog.js.map +1 -1
  386. package/sidebar/chrome.d.ts +3 -4
  387. package/sidebar/chrome.d.ts.map +1 -1
  388. package/sidebar/chrome.js +5 -4
  389. package/sidebar/chrome.js.map +1 -1
  390. package/skill/SkillDiffDialog.js +1 -1
  391. package/src/access/ManageAccessDialog.tsx +10 -4
  392. package/src/activity/format-relative-time.ts +11 -9
  393. package/src/agent/steps/CapabilitiesStep.tsx +6 -3
  394. package/src/agent/steps/IdentityStep.tsx +19 -12
  395. package/src/agent-instance/CreateAgentInstanceDialog.tsx +17 -8
  396. package/src/api-key/ApiKeyCreatedAlert.tsx +10 -19
  397. package/src/api-key/ApiKeyListPanel.tsx +3 -39
  398. package/src/api-key/CreateApiKeyForm.tsx +12 -26
  399. package/src/approval-defaults-context.ts +56 -0
  400. package/src/attachment/__tests__/vision-preflight.test.ts +311 -0
  401. package/src/attachment/index.ts +12 -0
  402. package/src/attachment/vision-preflight.ts +236 -0
  403. package/src/billing/AutoRechargeCard.tsx +5 -4
  404. package/src/billing/BillingSection.tsx +4 -3
  405. package/src/channel/ChannelConversationsDialog.tsx +8 -4
  406. package/src/channel/ChannelCredentialsDialog.tsx +14 -4
  407. package/src/channel/ChannelTemplatesDialog.tsx +8 -4
  408. package/src/channel/ConnectSlackDialog.tsx +14 -4
  409. package/src/channel/ConnectWhatsAppDialog.tsx +14 -4
  410. package/src/channel/useChannelSessions.ts +3 -0
  411. package/src/channel-app/ChannelAppDetailPanel.tsx +15 -12
  412. package/src/channel-app/CreateChannelAppForm.tsx +17 -12
  413. package/src/channel-app/internal.tsx +5 -25
  414. package/src/composer/ComposerToolbar.tsx +1 -1
  415. package/src/composer/SessionComposer.tsx +160 -13
  416. package/src/composer/__tests__/SessionComposer-modelCoherence.test.tsx +220 -0
  417. package/src/composer/__tests__/SessionComposer-visionPreflight.test.tsx +222 -0
  418. package/src/composer/icons.tsx +0 -18
  419. package/src/conversation/ConversationComposer.tsx +1 -1
  420. package/src/conversation/ConversationListPane.tsx +4 -3
  421. package/src/cursor-accounts/MemberCoverageTable.tsx +3 -14
  422. package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +2 -10
  423. package/src/dashboard/DashboardFailedRuns.tsx +2 -12
  424. package/src/environment/CreateEnvironmentForm.tsx +8 -27
  425. package/src/environment/EnvVarForm.tsx +2 -18
  426. package/src/environment/EnvironmentVariableEditor.tsx +5 -21
  427. package/src/execution/ArtifactApplyButton.tsx +2 -17
  428. package/src/execution/ExecutionErrorNotice.tsx +99 -0
  429. package/src/execution/FilePathLink.tsx +5 -9
  430. package/src/execution/FileReviewCard.tsx +1 -20
  431. package/src/execution/FollowUpInput.tsx +1 -16
  432. package/src/execution/LivenessStatusLine.tsx +59 -0
  433. package/src/execution/MessageEntry.tsx +136 -25
  434. package/src/execution/MessageThread.tsx +84 -83
  435. package/src/execution/SetupProgress.tsx +5 -1
  436. package/src/execution/SubAgentSection.tsx +9 -20
  437. package/src/execution/TerminalSession.tsx +97 -10
  438. package/src/execution/ToolCallDetail.tsx +19 -0
  439. package/src/execution/ToolCallItem.tsx +157 -37
  440. package/src/execution/ToolRunGroup.tsx +30 -32
  441. package/src/execution/WriteBackCard.tsx +5 -24
  442. package/src/execution/__tests__/MessageEntry-copy.test.tsx +125 -0
  443. package/src/execution/__tests__/MessageThread.test.tsx +97 -0
  444. package/src/execution/__tests__/TerminalSession.test.tsx +71 -1
  445. package/src/execution/__tests__/ToolCallDetail.test.tsx +33 -1
  446. package/src/execution/__tests__/ToolCallItem.test.tsx +299 -11
  447. package/src/execution/__tests__/ToolRunGroup.test.tsx +41 -9
  448. package/src/execution/__tests__/message-thread-slots.test.tsx +92 -0
  449. package/src/execution/__tests__/tool-presenter.test.tsx +41 -4
  450. package/src/execution/index.ts +8 -2
  451. package/src/execution/tool-categories.ts +72 -8
  452. package/src/execution/tool-presenter.ts +22 -1
  453. package/src/execution/useArtifactInspection.ts +4 -8
  454. package/src/iam-policy/GrantAccessForm.tsx +2 -18
  455. package/src/iam-policy/OrgMembersPanel.tsx +3 -19
  456. package/src/iam-policy/RoleSelector.tsx +8 -1
  457. package/src/identity-provider/CreateIdentityProviderForm.tsx +13 -31
  458. package/src/identity-provider/IdentityProviderDetailPanel.tsx +24 -49
  459. package/src/identity-provider/IdentityProviderListPanel.tsx +2 -18
  460. package/src/identity-provider/IdentityProviderWizard.tsx +15 -32
  461. package/src/identity-provider/SsoLoginPrompt.tsx +6 -21
  462. package/src/index.ts +23 -1
  463. package/src/internal/DecisionButton.tsx +1 -20
  464. package/src/internal/SpinnerIcon.tsx +42 -0
  465. package/src/internal/__tests__/ThreadCardShell.test.tsx +43 -7
  466. package/src/internal/__tests__/useCopyFeedback.test.ts +92 -0
  467. package/src/internal/select-element-text.ts +17 -0
  468. package/src/internal/thread-card/ThreadCardShell.tsx +53 -21
  469. package/src/internal/thread-card/glyphs.tsx +24 -3
  470. package/src/internal/thread-card/index.ts +1 -0
  471. package/src/internal/useCopyFeedback.ts +61 -0
  472. package/src/invitation/InvitationCreatedAlert.tsx +10 -18
  473. package/src/invitation/InvitationManager.tsx +23 -34
  474. package/src/invitation/InvitationRedemption.tsx +2 -18
  475. package/src/library/useExportResource.ts +15 -29
  476. package/src/manifest/ApplyManifestDialog.tsx +1 -1
  477. package/src/manifest/EditResourceYamlDialog.tsx +1 -1
  478. package/src/mcp-server/DefinitionDriftNotice.tsx +120 -0
  479. package/src/mcp-server/McpServerConnectDialog.tsx +1 -1
  480. package/src/mcp-server/McpServerDetailView.tsx +58 -26
  481. package/src/mcp-server/OAuthAppForm.tsx +2 -18
  482. package/src/mcp-server/__tests__/DefinitionDriftNotice.test.tsx +57 -0
  483. package/src/mcp-server/__tests__/definitionDrift.test.ts +245 -0
  484. package/src/mcp-server/__tests__/mcpServerToInput.test.ts +201 -0
  485. package/src/mcp-server/__tests__/useMcpServerDefinitionDrift.test.tsx +173 -0
  486. package/src/mcp-server/internal/definitionDrift.ts +158 -0
  487. package/src/mcp-server/internal/mcpServerToInput.ts +3 -0
  488. package/src/mcp-server/steps/EnvironmentAuthStep.tsx +19 -19
  489. package/src/mcp-server/steps/IdentityTransportStep.tsx +24 -23
  490. package/src/mcp-server/useMcpServerConnect.ts +1 -1
  491. package/src/mcp-server/useMcpServerDefinitionDrift.ts +95 -0
  492. package/src/models/ModelRegistryContext.ts +7 -1
  493. package/src/models/ModelSelector.tsx +37 -0
  494. package/src/models/__tests__/ModelSelector-visionIndicator.test.tsx +129 -0
  495. package/src/models/__tests__/resolveDefaultModel.test.ts +115 -0
  496. package/src/models/__tests__/useModelRegistry.test.tsx +99 -4
  497. package/src/models/index.ts +2 -2
  498. package/src/models/registry.ts +196 -29
  499. package/src/models/useModelRegistry.ts +10 -2
  500. package/src/oauth-app/CreateOAuthAppForm.tsx +16 -31
  501. package/src/oauth-app/OAuthAppDetailPanel.tsx +16 -31
  502. package/src/organization/CreateOrganizationForm.tsx +10 -29
  503. package/src/organization/OrgProfilePanel.tsx +13 -44
  504. package/src/platform-client/CreatePlatformClientForm.tsx +9 -29
  505. package/src/platform-client/PlatformClientDetailPanel.tsx +10 -30
  506. package/src/platform-client/PlatformClientListPanel.tsx +2 -18
  507. package/src/platform-client/PlatformClientSecretAlert.tsx +26 -55
  508. package/src/provider.tsx +76 -33
  509. package/src/resource-creation/WizardNav.tsx +2 -18
  510. package/src/resource-detail/ConfirmDialog.tsx +1 -1
  511. package/src/resource-detail/useCopyResource.ts +17 -23
  512. package/src/schedule/ScheduleDetailView.tsx +2 -18
  513. package/src/schedule/ScheduleForm.tsx +19 -34
  514. package/src/session/NewSessionViewer.tsx +85 -7
  515. package/src/session/SessionViewer.tsx +120 -17
  516. package/src/session/__tests__/audienceWiring.test.tsx +76 -0
  517. package/src/session/__tests__/panelNegotiation.test.tsx +302 -0
  518. package/src/session/__tests__/useNewSessionFlow.test.tsx +134 -5
  519. package/src/session/__tests__/useSessionPageFlow.autoApprove.test.tsx +74 -0
  520. package/src/session/__tests__/useSessionPageFlow.runConfig.test.tsx +157 -0
  521. package/src/session/__tests__/useSessionPanel.test.ts +114 -0
  522. package/src/session/audience.ts +18 -0
  523. package/src/session/index.ts +2 -1
  524. package/src/session/run-config.ts +59 -0
  525. package/src/session/useNewSessionFlow.ts +39 -2
  526. package/src/session/useSessionConversation.ts +10 -8
  527. package/src/session/useSessionPageFlow.ts +51 -10
  528. package/src/session/useSessionPanel.ts +91 -10
  529. package/src/settings/ApiKeysSection.tsx +4 -3
  530. package/src/settings/ChannelAppsSection.tsx +4 -3
  531. package/src/settings/EnvironmentsSection.tsx +8 -5
  532. package/src/settings/IdentityProvidersSection.tsx +4 -3
  533. package/src/settings/InvitationsSection.tsx +4 -2
  534. package/src/settings/MembersSection.tsx +4 -2
  535. package/src/settings/OAuthAppsSection.tsx +4 -3
  536. package/src/settings/OrgProfileSection.tsx +4 -3
  537. package/src/settings/PlatformClientsSection.tsx +4 -3
  538. package/src/settings/UsageSection.tsx +4 -2
  539. package/src/sharing/ShareAgentDialog.tsx +28 -10
  540. package/src/sidebar/__tests__/WorkspaceSidebar.test.tsx +4 -1
  541. package/src/sidebar/chrome.tsx +6 -6
  542. package/src/skill/SkillDiffDialog.tsx +1 -1
  543. package/src/styles.css +43 -0
  544. package/src/version-history/VersionTimelineEntry.tsx +1 -21
  545. package/src/workflow/FailedRunsWidget.tsx +2 -9
  546. package/src/workflow/PendingApprovalsWidget.tsx +2 -9
  547. package/src/workflow/ViewYamlDialog.tsx +7 -22
  548. package/src/workflow/WorkflowArchitectDialog.tsx +8 -27
  549. package/src/workflow/WorkflowArtifactDocument.tsx +5 -9
  550. package/src/workflow/WorkflowCanvasEditor.tsx +2 -0
  551. package/src/workflow/WorkflowCanvasInner.tsx +14 -1
  552. package/src/workflow/WorkflowDiffGraph.tsx +7 -1
  553. package/src/workflow/WorkflowExecutionViewer.tsx +88 -11
  554. package/src/workflow/WorkflowExplainDialog.tsx +8 -24
  555. package/src/workflow/WorkflowOverviewGraph.tsx +9 -1
  556. package/src/workflow/WorkflowRefinePanel.tsx +2 -18
  557. package/src/workflow/WorkflowRepairCard.tsx +2 -18
  558. package/src/workflow/WorkflowRunDialog.tsx +3 -23
  559. package/src/workflow/WorkflowTaskApprovalSummary.tsx +2 -17
  560. package/src/workflow/WorkflowVersionBadge.tsx +4 -13
  561. package/src/workflow/WorkflowVersionTimeline.tsx +1 -25
  562. package/src/workflow/__tests__/panelNegotiation.test.tsx +230 -0
  563. package/src/workflow/__tests__/useWorkflowCanvas.dirty.test.tsx +178 -0
  564. package/src/workflow/__tests__/useWorkflowCanvas.drag.test.tsx +224 -0
  565. package/src/workflow/__tests__/useWorkflowExecutionPanel.test.ts +100 -0
  566. package/src/workflow/execution-comparison/ExecutionComparisonPicker.tsx +7 -11
  567. package/src/workflow/execution-history/ExecutionHistoryTable.tsx +1 -25
  568. package/src/workflow/index.ts +1 -0
  569. package/src/workflow/instance/CreateWorkflowInstanceDialog.tsx +1 -1
  570. package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +2 -1
  571. package/src/workflow/picker/BranchAddPopover.tsx +4 -3
  572. package/src/workflow/templates/WorkflowTemplatePreview.tsx +1 -1
  573. package/src/workflow/useApprovalBoundary.ts +1 -1
  574. package/src/workflow/useWorkflowCanvas.ts +114 -11
  575. package/src/workflow/useWorkflowExecutionPanel.ts +95 -13
  576. package/styles.css +1 -1
  577. package/version-history/VersionTimelineEntry.d.ts.map +1 -1
  578. package/version-history/VersionTimelineEntry.js +1 -23
  579. package/version-history/VersionTimelineEntry.js.map +1 -1
  580. package/workflow/CanvasTransitionEdge.d.ts +1 -1
  581. package/workflow/FailedRunsWidget.d.ts.map +1 -1
  582. package/workflow/FailedRunsWidget.js +2 -11
  583. package/workflow/FailedRunsWidget.js.map +1 -1
  584. package/workflow/PendingApprovalsWidget.d.ts.map +1 -1
  585. package/workflow/PendingApprovalsWidget.js +2 -11
  586. package/workflow/PendingApprovalsWidget.js.map +1 -1
  587. package/workflow/ViewYamlDialog.d.ts.map +1 -1
  588. package/workflow/ViewYamlDialog.js +7 -23
  589. package/workflow/ViewYamlDialog.js.map +1 -1
  590. package/workflow/WorkflowArchitectDialog.d.ts.map +1 -1
  591. package/workflow/WorkflowArchitectDialog.js +7 -11
  592. package/workflow/WorkflowArchitectDialog.js.map +1 -1
  593. package/workflow/WorkflowArtifactDocument.d.ts.map +1 -1
  594. package/workflow/WorkflowArtifactDocument.js +5 -8
  595. package/workflow/WorkflowArtifactDocument.js.map +1 -1
  596. package/workflow/WorkflowCanvasEditor.d.ts.map +1 -1
  597. package/workflow/WorkflowCanvasEditor.js +1 -1
  598. package/workflow/WorkflowCanvasEditor.js.map +1 -1
  599. package/workflow/WorkflowCanvasInner.d.ts +4 -2
  600. package/workflow/WorkflowCanvasInner.d.ts.map +1 -1
  601. package/workflow/WorkflowCanvasInner.js +7 -3
  602. package/workflow/WorkflowCanvasInner.js.map +1 -1
  603. package/workflow/WorkflowDiffGraph.js +6 -2
  604. package/workflow/WorkflowDiffGraph.js.map +1 -1
  605. package/workflow/WorkflowExecutionViewer.d.ts +51 -0
  606. package/workflow/WorkflowExecutionViewer.d.ts.map +1 -1
  607. package/workflow/WorkflowExecutionViewer.js +23 -6
  608. package/workflow/WorkflowExecutionViewer.js.map +1 -1
  609. package/workflow/WorkflowExplainDialog.d.ts.map +1 -1
  610. package/workflow/WorkflowExplainDialog.js +6 -8
  611. package/workflow/WorkflowExplainDialog.js.map +1 -1
  612. package/workflow/WorkflowOverviewGraph.js +8 -2
  613. package/workflow/WorkflowOverviewGraph.js.map +1 -1
  614. package/workflow/WorkflowRefinePanel.d.ts.map +1 -1
  615. package/workflow/WorkflowRefinePanel.js +2 -4
  616. package/workflow/WorkflowRefinePanel.js.map +1 -1
  617. package/workflow/WorkflowRepairCard.d.ts.map +1 -1
  618. package/workflow/WorkflowRepairCard.js +2 -4
  619. package/workflow/WorkflowRepairCard.js.map +1 -1
  620. package/workflow/WorkflowRunDialog.d.ts.map +1 -1
  621. package/workflow/WorkflowRunDialog.js +2 -7
  622. package/workflow/WorkflowRunDialog.js.map +1 -1
  623. package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
  624. package/workflow/WorkflowTaskApprovalSummary.js +2 -4
  625. package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
  626. package/workflow/WorkflowVersionBadge.d.ts.map +1 -1
  627. package/workflow/WorkflowVersionBadge.js +4 -13
  628. package/workflow/WorkflowVersionBadge.js.map +1 -1
  629. package/workflow/WorkflowVersionTimeline.d.ts.map +1 -1
  630. package/workflow/WorkflowVersionTimeline.js +1 -26
  631. package/workflow/WorkflowVersionTimeline.js.map +1 -1
  632. package/workflow/execution-comparison/ExecutionComparisonPicker.d.ts.map +1 -1
  633. package/workflow/execution-comparison/ExecutionComparisonPicker.js +7 -15
  634. package/workflow/execution-comparison/ExecutionComparisonPicker.js.map +1 -1
  635. package/workflow/execution-history/ExecutionHistoryTable.d.ts.map +1 -1
  636. package/workflow/execution-history/ExecutionHistoryTable.js +1 -24
  637. package/workflow/execution-history/ExecutionHistoryTable.js.map +1 -1
  638. package/workflow/index.d.ts +1 -1
  639. package/workflow/index.d.ts.map +1 -1
  640. package/workflow/index.js.map +1 -1
  641. package/workflow/instance/CreateWorkflowInstanceDialog.js +1 -1
  642. package/workflow/instance/WorkflowInstanceDetailPanel.d.ts.map +1 -1
  643. package/workflow/instance/WorkflowInstanceDetailPanel.js +1 -1
  644. package/workflow/instance/WorkflowInstanceDetailPanel.js.map +1 -1
  645. package/workflow/picker/BranchAddPopover.d.ts.map +1 -1
  646. package/workflow/picker/BranchAddPopover.js +3 -2
  647. package/workflow/picker/BranchAddPopover.js.map +1 -1
  648. package/workflow/templates/WorkflowTemplatePreview.js +1 -1
  649. package/workflow/useApprovalBoundary.d.ts +1 -1
  650. package/workflow/useApprovalBoundary.js +1 -1
  651. package/workflow/useWorkflowCanvas.d.ts +5 -1
  652. package/workflow/useWorkflowCanvas.d.ts.map +1 -1
  653. package/workflow/useWorkflowCanvas.js +99 -13
  654. package/workflow/useWorkflowCanvas.js.map +1 -1
  655. package/workflow/useWorkflowExecutionPanel.d.ts +38 -2
  656. package/workflow/useWorkflowExecutionPanel.d.ts.map +1 -1
  657. package/workflow/useWorkflowExecutionPanel.js +46 -13
  658. package/workflow/useWorkflowExecutionPanel.js.map +1 -1
@@ -1,9 +1,9 @@
1
1
  // Contract tests for the shared thread-card shell (T05/T06): the chrome
2
- // axes (bordered vs divider row, gate accent), the header gestures
3
- // (`expand` / `none` — `select` died with the Inspect drill-down, T06)
4
- // with their ARIA semantics, and the nested-button keydown guard. The two
5
- // consuming threads pin their own compositions; this file pins what they
6
- // share.
2
+ // tiers (card / nested divider row / quiet unboxed line, gate accent), the
3
+ // header gestures (`expand` / `none` — `select` died with the Inspect
4
+ // drill-down, T06) with their ARIA semantics, and the nested-button keydown
5
+ // guard. The two consuming threads pin their own compositions; this file
6
+ // pins what they share.
7
7
 
8
8
  import { describe, it, expect, vi, afterEach } from "vitest";
9
9
  import { render, screen, fireEvent, cleanup } from "@testing-library/react";
@@ -16,7 +16,7 @@ import {
16
16
  afterEach(cleanup);
17
17
 
18
18
  describe("ThreadCardShell chrome", () => {
19
- it("renders a bordered card by default and a divider row when nested", () => {
19
+ it("renders a bordered card by default, a divider row when nested, and no chrome when quiet", () => {
20
20
  const { rerender, container } = render(
21
21
  <ThreadCardShell cursorTarget="row">
22
22
  <ThreadCardHeader>content</ThreadCardHeader>
@@ -27,12 +27,22 @@ describe("ThreadCardShell chrome", () => {
27
27
  expect(root().className).toContain("stg:border-border-prominent");
28
28
 
29
29
  rerender(
30
- <ThreadCardShell cursorTarget="row" bordered={false}>
30
+ <ThreadCardShell cursorTarget="row" variant="row">
31
31
  <ThreadCardHeader>content</ThreadCardHeader>
32
32
  </ThreadCardShell>,
33
33
  );
34
34
  expect(root().className).toContain("stg:border-b");
35
35
  expect(root().className).not.toContain("stg:border-border-prominent");
36
+
37
+ rerender(
38
+ <ThreadCardShell cursorTarget="row" variant="quiet">
39
+ <ThreadCardHeader>content</ThreadCardHeader>
40
+ </ThreadCardShell>,
41
+ );
42
+ // The quiet tier is an unboxed line: no card border, no divider.
43
+ expect(root().className).not.toContain("stg:border-border-prominent");
44
+ expect(root().className).not.toContain("stg:border-b");
45
+ expect(root().className).not.toContain("stg:rounded-lg");
36
46
  });
37
47
 
38
48
  it("carries the gate accent", () => {
@@ -44,6 +54,19 @@ describe("ThreadCardShell chrome", () => {
44
54
  const root = container.querySelector('[data-cursor-target="row"]') as HTMLElement;
45
55
  expect(root.className).toContain("stg:border-l-warning");
46
56
  });
57
+
58
+ it("never draws the gate accent on a quiet shell — escalation is the caller's job", () => {
59
+ // The quiet tier deliberately ignores `accent`: a gated row must be
60
+ // escalated to variant="card" by its component, never rendered as an
61
+ // accented bare line (see ThreadCardVariant).
62
+ const { container } = render(
63
+ <ThreadCardShell cursorTarget="row" variant="quiet" accent="warning">
64
+ <ThreadCardHeader>content</ThreadCardHeader>
65
+ </ThreadCardShell>,
66
+ );
67
+ const root = container.querySelector('[data-cursor-target="row"]') as HTMLElement;
68
+ expect(root.className).not.toContain("stg:border-l-warning");
69
+ });
47
70
  });
48
71
 
49
72
  describe("ThreadCardHeader gestures", () => {
@@ -102,4 +125,17 @@ describe("ThreadCardBody", () => {
102
125
  render(<ThreadCardBody id="detail-1">body</ThreadCardBody>);
103
126
  expect(document.getElementById("detail-1")?.textContent).toBe("body");
104
127
  });
128
+
129
+ it("swaps the card padding for a left rail when the body is quiet-contained", () => {
130
+ const { rerender } = render(<ThreadCardBody id="detail-1">body</ThreadCardBody>);
131
+ const el = () => document.getElementById("detail-1")!;
132
+ expect(el().className).not.toContain("stg:border-l-2");
133
+
134
+ rerender(
135
+ <ThreadCardBody id="detail-1" rail>
136
+ body
137
+ </ThreadCardBody>,
138
+ );
139
+ expect(el().className).toContain("stg:border-l-2");
140
+ });
105
141
  });
@@ -0,0 +1,92 @@
1
+ import { describe, expect, it, vi, beforeEach, afterEach } from "vitest";
2
+ import { act, renderHook } from "@testing-library/react";
3
+ import { useCopyFeedback } from "../useCopyFeedback";
4
+
5
+ describe("useCopyFeedback", () => {
6
+ let writeText: ReturnType<typeof vi.fn>;
7
+
8
+ beforeEach(() => {
9
+ vi.useFakeTimers();
10
+ writeText = vi.fn().mockResolvedValue(undefined);
11
+ vi.stubGlobal("navigator", { clipboard: { writeText } });
12
+ });
13
+
14
+ afterEach(() => {
15
+ vi.unstubAllGlobals();
16
+ vi.useRealTimers();
17
+ });
18
+
19
+ it("resolves true and flashes `copied` for a successful write", async () => {
20
+ const { result } = renderHook(() => useCopyFeedback());
21
+
22
+ let outcome: boolean | undefined;
23
+ await act(async () => {
24
+ outcome = await result.current.copy("hello");
25
+ });
26
+
27
+ expect(outcome).toBe(true);
28
+ expect(writeText).toHaveBeenCalledWith("hello");
29
+ expect(result.current.copied).toBe(true);
30
+
31
+ act(() => {
32
+ vi.advanceTimersByTime(2000);
33
+ });
34
+ expect(result.current.copied).toBe(false);
35
+ });
36
+
37
+ it("resolves false and never claims `copied` for a rejected write", async () => {
38
+ writeText.mockRejectedValue(new Error("denied"));
39
+ const { result } = renderHook(() => useCopyFeedback());
40
+
41
+ let outcome: boolean | undefined;
42
+ await act(async () => {
43
+ outcome = await result.current.copy("secret");
44
+ });
45
+
46
+ expect(outcome).toBe(false);
47
+ expect(result.current.copied).toBe(false);
48
+ });
49
+
50
+ it("restarts the feedback window on a rapid second copy", async () => {
51
+ const { result } = renderHook(() => useCopyFeedback());
52
+
53
+ await act(async () => {
54
+ await result.current.copy("one");
55
+ });
56
+ act(() => {
57
+ vi.advanceTimersByTime(1500);
58
+ });
59
+ await act(async () => {
60
+ await result.current.copy("two");
61
+ });
62
+
63
+ // 1.5s into the second window: still showing feedback.
64
+ act(() => {
65
+ vi.advanceTimersByTime(1500);
66
+ });
67
+ expect(result.current.copied).toBe(true);
68
+
69
+ act(() => {
70
+ vi.advanceTimersByTime(500);
71
+ });
72
+ expect(result.current.copied).toBe(false);
73
+ });
74
+
75
+ it("does not set state after unmount when the timer would fire", async () => {
76
+ const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
77
+ const { result, unmount } = renderHook(() => useCopyFeedback());
78
+
79
+ await act(async () => {
80
+ await result.current.copy("bye");
81
+ });
82
+ unmount();
83
+ act(() => {
84
+ vi.advanceTimersByTime(2000);
85
+ });
86
+
87
+ // React warns on setState-after-unmount via console.error; silence means
88
+ // the unmount cleanup cleared the pending timer.
89
+ expect(errorSpy).not.toHaveBeenCalled();
90
+ errorSpy.mockRestore();
91
+ });
92
+ });
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Select an element's text content, replacing any existing selection.
3
+ *
4
+ * The honest fallback for one-time secret reveals (API keys, invite URLs,
5
+ * client secrets) when the clipboard write is rejected (insecure context,
6
+ * denied permission): instead of claiming "Copied" for a copy that didn't
7
+ * happen, the revealed value is selected so the user can copy it manually.
8
+ * Pair with `useCopyFeedback` — branch on its `copy()` result.
9
+ */
10
+ export function selectElementText(el: HTMLElement): void {
11
+ const selection = window.getSelection();
12
+ if (!selection) return;
13
+ const range = document.createRange();
14
+ range.selectNodeContents(el);
15
+ selection.removeAllRanges();
16
+ selection.addRange(range);
17
+ }
@@ -14,7 +14,8 @@ import { ChevronIcon } from "./glyphs.js";
14
14
  * Three pieces, composed via children (slots-as-children, never a
15
15
  * mega-prop card — each thread's composition stays explicit):
16
16
  *
17
- * - {@link ThreadCardShell} — the chrome: bordered card vs divider row,
17
+ * - {@link ThreadCardShell} — the chrome tier: bordered card, nested divider
18
+ * row, or quiet unboxed line ({@link ThreadCardVariant}), plus the
18
19
  * pending-gate accent.
19
20
  * - {@link ThreadCardHeader} — the one-line header region with a
20
21
  * primary gesture: `expand` (summary rows, `aria-expanded`, appends
@@ -41,15 +42,25 @@ import { ChevronIcon } from "./glyphs.js";
41
42
  // Shell — the card chrome
42
43
  // ---------------------------------------------------------------------------
43
44
 
45
+ /**
46
+ * The chrome tier of a thread row (the density axis at the shell level):
47
+ *
48
+ * - `"card"` — a self-contained bordered card (the default).
49
+ * - `"row"` — a divider-separated row for rows nested inside a container
50
+ * that already provides the frame (e.g. an expanded `ToolRunGroup` fold),
51
+ * avoiding a card-in-a-card.
52
+ * - `"quiet"` — no chrome at all: an unboxed line for metadata-only rows
53
+ * whose header IS the complete information (reads, listings, thoughts).
54
+ * The gate accent is deliberately not drawn in this tier — a row carrying
55
+ * an accent must be escalated to `"card"` by the caller, never rendered
56
+ * as an accented bare line.
57
+ */
58
+ export type ThreadCardVariant = "card" | "row" | "quiet";
59
+
44
60
  /** Props for {@link ThreadCardShell}. */
45
61
  export interface ThreadCardShellProps {
46
- /**
47
- * Whether the row renders as its own self-contained card (a thin rounded
48
- * border). Set to `false` when nested inside a container that already
49
- * provides the border — e.g. the folded `ToolRunGroup` chip — where the
50
- * row degrades to a divider-separated row to avoid a card-in-a-card.
51
- */
52
- readonly bordered?: boolean;
62
+ /** The chrome tier — see {@link ThreadCardVariant}. Defaults to `"card"`. */
63
+ readonly variant?: ThreadCardVariant;
53
64
  /**
54
65
  * A restrained left accent for a row awaiting a human decision —
55
66
  * `"warning"` for ordinary gates, `"destructive"` for delete gates.
@@ -64,25 +75,31 @@ export interface ThreadCardShellProps {
64
75
  readonly children: ReactNode;
65
76
  }
66
77
 
78
+ const VARIANT_CHROME: Record<Exclude<ThreadCardVariant, "card">, string> = {
79
+ row: "stg:border-b stg:border-border-muted stg:last:border-b-0",
80
+ quiet: "",
81
+ };
82
+
67
83
  /** The thread card's outer chrome. See the module doc for the full contract. */
68
84
  export function ThreadCardShell({
69
- bordered = true,
85
+ variant = "card",
70
86
  accent = null,
71
87
  cursorTarget,
72
88
  className,
73
89
  ref,
74
90
  children,
75
91
  }: ThreadCardShellProps) {
76
- const chrome = bordered
77
- ? cn(
78
- // border-prominent (not border): a transparent card needs a line the
79
- // eye actually catches the default border token is white at 14%
80
- // opacity, which vanishes on the dark thread surface.
81
- "stg:rounded-lg stg:border stg:border-border-prominent stg:overflow-hidden",
82
- accent === "warning" && "stg:border-l-2 stg:border-l-warning",
83
- accent === "destructive" && "stg:border-l-2 stg:border-l-destructive",
84
- )
85
- : "stg:border-b stg:border-border-muted stg:last:border-b-0";
92
+ const chrome =
93
+ variant === "card"
94
+ ? cn(
95
+ // border-prominent (not border): a transparent card needs a line the
96
+ // eye actually catches the default border token is white at 14%
97
+ // opacity, which vanishes on the dark thread surface.
98
+ "stg:rounded-lg stg:border stg:border-border-prominent stg:overflow-hidden",
99
+ accent === "warning" && "stg:border-l-2 stg:border-l-warning",
100
+ accent === "destructive" && "stg:border-l-2 stg:border-l-destructive",
101
+ )
102
+ : VARIANT_CHROME[variant];
86
103
 
87
104
  return (
88
105
  <div ref={ref} data-cursor-target={cursorTarget} className={cn(chrome, className)}>
@@ -176,13 +193,28 @@ export interface ThreadCardBodyProps {
176
193
  readonly id?: string;
177
194
  /** Rendered as `data-cursor-target` for e2e targeting. */
178
195
  readonly cursorTarget?: string;
196
+ /**
197
+ * Body containment for a `"quiet"` shell: with no card border around it, a
198
+ * disclosed body needs its own boundary — a light left rail (the
199
+ * `ThinkingMessage` expanded-state precedent) instead of the card's padding
200
+ * box. Ignored for card/row shells, whose frame already bounds the body.
201
+ */
202
+ readonly rail?: boolean;
179
203
  readonly children: ReactNode;
180
204
  }
181
205
 
182
206
  /** The thread card's body padding contract. */
183
- export function ThreadCardBody({ id, cursorTarget, children }: ThreadCardBodyProps) {
207
+ export function ThreadCardBody({ id, cursorTarget, rail = false, children }: ThreadCardBodyProps) {
184
208
  return (
185
- <div id={id} data-cursor-target={cursorTarget} className="stg:px-2.5 stg:pb-2.5 stg:pt-1">
209
+ <div
210
+ id={id}
211
+ data-cursor-target={cursorTarget}
212
+ className={
213
+ rail
214
+ ? "stg:ml-1.5 stg:border-l-2 stg:border-border-muted stg:py-1 stg:pl-3 stg:pr-2.5"
215
+ : "stg:px-2.5 stg:pb-2.5 stg:pt-1"
216
+ }
217
+ >
186
218
  {children}
187
219
  </div>
188
220
  );
@@ -13,10 +13,31 @@ import { cn } from "@stigmer/theme";
13
13
  * @internal Not part of the public API.
14
14
  */
15
15
 
16
- /** Quarter-arc spinner for an in-flight item. */
17
- export function SpinnerIcon() {
16
+ /**
17
+ * Quarter-arc spinner for an in-flight item. Deliberately finer than the
18
+ * SDK-wide `internal/SpinnerIcon` (1.5 stroke on a 12 grid vs 2 on 16) —
19
+ * the micro-row weight this vocabulary is built around. Card-adjacent
20
+ * surfaces that used to carry their own copies (tool-run groups, file
21
+ * review, decision buttons) size it up via `size` instead.
22
+ */
23
+ export function SpinnerIcon({
24
+ size = 10,
25
+ className,
26
+ }: {
27
+ readonly size?: number;
28
+ readonly className?: string;
29
+ } = {}) {
18
30
  return (
19
- <svg width="10" height="10" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" className="stg:animate-spin">
31
+ <svg
32
+ width={size}
33
+ height={size}
34
+ viewBox="0 0 12 12"
35
+ fill="none"
36
+ stroke="currentColor"
37
+ strokeWidth="1.5"
38
+ className={cn("stg:animate-spin", className)}
39
+ aria-hidden="true"
40
+ >
20
41
  <path d="M6 1.5A4.5 4.5 0 1 1 1.5 6" strokeLinecap="round" />
21
42
  </svg>
22
43
  );
@@ -2,6 +2,7 @@ export {
2
2
  ThreadCardShell,
3
3
  ThreadCardHeader,
4
4
  ThreadCardBody,
5
+ type ThreadCardVariant,
5
6
  type ThreadCardShellProps,
6
7
  type ThreadCardHeaderProps,
7
8
  type ThreadCardHeaderGesture,
@@ -0,0 +1,61 @@
1
+ "use client";
2
+
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
+
5
+ /** How long the transient `copied` flag stays true after a successful copy. */
6
+ const COPIED_FEEDBACK_MS = 2000;
7
+
8
+ /** Return value of {@link useCopyFeedback}. */
9
+ export interface UseCopyFeedbackReturn {
10
+ /**
11
+ * Write `text` to the clipboard. Resolves `true` when the write landed and
12
+ * `false` when it was rejected (insecure context, denied permission); a
13
+ * rejected write leaves `copied` false so the affordance never claims a
14
+ * copy that didn't happen. Callers with a manual fallback (e.g. selecting
15
+ * the on-screen text for a hand copy) branch on the result; plain
16
+ * affordances can ignore it.
17
+ */
18
+ readonly copy: (text: string) => Promise<boolean>;
19
+
20
+ /**
21
+ * `true` for a brief window after a successful copy (drives "Copied"
22
+ * affordance feedback), then resets automatically.
23
+ */
24
+ readonly copied: boolean;
25
+ }
26
+
27
+ /**
28
+ * Behavior hook for the copy-with-feedback shape: write locally-held text to
29
+ * the clipboard and flash a transient `copied` flag for the affordance swap.
30
+ *
31
+ * This is the fetch-free sibling of `useArtifactCopy` (which resolves remote
32
+ * artifact bytes at click time); use it wherever the text to copy is already
33
+ * in hand — message content, identifiers, code blocks. One implementation
34
+ * keeps the feedback window and the unmount-safety identical across surfaces.
35
+ */
36
+ export function useCopyFeedback(): UseCopyFeedbackReturn {
37
+ const [copied, setCopied] = useState(false);
38
+
39
+ // Clear the pending "copied" timer on unmount so a resolved copy never sets
40
+ // state on an unmounted component.
41
+ const copiedTimer = useRef<ReturnType<typeof setTimeout> | null>(null);
42
+ useEffect(() => {
43
+ return () => {
44
+ if (copiedTimer.current !== null) clearTimeout(copiedTimer.current);
45
+ };
46
+ }, []);
47
+
48
+ const copy = useCallback(async (text: string) => {
49
+ try {
50
+ await navigator.clipboard.writeText(text);
51
+ } catch {
52
+ return false;
53
+ }
54
+ setCopied(true);
55
+ if (copiedTimer.current !== null) clearTimeout(copiedTimer.current);
56
+ copiedTimer.current = setTimeout(() => setCopied(false), COPIED_FEEDBACK_MS);
57
+ return true;
58
+ }, []);
59
+
60
+ return useMemo(() => ({ copy, copied }), [copy, copied]);
61
+ }
@@ -1,7 +1,9 @@
1
1
  "use client";
2
2
 
3
- import { useCallback, useState } from "react";
3
+ import { useCallback, useRef } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
+ import { selectElementText } from "../internal/select-element-text.js";
6
+ import { useCopyFeedback } from "../internal/useCopyFeedback.js";
5
7
 
6
8
  // ---------------------------------------------------------------------------
7
9
  // Public API
@@ -47,24 +49,14 @@ export function InvitationCreatedAlert({
47
49
  onDismiss,
48
50
  className,
49
51
  }: InvitationCreatedAlertProps) {
50
- const [copied, setCopied] = useState(false);
52
+ const { copy, copied } = useCopyFeedback();
53
+ const revealRef = useRef<HTMLElement>(null);
51
54
 
52
55
  const handleCopy = useCallback(async () => {
53
- try {
54
- await navigator.clipboard.writeText(inviteUrl);
55
- setCopied(true);
56
- setTimeout(() => setCopied(false), 2000);
57
- } catch {
58
- const el = document.getElementById("stgm-invite-url-reveal");
59
- if (el) {
60
- const selection = window.getSelection();
61
- const range = document.createRange();
62
- range.selectNodeContents(el);
63
- selection?.removeAllRanges();
64
- selection?.addRange(range);
65
- }
66
- }
67
- }, [inviteUrl]);
56
+ if (await copy(inviteUrl)) return;
57
+ // Rejected write: select the revealed URL so the user can copy manually.
58
+ if (revealRef.current) selectElementText(revealRef.current);
59
+ }, [copy, inviteUrl]);
68
60
 
69
61
  return (
70
62
  <div
@@ -99,7 +91,7 @@ export function InvitationCreatedAlert({
99
91
 
100
92
  <div className="stg:flex stg:items-center stg:gap-2">
101
93
  <code
102
- id="stgm-invite-url-reveal"
94
+ ref={revealRef}
103
95
  className={cn(
104
96
  "stg:min-w-0 stg:flex-1 stg:select-all stg:truncate stg:rounded-md",
105
97
  "stg:border stg:border-input stg:bg-background stg:px-2.5 stg:py-1.5",
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { useCallback, useState, type FormEvent } from "react";
3
+ import { useCallback, useId, useState, type FormEvent } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
5
  import {
6
6
  getUserMessage,
@@ -17,6 +17,8 @@ import { useRevokeInvitation } from "./useRevokeInvitation.js";
17
17
  import { InvitationCreatedAlert } from "./InvitationCreatedAlert.js";
18
18
  import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
19
19
  import { RoleSelector } from "../iam-policy/RoleSelector.js";
20
+ import { SpinnerIcon } from "../internal/SpinnerIcon.js";
21
+ import { useCopyFeedback } from "../internal/useCopyFeedback.js";
20
22
 
21
23
  // ---------------------------------------------------------------------------
22
24
  // Public API
@@ -230,6 +232,7 @@ function CreateInvitationForm({
230
232
  onCancel: () => void;
231
233
  }) {
232
234
  const { create, isCreating, error, clearError } = useCreateInvitation();
235
+ const baseId = useId();
233
236
 
234
237
  const [label, setLabel] = useState("");
235
238
  const [role, setRole] = useState<IamRole>(IamRole.viewer);
@@ -266,14 +269,14 @@ function CreateInvitationForm({
266
269
  {/* Label */}
267
270
  <div className="stg:space-y-1">
268
271
  <label
269
- htmlFor="stgm-new-invite-label"
272
+ htmlFor={`${baseId}-label`}
270
273
  className="stg:text-xs stg:font-medium stg:text-foreground"
271
274
  >
272
275
  Label{" "}
273
276
  <span className="stg:font-normal stg:text-muted-foreground">(optional)</span>
274
277
  </label>
275
278
  <input
276
- id="stgm-new-invite-label"
279
+ id={`${baseId}-label`}
277
280
  type="text"
278
281
  value={label}
279
282
  onChange={(e) => setLabel(e.target.value)}
@@ -304,9 +307,12 @@ function CreateInvitationForm({
304
307
  Expires in
305
308
  </legend>
306
309
  <div className="stg:flex stg:flex-wrap stg:gap-2">
310
+ {/* Radio-group names are minted per mount: a hardcoded name would
311
+ merge two mounted forms into one keyboard group. */}
307
312
  {EXPIRY_OPTIONS.map(({ value, label: optLabel }) => (
308
313
  <ExpiryRadio
309
314
  key={value}
315
+ name={`${baseId}-expiry`}
310
316
  value={value}
311
317
  label={optLabel}
312
318
  checked={expiry === value}
@@ -324,6 +330,7 @@ function CreateInvitationForm({
324
330
  </legend>
325
331
  <div className="stg:flex stg:flex-wrap stg:gap-2">
326
332
  <RedemptionRadio
333
+ name={`${baseId}-redemption`}
327
334
  value="unlimited"
328
335
  label="Unlimited"
329
336
  description="Anyone with the link can join"
@@ -332,6 +339,7 @@ function CreateInvitationForm({
332
339
  onChange={setRedemptionMode}
333
340
  />
334
341
  <RedemptionRadio
342
+ name={`${baseId}-redemption`}
335
343
  value="single"
336
344
  label="Single use"
337
345
  description="One person only"
@@ -358,7 +366,7 @@ function CreateInvitationForm({
358
366
  "stg:disabled:pointer-events-none stg:disabled:opacity-40",
359
367
  )}
360
368
  >
361
- {isCreating && <SpinnerIcon />}
369
+ {isCreating && <SpinnerIcon size={12} />}
362
370
  Create invite link
363
371
  </button>
364
372
 
@@ -398,7 +406,7 @@ function InvitationRow({
398
406
  onCancelRevoke: () => void;
399
407
  onRevoked: () => void;
400
408
  }) {
401
- const [copied, setCopied] = useState(false);
409
+ const { copy, copied } = useCopyFeedback();
402
410
 
403
411
  const id = invitation.metadata?.id ?? "";
404
412
  const label = invitation.spec?.label || invitation.metadata?.name || "Unnamed invite";
@@ -410,15 +418,9 @@ function InvitationRow({
410
418
  const expiresAt = invitation.spec?.expiresAt;
411
419
  const isActive = state === InvitationState.active;
412
420
 
413
- const handleCopy = useCallback(async () => {
414
- try {
415
- await navigator.clipboard.writeText(buildInviteUrl(token));
416
- setCopied(true);
417
- setTimeout(() => setCopied(false), 2000);
418
- } catch {
419
- // silently fail — copy is a convenience, not critical
420
- }
421
- }, [token, buildInviteUrl]);
421
+ const handleCopy = useCallback(() => {
422
+ void copy(buildInviteUrl(token));
423
+ }, [copy, token, buildInviteUrl]);
422
424
 
423
425
  if (isRevoking) {
424
426
  return (
@@ -572,7 +574,7 @@ function RevokeConfirmation({
572
574
  "stg:disabled:pointer-events-none stg:disabled:opacity-50",
573
575
  )}
574
576
  >
575
- {isRevoking && <SpinnerIcon />}
577
+ {isRevoking && <SpinnerIcon size={12} />}
576
578
  Revoke
577
579
  </button>
578
580
  <button
@@ -638,12 +640,14 @@ const STATE_BADGE_CONFIG: Record<InvitationState, { label: string; className: st
638
640
  // ---------------------------------------------------------------------------
639
641
 
640
642
  function ExpiryRadio({
643
+ name,
641
644
  value,
642
645
  label,
643
646
  checked,
644
647
  disabled,
645
648
  onChange,
646
649
  }: {
650
+ name: string;
647
651
  value: ExpiryOption;
648
652
  label: string;
649
653
  checked: boolean;
@@ -662,7 +666,7 @@ function ExpiryRadio({
662
666
  >
663
667
  <input
664
668
  type="radio"
665
- name="stgm-invite-expiry"
669
+ name={name}
666
670
  value={value}
667
671
  checked={checked}
668
672
  disabled={disabled}
@@ -675,6 +679,7 @@ function ExpiryRadio({
675
679
  }
676
680
 
677
681
  function RedemptionRadio({
682
+ name,
678
683
  value,
679
684
  label,
680
685
  description,
@@ -682,6 +687,7 @@ function RedemptionRadio({
682
687
  disabled,
683
688
  onChange,
684
689
  }: {
690
+ name: string;
685
691
  value: RedemptionMode;
686
692
  label: string;
687
693
  description: string;
@@ -701,7 +707,7 @@ function RedemptionRadio({
701
707
  >
702
708
  <input
703
709
  type="radio"
704
- name="stgm-invite-redemption"
710
+ name={name}
705
711
  value={value}
706
712
  checked={checked}
707
713
  disabled={disabled}
@@ -836,20 +842,3 @@ function RevokeIcon() {
836
842
  );
837
843
  }
838
844
 
839
- function SpinnerIcon() {
840
- return (
841
- <svg
842
- width="12"
843
- height="12"
844
- viewBox="0 0 16 16"
845
- fill="none"
846
- stroke="currentColor"
847
- strokeWidth="2"
848
- strokeLinecap="round"
849
- className="stg:animate-spin"
850
- aria-hidden="true"
851
- >
852
- <path d="M8 2a6 6 0 1 0 6 6" />
853
- </svg>
854
- );
855
- }