Skip to content

0.9.69

Choose a tag to compare

@github-actions github-actions released this 03 Nov 10:08
· 140 commits to main since this release
24f242b

A fresh session can now look up your earlier sessions and workflow runs through history://. UI commands such as /workflow connect and /settings no longer wait for compaction, and a message that cannot be saved now stops the run with an error instead of failing silently.

  • Recall past work: read and search accept history://sessions and history://workflows for the current project, and the default system prompt tells the agent to use them. They work with every session and workflow store, custom stores included (#4256)
  • Commands during compaction: slash commands that do not send a prompt run immediately while a session compacts. Prompts, templates, skills and messages that commands send still wait, and go out in the order you typed them (#4253)
  • Unsaved messages stop the run: when a message cannot be written to the session file, for example after another process wrote to it, the run reports the cause once and sends no further model request, and -p exits 1 (#4247, #4255)
  • Internal URLs: bash no longer rejects commands whose quoted text mentions a scheme such as local://, and the unimplemented schemes are gone (#4256)
  • Long-running hosts: child completions and Intercom delivery no longer scan every run a workflow host has kept (#4250)
Full changelog

Added

  • read and search accept history:// URLs for the current project's past sessions and workflow runs, so the agent can recall earlier work in a fresh session. history://sessions and history://workflows list recent records, history://sessions/<id> and history://workflows/<runId> open one (with :N-M line ranges), and search over history:// finds text across them, including the transcripts of each run's stages, one page of records at a time, with the URL that continues it. ?limit=N (up to 200) and ?offset=N reach every record, and transcripts are never shortened: a long line is split so every part can be read. They read through the configured session store and workflow journal, so they work with the default SQLite store, JSONL directories, memory and custom SDK stores alike. Other projects' sessions appear only with ?project=all or ?project=<dir>. The default system prompt now tells the agent to recall earlier work this way when you refer to it, instead of searching storage files on disk (#4252)
  • WorkflowRunControl has an optional listProjectRuns() that lists every top-level run recorded for the current project directory, including runs the user started with /workflow that listRuns({ includeDurable: true }) leaves out because no model session owns them, and finished or cancelled runs that recorded no checkpoints. The bundled workflows extension implements it, and history://workflows uses it (#4252)
  • read and search accept conflict://*, conflict://<id> and conflict://<id>/ours|theirs|base to show merge conflict regions with the same ids write resolves (#4252)
  • The session run control implements the optional listProjectRuns(), which lists every top-level run recorded for the current project directory, including runs started with /workflow that listRuns({ includeDurable: true }) leaves out because no model session owns them, and finished or cancelled runs that recorded no checkpoints. The durable catalog's completedAll now lists every finished root run for this. history://workflows in the coding agent uses it (#4252)

Changed

  • read, search, write, find and bash now share one list of internal URL schemes: skill://, local://, artifact://, conflict:// and history://. The other schemes the old lists named (omp://, agent://, issue://, memory://, pr://, rule://, mcp://, vault://) were never implemented; read, search and write now report them as unsupported, and bash leaves them as text (#4252)
  • Writing to a skill://, artifact:// or history:// URL now fails with a read-only error instead of an unsupported-resource error (for skill://, it used to overwrite an existing skill's SKILL.md) (#4252)

Fixed

  • bash no longer rejects a whole command when quoted text merely mentions an internal scheme, such as a gh issue comment --body "…local://…". Internal URLs expand only in plain shell words; URLs inside quotes, heredocs, comments, escapes and command substitutions run unchanged (#4252)
  • find with a glob under a bare skill://<name> now searches the skill's directory instead of failing with "Search path must be a directory" (#4252)
  • Completing or failing a pooled child, routing, queueing or draining an Intercom message for a stage or a pattern, and the route announcement and undeliverable-message check that follow a change to one run, no longer scan every run in the workflow store. Each finds the runs it needs by id or through the run's parent and child links, so a long-lived host with thousands of finished runs no longer spends main-thread time proportional to its history on each child completion or message. A pattern broadcast still matches against every live stage of its own invocation, and a change that adds, removes or relinks a run, or is not tied to one run, still announces every route (#4190)
  • A message that cannot be saved to the session now stops the run and says why: could not persist the assistant message: <cause>, where the cause is, for example, Session conflict: … after another process wrote to the same session file, or the file system error behind a failed write. Before, the failure was dropped silently. The only sign was turn_end could not resolve the persisted assistant entry ID, repeated for every later reply; the run kept sending the model a context without its unsaved messages, and then ended as Model <model> failed: <storage error> or a prompt never returned. Now the run sends no further model request, and nothing is retried or continued on top of the unsaved message. atomic -p and --mode json exit 1, and -p still prints the answer it received. An interactive session shows the error and stays open; before, interactive mode dropped every extension error raised in its engine process, this one included. Messages that could not be saved are still missing from the session file (#4226)
  • A custom message that cannot be saved now stops the run in the same way, with one could not persist the custom message: <cause> error. Two kinds of custom message skipped that stop. The first is a notice sent with persistWhenStreaming, as workflow and background-task notices are, that arrives while the agent is answering. When the hidden copy the model reads could not be saved, the error was dropped and the run sent another model request. The error that surfaced later blamed the assistant reply. The second is a message an extension sends with triggerTurn: false while the agent is answering. A failed save reported nothing, and the end of the run tried the same save again and rejected prompt() with the storage error. A turn_end handler that asked to continue got another model request first. Now neither sends a further model request, prompt() resolves, and atomic -p and --mode json exit 1. A failed write of a notice's hidden copy now stops the run instead of being retried within it. The notice's saved card stays marked for replay when the session is resumed. The next prompt tries the write again, as does closing the session. If that last write fails too, closing fails with its cause and the session stays recoverable. A triggerTurn: false message that could not be saved waits for the next prompt (#4254)
  • Slash commands that do not send a prompt no longer wait for compaction. During automatic compaction or /compact, extension commands such as /workflow connect and /workflow status were queued like messages until compaction finished. During /compact, /tasks, model changes and session commands such as /new waited as well, and /tasks could close Atomic with a timeout error after 30 seconds. These commands now run at once, and a session command such as /new cancels the compaction. Only input that becomes a model message waits: plain messages, steering and follow-up messages, prompt templates and skills. They are still sent after compaction, in the order you typed them. A message that a command sends while compaction runs, for example through pi.sendUserMessage(), also waits instead of starting a model turn against the transcript being compacted. It shows as queued, goes out once compaction ends after the messages typed before the command, and Alt+Up returns it to the editor (#4251)
  • Under Bun, a retired run's late unhandled rejection no longer fails a replacement run that has the same durable run ID and workflow source, including when it fires more than 30 seconds after the retired run ended. A run that starts within 30 seconds of another execution of its workflow source ending treats an unscoped rejection from that source as ambiguous for its whole lifetime, and the runtime reports it instead of attributing it to the replacement (#4192)

Removed

  • The unimplemented omp://, agent://, issue://, memory://, pr://, rule://, mcp:// and vault:// internal URL schemes (#4252)