@stigmer/react 3.12.3 → 3.12.5
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/agent/steps/IdentityStep.d.ts.map +1 -1
- package/agent/steps/IdentityStep.js +2 -1
- package/agent/steps/IdentityStep.js.map +1 -1
- package/agent-instance/AgentInstanceDetailPanel.d.ts.map +1 -1
- package/agent-instance/AgentInstanceDetailPanel.js +2 -1
- package/agent-instance/AgentInstanceDetailPanel.js.map +1 -1
- package/api-key/CreateApiKeyForm.d.ts.map +1 -1
- package/api-key/CreateApiKeyForm.js +2 -1
- package/api-key/CreateApiKeyForm.js.map +1 -1
- package/attachment/AttachmentChipList.js +16 -6
- package/attachment/AttachmentChipList.js.map +1 -1
- package/attachment/index.d.ts +1 -1
- package/attachment/index.d.ts.map +1 -1
- package/attachment/index.js.map +1 -1
- package/attachment/useAttachments.d.ts +51 -8
- package/attachment/useAttachments.d.ts.map +1 -1
- package/attachment/useAttachments.js +74 -3
- package/attachment/useAttachments.js.map +1 -1
- package/channel/ChannelConversationsDialog.d.ts.map +1 -1
- package/channel/ChannelConversationsDialog.js +2 -1
- package/channel/ChannelConversationsDialog.js.map +1 -1
- package/channel/ChannelTemplatesDialog.d.ts.map +1 -1
- package/channel/ChannelTemplatesDialog.js +2 -1
- package/channel/ChannelTemplatesDialog.js.map +1 -1
- package/channel/ConnectSlackDialog.d.ts.map +1 -1
- package/channel/ConnectSlackDialog.js +2 -1
- package/channel/ConnectSlackDialog.js.map +1 -1
- package/channel/connect/ServingAppSection.d.ts.map +1 -1
- package/channel/connect/ServingAppSection.js +2 -1
- package/channel/connect/ServingAppSection.js.map +1 -1
- package/channel-app/CreateChannelAppForm.d.ts.map +1 -1
- package/channel-app/CreateChannelAppForm.js +2 -1
- package/channel-app/CreateChannelAppForm.js.map +1 -1
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +17 -10
- package/composer/SessionComposer.js.map +1 -1
- package/conversation/ConversationComposer.d.ts +19 -3
- package/conversation/ConversationComposer.d.ts.map +1 -1
- package/conversation/ConversationComposer.js +4 -4
- package/conversation/ConversationComposer.js.map +1 -1
- package/conversation/ConversationListPane.d.ts.map +1 -1
- package/conversation/ConversationListPane.js +2 -1
- package/conversation/ConversationListPane.js.map +1 -1
- package/conversation/ConversationTemplatePickerDialog.d.ts +63 -0
- package/conversation/ConversationTemplatePickerDialog.d.ts.map +1 -0
- package/conversation/ConversationTemplatePickerDialog.js +151 -0
- package/conversation/ConversationTemplatePickerDialog.js.map +1 -0
- package/conversation/ConversationTimelineView.d.ts.map +1 -1
- package/conversation/ConversationTimelineView.js +2 -1
- package/conversation/ConversationTimelineView.js.map +1 -1
- package/conversation/ConversationsWorkbench.d.ts.map +1 -1
- package/conversation/ConversationsWorkbench.js +16 -5
- package/conversation/ConversationsWorkbench.js.map +1 -1
- package/conversation/index.d.ts +3 -1
- package/conversation/index.d.ts.map +1 -1
- package/conversation/index.js +1 -0
- package/conversation/index.js.map +1 -1
- package/conversation/useConversationParticipation.d.ts +41 -4
- package/conversation/useConversationParticipation.d.ts.map +1 -1
- package/conversation/useConversationParticipation.js +13 -2
- package/conversation/useConversationParticipation.js.map +1 -1
- package/cursor-accounts/CursorAccountsConsole.d.ts.map +1 -1
- package/cursor-accounts/CursorAccountsConsole.js +2 -1
- package/cursor-accounts/CursorAccountsConsole.js.map +1 -1
- package/cursor-accounts/MemberKeysPanel.d.ts.map +1 -1
- package/cursor-accounts/MemberKeysPanel.js +2 -1
- package/cursor-accounts/MemberKeysPanel.js.map +1 -1
- package/dashboard/DashboardFailedRuns.d.ts.map +1 -1
- package/dashboard/DashboardFailedRuns.js +2 -1
- package/dashboard/DashboardFailedRuns.js.map +1 -1
- package/dependency-graph/DependencyGraph.d.ts.map +1 -1
- package/dependency-graph/DependencyGraph.js +2 -1
- package/dependency-graph/DependencyGraph.js.map +1 -1
- package/dependency-graph/DependencyTreeNode.d.ts.map +1 -1
- package/dependency-graph/DependencyTreeNode.js +2 -1
- package/dependency-graph/DependencyTreeNode.js.map +1 -1
- package/environment/EnvironmentPicker.d.ts.map +1 -1
- package/environment/EnvironmentPicker.js +2 -1
- package/environment/EnvironmentPicker.js.map +1 -1
- package/error/SecretFlowErrorGuide.d.ts.map +1 -1
- package/error/SecretFlowErrorGuide.js +2 -1
- package/error/SecretFlowErrorGuide.js.map +1 -1
- package/execution/ArtifactContentBody.d.ts.map +1 -1
- package/execution/ArtifactContentBody.js +2 -1
- package/execution/ArtifactContentBody.js.map +1 -1
- package/execution/ArtifactsWidget.d.ts.map +1 -1
- package/execution/ArtifactsWidget.js +2 -1
- package/execution/ArtifactsWidget.js.map +1 -1
- package/execution/FileChangeProgressBar.d.ts.map +1 -1
- package/execution/FileChangeProgressBar.js +2 -1
- package/execution/FileChangeProgressBar.js.map +1 -1
- package/execution/TodoList.d.ts.map +1 -1
- package/execution/TodoList.js +2 -1
- package/execution/TodoList.js.map +1 -1
- package/execution/WriteBacksWidget.d.ts.map +1 -1
- package/execution/WriteBacksWidget.js +2 -1
- package/execution/WriteBacksWidget.js.map +1 -1
- package/execution/tool-categories.d.ts +5 -22
- package/execution/tool-categories.d.ts.map +1 -1
- package/execution/tool-categories.js +8 -38
- package/execution/tool-categories.js.map +1 -1
- package/iam-policy/PeopleWithAccess.d.ts.map +1 -1
- package/iam-policy/PeopleWithAccess.js +2 -1
- package/iam-policy/PeopleWithAccess.js.map +1 -1
- package/iam-policy/PrincipalPicker.d.ts.map +1 -1
- package/iam-policy/PrincipalPicker.js +2 -1
- package/iam-policy/PrincipalPicker.js.map +1 -1
- package/iam-policy/RoleSelector.d.ts.map +1 -1
- package/iam-policy/RoleSelector.js +2 -1
- package/iam-policy/RoleSelector.js.map +1 -1
- package/identity-account/AccountPreferencesPanel.d.ts +35 -0
- package/identity-account/AccountPreferencesPanel.d.ts.map +1 -0
- package/identity-account/AccountPreferencesPanel.js +187 -0
- package/identity-account/AccountPreferencesPanel.js.map +1 -0
- package/identity-account/index.d.ts +8 -0
- package/identity-account/index.d.ts.map +1 -1
- package/identity-account/index.js +4 -0
- package/identity-account/index.js.map +1 -1
- package/identity-account/useAccountExecutionDefaults.d.ts +36 -0
- package/identity-account/useAccountExecutionDefaults.d.ts.map +1 -0
- package/identity-account/useAccountExecutionDefaults.js +46 -0
- package/identity-account/useAccountExecutionDefaults.js.map +1 -0
- package/identity-account/useMyIdentityAccount.d.ts +55 -0
- package/identity-account/useMyIdentityAccount.d.ts.map +1 -0
- package/identity-account/useMyIdentityAccount.js +37 -0
- package/identity-account/useMyIdentityAccount.js.map +1 -0
- package/identity-account/useUpdateIdentityAccount.d.ts +42 -0
- package/identity-account/useUpdateIdentityAccount.d.ts.map +1 -0
- package/identity-account/useUpdateIdentityAccount.js +53 -0
- package/identity-account/useUpdateIdentityAccount.js.map +1 -0
- package/identity-provider/CreateIdentityProviderForm.d.ts.map +1 -1
- package/identity-provider/CreateIdentityProviderForm.js +2 -1
- package/identity-provider/CreateIdentityProviderForm.js.map +1 -1
- package/identity-provider/IdentityProviderDetailPanel.d.ts.map +1 -1
- package/identity-provider/IdentityProviderDetailPanel.js +2 -1
- package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
- package/identity-provider/IdentityProviderWizard.d.ts.map +1 -1
- package/identity-provider/IdentityProviderWizard.js +2 -1
- package/identity-provider/IdentityProviderWizard.js.map +1 -1
- package/index.d.ts +14 -10
- package/index.d.ts.map +1 -1
- package/index.js +11 -5
- package/index.js.map +1 -1
- package/internal/StandingContextField.d.ts +37 -0
- package/internal/StandingContextField.d.ts.map +1 -0
- package/internal/StandingContextField.js +24 -0
- package/internal/StandingContextField.js.map +1 -0
- package/internal/element-resets.d.ts +17 -0
- package/internal/element-resets.d.ts.map +1 -0
- package/internal/element-resets.js +32 -0
- package/internal/element-resets.js.map +1 -0
- package/internal/file-tree/FileTreeNode.d.ts.map +1 -1
- package/internal/file-tree/FileTreeNode.js +2 -1
- package/internal/file-tree/FileTreeNode.js.map +1 -1
- package/internal/markdown-components.d.ts +7 -0
- package/internal/markdown-components.d.ts.map +1 -1
- package/internal/markdown-components.js +15 -5
- package/internal/markdown-components.js.map +1 -1
- package/invitation/InvitationManager.d.ts.map +1 -1
- package/invitation/InvitationManager.js +2 -1
- package/invitation/InvitationManager.js.map +1 -1
- package/library/InstanceVisibilitySelector.d.ts.map +1 -1
- package/library/InstanceVisibilitySelector.js +9 -2
- package/library/InstanceVisibilitySelector.js.map +1 -1
- package/library/ResourceVisibilityControl.d.ts +13 -3
- package/library/ResourceVisibilityControl.d.ts.map +1 -1
- package/library/ResourceVisibilityControl.js +33 -5
- package/library/ResourceVisibilityControl.js.map +1 -1
- package/library/VisibilityOptionRow.d.ts +6 -0
- package/library/VisibilityOptionRow.d.ts.map +1 -1
- package/library/VisibilityOptionRow.js +11 -1
- package/library/VisibilityOptionRow.js.map +1 -1
- package/library/VisibilitySelector.d.ts.map +1 -1
- package/library/VisibilitySelector.js +14 -2
- package/library/VisibilitySelector.js.map +1 -1
- package/library/index.d.ts +4 -2
- package/library/index.d.ts.map +1 -1
- package/library/index.js +2 -1
- package/library/index.js.map +1 -1
- package/library/useCanSetPublicVisibility.d.ts +30 -0
- package/library/useCanSetPublicVisibility.d.ts.map +1 -0
- package/library/useCanSetPublicVisibility.js +41 -0
- package/library/useCanSetPublicVisibility.js.map +1 -0
- package/library/visibilityLevels.d.ts +32 -1
- package/library/visibilityLevels.d.ts.map +1 -1
- package/library/visibilityLevels.js +34 -14
- package/library/visibilityLevels.js.map +1 -1
- package/manifest/ApplyManifestDialog.d.ts.map +1 -1
- package/manifest/ApplyManifestDialog.js +2 -1
- package/manifest/ApplyManifestDialog.js.map +1 -1
- package/mcp-server/steps/IdentityTransportStep.d.ts.map +1 -1
- package/mcp-server/steps/IdentityTransportStep.js +2 -1
- package/mcp-server/steps/IdentityTransportStep.js.map +1 -1
- package/mcp-server/useMcpServerConnect.d.ts +8 -5
- package/mcp-server/useMcpServerConnect.d.ts.map +1 -1
- package/mcp-server/useMcpServerConnect.js +2 -1
- package/mcp-server/useMcpServerConnect.js.map +1 -1
- package/mcp-server/useMcpServerOAuthConnect.d.ts.map +1 -1
- package/mcp-server/useMcpServerOAuthConnect.js +7 -2
- package/mcp-server/useMcpServerOAuthConnect.js.map +1 -1
- package/oauth-app/CreateOAuthAppForm.d.ts +2 -2
- package/oauth-app/CreateOAuthAppForm.d.ts.map +1 -1
- package/oauth-app/CreateOAuthAppForm.js +13 -4
- package/oauth-app/CreateOAuthAppForm.js.map +1 -1
- package/oauth-app/OAuthAppDetailPanel.d.ts.map +1 -1
- package/oauth-app/OAuthAppDetailPanel.js +32 -5
- package/oauth-app/OAuthAppDetailPanel.js.map +1 -1
- package/organization/OrgPreferencesPanel.d.ts +32 -0
- package/organization/OrgPreferencesPanel.d.ts.map +1 -0
- package/organization/OrgPreferencesPanel.js +90 -0
- package/organization/OrgPreferencesPanel.js.map +1 -0
- package/organization/OrgProfilePanel.d.ts.map +1 -1
- package/organization/OrgProfilePanel.js +5 -4
- package/organization/OrgProfilePanel.js.map +1 -1
- package/organization/index.d.ts +2 -0
- package/organization/index.d.ts.map +1 -1
- package/organization/index.js +1 -0
- package/organization/index.js.map +1 -1
- package/package.json +4 -4
- package/platform-client/CreatePlatformClientForm.d.ts.map +1 -1
- package/platform-client/CreatePlatformClientForm.js +2 -1
- package/platform-client/CreatePlatformClientForm.js.map +1 -1
- package/platform-client/PlatformClientDetailPanel.d.ts.map +1 -1
- package/platform-client/PlatformClientDetailPanel.js +2 -1
- package/platform-client/PlatformClientDetailPanel.js.map +1 -1
- package/pricing-governance/BaselineEditor.d.ts.map +1 -1
- package/pricing-governance/BaselineEditor.js +2 -1
- package/pricing-governance/BaselineEditor.js.map +1 -1
- package/pricing-governance/PricingGovernanceConsole.d.ts.map +1 -1
- package/pricing-governance/PricingGovernanceConsole.js +2 -1
- package/pricing-governance/PricingGovernanceConsole.js.map +1 -1
- package/provider-standing/ProviderStandingAccessNotice.d.ts +11 -0
- package/provider-standing/ProviderStandingAccessNotice.d.ts.map +1 -0
- package/provider-standing/ProviderStandingAccessNotice.js +14 -0
- package/provider-standing/ProviderStandingAccessNotice.js.map +1 -0
- package/provider-standing/ProviderStandingConsole.d.ts +24 -0
- package/provider-standing/ProviderStandingConsole.d.ts.map +1 -0
- package/provider-standing/ProviderStandingConsole.js +98 -0
- package/provider-standing/ProviderStandingConsole.js.map +1 -0
- package/provider-standing/index.d.ts +6 -0
- package/provider-standing/index.d.ts.map +1 -0
- package/provider-standing/index.js +6 -0
- package/provider-standing/index.js.map +1 -0
- package/provider-standing/useProviderStanding.d.ts +34 -0
- package/provider-standing/useProviderStanding.d.ts.map +1 -0
- package/provider-standing/useProviderStanding.js +26 -0
- package/provider-standing/useProviderStanding.js.map +1 -0
- package/provider.d.ts +12 -0
- package/provider.d.ts.map +1 -1
- package/provider.js +12 -0
- package/provider.js.map +1 -1
- package/resource-creation/StepIndicator.d.ts.map +1 -1
- package/resource-creation/StepIndicator.js +2 -1
- package/resource-creation/StepIndicator.js.map +1 -1
- package/schedule/ScheduleDetailView.d.ts.map +1 -1
- package/schedule/ScheduleDetailView.js +3 -2
- package/schedule/ScheduleDetailView.js.map +1 -1
- package/schedule/ScheduleRunsTable.d.ts.map +1 -1
- package/schedule/ScheduleRunsTable.js +2 -1
- package/schedule/ScheduleRunsTable.js.map +1 -1
- package/session/NewSessionViewer.d.ts +10 -1
- package/session/NewSessionViewer.d.ts.map +1 -1
- package/session/NewSessionViewer.js +2 -1
- package/session/NewSessionViewer.js.map +1 -1
- package/session/facets/ArtifactsTab.d.ts.map +1 -1
- package/session/facets/ArtifactsTab.js +2 -1
- package/session/facets/ArtifactsTab.js.map +1 -1
- package/session/facets/ChangesTab.d.ts.map +1 -1
- package/session/facets/ChangesTab.js +2 -1
- package/session/facets/ChangesTab.js.map +1 -1
- package/session/facets/UsageTab.d.ts +10 -3
- package/session/facets/UsageTab.d.ts.map +1 -1
- package/session/facets/UsageTab.js +42 -6
- package/session/facets/UsageTab.js.map +1 -1
- package/session/index.d.ts +1 -1
- package/session/index.d.ts.map +1 -1
- package/session/index.js.map +1 -1
- package/session/useNewSessionFlow.d.ts +27 -1
- package/session/useNewSessionFlow.d.ts.map +1 -1
- package/session/useNewSessionFlow.js +45 -8
- package/session/useNewSessionFlow.js.map +1 -1
- package/session/useSessionUsage.d.ts +25 -0
- package/session/useSessionUsage.d.ts.map +1 -1
- package/session/useSessionUsage.js +11 -0
- package/session/useSessionUsage.js.map +1 -1
- package/settings/AccountPreferencesSection.d.ts +3 -0
- package/settings/AccountPreferencesSection.d.ts.map +1 -0
- package/settings/AccountPreferencesSection.js +10 -0
- package/settings/AccountPreferencesSection.js.map +1 -0
- package/settings/OrgPreferencesSection.d.ts +3 -0
- package/settings/OrgPreferencesSection.d.ts.map +1 -0
- package/settings/OrgPreferencesSection.js +13 -0
- package/settings/OrgPreferencesSection.js.map +1 -0
- package/settings/index.d.ts +2 -0
- package/settings/index.d.ts.map +1 -1
- package/settings/index.js +2 -0
- package/settings/index.js.map +1 -1
- package/settings/settings-nav.d.ts.map +1 -1
- package/settings/settings-nav.js +23 -1
- package/settings/settings-nav.js.map +1 -1
- package/settings/useSettingsNavGroups.d.ts.map +1 -1
- package/settings/useSettingsNavGroups.js +4 -1
- package/settings/useSettingsNavGroups.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/sidebar/WorkspaceSidebar.d.ts.map +1 -1
- package/sidebar/WorkspaceSidebar.js +2 -1
- package/sidebar/WorkspaceSidebar.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/skill/internal/fetchAndUnpackArtifact.d.ts +1 -1
- package/skill/internal/fetchAndUnpackArtifact.d.ts.map +1 -1
- package/skill/internal/fetchAndUnpackArtifact.js +47 -3
- package/skill/internal/fetchAndUnpackArtifact.js.map +1 -1
- package/skill/useSkillDiff.d.ts.map +1 -1
- package/skill/useSkillDiff.js +7 -1
- package/skill/useSkillDiff.js.map +1 -1
- package/skill/useSkillUpload.d.ts.map +1 -1
- package/skill/useSkillUpload.js +22 -4
- package/skill/useSkillUpload.js.map +1 -1
- package/src/__tests__/bare-host-resets.layout.test.tsx +184 -0
- package/src/agent/steps/IdentityStep.tsx +2 -1
- package/src/agent-instance/AgentInstanceDetailPanel.tsx +2 -1
- package/src/api-key/CreateApiKeyForm.tsx +2 -1
- package/src/attachment/AttachmentChipList.tsx +19 -8
- package/src/attachment/__tests__/AttachmentChipList.test.tsx +12 -0
- package/src/attachment/__tests__/useAttachments.test.ts +293 -0
- package/src/attachment/index.ts +1 -0
- package/src/attachment/useAttachments.ts +143 -11
- package/src/channel/ChannelConversationsDialog.tsx +2 -1
- package/src/channel/ChannelTemplatesDialog.tsx +2 -1
- package/src/channel/ConnectSlackDialog.tsx +2 -1
- package/src/channel/connect/ServingAppSection.tsx +2 -1
- package/src/channel-app/CreateChannelAppForm.tsx +2 -1
- package/src/composer/SessionComposer.tsx +23 -14
- package/src/conversation/ConversationComposer.tsx +38 -4
- package/src/conversation/ConversationListPane.tsx +2 -5
- package/src/conversation/ConversationTemplatePickerDialog.tsx +441 -0
- package/src/conversation/ConversationTimelineView.tsx +2 -1
- package/src/conversation/ConversationsWorkbench.tsx +40 -4
- package/src/conversation/__tests__/ConversationComposer.test.tsx +56 -1
- package/src/conversation/__tests__/ConversationTemplatePickerDialog.test.tsx +224 -0
- package/src/conversation/__tests__/useConversationParticipation.test.tsx +45 -4
- package/src/conversation/index.ts +4 -0
- package/src/conversation/useConversationParticipation.ts +58 -6
- package/src/cursor-accounts/CursorAccountsConsole.tsx +2 -1
- package/src/cursor-accounts/MemberKeysPanel.tsx +2 -1
- package/src/dashboard/DashboardFailedRuns.tsx +2 -1
- package/src/dependency-graph/DependencyGraph.tsx +2 -1
- package/src/dependency-graph/DependencyTreeNode.tsx +2 -1
- package/src/environment/EnvironmentPicker.tsx +2 -1
- package/src/error/SecretFlowErrorGuide.tsx +3 -2
- package/src/execution/ArtifactContentBody.tsx +2 -1
- package/src/execution/ArtifactsWidget.tsx +2 -1
- package/src/execution/FileChangeProgressBar.tsx +2 -1
- package/src/execution/TodoList.tsx +2 -1
- package/src/execution/WriteBacksWidget.tsx +2 -1
- package/src/execution/tool-categories.ts +17 -41
- package/src/iam-policy/PeopleWithAccess.tsx +2 -1
- package/src/iam-policy/PrincipalPicker.tsx +2 -0
- package/src/iam-policy/RoleSelector.tsx +2 -1
- package/src/identity-account/AccountPreferencesPanel.tsx +446 -0
- package/src/identity-account/__tests__/AccountPreferencesPanel.test.tsx +233 -0
- package/src/identity-account/__tests__/useAccountExecutionDefaults.test.tsx +116 -0
- package/src/identity-account/__tests__/useMyIdentityAccount.test.tsx +121 -0
- package/src/identity-account/index.ts +11 -0
- package/src/identity-account/useAccountExecutionDefaults.ts +63 -0
- package/src/identity-account/useMyIdentityAccount.ts +75 -0
- package/src/identity-account/useUpdateIdentityAccount.ts +73 -0
- package/src/identity-provider/CreateIdentityProviderForm.tsx +2 -1
- package/src/identity-provider/IdentityProviderDetailPanel.tsx +2 -1
- package/src/identity-provider/IdentityProviderWizard.tsx +2 -1
- package/src/index.ts +37 -2
- package/src/internal/StandingContextField.tsx +92 -0
- package/src/internal/element-resets.ts +33 -0
- package/src/internal/file-tree/FileTreeNode.tsx +2 -1
- package/src/internal/markdown-components.tsx +15 -5
- package/src/invitation/InvitationManager.tsx +3 -2
- package/src/library/InstanceVisibilitySelector.tsx +9 -2
- package/src/library/ResourceVisibilityControl.tsx +46 -13
- package/src/library/VisibilityOptionRow.tsx +28 -6
- package/src/library/VisibilitySelector.tsx +14 -2
- package/src/library/__tests__/VisibilitySelector.test.tsx +48 -1
- package/src/library/__tests__/visibilityLevels.test.ts +67 -1
- package/src/library/index.ts +6 -1
- package/src/library/useCanSetPublicVisibility.ts +56 -0
- package/src/library/visibilityLevels.ts +65 -14
- package/src/manifest/ApplyManifestDialog.tsx +2 -1
- package/src/mcp-server/__tests__/useMcpServerConnect.asyncLane.test.tsx +117 -0
- package/src/mcp-server/steps/IdentityTransportStep.tsx +3 -2
- package/src/mcp-server/useMcpServerConnect.ts +9 -6
- package/src/mcp-server/useMcpServerOAuthConnect.ts +7 -2
- package/src/oauth-app/CreateOAuthAppForm.tsx +58 -3
- package/src/oauth-app/OAuthAppDetailPanel.tsx +84 -3
- package/src/organization/OrgPreferencesPanel.tsx +221 -0
- package/src/organization/OrgProfilePanel.tsx +5 -4
- package/src/organization/__tests__/OrgPreferencesPanel.test.tsx +145 -0
- package/src/organization/__tests__/OrgProfilePanel.test.tsx +108 -0
- package/src/organization/index.ts +2 -0
- package/src/platform-client/CreatePlatformClientForm.tsx +4 -3
- package/src/platform-client/PlatformClientDetailPanel.tsx +4 -3
- package/src/pricing-governance/BaselineEditor.tsx +3 -2
- package/src/pricing-governance/PricingGovernanceConsole.tsx +2 -1
- package/src/provider-standing/ProviderStandingAccessNotice.tsx +36 -0
- package/src/provider-standing/ProviderStandingConsole.tsx +216 -0
- package/src/provider-standing/__tests__/ProviderStandingConsole.test.tsx +143 -0
- package/src/provider-standing/index.ts +8 -0
- package/src/provider-standing/useProviderStanding.ts +50 -0
- package/src/provider.tsx +12 -0
- package/src/resource-creation/StepIndicator.tsx +2 -1
- package/src/schedule/ScheduleDetailView.tsx +3 -2
- package/src/schedule/ScheduleRunsTable.tsx +2 -1
- package/src/session/NewSessionViewer.tsx +12 -0
- package/src/session/__tests__/UsageTab.test.tsx +136 -0
- package/src/session/__tests__/useNewSessionFlow.test.tsx +151 -0
- package/src/session/__tests__/useSessionUsage.test.ts +19 -0
- package/src/session/facets/ArtifactsTab.tsx +2 -1
- package/src/session/facets/ChangesTab.tsx +2 -1
- package/src/session/facets/UsageTab.tsx +98 -6
- package/src/session/index.ts +1 -0
- package/src/session/useNewSessionFlow.ts +76 -9
- package/src/session/useSessionUsage.ts +37 -0
- package/src/settings/AccountPreferencesSection.tsx +25 -0
- package/src/settings/OrgPreferencesSection.tsx +35 -0
- package/src/settings/__tests__/settings-nav.test.ts +27 -0
- package/src/settings/__tests__/useSettingsNavGroups.test.tsx +11 -1
- package/src/settings/index.ts +2 -0
- package/src/settings/settings-nav.ts +25 -0
- package/src/settings/useSettingsNavGroups.ts +8 -1
- package/src/sharing/ShareAgentDialog.tsx +2 -1
- package/src/sidebar/WorkspaceSidebar.tsx +2 -1
- package/src/skill/SkillFileBrowser.tsx +2 -1
- package/src/skill/__tests__/SkillFileBrowser.test.tsx +10 -2
- package/src/skill/__tests__/fetchAndUnpackArtifact.test.ts +90 -0
- package/src/skill/__tests__/useSkillUpload.test.ts +69 -0
- package/src/skill/internal/fetchAndUnpackArtifact.ts +54 -4
- package/src/skill/useSkillDiff.ts +7 -1
- package/src/skill/useSkillUpload.ts +25 -6
- package/src/workflow/ApprovalFormBuilder.tsx +5 -27
- package/src/workflow/FailedRunsWidget.tsx +2 -1
- package/src/workflow/PendingApprovalsWidget.tsx +2 -1
- package/src/workflow/facets/WorkflowArtifactsTab.tsx +2 -1
- package/src/workflow/facets/WorkflowUsageTab.tsx +2 -1
- package/src/workflow/inspector/WorkflowSummaryPanel.tsx +2 -1
- package/src/workflow/inspector/tabs/BranchesTab.tsx +2 -1
- package/src/workflow/inspector/tabs/IterationTab.tsx +2 -1
- package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +2 -1
- package/src/workspace/ExplorerTree.tsx +2 -1
- package/src/workspace/WorkspaceContentSearch.tsx +2 -1
- package/src/workspace/WorkspaceFileSearch.tsx +2 -1
- package/src/workspace/WorkspaceSummary.tsx +2 -1
- package/styles.css +1 -1
- package/workflow/ApprovalFormBuilder.d.ts.map +1 -1
- package/workflow/ApprovalFormBuilder.js +8 -5
- package/workflow/ApprovalFormBuilder.js.map +1 -1
- package/workflow/FailedRunsWidget.d.ts.map +1 -1
- package/workflow/FailedRunsWidget.js +2 -1
- package/workflow/FailedRunsWidget.js.map +1 -1
- package/workflow/PendingApprovalsWidget.d.ts.map +1 -1
- package/workflow/PendingApprovalsWidget.js +2 -1
- package/workflow/PendingApprovalsWidget.js.map +1 -1
- package/workflow/facets/WorkflowArtifactsTab.d.ts.map +1 -1
- package/workflow/facets/WorkflowArtifactsTab.js +2 -1
- package/workflow/facets/WorkflowArtifactsTab.js.map +1 -1
- package/workflow/facets/WorkflowUsageTab.d.ts.map +1 -1
- package/workflow/facets/WorkflowUsageTab.js +2 -1
- package/workflow/facets/WorkflowUsageTab.js.map +1 -1
- package/workflow/inspector/WorkflowSummaryPanel.d.ts.map +1 -1
- package/workflow/inspector/WorkflowSummaryPanel.js +2 -1
- package/workflow/inspector/WorkflowSummaryPanel.js.map +1 -1
- package/workflow/inspector/tabs/BranchesTab.d.ts.map +1 -1
- package/workflow/inspector/tabs/BranchesTab.js +2 -1
- package/workflow/inspector/tabs/BranchesTab.js.map +1 -1
- package/workflow/inspector/tabs/IterationTab.d.ts.map +1 -1
- package/workflow/inspector/tabs/IterationTab.js +2 -1
- package/workflow/inspector/tabs/IterationTab.js.map +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.d.ts.map +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.js +2 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.js.map +1 -1
- package/workspace/ExplorerTree.d.ts.map +1 -1
- package/workspace/ExplorerTree.js +2 -1
- package/workspace/ExplorerTree.js.map +1 -1
- package/workspace/WorkspaceContentSearch.d.ts.map +1 -1
- package/workspace/WorkspaceContentSearch.js +2 -1
- package/workspace/WorkspaceContentSearch.js.map +1 -1
- package/workspace/WorkspaceFileSearch.d.ts.map +1 -1
- package/workspace/WorkspaceFileSearch.js +2 -1
- package/workspace/WorkspaceFileSearch.js.map +1 -1
- package/workspace/WorkspaceSummary.d.ts.map +1 -1
- package/workspace/WorkspaceSummary.js +2 -1
- package/workspace/WorkspaceSummary.js.map +1 -1
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
uniquifyFilename,
|
|
13
13
|
validateAttachmentSize,
|
|
14
14
|
} from "./attachment-utils.js";
|
|
15
|
+
import { prepareImageForVision } from "./prepare-image.js";
|
|
15
16
|
|
|
16
17
|
// ---------------------------------------------------------------------------
|
|
17
18
|
// Types
|
|
@@ -20,11 +21,16 @@ import {
|
|
|
20
21
|
/**
|
|
21
22
|
* Lifecycle phase of a single attachment managed by {@link useAttachments}.
|
|
22
23
|
*
|
|
24
|
+
* - `preparing` — client-side image preparation is running (see
|
|
25
|
+
* {@link AddFilesOptions.prepareImages}); the entry exists so the UI can
|
|
26
|
+
* show the file from the instant it was added, but no bytes have been
|
|
27
|
+
* sent yet. Only entries added with `prepareImages` ever visit this
|
|
28
|
+
* phase — everything else starts at `uploading`.
|
|
23
29
|
* - `uploading` — bytes are being sent to the server
|
|
24
30
|
* - `ready` — upload succeeded, `storageKey` is available
|
|
25
31
|
* - `error` — upload failed, `error` describes the failure
|
|
26
32
|
*/
|
|
27
|
-
export type AttachmentPhase = "uploading" | "ready" | "error";
|
|
33
|
+
export type AttachmentPhase = "preparing" | "uploading" | "ready" | "error";
|
|
28
34
|
|
|
29
35
|
/**
|
|
30
36
|
* State for a single file being managed by the hook.
|
|
@@ -50,7 +56,12 @@ export type AttachmentPhase = "uploading" | "ready" | "error";
|
|
|
50
56
|
export interface AttachmentEntry {
|
|
51
57
|
/** Unique client-side identifier for this attachment. */
|
|
52
58
|
readonly id: string;
|
|
53
|
-
/**
|
|
59
|
+
/**
|
|
60
|
+
* The `File` object backing this attachment. For entries added with
|
|
61
|
+
* {@link AddFilesOptions.prepareImages} this starts as the user's
|
|
62
|
+
* original file and swaps to the prepared file (possibly smaller, with
|
|
63
|
+
* a matching extension/MIME change) when the `preparing` phase ends.
|
|
64
|
+
*/
|
|
54
65
|
readonly file: File;
|
|
55
66
|
/** Current upload lifecycle phase. */
|
|
56
67
|
readonly phase: AttachmentPhase;
|
|
@@ -71,25 +82,59 @@ export interface UseAttachmentsOptions {
|
|
|
71
82
|
readonly onValidationError?: (message: string) => void;
|
|
72
83
|
}
|
|
73
84
|
|
|
85
|
+
/** Per-call options for {@link UseAttachmentsReturn.addFiles}. */
|
|
86
|
+
export interface AddFilesOptions {
|
|
87
|
+
/**
|
|
88
|
+
* Bound image files to provider vision resolution before upload (via
|
|
89
|
+
* {@link prepareImageForVision}) — the paste-to-attach treatment
|
|
90
|
+
* (stigmer/stigmer#284). Each file's entry appears immediately in the
|
|
91
|
+
* `preparing` phase, so a large screenshot shows a chip the instant it
|
|
92
|
+
* is pasted instead of after the 150-350 ms decode/downscale/re-encode
|
|
93
|
+
* (stigmer/stigmer#369). Non-image files pass through preparation
|
|
94
|
+
* untouched.
|
|
95
|
+
*
|
|
96
|
+
* Meant for pasted content only: a picked or dragged file may be the
|
|
97
|
+
* subject of the task ("read the EXIF"), and silently re-encoding it
|
|
98
|
+
* would be a regression — see prepare-image.ts for the doctrine.
|
|
99
|
+
*
|
|
100
|
+
* With this flag, size validation runs against the PREPARED bytes (the
|
|
101
|
+
* bytes that actually upload), so an oversized paste that downscales
|
|
102
|
+
* under the limit is accepted — identical to preparing before calling
|
|
103
|
+
* `addFiles`, which is what this option replaces. A file still
|
|
104
|
+
* oversized after preparation is removed and reported via
|
|
105
|
+
* `onValidationError`.
|
|
106
|
+
*/
|
|
107
|
+
readonly prepareImages?: boolean;
|
|
108
|
+
}
|
|
109
|
+
|
|
74
110
|
/** Return value of {@link useAttachments}. */
|
|
75
111
|
export interface UseAttachmentsReturn {
|
|
76
|
-
/** Current attachment entries (uploading, ready, or errored). */
|
|
112
|
+
/** Current attachment entries (preparing, uploading, ready, or errored). */
|
|
77
113
|
readonly entries: readonly AttachmentEntry[];
|
|
78
|
-
/**
|
|
114
|
+
/**
|
|
115
|
+
* True while any entry has work in flight (`preparing` or
|
|
116
|
+
* `uploading`). This is the submit gate: `toAttachmentInputs()` carries
|
|
117
|
+
* only `ready` entries, so a send while this is true would silently
|
|
118
|
+
* drop the file the user just added.
|
|
119
|
+
*/
|
|
79
120
|
readonly isUploading: boolean;
|
|
121
|
+
/** True when at least one entry is in the `"preparing"` phase. */
|
|
122
|
+
readonly isPreparing: boolean;
|
|
80
123
|
/** Number of entries that are ready for submission. */
|
|
81
124
|
readonly readyCount: number;
|
|
82
|
-
/** True when there are entries and all are ready (none uploading or errored). */
|
|
125
|
+
/** True when there are entries and all are ready (none preparing, uploading, or errored). */
|
|
83
126
|
readonly allReady: boolean;
|
|
84
127
|
/** True when there is at least one entry (in any phase). */
|
|
85
128
|
readonly hasEntries: boolean;
|
|
86
129
|
/**
|
|
87
130
|
* Add one or more files. Each file is validated and uploaded
|
|
88
131
|
* immediately. Invalid files (e.g., too large) are rejected via
|
|
89
|
-
* `onValidationError` and not added.
|
|
132
|
+
* `onValidationError` and not added. With
|
|
133
|
+
* {@link AddFilesOptions.prepareImages}, images are bounded to vision
|
|
134
|
+
* resolution first — entries appear at once in the `preparing` phase.
|
|
90
135
|
*/
|
|
91
|
-
readonly addFiles: (files: FileList | File[]) => void;
|
|
92
|
-
/** Remove an entry by its stable ID. Aborts in-flight uploads. */
|
|
136
|
+
readonly addFiles: (files: FileList | File[], addOptions?: AddFilesOptions) => void;
|
|
137
|
+
/** Remove an entry by its stable ID. Aborts in-flight preparation and uploads. */
|
|
93
138
|
readonly removeEntry: (id: string) => void;
|
|
94
139
|
/** Retry a failed upload. */
|
|
95
140
|
readonly retryEntry: (id: string) => void;
|
|
@@ -220,13 +265,92 @@ export function useAttachments(
|
|
|
220
265
|
[stigmer],
|
|
221
266
|
);
|
|
222
267
|
|
|
268
|
+
// The `preparing` half of the lifecycle (AddFilesOptions.prepareImages):
|
|
269
|
+
// runs prepareImageForVision on the raw file, then hands the result to
|
|
270
|
+
// the normal validate → uniquify → upload sequence. The entry already
|
|
271
|
+
// exists (created by addFiles in the `preparing` phase), so this
|
|
272
|
+
// transitions it rather than creating it.
|
|
273
|
+
const prepareEntry = useCallback(
|
|
274
|
+
async (id: string, rawFile: File) => {
|
|
275
|
+
// Registered under the same id the upload path uses, so removeEntry
|
|
276
|
+
// and clear() cancel a preparation exactly like an upload. The
|
|
277
|
+
// signal is only ever read, never passed down — prepareImageForVision
|
|
278
|
+
// never throws and cannot be interrupted; cancellation means
|
|
279
|
+
// discarding its result.
|
|
280
|
+
const controller = new AbortController();
|
|
281
|
+
abortControllers.current.set(id, controller);
|
|
282
|
+
|
|
283
|
+
const prepared = await prepareImageForVision(rawFile);
|
|
284
|
+
if (controller.signal.aborted) return;
|
|
285
|
+
// Hand-off point: from here the upload path owns the map slot
|
|
286
|
+
// (uploadFile registers its own controller under this id).
|
|
287
|
+
abortControllers.current.delete(id);
|
|
288
|
+
|
|
289
|
+
// Deferred validation — deliberately on the PREPARED bytes, the
|
|
290
|
+
// bytes that actually upload: a 12 MB screenshot that downscales
|
|
291
|
+
// under the limit must pass, exactly as it did when callers
|
|
292
|
+
// prepared before calling addFiles. Rejection removes the chip the
|
|
293
|
+
// user has been watching, so the toast is the explanation.
|
|
294
|
+
const sizeError = validateAttachmentSize(prepared);
|
|
295
|
+
if (sizeError) {
|
|
296
|
+
setEntries((prev) => prev.filter((e) => e.id !== id));
|
|
297
|
+
options?.onValidationError?.(sizeError);
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// Preparation may rename (extension follows the re-encode format),
|
|
302
|
+
// so uniquify now, against every OTHER entry's settled name —
|
|
303
|
+
// same downstream-breakage rule as the un-prepared path.
|
|
304
|
+
const takenNames = new Set(
|
|
305
|
+
entriesRef.current.filter((e) => e.id !== id).map((e) => e.file.name),
|
|
306
|
+
);
|
|
307
|
+
const uniqueName = uniquifyFilename(prepared.name, takenNames);
|
|
308
|
+
const file =
|
|
309
|
+
uniqueName === prepared.name
|
|
310
|
+
? prepared
|
|
311
|
+
: new File([prepared], uniqueName, {
|
|
312
|
+
type: prepared.type,
|
|
313
|
+
lastModified: prepared.lastModified,
|
|
314
|
+
});
|
|
315
|
+
const contentType = detectContentType(file);
|
|
316
|
+
|
|
317
|
+
setEntries((prev) =>
|
|
318
|
+
prev.map((e) =>
|
|
319
|
+
e.id === id
|
|
320
|
+
? { ...e, file, contentType, phase: "uploading" as const }
|
|
321
|
+
: e,
|
|
322
|
+
),
|
|
323
|
+
);
|
|
324
|
+
uploadFile(id, file, contentType);
|
|
325
|
+
},
|
|
326
|
+
[options, uploadFile],
|
|
327
|
+
);
|
|
328
|
+
|
|
223
329
|
const addFiles = useCallback(
|
|
224
|
-
(files: FileList | File[]) => {
|
|
330
|
+
(files: FileList | File[], addOptions?: AddFilesOptions) => {
|
|
225
331
|
const fileArray = Array.from(files);
|
|
226
332
|
const validEntries: AttachmentEntry[] = [];
|
|
227
333
|
const takenNames = new Set(entriesRef.current.map((e) => e.file.name));
|
|
228
334
|
|
|
229
335
|
for (const rawFile of fileArray) {
|
|
336
|
+
if (addOptions?.prepareImages) {
|
|
337
|
+
// The entry must exist THIS tick — the whole point of the
|
|
338
|
+
// preparing phase is feedback during the decode/downscale gap.
|
|
339
|
+
// Size validation and name uniquification move to prepareEntry:
|
|
340
|
+
// both depend on the prepared file (final bytes, final name).
|
|
341
|
+
const id = generateId();
|
|
342
|
+
validEntries.push({
|
|
343
|
+
id,
|
|
344
|
+
file: rawFile,
|
|
345
|
+
phase: "preparing",
|
|
346
|
+
contentType: detectContentType(rawFile),
|
|
347
|
+
storageKey: null,
|
|
348
|
+
error: null,
|
|
349
|
+
});
|
|
350
|
+
void prepareEntry(id, rawFile);
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
|
|
230
354
|
const sizeError = validateAttachmentSize(rawFile);
|
|
231
355
|
if (sizeError) {
|
|
232
356
|
options?.onValidationError?.(sizeError);
|
|
@@ -266,7 +390,7 @@ export function useAttachments(
|
|
|
266
390
|
setEntries((prev) => [...prev, ...validEntries]);
|
|
267
391
|
}
|
|
268
392
|
},
|
|
269
|
-
[options, uploadFile],
|
|
393
|
+
[options, uploadFile, prepareEntry],
|
|
270
394
|
);
|
|
271
395
|
|
|
272
396
|
const removeEntry = useCallback((id: string) => {
|
|
@@ -317,7 +441,14 @@ export function useAttachments(
|
|
|
317
441
|
}));
|
|
318
442
|
}, [entries]);
|
|
319
443
|
|
|
320
|
-
const
|
|
444
|
+
const isPreparing = entries.some((e) => e.phase === "preparing");
|
|
445
|
+
// `preparing` counts as uploading-in-the-gate sense: both phases mean
|
|
446
|
+
// "this file will be lost if the message sends now" (see the
|
|
447
|
+
// isUploading doc). Hosts that gate submit on isUploading inherit the
|
|
448
|
+
// preparing gate without a code change.
|
|
449
|
+
const isUploading = entries.some(
|
|
450
|
+
(e) => e.phase === "preparing" || e.phase === "uploading",
|
|
451
|
+
);
|
|
321
452
|
const readyCount = entries.filter((e) => e.phase === "ready").length;
|
|
322
453
|
const hasEntries = entries.length > 0;
|
|
323
454
|
const allReady = hasEntries && readyCount === entries.length;
|
|
@@ -325,6 +456,7 @@ export function useAttachments(
|
|
|
325
456
|
return {
|
|
326
457
|
entries,
|
|
327
458
|
isUploading,
|
|
459
|
+
isPreparing,
|
|
328
460
|
readyCount,
|
|
329
461
|
allReady,
|
|
330
462
|
hasEntries,
|
|
@@ -5,6 +5,7 @@ import { timestampDate } from "@bufbuild/protobuf/wkt";
|
|
|
5
5
|
import { MessageSquare, User, X } from "lucide-react";
|
|
6
6
|
import { cn } from "@stigmer/theme";
|
|
7
7
|
import { DialogShell } from "../internal/DialogShell.js";
|
|
8
|
+
import { UNSTYLED_LIST } from "../internal/element-resets.js";
|
|
8
9
|
import { getUserMessage } from "@stigmer/sdk";
|
|
9
10
|
import type { AgentChannel } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/api_pb";
|
|
10
11
|
import type { Session } from "@stigmer/protos/ai/stigmer/agentic/session/v1/api_pb";
|
|
@@ -153,7 +154,7 @@ function ChannelConversationsDialogBody({
|
|
|
153
154
|
description="When someone messages this channel, the sessions serving them appear here."
|
|
154
155
|
/>
|
|
155
156
|
) : (
|
|
156
|
-
<ul className="stg:space-y-1">
|
|
157
|
+
<ul className={cn(UNSTYLED_LIST, "stg:space-y-1")}>
|
|
157
158
|
{sessions.map((session) => (
|
|
158
159
|
<ConversationRow
|
|
159
160
|
key={session.metadata?.id}
|
|
@@ -4,6 +4,7 @@ import { useCallback, useId, type ReactNode } from "react";
|
|
|
4
4
|
import { ExternalLink, LayoutTemplate, X } from "lucide-react";
|
|
5
5
|
import { cn } from "@stigmer/theme";
|
|
6
6
|
import { DialogShell } from "../internal/DialogShell.js";
|
|
7
|
+
import { UNSTYLED_LIST } from "../internal/element-resets.js";
|
|
7
8
|
import { getUserMessage } from "@stigmer/sdk";
|
|
8
9
|
import type { AgentChannel } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/api_pb";
|
|
9
10
|
import type { ChannelTemplate } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/message_io_pb";
|
|
@@ -297,7 +298,7 @@ function ChannelTemplatesList({
|
|
|
297
298
|
</p>
|
|
298
299
|
<WhatsAppManagerLink label="Manage in WhatsApp Manager" />
|
|
299
300
|
</div>
|
|
300
|
-
<ul className="stg:space-y-2">
|
|
301
|
+
<ul className={cn(UNSTYLED_LIST, "stg:space-y-2")}>
|
|
301
302
|
{templates.map((template) => (
|
|
302
303
|
<TemplateRow
|
|
303
304
|
key={`${template.name}\u0000${template.language}`}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { useCallback, useId, useMemo, useState } from "react";
|
|
4
4
|
import { cn } from "@stigmer/theme";
|
|
5
5
|
import { DialogShell } from "../internal/DialogShell.js";
|
|
6
|
+
import { UNSTYLED_LIST } from "../internal/element-resets.js";
|
|
6
7
|
import { getErrorReason, type ResourceRef } from "@stigmer/sdk";
|
|
7
8
|
import type { Agent } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
8
9
|
import type { AgentChannel } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/api_pb";
|
|
@@ -527,7 +528,7 @@ function FlowProgress({
|
|
|
527
528
|
|
|
528
529
|
return (
|
|
529
530
|
<div className="stg:space-y-3" aria-live="polite">
|
|
530
|
-
<ul className="stg:space-y-2">
|
|
531
|
+
<ul className={cn(UNSTYLED_LIST, "stg:space-y-2")}>
|
|
531
532
|
{FLOW_STEPS.map((step, i) => {
|
|
532
533
|
const isActive = i === activeIndex;
|
|
533
534
|
const isDone = activeIndex > i;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import type { ReactNode } from "react";
|
|
4
4
|
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { UNSTYLED_FIELDSET } from "../../internal/element-resets.js";
|
|
5
6
|
import type { ResourceRef } from "@stigmer/sdk";
|
|
6
7
|
import type { ChannelApp } from "@stigmer/protos/ai/stigmer/agentic/channelapp/v1/api_pb";
|
|
7
8
|
|
|
@@ -67,7 +68,7 @@ export function ServingAppSection({
|
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
return (
|
|
70
|
-
<fieldset>
|
|
71
|
+
<fieldset className={UNSTYLED_FIELDSET}>
|
|
71
72
|
<legend className="stg:mb-1.5 stg:block stg:text-xs stg:font-medium stg:text-foreground">
|
|
72
73
|
Connect as
|
|
73
74
|
</legend>
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { type FormEvent, useCallback, useId, useMemo, useState } from "react";
|
|
4
4
|
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { UNSTYLED_FIELDSET } from "../internal/element-resets.js";
|
|
5
6
|
import { getUserMessage } from "@stigmer/sdk";
|
|
6
7
|
import type { ChannelApp } from "@stigmer/protos/ai/stigmer/agentic/channelapp/v1/api_pb";
|
|
7
8
|
import {
|
|
@@ -286,7 +287,7 @@ function ProviderPicker({
|
|
|
286
287
|
}) {
|
|
287
288
|
const groupName = useId();
|
|
288
289
|
return (
|
|
289
|
-
<fieldset>
|
|
290
|
+
<fieldset className={UNSTYLED_FIELDSET}>
|
|
290
291
|
<legend className="stg:mb-1.5 stg:block stg:text-xs stg:font-medium stg:text-foreground">
|
|
291
292
|
Provider
|
|
292
293
|
</legend>
|
|
@@ -31,7 +31,6 @@ import type { UseGitHubConnectionReturn } from "../github/useGitHubConnection.js
|
|
|
31
31
|
import { useAttachments } from "../attachment/useAttachments.js";
|
|
32
32
|
import { AttachmentChipList } from "../attachment/AttachmentChipList.js";
|
|
33
33
|
import { extractClipboardFiles } from "../attachment/clipboard.js";
|
|
34
|
-
import { prepareImageForVision } from "../attachment/prepare-image.js";
|
|
35
34
|
import { useFileReferences } from "../file-reference/useFileReferences.js";
|
|
36
35
|
import { FileReferenceChipList } from "../file-reference/FileReferenceChipList.js";
|
|
37
36
|
import { FILE_REF_MIME } from "../internal/file-tree/index.js";
|
|
@@ -855,11 +854,17 @@ const SessionComposerInner = forwardRef<SessionComposerHandle, SessionComposerPr
|
|
|
855
854
|
const visionNotice = useMemo(() => {
|
|
856
855
|
if (!enableAttachments || attachments.entries.length === 0) return null;
|
|
857
856
|
const preflight = assessVisionPreflight(
|
|
858
|
-
attachments.entries
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
857
|
+
attachments.entries
|
|
858
|
+
// A `preparing` entry still carries pre-downscale bytes — judging
|
|
859
|
+
// those would flash a false "too large" that vanishes when
|
|
860
|
+
// preparation lands. Same tri-state discipline as the module
|
|
861
|
+
// itself: silent while the real size is unknown.
|
|
862
|
+
.filter((e) => e.phase !== "preparing")
|
|
863
|
+
.map((e) => ({
|
|
864
|
+
name: e.file.name,
|
|
865
|
+
sizeBytes: e.file.size,
|
|
866
|
+
contentType: e.contentType,
|
|
867
|
+
})),
|
|
863
868
|
{ model: effective.model, limits: visionLimits },
|
|
864
869
|
);
|
|
865
870
|
return visionPreflightMessage(preflight, {
|
|
@@ -963,12 +968,11 @@ const SessionComposerInner = forwardRef<SessionComposerHandle, SessionComposerPr
|
|
|
963
968
|
e.preventDefault();
|
|
964
969
|
|
|
965
970
|
// Pasted images (and only pasted — see prepare-image.ts) are bounded
|
|
966
|
-
// to provider resolution before upload.
|
|
967
|
-
//
|
|
971
|
+
// to provider resolution before upload. The hook owns the whole
|
|
972
|
+
// pipeline: chips appear immediately in the `preparing` phase
|
|
973
|
+
// (stigmer/stigmer#369), then upload.
|
|
968
974
|
const addFiles = attachments.addFiles;
|
|
969
|
-
|
|
970
|
-
addFiles(prepared);
|
|
971
|
-
});
|
|
975
|
+
addFiles(files, { prepareImages: true });
|
|
972
976
|
},
|
|
973
977
|
[enableAttachments, isDisabled, attachments.addFiles],
|
|
974
978
|
);
|
|
@@ -1376,11 +1380,12 @@ const SessionComposerInner = forwardRef<SessionComposerHandle, SessionComposerPr
|
|
|
1376
1380
|
// ---------------------------------------------------------------------------
|
|
1377
1381
|
|
|
1378
1382
|
const mcpBlocked = showMcp && !mcpSetup.allReady;
|
|
1379
|
-
// Send waits for in-flight
|
|
1383
|
+
// Send waits for in-flight work: toAttachmentInputs() carries only
|
|
1380
1384
|
// "ready" entries, so a send racing an upload would silently drop the
|
|
1381
1385
|
// file the user just pasted — the worst failure for "what's wrong in
|
|
1382
1386
|
// this screenshot?". Errored entries never gate (their chip offers
|
|
1383
|
-
// retry/remove);
|
|
1387
|
+
// retry/remove); isUploading covers both the preparing and uploading
|
|
1388
|
+
// phases (see its doc — same drop class).
|
|
1384
1389
|
const uploadsBlocked = enableAttachments && attachments.isUploading;
|
|
1385
1390
|
const canSend = composer.canSubmit && !mcpBlocked && !uploadsBlocked;
|
|
1386
1391
|
|
|
@@ -1758,7 +1763,11 @@ const SessionComposerInner = forwardRef<SessionComposerHandle, SessionComposerPr
|
|
|
1758
1763
|
className="stg:mx-3 stg:mb-2 stg:flex stg:items-center stg:gap-2 stg:rounded-md stg:bg-muted stg:px-2.5 stg:py-1.5 stg:text-xs stg:text-muted-foreground"
|
|
1759
1764
|
>
|
|
1760
1765
|
<ChipSpinner />
|
|
1761
|
-
<span>
|
|
1766
|
+
<span>
|
|
1767
|
+
{attachments.isPreparing
|
|
1768
|
+
? "Waiting for attachments to finish preparing…"
|
|
1769
|
+
: "Waiting for attachments to finish uploading…"}
|
|
1770
|
+
</span>
|
|
1762
1771
|
</div>
|
|
1763
1772
|
)}
|
|
1764
1773
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
import { useId, useState } from "react";
|
|
4
|
-
import { Send, TriangleAlert } from "lucide-react";
|
|
4
|
+
import { LayoutTemplate, Send, TriangleAlert } from "lucide-react";
|
|
5
5
|
import { cn } from "@stigmer/theme";
|
|
6
6
|
import { getUserMessage } from "@stigmer/sdk";
|
|
7
7
|
import { ChannelSendOutcome } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/message_io_pb";
|
|
@@ -9,13 +9,29 @@ import type { SendChannelMessageOutput } from "@stigmer/protos/ai/stigmer/agenti
|
|
|
9
9
|
import { Button } from "../button/Button.js";
|
|
10
10
|
import { SpinnerIcon } from "../internal/SpinnerIcon.js";
|
|
11
11
|
import { useComposer } from "../composer/useComposer.js";
|
|
12
|
+
import type { ConversationReplyPayload } from "./useConversationParticipation.js";
|
|
12
13
|
|
|
13
14
|
/** Props for {@link ConversationComposer}. */
|
|
14
15
|
export interface ConversationComposerProps {
|
|
15
|
-
/**
|
|
16
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Send a staff reply (from `useConversationParticipation().reply`).
|
|
18
|
+
* The composer's own textarea always submits the `text` lane; hosts
|
|
19
|
+
* wiring a template picker send the `template` lane through the same
|
|
20
|
+
* seam — one command, one busy state, one outcome contract.
|
|
21
|
+
*/
|
|
22
|
+
readonly onSend: (payload: ConversationReplyPayload) => Promise<SendChannelMessageOutput>;
|
|
17
23
|
/** `true` while a reply is in flight. */
|
|
18
24
|
readonly isSending: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Opens the host's template picker. When present, a persistent
|
|
27
|
+
* template affordance renders beside Send — templates are the one
|
|
28
|
+
* lane WhatsApp offers for a closed window, so the surface must
|
|
29
|
+
* offer the door, not just the advisory's warning (hosts should
|
|
30
|
+
* point at the button in the advisory copy; the advisory itself
|
|
31
|
+
* stays interaction-free — it is the input's description, F-18).
|
|
32
|
+
* Omit on channels whose provider has no template registry.
|
|
33
|
+
*/
|
|
34
|
+
readonly onOpenTemplatePicker?: () => void;
|
|
19
35
|
/**
|
|
20
36
|
* Why replying is unavailable, when it is — rendered in place of the
|
|
21
37
|
* input (a senderless provider, or a conversation the customer has
|
|
@@ -52,6 +68,7 @@ export interface ConversationComposerProps {
|
|
|
52
68
|
export function ConversationComposer({
|
|
53
69
|
onSend,
|
|
54
70
|
isSending,
|
|
71
|
+
onOpenTemplatePicker,
|
|
55
72
|
disabledReason,
|
|
56
73
|
advisory,
|
|
57
74
|
className,
|
|
@@ -66,7 +83,7 @@ export function ConversationComposer({
|
|
|
66
83
|
const composer = useComposer({
|
|
67
84
|
onSubmit: (message) => {
|
|
68
85
|
setNotice(null);
|
|
69
|
-
onSend(message).then(
|
|
86
|
+
onSend({ kind: "text", body: message }).then(
|
|
70
87
|
(output) => {
|
|
71
88
|
if (output.outcome === ChannelSendOutcome.refused) {
|
|
72
89
|
// The words never left; keep them so the user can adjust.
|
|
@@ -110,6 +127,12 @@ export function ConversationComposer({
|
|
|
110
127
|
className="stg:mb-2 stg:flex stg:items-start stg:gap-1.5 stg:rounded-md stg:bg-status-degraded-subtle stg:px-2.5 stg:py-1.5 stg:text-xs stg:text-status-degraded"
|
|
111
128
|
>
|
|
112
129
|
<TriangleAlert aria-hidden="true" className="stg:mt-0.5 stg:size-3.5 stg:shrink-0" />
|
|
130
|
+
{/* Interactive content is deliberately NOT allowed in here:
|
|
131
|
+
this element is the input's aria-describedby target with
|
|
132
|
+
zero tab stops (F-18). The way forward the advisory names
|
|
133
|
+
(the template lane) lives on the persistent template
|
|
134
|
+
button beside Send — hosts point at it in the advisory
|
|
135
|
+
COPY, never with an embedded control. */}
|
|
113
136
|
<span className="stg:min-w-0">{advisory}</span>
|
|
114
137
|
</p>
|
|
115
138
|
)}
|
|
@@ -137,6 +160,17 @@ export function ConversationComposer({
|
|
|
137
160
|
"stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring",
|
|
138
161
|
)}
|
|
139
162
|
/>
|
|
163
|
+
{onOpenTemplatePicker && (
|
|
164
|
+
<Button
|
|
165
|
+
variant="outline"
|
|
166
|
+
size="sm"
|
|
167
|
+
onClick={onOpenTemplatePicker}
|
|
168
|
+
disabled={isSending}
|
|
169
|
+
aria-label="Send a template reply"
|
|
170
|
+
>
|
|
171
|
+
<LayoutTemplate aria-hidden="true" className="stg:size-4" />
|
|
172
|
+
</Button>
|
|
173
|
+
)}
|
|
140
174
|
<Button
|
|
141
175
|
variant="primary"
|
|
142
176
|
size="sm"
|
|
@@ -4,6 +4,7 @@ import { memo, useCallback, useId, useRef } from "react";
|
|
|
4
4
|
import { timestampDate } from "@bufbuild/protobuf/wkt";
|
|
5
5
|
import { MessageSquare, TriangleAlert, User } from "lucide-react";
|
|
6
6
|
import { cn } from "@stigmer/theme";
|
|
7
|
+
import { UNSTYLED_LIST } from "../internal/element-resets.js";
|
|
7
8
|
import { getUserMessage } from "@stigmer/sdk";
|
|
8
9
|
import type { AgentChannel } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/api_pb";
|
|
9
10
|
import {
|
|
@@ -193,11 +194,7 @@ export function ConversationListPane({
|
|
|
193
194
|
{/* One context-only provider arms every row's attention
|
|
194
195
|
tooltip (the WorkspaceSidebar recents-list precedent). */}
|
|
195
196
|
<TooltipProvider>
|
|
196
|
-
{
|
|
197
|
-
convention): hosts without a global preflight would
|
|
198
|
-
otherwise render inbox rows with UA bullets and
|
|
199
|
-
indent. */}
|
|
200
|
-
<ul className="stg:m-0 stg:list-none stg:space-y-0.5 stg:p-0">
|
|
197
|
+
<ul className={cn(UNSTYLED_LIST, "stg:space-y-0.5")}>
|
|
201
198
|
{conversations.map((conversation) => (
|
|
202
199
|
<ConversationRow
|
|
203
200
|
key={`${conversation.agentChannelId}:${conversation.conversationKey}`}
|