Skip to content

Copilot no-project chat can fail at session.create: standalone extension host is not initialized #38

Open

Description

@jdbencardinop

Problem

Creating a standalone / No project chat from the mobile client failed before the provider could start its turn:

Provider turn failed to start
Request session.create failed with message:
Failed to initialize standalone session extensions:
extensionSdkPath is required when standalone extensions are requested

The original screenshot contains private conversation and environment information and is intentionally not attached. The private chat content is not needed to reproduce this native startup exception.

Confirmed evidence

  • Read-only inspection found the same error in the affected environment's CopilotAdapter.ensureThread and provider-start spans at the incident time.
  • The affected selected Linux/WSL payload contains Copilot SDK 1.0.28 and native runtime 1.0.105, protocol 3. The same native failure reproduces on macOS arm64 with those versions.
  • The standalone extension SDK directory and its index.js / extension.js are present in the affected shipped platform package. This is not established as a payload-pruning or missing-file defect.
  • Reproductions used fresh disposable configuration/workspaces and actual SDK/runtime calls. No prompts were sent in native startup tests, and no existing conversation was resumed or modified.

Minimal failing condition and controls

Start a CopilotClient in mode: "copilot-cli" with a stdio runtime and disposable directories, then create a session with:

await client.createSession({
  workingDirectory: scratchDirectory,
  model: "fixture-model",
  provider: {
    type: "openai",
    baseUrl: "http://127.0.0.1:1/v1",
    apiKey: "inert-fixture-not-a-credential",
    wireApi: "completions",
  },
  requestExtensions: true,
  onPermissionRequest: () => ({ kind: "reject" }),
});

Do not send a prompt: session creation itself throws the exact reported error. The inert provider endpoint is never used for inference.

Observed with the affected shipped Linux SDK/runtime:

Extension request Extension SDK path Empty non-Git workspace Initialized Git workspace
Omitted Omitted Session created Session created
false Omitted Session created Session created
true Omitted Exact reported failure Exact reported failure
true Actual valid shipped SDK directory No extension launch provider is registered for standalone extensions Same failure

Omitted/true/false controls were also repeated using a same-host disposable copy of account configuration, with no prompts; outcomes were unchanged. That temporary account copy was deleted afterward, and no credential values were printed or published.

An independent real application No project thread with a harmless placeholder prompt completed successfully in the isolated local candidate backend. This is therefore not yet reproduced as an unconditional no-project/UI failure.

Diagnosis and remaining uncertainty

Confirmed immediate cause: the failing native session attempts to activate standalone extensions without the host initialization they require. Supplying only extensionSdkPath is insufficient in the controlled runtime: the missing extension-launch-provider prerequisite is then reported.

Not yet established: why the affected application session entered that extension-requested path. In source candidate df3383e475c3d052bcac52259384cec319dc6901, the chat adapter's session config omits both requestExtensions and extensionSdkPath; the background text generator explicitly sets requestExtensions: false. Clean controls succeed when the request is omitted. Do not equate the runtime phrase "standalone extensions" with the UI's "No project", or claim that workspace Git initialization fixes this.

The next investigation should capture only sanitized effective create/resume options and relevant capability negotiation on the failing path, not prompts, tokens, MCP authorization headers, or whole configuration files.

Expected behavior / fix boundaries

  • A new chat must not implicitly require an extension host the integration has not configured.
  • If extensions are unsupported, explicitly opt out consistently on both create and resume paths while retaining supported skills, project discovery and T3 MCP tools.
  • If extensions are intentionally supported, wire the complete supported SDK host/launch setup and resolve its payload portably, including packaged and ASAR/unpacked paths. Do not guess a filesystem path or silently retry with different semantics.
  • Cover no-project and normal-project creation, resume, enabled/disabled extensions and real packaged Linux/WSL/Windows/macOS behavior. Preserve clear startup errors and avoid duplicate/orphan sessions on retry.

No source fix, deployment, live settings change, or tpatch feature was made for this investigation. The separate local background-routing work remains unchanged.

Model/harness: GPT-6.1 Sol (gpt-6.1-sol), GitHub Copilot CLI.

Activity

  1. jdbencardinop commented on Nov 5, 2026

    @jdbencardinop
    Author

    Integrated isolated reproduction: existing-thread resume, including after config restoration

    Follow-up investigation only; no source fix or deployment.

    On SDK 1.0.28 / native runtime 1.0.105, a newly created Copilot profile and disposable T3 environment reproduced the extension-startup error during native resume of an existing T3-created conversation:

    1. With experimental: false, create a T3 thread and send a harmless one-line message: completed.
    2. Set experimental true only in that isolated profile; another message through the existing warm runtime: completed.
    3. Restart only the disposable backend and continue the same thread: native session.resume fails with the exact extensionSdkPath is required when standalone extensions are requested error.
    4. Restore the original profile configuration byte-for-byte, including false; restart and continue the same thread: native resume still fails with the same extension error.

    T3 then attempts fresh-session recovery (reason: resume_failed) and surfaces Native Copilot session replacement is unsupported. The user-facing terminal error therefore masks the earlier extension-initialization failure.

    Diagnostic controls:

    • On the affected isolated profile after restoration, direct native resume with omitted requestExtensions fails, whereas explicit requestExtensions: false successfully opens the same saved native session. No prompt was sent in these resume controls.
    • A second fresh profile that was never experimental, with a persisted harmless concrete-model conversation, cold-resumes successfully with either omitted requestExtensions or explicit false.

    This establishes an integrated existing-thread reproduction, not just an explicit-true native session-create control. It does not make this a generic no-project defect or prove that every cold resume fails. The persistence location/mechanism of the affected session/profile's extension requirement remains unresolved. Native reopening with explicit opt-out is diagnostic evidence, not an implemented T3 workaround.

    Repro precision: a separate headless CLI --experimental invocation did not persist the flag here, so the profile-state transition was applied explicitly only to the new disposable configuration. CLI flag-persistence behavior is outside the T3 bug scope.

    The separate #39 budget/accounting failure is not reproduced by this short conversation: both failed attempts here initially failed native resume on extensions, rather than reopening successfully and then exhausting the handoff budget. Both paths do converge on the unsupported replacement operation.

    No live user profile, thread, settings, or installation changed. No screenshots, original prompts, credentials, machine names, native identifiers, or local paths are attached.

  2. jdbencardinop commented on Nov 5, 2026

    @jdbencardinop
    Author

    Implemented on fix/copilot-extension-opt-out (branch head): the shared native chat create/resume config explicitly sets requestExtensions: false, matching the integration’s lack of standalone extension hosting. Skills, discovery, permissions and T3 MCP are not disabled. Both adapter startup/continuation regressions failed before the fix and now settle after one prompt; 41 focused tests pass and affected checks/typechecks pass except the unchanged server SDK knip warning. Fresh native controls reproduce explicit extension-host request failure before inference, and explicit opt-out cold-resumes the same persisted conversation with its fixture marker intact. The new clean experimental-toggle sequence with omission succeeded this time, so the earlier affected-profile requirement is not claimed unconditional or its persistence mechanism localized. No generic No project claim, new packaged Linux/Windows matrix, live settings change or deployment. Historical tpatch parent replay still blocks child verification.

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions