Repository navigation
Description
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.ensureThreadand 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.jsare 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
jdbencardinop commentedon Nov 5, 2026
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:
experimental: false, create a T3 thread and send a harmless one-line message: completed.session.resumefails with the exactextensionSdkPath is required when standalone extensions are requestederror.T3 then attempts fresh-session recovery (
reason: resume_failed) and surfacesNative Copilot session replacement is unsupported.The user-facing terminal error therefore masks the earlier extension-initialization failure.Diagnostic controls:
requestExtensionsfails, whereas explicitrequestExtensions: falsesuccessfully opens the same saved native session. No prompt was sent in these resume controls.requestExtensionsor 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
--experimentalinvocation 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.
jdbencardinop commentedon Nov 5, 2026
Implemented on
fix/copilot-extension-opt-out(branch head): the shared native chat create/resume config explicitly setsrequestExtensions: 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.