Skip to content

Releases: ambionframework/ambion

0.6.0

Choose a tag to compare

@andreisavu andreisavu released this 04 Oct 15:41
18e533c

Install: npm install @ambionframework/ambion@0.6.0

Ambion 0.6.0: code mode and macros. Every seat runs short code over its tools in one call, and a skill stores a procedure as a macro. Code mode: the compose tool runs short code over the tools of a seat, the room tools included, and the core checks and traces each call; the model runs a macro by name with arguments and reads one value. Declared outputs: a tool declares the shape of its details, describe returns its signature, and compose checks every result against it. Free code: short code joins tools in one call, for precision and typed chains, and the live runs measured no token saving for it. The assistant: defineAssistant takes an executor function and needs no Pi package. Also new: the twelfth package, compose, with the QuickJS and child process runtimes, $PORT and fetch for processes, and seating: false for a room. Fixes: a Pi seat reads its prompt as the system prompt, and a Claude seat answers a late steer. Breaking: every seat holds compose, fetch replaces the sensor tools, and defineAssistant takes an executor function.

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/compose has one entry point,
    @ambionframework/compose/runtime, and no root export. It exports
    quickjsRuntime and processRuntime. It depends on
    @ambionframework/ambion and on quickjs-emscripten 0.32.0, pinned
    exactly.
  • Executors. @ambionframework/pi, @ambionframework/claude, and
    @ambionframework/codex depend on @ambionframework/compose, for the
    default runtime of a seat.
  • Assistant. @ambionframework/assistant drops @ambionframework/pi
    from its dependencies and depends on @ambionframework/ambion only. Its
    tests take @ambionframework/pi, @ambionframework/claude, and
    @ambionframework/codex as development dependencies.
  • Workspace. @ambionframework/workspace drops the entry points
    ./sensors and ./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

Choose a tag to compare

@andreisavu andreisavu released this 02 Oct 05:30
bd813ce

Install: npm install @ambionframework/ambion@0.5.0

Ambion 0.5.0, six things new in this release. Sensors: an agent forks a sensor template, commits it, runs it, and observes through it, and each observation is kept as evidence. Actuators: an actuator is a controller command that the agent starts with bash, and exit 0 means the device is safe. Isolation: Claude, Codex, and Pi seats have no native tools, and files and a shell come only through the workspace. Camera Chat on macOS: an agent forks a camera sensor, launches it, and looks through it with a live preview. Codex runs on app-server, with turn/start, turn/steer, and turn/interrupt. Pi runs on Pi 1.0, on a Claude or ChatGPT subscription. Also new: a clone tool, JSON as the one data rule, a session trace step, steer with a receipt, and one word for each meaning.

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:

No package joins or leaves. @ambionframework/workspace adds the ./sensors entry and the ./sensor-api.schema.json file.

0.4.0

Choose a tag to compare

@andreisavu andreisavu released this 29 Sep 18:03
98ab056

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:

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

Choose a tag to compare

@andreisavu andreisavu released this 25 Sep 20:55
2eb30a3

Install: npm install @ambionframework/ambion@0.3.0

On npmjs:

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, and cancel join bash. ps lists the
    running processes of the caller. The handle tools take a handle of the
    caller. bash takes an optional name, a label that ps and 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
    cancel give the output after a cursor that the process keeps in
    ~/.processes/<handle>/cursor, and move it. details.read holds 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's bash tool does.
  • wait takes handles. 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 deadline on
    each view, and ToolContext.deadline carries it to each tool call: when
    the room ends the activation, in milliseconds on the wall clock. bash
    and wait stop 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, and cancel stops it through
    its process id. A process that ended with the earlier run, with no exit
    file, is failed with the message "The host run ended before the
    process did."
  • Workspace.processes is the host's view. list, subscribe, and
    cancel reach the processes of the agents that used the workspace in
    this run. list returns a promise. The root entry of
    @ambionframework/workspace exports ProcessEvent, ProcessKind,
    ProcessQuery, ProcessState, ProcessStatus, and
    WorkspaceProcesses.
  • A tool bundle can remind a seat. ToolBundle.remind gives text, or
    a promise of text, for each respond activation, and
    AgentExecutor.reminders holds 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.
    renderActivation takes the resolved text as its third argument and
    adds it before the ask line. The main entry exports Reminder and
    ReminderSeat. The hosting entry exports resolveReminders and
    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 second x.

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.

  • say takes after. A say to oneself with after schedules it. The
    room stamps owner, the owner of the open exchange, on the said entry,
    and refuses after in any other say. The result names the due time and
    the seq of the say as its handle.
  • The returned entry. The room writes { to, message, owner, text, refs } when a scheduled say is due. It has no from. It wakes one
    seat, the one that to names, and steers no other. It opens an exchange
    for owner when none is open. isReturned and ReturnedMessage are
    new exports.
  • limits.schedule bounds after from minAfter to maxAfter
    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. renderPending in /hosting gives that list for
    a seat that continues its session.
  • A seat or the host dismisses a pending say. The dismiss tool takes
    the handle of a pending say of the seat, and the room writes a
    dismissed entry { from, message }. The room does not return the say.
    room.dismiss(handle) dismisses any pending say, with no from, and
    returns whether it wrote the entry. room.scheduled() lists the pending
    says. The Cloudflare room object serves them as dismiss and
    scheduledSays, because Workers keep the name scheduled.
    DismissedMessage is a new export, and /hosting exports DISMISS.
  • RoomRead.scheduled lists the says that wait to return, each a
    PendingSay with its due time. PendingSay is a new export.
  • **The workbenc...
Read more

0.2.0

Choose a tag to compare

@andreisavu andreisavu released this 24 Sep 18:29
10a4f44

Install: npm install @ambionframework/ambion@0.2.0

On npmjs:

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 sql tool runs on the shared database of backend.sql. It
    shows the last result as a table, up to maxRows rows, and export
    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 with fork,
    clones the fork into its home, and pushes with git in bash. A push
    keeps the work across a restart. See Git.
  • git in 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 seq throws. 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.

  • openWorkspace takes backend: { bash }. Import memoryBackend and
    directoryBackend from @ambionframework/just-bash. WorkspaceBackend
    is now BashBackend, and it names a layout.
  • The sql tool needs backend.sql. Use sqliteBackend(path) from
    @ambionframework/workspace/sqlite. The tool no longer runs sqlite3 in
    the shell, and it has no database or timeout parameter.
  • The memory option of pi(), claude(), and codex() is gone.
  • The trace journals are gone. Pass a logger. Hosting.traces and
    the step, trace_error, and audit_error events are gone.
  • The workspace change log is gone. The audit log records every tool
    call.
  • WorkspaceAgent is { name }, and a resource has no destroy().
  • A Codex seat with nativeTools: 'codex' runs with no Codex sandbox by
    default.
    Run it only on an isolated host, or set sandboxMode.

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...
Read more