@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,12 +1,13 @@
1
1
  "use client";
2
2
 
3
- import { useCallback } from "react";
3
+ import { useCallback, useId } from "react";
4
4
  import type { Organization } from "@stigmer/protos/ai/stigmer/tenancy/organization/v1/api_pb";
5
5
  import { OrgProfilePanel } from "../organization/OrgProfilePanel.js";
6
6
  import { useOrg } from "../organization/OrgProvider.js";
7
7
 
8
8
  /** Settings section for editing the active organization profile. */
9
9
  export function OrgProfileSection() {
10
+ const headingId = useId();
10
11
  const { activeOrg, refresh } = useOrg();
11
12
  const orgId = activeOrg?.metadata?.id ?? "";
12
13
 
@@ -18,9 +19,9 @@ export function OrgProfileSection() {
18
19
  );
19
20
 
20
21
  return (
21
- <section aria-labelledby="org-profile-heading">
22
+ <section aria-labelledby={headingId}>
22
23
  <h2
23
- id="org-profile-heading"
24
+ id={headingId}
24
25
  className="stg:text-foreground stg:mb-1 stg:text-sm stg:font-semibold"
25
26
  >
26
27
  Organization Profile
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { useCallback, useRef, useState } from "react";
3
+ import { useCallback, useId, useRef, useState } from "react";
4
4
  import type { PlatformClient } from "@stigmer/protos/ai/stigmer/iam/platformclient/v1/api_pb";
5
5
  import type { PlatformClientCreateResponse } from "@stigmer/protos/ai/stigmer/iam/platformclient/v1/io_pb";
6
6
  import { PlatformClientListPanel } from "../platform-client/PlatformClientListPanel.js";
@@ -24,6 +24,7 @@ type FlowState =
24
24
 
25
25
  /** Settings section for creating and maintaining platform clients. */
26
26
  export function PlatformClientsSection() {
27
+ const headingId = useId();
27
28
  const org = useActiveOrgSlug();
28
29
  const pcAvailable = useResourceAvailable(ApiResourceKind.platform_client);
29
30
 
@@ -71,10 +72,10 @@ export function PlatformClientsSection() {
71
72
  }, []);
72
73
 
73
74
  return (
74
- <section aria-labelledby="platform-clients-heading">
75
+ <section aria-labelledby={headingId}>
75
76
  <div className="stg:mb-3 stg:flex stg:items-center stg:justify-between">
76
77
  <h2
77
- id="platform-clients-heading"
78
+ id={headingId}
78
79
  className="stg:text-foreground stg:text-sm stg:font-semibold"
79
80
  >
80
81
  Platform Clients
@@ -1,17 +1,19 @@
1
1
  "use client";
2
2
 
3
+ import { useId } from "react";
3
4
  import { OrgUsagePanel } from "../usage/OrgUsagePanel.js";
4
5
  import { useOrg } from "../organization/OrgProvider.js";
5
6
 
6
7
  /** Settings section for organization usage and cost reporting. */
7
8
  export function UsageSection() {
9
+ const headingId = useId();
8
10
  const { activeOrg } = useOrg();
9
11
  const orgId = activeOrg?.metadata?.id ?? "";
10
12
 
11
13
  return (
12
- <section aria-labelledby="usage-heading">
14
+ <section aria-labelledby={headingId}>
13
15
  <h2
14
- id="usage-heading"
16
+ id={headingId}
15
17
  className="stg:text-foreground stg:mb-1 stg:text-sm stg:font-semibold"
16
18
  >
17
19
  Usage
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { useCallback, useMemo, useRef, useState, type FormEvent } from "react";
3
+ import { useCallback, useId, useMemo, useRef, useState, type FormEvent } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
5
  import {
6
6
  MAX_ALLOWED_ORIGINS,
@@ -139,6 +139,12 @@ export function ShareAgentDialog({
139
139
  }: ShareAgentDialogProps) {
140
140
  const dialogRef = useRef<HTMLDialogElement>(null);
141
141
 
142
+ // Instance-scoped title id (oss#593): a reusable component must not
143
+ // hardcode DOM ids — hosts legitimately mount this dialog more than once
144
+ // per page (e.g. zone-cached detail pages), and duplicate ids break the
145
+ // aria-labelledby association for every copy after the first.
146
+ const titleId = useId();
147
+
142
148
  const handleClose = useCallback(() => {
143
149
  dialogRef.current?.close();
144
150
  onOpenChange(false);
@@ -168,9 +174,9 @@ export function ShareAgentDialog({
168
174
  onClose={handleClose}
169
175
  className={cn(
170
176
  "stg:w-full stg:max-w-lg stg:rounded-xl stg:border stg:border-border stg:bg-popover stg:p-0 stg:shadow-xl",
171
- modal ? "stg:fixed stg:inset-0 stg:m-auto stg:backdrop:bg-black/50" : "stg:relative",
177
+ modal ? "stg:fixed stg:inset-0 stg:m-auto stg:backdrop:bg-backdrop" : "stg:relative",
172
178
  )}
173
- aria-labelledby="share-agent-title"
179
+ aria-labelledby={titleId}
174
180
  >
175
181
  {/* Body mounts only while open so its draft state resets per
176
182
  session — reopening the dialog never shows a stale draft. */}
@@ -182,6 +188,7 @@ export function ShareAgentDialog({
182
188
  buildShareUrl={buildShareUrl}
183
189
  onSharingChanged={onSharingChanged}
184
190
  onClose={handleClose}
191
+ titleId={titleId}
185
192
  />
186
193
  )}
187
194
  </dialog>
@@ -207,6 +214,7 @@ function ShareAgentDialogBody({
207
214
  buildShareUrl,
208
215
  onSharingChanged,
209
216
  onClose,
217
+ titleId,
210
218
  }: {
211
219
  readonly agent: Agent;
212
220
  readonly share: AgentShare | null;
@@ -214,6 +222,8 @@ function ShareAgentDialogBody({
214
222
  readonly buildShareUrl?: (org: string, slug: string) => string;
215
223
  readonly onSharingChanged?: () => void;
216
224
  readonly onClose: () => void;
225
+ /** Heading id minted by the outer dialog for its aria-labelledby. */
226
+ readonly titleId: string;
217
227
  }) {
218
228
  const [created, setCreated] = useState<AgentShare | null>(null);
219
229
  const activeShare = share ?? created;
@@ -229,7 +239,7 @@ function ShareAgentDialogBody({
229
239
  <div className="stg:flex stg:items-start stg:justify-between stg:border-b stg:border-border stg:px-6 stg:py-4">
230
240
  <div className="stg:min-w-0">
231
241
  <h2
232
- id="share-agent-title"
242
+ id={titleId}
233
243
  className="stg:text-base stg:font-semibold stg:text-foreground"
234
244
  >
235
245
  {isCreating ? "Create share" : "Share"}
@@ -322,6 +332,11 @@ function CreateShareForm({
322
332
  const agentName = agent.metadata?.name || (agent.metadata?.slug ?? "");
323
333
  const isCrossOrg = shareOrg !== (agent.metadata?.org ?? "");
324
334
 
335
+ // Instance-scoped field ids (oss#593) — see the outer dialog's titleId.
336
+ const baseId = useId();
337
+ const nameId = `${baseId}-name`;
338
+ const slugId = `${baseId}-slug`;
339
+
325
340
  const [name, setName] = useState(agentName);
326
341
  const [slug, setSlug] = useState(agent.metadata?.slug ?? "");
327
342
  // Once the user manually edits the slug field, stop auto-deriving.
@@ -421,13 +436,13 @@ function CreateShareForm({
421
436
  {/* ---- Name ---- */}
422
437
  <div className="stg:space-y-1">
423
438
  <label
424
- htmlFor="stgm-new-share-name"
439
+ htmlFor={nameId}
425
440
  className="stg:text-xs stg:font-medium stg:text-foreground"
426
441
  >
427
442
  Name
428
443
  </label>
429
444
  <input
430
- id="stgm-new-share-name"
445
+ id={nameId}
431
446
  type="text"
432
447
  value={name}
433
448
  onChange={(e) => handleNameChange(e.target.value)}
@@ -457,13 +472,13 @@ function CreateShareForm({
457
472
  {/* ---- Slug ---- */}
458
473
  <div className="stg:space-y-1">
459
474
  <label
460
- htmlFor="stgm-new-share-slug"
475
+ htmlFor={slugId}
461
476
  className="stg:text-xs stg:font-medium stg:text-foreground"
462
477
  >
463
478
  Slug
464
479
  </label>
465
480
  <input
466
- id="stgm-new-share-slug"
481
+ id={slugId}
467
482
  type="text"
468
483
  value={slug}
469
484
  onChange={(e) => handleSlugChange(e.target.value)}
@@ -533,6 +548,9 @@ function ShareAgentForm({
533
548
  }) {
534
549
  const agentName = agent.metadata?.name || (agent.metadata?.slug ?? "");
535
550
 
551
+ // Instance-scoped label id (oss#593) — see the outer dialog's titleId.
552
+ const enabledLabelId = useId();
553
+
536
554
  // The latest server share is the single baseline: the draft, the link
537
555
  // token, and the share id for rotation all derive from it.
538
556
  const [share, setShare] = useState<AgentShare>(initialShare);
@@ -644,7 +662,7 @@ function ShareAgentForm({
644
662
  <div className="stg:flex stg:items-start stg:justify-between stg:gap-4">
645
663
  <div className="stg:min-w-0">
646
664
  <span
647
- id="share-enabled-label"
665
+ id={enabledLabelId}
648
666
  className="stg:text-sm stg:font-medium stg:text-foreground"
649
667
  >
650
668
  {isOrgAudience
@@ -657,7 +675,7 @@ function ShareAgentForm({
657
675
  checked={draft.enabled}
658
676
  onCheckedChange={handleToggle}
659
677
  disabled={isPending}
660
- aria-labelledby="share-enabled-label"
678
+ aria-labelledby={enabledLabelId}
661
679
  />
662
680
  </div>
663
681
  {!isCrossOrg && (
@@ -274,7 +274,10 @@ describe("WorkspaceSidebar — chrome", () => {
274
274
  expect(screen.getByTestId("footer-slot")).toBeTruthy();
275
275
  const toggle = screen.getByLabelText("Collapse sidebar");
276
276
  expect(toggle.getAttribute("aria-expanded")).toBe("false");
277
- expect(toggle.getAttribute("aria-controls")).toBe("sidebar");
277
+ // The nav id is minted per mount; assert the association, not the value.
278
+ const controlsId = toggle.getAttribute("aria-controls");
279
+ expect(controlsId).toBeTruthy();
280
+ expect(document.getElementById(controlsId!)?.tagName).toBe("NAV");
278
281
  });
279
282
 
280
283
  it("resolves the org switcher from the mocked transport", async () => {
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import type { ReactNode } from "react";
3
+ import { useId, type ReactNode } from "react";
4
4
  import { PanelLeft } from "lucide-react";
5
5
  import { cn } from "@stigmer/theme";
6
6
  import type { Organization } from "@stigmer/protos/ai/stigmer/tenancy/organization/v1/api_pb";
@@ -46,9 +46,8 @@ export interface SidebarChromeProps {
46
46
  /**
47
47
  * Outer sidebar frame: `<nav>` container, top row, content, footer band.
48
48
  *
49
- * The `id="sidebar"` / `aria-controls` pairing matches the console's DOM
50
- * contract (the app shell's floating "Open sidebar" button targets it);
51
- * only one sidebar renders at a time, so the id cannot collide.
49
+ * The nav id exists solely for the collapse toggle's `aria-controls`
50
+ * association; it is minted per mount like every SDK DOM id.
52
51
  */
53
52
  export function SidebarChrome({
54
53
  ariaLabel,
@@ -58,9 +57,10 @@ export function SidebarChrome({
58
57
  footer,
59
58
  children,
60
59
  }: SidebarChromeProps) {
60
+ const navId = useId();
61
61
  return (
62
62
  <nav
63
- id="sidebar"
63
+ id={navId}
64
64
  aria-label={ariaLabel}
65
65
  className="stg:bg-sidebar stg:text-sidebar-foreground stg:flex stg:h-full stg:flex-col"
66
66
  >
@@ -70,7 +70,7 @@ export function SidebarChrome({
70
70
  type="button"
71
71
  onClick={onCollapse}
72
72
  aria-expanded={isOpen}
73
- aria-controls="sidebar"
73
+ aria-controls={navId}
74
74
  aria-label="Collapse sidebar"
75
75
  className={cn(
76
76
  "stg:inline-flex stg:size-7 stg:shrink-0 stg:items-center stg:justify-center stg:rounded-md",
@@ -100,7 +100,7 @@ export function SkillDiffDialog({ state, onClose }: SkillDiffDialogProps) {
100
100
  onClick={handleBackdropClick}
101
101
  className={cn(
102
102
  "stg:fixed stg:inset-0 stg:z-50 stg:m-auto stg:h-[85vh] stg:w-full stg:max-w-4xl stg:rounded-lg stg:border stg:border-border stg:bg-popover stg:p-0 stg:text-popover-foreground stg:shadow-lg",
103
- "stg:backdrop:bg-black/50",
103
+ "stg:backdrop:bg-backdrop",
104
104
  "stg:open:animate-in stg:open:fade-in-0 stg:open:zoom-in-95",
105
105
  )}
106
106
  >
package/src/styles.css CHANGED
@@ -331,6 +331,40 @@
331
331
  animation: stgm-running-pulse 2s ease-in-out infinite;
332
332
  }
333
333
 
334
+ /* Ambient liveness (stigmer#277): a left-to-right light sweep across the
335
+ text of whatever is currently in flight — a running tool's label, the
336
+ thinking indicator, the thread's bottom status line. The sweep rides the
337
+ WORDS describing the current activity (not a spinner beside them), so
338
+ the screen is never still while the agent is alive.
339
+
340
+ Token-driven: the text settles to the muted base with a foreground-
341
+ colored band sweeping through, which reads correctly in both color
342
+ modes and every preset. background-clip:text needs the -webkit- prefix
343
+ in Safari; the transparent fill is what lets the gradient show through
344
+ the glyphs. */
345
+ @keyframes stgm-shimmer {
346
+ to {
347
+ background-position: -200% 0;
348
+ }
349
+ }
350
+
351
+ .stgm-shimmer-label {
352
+ background-image: linear-gradient(
353
+ 90deg,
354
+ var(--stgm-muted-foreground) 0%,
355
+ var(--stgm-muted-foreground) 35%,
356
+ var(--stgm-foreground) 50%,
357
+ var(--stgm-muted-foreground) 65%,
358
+ var(--stgm-muted-foreground) 100%
359
+ );
360
+ background-size: 200% 100%;
361
+ background-position: 0 0;
362
+ -webkit-background-clip: text;
363
+ background-clip: text;
364
+ color: transparent;
365
+ animation: stgm-shimmer 2s linear infinite;
366
+ }
367
+
334
368
  @media (prefers-reduced-motion: reduce) {
335
369
  .stgm {
336
370
  --stgm-motion-duration: 0ms;
@@ -344,6 +378,15 @@
344
378
  animation-iteration-count: 1 !important;
345
379
  transition-duration: 0.01ms !important;
346
380
  }
381
+
382
+ /* The shimmer is pure decoration: under reduced motion the label drops
383
+ the clipped gradient entirely and reads as ordinary text (DD-015) —
384
+ a frozen gradient band would look like a rendering glitch. */
385
+ .stgm-shimmer-label {
386
+ background-image: none;
387
+ color: inherit;
388
+ animation: none;
389
+ }
347
390
  }
348
391
  }
349
392
 
@@ -3,6 +3,7 @@
3
3
  import { cn } from "@stigmer/theme";
4
4
  import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
5
5
  import type { VersionTimelineEntryProps } from "./types.js";
6
+ import { formatRelativeTime } from "../activity/format-relative-time.js";
6
7
 
7
8
  /**
8
9
  * A single row in a version timeline.
@@ -205,27 +206,6 @@ function GitProvenanceRow({
205
206
  // Utilities
206
207
  // ---------------------------------------------------------------------------
207
208
 
208
- function formatRelativeTime(date: Date): string {
209
- const now = Date.now();
210
- const diffMs = now - date.getTime();
211
- const diffSec = Math.floor(diffMs / 1000);
212
- const diffMin = Math.floor(diffSec / 60);
213
- const diffHr = Math.floor(diffMin / 60);
214
- const diffDays = Math.floor(diffHr / 24);
215
-
216
- if (diffSec < 60) return "just now";
217
- if (diffMin < 60) return `${diffMin}m ago`;
218
- if (diffHr < 24) return `${diffHr}h ago`;
219
- if (diffDays < 7) return `${diffDays}d ago`;
220
- if (diffDays < 30) return `${Math.floor(diffDays / 7)}w ago`;
221
-
222
- return date.toLocaleDateString(undefined, {
223
- month: "short",
224
- day: "numeric",
225
- year: date.getFullYear() !== new Date().getFullYear() ? "numeric" : undefined,
226
- });
227
- }
228
-
229
209
  function normalizeGitUrl(url: string): string | null {
230
210
  if (!url) return null;
231
211
  const cleaned = url.replace(/\.git$/, "");
@@ -4,6 +4,7 @@ import { memo } from "react";
4
4
  import type { WorkflowExecution } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
5
5
  import { timestampDate } from "@bufbuild/protobuf/wkt";
6
6
  import { cn } from "@stigmer/theme";
7
+ import { formatRelativeTime } from "../activity/format-relative-time.js";
7
8
 
8
9
  export interface FailedRunsWidgetProps {
9
10
  /** Recent failed executions to display. */
@@ -14,14 +15,6 @@ export interface FailedRunsWidgetProps {
14
15
  readonly className?: string;
15
16
  }
16
17
 
17
- function formatTimeAgo(date: Date): string {
18
- const seconds = Math.floor((Date.now() - date.getTime()) / 1000);
19
- if (seconds < 60) return "just now";
20
- if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;
21
- if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`;
22
- return `${Math.floor(seconds / 86400)}d ago`;
23
- }
24
-
25
18
  /**
26
19
  * Dashboard widget showing recent failed workflow executions.
27
20
  *
@@ -85,7 +78,7 @@ export const FailedRunsWidget = memo(function FailedRunsWidget({
85
78
  </p>
86
79
  {failedDate && (
87
80
  <p className="stg:mt-0.5 stg:text-xs stg:text-muted-foreground">
88
- {formatTimeAgo(failedDate)}
81
+ {formatRelativeTime(failedDate)}
89
82
  </p>
90
83
  )}
91
84
  </div>
@@ -4,6 +4,7 @@ import { memo } from "react";
4
4
  import type { PendingApproval } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/io_pb";
5
5
  import { timestampDate } from "@bufbuild/protobuf/wkt";
6
6
  import { cn } from "@stigmer/theme";
7
+ import { formatRelativeTime } from "../activity/format-relative-time.js";
7
8
 
8
9
  export interface PendingApprovalsWidgetProps {
9
10
  readonly approvals: readonly PendingApproval[];
@@ -14,14 +15,6 @@ export interface PendingApprovalsWidgetProps {
14
15
  readonly className?: string;
15
16
  }
16
17
 
17
- function formatTimeAgo(date: Date): string {
18
- const seconds = Math.floor((Date.now() - date.getTime()) / 1000);
19
- if (seconds < 60) return "just now";
20
- if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;
21
- if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`;
22
- return `${Math.floor(seconds / 86400)}d ago`;
23
- }
24
-
25
18
  /**
26
19
  * Dashboard widget showing pending human_input approvals.
27
20
  *
@@ -98,7 +91,7 @@ export const PendingApprovalsWidget = memo(function PendingApprovalsWidget({
98
91
  <p className="stg:mt-0.5 stg:truncate stg:text-xs stg:text-muted-foreground">
99
92
  Task: {approval.taskName}
100
93
  {requestedAt && (
101
- <> &middot; {formatTimeAgo(requestedAt)}</>
94
+ <> &middot; {formatRelativeTime(requestedAt)}</>
102
95
  )}
103
96
  </p>
104
97
  </div>
@@ -1,9 +1,10 @@
1
1
  "use client";
2
2
 
3
- import { memo, useCallback, useEffect, useRef, useState } from "react";
3
+ import { memo, useCallback, useEffect, useRef } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
5
  import type { WorkflowGraphModel } from "./workflow-graph-model.js";
6
6
  import { taskToYaml } from "./inspector/task-to-yaml.js";
7
+ import { useCopyFeedback } from "../internal/useCopyFeedback.js";
7
8
 
8
9
  /** Props for {@link ViewYamlDialog}. */
9
10
  export interface ViewYamlDialogProps {
@@ -32,7 +33,7 @@ export const ViewYamlDialog = memo(function ViewYamlDialog({
32
33
  onClose,
33
34
  }: ViewYamlDialogProps) {
34
35
  const dialogRef = useRef<HTMLDialogElement>(null);
35
- const [copied, setCopied] = useState(false);
36
+ const { copy, copied } = useCopyFeedback();
36
37
 
37
38
  const node = nodeId && graph
38
39
  ? graph.nodes.find((n) => n.id === nodeId) ?? null
@@ -58,25 +59,9 @@ export const ViewYamlDialog = memo(function ViewYamlDialog({
58
59
  return () => dialog.removeEventListener("close", handleClose);
59
60
  }, [onClose]);
60
61
 
61
- const handleCopy = useCallback(async () => {
62
- try {
63
- await navigator.clipboard.writeText(yaml);
64
- setCopied(true);
65
- setTimeout(() => setCopied(false), 2000);
66
- } catch {
67
- // Fallback for environments without clipboard API
68
- const textarea = document.createElement("textarea");
69
- textarea.value = yaml;
70
- textarea.style.position = "fixed";
71
- textarea.style.opacity = "0";
72
- document.body.appendChild(textarea);
73
- textarea.select();
74
- document.execCommand("copy");
75
- document.body.removeChild(textarea);
76
- setCopied(true);
77
- setTimeout(() => setCopied(false), 2000);
78
- }
79
- }, [yaml]);
62
+ const handleCopy = useCallback(() => {
63
+ void copy(yaml);
64
+ }, [copy, yaml]);
80
65
 
81
66
  const handleBackdropClick = useCallback(
82
67
  (e: React.MouseEvent<HTMLDialogElement>) => {
@@ -92,7 +77,7 @@ export const ViewYamlDialog = memo(function ViewYamlDialog({
92
77
  ref={dialogRef}
93
78
  className={cn(
94
79
  "stgm stg:m-auto stg:max-h-[80vh] stg:w-full stg:max-w-lg stg:rounded-lg stg:border stg:border-[var(--stgm-border,#e5e5e5)] stg:bg-[var(--stgm-background,#fff)] stg:p-0 stg:shadow-xl",
95
- "stg:backdrop:bg-black/40",
80
+ "stg:backdrop:bg-backdrop",
96
81
  )}
97
82
  onClick={handleBackdropClick}
98
83
  aria-label={node ? `YAML for ${node.taskName}` : "View YAML"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { useCallback, useEffect, useRef, useState } from "react";
3
+ import { useCallback, useEffect, useId, useRef, useState } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
5
  import {
6
6
  useWorkflowArchitectFlow,
@@ -8,6 +8,7 @@ import {
8
8
  } from "./useWorkflowArchitectFlow.js";
9
9
  import { MessageThread } from "../execution/MessageThread.js";
10
10
  import { WorkflowDiffGraph } from "./WorkflowDiffGraph.js";
11
+ import { SpinnerIcon } from "../internal/SpinnerIcon.js";
11
12
 
12
13
  /** Props for {@link WorkflowArchitectDialog}. */
13
14
  export interface WorkflowArchitectDialogProps {
@@ -119,7 +120,7 @@ export function WorkflowArchitectDialog({
119
120
  onClick={handleBackdropClick}
120
121
  className={cn(
121
122
  "stg:fixed stg:inset-0 stg:z-50 stg:m-auto stg:w-full stg:max-w-3xl stg:rounded-lg stg:border stg:border-border stg:bg-popover stg:p-0 stg:text-popover-foreground stg:shadow-lg",
122
- "stg:backdrop:bg-black/50",
123
+ "stg:backdrop:bg-backdrop",
123
124
  "stg:open:animate-in stg:open:fade-in-0 stg:open:zoom-in-95",
124
125
  )}
125
126
  >
@@ -176,6 +177,7 @@ function InputPhase({
176
177
  readonly flow: ReturnType<typeof useWorkflowArchitectFlow>;
177
178
  readonly onClose: () => void;
178
179
  }) {
180
+ const promptId = useId();
179
181
  return (
180
182
  <>
181
183
  <div className="stg:border-b stg:border-border stg:px-6 stg:py-4">
@@ -200,7 +202,7 @@ function InputPhase({
200
202
 
201
203
  <div className="stg:flex stg:flex-col stg:gap-1">
202
204
  <label
203
- htmlFor="architect-prompt"
205
+ htmlFor={promptId}
204
206
  className="stg:text-xs stg:font-medium stg:text-foreground"
205
207
  >
206
208
  Description
@@ -209,7 +211,7 @@ function InputPhase({
209
211
  </span>
210
212
  </label>
211
213
  <textarea
212
- id="architect-prompt"
214
+ id={promptId}
213
215
  value={flow.prompt}
214
216
  onChange={(e) => flow.setPrompt(e.target.value)}
215
217
  placeholder="e.g., A workflow that enriches customer data using my data-agent, validates the output, and sends a Slack notification on failure"
@@ -279,7 +281,7 @@ function StreamingPhase({
279
281
  Workflow Architect
280
282
  </h3>
281
283
  <span className="stg:inline-flex stg:items-center stg:gap-1.5 stg:text-xs stg:text-muted-foreground">
282
- <SpinnerIcon />
284
+ <SpinnerIcon size={14} />
283
285
  {flow.phase === "starting" ? "Starting…" : "Working…"}
284
286
  </span>
285
287
  </div>
@@ -436,7 +438,7 @@ function ResultPhase({
436
438
  "stg:disabled:pointer-events-none stg:disabled:opacity-40",
437
439
  )}
438
440
  >
439
- {isApplying && <SpinnerIcon />}
441
+ {isApplying && <SpinnerIcon size={14} />}
440
442
  {isApplying ? "Creating…" : "Create Workflow"}
441
443
  </button>
442
444
  </div>
@@ -502,24 +504,3 @@ function ErrorPhase({
502
504
  );
503
505
  }
504
506
 
505
- // ---------------------------------------------------------------------------
506
- // Shared components
507
- // ---------------------------------------------------------------------------
508
-
509
- function SpinnerIcon({ size = 14 }: { readonly size?: number }) {
510
- return (
511
- <svg
512
- width={size}
513
- height={size}
514
- viewBox="0 0 16 16"
515
- fill="none"
516
- stroke="currentColor"
517
- strokeWidth="2"
518
- strokeLinecap="round"
519
- className="stg:animate-spin"
520
- aria-hidden="true"
521
- >
522
- <path d="M8 2a6 6 0 1 0 6 6" />
523
- </svg>
524
- );
525
- }
@@ -3,16 +3,15 @@
3
3
  // Editor-area document rendering one workflow Artifact resource's content.
4
4
  // Domain: workflow (the Artifact-resource counterpart of execution/ArtifactDocument).
5
5
 
6
- import { useCallback, useState } from "react";
6
+ import { useCallback } from "react";
7
7
  import type { Artifact } from "@stigmer/protos/ai/stigmer/agentic/artifact/v1/api_pb";
8
8
  import { cn } from "@stigmer/theme";
9
9
  import { ArtifactFileContent } from "../execution/ArtifactFileContent.js";
10
10
  import { formatArtifactSize } from "../execution/artifact-utils.js";
11
11
  import { useArtifactContentById } from "../execution/useArtifactContentById.js";
12
+ import { useCopyFeedback } from "../internal/useCopyFeedback.js";
12
13
  import { useWorkflowArtifactDownload } from "./useWorkflowArtifactDownload.js";
13
14
 
14
- const COPIED_FEEDBACK_MS = 2000;
15
-
16
15
  /** Props for {@link WorkflowArtifactDocument}. */
17
16
  export interface WorkflowArtifactDocumentProps {
18
17
  /** The workflow artifact to render. */
@@ -78,14 +77,11 @@ export function WorkflowArtifactDocument({
78
77
 
79
78
  const { download, isDownloading } = useWorkflowArtifactDownload();
80
79
 
81
- const [copied, setCopied] = useState(false);
80
+ const { copy: copyToClipboard, copied } = useCopyFeedback();
82
81
  const copy = useCallback(() => {
83
82
  if (!content) return;
84
- void navigator.clipboard.writeText(content).then(() => {
85
- setCopied(true);
86
- setTimeout(() => setCopied(false), COPIED_FEEDBACK_MS);
87
- });
88
- }, [content]);
83
+ void copyToClipboard(content);
84
+ }, [content, copyToClipboard]);
89
85
 
90
86
  const showCopy = content !== null;
91
87
 
@@ -636,6 +636,8 @@ const WorkflowCanvasEditorInner = memo(function WorkflowCanvasEditorInner({
636
636
  edges={canvas.edges}
637
637
  onNodesChange={canvas.onNodesChange}
638
638
  onEdgesChange={canvas.onEdgesChange}
639
+ onNodeDragStart={canvas.onNodeDragStart}
640
+ onNodeDragStop={canvas.onNodeDragStop}
639
641
  onNodeClick={handleNodeClick}
640
642
  onEdgeClick={handleEdgeClick}
641
643
  onPaneClick={handlePaneClick}