Skip to content

(WIP) feat: Implement Copilot CLI feature via ACP#511

Draft
XiaoMouz wants to merge 8 commits into
dohooo:mainfrom
XiaoMouz:helene
Draft

(WIP) feat: Implement Copilot CLI feature via ACP#511
XiaoMouz wants to merge 8 commits into
dohooo:mainfrom
XiaoMouz:helene

Conversation

@XiaoMouz

@XiaoMouz XiaoMouz commented May 12, 2026

Copy link
Copy Markdown

Target


And I'm waiting #529, my branch rewiriting from his branch

@vercel

vercel Bot commented May 12, 2026

Copy link
Copy Markdown

@XiaoMouz is attempting to deploy a commit to the Caspian's Team Team on Vercel.

A member of the Team first needs to authorize it.

@XiaoMouz XiaoMouz changed the title (WIP) feat: implement Copilot CLI feature via ACP (WIP) feat: Implement Copilot CLI feature via ACP May 12, 2026
david-engelmann added a commit to david-engelmann/helmor that referenced this pull request May 13, 2026
Replace scattered `provider === "codex"` / `provider === "cursor"` /
`provider == "codex"` checks with a typed capability table that the
composer, session-close dialog, and streaming-stop hook all read off
of. Single source of truth lives in Rust
(`agents::provider_capabilities`); the frontend pulls a mirrored TS
shape through a new `list_provider_capabilities` command and a
forever-cached, on-disk-persisted React Query.

The capability fields cover the existing scattered checks:
- displayName (replaces hard-coded "Claude" / "Codex" / "Cursor")
- supportsActiveGoal (composer /goal interception + stream-stop pause)
- supportsPlanMode, supportsContextUsage, supportsSteer,
  supportsSlashCommands, requiresApiKey
- permissionModes (the SDK wire-string list the composer's dropdown
  should render; Claude=all four, Codex=default+bypass, Cursor=default)

Unknown provider ids fall back to Claude's defaults (the broadest
surface), so a future provider (Copilot via dohooo#511, Pi via dohooo#321) lands
without accidentally disabling composer features — adding a new row
to the matrix is a single edit.

The pipeline accumulator, model catalog, and sidecar are untouched —
this is purely a backend-Rust + Tauri-command + frontend-helper slice
that makes future provider work safer to review.

Tests:
- 6 Rust unit tests (per-provider rows, fallback, wire-format
  camelCase gate, permission-mode SDK strings)
- 5 frontend unit tests (`findProviderCapabilities` matrix lookups,
  null fallback, regression gates for active-goal and api-key flags)
- Existing composer `/goal pause/clear` interception tests still
  pass after switching to capability-driven dispatch (with a small
  seed update for the new query key).

Closes dohooo#321 only at the design level (the "support Pi-mono" issue —
the spine is now ready for a Pi-shaped provider row); does not add
Pi as a provider. Helps dohooo#510 / dohooo#511 by giving the Copilot ACP work a
typed capability slot to plug into.
david-engelmann added a commit to david-engelmann/helmor that referenced this pull request May 14, 2026
Replace scattered `provider === "codex"` / `provider === "cursor"` /
`provider == "codex"` checks with a typed capability table that the
composer, session-close dialog, and streaming-stop hook all read off
of. Single source of truth lives in Rust
(`agents::provider_capabilities`); the frontend pulls a mirrored TS
shape through a new `list_provider_capabilities` command and a
forever-cached, on-disk-persisted React Query.

The capability fields cover the existing scattered checks:
- displayName (replaces hard-coded "Claude" / "Codex" / "Cursor")
- supportsActiveGoal (composer /goal interception + stream-stop pause)
- supportsPlanMode, supportsContextUsage, supportsSteer,
  supportsSlashCommands, requiresApiKey
- permissionModes (the SDK wire-string list the composer's dropdown
  should render; Claude=all four, Codex=default+bypass, Cursor=default)

Unknown provider ids fall back to Claude's defaults (the broadest
surface), so a future provider (Copilot via dohooo#511, Pi via dohooo#321) lands
without accidentally disabling composer features — adding a new row
to the matrix is a single edit.

The pipeline accumulator, model catalog, and sidecar are untouched —
this is purely a backend-Rust + Tauri-command + frontend-helper slice
that makes future provider work safer to review.

Tests:
- 6 Rust unit tests (per-provider rows, fallback, wire-format
  camelCase gate, permission-mode SDK strings)
- 5 frontend unit tests (`findProviderCapabilities` matrix lookups,
  null fallback, regression gates for active-goal and api-key flags)
- Existing composer `/goal pause/clear` interception tests still
  pass after switching to capability-driven dispatch (with a small
  seed update for the new query key).

Closes dohooo#321 only at the design level (the "support Pi-mono" issue —
the spine is now ready for a Pi-shaped provider row); does not add
Pi as a provider. Helps dohooo#510 / dohooo#511 by giving the Copilot ACP work a
typed capability slot to plug into.
david-engelmann and others added 8 commits May 14, 2026 15:31
Replace scattered `provider === "codex"` / `provider === "cursor"` /
`provider == "codex"` checks with a typed capability table that the
composer, session-close dialog, and streaming-stop hook all read off
of. Single source of truth lives in Rust
(`agents::provider_capabilities`); the frontend pulls a mirrored TS
shape through a new `list_provider_capabilities` command and a
forever-cached, on-disk-persisted React Query.

The capability fields cover the existing scattered checks:
- displayName (replaces hard-coded "Claude" / "Codex" / "Cursor")
- supportsActiveGoal (composer /goal interception + stream-stop pause)
- supportsPlanMode, supportsContextUsage, supportsSteer,
  supportsSlashCommands, requiresApiKey
- permissionModes (the SDK wire-string list the composer's dropdown
  should render; Claude=all four, Codex=default+bypass, Cursor=default)

Unknown provider ids fall back to Claude's defaults (the broadest
surface), so a future provider (Copilot via dohooo#511, Pi via dohooo#321) lands
without accidentally disabling composer features — adding a new row
to the matrix is a single edit.

The pipeline accumulator, model catalog, and sidecar are untouched —
this is purely a backend-Rust + Tauri-command + frontend-helper slice
that makes future provider work safer to review.

Tests:
- 6 Rust unit tests (per-provider rows, fallback, wire-format
  camelCase gate, permission-mode SDK strings)
- 5 frontend unit tests (`findProviderCapabilities` matrix lookups,
  null fallback, regression gates for active-goal and api-key flags)
- Existing composer `/goal pause/clear` interception tests still
  pass after switching to capability-driven dispatch (with a small
  seed update for the new query key).

Closes dohooo#321 only at the design level (the "support Pi-mono" issue —
the spine is now ready for a Pi-shaped provider row); does not add
Pi as a provider. Helps dohooo#510 / dohooo#511 by giving the Copilot ACP work a
typed capability slot to plug into.
- Introduced CopilotSessionManager to manage Copilot sessions.
- Updated model catalog to include Copilot models with appropriate effort levels.
- Enhanced request parser to recognize "copilot" as a valid provider.
- Expanded session manager to include Copilot as a provider.
- Implemented Copilot capabilities in provider capabilities module.
- Added Copilot login status handling in system commands.
- Created a new accumulator for handling Copilot events.
- Integrated Copilot event handling into the main event processing pipeline.
- Added Copilot icon and updated onboarding to include Copilot authentication.
- Developed settings panel for managing Copilot provider settings.
dohooo added a commit that referenced this pull request Jun 3, 2026
* feat(agents): provider capability contract

Replace scattered `provider === "codex"` / `provider === "cursor"` /
`provider == "codex"` checks with a typed capability table that the
composer, session-close dialog, and streaming-stop hook all read off
of. Single source of truth lives in Rust
(`agents::provider_capabilities`); the frontend pulls a mirrored TS
shape through a new `list_provider_capabilities` command and a
forever-cached, on-disk-persisted React Query.

The capability fields cover the existing scattered checks:
- displayName (replaces hard-coded "Claude" / "Codex" / "Cursor")
- supportsActiveGoal (composer /goal interception + stream-stop pause)
- supportsPlanMode, supportsContextUsage, supportsSteer,
  supportsSlashCommands, requiresApiKey
- permissionModes (the SDK wire-string list the composer's dropdown
  should render; Claude=all four, Codex=default+bypass, Cursor=default)

Unknown provider ids fall back to Claude's defaults (the broadest
surface), so a future provider (Copilot via #511, Pi via #321) lands
without accidentally disabling composer features — adding a new row
to the matrix is a single edit.

The pipeline accumulator, model catalog, and sidecar are untouched —
this is purely a backend-Rust + Tauri-command + frontend-helper slice
that makes future provider work safer to review.

Tests:
- 6 Rust unit tests (per-provider rows, fallback, wire-format
  camelCase gate, permission-mode SDK strings)
- 5 frontend unit tests (`findProviderCapabilities` matrix lookups,
  null fallback, regression gates for active-goal and api-key flags)
- Existing composer `/goal pause/clear` interception tests still
  pass after switching to capability-driven dispatch (with a small
  seed update for the new query key).

Closes #321 only at the design level (the "support Pi-mono" issue —
the spine is now ready for a Pi-shaped provider row); does not add
Pi as a provider. Helps #510 / #511 by giving the Copilot ACP work a
typed capability slot to plug into.

* fix: format provider capability test helper

---------

Co-authored-by: Caspian Zhao <caspian.zhao@outlook.com>
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