Skip to content

bug(acp): providers installed after the daemon started stay unresolved on Windows, and a handshake exit reports as a 120s timeout #8303

Closed

Description

@Peanut-HZM

What's broken

Two related failures on Windows, both affecting ACP providers (Kimi Code CLI, MiniMax Code) that were installed after the Paseo daemon started:

  1. Provider shows as "not installed" / unavailable. The daemon's supervisor process holds the PATH it inherited when it was launched. On Windows, a newly installed CLI updates the registry Path value but the running daemon never sees it, so the launcher binary is not resolvable even though it is on PATH in a fresh shell.

  2. Provider shows "error" with a 120s timeout. When the configured command is a broken npx invocation, the child process exits during the ACP handshake. The SDK's initialize request never rejects in that case, so the provider refresh waits out its full 120-second deadline and reports:

    Timed out refreshing MiniMax Code after 120000ms; pending: initialize
    

    The child's actual stderr is never surfaced, so the message gives no hint of the real cause.

Steps to reproduce

  1. Start Paseo on Windows.
  2. Install an ACP agent CLI afterwards (e.g. Kimi Code CLI or MiniMax Code) — the installer adds its directory to the registry Path value.
  3. Add the CLI as a custom provider in Paseo.
  4. Observe the provider as unavailable / "not installed", and its refresh failing with the 120s timeout above.

The provider stays broken until the whole daemon tree is restarted, and restarting only the worker does not help, because the supervisor passes its own stale PATH down to every worker it spawns.

Where did this happen

Daemon

Paseo version

0.14.0

OS version

Windows 11

Agent provider

Custom provider

Provider configuration

{
  "agents": {
    "providers": {
      "kimi": {
        "extends": "acp",
        "label": "Kimi Code CLI",
        "command": ["kimi", "acp"]
      },
      "minimax-code": {
        "extends": "acp",
        "label": "MiniMax Code",
        "command": ["npx", "-y", "@minimax-ai/code@0.6.13", "acp"]
      }
    }
  }
}

Both CLIs are installed and working outside Paseo:

$ kimi --version
2.4.1

$ mcode --version
0.7.1

Both answer an ACP initialize handshake directly:

$ kimi acp   ->  {"jsonrpc":"2.0","id":1,"result":{"protocolVersion":1,...,"agentInfo":{"name":"kimi",...}}}
$ mcode acp  ->  {"jsonrpc":"2.0","id":1,"result":{"protocolVersion":1,...,"agentInfo":{"name":"minimax-code","version":"0.7.1"},...}}

The registry Path value does contain both install directories:

> [Environment]::GetEnvironmentVariable('Path','User')
C:\Users\17729\.kimi-code\bin
C:\Users\17729\.minimax-code

Logs

Raw daemon log lines from the daemon that was running before the CLIs were installed (PID 77928):

{"level":40,"time":1793366288797,"pid":77928,"hostname":"RabbitQ","daemonVersion":"0.14.0","module":"bootstrap","module":"provider-snapshot-manager","err":{"type":"Error","message":"Timed out refreshing MiniMax Code after 120000ms; pending: initialize","stack":"Error: Timed out refreshing MiniMax Code after 120000ms; pending: initialize\n    at Timeout.<anonymous> (file:///D:/Programs/Paseo/resources/app.asar/node_modules/@getpaseo/server/dist/server/server/agent/provider-refresh-deadline.js:49:24)\n    at listOnTimeout (node:internal/timers:685:17)\n    at process.processTimers (node:internal/timers:618:7)"},"provider":"minimax-code","target":{"scope":"global","force":true},"msg":"Failed to refresh provider snapshot"}
{"level":40,"time":1793366395802,"pid":77928,"hostname":"RabbitQ","daemonVersion":"0.14.0","module":"bootstrap","module":"provider-snapshot-manager","err":{"type":"Error","message":"Timed out refreshing MiniMax Code after 120000ms; pending: initialize","stack":"Error: Timed out refreshing MiniMax Code after 120000ms; pending: initialize\n    at Timeout.<anonymous> (file:///D:/Programs/Paseo/resources/app.asar/node_modules/@getpaseo/server/dist/server/server/agent/provider-refresh-deadline.js:49:24)\n    at listOnTimeout (node:internal/timers:685:17)\n    at process.processTimers (node:internal/timers:618:7)"},"provider":"minimax-code","target":{"scope":"workspace","cwd":"D:\\GitHubProjects\\paseo","force":false},"msg":"Failed to refresh provider snapshot"}

The repeated entries continue for every workspace scope until the daemon is restarted.

paseo provider diagnostic minimax-code on that same daemon, which is what surfaced the real cause:

MiniMax Code (ACP)
  Provider ID: minimax-code
  Configured command: mcode acp
  Launcher binary: mcode
  Resolved path: not found
  Version: unknown
  Version command: mcode --version
  ACP spawn: ok (21ms)
  ACP initialize: error: ACP initialize timed out after 20000ms
  ACP stderr: 'mcode' 不是内部或外部命令,也不是可运行的程序或批处理文件。
  ACP cleanup: ok (0ms)
  Models: ?  Status: Unavailable

Note that the diagnostic shows 'mcode' 不是内部或外部命令 (the child's real stderr), while the snapshot manager only ever reports the 120s timeout.

The same run for Kimi:

Kimi Code CLI (ACP)
  Provider ID: kimi
  Configured command: kimi acp
  Launcher binary: kimi
  Resolved path: not found
  Version: unknown
  Version command: kimi --version
  ACP spawn: ok (19ms)
  ACP initialize: error: ACP initialize timed out after 20000ms
  ACP stderr: 'kimi' 不是内部或外部命令,也不是可运行的程序或批处理文件。
  ACP cleanup: ok (0ms)
  Models: ?  Status: Unavailable

Screenshots or video

Not applicable — reproducible from the CLI with paseo provider diagnostic <provider> and paseo provider ls.


Relationship to existing issues

This is the ACP-provider counterpart of #6235 ("Pi diagnostic resolves npm pi.cmd on Windows, but RPC runtime launches bare pi and fails"). #6235's diagnosis matches: the runtime launches the bare default command while the diagnostic resolves a concrete path, and on Windows the spawned shell re-resolves the bare name against its own PATH/PATHEXT.

What is different here:

Additional detail

On the MiniMax Code catalog entry specifically: the catalog was corrected in #8201 (merged as 1f79efc), but that only applies when adding the provider. A config.json written by an older client still contains ["npx", "-y", "@minimax-ai/code@0.6.13", "acp"], and the persisted command is never migrated — so existing setups keep failing. This is the "Existing saved commands still need the explicit package and binary form" note in the closing comment on #6948, but the migration itself is missing.

Activity

  1. paseo-bot commented on Oct 30, 2026

    @paseo-bot
    Contributor

    Thanks, @Peanut-HZM. I'm keeping this open as a bug at p2 for the second part: when an ACP provider's process exits during startup, the provider reports a 120-second initialize timeout instead of the process's error. Until that changes, paseo provider diagnostic <provider> shows the error under ACP stderr.

    #8260 shows the same timeout when GLM Agent exits during startup, so I've linked the two issues.

    The first part comes from Paseo reading PATH once, when it starts, on every platform. A CLI installed afterwards is found once the whole daemon restarts, as you saw. Saved provider commands also stay as written when the catalog changes, as noted when #6948 closed. Changing either behavior is a workflow change, and those are discussed in Discussions.

    Updates go on this issue.

  2. added
    bugReproducible unintended behavior
    p2Valid useful work with limited impact or a workaround
    triagedReviewed by maintainer triage
    diagnosingThe diagnose bot is working on this issue
    on Oct 30, 2026
  3. paseo-bot commented on Oct 31, 2026

    @paseo-bot
    Contributor

    A fix for the startup timeout is in #8384. I reproduced the timeout after a launcher exited; the fix reports its error promptly during provider refresh, diagnostics, and session startup.

    The Windows PATH and saved-command behavior remains unverified and unchanged. Updates go on the pull request.

  4. added
    diagnosedThe diagnose bot investigated this; on a PR, the bot authored it
    and removed
    diagnosingThe diagnose bot is working on this issue
    on Oct 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugReproducible unintended behaviordiagnosedThe diagnose bot investigated this; on a PR, the bot authored itp2Valid useful work with limited impact or a workaroundtriagedReviewed by maintainer triage

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions