@stigmer/react 3.41.0 → 3.41.1-dev.20261003094357.g39d6aa748646
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.
- package/README.md +1 -1
- package/access/ManageAccessButton.d.ts +1 -1
- package/access/ManageAccessButton.js +1 -1
- package/access/ManageAccessDialog.js +1 -1
- package/access/ManageAccessDialog.js.map +1 -1
- package/agent/AgentDetailView.d.ts.map +1 -1
- package/agent/AgentDetailView.js +2 -1
- package/agent/AgentDetailView.js.map +1 -1
- package/api-key/ApiKeyListPanel.d.ts.map +1 -1
- package/api-key/ApiKeyListPanel.js +2 -1
- package/api-key/ApiKeyListPanel.js.map +1 -1
- package/attachment/AttachmentImageLightbox.d.ts.map +1 -1
- package/attachment/AttachmentImageLightbox.js.map +1 -1
- package/billing/AutoRechargeCard.d.ts +3 -3
- package/billing/AutoRechargeCard.d.ts.map +1 -1
- package/billing/AutoRechargeCard.js +4 -4
- package/billing/AutoRechargeCard.js.map +1 -1
- package/billing/BillingSection.d.ts.map +1 -1
- package/billing/BillingSection.js +7 -6
- package/billing/BillingSection.js.map +1 -1
- package/billing/CreditLedgerTable.d.ts +3 -3
- package/billing/CreditLedgerTable.d.ts.map +1 -1
- package/billing/CreditLedgerTable.js +3 -3
- package/billing/CreditLedgerTable.js.map +1 -1
- package/billing/CreditPackGrid.d.ts +1 -1
- package/billing/CreditPackGrid.js +1 -1
- package/billing/PaymentMethodCard.d.ts +1 -1
- package/billing/PaymentMethodCard.js +1 -1
- package/billing/PlanSection.d.ts +3 -3
- package/billing/PlanSection.d.ts.map +1 -1
- package/billing/PlanSection.js +4 -3
- package/billing/PlanSection.js.map +1 -1
- package/billing/ProviderKeysSection.js +13 -13
- package/billing/ProviderKeysSection.js.map +1 -1
- package/billing/plan-features.js +1 -1
- package/billing/plan-features.js.map +1 -1
- package/billing/useBillingAccount.d.ts +4 -4
- package/billing/useBillingAccount.d.ts.map +1 -1
- package/billing/useBillingAccount.js +7 -7
- package/billing/useBillingAccount.js.map +1 -1
- package/billing/useBillingUsageReport.d.ts +4 -4
- package/billing/useBillingUsageReport.d.ts.map +1 -1
- package/billing/useBillingUsageReport.js +7 -7
- package/billing/useBillingUsageReport.js.map +1 -1
- package/billing/useChangePlan.d.ts +2 -2
- package/billing/useChangePlan.d.ts.map +1 -1
- package/billing/useChangePlan.js +4 -4
- package/billing/useChangePlan.js.map +1 -1
- package/billing/useCreateBillingPortalSession.d.ts +2 -2
- package/billing/useCreateBillingPortalSession.d.ts.map +1 -1
- package/billing/useCreateBillingPortalSession.js +3 -3
- package/billing/useCreateBillingPortalSession.js.map +1 -1
- package/billing/useCreateCheckoutSession.d.ts +2 -2
- package/billing/useCreateCheckoutSession.d.ts.map +1 -1
- package/billing/useCreateCheckoutSession.js +2 -2
- package/billing/useCreateCheckoutSession.js.map +1 -1
- package/billing/useCreatePaymentMethodSetupSession.d.ts +1 -1
- package/billing/useCreatePaymentMethodSetupSession.d.ts.map +1 -1
- package/billing/useCreatePaymentMethodSetupSession.js +2 -2
- package/billing/useCreatePaymentMethodSetupSession.js.map +1 -1
- package/billing/useCreditLedger.d.ts +4 -4
- package/billing/useCreditLedger.d.ts.map +1 -1
- package/billing/useCreditLedger.js +7 -7
- package/billing/useCreditLedger.js.map +1 -1
- package/billing/useCustomerModelPricing.d.ts +4 -4
- package/billing/useCustomerModelPricing.d.ts.map +1 -1
- package/billing/useCustomerModelPricing.js +6 -6
- package/billing/useCustomerModelPricing.js.map +1 -1
- package/billing/useEntitlements.d.ts +2 -2
- package/billing/useEntitlements.d.ts.map +1 -1
- package/billing/useEntitlements.js +4 -4
- package/billing/useEntitlements.js.map +1 -1
- package/billing/usePeriodEstimate.d.ts +1 -1
- package/billing/usePeriodEstimate.d.ts.map +1 -1
- package/billing/usePeriodEstimate.js +3 -3
- package/billing/usePeriodEstimate.js.map +1 -1
- package/billing/useProviderKeys.d.ts +5 -5
- package/billing/useProviderKeys.d.ts.map +1 -1
- package/billing/useProviderKeys.js +7 -7
- package/billing/useProviderKeys.js.map +1 -1
- package/billing/useSetAutoRechargeConfig.d.ts +2 -2
- package/billing/useSetAutoRechargeConfig.d.ts.map +1 -1
- package/billing/useSetAutoRechargeConfig.js +2 -2
- package/billing/useSetAutoRechargeConfig.js.map +1 -1
- package/billing/useSubscription.d.ts +3 -3
- package/billing/useSubscription.d.ts.map +1 -1
- package/billing/useSubscription.js +7 -7
- package/billing/useSubscription.js.map +1 -1
- package/channel-app/ChannelAppListPanel.d.ts.map +1 -1
- package/channel-app/ChannelAppListPanel.js +2 -1
- package/channel-app/ChannelAppListPanel.js.map +1 -1
- package/channel-app/slackAppSetup.d.ts +0 -23
- package/channel-app/slackAppSetup.d.ts.map +1 -1
- package/channel-app/slackAppSetup.js +3 -2
- package/channel-app/slackAppSetup.js.map +1 -1
- package/channel-app/whatsappAppSetup.d.ts +0 -26
- package/channel-app/whatsappAppSetup.d.ts.map +1 -1
- package/channel-app/whatsappAppSetup.js +2 -1
- package/channel-app/whatsappAppSetup.js.map +1 -1
- package/cursor-accounts/CursorAccountEditor.js +3 -3
- package/cursor-accounts/CursorAccountEditor.js.map +1 -1
- package/cursor-accounts/CursorAccountsConsole.js +3 -3
- package/cursor-accounts/CursorAccountsConsole.js.map +1 -1
- package/dashboard/OperationalDashboard.d.ts +1 -4
- package/dashboard/OperationalDashboard.d.ts.map +1 -1
- package/dashboard/OperationalDashboard.js +1 -3
- package/dashboard/OperationalDashboard.js.map +1 -1
- package/dashboard/useDashboardSummary.d.ts +1 -3
- package/dashboard/useDashboardSummary.d.ts.map +1 -1
- package/dashboard/useDashboardSummary.js +1 -1
- package/dashboard/useDashboardSummary.js.map +1 -1
- package/environment/EnvironmentListPanel.d.ts.map +1 -1
- package/environment/EnvironmentListPanel.js +2 -1
- package/environment/EnvironmentListPanel.js.map +1 -1
- package/environment/EnvironmentVariableEditor.d.ts.map +1 -1
- package/environment/EnvironmentVariableEditor.js +2 -1
- package/environment/EnvironmentVariableEditor.js.map +1 -1
- package/execution/ArtifactFileContent.d.ts.map +1 -1
- package/execution/ArtifactFileContent.js +2 -1
- package/execution/ArtifactFileContent.js.map +1 -1
- package/execution/McpToolDetail.d.ts.map +1 -1
- package/execution/McpToolDetail.js +2 -1
- package/execution/McpToolDetail.js.map +1 -1
- package/execution/ResultView.d.ts.map +1 -1
- package/execution/ResultView.js +2 -1
- package/execution/ResultView.js.map +1 -1
- package/execution/TerminalSession.js +1 -1
- package/execution/TerminalSession.js.map +1 -1
- package/execution/ThreadSkeleton.d.ts.map +1 -1
- package/execution/ThreadSkeleton.js +2 -1
- package/execution/ThreadSkeleton.js.map +1 -1
- package/execution/file-path-resolver.d.ts.map +1 -1
- package/execution/file-path-resolver.js +3 -2
- package/execution/file-path-resolver.js.map +1 -1
- package/execution/sandbox-path-normalizer.d.ts +0 -11
- package/execution/sandbox-path-normalizer.d.ts.map +1 -1
- package/execution/sandbox-path-normalizer.js +2 -1
- package/execution/sandbox-path-normalizer.js.map +1 -1
- package/github/parseGitUrl.d.ts.map +1 -1
- package/github/parseGitUrl.js +16 -4
- package/github/parseGitUrl.js.map +1 -1
- package/iam-policy/GrantAccessForm.d.ts +3 -3
- package/iam-policy/GrantAccessForm.d.ts.map +1 -1
- package/iam-policy/GrantAccessForm.js +3 -3
- package/iam-policy/GrantAccessForm.js.map +1 -1
- package/iam-policy/OrgMembersPanel.d.ts +3 -3
- package/iam-policy/OrgMembersPanel.d.ts.map +1 -1
- package/iam-policy/OrgMembersPanel.js +4 -3
- package/iam-policy/OrgMembersPanel.js.map +1 -1
- package/iam-policy/PeopleWithAccess.d.ts +2 -2
- package/iam-policy/PeopleWithAccess.d.ts.map +1 -1
- package/iam-policy/PeopleWithAccess.js +2 -2
- package/iam-policy/PeopleWithAccess.js.map +1 -1
- package/iam-policy/PrincipalPicker.d.ts +2 -2
- package/iam-policy/PrincipalPicker.d.ts.map +1 -1
- package/iam-policy/PrincipalPicker.js +2 -2
- package/iam-policy/PrincipalPicker.js.map +1 -1
- package/iam-policy/SharePanel.d.ts +3 -3
- package/iam-policy/SharePanel.d.ts.map +1 -1
- package/iam-policy/SharePanel.js +3 -3
- package/iam-policy/SharePanel.js.map +1 -1
- package/iam-policy/useCreateIamPolicy.d.ts +1 -1
- package/iam-policy/useCreateIamPolicy.js +1 -1
- package/iam-policy/useDeleteIamPolicy.d.ts +1 -1
- package/iam-policy/useDeleteIamPolicy.js +1 -1
- package/iam-policy/useGranteeCandidates.d.ts +3 -3
- package/iam-policy/useGranteeCandidates.d.ts.map +1 -1
- package/iam-policy/useGranteeCandidates.js +2 -2
- package/iam-policy/useGranteeCandidates.js.map +1 -1
- package/iam-policy/useOwnerAssignment.d.ts +2 -2
- package/iam-policy/useOwnerAssignment.d.ts.map +1 -1
- package/iam-policy/useOwnerAssignment.js +3 -3
- package/iam-policy/useOwnerAssignment.js.map +1 -1
- package/iam-policy/usePrincipalsCount.d.ts +4 -4
- package/iam-policy/usePrincipalsCount.d.ts.map +1 -1
- package/iam-policy/usePrincipalsCount.js +7 -7
- package/iam-policy/usePrincipalsCount.js.map +1 -1
- package/iam-policy/useResourceAccess.d.ts +1 -1
- package/iam-policy/useResourceAccess.js +1 -1
- package/iam-policy/useRevokeOrgAccess.d.ts +1 -1
- package/iam-policy/useRevokeOrgAccess.d.ts.map +1 -1
- package/iam-policy/useRevokeOrgAccess.js +2 -2
- package/iam-policy/useRevokeOrgAccess.js.map +1 -1
- package/identity-account/AccountPreferencesPanel.d.ts.map +1 -1
- package/identity-account/AccountPreferencesPanel.js +2 -1
- package/identity-account/AccountPreferencesPanel.js.map +1 -1
- package/identity-provider/IdentityProviderDetailPanel.js +4 -4
- package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
- package/identity-provider/IdentityProviderListPanel.d.ts.map +1 -1
- package/identity-provider/IdentityProviderListPanel.js +2 -1
- package/identity-provider/IdentityProviderListPanel.js.map +1 -1
- package/identity-provider/IdentityProviderWizard.js +1 -1
- package/identity-provider/IdentityProviderWizard.js.map +1 -1
- package/identity-provider/SsoLoginPrompt.js +2 -1
- package/identity-provider/SsoLoginPrompt.js.map +1 -1
- package/identity-provider/useIdentityProviderList.d.ts +2 -2
- package/identity-provider/useIdentityProviderList.js +2 -2
- package/index.d.ts +1 -1
- package/index.d.ts.map +1 -1
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/inline-edit/InlineEditImage.d.ts +4 -0
- package/inline-edit/InlineEditImage.d.ts.map +1 -1
- package/inline-edit/InlineEditImage.js +12 -11
- package/inline-edit/InlineEditImage.js.map +1 -1
- package/inline-edit/InlineEditText.d.ts +4 -0
- package/inline-edit/InlineEditText.d.ts.map +1 -1
- package/inline-edit/InlineEditText.js +12 -11
- package/inline-edit/InlineEditText.js.map +1 -1
- package/inline-edit/InlineEditTextarea.d.ts +4 -0
- package/inline-edit/InlineEditTextarea.d.ts.map +1 -1
- package/inline-edit/InlineEditTextarea.js +11 -16
- package/inline-edit/InlineEditTextarea.js.map +1 -1
- package/inline-edit/useInlineDraft.d.ts +26 -0
- package/inline-edit/useInlineDraft.d.ts.map +1 -0
- package/inline-edit/useInlineDraft.js +61 -0
- package/inline-edit/useInlineDraft.js.map +1 -0
- package/internal/DialogShell.d.ts +21 -0
- package/internal/DialogShell.d.ts.map +1 -1
- package/internal/DialogShell.js +51 -4
- package/internal/DialogShell.js.map +1 -1
- package/internal/LoadingRegion.d.ts +35 -0
- package/internal/LoadingRegion.d.ts.map +1 -0
- package/internal/LoadingRegion.js +33 -0
- package/internal/LoadingRegion.js.map +1 -0
- package/internal/markdown-components.d.ts.map +1 -1
- package/internal/markdown-components.js +18 -4
- package/internal/markdown-components.js.map +1 -1
- package/internal/trim.d.ts +7 -0
- package/internal/trim.d.ts.map +1 -0
- package/internal/trim.js +12 -0
- package/internal/trim.js.map +1 -0
- package/invitation/InvitationManager.d.ts.map +1 -1
- package/invitation/InvitationManager.js +2 -1
- package/invitation/InvitationManager.js.map +1 -1
- package/invitation/InvitationRedemption.d.ts.map +1 -1
- package/invitation/InvitationRedemption.js +5 -4
- package/invitation/InvitationRedemption.js.map +1 -1
- package/invitation/useInvitationPreview.d.ts +1 -1
- package/invitation/useInvitationPreview.js +1 -1
- package/licenses/LicenseDetail.d.ts.map +1 -1
- package/licenses/LicenseDetail.js +3 -3
- package/licenses/LicenseDetail.js.map +1 -1
- package/licenses/LicenseIssueForm.js +6 -6
- package/licenses/LicenseIssueForm.js.map +1 -1
- package/licenses/license-draft.d.ts +1 -1
- package/licenses/license-draft.d.ts.map +1 -1
- package/licenses/license-draft.js +3 -3
- package/licenses/license-draft.js.map +1 -1
- package/licenses/license-format.js +1 -1
- package/licenses/license-format.js.map +1 -1
- package/mcp-server/McpServerDetailView.d.ts.map +1 -1
- package/mcp-server/McpServerDetailView.js +2 -1
- package/mcp-server/McpServerDetailView.js.map +1 -1
- package/memory/MemoryListPanel.d.ts.map +1 -1
- package/memory/MemoryListPanel.js +2 -1
- package/memory/MemoryListPanel.js.map +1 -1
- package/oauth-app/OAuthAppListPanel.d.ts.map +1 -1
- package/oauth-app/OAuthAppListPanel.js +2 -1
- package/oauth-app/OAuthAppListPanel.js.map +1 -1
- package/organization/OrgPreferencesPanel.d.ts +3 -3
- package/organization/OrgPreferencesPanel.d.ts.map +1 -1
- package/organization/OrgPreferencesPanel.js +6 -5
- package/organization/OrgPreferencesPanel.js.map +1 -1
- package/organization/OrgProfilePanel.d.ts +3 -3
- package/organization/OrgProfilePanel.d.ts.map +1 -1
- package/organization/OrgProfilePanel.js +8 -7
- package/organization/OrgProfilePanel.js.map +1 -1
- package/organization/index.d.ts +1 -0
- package/organization/index.d.ts.map +1 -1
- package/organization/index.js +1 -0
- package/organization/index.js.map +1 -1
- package/organization/useFollowSessionOrganization.d.ts +9 -0
- package/organization/useFollowSessionOrganization.d.ts.map +1 -0
- package/organization/useFollowSessionOrganization.js +52 -0
- package/organization/useFollowSessionOrganization.js.map +1 -0
- package/package.json +5 -5
- package/plan-catalog/plan-draft.js +3 -3
- package/plan-catalog/plan-draft.js.map +1 -1
- package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
- package/platform-client/PlatformClientListPanel.js +2 -1
- package/platform-client/PlatformClientListPanel.js.map +1 -1
- package/plugin/PluginDetailView.d.ts.map +1 -1
- package/plugin/PluginDetailView.js +2 -1
- package/plugin/PluginDetailView.js.map +1 -1
- package/portal-container.d.ts +8 -0
- package/portal-container.d.ts.map +1 -1
- package/portal-container.js +8 -0
- package/portal-container.js.map +1 -1
- package/provider.d.ts +4 -1
- package/provider.d.ts.map +1 -1
- package/provider.js +4 -1
- package/provider.js.map +1 -1
- package/public-base-url-context.d.ts.map +1 -1
- package/public-base-url-context.js +2 -1
- package/public-base-url-context.js.map +1 -1
- package/schedule/ScheduleDetailView.d.ts.map +1 -1
- package/schedule/ScheduleDetailView.js +2 -1
- package/schedule/ScheduleDetailView.js.map +1 -1
- package/session/SessionViewer.d.ts +7 -2
- package/session/SessionViewer.d.ts.map +1 -1
- package/session/SessionViewer.js +7 -2
- package/session/SessionViewer.js.map +1 -1
- package/session/useSessionConversation.d.ts +10 -1
- package/session/useSessionConversation.d.ts.map +1 -1
- package/session/useSessionConversation.js +5 -3
- package/session/useSessionConversation.js.map +1 -1
- package/settings/EnvironmentsSection.d.ts.map +1 -1
- package/settings/EnvironmentsSection.js +2 -1
- package/settings/EnvironmentsSection.js.map +1 -1
- package/settings/MembersSection.js +2 -2
- package/settings/MembersSection.js.map +1 -1
- package/settings/OrgPreferencesSection.js +1 -1
- package/settings/OrgPreferencesSection.js.map +1 -1
- package/settings/OrgProfileSection.js +1 -1
- package/settings/OrgProfileSection.js.map +1 -1
- package/settings/TeamsSection.js +1 -1
- package/settings/TeamsSection.js.map +1 -1
- package/settings/UsageSection.js +1 -1
- package/settings/UsageSection.js.map +1 -1
- package/sharing/ShareAgentDialog.d.ts.map +1 -1
- package/sharing/ShareAgentDialog.js +2 -1
- package/sharing/ShareAgentDialog.js.map +1 -1
- package/sharing/SharedAgentChat.d.ts.map +1 -1
- package/sharing/SharedAgentChat.js +2 -1
- package/sharing/SharedAgentChat.js.map +1 -1
- package/sidebar/WorkspaceSidebar.d.ts.map +1 -1
- package/sidebar/WorkspaceSidebar.js +2 -1
- package/sidebar/WorkspaceSidebar.js.map +1 -1
- package/skill/SkillDetailView.d.ts.map +1 -1
- package/skill/SkillDetailView.js +2 -1
- package/skill/SkillDetailView.js.map +1 -1
- package/skill/SkillDiffDialog.d.ts.map +1 -1
- package/skill/SkillDiffDialog.js +2 -1
- package/skill/SkillDiffDialog.js.map +1 -1
- package/skill/SkillFileBrowser.d.ts.map +1 -1
- package/skill/SkillFileBrowser.js +2 -1
- package/skill/SkillFileBrowser.js.map +1 -1
- package/src/access/ManageAccessButton.tsx +1 -1
- package/src/access/ManageAccessDialog.tsx +1 -1
- package/src/agent/AgentDetailView.tsx +4 -4
- package/src/api-key/ApiKeyListPanel.tsx +4 -4
- package/src/attachment/AttachmentImageLightbox.tsx +3 -4
- package/src/billing/AutoRechargeCard.tsx +5 -5
- package/src/billing/BillingSection.tsx +10 -9
- package/src/billing/CreditLedgerTable.tsx +4 -4
- package/src/billing/CreditPackGrid.tsx +1 -1
- package/src/billing/PaymentMethodCard.tsx +1 -1
- package/src/billing/PlanSection.tsx +6 -5
- package/src/billing/ProviderKeysSection.tsx +15 -15
- package/src/billing/plan-features.ts +1 -1
- package/src/billing/useBillingAccount.ts +7 -7
- package/src/billing/useBillingUsageReport.ts +7 -7
- package/src/billing/useChangePlan.ts +6 -6
- package/src/billing/useCreateBillingPortalSession.ts +4 -4
- package/src/billing/useCreateCheckoutSession.ts +3 -3
- package/src/billing/useCreatePaymentMethodSetupSession.ts +3 -3
- package/src/billing/useCreditLedger.ts +7 -7
- package/src/billing/useCustomerModelPricing.ts +7 -7
- package/src/billing/useEntitlements.ts +5 -5
- package/src/billing/usePeriodEstimate.ts +4 -4
- package/src/billing/useProviderKeys.ts +12 -12
- package/src/billing/useSetAutoRechargeConfig.ts +3 -3
- package/src/billing/useSubscription.ts +7 -7
- package/src/channel-app/ChannelAppListPanel.tsx +4 -4
- package/src/channel-app/slackAppSetup.ts +3 -2
- package/src/channel-app/whatsappAppSetup.ts +2 -1
- package/src/cursor-accounts/CursorAccountEditor.tsx +3 -3
- package/src/cursor-accounts/CursorAccountsConsole.tsx +5 -5
- package/src/dashboard/OperationalDashboard.tsx +1 -6
- package/src/dashboard/useDashboardSummary.ts +2 -4
- package/src/environment/EnvironmentListPanel.tsx +4 -4
- package/src/environment/EnvironmentVariableEditor.tsx +4 -4
- package/src/execution/ArtifactFileContent.tsx +3 -2
- package/src/execution/McpToolDetail.tsx +3 -3
- package/src/execution/ResultView.tsx +3 -3
- package/src/execution/TerminalSession.tsx +1 -1
- package/src/execution/ThreadSkeleton.tsx +4 -4
- package/src/execution/file-path-resolver.ts +3 -2
- package/src/execution/sandbox-path-normalizer.ts +2 -1
- package/src/github/parseGitUrl.ts +13 -4
- package/src/iam-policy/GrantAccessForm.tsx +4 -4
- package/src/iam-policy/OrgMembersPanel.tsx +7 -7
- package/src/iam-policy/PeopleWithAccess.tsx +3 -3
- package/src/iam-policy/PrincipalPicker.tsx +3 -3
- package/src/iam-policy/SharePanel.tsx +4 -4
- package/src/iam-policy/useCreateIamPolicy.ts +1 -1
- package/src/iam-policy/useDeleteIamPolicy.ts +1 -1
- package/src/iam-policy/useGranteeCandidates.ts +3 -3
- package/src/iam-policy/useOwnerAssignment.ts +3 -3
- package/src/iam-policy/usePrincipalsCount.ts +7 -7
- package/src/iam-policy/useResourceAccess.ts +1 -1
- package/src/iam-policy/useRevokeOrgAccess.ts +3 -3
- package/src/identity-account/AccountPreferencesPanel.tsx +4 -4
- package/src/identity-provider/IdentityProviderDetailPanel.tsx +3 -9
- package/src/identity-provider/IdentityProviderListPanel.tsx +4 -4
- package/src/identity-provider/IdentityProviderWizard.tsx +1 -1
- package/src/identity-provider/SsoLoginPrompt.tsx +6 -5
- package/src/identity-provider/useIdentityProviderList.ts +2 -2
- package/src/index.ts +1 -0
- package/src/inline-edit/InlineEditImage.tsx +13 -11
- package/src/inline-edit/InlineEditText.tsx +13 -11
- package/src/inline-edit/InlineEditTextarea.tsx +12 -16
- package/src/inline-edit/useInlineDraft.ts +85 -0
- package/src/internal/DialogShell.tsx +80 -3
- package/src/internal/LoadingRegion.tsx +46 -0
- package/src/internal/loading-region-markup.json +71 -0
- package/src/internal/markdown-components.tsx +15 -4
- package/src/internal/trim.ts +10 -0
- package/src/invitation/InvitationManager.tsx +4 -4
- package/src/invitation/InvitationRedemption.tsx +7 -7
- package/src/invitation/useInvitationPreview.ts +1 -1
- package/src/licenses/LicenseDetail.tsx +8 -6
- package/src/licenses/LicenseIssueForm.tsx +6 -6
- package/src/licenses/license-draft.ts +4 -4
- package/src/licenses/license-format.ts +1 -1
- package/src/mcp-server/McpServerDetailView.tsx +4 -4
- package/src/memory/MemoryListPanel.tsx +4 -4
- package/src/oauth-app/OAuthAppListPanel.tsx +4 -4
- package/src/organization/OrgPreferencesPanel.tsx +9 -9
- package/src/organization/OrgProfilePanel.tsx +12 -12
- package/src/organization/index.ts +1 -0
- package/src/organization/useFollowSessionOrganization.ts +54 -0
- package/src/plan-catalog/plan-draft.ts +3 -3
- package/src/platform-client/PlatformClientListPanel.tsx +4 -4
- package/src/plugin/PluginDetailView.tsx +3 -2
- package/src/portal-container.ts +8 -0
- package/src/provider.tsx +4 -1
- package/src/public-base-url-context.ts +2 -1
- package/src/schedule/ScheduleDetailView.tsx +4 -4
- package/src/session/SessionViewer.tsx +13 -3
- package/src/session/useSessionConversation.ts +14 -3
- package/src/settings/EnvironmentsSection.tsx +3 -2
- package/src/settings/MembersSection.tsx +3 -3
- package/src/settings/OrgPreferencesSection.tsx +1 -1
- package/src/settings/OrgProfileSection.tsx +1 -1
- package/src/settings/TeamsSection.tsx +1 -1
- package/src/settings/UsageSection.tsx +1 -1
- package/src/sharing/ShareAgentDialog.tsx +2 -1
- package/src/sharing/SharedAgentChat.tsx +4 -4
- package/src/sidebar/WorkspaceSidebar.tsx +3 -2
- package/src/skill/SkillDetailView.tsx +4 -4
- package/src/skill/SkillDiffDialog.tsx +4 -4
- package/src/skill/SkillFileBrowser.tsx +4 -4
- package/src/team/TeamDetailPanel.tsx +3 -3
- package/src/team/TeamListPanel.tsx +3 -2
- package/src/team/TeamMembersPanel.tsx +3 -3
- package/src/usage/OrgUsagePanel.tsx +9 -9
- package/src/usage/useExportCSV.ts +9 -9
- package/src/usage/useOrgUsageReport.ts +7 -7
- package/src/version-history/VersionTimeline.tsx +4 -4
- package/src/workflow/WorkflowVersionDiffViewer.tsx +4 -4
- package/src/workflow/WorkflowVersionTimeline.tsx +4 -4
- package/src/workflow/useDiagnoseExecutionFlow.ts +23 -18
- package/src/workflow/useExplainWorkflowFlow.ts +7 -3
- package/src/workflow/useRefineWorkflowFlow.ts +17 -10
- package/src/workflow/useWorkflowArchitectFlow.ts +7 -3
- package/src/workspace/ExplorerTree.tsx +4 -8
- package/src/workspace/FileViewer.tsx +4 -5
- package/styles.css +1 -1
- package/team/TeamDetailPanel.d.ts +2 -2
- package/team/TeamDetailPanel.d.ts.map +1 -1
- package/team/TeamDetailPanel.js +2 -2
- package/team/TeamDetailPanel.js.map +1 -1
- package/team/TeamListPanel.d.ts.map +1 -1
- package/team/TeamListPanel.js +2 -1
- package/team/TeamListPanel.js.map +1 -1
- package/team/TeamMembersPanel.d.ts +2 -2
- package/team/TeamMembersPanel.d.ts.map +1 -1
- package/team/TeamMembersPanel.js +2 -2
- package/team/TeamMembersPanel.js.map +1 -1
- package/usage/OrgUsagePanel.d.ts +3 -3
- package/usage/OrgUsagePanel.d.ts.map +1 -1
- package/usage/OrgUsagePanel.js +6 -5
- package/usage/OrgUsagePanel.js.map +1 -1
- package/usage/useExportCSV.d.ts +2 -2
- package/usage/useExportCSV.d.ts.map +1 -1
- package/usage/useExportCSV.js +9 -9
- package/usage/useExportCSV.js.map +1 -1
- package/usage/useOrgUsageReport.d.ts +4 -4
- package/usage/useOrgUsageReport.d.ts.map +1 -1
- package/usage/useOrgUsageReport.js +7 -7
- package/usage/useOrgUsageReport.js.map +1 -1
- package/version-history/VersionTimeline.d.ts.map +1 -1
- package/version-history/VersionTimeline.js +2 -1
- package/version-history/VersionTimeline.js.map +1 -1
- package/workflow/WorkflowVersionDiffViewer.d.ts.map +1 -1
- package/workflow/WorkflowVersionDiffViewer.js +2 -1
- package/workflow/WorkflowVersionDiffViewer.js.map +1 -1
- package/workflow/WorkflowVersionTimeline.d.ts.map +1 -1
- package/workflow/WorkflowVersionTimeline.js +2 -1
- package/workflow/WorkflowVersionTimeline.js.map +1 -1
- package/workflow/useDiagnoseExecutionFlow.d.ts.map +1 -1
- package/workflow/useDiagnoseExecutionFlow.js +23 -18
- package/workflow/useDiagnoseExecutionFlow.js.map +1 -1
- package/workflow/useExplainWorkflowFlow.d.ts.map +1 -1
- package/workflow/useExplainWorkflowFlow.js +7 -3
- package/workflow/useExplainWorkflowFlow.js.map +1 -1
- package/workflow/useRefineWorkflowFlow.d.ts.map +1 -1
- package/workflow/useRefineWorkflowFlow.js +14 -10
- package/workflow/useRefineWorkflowFlow.js.map +1 -1
- package/workflow/useWorkflowArchitectFlow.d.ts.map +1 -1
- package/workflow/useWorkflowArchitectFlow.js +7 -3
- package/workflow/useWorkflowArchitectFlow.js.map +1 -1
- package/workspace/ExplorerTree.d.ts.map +1 -1
- package/workspace/ExplorerTree.js +2 -5
- package/workspace/ExplorerTree.js.map +1 -1
- package/workspace/FileViewer.d.ts.map +1 -1
- package/workspace/FileViewer.js +2 -1
- 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
|
-
<
|
|
145
|
+
<LoadingRegion
|
|
145
146
|
className={cn("stg:mx-auto stg:max-w-sm", className)}
|
|
146
|
-
|
|
147
|
-
aria-label="Loading invitation"
|
|
147
|
+
label="Loading invitation"
|
|
148
148
|
>
|
|
149
149
|
<LoadingSkeleton />
|
|
150
|
-
</
|
|
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.
|
|
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.
|
|
195
|
-
const orgLogo = preview.
|
|
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.
|
|
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?.
|
|
120
|
-
<span className="stg:block stg:text-muted-foreground">{`Cloud organization ${customer.
|
|
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?.
|
|
144
|
-
? `${limits.
|
|
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.
|
|
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?.
|
|
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
|
-
|
|
157
|
+
org: selected.customer.org,
|
|
158
158
|
}
|
|
159
|
-
: { id: mintedId, displayName: newName, contactEmail: newEmail,
|
|
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
|
-
|
|
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.
|
|
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
|
|
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.
|
|
151
|
+
...(draft.maxOrgs !== undefined && { maxOrgs: draft.maxOrgs }),
|
|
152
152
|
};
|
|
153
|
-
const organization = draft.customer.
|
|
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?.
|
|
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
|
-
<
|
|
2206
|
+
<LoadingRegion
|
|
2206
2207
|
className={cn("stg:flex stg:flex-col stg:gap-6", className)}
|
|
2207
|
-
|
|
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
|
-
</
|
|
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
|
-
<
|
|
75
|
+
<LoadingRegion
|
|
75
76
|
className={cn("stg:space-y-2", className)}
|
|
76
|
-
|
|
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
|
-
</
|
|
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
|
-
<
|
|
80
|
+
<LoadingRegion
|
|
80
81
|
className={cn("stg:space-y-2", className)}
|
|
81
|
-
|
|
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
|
-
</
|
|
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
|
|
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
|
|
51
|
+
* <OrgPreferencesPanel org="org-id-123" />
|
|
51
52
|
* ```
|
|
52
53
|
*/
|
|
53
54
|
export function OrgPreferencesPanel({
|
|
54
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
<
|
|
181
|
+
<LoadingRegion
|
|
181
182
|
className={cn("stg:space-y-4", className)}
|
|
182
|
-
|
|
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
|
-
</
|
|
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
|
|
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
|
-
*
|
|
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
|
-
|
|
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(
|
|
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
|
-
<
|
|
156
|
+
<LoadingRegion
|
|
156
157
|
className={cn("stg:space-y-4", className)}
|
|
157
|
-
|
|
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
|
-
</
|
|
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
|
|
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
|
-
|
|
360
|
+
org,
|
|
361
361
|
orgSlug,
|
|
362
362
|
}: {
|
|
363
|
-
|
|
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 &&
|
|
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
|
|
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
|
-
|
|
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
|
-
...(
|
|
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
|
-
<
|
|
91
|
+
<LoadingRegion
|
|
91
92
|
className={cn("stg:space-y-2", className)}
|
|
92
|
-
|
|
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
|
-
</
|
|
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
|
-
<
|
|
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
|
-
</
|
|
539
|
+
</LoadingRegion>
|
|
539
540
|
);
|
|
540
541
|
}
|
|
541
542
|
|
package/src/portal-container.ts
CHANGED
|
@@ -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
|
|
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
|
-
<
|
|
1556
|
+
<LoadingRegion
|
|
1556
1557
|
className={cn("stg:flex stg:flex-col stg:gap-6", className)}
|
|
1557
|
-
|
|
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
|
-
</
|
|
1581
|
+
</LoadingRegion>
|
|
1582
1582
|
);
|
|
1583
1583
|
}
|
|
1584
1584
|
|