- Add spawn-based pi --mode json runner (subagent-json-runner.ts) with
per-process env, replacing pi.exec() + global process.env mutation
- Add event stream parser (subagent-events.ts): parseJsonEvent,
applyEventToResult, invokeRunner, isSingleResult, formatUsageStats
- Add TUI renderer (subagent-renderer.ts): renderSubagentCall,
renderSubagentResult with collapsed/expanded views, formatToolCall
adapted from pi official subagent example
- Refactor ce_subagent to return SingleResult with onUpdate forwarding
- Refactor ce_parallel_subagent with mapWithConcurrencyLimit (max 4)
and allSettled semantics via try/catch
- Wire renderCall/renderResult into pi.registerTool for both tools
- Consolidate shared helpers (invokeRunner, isSingleResult,
makeFailedResult) into subagent-events.ts
- Remove AsyncMutex + process.env mutation from index.ts
- 284 tests (72 new), 0 regressions