feat(credential-groups): add personal MCP OAuth connections #29843
ci.yml
on: pull_request
Detect Version
Migrate Dev DB
/
Apply Database Migrations
Detect Desktop Changes
0s
Matrix: Build AMD64
Matrix: Build ARM64 (GHCR Only)
Matrix: Test and Build / test-shard
Test and Build
/
Lint and Test
2m 17s
Test and Build
/
Build App
2m 29s
Check Docs Changes
Matrix: Build Dev ECR
Deploy Trigger.dev (Dev)
0s
Matrix: Create GHCR Manifests
Process Docs
/
Process Documentation Embeddings
Prune Desktop Prereleases
Desktop Release
/
Build, Sign, Notarize
Annotations
21 errors and 15 warnings
|
app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/prompt-editor.test.tsx > PromptEditor autosize > re-measures on the first delivery when the width changed before it arrived:
apps/sim/app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.ts#L168
Error: [vitest] No "useMcpToolServers" export is defined on the "@/hooks/queries/mcp" mock. Did you forget to return it from "vi.mock"?
If you need to partially mock a module, you can use "importOriginal" helper inside:
vi.mock(import("@/hooks/queries/mcp"), async (importOriginal) => {
const actual = await importOriginal()
return {
...actual,
// your mocked methods
}
})
❯ Module.usePromptEditor app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.ts:168:40
❯ Probe app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/prompt-editor.test.tsx:106:20
❯ Object.react_stack_bottom_frame ../../node_modules/react-dom/cjs/react-dom-client.development.js:25904:20
❯ renderWithHooks ../../node_modules/react-dom/cjs/react-dom-client.development.js:7662:22
❯ updateFunctionComponent ../../node_modules/react-dom/cjs/react-dom-client.development.js:10166:19
❯ beginWork ../../node_modules/react-dom/cjs/react-dom-client.development.js:11778:18
❯ runWithFiberInDEV ../../node_modules/react-dom/cjs/react-dom-client.development.js:874:13
❯ performUnitOfWork ../../node_modules/react-dom/cjs/react-dom-client.development.js:17641:22
|
|
app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/prompt-editor.test.tsx > PromptEditor autosize > re-measures again when the editor widens back:
apps/sim/app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.ts#L168
Error: [vitest] No "useMcpToolServers" export is defined on the "@/hooks/queries/mcp" mock. Did you forget to return it from "vi.mock"?
If you need to partially mock a module, you can use "importOriginal" helper inside:
vi.mock(import("@/hooks/queries/mcp"), async (importOriginal) => {
const actual = await importOriginal()
return {
...actual,
// your mocked methods
}
})
❯ Module.usePromptEditor app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.ts:168:40
❯ Probe app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/prompt-editor.test.tsx:106:20
❯ Object.react_stack_bottom_frame ../../node_modules/react-dom/cjs/react-dom-client.development.js:25904:20
❯ renderWithHooks ../../node_modules/react-dom/cjs/react-dom-client.development.js:7662:22
❯ updateFunctionComponent ../../node_modules/react-dom/cjs/react-dom-client.development.js:10166:19
❯ beginWork ../../node_modules/react-dom/cjs/react-dom-client.development.js:11778:18
❯ runWithFiberInDEV ../../node_modules/react-dom/cjs/react-dom-client.development.js:874:13
❯ performUnitOfWork ../../node_modules/react-dom/cjs/react-dom-client.development.js:17641:22
|
|
app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/prompt-editor.test.tsx > PromptEditor autosize > re-measures when the editor width changes so no text falls outside the textarea:
apps/sim/app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.ts#L168
Error: [vitest] No "useMcpToolServers" export is defined on the "@/hooks/queries/mcp" mock. Did you forget to return it from "vi.mock"?
If you need to partially mock a module, you can use "importOriginal" helper inside:
vi.mock(import("@/hooks/queries/mcp"), async (importOriginal) => {
const actual = await importOriginal()
return {
...actual,
// your mocked methods
}
})
❯ Module.usePromptEditor app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.ts:168:40
❯ Probe app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/prompt-editor.test.tsx:106:20
❯ Object.react_stack_bottom_frame ../../node_modules/react-dom/cjs/react-dom-client.development.js:25904:20
❯ renderWithHooks ../../node_modules/react-dom/cjs/react-dom-client.development.js:7662:22
❯ updateFunctionComponent ../../node_modules/react-dom/cjs/react-dom-client.development.js:10166:19
❯ beginWork ../../node_modules/react-dom/cjs/react-dom-client.development.js:11778:18
❯ runWithFiberInDEV ../../node_modules/react-dom/cjs/react-dom-client.development.js:874:13
❯ performUnitOfWork ../../node_modules/react-dom/cjs/react-dom-client.development.js:17641:22
|
|
app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/prompt-editor.test.tsx > PromptEditor autosize > shrinks the textarea again when the prompt becomes shorter:
apps/sim/app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.ts#L168
Error: [vitest] No "useMcpToolServers" export is defined on the "@/hooks/queries/mcp" mock. Did you forget to return it from "vi.mock"?
If you need to partially mock a module, you can use "importOriginal" helper inside:
vi.mock(import("@/hooks/queries/mcp"), async (importOriginal) => {
const actual = await importOriginal()
return {
...actual,
// your mocked methods
}
})
❯ Module.usePromptEditor app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.ts:168:40
❯ Probe app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/prompt-editor.test.tsx:106:20
❯ Object.react_stack_bottom_frame ../../node_modules/react-dom/cjs/react-dom-client.development.js:25904:20
❯ renderWithHooks ../../node_modules/react-dom/cjs/react-dom-client.development.js:7662:22
❯ updateFunctionComponent ../../node_modules/react-dom/cjs/react-dom-client.development.js:10166:19
❯ beginWork ../../node_modules/react-dom/cjs/react-dom-client.development.js:11778:18
❯ runWithFiberInDEV ../../node_modules/react-dom/cjs/react-dom-client.development.js:874:13
❯ performUnitOfWork ../../node_modules/react-dom/cjs/react-dom-client.development.js:17641:22
|
|
app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/prompt-editor.test.tsx > PromptEditor autosize > sizes the textarea to its content height on mount:
apps/sim/app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.ts#L168
Error: [vitest] No "useMcpToolServers" export is defined on the "@/hooks/queries/mcp" mock. Did you forget to return it from "vi.mock"?
If you need to partially mock a module, you can use "importOriginal" helper inside:
vi.mock(import("@/hooks/queries/mcp"), async (importOriginal) => {
const actual = await importOriginal()
return {
...actual,
// your mocked methods
}
})
❯ Module.usePromptEditor app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.ts:168:40
❯ Probe app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/prompt-editor.test.tsx:106:20
❯ Object.react_stack_bottom_frame ../../node_modules/react-dom/cjs/react-dom-client.development.js:25904:20
❯ renderWithHooks ../../node_modules/react-dom/cjs/react-dom-client.development.js:7662:22
❯ updateFunctionComponent ../../node_modules/react-dom/cjs/react-dom-client.development.js:10166:19
❯ beginWork ../../node_modules/react-dom/cjs/react-dom-client.development.js:11778:18
❯ runWithFiberInDEV ../../node_modules/react-dom/cjs/react-dom-client.development.js:874:13
❯ performUnitOfWork ../../node_modules/react-dom/cjs/react-dom-client.development.js:17641:22
|
|
lib/internal/mcp/execute-tool.test.ts > executeMcpTool > parses direct block arguments and invokes the authorized use case:
apps/sim/lib/internal/mcp/execute-tool.test.ts#L93
AssertionError: expected "vi.fn()" to be called with arguments: [ { context: { …(5) }, …(1) } ]
Received:
1st vi.fn() call:
@@ -22,7 +22,10 @@
],
"userId": "user-1",
"workflowId": "workflow-1",
"workspaceId": "workspace-1",
},
+ "resourceScope": {
+ "mcpServerId": "mcp-server",
+ },
},
]
Number of calls: 1
❯ lib/internal/mcp/execute-tool.test.ts:93:35
|
|
lib/credentials/application/credential-crud.test.ts > personal-credential capability > creates the personal secret when no group withholds it:
apps/sim/lib/credentials/application/credential-crud.ts#L248
Error: [vitest] No "requireOrdinaryCredentialType" export is defined on the "@/lib/credentials/access" mock. Did you forget to return it from "vi.mock"?
If you need to partially mock a module, you can use "importOriginal" helper inside:
vi.mock(import("@/lib/credentials/access"), async (importOriginal) => {
const actual = await importOriginal()
return {
...actual,
// your mocked methods
}
})
❯ Object.afterSuccess lib/credentials/application/credential-crud.ts:248:26
❯ Object.execute lib/core/application/authorized-workspace-use-case.ts:211:24
❯ lib/credentials/application/credential-crud.test.ts:403:20
|
|
lib/credentials/application/credential-crud.test.ts > personal-credential capability > still creates a workspace-shared secret under the same restriction:
apps/sim/lib/credentials/application/credential-crud.ts#L248
Error: [vitest] No "requireOrdinaryCredentialType" export is defined on the "@/lib/credentials/access" mock. Did you forget to return it from "vi.mock"?
If you need to partially mock a module, you can use "importOriginal" helper inside:
vi.mock(import("@/lib/credentials/access"), async (importOriginal) => {
const actual = await importOriginal()
return {
...actual,
// your mocked methods
}
})
❯ Object.afterSuccess lib/credentials/application/credential-crud.ts:248:26
❯ Object.execute lib/core/application/authorized-workspace-use-case.ts:211:24
❯ lib/credentials/application/credential-crud.test.ts:379:20
|
|
lib/credential-groups/mcp-oauth-state.test.ts > Credential Group MCP OAuth state > encrypts bearer material and consumes an attempt exactly once:
apps/sim/lib/credential-groups/mcp-oauth-state.ts#L112
TypeError: redis.sadd is not a function
❯ Module.createCredentialGroupMcpOAuthAttempt lib/credential-groups/mcp-oauth-state.ts:112:15
❯ lib/credential-groups/mcp-oauth-state.test.ts:54:5
|
|
Test and Build / Test (shard 2)
@sim/app#test: command (/home/runner/_work/sim/sim/apps/sim) /home/runner/.bun/bin/bun run test exited (1)
|
|
app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.test.tsx > usePromptEditor mention menu dismissal > lets a further keystroke reopen the same mention after a dismiss:
apps/sim/app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.ts#L168
Error: [vitest] No "useMcpToolServers" export is defined on the "@/hooks/queries/mcp" mock. Did you forget to return it from "vi.mock"?
If you need to partially mock a module, you can use "importOriginal" helper inside:
vi.mock(import("@/hooks/queries/mcp"), async (importOriginal) => {
const actual = await importOriginal()
return {
...actual,
// your mocked methods
}
})
❯ Module.usePromptEditor app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.ts:168:40
❯ Probe app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.test.tsx:42:14
❯ Object.react_stack_bottom_frame ../../node_modules/react-dom/cjs/react-dom-client.development.js:25904:20
❯ renderWithHooks ../../node_modules/react-dom/cjs/react-dom-client.development.js:7662:22
❯ updateFunctionComponent ../../node_modules/react-dom/cjs/react-dom-client.development.js:10166:19
❯ beginWork ../../node_modules/react-dom/cjs/react-dom-client.development.js:11778:18
❯ runWithFiberInDEV ../../node_modules/react-dom/cjs/react-dom-client.development.js:874:13
❯ performUnitOfWork ../../node_modules/react-dom/cjs/react-dom-client.development.js:17641:22
|
|
app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.test.tsx > usePromptEditor mention menu dismissal > stays closed across repeated clicks at the same position after the user clicks away, even if the caret lands back inside the open mention:
apps/sim/app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.ts#L168
Error: [vitest] No "useMcpToolServers" export is defined on the "@/hooks/queries/mcp" mock. Did you forget to return it from "vi.mock"?
If you need to partially mock a module, you can use "importOriginal" helper inside:
vi.mock(import("@/hooks/queries/mcp"), async (importOriginal) => {
const actual = await importOriginal()
return {
...actual,
// your mocked methods
}
})
❯ Module.usePromptEditor app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.ts:168:40
❯ Probe app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.test.tsx:42:14
❯ Object.react_stack_bottom_frame ../../node_modules/react-dom/cjs/react-dom-client.development.js:25904:20
❯ renderWithHooks ../../node_modules/react-dom/cjs/react-dom-client.development.js:7662:22
❯ updateFunctionComponent ../../node_modules/react-dom/cjs/react-dom-client.development.js:10166:19
❯ beginWork ../../node_modules/react-dom/cjs/react-dom-client.development.js:11778:18
❯ runWithFiberInDEV ../../node_modules/react-dom/cjs/react-dom-client.development.js:874:13
❯ performUnitOfWork ../../node_modules/react-dom/cjs/react-dom-client.development.js:17641:22
|
|
app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.test.tsx > usePromptEditor mention menu dismissal > reopens the menu while the user keeps typing an unmatched mention:
apps/sim/app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.ts#L168
Error: [vitest] No "useMcpToolServers" export is defined on the "@/hooks/queries/mcp" mock. Did you forget to return it from "vi.mock"?
If you need to partially mock a module, you can use "importOriginal" helper inside:
vi.mock(import("@/hooks/queries/mcp"), async (importOriginal) => {
const actual = await importOriginal()
return {
...actual,
// your mocked methods
}
})
❯ Module.usePromptEditor app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.ts:168:40
❯ Probe app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/use-prompt-editor.test.tsx:42:14
❯ Object.react_stack_bottom_frame ../../node_modules/react-dom/cjs/react-dom-client.development.js:25904:20
❯ renderWithHooks ../../node_modules/react-dom/cjs/react-dom-client.development.js:7662:22
❯ updateFunctionComponent ../../node_modules/react-dom/cjs/react-dom-client.development.js:10166:19
❯ beginWork ../../node_modules/react-dom/cjs/react-dom-client.development.js:11778:18
❯ runWithFiberInDEV ../../node_modules/react-dom/cjs/react-dom-client.development.js:874:13
❯ performUnitOfWork ../../node_modules/react-dom/cjs/react-dom-client.development.js:17641:22
|
|
lib/mcp/application/operations.test.ts > MCP operation capability declarations > declares a capability on every operation, by name:
apps/sim/lib/mcp/application/operations.test.ts#L169
AssertionError: expected { list: 'mcp_tools.use', …(17) } to deeply equal { list: 'mcp_tools.use', …(16) }
- Expected
+ Received
@@ -5,10 +5,11 @@
"deleteWorkflowDeploymentServer": "deploy.mcp",
"deployWorkflowTool": "deploy.mcp",
"discoverTools": "mcp_tools.use",
"executeTool": "mcp_tools.use",
"list": "mcp_tools.use",
+ "listManagedConnections": "mcp_tools.use",
"listWorkflowDeploymentTools": "deploy.mcp",
"listWorkflowDeployments": "deploy.mcp",
"read": "mcp_tools.use",
"readWorkflowDeploymentServer": "deploy.mcp",
"reconfigure": "mcp_tools.use",
❯ lib/mcp/application/operations.test.ts:169:22
|
|
executor/handlers/agent/agent-handler.test.ts > AgentBlockHandler > execute > should discover MCP tools without cached schema through the application operation:
apps/sim/executor/handlers/agent/agent-handler.test.ts#L3688
AssertionError: expected "vi.fn()" to be called with arguments: [ ObjectContaining{…} ]
Number of calls: 0
❯ executor/handlers/agent/agent-handler.test.ts:3688:52
|
|
executor/handlers/agent/agent-handler.test.ts > AgentBlockHandler > execute > should handle multiple MCP tools from the same server efficiently:
apps/sim/executor/handlers/agent/agent-handler.test.ts#L3639
AssertionError: expected +0 to be 3 // Object.is equality
- Expected
+ Received
- 3
+ 0
❯ executor/handlers/agent/agent-handler.test.ts:3639:48
|
|
executor/handlers/agent/agent-handler.test.ts > AgentBlockHandler > execute > should pass the cached tool schema to the provider:
apps/sim/executor/handlers/agent/agent-handler.test.ts#L3409
AssertionError: expected +0 to be 1 // Object.is equality
- Expected
+ Received
- 1
+ 0
❯ executor/handlers/agent/agent-handler.test.ts:3409:48
|
|
executor/handlers/agent/agent-handler.test.ts > AgentBlockHandler > execute > projects only resolver-recorded inline and cached tool metadata for the model:
apps/sim/executor/handlers/agent/agent-handler.test.ts#L1696
AssertionError: expected [ { id: 'custom_lookup', …(4) } ] to deeply equal ArrayContaining{…}
- Expected
+ Received
- ArrayContaining [
- ObjectContaining {
+ [
+ {
"description": "Use {{CUSTOM_DESCRIPTION}} for Box",
"id": "custom_lookup",
- "parameters": ObjectContaining {
+ "parameters": {
"properties": {
"query": {
"description": "Query {{CUSTOM_PARAMETER}}",
"enum": [
"x",
"safe",
],
"type": "string",
},
},
+ "required": [
+ "query",
+ ],
+ "type": "object",
},
- },
- ObjectContaining {
- "description": "MCP tool search_files from Docs {{MCP_SERVER_LABEL}}",
- "id": StringContaining "search_files",
- "parameters": ObjectContaining {
- "properties": {
- "query": {
- "description": "Search {{MCP_PARAMETER}}",
- "type": "string",
- },
- },
- },
+ "params": {},
+ "usageControl": "auto",
},
]
❯ executor/handlers/agent/agent-handler.test.ts:1696:37
|
|
lib/credential-groups/mcp-connections.test.ts > listCredentialGroupMcpConnectionReferences > returns MCP credential IDs and tool names without secret material:
apps/sim/lib/credential-groups/mcp-connections.ts#L141
Error: Managed MCP server mcp-server-1 has no connector ID
❯ lib/credential-groups/mcp-connections.ts:141:15
❯ listCredentialGroupMcpConnectionReferences lib/credential-groups/mcp-connections.ts:136:30
❯ lib/credential-groups/mcp-connections.test.ts:28:20
|
|
Test and Build / Lint and Test
@sim/app#test: command (/home/runner/_work/sim/sim/apps/sim) /home/runner/.bun/bin/bun run test exited (1)
|
|
Test and Build / Lint and Test
Process completed with exit code 1.
|
|
Test and Build / Test (shard 2)
Skipping sticky disk commit due to previous step failures
|
|
Test and Build / Test (shard 2)
- Step: unknown (failed)
|
|
Test and Build / Test (shard 2)
Found 2 failed/cancelled steps in previous workflow steps
|
|
Test and Build / Test (shard 2)
Skipping sticky disk commit due to previous step failures
|
|
Test and Build / Test (shard 2)
- Step: unknown (failed)
|
|
Test and Build / Test (shard 2)
Found 2 failed/cancelled steps in previous workflow steps
|
|
Test and Build / Test (shard 2)
Skipping sticky disk commit due to previous step failures
|
|
Test and Build / Test (shard 2)
- Step: unknown (failed)
|
|
Test and Build / Test (shard 2)
Found 2 failed/cancelled steps in previous workflow steps
|
|
Test and Build / Lint and Test
Skipping sticky disk commit due to previous step failures
|
|
Test and Build / Lint and Test
Found 2 failed/cancelled steps in previous workflow steps
|
|
Test and Build / Lint and Test
Skipping sticky disk commit due to previous step failures
|
|
Test and Build / Lint and Test
Found 2 failed/cancelled steps in previous workflow steps
|
|
Test and Build / Lint and Test
Skipping sticky disk commit due to previous step failures
|
|
Test and Build / Lint and Test
Found 2 failed/cancelled steps in previous workflow steps
|