From 1b2eb2b17f5361e9757a6f5e77f08769608e8c22 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Thu, 29 Oct 2026 13:03:56 -0700 Subject: [PATCH 1/4] fix(search): inline action review and unify account menus --- apps/docs/components/ui/heading.tsx | 8 +- .../content/docs/search/ask-questions.mdx | 12 +- apps/docs/content/docs/search/coda.mdx | 2 +- apps/docs/content/docs/search/confluence.mdx | 2 +- .../docs/search/connect-your-account.mdx | 23 +- apps/docs/content/docs/search/fireflies.mdx | 2 +- apps/docs/content/docs/search/gmail.mdx | 2 +- .../docs/content/docs/search/google-drive.mdx | 2 +- apps/docs/content/docs/search/google-meet.mdx | 2 +- apps/docs/content/docs/search/granola.mdx | 2 +- apps/docs/content/docs/search/hubspot.mdx | 2 +- apps/docs/content/docs/search/jira.mdx | 2 +- apps/docs/content/docs/search/quickstart.mdx | 2 +- apps/docs/content/docs/search/slack.mdx | 4 +- apps/docs/content/docs/search/zoom.mdx | 2 +- .../static/search/assistant-action-review.png | Bin 76490 -> 27120 bytes .../search/assistant-tool-permissions.png | Bin 81380 -> 73507 bytes .../static/search/connect-account-menu.png | Bin 0 -> 82707 bytes .../components/organization-conversation.tsx | 13 +- .../integrations/account-actions-menu.tsx | 129 ++++ .../integrations/account-permissions-link.tsx | 44 -- .../[credentialId]/tool-permissions.tsx | 55 +- .../assistant-account-integrations.tsx | 62 +- .../integrations/disconnect-account-menu.tsx | 75 --- .../live-member-integrations.test.tsx | 14 +- .../integrations/live-member-integrations.tsx | 157 +++-- .../o/[organizationId]/integrations/utils.ts | 27 +- .../components/agent-group/tool-call-item.tsx | 2 +- .../mothership-chat/mothership-chat.tsx | 67 ++- .../sim/components/assistant-actions/index.ts | 2 +- .../components/assistant-actions/review.tsx | 560 ++++++++++++------ apps/sim/hooks/queries/assistant-actions.ts | 7 +- .../lib/api/contracts/assistant-actions.ts | 3 + .../assistant-actions/application/context.ts | 12 +- .../assistant-actions/application/review.ts | 61 +- apps/sim/lib/assistant-actions/proposal.ts | 6 +- .../tool-permissions.integration.ts | 122 +++- .../lib/mothership/async-runs/repository.ts | 18 +- .../async-runs/tool-identity.integration.ts | 46 ++ .../persistence/tool-permission/index.ts | 30 +- .../sim/scripts/test-assistant-actions-e2e.ts | 506 ++++++++++++++-- 41 files changed, 1453 insertions(+), 634 deletions(-) create mode 100644 apps/docs/public/static/search/connect-account-menu.png create mode 100644 apps/sim/app/o/[organizationId]/integrations/account-actions-menu.tsx delete mode 100644 apps/sim/app/o/[organizationId]/integrations/account-permissions-link.tsx delete mode 100644 apps/sim/app/o/[organizationId]/integrations/disconnect-account-menu.tsx diff --git a/apps/docs/components/ui/heading.tsx b/apps/docs/components/ui/heading.tsx index cd259daa121..5de3630ee35 100644 --- a/apps/docs/components/ui/heading.tsx +++ b/apps/docs/components/ui/heading.tsx @@ -38,7 +38,13 @@ export function Heading({ as, className, ...props }: HeadingProps) { } return ( - + {props.children} diff --git a/apps/docs/content/docs/search/ask-questions.mdx b/apps/docs/content/docs/search/ask-questions.mdx index 8091eff3fb6..8599e486b1d 100644 --- a/apps/docs/content/docs/search/ask-questions.mdx +++ b/apps/docs/content/docs/search/ask-questions.mdx @@ -127,19 +127,19 @@ Copy the reviewed draft into another app, or ask Assistant to create it using yo When integration actions are enabled, Assistant can answer questions and take supported actions in the same conversation. For example, ask it to draft an email in Gmail or create a Jira issue using your own connected account. -Reads run without a prompt by default. Writes wait for review by default. Open **Review** to see the app, account, destination, and proposed content. Edit the supported fields, then select **Allow** or **Cancel** for each action. For several proposals, **Allow N shown** approves the actions currently displayed in the review. +Reads run without a prompt by default. Writes wait for review by default. Each proposal appears inline in the conversation with its app, account, destination, and proposed content. Edit the supported fields, then select **Allow** or **Cancel** for each action. For several proposals, **Allow N shown** approves the actions currently displayed in the review. Assistant action review showing the connected Jira account, exact site and project, editable issue summary and description, and Allow or Cancel controls Each decision applies to that proposal. Changing its account or destination requires a new proposal. An action can still fail if your account is disconnected or an administrator changes access before execution. If the provider outcome is unknown, check the original app before asking Assistant to repeat a write. -Configure persistent **Allow**, **Ask**, or **Block** preferences under **Integrations → Tool permissions** for your account. See [tool permissions](/search/connect-your-account#tool-permissions). +Configure persistent **Allow**, **Ask**, or **Block** preferences under **Integrations → ⋯ → Tool permissions** for your account. See [tool permissions](/search/connect-your-account#tool-permissions). ## Start from a document diff --git a/apps/docs/content/docs/search/coda.mdx b/apps/docs/content/docs/search/coda.mdx index 4cd10b17d14..1241479201a 100644 --- a/apps/docs/content/docs/search/coda.mdx +++ b/apps/docs/content/docs/search/coda.mdx @@ -8,7 +8,7 @@ Connect Coda to search page and table-row content. **Member accounts** and **Ser ## Connect 1. An admin adds **Coda** in **Settings → Sources** and selects **Member accounts**, or configures the service source below. -2. Each teammate opens **Integrations → Coda → Connect** and authorizes their account. +2. Each teammate opens **Integrations → Coda → ⋯ → Connect** and authorizes their account. 3. Search text in a page or row that account can access, then read a result. The managed Coda MCP provider must be configured before **Connect** is available. Members authorize that provider rather than choosing an arbitrary server URL. Coda may use [Superhuman sign-in](https://help.coda.io/en/articles/5473507-reset-your-password). diff --git a/apps/docs/content/docs/search/confluence.mdx b/apps/docs/content/docs/search/confluence.mdx index 0ffad5250f8..b9293a08dea 100644 --- a/apps/docs/content/docs/search/confluence.mdx +++ b/apps/docs/content/docs/search/confluence.mdx @@ -8,7 +8,7 @@ Search Confluence Cloud with your own account. **Member accounts** uses your pro ## Connect member accounts 1. An admin adds **Confluence** in **Settings → Sources** and selects **Member accounts**, or configures the service source below. -2. Each teammate opens **Integrations → Confluence → Connect** and authorizes their Atlassian account. +2. Each teammate opens **Integrations → Confluence → ⋯ → Connect** and authorizes their Atlassian account. 3. Search a page or blog post that account can access, then read a result. Member mode has no admin space or label filters. The default search covers pages and blog posts; ask Sim to use Confluence Query Language (CQL) to narrow a query by content type or space. Site access comes from your connected account. diff --git a/apps/docs/content/docs/search/connect-your-account.mdx b/apps/docs/content/docs/search/connect-your-account.mdx index 2a7f250922a..181194b1972 100644 --- a/apps/docs/content/docs/search/connect-your-account.mdx +++ b/apps/docs/content/docs/search/connect-your-account.mdx @@ -10,20 +10,19 @@ After your admin adds a source in **Settings → Sources**, connect your own acc ## Connect and verify 1. Join the Sim organization through its invitation or SSO. Use the verified email required by the provider connection. -2. Open **Integrations**, find the provider, and select **Connect**. +2. Open **Integrations**, find the provider, and choose **Connect** from its **⋯** menu. 3. Complete authorization in the new tab. If the popup is blocked, allow it and select **Connect** again. 4. Return to **Search** or **Search → Assistant** and search for content your account can open. Read a result and follow its source link. Confluence in Integrations with the Connect button before an account has been authorized -Once an account is connected, **Add account** lets you authorize another account for that provider. +If your organization makes another connection available, choose **Add account** from the same menu. The connection is usable when authorization completes; no initial indexing run is required. If a provider is missing, ask an admin to add it in **Sources**. `Not configured` means its app or deployment setup needs an admin's attention. @@ -47,7 +46,7 @@ Creating Jira sprints requires the Jira sprint permission. If your account was c ## Tool permissions -When Assistant integration actions are enabled, open **Integrations** and select **Tool permissions** beside your connected account. Set a preference for each operation or use the **Read-only tools** and **Write tools** group controls: +When Assistant integration actions are enabled, open the app’s **⋯** menu in **Integrations** and select **Tool permissions** for your connected account. This option appears when the app has supported Assistant tools available to you. Set a preference for each operation or use the **Read-only tools** and **Write tools** group controls: | Preference | Behavior | | --- | --- | @@ -64,16 +63,16 @@ These preferences belong to your account. They cannot grant access to another pe alt="Connected account settings with Read-only tools and Write tools groups and per-tool Allow, Ask, and Block preferences" width={1440} height={1000} - variant="result" + variant="overview" /> Apps used only for actions appear under **Assistant apps**. An admin makes the app available in organization source settings, then each member connects their own account in Integrations. ## Reconnect or disconnect -Use **Reconnect** when a grant expires, is revoked, or needs more scopes. A temporary provider outage does not necessarily require reconnecting. +Choose **Reconnect** from the app’s **⋯** menu when a grant expires, is revoked, or needs more scopes. A temporary provider outage does not necessarily require reconnecting. -Disconnecting stops future use of the grant and can affect workflows sharing the account. Review the confirmation before removing it. Disconnecting does not remove your Sim membership. +Choose **Disconnect** from the same menu to stop future use of the grant. This can affect workflows sharing the account. Review the confirmation before removing it. Disconnecting does not remove your Sim membership. For an account-connection request, sign in as the verified Sim user associated with the requested email, then authorize the provider. The request does not invite you into the organization; membership and Search access are still required. diff --git a/apps/docs/content/docs/search/fireflies.mdx b/apps/docs/content/docs/search/fireflies.mdx index 8b3bc83b0c5..0b3229b89d3 100644 --- a/apps/docs/content/docs/search/fireflies.mdx +++ b/apps/docs/content/docs/search/fireflies.mdx @@ -8,7 +8,7 @@ Fireflies Search uses **Member accounts** and the official managed MCP connectio ## Connect 1. An admin adds **Fireflies** in **Settings → Sources**, using **Member accounts**. -2. Each teammate opens **Integrations → Fireflies → Connect** and authorizes their account. +2. Each teammate opens **Integrations → Fireflies → ⋯ → Connect** and authorizes their account. 3. Search a phrase such as `security approval` or `customer onboarding`, then read a result. The managed provider must be configured before **Connect** is available. It uses `https://api.fireflies.ai/mcp`. The API key for the Fireflies knowledge-base connector is a separate ingestion connection and cannot authorize member Search. diff --git a/apps/docs/content/docs/search/gmail.mdx b/apps/docs/content/docs/search/gmail.mdx index b65b3b4dd33..c4a6bbc2e49 100644 --- a/apps/docs/content/docs/search/gmail.mdx +++ b/apps/docs/content/docs/search/gmail.mdx @@ -7,7 +7,7 @@ Gmail Search finds matching messages in your connected mailbox. **Member account ## Connect member accounts -An admin adds **Gmail** in **Settings → Sources**, chooses **Member accounts**, and saves. Members select **Integrations → Gmail → Connect**, then search for a known message and read it. +An admin adds **Gmail** in **Settings → Sources**, chooses **Member accounts**, and saves. Members select **Integrations → Gmail → ⋯ → Connect**, then search for a known message and read it. Member mode has no admin label, date, category, or mailbox filters. Search and document-read requests do not send or modify messages. When integration actions are enabled, **Search → Assistant** can create drafts or send email using your connected account, subject to tool permissions and organization policy. Writes ask for [review](/search/ask-questions#review-actions) by default. diff --git a/apps/docs/content/docs/search/google-drive.mdx b/apps/docs/content/docs/search/google-drive.mdx index 7ee7c62deed..0ae24194476 100644 --- a/apps/docs/content/docs/search/google-drive.mdx +++ b/apps/docs/content/docs/search/google-drive.mdx @@ -8,7 +8,7 @@ Google Drive Search finds files your account can access, including Google Docs, ## Connect and search 1. An admin adds **Google Drive** in **Settings → Sources** and chooses **Member accounts**, or configures the service source below. -2. Each teammate selects **Integrations → Google Drive → Connect** and authorizes their account. +2. Each teammate selects **Integrations → Google Drive → ⋯ → Connect** and authorizes their account. 3. Search a known file, read the result, and follow its source link. Member mode has no organization folder, file-type, or user selection. Native Drive queries can narrow a search. For example, `name contains 'Roadmap' and 'person@example.com' in owners` finds candidate files by name and owner. diff --git a/apps/docs/content/docs/search/google-meet.mdx b/apps/docs/content/docs/search/google-meet.mdx index 190c8bb9355..7ac481e6750 100644 --- a/apps/docs/content/docs/search/google-meet.mdx +++ b/apps/docs/content/docs/search/google-meet.mdx @@ -8,7 +8,7 @@ Google Meet Search finds recent finalized transcripts and generated-note links. ## Connect 1. An admin adds **Google Meet → Member accounts** in **Settings → Sources**. -2. In **Integrations**, select **Connect** beside Google Meet and authorize your Google account. Your Workspace administrator may need to approve the app. +2. In **Integrations**, open the Google Meet **⋯** menu and select **Connect** and authorize your Google account. Your Workspace administrator may need to approve the app. 3. Return to Sim, confirm the account appears, then search a phrase from a recent meeting and read the result. No service account is required. Search only reads conference records and artifacts, using the connection's `meetings.space.readonly` scope. Its `meetings.space.created` scope supports workflow actions. diff --git a/apps/docs/content/docs/search/granola.mdx b/apps/docs/content/docs/search/granola.mdx index af22d0515bf..302fbcbda49 100644 --- a/apps/docs/content/docs/search/granola.mdx +++ b/apps/docs/content/docs/search/granola.mdx @@ -8,7 +8,7 @@ Granola Search uses **Member accounts** through the official MCP service. It sea ## Connect 1. An admin adds **Granola → Member accounts** in **Settings → Sources**. -2. Each teammate opens **Integrations → Granola → Connect** and authorizes their account. +2. Each teammate opens **Integrations → Granola → ⋯ → Connect** and authorizes their account. 3. Ask a focused question such as `What did we decide about the enterprise launch?`, then read a result. Sim uses `https://mcp.granola.ai/mcp` with each member's managed OAuth grant. A shared API key cannot replace this connection. If meetings are missing, check the account and switch to the intended workspace in Granola; MCP follows the active workspace. diff --git a/apps/docs/content/docs/search/hubspot.mdx b/apps/docs/content/docs/search/hubspot.mdx index 26377ca6aec..8a897c06b58 100644 --- a/apps/docs/content/docs/search/hubspot.mdx +++ b/apps/docs/content/docs/search/hubspot.mdx @@ -7,7 +7,7 @@ HubSpot Search finds contacts, companies, deals, and tickets through the officia ## Connect -An admin adds **HubSpot** in **Settings → Sources**. Each person then selects **Integrations → HubSpot → Connect** and signs in. Grant read access to contacts, companies, deals, and tickets; write access is not needed. Search a known name, email, or domain, then read the record. +An admin adds **HubSpot** in **Settings → Sources**. Each person then selects **Integrations → HubSpot → ⋯ → Connect** and signs in. Grant read access to contacts, companies, deals, and tickets; write access is not needed. Search a known name, email, or domain, then read the record. ## Search and read records diff --git a/apps/docs/content/docs/search/jira.mdx b/apps/docs/content/docs/search/jira.mdx index e94bcf31d48..4444935e02e 100644 --- a/apps/docs/content/docs/search/jira.mdx +++ b/apps/docs/content/docs/search/jira.mdx @@ -8,7 +8,7 @@ Jira Search finds Cloud issues with your personal OAuth grant. It uses **Member ## Connect 1. An admin adds **Jira** in **Settings → Sources → Add source**. -2. Each teammate selects **Integrations → Jira → Connect** and authorizes their Atlassian account. +2. Each teammate selects **Integrations → Jira → ⋯ → Connect** and authorizes their Atlassian account. 3. Search a known issue, or ask Sim about it. Read the result and follow its Jira link. No project setup or indexing is needed after authorization. Sim Cloud supplies the OAuth app where available; self-hosted deployments configure their app below. diff --git a/apps/docs/content/docs/search/quickstart.mdx b/apps/docs/content/docs/search/quickstart.mdx index de861a79397..d5803ab06f9 100644 --- a/apps/docs/content/docs/search/quickstart.mdx +++ b/apps/docs/content/docs/search/quickstart.mdx @@ -7,7 +7,7 @@ Use this walkthrough to go from a question to a useful answer. Choose a topic yo ## 1. Connect your apps -Open your organization's Sim home and select **Integrations** in the sidebar. Find an app you use and select **Connect**. Complete authorization with the work account that can open the content you need. +Open your organization's Sim home and select **Integrations** in the sidebar. Find an app you use and choose **Connect** from its **⋯** menu. Complete authorization with the work account that can open the content you need. Your admin must enable the source first. If you don't see it, ask them to check **Settings → Sources**. Some organization-managed sources have a different connection process; see [Connect your account](/search/connect-your-account). diff --git a/apps/docs/content/docs/search/slack.mdx b/apps/docs/content/docs/search/slack.mdx index 2edb75ca9e7..d8776c0b0b7 100644 --- a/apps/docs/content/docs/search/slack.mdx +++ b/apps/docs/content/docs/search/slack.mdx @@ -11,7 +11,7 @@ Slack Search uses **Member accounts** and the member's real-time user token. The 1. An admin adds **Slack** in **Settings → Sources**. 2. Complete the organization's app setup if needed. Use the official Sim Search app when available, or the deployment's custom app. -3. Each member selects **Integrations → Slack → Connect** and authorizes their account. +3. Each member selects **Integrations → Slack → ⋯ → Connect** and authorizes their account. 4. Search a known message, read it, and follow its Slack link. No channel setup or initial sync is needed. Members need a Sim invitation or SSO membership separately. Provider app/workspace approval policies still apply. @@ -30,7 +30,7 @@ An admin opens **Settings → Sim Search in Slack** and installs or connects the - DM **Sim Search**, or mention it in a channel it has joined. - Where the installed app exposes slash commands, use `/query [question]` to start a private DM thread. Channel invocations keep personalized answers and account details in DMs. -- Use `/connect [provider]` where available, or **Home → Connect sources**, to open personal Integrations. Select **Connect** there to start OAuth. +- Use `/connect [provider]` where available, or **Home → Connect sources**, to open personal Integrations. Choose **Connect** from the app’s **⋯** menu to start OAuth. - Follow source links. Slack's **Stop** control cancels an active answer and queued follow-ups. Removing the bot binding is separate from disconnecting your Slack source. diff --git a/apps/docs/content/docs/search/zoom.mdx b/apps/docs/content/docs/search/zoom.mdx index 19611511531..bde4fc30578 100644 --- a/apps/docs/content/docs/search/zoom.mdx +++ b/apps/docs/content/docs/search/zoom.mdx @@ -10,7 +10,7 @@ When Zoom Search is enabled for your organization, connect your own account to f Zoom Search requires deployment enablement and organization access before setup or retrieval is available. Ask your admin about availability if Zoom is missing. 1. An admin adds **Zoom → Member accounts** in **Settings → Sources**. -2. Each person selects **Integrations → Zoom → Connect**, signs in, and authorizes the read permissions. Zoom account-admin approval may be needed. +2. Each person selects **Integrations → Zoom → ⋯ → Connect**, signs in, and authorizes the read permissions. Zoom account-admin approval may be needed. 3. Return to Sim, confirm the account appears, and search a known meeting. Read the result and follow its source link. A workflow Zoom connection does not authorize Search. Its dedicated app registration prevents Search reauthorization from replacing or narrowing a workflow app's grant. diff --git a/apps/docs/public/static/search/assistant-action-review.png b/apps/docs/public/static/search/assistant-action-review.png index 70924474a8a66677b1ebbee824b3747f14caa974..b43eba955341ff3d53f80806762f3935f6ef1aac 100644 GIT binary patch literal 27120 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 DcfDJO literal 76490 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 Ay#N3J diff --git a/apps/docs/public/static/search/assistant-tool-permissions.png b/apps/docs/public/static/search/assistant-tool-permissions.png index 8b823a51fd1179228505fa636800d75e0b25dce9..5d8aac853ba8861cbe6172266cf65a39451c31e6 100644 GIT binary patch literal 73507 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 literal 81380 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 diff --git a/apps/docs/public/static/search/connect-account-menu.png b/apps/docs/public/static/search/connect-account-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..4147656f006c82992a655c3145599bcf5fc967e4 GIT binary patch literal 82707 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 F{|EmTc=G@N literal 0 HcmV?d00001 diff --git a/apps/sim/app/o/[organizationId]/components/organization-conversation.tsx b/apps/sim/app/o/[organizationId]/components/organization-conversation.tsx index 77f1b51cad9..50673e47748 100644 --- a/apps/sim/app/o/[organizationId]/components/organization-conversation.tsx +++ b/apps/sim/app/o/[organizationId]/components/organization-conversation.tsx @@ -5,10 +5,7 @@ import { toast } from '@sim/emcn' import { toRecord } from '@sim/utils/object' import { useQueryClient } from '@tanstack/react-query' import { useQueryStates } from 'nuqs' -import { - AssistantActionReviewPanel, - AssistantActionReviewProvider, -} from '@/components/assistant-actions' +import { AssistantActionReviewProvider } from '@/components/assistant-actions' import { requestJson } from '@/lib/api/client/request' import type { WorkspaceSearchFilters } from '@/lib/api/contracts/knowledge' import { getWorkspaceHostContextContract } from '@/lib/api/contracts/workspaces' @@ -368,6 +365,7 @@ function OrganizationConversationContent({ @@ -398,12 +396,7 @@ function OrganizationConversationContent({ onCancelQueueEdit={chat.cancelQueueEdit} userId={session?.user?.id} chatId={chat.resolvedChatId} - composer={ - <> - - {composer} - - } + composer={composer} onWorkspaceResourceSelect={requestMode !== 'assistant' ? selectResource : undefined} initialScrollBlocked={panel.initialScrollBlocked} /> diff --git a/apps/sim/app/o/[organizationId]/integrations/account-actions-menu.tsx b/apps/sim/app/o/[organizationId]/integrations/account-actions-menu.tsx new file mode 100644 index 00000000000..7defbf567e0 --- /dev/null +++ b/apps/sim/app/o/[organizationId]/integrations/account-actions-menu.tsx @@ -0,0 +1,129 @@ +'use client' + +import { useState } from 'react' +import { + Chip, + ChipConfirmModal, + ChipModalError, + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuItemLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@sim/emcn' +import { MoreHorizontal } from '@sim/emcn/icons' +import Link from 'next/link' +import type { ViewerSearchSourceAccount } from '@/lib/api/contracts/knowledge/connectors' +import { organizationRoutes } from '@/lib/navigation/paths' +import { useDisconnectPersonalOrganizationAccount } from '@/hooks/queries/organization-accounts' + +interface AccountActionsMenuProps { + organizationId: string + integrationName: string + accounts: ViewerSearchSourceAccount[] + onConnect?: () => void + onReconnect: (credentialId: string) => void + connectionPending: boolean + connecting: boolean + connectionReady: boolean + permissionAccountIds: readonly string[] + reconnectAccountIds: readonly string[] +} + +export function AccountActionsMenu({ + organizationId, + integrationName, + accounts, + onConnect, + onReconnect, + connectionPending, + connecting, + connectionReady, + permissionAccountIds, + reconnectAccountIds, +}: AccountActionsMenuProps) { + const disconnect = useDisconnectPersonalOrganizationAccount(organizationId) + const [selectedId, setSelectedId] = useState(null) + const selected = accounts.find((account) => account.credentialId === selectedId) + const permissionAccounts = accounts.filter((account) => + permissionAccountIds.includes(account.credentialId) + ) + const hasAccountActions = accounts.length > 0 + const pending = connectionPending || disconnect.isPending + if (!accounts.length && !onConnect) return null + + return ( + <> + + + + + + {permissionAccounts.map((account) => ( + + + 1 ? ` · ${account.displayName}` : ''}`} + /> + + + ))} + {accounts.map((account) => ( + onReconnect(account.credentialId)} + > + Reconnect{accounts.length > 1 ? ` · ${account.displayName}` : ''} + + ))} + {hasAccountActions && onConnect && } + {onConnect && ( + + {connecting ? 'Connecting' : accounts.length ? 'Add account' : 'Connect'} + + )} + {hasAccountActions && } + {accounts.map((account) => ( + { + disconnect.reset() + setSelectedId(account.credentialId) + }} + > + Disconnect{accounts.length > 1 ? ` · ${account.displayName}` : ''} + + ))} + + + { + if (!open && !disconnect.isPending) setSelectedId(null) + }} + title={`Disconnect ${integrationName}`} + text={`Disconnect ${selected?.displayName ?? integrationName} from all ${integrationName} connections in this organization. Workflows using this account will also lose access. You can reconnect later.`} + confirm={{ + label: 'Disconnect', + pendingLabel: 'Disconnecting', + pending: disconnect.isPending, + disabled: disconnect.isPending, + onClick: () => { + if (!selected || disconnect.isPending) return + disconnect.mutate(selected.credentialId, { onSuccess: () => setSelectedId(null) }) + }, + }} + > + {disconnect.error?.message} + + + ) +} diff --git a/apps/sim/app/o/[organizationId]/integrations/account-permissions-link.tsx b/apps/sim/app/o/[organizationId]/integrations/account-permissions-link.tsx deleted file mode 100644 index 97adc578b69..00000000000 --- a/apps/sim/app/o/[organizationId]/integrations/account-permissions-link.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { - Chip, - ChipLink, - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger, -} from '@sim/emcn' -import { ChevronDown } from '@sim/emcn/icons' -import Link from 'next/link' -import { organizationRoutes } from '@/lib/navigation/paths' - -interface AccountPermissionsLinkProps { - organizationId: string - accounts: readonly { credentialId: string; displayName: string }[] -} - -export function AccountPermissionsLink({ organizationId, accounts }: AccountPermissionsLinkProps) { - const routes = organizationRoutes(organizationId) - const [account] = accounts - if (!account) return null - if (accounts.length === 1) - return ( - - Tool permissions - - ) - return ( - - - Tool permissions - - - {accounts.map((entry) => ( - - - {entry.displayName} - - - ))} - - - ) -} diff --git a/apps/sim/app/o/[organizationId]/integrations/accounts/[credentialId]/tool-permissions.tsx b/apps/sim/app/o/[organizationId]/integrations/accounts/[credentialId]/tool-permissions.tsx index 014ec46f66a..792bc279324 100644 --- a/apps/sim/app/o/[organizationId]/integrations/accounts/[credentialId]/tool-permissions.tsx +++ b/apps/sim/app/o/[organizationId]/integrations/accounts/[credentialId]/tool-permissions.tsx @@ -1,23 +1,23 @@ 'use client' -import { Chip, ChipLink, ChipSelect, ChipSwitch, Tooltip, toast } from '@sim/emcn' -import { ArrowLeft, Ban, Check, Hand } from '@sim/emcn/icons' +import { Chip, ChipInput, ChipLink, ChipSelect, ChipSwitch, Tooltip, toast } from '@sim/emcn' +import { ArrowLeft, Search } from '@sim/emcn/icons' import type { AssistantToolPermissionsResponse, UpdateAssistantToolPermissionsBody, } from '@/lib/api/contracts/assistant-actions' import { resolveCredentialDisplay } from '@/lib/integrations/credential-display' import { organizationRoutes } from '@/lib/navigation/paths' +import { useOrganizationPageFilters } from '@/app/o/[organizationId]/components/organization-page' import { - OrganizationPage, - useOrganizationPageFilters, -} from '@/app/o/[organizationId]/components/organization-page' + CredentialDetailHeading, + CredentialDetailLayout, +} from '@/app/workspace/[workspaceId]/components/credential-detail' import { IntegrationTile } from '@/app/workspace/[workspaceId]/integrations/components/integrations-showcase' import { SettingsEmptyState, SettingsQueryErrorState, } from '@/app/workspace/[workspaceId]/settings/components/settings-empty-state' -import { SettingsResourceRow } from '@/app/workspace/[workspaceId]/settings/components/settings-resource-row' import { SettingsSection } from '@/app/workspace/[workspaceId]/settings/components/settings-section/settings-section' import { useAssistantToolPermissions, @@ -25,9 +25,9 @@ import { } from '@/hooks/queries/assistant-actions' const POLICY_OPTIONS = [ - { value: 'allow', label: 'Allow', icon: Check }, - { value: 'ask', label: 'Ask', icon: Hand }, - { value: 'block', label: 'Block', icon: Ban }, + { value: 'allow', label: 'Allow' }, + { value: 'ask', label: 'Ask' }, + { value: 'block', label: 'Block' }, ] as const const TOOL_GROUPS = [ { effect: 'read', label: 'Read-only tools' }, @@ -45,7 +45,7 @@ export function AccountToolPermissions({ }: AccountToolPermissionsProps) { const query = useAssistantToolPermissions(organizationId, credentialId) const update = useUpdateAssistantToolPermissions(organizationId, credentialId) - const { search } = useOrganizationPageFilters() + const { search, setSearch } = useOrganizationPageFilters() const data = query.data const display = data ? resolveCredentialDisplay({ ...data.account, type: 'managed_oauth' }) @@ -59,16 +59,9 @@ export function AccountToolPermissions({ } return ( - + Integrations } @@ -86,20 +79,15 @@ export function AccountToolPermissions({ ) : (

- ) : undefined } /> -

- Allow runs automatically. Ask pauses for your review. Block prevents use. -

{!data.canAutoApprove && (

Your organization requires approval before tools run. @@ -112,6 +100,15 @@ export function AccountToolPermissions({

)}
+ {data.tools.length > 0 && ( + setSearch(event.target.value)} + placeholder='Search tools' + aria-label='Search tools' + /> + )} {TOOL_GROUPS.map((group) => ( )} - + ) } diff --git a/apps/sim/app/o/[organizationId]/integrations/assistant-account-integrations.tsx b/apps/sim/app/o/[organizationId]/integrations/assistant-account-integrations.tsx index a1185a7afed..eb976ef4196 100644 --- a/apps/sim/app/o/[organizationId]/integrations/assistant-account-integrations.tsx +++ b/apps/sim/app/o/[organizationId]/integrations/assistant-account-integrations.tsx @@ -1,6 +1,6 @@ 'use client' -import { Chip, ChipSelect, toast } from '@sim/emcn' +import { ChipSelect, toast } from '@sim/emcn' import type { SearchIntegrationStatus } from '@/lib/api/contracts/knowledge/search-integrations' import type { OrganizationAccountsSettings } from '@/lib/api/contracts/organization-accounts' import { assistantSearchSourceForProvider } from '@/lib/assistant-actions/providers' @@ -8,8 +8,7 @@ import { getCredentialGroupProviderId, getCredentialGroupProviderService, } from '@/lib/credential-groups/providers' -import { AccountPermissionsLink } from '@/app/o/[organizationId]/integrations/account-permissions-link' -import { DisconnectAccountMenu } from '@/app/o/[organizationId]/integrations/disconnect-account-menu' +import { AccountActionsMenu } from '@/app/o/[organizationId]/integrations/account-actions-menu' import { assistantAccountOptions } from '@/app/o/[organizationId]/integrations/utils' import { IntegrationTile } from '@/app/workspace/[workspaceId]/integrations/components/integrations-showcase' import { SettingsResourceRow } from '@/app/workspace/[workspaceId]/settings/components/settings-resource-row' @@ -36,9 +35,9 @@ export function AssistantAccountIntegrations({ policies, admin = false, }: AssistantAccountIntegrationsProps) { - const ensure = useEnsureOrganizationAccounts() const connect = useConnectOrganizationAccount() const reconnect = useReconnectPersonalOrganizationAccount() + const ensure = useEnsureOrganizationAccounts() const onError = (error: Error) => toast.error(error.message) const group = data.credentialGroup const { providers, visible } = assistantAccountOptions(data, search) @@ -83,10 +82,6 @@ export function AssistantAccountIntegrations({ ) : undefined } > -

- Connect your own account to use these apps in Assistant. Write actions ask for review by - default. -

{visible.map((option) => { const service = getCredentialGroupProviderService(option.provider) @@ -120,33 +115,30 @@ export function AssistantAccountIntegrations({ : 'Connections unavailable' } trailing={ -
- - - {accounts - .filter((account) => account.status === 'needs_reauth') - .map((account) => ( - reconnect.mutate(account.credentialId, { onError })} - > - Reconnect{accounts.length > 1 ? ` ${account.displayName}` : ''} - - ))} - - connect.mutate({ organizationId, optionId: option.id }, { onError }) - } - > - {accounts.length ? 'Add account' : 'Connect'} - -
+ connect.mutate({ organizationId, optionId: option.id }, { onError }) + : undefined + } + onReconnect={(credentialId) => reconnect.mutate(credentialId, { onError })} + connectionPending={connect.isPending || reconnect.isPending} + connecting={ + connect.isPending && + 'optionId' in connect.variables && + connect.variables.optionId === option.id + } + connectionReady={ready} + reconnectAccountIds={ready ? accounts.map((account) => account.credentialId) : []} + permissionAccountIds={ + data.assistantProviders.includes(option.provider) + ? accounts.map((account) => account.credentialId) + : [] + } + /> } /> ) diff --git a/apps/sim/app/o/[organizationId]/integrations/disconnect-account-menu.tsx b/apps/sim/app/o/[organizationId]/integrations/disconnect-account-menu.tsx deleted file mode 100644 index 09ab845a6fb..00000000000 --- a/apps/sim/app/o/[organizationId]/integrations/disconnect-account-menu.tsx +++ /dev/null @@ -1,75 +0,0 @@ -'use client' - -import { useState } from 'react' -import { ChipConfirmModal, ChipModalError } from '@sim/emcn' -import type { ViewerSearchSourceAccount } from '@/lib/api/contracts/knowledge/connectors' -import { - type RowAction, - RowActionsMenu, -} from '@/app/workspace/[workspaceId]/settings/components/row-actions-menu' -import { useDisconnectPersonalOrganizationAccount } from '@/hooks/queries/organization-accounts' - -interface DisconnectAccountMenuProps { - organizationId: string - integrationName: string - accounts: ViewerSearchSourceAccount[] - accountLabels?: ReadonlyMap - actions?: RowAction[] -} - -/** Disconnect is independent of provider availability, reconnect state, and indexing activity. */ -export function DisconnectAccountMenu({ - organizationId, - integrationName, - accounts, - accountLabels, - actions = [], -}: DisconnectAccountMenuProps) { - const disconnect = useDisconnectPersonalOrganizationAccount(organizationId) - const [selectedId, setSelectedId] = useState(null) - const selected = accounts.find((account) => account.credentialId === selectedId) - const accountLabel = (account: ViewerSearchSourceAccount) => - accountLabels?.get(account.credentialId) ?? account.displayName - if (!accounts.length && !actions.length) return null - - return ( - <> - ({ - label: accounts.length === 1 ? 'Disconnect' : `Disconnect ${accountLabel(account)}`, - tooltip: accounts.length > 1 ? `Disconnect ${accountLabel(account)}` : undefined, - destructive: true, - disabled: disconnect.isPending, - onSelect: () => { - disconnect.reset() - setSelectedId(account.credentialId) - }, - })), - ]} - /> - { - if (!open && !disconnect.isPending) setSelectedId(null) - }} - title={`Disconnect ${integrationName}`} - text={`Disconnect ${selected ? accountLabel(selected) : integrationName} from all ${integrationName} connections in this organization. Workflows using this account will also lose access. You can reconnect later.`} - confirm={{ - label: 'Disconnect', - pendingLabel: 'Disconnecting', - pending: disconnect.isPending, - disabled: disconnect.isPending, - onClick: () => { - if (!selected || disconnect.isPending) return - disconnect.mutate(selected.credentialId, { onSuccess: () => setSelectedId(null) }) - }, - }} - > - {disconnect.error?.message} - - - ) -} diff --git a/apps/sim/app/o/[organizationId]/integrations/live-member-integrations.test.tsx b/apps/sim/app/o/[organizationId]/integrations/live-member-integrations.test.tsx index 33f5cd5f74f..89f76f6ebaa 100644 --- a/apps/sim/app/o/[organizationId]/integrations/live-member-integrations.test.tsx +++ b/apps/sim/app/o/[organizationId]/integrations/live-member-integrations.test.tsx @@ -25,11 +25,6 @@ vi.mock('@/hooks/queries/search-integrations', () => ({ }), })) vi.mock('@/app/o/[organizationId]/providers/organization-provider', () => organizationProviderMock) -vi.mock('@/app/o/[organizationId]/integrations/disconnect-account-menu', () => ({ - DisconnectAccountMenu: ({ accounts }: { accounts: { displayName: string }[] }) => ( - {accounts.map((account) => account.displayName).join(', ')} - ), -})) vi.mock('@/app/workspace/[workspaceId]/integrations/components/integrations-showcase', () => ({ IntegrationTile: () => null, })) @@ -95,8 +90,13 @@ it('never presents another MCP provider as a Coda connection', async () => { }) await act(async () => root.render()) expect(container.textContent).not.toContain('Other private account') - const connect = [...container.querySelectorAll('button')].find( - (button) => button.textContent === 'Connect' + const menu = container.querySelector('[aria-label="Coda integration actions"]') + if (!menu) throw new Error('Missing Coda actions menu') + await act(async () => + menu.dispatchEvent(new MouseEvent('pointerdown', { bubbles: true, button: 0 })) + ) + const connect = [...document.querySelectorAll('[role="menuitem"]')].find( + (item) => item.textContent === 'Connect' ) if (!connect) throw new Error('Missing Coda connection control') await act(async () => connect.click()) diff --git a/apps/sim/app/o/[organizationId]/integrations/live-member-integrations.tsx b/apps/sim/app/o/[organizationId]/integrations/live-member-integrations.tsx index 4da8866cd13..6297deb3a6c 100644 --- a/apps/sim/app/o/[organizationId]/integrations/live-member-integrations.tsx +++ b/apps/sim/app/o/[organizationId]/integrations/live-member-integrations.tsx @@ -1,16 +1,16 @@ 'use client' -import { Chip, toast } from '@sim/emcn' +import { toast } from '@sim/emcn' +import { findCredentialGroupProviderFromProviderId } from '@/lib/credential-groups/providers' import { hasSlackSearchUserScopes } from '@/lib/credential-groups/slack-managed-user-scopes' import { LIVE_SEARCH_SCOPE_FIELDS } from '@/lib/sim-search/live/policy-schema' -import { liveSearchProviderForCredential } from '@/lib/sim-search/live/provider-catalog' import { LIVE_SEARCH_SOURCE_TYPES, liveSearchMcpConnector, + liveSearchMemberAccountProvider, } from '@/lib/sim-search/live/source-catalog' -import { AccountPermissionsLink } from '@/app/o/[organizationId]/integrations/account-permissions-link' +import { AccountActionsMenu } from '@/app/o/[organizationId]/integrations/account-actions-menu' import { AssistantAccountIntegrations } from '@/app/o/[organizationId]/integrations/assistant-account-integrations' -import { DisconnectAccountMenu } from '@/app/o/[organizationId]/integrations/disconnect-account-menu' import { assistantAccountOptions } from '@/app/o/[organizationId]/integrations/utils' import { GenericSecretSourceRow } from '@/app/o/[organizationId]/settings/components/integrations/generic-secret-source' import { IntegrationTile } from '@/app/workspace/[workspaceId]/integrations/components/integrations-showcase' @@ -34,12 +34,12 @@ interface LiveMemberIntegrationsProps { /** Personal OAuth apps and administrator-managed GitLab have distinct connection states. */ export function LiveMemberIntegrations({ organizationId, search }: LiveMemberIntegrationsProps) { - const inventory = useOrganizationAccounts(organizationId) - const policies = useSearchIntegrations(organizationId) - const secrets = useOrganizationSecretSource(organizationId) const connect = useConnectOrganizationAccount() const reconnect = useReconnectPersonalOrganizationAccount() const onError = (error: Error) => toast.error(error.message) + const inventory = useOrganizationAccounts(organizationId) + const policies = useSearchIntegrations(organizationId) + const secrets = useOrganizationSecretSource(organizationId) if (inventory.error) return ( [policy.connectorType, policy])) + const permissionAccountIds = (data.viewerAccounts ?? []) + .filter((account) => { + const provider = findCredentialGroupProviderFromProviderId(account.providerId) + return provider !== null && data.assistantProviders.includes(provider) + }) + .map((account) => account.credentialId) const group = data.credentialGroup const mcpProviders = new Map( group?.mcpServers.map((server) => [server.id, server.managedConnectorId]) @@ -63,12 +69,14 @@ export function LiveMemberIntegrations({ organizationId, search }: LiveMemberInt (data.viewerMcpAccounts ?? []).filter( (account) => mcpProviders.get(account.mcpServerId) === provider ) - const accountsForProvider = (provider: string) => - liveSearchMcpConnector(provider) - ? mcpAccounts(provider) - : (data.viewerAccounts ?? []).filter( - (account) => liveSearchProviderForCredential(account.providerId) === provider - ) + const accountsForProvider = (provider: string) => { + if (liveSearchMcpConnector(provider)) return mcpAccounts(provider) + const memberProvider = + provider === 'slack' ? 'slack' : liveSearchMemberAccountProvider(provider) + return (data.viewerAccounts ?? []).filter( + (account) => findCredentialGroupProviderFromProviderId(account.providerId) === memberProvider + ) + } const available = LIVE_SEARCH_SOURCE_TYPES.filter( ([provider]) => (approvals.get(provider)?.available !== false || accountsForProvider(provider).length > 0) && @@ -76,11 +84,7 @@ export function LiveMemberIntegrations({ organizationId, search }: LiveMemberInt ((provider !== 'hubspot' && provider !== 'zoom') || data.availableMcpConnectors.includes(provider) || mcpAccounts(provider).length > 0) && - (approvals.get(provider)?.approved || - data.viewerAccounts?.some( - (account) => liveSearchProviderForCredential(account.providerId) === provider - ) || - mcpAccounts(provider).length) + (approvals.get(provider)?.approved || accountsForProvider(provider).length > 0) ) const query = search.trim().toLowerCase() const visible = available.filter(([provider, meta]) => @@ -90,7 +94,6 @@ export function LiveMemberIntegrations({ organizationId, search }: LiveMemberInt .toLowerCase() .includes(query) ) - const pending = connect.isPending || reconnect.isPending const secretSource = secrets.data?.source const showSecrets = secretSource && 'generic secrets'.includes(query) return ( @@ -140,32 +143,54 @@ export function LiveMemberIntegrations({ organizationId, search }: LiveMemberInt } /> ) - const option = group?.options.find( + const memberProvider = + provider === 'slack' ? 'slack' : liveSearchMemberAccountProvider(provider) + const accounts = accountsForProvider(provider) + const options = + group?.options.filter( + (option) => + option.provider === memberProvider && + option.status === 'active' && + option.configurationStatus === 'ready' && + (provider !== 'slack' || + (option.provider === 'slack' && hasSlackSearchUserScopes(option.requiredScopes))) + ) ?? [] + const servers = liveSearchMcpConnector(provider) + ? (group?.mcpServers.filter( + (server) => server.managedConnectorId === provider && server.enabled + ) ?? []) + : [] + const option = options.find( (option) => - liveSearchProviderForCredential(option.provider) === provider && - option.status === 'active' + !accounts.some((account) => 'optionId' in account && account.optionId === option.id) ) - const server = liveSearchMcpConnector(provider) - ? group?.mcpServers.find( - (server) => server.managedConnectorId === provider && server.enabled + const server = servers.find( + (server) => + !accounts.some( + (account) => 'mcpServerId' in account && account.mcpServerId === server.id ) - : undefined + ) const connectionTarget = server ? { mcpServerId: server.id } : option ? { optionId: option.id } : undefined - const accounts = accountsForProvider(provider) const ready = approval?.available !== false && group?.status === 'active' && - Boolean(option || server) && + (options.length > 0 || servers.length > 0) && approved && - (!option || option.configurationStatus === 'ready') && - (provider !== 'slack' || - (option?.provider === 'slack' && hasSlackSearchUserScopes(option.requiredScopes))) && ((provider !== 'hubspot' && provider !== 'zoom') || data.availableMcpConnectors.includes(provider)) + const reconnectAccountIds = ready + ? accounts + .filter((account) => + 'optionId' in account + ? options.some((option) => option.id === account.optionId) + : servers.some((server) => server.id === account.mcpServerId) + ) + .map((account) => account.credentialId) + : [] const scope = approval?.policy?.accessMode === 'service_account' ? 'Selected resources you can access' @@ -202,54 +227,28 @@ export function LiveMemberIntegrations({ organizationId, search }: LiveMemberInt title={name} description={description} trailing={ -
- {!liveSearchMcpConnector(provider) && ( - - )} - - {accounts - .filter((account) => account.status === 'needs_reauth') - .map((account) => ( - reconnect.mutate(account.credentialId, { onError })} - > - Reconnect{accounts.length > 1 ? ` ${account.displayName}` : ''} - - ))} - {approved && (option || server) && ( - { - if (!connectionTarget) return - connect.mutate( - { - organizationId, - ...connectionTarget, - }, - { onError } - ) - }} - > - {pending && - connect.variables?.organizationId === organizationId && - (('optionId' in connect.variables && - connect.variables.optionId === option?.id) || - ('mcpServerId' in connect.variables && - connect.variables.mcpServerId === server?.id)) - ? 'Connecting' - : accounts.length - ? 'Add account' - : 'Connect'} - - )} -
+ connect.mutate({ organizationId, ...connectionTarget }, { onError }) + : undefined + } + onReconnect={(credentialId) => reconnect.mutate(credentialId, { onError })} + connectionPending={connect.isPending || reconnect.isPending} + connecting={ + connect.isPending && + (('optionId' in connect.variables && + connect.variables.optionId === option?.id) || + ('mcpServerId' in connect.variables && + connect.variables.mcpServerId === server?.id)) + } + connectionReady={ready} + reconnectAccountIds={reconnectAccountIds} + permissionAccountIds={permissionAccountIds} + /> } /> ) diff --git a/apps/sim/app/o/[organizationId]/integrations/utils.ts b/apps/sim/app/o/[organizationId]/integrations/utils.ts index 395027fac2c..061bf684808 100644 --- a/apps/sim/app/o/[organizationId]/integrations/utils.ts +++ b/apps/sim/app/o/[organizationId]/integrations/utils.ts @@ -1,26 +1,27 @@ import type { OrganizationAccountsSettings } from '@/lib/api/contracts/organization-accounts' +import { getCredentialGroupProviderService } from '@/lib/credential-groups/providers' import { - findCredentialGroupProviderFromProviderId, - getCredentialGroupProviderService, -} from '@/lib/credential-groups/providers' -import { SEARCH_CONNECTORS } from '@/lib/sim-search/connectors' + LIVE_SEARCH_SOURCE_TYPES, + liveSearchMemberAccountProvider, +} from '@/lib/sim-search/live/source-catalog' + +const SEARCH_ACCOUNT_PROVIDERS = new Set([ + 'slack', + ...LIVE_SEARCH_SOURCE_TYPES.flatMap(([source]) => { + const provider = liveSearchMemberAccountProvider(source) + return provider ? [provider] : [] + }), +]) export function assistantAccountOptions(data: OrganizationAccountsSettings, search: string) { const providers = data.assistantProviders.filter( - (provider) => - provider !== 'slack' && - !SEARCH_CONNECTORS.some( - (connector) => findCredentialGroupProviderFromProviderId(connector.providerId) === provider - ) + (provider) => !SEARCH_ACCOUNT_PROVIDERS.has(provider) ) const ownedOptions = new Set(data.viewerAccounts?.map((account) => account.optionId)) const configured = data.credentialGroup?.options.filter( (option) => - !SEARCH_CONNECTORS.some( - (connector) => - findCredentialGroupProviderFromProviderId(connector.providerId) === option.provider - ) && + !SEARCH_ACCOUNT_PROVIDERS.has(option.provider) && ((option.status === 'active' && providers.includes(option.provider)) || ownedOptions.has(option.id)) ) ?? [] diff --git a/apps/sim/app/workspace/[workspaceId]/home/components/message-content/components/agent-group/tool-call-item.tsx b/apps/sim/app/workspace/[workspaceId]/home/components/message-content/components/agent-group/tool-call-item.tsx index 9e3f9bb2b30..2790d36178f 100644 --- a/apps/sim/app/workspace/[workspaceId]/home/components/message-content/components/agent-group/tool-call-item.tsx +++ b/apps/sim/app/workspace/[workspaceId]/home/components/message-content/components/agent-group/tool-call-item.tsx @@ -147,7 +147,7 @@ export function ToolCallItem({ /> ) return getToolMetadata(toolName)?.assistant ? ( - + ) : ( fallback ) diff --git a/apps/sim/app/workspace/[workspaceId]/home/components/mothership-chat/mothership-chat.tsx b/apps/sim/app/workspace/[workspaceId]/home/components/mothership-chat/mothership-chat.tsx index 35b20311bfb..5f258f546a4 100644 --- a/apps/sim/app/workspace/[workspaceId]/home/components/mothership-chat/mothership-chat.tsx +++ b/apps/sim/app/workspace/[workspaceId]/home/components/mothership-chat/mothership-chat.tsx @@ -22,6 +22,7 @@ import { } from '@sim/emcn' import { useQueryClient } from '@tanstack/react-query' import { defaultRangeExtractor, type Range, useVirtualizer } from '@tanstack/react-virtual' +import { AssistantActionReviewMessage } from '@/components/assistant-actions' import { ComputerUseActivity } from '@/components/computer-use/activity' import { SMOOTH_CHASE_RATE } from '@/lib/core/utils/smooth-bottom-chase' import type { TurnOrigin } from '@/lib/mothership/generated/protocol' @@ -937,39 +938,43 @@ export function MothershipChat({ className='absolute left-0 w-full' style={{ top: virtualItem.start }} > - {msg.role === 'user' ? ( - interactionPairing.hiddenUserByIndex[index] ? null : msg.origin ? ( - + + {msg.role === 'user' ? ( + interactionPairing.hiddenUserByIndex[index] ? null : msg.origin ? ( + + ) : ( + + ) ) : ( - - ) - ) : ( - - )} + )} +
) })} diff --git a/apps/sim/components/assistant-actions/index.ts b/apps/sim/components/assistant-actions/index.ts index 3023c6d186c..4d5b0b90c0f 100644 --- a/apps/sim/components/assistant-actions/index.ts +++ b/apps/sim/components/assistant-actions/index.ts @@ -1,5 +1,5 @@ export { - AssistantActionReviewPanel, + AssistantActionReviewMessage, AssistantActionReviewProvider, AssistantActionReviewStatus, } from './review' diff --git a/apps/sim/components/assistant-actions/review.tsx b/apps/sim/components/assistant-actions/review.tsx index a6676140602..aa7f7bd4e57 100644 --- a/apps/sim/components/assistant-actions/review.tsx +++ b/apps/sim/components/assistant-actions/review.tsx @@ -1,37 +1,64 @@ 'use client' -import { createContext, type ReactNode, useContext, useState } from 'react' import { - Chip, - ChipModal, - ChipModalBody, - ChipModalField, - ChipModalFooter, - ChipModalHeader, - OverflowText, - toast, -} from '@sim/emcn' -import { Hand } from '@sim/emcn/icons' + createContext, + type ReactNode, + useContext, + useEffect, + useMemo, + useRef, + useState, +} from 'react' +import { Chip, ChipInput, ChipTextarea, cn } from '@sim/emcn' +import { ShieldCheck } from '@sim/emcn/icons' import { getErrorMessage } from '@sim/utils/errors' import { omit } from '@sim/utils/object' +import { ActivityStatus } from '@/components/ui/activity-status' import type { AssistantActionsResponse } from '@/lib/api/contracts/assistant-actions' -import { - ASSISTANT_ACTION_MAX_BYTES, - ASSISTANT_REVIEW_FIELD_MAX_CHARS, -} from '@/lib/assistant-actions/limits' +import { ASSISTANT_REVIEW_FIELD_MAX_CHARS } from '@/lib/assistant-actions/limits' +import { resolveCredentialDisplay } from '@/lib/integrations/credential-display' +import { getLiveAssistantMessageId } from '@/lib/mothership/chat/live-message-id' +import { InteractionCard } from '@/app/workspace/[workspaceId]/home/components/message-content/components/interaction-card' +import { type ChatMessage, ToolCallStatus } from '@/app/workspace/[workspaceId]/home/types' +import { BrandIcon } from '@/blocks/brand-icon' import { useAssistantActionReview, useDecideAssistantAction, } from '@/hooks/queries/assistant-actions' +import { getToolMetadata } from '@/tools/metadata' type ReviewAction = AssistantActionsResponse['actions'][number] type ReviewEdits = Record }> +type ReviewErrors = Record + +interface ReviewDrafts { + runId: string | null + edits: ReviewEdits + errors: ReviewErrors +} -const reviewContext = createContext<{ open: () => void; panel: ReactNode } | null>(null) +interface ReviewContextValue { + query: ReturnType + actions: ReviewAction[] + byId: ReadonlyMap + assistantMessageId: string | null + recoveryMessageId: string | null + recoveryActions: ReviewAction[] + hasApprovalRows: boolean + drafts: ReviewDrafts + submitting: boolean + edit: (action: ReviewAction, name: string, value: string) => void + submit: (actions: ReviewAction[], decision: 'allow' | 'skip') => Promise +} + +const reviewContext = createContext(null) +const reviewMessageContext = createContext(null) +const EMPTY_ACTIONS: ReviewAction[] = [] interface AssistantActionReviewProviderProps { organizationId: string chatId?: string + messages: ChatMessage[] active: boolean enabled: boolean children: ReactNode @@ -40,215 +67,390 @@ interface AssistantActionReviewProviderProps { export function AssistantActionReviewProvider({ organizationId, chatId, + messages, active, enabled, children, }: AssistantActionReviewProviderProps) { + const inFlight = useRef(null) const query = useAssistantActionReview(organizationId, chatId ?? '', active, enabled) const mutation = useDecideAssistantAction(organizationId, chatId ?? '') - const [open, setOpen] = useState(false) const [submitting, setSubmitting] = useState(false) - const [edits, setEdits] = useState({}) - const actions = query.data?.actions ?? [] + const [drafts, setDrafts] = useState({ runId: null, edits: {}, errors: {} }) + const actions = query.data?.actions ?? EMPTY_ACTIONS + const runId = query.data?.runId ?? null + const streamId = query.data?.streamId ?? null + const byId = useMemo( + () => new Map(actions.map((action) => [action.toolCallId, action])), + [actions] + ) + const { assistantMessageId, recoveryMessageId, recoveryActions, hasApprovalRows } = + useMemo(() => { + if (!streamId) { + const hasApprovalRows = messages.some((message) => + message.contentBlocks?.some( + ({ toolCall }) => + toolCall?.status === ToolCallStatus.awaiting_approval && + getToolMetadata(toolCall.name)?.assistant + ) + ) + return { + assistantMessageId: null, + recoveryMessageId: hasApprovalRows ? null : (messages.at(-1)?.id ?? null), + recoveryActions: EMPTY_ACTIONS, + hasApprovalRows, + } + } + const messageId = getLiveAssistantMessageId(streamId) + const assistant = messages.find((message) => message.id === messageId) + const representedIds = new Set( + assistant?.contentBlocks?.flatMap(({ toolCall }) => + toolCall?.status === ToolCallStatus.awaiting_approval && + getToolMetadata(toolCall.name)?.assistant + ? [toolCall.id] + : [] + ) + ) + return { + assistantMessageId: messageId, + recoveryMessageId: assistant + ? messageId + : (messages.find((message) => message.role === 'user' && message.id === streamId)?.id ?? + null), + recoveryActions: actions.filter((action) => !representedIds.has(action.toolCallId)), + hasApprovalRows: representedIds.size > 0, + } + }, [actions, messages, streamId]) + + useEffect(() => () => inFlight.current?.abort(), [runId]) + + const edit = (action: ReviewAction, name: string, value: string) => { + setDrafts((current) => { + const edits = current.runId === action.runId ? current.edits : {} + const draft = edits[action.toolCallId] + return { + runId: action.runId, + errors: current.runId === action.runId ? omit(current.errors, [action.toolCallId]) : {}, + edits: { + ...edits, + [action.toolCallId]: { + proposalVersion: action.proposalVersion, + fields: { + ...(draft?.proposalVersion === action.proposalVersion ? draft.fields : {}), + [name]: value, + }, + }, + }, + } + }) + } const submit = async (selected: ReviewAction[], decision: 'allow' | 'skip') => { - if (submitting) return + if (inFlight.current || query.isError || !selected.length) return + const controller = new AbortController() + inFlight.current = controller setSubmitting(true) + const snapshot = selected.map((action) => { + const draft = drafts.runId === action.runId ? drafts.edits[action.toolCallId] : undefined + return { + action, + fields: draft?.proposalVersion === action.proposalVersion ? { ...draft.fields } : {}, + } + }) + setDrafts((current) => ({ + runId, + edits: current.runId === runId ? current.edits : {}, + errors: + current.runId === runId + ? omit( + current.errors, + selected.map((action) => action.toolCallId) + ) + : {}, + })) try { - for (const action of selected) { - const draft = edits[action.toolCallId] + for (const { action, fields } of snapshot) { + if (controller.signal.aborted) break try { await mutation.mutateAsync({ toolCallId: action.toolCallId, runId: action.runId, proposalVersion: action.proposalVersion, decision, - ...(decision === 'allow' && draft?.proposalVersion === action.proposalVersion - ? { edits: draft.fields } - : {}), + signal: controller.signal, + ...(decision === 'allow' ? { edits: fields } : {}), }) - setEdits((current) => omit(current, [action.toolCallId])) + setDrafts((current) => + current.runId === action.runId + ? { ...current, edits: omit(current.edits, [action.toolCallId]) } + : current + ) } catch (error) { - toast.error(getErrorMessage(error, 'Could not save this review')) + if (controller.signal.aborted) break + setDrafts((current) => + current.runId === action.runId + ? { + ...current, + errors: { + ...current.errors, + [action.toolCallId]: { + proposalVersion: action.proposalVersion, + message: getErrorMessage(error, 'Could not save this review'), + }, + }, + } + : current + ) } } } finally { - setSubmitting(false) + if (inFlight.current === controller) { + inFlight.current = null + setSubmitting(false) + } } } - const panel = - !enabled || (!actions.length && !query.error) ? null : ( -
-
- - - {actions.length - ? `${actions.length} ${actions.length === 1 ? 'action' : 'actions'} to review` - : 'Action review unavailable'} - - (actions.length ? setOpen(true) : void query.refetch())}> - {actions.length ? 'Review' : 'Retry'} - -
- {actions.slice(0, 3).map((action) => ( - field.target && field.value)?.value ?? - action.account?.displayName ?? - 'Account unavailable' - }`} - className='text-[var(--text-muted)] text-small' - /> - ))} - {actions.length > 3 && ( -

And {actions.length - 3} more

- )} -
- ) + return ( - setOpen(true), panel } : null}> + {children} - - setOpen(false)}> - Review actions - - -

- Review each action before it runs. Allow and Cancel apply only to these proposals. Each - action has a {ASSISTANT_ACTION_MAX_BYTES / 1024} KB total limit across all fields. -

- {actions.map((action) => ( +
+ ) +} + +interface AssistantActionReviewMessageProps { + messageId: string + children: ReactNode +} + +export function AssistantActionReviewMessage({ + messageId, + children, +}: AssistantActionReviewMessageProps) { + const review = useContext(reviewContext) + return ( + + {children} + {review?.recoveryMessageId === messageId && + !review.hasApprovalRows && + review.recoveryActions.length === 0 && + review.query.isError && ( +
+ +
+ )} + {review?.recoveryMessageId === messageId && review.recoveryActions.length > 0 && ( +
+ {review.recoveryActions.map((action) => ( - setEdits((current) => ({ - ...current, - [action.toolCallId]: { - proposalVersion: action.proposalVersion, - fields: { - ...(current[action.toolCallId]?.proposalVersion === action.proposalVersion - ? current[action.toolCallId].fields - : {}), - [name]: value, - }, - }, - })) - } - onDecide={(decision) => void submit([action], decision)} + review={review} /> ))} - {!actions.length && ( -

- {query.error - ? 'Could not load the current actions. Close this review and retry.' - : 'No actions are waiting for review.'} -

- )} - {query.data?.nextCursor !== null && query.data?.nextCursor !== undefined && ( -

- More actions are waiting. Review these first. -

- )} - - setOpen(false)} - cancelLabel='Close' - defaultAction='none' - primaryAction={{ - label: actions.length > 1 ? `Allow ${actions.length} shown` : 'Allow', - onClick: () => void submit(actions, 'allow'), - disabled: submitting || !actions.length || actions.some((action) => !action.account), - }} - /> - - +
+ )} +
+ ) +} + +interface AssistantActionReviewStatusProps { + toolCallId: string + title: string + fallback: ReactNode +} + +export function AssistantActionReviewStatus({ + toolCallId, + title, + fallback, +}: AssistantActionReviewStatusProps) { + const review = useContext(reviewContext) + const messageId = useContext(reviewMessageContext) + if (!review) return fallback + if (review.query.isPending) return + if (messageId === review.assistantMessageId) { + const action = review.byId.get(toolCallId) + if (action) return + if (!review.query.isError && review.query.data?.nextCursor != null) + return + } + if (review.query.isError) + return + return +} + +interface ReviewAvailabilityProps { + label: string + review?: ReviewContextValue +} + +function ReviewAvailability({ label, review }: ReviewAvailabilityProps) { + return ( +
+ } /> + {review && ( + void review.query.refetch()}> + Retry + + )} +
) } interface ActionReviewProps { action: ReviewAction - edits: Record - disabled: boolean - onEdit: (name: string, value: string) => void - onDecide: (decision: 'allow' | 'skip') => void + review: ReviewContextValue } -function ActionReview({ action, edits, disabled, onEdit, onDecide }: ActionReviewProps) { +function ActionReview({ action, review }: ActionReviewProps) { + const draft = + review.drafts.runId === action.runId ? review.drafts.edits[action.toolCallId] : undefined + const edits = draft?.proposalVersion === action.proposalVersion ? draft.fields : {} + const error = + review.drafts.runId === action.runId ? review.drafts.errors[action.toolCallId] : undefined + const disabled = review.submitting || review.query.isError + const display = action.account + ? resolveCredentialDisplay({ ...action.account, type: 'managed_oauth' }) + : undefined + const firstInBatch = + review.actions.length > 1 && review.actions[0]?.toolCallId === action.toolCallId return ( -
- + + {display?.icon ? ( + + ) : ( + + )} + {action.name} + + } > -
- onDecide('allow')}> - Allow - - onDecide('skip')}> - Cancel - +
+

+ {action.account?.displayName ?? 'Account unavailable'} +

+
+ {action.fields + .filter((field) => field.value || field.editable) + .map((field) => ( + review.edit(action, field.name, value)} + /> + ))} +
+ {!action.account?.active && ( +

+ This account is no longer available. +

+ )} + {review.query.isError && ( + + )} + {error?.proposalVersion === action.proposalVersion && ( +

+ {error.message} +

+ )} +
+ void review.submit([action], 'allow')} + > + Allow + + void review.submit([action], 'skip')}> + Cancel + +
+ {firstInBatch && ( +
+ !entry.account?.active)} + onClick={() => void review.submit(review.actions, 'allow')} + > + Allow {review.actions.length} shown + + {review.query.data?.nextCursor != null && ( + + More actions are waiting. + + )} +
+ )}
- - {action.fields - .filter((field) => field.value || field.editable) - .map((field) => - field.editable ? ( - onEdit(field.name, value)} - rows={field.format === 'multiline' ? 4 : 2} - /> - ) : ( - - ) - )} +
) } -export function AssistantActionReviewPanel() { - return useContext(reviewContext)?.panel ?? null -} - -interface AssistantActionReviewStatusProps { - title: string - fallback: ReactNode +interface ActionReviewFieldProps { + field: ReviewAction['fields'][number] + actionId: string + value: string + disabled: boolean + onEdit: (value: string) => void } -export function AssistantActionReviewStatus({ title, fallback }: AssistantActionReviewStatusProps) { - const review = useContext(reviewContext) - return review ? ( - - {title} · Review - +function ActionReviewField({ field, actionId, value, disabled, onEdit }: ActionReviewFieldProps) { + const id = `assistant-action-${actionId}-${field.name}` + return field.editable ? ( +
+ + {field.format === 'text' ? ( + onEdit(event.target.value)} + /> + ) : ( + onEdit(event.target.value)} + /> + )} +
) : ( - fallback +
+
{field.label}
+
+ {value} +
+
) } diff --git a/apps/sim/hooks/queries/assistant-actions.ts b/apps/sim/hooks/queries/assistant-actions.ts index f74fb4b7836..72054f3accb 100644 --- a/apps/sim/hooks/queries/assistant-actions.ts +++ b/apps/sim/hooks/queries/assistant-actions.ts @@ -59,10 +59,15 @@ export function useAssistantActionReview( export function useDecideAssistantAction(organizationId: string, chatId: string) { const client = useQueryClient() return useMutation({ - mutationFn: ({ toolCallId, ...body }: AssistantActionDecisionBody & { toolCallId: string }) => + mutationFn: ({ + toolCallId, + signal, + ...body + }: AssistantActionDecisionBody & { toolCallId: string; signal?: AbortSignal }) => requestJson(decideAssistantActionContract, { params: { id: organizationId, chatId, toolCallId }, body, + signal, }), onSettled: () => client.invalidateQueries({ queryKey: assistantActionKeys.review(organizationId, chatId) }), diff --git a/apps/sim/lib/api/contracts/assistant-actions.ts b/apps/sim/lib/api/contracts/assistant-actions.ts index 4a0a368d71c..112a7518a75 100644 --- a/apps/sim/lib/api/contracts/assistant-actions.ts +++ b/apps/sim/lib/api/contracts/assistant-actions.ts @@ -90,6 +90,8 @@ export const listAssistantActionsContract = defineRouteContract({ response: { mode: 'json', schema: z.object({ + runId: z.uuid().nullable(), + streamId: z.string().min(1).nullable(), actions: z .array( z.object({ @@ -104,6 +106,7 @@ export const listAssistantActionsContract = defineRouteContract({ credentialId: z.string().max(128), displayName: z.string().max(512), providerId: z.string().max(128), + active: z.boolean(), }) .nullable(), fields: z diff --git a/apps/sim/lib/assistant-actions/application/context.ts b/apps/sim/lib/assistant-actions/application/context.ts index e4d19d21dfd..c25ec4b2958 100644 --- a/apps/sim/lib/assistant-actions/application/context.ts +++ b/apps/sim/lib/assistant-actions/application/context.ts @@ -45,6 +45,7 @@ export async function loadAssistantAccountPolicyContext( return { account, tools, canAutoApprove } } +/** A transaction retains the chat lock until its decision or claim commits, before locking the run. */ export async function requireAssistantRun( principal: Principal, input: { organizationId: string; runId: string; chatId?: string }, @@ -61,6 +62,9 @@ export async function requireAssistantRun( throw new OrchestrationError('forbidden', 'Assistant actions require a private conversation.') const [run] = await executor .select({ + runId: copilotRuns.id, + streamId: copilotRuns.streamId, + currentStreamId: copilotChats.conversationId, config: copilotChats.config, version: copilotRuns.toolExecutionVersion, closedAt: copilotRuns.toolAdmissionClosedAt, @@ -80,14 +84,20 @@ export async function requireAssistantRun( ) ) .limit(1) + .for('share', { of: copilotChats }) if ( !run || toRecord(run.config).conversationMode !== 'assistant' || run.version !== SIM_TOOL_EXECUTION_VERSION ) throw new OrchestrationError('not_found', 'Assistant conversation is unavailable.') - if (run.closedAt || TERMINAL_RUN_STATUSES.includes(run.status)) + if ( + run.currentStreamId !== run.streamId || + run.closedAt || + TERMINAL_RUN_STATUSES.includes(run.status) + ) throw new OrchestrationError('conflict', 'This conversation is no longer accepting actions.') + return { runId: run.runId, streamId: run.streamId } } export async function resolveAssistantActionPolicy( diff --git a/apps/sim/lib/assistant-actions/application/review.ts b/apps/sim/lib/assistant-actions/application/review.ts index 9f572ba4d82..97775bfaa65 100644 --- a/apps/sim/lib/assistant-actions/application/review.ts +++ b/apps/sim/lib/assistant-actions/application/review.ts @@ -1,9 +1,9 @@ import { isDeepStrictEqual } from 'node:util' import { AuditAction, AuditResourceType } from '@sim/audit' import { db } from '@sim/db' -import { copilotAsyncToolCalls, copilotRuns } from '@sim/db/schema' +import { copilotAsyncToolCalls, copilotChats, copilotRuns } from '@sim/db/schema' import { toRecord } from '@sim/utils/object' -import { and, asc, desc, eq, gt, isNotNull, isNull, notInArray } from 'drizzle-orm' +import { and, asc, desc, eq, gt, gte, isNotNull, isNull, notInArray, or } from 'drizzle-orm' import { lockAssistantActionScope, requireAssistantRun, @@ -23,6 +23,7 @@ import { } from '@/lib/core/application/authorized-organization-use-case' import { authorizeOrganizationOperation } from '@/lib/core/application/organization-authorization' import { OrchestrationError } from '@/lib/core/orchestration/types' +import { SIM_TOOL_MIN_START_BUDGET_MS } from '@/lib/mothership/async-runs/execution-lease' import { recordToolPermissionDecision, TERMINAL_RUN_STATUSES, @@ -43,26 +44,29 @@ export const listOrganizationAssistantActions = defineAuthorizedOrganizationUseC principal, input, context, - }: OrganizationUseCaseContext & { runId?: string; cursor?: number }>) { - const [latest] = input.runId - ? [{ id: input.runId }] - : await db - .select({ id: copilotRuns.id }) - .from(copilotRuns) - .where( - and( - eq(copilotRuns.chatId, input.chatId), - eq(copilotRuns.organizationId, context.organizationId), - eq(copilotRuns.userId, context.userId), - isNull(copilotRuns.toolAdmissionClosedAt), - notInArray(copilotRuns.status, TERMINAL_RUN_STATUSES) - ) - ) - .orderBy(desc(copilotRuns.startedAt), desc(copilotRuns.id)) - .limit(1) - if (!latest) return { actions: [], nextCursor: null } + }: OrganizationUseCaseContext & { cursor?: number }>) { + const [latest] = await db + .select({ id: copilotRuns.id }) + .from(copilotRuns) + .innerJoin(copilotChats, eq(copilotChats.id, copilotRuns.chatId)) + .where( + and( + eq(copilotRuns.chatId, input.chatId), + eq(copilotRuns.organizationId, context.organizationId), + eq(copilotRuns.userId, context.userId), + eq(copilotChats.userId, context.userId), + eq(copilotChats.organizationId, context.organizationId), + eq(copilotChats.conversationId, copilotRuns.streamId), + isNull(copilotChats.deletedAt), + isNull(copilotRuns.toolAdmissionClosedAt), + notInArray(copilotRuns.status, TERMINAL_RUN_STATUSES) + ) + ) + .orderBy(desc(copilotRuns.startedAt), desc(copilotRuns.id)) + .limit(1) + if (!latest) return { runId: null, streamId: null, actions: [], nextCursor: null } const runId = latest.id - await requireAssistantRun(principal, { ...input, runId }, context.userId) + const run = await requireAssistantRun(principal, { ...input, runId }, context.userId) const records = await db .select() .from(copilotAsyncToolCalls) @@ -73,6 +77,13 @@ export const listOrganizationAssistantActions = defineAuthorizedOrganizationUseC isNotNull(copilotAsyncToolCalls.assistantAction), isNotNull(copilotAsyncToolCalls.permissionRequestedAt), isNull(copilotAsyncToolCalls.permissionDecision), + or( + isNull(copilotAsyncToolCalls.executionDeadlineAt), + gte( + copilotAsyncToolCalls.executionDeadlineAt, + new Date(Date.now() + SIM_TOOL_MIN_START_BUDGET_MS) + ) + ), input.cursor === undefined ? undefined : gt(copilotAsyncToolCalls.persistSeq, input.cursor) @@ -101,6 +112,7 @@ export const listOrganizationAssistantActions = defineAuthorizedOrganizationUseC credentialId: account.credentialId, displayName: account.displayName, providerId: account.providerId, + active: account.active, } : null, proposalVersion: assistantProposalVersion(record), @@ -108,7 +120,11 @@ export const listOrganizationAssistantActions = defineAuthorizedOrganizationUseC } }) ) - return { actions, nextCursor: records.length > 32 ? (page.at(-1)?.persistSeq ?? null) : null } + return { + ...run, + actions, + nextCursor: records.length > 32 ? (page.at(-1)?.persistSeq ?? null) : null, + } }, }) @@ -147,6 +163,7 @@ export const decideOrganizationAssistantAction = defineAuthorizedOrganizationUse executor: tx, forUpdate: true, }) + await requireAssistantRun(principal, input, context.userId, tx) await tx .select({ id: copilotRuns.id }) .from(copilotRuns) diff --git a/apps/sim/lib/assistant-actions/proposal.ts b/apps/sim/lib/assistant-actions/proposal.ts index 4bcf7748dd1..abd006ab5aa 100644 --- a/apps/sim/lib/assistant-actions/proposal.ts +++ b/apps/sim/lib/assistant-actions/proposal.ts @@ -86,7 +86,11 @@ export function assistantReviewFields(record: ActionRecord) { field.target !== true && tool?.params[name]?.type === 'string', format: - field?.format ?? (typeof value === 'string' ? ('text' as const) : ('json' as const)), + field?.format ?? + (typeof value === 'string' || + (value === undefined && tool?.params[name]?.type === 'string') + ? ('text' as const) + : ('json' as const)), value: value === undefined ? '' : typeof value === 'string' ? value : JSON.stringify(value), } }) diff --git a/apps/sim/lib/assistant-actions/tool-permissions.integration.ts b/apps/sim/lib/assistant-actions/tool-permissions.integration.ts index 4e3f89b6aa0..a5e0cad86cf 100644 --- a/apps/sim/lib/assistant-actions/tool-permissions.integration.ts +++ b/apps/sim/lib/assistant-actions/tool-permissions.integration.ts @@ -51,6 +51,7 @@ import { rejectManagedOAuthToken, } from '@/lib/credentials/managed-oauth' import { + claimAssistantToolExecution, claimToolExecution, recordToolPermissionDecision, upsertAsyncToolCall, @@ -98,6 +99,7 @@ const enrollmentId = generateId() const otherEnrollmentId = generateId() const chatId = generateId() const runId = generateId() +const streamId = generateId() const principal: SessionPrincipal = { kind: 'session', userId: ownerId, sessionId: generateId() } const input = { organizationId, credentialId } const delegated: OrganizationDelegatedPrincipal = { @@ -138,7 +140,7 @@ const prepare = async ( const claim = (call: Awaited>) => claimOrganizationAssistantAction.execute({ principal: delegated, input: call }) const review = () => - listOrganizationAssistantActions.execute({ principal, input: { organizationId, chatId, runId } }) + listOrganizationAssistantActions.execute({ principal, input: { organizationId, chatId } }) const decide = ( toolCallId: string, proposalVersion: string, @@ -355,6 +357,7 @@ beforeAll(async () => { organizationId, type: 'mothership', config: { conversationMode: 'assistant' }, + conversationId: streamId, }) await db.insert(copilotRuns).values({ id: runId, @@ -362,12 +365,13 @@ beforeAll(async () => { userId: ownerId, organizationId, executionId: generateId(), - streamId: generateId(), + streamId, toolExecutionVersion: 3, }) }) beforeEach(async () => { + await db.update(copilotChats).set({ conversationId: streamId }).where(eq(copilotChats.id, chatId)) const jiraPolicy = await getCredentialGroupProviderAdapter('jira').getPolicy(undefined, {}) await db .update(credential) @@ -427,6 +431,120 @@ describe('Assistant discovery for legacy account setup', () => { }) describe('organization Assistant tool permissions', () => { + it.each(['list', 'decide', 'prepare', 'claim', 'owner_claim'] as const)( + 'rejects an orphaned earlier turn at the %s boundary', + async (boundary) => { + await change(0, 'ask') + const call = await prepare() + const proposal = (await review()).actions[0] + if (!proposal) throw new Error('Pending action not available for review') + if (boundary === 'claim' || boundary === 'owner_claim') + await decide(call.toolCallId, proposal.proposalVersion, 'allow') + const successorId = generateId() + const successorStream = generateId() + await db.transaction(async (tx) => { + await tx + .update(copilotChats) + .set({ conversationId: successorStream }) + .where(eq(copilotChats.id, chatId)) + await tx.insert(copilotRuns).values({ + id: successorId, + chatId, + userId: ownerId, + organizationId, + executionId: generateId(), + streamId: successorStream, + status: 'complete', + toolExecutionVersion: 3, + }) + }) + try { + if (boundary === 'list') { + expect( + await listOrganizationAssistantActions.execute({ + principal, + input: { organizationId, chatId }, + }) + ).toEqual({ + runId: null, + streamId: null, + actions: [], + nextCursor: null, + }) + } else if (boundary === 'decide') { + await expect(decide(call.toolCallId, proposal.proposalVersion, 'allow')).rejects.toThrow( + 'no longer accepting actions' + ) + } else if (boundary === 'prepare') { + await expect(prepare()).rejects.toThrow('no longer accepting actions') + } else if (boundary === 'claim') { + await expect(claim(call)).rejects.toThrow('no longer accepting actions') + } else { + expect( + await db.transaction((tx) => + claimAssistantToolExecution({ ...call, userId: ownerId }, tx) + ) + ).toEqual({ outcome: 'closed' }) + } + const [record] = await db + .select({ started: copilotAsyncToolCalls.executionStartedAt }) + .from(copilotAsyncToolCalls) + .where(eq(copilotAsyncToolCalls.toolCallId, call.toolCallId)) + expect(record?.started).toBeNull() + } finally { + await db.delete(copilotRuns).where(eq(copilotRuns.id, successorId)) + } + } + ) + + it('pages eligible proposals past expired rows and keeps canonical turn metadata', async () => { + await change(0, 'ask') + const expired = [] + for (let index = 0; index < 33; index++) expired.push(await prepare()) + await db + .update(copilotAsyncToolCalls) + .set({ executionDeadlineAt: new Date(Date.now() + 30_000) }) + .where( + inArray( + copilotAsyncToolCalls.toolCallId, + expired.map((call) => call.toolCallId) + ) + ) + const eligible = await prepare() + const result = await listOrganizationAssistantActions.execute({ + principal, + input: { organizationId, chatId }, + }) + expect(result).toMatchObject({ runId, streamId, nextCursor: null }) + expect(result.actions.map((action) => action.toolCallId)).toEqual([eligible.toolCallId]) + const [expiredProposal] = expired + if (!expiredProposal) throw new Error('Missing expired proposal') + const [record] = await db + .select() + .from(copilotAsyncToolCalls) + .where(eq(copilotAsyncToolCalls.toolCallId, expiredProposal.toolCallId)) + expect(record?.executionStartedAt).toBeNull() + }) + + it('keeps a revoked account identifiable and cancellable without offering active access', async () => { + await change(0, 'ask') + const call = await prepare() + await db + .update(credential) + .set({ managedOauthStatus: 'revoked' }) + .where(eq(credential.id, credentialId)) + const action = (await review()).actions[0] + expect(action?.account).toMatchObject({ credentialId, active: false }) + if (!action) throw new Error('Pending action not available for cancellation') + await expect(decide(call.toolCallId, action.proposalVersion, 'allow')).rejects.toThrow( + 'active connected account' + ) + expect(await decide(call.toolCallId, action.proposalVersion, 'skip')).toMatchObject({ + decision: 'skip', + applied: true, + }) + }) + it('reads safe defaults without persisting a grant', async () => { const result = await read() expect(result).toMatchObject({ revision: 0, readPolicy: 'allow', writePolicy: 'ask' }) diff --git a/apps/sim/lib/mothership/async-runs/repository.ts b/apps/sim/lib/mothership/async-runs/repository.ts index e932023ef52..6383705b7b1 100644 --- a/apps/sim/lib/mothership/async-runs/repository.ts +++ b/apps/sim/lib/mothership/async-runs/repository.ts @@ -1142,10 +1142,26 @@ export function claimToolExecution(owner: SimToolExecutionOwner): Promise { + const [currentTurn] = await transaction + .select({ id: copilotRuns.id }) + .from(copilotRuns) + .innerJoin(copilotChats, eq(copilotChats.id, copilotRuns.chatId)) + .where( + and( + eq(copilotRuns.id, owner.runId), + eq(copilotRuns.userId, owner.userId), + eq(copilotChats.userId, owner.userId), + eq(copilotChats.conversationId, copilotRuns.streamId), + isNull(copilotChats.deletedAt) + ) + ) + .for('share', { of: copilotChats }) + .limit(1) + if (!currentTurn) return { outcome: 'closed' } return claimSimToolExecution(owner, true, transaction) } diff --git a/apps/sim/lib/mothership/async-runs/tool-identity.integration.ts b/apps/sim/lib/mothership/async-runs/tool-identity.integration.ts index 0081d2d1f2b..cab21f5bf1c 100644 --- a/apps/sim/lib/mothership/async-runs/tool-identity.integration.ts +++ b/apps/sim/lib/mothership/async-runs/tool-identity.integration.ts @@ -4,6 +4,8 @@ * Set TEST_DATABASE_URL to a local PostgreSQL database and * TEST_REDIS_URL to an isolated local Redis service. */ + +import { sleep } from '@sim/utils/helpers' import { generateId } from '@sim/utils/id' import { drizzle, type PostgresJsDatabase } from 'drizzle-orm/postgres-js' import Redis from 'ioredis' @@ -476,6 +478,50 @@ describe('Copilot tool identity with PostgreSQL', () => { }) describe.skipIf(!redisUrl)('with actual Redis confirmation and permission channels', () => { + it.each(['abort', 'timeout'] as const)( + 'stops durable permission reads after %s', + async (ending) => { + await createCurrentCalls() + const durableReads = vi.spyOn(asyncRepository, 'getAsyncToolCall') + const abort = new AbortController() + const waiting = waitForToolPermissionDecision( + firstId, + ending === 'timeout' ? 100 : 5_000, + abort.signal + ) + try { + await vi.waitFor(() => expect(durableReads).toHaveBeenCalledTimes(1)) + await Promise.all(durableReads.mock.results.map((result) => result.value)) + if (ending === 'abort') abort.abort() + expect(await waiting).toBeNull() + const readsAtSettlement = durableReads.mock.calls.length + await recordToolPermissionDecision(firstId, 'allow') + await sleep(1_200) + expect(durableReads).toHaveBeenCalledTimes(readsAtSettlement) + } finally { + abort.abort() + await waiting + } + } + ) + + it('recovers a committed permission decision when its notification is lost', async () => { + await createCurrentCalls() + const durableReads = vi.spyOn(asyncRepository, 'getAsyncToolCall') + const abort = new AbortController() + const waiting = waitForToolPermissionDecision(firstId, 3_000, abort.signal) + try { + await vi.waitFor(() => expect(durableReads).toHaveBeenCalledTimes(1)) + await Promise.all(durableReads.mock.results.map((result) => result.value)) + await recordToolPermissionDecision(firstId, 'allow') + expect(await waiting).toMatchObject({ toolCallId: firstId, decision: 'allow' }) + expect((await getAsyncToolCall(secondId))?.permissionDecision).toBeNull() + } finally { + abort.abort() + await waiting + } + }) + it('wakes only the matching waiter and reads its durable terminal result', async () => { await createCurrentCalls() const durableReads = vi.spyOn(asyncRepository, 'getAsyncToolCalls') diff --git a/apps/sim/lib/mothership/persistence/tool-permission/index.ts b/apps/sim/lib/mothership/persistence/tool-permission/index.ts index 79f9e51896d..7ecbc7ae622 100644 --- a/apps/sim/lib/mothership/persistence/tool-permission/index.ts +++ b/apps/sim/lib/mothership/persistence/tool-permission/index.ts @@ -6,6 +6,7 @@ import { isExecutableToolPermissionDecision } from '@/lib/mothership/async-runs/ import { getAsyncToolCall } from '@/lib/mothership/async-runs/repository' const logger = createLogger('CopilotToolPermission') +const DECISION_RECHECK_INTERVAL_MS = 1_000 export const TOOL_PERMISSION_DECISION = { allow: 'allow', @@ -100,8 +101,8 @@ export async function getToolPermissionDecision( * Mirrors `waitForToolConfirmation`: subscribe first, then read the durable * row, so a decision that lands between those two steps — or that was made * against a different server instance, or before this waiter existed at all — - * is still picked up. Resolves `null` on timeout or abort; callers treat that - * as "no decision" and fail the tool rather than running it. + * is still picked up. Bounded durable rechecks also recover a missed notification. + * Resolves `null` on timeout or abort; callers treat that as "no decision". */ export async function waitForToolPermissionDecision( toolCallId: string, @@ -111,10 +112,12 @@ export async function waitForToolPermissionDecision( return new Promise((resolve) => { let settled = false let timeoutId: ReturnType | null = null + let recheckId: ReturnType | null = null let unsubscribe: (() => void) | null = null const cleanup = () => { if (timeoutId) clearTimeout(timeoutId) + if (recheckId) clearTimeout(recheckId) if (unsubscribe) unsubscribe() abortSignal?.removeEventListener('abort', onAbort) } @@ -145,13 +148,20 @@ export async function waitForToolPermissionDecision( } abortSignal?.addEventListener('abort', onAbort, { once: true }) - void getToolPermissionDecision(toolCallId).then((existing) => { - if (!existing) return - logger.info('Resolved tool permission from durable row', { - toolCallId, - decision: existing.decision, - }) - settle(existing) - }) + const readDecision = async () => { + if (settled) return + const existing = await getToolPermissionDecision(toolCallId) + if (settled) return + if (existing) { + logger.info('Resolved tool permission from durable row', { + toolCallId, + decision: existing.decision, + }) + settle(existing) + return + } + recheckId = setTimeout(() => void readDecision(), DECISION_RECHECK_INTERVAL_MS) + } + void readDecision() }) } diff --git a/apps/sim/scripts/test-assistant-actions-e2e.ts b/apps/sim/scripts/test-assistant-actions-e2e.ts index 40aa1fa8acd..d43e80ff24d 100644 --- a/apps/sim/scripts/test-assistant-actions-e2e.ts +++ b/apps/sim/scripts/test-assistant-actions-e2e.ts @@ -4,16 +4,30 @@ import { dirname, resolve } from 'node:path' import { chromium, expect } from '@playwright/test' import { assertDisposableTestDatabaseUrl } from '@sim/db/testing/test-infrastructure' import { createLogger } from '@sim/logger' +import { createDeferred } from '@sim/testing/helpers/deferred' import { getErrorMessage } from '@sim/utils/errors' import { generateId, generateShortId } from '@sim/utils/id' import { toRecord } from '@sim/utils/object' import { makeSignature } from 'better-auth/crypto' import postgres from 'postgres' +import { + listAssistantActionsContract, + readAssistantToolPermissionsContract, +} from '@/lib/api/contracts/assistant-actions' +import { closeRedisConnection } from '@/lib/core/config/redis' +import { + acquirePendingChatStream, + releasePendingChatStream, + startAbortPoller, +} from '@/lib/mothership/request/session/abort' +import { allocateCursor, appendEvents, clearBuffer } from '@/lib/mothership/request/session/buffer' +import type { SessionStreamEvent } from '@/lib/mothership/request/session/contract' +import { createEvent } from '@/lib/mothership/request/session/event' /** * Runs against a local app and disposable PostgreSQL with member Search, Connected Accounts, and Access Control enabled. * Requires ASSISTANT_ACTIONS_E2E_BASE_URL, ASSISTANT_ACTIONS_E2E_DATABASE_URL, - * ASSISTANT_ACTIONS_E2E_AUTH_SECRET, and ASSISTANT_ACTIONS_E2E_REPORT_PATH. + * ASSISTANT_ACTIONS_E2E_AUTH_SECRET, ASSISTANT_ACTIONS_E2E_REPORT_PATH, and the app's REDIS_URL. * Verifies account policy persistence and action review over real HTTP without executing provider operations. */ const logger = createLogger('AssistantActionsE2E') @@ -31,6 +45,10 @@ assert(!baseUrl.username && !baseUrl.password, 'The app URL must not contain cre const databaseUrl = assertDisposableTestDatabaseUrl( requiredEnvironment('ASSISTANT_ACTIONS_E2E_DATABASE_URL') ) +const redisUrl = new URL(requiredEnvironment('REDIS_URL')) +assert.equal(redisUrl.protocol, 'redis:') +assert(['localhost', '127.0.0.1', '[::1]'].includes(redisUrl.hostname), 'Use local Redis') +assert(!redisUrl.username && !redisUrl.password && !redisUrl.search, 'Use credential-free Redis') const authSecret = requiredEnvironment('ASSISTANT_ACTIONS_E2E_AUTH_SECRET') assert(authSecret.length >= 32, 'Use a local auth secret of at least 32 characters') const reportPath = resolve(requiredEnvironment('ASSISTANT_ACTIONS_E2E_REPORT_PATH')) @@ -45,8 +63,44 @@ const nativeCredentialId = generateId() const groupId = generateId() const enrollmentId = generateId() const runId = generateId() +const streamId = generateId() +const previousRunId = generateId() +const previousStreamId = generateId() +const previousCallId = generateId() +const lagChatId = generateId() +const lagRunId = generateId() +const lagStreamId = generateId() +const lagFirstCallId = generateId() +const lagSecondCallId = generateId() +const lateCallId = generateId() +const requestId = generateId() const firstCallId = generateId() const secondCallId = generateId() +const fixtureStreams = [ + { chatId: assistantId, streamId }, + { chatId: lagChatId, streamId: lagStreamId }, +] +const streamPollers: ReturnType[] = [] +const catalogAccounts = [ + { option: 'gmail', provider: 'google-email', name: 'Gmail', supported: true }, + { + option: 'google-calendar', + provider: 'google-calendar', + name: 'Google Calendar', + supported: true, + }, + { option: 'google-drive', provider: 'google-drive', name: 'Google Drive', supported: true }, + { option: 'confluence', provider: 'confluence', name: 'Confluence', supported: true }, + { + option: 'github-repositories', + provider: 'github-repositories', + name: 'GitHub', + supported: true, + }, + { option: 'google-docs', provider: 'google-docs', name: 'Google Docs', supported: true }, + { option: 'google-sheets', provider: 'google-sheets', name: 'Google Sheets', supported: true }, + { option: 'google-meet', provider: 'google-meet', name: 'Google Meet', supported: false }, +].map((account) => ({ ...account, credentialId: generateId() })) const token = generateShortId() const root = `/o/${organizationId}` const question = 'Create the two launch follow-up tickets in Jira.' @@ -55,12 +109,20 @@ const checks: { name: string; status: 'passed' | 'failed'; durationMs: number; e [] const browserErrors: string[] = [] const serverErrors: { path: string; status: number }[] = [] +const httpResponses: { method: string; path: string; status: number }[] = [] const browser = await chromium.launch() const context = await browser.newContext({ viewport: { width: 1440, height: 1000 } }) const page = await context.newPage() +const reviewCards = page.getByRole('region', { name: 'Review Jira Write', exact: true }) page.on('pageerror', (error) => browserErrors.push(error.message)) page.on('response', (response) => { const url = new URL(response.url()) + if (url.origin === baseUrl.origin && url.pathname.startsWith('/api/')) + httpResponses.push({ + method: response.request().method(), + path: url.pathname, + status: response.status(), + }) if (url.origin === baseUrl.origin && response.status() >= 500) serverErrors.push({ path: url.pathname, status: response.status() }) }) @@ -99,6 +161,52 @@ async function capture(name: string) { await page.screenshot({ path: resolve(artifactDirectory, `${name}.png`), animations: 'disabled' }) } +function proposalArguments(summary: string) { + return { + credential: credentialId, + domain: 'acme.atlassian.net', + projectId: 'LAUNCH', + issueType: 'Task', + summary, + description: 'Confirm the final owner and target date before the customer announcement.', + } +} + +async function insertProposal(targetRunId: string, toolCallId: string, summary: string) { + await sql`insert into copilot_async_tool_calls (run_id, tool_call_id, tool_name, executable_name, args, assistant_action, execution_retryable, permission_requested_at) + values (${targetRunId}, ${toolCallId}, 'jira_write', 'jira_write', ${sql.json(proposalArguments(summary))}, ${sql.json({ credentialId, operationVersion: 1, effect: 'write' })}, false, now())` +} + +async function appendStreamEvents( + chatId: string, + targetStreamId: string, + events: SessionStreamEvent[] +) { + for (const event of events) { + const position = await allocateCursor(targetStreamId) + const result = await appendEvents( + [createEvent({ ...event, ...position, streamId: targetStreamId, chatId, requestId })], + { streamId: targetStreamId, userId } + ) + assert.equal(result.persisted, true, 'Fixture stream exceeded its replay budget') + } +} + +function pendingToolEvent(toolCallId: string, summary: string): SessionStreamEvent { + return { + type: 'tool', + payload: { + phase: 'call', + executor: 'sim', + mode: 'async', + toolCallId, + toolName: 'jira_write', + status: 'awaiting_approval', + arguments: proposalArguments(summary), + }, + } +} + try { await mkdir(artifactDirectory, { recursive: true }) await sql.begin(async (tx) => { @@ -113,7 +221,7 @@ try { await tx`insert into session (id, token, user_id, expires_at, created_at, updated_at) values (${generateId()}, ${token}, ${userId}, now() + interval '1 day', now(), now())` await tx`insert into credential_group (id, organization_id, public_id, name, options) - values (${groupId}, ${organizationId}, ${generateId()}, 'Personal Jira', ${tx.json(['jira', 'salesforce'].map((provider) => ({ id: provider, provider, label: provider, authorizationAppId: 'fixture', requiredScopes: [], scopeVersion: 1, required: false, status: 'active' })))})` + values (${groupId}, ${organizationId}, ${generateId()}, 'Personal Jira', ${tx.json(['jira', 'salesforce', ...catalogAccounts.map((account) => account.option)].map((provider) => ({ id: provider, provider, label: provider, authorizationAppId: 'fixture', requiredScopes: [], scopeVersion: 1, required: false, status: 'active' })))})` await tx`insert into resource_policy (id, organization_id, resource_type, resource_id, document, created_by, updated_by) values (${generateId()}, ${organizationId}, 'credential_group', ${groupId}, ${tx.json({ version: 2, resource: { type: 'credential_group', id: groupId }, statements: [] })}, ${userId}, ${userId})` await tx`insert into credential_group_enrollment (id, credential_group_id, user_id, email, status, invitation_token_hash, invitation_expires_at, invited_at) @@ -122,34 +230,77 @@ try { values (${credentialId}, ${organizationId}, 'managed_oauth', ${userId}, 'taylor@acme.example', 'jira', ${enrollmentId}, 'jira', 'active', 1, '{}'::text[], ${userId}, 'fixture', 'fixture-not-a-provider-token', now())` await tx`insert into credential (id, organization_id, type, created_by, display_name, provider_id, credential_group_enrollment_id, credential_group_option_id, managed_oauth_status, managed_oauth_scope_version, granted_scopes, provider_subject_id, authorization_app_id, encrypted_oauth_token_set, granted_at) values (${nativeCredentialId}, ${organizationId}, 'managed_oauth', ${userId}, 'taylor@acme.example', 'salesforce', ${enrollmentId}, 'salesforce', 'active', 1, '{}'::text[], ${userId}, 'fixture', 'fixture-not-a-provider-token', now())` - await tx`insert into copilot_chats (id, user_id, organization_id, type, title, config) - values (${assistantId}, ${userId}, ${organizationId}, 'mothership', 'Launch follow-up', ${tx.json({ conversationMode: 'assistant' })})` - for (const [seq, role, content] of [ - [1, 'user', question], - [2, 'assistant', answer], - ] as const) { - const messageId = generateId() - await tx`insert into copilot_messages (id, chat_id, message_id, role, content, seq) - values (${generateId()}, ${assistantId}, ${messageId}, ${role}, ${tx.json({ id: messageId, role, content, timestamp: new Date().toISOString() })}, ${seq})` + for (const account of catalogAccounts) { + await tx`insert into credential (id, organization_id, type, created_by, display_name, provider_id, credential_group_enrollment_id, credential_group_option_id, managed_oauth_status, managed_oauth_scope_version, granted_scopes, provider_subject_id, authorization_app_id, encrypted_oauth_token_set, granted_at) + values (${account.credentialId}, ${organizationId}, 'managed_oauth', ${userId}, 'taylor@acme.example', ${account.provider}, ${enrollmentId}, ${account.option}, 'active', 1, '{}'::text[], ${userId}, 'fixture', 'fixture-not-a-provider-token', now())` } - await tx`insert into copilot_runs (id, chat_id, user_id, organization_id, execution_id, stream_id, tool_execution_version, status) - values (${runId}, ${assistantId}, ${userId}, ${organizationId}, ${generateId()}, ${generateId()}, 3, 'paused_waiting_for_tool')` - for (const [id, summary] of [ - [firstCallId, 'Publish the launch checklist'], - [secondCallId, 'Confirm the rollout owners'], - ] as const) { - const args = { - credential: credentialId, - domain: 'acme.atlassian.net', - projectId: 'LAUNCH', - issueType: 'Task', - summary, - description: 'Confirm the final owner and target date before the customer announcement.', - } - await tx`insert into copilot_async_tool_calls (run_id, tool_call_id, tool_name, executable_name, args, assistant_action, execution_retryable, permission_requested_at) - values (${runId}, ${id}, 'jira_write', 'jira_write', ${tx.json(args)}, ${tx.json({ credentialId, operationVersion: 1, effect: 'write' })}, false, now())` + await tx`insert into copilot_chats (id, user_id, organization_id, type, title, conversation_id, config) + values (${assistantId}, ${userId}, ${organizationId}, 'mothership', 'Launch follow-up', ${streamId}, ${tx.json({ conversationMode: 'assistant' })}), + (${lagChatId}, ${userId}, ${organizationId}, 'mothership', 'Delayed action transcript', ${lagStreamId}, ${tx.json({ conversationMode: 'assistant' })})` + const oldResponseId = generateId() + for (const message of [ + { + id: previousStreamId, + role: 'user', + content: 'Prepare an earlier Jira issue.', + stream: previousStreamId, + }, + { + id: oldResponseId, + role: 'assistant', + content: 'This earlier request has ended.', + stream: previousStreamId, + contentBlocks: [ + { type: 'text', content: 'This earlier request has ended.' }, + { + type: 'tool', + phase: 'call', + toolCall: { + id: previousCallId, + name: 'jira_write', + state: 'awaiting_approval', + display: { title: 'Earlier Jira proposal' }, + params: proposalArguments('An old request that must not gain new actions'), + }, + }, + ], + }, + { id: streamId, role: 'user', content: question, stream: streamId }, + ].entries()) { + const [index, data] = message + const { stream, ...content } = data + await tx`insert into copilot_messages (id, chat_id, message_id, role, stream_id, content, seq) + values (${generateId()}, ${assistantId}, ${data.id}, ${data.role}, ${stream}, ${tx.json({ ...content, requestId, timestamp: new Date().toISOString() })}, ${index + 1})` } + await tx`insert into copilot_messages (id, chat_id, message_id, role, stream_id, content, seq) + values (${generateId()}, ${lagChatId}, ${lagStreamId}, 'user', ${lagStreamId}, ${tx.json({ id: lagStreamId, role: 'user', content: 'Create two more Jira issues.', requestId, timestamp: new Date().toISOString() })}, 1)` + await tx`insert into copilot_runs (id, chat_id, user_id, organization_id, execution_id, stream_id, tool_execution_version, status, started_at, completed_at, tool_admission_closed_at) + values (${previousRunId}, ${assistantId}, ${userId}, ${organizationId}, ${generateId()}, ${previousStreamId}, 3, 'complete', now() - interval '1 hour', now() - interval '59 minutes', now() - interval '59 minutes')` + await tx`insert into copilot_runs (id, chat_id, user_id, organization_id, execution_id, stream_id, tool_execution_version, status) + values (${runId}, ${assistantId}, ${userId}, ${organizationId}, ${generateId()}, ${streamId}, 3, 'paused_waiting_for_tool'), + (${lagRunId}, ${lagChatId}, ${userId}, ${organizationId}, ${generateId()}, ${lagStreamId}, 3, 'paused_waiting_for_tool')` }) + await insertProposal(runId, firstCallId, 'Publish the launch checklist') + await insertProposal(runId, secondCallId, 'Confirm the rollout owners') + for (const stream of fixtureStreams) { + assert(await acquirePendingChatStream(stream.chatId, stream.streamId, 0)) + streamPollers.push( + startAbortPoller(stream.streamId, new AbortController(), { chatId: stream.chatId }) + ) + } + await appendStreamEvents(assistantId, streamId, [ + { type: 'session', payload: { kind: 'start' } }, + { type: 'text', payload: { channel: 'assistant', text: answer } }, + pendingToolEvent(firstCallId, 'Publish the launch checklist'), + pendingToolEvent(secondCallId, 'Confirm the rollout owners'), + ]) + await appendStreamEvents(lagChatId, lagStreamId, [ + { type: 'session', payload: { kind: 'start' } }, + { + type: 'text', + payload: { channel: 'assistant', text: 'I have prepared two more issues for review.' }, + }, + ]) await context.addCookies([ { name: 'better-auth.session_token', @@ -164,6 +315,9 @@ try { waitUntil: 'domcontentloaded', timeout: 180_000, }) + await page.getByRole('button', { name: 'Salesforce integration actions', exact: true }).click() + await expect(page.getByRole('menuitem', { name: 'Add account', exact: true })).toHaveCount(0) + await expect(page.getByRole('menuitem', { name: 'Reconnect', exact: true })).toBeVisible() const permissions = page.locator( `a[href="${root}/integrations/accounts/${nativeCredentialId}"]` ) @@ -173,6 +327,36 @@ try { await expect(policy).toBeVisible({ timeout: 180_000 }) await expect(policy.getByRole('radio', { name: 'Ask', exact: true })).toBeChecked() }) + await check('Connected app menus agree with the real Assistant tool catalog', async () => { + await page.goto(`${baseUrl.origin}${root}/integrations`, { waitUntil: 'domcontentloaded' }) + for (const account of catalogAccounts) { + const response = await context.request.get( + `${baseUrl.origin}/api/organizations/${organizationId}/connected-accounts/personal/${account.credentialId}/tool-permissions` + ) + assert.equal(response.status(), 200, await response.text()) + const data = readAssistantToolPermissionsContract.response.schema.parse(await response.json()) + assert.equal(data.account.credentialId, account.credentialId) + assert.equal(data.tools.length > 0, account.supported, account.name) + const menu = page.getByRole('button', { + name: `${account.name} integration actions`, + exact: true, + }) + await expect(menu).toHaveCount(1) + await menu.click() + const permissions = page.getByRole('menu').locator('a[href*="/integrations/accounts/"]') + await expect(permissions).toHaveCount(account.supported ? 1 : 0) + if (account.supported) { + await expect(permissions).toHaveAttribute( + 'href', + `${root}/integrations/accounts/${account.credentialId}` + ) + } else { + await expect(permissions).toHaveCount(0) + } + await page.keyboard.press('Escape') + } + await capture('integrations-desktop') + }) await check('Personal permissions persist through the real settings route', async () => { await page.goto(`${baseUrl.origin}${root}/integrations/accounts/${credentialId}`, { waitUntil: 'domcontentloaded', @@ -195,38 +379,113 @@ try { 'Mobile permissions overflow horizontally' ) }) - await check('The Assistant groups exact proposed actions in one review', async () => { - await page.setViewportSize({ width: 1440, height: 1000 }) - await page.goto(`${baseUrl.origin}${root}/search/chat/${assistantId}`, { - waitUntil: 'domcontentloaded', - timeout: 180_000, - }) - await expect(page.getByText('2 actions to review')).toBeVisible({ timeout: 180_000 }) - await capture('assistant-actions-desktop') - await page.getByRole('button', { name: 'Review', exact: true }).click() - const modal = page.getByRole('dialog', { name: 'Review Assistant actions' }) - await expect(modal).toBeVisible() - await expect(modal.getByRole('textbox', { name: 'Project', exact: true }).first()).toHaveValue( - 'LAUNCH' - ) - await expect( - modal.getByRole('textbox', { name: 'Jira site', exact: true }).first() - ).toHaveValue('acme.atlassian.net') - await capture('action-review-desktop') - await page.setViewportSize({ width: 390, height: 844 }) - await capture('action-review-mobile') - assert( - await page.evaluate(() => document.documentElement.scrollWidth <= innerWidth), - 'Mobile review overflows horizontally' - ) - }) + await check( + 'A live Assistant turn restores exact inline actions without duplicating older rows', + async () => { + await page.setViewportSize({ width: 1440, height: 1000 }) + const streamResponse = page.waitForResponse( + (response) => + new URL(response.url()).pathname === '/api/mothership/chat/stream' && + new URL(response.url()).searchParams.get('streamId') === streamId, + { timeout: 180_000 } + ) + await page.goto(`${baseUrl.origin}${root}/search/chat/${assistantId}`, { + waitUntil: 'domcontentloaded', + timeout: 180_000, + }) + assert.equal((await streamResponse).status(), 200) + await expect(reviewCards).toHaveCount(2, { timeout: 180_000 }) + await expect(page.getByText('Earlier Jira proposal', { exact: false })).toBeAttached() + await expect(page.getByRole('button', { name: 'Allow', exact: true })).toHaveCount(2) + await expect( + reviewCards.nth(0).getByRole('textbox', { name: 'Summary', exact: true }) + ).toHaveValue('Publish the launch checklist') + await expect( + reviewCards.nth(1).getByRole('textbox', { name: 'Summary', exact: true }) + ).toHaveValue('Confirm the rollout owners') + const prompt = await page.getByText(question, { exact: true }).elementHandle() + assert(prompt, 'The current user turn must be restored') + assert( + await reviewCards.evaluateAll( + (cards, userPrompt) => + cards.every((card) => + Boolean(userPrompt.compareDocumentPosition(card) & Node.DOCUMENT_POSITION_FOLLOWING) + ), + prompt + ), + 'Current actions rendered inside an earlier turn' + ) + await prompt.dispose() + await expect(reviewCards.nth(0).getByText('LAUNCH', { exact: true })).toBeVisible() + await expect( + reviewCards.nth(0).getByText('acme.atlassian.net', { exact: true }) + ).toBeVisible() + await expect(page.getByRole('dialog', { name: 'Review Assistant actions' })).toHaveCount(0) + await expect(page.getByRole('button', { name: 'Review', exact: true })).toHaveCount(0) + const response = await context.request.get( + `${baseUrl.origin}/api/organizations/${organizationId}/chats/${assistantId}/actions` + ) + assert.equal(response.status(), 200, await response.text()) + const review = listAssistantActionsContract.response.schema.parse(await response.json()) + assert.equal(review.runId, runId) + assert.equal(review.streamId, streamId) + assert.notEqual(review.runId, requestId) + assert.deepEqual( + review.actions.map((action) => action.toolCallId), + [firstCallId, secondCallId] + ) + await page.reload() + await expect(reviewCards).toHaveCount(2) + await expect( + reviewCards.nth(0).getByRole('textbox', { name: 'Summary', exact: true }) + ).toHaveValue('Publish the launch checklist') + await page.getByText(question, { exact: true }).scrollIntoViewIfNeeded() + await capture('assistant-actions-desktop') + await reviewCards.nth(0).scrollIntoViewIfNeeded() + await capture('action-review-desktop') + await page.setViewportSize({ width: 390, height: 844 }) + await reviewCards.nth(0).scrollIntoViewIfNeeded() + await capture('action-review-mobile') + assert( + await page.evaluate(() => document.documentElement.scrollWidth <= innerWidth), + 'Mobile review overflows horizontally' + ) + } + ) + await check( + 'An inactive account prevents approval but keeps cancellation reachable', + async () => { + await sql`update credential set managed_oauth_status = 'needs_reauth' where id = ${credentialId}` + try { + await page.reload() + await expect(reviewCards).toHaveCount(2) + await expect( + reviewCards.nth(0).getByRole('button', { name: 'Allow', exact: true }) + ).toBeDisabled() + await expect( + reviewCards.nth(1).getByRole('button', { name: 'Allow', exact: true }) + ).toBeDisabled() + await expect( + reviewCards.nth(0).getByRole('button', { name: 'Cancel', exact: true }) + ).toBeEnabled() + await expect( + page.getByRole('button', { name: 'Allow 2 shown', exact: true }) + ).toBeDisabled() + } finally { + await sql`update credential set managed_oauth_status = 'active' where id = ${credentialId}` + } + await page.reload() + await expect( + reviewCards.nth(0).getByRole('button', { name: 'Allow', exact: true }) + ).toBeEnabled() + } + ) await check( 'An edited approval and a cancellation affect only their saved proposals', async () => { - const modal = page.getByRole('dialog', { name: 'Review Assistant actions' }) - await modal + await reviewCards + .nth(0) .getByRole('textbox', { name: 'Summary', exact: true }) - .first() .fill('Publish the reviewed launch checklist') const approval = page.waitForResponse( (response) => @@ -234,20 +493,26 @@ try { response.url().endsWith(`/actions/${firstCallId}`), { timeout: 180_000 } ) - await modal.getByRole('button', { name: 'Allow', exact: true }).first().click() + await reviewCards.nth(0).getByRole('button', { name: 'Allow', exact: true }).click() const approvalResponse = await approval assert.equal(approvalResponse.status(), 200, await approvalResponse.text()) - await expect(modal.getByRole('textbox', { name: 'Summary', exact: true })).toHaveCount(1) + await expect(reviewCards).toHaveCount(1) + await expect(reviewCards.getByRole('textbox', { name: 'Summary', exact: true })).toHaveValue( + 'Confirm the rollout owners' + ) + await expect( + page.getByText('No longer waiting for review', { exact: false }).first() + ).toBeVisible() const cancellation = page.waitForResponse( (response) => response.request().method() === 'PATCH' && response.url().endsWith(`/actions/${secondCallId}`), { timeout: 180_000 } ) - await modal.getByRole('button', { name: 'Cancel', exact: true }).click() + await reviewCards.getByRole('button', { name: 'Cancel', exact: true }).click() const cancellationResponse = await cancellation assert.equal(cancellationResponse.status(), 200, await cancellationResponse.text()) - await expect(modal.getByText('No actions are waiting for review.')).toBeVisible() + await expect(reviewCards).toHaveCount(0) const rows = await sql`select tool_call_id, permission_decision, args, approved_args, execution_started_at from copilot_async_tool_calls where run_id = ${runId} order by persist_seq` assert.equal(rows[0]?.permission_decision, 'allow') @@ -263,6 +528,117 @@ try { ) } ) + await check( + 'Review recovers when an empty result becomes unavailable before the tool transcript arrives', + async () => { + const reviewUrl = `${baseUrl.origin}/api/organizations/${organizationId}/chats/${lagChatId}/actions` + const initialReview = page.waitForResponse( + (response) => response.request().method() === 'GET' && response.url() === reviewUrl + ) + await page.goto(`${baseUrl.origin}${root}/search/chat/${lagChatId}`, { + waitUntil: 'domcontentloaded', + timeout: 180_000, + }) + const initialResponse = await initialReview + assert.equal(initialResponse.status(), 200) + const initialData = listAssistantActionsContract.response.schema.parse( + await initialResponse.json() + ) + assert.equal(initialData.runId, lagRunId) + assert.equal(initialData.streamId, lagStreamId) + assert.deepEqual(initialData.actions, []) + await insertProposal(lagRunId, lagFirstCallId, 'Review the support handoff') + await insertProposal(lagRunId, lagSecondCallId, 'Prepare the launch announcement') + await page.route(`${reviewUrl}*`, (route) => + route.request().method() === 'GET' ? route.abort('failed') : route.continue() + ) + try { + await expect(page.getByRole('button', { name: 'Retry', exact: true })).toBeVisible({ + timeout: 15_000, + }) + await expect(reviewCards).toHaveCount(0) + } finally { + await page.unroute(`${reviewUrl}*`) + } + await page.getByRole('button', { name: 'Retry', exact: true }).click() + await expect(reviewCards).toHaveCount(2) + await expect( + reviewCards.nth(0).getByRole('textbox', { name: 'Summary', exact: true }) + ).toHaveValue('Review the support handoff') + await expect( + reviewCards.nth(1).getByRole('textbox', { name: 'Summary', exact: true }) + ).toHaveValue('Prepare the launch announcement') + await appendStreamEvents(lagChatId, lagStreamId, [ + pendingToolEvent(lagFirstCallId, 'Review the support handoff'), + pendingToolEvent(lagSecondCallId, 'Prepare the launch announcement'), + { + type: 'text', + payload: { channel: 'assistant', text: '\nThe action transcript has caught up.' }, + }, + ]) + await expect( + page.getByText('The action transcript has caught up.', { exact: false }) + ).toBeVisible() + await expect(reviewCards).toHaveCount(2) + await page.reload() + await expect(reviewCards).toHaveCount(2) + } + ) + await check( + 'A bulk approval keeps its clicked snapshot when another action arrives', + async () => { + const releaseFirstDecision = createDeferred() + let firstDecisionRequested = false + const firstActionUrl = `${baseUrl.origin}/api/organizations/${organizationId}/chats/${lagChatId}/actions/${lagFirstCallId}` + await page.route(firstActionUrl, async (route) => { + firstDecisionRequested = true + await releaseFirstDecision.promise + await route.continue() + }) + try { + await page.getByRole('button', { name: 'Allow 2 shown', exact: true }).click() + await expect.poll(() => firstDecisionRequested).toBe(true) + await insertProposal(lagRunId, lateCallId, 'A later proposal that was never approved') + await appendStreamEvents(lagChatId, lagStreamId, [ + pendingToolEvent(lateCallId, 'A later proposal that was never approved'), + ]) + await expect(reviewCards).toHaveCount(3) + releaseFirstDecision.resolve() + await expect + .poll(async () => { + const rows = + await sql`select tool_call_id, permission_decision from copilot_async_tool_calls where run_id = ${lagRunId} order by persist_seq` + return rows.map((row) => [row.tool_call_id, row.permission_decision]) + }) + .toEqual([ + [lagFirstCallId, 'allow'], + [lagSecondCallId, 'allow'], + [lateCallId, null], + ]) + await expect(reviewCards).toHaveCount(1) + await expect( + reviewCards.getByRole('textbox', { name: 'Summary', exact: true }) + ).toHaveValue('A later proposal that was never approved') + const cancellation = page.waitForResponse( + (response) => + response.request().method() === 'PATCH' && + response.url().endsWith(`/actions/${lateCallId}`) + ) + await reviewCards.getByRole('button', { name: 'Cancel', exact: true }).click() + assert.equal((await cancellation).status(), 200) + await expect(reviewCards).toHaveCount(0) + } finally { + releaseFirstDecision.resolve() + await page.unroute(firstActionUrl) + } + const rows = + await sql`select execution_started_at from copilot_async_tool_calls where run_id in (${runId}, ${lagRunId})` + assert( + rows.every((row) => row.execution_started_at === null), + 'A fixture action executed' + ) + } + ) await check('An organization URL cannot expose a different organization’s review', async () => { const response = await context.request.get( `${baseUrl.origin}/api/organizations/${otherOrganizationId}/chats/${assistantId}/actions` @@ -279,11 +655,16 @@ try { process.exitCode = 1 } finally { await browser.close() + for (const poller of streamPollers) clearInterval(poller) try { + for (const stream of fixtureStreams) + await releasePendingChatStream(stream.chatId, stream.streamId) await sql`delete from workspace where owner_id = ${userId}` await sql`delete from project where owner_id = ${userId}` await sql`delete from organization where id in (${organizationId},${otherOrganizationId})` await sql`delete from "user" where id = ${userId}` + await clearBuffer(streamId) + await clearBuffer(lagStreamId) } catch (error) { checks.push({ name: 'Fixture cleanup', @@ -294,10 +675,15 @@ try { process.exitCode = 1 } finally { await sql.end() + await closeRedisConnection() } await mkdir(dirname(reportPath), { recursive: true }) await writeFile( reportPath, - JSON.stringify({ checks, browserErrors, serverErrors, artifactDirectory }, null, 2) + JSON.stringify( + { checks, browserErrors, serverErrors, httpResponses, artifactDirectory }, + null, + 2 + ) ) } From 77e213b67246ca3ff16c79767753375b2db78493 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Thu, 29 Oct 2026 13:32:08 -0700 Subject: [PATCH 2/4] fix(search): back off durable permission recovery --- .../mothership/persistence/tool-permission/index.ts | 10 ++++++++-- apps/sim/scripts/test-assistant-actions-e2e.ts | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/sim/lib/mothership/persistence/tool-permission/index.ts b/apps/sim/lib/mothership/persistence/tool-permission/index.ts index 7ecbc7ae622..962099b8d77 100644 --- a/apps/sim/lib/mothership/persistence/tool-permission/index.ts +++ b/apps/sim/lib/mothership/persistence/tool-permission/index.ts @@ -1,12 +1,13 @@ import type { CopilotToolPermissionDecision } from '@sim/db/schema' import { createLogger } from '@sim/logger' import { toError } from '@sim/utils/errors' +import { backoffWithJitter } from '@sim/utils/retry' import { createPubSubChannel, type PubSubChannel } from '@/lib/events/pubsub' import { isExecutableToolPermissionDecision } from '@/lib/mothership/async-runs/lifecycle' import { getAsyncToolCall } from '@/lib/mothership/async-runs/repository' const logger = createLogger('CopilotToolPermission') -const DECISION_RECHECK_INTERVAL_MS = 1_000 +const DECISION_RECHECK_BACKOFF = { baseMs: 1_000, maxMs: 10_000 } as const export const TOOL_PERMISSION_DECISION = { allow: 'allow', @@ -113,6 +114,7 @@ export async function waitForToolPermissionDecision( let settled = false let timeoutId: ReturnType | null = null let recheckId: ReturnType | null = null + let recheckAttempt = 0 let unsubscribe: (() => void) | null = null const cleanup = () => { @@ -160,7 +162,11 @@ export async function waitForToolPermissionDecision( settle(existing) return } - recheckId = setTimeout(() => void readDecision(), DECISION_RECHECK_INTERVAL_MS) + recheckAttempt += 1 + recheckId = setTimeout( + () => void readDecision(), + backoffWithJitter(recheckAttempt, null, DECISION_RECHECK_BACKOFF) + ) } void readDecision() }) diff --git a/apps/sim/scripts/test-assistant-actions-e2e.ts b/apps/sim/scripts/test-assistant-actions-e2e.ts index d43e80ff24d..34c79931108 100644 --- a/apps/sim/scripts/test-assistant-actions-e2e.ts +++ b/apps/sim/scripts/test-assistant-actions-e2e.ts @@ -46,7 +46,7 @@ const databaseUrl = assertDisposableTestDatabaseUrl( requiredEnvironment('ASSISTANT_ACTIONS_E2E_DATABASE_URL') ) const redisUrl = new URL(requiredEnvironment('REDIS_URL')) -assert.equal(redisUrl.protocol, 'redis:') +assert(['redis:', 'rediss:'].includes(redisUrl.protocol), 'Use a Redis URL') assert(['localhost', '127.0.0.1', '[::1]'].includes(redisUrl.hostname), 'Use local Redis') assert(!redisUrl.username && !redisUrl.password && !redisUrl.search, 'Use credential-free Redis') const authSecret = requiredEnvironment('ASSISTANT_ACTIONS_E2E_AUTH_SECRET') From 04272ac068381303e742af5d85297b62c06bfef0 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Thu, 29 Oct 2026 13:51:32 -0700 Subject: [PATCH 3/4] fix(search): wait for URL updates in browser checks --- apps/sim/scripts/test-organization-search-e2e.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/sim/scripts/test-organization-search-e2e.ts b/apps/sim/scripts/test-organization-search-e2e.ts index 8fb719c13f6..00d24ab6e18 100644 --- a/apps/sim/scripts/test-organization-search-e2e.ts +++ b/apps/sim/scripts/test-organization-search-e2e.ts @@ -261,8 +261,9 @@ try { assert.equal(body.organizationId, organizationId) assert.equal(body.query, 'Launch notes') await expect(page.getByText('Search found no results.', { exact: true })).toBeVisible() - assert.equal(new URL(page.url()).pathname, `${root}/search`) - assert.equal(new URL(page.url()).searchParams.get('q'), 'Launch notes') + await expect(page).toHaveURL( + (url) => url.pathname === `${root}/search` && url.searchParams.get('q') === 'Launch notes' + ) await capture('search-results-desktop') } ) From fce18a7b998d58caba56b0735c29588e83c7ff9a Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Thu, 29 Oct 2026 16:11:49 -0700 Subject: [PATCH 4/4] fix(search): polish inline action review interactions --- .../content/docs/search/ask-questions.mdx | 4 +- .../static/search/assistant-action-review.png | Bin 27120 -> 25461 bytes .../message-content/message-content.tsx | 6 +- .../mothership-chat/mothership-chat.tsx | 24 +- .../sim/components/assistant-actions/index.ts | 1 + .../components/assistant-actions/review.tsx | 203 +++++++++---- .../sim/scripts/test-assistant-actions-e2e.ts | 271 +++++++++++++++++- .../scripts/test-organization-search-e2e.ts | 161 ++++++++++- 8 files changed, 600 insertions(+), 70 deletions(-) diff --git a/apps/docs/content/docs/search/ask-questions.mdx b/apps/docs/content/docs/search/ask-questions.mdx index 8599e486b1d..2bbb9f35e5f 100644 --- a/apps/docs/content/docs/search/ask-questions.mdx +++ b/apps/docs/content/docs/search/ask-questions.mdx @@ -127,13 +127,13 @@ Copy the reviewed draft into another app, or ask Assistant to create it using yo When integration actions are enabled, Assistant can answer questions and take supported actions in the same conversation. For example, ask it to draft an email in Gmail or create a Jira issue using your own connected account. -Reads run without a prompt by default. Writes wait for review by default. Each proposal appears inline in the conversation with its app, account, destination, and proposed content. Edit the supported fields, then select **Allow** or **Cancel** for each action. For several proposals, **Allow N shown** approves the actions currently displayed in the review. +Reads run without a prompt by default. Writes wait for review by default. Each proposal appears inline in the conversation with its app, account, destination, and proposed content. Edit the supported fields, then select **Allow** or **Cancel** for each action. After several proposals, **Allow N shown** or **Cancel N shown** applies your choice to that displayed batch. You can approve individual actions first, then cancel the remaining batch. Inline Assistant action review showing the connected Jira account, exact site and project, editable issue summary and description, and Allow or Cancel controls diff --git a/apps/docs/public/static/search/assistant-action-review.png b/apps/docs/public/static/search/assistant-action-review.png index b43eba955341ff3d53f80806762f3935f6ef1aac..6dbbddc6454c01ca8f5d7e8b1933c7b760b16f5d 100644 GIT binary patch literal 25461 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 literal 27120 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 DcfDJO diff --git a/apps/sim/app/workspace/[workspaceId]/home/components/message-content/message-content.tsx b/apps/sim/app/workspace/[workspaceId]/home/components/message-content/message-content.tsx index fbe9df3b9be..5be65281a6b 100644 --- a/apps/sim/app/workspace/[workspaceId]/home/components/message-content/message-content.tsx +++ b/apps/sim/app/workspace/[workspaceId]/home/components/message-content/message-content.tsx @@ -953,6 +953,8 @@ interface MessageContentProps { * place without ever changing height. */ isLast?: boolean + /** Pending review controls own the tail until the user decides. */ + awaitingInteraction?: boolean /** Transcript-derived answers for this message's question card (renders the recap). */ questionAnswers?: string[] /** Transcript-derived status payload for this message's credential card. */ @@ -980,6 +982,7 @@ function MessageContentInner({ requestMode, isStreaming = false, isLast = false, + awaitingInteraction = false, questionAnswers, credentialSubmission, credentialAbandoned, @@ -1082,7 +1085,8 @@ function MessageContentInner({ // trailing text keeps visually revealing on a timer after the network stream // closes, and collapsing under a still-growing reveal reads as the blob // winking out early while everything shifts. - const thinkingExpanded = phase !== 'settled' && lastSegment?.type !== 'stopped' + const thinkingExpanded = + !awaitingInteraction && phase !== 'settled' && lastSegment?.type !== 'stopped' if (segments.length === 0 && !isLast) return null diff --git a/apps/sim/app/workspace/[workspaceId]/home/components/mothership-chat/mothership-chat.tsx b/apps/sim/app/workspace/[workspaceId]/home/components/mothership-chat/mothership-chat.tsx index 5f258f546a4..e382f6ae427 100644 --- a/apps/sim/app/workspace/[workspaceId]/home/components/mothership-chat/mothership-chat.tsx +++ b/apps/sim/app/workspace/[workspaceId]/home/components/mothership-chat/mothership-chat.tsx @@ -22,7 +22,10 @@ import { } from '@sim/emcn' import { useQueryClient } from '@tanstack/react-query' import { defaultRangeExtractor, type Range, useVirtualizer } from '@tanstack/react-virtual' -import { AssistantActionReviewMessage } from '@/components/assistant-actions' +import { + AssistantActionReviewMessage, + useHasAssistantActionReview, +} from '@/components/assistant-actions' import { ComputerUseActivity } from '@/components/computer-use/activity' import { SMOOTH_CHASE_RATE } from '@/lib/core/utils/smooth-bottom-chase' import type { TurnOrigin } from '@/lib/mothership/generated/protocol' @@ -282,6 +285,7 @@ const AssistantMessageRow = memo(function AssistantMessageRow({ onOptionSelect, onAnimatingChange, }: AssistantMessageRowProps) { + const hasActionReview = useHasAssistantActionReview() const permissions = useOptionalWorkspacePermissionsContext() const canEdit = permissions?.userPermissions.canEdit ?? false const blocks = message.contentBlocks ?? EMPTY_BLOCKS @@ -325,15 +329,18 @@ const AssistantMessageRow = memo(function AssistantMessageRow({ // Settle timing lives in MessageContent (the actions take the thinking // slot's place in the same render), so eligibility here is phase-free: // `phase: 'settled'` asks the helper "would a settled turn show them?". - const actionsEligible = shouldShowAssistantMessageActions({ - phase: 'settled', - hasContent: Boolean(message.content) || hasAnyBlocks, - endsWithInteraction: endsWithQuestion || showsCredentialCard, - questionDismissed, - }) + const actionsEligible = + !hasActionReview && + shouldShowAssistantMessageActions({ + phase: 'settled', + hasContent: Boolean(message.content) || hasAnyBlocks, + endsWithInteraction: endsWithQuestion || showsCredentialCard, + questionDismissed, + }) /** Match the 16px prose/card gap when the card is the message's last visible content. */ - const showsInteractionCard = (endsWithQuestion && !questionDismissed) || showsCredentialCard + const showsInteractionCard = + (endsWithQuestion && !questionDismissed) || showsCredentialCard || hasActionReview return (
@@ -345,6 +352,7 @@ const AssistantMessageRow = memo(function AssistantMessageRow({ fallbackContent={message.content} isStreaming={isStreaming} isLast={isLast} + awaitingInteraction={hasActionReview} questionAnswers={questionAnswers} credentialSubmission={credentialSubmission} credentialAbandoned={credentialAbandoned} diff --git a/apps/sim/components/assistant-actions/index.ts b/apps/sim/components/assistant-actions/index.ts index 4d5b0b90c0f..f173ee786cc 100644 --- a/apps/sim/components/assistant-actions/index.ts +++ b/apps/sim/components/assistant-actions/index.ts @@ -2,4 +2,5 @@ export { AssistantActionReviewMessage, AssistantActionReviewProvider, AssistantActionReviewStatus, + useHasAssistantActionReview, } from './review' diff --git a/apps/sim/components/assistant-actions/review.tsx b/apps/sim/components/assistant-actions/review.tsx index aa7f7bd4e57..e91372b3a7a 100644 --- a/apps/sim/components/assistant-actions/review.tsx +++ b/apps/sim/components/assistant-actions/review.tsx @@ -47,14 +47,30 @@ interface ReviewContextValue { hasApprovalRows: boolean drafts: ReviewDrafts submitting: boolean + pendingDecision?: { toolCallId: string; decision: 'allow' | 'skip' } edit: (action: ReviewAction, name: string, value: string) => void - submit: (actions: ReviewAction[], decision: 'allow' | 'skip') => Promise + submit: ( + actions: ReviewAction[], + decision: 'allow' | 'skip', + onStart: () => void + ) => Promise +} + +interface ReviewMessageContextValue { + messageId: string + submit: (actions: ReviewAction[], decision: 'allow' | 'skip', source: HTMLButtonElement) => void } const reviewContext = createContext(null) -const reviewMessageContext = createContext(null) +const reviewMessageContext = createContext(null) +const pendingReviewContext = createContext(false) const EMPTY_ACTIONS: ReviewAction[] = [] +/** Lets the current turn yield its activity footer to pending review controls. */ +export function useHasAssistantActionReview() { + return useContext(pendingReviewContext) +} + interface AssistantActionReviewProviderProps { organizationId: string chatId?: string @@ -144,10 +160,15 @@ export function AssistantActionReviewProvider({ } }) } - const submit = async (selected: ReviewAction[], decision: 'allow' | 'skip') => { + const submit = async ( + selected: ReviewAction[], + decision: 'allow' | 'skip', + onStart: () => void + ) => { if (inFlight.current || query.isError || !selected.length) return const controller = new AbortController() inFlight.current = controller + onStart() setSubmitting(true) const snapshot = selected.map((action) => { const draft = drafts.runId === action.runId ? drafts.edits[action.toolCallId] : undefined @@ -224,6 +245,7 @@ export function AssistantActionReviewProvider({ hasApprovalRows, drafts, submitting, + pendingDecision: mutation.isPending ? mutation.variables : undefined, edit, submit, } @@ -244,29 +266,81 @@ export function AssistantActionReviewMessage({ messageId, children, }: AssistantActionReviewMessageProps) { + const turn = useRef(null) + const focusOrigin = useRef(null) const review = useContext(reviewContext) + const submitting = review?.submitting ?? false + + useEffect(() => { + const origin = focusOrigin.current + if (!origin) return + if (submitting) { + const cancelRestore = () => { + focusOrigin.current = null + } + const handleFocus = (event: FocusEvent) => { + if (event.target !== origin && event.target !== document.body) cancelRestore() + } + document.addEventListener('focusin', handleFocus, true) + document.addEventListener('pointerdown', cancelRestore, true) + return () => { + document.removeEventListener('focusin', handleFocus, true) + document.removeEventListener('pointerdown', cancelRestore, true) + } + } + focusOrigin.current = null + if ( + document.hasFocus() && + (document.activeElement === document.body || document.activeElement === origin) + ) { + const target = origin.isConnected && !origin.disabled ? origin : turn.current + target?.focus({ preventScroll: true }) + } + }, [submitting]) + + if (!review) + return {children} + const submit: ReviewMessageContextValue['submit'] = (actions, decision, source) => { + void review.submit(actions, decision, () => { + focusOrigin.current = document.activeElement === source ? source : null + }) + } + const ownsReview = review.recoveryMessageId === messageId return ( - - {children} - {review?.recoveryMessageId === messageId && - !review.hasApprovalRows && - review.recoveryActions.length === 0 && - review.query.isError && ( -
- -
- )} - {review?.recoveryMessageId === messageId && review.recoveryActions.length > 0 && ( -
- {review.recoveryActions.map((action) => ( - - ))} + + 0 || review.submitting)} + > +
+ {children} + {ownsReview && + !review.hasApprovalRows && + review.recoveryActions.length === 0 && + review.query.isError && ( +
+ +
+ )} + {ownsReview && review.recoveryActions.length > 0 && ( +
+ {review.recoveryActions.map((action) => ( + + ))} +
+ )} + {ownsReview && }
- )} +
) } @@ -283,10 +357,10 @@ export function AssistantActionReviewStatus({ fallback, }: AssistantActionReviewStatusProps) { const review = useContext(reviewContext) - const messageId = useContext(reviewMessageContext) + const message = useContext(reviewMessageContext) if (!review) return fallback if (review.query.isPending) return - if (messageId === review.assistantMessageId) { + if (message?.messageId === review.assistantMessageId) { const action = review.byId.get(toolCallId) if (action) return if (!review.query.isError && review.query.data?.nextCursor != null) @@ -321,19 +395,22 @@ interface ActionReviewProps { } function ActionReview({ action, review }: ActionReviewProps) { + const message = useContext(reviewMessageContext) const draft = review.drafts.runId === action.runId ? review.drafts.edits[action.toolCallId] : undefined const edits = draft?.proposalVersion === action.proposalVersion ? draft.fields : {} const error = review.drafts.runId === action.runId ? review.drafts.errors[action.toolCallId] : undefined const disabled = review.submitting || review.query.isError + const pendingDecision = + review.pendingDecision?.toolCallId === action.toolCallId + ? review.pendingDecision.decision + : null const display = action.account ? resolveCredentialDisplay({ ...action.account, type: 'managed_oauth' }) : undefined - const firstInBatch = - review.actions.length > 1 && review.actions[0]?.toolCallId === action.toolCallId return ( -
+
@@ -347,7 +424,7 @@ function ActionReview({ action, review }: ActionReviewProps) { } >
-

+

{action.account?.displayName ?? 'Account unavailable'}

@@ -373,7 +450,7 @@ function ActionReview({ action, review }: ActionReviewProps) { )} {error?.proposalVersion === action.proposalVersion && ( -

+

{error.message}

)} @@ -381,35 +458,61 @@ function ActionReview({ action, review }: ActionReviewProps) { void review.submit([action], 'allow')} + onClick={(event) => message?.submit([action], 'allow', event.currentTarget)} > - Allow + {pendingDecision === 'allow' ? 'Saving…' : 'Allow'} - void review.submit([action], 'skip')}> - Cancel + message?.submit([action], 'skip', event.currentTarget)} + > + {pendingDecision === 'skip' ? 'Saving…' : 'Cancel'}
- {firstInBatch && ( -
- !entry.account?.active)} - onClick={() => void review.submit(review.actions, 'allow')} - > - Allow {review.actions.length} shown - - {review.query.data?.nextCursor != null && ( - - More actions are waiting. - - )} -
- )}
) } +interface ReviewBatchActionsProps { + review: ReviewContextValue +} + +function ReviewBatchActions({ review }: ReviewBatchActionsProps) { + const message = useContext(reviewMessageContext) + const disabled = review.submitting || review.query.isError + const hasMore = review.query.data?.nextCursor != null + if (review.actions.length < 2 && !review.submitting && !hasMore) return null + return ( +
+ {review.actions.length > 1 && ( +
+ !action.account?.active)} + onClick={(event) => message?.submit(review.actions, 'allow', event.currentTarget)} + > + Allow {review.actions.length} shown + + message?.submit(review.actions, 'skip', event.currentTarget)} + > + Cancel {review.actions.length} shown + +
+ )} + {review.submitting ? ( + + ) : ( + hasMore && ( +

More actions are waiting.

+ ) + )} +
+ ) +} + interface ActionReviewFieldProps { field: ReviewAction['fields'][number] actionId: string @@ -421,7 +524,7 @@ interface ActionReviewFieldProps { function ActionReviewField({ field, actionId, value, disabled, onEdit }: ActionReviewFieldProps) { const id = `assistant-action-${actionId}-${field.name}` return field.editable ? ( -
+
diff --git a/apps/sim/scripts/test-assistant-actions-e2e.ts b/apps/sim/scripts/test-assistant-actions-e2e.ts index 34c79931108..3d8dde08afc 100644 --- a/apps/sim/scripts/test-assistant-actions-e2e.ts +++ b/apps/sim/scripts/test-assistant-actions-e2e.ts @@ -73,12 +73,23 @@ const lagStreamId = generateId() const lagFirstCallId = generateId() const lagSecondCallId = generateId() const lateCallId = generateId() +const reviewChatId = generateId() +const reviewRunId = generateId() +const reviewStreamId = generateId() +const keyboardCallId = generateId() +const otherFocusCallId = generateId() +const navigationCallId = generateId() +const selectiveCallId = generateId() +const batchFirstCallId = generateId() +const batchSecondCallId = generateId() +const batchLateCallId = generateId() const requestId = generateId() const firstCallId = generateId() const secondCallId = generateId() const fixtureStreams = [ { chatId: assistantId, streamId }, { chatId: lagChatId, streamId: lagStreamId }, + { chatId: reviewChatId, streamId: reviewStreamId }, ] const streamPollers: ReturnType[] = [] const catalogAccounts = [ @@ -105,6 +116,7 @@ const token = generateShortId() const root = `/o/${organizationId}` const question = 'Create the two launch follow-up tickets in Jira.' const answer = 'Review the two Jira issues before I create them.' +const reviewAnswer = 'Review these keyboard and batch proposals.' const checks: { name: string; status: 'passed' | 'failed'; durationMs: number; error?: string }[] = [] const browserErrors: string[] = [] @@ -236,7 +248,8 @@ try { } await tx`insert into copilot_chats (id, user_id, organization_id, type, title, conversation_id, config) values (${assistantId}, ${userId}, ${organizationId}, 'mothership', 'Launch follow-up', ${streamId}, ${tx.json({ conversationMode: 'assistant' })}), - (${lagChatId}, ${userId}, ${organizationId}, 'mothership', 'Delayed action transcript', ${lagStreamId}, ${tx.json({ conversationMode: 'assistant' })})` + (${lagChatId}, ${userId}, ${organizationId}, 'mothership', 'Delayed action transcript', ${lagStreamId}, ${tx.json({ conversationMode: 'assistant' })}), + (${reviewChatId}, ${userId}, ${organizationId}, 'mothership', 'Keyboard and batch review', ${reviewStreamId}, ${tx.json({ conversationMode: 'assistant' })})` const oldResponseId = generateId() for (const message of [ { @@ -273,12 +286,14 @@ try { values (${generateId()}, ${assistantId}, ${data.id}, ${data.role}, ${stream}, ${tx.json({ ...content, requestId, timestamp: new Date().toISOString() })}, ${index + 1})` } await tx`insert into copilot_messages (id, chat_id, message_id, role, stream_id, content, seq) - values (${generateId()}, ${lagChatId}, ${lagStreamId}, 'user', ${lagStreamId}, ${tx.json({ id: lagStreamId, role: 'user', content: 'Create two more Jira issues.', requestId, timestamp: new Date().toISOString() })}, 1)` + values (${generateId()}, ${lagChatId}, ${lagStreamId}, 'user', ${lagStreamId}, ${tx.json({ id: lagStreamId, role: 'user', content: 'Create two more Jira issues.', requestId, timestamp: new Date().toISOString() })}, 1), + (${generateId()}, ${reviewChatId}, ${reviewStreamId}, 'user', ${reviewStreamId}, ${tx.json({ id: reviewStreamId, role: 'user', content: 'Prepare follow-up actions for review.', requestId, timestamp: new Date().toISOString() })}, 1)` await tx`insert into copilot_runs (id, chat_id, user_id, organization_id, execution_id, stream_id, tool_execution_version, status, started_at, completed_at, tool_admission_closed_at) values (${previousRunId}, ${assistantId}, ${userId}, ${organizationId}, ${generateId()}, ${previousStreamId}, 3, 'complete', now() - interval '1 hour', now() - interval '59 minutes', now() - interval '59 minutes')` await tx`insert into copilot_runs (id, chat_id, user_id, organization_id, execution_id, stream_id, tool_execution_version, status) values (${runId}, ${assistantId}, ${userId}, ${organizationId}, ${generateId()}, ${streamId}, 3, 'paused_waiting_for_tool'), - (${lagRunId}, ${lagChatId}, ${userId}, ${organizationId}, ${generateId()}, ${lagStreamId}, 3, 'paused_waiting_for_tool')` + (${lagRunId}, ${lagChatId}, ${userId}, ${organizationId}, ${generateId()}, ${lagStreamId}, 3, 'paused_waiting_for_tool'), + (${reviewRunId}, ${reviewChatId}, ${userId}, ${organizationId}, ${generateId()}, ${reviewStreamId}, 3, 'paused_waiting_for_tool')` }) await insertProposal(runId, firstCallId, 'Publish the launch checklist') await insertProposal(runId, secondCallId, 'Confirm the rollout owners') @@ -301,6 +316,10 @@ try { payload: { channel: 'assistant', text: 'I have prepared two more issues for review.' }, }, ]) + await appendStreamEvents(reviewChatId, reviewStreamId, [ + { type: 'session', payload: { kind: 'start' } }, + { type: 'text', payload: { channel: 'assistant', text: reviewAnswer } }, + ]) await context.addCookies([ { name: 'better-auth.session_token', @@ -639,6 +658,249 @@ try { ) } ) + await check( + 'A failed keyboard decision keeps focus and leaves the proposal pending', + async () => { + for (const [id, summary] of [ + [keyboardCallId, 'Approve with the keyboard'], + [otherFocusCallId, 'Keep focus in another field'], + [navigationCallId, 'Leave this conversation during a decision'], + ] as const) { + await insertProposal(reviewRunId, id, summary) + await appendStreamEvents(reviewChatId, reviewStreamId, [pendingToolEvent(id, summary)]) + } + await page.goto(`${baseUrl.origin}${root}/search/chat/${reviewChatId}`) + await expect(reviewCards).toHaveCount(3) + const actionUrl = `${baseUrl.origin}/api/organizations/${organizationId}/chats/${reviewChatId}/actions/${keyboardCallId}` + await page.route( + actionUrl, + (route) => + route.fulfill({ + status: 409, + contentType: 'application/json', + body: JSON.stringify({ error: 'The review could not be saved. Try again.' }), + }), + { times: 1 } + ) + const response = page.waitForResponse( + (response) => response.url() === actionUrl && response.request().method() === 'PATCH' + ) + const allow = reviewCards.nth(0).getByRole('button', { name: 'Allow', exact: true }) + await allow.focus() + await page.keyboard.press('Enter') + assert.equal((await response).status(), 409) + await expect(reviewCards.nth(0).getByRole('alert')).toBeVisible() + await expect(allow).toBeEnabled() + await expect(allow).toBeFocused() + const [row] = + await sql`select permission_decision, execution_started_at from copilot_async_tool_calls where tool_call_id = ${keyboardCallId}` + assert.equal(row?.permission_decision, null) + assert.equal(row?.execution_started_at, null) + } + ) + await check( + 'A completed keyboard decision restores focus without taking it from another field', + async () => { + const response = page.waitForResponse( + (response) => + response.url().endsWith(`/actions/${keyboardCallId}`) && + response.request().method() === 'PATCH' + ) + await reviewCards.nth(0).getByRole('button', { name: 'Allow', exact: true }).focus() + await page.keyboard.press('Enter') + assert.equal((await response).status(), 200) + await expect(reviewCards).toHaveCount(2) + await expect( + page + .getByRole('group', { name: 'Conversation turn', exact: true }) + .filter({ has: page.getByText(reviewAnswer, { exact: true }) }) + ).toBeFocused() + + const releaseDecision = createDeferred() + let decisionRequested = false + const actionUrl = `${baseUrl.origin}/api/organizations/${organizationId}/chats/${reviewChatId}/actions/${otherFocusCallId}` + await page.route(actionUrl, async (route) => { + decisionRequested = true + await releaseDecision.promise + await route.continue() + }) + try { + const cancellation = page.waitForResponse( + (response) => response.url() === actionUrl && response.request().method() === 'PATCH' + ) + await reviewCards.nth(0).getByRole('button', { name: 'Cancel', exact: true }).focus() + await page.keyboard.press('Enter') + await expect.poll(() => decisionRequested).toBe(true) + const composer = page.getByRole('textbox', { name: 'Ask Sim', exact: true }) + await composer.fill('Keep my focus here') + releaseDecision.resolve() + assert.equal((await cancellation).status(), 200) + await expect(reviewCards).toHaveCount(1) + await expect(composer).toBeFocused() + } finally { + releaseDecision.resolve() + await page.unroute(actionUrl) + } + } + ) + for (const intent of ['focus', 'pointer'] as const) { + await check( + `A completed review respects ${intent} movement away from its control`, + async () => { + const toolCallId = generateId() + const summary = `Preserve the user's ${intent} intent` + await insertProposal(reviewRunId, toolCallId, summary) + await appendStreamEvents(reviewChatId, reviewStreamId, [ + pendingToolEvent(toolCallId, summary), + ]) + await expect(reviewCards).toHaveCount(2) + const releaseDecision = createDeferred() + let decisionRequested = false + const actionUrl = `${baseUrl.origin}/api/organizations/${organizationId}/chats/${reviewChatId}/actions/${toolCallId}` + await page.route(actionUrl, async (route) => { + decisionRequested = true + await releaseDecision.promise + await route.continue() + }) + try { + await reviewCards.last().getByRole('button', { name: 'Cancel', exact: true }).focus() + await page.keyboard.press('Enter') + await expect.poll(() => decisionRequested).toBe(true) + if (intent === 'focus') { + const composer = page.getByRole('textbox', { name: 'Ask Sim', exact: true }) + await composer.fill('Continue elsewhere') + await expect(composer).toBeFocused() + await composer.evaluate((element) => { + if (element instanceof HTMLElement) element.blur() + }) + } else { + await page.locator('body').click({ position: { x: 1, y: 1 } }) + } + await expect(page.locator('body')).toBeFocused() + const response = page.waitForResponse( + (response) => response.url() === actionUrl && response.request().method() === 'PATCH' + ) + releaseDecision.resolve() + assert.equal((await response).status(), 200) + await expect(reviewCards).toHaveCount(1) + await expect(page.locator('body')).toBeFocused() + const [row] = + await sql`select permission_decision, execution_started_at from copilot_async_tool_calls where tool_call_id = ${toolCallId}` + assert.equal(row?.permission_decision, 'skip') + assert.equal(row?.execution_started_at, null) + } finally { + releaseDecision.resolve() + await page.unroute(actionUrl) + } + } + ) + } + await check( + 'A decision completing after navigation does not take focus from Search', + async () => { + let decisionPersisted = false + const releaseResponse = createDeferred() + let responseReleased = false + const actionUrl = `${baseUrl.origin}/api/organizations/${organizationId}/chats/${reviewChatId}/actions/${navigationCallId}` + await page.route(actionUrl, async (route) => { + const response = await route.fetch() + assert.equal(response.status(), 200) + decisionPersisted = true + await releaseResponse.promise + try { + await route.fulfill({ response }) + } finally { + responseReleased = true + } + }) + try { + await reviewCards.getByRole('button', { name: 'Cancel', exact: true }).focus() + await page.keyboard.press('Enter') + await expect.poll(() => decisionPersisted).toBe(true) + await page.goto(`${baseUrl.origin}${root}/search`) + const search = page.getByRole('textbox', { name: 'Search your sources', exact: true }) + await search.fill('Continue searching') + releaseResponse.resolve() + await expect.poll(() => responseReleased).toBe(true) + await expect(search).toBeFocused() + const [row] = + await sql`select permission_decision, execution_started_at from copilot_async_tool_calls where tool_call_id = ${navigationCallId}` + assert.equal(row?.permission_decision, 'skip') + assert.equal(row?.execution_started_at, null) + } finally { + releaseResponse.resolve() + await page.unroute(actionUrl) + } + } + ) + await check('Cancel all skips its displayed snapshot after a selective approval', async () => { + for (const [id, summary] of [ + [selectiveCallId, 'Allow this proposal separately'], + [batchFirstCallId, 'Cancel the first pending proposal'], + [batchSecondCallId, 'Cancel the second pending proposal'], + ] as const) { + await insertProposal(reviewRunId, id, summary) + await appendStreamEvents(reviewChatId, reviewStreamId, [pendingToolEvent(id, summary)]) + } + await page.goto(`${baseUrl.origin}${root}/search/chat/${reviewChatId}`) + await expect(reviewCards).toHaveCount(3) + const approval = page.waitForResponse( + (response) => + response.url().endsWith(`/actions/${selectiveCallId}`) && + response.request().method() === 'PATCH' + ) + await reviewCards.nth(0).getByRole('button', { name: 'Allow', exact: true }).click() + assert.equal((await approval).status(), 200) + await expect(reviewCards).toHaveCount(2) + const releaseFirstDecision = createDeferred() + let firstDecisionRequested = false + const firstActionUrl = `${baseUrl.origin}/api/organizations/${organizationId}/chats/${reviewChatId}/actions/${batchFirstCallId}` + await page.route(firstActionUrl, async (route) => { + firstDecisionRequested = true + await releaseFirstDecision.promise + await route.continue() + }) + try { + await page.getByRole('button', { name: 'Cancel 2 shown', exact: true }).click() + await expect.poll(() => firstDecisionRequested).toBe(true) + await insertProposal(reviewRunId, batchLateCallId, 'This later proposal was not canceled') + await appendStreamEvents(reviewChatId, reviewStreamId, [ + pendingToolEvent(batchLateCallId, 'This later proposal was not canceled'), + ]) + await expect(reviewCards).toHaveCount(3) + releaseFirstDecision.resolve() + await expect + .poll(async () => { + const rows = + await sql`select tool_call_id, permission_decision from copilot_async_tool_calls where tool_call_id in (${selectiveCallId}, ${batchFirstCallId}, ${batchSecondCallId}, ${batchLateCallId}) order by persist_seq` + return rows.map((row) => [row.tool_call_id, row.permission_decision]) + }) + .toEqual([ + [selectiveCallId, 'allow'], + [batchFirstCallId, 'skip'], + [batchSecondCallId, 'skip'], + [batchLateCallId, null], + ]) + await expect(reviewCards).toHaveCount(1) + const cancellation = page.waitForResponse( + (response) => + response.url().endsWith(`/actions/${batchLateCallId}`) && + response.request().method() === 'PATCH' + ) + await reviewCards.getByRole('button', { name: 'Cancel', exact: true }).click() + assert.equal((await cancellation).status(), 200) + await expect(reviewCards).toHaveCount(0) + } finally { + releaseFirstDecision.resolve() + await page.unroute(firstActionUrl) + } + const rows = + await sql`select execution_started_at from copilot_async_tool_calls where run_id = ${reviewRunId}` + assert( + rows.every((row) => row.execution_started_at === null), + 'A fixture action executed' + ) + }) await check('An organization URL cannot expose a different organization’s review', async () => { const response = await context.request.get( `${baseUrl.origin}/api/organizations/${otherOrganizationId}/chats/${assistantId}/actions` @@ -663,8 +925,7 @@ try { await sql`delete from project where owner_id = ${userId}` await sql`delete from organization where id in (${organizationId},${otherOrganizationId})` await sql`delete from "user" where id = ${userId}` - await clearBuffer(streamId) - await clearBuffer(lagStreamId) + for (const stream of fixtureStreams) await clearBuffer(stream.streamId) } catch (error) { checks.push({ name: 'Fixture cleanup', diff --git a/apps/sim/scripts/test-organization-search-e2e.ts b/apps/sim/scripts/test-organization-search-e2e.ts index 00d24ab6e18..48b456d5e99 100644 --- a/apps/sim/scripts/test-organization-search-e2e.ts +++ b/apps/sim/scripts/test-organization-search-e2e.ts @@ -1,12 +1,14 @@ import assert from 'node:assert/strict' import { mkdir, writeFile } from 'node:fs/promises' import { dirname, resolve } from 'node:path' -import { chromium, expect } from '@playwright/test' +import { type BrowserContext, chromium, expect } from '@playwright/test' import { assertDisposableTestDatabaseUrl } from '@sim/db/testing/test-infrastructure' import { createLogger } from '@sim/logger' +import { toStringOrNull } from '@sim/utils/coerce' import { getErrorMessage } from '@sim/utils/errors' import { generateId, generateShortId } from '@sim/utils/id' import { toRecord } from '@sim/utils/object' +import { truncate } from '@sim/utils/string' import { makeSignature } from 'better-auth/crypto' import postgres from 'postgres' @@ -48,13 +50,147 @@ const question = 'What is the latest on the product launch?' const answer = 'The launch checklist is complete and ready for approval.' const checks: { name: string; status: 'passed' | 'failed'; durationMs: number; error?: string }[] = [] +const DIAGNOSTIC_LIMITS = { samples: 40, text: 2000, stack: 8000, templates: 8 } as const +interface BrowserErrorSample { + stage: string + url: string + message: string + stack: string + digest: string | null + templates: { digest: string | null; message: string | null }[] + count: number +} const browserErrors: string[] = [] +const browserErrorSamples: BrowserErrorSample[] = [] +const browserErrorEvents: BrowserErrorSample[] = [] +const documentResponses: { + stage: string + url: string + status: number + headers: Record +}[] = [] +let browserErrorCount = 0 +let browserErrorEventCount = 0 +let currentCheck = 'Setup' + +function recordErrorSample( + samples: BrowserErrorSample[], + sample: Omit +) { + const previous = samples.find( + (entry) => + entry.stage === sample.stage && + entry.url === sample.url && + entry.message === sample.message && + entry.stack === sample.stack && + entry.digest === sample.digest + ) + if (previous) previous.count += 1 + else if (samples.length < DIAGNOSTIC_LIMITS.samples) samples.push({ ...sample, count: 1 }) +} + +async function observeBrowserContext(observedContext: BrowserContext) { + await observedContext.exposeBinding( + 'recordOrganizationSearchError', + (_source, payload: unknown) => { + const event = toRecord(payload) + browserErrorEventCount += 1 + recordErrorSample(browserErrorEvents, { + stage: currentCheck, + url: truncate(toStringOrNull(event.url) ?? '', DIAGNOSTIC_LIMITS.text), + message: truncate(toStringOrNull(event.message) ?? '', DIAGNOSTIC_LIMITS.text), + stack: truncate(toStringOrNull(event.stack) ?? '', DIAGNOSTIC_LIMITS.stack), + digest: toStringOrNull(event.digest)?.slice(0, DIAGNOSTIC_LIMITS.text) ?? null, + templates: Array.isArray(event.templates) + ? event.templates.slice(0, DIAGNOSTIC_LIMITS.templates).map((value: unknown) => { + const template = toRecord(value) + return { + digest: toStringOrNull(template.digest)?.slice(0, DIAGNOSTIC_LIMITS.text) ?? null, + message: toStringOrNull(template.message)?.slice(0, DIAGNOSTIC_LIMITS.text) ?? null, + } + }) + : [], + }) + } + ) + await observedContext.addInitScript((limits) => { + const report = ( + window as typeof window & { + recordOrganizationSearchError: (sample: unknown) => Promise + } + ).recordOrganizationSearchError + window.addEventListener('error', (event) => { + const message: unknown = event.error?.message + const stack: unknown = event.error?.stack + const digest: unknown = event.error?.digest + void report({ + url: location.href.slice(0, limits.text), + message: (typeof message === 'string' ? message : event.message).slice(0, limits.text), + stack: typeof stack === 'string' ? stack.slice(0, limits.stack) : '', + digest: typeof digest === 'string' ? digest.slice(0, limits.text) : null, + templates: Array.from(document.querySelectorAll('template[data-dgst], template[data-msg]')) + .slice(0, limits.templates) + .map((template) => ({ + digest: template.getAttribute('data-dgst')?.slice(0, limits.text) ?? null, + message: template.getAttribute('data-msg')?.slice(0, limits.text) ?? null, + })), + }).catch(() => {}) + }) + }, DIAGNOSTIC_LIMITS) + observedContext.on('page', (observedPage) => { + observedPage.on('pageerror', (error) => { + browserErrorCount += 1 + const message = truncate(error.message, DIAGNOSTIC_LIMITS.text) + if (!browserErrors.includes(message) && browserErrors.length < DIAGNOSTIC_LIMITS.samples) { + browserErrors.push(message) + } + recordErrorSample(browserErrorSamples, { + stage: currentCheck, + url: truncate(observedPage.url(), DIAGNOSTIC_LIMITS.text), + message, + stack: truncate(error.stack ?? '', DIAGNOSTIC_LIMITS.stack), + digest: null, + templates: [], + }) + }) + observedPage.on('response', (response) => { + if ( + response.request().resourceType() !== 'document' || + response.frame() !== observedPage.mainFrame() || + documentResponses.length >= DIAGNOSTIC_LIMITS.samples + ) { + return + } + const headers: Record = {} + for (const name of [ + 'content-type', + 'cache-control', + 'x-nextjs-cache', + 'x-nextjs-prerender', + 'x-nextjs-stale-time', + 'x-nextjs-postponed', + 'x-matched-path', + ]) { + const value = response.headers()[name] + if (value) headers[name] = truncate(value, DIAGNOSTIC_LIMITS.text) + } + documentResponses.push({ + stage: currentCheck, + url: truncate(response.url(), DIAGNOSTIC_LIMITS.text), + status: response.status(), + headers, + }) + }) + }) +} + const browser = await chromium.launch() const context = await browser.newContext({ viewport: { width: 1440, height: 1000 } }) +await observeBrowserContext(context) const page = await context.newPage() -page.on('pageerror', (error) => browserErrors.push(error.message)) async function check(name: string, run: () => Promise) { + currentCheck = name const started = performance.now() try { await run() @@ -83,9 +219,9 @@ async function verifyLegacyDraft( existingDraft = false ) { const legacyContext = await browser.newContext() + await observeBrowserContext(legacyContext) await legacyContext.addCookies(await context.cookies()) const legacyPage = await legacyContext.newPage() - legacyPage.on('pageerror', (error) => browserErrors.push(error.message)) const prefix = `${userId}:organization:${organizationId}:` const draftKey = `${prefix}${destination === 'assistant' ? 'search-assistant' : 'home'}` const attachment = { @@ -351,6 +487,7 @@ try { await capture('failure').catch(() => {}) process.exitCode = 1 } finally { + currentCheck = 'Teardown' await browser.close() try { await sql.begin(async (tx) => { @@ -371,5 +508,21 @@ try { await sql.end() } await mkdir(dirname(reportPath), { recursive: true }) - await writeFile(reportPath, JSON.stringify({ checks, browserErrors, artifactDirectory }, null, 2)) + await writeFile( + reportPath, + JSON.stringify( + { + checks, + browserErrors, + browserErrorCount, + browserErrorSamples, + browserErrorEventCount, + browserErrorEvents, + documentResponses, + artifactDirectory, + }, + null, + 2 + ) + ) }