You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Records decisions from spec review: coding controls stay inside the vanilla chat flow and remain unobtrusive, coding state is scoped to coding-enabled chat sessions, and Serena is offered as a predefined MCP settings template with uv/setup guidance rather than auto-installed.
Tests: rg -n "TBD|TODO|PLACEHOLDER|FIXME|\?\?" docs/architecture/coding-workspace.md
Tests: sed -n '100,240p' docs/architecture/coding-workspace.md
Tests: sed -n '350,520p' docs/architecture/coding-workspace.md
Follow-up: decide Architect write approvals and first ACP backend.
We reviewed changes in daf9605...26f177d on this pull request. Below is the summary for the review, and you can see the individual issues we found as inline review comments.
Some issues found as part of this review are outside of the diff in this pull request and aren't shown in the inline review comments due to GitHub's API limitations. You can see those issues on the DeepSource dashboard.
AI Review is run only on demand for your team. We're only showing results of static analysis review right now. To trigger AI Review, comment @deepsourcebot review on this thread.
The reason will be displayed to describe this comment to others. Learn more.
Found `async` function without any `await` expressions
A function that does not contain any await expressions should not be async (except for some edge cases in TypeScript which are discussed below). Asynchronous functions in JavaScript behave differently than other functions in two important ways:
The reason will be displayed to describe this comment to others. Learn more.
Found `async` function without any `await` expressions
A function that does not contain any await expressions should not be async (except for some edge cases in TypeScript which are discussed below). Asynchronous functions in JavaScript behave differently than other functions in two important ways:
The reason will be displayed to describe this comment to others. Learn more.
Unexpected any. Specify a different type
The any type can sometimes leak into your codebase. TypeScript compiler skips the type checking of the any typed variables, so it creates a potential safety hole, and source of bugs in your codebase. We recommend using unknown or never type variable.
The reason will be displayed to describe this comment to others. Learn more.
Found `async` function without any `await` expressions
A function that does not contain any await expressions should not be async (except for some edge cases in TypeScript which are discussed below). Asynchronous functions in JavaScript behave differently than other functions in two important ways:
The reason will be displayed to describe this comment to others. Learn more.
Found `async` function without any `await` expressions
A function that does not contain any await expressions should not be async (except for some edge cases in TypeScript which are discussed below). Asynchronous functions in JavaScript behave differently than other functions in two important ways:
The reason will be displayed to describe this comment to others. Learn more.
'toolExecutionContext' was used before it was defined
Variables, functions and types should always be used after they've been defined. This issue will flag any code snippets that use variables or types before definition.
The reason will be displayed to describe this comment to others. Learn more.
Found `async` function without any `await` expressions
A function that does not contain any await expressions should not be async (except for some edge cases in TypeScript which are discussed below). Asynchronous functions in JavaScript behave differently than other functions in two important ways:
The reason will be displayed to describe this comment to others. Learn more.
'toolExecutionContext' was used before it was defined
Variables, functions and types should always be used after they've been defined. This issue will flag any code snippets that use variables or types before definition.
The reason will be displayed to describe this comment to others. Learn more.
Found `async` function without any `await` expressions
A function that does not contain any await expressions should not be async (except for some edge cases in TypeScript which are discussed below). Asynchronous functions in JavaScript behave differently than other functions in two important ways:
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request establishes the architecture, requirements, and testing infrastructure for the AIRI-native Coding Workspace, introducing Spec mode, async subagents, and a swarm runtime. It also updates MCP tool error handling to provide actionable recovery instructions. The reviewer feedback correctly identifies that the error message in the MCP server manager refers to a non-existent listTools tool instead of the correct builtIn_mcpListTools identifier, which should be corrected to prevent model invocation failures.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
? `MCP server "${serverName}" is not running. No MCP servers are currently running.`
: `MCP server "${serverName}" is not running. Running servers: ${runningServers.map((s) => `"${s}"`).join(', ')}. Call listTools exactly once to refresh available tools.`,
The reason will be displayed to describe this comment to others. Learn more.
The error message instructs the model to call listTools to refresh available tools. However, the actual tool registered in the LLM context is named builtIn_mcpListTools (as defined in packages/stage-ui/src/tools/mcp.ts). Instructing the model to call listTools will cause it to attempt to invoke a non-existent tool, leading to further errors. The message should be updated to refer to builtIn_mcpListTools instead, which also aligns with the PR description ("instructs model to re-call builtIn_mcpListTools").
Suggested change
thrownewError(
runningServers.length===0
? `MCP server "${serverName}" is not running. No MCP servers are currently running.`
: `MCP server "${serverName}" is not running. Running servers: ${runningServers.map((s)=>`"${s}"`).join(', ')}. Call listTools exactly once to refresh available tools.`,
)
thrownewError(
runningServers.length===0
? `MCP server "${serverName}" is not running. No MCP servers are currently running.`
: `MCP server "${serverName}" is not running. Running servers: ${runningServers.map((s)=>`"${s}"`).join(', ')}. Call builtIn_mcpListTools exactly once to refresh available tools.`,
When the model calls an MCP tool whose server is not running (the user
appended tool references from stale context or hallucinated a new
server), the response now:
- surfaces the list of currently-running MCP servers so the model can
pick a real one instead of concluding the tool does not exist
- appends an explicit instruction to re-call builtIn_mcpListTools and
retry with a tool from the refreshed catalog
This stops the model from falling back to manual file generation or
abandoning the tool-call path when a transient server lookup fails.
Also adds 29 unit tests covering the previously-untested gaps:
- coding workspace store lifecycle, backend state matrix, workspace
root trimming, concurrent enable/disable registration leak
- CodingWorkspaceControls.vue visibility, mode badges, native-only UI
- Serena preset insertion and duplicate-server guard at the settings
- workspace_ranked_context fallback, spec artifact path defaulting,
mode gating, JSON parse error shaping, symbols/diagnostics coverage
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
The reason will be displayed to describe this comment to others. Learn more.
Found `async` function without any `await` expressions
A function that does not contain any await expressions should not be async (except for some edge cases in TypeScript which are discussed below). Asynchronous functions in JavaScript behave differently than other functions in two important ways:
The reason will be displayed to describe this comment to others. Learn more.
Found `async` function without any `await` expressions
A function that does not contain any await expressions should not be async (except for some edge cases in TypeScript which are discussed below). Asynchronous functions in JavaScript behave differently than other functions in two important ways:
The reason will be displayed to describe this comment to others. Learn more.
Found `async` function without any `await` expressions
A function that does not contain any await expressions should not be async (except for some edge cases in TypeScript which are discussed below). Asynchronous functions in JavaScript behave differently than other functions in two important ways:
The reason will be displayed to describe this comment to others. Learn more.
Found `async` function without any `await` expressions
A function that does not contain any await expressions should not be async (except for some edge cases in TypeScript which are discussed below). Asynchronous functions in JavaScript behave differently than other functions in two important ways:
The reason will be displayed to describe this comment to others. Learn more.
Found `async` function without any `await` expressions
A function that does not contain any await expressions should not be async (except for some edge cases in TypeScript which are discussed below). Asynchronous functions in JavaScript behave differently than other functions in two important ways:
The reason will be displayed to describe this comment to others. Learn more.
Found `async` function without any `await` expressions
A function that does not contain any await expressions should not be async (except for some edge cases in TypeScript which are discussed below). Asynchronous functions in JavaScript behave differently than other functions in two important ways:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Test coverage
Adds 29 unit tests, full coding-workspace coverage now at 63 tests:
Verification
Manual QA
🤖 Generated with Factory