Releases: ambionframework/ambion
Release list
0.6.0
Install: npm install @ambionframework/ambion@0.6.0
0.6.0 brings code mode and macros. Every Pi, Claude, and Codex seat
holds the compose and describe tools. The model writes short code over
the tools of the seat, the room tools included, and the core runs it in one
call. The core checks each nested call against the schema of its tool and
records it in the trace. See Compose.
Macros are the main use of code mode. A skill stores a procedure as a
macro, and the model runs the macro by name with arguments. The model writes
no code and reads only the value that the macro returns. Free code serves
precision, the exploration of large results, and chains of typed tools. The
live evidence in planning/ shows no token saving for free code, and the
docs claim none. See Macros.
A tool declares its output. defineTool types details from a TypeBox
schema, and compose checks each result against it. Every workspace tool
except write and edit declares its output. describe returns the typed
signatures that a compose call reads.
A process serves HTTP on its own port. bash sets $PORT for each
command, and the fetch tool reads a path of a running process. The sensor
templates use both, so the kernel holds no sensor code.
The assistant runs on any harness. defineAssistant takes an executor
function, and @ambionframework/assistant no longer depends on
@ambionframework/pi. The assistant routes a request first, and a closing
summary rests only on the messages of its exchange.
The host decides who seats agents. A room offers seat only when its
reserve held an agent as the room composed. seating: false keeps every
seat from seating or unseating an agent.
The release fixes three defects. A Pi seat reads the seat prompt as the
system prompt. A Claude seat answers a line that lands during its final
answer. Camera Chat keeps its preview frame on a refresh.
The composition entry gains two optional fields. The other journal
bodies and stored formats stay as they are, and a journal of 0.5.0 opens on
0.6.0. See Breaking changes.
Packages
The eleven packages of 0.5.0 ship at 0.6.0, and one package joins.
@ambionframework/compose is the twelfth publishable package. The examples
examples/workbench and examples/camera-chat stay private. Every library
package needs Node 22.19 or newer. processRuntime needs Node 26 or newer.
- Compose.
@ambionframework/composehas one entry point,
@ambionframework/compose/runtime, and no root export. It exports
quickjsRuntimeandprocessRuntime. It depends on
@ambionframework/ambionand onquickjs-emscripten0.32.0, pinned
exactly. - Executors.
@ambionframework/pi,@ambionframework/claude, and
@ambionframework/codexdepend on@ambionframework/compose, for the
default runtime of a seat. - Assistant.
@ambionframework/assistantdrops@ambionframework/pi
from its dependencies and depends on@ambionframework/ambiononly. Its
tests take@ambionframework/pi,@ambionframework/claude, and
@ambionframework/codexas development dependencies. - Workspace.
@ambionframework/workspacedrops the entry points
./sensorsand./sensor-api.schema.json. - Other packages. No other package adds or removes an entry point or a
dependency.
The full notes, with every change and the breaking changes, are in CHANGELOG.md.
0.5.0
Install: npm install @ambionframework/ambion@0.5.0
0.5.0 gives sensors a Git-template lifecycle. The agent forks a template, customizes it, validates it, commits, and pushes. It runs the saved version as a workstation process, connects to it, and observes it. Each observation lands in the snapshots as retained evidence. The agent rolls back with the Git and process tools. See Sensors.
The workspace owns its port. @ambionframework/workspace, @ambionframework/workstation, and @ambionframework/just-bash import no Pi package. A host with Claude or Codex seats installs no Pi package to use a workspace.
The layer boundaries hold by rule and by test. An import rule refuses each import that the layers do not allow, and a rule that matches nothing fails a test. See Toolchain.
Each word of the vocabulary has one meaning. The release renames exports, stored fields, and the text that a model reads. No old name stays as an alias. The section The vocabulary lists each change.
The executors changed. A Claude seat is hermetic and reaches files and a shell only through the workspace tools. A Codex seat runs on codex app-server and takes a steer. The Pi executor runs on @earendil-works/pi-durable 1.0.0.
No journal of 0.4.0 opens on 0.5.0. Stored bodies change field names, and the kernel reads only the format that its release writes. The section Journal and stored data lists the changes. Ambion supports no downgrade before 1.0.0.
The changelog lists each export, each journal body, and each breaking change.
On npmjs:
@ambionframework/ambion@ambionframework/journal@ambionframework/assistant@ambionframework/pi@ambionframework/claude@ambionframework/codex@ambionframework/cloudflare@ambionframework/workspace@ambionframework/just-bash@ambionframework/workstation@ambionframework/simulator
No package joins or leaves. @ambionframework/workspace adds the ./sensors entry and the ./sensor-api.schema.json file.
0.4.0
Install: npm install @ambionframework/ambion@0.4.0
0.4.0 is a release of simplification. Each fact of the room has one derivation, each rule one home, and each seat one boundary. It also adds four capabilities: the post of the host, the import of the sql tool, the fixed skills of each agent, and stable refs to workspace files and commits.
No journal of 0.3.0 opens on 0.4.0. The journal carries no format number, and Ambion supports no downgrade before 1.0.0. The changelog lists each export, each journal body, and each breaking change.
On npmjs:
@ambionframework/ambion@ambionframework/journal@ambionframework/assistant@ambionframework/pi@ambionframework/claude@ambionframework/codex@ambionframework/cloudflare@ambionframework/workspace@ambionframework/just-bash@ambionframework/workstation@ambionframework/simulator
No package joins or leaves. @ambionframework/workspace adds the ./s3 entry and removes the ./sql entry.
Live evidence: a local run of the live suite on the release commit, with the Pi, Claude, and Codex harnesses, passes 70 of 71 cases. The failing case is tool-set.test.ts in examples/workbench. The model of the design seat left say off its own list of tools. That answer varies from run to run, and no rerun followed.
0.3.0
Install: npm install @ambionframework/ambion@0.3.0
On npmjs:
@ambionframework/ambion@ambionframework/journal@ambionframework/assistant@ambionframework/pi@ambionframework/claude@ambionframework/codex@ambionframework/cloudflare@ambionframework/workspace@ambionframework/just-bash@ambionframework/workstation@ambionframework/simulator
Retired and deprecated: @ambionframework/git. Use @ambionframework/just-bash/git.
Live evidence: the live run on the tagged commit passes the Pi and Claude jobs. Two cases failed: restart.test.ts on the Codex job ("The activation ran past its lease."), and the assistant eval "keeps a constraint of the first exchange in the second" in the package job. The full live tier also ran on the owner's machine on 1e2071d, one commit before the tag. Both of those cases passed there, and so did every other case except the workbench tool-set case that #343 fixes.
The work of a seat outlives its activation. A shell command runs as a
background process, and an agent comes back to its work with a scheduled
say. A workstation keeps git repositories for its agents, and the
simulator runs evals on a room. Every library package needs Node 22.19 or
newer.
Packages
| Package | What it gives |
|---|---|
@ambionframework/ambion |
The kernel: room, journal vocabulary, rules, and hosting |
@ambionframework/journal |
The append-only journal |
@ambionframework/assistant |
The default assistant |
@ambionframework/pi |
The Pi executor, and runAgent for one agent outside a room |
@ambionframework/claude |
The Claude Agent SDK executor |
@ambionframework/codex |
The Codex SDK executor |
@ambionframework/cloudflare |
A room and its seats as Durable Objects |
@ambionframework/workspace |
The workspace interface, its tools, a SQLite backend, and the git helpers in ./git |
@ambionframework/just-bash |
A shell and a filesystem in the process, and justGitBackend in ./git |
@ambionframework/workstation |
A shell over SSH on one server, one Unix account per agent, and workstationGitBackend |
@ambionframework/simulator (new) |
Evals: an actor plays a person in a room, and a judge grades the run |
@ambionframework/git (retired) |
Use @ambionframework/just-bash/git |
New
A shell command runs in the background. bash starts every command as
a background process and returns a handle. A process outlives the call and
the activation that started it. The files of the bash backend hold the
process table, so a new run of the host reads the same table. No message
wakes a seat when a process ends: the agent waits for the result inside
the activation, and the guidance says so. A host that wants a wake posts a
message. See Processes.
import { defineHuman } from '@ambionframework/ambion';
const lab = defineHuman({
name: 'lab',
identity: 'The lab host. It reports each process that ends.',
});
const visit = await room.visit(lab);
workspace.processes.subscribe((event) => {
const { handle, name, agent, state, room: started } = event.process;
if (event.type !== 'ended' || started !== room.name) return;
visit
.send({
to: agent,
text: `Process ${name ?? handle} is ${state}. Call status with ${handle} for its output.`,
key: `process-ended:${handle}`,
})
.catch((error: unknown) => log.error(error));
});ps,status,wait, andcanceljoinbash.pslists the
running processes of the caller. The handle tools take a handle of the
caller.bashtakes an optionalname, a label thatpsand the
reminder show. Each process is a directory,
~/.processes/<handle>/, that holds the spec, the whole output in
out, the process id, and the end.- A result gives the new output.
bash,status,wait, and
cancelgive the output after a cursor that the process keeps in
~/.processes/<handle>/cursor, and move it.details.readholds the
byte range. A poll of a long build gives each part once. Each read goes
through the shell capture, which removes escape sequences and carriage
returns, as Pi'sbashtool does. waittakeshandles. It returns when the first of up to 16
processes ends, with the new output of each process that ended and the
state of each one that still runs.- A wait ends before the activation does. The room puts
deadlineon
each view, andToolContext.deadlinecarries it to each tool call: when
the room ends the activation, in milliseconds on the wall clock.bash
andwaitstop their wait 30 seconds before it, and the result says so. - A new run of the host adopts the live processes of an earlier run.
The table re-arms the timeout of each one, andcancelstops it through
its process id. A process that ended with the earlier run, with no exit
file, isfailedwith the message "The host run ended before the
process did." Workspace.processesis the host's view.list,subscribe, and
cancelreach the processes of the agents that used the workspace in
this run.listreturns a promise. The root entry of
@ambionframework/workspaceexportsProcessEvent,ProcessKind,
ProcessQuery,ProcessState,ProcessStatus, and
WorkspaceProcesses.- A tool bundle can remind a seat.
ToolBundle.remindgives text, or
a promise of text, for each respond activation, and
AgentExecutor.remindersholds the reminders of the bundles. The
executor resolves them once for each activation, with a bound of 5
seconds for each, and aborts the signal of a reminder at the bound.
renderActivationtakes the resolved text as its third argument and
adds it before the ask line. The main entry exportsReminderand
ReminderSeat. The hosting entry exportsresolveRemindersand
REMINDER_TIMEOUT_MS. The Pi executor sends a continued session the
reminders before the delta. The workspace reminds each seat of its
processes. - The workstation keeps a session open while any environment is open
over it. A process holds an environment for its whole run. - The workbench shows the background processes with
/ps. A side
panel lists the processes of the agents, shows the end of the chosen
output, and cancels a running process on a secondx.
An agent comes back to its work later. An agent says to itself with
after, in seconds. The exchange closes while the say waits. When the say
is due, the room writes a returned say, which wakes the agent and opens an
exchange for the owner of the first one. See
Exchange.
saytakesafter. A say to oneself withafterschedules it. The
room stampsowner, the owner of the open exchange, on the said entry,
and refusesafterin any other say. The result names the due time and
the seq of the say as its handle.- The
returnedentry. The room writes{ to, message, owner, text, refs }when a scheduled say is due. It has nofrom. It wakes one
seat, the one thattonames, and steers no other. It opens an exchange
forownerwhen none is open.isReturnedandReturnedMessageare
new exports. limits.scheduleboundsafterfromminAftertomaxAfter
seconds, 60 to 604,800 by default, and the says of one seat that wait,
pending, 4 by default.- The agent sees its pending says.
CollaborationContext.scheduled
carries the pending says of the seat in each response activation, and
the render lists them.renderPendingin/hostinggives that list for
a seat that continues its session. - A seat or the host dismisses a pending say. The
dismisstool takes
the handle of a pending say of the seat, and the room writes a
dismissedentry{ from, message }. The room does not return the say.
room.dismiss(handle)dismisses any pending say, with nofrom, and
returns whether it wrote the entry.room.scheduled()lists the pending
says. The Cloudflare room object serves them asdismissand
scheduledSays, because Workers keep the namescheduled.
DismissedMessageis a new export, and/hostingexportsDISMISS. RoomRead.scheduledlists the says that wait to return, each a
PendingSaywith its due time.PendingSayis a new export.- **The workbenc...
0.2.0
Install: npm install @ambionframework/ambion@0.2.0
On npmjs:
@ambionframework/ambion@ambionframework/journal@ambionframework/assistant@ambionframework/pi@ambionframework/claude@ambionframework/codex@ambionframework/cloudflare@ambionframework/workspace@ambionframework/just-bash@ambionframework/workstation@ambionframework/git
Retired and deprecated: @ambionframework/cli and @ambionframework/pi-journal.
Live evidence: the live run on the tagged commit passes the Pi, Claude, and Codex jobs and the package job.
A workspace now has real backends. A shell on a remote server, a shared
SQL database, and git repositories plug into one workspace. The Pi executor
runs on Pi's AgentHarness. A seat keeps its model session for one exchange.
Every library package needs Node 22.19 or newer.
Packages
| Package | What it gives |
|---|---|
@ambionframework/ambion |
The kernel: room, journal vocabulary, rules, and hosting |
@ambionframework/journal |
The append-only journal |
@ambionframework/assistant |
The default assistant |
@ambionframework/pi |
The Pi executor, on Pi's AgentHarness |
@ambionframework/claude |
The Claude Agent SDK executor |
@ambionframework/codex |
The Codex SDK executor |
@ambionframework/cloudflare |
A room and its seats as Durable Objects |
@ambionframework/workspace |
The workspace interface, its tools, and a SQLite backend |
@ambionframework/just-bash (new) |
A shell and a filesystem in the process, in memory or on a folder |
@ambionframework/workstation (new) |
A shell over SSH on one server, with one Unix account per agent |
@ambionframework/git (new) |
Git repositories that agents fork, clone, and push |
@ambionframework/cli (retired) |
No replacement |
@ambionframework/pi-journal (retired) |
Pass a logger to the runtime to read what a seat did |
New
A workspace takes one backend of each kind. bash is required. sql
and git are optional, and each one adds its tools and its guidance.
import { openWorkspace } from '@ambionframework/workspace';
import { sqliteBackend } from '@ambionframework/workspace/sqlite';
import { directoryBackend } from '@ambionframework/just-bash';
import { fromDirectory, gitBackend, sqliteGitStorage } from '@ambionframework/git';
const lab = openWorkspace({
name: 'lab',
backend: {
bash: directoryBackend('./data/lab'),
sql: sqliteBackend('./data/lab.db'),
git: gitBackend({
storage: sqliteGitStorage('./data/lab-git.db'),
secret: process.env.LAB_GIT_SECRET ?? '',
templates: { report: { source: fromDirectory('./templates/report') } },
}),
},
audit: {},
});- Workstation.
workstationBackend({ host, hostKey, layout, credentialFor })runs each agent's shell as its own Unix account over
SSH. Files go over SFTP. A timeout or an abort kills the command's process
group. See Workstation. - SQL. The
sqltool runs on the shared database ofbackend.sql. It
shows the last result as a table, up tomaxRowsrows, andexport
writes the full result as CSV. Each agent's tables and views are visible
to every other agent at once. - Git. An agent lists templates with
repos, forks one withfork,
clones the fork into its home, and pushes withgitinbash. A push
keeps the work across a restart. See Git. gitin every just-bash shell. It needs no configuration. The
author of a commit is the agent's name.
The Pi executor runs on Pi's AgentHarness. The harness owns the model
loop, the session, and compaction. pi({ compaction }) sets compaction.
piExecution({ sessions, sessionDir }) keeps sessions on disk by default,
or in memory. A context overflow makes the harness compact once and send
the request again. Transient provider errors go to the room, and the room
owns every retry.
A seat keeps its session for one exchange. Pi, Claude, and Codex each
resume the seat's session on its next activation in the same exchange. The
first activation in an exchange starts fresh. A lost session starts fresh
from the record.
The trace goes to your logger. createRuntime({ logger }) and the
Cloudflare configure({ logger }) take a TraceLogger. It gets one
TraceRecord for each step of an activation: the room, the seat, and the
step.
Executor authors get the room tools from the hosting entry.
roomTools, agentTools, and toolContext from
@ambionframework/ambion/hosting hold the rules of say, seat,
unseat, and a definition's tools. The Pi, Claude, and Codex executors use
them.
Conformance suites for each backend kind. From
@ambionframework/workspace/conformance: workspaceConformance for a bash
backend, sqlConformance for a SQL backend, and gitConformance for a git
backend. The Pi executor now runs the executor conformance suite, as Claude
and Codex do.
Fixes
- A resumed Claude activation gets the duties of its new activation, such
as the summary duties. - A Claude seat no longer joins the Claude Code session of its host.
- A second Cloudflare seat alarm during a live run returns at once. Before,
it released the live run as failed. - A journal entry of a known kind with an invalid
seqthrows. Before, the
journal skipped it. - A failed summary draft of another seat no longer counts against the
summary writer. - The audit log reports a failure to create its directory to
onError. - The room mirror ignores a stray file, such as
messages.jsonl.bak,
beside its log when it resumes.
Breaking changes
There is no compatibility promise before 1.0.0. Some stored formats
changed, and 0.2.0 has no reader for the old ones. Start each room fresh.
openWorkspacetakesbackend: { bash }. ImportmemoryBackendand
directoryBackendfrom@ambionframework/just-bash.WorkspaceBackend
is nowBashBackend, and it names alayout.- The
sqltool needsbackend.sql. UsesqliteBackend(path)from
@ambionframework/workspace/sqlite. The tool no longer runssqlite3in
the shell, and it has nodatabaseortimeoutparameter. - The
memoryoption ofpi(),claude(), andcodex()is gone. - The trace journals are gone. Pass a
logger.Hosting.tracesand
thestep,trace_error, andaudit_errorevents are gone. - The workspace change log is gone. The audit log records every tool
call. WorkspaceAgentis{ name }, and a resource has nodestroy().- A Codex seat with
nativeTools: 'codex'runs with no Codex sandbox by
default. Run it only on an isolated host, or setsandboxMode.
Removed and moved names, by entry:
| Entry | Change |
|---|---|
@ambionframework/ambion |
Gone: readActivation, ActivationRead, ActivationPass |
@ambionframework/ambion/hosting |
Gone: traceJournals, traceOpener, TraceOptions |
@ambionframework/journal |
Gone: scanned |
@ambionframework/pi |
Gone: seatSessionId |
@ambionframework/workspace |
Moved to @ambionframework/just-bash: memoryBackend, directoryBackend, MemoryBackendFile, MemoryBackendOptions, `SeedW... |

