@stigmer/react 3.41.0 → 3.41.1-dev.20261003133619.g58ac1f23a411

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 (510) hide show
  1. package/README.md +1 -1
  2. package/access/ManageAccessButton.d.ts +1 -1
  3. package/access/ManageAccessButton.js +1 -1
  4. package/access/ManageAccessDialog.js +1 -1
  5. package/access/ManageAccessDialog.js.map +1 -1
  6. package/agent/AgentDetailView.d.ts.map +1 -1
  7. package/agent/AgentDetailView.js +2 -1
  8. package/agent/AgentDetailView.js.map +1 -1
  9. package/api-key/ApiKeyListPanel.d.ts.map +1 -1
  10. package/api-key/ApiKeyListPanel.js +2 -1
  11. package/api-key/ApiKeyListPanel.js.map +1 -1
  12. package/attachment/AttachmentImageLightbox.d.ts.map +1 -1
  13. package/attachment/AttachmentImageLightbox.js.map +1 -1
  14. package/billing/AutoRechargeCard.d.ts +3 -3
  15. package/billing/AutoRechargeCard.d.ts.map +1 -1
  16. package/billing/AutoRechargeCard.js +4 -4
  17. package/billing/AutoRechargeCard.js.map +1 -1
  18. package/billing/BillingSection.d.ts.map +1 -1
  19. package/billing/BillingSection.js +7 -6
  20. package/billing/BillingSection.js.map +1 -1
  21. package/billing/CreditLedgerTable.d.ts +3 -3
  22. package/billing/CreditLedgerTable.d.ts.map +1 -1
  23. package/billing/CreditLedgerTable.js +3 -3
  24. package/billing/CreditLedgerTable.js.map +1 -1
  25. package/billing/CreditPackGrid.d.ts +1 -1
  26. package/billing/CreditPackGrid.js +1 -1
  27. package/billing/PaymentMethodCard.d.ts +1 -1
  28. package/billing/PaymentMethodCard.js +1 -1
  29. package/billing/PlanSection.d.ts +3 -3
  30. package/billing/PlanSection.d.ts.map +1 -1
  31. package/billing/PlanSection.js +4 -3
  32. package/billing/PlanSection.js.map +1 -1
  33. package/billing/ProviderKeysSection.js +13 -13
  34. package/billing/ProviderKeysSection.js.map +1 -1
  35. package/billing/plan-features.js +1 -1
  36. package/billing/plan-features.js.map +1 -1
  37. package/billing/useBillingAccount.d.ts +4 -4
  38. package/billing/useBillingAccount.d.ts.map +1 -1
  39. package/billing/useBillingAccount.js +7 -7
  40. package/billing/useBillingAccount.js.map +1 -1
  41. package/billing/useBillingUsageReport.d.ts +4 -4
  42. package/billing/useBillingUsageReport.d.ts.map +1 -1
  43. package/billing/useBillingUsageReport.js +7 -7
  44. package/billing/useBillingUsageReport.js.map +1 -1
  45. package/billing/useChangePlan.d.ts +2 -2
  46. package/billing/useChangePlan.d.ts.map +1 -1
  47. package/billing/useChangePlan.js +4 -4
  48. package/billing/useChangePlan.js.map +1 -1
  49. package/billing/useCreateBillingPortalSession.d.ts +2 -2
  50. package/billing/useCreateBillingPortalSession.d.ts.map +1 -1
  51. package/billing/useCreateBillingPortalSession.js +3 -3
  52. package/billing/useCreateBillingPortalSession.js.map +1 -1
  53. package/billing/useCreateCheckoutSession.d.ts +2 -2
  54. package/billing/useCreateCheckoutSession.d.ts.map +1 -1
  55. package/billing/useCreateCheckoutSession.js +2 -2
  56. package/billing/useCreateCheckoutSession.js.map +1 -1
  57. package/billing/useCreatePaymentMethodSetupSession.d.ts +1 -1
  58. package/billing/useCreatePaymentMethodSetupSession.d.ts.map +1 -1
  59. package/billing/useCreatePaymentMethodSetupSession.js +2 -2
  60. package/billing/useCreatePaymentMethodSetupSession.js.map +1 -1
  61. package/billing/useCreditLedger.d.ts +4 -4
  62. package/billing/useCreditLedger.d.ts.map +1 -1
  63. package/billing/useCreditLedger.js +7 -7
  64. package/billing/useCreditLedger.js.map +1 -1
  65. package/billing/useCustomerModelPricing.d.ts +4 -4
  66. package/billing/useCustomerModelPricing.d.ts.map +1 -1
  67. package/billing/useCustomerModelPricing.js +6 -6
  68. package/billing/useCustomerModelPricing.js.map +1 -1
  69. package/billing/useEntitlements.d.ts +2 -2
  70. package/billing/useEntitlements.d.ts.map +1 -1
  71. package/billing/useEntitlements.js +4 -4
  72. package/billing/useEntitlements.js.map +1 -1
  73. package/billing/usePeriodEstimate.d.ts +1 -1
  74. package/billing/usePeriodEstimate.d.ts.map +1 -1
  75. package/billing/usePeriodEstimate.js +3 -3
  76. package/billing/usePeriodEstimate.js.map +1 -1
  77. package/billing/useProviderKeys.d.ts +5 -5
  78. package/billing/useProviderKeys.d.ts.map +1 -1
  79. package/billing/useProviderKeys.js +7 -7
  80. package/billing/useProviderKeys.js.map +1 -1
  81. package/billing/useSetAutoRechargeConfig.d.ts +2 -2
  82. package/billing/useSetAutoRechargeConfig.d.ts.map +1 -1
  83. package/billing/useSetAutoRechargeConfig.js +2 -2
  84. package/billing/useSetAutoRechargeConfig.js.map +1 -1
  85. package/billing/useSubscription.d.ts +3 -3
  86. package/billing/useSubscription.d.ts.map +1 -1
  87. package/billing/useSubscription.js +7 -7
  88. package/billing/useSubscription.js.map +1 -1
  89. package/channel-app/ChannelAppListPanel.d.ts.map +1 -1
  90. package/channel-app/ChannelAppListPanel.js +2 -1
  91. package/channel-app/ChannelAppListPanel.js.map +1 -1
  92. package/channel-app/slackAppSetup.d.ts +0 -23
  93. package/channel-app/slackAppSetup.d.ts.map +1 -1
  94. package/channel-app/slackAppSetup.js +3 -2
  95. package/channel-app/slackAppSetup.js.map +1 -1
  96. package/channel-app/whatsappAppSetup.d.ts +0 -26
  97. package/channel-app/whatsappAppSetup.d.ts.map +1 -1
  98. package/channel-app/whatsappAppSetup.js +2 -1
  99. package/channel-app/whatsappAppSetup.js.map +1 -1
  100. package/cursor-accounts/CursorAccountEditor.js +3 -3
  101. package/cursor-accounts/CursorAccountEditor.js.map +1 -1
  102. package/cursor-accounts/CursorAccountsConsole.js +3 -3
  103. package/cursor-accounts/CursorAccountsConsole.js.map +1 -1
  104. package/dashboard/OperationalDashboard.d.ts +1 -4
  105. package/dashboard/OperationalDashboard.d.ts.map +1 -1
  106. package/dashboard/OperationalDashboard.js +1 -3
  107. package/dashboard/OperationalDashboard.js.map +1 -1
  108. package/dashboard/useDashboardSummary.d.ts +1 -3
  109. package/dashboard/useDashboardSummary.d.ts.map +1 -1
  110. package/dashboard/useDashboardSummary.js +1 -1
  111. package/dashboard/useDashboardSummary.js.map +1 -1
  112. package/environment/EnvironmentListPanel.d.ts.map +1 -1
  113. package/environment/EnvironmentListPanel.js +2 -1
  114. package/environment/EnvironmentListPanel.js.map +1 -1
  115. package/environment/EnvironmentVariableEditor.d.ts.map +1 -1
  116. package/environment/EnvironmentVariableEditor.js +2 -1
  117. package/environment/EnvironmentVariableEditor.js.map +1 -1
  118. package/execution/ArtifactFileContent.d.ts.map +1 -1
  119. package/execution/ArtifactFileContent.js +2 -1
  120. package/execution/ArtifactFileContent.js.map +1 -1
  121. package/execution/McpToolDetail.d.ts.map +1 -1
  122. package/execution/McpToolDetail.js +2 -1
  123. package/execution/McpToolDetail.js.map +1 -1
  124. package/execution/ResultView.d.ts.map +1 -1
  125. package/execution/ResultView.js +2 -1
  126. package/execution/ResultView.js.map +1 -1
  127. package/execution/TerminalSession.js +1 -1
  128. package/execution/TerminalSession.js.map +1 -1
  129. package/execution/ThreadSkeleton.d.ts.map +1 -1
  130. package/execution/ThreadSkeleton.js +2 -1
  131. package/execution/ThreadSkeleton.js.map +1 -1
  132. package/execution/file-path-resolver.d.ts.map +1 -1
  133. package/execution/file-path-resolver.js +3 -2
  134. package/execution/file-path-resolver.js.map +1 -1
  135. package/execution/sandbox-path-normalizer.d.ts +0 -11
  136. package/execution/sandbox-path-normalizer.d.ts.map +1 -1
  137. package/execution/sandbox-path-normalizer.js +2 -1
  138. package/execution/sandbox-path-normalizer.js.map +1 -1
  139. package/github/parseGitUrl.d.ts.map +1 -1
  140. package/github/parseGitUrl.js +16 -4
  141. package/github/parseGitUrl.js.map +1 -1
  142. package/iam-policy/GrantAccessForm.d.ts +3 -3
  143. package/iam-policy/GrantAccessForm.d.ts.map +1 -1
  144. package/iam-policy/GrantAccessForm.js +3 -3
  145. package/iam-policy/GrantAccessForm.js.map +1 -1
  146. package/iam-policy/OrgMembersPanel.d.ts +3 -3
  147. package/iam-policy/OrgMembersPanel.d.ts.map +1 -1
  148. package/iam-policy/OrgMembersPanel.js +4 -3
  149. package/iam-policy/OrgMembersPanel.js.map +1 -1
  150. package/iam-policy/PeopleWithAccess.d.ts +2 -2
  151. package/iam-policy/PeopleWithAccess.d.ts.map +1 -1
  152. package/iam-policy/PeopleWithAccess.js +2 -2
  153. package/iam-policy/PeopleWithAccess.js.map +1 -1
  154. package/iam-policy/PrincipalPicker.d.ts +2 -2
  155. package/iam-policy/PrincipalPicker.d.ts.map +1 -1
  156. package/iam-policy/PrincipalPicker.js +2 -2
  157. package/iam-policy/PrincipalPicker.js.map +1 -1
  158. package/iam-policy/SharePanel.d.ts +3 -3
  159. package/iam-policy/SharePanel.d.ts.map +1 -1
  160. package/iam-policy/SharePanel.js +3 -3
  161. package/iam-policy/SharePanel.js.map +1 -1
  162. package/iam-policy/useCreateIamPolicy.d.ts +1 -1
  163. package/iam-policy/useCreateIamPolicy.js +1 -1
  164. package/iam-policy/useDeleteIamPolicy.d.ts +1 -1
  165. package/iam-policy/useDeleteIamPolicy.js +1 -1
  166. package/iam-policy/useGranteeCandidates.d.ts +3 -3
  167. package/iam-policy/useGranteeCandidates.d.ts.map +1 -1
  168. package/iam-policy/useGranteeCandidates.js +2 -2
  169. package/iam-policy/useGranteeCandidates.js.map +1 -1
  170. package/iam-policy/useOwnerAssignment.d.ts +2 -2
  171. package/iam-policy/useOwnerAssignment.d.ts.map +1 -1
  172. package/iam-policy/useOwnerAssignment.js +3 -3
  173. package/iam-policy/useOwnerAssignment.js.map +1 -1
  174. package/iam-policy/usePrincipalsCount.d.ts +4 -4
  175. package/iam-policy/usePrincipalsCount.d.ts.map +1 -1
  176. package/iam-policy/usePrincipalsCount.js +7 -7
  177. package/iam-policy/usePrincipalsCount.js.map +1 -1
  178. package/iam-policy/useResourceAccess.d.ts +1 -1
  179. package/iam-policy/useResourceAccess.js +1 -1
  180. package/iam-policy/useRevokeOrgAccess.d.ts +1 -1
  181. package/iam-policy/useRevokeOrgAccess.d.ts.map +1 -1
  182. package/iam-policy/useRevokeOrgAccess.js +2 -2
  183. package/iam-policy/useRevokeOrgAccess.js.map +1 -1
  184. package/identity-account/AccountPreferencesPanel.d.ts.map +1 -1
  185. package/identity-account/AccountPreferencesPanel.js +2 -1
  186. package/identity-account/AccountPreferencesPanel.js.map +1 -1
  187. package/identity-provider/IdentityProviderDetailPanel.js +4 -4
  188. package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
  189. package/identity-provider/IdentityProviderListPanel.d.ts.map +1 -1
  190. package/identity-provider/IdentityProviderListPanel.js +2 -1
  191. package/identity-provider/IdentityProviderListPanel.js.map +1 -1
  192. package/identity-provider/IdentityProviderWizard.js +1 -1
  193. package/identity-provider/IdentityProviderWizard.js.map +1 -1
  194. package/identity-provider/SsoLoginPrompt.js +2 -1
  195. package/identity-provider/SsoLoginPrompt.js.map +1 -1
  196. package/identity-provider/useIdentityProviderList.d.ts +2 -2
  197. package/identity-provider/useIdentityProviderList.js +2 -2
  198. package/index.d.ts +1 -1
  199. package/index.d.ts.map +1 -1
  200. package/index.js +1 -1
  201. package/index.js.map +1 -1
  202. package/inline-edit/InlineEditImage.d.ts +4 -0
  203. package/inline-edit/InlineEditImage.d.ts.map +1 -1
  204. package/inline-edit/InlineEditImage.js +12 -11
  205. package/inline-edit/InlineEditImage.js.map +1 -1
  206. package/inline-edit/InlineEditText.d.ts +4 -0
  207. package/inline-edit/InlineEditText.d.ts.map +1 -1
  208. package/inline-edit/InlineEditText.js +12 -11
  209. package/inline-edit/InlineEditText.js.map +1 -1
  210. package/inline-edit/InlineEditTextarea.d.ts +4 -0
  211. package/inline-edit/InlineEditTextarea.d.ts.map +1 -1
  212. package/inline-edit/InlineEditTextarea.js +11 -16
  213. package/inline-edit/InlineEditTextarea.js.map +1 -1
  214. package/inline-edit/useInlineDraft.d.ts +26 -0
  215. package/inline-edit/useInlineDraft.d.ts.map +1 -0
  216. package/inline-edit/useInlineDraft.js +61 -0
  217. package/inline-edit/useInlineDraft.js.map +1 -0
  218. package/internal/DialogShell.d.ts +21 -0
  219. package/internal/DialogShell.d.ts.map +1 -1
  220. package/internal/DialogShell.js +51 -4
  221. package/internal/DialogShell.js.map +1 -1
  222. package/internal/LoadingRegion.d.ts +35 -0
  223. package/internal/LoadingRegion.d.ts.map +1 -0
  224. package/internal/LoadingRegion.js +33 -0
  225. package/internal/LoadingRegion.js.map +1 -0
  226. package/internal/markdown-components.d.ts.map +1 -1
  227. package/internal/markdown-components.js +18 -4
  228. package/internal/markdown-components.js.map +1 -1
  229. package/internal/trim.d.ts +7 -0
  230. package/internal/trim.d.ts.map +1 -0
  231. package/internal/trim.js +12 -0
  232. package/internal/trim.js.map +1 -0
  233. package/invitation/InvitationManager.d.ts.map +1 -1
  234. package/invitation/InvitationManager.js +2 -1
  235. package/invitation/InvitationManager.js.map +1 -1
  236. package/invitation/InvitationRedemption.d.ts.map +1 -1
  237. package/invitation/InvitationRedemption.js +5 -4
  238. package/invitation/InvitationRedemption.js.map +1 -1
  239. package/invitation/useInvitationPreview.d.ts +1 -1
  240. package/invitation/useInvitationPreview.js +1 -1
  241. package/licenses/LicenseDetail.d.ts.map +1 -1
  242. package/licenses/LicenseDetail.js +3 -3
  243. package/licenses/LicenseDetail.js.map +1 -1
  244. package/licenses/LicenseIssueForm.js +6 -6
  245. package/licenses/LicenseIssueForm.js.map +1 -1
  246. package/licenses/license-draft.d.ts +1 -1
  247. package/licenses/license-draft.d.ts.map +1 -1
  248. package/licenses/license-draft.js +3 -3
  249. package/licenses/license-draft.js.map +1 -1
  250. package/licenses/license-format.js +1 -1
  251. package/licenses/license-format.js.map +1 -1
  252. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  253. package/mcp-server/McpServerDetailView.js +2 -1
  254. package/mcp-server/McpServerDetailView.js.map +1 -1
  255. package/memory/MemoryListPanel.d.ts.map +1 -1
  256. package/memory/MemoryListPanel.js +2 -1
  257. package/memory/MemoryListPanel.js.map +1 -1
  258. package/oauth-app/OAuthAppListPanel.d.ts.map +1 -1
  259. package/oauth-app/OAuthAppListPanel.js +2 -1
  260. package/oauth-app/OAuthAppListPanel.js.map +1 -1
  261. package/organization/OrgPreferencesPanel.d.ts +3 -3
  262. package/organization/OrgPreferencesPanel.d.ts.map +1 -1
  263. package/organization/OrgPreferencesPanel.js +6 -5
  264. package/organization/OrgPreferencesPanel.js.map +1 -1
  265. package/organization/OrgProfilePanel.d.ts +3 -3
  266. package/organization/OrgProfilePanel.d.ts.map +1 -1
  267. package/organization/OrgProfilePanel.js +8 -7
  268. package/organization/OrgProfilePanel.js.map +1 -1
  269. package/organization/index.d.ts +1 -0
  270. package/organization/index.d.ts.map +1 -1
  271. package/organization/index.js +1 -0
  272. package/organization/index.js.map +1 -1
  273. package/organization/useFollowSessionOrganization.d.ts +9 -0
  274. package/organization/useFollowSessionOrganization.d.ts.map +1 -0
  275. package/organization/useFollowSessionOrganization.js +52 -0
  276. package/organization/useFollowSessionOrganization.js.map +1 -0
  277. package/package.json +5 -5
  278. package/plan-catalog/plan-draft.js +3 -3
  279. package/plan-catalog/plan-draft.js.map +1 -1
  280. package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
  281. package/platform-client/PlatformClientListPanel.js +2 -1
  282. package/platform-client/PlatformClientListPanel.js.map +1 -1
  283. package/plugin/PluginDetailView.d.ts.map +1 -1
  284. package/plugin/PluginDetailView.js +2 -1
  285. package/plugin/PluginDetailView.js.map +1 -1
  286. package/portal-container.d.ts +8 -0
  287. package/portal-container.d.ts.map +1 -1
  288. package/portal-container.js +8 -0
  289. package/portal-container.js.map +1 -1
  290. package/provider.d.ts +4 -1
  291. package/provider.d.ts.map +1 -1
  292. package/provider.js +4 -1
  293. package/provider.js.map +1 -1
  294. package/public-base-url-context.d.ts.map +1 -1
  295. package/public-base-url-context.js +2 -1
  296. package/public-base-url-context.js.map +1 -1
  297. package/schedule/ScheduleDetailView.d.ts.map +1 -1
  298. package/schedule/ScheduleDetailView.js +2 -1
  299. package/schedule/ScheduleDetailView.js.map +1 -1
  300. package/session/SessionViewer.d.ts +7 -2
  301. package/session/SessionViewer.d.ts.map +1 -1
  302. package/session/SessionViewer.js +7 -2
  303. package/session/SessionViewer.js.map +1 -1
  304. package/session/useSessionConversation.d.ts +10 -1
  305. package/session/useSessionConversation.d.ts.map +1 -1
  306. package/session/useSessionConversation.js +5 -3
  307. package/session/useSessionConversation.js.map +1 -1
  308. package/settings/EnvironmentsSection.d.ts.map +1 -1
  309. package/settings/EnvironmentsSection.js +2 -1
  310. package/settings/EnvironmentsSection.js.map +1 -1
  311. package/settings/MembersSection.js +2 -2
  312. package/settings/MembersSection.js.map +1 -1
  313. package/settings/OrgPreferencesSection.js +1 -1
  314. package/settings/OrgPreferencesSection.js.map +1 -1
  315. package/settings/OrgProfileSection.js +1 -1
  316. package/settings/OrgProfileSection.js.map +1 -1
  317. package/settings/TeamsSection.js +1 -1
  318. package/settings/TeamsSection.js.map +1 -1
  319. package/settings/UsageSection.js +1 -1
  320. package/settings/UsageSection.js.map +1 -1
  321. package/sharing/ShareAgentDialog.d.ts.map +1 -1
  322. package/sharing/ShareAgentDialog.js +2 -1
  323. package/sharing/ShareAgentDialog.js.map +1 -1
  324. package/sharing/SharedAgentChat.d.ts.map +1 -1
  325. package/sharing/SharedAgentChat.js +2 -1
  326. package/sharing/SharedAgentChat.js.map +1 -1
  327. package/sidebar/WorkspaceSidebar.d.ts.map +1 -1
  328. package/sidebar/WorkspaceSidebar.js +2 -1
  329. package/sidebar/WorkspaceSidebar.js.map +1 -1
  330. package/skill/SkillDetailView.d.ts.map +1 -1
  331. package/skill/SkillDetailView.js +2 -1
  332. package/skill/SkillDetailView.js.map +1 -1
  333. package/skill/SkillDiffDialog.d.ts.map +1 -1
  334. package/skill/SkillDiffDialog.js +2 -1
  335. package/skill/SkillDiffDialog.js.map +1 -1
  336. package/skill/SkillFileBrowser.d.ts.map +1 -1
  337. package/skill/SkillFileBrowser.js +2 -1
  338. package/skill/SkillFileBrowser.js.map +1 -1
  339. package/src/access/ManageAccessButton.tsx +1 -1
  340. package/src/access/ManageAccessDialog.tsx +1 -1
  341. package/src/agent/AgentDetailView.tsx +4 -4
  342. package/src/api-key/ApiKeyListPanel.tsx +4 -4
  343. package/src/attachment/AttachmentImageLightbox.tsx +3 -4
  344. package/src/billing/AutoRechargeCard.tsx +5 -5
  345. package/src/billing/BillingSection.tsx +10 -9
  346. package/src/billing/CreditLedgerTable.tsx +4 -4
  347. package/src/billing/CreditPackGrid.tsx +1 -1
  348. package/src/billing/PaymentMethodCard.tsx +1 -1
  349. package/src/billing/PlanSection.tsx +6 -5
  350. package/src/billing/ProviderKeysSection.tsx +15 -15
  351. package/src/billing/plan-features.ts +1 -1
  352. package/src/billing/useBillingAccount.ts +7 -7
  353. package/src/billing/useBillingUsageReport.ts +7 -7
  354. package/src/billing/useChangePlan.ts +6 -6
  355. package/src/billing/useCreateBillingPortalSession.ts +4 -4
  356. package/src/billing/useCreateCheckoutSession.ts +3 -3
  357. package/src/billing/useCreatePaymentMethodSetupSession.ts +3 -3
  358. package/src/billing/useCreditLedger.ts +7 -7
  359. package/src/billing/useCustomerModelPricing.ts +7 -7
  360. package/src/billing/useEntitlements.ts +5 -5
  361. package/src/billing/usePeriodEstimate.ts +4 -4
  362. package/src/billing/useProviderKeys.ts +12 -12
  363. package/src/billing/useSetAutoRechargeConfig.ts +3 -3
  364. package/src/billing/useSubscription.ts +7 -7
  365. package/src/channel-app/ChannelAppListPanel.tsx +4 -4
  366. package/src/channel-app/slackAppSetup.ts +3 -2
  367. package/src/channel-app/whatsappAppSetup.ts +2 -1
  368. package/src/cursor-accounts/CursorAccountEditor.tsx +3 -3
  369. package/src/cursor-accounts/CursorAccountsConsole.tsx +5 -5
  370. package/src/dashboard/OperationalDashboard.tsx +1 -6
  371. package/src/dashboard/useDashboardSummary.ts +2 -4
  372. package/src/environment/EnvironmentListPanel.tsx +4 -4
  373. package/src/environment/EnvironmentVariableEditor.tsx +4 -4
  374. package/src/execution/ArtifactFileContent.tsx +3 -2
  375. package/src/execution/McpToolDetail.tsx +3 -3
  376. package/src/execution/ResultView.tsx +3 -3
  377. package/src/execution/TerminalSession.tsx +1 -1
  378. package/src/execution/ThreadSkeleton.tsx +4 -4
  379. package/src/execution/file-path-resolver.ts +3 -2
  380. package/src/execution/sandbox-path-normalizer.ts +2 -1
  381. package/src/github/parseGitUrl.ts +13 -4
  382. package/src/iam-policy/GrantAccessForm.tsx +4 -4
  383. package/src/iam-policy/OrgMembersPanel.tsx +7 -7
  384. package/src/iam-policy/PeopleWithAccess.tsx +3 -3
  385. package/src/iam-policy/PrincipalPicker.tsx +3 -3
  386. package/src/iam-policy/SharePanel.tsx +4 -4
  387. package/src/iam-policy/useCreateIamPolicy.ts +1 -1
  388. package/src/iam-policy/useDeleteIamPolicy.ts +1 -1
  389. package/src/iam-policy/useGranteeCandidates.ts +3 -3
  390. package/src/iam-policy/useOwnerAssignment.ts +3 -3
  391. package/src/iam-policy/usePrincipalsCount.ts +7 -7
  392. package/src/iam-policy/useResourceAccess.ts +1 -1
  393. package/src/iam-policy/useRevokeOrgAccess.ts +3 -3
  394. package/src/identity-account/AccountPreferencesPanel.tsx +4 -4
  395. package/src/identity-provider/IdentityProviderDetailPanel.tsx +3 -9
  396. package/src/identity-provider/IdentityProviderListPanel.tsx +4 -4
  397. package/src/identity-provider/IdentityProviderWizard.tsx +1 -1
  398. package/src/identity-provider/SsoLoginPrompt.tsx +6 -5
  399. package/src/identity-provider/useIdentityProviderList.ts +2 -2
  400. package/src/index.ts +1 -0
  401. package/src/inline-edit/InlineEditImage.tsx +13 -11
  402. package/src/inline-edit/InlineEditText.tsx +13 -11
  403. package/src/inline-edit/InlineEditTextarea.tsx +12 -16
  404. package/src/inline-edit/useInlineDraft.ts +85 -0
  405. package/src/internal/DialogShell.tsx +80 -3
  406. package/src/internal/LoadingRegion.tsx +46 -0
  407. package/src/internal/loading-region-markup.json +71 -0
  408. package/src/internal/markdown-components.tsx +15 -4
  409. package/src/internal/trim.ts +10 -0
  410. package/src/invitation/InvitationManager.tsx +4 -4
  411. package/src/invitation/InvitationRedemption.tsx +7 -7
  412. package/src/invitation/useInvitationPreview.ts +1 -1
  413. package/src/licenses/LicenseDetail.tsx +8 -6
  414. package/src/licenses/LicenseIssueForm.tsx +6 -6
  415. package/src/licenses/license-draft.ts +4 -4
  416. package/src/licenses/license-format.ts +1 -1
  417. package/src/mcp-server/McpServerDetailView.tsx +4 -4
  418. package/src/memory/MemoryListPanel.tsx +4 -4
  419. package/src/oauth-app/OAuthAppListPanel.tsx +4 -4
  420. package/src/organization/OrgPreferencesPanel.tsx +9 -9
  421. package/src/organization/OrgProfilePanel.tsx +12 -12
  422. package/src/organization/index.ts +1 -0
  423. package/src/organization/useFollowSessionOrganization.ts +54 -0
  424. package/src/plan-catalog/plan-draft.ts +3 -3
  425. package/src/platform-client/PlatformClientListPanel.tsx +4 -4
  426. package/src/plugin/PluginDetailView.tsx +3 -2
  427. package/src/portal-container.ts +8 -0
  428. package/src/provider.tsx +4 -1
  429. package/src/public-base-url-context.ts +2 -1
  430. package/src/schedule/ScheduleDetailView.tsx +4 -4
  431. package/src/session/SessionViewer.tsx +13 -3
  432. package/src/session/useSessionConversation.ts +14 -3
  433. package/src/settings/EnvironmentsSection.tsx +3 -2
  434. package/src/settings/MembersSection.tsx +3 -3
  435. package/src/settings/OrgPreferencesSection.tsx +1 -1
  436. package/src/settings/OrgProfileSection.tsx +1 -1
  437. package/src/settings/TeamsSection.tsx +1 -1
  438. package/src/settings/UsageSection.tsx +1 -1
  439. package/src/sharing/ShareAgentDialog.tsx +2 -1
  440. package/src/sharing/SharedAgentChat.tsx +4 -4
  441. package/src/sidebar/WorkspaceSidebar.tsx +3 -2
  442. package/src/skill/SkillDetailView.tsx +4 -4
  443. package/src/skill/SkillDiffDialog.tsx +4 -4
  444. package/src/skill/SkillFileBrowser.tsx +4 -4
  445. package/src/team/TeamDetailPanel.tsx +3 -3
  446. package/src/team/TeamListPanel.tsx +3 -2
  447. package/src/team/TeamMembersPanel.tsx +3 -3
  448. package/src/usage/OrgUsagePanel.tsx +9 -9
  449. package/src/usage/useExportCSV.ts +9 -9
  450. package/src/usage/useOrgUsageReport.ts +7 -7
  451. package/src/version-history/VersionTimeline.tsx +4 -4
  452. package/src/workflow/WorkflowVersionDiffViewer.tsx +4 -4
  453. package/src/workflow/WorkflowVersionTimeline.tsx +4 -4
  454. package/src/workflow/useDiagnoseExecutionFlow.ts +23 -18
  455. package/src/workflow/useExplainWorkflowFlow.ts +7 -3
  456. package/src/workflow/useRefineWorkflowFlow.ts +17 -10
  457. package/src/workflow/useWorkflowArchitectFlow.ts +7 -3
  458. package/src/workspace/ExplorerTree.tsx +4 -8
  459. package/src/workspace/FileViewer.tsx +4 -5
  460. package/styles.css +1 -1
  461. package/team/TeamDetailPanel.d.ts +2 -2
  462. package/team/TeamDetailPanel.d.ts.map +1 -1
  463. package/team/TeamDetailPanel.js +2 -2
  464. package/team/TeamDetailPanel.js.map +1 -1
  465. package/team/TeamListPanel.d.ts.map +1 -1
  466. package/team/TeamListPanel.js +2 -1
  467. package/team/TeamListPanel.js.map +1 -1
  468. package/team/TeamMembersPanel.d.ts +2 -2
  469. package/team/TeamMembersPanel.d.ts.map +1 -1
  470. package/team/TeamMembersPanel.js +2 -2
  471. package/team/TeamMembersPanel.js.map +1 -1
  472. package/usage/OrgUsagePanel.d.ts +3 -3
  473. package/usage/OrgUsagePanel.d.ts.map +1 -1
  474. package/usage/OrgUsagePanel.js +6 -5
  475. package/usage/OrgUsagePanel.js.map +1 -1
  476. package/usage/useExportCSV.d.ts +2 -2
  477. package/usage/useExportCSV.d.ts.map +1 -1
  478. package/usage/useExportCSV.js +9 -9
  479. package/usage/useExportCSV.js.map +1 -1
  480. package/usage/useOrgUsageReport.d.ts +4 -4
  481. package/usage/useOrgUsageReport.d.ts.map +1 -1
  482. package/usage/useOrgUsageReport.js +7 -7
  483. package/usage/useOrgUsageReport.js.map +1 -1
  484. package/version-history/VersionTimeline.d.ts.map +1 -1
  485. package/version-history/VersionTimeline.js +2 -1
  486. package/version-history/VersionTimeline.js.map +1 -1
  487. package/workflow/WorkflowVersionDiffViewer.d.ts.map +1 -1
  488. package/workflow/WorkflowVersionDiffViewer.js +2 -1
  489. package/workflow/WorkflowVersionDiffViewer.js.map +1 -1
  490. package/workflow/WorkflowVersionTimeline.d.ts.map +1 -1
  491. package/workflow/WorkflowVersionTimeline.js +2 -1
  492. package/workflow/WorkflowVersionTimeline.js.map +1 -1
  493. package/workflow/useDiagnoseExecutionFlow.d.ts.map +1 -1
  494. package/workflow/useDiagnoseExecutionFlow.js +23 -18
  495. package/workflow/useDiagnoseExecutionFlow.js.map +1 -1
  496. package/workflow/useExplainWorkflowFlow.d.ts.map +1 -1
  497. package/workflow/useExplainWorkflowFlow.js +7 -3
  498. package/workflow/useExplainWorkflowFlow.js.map +1 -1
  499. package/workflow/useRefineWorkflowFlow.d.ts.map +1 -1
  500. package/workflow/useRefineWorkflowFlow.js +14 -10
  501. package/workflow/useRefineWorkflowFlow.js.map +1 -1
  502. package/workflow/useWorkflowArchitectFlow.d.ts.map +1 -1
  503. package/workflow/useWorkflowArchitectFlow.js +7 -3
  504. package/workflow/useWorkflowArchitectFlow.js.map +1 -1
  505. package/workspace/ExplorerTree.d.ts.map +1 -1
  506. package/workspace/ExplorerTree.js +2 -5
  507. package/workspace/ExplorerTree.js.map +1 -1
  508. package/workspace/FileViewer.d.ts.map +1 -1
  509. package/workspace/FileViewer.js +2 -1
  510. package/workspace/FileViewer.js.map +1 -1
@@ -8,6 +8,7 @@ import { timestampDate } from "@bufbuild/protobuf/wkt";
8
8
  import { useInvitationPreview } from "./useInvitationPreview.js";
9
9
  import { useRedeemInvitation } from "./useRedeemInvitation.js";
10
10
  import { SpinnerIcon } from "../internal/SpinnerIcon.js";
11
+ import { LoadingRegion } from "../internal/LoadingRegion.js";
11
12
 
12
13
  // ---------------------------------------------------------------------------
13
14
  // Public API
@@ -141,13 +142,12 @@ export function InvitationRedemption({
141
142
  // Loading state
142
143
  if (isLoading) {
143
144
  return (
144
- <div
145
+ <LoadingRegion
145
146
  className={cn("stg:mx-auto stg:max-w-sm", className)}
146
- aria-busy="true"
147
- aria-label="Loading invitation"
147
+ label="Loading invitation"
148
148
  >
149
149
  <LoadingSkeleton />
150
- </div>
150
+ </LoadingRegion>
151
151
  );
152
152
  }
153
153
 
@@ -174,7 +174,7 @@ export function InvitationRedemption({
174
174
 
175
175
  // Redemption success
176
176
  if (accepted) {
177
- const orgName = preview.organizationName || "the organization";
177
+ const orgName = preview.orgName || "the organization";
178
178
  const roleName = iamRoleDisplayName(preview.role);
179
179
  return (
180
180
  <div className={cn("stg:mx-auto stg:max-w-sm", className)}>
@@ -191,8 +191,8 @@ export function InvitationRedemption({
191
191
  );
192
192
  }
193
193
 
194
- const orgName = preview.organizationName || "Unknown organization";
195
- const orgLogo = preview.organizationLogoUrl;
194
+ const orgName = preview.orgName || "Unknown organization";
195
+ const orgLogo = preview.orgLogoUrl;
196
196
  const orgInitial = orgName.charAt(0).toUpperCase();
197
197
  const roleName = iamRoleDisplayName(preview.role);
198
198
  const expiresAt = preview.expiresAt ? timestampDate(preview.expiresAt) : null;
@@ -54,7 +54,7 @@ export interface UseInvitationPreviewReturn {
54
54
  * if (!preview) return <NotFound />;
55
55
  * if (!preview.isValid) return <Expired reason={preview.invalidReason} />;
56
56
  *
57
- * return <p>Join {preview.organizationName} as {preview.role}</p>;
57
+ * return <p>Join {preview.orgName} as {preview.role}</p>;
58
58
  * ```
59
59
  */
60
60
  export function useInvitationPreview(
@@ -116,8 +116,8 @@ export function LicenseDetail({
116
116
  <Row label="Customer">
117
117
  <span className="stg:block">{customer?.displayName}</span>
118
118
  <span className="stg:block stg:text-muted-foreground">{customer?.contactEmail}</span>
119
- {customer?.organization && (
120
- <span className="stg:block stg:text-muted-foreground">{`Cloud organization ${customer.organization}`}</span>
119
+ {customer?.org && (
120
+ <span className="stg:block stg:text-muted-foreground">{`Cloud organization ${customer.org}`}</span>
121
121
  )}
122
122
  </Row>
123
123
  <Row label="Term">{spec ? termLabel(spec.term) : "Unknown"}</Row>
@@ -140,8 +140,8 @@ export function LicenseDetail({
140
140
  {limits?.maxUsers !== undefined ? `${limits.maxUsers} users` : "Unlimited users"}
141
141
  </span>
142
142
  <span className="stg:block">
143
- {limits?.maxOrganizations !== undefined
144
- ? `${limits.maxOrganizations} organizations`
143
+ {limits?.maxOrgs !== undefined
144
+ ? `${limits.maxOrgs} organizations`
145
145
  : "Unlimited organizations"}
146
146
  </span>
147
147
  </Row>
@@ -157,10 +157,12 @@ export function LicenseDetail({
157
157
  <Row label="Issued">
158
158
  {issuedAt ? <Instant date={issuedAt}>{formatInstantUtc(issuedAt)}</Instant> : "Unknown"}
159
159
  {/* The audit names the account, not only its role-like display name:
160
- with several operators, "who issued this contract" needs the address. */}
160
+ with several operators, "who issued this contract" needs the address.
161
+ An account with no name of its own is called by its email, so
162
+ the address is shown once. */}
161
163
  {issuer && (issuer.email || issuer.displayName) && (
162
164
  <span className="stg:block stg:text-muted-foreground">
163
- {issuer.displayName && issuer.email
165
+ {issuer.displayName && issuer.email && issuer.displayName !== issuer.email
164
166
  ? `by ${issuer.displayName} (${issuer.email})`
165
167
  : `by ${issuer.displayName || issuer.email}`}
166
168
  </span>
@@ -87,7 +87,7 @@ const VIOLATION_COPY: Readonly<Record<string, string>> = {
87
87
  "spec.customer.display_name": "Name the customer.",
88
88
  "spec.customer.contact_email": "Enter the address renewal notices go to.",
89
89
  "spec.entitlements.limits.max_users": "Enter at least 1, or leave it empty for unlimited.",
90
- "spec.entitlements.limits.max_organizations": "Enter at least 1, or leave it empty for unlimited.",
90
+ "spec.entitlements.limits.max_orgs": "Enter at least 1, or leave it empty for unlimited.",
91
91
  "spec.notes": "Notes are limited to 4,096 characters.",
92
92
  };
93
93
 
@@ -134,7 +134,7 @@ export function LicenseIssueForm({
134
134
  });
135
135
  const [maxUsers, setMaxUsers] = useState(limitText(renewing?.spec?.entitlements?.limits?.maxUsers));
136
136
  const [maxOrganizations, setMaxOrganizations] = useState(
137
- limitText(renewing?.spec?.entitlements?.limits?.maxOrganizations),
137
+ limitText(renewing?.spec?.entitlements?.limits?.maxOrgs),
138
138
  );
139
139
  const [features, setFeatures] = useState<readonly GrantableFeature[]>(() =>
140
140
  (renewing?.spec?.entitlements?.features ?? []).filter(isGrantableFeature),
@@ -154,9 +154,9 @@ export function LicenseIssueForm({
154
154
  id: selected.customer.id,
155
155
  displayName: selected.customer.displayName,
156
156
  contactEmail: selected.customer.contactEmail,
157
- organization: selected.customer.organization,
157
+ org: selected.customer.org,
158
158
  }
159
- : { id: mintedId, displayName: newName, contactEmail: newEmail, organization: newOrganization };
159
+ : { id: mintedId, displayName: newName, contactEmail: newEmail, org: newOrganization };
160
160
  const matches =
161
161
  mode === "new" ? findCustomerMatches(customers, { displayName: newName, contactEmail: newEmail }) : [];
162
162
 
@@ -179,7 +179,7 @@ export function LicenseIssueForm({
179
179
  lastCoveredDay,
180
180
  graceDays: grace.value,
181
181
  maxUsers: users.value,
182
- maxOrganizations: organizations.value,
182
+ maxOrgs: organizations.value,
183
183
  features,
184
184
  notes,
185
185
  };
@@ -473,7 +473,7 @@ export function LicenseIssueForm({
473
473
  message={shown(
474
474
  maxOrganizations !== "",
475
475
  organizations.ok
476
- ? violationAt("spec.entitlements.limits.max_organizations")
476
+ ? violationAt("spec.entitlements.limits.max_orgs")
477
477
  : organizations.error,
478
478
  )}
479
479
  />
@@ -65,7 +65,7 @@ export interface LicenseDraft {
65
65
  /** `undefined` means unlimited, as the contract reads an absent limit. */
66
66
  readonly maxUsers: number | undefined;
67
67
  /** `undefined` means unlimited, as the contract reads an absent limit. */
68
- readonly maxOrganizations: number | undefined;
68
+ readonly maxOrgs: number | undefined;
69
69
  readonly features: readonly GrantableFeature[];
70
70
  /** Operator notes; never signed, never shown to the customer. */
71
71
  readonly notes: string;
@@ -148,9 +148,9 @@ export function toLicenseInput(draft: LicenseDraft): LicenseInput {
148
148
  const graceUntil = new Date(expiresAt.getTime() + draft.graceDays * DAY_MS);
149
149
  const limits: EntitlementLimitsInput = {
150
150
  ...(draft.maxUsers !== undefined && { maxUsers: draft.maxUsers }),
151
- ...(draft.maxOrganizations !== undefined && { maxOrganizations: draft.maxOrganizations }),
151
+ ...(draft.maxOrgs !== undefined && { maxOrgs: draft.maxOrgs }),
152
152
  };
153
- const organization = draft.customer.organization?.trim();
153
+ const organization = draft.customer.org?.trim();
154
154
  const notes = draft.notes.trim();
155
155
 
156
156
  return {
@@ -162,7 +162,7 @@ export function toLicenseInput(draft: LicenseDraft): LicenseInput {
162
162
  id: draft.customer.id,
163
163
  displayName: collapse(draft.customer.displayName),
164
164
  contactEmail: draft.customer.contactEmail.trim(),
165
- ...(organization ? { organization } : {}),
165
+ ...(organization ? { org: organization } : {}),
166
166
  },
167
167
  entitlements: {
168
168
  ...(Object.keys(limits).length > 0 && { limits }),
@@ -157,7 +157,7 @@ export function entitlementParts(entitlements: Entitlements | undefined): readon
157
157
  const features = entitlements?.features.filter(isGrantableFeature).length ?? 0;
158
158
  return [
159
159
  limitPart(limits?.maxUsers, "user"),
160
- limitPart(limits?.maxOrganizations, "organization"),
160
+ limitPart(limits?.maxOrgs, "organization"),
161
161
  features === 0 ? "No features" : plural(features, "feature"),
162
162
  ];
163
163
  }
@@ -50,6 +50,7 @@ import { InlineEditKeyValue } from "../inline-edit/InlineEditKeyValue.js";
50
50
  import type { KeyValueRow, SelectOption } from "../inline-edit/types.js";
51
51
  import { ManagedByPluginNotice } from "../plugin/ManagedByPluginNotice.js";
52
52
  import { useManagingPlugin } from "../plugin/useManagingPlugin.js";
53
+ import { LoadingRegion } from "../internal/LoadingRegion.js";
53
54
 
54
55
  /** Tab identifier for the MCP server capability panel. */
55
56
  export type CapabilityTab = "tools" | "policies" | "resources";
@@ -2202,10 +2203,9 @@ function Dot() {
2202
2203
 
2203
2204
  function LoadingSkeleton({ className }: { readonly className?: string }) {
2204
2205
  return (
2205
- <div
2206
+ <LoadingRegion
2206
2207
  className={cn("stg:flex stg:flex-col stg:gap-6", className)}
2207
- aria-busy="true"
2208
- aria-label="Loading MCP server details"
2208
+ label="Loading MCP server details"
2209
2209
  >
2210
2210
  <div className="stg:flex stg:items-start stg:gap-3">
2211
2211
  <div className="stg:mt-1 stg:size-6 stg:shrink-0 stg:animate-pulse stg:rounded stg:bg-muted" />
@@ -2224,7 +2224,7 @@ function LoadingSkeleton({ className }: { readonly className?: string }) {
2224
2224
  />
2225
2225
  </div>
2226
2226
  ))}
2227
- </div>
2227
+ </LoadingRegion>
2228
2228
  );
2229
2229
  }
2230
2230
 
@@ -14,6 +14,7 @@ import { useDeleteMemory } from "./useDeleteMemory.js";
14
14
  import { useMemories } from "./useMemories.js";
15
15
  import { useRejectMemory } from "./useRejectMemory.js";
16
16
  import { useUpdateMemoryContent } from "./useUpdateMemoryContent.js";
17
+ import { LoadingRegion } from "../internal/LoadingRegion.js";
17
18
 
18
19
  // ---------------------------------------------------------------------------
19
20
  // Public API
@@ -71,10 +72,9 @@ export function MemoryListPanel({ org, className, now }: MemoryListPanelProps) {
71
72
 
72
73
  if (isLoading) {
73
74
  return (
74
- <div
75
+ <LoadingRegion
75
76
  className={cn("stg:space-y-2", className)}
76
- aria-busy="true"
77
- aria-label="Loading memories"
77
+ label="Loading memories"
78
78
  >
79
79
  {Array.from({ length: 2 }, (_, i) => (
80
80
  <div
@@ -82,7 +82,7 @@ export function MemoryListPanel({ org, className, now }: MemoryListPanelProps) {
82
82
  className="stg:bg-muted-subtle stg:h-14 stg:animate-pulse stg:rounded-lg"
83
83
  />
84
84
  ))}
85
- </div>
85
+ </LoadingRegion>
86
86
  );
87
87
  }
88
88
 
@@ -7,6 +7,7 @@ import { timestampDate } from "@bufbuild/protobuf/wkt";
7
7
  import type { OAuthApp } from "@stigmer/protos/ai/stigmer/iam/oauthapp/v1/api_pb";
8
8
  import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
9
9
  import { useOAuthAppList } from "./useOAuthAppList.js";
10
+ import { LoadingRegion } from "../internal/LoadingRegion.js";
10
11
 
11
12
  // ---------------------------------------------------------------------------
12
13
  // Public API
@@ -76,10 +77,9 @@ export function OAuthAppListPanel({
76
77
 
77
78
  if (isLoading) {
78
79
  return (
79
- <div
80
+ <LoadingRegion
80
81
  className={cn("stg:space-y-2", className)}
81
- aria-busy="true"
82
- aria-label="Loading OAuth apps"
82
+ label="Loading OAuth apps"
83
83
  >
84
84
  {Array.from({ length: 2 }, (_, i) => (
85
85
  <div
@@ -87,7 +87,7 @@ export function OAuthAppListPanel({
87
87
  className="stg:bg-muted-subtle stg:h-14 stg:animate-pulse stg:rounded-lg"
88
88
  />
89
89
  ))}
90
- </div>
90
+ </LoadingRegion>
91
91
  );
92
92
  }
93
93
 
@@ -11,6 +11,7 @@ import { useServerInfo } from "../server-info.js";
11
11
  import { MemoryEnabledRow } from "../internal/MemoryEnabledRow.js";
12
12
  import { StandingContextField } from "../internal/StandingContextField.js";
13
13
  import { SpinnerIcon } from "../internal/SpinnerIcon.js";
14
+ import { LoadingRegion } from "../internal/LoadingRegion.js";
14
15
 
15
16
  /** The memory row's copy where each member's own switch must also be on. */
16
17
  const MEMBER_CONSENT_MEMORY_HELPER_TEXT =
@@ -23,7 +24,7 @@ const ORG_ALONE_MEMORY_HELPER_TEXT =
23
24
  /** Props for {@link OrgPreferencesPanel}. */
24
25
  export interface OrgPreferencesPanelProps {
25
26
  /** The ID of the organization whose preferences to display and edit. */
26
- readonly orgId: string;
27
+ readonly org: string;
27
28
  /** Fired with the updated resource after a successful save. */
28
29
  readonly onUpdated?: (org: Organization) => void;
29
30
  /** Additional CSS class names for the root container. */
@@ -47,11 +48,11 @@ export interface OrgPreferencesPanelProps {
47
48
  *
48
49
  * @example
49
50
  * ```tsx
50
- * <OrgPreferencesPanel orgId="org-id-123" />
51
+ * <OrgPreferencesPanel org="org-id-123" />
51
52
  * ```
52
53
  */
53
54
  export function OrgPreferencesPanel({
54
- orgId,
55
+ org,
55
56
  onUpdated,
56
57
  className,
57
58
  }: OrgPreferencesPanelProps) {
@@ -61,7 +62,7 @@ export function OrgPreferencesPanel({
61
62
  isLoading: isFetching,
62
63
  error: fetchError,
63
64
  refetch,
64
- } = useOrganization(orgId || null);
65
+ } = useOrganization(org || null);
65
66
 
66
67
  const {
67
68
  update,
@@ -90,7 +91,7 @@ export function OrgPreferencesPanel({
90
91
  // Fail-open: OSS local mode has no IAM service, so editing stays
91
92
  // available there; cloud gets a genuine server verdict.
92
93
  const { allowed: canEdit } = useCheckPermission(
93
- orgId ? { kind: "organization", id: orgId } : null,
94
+ org ? { kind: "organization", id: org } : null,
94
95
  "can_edit",
95
96
  );
96
97
 
@@ -177,14 +178,13 @@ export function OrgPreferencesPanel({
177
178
 
178
179
  if (isFetching && !organization) {
179
180
  return (
180
- <div
181
+ <LoadingRegion
181
182
  className={cn("stg:space-y-4", className)}
182
- aria-busy="true"
183
- aria-label="Loading organization preferences"
183
+ label="Loading organization preferences"
184
184
  >
185
185
  <div className="stg:bg-muted-subtle stg:h-28 stg:animate-pulse stg:rounded" />
186
186
  <div className="stg:bg-muted-subtle stg:h-8 stg:w-32 stg:animate-pulse stg:rounded" />
187
- </div>
187
+ </LoadingRegion>
188
188
  );
189
189
  }
190
190
 
@@ -12,6 +12,7 @@ import { useResourceAvailable, ApiResourceKind } from "../deployment-mode.js";
12
12
  import { useCheckPermission } from "../iam-policy/useCheckPermission.js";
13
13
  import { SpinnerIcon } from "../internal/SpinnerIcon.js";
14
14
  import { useCopyFeedback } from "../internal/useCopyFeedback.js";
15
+ import { LoadingRegion } from "../internal/LoadingRegion.js";
15
16
 
16
17
  // ---------------------------------------------------------------------------
17
18
  // Constants
@@ -27,7 +28,7 @@ const LOGO_URL_MAX_LEN = 2048;
27
28
  /** Props for {@link OrgProfilePanel}. */
28
29
  export interface OrgProfilePanelProps {
29
30
  /** The ID of the organization to display and edit. */
30
- readonly orgId: string;
31
+ readonly org: string;
31
32
  /** Fired with the updated resource after a successful save. */
32
33
  readonly onUpdated?: (org: Organization) => void;
33
34
  /** Additional CSS class names for the root container. */
@@ -48,13 +49,13 @@ export interface OrgProfilePanelProps {
48
49
  * @example
49
50
  * ```tsx
50
51
  * <OrgProfilePanel
51
- * orgId="org-id-123"
52
+ * org="org-id-123"
52
53
  * onUpdated={(org) => console.log("Saved:", org.metadata?.name)}
53
54
  * />
54
55
  * ```
55
56
  */
56
57
  export function OrgProfilePanel({
57
- orgId,
58
+ org,
58
59
  onUpdated,
59
60
  className,
60
61
  }: OrgProfilePanelProps) {
@@ -64,7 +65,7 @@ export function OrgProfilePanel({
64
65
  isLoading: isFetching,
65
66
  error: fetchError,
66
67
  refetch,
67
- } = useOrganization(orgId || null);
68
+ } = useOrganization(org || null);
68
69
 
69
70
  const {
70
71
  update,
@@ -152,10 +153,9 @@ export function OrgProfilePanel({
152
153
 
153
154
  if (isFetching && !organization) {
154
155
  return (
155
- <div
156
+ <LoadingRegion
156
157
  className={cn("stg:space-y-4", className)}
157
- aria-busy="true"
158
- aria-label="Loading organization profile"
158
+ label="Loading organization profile"
159
159
  >
160
160
  {Array.from({ length: 4 }, (_, i) => (
161
161
  <div
@@ -164,7 +164,7 @@ export function OrgProfilePanel({
164
164
  style={{ width: `${90 - i * 12}%` }}
165
165
  />
166
166
  ))}
167
- </div>
167
+ </LoadingRegion>
168
168
  );
169
169
  }
170
170
 
@@ -342,7 +342,7 @@ export function OrgProfilePanel({
342
342
  </div>
343
343
 
344
344
  {/* -- Identity Providers summary -- */}
345
- <IdentityProvidersSummary orgId={orgId} orgSlug={serverSlug} />
345
+ <IdentityProvidersSummary org={org} orgSlug={serverSlug} />
346
346
  </form>
347
347
  );
348
348
  }
@@ -357,10 +357,10 @@ export function OrgProfilePanel({
357
357
  * not create providers; otherwise it says who manages them.
358
358
  */
359
359
  function IdentityProvidersSummary({
360
- orgId,
360
+ org,
361
361
  orgSlug,
362
362
  }: {
363
- orgId: string;
363
+ org: string;
364
364
  orgSlug: string;
365
365
  }) {
366
366
  const idpAvailable = useResourceAvailable(ApiResourceKind.identity_provider);
@@ -368,7 +368,7 @@ function IdentityProvidersSummary({
368
368
  idpAvailable && orgSlug ? orgSlug : null,
369
369
  );
370
370
  const createCheck = useCheckPermission(
371
- idpAvailable && orgId ? { kind: "organization", id: orgId } : null,
371
+ idpAvailable && org ? { kind: "organization", id: org } : null,
372
372
  "can_create_idp",
373
373
  );
374
374
  const deniedCreate = !createCheck.isLoading && !createCheck.allowed;
@@ -1,5 +1,6 @@
1
1
  export { OrgProvider, useOrg, useActiveOrgSlug, useActiveOrgId } from "./OrgProvider.js";
2
2
  export type { OrgContextValue } from "./OrgProvider.js";
3
+ export { useFollowSessionOrganization } from "./useFollowSessionOrganization.js";
3
4
  export { useOrgGate } from "./useOrgGate.js";
4
5
  export type {
5
6
  UseOrgGateOptions,
@@ -0,0 +1,54 @@
1
+ "use client";
2
+
3
+ /**
4
+ * useFollowSessionOrganization: a session page's shell follows the session
5
+ * into its own organization (stigmer/stigmer#1580).
6
+ *
7
+ * Session URLs name no organization, so a link can open a conversation
8
+ * that belongs to an organization other than the active one. The session
9
+ * surface already acts in the session's organization (SessionViewer reads
10
+ * `session.metadata.org`); this hook makes the rest of the shell agree
11
+ * with it: when the loaded session's organization is one of the person's
12
+ * and is not the active one, it becomes the active one, so the
13
+ * organization menu, the sidebar and every host control keyed on the
14
+ * active organization name the conversation's.
15
+ *
16
+ * It aligns once per visit to a conversation, when that session and the
17
+ * organization list have both loaded. A choice the person makes while the
18
+ * conversation stays open stands, so the hook never fights the
19
+ * organization menu; opening a conversation again is a new visit, and it
20
+ * follows that conversation again, as a link to it would. A session in an organization
21
+ * the person does not belong to (a guest's view of a share) switches
22
+ * nothing. The switch goes through OrgProvider's `setActiveOrg`, the
23
+ * programmatic path: it persists the choice and clears the fetch cache
24
+ * like any switch, and it fires no host `onOrgChanged` navigation.
25
+ */
26
+ import { useEffect, useRef } from "react";
27
+ import type { Session } from "@stigmer/protos/ai/stigmer/agentic/session/v1/api_pb";
28
+
29
+ import { useOrg } from "./OrgProvider.js";
30
+
31
+ /**
32
+ * Makes the loaded session's organization the active one, once per visit
33
+ * to the conversation, when the person belongs to it.
34
+ *
35
+ * @param session - The session the page shows, or null while it loads.
36
+ */
37
+ export function useFollowSessionOrganization(session: Session | null): void {
38
+ const { orgs, activeOrg, setActiveOrg, isLoading } = useOrg();
39
+ const followedSessionRef = useRef<string | null>(null);
40
+
41
+ const sessionId = session?.metadata?.id ?? "";
42
+ const sessionOrg = session?.metadata?.org ?? "";
43
+ const activeSlug = activeOrg?.metadata?.slug ?? "";
44
+
45
+ useEffect(() => {
46
+ if (sessionId === "" || sessionOrg === "" || isLoading || activeSlug === "")
47
+ return;
48
+ if (followedSessionRef.current === sessionId) return;
49
+ followedSessionRef.current = sessionId;
50
+ if (sessionOrg === activeSlug) return;
51
+ const target = orgs.find((org) => org.metadata?.slug === sessionOrg);
52
+ if (target !== undefined) setActiveOrg(target);
53
+ }, [sessionId, sessionOrg, activeSlug, isLoading, orgs, setActiveOrg]);
54
+ }
@@ -81,7 +81,7 @@ export function planInputFromDraft(draft: PlanDraft): PlanDraftResult {
81
81
  }
82
82
  const managed = draft.features.includes(Feature.managed_organizations);
83
83
  let includedManagedOrganizations: number | undefined;
84
- let perExtraOrganizationMicros: bigint | undefined;
84
+ let perExtraOrgMicros: bigint | undefined;
85
85
  if (managed && draft.includedManagedOrganizations.trim() !== "") {
86
86
  const included = Number(draft.includedManagedOrganizations.trim());
87
87
  if (!Number.isInteger(included) || included < 0) {
@@ -92,7 +92,7 @@ export function planInputFromDraft(draft: PlanDraft): PlanDraftResult {
92
92
  if (fee === null) {
93
93
  return { ok: false, field: "perExtraOrganizationUsd", message: "A dollar amount per organization, e.g. 25." };
94
94
  }
95
- perExtraOrganizationMicros = fee;
95
+ perExtraOrgMicros = fee;
96
96
  }
97
97
  return {
98
98
  ok: true,
@@ -108,7 +108,7 @@ export function planInputFromDraft(draft: PlanDraft): PlanDraftResult {
108
108
  terms: {
109
109
  monthlyMinimumMicros: minimum,
110
110
  usageShareBasisPoints: share,
111
- ...(perExtraOrganizationMicros === undefined ? {} : { perExtraOrganizationMicros }),
111
+ ...(perExtraOrgMicros === undefined ? {} : { perExtraOrgMicros }),
112
112
  },
113
113
  },
114
114
  };
@@ -13,6 +13,7 @@ import { usePlatformClientList } from "./usePlatformClientList.js";
13
13
  import { useDeletePlatformClient } from "./useDeletePlatformClient.js";
14
14
  import { SpinnerIcon } from "../internal/SpinnerIcon.js";
15
15
  import { isPlatformClientExpired } from "./expiry.js";
16
+ import { LoadingRegion } from "../internal/LoadingRegion.js";
16
17
 
17
18
  /** Props for {@link PlatformClientListPanel}. */
18
19
  export interface PlatformClientListPanelProps {
@@ -87,10 +88,9 @@ export function PlatformClientListPanel({
87
88
 
88
89
  if (isLoading) {
89
90
  return (
90
- <div
91
+ <LoadingRegion
91
92
  className={cn("stg:space-y-2", className)}
92
- aria-busy="true"
93
- aria-label="Loading platform clients"
93
+ label="Loading platform clients"
94
94
  >
95
95
  {Array.from({ length: 2 }, (_, i) => (
96
96
  <div
@@ -98,7 +98,7 @@ export function PlatformClientListPanel({
98
98
  className="stg:bg-muted-subtle stg:h-14 stg:animate-pulse stg:rounded-lg"
99
99
  />
100
100
  ))}
101
- </div>
101
+ </LoadingRegion>
102
102
  );
103
103
  }
104
104
 
@@ -49,6 +49,7 @@ import { PluginIcon } from "./PluginIcon.js";
49
49
  import { usePlugin } from "./usePlugin.js";
50
50
  import { usePluginMembers } from "./usePluginMembers.js";
51
51
  import { usePluginVersions } from "./usePluginVersions.js";
52
+ import { LoadingRegion } from "../internal/LoadingRegion.js";
52
53
 
53
54
  const OVERVIEW_TAB: TabItem = { id: "overview", label: "Overview" };
54
55
  const VERSIONS_TAB: TabItem = { id: "versions", label: "Versions" };
@@ -526,7 +527,7 @@ function stateLabel(state: PluginState): string | undefined {
526
527
 
527
528
  function LoadingSkeleton({ className }: { readonly className?: string }) {
528
529
  return (
529
- <div className={cn("stg:flex stg:flex-col stg:gap-6", className)} aria-busy="true" aria-label="Loading plugin details">
530
+ <LoadingRegion className={cn("stg:flex stg:flex-col stg:gap-6", className)} label="Loading plugin details">
530
531
  <div className="stg:flex stg:items-start stg:gap-3">
531
532
  <div className="stg:mt-1 stg:size-6 stg:shrink-0 stg:animate-pulse stg:rounded stg:bg-muted" />
532
533
  <div className="stg:flex-1 stg:space-y-2">
@@ -535,7 +536,7 @@ function LoadingSkeleton({ className }: { readonly className?: string }) {
535
536
  </div>
536
537
  </div>
537
538
  <div className="stg:h-24 stg:animate-pulse stg:rounded-lg stg:bg-muted" />
538
- </div>
539
+ </LoadingRegion>
539
540
  );
540
541
  }
541
542
 
@@ -29,6 +29,14 @@ import { createContext, useContext } from "react";
29
29
  * - an `HTMLElement` (the mounted themed container): portaled content
30
30
  * renders inside it and inherits the `--stgm-*` token scope.
31
31
  *
32
+ * One more source sets the value: an SDK modal dialog (`DialogShell`)
33
+ * re-provides it with an element inside the `<dialog>`, `null` until that
34
+ * element mounts. A modal dialog is in the browser's top layer and makes
35
+ * the rest of the document inert, so a popup portaled to `document.body`
36
+ * from inside it would paint beneath it and take no input (stigmer#1509).
37
+ * The element inherits the theme from the provider's in-tree scope, and
38
+ * carries no `data-stgm-portal` marker.
39
+ *
32
40
  * The default MUST stay `undefined`, never `null`: an explicit `null`
33
41
  * makes Base UI portals render NOWHERE, which breaks every popup for
34
42
  * consumers embedding components outside a provider (stigmer-cloud#271).
package/src/provider.tsx CHANGED
@@ -285,7 +285,10 @@ const EMPTY_REVIEW_RENDERERS: ReviewRenderers = {};
285
285
  * Two stable selector hooks are part of the public contract:
286
286
  * `data-stgm-root` marks the in-tree container (and only it);
287
287
  * `data-stgm-portal` marks the portal container appended to
288
- * `document.body` for portaled surfaces.
288
+ * `document.body` for portaled surfaces. A popup opened inside an SDK
289
+ * modal dialog renders inside that dialog instead (the browser's top
290
+ * layer would otherwise cover it), so it is not under
291
+ * `[data-stgm-portal]`.
289
292
  *
290
293
  * The `colorMode` prop controls dark/light appearance via a
291
294
  * `data-stgm-color-mode` attribute on the scoping container.
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { createContext, useContext } from "react";
4
4
  import { useStigmer } from "./hooks.js";
5
+ import { trimTrailing } from "./internal/trim.js";
5
6
 
6
7
  /**
7
8
  * React context for the server's public base URL: the address the Stigmer
@@ -50,7 +51,7 @@ export function resolvePublicBaseUrl(
50
51
  ): string | null {
51
52
  for (const candidate of [hostPublicBaseUrl, clientBaseUrl]) {
52
53
  if (candidate !== undefined && isAbsoluteUrl(candidate)) {
53
- return candidate.replace(/\/+$/, "");
54
+ return trimTrailing(candidate, "/");
54
55
  }
55
56
  }
56
57
  return null;
@@ -78,6 +78,7 @@ import { useSetScheduleEnabled } from "./useSetScheduleEnabled.js";
78
78
  import { useTriggerSchedule } from "./useTriggerSchedule.js";
79
79
  import { useUpdateScheduleSpec } from "./useUpdateScheduleSpec.js";
80
80
  import { SpinnerIcon } from "../internal/SpinnerIcon.js";
81
+ import { LoadingRegion } from "../internal/LoadingRegion.js";
81
82
 
82
83
  /** Props for {@link ScheduleDetailView}. */
83
84
  export interface ScheduleDetailViewProps {
@@ -1552,10 +1553,9 @@ function ReferenceLink({
1552
1553
 
1553
1554
  function LoadingSkeleton({ className }: { readonly className?: string }) {
1554
1555
  return (
1555
- <div
1556
+ <LoadingRegion
1556
1557
  className={cn("stg:flex stg:flex-col stg:gap-6", className)}
1557
- aria-busy="true"
1558
- aria-label="Loading schedule details"
1558
+ label="Loading schedule details"
1559
1559
  >
1560
1560
  <div className="stg:flex stg:items-start stg:gap-3">
1561
1561
  <div className="stg:mt-1 stg:size-6 stg:shrink-0 stg:animate-pulse stg:rounded stg:bg-muted" />
@@ -1578,7 +1578,7 @@ function LoadingSkeleton({ className }: { readonly className?: string }) {
1578
1578
  style={{ height: "160px" }}
1579
1579
  />
1580
1580
  </div>
1581
- </div>
1581
+ </LoadingRegion>
1582
1582
  );
1583
1583
  }
1584
1584