Before submitting
Area
packages/provider-pi (Pi adapter projection). The single-run case is #17363; this is the workflow/chain/parallel case, which is explicitly out of scope there.
Steps to reproduce
- Install pi-subagents for Pi and start a Pi thread in T3 Code.
- Ask the agent to launch async children through the
subagent tool with runs.all([...]), a chain, or workflowScript, rather than one async: true launch.
- Watch the Agents panel and the thread timeline while the children run and after they finish.
Expected behavior
The launched children appear as running subagents, the way a single async launch does once #17393 lands.
Actual behavior
Nothing is projected. The adapter still requires the synchronous result shape (toolName === "subagent" plus details.results[] entries carrying agent and task), and a workflow launch returns
details: { mode: "workflow", runId, toolCallId, asyncId, asyncDir, results: [],
workflow, workflowChildren, chatProgress }
The completion then arrives as a subagent-notify custom message that pi-subagents labels differently from the single-run case, so text matching cannot settle these runs.
#17393 states this directly in its scope section: "Parallel, chain, and workflow async launches still show nothing, because pi-subagents labels their completion differently."
Evidence is from source inspection of the adapter and pi-subagents 0.76.1 rather than a hand-recorded UI trace; the replay fixture in #17393 shows the single-run projection failing on main for the same underlying reason.
A data source that already covers this
pi-subagents already publishes a bounded, versioned snapshot over RPC that contains the whole tree, so no new upstream data is strictly required:
- RPC event:
extension_ui_request / method: "setWidget", widget key subagent-async
- Payload line prefix:
PI_SUBAGENT_ASYNC_JSON:
- Payload:
kind: "pi-subagents.async-status-snapshot", version: 1, with runs: [{ id, kind: "subagent" | "workflow" | "step", label, state, startedAt, updatedAt, endedAt, activity: { state, currentTool, ... }, children: [...] }] and explicit caps / omitted bounds
Verified in pi-subagents 0.76.1 (src/runs/shared/async-status-projection.d.ts). States map cleanly onto the adapter's subagent statuses (queued -> pending, running -> running, complete -> completed, failed/partial/rejected -> failed, paused -> idle, stopped -> interrupted).
Prior art for a reader exists in a public fork: kevinsleegerslameco/t3code branch codex/pi-subagent-background-proof adds a PiSubagentSnapshot.ts that parses this widget into nested rows and emits subagent.updated (written against the pre-packages/provider-pi paths, so it needs porting).
Request
Track the workflow/chain/parallel gap so it is not silently closed by #17393. Happy to help with a port of the widget-snapshot reader if that is the shape you want.
Before submitting
Area
packages/provider-pi(Pi adapter projection). The single-run case is #17363; this is the workflow/chain/parallel case, which is explicitly out of scope there.Steps to reproduce
subagenttool withruns.all([...]), a chain, orworkflowScript, rather than oneasync: truelaunch.Expected behavior
The launched children appear as running subagents, the way a single async launch does once #17393 lands.
Actual behavior
Nothing is projected. The adapter still requires the synchronous result shape (
toolName === "subagent"plusdetails.results[]entries carryingagentandtask), and a workflow launch returnsThe completion then arrives as a
subagent-notifycustom message that pi-subagents labels differently from the single-run case, so text matching cannot settle these runs.#17393 states this directly in its scope section: "Parallel, chain, and workflow async launches still show nothing, because pi-subagents labels their completion differently."
Evidence is from source inspection of the adapter and pi-subagents 0.76.1 rather than a hand-recorded UI trace; the replay fixture in #17393 shows the single-run projection failing on
mainfor the same underlying reason.A data source that already covers this
pi-subagents already publishes a bounded, versioned snapshot over RPC that contains the whole tree, so no new upstream data is strictly required:
extension_ui_request/method: "setWidget", widget keysubagent-asyncPI_SUBAGENT_ASYNC_JSON:kind: "pi-subagents.async-status-snapshot",version: 1, withruns: [{ id, kind: "subagent" | "workflow" | "step", label, state, startedAt, updatedAt, endedAt, activity: { state, currentTool, ... }, children: [...] }]and explicitcaps/omittedboundsVerified in pi-subagents 0.76.1 (
src/runs/shared/async-status-projection.d.ts). States map cleanly onto the adapter's subagent statuses (queued -> pending,running -> running,complete -> completed,failed/partial/rejected -> failed,paused -> idle,stopped -> interrupted).Prior art for a reader exists in a public fork:
kevinsleegerslameco/t3codebranchcodex/pi-subagent-background-proofadds aPiSubagentSnapshot.tsthat parses this widget into nested rows and emitssubagent.updated(written against the pre-packages/provider-pipaths, so it needs porting).Request
Track the workflow/chain/parallel gap so it is not silently closed by #17393. Happy to help with a port of the widget-snapshot reader if that is the shape you want.