Skip to content

fix(vscode): prevent duplicate permission prompts in Agent Manager - #13977

Merged
WebReflection merged 7 commits into
mainfrom
prompt-agent-manager
Sep 10, 2026
Merged

WebReflection merged 7 commits into
mainfrom
prompt-agent-manager

Conversation

@WebReflection

Copy link
Copy Markdown
Contributor

What Problem This Solves

Agent Manager can mount a writable parent chat and a persistent readonly subagent inspector at the same time. The shared VSCodeProvider fans extension messages out to every nested SessionProvider, while the readonly inspector previously still rendered actionable PermissionDock controls. A single permission could therefore appear in multiple docks and be submitted concurrently. FIFO ordering, stale callbacks, recovery races, and prompt-scoped popovers could also leave the wrong request active or submit against the wrong session.

PR #13955 is related at the symptom level, but it fixes a separate TUI path: session eviction was dropping one-shot permission and question asks from the TUI sync store. It does not touch packages/kilo-vscode, nested webview providers, Agent Manager ownership, or shared extension-host response submission, so it does not replace this change.

Why This Change Was Made

  • Define one explicit prompt owner. The Agent Manager inspector remains mounted for transcript state but opts out of actionable prompt controls.
  • Keep permission family selection deterministic and preserve the request ID through dock, chat, session, and host response handling.
  • Treat resolved and stale permission IDs as terminal so duplicate SSE/direct/recovery events cannot resurrect them. Failed non-stale responses remain actionable.
  • Add a request-ID single-flight registry at the shared KiloConnectionService boundary so multiple providers await one save/reply sequence and each receives the same terminal result.
  • Record permission route/session ownership, reject unknown or mismatched response routes, and suppress recovery while a response is in flight.
  • Close and detach prompt-scoped model, mode, and thinking popovers when a permission blocks the prompt.

User Impact

  • Agent Manager shows one answerable permission dock instead of duplicate parent/inspector approval controls.
  • Allow, deny, keyboard shortcuts, recovery, and SSE/direct acknowledgement all operate on the same permission request.
  • Switching sessions, delayed recovery, or a late event no longer strands a subagent behind a missing or stale approval prompt.
  • Model, mode, and thinking pickers close while approval is required and do not intercept global picker events.
  • The normal writable chat and existing readonly views retain their previous behavior unless a caller explicitly opts out with interactivePrompts={false}.

Evidence

  • Added concurrent response coverage in packages/kilo-vscode/tests/unit/permission-recovery.test.ts: unknown routes issue no SDK call, concurrent providers share one save/reply sequence, and recovery skips claimed IDs.
  • Focused validation: bun test tests/unit/permission-queue.test.ts tests/unit/permission-recovery.test.ts passed with 38 tests.
  • Formatting and repository guards passed: bun run format:check, bun run check-kilocode-change, and git diff --check.
  • No visual copy or visual baseline changes were needed. The existing browser permission suite intentionally skips macOS.
  • Full extension typecheck and Agent Manager runtime tests are currently blocked in this checkout by unavailable workspace dependencies such as solid-js, vscode, happy-dom, and esbuild; lint and Knip binaries are also unavailable.

Checklist

@kilo-code-bot

kilo-code-bot Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Files Reviewed (2 files)
  • packages/kilo-vscode/webview-ui/src/context/session.tsx
  • packages/kilo-vscode/webview-ui/src/components/chat/AssistantMessage.tsx
Previous Review Summaries (3 snapshots, latest commit 5326d16)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit 5326d16)

Status: No Issues Found | Recommendation: Merge

Files Reviewed (4 files)
  • packages/kilo-vscode/src/KiloProvider.ts
  • packages/kilo-vscode/src/services/cli-backend/connection-service.ts
  • packages/kilo-vscode/tests/unit/connection-service-question.test.ts
  • packages/kilo-vscode/tests/unit/permission-recovery.test.ts

Previous review (commit ae1a8c3)

Status: 2 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 1
SUGGESTION 1

Fix these issues in Kilo Cloud

Issue Details (click to expand)

WARNING

File Line Issue
packages/kilo-vscode/src/services/cli-backend/connection-service.ts 341 pruneSession drops live permission routes and in-flight claims

SUGGESTION

File Line Issue
packages/kilo-vscode/tests/unit/permission-recovery.test.ts 147 Concurrent test duplicates single-flight logic instead of exercising KiloConnectionService
Files Reviewed (1 files)
  • packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx - 0 issues

Previous review (commit e09250a)

Status: 2 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 1
SUGGESTION 1

Fix these issues in Kilo Cloud

Issue Details (click to expand)

WARNING

File Line Issue
packages/kilo-vscode/src/services/cli-backend/connection-service.ts 341 pruneSession drops live permission routes and in-flight claims

SUGGESTION

File Line Issue
packages/kilo-vscode/tests/unit/permission-recovery.test.ts 147 Concurrent test duplicates single-flight logic instead of exercising KiloConnectionService
Files Reviewed (17 files)
  • .changeset/permission-prompt-race.md - 0 issues
  • packages/kilo-vscode/src/KiloProvider.ts - 0 issues
  • packages/kilo-vscode/src/kilo-provider/handlers/permission-handler.ts - 0 issues
  • packages/kilo-vscode/src/services/cli-backend/connection-service.ts - 1 issue
  • packages/kilo-vscode/tests/unit/permission-recovery.test.ts - 1 issue
  • packages/kilo-vscode/webview-ui/agent-manager/SubagentPanel.tsx - 0 issues
  • packages/kilo-vscode/webview-ui/src/components/chat/AssistantMessage.tsx - 0 issues
  • packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx - 0 issues
  • packages/kilo-vscode/webview-ui/src/components/chat/MessageList.tsx - 0 issues
  • packages/kilo-vscode/webview-ui/src/components/chat/PermissionDock.tsx - 0 issues
  • packages/kilo-vscode/webview-ui/src/components/chat/PromptInput.tsx - 0 issues
  • packages/kilo-vscode/webview-ui/src/components/chat/TranscriptRow.tsx - 0 issues
  • packages/kilo-vscode/webview-ui/src/components/shared/ModeSwitcher.tsx - 0 issues
  • packages/kilo-vscode/webview-ui/src/components/shared/ModelSelector.tsx - 0 issues
  • packages/kilo-vscode/webview-ui/src/components/shared/ThinkingSelector.tsx - 0 issues
  • packages/kilo-vscode/webview-ui/src/context/session-types.ts - 0 issues
  • packages/kilo-vscode/webview-ui/src/context/session.tsx - 0 issues

Reviewed by grok-4.6 · Input: 244.6K · Output: 17.8K · Cached: 688.9K

Review guidance: REVIEW.md from base branch main

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants