Public API and application SDKs¶
Applications integrate with Colossus through the public application API, not the
private worker protocol and not colossus-agent internals. The initial contract is
colossus.api.v1alpha1; its implemented surface provides authenticated system
metadata and durable agent runs.
flowchart LR
Web["Tauri WebView"]
Native["Tauri Rust backend"]
Other["Rust, TypeScript, Python, or Go application"]
SDK["Colossus SDK"]
TLS["Pinned TLS 1.3 and bearer authentication"]
Worker["Colossus worker"]
Public["Public API adapter"]
Runtime["Runtime and Safety Kernel"]
Journal["Hash-chained journal<br/>configured encryption"]
Web -->|"narrow commands and ordered channels"| Native
Native --> SDK
Other --> SDK
SDK --> TLS
TLS --> Worker
Worker --> Public
Public --> Runtime
Public --> Journal
Runtime --> Journal
Reading the diagram without color: untrusted renderer code calls a narrow native interface; native or server applications use an SDK; the SDK authenticates a pinned loopback gRPC connection; the worker translates public resources into the existing runtime and durable journal.
Why gRPC is at the worker boundary¶
Protobuf and gRPC give non-Rust applications a generated, versioned contract and an
ordered streaming transport. The public server belongs at the long-running worker
boundary because runs must survive a UI reload, SDK disconnect, or client-process
restart. colossus-agent remains an internal application service and never becomes a
network authority.
The public API is distinct from the private worker IPC protocol:
| Boundary | Intended callers | Contract | Authentication |
|---|---|---|---|
| Public application API | Enrolled desktop and server applications | Protobuf colossus.api.v1alpha1 |
Per-application bearer credential over pinned TLS |
| Private worker IPC | Colossus-owned CLI and TUI components | Internal Rust worker protocol | Independent worker key |
| Embedded Rust backend | One trusted application process | colossus-sdk Rust traits and DTOs |
Caller context bound during trusted composition |
The keys and credentials for these boundaries are independent. Do not derive one from another.
Runtime placement¶
The Rust SDK uses one public API across three explicit placements:
- Daemon connects to an installed shared worker. Desktop presents these connections as External targets for advanced, persistent, and fleet use; durable work can continue after the desktop application exits.
- Sidecar supervises an application-bundled isolated worker. It is appropriate when
the application needs separate state and lifecycle ownership. Colossus Desktop calls
this placement Managed Local and makes it the default. A sidecar gRPC host must
explicitly advertise
Sidecar; the host API defaults toSharedDaemonand its bounded deployment-mode type cannot advertiseEmbedded. - Embedded calls an application-private runtime in process. It needs no gRPC transport, but it still uses the SDK interface so application code does not depend on runtime internals.
TypeScript, Python, and Go SDKs connect to a daemon or sidecar over gRPC. They are native/backend SDKs, not browser SDKs.
A browser-only web application needs its own authenticated backend-for-frontend. That backend may use the TypeScript, Python, or Go SDK, but the browser must not receive the local daemon descriptor or application bearer credential. The worker does not expose gRPC-Web or permissive cross-origin transport.
Tauri integration¶
Tauri can call Rust directly, so a Tauri application does not need a separate
JavaScript-to-Colossus transport SDK. Colossus Desktop holds a native
ConnectionManager keyed by opaque target IDs. It owns one Managed Local sidecar for
the active workspace, any saved External daemon clients, per-target watch limits, and
the selected Work target. The renderer receives sanitized target health and invokes
only product-level Tauri commands:
create_runget_runlist_runswatch_runcancel_runrespond_interaction
Desktop’s composer exposes public Execute, Plan, and managed-local Research run modes. Research carries an explicit bounded depth and a unique non-empty set of repository, web, or MCP evidence lanes. It reuses the authenticated durable run, interaction, watch, queue, and cancellation contracts while delegating collection and cited synthesis to the runtime research service. The initiating question and released report remain ordinary canonical conversation messages; tool traffic and unrestricted paths do not cross the renderer boundary.
Public Plan Mode means “create one new durable Draft”; the runtime constrains its tools and returns the canonical Plan identity, revision, and status in terminal result or cancellation evidence. The native bridge preserves those typed fields rather than attempting to reconstruct a Plan from assistant text.
For an actionable Draft, the main WebView can submit a typed plan_action on another
public run. It supplies the caller-owned source run ID and exact visible revision,
never a Plan ID. The server resolves that source run under the authenticated
application, binds the action to its session and canonical Plan, and rejects stale or
non-Draft revisions. Revision is structurally Plan Mode; Direct and bounded Goal
execution are structurally Execute mode. They use the ordinary durable run,
interaction, policy, permit, journal, audit, cancellation, and watch paths.
Managed Local can also hand the identity to the embedded TUI for the advanced
interactive workflow. The main WebView supplies only bounded session and Plan
identifiers to show_terminal_window. Native code accepts them only for
colossus_tui; the dedicated terminal document opens the authenticated TUI and submits
the fixed read-only /session resume ID and /plan use ID selections. No PTY session
ID or generic terminal write command is granted to the main WebView.
The zero-input desktop_release_channel metadata command returns only the native
compile-time development, stable, developer_preview, or validation_only enum. It
lets the renderer label a Developer Preview even if runtime initialization fails; it
accepts no renderer data and exposes no signing identity, path, credential, or runtime
authority.
Every run operation carries an opaque target ID. The target manager, not the renderer, resolves it to an authenticated SDK client. Fleet may display health for all targets, but Work sends an operation to exactly one selected target.
Renderer target IDs are advisory, not routing authority. Native code accepts a run operation only when its ID matches the current Work selection, binds returned run IDs to that target, and requires the binding again for watches and mutations. Selection epochs terminate an old watch before it can deliver another target's update. Target switch, reconnect, removal, and Managed Local restart take the native selection writer, wait for in-flight mutations, and never replay a request. External import, selection, reconnect, and removal also require an operating-system dialog naming the native-sourced label, instance ID, and full certificate pin.
Use a Tauri channel for the ordered watch_run feed. The WebView receives released
run DTOs only. It must never receive the bearer credential, certificate file contents,
daemon descriptor path, provider key, private runtime path, raw gRPC channel, caller
scopes, tool arguments, hidden reasoning, or quarantined output.
The Rust client can use either placement without changing that WebView contract:
Embedded calls the trusted runtime in process and uses no gRPC, while Daemon or
Sidecar keeps durable work in another process and uses authenticated gRPC behind the
Rust command layer. In both cases, depend on the stable Rust SDK boundary rather than
calling runtime internals from Tauri commands.
Keep Tauri capabilities deny-by-default. Grant each window only the commands it needs, and enforce resource scope again inside each command. Do not add generic “run process,” “read path,” “call URL,” or “invoke SDK method” commands; those would turn the WebView into a capability-confused deputy.
Managed Local bootstrap and lifecycle¶
Managed hosts carry an explicit ManagedExecutionBoundary independently from access
profile and approval mode:
FullAccessis the default host posture and maps to acknowledgeddanger_full_access;WorkspaceIsolatedselects the supported platform-nativeworkspace-developmentboundary; andOfflineIsolatedselects platform isolation without derived workspace resources, hides the generic model-visiblenetwork.http,web.fetch, anddocs.fetchtools, and retains the exact provider service and authentication/refresh destinations needed by the configured provider.
Rust builders and getters expose this choice, and the private sidecar protocol carries it as a versioned bootstrap field. Hosts must not infer it from the access profile. Full access permits ambient structured filesystem and HTTP(S) effects as well as child process resources, but it does not add undeclared tools, routes, credentials, MCP servers, integration operations, or extension trust.
OfflineIsolated is therefore not an air-gap declaration: selected provider and
authentication transports can still use their retained destinations. Preserving those
destinations does not reactivate general model fetch tools. Search, MCP, and integration
adapters remain independently governed by their own configuration and host grants.
The signed desktop bundle contains two independent executables:
colossus-sidecarowns runtime composition, private worker IPC, the public gRPC host, sandbox-helper dispatch, drain, checkpoint, and guardian-triggered shutdown;colossusis the separately verified interface binary used only for the fixed TUI launcher.
The native application verifies the sealed bundle manifest and macOS code identity immediately before a no-shell spawn. It sends bounded workspace configuration, exact application grants, one-use API material, and provider credentials over inherited anonymous pipes. Bootstrap secrets never enter argv, environment variables, files, renderer events, logs, or debug output. The sidecar binds a loopback TLS endpoint, creates an independent API authentication root, and returns the exact endpoint, certificate pin, instance identity, API version, and bearer through that private channel. Native code validates every field before activating the credential and marking the target Ready.
Executable binding is completed before either bootstrap secrets or execution are
released. On macOS, the SDK hashes and parses one private snapshot, starts the selected
bundle executable with the kernel's start-suspended flag, and requires its exact live
CodeDirectory identity to match before SIGCONT. On Linux, it executes the verified
bytes from a sealed, non-writable memfd. Platforms without an equivalent mechanism
fail Managed Local startup closed.
The selected macOS workspace is also persistent object authority rather than a saved path. Desktop hashes the device, inode, and birth timestamp obtained from a securely opened directory descriptor and includes that versioned identity in its private state partition. The SDK parent and sidecar child independently reproduce it before launch or runtime composition; preview-era path-only or inode-only settings require explicit folder reselection. Unix skill discovery and resource reads then stay relative to the retained workspace or independently retained app-private root descriptors.
Desktop uses two same-application credentials delivered and activated as one bootstrap
set. The primary credential has exactly runs:execute, runs:read, runs:control, and
prompts:respond, plus the selected role and tool ceilings. A separate native approval
broker has only approvals:respond, no tools, and roles bounded by the primary grant.
The SDK routes only approval answers through that second pinned-TLS client; every other
operation uses the primary client. Both credentials are revoked together during
shutdown or a failed bootstrap, and neither transport replays an operation after a
restart.
Provider YAML for Managed Local contains a validated host:<opaque-id> reference. The
key remains in the desktop keychain and is copied into a zeroizing, in-memory sidecar
resolver during bootstrap. The provider adapter can resolve it only after policy has
authorized the provider action. CLI and daemon configurations remain environment-backed
and do not interpret host: identifiers as values.
Same-provider model and profile edits can reuse the native keychain binding without opening another secret prompt. First enrollment, provider-kind changes, and explicit rotation never take that reuse branch. A missing reused key fails before any settings or runtime mutation and requires an explicit replacement retry. First-time non-Minimal access and every access-rank elevation, including Development-to-Allow-all, require a native confirmation describing the wider tool ceiling. Execution-boundary elevation is confirmed separately, including a move from an isolated boundary to Full access; renderer input alone cannot widen either axis.
WebView reload does not own sidecar lifetime. Provider and workspace changes request a graceful restart. An unexpected exit receives at most three backoff attempts; create and effect requests are never automatically replayed. Application exit uses the worker's existing run drain, transport force-close, checkpoint, and native process supervision. It terminates the signed sidecar, its managed process group, and still-discoverable descendants. A writer-lease conflict is reported without killing or taking over the existing owner.
Sealed macOS bundle manifest¶
macOS code signing changes executable bytes, so a digest captured by the Rust build script cannot authenticate the final signed sidecar. Release packaging therefore uses a two-phase contract:
- A credential-free runner creates and archives the unsigned
.appwith bothexternalBinentries. - A fresh signing runner verifies and extracts those exact bytes, then imports the Developer ID and notarization authority.
- Packaging signs the nested sidecar and CLI individually.
- It hashes those final bytes into
Contents/Resources/colossus-bundle-manifest.json. - It patches the exact manifest SHA-256 into the one fixed binding record in the
already-built desktop executable, then signs that executable and the outer app
without
--deep. - It verifies every nested signature, the outer seal, the embedded manifest binding, and both nested-binary hashes before optional notarization and stapling.
The signed running desktop executable is the manifest trust anchor. Release native code
ignores the compile-time unsealed_release marker, opens the resource once with
NOFOLLOW, hashes and decodes that same bounded byte buffer, and rejects an unset or
mismatched embedded digest. This prevents a same-user path swap or rollback to an older
same-team bundle after outer verification. It also fails closed unless the bound
manifest has the expected schema, target triple, release channel, fixed filenames, and
exact lowercase SHA-256s. The compile-time channel and sealed-manifest channel must match.
The stable channel requires the outer app and desktop executable identifier
com.obscuritylabs.colossus.desktop, the fixed .sidecar and .cli nested identifiers,
and the exact 10-character Apple Team ID compiled into the release. It uses Developer ID
signing and notarization. The explicitly separate developer_preview channel instead
requires the ADHOC sentinel, an ad-hoc signature with no Team Identifier, the same fixed
code identifiers, strict signature verification, and the same executable/manifest hash
binding. It is runnable for time-bounded testing, but it does not establish Apple
publisher identity and is not notarized. Native code exposes only this bounded channel
name to the renderer so Desktop can keep a persistent Developer Preview warning on
screen; no signing identity, filesystem path, or credential enters renderer state.
The validation_only channel also uses the ADHOC sentinel but remains non-runnable and
is accepted only for CI structure checks; Managed Local rejects it. Debug builds use the
development channel and compile-time manifest with canonical development paths. These
channels are mutually exclusive, so enabling the preview does not relax stable-channel
identity or notarization requirements.
Local terminal boundary¶
Terminal commands are available only to a dedicated local Tauri window capability.
The main window may request that window be shown but cannot open or control a PTY. The
terminal renderer receives random window-bound session IDs and can request only the
closed colossus_tui and shell kinds for the native-selected workspace. It cannot
choose a program, environment, working directory, or arguments.
Desktop does not inject managed credentials, persist transcripts, or send terminal bytes to models, remote nodes, telemetry, or run context. Output, input, and session count are bounded. First-time terminal enablement requires a fixed native confirmation that distinguishes local-user shell authority from the policy-controlled TUI.
On macOS, the shell kind revalidates the persisted Managed Local workspace and launches
exactly the validated system /bin/zsh -l with a native-constructed cleared
environment. The shell receives no worker authentication. It remains available while
the managed runtime is offline, but its commands and effects are outside Colossus
policy, remote journal, and audit. A compromised terminal renderer can therefore type
commands as the logged-in user while this feature is enabled; the main renderer cannot
write to a PTY.
The bundled CLI instead starts suspended in a new session so native code can verify its live code identity against the sealed manifest before resuming it. The CLI independently opens and changes directory through the selected workspace, reports the same persistent object identity to the parent, and receives worker authentication only after that attestation succeeds. Authentication crosses bounded one-use inherited anonymous pipes, never the renderer-visible PTY. Closing the window or app freezes and kills that verified CLI session.
The PTY transports only terminal input and output. Native code passes worker authentication through separate bounded one-use inherited pipes at fixed child file descriptors; those descriptors are never renderer-selectable and never share the PTY stream.
A plan handoff does not widen this boundary. Native code validates the opaque public
session and plan identifiers, binds them to a colossus_tui launch request, and releases
them only to the dedicated terminal document. That document may submit the two fixed
selection commands after the verified TUI opens. The main document still has no
open_terminal or write_terminal capability, and the selection performs no lifecycle
transition by itself.
Desktop does not claim cleanup of arbitrary shell descendants after setsid,
double-fork, or reparenting because macOS exposes no supported race-free job primitive
for that boundary. It retains and kills the original process group on a best-effort
basis. Clipboard escape writes, automatic URL opening, remote navigation, and general
renderer-selected spawning stay disabled. The release terminal surface is served from
a label-bound local protocol with its own CSP so xterm may create
its required runtime style sheets; the main Work WebView retains the stricter
style-src 'self' policy. The TUI path is different: fixed arguments require the
existing worker, and its actions retain normal Colossus policy and audit behavior.
After shutdown or a failed launch, SDK cleanup waits for confirmed process-tree death, then removes only the fixed public endpoint descriptor and certificate through a held no-follow directory descriptor. Every leaf is revalidated for identity, ownership, mode, type, and single-link status immediately before unlink; unrelated or unsafe state is left intact.
Connection and enrollment¶
A daemon connection deliberately has four separate inputs:
- an owner-only endpoint descriptor with an exact literal loopback HTTPS endpoint, instance identity, PID, API version, and lowercase leaf-certificate SHA-256;
- an owner-only PEM containing exactly one
BasicConstraints CA=falsepublic leaf certificate whose DER digest matches the descriptor; - the expected instance identity and certificate SHA-256 provisioned independently during trusted enrollment; and
- a one-application bearer credential loaded directly from a platform credential store into native memory.
The descriptor is mutable readiness metadata, not a trust anchor or authorization. It
contains no token or private key. Every native convenience connector requires the
independent pin and checks descriptor pin equals expected pin and presented leaf equals
expected pin before loading the bearer. SDKs reject plaintext, localhost, public
interfaces, URL credentials, unknown descriptor fields, certificate-pin mismatch,
malformed credentials, and oversized transport messages.
The Rust gRPC connector also requires the independently provisioned instance ID and
API major. Its TLS verifier hashes the leaf presented in the live handshake, rejects
intermediates, and compares that digest to the expected pin. Before returning a usable
backend it makes only the authenticated GetServerInfo compatibility call and verifies
the exact instance ID, API package, and daemon-versus-sidecar deployment mode; no
credential-bearing application RPC can run first.
Trusted enrollment code creates an exact application grant:
- application ID and placement;
runs:execute,runs:read,runs:control,prompts:respond,approvals:respond,artifacts:read, and/orartifacts:write;- allowed logical roles; and
- allowed tools.
Empty role and tool grants deny all. Credential issuance first persists a pending keyed verifier and the grant in the canonical journal. Managed Local uses platform-backed encryption; other hosts use their configured storage protection. Pending credentials cannot authenticate. Trusted bootstrap transfers the one-time bearer directly to an operating-system credential store, then records a separate durable activation. The bearer must not enter a file, descriptor, URL, command line, environment variable, crash report, or log. Rotation activates a new credential for the same application ID before revoking the old credential; revocation permanently invalidates either state. If old-credential revocation cannot be confirmed, the active replacement remains in the destination and administration reports both non-secret IDs for reconciliation.
A generic OS-keyring service/account pair is a lookup namespace, not portable
process identity or an application sandbox. On some platforms another process running
as the same OS user can read an unlocked generic store; on macOS an item created by the
CLI may require an access prompt or may not be readable by a separately signed target
without an appropriate access policy. Applications that must defend against hostile
same-user processes must supply a platform-specific, application-bound credential
provider and keep the independent pin in signed configuration or app-owned protected
storage. The built-in generic provider protects against files, logs, argv, environment
leaks, other OS users, and accidental credential reuse; it does not claim same-UID
process isolation.
Public runs may use agent.delegate only when that exact tool appears in the
application grant. The accepted run and every delegated job durably preserve the
caller's exact tool ceiling. Child runs receive that ceiling but remove
agent.delegate from model discovery, which keeps nested delegation fail closed and
prevents a child from acquiring the worker's broader internal authority.
Authenticated server discovery reports optional capabilities such as artifacts,
attachments, delegation, and typed Plan continuation. Clients must hide or disable
optional UI until the server advertises it. In particular, the SDK refuses to encode a
plan_action unless the target advertises plans.continue; this prevents an older
protobuf server from ignoring the unknown field and treating it as an ordinary run.
Artifact uploads are caller-owned, size- and digest-bound, and chunked; downloads
revalidate the released length and digest. Run attachments contain only opaque
artifact IDs, never client or server filesystem paths.
attachments.image_input is advertised separately from the existing text-attachment
capability. SDK ContentPart::Artifact calls remain unchanged and caller ordering is
preserved, but servers reject image artifacts unless the selected model profile has
explicitly enabled image inputs.
Public v1alpha1 runs also cannot activate installed skills. selected_skills must be
empty, and prompt text such as @skill-name does not trigger skill discovery or
composition. Skill activation remains disabled until the durable application grant has
an explicit allowed-skill ceiling and recovery can prove that the same ceiling is
preserved. This prevents an application from discovering private installed skill
metadata or expanding its instructions and tool context indirectly.
CreateRunRequest.end_user_id is optional caller-asserted correlation data. It uses
the bounded public token grammar, may contain PII, and is neither an authenticated
principal nor an authorization input. It is included in the idempotency fingerprint so
one key cannot replay a request attributed to another asserted end user. An accepted
W3C traceparent/tracestate is deliberately excluded from that fingerprint, allowing
a retry from a new calling span to remain a valid replay. See
Live observability.
The installed Unix worker provides the first-party bootstrap path: perform
worker --public-api-dir ... --enroll-application ... while the worker is stopped,
then start worker --public-api-dir .... Enrollment requires exact scope and role
ceilings and writes the one-time bearer directly to the application's named OS-keyring
entry. See Storage and worker
for the complete command and rotation procedure.
Enrollment output includes the stable non-secret instance ID and certificate SHA-256.
Provision both into trusted application configuration separately from the discovery
directory. Never compute the expected pin by rereading endpoint.json or
certificate.pem; doing so would make a same-directory replacement self-validating.
The initial server also bounds each TLS handshake to five seconds, accepts at most 128
simultaneous connections, permits at most 80 concurrent request setups globally and
per connection, permits 128 HTTP/2 streams per connection, expires connections after
15 minutes, limits each request decode and handler setup to 30 seconds, limits HTTP/2
headers to 16 KiB, limits decoded request messages to 2 MiB, and limits encoded
responses to 4 MiB. Only eight authenticated protobuf decodes may run concurrently,
with at most two for one application; the permits are acquired after authentication
but before message decoding. A streaming protobuf wire guard rejects the 129th
top-level CreateRun.input field, the first forbidden selected_skills field, and the
tenth packed or unpacked ListRuns.statuses value before Prost can allocate their
decoded collections; post-decode validation remains as defense in depth. The transport
independently caps active watches at 64, leaving 16 request slots that watches cannot
consume for cancellation, interaction responses, and system RPCs. These effective
transport limits are advertised through
GetServerInfo. The Rust client verifier also rejects TLS 1.2 signatures, preserving
the TLS 1.3-only contract even if a future server configuration regresses. The
deterministic local leaf uses P-256 so the same pinned identity works with the Rust,
Python gRPC C-core, Node.js, and Go SDK transports. Run input is limited to 128 parts
and 1 MiB, and max_turns cannot exceed 100. Zero selects the configured positive
default; it does not request an unlimited run.
Preview applications enrolled against the earlier Ed25519-derived leaf must perform one authenticated re-enrollment after upgrading and store the newly reported certificate fingerprint. The P-256 leaf remains byte-for-byte stable for the same stored seed after that one-time pin rotation.
Default application-resource limits are 32 active runs globally and eight per
application, with fresh-create token buckets of four runs/second (burst 16) globally
and one run/second (burst four) per application. Watches are limited to 64 globally
and eight per application. Owner-index listings allow four concurrent requests
globally and one per application, with separate global and per-application rate
limits. The server advertises the effective values through GetServerInfo.
ListRuns reads only the authenticated application's durable run index, newest first;
it never scans the shared global journal. CreateRun appends the idempotency claim,
run creation, and owner-index entry in one transaction, retrying an owner-index head
conflict without exposing a partially indexed run. A page contains at most three runs.
One request reads owner-index events in batches of eight, advances through at most 64
index entries, reconstructs at most 16,396 run events, and accepts at most 4,099
events from any one valid run stream. Sparse filters can therefore return a short or
empty page with a continuation token; clients continue while that token is present.
Ordinary nonterminal appends stop when the durable sequence reaches 4,096; three
reserved lifecycle events allow interaction closure, the cancelling transition, and
one terminal event without making that valid stream unlistable.
Each run-update event carries a versioned projection of the public state immediately before that update and the cumulative released-byte count. Protected storage encrypts the payload; keyless storage keeps canonical plaintext with payload and record hashes. A mutation authenticates the creation event and two-event tail, derives the current state and byte count from the predecessor, validates the tail projection against them, then uses optimistic stream concurrency for its append; its work is independent of run history length. While an interaction is pending, only its resolution or a conservative terminal settlement may append, preventing repeated projection of its bounded prompt. Full reads still replay every transition and cross-check every embedded projection and byte count, so the fast mutation path does not replace journal-chain verification with an in-memory cache.
The opaque continuation token binds the application and canonical filters and carries the owner-index snapshot head plus an exclusive resume version. The server validates both referenced index versions before continuing. Runs created after the first page do not shift that traversal, and per-request work stays bounded independently of unrelated journal growth.
Durable run contract¶
CreateRun durably claims an idempotency key before execution. A caller can then fetch
the run or call WatchRun with an exclusive after_sequence cursor. Watch delivery is
at least once; SDKs deduplicate exact (run_id, sequence) replays and fail on gaps.
Dropping a watch never cancels its run. SDKs reconnect only after an explicitly
retryable transport failure. All SDK watch paths reconcile a clean stream close with
GetRun and complete only when it proves the same run is terminal at the exact
verified cursor. Daemon and sidecar streams can resume a non-terminal watch under
their bounded read-only retry policy. Embedded and custom checked streams instead
fail closed when reconciliation is unavailable or does not exactly match; a clean
close is never accepted as silent completion.
When CreateRun omits session_id, the durable run receives a server-owned session
identity. The canonical session is materialized during agent initialization if
execution proceeds; cancellation before start can leave that identity associated only
with the run. The initial hosted surface does not expose SessionService.
Prompts and approvals are durable, one-use interactions bound to the owning application. Prompt choices echo the exact displayed choice. Approval answers echo a fresh randomized one-use binding; the private policy request hash never crosses the native boundary. Approval DTOs expose only a fixed public action taxonomy plus a bounded display category or an HTTP(S) origin; they never disclose raw internal action or tool names, absolute paths, executable names, URL credentials, paths, queries, fragments, raw policy reasons, effect arguments, or deterministic commitments to those private values. The server revalidates responses against the private request and applies current scope checks to cancellation and response operations.
Loopback limits bound resource consumption but cannot guarantee availability against a hostile local process, including one running as another OS user: loopback TCP does not carry filesystem-style ownership. Such a process can open unauthenticated sockets and consume some finite connection or handshake slots. Deployments with that threat model need an ACL-bound local transport or operating-system process isolation in addition to application-bound credentials.
After an unclean worker stop:
- a durable queued run can resume with its accepted authority snapshot;
- a run waiting for user input becomes
interrupted; - a run that may have started an external effect becomes
outcome_unknown; and - SDKs never automatically retry an operation whose outcome is unknown.
Recovery uses the grant captured when the run was accepted. The request that notices an orphan cannot lend broader current authority to it.
Revoking a bearer prevents future requests made with that credential; it does not
rewrite or silently weaken already accepted durable work. To terminate accepted work,
use another credential for the same application with runs:control to cancel the run.
This distinction keeps recovery deterministic and avoids treating a credential rotation
as an ambiguous partial cancellation.
Source and release workflow¶
- Protobuf source:
api/colossus/api/v1alpha1 - Rust SDK:
crates/colossus-sdk - TypeScript, Python, and Go packages:
sdk/ - Generated binding command:
./sdk/scripts/generate - Generated binding gate:
./sdk/scripts/check-generated
Generated sources are replaced from the local Protobuf tree. Do not upload a private schema to a hosted generator. A release runs Protobuf lint/build, generated-tree checks, each language's tests and type checks, Rust workspace checks, and a live TLS/authentication round trip.
The alpha package may make breaking corrections before a stable v1 package exists.
Once v1 is published, reserve removed field numbers and names, add fields and RPCs
compatibly, and support adjacent API versions during migrations.