kosa8 docs

Guides / JavaScript & TypeScript / API reference

API reference

Every export of @kosa8/sdk 0.1.0 and @kosa8/ai-sdk-sandbox 0.1.0. Signatures are taken from the packages' published .d.ts files, and the list of names on this page was checked against them. Field names in results are the daemon's JSON names, unchanged.

@kosa8/sdk: Kosa8Client

new Kosa8Client(options?: Kosa8ClientOptions)
readonly transport: Transport
readonly checkpoints: CheckpointBook

Every method returns a promise, except execFrames (an async generator) and sandbox. Every method's last argument accepts CallOptions ({ approval?, signal? }), alone or merged into its own options.

Status and the shared engine

MethodResolves withEndpoint
health(opts?)HealthGET /kosa8/v1/health
version(opts?)stringGET /kosa8/v1/health
pull(ref, opts?){ ok, image }POST /kosa8/v1/pull, the shared engine

Sandboxes

MethodResolves withEndpoint
createSandbox(options?: CreateSandboxOptions)CreateSandboxResultPOST /kosa8/v1/sandboxes
listSandboxes(opts?)Sandbox[]GET /kosa8/v1/sandboxes
getSandbox(idOrName, opts?)Sandbox | undefinedthe list, filtered
startSandbox(id, opts?)StartSandboxResultPOST …/sandboxes/{id}/up
stopSandbox(id, opts?)StopSandboxResultPOST …/sandboxes/{id}/down
deleteSandbox(id, opts?: CallOptions & { wipe?, keepCheckpoints? })DeleteSandboxResult & { checkpoints_dropped }DELETE …/sandboxes/{id} (?wipe=1), then its checkpoints' snapshots
pullIntoSandbox(id, ref, opts?){ ok, image }POST …/sandboxes/{id}/pull
sandboxImages(id, opts?)string[]GET …/sandboxes/{id}/images
sandboxContainers(id, opts?)Container[]GET …/sandboxes/{id}/containers
sandboxEgress(id, opts?)EgressStatusGET …/sandboxes/{id}/egress

Running code

MethodResolves withEndpoint
run(id, image, args?, opts?: RunOptions)ExecResultPOST …/sandboxes/{id}/run, NDJSON stream
startContainer(id, image, args?, opts?)container idPOST …/sandboxes/{id}/start
exec(id, container, args, opts?: ExecOptions)ExecResultPOST …/sandboxes/{id}/exec
execFrames(id, container, args, opts?)AsyncGenerator<Frame>POST …/sandboxes/{id}/exec
startInteractive(id, image, args?, opts?: CallOptions & { env?, tty? })container idPOST …/sandboxes/{id}/start-interactive
writeStdin(id, container, data: Uint8Array | string | AsyncIterable<Uint8Array | string>, opts?){ ok }POST …/sandboxes/{id}/containers/{cid}/stdin
attach(id, container, opts?: ExecOptions)ExecResultPOST …/sandboxes/{id}/containers/{cid}/attach

Snapshots, fork, explore

MethodResolves withEndpoint
snapshot(id, opts?: CallOptions & { id?, encrypt? })SnapshotSandboxResultPOST …/sandboxes/{id}/snapshot
listSnapshots(opts?)Snapshot[]GET /kosa8/v1/snapshots
restoreSnapshot(snapshotId, opts?: RestoreOptions)RestoreResultPOST /kosa8/v1/snapshots/{id}/restore
deleteSnapshot(snapshotId, opts?: CallOptions & { wipe?, force? })DeleteSnapshotResultDELETE /kosa8/v1/snapshots/{id}
fork(id, opts?: ForkOptions)ForkResultPOST …/sandboxes/{id}/fork
explore(id, opts: ExploreOptions)ExploreResultpull, fork, one run per branch, deletes

Checkpoints

MethodResolves withHow
checkpoint(sandbox, opts?: CheckpointOptions)CheckpointResulta snapshot <sandbox>-ckpt-<n>, recorded in the store; evicts past 10
listCheckpoints(sandbox)Checkpoint[]the store, oldest first
rewind(sandbox, opts?: RewindOptions)RewindResultdelete the sandbox, restore the checkpoint under its name, drop later ones

Handle

sandbox(id): SandboxHandle. A SandboxHandle has client, id, and these methods with the sandbox filled in: info (getSandbox), start, stop, delete, pull (pullIntoSandbox), run, startContainer, exec, containers, images, egress, snapshot, fork, explore, checkpoint, checkpoints (listCheckpoints), rewind. There is no execFrames, startInteractive, writeStdin or attach on the handle; call them on the client.

Options

Kosa8ClientOptions

Extends TransportOptions with one field.

FieldTypeDefault
socketPathstring$HOME/.kosa8/run/kosa8.sock; ignored when a host is set
hoststringKOSA8_HOST: https://…, http://…, tcp://h:p, h:p, unix:///path
tokenstringKOSA8_TOKEN, when the host came from KOSA8_HOST
insecurebooleanKOSA8_INSECURE=1; allows plain http to a non-loopback host
actorActor: 'human' | 'agent' | 'tool''tool'
agentTokenstringKOSA8_AGENT_TOKEN
headersRecord<string,string>extra headers on every request
envRecord<string, string | undefined>process.env
checkpointStoreCheckpointStorenew FileCheckpointStore(), ~/.kosa8/checkpoints.json

CallOptions

{ approval?: string; signal?: AbortSignal }. approval is sent as X-Kosa8-Approval; signal aborts the HTTP request (not the process in the sandbox).

CreateSandboxOptions (extends CallOptions)

FieldTypeSent as
namestringname
cpusnumbercpus
memMbnumbermem_mb
diskGbnumberdisk_gb
mountsMount[]mounts
egressEgressPolicyegress (a { allow } becomes allow:a,b)
egressAllowreadonly string[]egress: "allow:…"
captureCaptureSpeccapture
labelsRecord<string,string>labels
brokerBrokerSpecbroker

Other option types

TypeFields
RunOptionsCallOptions + env?: Record<string,string> | string[], onStdout?, onStderr?, onStatus? (each (chunk: Buffer) => void)
ExecOptionsCallOptions + onStdout?, onStderr?
ForkOptionsCallOptions + n? (default 1), prefix? (default <sandbox>-fork), label?
ExploreOptionsCallOptions + variants: string[] (2 or more), image? (alpine:latest), keepAll?, keep?, timeoutMs? (120000), prefix?, pull? (true)
CheckpointOptionsCallOptions + label?
RewindOptionsCallOptions + to?: a checkpoint id or label (default: the latest)
RestoreOptionsCallOptions + name?, label?, allowTampered?
Mount{ host_path: string; guest_path: string; read_only: boolean }
EgressPolicyString'any' | 'deny' | 'fakenet' | `allow:${string}`
EgressPolicyEgressPolicyString | { allow: readonly string[] }
CaptureSpec{ path: string; max_bytes?: number; max_files?: number }
BrokerSpec{ allow?: BrokerHostRule[]; routes?: BrokerRoute[] }
BrokerHostRule{ host: string; ports?: number[]; methods?: string[] }
BrokerRoute{ name; upstream; header; secret; methods?; paths?; scheme? }, all strings or string arrays

Result types

TypeFields
Healthstatus, version, commit, go, uptime_seconds, phase
Sandboxid, name, created, state (running, paused, stopped), cpus, mem_mb, disk_gb?, parent?, mounts?, egress?, capture?, ip?, labels?, broker?: BrokerInfo
BrokerInfourl, hosts?, routes?
CreateSandboxResultsandbox, boot_ms, broker?: { url, placeholders }
StartSandboxResultsandbox, boot_ms, warning?
StopSandboxResultok, sandbox?, warning?, already_stopped?
DeleteSandboxResultok, wipe?, files?
Containerid, image, status, exit?, ip?
EgressStatuspolicy, stats: { passed, denied, dropped, dns_answered, dns_refused, fakenet? }, capture?, wildcards?, fakenet?
Framestream? (stdout, stderr, status), data?: Buffer, done?, ok?, error?, exit?, id?, image?
ExecResultexitCode, stdout, stderr, stdoutBytes: Buffer, stderrBytes: Buffer
Snapshotid, sandbox, created, cpus, mem_mb, cmdline, size_bytes, state_path, and optional machine_id, mac, disk_path, data_path, disk_gb, ephemeral, mounts, egress, received, received_mounts, sealed, labels, encryption
SnapshotSandboxResultsnapshot, snapshot_ms, encrypted_by_policy?, encrypt_ms?, encryption?
RestoreResultsandbox, restore_ms, seal?
DeleteSnapshotResultok, removed, encrypted, shred?, wipe?, files?
ForkResultforks: Sandbox[], snapshot, fork_ms, count, encrypted_by_policy?, encrypt_ms?
ExploreBranchname, variant, exit, output, duration_ms, error?
ExploreResultparent, branches, winner ("" if none succeeded), removed
Checkpointid, sandbox, label, created, auto?
CheckpointResultcheckpoint, evicted: string[], snapshot: SnapshotSandboxResult
RewindResultsandbox, checkpoint, dropped: string[], restore_ms

Transport, checkpoint stores and helpers

ExportWhat it is
Transportnew Transport(opts?: TransportOptions). target (where requests go), raw(method, path, opts?: RequestOptions) (headers arrived), json<T>(method, path, opts?) (decoded; HTTP errors become typed errors), frames(method, path, opts?) (NDJSON frames, data decoded). For endpoints the client does not wrap.
TransportOptionssocketPath?, host?, token?, insecure?, actor?, agentToken?, headers?, env?
RequestOptionsquery?, body? (JSON), rawBody? (bytes, string or async iterable, streamed), approval?, signal?, headers?
Actor'human' | 'agent' | 'tool'
resolveEndpoint(opts: TransportOptions){ kind: 'unix', socketPath } | { kind: 'tcp', url, token? }, following the CLI's KOSA8_HOST rules. Throws Kosa8Error for a refused address.
defaultSocketPath()$HOME/.kosa8/run/kosa8.sock
APPROVAL_HEADER, ACTOR_HEADER, AGENT_TOKEN_HEADER'X-Kosa8-Approval', 'X-Kosa8-Actor', 'X-Kosa8-Agent-Token'
CheckpointStoreInterface: load(): Promise<Record<string, Checkpoint[]>>, update<T>(fn): Promise<T> (serialised).
FileCheckpointStorenew FileCheckpointStore(filePath?), default ~/.kosa8/checkpoints.json (mode 0600, atomic rewrite, lock file for Node writers). path.
MemoryCheckpointStoreIn memory only; nothing shared with the CLI.
CheckpointBookThe stack logic over a store, as client.checkpoints: store, nextId, record, list, latest, resolve, pop, forget.
MAX_CHECKPOINTS_PER_SANDBOX10
validateSandboxName(name)Throws Kosa8CheckpointError for a name that could escape the store (empty, ., .., a slash, a leading dot).

Errors

ExportExtendsThrown for
Kosa8ErrorErrorBase class; client-side checks. Fields status?, daemonMessage?, remediation?, method?, path?, body?.
Kosa8ConnectionErrorKosa8ErrorDaemon unreachable.
Kosa8ApiErrorKosa8ErrorAny HTTP error without a more specific class.
Kosa8BadRequestErrorKosa8ApiError400
Kosa8AuthErrorKosa8ApiError401
Kosa8PolicyErrorKosa8ApiError403
Kosa8ApprovalRequiredErrorKosa8PolicyError403 with a refusal; approval: ApprovalRefusal
Kosa8NotFoundErrorKosa8ApiError404
Kosa8ConflictErrorKosa8ApiError409
Kosa8UnsupportedErrorKosa8ApiError501
Kosa8StreamErrorKosa8ErrorError frame in a stream; stdout, stderr
Kosa8CheckpointErrorKosa8ErrorCheckpoint bookkeeping
errorFromResponse(status, body, ctx?)Builds the typed error for an HTTP error answer, as the client does.
ApprovalRefusaltyperoute, action: ApprovalAction, description, class, policy, policy_digest, requirement: ApprovalRequirement, request_id?, why, signers?, request_command
ApprovalActiontypekind, target?, command?, sandbox?, and more
ApprovalRequirementtypepolicy, rules: ApprovalRule[]
ApprovalRuletypeAn approval rule as the daemon reports it (an open record).

Details and real messages: Errors reference.

@kosa8/ai-sdk-sandbox

Functions

ExportSignature and meaning
createKosa8NetworkSandboxSession(options?: Kosa8NetworkSandboxSessionCreateOptions) => Promise<HarnessV1NetworkSandboxSession & Kosa8NetworkSandboxSession>. Boots a sandbox and its work container. Options are the settings plus sandboxId?, template?: { identity, prepare }, abortSignal?.
resumeKosa8NetworkSandboxSession(options: Kosa8NetworkSandboxSessionResumeOptions) => Promise<…>. Settings plus sandboxId (required), abortSignal?. Reattaches; never creates.
createKosa8NetworkSandboxSessionFromSandbox(options: Kosa8SandboxSettings & { sandbox; container?; abortSignal? }) => Promise<…>. Wraps a sandbox you own; stop and destroy do nothing.
createKosa8SandboxSessionFromContainer(options: { sandbox; container; client?; image?; workingDirectory?; env?; approval? }) => Experimental_SandboxSession. The restricted view only.
createKosa8Sandbox(settings?: Kosa8SandboxSettings) => HarnessV1SandboxProvider. The provider shape.
toKosa8Egress(policy: HarnessV1NetworkPolicy) => string. The AI SDK policy as kosa8 egress; throws HarnessCapabilityUnsupportedError for deniedCIDRs or an empty custom list.
restrictedView(session: Experimental_SandboxSession) => Experimental_SandboxSession. A frozen object of the eight tool-safe members.
sandboxNameForSession(sessionId: string) => string. aisdk-<slug>-<hash>.
templateSnapshotId(identity, image, egress, workdir) => string. aisdk-tpl-<hash>.
resumeSnapshotId(sandbox: string) => string. <sandbox>-aisdk-resume.

Constants

DEFAULT_IMAGE = 'alpine:latest', DEFAULT_WORKING_DIRECTORY = '/workspace', KOSA8_PROVIDER_ID = 'kosa8-sandbox'.

Classes

ClassMembers
Kosa8SandboxSession
(implements Experimental_SandboxSession)
description, run({ command, workingDirectory?, env?, abortSignal? }), spawn(…) returning { stdout, stderr, wait(), kill() }, readFile, readBinaryFile, readTextFile, writeFile, writeBinaryFile, writeTextFile.
Kosa8NetworkSandboxSession
(extends the above, implements HarnessV1NetworkSandboxSession)
id, sandboxName, containerId, defaultWorkingDirectory, ports ([]), restricted(), stop(), destroy(), setNetworkPolicy(policy), getPortEndpoint() and getPortUrl() (throw), setPorts(ports) (throws unless empty).
Kosa8SandboxProvider
(implements HarnessV1SandboxProvider)
new Kosa8SandboxProvider(settings?). specificationVersion ('harness-sandbox-v1'), providerId, createSession({ sessionId?, abortSignal?, identity?, onFirstCreate? }), resumeSession({ sessionId, abortSignal? }).

Types

TypeFields
Kosa8SandboxSettingsclient?, image?, workingDirectory?, env?, networkPolicy?, egress?, cpus?, memMb?, diskGb?, mounts?, labels?, broker?, setupCommands?, approval?
Kosa8NetworkSandboxSessionCreateOptionsHarnessV1SandboxSessionCreateOptions<Kosa8SandboxSettings>
Kosa8NetworkSandboxSessionResumeOptionsHarnessV1SandboxSessionResumeOptions<Kosa8SandboxSettings>

Usage and behaviour: Vercel AI SDK adapter.