@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
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { describe, it, expect, vi, afterEach } from "vitest";
|
|
2
|
+
import { cleanup, render, screen, waitFor } from "@testing-library/react";
|
|
3
|
+
import userEvent from "@testing-library/user-event";
|
|
4
|
+
import type { ReactNode } from "react";
|
|
5
|
+
import { create } from "@bufbuild/protobuf";
|
|
6
|
+
import {
|
|
7
|
+
ChannelSendOutcome,
|
|
8
|
+
SendChannelMessageOutputSchema,
|
|
9
|
+
} from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/message_io_pb";
|
|
10
|
+
import { StigmerContext } from "../../context";
|
|
11
|
+
import { FetchCacheContext } from "../../internal/FetchCacheProvider";
|
|
12
|
+
import { ConversationTemplatePickerDialog } from "../ConversationTemplatePickerDialog";
|
|
13
|
+
|
|
14
|
+
function makeTemplate(overrides?: Partial<Record<string, unknown>>) {
|
|
15
|
+
return {
|
|
16
|
+
name: "fee_reminder",
|
|
17
|
+
language: "en_US",
|
|
18
|
+
category: "UTILITY",
|
|
19
|
+
status: "APPROVED",
|
|
20
|
+
parameterFormat: "POSITIONAL",
|
|
21
|
+
parameterNames: ["1", "2"],
|
|
22
|
+
bodyText: "Hi {{1}}, your fee of {{2}} is due.",
|
|
23
|
+
headerFormat: "",
|
|
24
|
+
rejectionReason: "",
|
|
25
|
+
unsupportedReason: "",
|
|
26
|
+
...overrides,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function output(outcome: ChannelSendOutcome, detail = "") {
|
|
31
|
+
return create(SendChannelMessageOutputSchema, {
|
|
32
|
+
outcome,
|
|
33
|
+
outboundMessageId: outcome === ChannelSendOutcome.refused ? "" : "obm_1",
|
|
34
|
+
detail,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function renderPicker(options?: {
|
|
39
|
+
templates?: unknown[];
|
|
40
|
+
onSend?: ReturnType<typeof vi.fn>;
|
|
41
|
+
onOpenChange?: ReturnType<typeof vi.fn>;
|
|
42
|
+
isSending?: boolean;
|
|
43
|
+
}) {
|
|
44
|
+
const listTemplates = vi
|
|
45
|
+
.fn()
|
|
46
|
+
.mockResolvedValue({ entries: options?.templates ?? [makeTemplate()] });
|
|
47
|
+
const onSend =
|
|
48
|
+
options?.onSend ?? vi.fn().mockResolvedValue(output(ChannelSendOutcome.accepted));
|
|
49
|
+
const client = { agentChannel: { listTemplates } } as never;
|
|
50
|
+
function Wrapper({ children }: { children: ReactNode }) {
|
|
51
|
+
return (
|
|
52
|
+
<FetchCacheContext.Provider value={null}>
|
|
53
|
+
<StigmerContext.Provider value={client}>{children}</StigmerContext.Provider>
|
|
54
|
+
</FetchCacheContext.Provider>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
const view = render(
|
|
58
|
+
<ConversationTemplatePickerDialog
|
|
59
|
+
open
|
|
60
|
+
onOpenChange={options?.onOpenChange ?? vi.fn()}
|
|
61
|
+
channelSlug="wa-main"
|
|
62
|
+
org="acme"
|
|
63
|
+
onSend={onSend}
|
|
64
|
+
isSending={options?.isSending ?? false}
|
|
65
|
+
modal={false}
|
|
66
|
+
/>,
|
|
67
|
+
{ wrapper: Wrapper },
|
|
68
|
+
);
|
|
69
|
+
return { view, listTemplates, onSend };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
describe("ConversationTemplatePickerDialog", () => {
|
|
73
|
+
afterEach(() => cleanup());
|
|
74
|
+
|
|
75
|
+
it("lists approved templates and asks the wire for approved only", async () => {
|
|
76
|
+
const { listTemplates } = renderPicker();
|
|
77
|
+
|
|
78
|
+
await waitFor(() => expect(screen.getByText("fee_reminder")).toBeDefined());
|
|
79
|
+
expect(listTemplates).toHaveBeenCalledWith(
|
|
80
|
+
expect.objectContaining({ channel: "wa-main", org: "acme", approvedOnly: true }),
|
|
81
|
+
);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it("marks unsupported and image-header templates unsendable, with the reason", async () => {
|
|
85
|
+
renderPicker({
|
|
86
|
+
templates: [
|
|
87
|
+
makeTemplate({
|
|
88
|
+
name: "flow_template",
|
|
89
|
+
unsupportedReason: "FLOW buttons are not supported",
|
|
90
|
+
}),
|
|
91
|
+
makeTemplate({ name: "hero_image", headerFormat: "IMAGE" }),
|
|
92
|
+
makeTemplate(),
|
|
93
|
+
],
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
await waitFor(() => expect(screen.getByText("fee_reminder")).toBeDefined());
|
|
97
|
+
const unsupported = screen
|
|
98
|
+
.getByText("flow_template")
|
|
99
|
+
.closest("button") as HTMLButtonElement;
|
|
100
|
+
expect(unsupported.disabled).toBe(true);
|
|
101
|
+
expect(screen.getByText(/FLOW buttons are not supported/)).toBeDefined();
|
|
102
|
+
|
|
103
|
+
// The v1 scope cut (cloud#260): the send payload's image link has no
|
|
104
|
+
// console-side source yet, so the template shows but cannot be picked.
|
|
105
|
+
const imageHeader = screen
|
|
106
|
+
.getByText("hero_image")
|
|
107
|
+
.closest("button") as HTMLButtonElement;
|
|
108
|
+
expect(imageHeader.disabled).toBe(true);
|
|
109
|
+
expect(screen.getByText(/image header needs a hosted image/)).toBeDefined();
|
|
110
|
+
|
|
111
|
+
const sendable = screen
|
|
112
|
+
.getByText("fee_reminder")
|
|
113
|
+
.closest("button") as HTMLButtonElement;
|
|
114
|
+
expect(sendable.disabled).toBe(false);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it("phrases an empty registry answer as none FOUND, never none exist", async () => {
|
|
118
|
+
renderPicker({ templates: [] });
|
|
119
|
+
await waitFor(() =>
|
|
120
|
+
expect(screen.getByText("No approved templates found")).toBeDefined(),
|
|
121
|
+
);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it("fills variables with a live preview and only then enables Send", async () => {
|
|
125
|
+
const user = userEvent.setup();
|
|
126
|
+
renderPicker();
|
|
127
|
+
|
|
128
|
+
await waitFor(() => expect(screen.getByText("fee_reminder")).toBeDefined());
|
|
129
|
+
await user.click(screen.getByText("fee_reminder"));
|
|
130
|
+
|
|
131
|
+
const send = screen.getByRole("button", { name: "Send template" }) as HTMLButtonElement;
|
|
132
|
+
expect(send.disabled).toBe(true);
|
|
133
|
+
|
|
134
|
+
await user.type(screen.getByLabelText("1"), "Noor");
|
|
135
|
+
await user.type(screen.getByLabelText("2"), "$40");
|
|
136
|
+
|
|
137
|
+
// The preview substitutes the filled values into the verbatim body —
|
|
138
|
+
// the exact message the customer receives. Segments render as
|
|
139
|
+
// separate spans, so assert on the whole paragraph.
|
|
140
|
+
const preview = screen.getByText("Preview").nextElementSibling;
|
|
141
|
+
expect(preview?.textContent).toBe("Hi Noor, your fee of $40 is due.");
|
|
142
|
+
expect(send.disabled).toBe(false);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it("sends the chosen entry's name, language, and trimmed parameters, and closes on accepted", async () => {
|
|
146
|
+
const user = userEvent.setup();
|
|
147
|
+
const onOpenChange = vi.fn();
|
|
148
|
+
const { onSend } = renderPicker({ onOpenChange });
|
|
149
|
+
|
|
150
|
+
await waitFor(() => expect(screen.getByText("fee_reminder")).toBeDefined());
|
|
151
|
+
await user.click(screen.getByText("fee_reminder"));
|
|
152
|
+
await user.type(screen.getByLabelText("1"), " Noor ");
|
|
153
|
+
await user.type(screen.getByLabelText("2"), "$40");
|
|
154
|
+
await user.click(screen.getByRole("button", { name: "Send template" }));
|
|
155
|
+
|
|
156
|
+
await waitFor(() =>
|
|
157
|
+
expect(onSend).toHaveBeenCalledWith({
|
|
158
|
+
kind: "template",
|
|
159
|
+
name: "fee_reminder",
|
|
160
|
+
language: "en_US",
|
|
161
|
+
parameters: { "1": "Noor", "2": "$40" },
|
|
162
|
+
}),
|
|
163
|
+
);
|
|
164
|
+
await waitFor(() => expect(onOpenChange).toHaveBeenCalledWith(false));
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it("keeps the dialog open with every value intact and shows the detail verbatim on refusal", async () => {
|
|
168
|
+
const user = userEvent.setup();
|
|
169
|
+
const onOpenChange = vi.fn();
|
|
170
|
+
const onSend = vi
|
|
171
|
+
.fn()
|
|
172
|
+
.mockResolvedValue(
|
|
173
|
+
output(ChannelSendOutcome.refused, "template 'fee_reminder' is PAUSED on WhatsApp"),
|
|
174
|
+
);
|
|
175
|
+
renderPicker({ onSend, onOpenChange });
|
|
176
|
+
|
|
177
|
+
await waitFor(() => expect(screen.getByText("fee_reminder")).toBeDefined());
|
|
178
|
+
await user.click(screen.getByText("fee_reminder"));
|
|
179
|
+
await user.type(screen.getByLabelText("1"), "Noor");
|
|
180
|
+
await user.type(screen.getByLabelText("2"), "$40");
|
|
181
|
+
await user.click(screen.getByRole("button", { name: "Send template" }));
|
|
182
|
+
|
|
183
|
+
await waitFor(() =>
|
|
184
|
+
expect(
|
|
185
|
+
screen.getByText("template 'fee_reminder' is PAUSED on WhatsApp"),
|
|
186
|
+
).toBeDefined(),
|
|
187
|
+
);
|
|
188
|
+
// The words never left; the correction the detail asks for starts
|
|
189
|
+
// from the values already filled (the composer's draft contract).
|
|
190
|
+
expect(onOpenChange).not.toHaveBeenCalledWith(false);
|
|
191
|
+
expect((screen.getByLabelText("1") as HTMLInputElement).value).toBe("Noor");
|
|
192
|
+
expect((screen.getByLabelText("2") as HTMLInputElement).value).toBe("$40");
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it("keeps the dialog open and renders a thrown failure", async () => {
|
|
196
|
+
const user = userEvent.setup();
|
|
197
|
+
const onSend = vi.fn().mockRejectedValue(new Error("transport exploded"));
|
|
198
|
+
renderPicker({ onSend });
|
|
199
|
+
|
|
200
|
+
await waitFor(() => expect(screen.getByText("fee_reminder")).toBeDefined());
|
|
201
|
+
await user.click(screen.getByText("fee_reminder"));
|
|
202
|
+
await user.type(screen.getByLabelText("1"), "Noor");
|
|
203
|
+
await user.type(screen.getByLabelText("2"), "$40");
|
|
204
|
+
await user.click(screen.getByRole("button", { name: "Send template" }));
|
|
205
|
+
|
|
206
|
+
await waitFor(() => expect(screen.getByText(/transport exploded/)).toBeDefined());
|
|
207
|
+
expect((screen.getByLabelText("1") as HTMLInputElement).value).toBe("Noor");
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it("navigates back to the list, discarding the selection", async () => {
|
|
211
|
+
const user = userEvent.setup();
|
|
212
|
+
renderPicker({
|
|
213
|
+
templates: [makeTemplate(), makeTemplate({ name: "order_update" })],
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
await waitFor(() => expect(screen.getByText("fee_reminder")).toBeDefined());
|
|
217
|
+
await user.click(screen.getByText("fee_reminder"));
|
|
218
|
+
expect(screen.getByRole("button", { name: "Send template" })).toBeDefined();
|
|
219
|
+
|
|
220
|
+
await user.click(screen.getByRole("button", { name: "Back to the template list" }));
|
|
221
|
+
expect(screen.getByText("order_update")).toBeDefined();
|
|
222
|
+
expect(screen.queryByRole("button", { name: "Send template" })).toBeNull();
|
|
223
|
+
});
|
|
224
|
+
});
|
|
@@ -100,7 +100,9 @@ describe("useConversationParticipation", () => {
|
|
|
100
100
|
{ wrapper: wrapper(client) },
|
|
101
101
|
);
|
|
102
102
|
|
|
103
|
-
const output = await act(() =>
|
|
103
|
+
const output = await act(() =>
|
|
104
|
+
result.current.reply({ kind: "text", body: "on my way" }),
|
|
105
|
+
);
|
|
104
106
|
|
|
105
107
|
expect(output.outboundMessageId).toBe("obm_1");
|
|
106
108
|
const agentChannel = (client as { agentChannel: Record<string, ReturnType<typeof vi.fn>> })
|
|
@@ -109,7 +111,10 @@ describe("useConversationParticipation", () => {
|
|
|
109
111
|
expect.objectContaining({
|
|
110
112
|
...IDENTITY,
|
|
111
113
|
payload: expect.objectContaining({
|
|
112
|
-
kind: expect.objectContaining({
|
|
114
|
+
kind: expect.objectContaining({
|
|
115
|
+
case: "text",
|
|
116
|
+
value: expect.objectContaining({ body: "on my way" }),
|
|
117
|
+
}),
|
|
113
118
|
}),
|
|
114
119
|
}),
|
|
115
120
|
);
|
|
@@ -121,6 +126,40 @@ describe("useConversationParticipation", () => {
|
|
|
121
126
|
);
|
|
122
127
|
});
|
|
123
128
|
|
|
129
|
+
it("reply sends the template lane through the same command — name, language, and parameters verbatim", async () => {
|
|
130
|
+
const client = createMockStigmer();
|
|
131
|
+
const { result } = renderHook(() => useConversationParticipation(IDENTITY), {
|
|
132
|
+
wrapper: wrapper(client),
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
await act(() =>
|
|
136
|
+
result.current.reply({
|
|
137
|
+
kind: "template",
|
|
138
|
+
name: "order_update",
|
|
139
|
+
language: "en_US",
|
|
140
|
+
parameters: { "1": "Noor", "2": "tomorrow" },
|
|
141
|
+
}),
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
const agentChannel = (client as { agentChannel: Record<string, ReturnType<typeof vi.fn>> })
|
|
145
|
+
.agentChannel;
|
|
146
|
+
expect(agentChannel.reply).toHaveBeenCalledWith(
|
|
147
|
+
expect.objectContaining({
|
|
148
|
+
...IDENTITY,
|
|
149
|
+
payload: expect.objectContaining({
|
|
150
|
+
kind: expect.objectContaining({
|
|
151
|
+
case: "template",
|
|
152
|
+
value: expect.objectContaining({
|
|
153
|
+
name: "order_update",
|
|
154
|
+
language: "en_US",
|
|
155
|
+
parameters: { "1": "Noor", "2": "tomorrow" },
|
|
156
|
+
}),
|
|
157
|
+
}),
|
|
158
|
+
}),
|
|
159
|
+
}),
|
|
160
|
+
);
|
|
161
|
+
});
|
|
162
|
+
|
|
124
163
|
it("still resolves the reply when the follow-up row read fails — the send outcome is the answer", async () => {
|
|
125
164
|
const client = createMockStigmer({
|
|
126
165
|
getConversation: vi.fn().mockRejectedValue(new Error("blip")),
|
|
@@ -131,7 +170,9 @@ describe("useConversationParticipation", () => {
|
|
|
131
170
|
{ wrapper: wrapper(client) },
|
|
132
171
|
);
|
|
133
172
|
|
|
134
|
-
const output = await act(() =>
|
|
173
|
+
const output = await act(() =>
|
|
174
|
+
result.current.reply({ kind: "text", body: "on my way" }),
|
|
175
|
+
);
|
|
135
176
|
|
|
136
177
|
expect(output.outboundMessageId).toBe("obm_1");
|
|
137
178
|
expect(onConversation).not.toHaveBeenCalled();
|
|
@@ -144,7 +185,7 @@ describe("useConversationParticipation", () => {
|
|
|
144
185
|
wrapper: wrapper(client),
|
|
145
186
|
});
|
|
146
187
|
|
|
147
|
-
await act(() => result.current.reply("on my way"));
|
|
188
|
+
await act(() => result.current.reply({ kind: "text", body: "on my way" }));
|
|
148
189
|
|
|
149
190
|
const agentChannel = (client as { agentChannel: Record<string, ReturnType<typeof vi.fn>> })
|
|
150
191
|
.agentChannel;
|
|
@@ -22,6 +22,9 @@ export type { ConversationAttentionBannerProps } from "./ConversationAttentionBa
|
|
|
22
22
|
export { ConversationComposer } from "./ConversationComposer.js";
|
|
23
23
|
export type { ConversationComposerProps } from "./ConversationComposer.js";
|
|
24
24
|
|
|
25
|
+
export { ConversationTemplatePickerDialog } from "./ConversationTemplatePickerDialog.js";
|
|
26
|
+
export type { ConversationTemplatePickerDialogProps } from "./ConversationTemplatePickerDialog.js";
|
|
27
|
+
|
|
25
28
|
export { useConversation } from "./useConversation.js";
|
|
26
29
|
export type {
|
|
27
30
|
UseConversationOptions,
|
|
@@ -49,6 +52,7 @@ export type {
|
|
|
49
52
|
export { useConversationParticipation } from "./useConversationParticipation.js";
|
|
50
53
|
export type {
|
|
51
54
|
ConversationCommand,
|
|
55
|
+
ConversationReplyPayload,
|
|
52
56
|
UseConversationParticipationOptions,
|
|
53
57
|
UseConversationParticipationReturn,
|
|
54
58
|
} from "./useConversationParticipation.js";
|
|
@@ -17,6 +17,43 @@ import { useKeyedSubmission } from "../internal/useKeyedSubmission.js";
|
|
|
17
17
|
/** The four staff-facing participation commands. */
|
|
18
18
|
export type ConversationCommand = "reply" | "takeOver" | "handBack" | "clearAttention";
|
|
19
19
|
|
|
20
|
+
/**
|
|
21
|
+
* A staff reply's payload — the client-side face of the wire's
|
|
22
|
+
* `ChannelOutboundPayload` oneof. Reply is ONE command with two lanes,
|
|
23
|
+
* never two commands: both lanes share the implicit takeover, the
|
|
24
|
+
* `"reply"` pending key, and the outcome contract.
|
|
25
|
+
*
|
|
26
|
+
* - `text` — free-form; requires an open 24-hour customer-service
|
|
27
|
+
* window on providers that enforce one (WhatsApp).
|
|
28
|
+
* - `template` — a provider-approved message template, the only lane
|
|
29
|
+
* for a closed window. `language` is always required here (the wire
|
|
30
|
+
* allows omitting it for single-language names, but a caller that
|
|
31
|
+
* picked a template knows its language — sending it structurally
|
|
32
|
+
* avoids the ambiguity refusal). Image-header templates are not yet
|
|
33
|
+
* sendable from the SDK: the wire's `header_image_link` needs a
|
|
34
|
+
* public HTTPS asset no console surface can supply today.
|
|
35
|
+
*/
|
|
36
|
+
export type ConversationReplyPayload =
|
|
37
|
+
| {
|
|
38
|
+
readonly kind: "text";
|
|
39
|
+
/** The message body, as the customer will receive it. */
|
|
40
|
+
readonly body: string;
|
|
41
|
+
}
|
|
42
|
+
| {
|
|
43
|
+
readonly kind: "template";
|
|
44
|
+
/** Template name on the channel provider's registry. */
|
|
45
|
+
readonly name: string;
|
|
46
|
+
/** Template language code (e.g. `"en"`, `"en_US"`). */
|
|
47
|
+
readonly language: string;
|
|
48
|
+
/**
|
|
49
|
+
* Variable values: keyed by parameter name for NAMED templates,
|
|
50
|
+
* by position (`"1"`, `"2"`, …) for POSITIONAL ones — exactly the
|
|
51
|
+
* template's declared parameters, no more, no fewer (the server's
|
|
52
|
+
* pre-check refuses mismatches with a corrective detail).
|
|
53
|
+
*/
|
|
54
|
+
readonly parameters: Readonly<Record<string, string>>;
|
|
55
|
+
};
|
|
56
|
+
|
|
20
57
|
/** Options for {@link useConversationParticipation}. */
|
|
21
58
|
export interface UseConversationParticipationOptions {
|
|
22
59
|
/** AgentChannel the conversation belongs to. */
|
|
@@ -37,13 +74,16 @@ export interface UseConversationParticipationOptions {
|
|
|
37
74
|
/** Return value of {@link useConversationParticipation}. */
|
|
38
75
|
export interface UseConversationParticipationReturn {
|
|
39
76
|
/**
|
|
40
|
-
* Send a staff
|
|
41
|
-
*
|
|
42
|
-
*
|
|
77
|
+
* Send a staff reply — text or template (see
|
|
78
|
+
* {@link ConversationReplyPayload}). Resolves with the truthful
|
|
79
|
+
* outcome of the inline attempt: `accepted` (with
|
|
80
|
+
* `outboundMessageId` — the item will appear on the timeline as
|
|
81
|
+
* `ob:<that id>`), `queued`, or `refused` (template pre-check
|
|
82
|
+
* refusals land here too, with the server's corrective detail).
|
|
43
83
|
* A `refused` outcome WITHOUT an `outboundMessageId` left no ledger
|
|
44
84
|
* row and no timeline item will ever exist for it.
|
|
45
85
|
*/
|
|
46
|
-
readonly reply: (
|
|
86
|
+
readonly reply: (payload: ConversationReplyPayload) => Promise<SendChannelMessageOutput>;
|
|
47
87
|
/**
|
|
48
88
|
* Take the conversation over: the agent goes quiet until handBack.
|
|
49
89
|
* Resolves with the fresh row — for the LOSER of a concurrent
|
|
@@ -120,13 +160,25 @@ export function useConversationParticipation(
|
|
|
120
160
|
);
|
|
121
161
|
|
|
122
162
|
const reply = useCallback(
|
|
123
|
-
(
|
|
163
|
+
(payload: ConversationReplyPayload) =>
|
|
124
164
|
run("reply", async () => {
|
|
125
165
|
const output = await stigmer.agentChannel.reply(
|
|
126
166
|
create(ReplyToConversationInputSchema, {
|
|
127
167
|
agentChannelId,
|
|
128
168
|
conversationKey,
|
|
129
|
-
payload: {
|
|
169
|
+
payload: {
|
|
170
|
+
kind:
|
|
171
|
+
payload.kind === "text"
|
|
172
|
+
? { case: "text", value: { body: payload.body } }
|
|
173
|
+
: {
|
|
174
|
+
case: "template",
|
|
175
|
+
value: {
|
|
176
|
+
name: payload.name,
|
|
177
|
+
language: payload.language,
|
|
178
|
+
parameters: { ...payload.parameters },
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
},
|
|
130
182
|
}),
|
|
131
183
|
);
|
|
132
184
|
// The implicit takeover flipped control BEFORE the send ran —
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useCallback, useState } from "react";
|
|
4
4
|
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { UNSTYLED_LIST } from "../internal/element-resets.js";
|
|
5
6
|
import { getUserMessage, isPermissionDenied } from "@stigmer/sdk";
|
|
6
7
|
import type { CursorAccount } from "@stigmer/protos/ai/stigmer/platform/cursoraccount/v1/cursor_account_pb";
|
|
7
8
|
import type { CursorAccountSummary } from "@stigmer/protos/ai/stigmer/platform/cursoraccount/v1/io_pb";
|
|
@@ -145,7 +146,7 @@ export function CursorAccountsConsole({ className }: CursorAccountsConsoleProps)
|
|
|
145
146
|
add member execution keys to make it routable.
|
|
146
147
|
</p>
|
|
147
148
|
) : (
|
|
148
|
-
<ul role="list" aria-label="Cursor accounts" className=
|
|
149
|
+
<ul role="list" aria-label="Cursor accounts" className={UNSTYLED_LIST}>
|
|
149
150
|
{accounts.map((summary) => (
|
|
150
151
|
<AccountRow
|
|
151
152
|
key={summary.account?.accountId}
|
|
@@ -5,6 +5,7 @@ import { cn } from "@stigmer/theme";
|
|
|
5
5
|
import { getUserMessage } from "@stigmer/sdk";
|
|
6
6
|
import type { CursorAccountView } from "@stigmer/protos/ai/stigmer/platform/cursoraccount/v1/io_pb";
|
|
7
7
|
import { Button } from "../button/index.js";
|
|
8
|
+
import { UNSTYLED_LIST } from "../internal/element-resets.js";
|
|
8
9
|
import { INPUT_CLASSES } from "../internal/form-primitives.js";
|
|
9
10
|
import { toError } from "../internal/toError.js";
|
|
10
11
|
import type { CursorAccountCoverage } from "./cursor-account-coverage.js";
|
|
@@ -259,7 +260,7 @@ export function MemberKeysPanel({
|
|
|
259
260
|
<ul
|
|
260
261
|
role="list"
|
|
261
262
|
aria-label="Import results"
|
|
262
|
-
className="stg:
|
|
263
|
+
className={cn(UNSTYLED_LIST, "stg:space-y-0.5 stg:text-[11px]")}
|
|
263
264
|
>
|
|
264
265
|
{importResults.map((result) => (
|
|
265
266
|
<li
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { memo } from "react";
|
|
4
4
|
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { UNSTYLED_LIST } from "../internal/element-resets.js";
|
|
5
6
|
import type { DashboardFailedRun } from "./types.js";
|
|
6
7
|
import { formatRelativeTime } from "../activity/format-relative-time.js";
|
|
7
8
|
|
|
@@ -54,7 +55,7 @@ export const DashboardFailedRuns = memo(function DashboardFailedRuns({
|
|
|
54
55
|
No recent failures
|
|
55
56
|
</p>
|
|
56
57
|
) : (
|
|
57
|
-
<ul className="stg:space-y-1.5" role="list">
|
|
58
|
+
<ul className={cn(UNSTYLED_LIST, "stg:space-y-1.5")} role="list">
|
|
58
59
|
{failedRuns.map((run) => (
|
|
59
60
|
<li
|
|
60
61
|
key={run.id}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useCallback, useRef, type KeyboardEvent } from "react";
|
|
4
4
|
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { UNSTYLED_LIST } from "../internal/element-resets.js";
|
|
5
6
|
import type { DependencyGraphProps } from "./types.js";
|
|
6
7
|
import { DependencyTreeNode } from "./DependencyTreeNode.js";
|
|
7
8
|
|
|
@@ -114,7 +115,7 @@ export function DependencyGraph({
|
|
|
114
115
|
role="tree"
|
|
115
116
|
aria-label={`Dependencies of ${root.label}`}
|
|
116
117
|
onKeyDown={handleKeyDown}
|
|
117
|
-
className="stg:rounded-lg stg:border stg:border-border stg:p-2"
|
|
118
|
+
className={cn(UNSTYLED_LIST, "stg:rounded-lg stg:border stg:border-border stg:p-2")}
|
|
118
119
|
>
|
|
119
120
|
<DependencyTreeNode
|
|
120
121
|
node={root}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useCallback, useState, type KeyboardEvent } from "react";
|
|
4
4
|
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { UNSTYLED_LIST } from "../internal/element-resets.js";
|
|
5
6
|
import type { DependencyNode, NodeKind } from "./types.js";
|
|
6
7
|
|
|
7
8
|
interface DependencyTreeNodeProps {
|
|
@@ -152,7 +153,7 @@ export function DependencyTreeNode({
|
|
|
152
153
|
{showChildren && (
|
|
153
154
|
<ul
|
|
154
155
|
role="group"
|
|
155
|
-
className="stg:relative stg:ml-[11px] stg:border-l stg:border-border stg:pl-3"
|
|
156
|
+
className={cn(UNSTYLED_LIST, "stg:relative stg:ml-[11px] stg:border-l stg:border-border stg:pl-3")}
|
|
156
157
|
>
|
|
157
158
|
{node.children.map((child) => (
|
|
158
159
|
<DependencyTreeNode
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useCallback, useId, useMemo } from "react";
|
|
4
4
|
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { UNSTYLED_LIST } from "../internal/element-resets.js";
|
|
5
6
|
import type { Environment } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/api_pb";
|
|
6
7
|
import type { ResourceRef } from "@stigmer/sdk";
|
|
7
8
|
import { useEnvironmentList } from "./useEnvironmentList.js";
|
|
@@ -217,7 +218,7 @@ function SelectedList({
|
|
|
217
218
|
total,
|
|
218
219
|
}: SelectedListProps) {
|
|
219
220
|
return (
|
|
220
|
-
<ol className="stg:space-y-1.5" aria-label="Selected environments (merge order)">
|
|
221
|
+
<ol className={cn(UNSTYLED_LIST, "stg:space-y-1.5")} aria-label="Selected environments (merge order)">
|
|
221
222
|
{value.map((ref, index) => (
|
|
222
223
|
<li
|
|
223
224
|
key={`${ref.org}-${ref.slug}-${index}`}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { useMemo } from "react";
|
|
4
4
|
import { StigmerError, getUserMessage } from "@stigmer/sdk";
|
|
5
5
|
import { cn } from "@stigmer/theme";
|
|
6
|
+
import { UNSTYLED_LIST } from "../internal/element-resets.js";
|
|
6
7
|
|
|
7
8
|
/** Props for {@link SecretFlowErrorGuide}. */
|
|
8
9
|
export interface SecretFlowErrorGuideProps {
|
|
@@ -113,7 +114,7 @@ export function SecretFlowErrorGuide({
|
|
|
113
114
|
<p className="stg:text-xs stg:text-amber-700 stg:dark:text-amber-300">
|
|
114
115
|
<span className="stg:font-medium">{server}</span> requires:
|
|
115
116
|
</p>
|
|
116
|
-
<ul className="stg:mt-0.5 stg:space-y-0.5">
|
|
117
|
+
<ul className={cn(UNSTYLED_LIST, "stg:mt-0.5 stg:space-y-0.5")}>
|
|
117
118
|
{vars.map((v) => (
|
|
118
119
|
<li
|
|
119
120
|
key={v}
|
|
@@ -131,7 +132,7 @@ export function SecretFlowErrorGuide({
|
|
|
131
132
|
<p className="stg:text-xs stg:text-amber-700/90 stg:dark:text-amber-300/90">
|
|
132
133
|
You can provide these values in two ways:
|
|
133
134
|
</p>
|
|
134
|
-
<ul className="stg:mt-1 stg:space-y-0.5 stg:text-xs stg:text-amber-700/80 stg:dark:text-amber-300/80">
|
|
135
|
+
<ul className={cn(UNSTYLED_LIST, "stg:mt-1 stg:space-y-0.5 stg:text-xs stg:text-amber-700/80 stg:dark:text-amber-300/80")}>
|
|
135
136
|
<li className="stg:flex stg:items-start stg:gap-1.5">
|
|
136
137
|
<span className="stg:mt-px stg:shrink-0">•</span>
|
|
137
138
|
<span>
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import type { ExecutionArtifact } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/artifact_pb";
|
|
4
4
|
import { ExecutionArtifactKind } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
5
|
+
import { UNSTYLED_LIST } from "../internal/element-resets.js";
|
|
5
6
|
import { ArtifactFileContent } from "./ArtifactFileContent.js";
|
|
6
7
|
import type { SkillPackageDetection } from "../library/detect-skill-package.js";
|
|
7
8
|
|
|
@@ -103,7 +104,7 @@ function DirectoryContentView({
|
|
|
103
104
|
<h3 className="stg:mb-2 stg:text-xs stg:font-medium stg:text-muted-foreground">
|
|
104
105
|
Files ({entries.length})
|
|
105
106
|
</h3>
|
|
106
|
-
<ul className=
|
|
107
|
+
<ul className={`${UNSTYLED_LIST} stg:space-y-0.5`} role="list">
|
|
107
108
|
{entries.map((entry) => (
|
|
108
109
|
<li
|
|
109
110
|
key={entry}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { useCallback, useMemo, useState } from "react";
|
|
4
4
|
import type { AgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
5
5
|
import { cn } from "@stigmer/theme";
|
|
6
|
+
import { UNSTYLED_LIST } from "../internal/element-resets.js";
|
|
6
7
|
import {
|
|
7
8
|
useSessionArtifacts,
|
|
8
9
|
artifactKey,
|
|
@@ -116,7 +117,7 @@ export function ArtifactsWidget({
|
|
|
116
117
|
</span>
|
|
117
118
|
</div>
|
|
118
119
|
|
|
119
|
-
<ul role="list" className="stg:flex stg:flex-col">
|
|
120
|
+
<ul role="list" className={cn(UNSTYLED_LIST, "stg:flex stg:flex-col")}>
|
|
120
121
|
{artifacts.map((entry) => (
|
|
121
122
|
<ArtifactRow
|
|
122
123
|
key={artifactKey(entry.artifact)}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { memo, useState } from "react";
|
|
4
4
|
import type { FileChangeProgress } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
|
|
5
5
|
import { cn } from "@stigmer/theme";
|
|
6
|
+
import { UNSTYLED_LIST } from "../internal/element-resets.js";
|
|
6
7
|
import { FileKindBadge, FileLineStats } from "./FileReviewAtoms.js";
|
|
7
8
|
import { FilePathLink } from "./FilePathLink.js";
|
|
8
9
|
|
|
@@ -91,7 +92,7 @@ export const FileChangeProgressBar = memo(function FileChangeProgressBar({
|
|
|
91
92
|
<FileLineStats linesAdded={linesAdded} linesRemoved={linesRemoved} />
|
|
92
93
|
</div>
|
|
93
94
|
{expanded && (
|
|
94
|
-
<ul className="stg:mt-2 stg:max-h-[30vh] stg:space-y-1 stg:overflow-y-auto">
|
|
95
|
+
<ul className={cn(UNSTYLED_LIST, "stg:mt-2 stg:max-h-[30vh] stg:space-y-1 stg:overflow-y-auto")}>
|
|
95
96
|
{entries.map((entry) => {
|
|
96
97
|
const path = entry.pathAfter || entry.pathBefore;
|
|
97
98
|
return (
|
|
@@ -4,6 +4,7 @@ import { useMemo, type ComponentType } from "react";
|
|
|
4
4
|
import type { TodoItem } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/todo_pb";
|
|
5
5
|
import { TodoStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
6
6
|
import { cn } from "@stigmer/theme";
|
|
7
|
+
import { UNSTYLED_LIST } from "../internal/element-resets.js";
|
|
7
8
|
|
|
8
9
|
/** Props for {@link TodoList}. */
|
|
9
10
|
export interface TodoListProps {
|
|
@@ -69,7 +70,7 @@ export function TodoList({
|
|
|
69
70
|
return (
|
|
70
71
|
<ul
|
|
71
72
|
role="list"
|
|
72
|
-
className={cn("stg:flex stg:flex-col stg:gap-1", className)}
|
|
73
|
+
className={cn(UNSTYLED_LIST, "stg:flex stg:flex-col stg:gap-1", className)}
|
|
73
74
|
aria-label="Tasks"
|
|
74
75
|
>
|
|
75
76
|
{sortedTodos.map((item) => (
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import type { AgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
4
4
|
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { UNSTYLED_LIST } from "../internal/element-resets.js";
|
|
5
6
|
import { useSessionWriteBacks } from "../session/useSessionWriteBacks.js";
|
|
6
7
|
import { WriteBackCard } from "./WriteBackCard.js";
|
|
7
8
|
|
|
@@ -71,7 +72,7 @@ export function WriteBacksWidget({
|
|
|
71
72
|
</span>
|
|
72
73
|
</div>
|
|
73
74
|
|
|
74
|
-
<ul role="list" className="stg:flex stg:flex-col stg:gap-3">
|
|
75
|
+
<ul role="list" className={cn(UNSTYLED_LIST, "stg:flex stg:flex-col stg:gap-3")}>
|
|
75
76
|
{writeBacks.map((entry) => (
|
|
76
77
|
<li key={entry.writeBack.workspaceEntryName}>
|
|
77
78
|
<WriteBackCard writeBack={entry.writeBack} />
|