@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
|
@@ -5,6 +5,8 @@ import { DEFAULT_MODEL_ID, DEFAULT_CURSOR_MODEL_ID, parseRegistryJson } from "..
|
|
|
5
5
|
import { ModelRegistryContext } from "../../models/ModelRegistryContext";
|
|
6
6
|
import type { ModelRegistryState } from "../../models/ModelRegistryContext";
|
|
7
7
|
import { ExecutionTargetContext } from "../../execution-target-context";
|
|
8
|
+
import { ApprovalDefaultsContext } from "../../approval-defaults-context";
|
|
9
|
+
import type { ApprovalDefaults } from "../../approval-defaults-context";
|
|
8
10
|
import { RunnerAdapterContext } from "../../runner-adapter";
|
|
9
11
|
import type { RunnerAdapter } from "../../runner-adapter";
|
|
10
12
|
const mockGetByReference = vi.fn();
|
|
@@ -71,16 +73,19 @@ const TEST_MODELS = parseRegistryJson({
|
|
|
71
73
|
function createWrapper(
|
|
72
74
|
executionTarget?: "local" | "cloud",
|
|
73
75
|
adapter: RunnerAdapter | null = null,
|
|
76
|
+
approvalDefaults?: ApprovalDefaults,
|
|
74
77
|
) {
|
|
75
78
|
const state: ModelRegistryState = { models: TEST_MODELS, isLoading: false, error: null, refetch: () => {} };
|
|
76
79
|
return function Wrapper({ children }: { children: ReactNode }) {
|
|
77
80
|
return (
|
|
78
81
|
<ExecutionTargetContext.Provider value={executionTarget}>
|
|
79
|
-
<
|
|
80
|
-
<
|
|
81
|
-
{
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
<ApprovalDefaultsContext.Provider value={approvalDefaults}>
|
|
83
|
+
<RunnerAdapterContext.Provider value={adapter}>
|
|
84
|
+
<ModelRegistryContext.Provider value={state}>
|
|
85
|
+
{children}
|
|
86
|
+
</ModelRegistryContext.Provider>
|
|
87
|
+
</RunnerAdapterContext.Provider>
|
|
88
|
+
</ApprovalDefaultsContext.Provider>
|
|
84
89
|
</ExecutionTargetContext.Provider>
|
|
85
90
|
);
|
|
86
91
|
};
|
|
@@ -291,6 +296,86 @@ describe("useNewSessionFlow", () => {
|
|
|
291
296
|
});
|
|
292
297
|
});
|
|
293
298
|
|
|
299
|
+
describe("submit — owner-pinned runConfig (#664)", () => {
|
|
300
|
+
it("stamps the pinned model and fast tier over the composer's selection and the restored preference", async () => {
|
|
301
|
+
localStorage.setItem(STORAGE_KEY_MODEL_NATIVE, DEFAULT_MODEL_ID);
|
|
302
|
+
const { result } = renderHook(
|
|
303
|
+
() =>
|
|
304
|
+
useNewSessionFlow({
|
|
305
|
+
...defaultOptions(),
|
|
306
|
+
runConfig: { modelName: "pinned-model", serviceTier: "fast" },
|
|
307
|
+
}),
|
|
308
|
+
{ wrapper: createWrapper() },
|
|
309
|
+
);
|
|
310
|
+
|
|
311
|
+
await act(async () => {
|
|
312
|
+
await result.current.submit("Hello", "user-picked-model");
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
const execInput = mockCreateExecution.mock.calls[0][0];
|
|
316
|
+
expect(execInput.modelName).toBe("pinned-model");
|
|
317
|
+
expect(execInput.serviceTier).toBe("fast");
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
it("a model-only pin suppresses a composer-armed fast tier (the pin owns the whole run config)", async () => {
|
|
321
|
+
const { result } = renderHook(
|
|
322
|
+
() =>
|
|
323
|
+
useNewSessionFlow({
|
|
324
|
+
...defaultOptions(),
|
|
325
|
+
runConfig: { modelName: "pinned-model" },
|
|
326
|
+
}),
|
|
327
|
+
{ wrapper: createWrapper() },
|
|
328
|
+
);
|
|
329
|
+
|
|
330
|
+
await act(async () => {
|
|
331
|
+
await result.current.submit("Hello", undefined, { serviceTier: "fast" });
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
const execInput = mockCreateExecution.mock.calls[0][0];
|
|
335
|
+
expect(execInput.modelName).toBe("pinned-model");
|
|
336
|
+
expect(execInput.serviceTier).toBeUndefined();
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
it("ignores the pin entirely for guests — the platform share policy owns guest config", async () => {
|
|
340
|
+
const { result } = renderHook(
|
|
341
|
+
() =>
|
|
342
|
+
useNewSessionFlow({
|
|
343
|
+
...defaultOptions(),
|
|
344
|
+
audience: "guest",
|
|
345
|
+
runConfig: { modelName: "pinned-model", serviceTier: "fast" },
|
|
346
|
+
}),
|
|
347
|
+
{ wrapper: createWrapper() },
|
|
348
|
+
);
|
|
349
|
+
|
|
350
|
+
// Guests submit against an explicitly pinned shared agent.
|
|
351
|
+
act(() => {
|
|
352
|
+
result.current.setAgentRef({ org: "acme", slug: "shared-agent" });
|
|
353
|
+
result.current.setResolution({ mode: "saved", instanceId: "inst-shared" });
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
await act(async () => {
|
|
357
|
+
await result.current.submit("Hello");
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
const execInput = mockCreateExecution.mock.calls[0][0];
|
|
361
|
+
expect(execInput.modelName).toBeUndefined();
|
|
362
|
+
expect(execInput.serviceTier).toBeUndefined();
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
it("throws at render for the statically-wrong pin (fast tier, no model)", () => {
|
|
366
|
+
expect(() =>
|
|
367
|
+
renderHook(
|
|
368
|
+
() =>
|
|
369
|
+
useNewSessionFlow({
|
|
370
|
+
...defaultOptions(),
|
|
371
|
+
runConfig: { serviceTier: "fast" },
|
|
372
|
+
}),
|
|
373
|
+
{ wrapper: createWrapper() },
|
|
374
|
+
),
|
|
375
|
+
).toThrowError(/serviceTier "fast" requires modelName/);
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
|
|
294
379
|
describe("submit — one-call bootstrap", () => {
|
|
295
380
|
it("creates the execution with an embedded sessionSpec in a single call", async () => {
|
|
296
381
|
const opts = defaultOptions();
|
|
@@ -320,6 +405,32 @@ describe("useNewSessionFlow", () => {
|
|
|
320
405
|
expect(execInput.sessionSpec.harness).toBe("native");
|
|
321
406
|
});
|
|
322
407
|
|
|
408
|
+
it("omits autoApproveAll by default (fail-closed gates unchanged)", async () => {
|
|
409
|
+
const opts = defaultOptions();
|
|
410
|
+
const { result } = renderHook(() => useNewSessionFlow(opts), { wrapper: createWrapper() });
|
|
411
|
+
|
|
412
|
+
await act(async () => {
|
|
413
|
+
await result.current.submit("Hello");
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
const execInput = mockCreateExecution.mock.calls[0][0];
|
|
417
|
+
expect(execInput.autoApproveAll).toBeUndefined();
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
it("forwards the host approval default into the bootstrap create (#302)", async () => {
|
|
421
|
+
const opts = defaultOptions();
|
|
422
|
+
const { result } = renderHook(() => useNewSessionFlow(opts), {
|
|
423
|
+
wrapper: createWrapper(undefined, null, { autoApproveAll: true }),
|
|
424
|
+
});
|
|
425
|
+
|
|
426
|
+
await act(async () => {
|
|
427
|
+
await result.current.submit("Hello");
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
const execInput = mockCreateExecution.mock.calls[0][0];
|
|
431
|
+
expect(execInput.autoApproveAll).toBe(true);
|
|
432
|
+
});
|
|
433
|
+
|
|
323
434
|
it("passes cursor harness in the sessionSpec after switching", async () => {
|
|
324
435
|
const opts = defaultOptions();
|
|
325
436
|
const { result } = renderHook(() => useNewSessionFlow(opts), { wrapper: createWrapper() });
|
|
@@ -844,6 +955,24 @@ describe("useNewSessionFlow", () => {
|
|
|
844
955
|
expect(result.current.harness).toBe("cursor");
|
|
845
956
|
});
|
|
846
957
|
|
|
958
|
+
it("never inherits the host approval default — guests get platform policy (#302)", async () => {
|
|
959
|
+
const opts = { ...defaultOptions(), audience: "guest" as const };
|
|
960
|
+
const { result } = renderHook(() => useNewSessionFlow(opts), {
|
|
961
|
+
wrapper: createWrapper(undefined, null, { autoApproveAll: true }),
|
|
962
|
+
});
|
|
963
|
+
|
|
964
|
+
act(() => {
|
|
965
|
+
result.current.setAgentRef({ org: "acme", slug: "support-bot" });
|
|
966
|
+
result.current.setResolution({ mode: "saved", instanceId: "shared-inst" });
|
|
967
|
+
});
|
|
968
|
+
await act(async () => {
|
|
969
|
+
await result.current.submit("Hello");
|
|
970
|
+
});
|
|
971
|
+
|
|
972
|
+
const execInput = mockCreateExecution.mock.calls[0][0];
|
|
973
|
+
expect(execInput.autoApproveAll).toBeUndefined();
|
|
974
|
+
});
|
|
975
|
+
|
|
847
976
|
it("ignores the embedder's defaultHarness — guests get platform policy", () => {
|
|
848
977
|
const opts = {
|
|
849
978
|
...defaultOptions(),
|
|
@@ -62,10 +62,23 @@ vi.mock("../useAgentRefFromSession", () => ({
|
|
|
62
62
|
useAgentRefFromSession: () => ({ agentRef: null }),
|
|
63
63
|
}));
|
|
64
64
|
|
|
65
|
+
import type { ReactNode } from "react";
|
|
65
66
|
import { useSessionPageFlow } from "../useSessionPageFlow";
|
|
67
|
+
import { ApprovalDefaultsContext } from "../../approval-defaults-context";
|
|
66
68
|
|
|
67
69
|
const OPTS = { sessionId: "ses_1", org: "acme" };
|
|
68
70
|
|
|
71
|
+
/** Renders the hook under a provider-level host approval default (#302). */
|
|
72
|
+
function hostDefaultWrapper(autoApproveAll: boolean) {
|
|
73
|
+
return function Wrapper({ children }: { children: ReactNode }) {
|
|
74
|
+
return (
|
|
75
|
+
<ApprovalDefaultsContext.Provider value={{ autoApproveAll }}>
|
|
76
|
+
{children}
|
|
77
|
+
</ApprovalDefaultsContext.Provider>
|
|
78
|
+
);
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
69
82
|
describe("useSessionPageFlow — gate-driven auto-approve", () => {
|
|
70
83
|
beforeEach(() => {
|
|
71
84
|
mockSubmitApproval.mockResolvedValue(undefined);
|
|
@@ -147,3 +160,64 @@ describe("useSessionPageFlow — gate-driven auto-approve", () => {
|
|
|
147
160
|
expect(followUpOpts.autoApproveAll).toBeUndefined();
|
|
148
161
|
});
|
|
149
162
|
});
|
|
163
|
+
|
|
164
|
+
describe("useSessionPageFlow — host-set approval default (#302)", () => {
|
|
165
|
+
beforeEach(() => {
|
|
166
|
+
mockSubmitApproval.mockResolvedValue(undefined);
|
|
167
|
+
});
|
|
168
|
+
afterEach(() => {
|
|
169
|
+
vi.clearAllMocks();
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it("arms autoApproveAll from the provider default, before any gate", () => {
|
|
173
|
+
const { result } = renderHook(() => useSessionPageFlow(OPTS), {
|
|
174
|
+
wrapper: hostDefaultWrapper(true),
|
|
175
|
+
});
|
|
176
|
+
expect(result.current.autoApproveAll).toBe(true);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it("carries the host default into the very first follow-up", async () => {
|
|
180
|
+
const { result } = renderHook(() => useSessionPageFlow(OPTS), {
|
|
181
|
+
wrapper: hostDefaultWrapper(true),
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
await act(async () => {
|
|
185
|
+
await result.current.handleSubmit("first message");
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
const followUpOpts = mockSendFollowUp.mock.calls[0][1];
|
|
189
|
+
expect(followUpOpts.autoApproveAll).toBe(true);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it("the user's Turn off beats the host default for the rest of the session", async () => {
|
|
193
|
+
const { result } = renderHook(() => useSessionPageFlow(OPTS), {
|
|
194
|
+
wrapper: hostDefaultWrapper(true),
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
act(() => {
|
|
198
|
+
result.current.setAutoApproveAll(false);
|
|
199
|
+
});
|
|
200
|
+
expect(result.current.autoApproveAll).toBe(false);
|
|
201
|
+
|
|
202
|
+
await act(async () => {
|
|
203
|
+
await result.current.handleSubmit("after turn off");
|
|
204
|
+
});
|
|
205
|
+
const followUpOpts = mockSendFollowUp.mock.calls.at(-1)?.[1];
|
|
206
|
+
expect(followUpOpts.autoApproveAll).toBeUndefined();
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
it("guests never inherit the host default", () => {
|
|
210
|
+
const { result } = renderHook(
|
|
211
|
+
() => useSessionPageFlow({ ...OPTS, audience: "guest" }),
|
|
212
|
+
{ wrapper: hostDefaultWrapper(true) },
|
|
213
|
+
);
|
|
214
|
+
expect(result.current.autoApproveAll).toBe(false);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it("an explicit false default changes nothing", () => {
|
|
218
|
+
const { result } = renderHook(() => useSessionPageFlow(OPTS), {
|
|
219
|
+
wrapper: hostDefaultWrapper(false),
|
|
220
|
+
});
|
|
221
|
+
expect(result.current.autoApproveAll).toBe(false);
|
|
222
|
+
});
|
|
223
|
+
});
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { describe, it, expect, vi, afterEach } from "vitest";
|
|
2
|
+
import { renderHook, act } from "@testing-library/react";
|
|
3
|
+
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Owner-pinned run config for useSessionPageFlow (stigmer/stigmer#664).
|
|
6
|
+
//
|
|
7
|
+
// A platform-billed embedder pins the model/tier once and every follow-up
|
|
8
|
+
// carries it — winning over the composer's selection, the persisted
|
|
9
|
+
// Console preference, and the last execution's model — including retries,
|
|
10
|
+
// which re-enter the same submit path. Guests never carry a pin: their
|
|
11
|
+
// execution config is owned by the server-side share policy.
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
|
|
14
|
+
const mockSendFollowUp = vi.fn();
|
|
15
|
+
|
|
16
|
+
const mockConv = {
|
|
17
|
+
session: { spec: { agentInstanceId: "inst_bound" } },
|
|
18
|
+
isLoading: false,
|
|
19
|
+
completedExecutions: [] as unknown[],
|
|
20
|
+
activeStreamExecution: null,
|
|
21
|
+
workspaceEntries: [] as unknown[],
|
|
22
|
+
submitApproval: vi.fn(),
|
|
23
|
+
sendFollowUp: mockSendFollowUp,
|
|
24
|
+
};
|
|
25
|
+
vi.mock("../useSessionConversation", () => ({
|
|
26
|
+
useSessionConversation: () => mockConv,
|
|
27
|
+
}));
|
|
28
|
+
|
|
29
|
+
vi.mock("../../hooks", () => ({
|
|
30
|
+
useStigmer: () => ({ agent: { getByReference: vi.fn() } }),
|
|
31
|
+
}));
|
|
32
|
+
|
|
33
|
+
vi.mock("../../agent", () => ({
|
|
34
|
+
useDefaultAgent: () => ({ agent: null, isLoading: false, error: null }),
|
|
35
|
+
}));
|
|
36
|
+
|
|
37
|
+
const mockWorkspace = {
|
|
38
|
+
entries: [],
|
|
39
|
+
hasEntries: false,
|
|
40
|
+
toInput: vi.fn().mockReturnValue([]),
|
|
41
|
+
addGitRepo: vi.fn(),
|
|
42
|
+
addLocalPath: vi.fn(),
|
|
43
|
+
removeEntry: vi.fn(),
|
|
44
|
+
clear: vi.fn(),
|
|
45
|
+
};
|
|
46
|
+
vi.mock("../../workspace", () => ({
|
|
47
|
+
useWorkspaceEntries: () => mockWorkspace,
|
|
48
|
+
}));
|
|
49
|
+
|
|
50
|
+
vi.mock("../../execution/useSessionVariables", () => ({
|
|
51
|
+
useSessionVariables: () => ({ variables: [], isEmpty: true, clear: vi.fn() }),
|
|
52
|
+
}));
|
|
53
|
+
|
|
54
|
+
// Honors `enabled` like the real hook (contract pinned by its own tests).
|
|
55
|
+
vi.mock("../usePersistedModel", () => ({
|
|
56
|
+
usePersistedModel: (opts?: { enabled?: boolean }) =>
|
|
57
|
+
(opts?.enabled === false
|
|
58
|
+
? ([undefined, vi.fn()] as const)
|
|
59
|
+
: (["persisted-model", vi.fn()] as const)),
|
|
60
|
+
}));
|
|
61
|
+
|
|
62
|
+
vi.mock("../useAgentRefFromSession", () => ({
|
|
63
|
+
useAgentRefFromSession: () => ({ agentRef: null }),
|
|
64
|
+
}));
|
|
65
|
+
|
|
66
|
+
import { useSessionPageFlow } from "../useSessionPageFlow";
|
|
67
|
+
|
|
68
|
+
const OPTS = { sessionId: "ses_1", org: "acme" };
|
|
69
|
+
const PIN = { modelName: "pinned-model", serviceTier: "fast" } as const;
|
|
70
|
+
|
|
71
|
+
describe("useSessionPageFlow — owner-pinned runConfig (#664)", () => {
|
|
72
|
+
afterEach(() => {
|
|
73
|
+
vi.clearAllMocks();
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("stamps the pinned model and fast tier on a composer follow-up, over the composer's own selection", async () => {
|
|
77
|
+
const { result } = renderHook(() =>
|
|
78
|
+
useSessionPageFlow({ ...OPTS, runConfig: PIN }),
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
await act(async () => {
|
|
82
|
+
await result.current.handleSubmit("follow up", "user-picked-model", {
|
|
83
|
+
serviceTier: undefined,
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
const options = mockSendFollowUp.mock.calls[0][1];
|
|
88
|
+
expect(options.modelName).toBe("pinned-model");
|
|
89
|
+
expect(options.serviceTier).toBe("fast");
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it("stamps the pin on a bare re-submit (the execution-retry path passes no composer args)", async () => {
|
|
93
|
+
const { result } = renderHook(() =>
|
|
94
|
+
useSessionPageFlow({ ...OPTS, runConfig: PIN }),
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
await act(async () => {
|
|
98
|
+
await result.current.handleSubmit("retry me");
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
const options = mockSendFollowUp.mock.calls[0][1];
|
|
102
|
+
expect(options.modelName).toBe("pinned-model");
|
|
103
|
+
expect(options.serviceTier).toBe("fast");
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("a model-only pin suppresses a composer-armed fast tier (the pin owns the whole run config)", async () => {
|
|
107
|
+
const { result } = renderHook(() =>
|
|
108
|
+
useSessionPageFlow({ ...OPTS, runConfig: { modelName: "pinned-model" } }),
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
await act(async () => {
|
|
112
|
+
await result.current.handleSubmit("follow up", undefined, {
|
|
113
|
+
serviceTier: "fast",
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const options = mockSendFollowUp.mock.calls[0][1];
|
|
118
|
+
expect(options.modelName).toBe("pinned-model");
|
|
119
|
+
expect(options.serviceTier).toBeUndefined();
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it("keeps the unpinned behavior byte-identical when no runConfig is given", async () => {
|
|
123
|
+
const { result } = renderHook(() => useSessionPageFlow(OPTS));
|
|
124
|
+
|
|
125
|
+
await act(async () => {
|
|
126
|
+
await result.current.handleSubmit("follow up", "user-picked-model", {
|
|
127
|
+
serviceTier: "fast",
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
const options = mockSendFollowUp.mock.calls[0][1];
|
|
132
|
+
expect(options.modelName).toBe("user-picked-model");
|
|
133
|
+
expect(options.serviceTier).toBe("fast");
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it("ignores the pin entirely for guests — their no-modelName invariant survives a misconfigured embed", async () => {
|
|
137
|
+
const { result } = renderHook(() =>
|
|
138
|
+
useSessionPageFlow({ ...OPTS, audience: "guest", runConfig: PIN }),
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
await act(async () => {
|
|
142
|
+
await result.current.handleSubmit("follow up");
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
const options = mockSendFollowUp.mock.calls[0][1];
|
|
146
|
+
expect(options.modelName).toBeUndefined();
|
|
147
|
+
expect(options.serviceTier).toBeUndefined();
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it("throws at render for the statically-wrong pin (fast tier, no model)", () => {
|
|
151
|
+
expect(() =>
|
|
152
|
+
renderHook(() =>
|
|
153
|
+
useSessionPageFlow({ ...OPTS, runConfig: { serviceTier: "fast" } }),
|
|
154
|
+
),
|
|
155
|
+
).toThrowError(/serviceTier "fast" requires modelName/);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
@@ -278,6 +278,120 @@ describe("useSessionPanel — artifact document tabs", () => {
|
|
|
278
278
|
});
|
|
279
279
|
});
|
|
280
280
|
|
|
281
|
+
describe("useSessionPanel — observed open state (uncontrolled + onOpenChange)", () => {
|
|
282
|
+
// The panel opens ITSELF (file/artifact/plan opens, plan auto-open), so —
|
|
283
|
+
// unlike useDetailTabs' user-driven-only tabs — onOpenChange fires in BOTH
|
|
284
|
+
// modes: passing only the callback observes the panel without controlling
|
|
285
|
+
// it (the issue-#300 docking-host case).
|
|
286
|
+
it("reports the chip toggle without taking control", () => {
|
|
287
|
+
const seen: boolean[] = [];
|
|
288
|
+
const { result } = renderPanel({ onOpenChange: (o) => seen.push(o) });
|
|
289
|
+
act(() => result.current.openPanel());
|
|
290
|
+
expect(result.current.isOpen).toBe(true);
|
|
291
|
+
act(() => result.current.closePanel());
|
|
292
|
+
expect(result.current.isOpen).toBe(false);
|
|
293
|
+
expect(seen).toEqual([true, false]);
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
it("reports internal open intents (openFile), once per actual transition", () => {
|
|
297
|
+
const seen: boolean[] = [];
|
|
298
|
+
const { result } = renderPanel({ onOpenChange: (o) => seen.push(o) });
|
|
299
|
+
act(() => result.current.openFile("e1", "a.ts"));
|
|
300
|
+
// Already open — a second open intent is not a transition.
|
|
301
|
+
act(() => result.current.openFile("e1", "b.ts"));
|
|
302
|
+
act(() => result.current.openPanel());
|
|
303
|
+
expect(seen).toEqual([true]);
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
it("reports the plan auto-open — the beat a docking host makes room for", () => {
|
|
307
|
+
const seen: boolean[] = [];
|
|
308
|
+
const onOpenChange = (o: boolean) => seen.push(o);
|
|
309
|
+
const { rerender } = renderPanel({ onOpenChange });
|
|
310
|
+
rerender({ phase: null, hasChanges: false, planKey: "e1:streaming", onOpenChange });
|
|
311
|
+
expect(seen).toEqual([true]);
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
it("starts open when defaultOpen is set, without a spurious notification", () => {
|
|
315
|
+
const seen: boolean[] = [];
|
|
316
|
+
const { result } = renderPanel({
|
|
317
|
+
defaultOpen: true,
|
|
318
|
+
onOpenChange: (o) => seen.push(o),
|
|
319
|
+
});
|
|
320
|
+
expect(result.current.isOpen).toBe(true);
|
|
321
|
+
expect(seen).toEqual([]);
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
describe("useSessionPanel — controlled open state", () => {
|
|
326
|
+
it("follows the host's open value and ignores defaultOpen", () => {
|
|
327
|
+
const { result, rerender } = renderPanel({ open: false, defaultOpen: true });
|
|
328
|
+
expect(result.current.isOpen).toBe(false);
|
|
329
|
+
rerender({ phase: null, hasChanges: false, open: true, defaultOpen: true });
|
|
330
|
+
expect(result.current.isOpen).toBe(true);
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
it("surfaces intents through onOpenChange without flipping state itself", () => {
|
|
334
|
+
const seen: boolean[] = [];
|
|
335
|
+
const onOpenChange = (o: boolean) => seen.push(o);
|
|
336
|
+
const { result, rerender } = renderPanel({ open: false, onOpenChange });
|
|
337
|
+
act(() => result.current.openPanel());
|
|
338
|
+
expect(seen).toEqual([true]);
|
|
339
|
+
expect(result.current.isOpen).toBe(false);
|
|
340
|
+
// The host grants the request.
|
|
341
|
+
rerender({ phase: null, hasChanges: false, open: true, onOpenChange });
|
|
342
|
+
expect(result.current.isOpen).toBe(true);
|
|
343
|
+
act(() => result.current.closePanel());
|
|
344
|
+
expect(seen).toEqual([true, false]);
|
|
345
|
+
expect(result.current.isOpen).toBe(true);
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
it("re-fires a declined request (once per request, not per transition)", () => {
|
|
349
|
+
const seen: boolean[] = [];
|
|
350
|
+
const onOpenChange = (o: boolean) => seen.push(o);
|
|
351
|
+
const { result } = renderPanel({ open: false, onOpenChange });
|
|
352
|
+
act(() => result.current.openFile("e1", "a.ts"));
|
|
353
|
+
// The host declined (open stayed false) — a later intent must re-fire,
|
|
354
|
+
// not be swallowed by a stale "already requested" memory.
|
|
355
|
+
act(() => result.current.openFile("e1", "b.ts"));
|
|
356
|
+
expect(seen).toEqual([true, true]);
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
it("plan auto-open is reported, not applied — but the tab is pinned and ready", () => {
|
|
360
|
+
const seen: boolean[] = [];
|
|
361
|
+
const onOpenChange = (o: boolean) => seen.push(o);
|
|
362
|
+
const { result, rerender } = renderPanel({ open: false, onOpenChange });
|
|
363
|
+
rerender({
|
|
364
|
+
phase: null,
|
|
365
|
+
hasChanges: false,
|
|
366
|
+
planKey: "e1:hash-a",
|
|
367
|
+
open: false,
|
|
368
|
+
onOpenChange,
|
|
369
|
+
});
|
|
370
|
+
expect(seen).toEqual([true]);
|
|
371
|
+
expect(result.current.isOpen).toBe(false);
|
|
372
|
+
// View state stays SDK-owned: the plan tab is pinned regardless, so the
|
|
373
|
+
// moment the host opens the panel the plan is what greets the user.
|
|
374
|
+
expect(result.current.editorsStore.getSnapshot().editors).toEqual([
|
|
375
|
+
{ entryId: PLAN_DOCUMENT_ENTRY_ID, path: PLAN_DOCUMENT_PATH, preview: false },
|
|
376
|
+
]);
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
it("auto-surfaces Changes against the HOST's open state, not the internal one", () => {
|
|
380
|
+
// The first-write-back trigger reads the effective open value: a
|
|
381
|
+
// controlled-open panel (whose internal state was never touched) must
|
|
382
|
+
// still surface Changes…
|
|
383
|
+
const { result, rerender } = renderPanel({ open: true });
|
|
384
|
+
rerender({ phase: null, hasChanges: true, open: true });
|
|
385
|
+
expect(result.current.view).toBe("changes");
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
it("…and a controlled-closed panel must not", () => {
|
|
389
|
+
const { result, rerender } = renderPanel({ open: false });
|
|
390
|
+
rerender({ phase: null, hasChanges: true, open: false });
|
|
391
|
+
expect(result.current.view).toBe("files");
|
|
392
|
+
});
|
|
393
|
+
});
|
|
394
|
+
|
|
281
395
|
describe("useSessionPanel — defaultView (home view)", () => {
|
|
282
396
|
it("seeds the view to the provided defaultView (launcher homes on Config)", () => {
|
|
283
397
|
const { result } = renderPanel({ defaultView: "configure" });
|
package/src/session/audience.ts
CHANGED
|
@@ -45,3 +45,21 @@
|
|
|
45
45
|
* presentation means without breaking embedders.
|
|
46
46
|
*/
|
|
47
47
|
export type SessionAudience = "integrator" | "endUser" | "guest" | "observer";
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Whether the session organisms offer the session panel surface.
|
|
51
|
+
*
|
|
52
|
+
* - `"auto"` (default) — the panel and its toggle chip are available
|
|
53
|
+
* whenever the audience allows them (every audience except `"guest"`).
|
|
54
|
+
* - `"none"` — the panel and chip are absent entirely: plan-mode
|
|
55
|
+
* auto-open is suppressed and transcript file paths keep their default
|
|
56
|
+
* copy behavior. For hosts whose surrounding surface already renders
|
|
57
|
+
* the workspace — the composer keeps every capability the audience
|
|
58
|
+
* allows, which is what separates this from `audience="guest"`.
|
|
59
|
+
*
|
|
60
|
+
* Orthogonal to {@link SessionAudience} on purpose: audience is who is
|
|
61
|
+
* looking, panel mode is what the host's geometry has room for. A union
|
|
62
|
+
* (not a boolean) so a future mode — e.g. a host-rendered panel fed by
|
|
63
|
+
* the SDK's controller — extends the vocabulary instead of breaking it.
|
|
64
|
+
*/
|
|
65
|
+
export type SessionPanelMode = "auto" | "none";
|
package/src/session/index.ts
CHANGED
|
@@ -2,7 +2,8 @@ export { toProtoExecutionTarget, fromProtoExecutionTarget } from "./execution-ta
|
|
|
2
2
|
export type { ExecutionTargetOption } from "./execution-target.js";
|
|
3
3
|
|
|
4
4
|
export type { RuntimeEnvProvider } from "./runtime-env.js";
|
|
5
|
-
export type { SessionAudience } from "./audience.js";
|
|
5
|
+
export type { SessionAudience, SessionPanelMode } from "./audience.js";
|
|
6
|
+
export type { SessionRunConfig } from "./run-config.js";
|
|
6
7
|
export {
|
|
7
8
|
CHANNEL_SESSION_LABELS,
|
|
8
9
|
isChannelOriginSession,
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { ServiceTierOption } from "../models/service-tier.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Owner-pinned execution config for a session surface
|
|
5
|
+
* (stigmer/stigmer#664) — the client-side subset of the platform
|
|
6
|
+
* `RunConfig` that AgentShare and AgentChannel specs pin server-side
|
|
7
|
+
* (stigmer/stigmer#360). Budget clamps (`max_cost_usd`,
|
|
8
|
+
* `max_tool_rounds`) are deliberately absent: those are enforcement,
|
|
9
|
+
* which only the server can own.
|
|
10
|
+
*
|
|
11
|
+
* Passed to `SessionViewer` / `NewSessionViewer` (or the underlying
|
|
12
|
+
* flow hooks) by embedders whose product — not the end user — decides
|
|
13
|
+
* what serves the conversation: every execution on the surface (first
|
|
14
|
+
* message, follow-ups, retries) carries the pinned values, and the
|
|
15
|
+
* model picker hides automatically (a control that has no effect must
|
|
16
|
+
* not render).
|
|
17
|
+
*
|
|
18
|
+
* This is presentation-level pinning for product-embedded sessions,
|
|
19
|
+
* not a security boundary — a caller with the session's credentials
|
|
20
|
+
* can still create executions directly. Share/channel surfaces, where
|
|
21
|
+
* the audience is untrusted, get the server-enforced `RunConfig` on
|
|
22
|
+
* their specs instead.
|
|
23
|
+
*
|
|
24
|
+
* Ignored entirely for the `"guest"` audience: guest execution config
|
|
25
|
+
* is owned by the server-side share policy, and guest sends carrying
|
|
26
|
+
* no `modelName` is a pinned invariant.
|
|
27
|
+
*/
|
|
28
|
+
export interface SessionRunConfig {
|
|
29
|
+
/**
|
|
30
|
+
* Model every execution runs, as a plain `modelId` from the model
|
|
31
|
+
* registry. Wins over the composer's selection, the persisted
|
|
32
|
+
* Console preference, and the last execution's model.
|
|
33
|
+
*/
|
|
34
|
+
readonly modelName?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Service tier for every execution. `"fast"` requires
|
|
37
|
+
* {@link modelName}: the fast tier is a per-model price (the server
|
|
38
|
+
* refuses it fail-closed for Auto), so a tier pin without a model
|
|
39
|
+
* pin is a host configuration error and throws at submit.
|
|
40
|
+
*/
|
|
41
|
+
readonly serviceTier?: ServiceTierOption;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Fail fast on the one statically-wrong shape: `serviceTier: "fast"`
|
|
46
|
+
* with no pinned model. Every layer below (composer gate, server
|
|
47
|
+
* validation) would refuse it anyway — but those surface as an end
|
|
48
|
+
* user's failed send, while this names the embedder's bug at the
|
|
49
|
+
* seam where it was written.
|
|
50
|
+
*/
|
|
51
|
+
export function assertValidRunConfig(runConfig: SessionRunConfig): void {
|
|
52
|
+
if (runConfig.serviceTier === "fast" && !runConfig.modelName) {
|
|
53
|
+
throw new Error(
|
|
54
|
+
"SessionRunConfig: serviceTier \"fast\" requires modelName — the fast "
|
|
55
|
+
+ "tier is a per-model price and Auto (no pinned model) has no tier "
|
|
56
|
+
+ "dimension. Pin the model the surface should run.",
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
}
|