Skip to content

chore(deps): update pi-subagents to 0.77.0 - #291

Merged
rochecompaan merged 1 commit into
mainfrom
automation/pi-subagents-upgrade
Oct 11, 2026
Merged

rochecompaan merged 1 commit into
mainfrom
automation/pi-subagents-upgrade

Conversation

@patchmill-release-please-bot

@patchmill-release-please-bot patchmill-release-please-bot Bot commented Oct 5, 2026 •

Copy link
Copy Markdown
Contributor

pi-subagents dependency upgrade

Updates pi-subagents from 0.75.0 to 0.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 outputSchema children all hand back what they produced. Two Pi sessions working side by side also stop overwriting each other's settings and schedules.

Highlights

  • Daily and weekly schedules at a local time, in a timezone you choose, on the weekdays you choose.
  • worktree.cleanup deletes the worktrees in a plan you reviewed. It checks everything again first, never deletes branches, and always keeps worktrees from older versions.
  • Background results are no longer lost in pi -p, SDK hosts, or when pi-web replaces a session it thinks is idle.
  • A child that times out or crashes returns the text it had written so far, and a child with outputSchema saves its structured result to the output file.
  • Two sessions running at once no longer overwrite each other's settings, schedules, or schedule history.

Changelog

Added

  • Schedules accept every: "day" or every: "week" with a local HH:mm time 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.cleanup can 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

  • In a headless session (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.
  • pi-web could see a session as idle while a child's result was still on its way to the parent, so it could replace the session and lose the result. The session now counts as busy until Pi starts processing the result. Thanks to @brettinternet for #2674.
  • A child with outputSchema and an output path 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.
  • A child that timed out or crashed partway through a reply lost the text it was still writing. The parent now gets that text, labeled Partial output before timeout: or Partial output before child error:, and the result has outputPartial: 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).
  • An async workflow could keep its maxActiveAsyncRunsPerSession slot 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 new capacity.abandonedSlotReleaseAfterMs setting 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 to false to keep the slot. Thanks to @jihunkim0 for #2658.
  • Two Pi sessions that changed extension settings at the same time could lose one of the changes. Agent override saves, /subagents-load-profile, and Watchdog setting changes now lock settings.json.write-lock beside 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.
  • Two sessions recording runs for the same schedule could each rewrite its run history from an old copy. A run could disappear from the history and its completion was never recorded, so the schedule stayed marked as running. History updates now use a short lock. Completion, restore, and delete now read the record of the run that is actually active. Thanks to @quifox for #2677.
  • A session that lost the race to start a scheduled run could save its outdated copy of the schedule over the copy used by the session running it. That no longer happens. The session that lost still protects the active run from being deleted, and only postpones its own timer while the other session starts the run. Thanks to @quifox for #2675.
  • If a session claimed a scheduled run but could not write the run id into the claim, for example because the disk was full, the empty claim file stayed behind. Every later run of that schedule was then skipped. The failed claim is now removed unless another session has already replaced it, and the original error is reported. Thanks to @quifox for #2678.
  • On Windows, some file checks lost precision on large file ids, so two different files or folders could look like the same one. A schedule claim that failed to write could then delete another session's lock, and the agent-memory and worktree-cleanup checks could treat two directories as one. File ids are now compared exactly. (#2679, #2685)
  • An agent that named a built-in MCP server with _ in place of -, such as mcp:codebase_memory for the server codebase-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: true failed with "found 0" when the model marked its script as plain ```js instead of ```js workflow. If a reply has exactly one plain js block and no js workflow block, 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: true also 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)
  • Creating an agent with a description longer than one line, or updating only the prompt of such an agent, saved only the first line of the description. The description is now saved as a YAML block, so every line is kept. Thanks to @March-7 for #2681.
  • When jobs leave a crowded async widget, it now shrinks to fit the jobs that remain instead of keeping blank rows. While the same jobs are listed, its height still stays fixed. Thanks to @tara-marchand for #2651.
  • The main watchdog no longer flags work you asked for mid-run as scope drift. Messages you send while the agent is running (steer or follow-up) now count as part of the task. Its review and watchdog_diff now 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

  • A parent woken by a subagent result keeps the subagent list, MCP servers, and other extensions' prompt sections for the whole run.
  • Updating pi-subagents while Pi is running now stops /reload with a clear "restart Pi" error instead of running a mix of old and new code.
  • In Herdr, a child asking its parent agent for help no longer turns the pane red.
  • stop works on a paused run whose result was already delivered, and subagent doctor shows the same async capacity that launches use.
  • Reloading extensions while a child's result is waiting no longer lets a host such as pi-web lose that result.

Changelog

Highlights

  • When a subagent result wakes an idle parent, that run keeps the subagent list, MCP servers, and other extensions' prompt sections, and no longer churns the provider's prompt cache.
  • Updating pi-subagents while Pi is running now stops /reload with a clear "restart Pi" error instead of running a mix of old and new code.
  • In Herdr, a child asking its parent agent for help no longer turns the pane red.
  • stop works on a paused run whose result was already delivered, and subagent doctor now shows the same async capacity that launches use.
  • Reloading extensions while a child's result is waiting no longer lets a host such as pi-web lose that result.

Changed

  • The npm package now has the extension keyword, so Pi's extension catalog lists pi-subagents under Extensions instead of Unlabelled.

Fixed

  • When a subagent result, supervisor question, or other notice woke an idle parent, the run it started skipped Pi's normal prompt setup. From its second request on, it lost the subagent list, the MCP server list, and other extensions' prompt sections, and the changing prompt could invalidate the provider's prompt cache. The parent now gets the notice followed by a short Subagent updates above. message, which starts the run the normal way. Thanks to @ashlineldridge for #2688.
  • Reloading extensions while a child's result was waiting in Pi's queue made the session look idle, so a host such as pi-web could replace the session and lose the result. The session now stays busy until Pi picks up the result. Thanks to @brettinternet for #2687.
  • After pi-subagents was updated while Pi was running, /reload ran a mix of old and new code and failed with errors such as completionNotifier.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.
  • Child system prompts started with pi-subagents' own instructions instead of Pi's base prompt. Providers and extensions that recognize Pi's default prompt by its first sentence then sent systemPromptMode: append children Pi's whole prompt unchanged. Pi's prompt now comes first. (#2692)
  • When a per-tool timeout stopped a foreground child, its output said Subagent timed out after <run timeout>ms. (or 0ms when no run timeout was set), naming a deadline that never fired. It now names the tool timeout, for example Tool 'find' exceeded its timeout of 300000ms. Thanks to @mannainsect for #2691.
  • stop failed with paused result is missing on 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, stop now marks it stopped and the slot is freed. Thanks to @builtroller for reporting #2699.
  • subagent doctor could report usage: 0/3 used while launches were rejected with 3/3 used, for example in a session resumed with pi --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 Herdr, the pane turned red, which means a person needs to act, whenever an async child needed attention, including a child waiting for its parent agent's answer. Those requests go to the parent agent, so pi-subagents no longer marks the pane blocked; the ⚠ 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

  • Far fewer tokens. The subagent tool's schema and description dropped from about 18,700 to 3,300 characters per request, bg_wait from 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.
  • Prompt cache survives upgrades. Resumed sessions keep the tool definitions they already have, and upgrading under a running Pi no longer breaks every child launch.
  • Fewer wasted parent turns. Wrong agent or model names come back with suggestions, the new built-in parallel workflow runs a batch of children without a script, and a parent woken by a result handles it instead of going quiet.
  • Sandboxes and terminal status. 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.
  • Untrusted projects stay untrusted. A session that declined project trust no longer takes models, agents, or settings from that project.

Need to know

Who What changes
pi-intercom users The fix for "Agent is already processing a prompt" when both extensions wake the parent at once needs the matching pi-intercom release.
Sessions that declined project trust Project agents, chains and subagent settings are ignored, and agentScope: "project" is rejected.
Missions created through a symlinked path The mission store is now keyed by the project's real path. Missions created earlier through another path stay on disk but are no longer found through that path.

Changelog

Highlights

  • Subagents cost the parent far fewer tokens. The subagent tool's schema and description dropped from about 18,700 to 3,300 characters per request, bg_wait from 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.
  • Upgrading pi-subagents no longer costs resumed sessions their prompt cache, and upgrading under a running Pi no longer breaks every child launch.
  • Fewer wasted parent turns: launch an agent by name and a wrong agent or model name comes back with suggestions, the new built-in parallel workflow runs a batch of children without a script, and a parent woken by a result handles it instead of going quiet.
  • Background children can run inside a sandbox with launcher:, terminals such as Ghostty show each run's state, and tmux users get a bundled inspector pane.
  • A session that declined project trust no longer takes models, agents, or settings from that project.

Added

  • Running independent subagents in parallel needed a JavaScript workflow script that the model had to write in its reply, and some parents had to save it to a file first. The built-in parallel workflow 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)
  • Background children could run in a sandbox only through an external CLI runner, which loses native steering and results. An agent can now set launcher: to a command from the user config's runnerLaunchers, 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)
  • A terminal could not tell which background subagent runs were working, waiting on you, finished, or failed without reading the screen. Each run's state is now reported with OSC 7501, the Program Status Protocol, which terminals such as Ghostty can show next to Pi's own status. Set programStatus: false or PI_PROGRAM_STATUS=0 to turn it off. (#2724)
  • Fleet's Enter/H inspector needed Herdr or Ghostty, so tmux users had to write their own provider. A bundled tmux inspector 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)
  • The async widget under the editor gives each active background run two or more lines while the terminal has room, and asyncWidgetCollapsed: true folds it to a count that names no run. Set asyncWidgetLayout: "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.
  • Session browsers and usage tools could link a subagent run to the session that launched it only by parsing the directory layout. A new child session's header now records the launching session's file as parentSession, the same field Pi writes for forks, and the run's _meta.json records parentSessionId. Thanks to @yingzhi0808 for the request. (#2763)
  • A host that shows subagent activity could not tell which run a subagent-notify completion notice belonged to without parsing its text. Each entry in the notice's details.runs now carries the run id (runId, plus workflowRunId and per-child childRuns for workflows), status, duration and saved paths. The text the model sees is unchanged. Thanks to @kushaldotdev for the request. (#2788)

Changed

  • The subagent tool sent about 13,000 characters of parameter schema on every model request, mostly for management fields a typical delegation never uses. The schema now lists agent, task, workflow, args, async, model, cwd, worktree, output, action, id and message at the top level and every other field inside one options object, which cuts it to about 2,100 characters. Management fields and the runId, maxRuntimeMs and isolation aliases still work at the top level, so existing calls and resumed sessions are unaffected. An unknown options key 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 show options. (#2767)
  • The default subagent tool 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)
  • The bg_wait tool'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)
  • The subagent tool 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 exact provider/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. list and models still work on demand. (#2771)
  • The catalog of agents marked advertise: true also 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)
  • Changing a pi-subagents tool description, schema, prompt snippet, or guideline made every resumed or reloaded session re-declare that tool before its next request, so the provider re-read the whole conversation without its prompt cache. The subagent, bg_wait and subagents_enable tools, and a child session's bg_wait and fanout subagent, now keep the definition and prompt text the session already declared. Only sessions that never declared a tool get its current definition. (#2778)
  • Every turn of a child launched with a bundled role resent its full role prompt, and those prompts repeated their own rules and the supervisor instructions that are already appended. The oracle, reviewer, worker, researcher and scout prompts 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)
  • Async completion notices, completed-run status and 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 in status at 500 when a path line follows, failure notices now include an Error: 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 for tool-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, and topic: "<topic>/<section>" returns one section of at most 8,000 characters. overview and council are unchanged. (#2772)
  • Each message pi-subagents put in the main chat had its own look: bordered cards for supervisor requests, replies and attention notices, ✓/✗ 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.
  • Subagent model displays (Fleet, the async widget, run status, nested renders and result cards) showed only the model id, so two providers or logins serving the same model looked identical. They now show provider/model. Thanks to @IdrisGit for #2734.

Fixed

  • A session that declined Pi project trust still took subagent models, modelScope and agent definitions from the project, although Pi loads nothing from an untrusted project's .pi directory. Such a session now ignores project subagent settings, project agents and chains, and agents from packages installed for the project or declared in its package.json. The default scope behaves as user, and an explicit agentScope: "project" is rejected. Public preflight takes projectTrusted to match. Thanks to @Saturnoon for the report. (#2764)
  • In a session that declined project trust, a malformed project .pi/settings.json still made subagent discovery and launch checks fail with "Failed to parse settings file", and a project's agentExcludeDirs could still hide user agents. An untrusted lookup now reads nothing from the project's settings; trusted lookups still report a broken file. (#2804)
  • After pi-subagents was upgraded under a running Pi session, every child launch could fail at once with "Extension path does not exist" or MODULE_NOT_FOUND, because the paths of the child runtime extensions and the async runner kept the file extension (.ts or .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)
  • A parent could wake for a supervisor decision or a finished workflow, reply with nothing, and leave the delegated work unhandled until you sent another message. The wake message now asks the parent to handle the result within the authority it already has. If it still replies with nothing, it gets one more turn and then a short notice that the work is unhandled, never an automatic approval. A visible reply, including a question to you, does not force another turn. Thanks to @CamAnNguyen for #2716.
  • When a subagent notice and an intercom message reached an idle parent at the same moment, both extensions started a turn, and the second failed with 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.
  • A message you typed while a blocking bg_wait was 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-error user_input result that lists the work still running; the work keeps going. Messages sent by extensions do not end the wait. Thanks to @nuzayets for #2736.
  • A scheduled run whose async runner died before writing a final status kept its schedule's claim, so every later fire was recorded as skipped_overlap and the schedule did nothing until someone deleted its active.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 as failed_run with 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)
  • Starting Pi in the home directory failed with "Project schedule root ... resolves outside the real project" when ~/.pi was 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 .pi that links outside its project is still rejected. Thanks to @mecha for the report. (#2737)
  • A host still handling a background run's paused result could delete or overwrite the final result written after it under the same run id, or remove that run's session, run and mission indexes. When the final result could not replace the paused file (EPERM/EACCES), it was delivered over and over without completing. Results are now written and consumed under a per-run lock, and a consumer leaves alone any result written after it read the run, along with its indexes. (#2744)
  • When a workflow awaited an async child, it could read the child's result before the child had written its index entries, so those entries were written after the workflow cleaned up and stayed behind in the child's run directory. A child now writes all index entries before its result becomes readable. (#2741)
  • A foreground child that detached to ask its supervisor kept running after a reload or session switch. Status and resume then said "Async run not found", and its workflow showed as stopped. Reloading pi-subagents now stops each detached foreground child and records it as stopped, so status shows the stop and its cause, resume works from its session, and its pending supervisor question is closed. Thanks to @Saturnoon for the report. (#2762)
  • Interrupting a run id that could not be resolved interrupted the newest unrelated running job instead, and a nested async child whose owner had no foreground route to it could not be interrupted at all. An explicit interrupt id now fails when it does not resolve (a bare interrupt still picks the newest run), and an interrupt the owner cannot route now goes to the nested child directly. Thanks to @leopepe for the fix (#2760).
  • RPC stop refused queued and paused async runs, which the subagent tool'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).
  • An RPC client that lost the spawn reply for a direct async run could not find the run by its tool-call ID once the result was delivered. Direct runs now keep the tool-call ID for status lookup after delivery, and an ID shared by a live run and a finished run is reported as ambiguous. Thanks to @alexei-led for #2717.
  • Over Pi's RPC mode, the /subagents admin screen's "Change model" and "Change thinking level", /subagents-fleet and /subagents-stop closed 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)
  • A mission created through one path to a project was "not found" by mission.show, mission.list or a missionId launch through another path to the same directory, such as /tmp/x and its real path /private/tmp/x on 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 configured directory or globalIndexDir still 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)
  • When TypeBox was installed only in Pi's own dependencies, every structured_output call failed with "Cannot load typebox/compile for structured output validation" unless PI_SUBAGENTS_PI_CODING_AGENT_PACKAGE_ROOT was set. Validation now also looks for TypeBox in the running Pi's package. Thanks to @Saturnoon for the report. (#2765)
  • Pruned fork context failed with 400 MissingSessionID when forkContext.model was an OpenCode or OpenCode Go model, because the summary request carried no session id. It now sends the parent session id and the x-opencode-session header, as the watchdog and prompt-audit requests do. (#2759)
  • The subagent tool schema marked the reviewed value of acceptance with deprecated: true, which strict tool-schema validators reject with HTTP 400, so the tool failed on those providers. The schema no longer includes deprecated. Thanks to @kingofdies for the report. (#2713)
  • Background children failed within a second with "Request timed out" on networks where connecting to the provider takes longer than 250 ms. The background runner used Node's 250 ms per-address connection limit, while Pi uses 2 s; the runner now uses 2 s too. Thanks to @robinchm for the report and the fix. (#2758)
  • A foreground child whose model comes from a provider that a parent extension registered gets the provider but not that extension's session hooks, so a provider that needs those hooks failed the first request with an error only the provider understood. That failure now also says the child ran in the foreground without the extension and names the fixes: async: true, or loading the extension for that agent. Thanks to @tharanee-bit for the report. (#2730)
  • Prompt sections that other extensions add in before_agent_start reached 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)
  • Every workflow script failed before its first line with "Cannot redefine property: then" (or "Attempting to change value of a readonly property") when the host Pi build froze Promise.prototype everywhere, including the workflow sandbox. The runner now works with a frozen Promise.prototype and still catches children that were never awaited. Thanks to @albertgwo for #2793.
  • A workflow script failed with "emit. must be a JSON value; received undefined" when it emitted an object with an undefined field, such as a child result's missing outputPathMapping, although return accepted the same object. emit now drops undefined object fields and turns undefined array entries into null, as return does, and workflow script errors report the script's own line numbers instead of one line later. Thanks to @vip0351 for #2751.
  • A workflow stage that resumed an earlier stage without its own output reused 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)
  • A background workflow's child rows showed no token usage or turn count, although each child's own status had them and the workflow total was their sum. Each child row now shows the usage and turn count from that child's result. Thanks to @moxuun for the report. (#2715)
  • A long-running foreground child re-formatted every past tool call on each progress update, although progress shows only the latest 64, so each update got slower as the child's history grew. Progress updates now format only those 64 calls. (#2704)
  • Fleet reread and re-rendered the selected transcript every 750 ms even when it had not changed, which took hundreds of milliseconds per refresh for a long transcript. It now reuses the rendered transcript until the file, selection, width or tool view changes. (#2705)
  • A Herdr-placed Pi child's bridge kept every frame it received, so a healthy run failed and started reconnecting after its 1,024th frame. Frames are now released once the session has taken them. (#2706)
  • Two inspector opens for the same run or child at once, for example from Fleet and a tool call or from two Pi processes, could each open a pane and save a binding, so one pane could no longer be reached by inspector.status or inspector.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.json
  • package-lock.json
  • npm-shrinkwrap.json
  • nix/package.nix

Validation

  • node --test src/pi/pi-subagents-dependency-contract.test.ts
  • bun scripts/verify-pi-subagents-bun-workflow.mjs
  • npm test
  • node scripts/smoke-packed-artifact.mjs
  • npm run lint
  • scripts/update-npm-deps-hash.sh
  • nix 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-logs

This pull request is review-gated and does not auto-merge or publish.

@patchmill-release-please-bot
patchmill-release-please-bot Bot force-pushed the automation/pi-subagents-upgrade branch from 5e07d02 to 03aa911 Compare October 6, 2026 07:34
@patchmill-release-please-bot patchmill-release-please-bot Bot changed the title chore(deps): update pi-subagents to 0.76.0 chore(deps): update pi-subagents to 0.76.1 Oct 6, 2026
@patchmill-release-please-bot
patchmill-release-please-bot Bot force-pushed the automation/pi-subagents-upgrade branch from 03aa911 to d7e5c5f Compare October 8, 2026 07:36
@patchmill-release-please-bot
patchmill-release-please-bot Bot force-pushed the automation/pi-subagents-upgrade branch from d7e5c5f to f3d5e2a Compare October 11, 2026 07:32
@patchmill-release-please-bot patchmill-release-please-bot Bot changed the title chore(deps): update pi-subagents to 0.76.1 chore(deps): update pi-subagents to 0.77.0 Oct 11, 2026
@rochecompaan
rochecompaan merged commit f8f213f into main Oct 11, 2026
3 checks passed
@rochecompaan
rochecompaan deleted the automation/pi-subagents-upgrade branch October 11, 2026 16:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant