@stigmer/react 3.12.1 → 3.12.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (708) hide show
  1. package/access/ManageAccessDialog.d.ts.map +1 -1
  2. package/access/ManageAccessDialog.js +8 -19
  3. package/access/ManageAccessDialog.js.map +1 -1
  4. package/activity/format-relative-time.d.ts +11 -9
  5. package/activity/format-relative-time.d.ts.map +1 -1
  6. package/activity/format-relative-time.js +11 -9
  7. package/activity/format-relative-time.js.map +1 -1
  8. package/agent/steps/CapabilitiesStep.js +5 -2
  9. package/agent/steps/CapabilitiesStep.js.map +1 -1
  10. package/agent/steps/IdentityStep.d.ts.map +1 -1
  11. package/agent/steps/IdentityStep.js +6 -5
  12. package/agent/steps/IdentityStep.js.map +1 -1
  13. package/agent-instance/CreateAgentInstanceDialog.d.ts.map +1 -1
  14. package/agent-instance/CreateAgentInstanceDialog.js +15 -20
  15. package/agent-instance/CreateAgentInstanceDialog.js.map +1 -1
  16. package/api-key/ApiKeyCreatedAlert.d.ts.map +1 -1
  17. package/api-key/ApiKeyCreatedAlert.js +12 -20
  18. package/api-key/ApiKeyCreatedAlert.js.map +1 -1
  19. package/api-key/ApiKeyListPanel.d.ts.map +1 -1
  20. package/api-key/ApiKeyListPanel.js +3 -23
  21. package/api-key/ApiKeyListPanel.js.map +1 -1
  22. package/api-key/CreateApiKeyForm.d.ts.map +1 -1
  23. package/api-key/CreateApiKeyForm.js +6 -10
  24. package/api-key/CreateApiKeyForm.js.map +1 -1
  25. package/approval-defaults-context.d.ts +47 -0
  26. package/approval-defaults-context.d.ts.map +1 -0
  27. package/approval-defaults-context.js +27 -0
  28. package/approval-defaults-context.js.map +1 -0
  29. package/attachment/AttachmentImageLightbox.d.ts.map +1 -1
  30. package/attachment/AttachmentImageLightbox.js +8 -23
  31. package/attachment/AttachmentImageLightbox.js.map +1 -1
  32. package/attachment/index.d.ts +2 -0
  33. package/attachment/index.d.ts.map +1 -1
  34. package/attachment/index.js +1 -0
  35. package/attachment/index.js.map +1 -1
  36. package/attachment/vision-preflight.d.ts +113 -0
  37. package/attachment/vision-preflight.d.ts.map +1 -0
  38. package/attachment/vision-preflight.js +143 -0
  39. package/attachment/vision-preflight.js.map +1 -0
  40. package/billing/AutoRechargeCard.d.ts.map +1 -1
  41. package/billing/AutoRechargeCard.js +3 -2
  42. package/billing/AutoRechargeCard.js.map +1 -1
  43. package/billing/BillingSection.d.ts.map +1 -1
  44. package/billing/BillingSection.js +3 -2
  45. package/billing/BillingSection.js.map +1 -1
  46. package/channel/ChannelConversationsDialog.d.ts.map +1 -1
  47. package/channel/ChannelConversationsDialog.js +6 -21
  48. package/channel/ChannelConversationsDialog.js.map +1 -1
  49. package/channel/ChannelCredentialsDialog.d.ts.map +1 -1
  50. package/channel/ChannelCredentialsDialog.js +10 -21
  51. package/channel/ChannelCredentialsDialog.js.map +1 -1
  52. package/channel/ChannelTemplatesDialog.d.ts.map +1 -1
  53. package/channel/ChannelTemplatesDialog.js +7 -22
  54. package/channel/ChannelTemplatesDialog.js.map +1 -1
  55. package/channel/ConnectSlackDialog.d.ts.map +1 -1
  56. package/channel/ConnectSlackDialog.js +10 -23
  57. package/channel/ConnectSlackDialog.js.map +1 -1
  58. package/channel/ConnectWhatsAppDialog.d.ts.map +1 -1
  59. package/channel/ConnectWhatsAppDialog.js +10 -23
  60. package/channel/ConnectWhatsAppDialog.js.map +1 -1
  61. package/channel/useChannelSessions.d.ts.map +1 -1
  62. package/channel/useChannelSessions.js.map +1 -1
  63. package/channel-app/ChannelAppDetailPanel.d.ts.map +1 -1
  64. package/channel-app/ChannelAppDetailPanel.js +8 -5
  65. package/channel-app/ChannelAppDetailPanel.js.map +1 -1
  66. package/channel-app/CreateChannelAppForm.d.ts.map +1 -1
  67. package/channel-app/CreateChannelAppForm.js +12 -7
  68. package/channel-app/CreateChannelAppForm.js.map +1 -1
  69. package/channel-app/internal.d.ts +0 -1
  70. package/channel-app/internal.d.ts.map +1 -1
  71. package/channel-app/internal.js +5 -10
  72. package/channel-app/internal.js.map +1 -1
  73. package/composer/ComposerToolbar.js +2 -1
  74. package/composer/ComposerToolbar.js.map +1 -1
  75. package/composer/SessionComposer.d.ts +1 -1
  76. package/composer/SessionComposer.d.ts.map +1 -1
  77. package/composer/SessionComposer.js +120 -13
  78. package/composer/SessionComposer.js.map +1 -1
  79. package/composer/icons.d.ts +0 -1
  80. package/composer/icons.d.ts.map +1 -1
  81. package/composer/icons.js +0 -3
  82. package/composer/icons.js.map +1 -1
  83. package/conversation/ConversationAttentionBanner.d.ts +23 -6
  84. package/conversation/ConversationAttentionBanner.d.ts.map +1 -1
  85. package/conversation/ConversationAttentionBanner.js +25 -10
  86. package/conversation/ConversationAttentionBanner.js.map +1 -1
  87. package/conversation/ConversationComposer.js +1 -1
  88. package/conversation/ConversationComposer.js.map +1 -1
  89. package/conversation/ConversationListPane.d.ts.map +1 -1
  90. package/conversation/ConversationListPane.js +28 -8
  91. package/conversation/ConversationListPane.js.map +1 -1
  92. package/conversation/ConversationsWorkbench.d.ts.map +1 -1
  93. package/conversation/ConversationsWorkbench.js +1 -1
  94. package/conversation/ConversationsWorkbench.js.map +1 -1
  95. package/cursor-accounts/MemberCoverageTable.js +3 -14
  96. package/cursor-accounts/MemberCoverageTable.js.map +1 -1
  97. package/dashboard/DashboardFailedRuns.d.ts.map +1 -1
  98. package/dashboard/DashboardFailedRuns.js +2 -14
  99. package/dashboard/DashboardFailedRuns.js.map +1 -1
  100. package/environment/CreateEnvironmentForm.d.ts.map +1 -1
  101. package/environment/CreateEnvironmentForm.js +4 -8
  102. package/environment/CreateEnvironmentForm.js.map +1 -1
  103. package/environment/EnvVarForm.d.ts.map +1 -1
  104. package/environment/EnvVarForm.js +2 -4
  105. package/environment/EnvVarForm.js.map +1 -1
  106. package/environment/EnvironmentVariableEditor.d.ts.map +1 -1
  107. package/environment/EnvironmentVariableEditor.js +5 -7
  108. package/environment/EnvironmentVariableEditor.js.map +1 -1
  109. package/execution/ApprovalCard.d.ts.map +1 -1
  110. package/execution/ApprovalCard.js +13 -3
  111. package/execution/ApprovalCard.js.map +1 -1
  112. package/execution/ArtifactApplyButton.d.ts.map +1 -1
  113. package/execution/ArtifactApplyButton.js +2 -4
  114. package/execution/ArtifactApplyButton.js.map +1 -1
  115. package/execution/ArtifactPreviewModal.d.ts.map +1 -1
  116. package/execution/ArtifactPreviewModal.js +11 -17
  117. package/execution/ArtifactPreviewModal.js.map +1 -1
  118. package/execution/ExecutionErrorNotice.d.ts +36 -0
  119. package/execution/ExecutionErrorNotice.d.ts.map +1 -0
  120. package/execution/ExecutionErrorNotice.js +39 -0
  121. package/execution/ExecutionErrorNotice.js.map +1 -0
  122. package/execution/FilePathLink.d.ts.map +1 -1
  123. package/execution/FilePathLink.js +5 -8
  124. package/execution/FilePathLink.js.map +1 -1
  125. package/execution/FileReviewCard.d.ts.map +1 -1
  126. package/execution/FileReviewCard.js +1 -6
  127. package/execution/FileReviewCard.js.map +1 -1
  128. package/execution/FollowUpInput.d.ts.map +1 -1
  129. package/execution/FollowUpInput.js +1 -3
  130. package/execution/FollowUpInput.js.map +1 -1
  131. package/execution/LivenessStatusLine.d.ts +40 -0
  132. package/execution/LivenessStatusLine.d.ts.map +1 -0
  133. package/execution/LivenessStatusLine.js +34 -0
  134. package/execution/LivenessStatusLine.js.map +1 -0
  135. package/execution/MessageEntry.d.ts.map +1 -1
  136. package/execution/MessageEntry.js +31 -3
  137. package/execution/MessageEntry.js.map +1 -1
  138. package/execution/MessageThread.d.ts +25 -0
  139. package/execution/MessageThread.d.ts.map +1 -1
  140. package/execution/MessageThread.js +51 -36
  141. package/execution/MessageThread.js.map +1 -1
  142. package/execution/SetupProgress.d.ts.map +1 -1
  143. package/execution/SetupProgress.js +1 -1
  144. package/execution/SetupProgress.js.map +1 -1
  145. package/execution/SubAgentSection.d.ts.map +1 -1
  146. package/execution/SubAgentSection.js +9 -7
  147. package/execution/SubAgentSection.js.map +1 -1
  148. package/execution/TerminalSession.d.ts +30 -0
  149. package/execution/TerminalSession.d.ts.map +1 -1
  150. package/execution/TerminalSession.js +37 -1
  151. package/execution/TerminalSession.js.map +1 -1
  152. package/execution/ToolCallDetail.d.ts +9 -0
  153. package/execution/ToolCallDetail.d.ts.map +1 -1
  154. package/execution/ToolCallDetail.js +16 -0
  155. package/execution/ToolCallDetail.js.map +1 -1
  156. package/execution/ToolCallItem.d.ts +23 -7
  157. package/execution/ToolCallItem.d.ts.map +1 -1
  158. package/execution/ToolCallItem.js +120 -35
  159. package/execution/ToolCallItem.js.map +1 -1
  160. package/execution/ToolRunGroup.d.ts.map +1 -1
  161. package/execution/ToolRunGroup.js +11 -11
  162. package/execution/ToolRunGroup.js.map +1 -1
  163. package/execution/WriteBackCard.d.ts.map +1 -1
  164. package/execution/WriteBackCard.js +5 -20
  165. package/execution/WriteBackCard.js.map +1 -1
  166. package/execution/index.d.ts +7 -3
  167. package/execution/index.d.ts.map +1 -1
  168. package/execution/index.js +4 -2
  169. package/execution/index.js.map +1 -1
  170. package/execution/tool-categories.d.ts +93 -7
  171. package/execution/tool-categories.d.ts.map +1 -1
  172. package/execution/tool-categories.js +141 -5
  173. package/execution/tool-categories.js.map +1 -1
  174. package/execution/tool-presenter.d.ts +32 -1
  175. package/execution/tool-presenter.d.ts.map +1 -1
  176. package/execution/tool-presenter.js +10 -2
  177. package/execution/tool-presenter.js.map +1 -1
  178. package/execution/useArtifactInspection.d.ts.map +1 -1
  179. package/execution/useArtifactInspection.js +4 -7
  180. package/execution/useArtifactInspection.js.map +1 -1
  181. package/iam-policy/GrantAccessForm.d.ts.map +1 -1
  182. package/iam-policy/GrantAccessForm.js +2 -4
  183. package/iam-policy/GrantAccessForm.js.map +1 -1
  184. package/iam-policy/OrgMembersPanel.d.ts.map +1 -1
  185. package/iam-policy/OrgMembersPanel.js +3 -5
  186. package/iam-policy/OrgMembersPanel.js.map +1 -1
  187. package/iam-policy/RoleSelector.d.ts.map +1 -1
  188. package/iam-policy/RoleSelector.js +7 -1
  189. package/iam-policy/RoleSelector.js.map +1 -1
  190. package/identity-provider/CreateIdentityProviderForm.d.ts.map +1 -1
  191. package/identity-provider/CreateIdentityProviderForm.js +6 -9
  192. package/identity-provider/CreateIdentityProviderForm.js.map +1 -1
  193. package/identity-provider/IdentityProviderDetailPanel.d.ts.map +1 -1
  194. package/identity-provider/IdentityProviderDetailPanel.js +17 -26
  195. package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
  196. package/identity-provider/IdentityProviderListPanel.d.ts.map +1 -1
  197. package/identity-provider/IdentityProviderListPanel.js +2 -4
  198. package/identity-provider/IdentityProviderListPanel.js.map +1 -1
  199. package/identity-provider/IdentityProviderWizard.d.ts.map +1 -1
  200. package/identity-provider/IdentityProviderWizard.js +8 -7
  201. package/identity-provider/IdentityProviderWizard.js.map +1 -1
  202. package/identity-provider/SsoLoginPrompt.js +5 -6
  203. package/identity-provider/SsoLoginPrompt.js.map +1 -1
  204. package/index.d.ts +9 -8
  205. package/index.d.ts.map +1 -1
  206. package/index.js +4 -4
  207. package/index.js.map +1 -1
  208. package/internal/DecisionButton.d.ts.map +1 -1
  209. package/internal/DecisionButton.js +1 -6
  210. package/internal/DecisionButton.js.map +1 -1
  211. package/internal/DialogShell.d.ts +77 -0
  212. package/internal/DialogShell.d.ts.map +1 -0
  213. package/internal/DialogShell.js +77 -0
  214. package/internal/DialogShell.js.map +1 -0
  215. package/internal/SpinnerIcon.d.ts +22 -0
  216. package/internal/SpinnerIcon.d.ts.map +1 -0
  217. package/internal/SpinnerIcon.js +23 -0
  218. package/internal/SpinnerIcon.js.map +1 -0
  219. package/internal/select-element-text.d.ts +11 -0
  220. package/internal/select-element-text.d.ts.map +1 -0
  221. package/internal/select-element-text.js +19 -0
  222. package/internal/select-element-text.js.map +1 -0
  223. package/internal/thread-card/ThreadCardShell.d.ts +27 -10
  224. package/internal/thread-card/ThreadCardShell.d.ts.map +1 -1
  225. package/internal/thread-card/ThreadCardShell.js +11 -5
  226. package/internal/thread-card/ThreadCardShell.js.map +1 -1
  227. package/internal/thread-card/glyphs.d.ts +11 -2
  228. package/internal/thread-card/glyphs.d.ts.map +1 -1
  229. package/internal/thread-card/glyphs.js +9 -3
  230. package/internal/thread-card/glyphs.js.map +1 -1
  231. package/internal/thread-card/index.d.ts +1 -1
  232. package/internal/thread-card/index.d.ts.map +1 -1
  233. package/internal/thread-card/index.js.map +1 -1
  234. package/internal/useCopyFeedback.d.ts +28 -0
  235. package/internal/useCopyFeedback.d.ts.map +1 -0
  236. package/internal/useCopyFeedback.js +40 -0
  237. package/internal/useCopyFeedback.js.map +1 -0
  238. package/invitation/InvitationCreatedAlert.d.ts.map +1 -1
  239. package/invitation/InvitationCreatedAlert.js +12 -19
  240. package/invitation/InvitationCreatedAlert.js.map +1 -1
  241. package/invitation/InvitationManager.d.ts.map +1 -1
  242. package/invitation/InvitationManager.js +14 -21
  243. package/invitation/InvitationManager.js.map +1 -1
  244. package/invitation/InvitationRedemption.d.ts.map +1 -1
  245. package/invitation/InvitationRedemption.js +2 -4
  246. package/invitation/InvitationRedemption.js.map +1 -1
  247. package/library/useExportResource.d.ts.map +1 -1
  248. package/library/useExportResource.js +16 -27
  249. package/library/useExportResource.js.map +1 -1
  250. package/manifest/ApplyManifestDialog.d.ts.map +1 -1
  251. package/manifest/ApplyManifestDialog.js +7 -17
  252. package/manifest/ApplyManifestDialog.js.map +1 -1
  253. package/manifest/EditResourceYamlDialog.d.ts.map +1 -1
  254. package/manifest/EditResourceYamlDialog.js +3 -19
  255. package/manifest/EditResourceYamlDialog.js.map +1 -1
  256. package/mcp-server/DefinitionDriftNotice.d.ts +42 -0
  257. package/mcp-server/DefinitionDriftNotice.d.ts.map +1 -0
  258. package/mcp-server/DefinitionDriftNotice.js +52 -0
  259. package/mcp-server/DefinitionDriftNotice.js.map +1 -0
  260. package/mcp-server/McpServerConnectDialog.d.ts.map +1 -1
  261. package/mcp-server/McpServerConnectDialog.js +8 -20
  262. package/mcp-server/McpServerConnectDialog.js.map +1 -1
  263. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  264. package/mcp-server/McpServerDetailView.js +50 -28
  265. package/mcp-server/McpServerDetailView.js.map +1 -1
  266. package/mcp-server/OAuthAppForm.d.ts.map +1 -1
  267. package/mcp-server/OAuthAppForm.js +2 -4
  268. package/mcp-server/OAuthAppForm.js.map +1 -1
  269. package/mcp-server/internal/definitionDrift.d.ts +39 -0
  270. package/mcp-server/internal/definitionDrift.d.ts.map +1 -0
  271. package/mcp-server/internal/definitionDrift.js +122 -0
  272. package/mcp-server/internal/definitionDrift.js.map +1 -0
  273. package/mcp-server/internal/mcpServerToInput.d.ts.map +1 -1
  274. package/mcp-server/internal/mcpServerToInput.js +3 -0
  275. package/mcp-server/internal/mcpServerToInput.js.map +1 -1
  276. package/mcp-server/steps/EnvironmentAuthStep.d.ts.map +1 -1
  277. package/mcp-server/steps/EnvironmentAuthStep.js +8 -4
  278. package/mcp-server/steps/EnvironmentAuthStep.js.map +1 -1
  279. package/mcp-server/steps/IdentityTransportStep.d.ts.map +1 -1
  280. package/mcp-server/steps/IdentityTransportStep.js +5 -4
  281. package/mcp-server/steps/IdentityTransportStep.js.map +1 -1
  282. package/mcp-server/useMcpServerConnect.d.ts +1 -1
  283. package/mcp-server/useMcpServerDefinitionDrift.d.ts +44 -0
  284. package/mcp-server/useMcpServerDefinitionDrift.d.ts.map +1 -0
  285. package/mcp-server/useMcpServerDefinitionDrift.js +61 -0
  286. package/mcp-server/useMcpServerDefinitionDrift.js.map +1 -0
  287. package/models/ModelRegistryContext.d.ts +7 -1
  288. package/models/ModelRegistryContext.d.ts.map +1 -1
  289. package/models/ModelRegistryContext.js.map +1 -1
  290. package/models/ModelSelector.js +9 -1
  291. package/models/ModelSelector.js.map +1 -1
  292. package/models/index.d.ts +2 -2
  293. package/models/index.d.ts.map +1 -1
  294. package/models/index.js +1 -1
  295. package/models/index.js.map +1 -1
  296. package/models/registry.d.ts +88 -6
  297. package/models/registry.d.ts.map +1 -1
  298. package/models/registry.js +133 -27
  299. package/models/registry.js.map +1 -1
  300. package/models/useModelRegistry.d.ts +7 -1
  301. package/models/useModelRegistry.d.ts.map +1 -1
  302. package/models/useModelRegistry.js +3 -2
  303. package/models/useModelRegistry.js.map +1 -1
  304. package/oauth-app/CreateOAuthAppForm.d.ts.map +1 -1
  305. package/oauth-app/CreateOAuthAppForm.js +4 -5
  306. package/oauth-app/CreateOAuthAppForm.js.map +1 -1
  307. package/oauth-app/OAuthAppDetailPanel.d.ts.map +1 -1
  308. package/oauth-app/OAuthAppDetailPanel.js +5 -6
  309. package/oauth-app/OAuthAppDetailPanel.js.map +1 -1
  310. package/organization/CreateOrganizationForm.d.ts.map +1 -1
  311. package/organization/CreateOrganizationForm.js +5 -9
  312. package/organization/CreateOrganizationForm.js.map +1 -1
  313. package/organization/OrgProfilePanel.d.ts.map +1 -1
  314. package/organization/OrgProfilePanel.js +7 -16
  315. package/organization/OrgProfilePanel.js.map +1 -1
  316. package/package.json +4 -4
  317. package/platform-client/CreatePlatformClientForm.d.ts.map +1 -1
  318. package/platform-client/CreatePlatformClientForm.js +5 -6
  319. package/platform-client/CreatePlatformClientForm.js.map +1 -1
  320. package/platform-client/PlatformClientDetailPanel.d.ts.map +1 -1
  321. package/platform-client/PlatformClientDetailPanel.js +6 -7
  322. package/platform-client/PlatformClientDetailPanel.js.map +1 -1
  323. package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
  324. package/platform-client/PlatformClientListPanel.js +2 -4
  325. package/platform-client/PlatformClientListPanel.js.map +1 -1
  326. package/platform-client/PlatformClientSecretAlert.d.ts.map +1 -1
  327. package/platform-client/PlatformClientSecretAlert.js +18 -25
  328. package/platform-client/PlatformClientSecretAlert.js.map +1 -1
  329. package/provider.d.ts +34 -1
  330. package/provider.d.ts.map +1 -1
  331. package/provider.js +14 -7
  332. package/provider.js.map +1 -1
  333. package/resource-creation/WizardNav.d.ts.map +1 -1
  334. package/resource-creation/WizardNav.js +2 -4
  335. package/resource-creation/WizardNav.js.map +1 -1
  336. package/resource-detail/ConfirmDialog.d.ts +2 -3
  337. package/resource-detail/ConfirmDialog.d.ts.map +1 -1
  338. package/resource-detail/ConfirmDialog.js +8 -20
  339. package/resource-detail/ConfirmDialog.js.map +1 -1
  340. package/resource-detail/useCopyResource.d.ts +4 -3
  341. package/resource-detail/useCopyResource.d.ts.map +1 -1
  342. package/resource-detail/useCopyResource.js +10 -19
  343. package/resource-detail/useCopyResource.js.map +1 -1
  344. package/schedule/ScheduleDetailView.d.ts.map +1 -1
  345. package/schedule/ScheduleDetailView.js +2 -4
  346. package/schedule/ScheduleDetailView.js.map +1 -1
  347. package/schedule/ScheduleForm.d.ts.map +1 -1
  348. package/schedule/ScheduleForm.js +6 -7
  349. package/schedule/ScheduleForm.js.map +1 -1
  350. package/session/NewSessionViewer.d.ts +52 -2
  351. package/session/NewSessionViewer.d.ts.map +1 -1
  352. package/session/NewSessionViewer.js +21 -6
  353. package/session/NewSessionViewer.js.map +1 -1
  354. package/session/SessionViewer.d.ts +63 -2
  355. package/session/SessionViewer.d.ts.map +1 -1
  356. package/session/SessionViewer.js +43 -17
  357. package/session/SessionViewer.js.map +1 -1
  358. package/session/audience.d.ts +17 -0
  359. package/session/audience.d.ts.map +1 -1
  360. package/session/index.d.ts +2 -1
  361. package/session/index.d.ts.map +1 -1
  362. package/session/index.js.map +1 -1
  363. package/session/run-config.d.ts +50 -0
  364. package/session/run-config.d.ts.map +1 -0
  365. package/session/run-config.js +15 -0
  366. package/session/run-config.js.map +1 -0
  367. package/session/useNewSessionFlow.d.ts +11 -0
  368. package/session/useNewSessionFlow.d.ts.map +1 -1
  369. package/session/useNewSessionFlow.js +29 -2
  370. package/session/useNewSessionFlow.js.map +1 -1
  371. package/session/useSessionConversation.d.ts +7 -7
  372. package/session/useSessionConversation.d.ts.map +1 -1
  373. package/session/useSessionConversation.js +2 -0
  374. package/session/useSessionConversation.js.map +1 -1
  375. package/session/useSessionPageFlow.d.ts +18 -4
  376. package/session/useSessionPageFlow.d.ts.map +1 -1
  377. package/session/useSessionPageFlow.js +33 -6
  378. package/session/useSessionPageFlow.js.map +1 -1
  379. package/session/useSessionPanel.d.ts +37 -2
  380. package/session/useSessionPanel.d.ts.map +1 -1
  381. package/session/useSessionPanel.js +44 -10
  382. package/session/useSessionPanel.js.map +1 -1
  383. package/settings/ApiKeysSection.d.ts.map +1 -1
  384. package/settings/ApiKeysSection.js +3 -2
  385. package/settings/ApiKeysSection.js.map +1 -1
  386. package/settings/ChannelAppsSection.d.ts.map +1 -1
  387. package/settings/ChannelAppsSection.js +3 -2
  388. package/settings/ChannelAppsSection.js.map +1 -1
  389. package/settings/EnvironmentsSection.js +5 -3
  390. package/settings/EnvironmentsSection.js.map +1 -1
  391. package/settings/IdentityProvidersSection.d.ts.map +1 -1
  392. package/settings/IdentityProvidersSection.js +3 -2
  393. package/settings/IdentityProvidersSection.js.map +1 -1
  394. package/settings/InvitationsSection.d.ts.map +1 -1
  395. package/settings/InvitationsSection.js +3 -1
  396. package/settings/InvitationsSection.js.map +1 -1
  397. package/settings/MembersSection.d.ts.map +1 -1
  398. package/settings/MembersSection.js +3 -1
  399. package/settings/MembersSection.js.map +1 -1
  400. package/settings/OAuthAppsSection.d.ts.map +1 -1
  401. package/settings/OAuthAppsSection.js +3 -2
  402. package/settings/OAuthAppsSection.js.map +1 -1
  403. package/settings/OrgProfileSection.d.ts.map +1 -1
  404. package/settings/OrgProfileSection.js +3 -2
  405. package/settings/OrgProfileSection.js.map +1 -1
  406. package/settings/PlatformClientsSection.d.ts.map +1 -1
  407. package/settings/PlatformClientsSection.js +3 -2
  408. package/settings/PlatformClientsSection.js.map +1 -1
  409. package/settings/UsageSection.d.ts.map +1 -1
  410. package/settings/UsageSection.js +3 -1
  411. package/settings/UsageSection.js.map +1 -1
  412. package/sharing/ShareAgentDialog.d.ts.map +1 -1
  413. package/sharing/ShareAgentDialog.js +19 -26
  414. package/sharing/ShareAgentDialog.js.map +1 -1
  415. package/sidebar/chrome.d.ts +3 -4
  416. package/sidebar/chrome.d.ts.map +1 -1
  417. package/sidebar/chrome.js +5 -4
  418. package/sidebar/chrome.js.map +1 -1
  419. package/skill/SkillDiffDialog.d.ts.map +1 -1
  420. package/skill/SkillDiffDialog.js +5 -21
  421. package/skill/SkillDiffDialog.js.map +1 -1
  422. package/src/access/ManageAccessDialog.tsx +14 -28
  423. package/src/activity/format-relative-time.ts +11 -9
  424. package/src/agent/steps/CapabilitiesStep.tsx +6 -3
  425. package/src/agent/steps/IdentityStep.tsx +19 -12
  426. package/src/agent-instance/CreateAgentInstanceDialog.tsx +29 -33
  427. package/src/api-key/ApiKeyCreatedAlert.tsx +10 -19
  428. package/src/api-key/ApiKeyListPanel.tsx +3 -39
  429. package/src/api-key/CreateApiKeyForm.tsx +12 -26
  430. package/src/approval-defaults-context.ts +56 -0
  431. package/src/attachment/AttachmentImageLightbox.tsx +13 -36
  432. package/src/attachment/__tests__/vision-preflight.test.ts +311 -0
  433. package/src/attachment/index.ts +12 -0
  434. package/src/attachment/vision-preflight.ts +236 -0
  435. package/src/billing/AutoRechargeCard.tsx +5 -4
  436. package/src/billing/BillingSection.tsx +4 -3
  437. package/src/channel/ChannelConversationsDialog.tsx +14 -29
  438. package/src/channel/ChannelCredentialsDialog.tsx +19 -29
  439. package/src/channel/ChannelTemplatesDialog.tsx +16 -31
  440. package/src/channel/ConnectSlackDialog.tsx +19 -31
  441. package/src/channel/ConnectWhatsAppDialog.tsx +19 -31
  442. package/src/channel/useChannelSessions.ts +3 -0
  443. package/src/channel-app/ChannelAppDetailPanel.tsx +15 -12
  444. package/src/channel-app/CreateChannelAppForm.tsx +17 -12
  445. package/src/channel-app/internal.tsx +5 -25
  446. package/src/composer/ComposerToolbar.tsx +1 -1
  447. package/src/composer/SessionComposer.tsx +160 -13
  448. package/src/composer/__tests__/SessionComposer-modelCoherence.test.tsx +220 -0
  449. package/src/composer/__tests__/SessionComposer-visionPreflight.test.tsx +222 -0
  450. package/src/composer/icons.tsx +0 -18
  451. package/src/conversation/ConversationAttentionBanner.tsx +64 -19
  452. package/src/conversation/ConversationComposer.tsx +1 -1
  453. package/src/conversation/ConversationListPane.tsx +46 -20
  454. package/src/conversation/ConversationsWorkbench.tsx +1 -0
  455. package/src/conversation/__tests__/ConversationAttentionBanner.test.tsx +76 -2
  456. package/src/conversation/__tests__/ConversationListPane.test.tsx +15 -4
  457. package/src/cursor-accounts/MemberCoverageTable.tsx +3 -14
  458. package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +2 -10
  459. package/src/dashboard/DashboardFailedRuns.tsx +2 -12
  460. package/src/environment/CreateEnvironmentForm.tsx +8 -27
  461. package/src/environment/EnvVarForm.tsx +2 -18
  462. package/src/environment/EnvironmentVariableEditor.tsx +5 -21
  463. package/src/execution/ApprovalCard.tsx +23 -2
  464. package/src/execution/ArtifactApplyButton.tsx +2 -17
  465. package/src/execution/ArtifactPreviewModal.tsx +15 -27
  466. package/src/execution/ExecutionErrorNotice.tsx +99 -0
  467. package/src/execution/FilePathLink.tsx +5 -9
  468. package/src/execution/FileReviewCard.tsx +1 -20
  469. package/src/execution/FollowUpInput.tsx +1 -16
  470. package/src/execution/LivenessStatusLine.tsx +59 -0
  471. package/src/execution/MessageEntry.tsx +136 -25
  472. package/src/execution/MessageThread.tsx +84 -83
  473. package/src/execution/SetupProgress.tsx +5 -1
  474. package/src/execution/SubAgentSection.tsx +9 -20
  475. package/src/execution/TerminalSession.tsx +97 -10
  476. package/src/execution/ToolCallDetail.tsx +19 -0
  477. package/src/execution/ToolCallItem.tsx +175 -44
  478. package/src/execution/ToolRunGroup.tsx +30 -32
  479. package/src/execution/WriteBackCard.tsx +5 -24
  480. package/src/execution/__tests__/MessageEntry-copy.test.tsx +125 -0
  481. package/src/execution/__tests__/MessageThread.test.tsx +97 -0
  482. package/src/execution/__tests__/TerminalSession.test.tsx +71 -1
  483. package/src/execution/__tests__/ToolCallDetail.test.tsx +33 -1
  484. package/src/execution/__tests__/ToolCallItem.test.tsx +299 -11
  485. package/src/execution/__tests__/ToolRunGroup.test.tsx +41 -9
  486. package/src/execution/__tests__/intent-title.test.tsx +221 -0
  487. package/src/execution/__tests__/message-thread-slots.test.tsx +92 -0
  488. package/src/execution/__tests__/tool-presenter.test.tsx +41 -4
  489. package/src/execution/index.ts +11 -2
  490. package/src/execution/tool-categories.ts +195 -9
  491. package/src/execution/tool-presenter.ts +44 -2
  492. package/src/execution/useArtifactInspection.ts +4 -8
  493. package/src/iam-policy/GrantAccessForm.tsx +2 -18
  494. package/src/iam-policy/OrgMembersPanel.tsx +3 -19
  495. package/src/iam-policy/RoleSelector.tsx +8 -1
  496. package/src/identity-provider/CreateIdentityProviderForm.tsx +13 -31
  497. package/src/identity-provider/IdentityProviderDetailPanel.tsx +24 -49
  498. package/src/identity-provider/IdentityProviderListPanel.tsx +2 -18
  499. package/src/identity-provider/IdentityProviderWizard.tsx +15 -32
  500. package/src/identity-provider/SsoLoginPrompt.tsx +6 -21
  501. package/src/index.ts +26 -1
  502. package/src/internal/DecisionButton.tsx +1 -20
  503. package/src/internal/DialogShell.tsx +169 -0
  504. package/src/internal/SpinnerIcon.tsx +42 -0
  505. package/src/internal/__tests__/DialogShell.test.tsx +223 -0
  506. package/src/internal/__tests__/ThreadCardShell.test.tsx +43 -7
  507. package/src/internal/__tests__/useCopyFeedback.test.ts +92 -0
  508. package/src/internal/select-element-text.ts +17 -0
  509. package/src/internal/thread-card/ThreadCardShell.tsx +53 -21
  510. package/src/internal/thread-card/glyphs.tsx +24 -3
  511. package/src/internal/thread-card/index.ts +1 -0
  512. package/src/internal/useCopyFeedback.ts +61 -0
  513. package/src/invitation/InvitationCreatedAlert.tsx +10 -18
  514. package/src/invitation/InvitationManager.tsx +23 -34
  515. package/src/invitation/InvitationRedemption.tsx +2 -18
  516. package/src/library/useExportResource.ts +15 -29
  517. package/src/manifest/ApplyManifestDialog.tsx +8 -26
  518. package/src/manifest/EditResourceYamlDialog.tsx +4 -31
  519. package/src/mcp-server/DefinitionDriftNotice.tsx +120 -0
  520. package/src/mcp-server/McpServerConnectDialog.tsx +15 -29
  521. package/src/mcp-server/McpServerDetailView.tsx +69 -49
  522. package/src/mcp-server/OAuthAppForm.tsx +2 -18
  523. package/src/mcp-server/__tests__/DefinitionDriftNotice.test.tsx +57 -0
  524. package/src/mcp-server/__tests__/definitionDrift.test.ts +245 -0
  525. package/src/mcp-server/__tests__/mcpServerToInput.test.ts +201 -0
  526. package/src/mcp-server/__tests__/useMcpServerDefinitionDrift.test.tsx +173 -0
  527. package/src/mcp-server/internal/definitionDrift.ts +158 -0
  528. package/src/mcp-server/internal/mcpServerToInput.ts +3 -0
  529. package/src/mcp-server/steps/EnvironmentAuthStep.tsx +19 -19
  530. package/src/mcp-server/steps/IdentityTransportStep.tsx +24 -23
  531. package/src/mcp-server/useMcpServerConnect.ts +1 -1
  532. package/src/mcp-server/useMcpServerDefinitionDrift.ts +95 -0
  533. package/src/models/ModelRegistryContext.ts +7 -1
  534. package/src/models/ModelSelector.tsx +37 -0
  535. package/src/models/__tests__/ModelSelector-visionIndicator.test.tsx +129 -0
  536. package/src/models/__tests__/resolveDefaultModel.test.ts +115 -0
  537. package/src/models/__tests__/useModelRegistry.test.tsx +99 -4
  538. package/src/models/index.ts +2 -2
  539. package/src/models/registry.ts +196 -29
  540. package/src/models/useModelRegistry.ts +10 -2
  541. package/src/oauth-app/CreateOAuthAppForm.tsx +16 -31
  542. package/src/oauth-app/OAuthAppDetailPanel.tsx +16 -31
  543. package/src/organization/CreateOrganizationForm.tsx +10 -29
  544. package/src/organization/OrgProfilePanel.tsx +13 -44
  545. package/src/platform-client/CreatePlatformClientForm.tsx +9 -29
  546. package/src/platform-client/PlatformClientDetailPanel.tsx +10 -30
  547. package/src/platform-client/PlatformClientListPanel.tsx +2 -18
  548. package/src/platform-client/PlatformClientSecretAlert.tsx +26 -55
  549. package/src/provider.tsx +76 -33
  550. package/src/resource-creation/WizardNav.tsx +2 -18
  551. package/src/resource-detail/ConfirmDialog.tsx +9 -30
  552. package/src/resource-detail/useCopyResource.ts +17 -23
  553. package/src/schedule/ScheduleDetailView.tsx +2 -18
  554. package/src/schedule/ScheduleForm.tsx +19 -34
  555. package/src/session/NewSessionViewer.tsx +85 -7
  556. package/src/session/SessionViewer.tsx +120 -17
  557. package/src/session/__tests__/audienceWiring.test.tsx +76 -0
  558. package/src/session/__tests__/panelNegotiation.test.tsx +302 -0
  559. package/src/session/__tests__/useNewSessionFlow.test.tsx +134 -5
  560. package/src/session/__tests__/useSessionPageFlow.autoApprove.test.tsx +74 -0
  561. package/src/session/__tests__/useSessionPageFlow.runConfig.test.tsx +157 -0
  562. package/src/session/__tests__/useSessionPanel.test.ts +114 -0
  563. package/src/session/audience.ts +18 -0
  564. package/src/session/index.ts +2 -1
  565. package/src/session/run-config.ts +59 -0
  566. package/src/session/useNewSessionFlow.ts +39 -2
  567. package/src/session/useSessionConversation.ts +10 -8
  568. package/src/session/useSessionPageFlow.ts +51 -10
  569. package/src/session/useSessionPanel.ts +91 -10
  570. package/src/settings/ApiKeysSection.tsx +4 -3
  571. package/src/settings/ChannelAppsSection.tsx +4 -3
  572. package/src/settings/EnvironmentsSection.tsx +8 -5
  573. package/src/settings/IdentityProvidersSection.tsx +4 -3
  574. package/src/settings/InvitationsSection.tsx +4 -2
  575. package/src/settings/MembersSection.tsx +4 -2
  576. package/src/settings/OAuthAppsSection.tsx +4 -3
  577. package/src/settings/OrgProfileSection.tsx +4 -3
  578. package/src/settings/PlatformClientsSection.tsx +4 -3
  579. package/src/settings/UsageSection.tsx +4 -2
  580. package/src/sharing/ShareAgentDialog.tsx +33 -37
  581. package/src/sidebar/__tests__/WorkspaceSidebar.test.tsx +4 -1
  582. package/src/sidebar/chrome.tsx +6 -6
  583. package/src/skill/SkillDiffDialog.tsx +13 -36
  584. package/src/styles.css +43 -0
  585. package/src/version-history/VersionTimelineEntry.tsx +1 -21
  586. package/src/workflow/FailedRunsWidget.tsx +2 -9
  587. package/src/workflow/PendingApprovalsWidget.tsx +2 -9
  588. package/src/workflow/ViewYamlDialog.tsx +21 -55
  589. package/src/workflow/WorkflowArchitectDialog.tsx +17 -68
  590. package/src/workflow/WorkflowArtifactDocument.tsx +5 -9
  591. package/src/workflow/WorkflowCanvasEditor.tsx +2 -0
  592. package/src/workflow/WorkflowCanvasInner.tsx +14 -1
  593. package/src/workflow/WorkflowDiffGraph.tsx +7 -1
  594. package/src/workflow/WorkflowExecutionViewer.tsx +88 -11
  595. package/src/workflow/WorkflowExplainDialog.tsx +18 -60
  596. package/src/workflow/WorkflowGraphFullscreenDialog.tsx +14 -26
  597. package/src/workflow/WorkflowOverviewGraph.tsx +9 -1
  598. package/src/workflow/WorkflowRefinePanel.tsx +2 -18
  599. package/src/workflow/WorkflowRepairCard.tsx +2 -18
  600. package/src/workflow/WorkflowRunDialog.tsx +23 -70
  601. package/src/workflow/WorkflowTaskApprovalSummary.tsx +2 -17
  602. package/src/workflow/WorkflowVersionBadge.tsx +4 -13
  603. package/src/workflow/WorkflowVersionTimeline.tsx +1 -25
  604. package/src/workflow/__tests__/panelNegotiation.test.tsx +230 -0
  605. package/src/workflow/__tests__/useWorkflowCanvas.dirty.test.tsx +178 -0
  606. package/src/workflow/__tests__/useWorkflowCanvas.drag.test.tsx +224 -0
  607. package/src/workflow/__tests__/useWorkflowExecutionPanel.test.ts +100 -0
  608. package/src/workflow/execution-comparison/ExecutionComparisonPicker.tsx +20 -41
  609. package/src/workflow/execution-history/ExecutionHistoryTable.tsx +1 -25
  610. package/src/workflow/index.ts +1 -0
  611. package/src/workflow/instance/CreateWorkflowInstanceDialog.tsx +14 -27
  612. package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +2 -1
  613. package/src/workflow/picker/BranchAddPopover.tsx +4 -3
  614. package/src/workflow/templates/WorkflowTemplatePreview.tsx +18 -28
  615. package/src/workflow/useApprovalBoundary.ts +1 -1
  616. package/src/workflow/useWorkflowCanvas.ts +114 -11
  617. package/src/workflow/useWorkflowExecutionPanel.ts +95 -13
  618. package/styles.css +1 -1
  619. package/version-history/VersionTimelineEntry.d.ts.map +1 -1
  620. package/version-history/VersionTimelineEntry.js +1 -23
  621. package/version-history/VersionTimelineEntry.js.map +1 -1
  622. package/workflow/CanvasTransitionEdge.d.ts +1 -1
  623. package/workflow/FailedRunsWidget.d.ts.map +1 -1
  624. package/workflow/FailedRunsWidget.js +2 -11
  625. package/workflow/FailedRunsWidget.js.map +1 -1
  626. package/workflow/PendingApprovalsWidget.d.ts.map +1 -1
  627. package/workflow/PendingApprovalsWidget.js +2 -11
  628. package/workflow/PendingApprovalsWidget.js.map +1 -1
  629. package/workflow/ViewYamlDialog.d.ts.map +1 -1
  630. package/workflow/ViewYamlDialog.js +14 -49
  631. package/workflow/ViewYamlDialog.js.map +1 -1
  632. package/workflow/WorkflowArchitectDialog.d.ts.map +1 -1
  633. package/workflow/WorkflowArchitectDialog.js +10 -33
  634. package/workflow/WorkflowArchitectDialog.js.map +1 -1
  635. package/workflow/WorkflowArtifactDocument.d.ts.map +1 -1
  636. package/workflow/WorkflowArtifactDocument.js +5 -8
  637. package/workflow/WorkflowArtifactDocument.js.map +1 -1
  638. package/workflow/WorkflowCanvasEditor.d.ts.map +1 -1
  639. package/workflow/WorkflowCanvasEditor.js +1 -1
  640. package/workflow/WorkflowCanvasEditor.js.map +1 -1
  641. package/workflow/WorkflowCanvasInner.d.ts +4 -2
  642. package/workflow/WorkflowCanvasInner.d.ts.map +1 -1
  643. package/workflow/WorkflowCanvasInner.js +7 -3
  644. package/workflow/WorkflowCanvasInner.js.map +1 -1
  645. package/workflow/WorkflowDiffGraph.js +6 -2
  646. package/workflow/WorkflowDiffGraph.js.map +1 -1
  647. package/workflow/WorkflowExecutionViewer.d.ts +51 -0
  648. package/workflow/WorkflowExecutionViewer.d.ts.map +1 -1
  649. package/workflow/WorkflowExecutionViewer.js +23 -6
  650. package/workflow/WorkflowExecutionViewer.js.map +1 -1
  651. package/workflow/WorkflowExplainDialog.d.ts.map +1 -1
  652. package/workflow/WorkflowExplainDialog.js +10 -28
  653. package/workflow/WorkflowExplainDialog.js.map +1 -1
  654. package/workflow/WorkflowGraphFullscreenDialog.d.ts.map +1 -1
  655. package/workflow/WorkflowGraphFullscreenDialog.js +11 -17
  656. package/workflow/WorkflowGraphFullscreenDialog.js.map +1 -1
  657. package/workflow/WorkflowOverviewGraph.js +8 -2
  658. package/workflow/WorkflowOverviewGraph.js.map +1 -1
  659. package/workflow/WorkflowRefinePanel.d.ts.map +1 -1
  660. package/workflow/WorkflowRefinePanel.js +2 -4
  661. package/workflow/WorkflowRefinePanel.js.map +1 -1
  662. package/workflow/WorkflowRepairCard.d.ts.map +1 -1
  663. package/workflow/WorkflowRepairCard.js +2 -4
  664. package/workflow/WorkflowRepairCard.js.map +1 -1
  665. package/workflow/WorkflowRunDialog.d.ts.map +1 -1
  666. package/workflow/WorkflowRunDialog.js +14 -35
  667. package/workflow/WorkflowRunDialog.js.map +1 -1
  668. package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
  669. package/workflow/WorkflowTaskApprovalSummary.js +2 -4
  670. package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
  671. package/workflow/WorkflowVersionBadge.d.ts.map +1 -1
  672. package/workflow/WorkflowVersionBadge.js +4 -13
  673. package/workflow/WorkflowVersionBadge.js.map +1 -1
  674. package/workflow/WorkflowVersionTimeline.d.ts.map +1 -1
  675. package/workflow/WorkflowVersionTimeline.js +1 -26
  676. package/workflow/WorkflowVersionTimeline.js.map +1 -1
  677. package/workflow/execution-comparison/ExecutionComparisonPicker.d.ts.map +1 -1
  678. package/workflow/execution-comparison/ExecutionComparisonPicker.js +14 -40
  679. package/workflow/execution-comparison/ExecutionComparisonPicker.js.map +1 -1
  680. package/workflow/execution-history/ExecutionHistoryTable.d.ts.map +1 -1
  681. package/workflow/execution-history/ExecutionHistoryTable.js +1 -24
  682. package/workflow/execution-history/ExecutionHistoryTable.js.map +1 -1
  683. package/workflow/index.d.ts +1 -1
  684. package/workflow/index.d.ts.map +1 -1
  685. package/workflow/index.js.map +1 -1
  686. package/workflow/instance/CreateWorkflowInstanceDialog.d.ts.map +1 -1
  687. package/workflow/instance/CreateWorkflowInstanceDialog.js +7 -20
  688. package/workflow/instance/CreateWorkflowInstanceDialog.js.map +1 -1
  689. package/workflow/instance/WorkflowInstanceDetailPanel.d.ts.map +1 -1
  690. package/workflow/instance/WorkflowInstanceDetailPanel.js +1 -1
  691. package/workflow/instance/WorkflowInstanceDetailPanel.js.map +1 -1
  692. package/workflow/picker/BranchAddPopover.d.ts.map +1 -1
  693. package/workflow/picker/BranchAddPopover.js +3 -2
  694. package/workflow/picker/BranchAddPopover.js.map +1 -1
  695. package/workflow/templates/WorkflowTemplatePreview.d.ts +1 -1
  696. package/workflow/templates/WorkflowTemplatePreview.d.ts.map +1 -1
  697. package/workflow/templates/WorkflowTemplatePreview.js +10 -22
  698. package/workflow/templates/WorkflowTemplatePreview.js.map +1 -1
  699. package/workflow/useApprovalBoundary.d.ts +1 -1
  700. package/workflow/useApprovalBoundary.js +1 -1
  701. package/workflow/useWorkflowCanvas.d.ts +5 -1
  702. package/workflow/useWorkflowCanvas.d.ts.map +1 -1
  703. package/workflow/useWorkflowCanvas.js +99 -13
  704. package/workflow/useWorkflowCanvas.js.map +1 -1
  705. package/workflow/useWorkflowExecutionPanel.d.ts +38 -2
  706. package/workflow/useWorkflowExecutionPanel.d.ts.map +1 -1
  707. package/workflow/useWorkflowExecutionPanel.js +46 -13
  708. package/workflow/useWorkflowExecutionPanel.js.map +1 -1
@@ -58,6 +58,37 @@ export interface UseSessionPanelOptions {
58
58
  * @default "files"
59
59
  */
60
60
  readonly defaultView?: string;
61
+ /**
62
+ * Controlled open state. When provided, the host owns whether the panel is
63
+ * expanded: internal open intents (the chip toggle, a file/artifact/plan
64
+ * open, plan auto-open) no longer flip state themselves — they surface
65
+ * through {@link UseSessionPanelOptions.onOpenChange} and the panel follows
66
+ * this value. Leave `undefined` for the self-managing default.
67
+ */
68
+ readonly open?: boolean;
69
+ /**
70
+ * Initial open state in uncontrolled mode. Ignored when
71
+ * {@link UseSessionPanelOptions.open} is provided.
72
+ *
73
+ * @default false
74
+ */
75
+ readonly defaultOpen?: boolean;
76
+ /**
77
+ * Called on every effective open/close transition — in BOTH modes, unlike
78
+ * `useDetailTabs`'s DD-T05A-001 convention of swallowing the callback when
79
+ * uncontrolled. The difference is principled, not stylistic: tabs change
80
+ * only through user clicks, so an uncontrolled host loses nothing by not
81
+ * hearing about them — but this panel opens ITSELF (`openFile`,
82
+ * `openArtifact`, `openPlanDocument`, and the plan-key auto-open all expand
83
+ * a collapsed panel), and an embedding host that must react to those
84
+ * moments (widen a dock, make room for a streaming plan) has no other seam.
85
+ * Passing only this callback observes the panel without controlling it.
86
+ *
87
+ * In controlled mode this fires once per open/close REQUEST (the host may
88
+ * decline by not updating `open` — a later identical request re-fires); in
89
+ * uncontrolled mode it fires once per actual transition.
90
+ */
91
+ readonly onOpenChange?: (open: boolean) => void;
61
92
  }
62
93
 
63
94
  /**
@@ -81,7 +112,11 @@ export interface UseSessionPanelOptions {
81
112
  export interface SessionPanelController {
82
113
  /** The open-editor group store; subscribe with `useWorkspaceEditors`. */
83
114
  readonly editorsStore: WorkspaceEditorsStore;
84
- /** Whether the panel is expanded (chat narrow) or collapsed to the chip. */
115
+ /**
116
+ * Whether the panel is expanded (chat narrow) or collapsed to the chip.
117
+ * In controlled mode ({@link UseSessionPanelOptions.open}) this mirrors
118
+ * the host's value.
119
+ */
85
120
  readonly isOpen: boolean;
86
121
  /** The active rail view id (`"files"`, `"search"`, or an injected facet). */
87
122
  readonly view: string;
@@ -149,9 +184,49 @@ export function useSessionPanel({
149
184
  hasChanges,
150
185
  planKey = null,
151
186
  defaultView = "files",
187
+ open,
188
+ defaultOpen = false,
189
+ onOpenChange,
152
190
  }: UseSessionPanelOptions): SessionPanelController {
153
191
  const editorsStore = useWorkspaceEditorsStoreRef();
154
- const [isOpen, setIsOpen] = useState(false);
192
+
193
+ // Uncontrolled-by-default / controlled-when-`open`-is-provided (React's own
194
+ // value/defaultValue convention — presence of the value prop decides, so an
195
+ // observe-only host can pass just `onOpenChange`). Everything below reads
196
+ // the EFFECTIVE value: the render-adjust triggers (first write-back) and
197
+ // the returned controller must agree with the host's state, never a stale
198
+ // internal one.
199
+ const isControlled = open !== undefined;
200
+ const [internalIsOpen, setInternalIsOpen] = useState(defaultOpen);
201
+ const isOpen = isControlled ? open : internalIsOpen;
202
+
203
+ // Latest-ref idiom (see YamlEditor's onChangeRef): the host's callback and
204
+ // the mode/value mirrors live in refs so `requestOpenChange` — and every
205
+ // action callback built on it — stays referentially stable regardless of
206
+ // how the host authored `onOpenChange` (DD-010: an inline lambda must not
207
+ // churn the memoized controller and re-render the panel subtree).
208
+ const onOpenChangeRef = useRef(onOpenChange);
209
+ onOpenChangeRef.current = onOpenChange;
210
+ const isControlledRef = useRef(isControlled);
211
+ isControlledRef.current = isControlled;
212
+ const isOpenRef = useRef(isOpen);
213
+ isOpenRef.current = isOpen;
214
+
215
+ // The single seam every open/close intent routes through — the chip
216
+ // toggle, file/artifact/plan opens, the surface's collapse affordance, and
217
+ // the plan-key auto-open. Uncontrolled: apply + notify (the ref is updated
218
+ // eagerly so two same-tick intents produce one notification). Controlled:
219
+ // notify only — the host owns the state, and the panel follows the `open`
220
+ // prop; the ref is NOT updated, so a declined request stays re-fireable.
221
+ const requestOpenChange = useCallback((next: boolean) => {
222
+ if (isOpenRef.current === next) return;
223
+ if (!isControlledRef.current) {
224
+ isOpenRef.current = next;
225
+ setInternalIsOpen(next);
226
+ }
227
+ onOpenChangeRef.current?.(next);
228
+ }, []);
229
+
155
230
  const [view, setViewState] = useState(defaultView);
156
231
 
157
232
  // Sticky explicit pick (rail click) — auto-switching yields to it until a
@@ -184,8 +259,8 @@ export function useSessionPanel({
184
259
 
185
260
  const openPlanDocument = useCallback(() => {
186
261
  editorsStore.openPinned(PLAN_DOCUMENT_ENTRY_ID, PLAN_DOCUMENT_PATH);
187
- setIsOpen(true);
188
- }, [editorsStore]);
262
+ requestOpenChange(true);
263
+ }, [editorsStore, requestOpenChange]);
189
264
 
190
265
  // A new plan arrived (first plan, or a refinement superseding it) → open the
191
266
  // plan document tab, expanding a collapsed panel (see the planKey option doc
@@ -204,9 +279,15 @@ export function useSessionPanel({
204
279
  }
205
280
  }, [planKey, openPlanDocument]);
206
281
 
207
- const openPanel = useCallback(() => setIsOpen(true), []);
282
+ const openPanel = useCallback(
283
+ () => requestOpenChange(true),
284
+ [requestOpenChange],
285
+ );
208
286
 
209
- const closePanel = useCallback(() => setIsOpen(false), []);
287
+ const closePanel = useCallback(
288
+ () => requestOpenChange(false),
289
+ [requestOpenChange],
290
+ );
210
291
 
211
292
  const setView = useCallback((viewId: string) => {
212
293
  userPickedViewRef.current = true;
@@ -216,17 +297,17 @@ export function useSessionPanel({
216
297
  const openFile = useCallback(
217
298
  (entryId: string, path: string, options?: OpenFileOptions) => {
218
299
  editorsStore.openPreview(entryId, path, options);
219
- setIsOpen(true);
300
+ requestOpenChange(true);
220
301
  },
221
- [editorsStore],
302
+ [editorsStore, requestOpenChange],
222
303
  );
223
304
 
224
305
  const openArtifact = useCallback(
225
306
  (artifact: ExecutionArtifact) => {
226
307
  editorsStore.openPreview(ARTIFACT_DOCUMENT_ENTRY_ID, artifactKey(artifact));
227
- setIsOpen(true);
308
+ requestOpenChange(true);
228
309
  },
229
- [editorsStore],
310
+ [editorsStore, requestOpenChange],
230
311
  );
231
312
 
232
313
  const pinArtifact = useCallback(
@@ -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 { ApiKey } from "@stigmer/protos/ai/stigmer/iam/apikey/v1/api_pb";
5
5
  import { ApiKeyListPanel } from "../api-key/ApiKeyListPanel.js";
6
6
  import { CreateApiKeyForm } from "../api-key/CreateApiKeyForm.js";
@@ -16,6 +16,7 @@ type FlowState =
16
16
 
17
17
  /** Settings section for listing and creating organization API keys. */
18
18
  export function ApiKeysSection() {
19
+ const headingId = useId();
19
20
  const org = useActiveOrgSlug();
20
21
  const apiKeysAvailable = useResourceAvailable(ApiResourceKind.api_key);
21
22
  const [flow, setFlow] = useState<FlowState>({ phase: "idle" });
@@ -37,10 +38,10 @@ export function ApiKeysSection() {
37
38
  }, []);
38
39
 
39
40
  return (
40
- <section aria-labelledby="api-keys-heading">
41
+ <section aria-labelledby={headingId}>
41
42
  <div className="stg:mb-3 stg:flex stg:items-center stg:justify-between">
42
43
  <h2
43
- id="api-keys-heading"
44
+ id={headingId}
44
45
  className="stg:text-foreground stg:text-sm stg:font-semibold"
45
46
  >
46
47
  API Keys
@@ -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 { ChannelApp } from "@stigmer/protos/ai/stigmer/agentic/channelapp/v1/api_pb";
5
5
  import { ChannelAppListPanel } from "../channel-app/ChannelAppListPanel.js";
6
6
  import {
@@ -38,6 +38,7 @@ type FlowState =
38
38
  * Channels tab offers it as the serving app.
39
39
  */
40
40
  export function ChannelAppsSection() {
41
+ const headingId = useId();
41
42
  const org = useActiveOrgSlug();
42
43
  // Channel installs (the consumer of these credentials) are cloud-only;
43
44
  // gate the whole section the way the Channels tab gates connects.
@@ -72,10 +73,10 @@ export function ChannelAppsSection() {
72
73
  }, []);
73
74
 
74
75
  return (
75
- <section aria-labelledby="channel-apps-heading">
76
+ <section aria-labelledby={headingId}>
76
77
  <div className="stg:mb-3 stg:flex stg:items-center stg:justify-between">
77
78
  <h2
78
- id="channel-apps-heading"
79
+ id={headingId}
79
80
  className="stg:text-foreground stg:text-sm stg:font-semibold"
80
81
  >
81
82
  Channel Apps
@@ -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 { getUserMessage } from "@stigmer/sdk";
5
5
  import { usePersonalEnvironment } from "../environment/usePersonalEnvironment.js";
6
6
  import { EnvironmentVariableEditor } from "../environment/EnvironmentVariableEditor.js";
@@ -47,12 +47,13 @@ function PersonalEnvironmentCard({ org }: { org: string }) {
47
47
  }, [org, isLoading, environment, getOrCreate]);
48
48
 
49
49
  const environmentId = environment?.metadata?.id;
50
+ const headingId = useId();
50
51
 
51
52
  return (
52
- <section aria-labelledby="personal-env-heading">
53
+ <section aria-labelledby={headingId}>
53
54
  <div className="stg:mb-3 stg:flex stg:items-baseline stg:gap-2">
54
55
  <h2
55
- id="personal-env-heading"
56
+ id={headingId}
56
57
  className="stg:text-foreground stg:text-sm stg:font-semibold"
57
58
  >
58
59
  Personal Environment
@@ -97,11 +98,13 @@ function EnvironmentsCard({ org }: { org: string }) {
97
98
  listRefetchRef.current?.();
98
99
  }, []);
99
100
 
101
+ const headingId = useId();
102
+
100
103
  return (
101
- <section aria-labelledby="org-env-heading">
104
+ <section aria-labelledby={headingId}>
102
105
  <div className="stg:mb-3 stg:flex stg:items-center stg:justify-between">
103
106
  <h2
104
- id="org-env-heading"
107
+ id={headingId}
105
108
  className="stg:text-foreground stg:text-sm stg:font-semibold"
106
109
  >
107
110
  Environments
@@ -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 { IdentityProvider } from "@stigmer/protos/ai/stigmer/iam/identityprovider/v1/api_pb";
5
5
  import { IdentityProviderListPanel } from "../identity-provider/IdentityProviderListPanel.js";
6
6
  import { IdentityProviderWizard } from "../identity-provider/IdentityProviderWizard.js";
@@ -28,6 +28,7 @@ type FlowState =
28
28
  export function IdentityProvidersSection({
29
29
  ssoLoginBaseUrl,
30
30
  }: IdentityProvidersSectionProps = {}) {
31
+ const headingId = useId();
31
32
  const { activeOrg } = useOrg();
32
33
  const idpAvailable = useResourceAvailable(ApiResourceKind.identity_provider);
33
34
  const orgSlug = activeOrg?.metadata?.slug ?? "";
@@ -54,10 +55,10 @@ export function IdentityProvidersSection({
54
55
  (typeof window !== "undefined" ? window.location.origin : "");
55
56
 
56
57
  return (
57
- <section aria-labelledby="identity-providers-heading">
58
+ <section aria-labelledby={headingId}>
58
59
  <div className="stg:mb-3 stg:flex stg:items-center stg:justify-between">
59
60
  <h2
60
- id="identity-providers-heading"
61
+ id={headingId}
61
62
  className="stg:text-foreground stg:text-sm stg:font-semibold"
62
63
  >
63
64
  Identity Providers
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
 
3
+ import { useId } from "react";
3
4
  import { InvitationManager } from "../invitation/InvitationManager.js";
4
5
  import { useResourceAvailable, ApiResourceKind } from "../deployment-mode.js";
5
6
  import { CloudFeatureNotice } from "../internal/CloudFeatureNotice.js";
@@ -7,14 +8,15 @@ import { useActiveOrgSlug } from "../organization/OrgProvider.js";
7
8
 
8
9
  /** Settings section for creating and managing organization invitations. */
9
10
  export function InvitationsSection() {
11
+ const headingId = useId();
10
12
  const org = useActiveOrgSlug();
11
13
  const invitationsAvailable = useResourceAvailable(ApiResourceKind.invitation);
12
14
 
13
15
  return (
14
- <section aria-labelledby="invitations-heading">
16
+ <section aria-labelledby={headingId}>
15
17
  <div className="stg:mb-3">
16
18
  <h2
17
- id="invitations-heading"
19
+ id={headingId}
18
20
  className="stg:text-foreground stg:text-sm stg:font-semibold"
19
21
  >
20
22
  Invitations
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
 
3
+ import { useId } from "react";
3
4
  import { OrgMembersPanel } from "../iam-policy/OrgMembersPanel.js";
4
5
  import { useResourceAvailable, ApiResourceKind } from "../deployment-mode.js";
5
6
  import { CloudFeatureNotice } from "../internal/CloudFeatureNotice.js";
@@ -8,6 +9,7 @@ import { useIdentityProviderList } from "../identity-provider/useIdentityProvide
8
9
 
9
10
  /** Settings section for organization membership and role management. */
10
11
  export function MembersSection() {
12
+ const headingId = useId();
11
13
  const { activeOrg } = useOrg();
12
14
  const membersAvailable = useResourceAvailable(ApiResourceKind.iam_policy);
13
15
  const idpAvailable = useResourceAvailable(ApiResourceKind.identity_provider);
@@ -23,9 +25,9 @@ export function MembersSection() {
23
25
  );
24
26
 
25
27
  return (
26
- <section aria-labelledby="members-heading">
28
+ <section aria-labelledby={headingId}>
27
29
  <h2
28
- id="members-heading"
30
+ id={headingId}
29
31
  className="stg:text-foreground stg:mb-1 stg:text-sm stg:font-semibold"
30
32
  >
31
33
  Members
@@ -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 { OAuthApp } from "@stigmer/protos/ai/stigmer/iam/oauthapp/v1/api_pb";
5
5
  import { OAuthAppListPanel } from "../oauth-app/OAuthAppListPanel.js";
6
6
  import { CreateOAuthAppForm } from "../oauth-app/CreateOAuthAppForm.js";
@@ -16,6 +16,7 @@ type FlowState =
16
16
 
17
17
  /** Settings section for organization OAuth app credentials. */
18
18
  export function OAuthAppsSection() {
19
+ const headingId = useId();
19
20
  const org = useActiveOrgSlug();
20
21
  const oauthAppsAvailable = useResourceAvailable(ApiResourceKind.oauth_app);
21
22
 
@@ -42,10 +43,10 @@ export function OAuthAppsSection() {
42
43
  }, []);
43
44
 
44
45
  return (
45
- <section aria-labelledby="oauth-apps-heading">
46
+ <section aria-labelledby={headingId}>
46
47
  <div className="stg:mb-3 stg:flex stg:items-center stg:justify-between">
47
48
  <h2
48
- id="oauth-apps-heading"
49
+ id={headingId}
49
50
  className="stg:text-foreground stg:text-sm stg:font-semibold"
50
51
  >
51
52
  OAuth Apps
@@ -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,7 +1,8 @@
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
+ import { DialogShell } from "../internal/DialogShell.js";
5
6
  import {
6
7
  MAX_ALLOWED_ORIGINS,
7
8
  StigmerError,
@@ -137,40 +138,23 @@ export function ShareAgentDialog({
137
138
  onSharingChanged,
138
139
  modal = true,
139
140
  }: ShareAgentDialogProps) {
140
- const dialogRef = useRef<HTMLDialogElement>(null);
141
+ // Instance-scoped title id (oss#593): a reusable component must not
142
+ // hardcode DOM ids — hosts legitimately mount this dialog more than once
143
+ // per page (e.g. zone-cached detail pages), and duplicate ids break the
144
+ // aria-labelledby association for every copy after the first.
145
+ const titleId = useId();
141
146
 
142
147
  const handleClose = useCallback(() => {
143
- dialogRef.current?.close();
144
148
  onOpenChange(false);
145
149
  }, [onOpenChange]);
146
150
 
147
- // Sync native dialog open state (matches the SDK dialog convention).
148
- // Non-modal hosts pass `open` as a plain attribute instead — the dialog
149
- // renders in-flow with no top layer to manage.
150
- const prevOpenRef = useRef(false);
151
- if (modal && open !== prevOpenRef.current) {
152
- prevOpenRef.current = open;
153
- if (open) {
154
- requestAnimationFrame(() => {
155
- if (dialogRef.current && !dialogRef.current.open) {
156
- dialogRef.current.showModal();
157
- }
158
- });
159
- } else if (dialogRef.current?.open) {
160
- dialogRef.current.close();
161
- }
162
- }
163
-
164
151
  return (
165
- <dialog
166
- ref={dialogRef}
167
- open={modal ? undefined : open}
168
- onClose={handleClose}
169
- className={cn(
170
- "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",
172
- )}
173
- aria-labelledby="share-agent-title"
152
+ <DialogShell
153
+ open={open}
154
+ onOpenChange={onOpenChange}
155
+ modal={modal}
156
+ width="lg"
157
+ aria-labelledby={titleId}
174
158
  >
175
159
  {/* Body mounts only while open so its draft state resets per
176
160
  session — reopening the dialog never shows a stale draft. */}
@@ -182,9 +166,10 @@ export function ShareAgentDialog({
182
166
  buildShareUrl={buildShareUrl}
183
167
  onSharingChanged={onSharingChanged}
184
168
  onClose={handleClose}
169
+ titleId={titleId}
185
170
  />
186
171
  )}
187
- </dialog>
172
+ </DialogShell>
188
173
  );
189
174
  }
190
175
 
@@ -207,6 +192,7 @@ function ShareAgentDialogBody({
207
192
  buildShareUrl,
208
193
  onSharingChanged,
209
194
  onClose,
195
+ titleId,
210
196
  }: {
211
197
  readonly agent: Agent;
212
198
  readonly share: AgentShare | null;
@@ -214,6 +200,8 @@ function ShareAgentDialogBody({
214
200
  readonly buildShareUrl?: (org: string, slug: string) => string;
215
201
  readonly onSharingChanged?: () => void;
216
202
  readonly onClose: () => void;
203
+ /** Heading id minted by the outer dialog for its aria-labelledby. */
204
+ readonly titleId: string;
217
205
  }) {
218
206
  const [created, setCreated] = useState<AgentShare | null>(null);
219
207
  const activeShare = share ?? created;
@@ -229,7 +217,7 @@ function ShareAgentDialogBody({
229
217
  <div className="stg:flex stg:items-start stg:justify-between stg:border-b stg:border-border stg:px-6 stg:py-4">
230
218
  <div className="stg:min-w-0">
231
219
  <h2
232
- id="share-agent-title"
220
+ id={titleId}
233
221
  className="stg:text-base stg:font-semibold stg:text-foreground"
234
222
  >
235
223
  {isCreating ? "Create share" : "Share"}
@@ -322,6 +310,11 @@ function CreateShareForm({
322
310
  const agentName = agent.metadata?.name || (agent.metadata?.slug ?? "");
323
311
  const isCrossOrg = shareOrg !== (agent.metadata?.org ?? "");
324
312
 
313
+ // Instance-scoped field ids (oss#593) — see the outer dialog's titleId.
314
+ const baseId = useId();
315
+ const nameId = `${baseId}-name`;
316
+ const slugId = `${baseId}-slug`;
317
+
325
318
  const [name, setName] = useState(agentName);
326
319
  const [slug, setSlug] = useState(agent.metadata?.slug ?? "");
327
320
  // Once the user manually edits the slug field, stop auto-deriving.
@@ -421,13 +414,13 @@ function CreateShareForm({
421
414
  {/* ---- Name ---- */}
422
415
  <div className="stg:space-y-1">
423
416
  <label
424
- htmlFor="stgm-new-share-name"
417
+ htmlFor={nameId}
425
418
  className="stg:text-xs stg:font-medium stg:text-foreground"
426
419
  >
427
420
  Name
428
421
  </label>
429
422
  <input
430
- id="stgm-new-share-name"
423
+ id={nameId}
431
424
  type="text"
432
425
  value={name}
433
426
  onChange={(e) => handleNameChange(e.target.value)}
@@ -457,13 +450,13 @@ function CreateShareForm({
457
450
  {/* ---- Slug ---- */}
458
451
  <div className="stg:space-y-1">
459
452
  <label
460
- htmlFor="stgm-new-share-slug"
453
+ htmlFor={slugId}
461
454
  className="stg:text-xs stg:font-medium stg:text-foreground"
462
455
  >
463
456
  Slug
464
457
  </label>
465
458
  <input
466
- id="stgm-new-share-slug"
459
+ id={slugId}
467
460
  type="text"
468
461
  value={slug}
469
462
  onChange={(e) => handleSlugChange(e.target.value)}
@@ -533,6 +526,9 @@ function ShareAgentForm({
533
526
  }) {
534
527
  const agentName = agent.metadata?.name || (agent.metadata?.slug ?? "");
535
528
 
529
+ // Instance-scoped label id (oss#593) — see the outer dialog's titleId.
530
+ const enabledLabelId = useId();
531
+
536
532
  // The latest server share is the single baseline: the draft, the link
537
533
  // token, and the share id for rotation all derive from it.
538
534
  const [share, setShare] = useState<AgentShare>(initialShare);
@@ -644,7 +640,7 @@ function ShareAgentForm({
644
640
  <div className="stg:flex stg:items-start stg:justify-between stg:gap-4">
645
641
  <div className="stg:min-w-0">
646
642
  <span
647
- id="share-enabled-label"
643
+ id={enabledLabelId}
648
644
  className="stg:text-sm stg:font-medium stg:text-foreground"
649
645
  >
650
646
  {isOrgAudience
@@ -657,7 +653,7 @@ function ShareAgentForm({
657
653
  checked={draft.enabled}
658
654
  onCheckedChange={handleToggle}
659
655
  disabled={isPending}
660
- aria-labelledby="share-enabled-label"
656
+ aria-labelledby={enabledLabelId}
661
657
  />
662
658
  </div>
663
659
  {!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",