@stigmer/react 3.12.1 → 3.12.2
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/access/ManageAccessDialog.d.ts.map +1 -1
- package/access/ManageAccessDialog.js +7 -2
- package/access/ManageAccessDialog.js.map +1 -1
- package/activity/format-relative-time.d.ts +11 -9
- package/activity/format-relative-time.d.ts.map +1 -1
- package/activity/format-relative-time.js +11 -9
- package/activity/format-relative-time.js.map +1 -1
- package/agent/steps/CapabilitiesStep.js +5 -2
- package/agent/steps/CapabilitiesStep.js.map +1 -1
- package/agent/steps/IdentityStep.d.ts.map +1 -1
- package/agent/steps/IdentityStep.js +6 -5
- package/agent/steps/IdentityStep.js.map +1 -1
- package/agent-instance/CreateAgentInstanceDialog.d.ts.map +1 -1
- package/agent-instance/CreateAgentInstanceDialog.js +10 -2
- package/agent-instance/CreateAgentInstanceDialog.js.map +1 -1
- package/api-key/ApiKeyCreatedAlert.d.ts.map +1 -1
- package/api-key/ApiKeyCreatedAlert.js +12 -20
- package/api-key/ApiKeyCreatedAlert.js.map +1 -1
- package/api-key/ApiKeyListPanel.d.ts.map +1 -1
- package/api-key/ApiKeyListPanel.js +3 -23
- package/api-key/ApiKeyListPanel.js.map +1 -1
- package/api-key/CreateApiKeyForm.d.ts.map +1 -1
- package/api-key/CreateApiKeyForm.js +6 -10
- package/api-key/CreateApiKeyForm.js.map +1 -1
- package/approval-defaults-context.d.ts +47 -0
- package/approval-defaults-context.d.ts.map +1 -0
- package/approval-defaults-context.js +27 -0
- package/approval-defaults-context.js.map +1 -0
- package/attachment/index.d.ts +2 -0
- package/attachment/index.d.ts.map +1 -1
- package/attachment/index.js +1 -0
- package/attachment/index.js.map +1 -1
- package/attachment/vision-preflight.d.ts +113 -0
- package/attachment/vision-preflight.d.ts.map +1 -0
- package/attachment/vision-preflight.js +143 -0
- package/attachment/vision-preflight.js.map +1 -0
- package/billing/AutoRechargeCard.d.ts.map +1 -1
- package/billing/AutoRechargeCard.js +3 -2
- package/billing/AutoRechargeCard.js.map +1 -1
- package/billing/BillingSection.d.ts.map +1 -1
- package/billing/BillingSection.js +3 -2
- package/billing/BillingSection.js.map +1 -1
- package/channel/ChannelConversationsDialog.d.ts.map +1 -1
- package/channel/ChannelConversationsDialog.js +5 -4
- package/channel/ChannelConversationsDialog.js.map +1 -1
- package/channel/ChannelCredentialsDialog.d.ts.map +1 -1
- package/channel/ChannelCredentialsDialog.js +9 -4
- package/channel/ChannelCredentialsDialog.js.map +1 -1
- package/channel/ChannelTemplatesDialog.d.ts.map +1 -1
- package/channel/ChannelTemplatesDialog.js +5 -4
- package/channel/ChannelTemplatesDialog.js.map +1 -1
- package/channel/ConnectSlackDialog.d.ts.map +1 -1
- package/channel/ConnectSlackDialog.js +9 -4
- package/channel/ConnectSlackDialog.js.map +1 -1
- package/channel/ConnectWhatsAppDialog.d.ts.map +1 -1
- package/channel/ConnectWhatsAppDialog.js +9 -4
- package/channel/ConnectWhatsAppDialog.js.map +1 -1
- package/channel/useChannelSessions.d.ts.map +1 -1
- package/channel/useChannelSessions.js.map +1 -1
- package/channel-app/ChannelAppDetailPanel.d.ts.map +1 -1
- package/channel-app/ChannelAppDetailPanel.js +8 -5
- package/channel-app/ChannelAppDetailPanel.js.map +1 -1
- package/channel-app/CreateChannelAppForm.d.ts.map +1 -1
- package/channel-app/CreateChannelAppForm.js +12 -7
- package/channel-app/CreateChannelAppForm.js.map +1 -1
- package/channel-app/internal.d.ts +0 -1
- package/channel-app/internal.d.ts.map +1 -1
- package/channel-app/internal.js +5 -10
- package/channel-app/internal.js.map +1 -1
- package/composer/ComposerToolbar.js +2 -1
- package/composer/ComposerToolbar.js.map +1 -1
- package/composer/SessionComposer.d.ts +1 -1
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +120 -13
- package/composer/SessionComposer.js.map +1 -1
- package/composer/icons.d.ts +0 -1
- package/composer/icons.d.ts.map +1 -1
- package/composer/icons.js +0 -3
- package/composer/icons.js.map +1 -1
- package/conversation/ConversationComposer.js +1 -1
- package/conversation/ConversationComposer.js.map +1 -1
- package/conversation/ConversationListPane.d.ts.map +1 -1
- package/conversation/ConversationListPane.js +3 -2
- package/conversation/ConversationListPane.js.map +1 -1
- package/cursor-accounts/MemberCoverageTable.js +3 -14
- package/cursor-accounts/MemberCoverageTable.js.map +1 -1
- package/dashboard/DashboardFailedRuns.d.ts.map +1 -1
- package/dashboard/DashboardFailedRuns.js +2 -14
- package/dashboard/DashboardFailedRuns.js.map +1 -1
- package/environment/CreateEnvironmentForm.d.ts.map +1 -1
- package/environment/CreateEnvironmentForm.js +4 -8
- package/environment/CreateEnvironmentForm.js.map +1 -1
- package/environment/EnvVarForm.d.ts.map +1 -1
- package/environment/EnvVarForm.js +2 -4
- package/environment/EnvVarForm.js.map +1 -1
- package/environment/EnvironmentVariableEditor.d.ts.map +1 -1
- package/environment/EnvironmentVariableEditor.js +5 -7
- package/environment/EnvironmentVariableEditor.js.map +1 -1
- package/execution/ArtifactApplyButton.d.ts.map +1 -1
- package/execution/ArtifactApplyButton.js +2 -4
- package/execution/ArtifactApplyButton.js.map +1 -1
- package/execution/ExecutionErrorNotice.d.ts +36 -0
- package/execution/ExecutionErrorNotice.d.ts.map +1 -0
- package/execution/ExecutionErrorNotice.js +39 -0
- package/execution/ExecutionErrorNotice.js.map +1 -0
- package/execution/FilePathLink.d.ts.map +1 -1
- package/execution/FilePathLink.js +5 -8
- package/execution/FilePathLink.js.map +1 -1
- package/execution/FileReviewCard.d.ts.map +1 -1
- package/execution/FileReviewCard.js +1 -6
- package/execution/FileReviewCard.js.map +1 -1
- package/execution/FollowUpInput.d.ts.map +1 -1
- package/execution/FollowUpInput.js +1 -3
- package/execution/FollowUpInput.js.map +1 -1
- package/execution/LivenessStatusLine.d.ts +40 -0
- package/execution/LivenessStatusLine.d.ts.map +1 -0
- package/execution/LivenessStatusLine.js +34 -0
- package/execution/LivenessStatusLine.js.map +1 -0
- package/execution/MessageEntry.d.ts.map +1 -1
- package/execution/MessageEntry.js +31 -3
- package/execution/MessageEntry.js.map +1 -1
- package/execution/MessageThread.d.ts +25 -0
- package/execution/MessageThread.d.ts.map +1 -1
- package/execution/MessageThread.js +51 -36
- package/execution/MessageThread.js.map +1 -1
- package/execution/SetupProgress.d.ts.map +1 -1
- package/execution/SetupProgress.js +1 -1
- package/execution/SetupProgress.js.map +1 -1
- package/execution/SubAgentSection.d.ts.map +1 -1
- package/execution/SubAgentSection.js +9 -7
- package/execution/SubAgentSection.js.map +1 -1
- package/execution/TerminalSession.d.ts +30 -0
- package/execution/TerminalSession.d.ts.map +1 -1
- package/execution/TerminalSession.js +37 -1
- package/execution/TerminalSession.js.map +1 -1
- package/execution/ToolCallDetail.d.ts +9 -0
- package/execution/ToolCallDetail.d.ts.map +1 -1
- package/execution/ToolCallDetail.js +16 -0
- package/execution/ToolCallDetail.js.map +1 -1
- package/execution/ToolCallItem.d.ts +20 -6
- package/execution/ToolCallItem.d.ts.map +1 -1
- package/execution/ToolCallItem.js +102 -29
- package/execution/ToolCallItem.js.map +1 -1
- package/execution/ToolRunGroup.d.ts.map +1 -1
- package/execution/ToolRunGroup.js +11 -11
- package/execution/ToolRunGroup.js.map +1 -1
- package/execution/WriteBackCard.d.ts.map +1 -1
- package/execution/WriteBackCard.js +5 -20
- package/execution/WriteBackCard.js.map +1 -1
- package/execution/index.d.ts +6 -2
- package/execution/index.d.ts.map +1 -1
- package/execution/index.js +3 -1
- package/execution/index.js.map +1 -1
- package/execution/tool-categories.d.ts +42 -7
- package/execution/tool-categories.d.ts.map +1 -1
- package/execution/tool-categories.js +38 -4
- package/execution/tool-categories.js.map +1 -1
- package/execution/tool-presenter.d.ts +17 -1
- package/execution/tool-presenter.d.ts.map +1 -1
- package/execution/tool-presenter.js +4 -1
- package/execution/tool-presenter.js.map +1 -1
- package/execution/useArtifactInspection.d.ts.map +1 -1
- package/execution/useArtifactInspection.js +4 -7
- package/execution/useArtifactInspection.js.map +1 -1
- package/iam-policy/GrantAccessForm.d.ts.map +1 -1
- package/iam-policy/GrantAccessForm.js +2 -4
- package/iam-policy/GrantAccessForm.js.map +1 -1
- package/iam-policy/OrgMembersPanel.d.ts.map +1 -1
- package/iam-policy/OrgMembersPanel.js +3 -5
- package/iam-policy/OrgMembersPanel.js.map +1 -1
- package/iam-policy/RoleSelector.d.ts.map +1 -1
- package/iam-policy/RoleSelector.js +7 -1
- package/iam-policy/RoleSelector.js.map +1 -1
- package/identity-provider/CreateIdentityProviderForm.d.ts.map +1 -1
- package/identity-provider/CreateIdentityProviderForm.js +6 -9
- package/identity-provider/CreateIdentityProviderForm.js.map +1 -1
- package/identity-provider/IdentityProviderDetailPanel.d.ts.map +1 -1
- package/identity-provider/IdentityProviderDetailPanel.js +17 -26
- package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
- package/identity-provider/IdentityProviderListPanel.d.ts.map +1 -1
- package/identity-provider/IdentityProviderListPanel.js +2 -4
- package/identity-provider/IdentityProviderListPanel.js.map +1 -1
- package/identity-provider/IdentityProviderWizard.d.ts.map +1 -1
- package/identity-provider/IdentityProviderWizard.js +8 -7
- package/identity-provider/IdentityProviderWizard.js.map +1 -1
- package/identity-provider/SsoLoginPrompt.js +5 -6
- package/identity-provider/SsoLoginPrompt.js.map +1 -1
- package/index.d.ts +9 -8
- package/index.d.ts.map +1 -1
- package/index.js +4 -4
- package/index.js.map +1 -1
- package/internal/DecisionButton.d.ts.map +1 -1
- package/internal/DecisionButton.js +1 -6
- package/internal/DecisionButton.js.map +1 -1
- package/internal/SpinnerIcon.d.ts +22 -0
- package/internal/SpinnerIcon.d.ts.map +1 -0
- package/internal/SpinnerIcon.js +23 -0
- package/internal/SpinnerIcon.js.map +1 -0
- package/internal/select-element-text.d.ts +11 -0
- package/internal/select-element-text.d.ts.map +1 -0
- package/internal/select-element-text.js +19 -0
- package/internal/select-element-text.js.map +1 -0
- package/internal/thread-card/ThreadCardShell.d.ts +27 -10
- package/internal/thread-card/ThreadCardShell.d.ts.map +1 -1
- package/internal/thread-card/ThreadCardShell.js +11 -5
- package/internal/thread-card/ThreadCardShell.js.map +1 -1
- package/internal/thread-card/glyphs.d.ts +11 -2
- package/internal/thread-card/glyphs.d.ts.map +1 -1
- package/internal/thread-card/glyphs.js +9 -3
- package/internal/thread-card/glyphs.js.map +1 -1
- package/internal/thread-card/index.d.ts +1 -1
- package/internal/thread-card/index.d.ts.map +1 -1
- package/internal/thread-card/index.js.map +1 -1
- package/internal/useCopyFeedback.d.ts +28 -0
- package/internal/useCopyFeedback.d.ts.map +1 -0
- package/internal/useCopyFeedback.js +40 -0
- package/internal/useCopyFeedback.js.map +1 -0
- package/invitation/InvitationCreatedAlert.d.ts.map +1 -1
- package/invitation/InvitationCreatedAlert.js +12 -19
- package/invitation/InvitationCreatedAlert.js.map +1 -1
- package/invitation/InvitationManager.d.ts.map +1 -1
- package/invitation/InvitationManager.js +14 -21
- package/invitation/InvitationManager.js.map +1 -1
- package/invitation/InvitationRedemption.d.ts.map +1 -1
- package/invitation/InvitationRedemption.js +2 -4
- package/invitation/InvitationRedemption.js.map +1 -1
- package/library/useExportResource.d.ts.map +1 -1
- package/library/useExportResource.js +16 -27
- package/library/useExportResource.js.map +1 -1
- package/manifest/ApplyManifestDialog.js +1 -1
- package/manifest/EditResourceYamlDialog.js +1 -1
- package/mcp-server/DefinitionDriftNotice.d.ts +42 -0
- package/mcp-server/DefinitionDriftNotice.d.ts.map +1 -0
- package/mcp-server/DefinitionDriftNotice.js +52 -0
- package/mcp-server/DefinitionDriftNotice.js.map +1 -0
- package/mcp-server/McpServerConnectDialog.js +1 -1
- package/mcp-server/McpServerDetailView.d.ts.map +1 -1
- package/mcp-server/McpServerDetailView.js +47 -14
- package/mcp-server/McpServerDetailView.js.map +1 -1
- package/mcp-server/OAuthAppForm.d.ts.map +1 -1
- package/mcp-server/OAuthAppForm.js +2 -4
- package/mcp-server/OAuthAppForm.js.map +1 -1
- package/mcp-server/internal/definitionDrift.d.ts +39 -0
- package/mcp-server/internal/definitionDrift.d.ts.map +1 -0
- package/mcp-server/internal/definitionDrift.js +122 -0
- package/mcp-server/internal/definitionDrift.js.map +1 -0
- package/mcp-server/internal/mcpServerToInput.d.ts.map +1 -1
- package/mcp-server/internal/mcpServerToInput.js +3 -0
- package/mcp-server/internal/mcpServerToInput.js.map +1 -1
- package/mcp-server/steps/EnvironmentAuthStep.d.ts.map +1 -1
- package/mcp-server/steps/EnvironmentAuthStep.js +8 -4
- package/mcp-server/steps/EnvironmentAuthStep.js.map +1 -1
- package/mcp-server/steps/IdentityTransportStep.d.ts.map +1 -1
- package/mcp-server/steps/IdentityTransportStep.js +5 -4
- package/mcp-server/steps/IdentityTransportStep.js.map +1 -1
- package/mcp-server/useMcpServerConnect.d.ts +1 -1
- package/mcp-server/useMcpServerDefinitionDrift.d.ts +44 -0
- package/mcp-server/useMcpServerDefinitionDrift.d.ts.map +1 -0
- package/mcp-server/useMcpServerDefinitionDrift.js +61 -0
- package/mcp-server/useMcpServerDefinitionDrift.js.map +1 -0
- package/models/ModelRegistryContext.d.ts +7 -1
- package/models/ModelRegistryContext.d.ts.map +1 -1
- package/models/ModelRegistryContext.js.map +1 -1
- package/models/ModelSelector.js +9 -1
- package/models/ModelSelector.js.map +1 -1
- package/models/index.d.ts +2 -2
- package/models/index.d.ts.map +1 -1
- package/models/index.js +1 -1
- package/models/index.js.map +1 -1
- package/models/registry.d.ts +88 -6
- package/models/registry.d.ts.map +1 -1
- package/models/registry.js +133 -27
- package/models/registry.js.map +1 -1
- package/models/useModelRegistry.d.ts +7 -1
- package/models/useModelRegistry.d.ts.map +1 -1
- package/models/useModelRegistry.js +3 -2
- package/models/useModelRegistry.js.map +1 -1
- package/oauth-app/CreateOAuthAppForm.d.ts.map +1 -1
- package/oauth-app/CreateOAuthAppForm.js +4 -5
- package/oauth-app/CreateOAuthAppForm.js.map +1 -1
- package/oauth-app/OAuthAppDetailPanel.d.ts.map +1 -1
- package/oauth-app/OAuthAppDetailPanel.js +5 -6
- package/oauth-app/OAuthAppDetailPanel.js.map +1 -1
- package/organization/CreateOrganizationForm.d.ts.map +1 -1
- package/organization/CreateOrganizationForm.js +5 -9
- package/organization/CreateOrganizationForm.js.map +1 -1
- package/organization/OrgProfilePanel.d.ts.map +1 -1
- package/organization/OrgProfilePanel.js +7 -16
- package/organization/OrgProfilePanel.js.map +1 -1
- package/package.json +4 -4
- package/platform-client/CreatePlatformClientForm.d.ts.map +1 -1
- package/platform-client/CreatePlatformClientForm.js +5 -6
- package/platform-client/CreatePlatformClientForm.js.map +1 -1
- package/platform-client/PlatformClientDetailPanel.d.ts.map +1 -1
- package/platform-client/PlatformClientDetailPanel.js +6 -7
- package/platform-client/PlatformClientDetailPanel.js.map +1 -1
- package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
- package/platform-client/PlatformClientListPanel.js +2 -4
- package/platform-client/PlatformClientListPanel.js.map +1 -1
- package/platform-client/PlatformClientSecretAlert.d.ts.map +1 -1
- package/platform-client/PlatformClientSecretAlert.js +18 -25
- package/platform-client/PlatformClientSecretAlert.js.map +1 -1
- package/provider.d.ts +34 -1
- package/provider.d.ts.map +1 -1
- package/provider.js +14 -7
- package/provider.js.map +1 -1
- package/resource-creation/WizardNav.d.ts.map +1 -1
- package/resource-creation/WizardNav.js +2 -4
- package/resource-creation/WizardNav.js.map +1 -1
- package/resource-detail/ConfirmDialog.js +1 -1
- package/resource-detail/useCopyResource.d.ts +4 -3
- package/resource-detail/useCopyResource.d.ts.map +1 -1
- package/resource-detail/useCopyResource.js +10 -19
- package/resource-detail/useCopyResource.js.map +1 -1
- package/schedule/ScheduleDetailView.d.ts.map +1 -1
- package/schedule/ScheduleDetailView.js +2 -4
- package/schedule/ScheduleDetailView.js.map +1 -1
- package/schedule/ScheduleForm.d.ts.map +1 -1
- package/schedule/ScheduleForm.js +6 -7
- package/schedule/ScheduleForm.js.map +1 -1
- package/session/NewSessionViewer.d.ts +52 -2
- package/session/NewSessionViewer.d.ts.map +1 -1
- package/session/NewSessionViewer.js +21 -6
- package/session/NewSessionViewer.js.map +1 -1
- package/session/SessionViewer.d.ts +63 -2
- package/session/SessionViewer.d.ts.map +1 -1
- package/session/SessionViewer.js +43 -17
- package/session/SessionViewer.js.map +1 -1
- package/session/audience.d.ts +17 -0
- package/session/audience.d.ts.map +1 -1
- package/session/index.d.ts +2 -1
- package/session/index.d.ts.map +1 -1
- package/session/index.js.map +1 -1
- package/session/run-config.d.ts +50 -0
- package/session/run-config.d.ts.map +1 -0
- package/session/run-config.js +15 -0
- package/session/run-config.js.map +1 -0
- package/session/useNewSessionFlow.d.ts +11 -0
- package/session/useNewSessionFlow.d.ts.map +1 -1
- package/session/useNewSessionFlow.js +29 -2
- package/session/useNewSessionFlow.js.map +1 -1
- package/session/useSessionConversation.d.ts +7 -7
- package/session/useSessionConversation.d.ts.map +1 -1
- package/session/useSessionConversation.js +2 -0
- package/session/useSessionConversation.js.map +1 -1
- package/session/useSessionPageFlow.d.ts +18 -4
- package/session/useSessionPageFlow.d.ts.map +1 -1
- package/session/useSessionPageFlow.js +33 -6
- package/session/useSessionPageFlow.js.map +1 -1
- package/session/useSessionPanel.d.ts +37 -2
- package/session/useSessionPanel.d.ts.map +1 -1
- package/session/useSessionPanel.js +44 -10
- package/session/useSessionPanel.js.map +1 -1
- package/settings/ApiKeysSection.d.ts.map +1 -1
- package/settings/ApiKeysSection.js +3 -2
- package/settings/ApiKeysSection.js.map +1 -1
- package/settings/ChannelAppsSection.d.ts.map +1 -1
- package/settings/ChannelAppsSection.js +3 -2
- package/settings/ChannelAppsSection.js.map +1 -1
- package/settings/EnvironmentsSection.js +5 -3
- package/settings/EnvironmentsSection.js.map +1 -1
- package/settings/IdentityProvidersSection.d.ts.map +1 -1
- package/settings/IdentityProvidersSection.js +3 -2
- package/settings/IdentityProvidersSection.js.map +1 -1
- package/settings/InvitationsSection.d.ts.map +1 -1
- package/settings/InvitationsSection.js +3 -1
- package/settings/InvitationsSection.js.map +1 -1
- package/settings/MembersSection.d.ts.map +1 -1
- package/settings/MembersSection.js +3 -1
- package/settings/MembersSection.js.map +1 -1
- package/settings/OAuthAppsSection.d.ts.map +1 -1
- package/settings/OAuthAppsSection.js +3 -2
- package/settings/OAuthAppsSection.js.map +1 -1
- package/settings/OrgProfileSection.d.ts.map +1 -1
- package/settings/OrgProfileSection.js +3 -2
- package/settings/OrgProfileSection.js.map +1 -1
- package/settings/PlatformClientsSection.d.ts.map +1 -1
- package/settings/PlatformClientsSection.js +3 -2
- package/settings/PlatformClientsSection.js.map +1 -1
- package/settings/UsageSection.d.ts.map +1 -1
- package/settings/UsageSection.js +3 -1
- package/settings/UsageSection.js.map +1 -1
- package/sharing/ShareAgentDialog.d.ts.map +1 -1
- package/sharing/ShareAgentDialog.js +18 -7
- package/sharing/ShareAgentDialog.js.map +1 -1
- package/sidebar/chrome.d.ts +3 -4
- package/sidebar/chrome.d.ts.map +1 -1
- package/sidebar/chrome.js +5 -4
- package/sidebar/chrome.js.map +1 -1
- package/skill/SkillDiffDialog.js +1 -1
- package/src/access/ManageAccessDialog.tsx +10 -4
- package/src/activity/format-relative-time.ts +11 -9
- package/src/agent/steps/CapabilitiesStep.tsx +6 -3
- package/src/agent/steps/IdentityStep.tsx +19 -12
- package/src/agent-instance/CreateAgentInstanceDialog.tsx +17 -8
- package/src/api-key/ApiKeyCreatedAlert.tsx +10 -19
- package/src/api-key/ApiKeyListPanel.tsx +3 -39
- package/src/api-key/CreateApiKeyForm.tsx +12 -26
- package/src/approval-defaults-context.ts +56 -0
- package/src/attachment/__tests__/vision-preflight.test.ts +311 -0
- package/src/attachment/index.ts +12 -0
- package/src/attachment/vision-preflight.ts +236 -0
- package/src/billing/AutoRechargeCard.tsx +5 -4
- package/src/billing/BillingSection.tsx +4 -3
- package/src/channel/ChannelConversationsDialog.tsx +8 -4
- package/src/channel/ChannelCredentialsDialog.tsx +14 -4
- package/src/channel/ChannelTemplatesDialog.tsx +8 -4
- package/src/channel/ConnectSlackDialog.tsx +14 -4
- package/src/channel/ConnectWhatsAppDialog.tsx +14 -4
- package/src/channel/useChannelSessions.ts +3 -0
- package/src/channel-app/ChannelAppDetailPanel.tsx +15 -12
- package/src/channel-app/CreateChannelAppForm.tsx +17 -12
- package/src/channel-app/internal.tsx +5 -25
- package/src/composer/ComposerToolbar.tsx +1 -1
- package/src/composer/SessionComposer.tsx +160 -13
- package/src/composer/__tests__/SessionComposer-modelCoherence.test.tsx +220 -0
- package/src/composer/__tests__/SessionComposer-visionPreflight.test.tsx +222 -0
- package/src/composer/icons.tsx +0 -18
- package/src/conversation/ConversationComposer.tsx +1 -1
- package/src/conversation/ConversationListPane.tsx +4 -3
- package/src/cursor-accounts/MemberCoverageTable.tsx +3 -14
- package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +2 -10
- package/src/dashboard/DashboardFailedRuns.tsx +2 -12
- package/src/environment/CreateEnvironmentForm.tsx +8 -27
- package/src/environment/EnvVarForm.tsx +2 -18
- package/src/environment/EnvironmentVariableEditor.tsx +5 -21
- package/src/execution/ArtifactApplyButton.tsx +2 -17
- package/src/execution/ExecutionErrorNotice.tsx +99 -0
- package/src/execution/FilePathLink.tsx +5 -9
- package/src/execution/FileReviewCard.tsx +1 -20
- package/src/execution/FollowUpInput.tsx +1 -16
- package/src/execution/LivenessStatusLine.tsx +59 -0
- package/src/execution/MessageEntry.tsx +136 -25
- package/src/execution/MessageThread.tsx +84 -83
- package/src/execution/SetupProgress.tsx +5 -1
- package/src/execution/SubAgentSection.tsx +9 -20
- package/src/execution/TerminalSession.tsx +97 -10
- package/src/execution/ToolCallDetail.tsx +19 -0
- package/src/execution/ToolCallItem.tsx +157 -37
- package/src/execution/ToolRunGroup.tsx +30 -32
- package/src/execution/WriteBackCard.tsx +5 -24
- package/src/execution/__tests__/MessageEntry-copy.test.tsx +125 -0
- package/src/execution/__tests__/MessageThread.test.tsx +97 -0
- package/src/execution/__tests__/TerminalSession.test.tsx +71 -1
- package/src/execution/__tests__/ToolCallDetail.test.tsx +33 -1
- package/src/execution/__tests__/ToolCallItem.test.tsx +299 -11
- package/src/execution/__tests__/ToolRunGroup.test.tsx +41 -9
- package/src/execution/__tests__/message-thread-slots.test.tsx +92 -0
- package/src/execution/__tests__/tool-presenter.test.tsx +41 -4
- package/src/execution/index.ts +8 -2
- package/src/execution/tool-categories.ts +72 -8
- package/src/execution/tool-presenter.ts +22 -1
- package/src/execution/useArtifactInspection.ts +4 -8
- package/src/iam-policy/GrantAccessForm.tsx +2 -18
- package/src/iam-policy/OrgMembersPanel.tsx +3 -19
- package/src/iam-policy/RoleSelector.tsx +8 -1
- package/src/identity-provider/CreateIdentityProviderForm.tsx +13 -31
- package/src/identity-provider/IdentityProviderDetailPanel.tsx +24 -49
- package/src/identity-provider/IdentityProviderListPanel.tsx +2 -18
- package/src/identity-provider/IdentityProviderWizard.tsx +15 -32
- package/src/identity-provider/SsoLoginPrompt.tsx +6 -21
- package/src/index.ts +23 -1
- package/src/internal/DecisionButton.tsx +1 -20
- package/src/internal/SpinnerIcon.tsx +42 -0
- package/src/internal/__tests__/ThreadCardShell.test.tsx +43 -7
- package/src/internal/__tests__/useCopyFeedback.test.ts +92 -0
- package/src/internal/select-element-text.ts +17 -0
- package/src/internal/thread-card/ThreadCardShell.tsx +53 -21
- package/src/internal/thread-card/glyphs.tsx +24 -3
- package/src/internal/thread-card/index.ts +1 -0
- package/src/internal/useCopyFeedback.ts +61 -0
- package/src/invitation/InvitationCreatedAlert.tsx +10 -18
- package/src/invitation/InvitationManager.tsx +23 -34
- package/src/invitation/InvitationRedemption.tsx +2 -18
- package/src/library/useExportResource.ts +15 -29
- package/src/manifest/ApplyManifestDialog.tsx +1 -1
- package/src/manifest/EditResourceYamlDialog.tsx +1 -1
- package/src/mcp-server/DefinitionDriftNotice.tsx +120 -0
- package/src/mcp-server/McpServerConnectDialog.tsx +1 -1
- package/src/mcp-server/McpServerDetailView.tsx +58 -26
- package/src/mcp-server/OAuthAppForm.tsx +2 -18
- package/src/mcp-server/__tests__/DefinitionDriftNotice.test.tsx +57 -0
- package/src/mcp-server/__tests__/definitionDrift.test.ts +245 -0
- package/src/mcp-server/__tests__/mcpServerToInput.test.ts +201 -0
- package/src/mcp-server/__tests__/useMcpServerDefinitionDrift.test.tsx +173 -0
- package/src/mcp-server/internal/definitionDrift.ts +158 -0
- package/src/mcp-server/internal/mcpServerToInput.ts +3 -0
- package/src/mcp-server/steps/EnvironmentAuthStep.tsx +19 -19
- package/src/mcp-server/steps/IdentityTransportStep.tsx +24 -23
- package/src/mcp-server/useMcpServerConnect.ts +1 -1
- package/src/mcp-server/useMcpServerDefinitionDrift.ts +95 -0
- package/src/models/ModelRegistryContext.ts +7 -1
- package/src/models/ModelSelector.tsx +37 -0
- package/src/models/__tests__/ModelSelector-visionIndicator.test.tsx +129 -0
- package/src/models/__tests__/resolveDefaultModel.test.ts +115 -0
- package/src/models/__tests__/useModelRegistry.test.tsx +99 -4
- package/src/models/index.ts +2 -2
- package/src/models/registry.ts +196 -29
- package/src/models/useModelRegistry.ts +10 -2
- package/src/oauth-app/CreateOAuthAppForm.tsx +16 -31
- package/src/oauth-app/OAuthAppDetailPanel.tsx +16 -31
- package/src/organization/CreateOrganizationForm.tsx +10 -29
- package/src/organization/OrgProfilePanel.tsx +13 -44
- package/src/platform-client/CreatePlatformClientForm.tsx +9 -29
- package/src/platform-client/PlatformClientDetailPanel.tsx +10 -30
- package/src/platform-client/PlatformClientListPanel.tsx +2 -18
- package/src/platform-client/PlatformClientSecretAlert.tsx +26 -55
- package/src/provider.tsx +76 -33
- package/src/resource-creation/WizardNav.tsx +2 -18
- package/src/resource-detail/ConfirmDialog.tsx +1 -1
- package/src/resource-detail/useCopyResource.ts +17 -23
- package/src/schedule/ScheduleDetailView.tsx +2 -18
- package/src/schedule/ScheduleForm.tsx +19 -34
- package/src/session/NewSessionViewer.tsx +85 -7
- package/src/session/SessionViewer.tsx +120 -17
- package/src/session/__tests__/audienceWiring.test.tsx +76 -0
- package/src/session/__tests__/panelNegotiation.test.tsx +302 -0
- package/src/session/__tests__/useNewSessionFlow.test.tsx +134 -5
- package/src/session/__tests__/useSessionPageFlow.autoApprove.test.tsx +74 -0
- package/src/session/__tests__/useSessionPageFlow.runConfig.test.tsx +157 -0
- package/src/session/__tests__/useSessionPanel.test.ts +114 -0
- package/src/session/audience.ts +18 -0
- package/src/session/index.ts +2 -1
- package/src/session/run-config.ts +59 -0
- package/src/session/useNewSessionFlow.ts +39 -2
- package/src/session/useSessionConversation.ts +10 -8
- package/src/session/useSessionPageFlow.ts +51 -10
- package/src/session/useSessionPanel.ts +91 -10
- package/src/settings/ApiKeysSection.tsx +4 -3
- package/src/settings/ChannelAppsSection.tsx +4 -3
- package/src/settings/EnvironmentsSection.tsx +8 -5
- package/src/settings/IdentityProvidersSection.tsx +4 -3
- package/src/settings/InvitationsSection.tsx +4 -2
- package/src/settings/MembersSection.tsx +4 -2
- package/src/settings/OAuthAppsSection.tsx +4 -3
- package/src/settings/OrgProfileSection.tsx +4 -3
- package/src/settings/PlatformClientsSection.tsx +4 -3
- package/src/settings/UsageSection.tsx +4 -2
- package/src/sharing/ShareAgentDialog.tsx +28 -10
- package/src/sidebar/__tests__/WorkspaceSidebar.test.tsx +4 -1
- package/src/sidebar/chrome.tsx +6 -6
- package/src/skill/SkillDiffDialog.tsx +1 -1
- package/src/styles.css +43 -0
- package/src/version-history/VersionTimelineEntry.tsx +1 -21
- package/src/workflow/FailedRunsWidget.tsx +2 -9
- package/src/workflow/PendingApprovalsWidget.tsx +2 -9
- package/src/workflow/ViewYamlDialog.tsx +7 -22
- package/src/workflow/WorkflowArchitectDialog.tsx +8 -27
- package/src/workflow/WorkflowArtifactDocument.tsx +5 -9
- package/src/workflow/WorkflowCanvasEditor.tsx +2 -0
- package/src/workflow/WorkflowCanvasInner.tsx +14 -1
- package/src/workflow/WorkflowDiffGraph.tsx +7 -1
- package/src/workflow/WorkflowExecutionViewer.tsx +88 -11
- package/src/workflow/WorkflowExplainDialog.tsx +8 -24
- package/src/workflow/WorkflowOverviewGraph.tsx +9 -1
- package/src/workflow/WorkflowRefinePanel.tsx +2 -18
- package/src/workflow/WorkflowRepairCard.tsx +2 -18
- package/src/workflow/WorkflowRunDialog.tsx +3 -23
- package/src/workflow/WorkflowTaskApprovalSummary.tsx +2 -17
- package/src/workflow/WorkflowVersionBadge.tsx +4 -13
- package/src/workflow/WorkflowVersionTimeline.tsx +1 -25
- package/src/workflow/__tests__/panelNegotiation.test.tsx +230 -0
- package/src/workflow/__tests__/useWorkflowCanvas.dirty.test.tsx +178 -0
- package/src/workflow/__tests__/useWorkflowCanvas.drag.test.tsx +224 -0
- package/src/workflow/__tests__/useWorkflowExecutionPanel.test.ts +100 -0
- package/src/workflow/execution-comparison/ExecutionComparisonPicker.tsx +7 -11
- package/src/workflow/execution-history/ExecutionHistoryTable.tsx +1 -25
- package/src/workflow/index.ts +1 -0
- package/src/workflow/instance/CreateWorkflowInstanceDialog.tsx +1 -1
- package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +2 -1
- package/src/workflow/picker/BranchAddPopover.tsx +4 -3
- package/src/workflow/templates/WorkflowTemplatePreview.tsx +1 -1
- package/src/workflow/useApprovalBoundary.ts +1 -1
- package/src/workflow/useWorkflowCanvas.ts +114 -11
- package/src/workflow/useWorkflowExecutionPanel.ts +95 -13
- package/styles.css +1 -1
- package/version-history/VersionTimelineEntry.d.ts.map +1 -1
- package/version-history/VersionTimelineEntry.js +1 -23
- package/version-history/VersionTimelineEntry.js.map +1 -1
- package/workflow/CanvasTransitionEdge.d.ts +1 -1
- package/workflow/FailedRunsWidget.d.ts.map +1 -1
- package/workflow/FailedRunsWidget.js +2 -11
- package/workflow/FailedRunsWidget.js.map +1 -1
- package/workflow/PendingApprovalsWidget.d.ts.map +1 -1
- package/workflow/PendingApprovalsWidget.js +2 -11
- package/workflow/PendingApprovalsWidget.js.map +1 -1
- package/workflow/ViewYamlDialog.d.ts.map +1 -1
- package/workflow/ViewYamlDialog.js +7 -23
- package/workflow/ViewYamlDialog.js.map +1 -1
- package/workflow/WorkflowArchitectDialog.d.ts.map +1 -1
- package/workflow/WorkflowArchitectDialog.js +7 -11
- package/workflow/WorkflowArchitectDialog.js.map +1 -1
- package/workflow/WorkflowArtifactDocument.d.ts.map +1 -1
- package/workflow/WorkflowArtifactDocument.js +5 -8
- package/workflow/WorkflowArtifactDocument.js.map +1 -1
- package/workflow/WorkflowCanvasEditor.d.ts.map +1 -1
- package/workflow/WorkflowCanvasEditor.js +1 -1
- package/workflow/WorkflowCanvasEditor.js.map +1 -1
- package/workflow/WorkflowCanvasInner.d.ts +4 -2
- package/workflow/WorkflowCanvasInner.d.ts.map +1 -1
- package/workflow/WorkflowCanvasInner.js +7 -3
- package/workflow/WorkflowCanvasInner.js.map +1 -1
- package/workflow/WorkflowDiffGraph.js +6 -2
- package/workflow/WorkflowDiffGraph.js.map +1 -1
- package/workflow/WorkflowExecutionViewer.d.ts +51 -0
- package/workflow/WorkflowExecutionViewer.d.ts.map +1 -1
- package/workflow/WorkflowExecutionViewer.js +23 -6
- package/workflow/WorkflowExecutionViewer.js.map +1 -1
- package/workflow/WorkflowExplainDialog.d.ts.map +1 -1
- package/workflow/WorkflowExplainDialog.js +6 -8
- package/workflow/WorkflowExplainDialog.js.map +1 -1
- package/workflow/WorkflowOverviewGraph.js +8 -2
- package/workflow/WorkflowOverviewGraph.js.map +1 -1
- package/workflow/WorkflowRefinePanel.d.ts.map +1 -1
- package/workflow/WorkflowRefinePanel.js +2 -4
- package/workflow/WorkflowRefinePanel.js.map +1 -1
- package/workflow/WorkflowRepairCard.d.ts.map +1 -1
- package/workflow/WorkflowRepairCard.js +2 -4
- package/workflow/WorkflowRepairCard.js.map +1 -1
- package/workflow/WorkflowRunDialog.d.ts.map +1 -1
- package/workflow/WorkflowRunDialog.js +2 -7
- package/workflow/WorkflowRunDialog.js.map +1 -1
- package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
- package/workflow/WorkflowTaskApprovalSummary.js +2 -4
- package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
- package/workflow/WorkflowVersionBadge.d.ts.map +1 -1
- package/workflow/WorkflowVersionBadge.js +4 -13
- package/workflow/WorkflowVersionBadge.js.map +1 -1
- package/workflow/WorkflowVersionTimeline.d.ts.map +1 -1
- package/workflow/WorkflowVersionTimeline.js +1 -26
- package/workflow/WorkflowVersionTimeline.js.map +1 -1
- package/workflow/execution-comparison/ExecutionComparisonPicker.d.ts.map +1 -1
- package/workflow/execution-comparison/ExecutionComparisonPicker.js +7 -15
- package/workflow/execution-comparison/ExecutionComparisonPicker.js.map +1 -1
- package/workflow/execution-history/ExecutionHistoryTable.d.ts.map +1 -1
- package/workflow/execution-history/ExecutionHistoryTable.js +1 -24
- package/workflow/execution-history/ExecutionHistoryTable.js.map +1 -1
- package/workflow/index.d.ts +1 -1
- package/workflow/index.d.ts.map +1 -1
- package/workflow/index.js.map +1 -1
- package/workflow/instance/CreateWorkflowInstanceDialog.js +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.d.ts.map +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.js +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.js.map +1 -1
- package/workflow/picker/BranchAddPopover.d.ts.map +1 -1
- package/workflow/picker/BranchAddPopover.js +3 -2
- package/workflow/picker/BranchAddPopover.js.map +1 -1
- package/workflow/templates/WorkflowTemplatePreview.js +1 -1
- package/workflow/useApprovalBoundary.d.ts +1 -1
- package/workflow/useApprovalBoundary.js +1 -1
- package/workflow/useWorkflowCanvas.d.ts +5 -1
- package/workflow/useWorkflowCanvas.d.ts.map +1 -1
- package/workflow/useWorkflowCanvas.js +99 -13
- package/workflow/useWorkflowCanvas.js.map +1 -1
- package/workflow/useWorkflowExecutionPanel.d.ts +38 -2
- package/workflow/useWorkflowExecutionPanel.d.ts.map +1 -1
- package/workflow/useWorkflowExecutionPanel.js +46 -13
- package/workflow/useWorkflowExecutionPanel.js.map +1 -1
|
@@ -61,7 +61,8 @@ import {
|
|
|
61
61
|
import type { SetupTabProps } from "./facets/SetupTab.js";
|
|
62
62
|
import { ExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
63
63
|
import type { RuntimeEnvProvider } from "./runtime-env.js";
|
|
64
|
-
import type { SessionAudience } from "./audience.js";
|
|
64
|
+
import type { SessionAudience, SessionPanelMode } from "./audience.js";
|
|
65
|
+
import type { SessionRunConfig } from "./run-config.js";
|
|
65
66
|
|
|
66
67
|
/**
|
|
67
68
|
* Where the approved plan mounts in the implement execution's workspace —
|
|
@@ -226,6 +227,66 @@ export interface SessionViewerProps {
|
|
|
226
227
|
* @default "integrator"
|
|
227
228
|
*/
|
|
228
229
|
readonly audience?: SessionAudience;
|
|
230
|
+
/**
|
|
231
|
+
* Owner-pinned model/tier for every execution sent from this viewer
|
|
232
|
+
* (stigmer/stigmer#664) — for product-embedded conversations where
|
|
233
|
+
* the platform, not the end user, decides what serves the session
|
|
234
|
+
* (pair with `audience="endUser"`). A pinned model wins over the
|
|
235
|
+
* composer, the persisted Console preference, and the last
|
|
236
|
+
* execution's model — follow-ups and retries included — and hides
|
|
237
|
+
* the model picker (a control that has no effect must not render).
|
|
238
|
+
* Ignored for the `"guest"` audience, whose execution config the
|
|
239
|
+
* server-side share policy owns. See {@link SessionRunConfig}.
|
|
240
|
+
*/
|
|
241
|
+
readonly runConfig?: SessionRunConfig;
|
|
242
|
+
/**
|
|
243
|
+
* Whether the follow-up composer offers the model picker. `false`
|
|
244
|
+
* hides the picker while keeping the SDK's model sourcing (persisted
|
|
245
|
+
* preference, then the last execution's model) — for hosts whose
|
|
246
|
+
* surrounding surface owns model choice without pinning it. Forced
|
|
247
|
+
* off by a {@link SessionViewerProps.runConfig} model pin and for the
|
|
248
|
+
* `"guest"` audience.
|
|
249
|
+
*
|
|
250
|
+
* @default true
|
|
251
|
+
*/
|
|
252
|
+
readonly showModelSelector?: boolean;
|
|
253
|
+
/**
|
|
254
|
+
* Whether the viewer offers the session panel at all. `"none"` removes the
|
|
255
|
+
* panel AND its toggle chip, suppresses plan-mode auto-open, and lets
|
|
256
|
+
* transcript file paths keep their default copy behavior — for hosts whose
|
|
257
|
+
* surrounding surface already renders the workspace — while keeping every
|
|
258
|
+
* composer capability the audience allows. This is the panel half of what
|
|
259
|
+
* `audience="guest"` does, WITHOUT guest's composer strip-down; guest
|
|
260
|
+
* still forces it regardless of this prop. A union (not a boolean) so a
|
|
261
|
+
* future mode (e.g. a host-rendered panel) extends rather than breaks it.
|
|
262
|
+
*
|
|
263
|
+
* @default "auto"
|
|
264
|
+
*/
|
|
265
|
+
readonly panel?: SessionPanelMode;
|
|
266
|
+
/**
|
|
267
|
+
* Initial open state of the session panel in uncontrolled mode — a docking
|
|
268
|
+
* host that wants the workspace visible from the first paint passes `true`.
|
|
269
|
+
* Ignored when {@link SessionViewerProps.panelOpen} is provided.
|
|
270
|
+
*
|
|
271
|
+
* @default false
|
|
272
|
+
*/
|
|
273
|
+
readonly defaultPanelOpen?: boolean;
|
|
274
|
+
/**
|
|
275
|
+
* Controlled open state of the session panel. When provided, the host owns
|
|
276
|
+
* the panel: the chip toggle, file/plan/artifact opens, and plan-mode
|
|
277
|
+
* auto-open surface through {@link SessionViewerProps.onPanelOpenChange}
|
|
278
|
+
* instead of flipping state, and the panel follows this value. Leave
|
|
279
|
+
* `undefined` for the self-managing default.
|
|
280
|
+
*/
|
|
281
|
+
readonly panelOpen?: boolean;
|
|
282
|
+
/**
|
|
283
|
+
* Called on every panel open/close transition, in BOTH modes — pass it
|
|
284
|
+
* alone (uncontrolled) to simply observe the panel, e.g. widening a docked
|
|
285
|
+
* pane when a streaming plan auto-opens it and reclaiming the room on
|
|
286
|
+
* close. See {@link UseSessionPanelOptions.onOpenChange} for the exact
|
|
287
|
+
* request-vs-transition semantics in each mode.
|
|
288
|
+
*/
|
|
289
|
+
readonly onPanelOpenChange?: (open: boolean) => void;
|
|
229
290
|
/**
|
|
230
291
|
* Slot for host-injected header actions. Rendered in the top-right corner
|
|
231
292
|
* of the viewer, beside the panel chip. Keeps the SDK organism
|
|
@@ -306,15 +367,32 @@ export function SessionViewer({
|
|
|
306
367
|
workspaceContentSearcher,
|
|
307
368
|
getRuntimeEnv,
|
|
308
369
|
audience = "integrator",
|
|
370
|
+
runConfig,
|
|
371
|
+
showModelSelector = true,
|
|
372
|
+
panel: panelMode = "auto",
|
|
373
|
+
defaultPanelOpen,
|
|
374
|
+
panelOpen,
|
|
375
|
+
onPanelOpenChange,
|
|
309
376
|
headerActions,
|
|
310
377
|
accessSlot,
|
|
311
378
|
onApplied,
|
|
312
379
|
threadSlots,
|
|
313
380
|
className,
|
|
314
381
|
}: SessionViewerProps) {
|
|
315
|
-
const flow = useSessionPageFlow({
|
|
382
|
+
const flow = useSessionPageFlow({
|
|
383
|
+
sessionId,
|
|
384
|
+
org,
|
|
385
|
+
getRuntimeEnv,
|
|
386
|
+
audience,
|
|
387
|
+
runConfig,
|
|
388
|
+
});
|
|
316
389
|
const { conv } = flow;
|
|
317
390
|
const isGuest = audience === "guest";
|
|
391
|
+
// A pinned model makes the picker a dead control (the pin wins over any
|
|
392
|
+
// choice it could offer), so the pin forces it hidden; the guest strip
|
|
393
|
+
// and the host's explicit opt-out compose with it.
|
|
394
|
+
const modelSelectorVisible =
|
|
395
|
+
showModelSelector && !isGuest && runConfig?.modelName === undefined;
|
|
318
396
|
// Channel-originated sessions (Slack/WhatsApp conversations owned by the
|
|
319
397
|
// channel runtime) are read-only for every console caller — the server
|
|
320
398
|
// grants channel viewers can_view without can_create_execution_in — so the
|
|
@@ -326,6 +404,12 @@ export function SessionViewer({
|
|
|
326
404
|
// Curated audiences (endUser, guest, observer) lock the agent and hide the
|
|
327
405
|
// integrator configuration; guest and observer add their own restrictions.
|
|
328
406
|
const isCurated = audience !== "integrator" || isObserver;
|
|
407
|
+
// The one flag every panel affordance keys on: the host opted out
|
|
408
|
+
// (`panel="none"`) or the audience forbids it (guests have no business
|
|
409
|
+
// with session configuration). Everything the panel touches — the chip,
|
|
410
|
+
// the region, plan auto-open, transcript path clicks — gates on this, so
|
|
411
|
+
// the four affordances can never drift apart.
|
|
412
|
+
const panelEnabled = panelMode !== "none" && !isGuest;
|
|
329
413
|
|
|
330
414
|
const [modelId, setModelId] = flow.model;
|
|
331
415
|
const [interactionMode, setInteractionMode] = flow.interactionMode;
|
|
@@ -405,9 +489,16 @@ export function SessionViewer({
|
|
|
405
489
|
const panel = useSessionPanel({
|
|
406
490
|
phase: hasPhase ? phase : null,
|
|
407
491
|
hasChanges: hasWriteBacks,
|
|
408
|
-
// A streaming plan auto-opens the panel via its key — but
|
|
409
|
-
//
|
|
410
|
-
|
|
492
|
+
// A streaming plan auto-opens the panel via its key — but a viewer
|
|
493
|
+
// without a panel (guest, or panel="none") suppresses the trigger
|
|
494
|
+
// along with the chip.
|
|
495
|
+
planKey: panelEnabled ? panelPlanKey : null,
|
|
496
|
+
// With the panel disabled the controller is pinned controlled-closed
|
|
497
|
+
// and unobserved — airtight inertness, not just hidden UI: no intent
|
|
498
|
+
// can flip state or reach the host's callback.
|
|
499
|
+
open: panelEnabled ? panelOpen : false,
|
|
500
|
+
defaultOpen: defaultPanelOpen,
|
|
501
|
+
onOpenChange: panelEnabled ? onPanelOpenChange : undefined,
|
|
411
502
|
});
|
|
412
503
|
|
|
413
504
|
const handleBuildFromPlan = useCallback(() => {
|
|
@@ -520,10 +611,10 @@ export function SessionViewer({
|
|
|
520
611
|
// (which subscribes), never this streaming column.
|
|
521
612
|
const handleTranscriptFilePathClick = useCallback(
|
|
522
613
|
(path: string): boolean => {
|
|
523
|
-
//
|
|
524
|
-
// default copy behavior instead of opening a surface that
|
|
525
|
-
// render.
|
|
526
|
-
if (
|
|
614
|
+
// No panel (guest, or panel="none") means no file viewer, so paths
|
|
615
|
+
// keep their default copy behavior instead of opening a surface that
|
|
616
|
+
// cannot render.
|
|
617
|
+
if (!panelEnabled) return false;
|
|
527
618
|
const selection = resolveWorkspaceFileSelection(
|
|
528
619
|
path,
|
|
529
620
|
flow.workspace.entries,
|
|
@@ -533,7 +624,7 @@ export function SessionViewer({
|
|
|
533
624
|
panel.openFile(selection.entryId, selection.path);
|
|
534
625
|
return true;
|
|
535
626
|
},
|
|
536
|
-
[
|
|
627
|
+
[panelEnabled, flow.workspace.entries, flow.sandboxWorkspaceRoot, panel.openFile],
|
|
537
628
|
);
|
|
538
629
|
|
|
539
630
|
if (conv.isLoading) {
|
|
@@ -558,12 +649,12 @@ export function SessionViewer({
|
|
|
558
649
|
// Top-right controls: host actions + the panel chip. The chip is the
|
|
559
650
|
// panel's always-mounted toggle; while collapsed it carries only the
|
|
560
651
|
// pending-item count. Execution status is never surfaced as header
|
|
561
|
-
// chrome — the thread itself communicates run state.
|
|
562
|
-
//
|
|
563
|
-
//
|
|
652
|
+
// chrome — the thread itself communicates run state. A viewer without
|
|
653
|
+
// a panel (guests — session configuration is not a visitor's business
|
|
654
|
+
// — or a host's panel="none") has no toggle: it is simply absent.
|
|
564
655
|
headerActions={headerActions}
|
|
565
656
|
chip={
|
|
566
|
-
|
|
657
|
+
panelEnabled ? (
|
|
567
658
|
<SessionPanelChip
|
|
568
659
|
isOpen={panel.isOpen}
|
|
569
660
|
onToggle={panel.isOpen ? panel.closePanel : panel.openPanel}
|
|
@@ -594,11 +685,12 @@ export function SessionViewer({
|
|
|
594
685
|
isCurated={isCurated}
|
|
595
686
|
isGuest={isGuest}
|
|
596
687
|
isObserver={isObserver}
|
|
688
|
+
modelSelectorVisible={modelSelectorVisible}
|
|
597
689
|
threadSlots={threadSlots}
|
|
598
690
|
/>
|
|
599
691
|
}
|
|
600
692
|
panel={
|
|
601
|
-
panel.isOpen &&
|
|
693
|
+
panel.isOpen && panelEnabled ? (
|
|
602
694
|
<SessionPanelRegion
|
|
603
695
|
flow={flow}
|
|
604
696
|
org={org}
|
|
@@ -675,6 +767,13 @@ interface ConversationColumnProps {
|
|
|
675
767
|
* stream indicators stay (watching an in-flight turn is the point).
|
|
676
768
|
*/
|
|
677
769
|
readonly isObserver: boolean;
|
|
770
|
+
/**
|
|
771
|
+
* Whether the composer offers the model picker — the composed result
|
|
772
|
+
* of the host's `showModelSelector`, the guest strip, and a
|
|
773
|
+
* `runConfig` model pin (a pinned model makes the picker a dead
|
|
774
|
+
* control, so the pin forces it hidden).
|
|
775
|
+
*/
|
|
776
|
+
readonly modelSelectorVisible: boolean;
|
|
678
777
|
readonly threadSlots?: MessageThreadSlots;
|
|
679
778
|
}
|
|
680
779
|
|
|
@@ -699,6 +798,7 @@ const ConversationColumn = memo(function ConversationColumn({
|
|
|
699
798
|
isCurated,
|
|
700
799
|
isGuest,
|
|
701
800
|
isObserver,
|
|
801
|
+
modelSelectorVisible,
|
|
702
802
|
threadSlots,
|
|
703
803
|
}: ConversationColumnProps) {
|
|
704
804
|
const { conv } = flow;
|
|
@@ -891,7 +991,7 @@ const ConversationColumn = memo(function ConversationColumn({
|
|
|
891
991
|
interactionMode={interactionMode}
|
|
892
992
|
onInteractionModeChange={setInteractionMode}
|
|
893
993
|
showInteractionModePicker={!isGuest}
|
|
894
|
-
showModelSelector={
|
|
994
|
+
showModelSelector={modelSelectorVisible}
|
|
895
995
|
enableAttachments={!isGuest}
|
|
896
996
|
workspace={isGuest ? undefined : flow.workspace}
|
|
897
997
|
gitHubConnection={isGuest ? undefined : gitHubConnection}
|
|
@@ -1290,7 +1390,10 @@ function SessionStarting() {
|
|
|
1290
1390
|
* Low-weight, always-visible indicator shown while the session-scoped
|
|
1291
1391
|
* auto-approve preference is active. The "Turn off" control reverts the
|
|
1292
1392
|
* preference in one click — the safety affordance for "Approve & don't ask
|
|
1293
|
-
* again".
|
|
1393
|
+
* again". Visible from the first render when the host pre-armed the
|
|
1394
|
+
* preference via `StigmerProvider`'s `approvalDefaults` (#302); otherwise
|
|
1395
|
+
* nothing about approvals appears until the user opts in at a gate. Either
|
|
1396
|
+
* way the user keeps the last word.
|
|
1294
1397
|
*/
|
|
1295
1398
|
function AutoApproveIndicator({ onTurnOff }: { onTurnOff: () => void }) {
|
|
1296
1399
|
return (
|
|
@@ -441,3 +441,79 @@ describe("SessionViewer — audience wiring", () => {
|
|
|
441
441
|
expect(alert.textContent).toContain("token mint failed");
|
|
442
442
|
});
|
|
443
443
|
});
|
|
444
|
+
|
|
445
|
+
describe("owner-pinned runConfig wiring (#664)", () => {
|
|
446
|
+
const PIN = { modelName: "pinned-model", serviceTier: "fast" } as const;
|
|
447
|
+
|
|
448
|
+
it("SessionViewer forwards runConfig to the flow and hides the model picker (no dead controls)", () => {
|
|
449
|
+
render(
|
|
450
|
+
<SessionViewer sessionId="ses_1" org="acme" audience="endUser" runConfig={PIN} />,
|
|
451
|
+
);
|
|
452
|
+
|
|
453
|
+
expect(mockUseSessionPageFlow).toHaveBeenCalledWith(
|
|
454
|
+
expect.objectContaining({ runConfig: PIN }),
|
|
455
|
+
);
|
|
456
|
+
expect(lastComposerProps().showModelSelector).toBe(false);
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
it("SessionViewer keeps the picker for endUser without a pin (the #167 curation contract)", () => {
|
|
460
|
+
render(<SessionViewer sessionId="ses_1" org="acme" audience="endUser" />);
|
|
461
|
+
|
|
462
|
+
expect(lastComposerProps().showModelSelector).toBe(true);
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
it("SessionViewer honors showModelSelector={false} alone — hidden picker, no pin", () => {
|
|
466
|
+
render(
|
|
467
|
+
<SessionViewer sessionId="ses_1" org="acme" showModelSelector={false} />,
|
|
468
|
+
);
|
|
469
|
+
|
|
470
|
+
expect(mockUseSessionPageFlow).toHaveBeenCalledWith(
|
|
471
|
+
expect.objectContaining({ runConfig: undefined }),
|
|
472
|
+
);
|
|
473
|
+
expect(lastComposerProps().showModelSelector).toBe(false);
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
it("SessionViewer: a tier-only pin (no model) keeps the picker — nothing pins the model", () => {
|
|
477
|
+
// The flow hook itself rejects this shape at render (fail-fast, covered
|
|
478
|
+
// by its own suite); the wiring contract here is only that picker
|
|
479
|
+
// visibility keys on the MODEL pin, never on the tier.
|
|
480
|
+
render(
|
|
481
|
+
<SessionViewer
|
|
482
|
+
sessionId="ses_1"
|
|
483
|
+
org="acme"
|
|
484
|
+
runConfig={{ serviceTier: "standard" }}
|
|
485
|
+
/>,
|
|
486
|
+
);
|
|
487
|
+
|
|
488
|
+
expect(lastComposerProps().showModelSelector).toBe(true);
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
it("NewSessionViewer forwards runConfig to the flow and hides the model picker (DD-016 parity)", () => {
|
|
492
|
+
render(
|
|
493
|
+
<NewSessionViewer
|
|
494
|
+
org="acme"
|
|
495
|
+
onSessionCreated={vi.fn()}
|
|
496
|
+
audience="endUser"
|
|
497
|
+
initialAgentRef={AGENT_REF}
|
|
498
|
+
runConfig={PIN}
|
|
499
|
+
/>,
|
|
500
|
+
);
|
|
501
|
+
|
|
502
|
+
expect(mockUseNewSessionFlow).toHaveBeenCalledWith(
|
|
503
|
+
expect.objectContaining({ runConfig: PIN }),
|
|
504
|
+
);
|
|
505
|
+
expect(lastComposerProps().showModelSelector).toBe(false);
|
|
506
|
+
});
|
|
507
|
+
|
|
508
|
+
it("NewSessionViewer honors showModelSelector={false} alone (DD-016 parity)", () => {
|
|
509
|
+
render(
|
|
510
|
+
<NewSessionViewer
|
|
511
|
+
org="acme"
|
|
512
|
+
onSessionCreated={vi.fn()}
|
|
513
|
+
showModelSelector={false}
|
|
514
|
+
/>,
|
|
515
|
+
);
|
|
516
|
+
|
|
517
|
+
expect(lastComposerProps().showModelSelector).toBe(false);
|
|
518
|
+
});
|
|
519
|
+
});
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { render, screen, cleanup, fireEvent } from "@testing-library/react";
|
|
3
|
+
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Wiring-contract tests for the session panel's host-negotiation surface
|
|
6
|
+
// (issue #300): `panel="none"` omission, `defaultPanelOpen`, and the
|
|
7
|
+
// controlled/observed `panelOpen` + `onPanelOpenChange` pair on both session
|
|
8
|
+
// organisms.
|
|
9
|
+
//
|
|
10
|
+
// The contract under test is the one the PanelChip's aria labels already
|
|
11
|
+
// promise ("Show panel"/"Hide panel") — the same seam the issue's filer
|
|
12
|
+
// watched with a MutationObserver. These tests are what retires that
|
|
13
|
+
// workaround: every open/close beat must reach `onPanelOpenChange`.
|
|
14
|
+
//
|
|
15
|
+
// Same probe/stub setup as audienceWiring.test.tsx: the composer and thread
|
|
16
|
+
// are prop-capturing probes; the flow hooks are stubbed to a loaded state.
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
type CapturedProps = Record<string, unknown>;
|
|
20
|
+
|
|
21
|
+
const composerProps: CapturedProps[] = [];
|
|
22
|
+
vi.mock("../../composer", async (importOriginal) => {
|
|
23
|
+
const actual = await importOriginal<typeof import("../../composer")>();
|
|
24
|
+
return {
|
|
25
|
+
...actual,
|
|
26
|
+
SessionComposer: (props: CapturedProps) => {
|
|
27
|
+
composerProps.push(props);
|
|
28
|
+
return <div data-testid="composer-probe" />;
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
vi.mock("../facets/SetupTab", () => ({
|
|
34
|
+
SetupTab: () => <div data-testid="setup-probe" />,
|
|
35
|
+
}));
|
|
36
|
+
|
|
37
|
+
vi.mock("../../execution/MessageThread", () => ({
|
|
38
|
+
MessageThread: () => <div data-testid="thread-probe" />,
|
|
39
|
+
}));
|
|
40
|
+
|
|
41
|
+
const stubWorkspace = {
|
|
42
|
+
entries: [],
|
|
43
|
+
hasEntries: false,
|
|
44
|
+
toInput: vi.fn().mockReturnValue([]),
|
|
45
|
+
addGitRepo: vi.fn(),
|
|
46
|
+
addLocalPath: vi.fn(),
|
|
47
|
+
removeEntry: vi.fn(),
|
|
48
|
+
clear: vi.fn(),
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const stubSessionVariables = { entries: [], isEmpty: true, clear: vi.fn() };
|
|
52
|
+
|
|
53
|
+
const stubNewSessionFlow = {
|
|
54
|
+
harness: "native" as const,
|
|
55
|
+
setHarness: vi.fn(),
|
|
56
|
+
modelId: undefined,
|
|
57
|
+
setModelId: vi.fn(),
|
|
58
|
+
agentRef: { org: "acme", slug: "support-bot" },
|
|
59
|
+
setAgentRef: vi.fn(),
|
|
60
|
+
resolution: null,
|
|
61
|
+
setResolution: vi.fn(),
|
|
62
|
+
mcpServerUsages: [],
|
|
63
|
+
setMcpServerUsages: vi.fn(),
|
|
64
|
+
skillRefs: [],
|
|
65
|
+
setSkillRefs: vi.fn(),
|
|
66
|
+
workspace: stubWorkspace,
|
|
67
|
+
sessionVariables: stubSessionVariables,
|
|
68
|
+
isSubmitting: false,
|
|
69
|
+
submitError: null,
|
|
70
|
+
submit: vi.fn(),
|
|
71
|
+
};
|
|
72
|
+
vi.mock("../useNewSessionFlow", () => ({
|
|
73
|
+
useNewSessionFlow: () => stubNewSessionFlow,
|
|
74
|
+
}));
|
|
75
|
+
|
|
76
|
+
const stubConv = {
|
|
77
|
+
session: { spec: {} },
|
|
78
|
+
isLoading: false,
|
|
79
|
+
loadError: null,
|
|
80
|
+
completedExecutions: [],
|
|
81
|
+
activeStreamExecution: null,
|
|
82
|
+
activePhase: null,
|
|
83
|
+
isStreaming: false,
|
|
84
|
+
isConnecting: false,
|
|
85
|
+
sendFollowUp: vi.fn(),
|
|
86
|
+
canSendFollowUp: true,
|
|
87
|
+
isSending: false,
|
|
88
|
+
sendError: null,
|
|
89
|
+
clearSendError: vi.fn(),
|
|
90
|
+
retryLastSend: vi.fn(),
|
|
91
|
+
pendingUserMessage: null,
|
|
92
|
+
workspaceEntries: [],
|
|
93
|
+
mcpServerUsages: [],
|
|
94
|
+
skillRefs: [],
|
|
95
|
+
pendingApprovals: [],
|
|
96
|
+
submitApproval: vi.fn(),
|
|
97
|
+
submittingApprovalIds: new Set<string>(),
|
|
98
|
+
fileChangeSets: [],
|
|
99
|
+
submitFileDecision: vi.fn(),
|
|
100
|
+
submittingFileDecisionKeys: new Set<string>(),
|
|
101
|
+
fileDecisionErrors: new Map<string, Error>(),
|
|
102
|
+
streamError: null,
|
|
103
|
+
reconnectStream: vi.fn(),
|
|
104
|
+
approvalError: null,
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const stubSessionPageFlow = {
|
|
108
|
+
conv: stubConv,
|
|
109
|
+
harness: "native" as const,
|
|
110
|
+
executionTarget: undefined,
|
|
111
|
+
model: [undefined, vi.fn()] as const,
|
|
112
|
+
interactionMode: ["agent" as const, vi.fn()] as const,
|
|
113
|
+
agentRef: { org: "acme", slug: "support-bot" },
|
|
114
|
+
setAgentRef: vi.fn(),
|
|
115
|
+
resolution: null,
|
|
116
|
+
setResolution: vi.fn(),
|
|
117
|
+
isDefaultAgent: false,
|
|
118
|
+
mcpServerUsages: [],
|
|
119
|
+
setMcpServerUsages: vi.fn(),
|
|
120
|
+
skillRefs: [],
|
|
121
|
+
setSkillRefs: vi.fn(),
|
|
122
|
+
workspace: stubWorkspace,
|
|
123
|
+
sessionVariables: stubSessionVariables,
|
|
124
|
+
autoApproveAll: false,
|
|
125
|
+
setAutoApproveAll: vi.fn(),
|
|
126
|
+
submitApproval: vi.fn(),
|
|
127
|
+
handleSubmit: vi.fn(),
|
|
128
|
+
submitError: null as Error | null,
|
|
129
|
+
displayExecution: null,
|
|
130
|
+
allExecutions: [],
|
|
131
|
+
sandboxWorkspaceRoot: undefined,
|
|
132
|
+
};
|
|
133
|
+
vi.mock("../useSessionPageFlow", () => ({
|
|
134
|
+
useSessionPageFlow: () => stubSessionPageFlow,
|
|
135
|
+
}));
|
|
136
|
+
|
|
137
|
+
vi.mock("../../hooks", () => ({
|
|
138
|
+
useStigmer: () => ({
|
|
139
|
+
agentExecution: {
|
|
140
|
+
uploadAttachment: vi.fn(),
|
|
141
|
+
getArtifactContent: vi.fn(),
|
|
142
|
+
},
|
|
143
|
+
}),
|
|
144
|
+
}));
|
|
145
|
+
|
|
146
|
+
import { NewSessionViewer } from "../NewSessionViewer";
|
|
147
|
+
import { SessionViewer } from "../SessionViewer";
|
|
148
|
+
|
|
149
|
+
function lastComposerProps(): CapturedProps {
|
|
150
|
+
expect(composerProps.length).toBeGreaterThan(0);
|
|
151
|
+
return composerProps.at(-1)!;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function chipButton(): HTMLElement | null {
|
|
155
|
+
return (
|
|
156
|
+
screen.queryByRole("button", { name: "Show panel" }) ??
|
|
157
|
+
screen.queryByRole("button", { name: "Hide panel" })
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
beforeEach(() => {
|
|
162
|
+
composerProps.length = 0;
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
afterEach(() => {
|
|
166
|
+
cleanup();
|
|
167
|
+
vi.clearAllMocks();
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
describe("SessionViewer — panel=\"none\"", () => {
|
|
171
|
+
it("removes the chip and never renders the panel", () => {
|
|
172
|
+
render(<SessionViewer sessionId="ses_1" org="acme" panel="none" />);
|
|
173
|
+
expect(chipButton()).toBeNull();
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it("keeps every composer capability the audience allows — the guest contrast", () => {
|
|
177
|
+
// The point of panel="none": omission WITHOUT audience="guest"'s
|
|
178
|
+
// composer strip-down. Assert the exact capabilities guest removes.
|
|
179
|
+
render(<SessionViewer sessionId="ses_1" org="acme" panel="none" />);
|
|
180
|
+
|
|
181
|
+
const props = lastComposerProps();
|
|
182
|
+
expect(props.showInteractionModePicker).toBe(true);
|
|
183
|
+
expect(props.showModelSelector).toBe(true);
|
|
184
|
+
expect(props.enableAttachments).toBe(true);
|
|
185
|
+
expect(props.lockAgent).toBe(false);
|
|
186
|
+
expect(props.onMcpServerUsagesChange).toBeDefined();
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it("keeps controlled props inert — panelOpen cannot force a surface that does not exist", () => {
|
|
190
|
+
const onPanelOpenChange = vi.fn();
|
|
191
|
+
render(
|
|
192
|
+
<SessionViewer
|
|
193
|
+
sessionId="ses_1"
|
|
194
|
+
org="acme"
|
|
195
|
+
panel="none"
|
|
196
|
+
panelOpen={true}
|
|
197
|
+
onPanelOpenChange={onPanelOpenChange}
|
|
198
|
+
/>,
|
|
199
|
+
);
|
|
200
|
+
expect(chipButton()).toBeNull();
|
|
201
|
+
expect(onPanelOpenChange).not.toHaveBeenCalled();
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
describe("SessionViewer — observed panel state (uncontrolled + onPanelOpenChange)", () => {
|
|
206
|
+
it("reports chip toggles — the seam that retires the aria-expanded MutationObserver", () => {
|
|
207
|
+
const seen: boolean[] = [];
|
|
208
|
+
render(
|
|
209
|
+
<SessionViewer
|
|
210
|
+
sessionId="ses_1"
|
|
211
|
+
org="acme"
|
|
212
|
+
onPanelOpenChange={(open) => seen.push(open)}
|
|
213
|
+
/>,
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
fireEvent.click(screen.getByRole("button", { name: "Show panel" }));
|
|
217
|
+
expect(seen).toEqual([true]);
|
|
218
|
+
fireEvent.click(screen.getByRole("button", { name: "Hide panel" }));
|
|
219
|
+
expect(seen).toEqual([true, false]);
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
it("starts open with defaultPanelOpen, without a spurious notification", () => {
|
|
223
|
+
const onPanelOpenChange = vi.fn();
|
|
224
|
+
render(
|
|
225
|
+
<SessionViewer
|
|
226
|
+
sessionId="ses_1"
|
|
227
|
+
org="acme"
|
|
228
|
+
defaultPanelOpen
|
|
229
|
+
onPanelOpenChange={onPanelOpenChange}
|
|
230
|
+
/>,
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
expect(screen.getByRole("button", { name: "Hide panel" })).toBeDefined();
|
|
234
|
+
expect(onPanelOpenChange).not.toHaveBeenCalled();
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
describe("SessionViewer — controlled panel state", () => {
|
|
239
|
+
it("follows panelOpen and surfaces the chip's request without applying it", () => {
|
|
240
|
+
const seen: boolean[] = [];
|
|
241
|
+
const onPanelOpenChange = (open: boolean) => seen.push(open);
|
|
242
|
+
const { rerender } = render(
|
|
243
|
+
<SessionViewer
|
|
244
|
+
sessionId="ses_1"
|
|
245
|
+
org="acme"
|
|
246
|
+
panelOpen={false}
|
|
247
|
+
onPanelOpenChange={onPanelOpenChange}
|
|
248
|
+
/>,
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
// The chip requests; the host owns the state — nothing moves yet.
|
|
252
|
+
fireEvent.click(screen.getByRole("button", { name: "Show panel" }));
|
|
253
|
+
expect(seen).toEqual([true]);
|
|
254
|
+
expect(screen.getByRole("button", { name: "Show panel" })).toBeDefined();
|
|
255
|
+
|
|
256
|
+
// The host grants the request: the panel opens and the chip flips.
|
|
257
|
+
rerender(
|
|
258
|
+
<SessionViewer
|
|
259
|
+
sessionId="ses_1"
|
|
260
|
+
org="acme"
|
|
261
|
+
panelOpen={true}
|
|
262
|
+
onPanelOpenChange={onPanelOpenChange}
|
|
263
|
+
/>,
|
|
264
|
+
);
|
|
265
|
+
expect(screen.getByRole("button", { name: "Hide panel" })).toBeDefined();
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
describe("NewSessionViewer — panel negotiation (DD-016 parity)", () => {
|
|
270
|
+
it("panel=\"none\" removes the chip while the composer keeps its capabilities", () => {
|
|
271
|
+
render(
|
|
272
|
+
<NewSessionViewer org="acme" onSessionCreated={vi.fn()} panel="none" />,
|
|
273
|
+
);
|
|
274
|
+
|
|
275
|
+
expect(chipButton()).toBeNull();
|
|
276
|
+
const props = lastComposerProps();
|
|
277
|
+
expect(props.showInteractionModePicker).toBe(true);
|
|
278
|
+
expect(props.lockAgent).toBe(false);
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
it("reports chip toggles through onPanelOpenChange", () => {
|
|
282
|
+
const seen: boolean[] = [];
|
|
283
|
+
render(
|
|
284
|
+
<NewSessionViewer
|
|
285
|
+
org="acme"
|
|
286
|
+
onSessionCreated={vi.fn()}
|
|
287
|
+
onPanelOpenChange={(open) => seen.push(open)}
|
|
288
|
+
/>,
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
fireEvent.click(screen.getByRole("button", { name: "Show panel" }));
|
|
292
|
+
fireEvent.click(screen.getByRole("button", { name: "Hide panel" }));
|
|
293
|
+
expect(seen).toEqual([true, false]);
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
it("starts open with defaultPanelOpen", () => {
|
|
297
|
+
render(
|
|
298
|
+
<NewSessionViewer org="acme" onSessionCreated={vi.fn()} defaultPanelOpen />,
|
|
299
|
+
);
|
|
300
|
+
expect(screen.getByRole("button", { name: "Hide panel" })).toBeDefined();
|
|
301
|
+
});
|
|
302
|
+
});
|