refactor(agent): retire legacy agentpresenter#1379
Conversation
📝 WalkthroughWalkthroughThis pull request finalizes retirement of the legacy AgentPresenter runtime: it migrates ACP/helpers and agent-tool code into new presenter modules, removes legacy runtime wiring and streaming APIs, archives retired code, updates presenter types, and rewrites architecture/flow documentation to the post‑retirement design. Changes
Sequence Diagram(s)sequenceDiagram
participant Renderer as Renderer
participant NewAP as newAgentPresenter
participant Registry as AgentRegistry
participant Deep as deepchatAgentPresenter
participant Tool as ToolPresenter
participant LLM as LLMProviderPresenter
participant DB as SQLitePresenter
Renderer->>NewAP: create/bind session, enqueue message
NewAP->>Registry: register/session routing
Registry->>Deep: dispatch message -> processMessage
Deep->>LLM: build context -> request completion
LLM->>LLM: generateCompletion (no startStreamCompletion)
Deep->>Tool: pre-check / dispatch tool call
Tool-->>Deep: tool result (or pause/resume)
Deep->>DB: persist events/messages
Deep-->>NewAP: finalize/persist session state
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 7
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/main/presenter/toolPresenter/agentTools/agentFileSystemHandler.ts (1)
288-325:⚠️ Potential issue | 🔴 CriticalDo not drop the child
Access deniedresult when the parent resolves.If
fs.realpath(normalizedRequested)hits the “symlink target outside allowed directories” guard, Line 314 still returnsnormalizedRequestedwhenever the parent directory is allowed. A symlinked file inside an allowed directory can then be edited or overwritten outside the allowlist. The parent-directory fallback should only run for “path does not exist yet” cases.🔒 Proposed fix
} catch (error) { pathResolutionError = error + if ( + pathResolutionError instanceof Error && + pathResolutionError.message.startsWith('Access denied') + ) { + throw pathResolutionError + } + + const { code } = pathResolutionError as NodeJS.ErrnoException + if (code !== undefined && code !== 'ENOENT' && code !== 'ENOTDIR') { + throw pathResolutionError + } const parentDir = path.dirname(normalizedRequested) try { const realParentPath = await fs.realpath(parentDir) const normalizedParent = this.normalizePath(realParentPath) if (enforceAllowed) { const isParentAllowed = this.isPathAllowed(normalizedParent) if (!isParentAllowed) { throw new Error('Access denied - parent directory outside allowed directories') } } return normalizedRequested } catch (parentError) { - if ( - pathResolutionError instanceof Error && - pathResolutionError.message.startsWith('Access denied') - ) { - throw pathResolutionError - } if (parentError instanceof Error && parentError.message.startsWith('Access denied')) { throw parentError } throw new Error(`Parent directory does not exist: ${parentDir}`) } }A regression test with a symlinked file under an allowed root would be worth adding here.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/main/presenter/toolPresenter/agentTools/agentFileSystemHandler.ts` around lines 288 - 325, When resolving normalizedRequested in the fs.realpath try/catch, do not swallow an "Access denied - symlink target outside allowed directories" error from the initial realpath attempt; only fall back to checking the parent when the original error is a non-existence error (e.g., ENOENT/ENOTDIR). Concretely, inside the catch for the first fs.realpath (where pathResolutionError is set), change the guard before attempting realpath(parentDir) so that you rethrow pathResolutionError if it is an Error whose message or errno indicates access-denied (the same condition used later) and only run the parent-resolution fallback when pathResolutionError indicates the path does not exist; keep using the existing symbols normalizedRequested, pathResolutionError, parentDir, realParentPath, normalizedParent, and isPathAllowed/isParentAllowed and return normalizedRequested only in the allowed non-existence case.
🧹 Nitpick comments (1)
test/main/presenter/llmProviderPresenter/acpContentMapper.test.ts (1)
3-3: Move this spec to mirror the newacp/source layout.The SUT now lives under
src/main/presenter/llmProviderPresenter/acp/, but this spec is still in the old flat location. Moving it totest/main/presenter/llmProviderPresenter/acp/acpContentMapper.test.tswill keep the test tree aligned with the source tree.As per coding guidelines,
test/**/*.{test,spec}.tsfiles should mirror source structure undertest/main/**andtest/renderer/**.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/main/presenter/llmProviderPresenter/acpContentMapper.test.ts` at line 3, The test file is located in the old flat test tree and should mirror the source layout; move the spec for AcpContentMapper to the matching test directory under test/main/presenter/llmProviderPresenter/acp/ (so the test path mirrors src/main/presenter/llmProviderPresenter/acp/), update any import paths in the test that reference AcpContentMapper to the relative path from the new location, and run the test suite to confirm imports resolve and the spec executes.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@docs/archives/legacy-agentpresenter-architecture.md`:
- Around line 312-317: The relative links in
docs/archives/legacy-agentpresenter-architecture.md point to ./architecture/...
and ./FLOWS.md which resolve under docs/archives/ and 404; update those list
entries (the lines referencing "architecture/session-management.md",
"architecture/agent-system.md", "architecture/tool-system.md",
"architecture/event-system.md", "FLOWS.md", and
"architecture/mcp-integration.md") to use the correct relative path up one level
(e.g., ../architecture/... and ../FLOWS.md) so they resolve from docs/ not
docs/archives/.
- Around line 121-130: Update the quick-reference table entries (AgentPresenter,
agentLoopHandler, streamGenerationHandler, loopOrchestrator, toolCallProcessor,
llmEventHandler, permissionHandler, messageBuilder) so their file locations
point to the archived tree or explicitly mark the listed paths as historical
(e.g., prefix with "archives/code/legacy-agentpresenter-retirement/..." or
append "(historical, retired runtime)"); apply the same change to the other
referenced sections at lines noted in the comment (146-153 and 293-303) so
readers are not directed to live src/main/presenter/agentPresenter paths that no
longer exist.
In `@docs/archives/legacy-agentpresenter-flows.md`:
- Line 248: Multiple top-level section headings are misnumbered (duplicate "##
3. 工具调用路由流程" and other "## 3" occurrences), which shifts navigation; locate the
repeated heading text "## 3. 工具调用路由流程" and the other duplicate "## 3" headings
(also the occurrences around the later sections noted) and renumber them to the
correct sequential major section numbers so all major headings increment
consistently (e.g., adjust the repeated "## 3" entries to "## 4", "## 5", "## 6"
as appropriate to restore the intended sequence).
In `@docs/guides/getting-started.md`:
- Line 128: The sentence "补跑相关 Vitest 套件和:" is a dangling conjunction; edit the
line containing that exact text to finish the thought by removing the trailing
"和:" and either list the missing item(s) or rephrase to a complete phrase such
as "补跑相关 Vitest 套件:" or "补跑相关 Vitest 套件以及相关步骤:" so the sentence reads complete
and clear for new contributors.
In `@scripts/agent-cleanup-guard.mjs`:
- Around line 106-111: The collectFiles function currently swallows all
fs.access() failures and returns [] which hides missing/renamed/unreadable
protected roots; change it to stop treating every access error as ignorable by
removing the blanket catch-return and instead let the error propagate (rethrow)
so callers can handle it, or explicitly handle only expected optional cases
(e.g., check err.code === 'ENOENT' if you truly want to treat missing roots as
optional). Update collectFiles (the async function) and adjust its callers such
as scanRoots to decide explicitly whether a missing root is acceptable rather
than collectFiles silently returning an empty array.
In `@src/main/presenter/sessionPresenter/index.ts`:
- Around line 1049-1051: toSession() currently hardcodes status: 'idle', which
hides runtime state for consumers like getSession() and getSessionList(); change
to derive the status instead of flattening it—either return the live status from
the conversation object (e.g. conversation.status or conversation.state) or
query the new runtime owner API (e.g.
runtimeOwner.getSessionStatus(conversation.id)) and use that value, or if the
field is being removed, remove/deprecate Session.status from the shared contract
and update callers accordingly; update the toSession() return to use that
derived value rather than the string literal 'idle'.
In `@src/main/presenter/toolPresenter/runtimePorts.ts`:
- Around line 21-22: Change the port contract so approval hooks are required:
remove the optional markers from getApprovedFilePaths and
consumeSettingsApproval (make them getApprovedFilePaths(conversationId: string):
string[] and consumeSettingsApproval(conversationId: string, toolName: string):
boolean) and update all implementations to provide explicit fail-closed behavior
(return [] for no approved paths and return false for no settings approval) so
callers can rely on non-optional methods; update any implementing classes/types
that mention getApprovedFilePaths or consumeSettingsApproval to match the new
signatures.
---
Outside diff comments:
In `@src/main/presenter/toolPresenter/agentTools/agentFileSystemHandler.ts`:
- Around line 288-325: When resolving normalizedRequested in the fs.realpath
try/catch, do not swallow an "Access denied - symlink target outside allowed
directories" error from the initial realpath attempt; only fall back to checking
the parent when the original error is a non-existence error (e.g.,
ENOENT/ENOTDIR). Concretely, inside the catch for the first fs.realpath (where
pathResolutionError is set), change the guard before attempting
realpath(parentDir) so that you rethrow pathResolutionError if it is an Error
whose message or errno indicates access-denied (the same condition used later)
and only run the parent-resolution fallback when pathResolutionError indicates
the path does not exist; keep using the existing symbols normalizedRequested,
pathResolutionError, parentDir, realParentPath, normalizedParent, and
isPathAllowed/isParentAllowed and return normalizedRequested only in the allowed
non-existence case.
---
Nitpick comments:
In `@test/main/presenter/llmProviderPresenter/acpContentMapper.test.ts`:
- Line 3: The test file is located in the old flat test tree and should mirror
the source layout; move the spec for AcpContentMapper to the matching test
directory under test/main/presenter/llmProviderPresenter/acp/ (so the test path
mirrors src/main/presenter/llmProviderPresenter/acp/), update any import paths
in the test that reference AcpContentMapper to the relative path from the new
location, and run the test suite to confirm imports resolve and the spec
executes.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 634dcd31-29d3-450a-813e-0d23558dd77e
📒 Files selected for processing (117)
archives/code/legacy-agentpresenter-retirement/README.mdarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/acp/backgroundExecSessionManager.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/acp/index.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/acp/shellEnvHelper.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/agent/index.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/index.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/loop/agentLoopHandler.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/loop/errorClassification.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/loop/index.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/loop/loopOrchestrator.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/loop/loopState.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/loop/toolCallHandler.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/loop/toolCallProcessor.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/message/messageBuilder.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/message/messageCompressor.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/message/messageTruncator.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/message/skillsPromptBuilder.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/permission/permissionHandler.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/persistence/index.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/runtimePorts.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/session/sessionContext.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/session/sessionManager.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/session/sessionResolver.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/session/sessionRuntimePort.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/streaming/contentBufferHandler.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/streaming/llmEventHandler.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/streaming/streamGenerationHandler.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/streaming/streamUpdateScheduler.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/streaming/types.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/tool/toolCallCenter.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/tool/toolRegistry.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/tool/toolRouter.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/types.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/types/handlerContext.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/utility/promptEnhancer.tsarchives/code/legacy-agentpresenter-retirement/src/main/presenter/agentPresenter/utility/utilityHandler.tsarchives/code/legacy-agentpresenter-retirement/src/shared/types/presenters/agent.presenter.d.tsarchives/code/legacy-agentpresenter-retirement/test/main/presenter/agentPresenter/agentPresenter.test.tsarchives/code/legacy-agentpresenter-retirement/test/main/presenter/agentPresenter/loop/agentLoopHandler.test.tsarchives/code/legacy-agentpresenter-retirement/test/main/presenter/agentPresenter/loop/toolCallProcessor.test.tsarchives/code/legacy-agentpresenter-retirement/test/main/presenter/agentPresenter/message/systemEnvPromptBuilder.test.tsarchives/code/legacy-agentpresenter-retirement/test/main/presenter/agentPresenter/messageBuilder.test.tsarchives/code/legacy-agentpresenter-retirement/test/main/presenter/agentPresenter/messageCompressor.test.tsarchives/code/legacy-agentpresenter-retirement/test/main/presenter/agentPresenter/permission/permissionHandler.resume.test.tsarchives/code/legacy-agentpresenter-retirement/test/main/presenter/agentPresenter/promptBuilder.test.tsarchives/code/legacy-agentpresenter-retirement/test/main/presenter/agentPresenter/sessionManager.test.tsarchives/code/legacy-agentpresenter-retirement/test/main/presenter/agentPresenter/skillsPromptBuilder.test.tsarchives/code/legacy-agentpresenter-retirement/test/main/presenter/agentPresenter/streaming/llmEventHandler.test.tsarchives/code/legacy-agentpresenter-retirement/test/main/presenter/agentPresenter/streaming/streamGenerationHandler.test.tsarchives/code/legacy-agentpresenter-retirement/test/main/presenter/sessionPresenter/permissionHandler.test.tsdocs/ARCHITECTURE.mddocs/FLOWS.mddocs/README.mddocs/architecture/agent-system.mddocs/architecture/session-management.mddocs/architecture/tool-system.mddocs/archives/legacy-agentpresenter-architecture.mddocs/archives/legacy-agentpresenter-flows.mddocs/guides/code-navigation.mddocs/guides/getting-started.mddocs/specs/agent-cleanup/plan.mddocs/specs/agent-cleanup/spec.mddocs/specs/agent-cleanup/tasks.mddocs/specs/legacy-agentpresenter-retirement/plan.mddocs/specs/legacy-agentpresenter-retirement/spec.mddocs/specs/legacy-agentpresenter-retirement/tasks.mdscripts/agent-cleanup-guard.mjssrc/main/presenter/configPresenter/acpInitHelper.tssrc/main/presenter/exporter/formats/conversationExporter.tssrc/main/presenter/exporter/formats/nowledgeMemExporter.tssrc/main/presenter/index.tssrc/main/presenter/llmProviderPresenter/acp/acpCapabilities.tssrc/main/presenter/llmProviderPresenter/acp/acpConfigState.tssrc/main/presenter/llmProviderPresenter/acp/acpContentMapper.tssrc/main/presenter/llmProviderPresenter/acp/acpFsHandler.tssrc/main/presenter/llmProviderPresenter/acp/acpMessageFormatter.tssrc/main/presenter/llmProviderPresenter/acp/acpProcessManager.tssrc/main/presenter/llmProviderPresenter/acp/acpSessionManager.tssrc/main/presenter/llmProviderPresenter/acp/acpSessionPersistence.tssrc/main/presenter/llmProviderPresenter/acp/acpTerminalManager.tssrc/main/presenter/llmProviderPresenter/acp/index.tssrc/main/presenter/llmProviderPresenter/acp/mcpConfigConverter.tssrc/main/presenter/llmProviderPresenter/acp/mcpTransportFilter.tssrc/main/presenter/llmProviderPresenter/acp/types.tssrc/main/presenter/llmProviderPresenter/index.tssrc/main/presenter/llmProviderPresenter/managers/providerInstanceManager.tssrc/main/presenter/llmProviderPresenter/providers/acpProvider.tssrc/main/presenter/sessionPresenter/index.tssrc/main/presenter/sessionPresenter/messageFormatter.tssrc/main/presenter/syncPresenter/index.tssrc/main/presenter/tabPresenter.tssrc/main/presenter/toolPresenter/agentTools/agentBashHandler.tssrc/main/presenter/toolPresenter/agentTools/agentFileSystemHandler.tssrc/main/presenter/toolPresenter/agentTools/agentToolManager.tssrc/main/presenter/toolPresenter/agentTools/chatSettingsTools.tssrc/main/presenter/toolPresenter/agentTools/index.tssrc/main/presenter/toolPresenter/index.tssrc/main/presenter/toolPresenter/runtimePorts.tssrc/shared/types/presenters/index.d.tssrc/shared/types/presenters/legacy.presenters.d.tssrc/shared/types/presenters/llmprovider.presenter.d.tstest/main/lib/agentRuntime/backgroundExecSessionManager.test.tstest/main/presenter/acpMcpPassthrough.test.tstest/main/presenter/acpProvider.test.tstest/main/presenter/acpSessionManager.test.tstest/main/presenter/llmProviderPresenter.test.tstest/main/presenter/llmProviderPresenter/acp/acpProcessManager.test.tstest/main/presenter/llmProviderPresenter/acpCapabilities.test.tstest/main/presenter/llmProviderPresenter/acpContentMapper.test.tstest/main/presenter/llmProviderPresenter/acpFsHandler.test.tstest/main/presenter/llmProviderPresenter/openAICompatibleProvider.test.tstest/main/presenter/sessionPresenter/messageFormatter.test.tstest/main/presenter/toolPresenter/agentTools/agentBashHandler.test.tstest/main/presenter/toolPresenter/agentTools/agentFileSystemHandler.test.tstest/main/presenter/toolPresenter/agentTools/agentToolManagerRead.test.tstest/main/presenter/toolPresenter/agentTools/agentToolManagerSettings.test.tstest/main/presenter/toolPresenter/agentTools/chatSettingsTools.test.ts
💤 Files with no reviewable changes (4)
- test/main/presenter/llmProviderPresenter/openAICompatibleProvider.test.ts
- src/shared/types/presenters/index.d.ts
- src/shared/types/presenters/llmprovider.presenter.d.ts
- src/shared/types/presenters/legacy.presenters.d.ts
There was a problem hiding this comment.
🧹 Nitpick comments (1)
scripts/agent-cleanup-guard.mjs (1)
223-231: Consider removing dead code now thatagentPresenteris excluded from scan roots.Since
LEGACY_AGENT_RUNTIME_DIR(src/main/presenter/agentPresenter) is no longer inscanRoots, no files from that directory will be collected intofileSet. This means the check at lines 223-231 will never match any files and is effectively dead code.If the legacy runtime is being fully archived, this block can be removed along with
LEGACY_AGENT_RUNTIME_DIR(line 42) andLEGACY_AGENT_RUNTIME_GLOBALS(lines 47-61).♻️ Proposed cleanup
-const LEGACY_AGENT_RUNTIME_DIR = path.join(ROOT, 'src/main/presenter/agentPresenter') const PROVIDER_LAYER_DIR = path.join(ROOT, 'src/main/presenter/llmProviderPresenter/providers') const SKILL_PRESENTER_DIR = path.join(ROOT, 'src/main/presenter/skillPresenter') const MCP_TOOL_MANAGER_FILE = path.join(ROOT, 'src/main/presenter/mcpPresenter/toolManager.ts') -const LEGACY_AGENT_RUNTIME_GLOBALS = [ - 'sessionManager', - 'toolPresenter', - 'mcpPresenter', - 'configPresenter', - 'skillPresenter', - 'filePermissionService', - 'settingsPermissionService', - 'newAgentPresenter', - 'sessionPresenter', - 'yoBrowserPresenter', - 'filePresenter', - 'llmproviderPresenter', - 'windowPresenter' -]And remove lines 223-231:
- if (isProtectedPath(filePath, [LEGACY_AGENT_RUNTIME_DIR])) { - for (const legacyGlobal of LEGACY_AGENT_RUNTIME_GLOBALS) { - if (source.includes(`presenter.${legacyGlobal}`)) { - violations.push( - buildViolation(`agent-global-${legacyGlobal}`, filePath, `presenter.${legacyGlobal}`) - ) - } - } - }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@scripts/agent-cleanup-guard.mjs` around lines 223 - 231, The if-block that checks isProtectedPath(filePath, [LEGACY_AGENT_RUNTIME_DIR]) and iterates LEGACY_AGENT_RUNTIME_GLOBALS (the lines calling buildViolation for `presenter.${legacyGlobal}`) is dead now that agentPresenter (LEGACY_AGENT_RUNTIME_DIR) is excluded from scanRoots; remove that entire conditional block and, if the legacy runtime is fully archived, also remove the unused constants LEGACY_AGENT_RUNTIME_DIR and LEGACY_AGENT_RUNTIME_GLOBALS to avoid dead-code references and unused symbols.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@scripts/agent-cleanup-guard.mjs`:
- Around line 223-231: The if-block that checks isProtectedPath(filePath,
[LEGACY_AGENT_RUNTIME_DIR]) and iterates LEGACY_AGENT_RUNTIME_GLOBALS (the lines
calling buildViolation for `presenter.${legacyGlobal}`) is dead now that
agentPresenter (LEGACY_AGENT_RUNTIME_DIR) is excluded from scanRoots; remove
that entire conditional block and, if the legacy runtime is fully archived, also
remove the unused constants LEGACY_AGENT_RUNTIME_DIR and
LEGACY_AGENT_RUNTIME_GLOBALS to avoid dead-code references and unused symbols.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 841ab371-50af-4d04-a14e-2a6da8c77d7b
📒 Files selected for processing (6)
docs/archives/legacy-agentpresenter-architecture.mddocs/archives/legacy-agentpresenter-flows.mddocs/guides/getting-started.mdscripts/agent-cleanup-guard.mjssrc/main/presenter/toolPresenter/agentTools/agentToolManager.tssrc/main/presenter/toolPresenter/runtimePorts.ts
✅ Files skipped from review due to trivial changes (3)
- docs/archives/legacy-agentpresenter-architecture.md
- src/main/presenter/toolPresenter/runtimePorts.ts
- docs/archives/legacy-agentpresenter-flows.md
🚧 Files skipped from review as they are similar to previous changes (1)
- src/main/presenter/toolPresenter/agentTools/agentToolManager.ts
Summary by CodeRabbit
Documentation
Refactor
Tests
Chores