Repository navigation
chore(deps): update pi-subagents to 0.77.0 - #291
Merged
Merged
Conversation
patchmill-release-please-bot
Bot
force-pushed
the
automation/pi-subagents-upgrade
branch
from
October 6, 2026 07:34
5e07d02 to
03aa911
Compare
patchmill-release-please-bot
Bot
force-pushed
the
automation/pi-subagents-upgrade
branch
from
October 8, 2026 07:36
03aa911 to
d7e5c5f
Compare
patchmill-release-please-bot
Bot
force-pushed
the
automation/pi-subagents-upgrade
branch
from
October 11, 2026 07:32
d7e5c5f to
f3d5e2a
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
pi-subagents dependency upgrade
Updates
pi-subagentsfrom0.75.0to0.77.0.Release notes
v0.76.0
Schedules can now run every day or every week at a local time, in the timezone you choose. Worktree cleanup can finally delete the worktrees in a plan you reviewed, not just list them. Most of this release makes background results harder to lose: headless sessions, pi-web, timed-out children, and
outputSchemachildren all hand back what they produced. Two Pi sessions working side by side also stop overwriting each other's settings and schedules.Highlights
worktree.cleanupdeletes the worktrees in a plan you reviewed. It checks everything again first, never deletes branches, and always keeps worktrees from older versions.pi -p, SDK hosts, or when pi-web replaces a session it thinks is idle.outputSchemasaves its structured result to the output file.Changelog
Added
every: "day"orevery: "week"with a localHH:mmtime and an IANA timezone, plus the weekdays to run on for weekly schedules. If a daylight-saving change skips the time, that run is skipped. If the time happens twice, it runs once. After a restart, the next run is calculated again from the local date. Overlap, catch-up, quiet, and mission options work the same as on other schedules. Thanks to @quifox for #815.Changed
worktree.cleanupcan now apply a plan you saved and reviewed, once you authorize discarding those worktrees. Before it deletes anything, it checks Git state and ownership again. It keeps any worktree whose path now points outside the directory it was created in, any worktree that is locked or has been resumed, and any ignored files. It never deletes local branches, and each plan can be applied only once. Worktrees created before this version are always kept. Thanks to @quifox for #1622.Fixed
pi -p, or an SDK host without a UI), a background run's completion message could be lost. The turn could end before the message was sent, and the host then closed the session. Finished results are now handed to Pi before the turn ends, and Pi runs the completion turn next. Thanks to @felores for #2644.outputSchemaand anoutputpath wrote its final text to that file whenever the text was not empty. A short closing line such as "Enough; writing up." could replace the structured result. If the child returns a structured result and does not write the file itself, the file now holds that result as indented JSON. The child's returned output and output artifact show the same JSON. Thanks to @tara-marchand for #2672.Partial output before timeout:orPartial output before child error:, and the result hasoutputPartial: true. The run still fails. The partial text is never saved as the output file and never counts as acceptance evidence. Runs that are stopped, interrupted, aborted, or exit with an ordinary error are unchanged. Thanks to @yanqianglu for #2653 (#2549).maxActiveAsyncRunsPerSessionslot forever after it ended. This happened when one of its async children failed and there was no record that the child's process had exited, for example after a reload. The newcapacity.abandonedSlotReleaseAfterMssetting frees the slot once the workflow has been over for longer than that time and each such child has failed, has no running runner, and has been inactive for a while. Set it tofalseto keep the slot. Thanks to @jihunkim0 for #2658./subagents-load-profile, and Watchdog setting changes now locksettings.json.write-lockbeside the settings file while they read and save, so the second session waits for the first. If the settings directory is read-only, the lock cannot be created and the save fails with an error. Thanks to @quifox for #2676._in place of-, such asmcp:codebase_memoryfor the servercodebase-memory, got none of the server's tools. The launch failed 10 seconds later saying the tools did not register. Both spellings now work, the same way Pi's MCP treats-and_as the same server. Thanks to @trellis-zz for #2668.workflow: truefailed with "found 0" when the model marked its script as plain```jsinstead of```js workflow. If a reply has exactly one plainjsblock and nojs workflowblock, that block now runs. When no block is found, the error shows the exact opening line it looked for and suggests passing a script file path instead. Thanks to @thetechpadawan for #2659.workflow: truealso said "found 0" when the model's reply reached the session with no text at all, which made it look as if the model had left out the script. Some providers drop the reply's visible text before Pi saves it. The error now says the reply text never arrived and suggests passing a script file path. (#2669)watchdog_diffnow also say that the list of changed paths covers the whole working tree. That list can include edits made before the session or by another session in the same checkout. Thanks to @tara-marchand for #2652.v0.76.1
pi-subagents 0.76.1 is a reliability release. When a subagent result wakes an idle parent, that parent now keeps its full prompt (subagent list, MCP servers, other extensions), so it stops forgetting tools mid-session and stops churning your provider's prompt cache. Updating pi-subagents while Pi is running now gives a clear "restart Pi" message instead of strange errors after
/reload. Herdr users get a pane that only turns red when a person is actually needed, and paused runs that looked stuck can now be stopped.Highlights
/reloadwith a clear "restart Pi" error instead of running a mix of old and new code.stopworks on a paused run whose result was already delivered, andsubagent doctorshows the same async capacity that launches use.Changelog
Highlights
/reloadwith a clear "restart Pi" error instead of running a mix of old and new code.stopworks on a paused run whose result was already delivered, andsubagent doctornow shows the same async capacity that launches use.Changed
extensionkeyword, so Pi's extension catalog lists pi-subagents under Extensions instead of Unlabelled.Fixed
Subagent updates above.message, which starts the run the normal way. Thanks to @ashlineldridge for #2688./reloadran a mix of old and new code and failed with errors such ascompletionNotifier.messageStarted is not a function. Node cannot reload a module it has already imported, so loading now stops with an error that names both versions and asks you to restart Pi. Thanks to @TheAsda for #2695.systemPromptMode: appendchildren Pi's whole prompt unchanged. Pi's prompt now comes first. (#2692)Subagent timed out after <run timeout>ms.(or0mswhen no run timeout was set), naming a deadline that never fired. It now names the tool timeout, for exampleTool 'find' exceeded its timeout of 300000ms.Thanks to @mannainsect for #2691.stopfailed withpaused result is missingon a paused run whose result had already been delivered or was never written, and a finished parent workflow kept that run's async capacity slot. When the run's process has exited,stopnow marks it stopped and the slot is freed. Thanks to @builtroller for reporting #2699.subagent doctorcould reportusage: 0/3 usedwhile launches were rejected with3/3 used, for example in a session resumed withpi --session <id>, because doctor counted a different capacity pool than launches do. It now reads the same pool for both active async capacity and the spawn budget. Thanks to @builtroller for reporting #2698.⚠in the pane's subagent label still shows it. Thanks to @nateberkopec for reporting #2702.v0.77.0
This release makes subagents much cheaper to run from the parent. The tool definitions the parent sends on every request are about 80% smaller, long child reports arrive as a short preview plus a file path, and upgrading pi-subagents no longer costs resumed sessions their prompt cache. Delegating also takes fewer turns: you launch agents by name, and a wrong name comes back with suggestions instead of a required lookup first. Background children can now run inside a sandbox, terminals can show each run's state, and a long list of reliability fixes covers schedules, async results, wakes, and untrusted projects.
Highlights
subagenttool's schema and description dropped from about 18,700 to 3,300 characters per request,bg_waitfrom about 4,500 to 1,100, and the bundled role prompts are about 20% shorter. Long child reports and guide pages now show a short preview plus a file path.parallelworkflow runs a batch of children without a script, and a parent woken by a result handles it instead of going quiet.launcher:runs background children inside a sandbox with steering and results intact, Ghostty and similar terminals show each run's state, and tmux users get a bundled inspector pane.Need to know
agentScope: "project"is rejected.Changelog
Highlights
subagenttool's schema and description dropped from about 18,700 to 3,300 characters per request,bg_waitfrom about 4,500 to 1,100, and the bundled role prompts are about 20% shorter. Long child reports and guide pages now arrive as a short preview plus a file path instead of the full text.parallelworkflow runs a batch of children without a script, and a parent woken by a result handles it instead of going quiet.launcher:, terminals such as Ghostty show each run's state, and tmux users get a bundled inspector pane.Added
parallelworkflow takes the children as data:subagent({ workflow: "parallel", args: { tasks: [{ agent, task }, ...] } })runs them in one batch and returns each child's output in order. The tool schema is unchanged. (#2773)launcher:to a command from the user config'srunnerLaunchers, such as a sandbox, and that command wraps its background runner. Steering, supervisor questions, stop, resume and results keep working. Thanks to @aaronkyriesenbach for the idea, design and nono testing. (#2577)programStatus: falseorPI_PROGRAM_STATUS=0to turn it off. (#2724)Enter/Hinspector needed Herdr or Ghostty, so tmux users had to write their own provider. A bundledtmuxinspector now opens the read-only inspector in a split pane of the current tmux window, with status and close support. Thanks to @tobymao for the plugin. (#2719)asyncWidgetCollapsed: truefolds it to a count that names no run. SetasyncWidgetLayout: "rows"to show a header and one line per run; clicking the header still folds the widget, and Pi's expand key still shows the details. Thanks to @pwguler for #2738.parentSession, the same field Pi writes for forks, and the run's_meta.jsonrecordsparentSessionId. Thanks to @yingzhi0808 for the request. (#2763)subagent-notifycompletion notice belonged to without parsing its text. Each entry in the notice'sdetails.runsnow carries the run id (runId, plusworkflowRunIdand per-childchildRunsfor workflows), status, duration and saved paths. The text the model sees is unchanged. Thanks to @kushaldotdev for the request. (#2788)Changed
subagenttool sent about 13,000 characters of parameter schema on every model request, mostly for management fields a typical delegation never uses. The schema now listsagent,task,workflow,args,async,model,cwd,worktree,output,action,idandmessageat the top level and every other field inside oneoptionsobject, which cuts it to about 2,100 characters. Management fields and therunId,maxRuntimeMsandisolationaliases still work at the top level, so existing calls and resumed sessions are unaffected. An unknownoptionskey gets the closest valid name, and a field given in both places with different values is rejected. Docs, guides, skills and the run hints in tool results now showoptions. (#2767)subagenttool description took about 5,700 characters on every model request, and the rule about when delegation is allowed appeared three times. The description is now about 1,200 characters and states each rule once: how to call the tool, that async runs wake the parent on their own, one writer per worktree, and not to silently switch to another runner after a failure. It points to the guide for workflow scripts, resume and external CLIs. The tool no longer registers a prompt guideline, and its prompt snippet no longer repeats the delegation rule.toolDescriptionMode: "full"keeps the old detail inline. (#2768)bg_waittool's description and parameters took about 4,500 characters on every model request, and each of its five parameters repeated that ordinary async runs already wake the session. They now take about 1,100 characters: the description says it once and lists the call shapes, and each parameter has a short label. (#2769)subagenttool description told the parent to call{action:"list"}before delegating and{action:"models"}before choosing a model, which cost an extra parent turn each time plus 1,300–2,000 tokens that stayed in history. It now says to launch by name with an exactprovider/id. An unknown or disabled agent fails with a "did you mean" and the available agents with one-line descriptions (at most 30). An unknown or ambiguous model fails with up to 5 of the closest model ids.listandmodelsstill work on demand. (#2771)advertise: truealso told the parent to call{action:"list"}before every delegation. Now that a launch with an unknown agent returns the available agents, new sessions no longer get that instruction. A resumed session keeps the catalog text it already has, so the upgrade does not change its prompt or cost it the provider's prompt cache. (#2791)subagent,bg_waitandsubagents_enabletools, and a child session'sbg_waitand fanoutsubagent, now keep the definition and prompt text the session already declared. Only sessions that never declared a tool get its current definition. (#2778)oracle,reviewer,worker,researcherandscoutprompts drop the repeats and keep every rule, going from 21,283 to 17,139 characters in total (oracle 6,059 → 4,789, reviewer 5,211 → 4,443, worker 4,296 → 3,083). (#2775)statusand foreground results put a child's whole output into the parent's context (about 38,000 characters for one long report), and every async launch receipt repeated about 870 characters of waiting guidance. They now show the first 2,000 characters of a longer output followed by the path, size and line count of the file that holds all of it; output with no such file stays whole. Workflow child previews are capped at 2,000 characters, structured-output previews instatusat 500 when a path line follows, failure notices now include anError:line even when the child produced output, and the receipt guidance is two short lines. (#2774)subagent({action:"guide",topic})returned a whole document, up to 62 KB fortool-reference, and that text stayed in the parent's history for every later turn. A docs-backed topic now returns its intro and a list of sections, andtopic: "<topic>/<section>"returns one section of at most 8,000 characters.overviewandcouncilare unchanged. (#2772)✓/✗lines for completions, plain colored lines for steering, and Pi's default block with raw labels such as[subagent-wait-subscription]for reminders and wakes. They now all use Pi's own message block, the one behind[skill]: a single[subagent]line whose label color names the kind (supervisor question or attention, reply, result, or watchdog) and whose status word uses the theme's status color. A click opens one block and Pi's expand key opens them all, showing the text the main agent read. Thanks to @pwguler for #2753.provider/model. Thanks to @IdrisGit for #2734.Fixed
modelScopeand agent definitions from the project, although Pi loads nothing from an untrusted project's.pidirectory. Such a session now ignores project subagent settings, project agents and chains, and agents from packages installed for the project or declared in itspackage.json. The default scope behaves asuser, and an explicitagentScope: "project"is rejected. Public preflight takesprojectTrustedto match. Thanks to @Saturnoon for the report. (#2764).pi/settings.jsonstill made subagent discovery and launch checks fail with "Failed to parse settings file", and a project'sagentExcludeDirscould still hide user agents. An untrusted lookup now reads nothing from the project's settings; trusted lookups still report a broken file. (#2804).tsor.js) of the copy loaded at startup. They are now found on disk at each launch, preferring.js. Thanks to @barjatiyasaurabh for the fix (#2761) and @gitwyy for the report. (#2780)Extension "<runtime>" error: Agent is already processing a prompt. pi-subagents and pi-intercom now share one wake per session, so the second message joins the turn the first one starts. This needs the matching pi-intercom release.bg_waitwas open sat in Pi's queue until the wait ended, which could take the whole wait window (30 minutes by default). A steer or follow-up from you now ends the wait with a non-erroruser_inputresult that lists the work still running; the work keeps going. Messages sent by extensions do not end the wait. Thanks to @nuzayets for #2736.skipped_overlapand the schedule did nothing until someone deleted itsactive.lock. A fire that overlaps an active run, and a session that restores the schedule, now check whether that run is still alive: when its process is gone, or its status has not changed for 24 hours, the run is recorded asfailed_runwith the reason and the due fire launches. A run whose runner is alive is still skipped. Thanks to @kmatzen for the report and the first fix. (#2806)~/.piwas a symlink to a directory outside home, such as a mounted drive. When the project is the home directory, the real user config directory is now accepted as a schedule root; a project.pithat links outside its project is still rejected. Thanks to @mecha for the report. (#2737)subagenttool's own stop action already handles. RPC stop now follows the tool's stop rules, with the same session and process checks. Thanks to @alexei-led for the fix (split from #2717)./subagentsadmin screen's "Change model" and "Change thinking level",/subagents-fleetand/subagents-stopclosed with no screen and no message, because RPC mode has no custom UI. These screens now use their component only in the TUI; elsewhere they use a select prompt or text instead. Thanks to @gelubodrug for the report. (#2766)mission.show,mission.listor amissionIdlaunch through another path to the same directory, such as/tmp/xand its real path/private/tmp/xon macOS. The default mission store is now keyed by the project's real path, so symlinks, junctions and, on case-insensitive filesystems, letter case no longer split it; a configureddirectoryorglobalIndexDirstill expands against the path as given. Missions created before this change through a path other than the real one stay on disk but are no longer found through that path. Thanks to @hughy for the report and the fix (#2785). (#2783)structured_outputcall failed with "Cannot load typebox/compile for structured output validation" unlessPI_SUBAGENTS_PI_CODING_AGENT_PACKAGE_ROOTwas set. Validation now also looks for TypeBox in the running Pi's package. Thanks to @Saturnoon for the report. (#2765)400 MissingSessionIDwhenforkContext.modelwas an OpenCode or OpenCode Go model, because the summary request carried no session id. It now sends the parent session id and thex-opencode-sessionheader, as the watchdog and prompt-audit requests do. (#2759)subagenttool schema marked thereviewedvalue ofacceptancewithdeprecated: true, which strict tool-schema validators reject with HTTP 400, so the tool failed on those providers. The schema no longer includesdeprecated. Thanks to @kingofdies for the report. (#2713)async: true, or loading the extension for that agent. Thanks to @tharanee-bit for the report. (#2730)before_agent_startreached a child's transcript but not its provider requests, because the child prompt was finished before those extensions ran. The child's prompt now keeps their sections and adds its own boundary after every other extension. Thanks to @adameq for the report. (#2745)Promise.prototypeeverywhere, including the workflow sandbox. The runner now works with a frozenPromise.prototypeand still catches children that were never awaited. Thanks to @albertgwo for #2793.outputPathMapping, althoughreturnaccepted the same object.emitnow drops undefined object fields and turns undefined array entries intonull, asreturndoes, and workflow script errors report the script's own line numbers instead of one line later. Thanks to @vip0351 for #2751.outputreused the earlier stage's report path, so it failed before launch when the earlier stage ran in the background, and overwrote the earlier report otherwise. It now writes to its own default report path. (#2711)inspector.statusorinspector.close, and a close racing an open could miss the pane the open created. Open and close for the same run or child now wait for each other, across processes too. (#2727)Changed files
package.jsonpackage-lock.jsonnpm-shrinkwrap.jsonnix/package.nixValidation
node --test src/pi/pi-subagents-dependency-contract.test.tsbun scripts/verify-pi-subagents-bun-workflow.mjsnpm testnode scripts/smoke-packed-artifact.mjsnpm run lintscripts/update-npm-deps-hash.shnix build .#patchmill --print-build-logs(cd result/share/patchmill && node --test --test-name-pattern='pi loads the resolved pi-subagents extension package without model execution' src/pi/pi-subagents-dependency-contract.test.ts)nix flake check --accept-flake-config --print-build-logsThis pull request is review-gated and does not auto-merge or publish.