Describe the feature or problem you'd like to solve
TaskShellProgress.recentOutput is a small rolling window (~10 lines / ~80 chars). A client polling it to display a running shell task shows a lossy sample presented as the tail. Measured at 2s polling against a 10 lines/sec producer — consecutive polls are disjoint, so ~half the output is unobservable:
| poll |
lines |
first |
last |
| 1 |
10 |
3 |
12 |
| 2 |
10 |
21 |
30 |
| 3 |
10 |
39 |
48 |
| 7 |
10 |
113 |
122 |
A complete log already exists. With largeOutput enabled the runtime writes a full, gap-free file — including for attached tasks (400 lines → bytes=3492 first=1 last=400 contiguous=true). The runtime knows the path: shell_attached_session_read returns recent_output, large_output_file_path, large_output_total_bytes.
The wire contract drops the last two, so clients cannot find the file.
Proposed solution
In schemas/api.schema.json, add to TaskShellProgress:
"largeOutputFilePath": { "type": "string" },
"largeOutputTotalBytes": { "type": "integer" }
Optional, populated only when largeOutput is enabled and the threshold has been crossed — no change for existing consumers.
This must happen in the CLI: TaskShellProgress is defined here and the SDK's rpc.d.ts is generated from this schema (AUTO-GENERATED FILE - DO NOT EDIT / Generated from: api.schema.json). The definition also sets "additionalProperties": false, so the field is actively forbidden on the wire — no client-side or SDK-side change can surface it.
Example prompts or workflows
A GUI host showing live build output for a long-running shell task. Today it must poll recentOutput and stitch samples, knowingly dropping content.
Clients cannot work around this: largeOutput is session-scoped (fixed at createSession; no per-message option, no mid-session config update), so a directory-per-task mapping isn't possible. Concurrent tasks do get separate files, but creation order does not follow task order — tasks listed 1,0 produced files in reverse — so ctime correlation is unsafe. That leaves content-matching heuristics, which are genuinely ambiguous while two tasks emit identical output.
Additional context
Describe the feature or problem you'd like to solve
TaskShellProgress.recentOutputis a small rolling window (~10 lines / ~80 chars). A client polling it to display a running shell task shows a lossy sample presented as the tail. Measured at 2s polling against a 10 lines/sec producer — consecutive polls are disjoint, so ~half the output is unobservable:A complete log already exists. With
largeOutputenabled the runtime writes a full, gap-free file — including for attached tasks (400 lines →bytes=3492 first=1 last=400 contiguous=true). The runtime knows the path:shell_attached_session_readreturnsrecent_output,large_output_file_path,large_output_total_bytes.The wire contract drops the last two, so clients cannot find the file.
Proposed solution
In
schemas/api.schema.json, add toTaskShellProgress:Optional, populated only when
largeOutputis enabled and the threshold has been crossed — no change for existing consumers.This must happen in the CLI:
TaskShellProgressis defined here and the SDK'srpc.d.tsis generated from this schema (AUTO-GENERATED FILE - DO NOT EDIT / Generated from: api.schema.json). The definition also sets"additionalProperties": false, so the field is actively forbidden on the wire — no client-side or SDK-side change can surface it.Example prompts or workflows
A GUI host showing live build output for a long-running shell task. Today it must poll
recentOutputand stitch samples, knowingly dropping content.Clients cannot work around this:
largeOutputis session-scoped (fixed atcreateSession; no per-message option, no mid-session config update), so a directory-per-task mapping isn't possible. Concurrent tasks do get separate files, but creation order does not follow task order — tasks listed1,0produced files in reverse — so ctime correlation is unsafe. That leaves content-matching heuristics, which are genuinely ambiguous while two tasks emit identical output.Additional context
TaskShellProgressunchanged (3 fields),largeOutputappears 0 times inrpc.d.ts, whilerpc.d.tsgrew ~109KB with other features — looks unaddressed rather than deliberate.TaskShellInfo.logPathdoesn't cover this — documented as detached-only, whereaslarge_output_file_pathis on the attached read path.largeOutputissues oncopilot-sdk(Collapsible live tool usage panel — MCP servers, built-in tools, and native functions call stats #1788, [linux] Copilot blocks right click menu of console #2158, Personal ~/.agents/skills skills not loaded inside repository, loaded elsewhere #2161) concern the config not being honored; here it was honored.