Repository navigation
0.9.69
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:
readandsearchaccepthistory://sessionsandhistory://workflowsfor 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
-pexits 1 (#4247, #4255) - Internal URLs:
bashno longer rejects commands whose quoted text mentions a scheme such aslocal://, 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
readandsearchaccepthistory://URLs for the current project's past sessions and workflow runs, so the agent can recall earlier work in a fresh session.history://sessionsandhistory://workflowslist recent records,history://sessions/<id>andhistory://workflows/<runId>open one (with:N-Mline ranges), andsearchoverhistory://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=Nreach 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=allor?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)WorkflowRunControlhas an optionallistProjectRuns()that lists every top-level run recorded for the current project directory, including runs the user started with/workflowthatlistRuns({ 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, andhistory://workflowsuses it (#4252)readandsearchacceptconflict://*,conflict://<id>andconflict://<id>/ours|theirs|baseto show merge conflict regions with the same idswriteresolves (#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/workflowthatlistRuns({ includeDurable: true })leaves out because no model session owns them, and finished or cancelled runs that recorded no checkpoints. The durable catalog'scompletedAllnow lists every finished root run for this.history://workflowsin the coding agent uses it (#4252)
Changed
read,search,write,findandbashnow share one list of internal URL schemes:skill://,local://,artifact://,conflict://andhistory://. The other schemes the old lists named (omp://,agent://,issue://,memory://,pr://,rule://,mcp://,vault://) were never implemented;read,searchandwritenow report them as unsupported, andbashleaves them as text (#4252)- Writing to a
skill://,artifact://orhistory://URL now fails with a read-only error instead of an unsupported-resource error (forskill://, it used to overwrite an existing skill'sSKILL.md) (#4252)
Fixed
bashno longer rejects a whole command when quoted text merely mentions an internal scheme, such as agh issue comment --body "…local://…". Internal URLs expand only in plain shell words; URLs inside quotes, heredocs, comments, escapes and command substitutions run unchanged (#4252)findwith a glob under a bareskill://<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 wasturn_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 asModel <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 -pand--mode jsonexit 1, and-pstill 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 withpersistWhenStreaming, 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 withtriggerTurn: falsewhile the agent is answering. A failed save reported nothing, and the end of the run tried the same save again and rejectedprompt()with the storage error. Aturn_endhandler that asked to continue got another model request first. Now neither sends a further model request,prompt()resolves, andatomic -pand--mode jsonexit 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. AtriggerTurn: falsemessage 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 connectand/workflow statuswere queued like messages until compaction finished. During/compact,/tasks, model changes and session commands such as/newwaited as well, and/taskscould close Atomic with a timeout error after 30 seconds. These commands now run at once, and a session command such as/newcancels 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 throughpi.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://andvault://internal URL schemes (#4252)