Skip to content
API reference

workers

Import
import * as api from "@fungi.computer/oyster/workers";
Kind Export Description
class OysterMcpOwner One tenant’s live SDK transports; cold owners refuse old IDs without execution replay. The persisted origin is a lifetime pin. Changing the configured origin requires a fresh MCP namespace; an existing owner never retargets its retained pin.
class OysterRegistry The installation registry: one SQLite-backed Durable Object per Oyster.
class OysterBinding The plain Oyster Worker’s guest binding entrypoint.
class OysterInstance One App Instance: Oyster’s lifecycle supervisor in this Durable Object’s SQLite and the App backend in its app facet.
class OysterMcp The non-git standalone root’s MCP owner.
class OysterInstallationExecutor Ordinary Worker execution; REGISTRY receives references and receipts only.
type alias OysterMcpOwnerEnv Worker Loader used by the existing Mycelium sandbox.
type alias OysterMcpTenantPin Serialized trusted tenant pin supplied by the selected host.
type alias OysterBindingResult Native values returned by the standalone Git, event and JSON binding owners.
type alias OysterInvocationHost Verified backend custody is captured in the frame, never in a current-context field.
type alias OysterStorageAgentDirectory Existing fleet directory owner records, resolved by the host rather than App input.
type alias OysterWorkerEnv Bindings a standalone Oyster Worker declares in its Wrangler config.
type alias OysterBindingContext What a binding row may read from the Instance that owns the frame.
type alias OysterBindingRow One guest binding: the frame codecs both sides of the RPC share, and the host owner that serves a decoded, granted packet under its captured frame.
type alias OysterBindingTable The bindings an Instance serves, keyed by the closed App binding vocabulary; a missing row is binding_unavailable.
type alias OysterWorkspace One host-selected workspace shared by App context and capability adapters.
constant oysterBindings The plain Oyster host’s bindings: App storage, the read-only catalog and replay admission.
function installationWorkerEntrypoint() A loopback export with ordinary Worker I/O, not another resource or HTTP API.
function createOysterMcpOwner() Bind the owner to the deployment’s existing host factory and options.
function r2FileSource() Files in an R2 bucket under prefix (one workspace per prefix).
function oysterBindingEntrypoint() The one guest binding entrypoint over table. Every binding in a frame is this export with its own props; each packet returns to its originating Instance, which serves it from the same table.
function serveOysterBootCapability() Resolve a scoped boot URL through the registry-backed HTTPS asset route.
function oysterWorkerHost() Create an Oyster host backed by this Worker environment’s registry, artifacts, Instances, and boot-check service.
function createOysterWorker() The standalone Worker’s fetch handler; frontend hosts are cached per env. MCP transports belong to the tenant Durable Object, independent of that cache.

One tenant’s live SDK transports; cold owners refuse old IDs without execution replay. The persisted origin is a lifetime pin. Changing the configured origin requires a fresh MCP namespace; an existing owner never retargets its retained pin.

  • DurableObject<Env>
Type Parameter Default type
Env extends OysterMcpOwnerEnv OysterMcpOwnerEnv
Signature
new OysterMcpOwner<Env>(
ctx,
env,
createHost
): OysterMcpOwner<Env>;
Parameter Type
ctx DurableObjectState
env Env
createHost (env, scope) => | Readonly<{ approvals?: Readonly<{ submit: Promise< | { kind: "pending_approval"; recordId: string; description: { title: …; inputBytes: …; inputSha256: …; }; } | ApprovalApplyResult>; }>; workflows?: (principal) => Promise< | Readonly<{ status: Promise<…>; cancel: Promise<…>; }> | null>; computerControl?: (principal) => | Readonly<{ list: Promise<{ computers: …; nextOffset: …; }>; state: Promise<… | …>; start: Promise<… | …>; create: Promise<… | …>; }> | null; auth: OysterAuth; backgroundOriginKey?: () => Promise<CryptoKey>; artifacts: ArtifactStore; uiCache?: Readonly<{ match: (digest) => Promise<ReadableStream<…> | null>; put: (digest, bytes) => Promise<"stored" | "unstored">; }>; installations: InstallationStore; instances: InstanceDirectory; bootUi: (release) => Promise< | { kind: "passed"; } | { kind: "failed"; code: "ui_mount_failed"; diagnostics?: { failedPredicate: … | … | … | … | …; errorName?: … | … | … | … | … | … | … | …; finalUrlPath: string; consoleErrors: …[]; pageErrors: …[]; failedRequests: …[]; droppedCount: number; }; } | { kind: "not_checked"; code: | "boot_runner_unavailable" | "boot_browser_binding_missing" | "boot_clone_unavailable" | "boot_timeout" | "boot_cleanup_failed" | "ui_check_not_run_on_host"; }>; computerId?: string; computer?: (principal) => | Readonly<{ getCapabilities: (signal) => Promise<…>; call: (capabilityId, input, context) => Promise<…>; }> | Promise< | Readonly<{ getCapabilities: …; call: …; }> | null> | null; appToolPolicy?: (actor) => | { level: "read" | "write"; revision: string; grantedBy: string; } | Promise< | { level: … | …; revision: string; grantedBy: string; } | null> | null; keys?: Readonly<{ live: Promise< | Readonly<{ keyId: …; owner: …; grantVersion: …; grants: …; }> | null>; }>; guestLimits?: Partial<Readonly<{ cpuMs: number; subRequests: number; }>>; mcp?: Readonly<{ handleRequest: (request) => Promise<Response>; close?: () => Promise<void>; }>; git?: Readonly<{ writerOf: Extract<GitWriter, { kind: "actor"; }>; workflowPass?: Promise< | Readonly<{ kind: …; actor: …; role?: …; workflow?: …; }> | null>; buildPass?: Promise< | Readonly<{ kind: …; actor: …; role?: …; workflow?: …; }> | null>; git: Promise<Readonly<{ push: Promise<…>; read: Promise<…>; binding: GitBinding; }>>; }>; ownerRoutes?: Hono<OysterEnv, BlankSchema, "/">; capabilities?: readonly Readonly<object & object>[]; workbench?: Readonly<{ directory: Promise<Readonly<{ apps: readonly …[]; roles: OysterRootRoles; computer?: … | …; }>>; storage: Pick<AppStorageWire, "read" | "write" | "reset"> & Readonly<{ events: Promise<…>; }>; }>; homeInstallationId?: string; pageScript?: string; pageAssets?: () => Promise<{ pageScript: string; publicHomeScript: string; fontStyles: string; loginFontStyles: string; shellStyles: string; grantConsentScript: string; }>; title?: string; }> | Promise<Readonly<{ approvals?: Readonly<{ submit: Promise< | { kind: …; recordId: …; description: …; } | ApprovalApplyResult>; }>; workflows?: (principal) => Promise< | Readonly<{ status: …; cancel: …; }> | null>; computerControl?: (principal) => | Readonly<{ list: Promise<…>; state: Promise<…>; start: Promise<…>; create: Promise<…>; }> | null; auth: OysterAuth; backgroundOriginKey?: () => Promise<CryptoKey>; artifacts: ArtifactStore; uiCache?: Readonly<{ match: (digest) => Promise<… | …>; put: (digest, bytes) => Promise<… | …>; }>; installations: InstallationStore; instances: InstanceDirectory; bootUi: (release) => Promise< | { kind: "passed"; } | { kind: "failed"; code: "ui_mount_failed"; diagnostics?: { failedPredicate: …; errorName?: …; finalUrlPath: …; consoleErrors: …; pageErrors: …; failedRequests: …; droppedCount: …; }; } | { kind: "not_checked"; code: | "boot_runner_unavailable" | "boot_browser_binding_missing" | "boot_clone_unavailable" | "boot_timeout" | "boot_cleanup_failed" | "ui_check_not_run_on_host"; }>; computerId?: string; computer?: (principal) => | Readonly<{ getCapabilities: (signal) => …; call: (capabilityId, input, context) => …; }> | Promise<Readonly<…> | null> | null; appToolPolicy?: (actor) => | { level: "read" | "write"; revision: string; grantedBy: string; } | Promise< | { level: …; revision: …; grantedBy: …; } | null> | null; keys?: Readonly<{ live: Promise<Readonly<…> | null>; }>; guestLimits?: Partial<Readonly<{ cpuMs: number; subRequests: number; }>>; mcp?: Readonly<{ handleRequest: (request) => Promise<Response>; close?: () => Promise<…>; }>; git?: Readonly<{ writerOf: Extract<GitWriter, { kind: "actor"; }>; workflowPass?: Promise<Readonly<…> | null>; buildPass?: Promise<Readonly<…> | null>; git: Promise<Readonly<{ push: …; read: …; binding: …; }>>; }>; ownerRoutes?: Hono<OysterEnv, BlankSchema, "/">; capabilities?: readonly Readonly<object & object>[]; workbench?: Readonly<{ directory: Promise<Readonly<{ apps: …; roles: …; computer?: …; }>>; storage: Pick<AppStorageWire, … | … | …> & Readonly<{ events: …; }>; }>; homeInstallationId?: string; pageScript?: string; pageAssets?: () => Promise<{ pageScript: string; publicHomeScript: string; fontStyles: string; loginFontStyles: string; shellStyles: string; grantConsentScript: string; }>; title?: string; }>>

OysterMcpOwner<Env>

Signature
DurableObject<Env>.constructor
Signature
serve(request, tenant): Promise<Response>;

Trusted host RPC: the namespace and pin are never selected by guest headers.

Parameter Type
request Request
tenant OysterMcpTenantPin

Promise<Response>


The installation registry: one SQLite-backed Durable Object per Oyster.

  • DurableObject<Env>
Type Parameter Default type
Env extends OysterWorkerEnv OysterWorkerEnv
Signature
new OysterRegistry<Env>(ctx, env): OysterRegistry<Env>;
Parameter Type
ctx DurableObjectState
env Env

OysterRegistry<Env>

Signature
DurableObject<Env>.constructor
Signature
approvalSubmit(pin, call): Promise<
| {
kind: "pending_approval";
recordId: string;
description: {
title: string;
inputBytes: number;
inputSha256: string;
};
}
| ApprovalApplyResult>;

Trusted host RPC; an operation input cannot select actor, namespace or tenant.

Parameter Type
pin Readonly<{ tenantId: string; origin: string; }>
call { actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; installationId: string; sessionId: string | null; operation: string; access: "write" | "external"; authorityFence: string; idempotencyKey: string; input: JSONType; }
call.actor | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }
call.installationId string
call.sessionId string | null
call.operation string
call.access "write" | "external"
call.authorityFence string
call.idempotencyKey string
call.input JSONType

Promise< | { kind: "pending_approval"; recordId: string; description: { title: string; inputBytes: number; inputSha256: string; }; } | ApprovalApplyResult>

Signature
approvalList(
pin,
actor,
input
): Promise<Readonly<{
items: readonly object[];
nextCursor: string | null;
}>>;

Read a bounded page for the current member of the pinned native home.

Parameter Type
pin Readonly<{ tenantId: string; origin: string; }>
actor | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }
input { state?: | "pending" | "expired" | "denied" | "applied" | "requested" | "approved" | "claimed" | "outcome_unknown"; cursor?: string; limit?: number; }
input.state? | "pending" | "expired" | "denied" | "applied" | "requested" | "approved" | "claimed" | "outcome_unknown"
input.cursor? string
input.limit? number

Promise<Readonly<{ items: readonly object[]; nextCursor: string | null; }>>

Signature
approvalGet(
pin,
actor,
input
): Promise<
| {
record: {
recordId: string;
requester: {
principalId: string;
agentId: string | null;
sessionId: string | null;
displayName: string;
};
module: string;
operation: string;
access: "write" | "external";
description: {
title: string;
inputBytes: number;
inputSha256: string;
};
evidence?: readonly object[];
authorityFence: string;
reversibility: "reversible" | "irreversible-external";
state: | "pending"
| "expired"
| "denied"
| "applied"
| "requested"
| "approved"
| "claimed"
| "outcome_unknown";
by: | {
kind: "human";
memberId: string;
}
| {
kind: "policy";
}
| null;
reason: | "pending"
| "expired"
| "not-found"
| "not-eligible"
| "already-answered"
| "stale-revision"
| "declined"
| "fenced"
| "not-granted"
| "read-only"
| "in-flight"
| "outcome-unknown"
| "identity-conflict"
| null;
denialNote?: string;
requestedAt: number;
expiresAt: number;
updatedAt: number;
revision: number;
};
canAnswer: boolean;
canSetAutoApprove: boolean;
}
| null>;

Read one member-scoped view; the native home resolves membership again.

Parameter Type
pin Readonly<{ tenantId: string; origin: string; }>
actor | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }
input Readonly<{ recordId: string; }>

Promise< | { record: { recordId: string; requester: { principalId: string; agentId: string | null; sessionId: string | null; displayName: string; }; module: string; operation: string; access: "write" | "external"; description: { title: string; inputBytes: number; inputSha256: string; }; evidence?: readonly object[]; authorityFence: string; reversibility: "reversible" | "irreversible-external"; state: | "pending" | "expired" | "denied" | "applied" | "requested" | "approved" | "claimed" | "outcome_unknown"; by: | { kind: "human"; memberId: string; } | { kind: "policy"; } | null; reason: | "pending" | "expired" | "not-found" | "not-eligible" | "already-answered" | "stale-revision" | "declined" | "fenced" | "not-granted" | "read-only" | "in-flight" | "outcome-unknown" | "identity-conflict" | null; denialNote?: string; requestedAt: number; expiresAt: number; updatedAt: number; revision: number; }; canAnswer: boolean; canSetAutoApprove: boolean; } | null>

Signature
approvalAnswer(
pin,
actor,
input
): Promise<
| Readonly<{
kind: "answered";
view: {
record: {
recordId: string;
requester: {
principalId: string;
agentId: string | null;
sessionId: string | null;
displayName: string;
};
module: string;
operation: string;
access: "write" | "external";
description: {
title: string;
inputBytes: number;
inputSha256: string;
};
evidence?: readonly object[];
authorityFence: string;
reversibility: "reversible" | "irreversible-external";
state: | "pending"
| "expired"
| "denied"
| "applied"
| "requested"
| "approved"
| "claimed"
| "outcome_unknown";
by: | {
kind: "human";
memberId: string;
}
| {
kind: "policy";
}
| null;
reason: | "pending"
| "expired"
| "not-found"
| "not-eligible"
| "already-answered"
| "stale-revision"
| "declined"
| "fenced"
| "not-granted"
| "read-only"
| "in-flight"
| "outcome-unknown"
| "identity-conflict"
| null;
denialNote?: string;
requestedAt: number;
expiresAt: number;
updatedAt: number;
revision: number;
};
canAnswer: boolean;
canSetAutoApprove: boolean;
};
}>
| Readonly<{
kind: "refused";
reason: | "pending"
| "expired"
| "not-found"
| "not-eligible"
| "already-answered"
| "stale-revision"
| "declined"
| "fenced"
| "not-granted"
| "read-only"
| "in-flight"
| "outcome-unknown"
| "identity-conflict";
denialNote?: string;
}>>;

Persist an eligible answer and attempt its native decision work once.

Parameter Type
pin Readonly<{ tenantId: string; origin: string; }>
actor | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }
input { recordId: string; decision: "approve" | "deny"; expectedRevision: number; denialNote?: string; }
input.recordId string
input.decision "approve" | "deny"
input.expectedRevision number
input.denialNote? string

Promise< | Readonly<{ kind: "answered"; view: { record: { recordId: string; requester: { principalId: string; agentId: string | null; sessionId: string | null; displayName: string; }; module: string; operation: string; access: "write" | "external"; description: { title: string; inputBytes: number; inputSha256: string; }; evidence?: readonly object[]; authorityFence: string; reversibility: "reversible" | "irreversible-external"; state: | "pending" | "expired" | "denied" | "applied" | "requested" | "approved" | "claimed" | "outcome_unknown"; by: | { kind: "human"; memberId: string; } | { kind: "policy"; } | null; reason: | "pending" | "expired" | "not-found" | "not-eligible" | "already-answered" | "stale-revision" | "declined" | "fenced" | "not-granted" | "read-only" | "in-flight" | "outcome-unknown" | "identity-conflict" | null; denialNote?: string; requestedAt: number; expiresAt: number; updatedAt: number; revision: number; }; canAnswer: boolean; canSetAutoApprove: boolean; }; }> | Readonly<{ kind: "refused"; reason: | "pending" | "expired" | "not-found" | "not-eligible" | "already-answered" | "stale-revision" | "declined" | "fenced" | "not-granted" | "read-only" | "in-flight" | "outcome-unknown" | "identity-conflict"; denialNote?: string; }>>

Signature
approvalSetAutoApprove(
pin,
actor,
input
): Promise<
| Readonly<{
kind: "refused";
reason: | "pending"
| "expired"
| "not-found"
| "not-eligible"
| "already-answered"
| "stale-revision"
| "declined"
| "fenced"
| "not-granted"
| "read-only"
| "in-flight"
| "outcome-unknown"
| "identity-conflict";
denialNote?: string;
}>
| Readonly<{
kind: "updated";
rule: {
scope: {
agentId: string | null;
};
family: {
module: string | null;
access: "write" | "external";
};
enabled: boolean;
};
}>>;

Policy never grants operation authority; only the live Oyster owner may change it.

Parameter Type
pin Readonly<{ tenantId: string; origin: string; }>
actor | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }
input { scope: { agentId: string | null; }; family: { module: string | null; access: "write" | "external"; }; enabled: boolean; }
input.scope { agentId: string | null; }
input.scope.agentId string | null
input.family { module: string | null; access: "write" | "external"; }
input.family.module string | null
input.family.access "write" | "external"
input.enabled boolean

Promise< | Readonly<{ kind: "refused"; reason: | "pending" | "expired" | "not-found" | "not-eligible" | "already-answered" | "stale-revision" | "declined" | "fenced" | "not-granted" | "read-only" | "in-flight" | "outcome-unknown" | "identity-conflict"; denialNote?: string; }> | Readonly<{ kind: "updated"; rule: { scope: { agentId: string | null; }; family: { module: string | null; access: "write" | "external"; }; enabled: boolean; }; }>>

Signature
installationOperation(input): Promise<
| {
kind: "refused";
code: | "request_conflict"
| "unavailable"
| "stale_authority"
| "needs_consent"
| "stored_operation_invalid";
}
| {
kind: "operation";
operation: | {
requestId: string;
requestedInstallationId: string;
installationId: string;
release: {
releaseId: ReleaseId;
appId: AppId;
artifact: {
artifactRef: ArtifactRef;
artifactDigest: Sha256Digest;
provenance: {
sourceRevision: SourceRevision;
sourceTreeDigest: Sha256Digest;
buildRecipeDigest: Sha256Digest;
};
};
};
state: "refused";
status: number;
code: string;
}
| {
requestId: string;
requestedInstallationId: string;
installationId: string;
release: {
releaseId: ReleaseId;
appId: AppId;
artifact: {
artifactRef: ArtifactRef;
artifactDigest: Sha256Digest;
provenance: {
sourceRevision: SourceRevision;
sourceTreeDigest: Sha256Digest;
buildRecipeDigest: Sha256Digest;
};
};
};
state: "unconfirmed";
outcome: "cancelled" | "outcome_unknown" | "interrupted";
}
| {
requestId: string;
requestedInstallationId: string;
installationId: string;
release: {
releaseId: ReleaseId;
appId: AppId;
artifact: {
artifactRef: ArtifactRef;
artifactDigest: Sha256Digest;
provenance: {
sourceRevision: SourceRevision;
sourceTreeDigest: Sha256Digest;
buildRecipeDigest: Sha256Digest;
};
};
};
state: "succeeded";
reference: {
generation: string;
instanceId: InstanceId;
authorityVersion: number;
status: "enabled" | "disabled" | "deleted";
};
creation: "fresh" | "replacement" | "reminted";
uiCheck: | {
kind: "passed";
}
| {
kind: "failed";
code: "ui_mount_failed";
diagnostics?: {
failedPredicate: | "unexpected_candidate_request"
| "response_status"
| "request_failed"
| "page_error"
| "candidate_not_mounted";
errorName?: | "TypeError"
| "RangeError"
| "SyntaxError"
| "AbortError"
| "TimeoutError"
| "Other"
| "Error";
finalUrlPath: string;
consoleErrors: string[];
pageErrors: string[];
failedRequests: object[];
droppedCount: number;
};
}
| {
kind: "not_checked";
code: | "boot_runner_unavailable"
| "boot_browser_binding_missing"
| "boot_clone_unavailable"
| "boot_timeout"
| "boot_cleanup_failed"
| "ui_check_not_run_on_host";
}
| null;
installation: | {
installationId: string;
instanceId: InstanceId | null;
appId: AppId;
release: {
releaseId: ReleaseId;
appId: AppId;
artifact: {
artifactRef: ArtifactRef;
artifactDigest: Sha256Digest;
provenance: {
sourceRevision: SourceRevision;
sourceTreeDigest: Sha256Digest;
buildRecipeDigest: Sha256Digest;
};
};
};
releasePin: "pinned" | "floating";
authority: {
authorityVersion: number;
declaredOperationsDigest: Sha256Digest;
approvedGrants: readonly Readonly<{
capability: ...;
capabilityApproved: ...;
operations: ...;
resources: ...;
}>[];
approval: | Readonly<{
by: ...;
at: ...;
authorityVersion: ...;
}>
| null;
};
status: "enabled" | "disabled" | "deleted";
visibility: "private" | "public";
approvedAnonymousMethods: readonly Readonly<{
name: string;
digest: Sha256Digest;
}>[];
anonymousApproval: | Readonly<{
by: ... | ... | ...;
at: number;
authorityVersion: number;
}>
| null;
}
| null;
}
| {
requestId: string;
requestedInstallationId: string;
installationId: string;
release: {
releaseId: ReleaseId;
appId: AppId;
artifact: {
artifactRef: ArtifactRef;
artifactDigest: Sha256Digest;
provenance: {
sourceRevision: SourceRevision;
sourceTreeDigest: Sha256Digest;
buildRecipeDigest: Sha256Digest;
};
};
};
state: "pending";
}
| null;
}
| {
kind: "command";
command: | {
admission: {
requestId: string;
installationId: string;
release: {
releaseId: ReleaseId;
appId: AppId;
artifact: {
artifactRef: ArtifactRef;
artifactDigest: Sha256Digest;
provenance: {
sourceRevision: SourceRevision;
sourceTreeDigest: Sha256Digest;
buildRecipeDigest: Sha256Digest;
};
};
};
actor: | {
kind: "member";
memberId: string;
}
| {
kind: "agent";
agentId: string;
}
| {
kind: "team-key";
keyId: string;
};
intent: "install-or-select" | "install-or-remint" | "create-only";
origin: "workflow" | "owner-direct";
};
scope: {
tenantId: string & Brand<"OysterTenantId">;
origin: string;
};
installationId: string;
instanceId: InstanceId;
generation: string;
baseline: | {
installationId: string;
instanceId: InstanceId | null;
appId: AppId;
release: {
releaseId: ReleaseId;
appId: AppId;
artifact: {
artifactRef: ArtifactRef;
artifactDigest: Sha256Digest;
provenance: {
sourceRevision: SourceRevision;
sourceTreeDigest: Sha256Digest;
buildRecipeDigest: Sha256Digest;
};
};
};
releasePin: "pinned" | "floating";
authority: {
authorityVersion: number;
declaredOperationsDigest: Sha256Digest;
approvedGrants: readonly Readonly<{
capability: ...;
capabilityApproved: ...;
operations: ...;
resources: ...;
}>[];
approval: | Readonly<{
by: ...;
at: ...;
authorityVersion: ...;
}>
| null;
};
status: "enabled" | "disabled" | "deleted";
visibility: "private" | "public";
approvedAnonymousMethods: readonly Readonly<{
name: string;
digest: Sha256Digest;
}>[];
anonymousApproval: | Readonly<{
by: ... | ... | ...;
at: number;
authorityVersion: number;
}>
| null;
}
| null;
acceptedAt: number;
creation: "fresh" | "replacement" | "reminted";
plan: | {
installation: {
installationId: string;
instanceId: InstanceId | null;
appId: AppId;
release: {
releaseId: ReleaseId;
appId: AppId;
artifact: {
artifactRef: ArtifactRef;
artifactDigest: Sha256Digest;
provenance: {
sourceRevision: ...;
sourceTreeDigest: ...;
buildRecipeDigest: ...;
};
};
};
releasePin: "pinned" | "floating";
authority: {
authorityVersion: number;
declaredOperationsDigest: Sha256Digest;
approvedGrants: readonly Readonly<...>[];
approval: Readonly<...> | null;
};
status: "enabled" | "disabled" | "deleted";
visibility: "private" | "public";
approvedAnonymousMethods: readonly Readonly<{
name: ...;
digest: ...;
}>[];
anonymousApproval: | Readonly<{
by: ...;
at: ...;
authorityVersion: ...;
}>
| null;
};
hasBackend: boolean;
prepared: boolean;
uiCheck?: | {
kind: "passed";
}
| {
kind: "failed";
code: "ui_mount_failed";
diagnostics?: {
failedPredicate: ...;
errorName?: ...;
finalUrlPath: ...;
consoleErrors: ...;
pageErrors: ...;
failedRequests: ...;
droppedCount: ...;
};
}
| {
kind: "not_checked";
code: | "boot_runner_unavailable"
| "boot_browser_binding_missing"
| "boot_clone_unavailable"
| "boot_timeout"
| "boot_cleanup_failed"
| "ui_check_not_run_on_host";
}
| null;
}
| null;
operation: {
requestId: string;
requestedInstallationId: string;
installationId: string;
release: {
releaseId: ReleaseId;
appId: AppId;
artifact: {
artifactRef: ArtifactRef;
artifactDigest: Sha256Digest;
provenance: {
sourceRevision: SourceRevision;
sourceTreeDigest: Sha256Digest;
buildRecipeDigest: Sha256Digest;
};
};
};
state: "pending";
};
}
| null;
}
| {
kind: "commit";
commit: | {
ok: true;
}
| {
ok: false;
code: "stale_authority";
};
}>;

The installation owner’s RPC: admit, read, load, plan or commit one retained command for the caller’s tenant scope.

Parameter Type
input | { action: "admit"; scope: { tenantId: string & Brand<"OysterTenantId">; origin: string; }; input: { requestId: string; installationId: string; release: { releaseId: ReleaseId; appId: AppId; artifact: { artifactRef: ArtifactRef; artifactDigest: Sha256Digest; provenance: { sourceRevision: SourceRevision; sourceTreeDigest: Sha256Digest; buildRecipeDigest: Sha256Digest; }; }; }; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; intent: "install-or-select" | "install-or-remint" | "create-only"; origin: "workflow" | "owner-direct"; }; } | { action: "read"; scope: { tenantId: string & Brand<"OysterTenantId">; origin: string; }; requestId: string; installationId: string; } | { action: "load"; scope: { tenantId: string & Brand<"OysterTenantId">; origin: string; }; requestId: string; } | { action: "plan"; scope: { tenantId: string & Brand<"OysterTenantId">; origin: string; }; requestId: string; installation: { installationId: string; instanceId: InstanceId | null; appId: AppId; release: { releaseId: ReleaseId; appId: AppId; artifact: { artifactRef: ArtifactRef; artifactDigest: Sha256Digest; provenance: { sourceRevision: SourceRevision; sourceTreeDigest: Sha256Digest; buildRecipeDigest: Sha256Digest; }; }; }; releasePin: "pinned" | "floating"; authority: { authorityVersion: number; declaredOperationsDigest: Sha256Digest; approvedGrants: readonly Readonly<{ capability: | "computer.list" | "computer.readFile" | "computer.writeFile" | "computer.execute" | "approvals" | "agent.list" | "agent.manage" | "agent.rename" | "agent.avatar" | "agent.toolPolicy" | "agent.read" | "agent.send" | "llm.generation" | "media.generation" | "games:servers" | "git.repository" | "apps.open" | "apps.call" | "app.storage" | "app.events.emit" | "team.workbenchHost" | "marketplace.browse" | "marketplace.purchase" | "workflow.run" | "workflow.publish" | "workflow.arm" | "world" | "channels.read" | "channels.personal.manage"; capabilityApproved: true; operations: readonly string[]; resources: | "tenant-scope" | readonly Readonly<{ kind: …; id: …; }>[]; }>[]; approval: | Readonly<{ by: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; at: number; authorityVersion: number; }> | null; }; status: "enabled" | "disabled" | "deleted"; visibility: "private" | "public"; approvedAnonymousMethods: readonly Readonly<{ name: string; digest: Sha256Digest; }>[]; anonymousApproval: | Readonly<{ by: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; at: number; authorityVersion: number; }> | null; }; hasBackend: boolean; } | { action: "commit"; scope: { tenantId: string & Brand<"OysterTenantId">; origin: string; }; requestId: string; uiCheck: | { kind: "passed"; } | { kind: "failed"; code: "ui_mount_failed"; diagnostics?: { failedPredicate: | "unexpected_candidate_request" | "response_status" | "request_failed" | "page_error" | "candidate_not_mounted"; errorName?: | "TypeError" | "RangeError" | "SyntaxError" | "AbortError" | "TimeoutError" | "Other" | "Error"; finalUrlPath: string; consoleErrors: string[]; pageErrors: string[]; failedRequests: object[]; droppedCount: number; }; } | { kind: "not_checked"; code: | "boot_runner_unavailable" | "boot_browser_binding_missing" | "boot_clone_unavailable" | "boot_timeout" | "boot_cleanup_failed" | "ui_check_not_run_on_host"; } | null; }

Promise< | { kind: "refused"; code: | "request_conflict" | "unavailable" | "stale_authority" | "needs_consent" | "stored_operation_invalid"; } | { kind: "operation"; operation: | { requestId: string; requestedInstallationId: string; installationId: string; release: { releaseId: ReleaseId; appId: AppId; artifact: { artifactRef: ArtifactRef; artifactDigest: Sha256Digest; provenance: { sourceRevision: SourceRevision; sourceTreeDigest: Sha256Digest; buildRecipeDigest: Sha256Digest; }; }; }; state: "refused"; status: number; code: string; } | { requestId: string; requestedInstallationId: string; installationId: string; release: { releaseId: ReleaseId; appId: AppId; artifact: { artifactRef: ArtifactRef; artifactDigest: Sha256Digest; provenance: { sourceRevision: SourceRevision; sourceTreeDigest: Sha256Digest; buildRecipeDigest: Sha256Digest; }; }; }; state: "unconfirmed"; outcome: "cancelled" | "outcome_unknown" | "interrupted"; } | { requestId: string; requestedInstallationId: string; installationId: string; release: { releaseId: ReleaseId; appId: AppId; artifact: { artifactRef: ArtifactRef; artifactDigest: Sha256Digest; provenance: { sourceRevision: SourceRevision; sourceTreeDigest: Sha256Digest; buildRecipeDigest: Sha256Digest; }; }; }; state: "succeeded"; reference: { generation: string; instanceId: InstanceId; authorityVersion: number; status: "enabled" | "disabled" | "deleted"; }; creation: "fresh" | "replacement" | "reminted"; uiCheck: | { kind: "passed"; } | { kind: "failed"; code: "ui_mount_failed"; diagnostics?: { failedPredicate: | "unexpected_candidate_request" | "response_status" | "request_failed" | "page_error" | "candidate_not_mounted"; errorName?: | "TypeError" | "RangeError" | "SyntaxError" | "AbortError" | "TimeoutError" | "Other" | "Error"; finalUrlPath: string; consoleErrors: string[]; pageErrors: string[]; failedRequests: object[]; droppedCount: number; }; } | { kind: "not_checked"; code: | "boot_runner_unavailable" | "boot_browser_binding_missing" | "boot_clone_unavailable" | "boot_timeout" | "boot_cleanup_failed" | "ui_check_not_run_on_host"; } | null; installation: | { installationId: string; instanceId: InstanceId | null; appId: AppId; release: { releaseId: ReleaseId; appId: AppId; artifact: { artifactRef: ArtifactRef; artifactDigest: Sha256Digest; provenance: { sourceRevision: SourceRevision; sourceTreeDigest: Sha256Digest; buildRecipeDigest: Sha256Digest; }; }; }; releasePin: "pinned" | "floating"; authority: { authorityVersion: number; declaredOperationsDigest: Sha256Digest; approvedGrants: readonly Readonly<{ capability: …; capabilityApproved: …; operations: …; resources: …; }>[]; approval: | Readonly<{ by: …; at: …; authorityVersion: …; }> | null; }; status: "enabled" | "disabled" | "deleted"; visibility: "private" | "public"; approvedAnonymousMethods: readonly Readonly<{ name: string; digest: Sha256Digest; }>[]; anonymousApproval: | Readonly<{ by: … | … | …; at: number; authorityVersion: number; }> | null; } | null; } | { requestId: string; requestedInstallationId: string; installationId: string; release: { releaseId: ReleaseId; appId: AppId; artifact: { artifactRef: ArtifactRef; artifactDigest: Sha256Digest; provenance: { sourceRevision: SourceRevision; sourceTreeDigest: Sha256Digest; buildRecipeDigest: Sha256Digest; }; }; }; state: "pending"; } | null; } | { kind: "command"; command: | { admission: { requestId: string; installationId: string; release: { releaseId: ReleaseId; appId: AppId; artifact: { artifactRef: ArtifactRef; artifactDigest: Sha256Digest; provenance: { sourceRevision: SourceRevision; sourceTreeDigest: Sha256Digest; buildRecipeDigest: Sha256Digest; }; }; }; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; intent: "install-or-select" | "install-or-remint" | "create-only"; origin: "workflow" | "owner-direct"; }; scope: { tenantId: string & Brand<"OysterTenantId">; origin: string; }; installationId: string; instanceId: InstanceId; generation: string; baseline: | { installationId: string; instanceId: InstanceId | null; appId: AppId; release: { releaseId: ReleaseId; appId: AppId; artifact: { artifactRef: ArtifactRef; artifactDigest: Sha256Digest; provenance: { sourceRevision: SourceRevision; sourceTreeDigest: Sha256Digest; buildRecipeDigest: Sha256Digest; }; }; }; releasePin: "pinned" | "floating"; authority: { authorityVersion: number; declaredOperationsDigest: Sha256Digest; approvedGrants: readonly Readonly<{ capability: …; capabilityApproved: …; operations: …; resources: …; }>[]; approval: | Readonly<{ by: …; at: …; authorityVersion: …; }> | null; }; status: "enabled" | "disabled" | "deleted"; visibility: "private" | "public"; approvedAnonymousMethods: readonly Readonly<{ name: string; digest: Sha256Digest; }>[]; anonymousApproval: | Readonly<{ by: … | … | …; at: number; authorityVersion: number; }> | null; } | null; acceptedAt: number; creation: "fresh" | "replacement" | "reminted"; plan: | { installation: { installationId: string; instanceId: InstanceId | null; appId: AppId; release: { releaseId: ReleaseId; appId: AppId; artifact: { artifactRef: ArtifactRef; artifactDigest: Sha256Digest; provenance: { sourceRevision: …; sourceTreeDigest: …; buildRecipeDigest: …; }; }; }; releasePin: "pinned" | "floating"; authority: { authorityVersion: number; declaredOperationsDigest: Sha256Digest; approvedGrants: readonly Readonly<…>[]; approval: Readonly<…> | null; }; status: "enabled" | "disabled" | "deleted"; visibility: "private" | "public"; approvedAnonymousMethods: readonly Readonly<{ name: …; digest: …; }>[]; anonymousApproval: | Readonly<{ by: …; at: …; authorityVersion: …; }> | null; }; hasBackend: boolean; prepared: boolean; uiCheck?: | { kind: "passed"; } | { kind: "failed"; code: "ui_mount_failed"; diagnostics?: { failedPredicate: …; errorName?: …; finalUrlPath: …; consoleErrors: …; pageErrors: …; failedRequests: …; droppedCount: …; }; } | { kind: "not_checked"; code: | "boot_runner_unavailable" | "boot_browser_binding_missing" | "boot_clone_unavailable" | "boot_timeout" | "boot_cleanup_failed" | "ui_check_not_run_on_host"; } | null; } | null; operation: { requestId: string; requestedInstallationId: string; installationId: string; release: { releaseId: ReleaseId; appId: AppId; artifact: { artifactRef: ArtifactRef; artifactDigest: Sha256Digest; provenance: { sourceRevision: SourceRevision; sourceTreeDigest: Sha256Digest; buildRecipeDigest: Sha256Digest; }; }; }; state: "pending"; }; } | null; } | { kind: "commit"; commit: | { ok: true; } | { ok: false; code: "stale_authority"; }; }>

Signature
alarm(): Promise<void>;

One Registry wake serves both owners: installation work, then the native approval home. Each re-arms only an earlier wake, so neither postpones the other, and one owner’s failure never skips the other’s quantum.

Promise<void>

Signature
DurableObject.alarm;
Signature
directory(): Promise<Readonly<{
apps: readonly object[];
roles: OysterRootRoles;
computer?: Readonly<{
computerId: string;
name: string;
}>;
}>>;

Current desktop metadata; roles are the ADR’s derived default, never Hub’s stored choice.

Promise<Readonly<{ apps: readonly object[]; roles: OysterRootRoles; computer?: Readonly<{ computerId: string; name: string; }>; }>>

Signature
storageRead(
installationId,
ownerId,
key
): Promise<AppStorageResult<{
value: Json;
source: "member" | "team" | "none";
team: | {
value: Json;
revision: number;
}
| null;
member: | {
value: Json;
revision: number;
}
| null;
canWriteTeam: boolean;
}>>;

Read one key for the authenticated root owner, under fresh App admission.

Parameter Type
installationId string
ownerId string
key string

Promise<AppStorageResult<{ value: Json; source: "member" | "team" | "none"; team: | { value: Json; revision: number; } | null; member: | { value: Json; revision: number; } | null; canWriteTeam: boolean; }>>

Signature
storageWrite(
installationId,
ownerId,
input
): Promise<AppStorageResult<{
revision: number;
}>>;

Write one declared key for the authenticated root owner.

Parameter Type
installationId string
ownerId string
input { value: Json; key: string; scope: "member" | "team"; basedOn: number | null; }
input.value Json
input.key string
input.scope "member" | "team"
input.basedOn number | null

Promise<AppStorageResult<{ revision: number; }>>

Signature
storageReset(
installationId,
ownerId,
input
): Promise<AppStorageResult<{
revision: number;
}>>;

Reset one declared layer for the authenticated root owner.

Parameter Type
installationId string
ownerId string
input { key: string; scope: "member" | "team"; basedOn: number | null; }
input.key string
input.scope "member" | "team"
input.basedOn number | null

Promise<AppStorageResult<{ revision: number; }>>

Signature
storageBackend(
raw,
method,
args,
tenantId
): Promise<OysterBindingResult>;

Storage for a live owner method frame; no guest-selected installation or member.

Parameter Type
raw { instanceId: InstanceId; selection: { instanceId: InstanceId; owner: { kind: "installation" | "deployment"; id: string; }; appId: AppId; releaseId: ReleaseId; authorityVersion: number; }; artifactDigest: Sha256Digest; subject: | { kind: "call"; context: { computerId: string | null; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; backgroundLane?: string; backgroundOrigin?: { method: string; seal: string; }; role?: "member" | "owner"; soleMember?: true; workflow?: { workflowId: string; runId: string; nodeId: string; armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; }; idempotencyKey?: string; }; sessionId?: string; agentPolicy?: { policyRevision: string; grantorMemberId: string; }; method?: { name: string; effect: "read" | "write" | "external"; }; replay?: { lane: string; epoch: number; admitted: readonly string[]; }; } | { kind: "lifecycle"; name: "onGitPush"; eventId: string; } | { kind: "lifecycle"; name: "syncRefused"; lane: string; code: "access_changed" | "installation_unavailable"; }; grants: readonly object[]; deadlineAt: number; ancestry: readonly InstanceId[]; }
raw.instanceId InstanceId
raw.selection { instanceId: InstanceId; owner: { kind: "installation" | "deployment"; id: string; }; appId: AppId; releaseId: ReleaseId; authorityVersion: number; }
raw.selection.instanceId InstanceId
raw.selection.owner { kind: "installation" | "deployment"; id: string; }
raw.selection.owner.kind "installation" | "deployment"
raw.selection.owner.id string
raw.selection.appId AppId
raw.selection.releaseId ReleaseId
raw.selection.authorityVersion number
raw.artifactDigest Sha256Digest
raw.subject | { kind: "call"; context: { computerId: string | null; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; backgroundLane?: string; backgroundOrigin?: { method: string; seal: string; }; role?: "member" | "owner"; soleMember?: true; workflow?: { workflowId: string; runId: string; nodeId: string; armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; }; idempotencyKey?: string; }; sessionId?: string; agentPolicy?: { policyRevision: string; grantorMemberId: string; }; method?: { name: string; effect: "read" | "write" | "external"; }; replay?: { lane: string; epoch: number; admitted: readonly string[]; }; } | { kind: "lifecycle"; name: "onGitPush"; eventId: string; } | { kind: "lifecycle"; name: "syncRefused"; lane: string; code: "access_changed" | "installation_unavailable"; }
raw.grants readonly object[]
raw.deadlineAt number
raw.ancestry readonly InstanceId[]
method string
args readonly unknown[]
tenantId string & Brand<"OysterTenantId">

Promise<OysterBindingResult>

Signature
storageEvents(
installationId,
ownerId,
key
): Promise<Response>;

Open the existing App-storage invalidation stream under fresh owner admission.

Parameter Type
installationId string
ownerId string
key string

Promise<Response>

Signature
storeFromOlderOyster(): boolean;

Whether this registry’s data was written by Oyster 0.2 or earlier; hosts refuse it.

boolean

Signature
list(): Readonly<{
installationId: string;
instanceId: InstanceId | null;
appId: AppId;
release: {
releaseId: ReleaseId;
appId: AppId;
artifact: {
artifactRef: ArtifactRef;
artifactDigest: Sha256Digest;
provenance: {
sourceRevision: SourceRevision;
sourceTreeDigest: Sha256Digest;
buildRecipeDigest: Sha256Digest;
};
};
};
releasePin: "pinned" | "floating";
authority: {
authorityVersion: number;
declaredOperationsDigest: Sha256Digest;
approvedGrants: readonly Readonly<{
capability: | "computer.list"
| "computer.readFile"
| "computer.writeFile"
| "computer.execute"
| "approvals"
| "agent.list"
| "agent.manage"
| "agent.rename"
| "agent.avatar"
| "agent.toolPolicy"
| "agent.read"
| "agent.send"
| "llm.generation"
| "media.generation"
| "games:servers"
| "git.repository"
| "apps.open"
| "apps.call"
| "app.storage"
| "app.events.emit"
| "team.workbenchHost"
| "marketplace.browse"
| "marketplace.purchase"
| "workflow.run"
| "workflow.publish"
| "workflow.arm"
| "world"
| "channels.read"
| "channels.personal.manage";
capabilityApproved: true;
operations: readonly string[];
resources: | "tenant-scope"
| readonly Readonly<{
kind: ...;
id: ...;
}>[];
}>[];
approval: | Readonly<{
by: | {
kind: "member";
memberId: string;
}
| {
kind: "agent";
agentId: string;
}
| {
kind: "team-key";
keyId: string;
};
at: number;
authorityVersion: number;
}>
| null;
};
status: "enabled" | "disabled" | "deleted";
visibility: "private" | "public";
approvedAnonymousMethods: readonly Readonly<{
name: string;
digest: Sha256Digest;
}>[];
anonymousApproval: | Readonly<{
by: | {
kind: "member";
memberId: string;
}
| {
kind: "agent";
agentId: string;
}
| {
kind: "team-key";
keyId: string;
};
at: number;
authorityVersion: number;
}>
| null;
}>[];

Every installation record.

Readonly<{ installationId: string; instanceId: InstanceId | null; appId: AppId; release: { releaseId: ReleaseId; appId: AppId; artifact: { artifactRef: ArtifactRef; artifactDigest: Sha256Digest; provenance: { sourceRevision: SourceRevision; sourceTreeDigest: Sha256Digest; buildRecipeDigest: Sha256Digest; }; }; }; releasePin: "pinned" | "floating"; authority: { authorityVersion: number; declaredOperationsDigest: Sha256Digest; approvedGrants: readonly Readonly<{ capability: | "computer.list" | "computer.readFile" | "computer.writeFile" | "computer.execute" | "approvals" | "agent.list" | "agent.manage" | "agent.rename" | "agent.avatar" | "agent.toolPolicy" | "agent.read" | "agent.send" | "llm.generation" | "media.generation" | "games:servers" | "git.repository" | "apps.open" | "apps.call" | "app.storage" | "app.events.emit" | "team.workbenchHost" | "marketplace.browse" | "marketplace.purchase" | "workflow.run" | "workflow.publish" | "workflow.arm" | "world" | "channels.read" | "channels.personal.manage"; capabilityApproved: true; operations: readonly string[]; resources: | "tenant-scope" | readonly Readonly<{ kind: …; id: …; }>[]; }>[]; approval: | Readonly<{ by: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; at: number; authorityVersion: number; }> | null; }; status: "enabled" | "disabled" | "deleted"; visibility: "private" | "public"; approvedAnonymousMethods: readonly Readonly<{ name: string; digest: Sha256Digest; }>[]; anonymousApproval: | Readonly<{ by: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; at: number; authorityVersion: number; }> | null; }>[]

Signature
get(installationId):
| Readonly<{
installationId: string;
instanceId: InstanceId | null;
appId: AppId;
release: {
releaseId: ReleaseId;
appId: AppId;
artifact: {
artifactRef: ArtifactRef;
artifactDigest: Sha256Digest;
provenance: {
sourceRevision: SourceRevision;
sourceTreeDigest: Sha256Digest;
buildRecipeDigest: Sha256Digest;
};
};
};
releasePin: "pinned" | "floating";
authority: {
authorityVersion: number;
declaredOperationsDigest: Sha256Digest;
approvedGrants: readonly Readonly<{
capability: | "computer.list"
| "computer.readFile"
| "computer.writeFile"
| "computer.execute"
| "approvals"
| "agent.list"
| "agent.manage"
| "agent.rename"
| "agent.avatar"
| "agent.toolPolicy"
| "agent.read"
| "agent.send"
| "llm.generation"
| "media.generation"
| "games:servers"
| "git.repository"
| "apps.open"
| "apps.call"
| "app.storage"
| "app.events.emit"
| "team.workbenchHost"
| "marketplace.browse"
| "marketplace.purchase"
| "workflow.run"
| "workflow.publish"
| "workflow.arm"
| "world"
| "channels.read"
| "channels.personal.manage";
capabilityApproved: true;
operations: readonly string[];
resources: | "tenant-scope"
| readonly Readonly<{
kind: ...;
id: ...;
}>[];
}>[];
approval: | Readonly<{
by: | {
kind: "member";
memberId: string;
}
| {
kind: "agent";
agentId: string;
}
| {
kind: "team-key";
keyId: string;
};
at: number;
authorityVersion: number;
}>
| null;
};
status: "enabled" | "disabled" | "deleted";
visibility: "private" | "public";
approvedAnonymousMethods: readonly Readonly<{
name: string;
digest: Sha256Digest;
}>[];
anonymousApproval: | Readonly<{
by: | {
kind: "member";
memberId: string;
}
| {
kind: "agent";
agentId: string;
}
| {
kind: "team-key";
keyId: string;
};
at: number;
authorityVersion: number;
}>
| null;
}>
| null;

One installation record, or null.

Parameter Type
installationId string

| Readonly<{ installationId: string; instanceId: InstanceId | null; appId: AppId; release: { releaseId: ReleaseId; appId: AppId; artifact: { artifactRef: ArtifactRef; artifactDigest: Sha256Digest; provenance: { sourceRevision: SourceRevision; sourceTreeDigest: Sha256Digest; buildRecipeDigest: Sha256Digest; }; }; }; releasePin: "pinned" | "floating"; authority: { authorityVersion: number; declaredOperationsDigest: Sha256Digest; approvedGrants: readonly Readonly<{ capability: | "computer.list" | "computer.readFile" | "computer.writeFile" | "computer.execute" | "approvals" | "agent.list" | "agent.manage" | "agent.rename" | "agent.avatar" | "agent.toolPolicy" | "agent.read" | "agent.send" | "llm.generation" | "media.generation" | "games:servers" | "git.repository" | "apps.open" | "apps.call" | "app.storage" | "app.events.emit" | "team.workbenchHost" | "marketplace.browse" | "marketplace.purchase" | "workflow.run" | "workflow.publish" | "workflow.arm" | "world" | "channels.read" | "channels.personal.manage"; capabilityApproved: true; operations: readonly string[]; resources: | "tenant-scope" | readonly Readonly<{ kind: …; id: …; }>[]; }>[]; approval: | Readonly<{ by: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; at: number; authorityVersion: number; }> | null; }; status: "enabled" | "disabled" | "deleted"; visibility: "private" | "public"; approvedAnonymousMethods: readonly Readonly<{ name: string; digest: Sha256Digest; }>[]; anonymousApproval: | Readonly<{ by: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; at: number; authorityVersion: number; }> | null; }> | null

Signature
generation(): string;

Durable store identity, regenerated only when the store itself is replaced.

string

Signature
compareAndPut(
installation,
expectedAuthorityVersion,
expectedGeneration,
tenantId?
): Promise<InstallationCommit>;

Native RPC returns a closed result; callers never classify a transported Error.

Parameter Type Default value
installation Installation undefined
expectedAuthorityVersion number undefined
expectedGeneration string undefined
tenantId string & Brand<"OysterTenantId"> defaultTenant

Promise<InstallationCommit>

Signature
bootCapability(input):
| {
id: string;
identity: {
appId: string;
releaseId: ReleaseId;
surfaceId: "host-boot";
};
base: string;
expiresAt: number;
assets: object[];
}
| null
| undefined;

Issue, resolve, or revoke one bounded capability without storing its token.

Parameter Type
input | Readonly<{ kind: "issue"; grant: { lease: { id: string; identity: { appId: string; releaseId: ReleaseId; surfaceId: "host-boot"; }; base: string; expiresAt: number; assets: object[]; }; tokenDigest: string; }; }> | Readonly<{ kind: "resolve"; tokenDigest: string; now: number; }> | Readonly<{ kind: "revoke"; id: string; }>

| { id: string; identity: { appId: string; releaseId: ReleaseId; surfaceId: "host-boot"; }; base: string; expiresAt: number; assets: object[]; } | null | undefined


The plain Oyster Worker’s guest binding entrypoint.

  • WorkerEntrypoint<Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }>; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string; AGENT_DIRECTORY?: Readonly<{ getByName: Readonly<{ readCreator: Promise<… | …>; }>; }>; OYSTER_ORIGIN: string; MCP: DurableObjectNamespace<OysterMcpOwner<Readonly<{ LOADER: WorkerLoader; }>>>; RELEASES: R2Bucket; REGISTRY: DurableObjectNamespace<OysterRegistry<Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }> | undefined; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string | undefined; AGENT_DIRECTORY?: Readonly<{ getByName(name: string): Readonly<…>; }> | undefined; … 5 more …; LOADER: WorkerLoader; }>>>; INSTANCES: DurableObjectNamespace<OysterInstance<Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }> | undefined; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string | undefined; AGENT_DIRECTORY?: Readonly<{ getByName(name: string): Readonly<…>; }> | undefined; … 5 more …; LOADER: WorkerLoader; }>>>; LOADER: WorkerLoader; }>, Readonly<{ instanceId: string; binding: | "BACKGROUND" | "GIT" | "EVENTS" | "APPS" | "WORKFLOWS" | "APP_STORAGE" | "MEDIA" | "COMPUTER" | "INBOX" | "AGENTS"; frameId: string; }>, this>
Signature
new OysterBinding(ctx, env): OysterBinding;
Parameter Type
ctx ExecutionContext
env Env

OysterBinding

Signature
oysterBindingEntrypoint(oysterBindings).constructor;

One App Instance: Oyster’s lifecycle supervisor in this Durable Object’s SQLite and the App backend in its app facet.

  • DurableObject<Env>
Type Parameter Default type
Env extends OysterWorkerEnv OysterWorkerEnv
Signature
new OysterInstance<Env>(ctx, env): OysterInstance<Env>;
Parameter Type
ctx DurableObjectState
env Env

OysterInstance<Env>

Signature
DurableObject<Env>.constructor
Signature
bindingCall(
raw,
method,
input
): Promise<FrameBindingReply<OysterBindingResult>>;

Resolve each guest packet against its immutable frame before any host effect.

Parameter Type
raw FrameBindingProps
method string
input readonly unknown[]

Promise<FrameBindingReply<OysterBindingResult>>

Signature
gitTip(
installationId,
repository,
ref,
tenantId?
): Promise<string | null>;

Last provider-accepted ref recorded by this installation’s journal.

Parameter Type Default value
installationId string undefined
repository string undefined
ref string undefined
tenantId string & Brand<"OysterTenantId"> defaultTenant

Promise<string | null>

Signature
recordGitPush(
installationId,
fact,
tenantId?
): Promise<"duplicate" | "recorded">;

Join accepted fact identity and Carrier delivery in one local transaction.

Parameter Type Default value
installationId string undefined
fact { repository: string; writer: | { kind: "actor"; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; role?: "member" | "owner"; workflow?: { armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; branches: string[]; workflowId: string; runId: string; nodeId: string; }; } | { kind: "installation"; installationId: string; onBehalfOf: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; } | null; }; updates: object[]; unexplained?: object[]; eventId: string; } undefined
fact.repository string undefined
fact.writer | { kind: "actor"; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; role?: "member" | "owner"; workflow?: { armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; branches: string[]; workflowId: string; runId: string; nodeId: string; }; } | { kind: "installation"; installationId: string; onBehalfOf: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; } | null; } undefined
fact.updates object[] undefined
fact.unexplained? object[] undefined
fact.eventId string undefined
tenantId string & Brand<"OysterTenantId"> defaultTenant

Promise<"duplicate" | "recorded">

Signature
alarm(): Promise<void>;

Carrier owns retries, dead letters and retained delivery receipts.

Promise<void>

Signature
DurableObject.alarm;
Signature
revoke(
installationId,
runId?,
tenantId?
): Promise<void>;

Installation changes end guest work; a Workflow cancel targets only its run.

Parameter Type Default value
installationId string undefined
runId? string undefined
tenantId? string & Brand<"OysterTenantId"> defaultTenant

Promise<void>

Signature
prepare(
state,
release,
limits?,
tenant?
): Promise<InstanceResult<
| {
kind: "passed";
}
| {
kind: "failed";
code: "ui_mount_failed";
diagnostics?: {
failedPredicate: | "unexpected_candidate_request"
| "response_status"
| "request_failed"
| "page_error"
| "candidate_not_mounted";
errorName?: | "TypeError"
| "RangeError"
| "SyntaxError"
| "AbortError"
| "TimeoutError"
| "Other"
| "Error";
finalUrlPath: string;
consoleErrors: string[];
pageErrors: string[];
failedRequests: object[];
droppedCount: number;
};
}
| {
kind: "not_checked";
code: | "boot_runner_unavailable"
| "boot_browser_binding_missing"
| "boot_clone_unavailable"
| "boot_timeout"
| "boot_cleanup_failed"
| "ui_check_not_run_on_host";
}
| null>>;

Reuse lifecycle preflight without changing the active runtime or its budgets.

Parameter Type
state { instanceId: InstanceId; owner: { kind: "installation" | "deployment"; id: string; }; appId: AppId; releaseId: ReleaseId; authorityVersion: number; status: "enabled" | "disabled" | "deleted"; }
state.instanceId InstanceId
state.owner { kind: "installation" | "deployment"; id: string; }
state.owner.kind? "installation" | "deployment"
state.owner.id? string
state.appId? AppId
state.releaseId? ReleaseId
state.authorityVersion? number
state.status? "enabled" | "disabled" | "deleted"
release? Release
limits? Readonly<{ cpuMs: number; subRequests: number; }>
tenant? Pick<Readonly<{ tenantId: string & Brand<"OysterTenantId">; origin: string; durableName: string; computerName: string; workspacePrefix: string; repositoryPrefix: string; }>, "origin" | "tenantId">

Promise<InstanceResult< | { kind: "passed"; } | { kind: "failed"; code: "ui_mount_failed"; diagnostics?: { failedPredicate: | "unexpected_candidate_request" | "response_status" | "request_failed" | "page_error" | "candidate_not_mounted"; errorName?: | "TypeError" | "RangeError" | "SyntaxError" | "AbortError" | "TimeoutError" | "Other" | "Error"; finalUrlPath: string; consoleErrors: string[]; pageErrors: string[]; failedRequests: object[]; droppedCount: number; }; } | { kind: "not_checked"; code: | "boot_runner_unavailable" | "boot_browser_binding_missing" | "boot_clone_unavailable" | "boot_timeout" | "boot_cleanup_failed" | "ui_check_not_run_on_host"; } | null>>

Signature
apply(
state,
release,
limits,
tenant
): Promise<InstanceResult<{
instanceId: InstanceId;
owner: {
kind: "installation" | "deployment";
id: string;
};
appId: AppId;
releaseId: ReleaseId;
authorityVersion: number;
stateSchema: number | null;
desiredStatus: "enabled" | "disabled" | "deleted";
status: "active" | "disabled" | "deleted" | "deleting";
}>>;

Activate the exact committed selection under the host’s tenant pin.

Parameter Type
state { instanceId: InstanceId; owner: { kind: "installation" | "deployment"; id: string; }; appId: AppId; releaseId: ReleaseId; authorityVersion: number; status: "enabled" | "disabled" | "deleted"; }
state.instanceId InstanceId
state.owner { kind: "installation" | "deployment"; id: string; }
state.owner.kind "installation" | "deployment"
state.owner.id string
state.appId AppId
state.releaseId ReleaseId
state.authorityVersion number
state.status "enabled" | "disabled" | "deleted"
release Release
limits | Readonly<{ cpuMs: number; subRequests: number; }> | undefined
tenant Pick<TenantScope, "tenantId" | "origin">

Promise<InstanceResult<{ instanceId: InstanceId; owner: { kind: "installation" | "deployment"; id: string; }; appId: AppId; releaseId: ReleaseId; authorityVersion: number; stateSchema: number | null; desiredStatus: "enabled" | "disabled" | "deleted"; status: "active" | "disabled" | "deleted" | "deleting"; }>>

Signature
backend(
facts,
request,
limits?,
tenantId?
): Promise<Response>;

Forward an admitted HTTP request to the App backend.

Parameter Type Default value
facts { instanceId: InstanceId; selection: { instanceId: InstanceId; owner: { kind: "installation" | "deployment"; id: string; }; appId: AppId; releaseId: ReleaseId; authorityVersion: number; }; artifactDigest: Sha256Digest; subject: | { kind: "call"; context: { computerId: string | null; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; backgroundLane?: string; backgroundOrigin?: { method: string; seal: string; }; role?: "member" | "owner"; soleMember?: true; workflow?: { workflowId: string; runId: string; nodeId: string; armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; }; idempotencyKey?: string; }; sessionId?: string; agentPolicy?: { policyRevision: string; grantorMemberId: string; }; method?: { name: string; effect: "read" | "write" | "external"; }; replay?: { lane: string; epoch: number; admitted: readonly string[]; }; } | { kind: "lifecycle"; name: "onGitPush"; eventId: string; } | { kind: "lifecycle"; name: "syncRefused"; lane: string; code: "access_changed" | "installation_unavailable"; }; grants: readonly object[]; deadlineAt: number; ancestry: readonly InstanceId[]; } undefined
facts.instanceId InstanceId instanceIdSchema
facts.selection { instanceId: InstanceId; owner: { kind: "installation" | "deployment"; id: string; }; appId: AppId; releaseId: ReleaseId; authorityVersion: number; } selectionSchema
facts.selection.instanceId? InstanceId instanceIdSchema
facts.selection.owner? { kind: "installation" | "deployment"; id: string; } ownerSchema
facts.selection.owner.kind? "installation" | "deployment" ...
facts.selection.owner.id? string Schema.NonEmptyString
facts.selection.appId? AppId appIdSchema
facts.selection.releaseId? ReleaseId releaseIdSchema
facts.selection.authorityVersion? number ...
facts.artifactDigest? Sha256Digest sha256DigestSchema
facts.subject? | { kind: "call"; context: { computerId: string | null; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; backgroundLane?: string; backgroundOrigin?: { method: string; seal: string; }; role?: "member" | "owner"; soleMember?: true; workflow?: { workflowId: string; runId: string; nodeId: string; armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; }; idempotencyKey?: string; }; sessionId?: string; agentPolicy?: { policyRevision: string; grantorMemberId: string; }; method?: { name: string; effect: "read" | "write" | "external"; }; replay?: { lane: string; epoch: number; admitted: readonly string[]; }; } | { kind: "lifecycle"; name: "onGitPush"; eventId: string; } | { kind: "lifecycle"; name: "syncRefused"; lane: string; code: "access_changed" | "installation_unavailable"; } ...
facts.grants? readonly object[] grantsSchema
facts.deadlineAt? number ...
facts.ancestry? readonly InstanceId[] ...
request? Request undefined
limits? Readonly<{ cpuMs: number; subRequests: number; }> undefined
tenantId? string & Brand<"OysterTenantId"> defaultTenant

Promise<Response>

Signature
onGitPush(
facts,
fact,
limits?,
tenantId?
): Promise<void>;

Deliver a Git push through the same selected-Instance admission as methods.

Parameter Type Default value
facts { instanceId: InstanceId; selection: { instanceId: InstanceId; owner: { kind: "installation" | "deployment"; id: string; }; appId: AppId; releaseId: ReleaseId; authorityVersion: number; }; artifactDigest: Sha256Digest; subject: | { kind: "call"; context: { computerId: string | null; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; backgroundLane?: string; backgroundOrigin?: { method: string; seal: string; }; role?: "member" | "owner"; soleMember?: true; workflow?: { workflowId: string; runId: string; nodeId: string; armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; }; idempotencyKey?: string; }; sessionId?: string; agentPolicy?: { policyRevision: string; grantorMemberId: string; }; method?: { name: string; effect: "read" | "write" | "external"; }; replay?: { lane: string; epoch: number; admitted: readonly string[]; }; } | { kind: "lifecycle"; name: "onGitPush"; eventId: string; } | { kind: "lifecycle"; name: "syncRefused"; lane: string; code: "access_changed" | "installation_unavailable"; }; grants: readonly object[]; deadlineAt: number; ancestry: readonly InstanceId[]; } undefined
facts.instanceId InstanceId instanceIdSchema
facts.selection { instanceId: InstanceId; owner: { kind: "installation" | "deployment"; id: string; }; appId: AppId; releaseId: ReleaseId; authorityVersion: number; } selectionSchema
facts.selection.instanceId? InstanceId instanceIdSchema
facts.selection.owner? { kind: "installation" | "deployment"; id: string; } ownerSchema
facts.selection.owner.kind? "installation" | "deployment" ...
facts.selection.owner.id? string Schema.NonEmptyString
facts.selection.appId? AppId appIdSchema
facts.selection.releaseId? ReleaseId releaseIdSchema
facts.selection.authorityVersion? number ...
facts.artifactDigest? Sha256Digest sha256DigestSchema
facts.subject? | { kind: "call"; context: { computerId: string | null; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; backgroundLane?: string; backgroundOrigin?: { method: string; seal: string; }; role?: "member" | "owner"; soleMember?: true; workflow?: { workflowId: string; runId: string; nodeId: string; armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; }; idempotencyKey?: string; }; sessionId?: string; agentPolicy?: { policyRevision: string; grantorMemberId: string; }; method?: { name: string; effect: "read" | "write" | "external"; }; replay?: { lane: string; epoch: number; admitted: readonly string[]; }; } | { kind: "lifecycle"; name: "onGitPush"; eventId: string; } | { kind: "lifecycle"; name: "syncRefused"; lane: string; code: "access_changed" | "installation_unavailable"; } ...
facts.grants? readonly object[] grantsSchema
facts.deadlineAt? number ...
facts.ancestry? readonly InstanceId[] ...
fact? { repository: string; writer: | { kind: "actor"; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; role?: "member" | "owner"; workflow?: { armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; branches: string[]; workflowId: string; runId: string; nodeId: string; }; } | { kind: "installation"; installationId: string; onBehalfOf: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; } | null; }; updates: object[]; unexplained?: object[]; eventId: string; } undefined
fact.repository? string undefined
fact.writer? | { kind: "actor"; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; role?: "member" | "owner"; workflow?: { armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; branches: string[]; workflowId: string; runId: string; nodeId: string; }; } | { kind: "installation"; installationId: string; onBehalfOf: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; } | null; } undefined
fact.updates? object[] undefined
fact.unexplained? object[] undefined
fact.eventId? string undefined
limits? Readonly<{ cpuMs: number; subRequests: number; }> undefined
tenantId? string & Brand<"OysterTenantId"> defaultTenant

Promise<void>

Signature
authorizeGitPush(
facts,
question,
limits?,
tenantId?
): Promise<
| {
allowed: true;
}
| {
allowed: false;
refused: object[];
}>;

Ask the App’s declared authorizer through the same frame-bound connection.

Parameter Type Default value
facts { instanceId: InstanceId; selection: { instanceId: InstanceId; owner: { kind: "installation" | "deployment"; id: string; }; appId: AppId; releaseId: ReleaseId; authorityVersion: number; }; artifactDigest: Sha256Digest; subject: | { kind: "call"; context: { computerId: string | null; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; backgroundLane?: string; backgroundOrigin?: { method: string; seal: string; }; role?: "member" | "owner"; soleMember?: true; workflow?: { workflowId: string; runId: string; nodeId: string; armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; }; idempotencyKey?: string; }; sessionId?: string; agentPolicy?: { policyRevision: string; grantorMemberId: string; }; method?: { name: string; effect: "read" | "write" | "external"; }; replay?: { lane: string; epoch: number; admitted: readonly string[]; }; } | { kind: "lifecycle"; name: "onGitPush"; eventId: string; } | { kind: "lifecycle"; name: "syncRefused"; lane: string; code: "access_changed" | "installation_unavailable"; }; grants: readonly object[]; deadlineAt: number; ancestry: readonly InstanceId[]; } undefined
facts.instanceId InstanceId instanceIdSchema
facts.selection { instanceId: InstanceId; owner: { kind: "installation" | "deployment"; id: string; }; appId: AppId; releaseId: ReleaseId; authorityVersion: number; } selectionSchema
facts.selection.instanceId? InstanceId instanceIdSchema
facts.selection.owner? { kind: "installation" | "deployment"; id: string; } ownerSchema
facts.selection.owner.kind? "installation" | "deployment" ...
facts.selection.owner.id? string Schema.NonEmptyString
facts.selection.appId? AppId appIdSchema
facts.selection.releaseId? ReleaseId releaseIdSchema
facts.selection.authorityVersion? number ...
facts.artifactDigest? Sha256Digest sha256DigestSchema
facts.subject? | { kind: "call"; context: { computerId: string | null; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; backgroundLane?: string; backgroundOrigin?: { method: string; seal: string; }; role?: "member" | "owner"; soleMember?: true; workflow?: { workflowId: string; runId: string; nodeId: string; armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; }; idempotencyKey?: string; }; sessionId?: string; agentPolicy?: { policyRevision: string; grantorMemberId: string; }; method?: { name: string; effect: "read" | "write" | "external"; }; replay?: { lane: string; epoch: number; admitted: readonly string[]; }; } | { kind: "lifecycle"; name: "onGitPush"; eventId: string; } | { kind: "lifecycle"; name: "syncRefused"; lane: string; code: "access_changed" | "installation_unavailable"; } ...
facts.grants? readonly object[] grantsSchema
facts.deadlineAt? number ...
facts.ancestry? readonly InstanceId[] ...
question? { repository: string; writer: { kind: "actor"; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; role?: "member" | "owner"; workflow?: { armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; branches: string[]; workflowId: string; runId: string; nodeId: string; }; }; updates: object[]; } undefined
question.repository? string undefined
question.writer? { kind: "actor"; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; role?: "member" | "owner"; workflow?: { armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; branches: string[]; workflowId: string; runId: string; nodeId: string; }; } undefined
question.writer.kind? "actor" undefined
question.writer.actor? | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; } undefined
question.writer.role? "member" | "owner" undefined
question.writer.workflow? { armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; branches: string[]; workflowId: string; runId: string; nodeId: string; } undefined
question.writer.workflow.armedBy? | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; } undefined
question.writer.workflow.branches? string[] undefined
question.writer.workflow.workflowId? string undefined
question.writer.workflow.runId? string undefined
question.writer.workflow.nodeId? string undefined
question.updates? object[] undefined
limits? Readonly<{ cpuMs: number; subRequests: number; }> undefined
tenantId? string & Brand<"OysterTenantId"> defaultTenant

Promise< | { allowed: true; } | { allowed: false; refused: object[]; }>

Signature
syncRefused(
facts,
refusal,
limits?,
tenantId?
): Promise<void>;

An available lane settles a refusal under an active frame with no binding grants.

Parameter Type Default value
facts { instanceId: InstanceId; selection: { instanceId: InstanceId; owner: { kind: "installation" | "deployment"; id: string; }; appId: AppId; releaseId: ReleaseId; authorityVersion: number; }; artifactDigest: Sha256Digest; subject: | { kind: "call"; context: { computerId: string | null; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; backgroundLane?: string; backgroundOrigin?: { method: string; seal: string; }; role?: "member" | "owner"; soleMember?: true; workflow?: { workflowId: string; runId: string; nodeId: string; armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; }; idempotencyKey?: string; }; sessionId?: string; agentPolicy?: { policyRevision: string; grantorMemberId: string; }; method?: { name: string; effect: "read" | "write" | "external"; }; replay?: { lane: string; epoch: number; admitted: readonly string[]; }; } | { kind: "lifecycle"; name: "onGitPush"; eventId: string; } | { kind: "lifecycle"; name: "syncRefused"; lane: string; code: "access_changed" | "installation_unavailable"; }; grants: readonly object[]; deadlineAt: number; ancestry: readonly InstanceId[]; } undefined
facts.instanceId InstanceId instanceIdSchema
facts.selection { instanceId: InstanceId; owner: { kind: "installation" | "deployment"; id: string; }; appId: AppId; releaseId: ReleaseId; authorityVersion: number; } selectionSchema
facts.selection.instanceId? InstanceId instanceIdSchema
facts.selection.owner? { kind: "installation" | "deployment"; id: string; } ownerSchema
facts.selection.owner.kind? "installation" | "deployment" ...
facts.selection.owner.id? string Schema.NonEmptyString
facts.selection.appId? AppId appIdSchema
facts.selection.releaseId? ReleaseId releaseIdSchema
facts.selection.authorityVersion? number ...
facts.artifactDigest? Sha256Digest sha256DigestSchema
facts.subject? | { kind: "call"; context: { computerId: string | null; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; backgroundLane?: string; backgroundOrigin?: { method: string; seal: string; }; role?: "member" | "owner"; soleMember?: true; workflow?: { workflowId: string; runId: string; nodeId: string; armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; }; idempotencyKey?: string; }; sessionId?: string; agentPolicy?: { policyRevision: string; grantorMemberId: string; }; method?: { name: string; effect: "read" | "write" | "external"; }; replay?: { lane: string; epoch: number; admitted: readonly string[]; }; } | { kind: "lifecycle"; name: "onGitPush"; eventId: string; } | { kind: "lifecycle"; name: "syncRefused"; lane: string; code: "access_changed" | "installation_unavailable"; } ...
facts.grants? readonly object[] grantsSchema
facts.deadlineAt? number ...
facts.ancestry? readonly InstanceId[] ...
refusal? { lane: string; code: "access_changed" | "installation_unavailable"; } undefined
refusal.lane? string undefined
refusal.code? "access_changed" | "installation_unavailable" undefined
limits? Readonly<{ cpuMs: number; subRequests: number; }> undefined
tenantId? string & Brand<"OysterTenantId"> defaultTenant

Promise<void>

Signature
gill(
facts,
_api,
source,
input,
limits?,
tenantId?
): Promise<InstanceResult<
| {
viewId: string;
title: string;
state: "empty";
rows: readonly [];
next?: string;
}
| {
viewId: string;
title: string;
state: "error";
rows: readonly [];
reason?: "exec_isolation_required" | "params_required";
error: string;
recovery?: | {
kind: "configure";
param: string;
}
| {
kind: "open";
};
}
| {
viewId: string;
title: string;
state: "full";
rows: readonly object[];
next?: string;
}
| {
options: readonly object[];
next?: string;
}>>;

Invoke a Release-declared Gill in a fresh immutable frame.

Parameter Type Default value
facts { instanceId: InstanceId; selection: { instanceId: InstanceId; owner: { kind: "installation" | "deployment"; id: string; }; appId: AppId; releaseId: ReleaseId; authorityVersion: number; }; artifactDigest: Sha256Digest; subject: | { kind: "call"; context: { computerId: string | null; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; backgroundLane?: string; backgroundOrigin?: { method: string; seal: string; }; role?: "member" | "owner"; soleMember?: true; workflow?: { workflowId: string; runId: string; nodeId: string; armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; }; idempotencyKey?: string; }; sessionId?: string; agentPolicy?: { policyRevision: string; grantorMemberId: string; }; method?: { name: string; effect: "read" | "write" | "external"; }; replay?: { lane: string; epoch: number; admitted: readonly string[]; }; } | { kind: "lifecycle"; name: "onGitPush"; eventId: string; } | { kind: "lifecycle"; name: "syncRefused"; lane: string; code: "access_changed" | "installation_unavailable"; }; grants: readonly object[]; deadlineAt: number; ancestry: readonly InstanceId[]; } undefined
facts.instanceId InstanceId instanceIdSchema
facts.selection { instanceId: InstanceId; owner: { kind: "installation" | "deployment"; id: string; }; appId: AppId; releaseId: ReleaseId; authorityVersion: number; } selectionSchema
facts.selection.instanceId InstanceId instanceIdSchema
facts.selection.owner { kind: "installation" | "deployment"; id: string; } ownerSchema
facts.selection.owner.kind? "installation" | "deployment" ...
facts.selection.owner.id? string Schema.NonEmptyString
facts.selection.appId? AppId appIdSchema
facts.selection.releaseId? ReleaseId releaseIdSchema
facts.selection.authorityVersion? number ...
facts.artifactDigest? Sha256Digest sha256DigestSchema
facts.subject? | { kind: "call"; context: { computerId: string | null; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; backgroundLane?: string; backgroundOrigin?: { method: string; seal: string; }; role?: "member" | "owner"; soleMember?: true; workflow?: { workflowId: string; runId: string; nodeId: string; armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; }; idempotencyKey?: string; }; sessionId?: string; agentPolicy?: { policyRevision: string; grantorMemberId: string; }; method?: { name: string; effect: "read" | "write" | "external"; }; replay?: { lane: string; epoch: number; admitted: readonly string[]; }; } | { kind: "lifecycle"; name: "onGitPush"; eventId: string; } | { kind: "lifecycle"; name: "syncRefused"; lane: string; code: "access_changed" | "installation_unavailable"; } ...
facts.grants? readonly object[] grantsSchema
facts.deadlineAt? number ...
facts.ancestry? readonly InstanceId[] ...
_api? AppApi undefined
source? string undefined
input? { id: string; params?: { [key: string]: string; }; after?: string; options?: string; } undefined
input.id? string undefined
input.params? { [key: string]: string; } undefined
input.after? string undefined
input.options? string undefined
limits? Readonly<{ cpuMs: number; subRequests: number; }> undefined
tenantId? string & Brand<"OysterTenantId"> defaultTenant

Promise<InstanceResult< | { viewId: string; title: string; state: "empty"; rows: readonly []; next?: string; } | { viewId: string; title: string; state: "error"; rows: readonly []; reason?: "exec_isolation_required" | "params_required"; error: string; recovery?: | { kind: "configure"; param: string; } | { kind: "open"; }; } | { viewId: string; title: string; state: "full"; rows: readonly object[]; next?: string; } | { options: readonly object[]; next?: string; }>>

Signature
call(
facts,
_api,
name,
input,
limits?,
tenantId?
): Promise<InstanceResult<Json>>;

Invoke one declared App method; the value is its AppMethodReply wire, which the host handle decodes.

Parameter Type Default value
facts { instanceId: InstanceId; selection: { instanceId: InstanceId; owner: { kind: "installation" | "deployment"; id: string; }; appId: AppId; releaseId: ReleaseId; authorityVersion: number; }; artifactDigest: Sha256Digest; subject: | { kind: "call"; context: { computerId: string | null; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; backgroundLane?: string; backgroundOrigin?: { method: string; seal: string; }; role?: "member" | "owner"; soleMember?: true; workflow?: { workflowId: string; runId: string; nodeId: string; armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; }; idempotencyKey?: string; }; sessionId?: string; agentPolicy?: { policyRevision: string; grantorMemberId: string; }; method?: { name: string; effect: "read" | "write" | "external"; }; replay?: { lane: string; epoch: number; admitted: readonly string[]; }; } | { kind: "lifecycle"; name: "onGitPush"; eventId: string; } | { kind: "lifecycle"; name: "syncRefused"; lane: string; code: "access_changed" | "installation_unavailable"; }; grants: readonly object[]; deadlineAt: number; ancestry: readonly InstanceId[]; } undefined
facts.instanceId InstanceId instanceIdSchema
facts.selection { instanceId: InstanceId; owner: { kind: "installation" | "deployment"; id: string; }; appId: AppId; releaseId: ReleaseId; authorityVersion: number; } selectionSchema
facts.selection.instanceId InstanceId instanceIdSchema
facts.selection.owner { kind: "installation" | "deployment"; id: string; } ownerSchema
facts.selection.owner.kind? "installation" | "deployment" ...
facts.selection.owner.id? string Schema.NonEmptyString
facts.selection.appId? AppId appIdSchema
facts.selection.releaseId? ReleaseId releaseIdSchema
facts.selection.authorityVersion? number ...
facts.artifactDigest? Sha256Digest sha256DigestSchema
facts.subject? | { kind: "call"; context: { computerId: string | null; actor: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; backgroundLane?: string; backgroundOrigin?: { method: string; seal: string; }; role?: "member" | "owner"; soleMember?: true; workflow?: { workflowId: string; runId: string; nodeId: string; armedBy: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; }; idempotencyKey?: string; }; sessionId?: string; agentPolicy?: { policyRevision: string; grantorMemberId: string; }; method?: { name: string; effect: "read" | "write" | "external"; }; replay?: { lane: string; epoch: number; admitted: readonly string[]; }; } | { kind: "lifecycle"; name: "onGitPush"; eventId: string; } | { kind: "lifecycle"; name: "syncRefused"; lane: string; code: "access_changed" | "installation_unavailable"; } ...
facts.grants? readonly object[] grantsSchema
facts.deadlineAt? number ...
facts.ancestry? readonly InstanceId[] ...
_api? AppApi undefined
name? string undefined
input? Json undefined
limits? Readonly<{ cpuMs: number; subRequests: number; }> undefined
tenantId? string & Brand<"OysterTenantId"> defaultTenant

Promise<InstanceResult<Json>>


The non-git standalone root’s MCP owner.

  • OysterMcpOwner<Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }>; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string; AGENT_DIRECTORY?: Readonly<{ getByName: Readonly<{ readCreator: Promise<… | …>; }>; }>; OYSTER_ORIGIN: string; MCP: DurableObjectNamespace<OysterMcpOwner<Readonly<{ LOADER: WorkerLoader; }>>>; RELEASES: R2Bucket; REGISTRY: DurableObjectNamespace<OysterRegistry<Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }> | undefined; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string | undefined; AGENT_DIRECTORY?: Readonly<{ getByName(name: string): Readonly<…>; }> | undefined; … 5 more …; LOADER: WorkerLoader; }>>>; INSTANCES: DurableObjectNamespace<OysterInstance<Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }> | undefined; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string | undefined; AGENT_DIRECTORY?: Readonly<{ getByName(name: string): Readonly<…>; }> | undefined; … 5 more …; LOADER: WorkerLoader; }>>>; LOADER: WorkerLoader; }>, this>
Signature
new OysterMcp(ctx, env): OysterMcp;
Parameter Type
ctx DurableObjectState
env Env

OysterMcp

OysterMcpOwner.constructor

Signature
serve(request, tenant): Promise<Response>;

Trusted host RPC: the namespace and pin are never selected by guest headers.

Parameter Type
request Request
tenant OysterMcpTenantPin

Promise<Response>

OysterMcpOwner.serve


OysterInstallationExecutorclass

Section titled “OysterInstallationExecutor”

Ordinary Worker execution; REGISTRY receives references and receipts only.

  • WorkerEntrypoint<Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }>; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string; AGENT_DIRECTORY?: Readonly<{ getByName: Readonly<{ readCreator: Promise<…>; }>; }>; OYSTER_ORIGIN: string; MCP: DurableObjectNamespace<OysterMcpOwner<Readonly<{ LOADER: WorkerLoader; }>>>; RELEASES: R2Bucket; REGISTRY: DurableObjectNamespace<OysterRegistry<Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }> | undefined; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string | undefined; AGENT_DIRECTORY?: Readonly<{ getByName(name: string): Readonly<…>; }> | undefined; … 5 more …; LOADER: WorkerLoader; }>>>; INSTANCES: DurableObjectNamespace<OysterInstance<Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }> | undefined; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string | undefined; AGENT_DIRECTORY?: Readonly<{ getByName(name: string): Readonly<…>; }> | undefined; … 5 more …; LOADER: WorkerLoader; }>>>; LOADER: WorkerLoader; }>, unknown, this> & object
Signature
new OysterInstallationExecutor(ctx, env): OysterInstallationExecutor;
Parameter Type
ctx ExecutionContext
env Env

OysterInstallationExecutor

Signature
installationWorkerEntrypoint<OysterWorkerEnv>((env, scope) =>
ownerKeyRootHost(env, { scope }),
).constructor;
Signature
run(): Promise<
| {
state: "succeeded";
installation: {
installationId: string;
instanceId: InstanceId | null;
appId: AppId;
release: {
releaseId: ReleaseId;
appId: AppId;
artifact: {
artifactRef: ArtifactRef;
artifactDigest: Sha256Digest;
provenance: {
sourceRevision: SourceRevision;
sourceTreeDigest: Sha256Digest;
buildRecipeDigest: Sha256Digest;
};
};
};
releasePin: "pinned" | "floating";
authority: {
authorityVersion: number;
declaredOperationsDigest: Sha256Digest;
approvedGrants: readonly Readonly<{
capability: | "computer.list"
| "computer.readFile"
| "computer.writeFile"
| "computer.execute"
| "approvals"
| "agent.list"
| "agent.manage"
| "agent.rename"
| "agent.avatar"
| "agent.toolPolicy"
| "agent.read"
| "agent.send"
| "llm.generation"
| "media.generation"
| "games:servers"
| "git.repository"
| "apps.open"
| "apps.call"
| "app.storage"
| "app.events.emit"
| "team.workbenchHost"
| "marketplace.browse"
| "marketplace.purchase"
| "workflow.run"
| "workflow.publish"
| "workflow.arm"
| "world"
| "channels.read"
| "channels.personal.manage";
capabilityApproved: true;
operations: readonly string[];
resources: "tenant-scope" | readonly Readonly<...>[];
}>[];
approval: | Readonly<{
by: | {
kind: "member";
memberId: string;
}
| {
kind: "agent";
agentId: string;
}
| {
kind: "team-key";
keyId: string;
};
at: number;
authorityVersion: number;
}>
| null;
};
status: "enabled" | "disabled" | "deleted";
visibility: "private" | "public";
approvedAnonymousMethods: readonly Readonly<{
name: string;
digest: Sha256Digest;
}>[];
anonymousApproval: | Readonly<{
by: | {
kind: "member";
memberId: string;
}
| {
kind: "agent";
agentId: string;
}
| {
kind: "team-key";
keyId: string;
};
at: number;
authorityVersion: number;
}>
| null;
};
creation: "fresh" | "replacement" | "reminted";
uiCheck: | {
kind: "passed";
}
| {
kind: "failed";
code: "ui_mount_failed";
diagnostics?: {
failedPredicate: | "unexpected_candidate_request"
| "response_status"
| "request_failed"
| "page_error"
| "candidate_not_mounted";
errorName?: | "TypeError"
| "RangeError"
| "SyntaxError"
| "AbortError"
| "TimeoutError"
| "Other"
| "Error";
finalUrlPath: string;
consoleErrors: string[];
pageErrors: string[];
failedRequests: object[];
droppedCount: number;
};
}
| {
kind: "not_checked";
code: | "boot_runner_unavailable"
| "boot_browser_binding_missing"
| "boot_clone_unavailable"
| "boot_timeout"
| "boot_cleanup_failed"
| "ui_check_not_run_on_host";
}
| null;
}
| {
state: "refused";
status: number;
code: string;
}
| {
state: "unconfirmed";
outcome: "cancelled" | "outcome_unknown" | "interrupted";
}>;

Execute the retained command these props name, in its tenant scope.

Promise< | { state: "succeeded"; installation: { installationId: string; instanceId: InstanceId | null; appId: AppId; release: { releaseId: ReleaseId; appId: AppId; artifact: { artifactRef: ArtifactRef; artifactDigest: Sha256Digest; provenance: { sourceRevision: SourceRevision; sourceTreeDigest: Sha256Digest; buildRecipeDigest: Sha256Digest; }; }; }; releasePin: "pinned" | "floating"; authority: { authorityVersion: number; declaredOperationsDigest: Sha256Digest; approvedGrants: readonly Readonly<{ capability: | "computer.list" | "computer.readFile" | "computer.writeFile" | "computer.execute" | "approvals" | "agent.list" | "agent.manage" | "agent.rename" | "agent.avatar" | "agent.toolPolicy" | "agent.read" | "agent.send" | "llm.generation" | "media.generation" | "games:servers" | "git.repository" | "apps.open" | "apps.call" | "app.storage" | "app.events.emit" | "team.workbenchHost" | "marketplace.browse" | "marketplace.purchase" | "workflow.run" | "workflow.publish" | "workflow.arm" | "world" | "channels.read" | "channels.personal.manage"; capabilityApproved: true; operations: readonly string[]; resources: "tenant-scope" | readonly Readonly<…>[]; }>[]; approval: | Readonly<{ by: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; at: number; authorityVersion: number; }> | null; }; status: "enabled" | "disabled" | "deleted"; visibility: "private" | "public"; approvedAnonymousMethods: readonly Readonly<{ name: string; digest: Sha256Digest; }>[]; anonymousApproval: | Readonly<{ by: | { kind: "member"; memberId: string; } | { kind: "agent"; agentId: string; } | { kind: "team-key"; keyId: string; }; at: number; authorityVersion: number; }> | null; }; creation: "fresh" | "replacement" | "reminted"; uiCheck: | { kind: "passed"; } | { kind: "failed"; code: "ui_mount_failed"; diagnostics?: { failedPredicate: | "unexpected_candidate_request" | "response_status" | "request_failed" | "page_error" | "candidate_not_mounted"; errorName?: | "TypeError" | "RangeError" | "SyntaxError" | "AbortError" | "TimeoutError" | "Other" | "Error"; finalUrlPath: string; consoleErrors: string[]; pageErrors: string[]; failedRequests: object[]; droppedCount: number; }; } | { kind: "not_checked"; code: | "boot_runner_unavailable" | "boot_browser_binding_missing" | "boot_clone_unavailable" | "boot_timeout" | "boot_cleanup_failed" | "ui_check_not_run_on_host"; } | null; } | { state: "refused"; status: number; code: string; } | { state: "unconfirmed"; outcome: "cancelled" | "outcome_unknown" | "interrupted"; }>

Signature
installationWorkerEntrypoint<OysterWorkerEnv>((env, scope) =>
ownerKeyRootHost(env, { scope }),
).run;

OysterMcpOwnerEnvtype alias

Section titled “OysterMcpOwnerEnv”
Signature
type OysterMcpOwnerEnv = Readonly<{
LOADER: WorkerLoader;
}>;

Worker Loader used by the existing Mycelium sandbox.


OysterMcpTenantPintype alias

Section titled “OysterMcpTenantPin”
Signature
type OysterMcpTenantPin = Readonly<{
tenantId: string;
origin: string;
}>;

Serialized trusted tenant pin supplied by the selected host.


OysterBindingResulttype alias

Section titled “OysterBindingResult”
Signature
type OysterBindingResult =
Awaited<ReturnType<GitBinding[keyof GitBinding]>> | Schema.Json | undefined;

Native values returned by the standalone Git, event and JSON binding owners.


OysterInvocationHosttype alias

Section titled “OysterInvocationHost”
Signature
type OysterInvocationHost = BackgroundFrameState &
Readonly<{
artifact: Backend;
declaration: AppDeclaration | null;
method?: Readonly<{
name: string;
}>;
}>;

Verified backend custody is captured in the frame, never in a current-context field.


OysterStorageAgentDirectorytype alias

Section titled “OysterStorageAgentDirectory”
Signature
type OysterStorageAgentDirectory = Readonly<{
getByName: Readonly<{
readCreator: Promise<string | null>;
}>;
}>;

Existing fleet directory owner records, resolved by the host rather than App input.


OysterWorkerEnvtype alias

Section titled “OysterWorkerEnv”
Signature
type OysterWorkerEnv = Readonly<{
BROWSER?: BrowserBinding;
OYSTER_OWNER_KEY: string;
OYSTER_OWNER_NAME?: string;
AGENT_DIRECTORY?: OysterStorageAgentDirectory;
OYSTER_ORIGIN: string;
MCP: DurableObjectNamespace<OysterMcpOwner>;
RELEASES: R2Bucket;
REGISTRY: DurableObjectNamespace<OysterRegistry>;
INSTANCES: DurableObjectNamespace<OysterInstance>;
LOADER: WorkerLoader;
}>;

Bindings a standalone Oyster Worker declares in its Wrangler config.


OysterBindingContexttype alias

Section titled “OysterBindingContext”
Signature
type OysterBindingContext<Env> = Readonly<{
env: Env;
scope: TenantScope;
backgroundHost: Promise<
| Readonly<{
approvals?: Readonly<{
submit: Promise<
| {
kind: ...;
recordId: ...;
description: ...;
}
| ApprovalApplyResult>;
}>;
workflows?: (principal) => Promise<
| {
status: Promise<...>;
cancel: Promise<...>;
}
| null>;
computerControl?: (principal) => ComputerControlPort | null;
auth: OysterAuth;
backgroundOriginKey?: () => Promise<CryptoKey>;
artifacts: ArtifactStore;
uiCache?: VerifiedObjectCache;
installations: InstallationStore;
instances: InstanceDirectory;
bootUi: (release) => Promise<UiBootCheckOutcome>;
computerId?: string;
computer?: (principal) => KnapsackComputer | null | Promise<KnapsackComputer | null>;
appToolPolicy?: (actor) =>
| AppToolPolicy
| null
| Promise<AppToolPolicy | null>;
keys?: Readonly<{
live: Promise<Readonly<...> | null>;
}>;
guestLimits?: Partial<GuestLimits>;
mcp?: OysterMcp;
git?: OysterGitHost;
ownerRoutes?: Hono<OysterEnv>;
capabilities?: readonly OysterCapability[];
workbench?: Readonly<{
directory: Promise<Readonly<{
apps: ...;
roles: ...;
computer?: ...;
}>>;
storage: Pick<AppStorageWire, ... | ... | ...> & Readonly<{
events: ...;
}>;
}>;
homeInstallationId?: string;
pageScript?: string;
pageAssets?: () => Promise<{
pageScript: string;
publicHomeScript: string;
fontStyles: string;
loginFontStyles: string;
shellStyles: string;
grantConsentScript: string;
}>;
title?: string;
}>
| null>;
}>;

What a binding row may read from the Instance that owns the frame.

Type Parameter
Env

OysterBindingRowtype alias

Section titled “OysterBindingRow”
Signature
type OysterBindingRow<Env> = Readonly<{
methods: Readonly<Record<string, FrameBindingMethod<OysterBindingResult>>>;
dispatch: Promise<OysterBindingResult>;
}>;

One guest binding: the frame codecs both sides of the RPC share, and the host owner that serves a decoded, granted packet under its captured frame.

Type Parameter
Env

OysterBindingTabletype alias

Section titled “OysterBindingTable”
Signature
type OysterBindingTable<Env> = Readonly<{
APP_STORAGE?: OysterBindingRow<Env>;
APPS?: OysterBindingRow<Env>;
BACKGROUND?: OysterBindingRow<Env>;
GIT?: OysterBindingRow<Env>;
EVENTS?: OysterBindingRow<Env>;
INBOX?: OysterBindingRow<Env>;
AGENTS?: OysterBindingRow<Env>;
COMPUTER?: OysterBindingRow<Env>;
MEDIA?: OysterBindingRow<Env>;
WORKFLOWS?: OysterBindingRow<Env>;
}>;

The bindings an Instance serves, keyed by the closed App binding vocabulary; a missing row is binding_unavailable.

Type Parameter
Env

OysterWorkspacetype alias

Section titled “OysterWorkspace”
Signature
type OysterWorkspace = Readonly<{
computerId: string;
files: FileSource;
computer?: OysterHost["computer"];
}>;

One host-selected workspace shared by App context and capability adapters.

oysterBindingsconstant

Section titled “oysterBindings”
Signature
const oysterBindings: OysterBindingTable<OysterWorkerEnv>;

The plain Oyster host’s bindings: App storage, the read-only catalog and replay admission.

installationWorkerEntrypoint()function

Section titled “installationWorkerEntrypoint()”
Signature
function installationWorkerEntrypoint<Env>(
hostFor,
): (ctx, env) => WorkerEntrypoint<Env, unknown> & object;

A loopback export with ordinary Worker I/O, not another resource or HTTP API.

Type Parameter
Env
Parameter Type
hostFor (env, scope) => | Readonly<{ approvals?: Readonly<{ submit: Promise< | { kind: "pending_approval"; recordId: string; description: { title: …; inputBytes: …; inputSha256: …; }; } | ApprovalApplyResult>; }>; workflows?: (principal) => Promise< | Readonly<{ status: Promise<…>; cancel: Promise<…>; }> | null>; computerControl?: (principal) => | Readonly<{ list: Promise<{ computers: …; nextOffset: …; }>; state: Promise<… | …>; start: Promise<… | …>; create: Promise<… | …>; }> | null; auth: OysterAuth; backgroundOriginKey?: () => Promise<CryptoKey>; artifacts: ArtifactStore; uiCache?: Readonly<{ match: (digest) => Promise<ReadableStream<…> | null>; put: (digest, bytes) => Promise<"stored" | "unstored">; }>; installations: InstallationStore; instances: InstanceDirectory; bootUi: (release) => Promise< | { kind: "passed"; } | { kind: "failed"; code: "ui_mount_failed"; diagnostics?: { failedPredicate: … | … | … | … | …; errorName?: … | … | … | … | … | … | … | …; finalUrlPath: string; consoleErrors: …[]; pageErrors: …[]; failedRequests: …[]; droppedCount: number; }; } | { kind: "not_checked"; code: | "boot_runner_unavailable" | "boot_browser_binding_missing" | "boot_clone_unavailable" | "boot_timeout" | "boot_cleanup_failed" | "ui_check_not_run_on_host"; }>; computerId?: string; computer?: (principal) => | Readonly<{ getCapabilities: (signal) => Promise<…>; call: (capabilityId, input, context) => Promise<…>; }> | Promise< | Readonly<{ getCapabilities: …; call: …; }> | null> | null; appToolPolicy?: (actor) => | { level: "read" | "write"; revision: string; grantedBy: string; } | Promise< | { level: … | …; revision: string; grantedBy: string; } | null> | null; keys?: Readonly<{ live: Promise< | Readonly<{ keyId: …; owner: …; grantVersion: …; grants: …; }> | null>; }>; guestLimits?: Partial<Readonly<{ cpuMs: number; subRequests: number; }>>; mcp?: Readonly<{ handleRequest: (request) => Promise<Response>; close?: () => Promise<void>; }>; git?: Readonly<{ writerOf: Extract<GitWriter, { kind: "actor"; }>; workflowPass?: Promise< | Readonly<{ kind: …; actor: …; role?: …; workflow?: …; }> | null>; buildPass?: Promise< | Readonly<{ kind: …; actor: …; role?: …; workflow?: …; }> | null>; git: Promise<Readonly<{ push: Promise<…>; read: Promise<…>; binding: GitBinding; }>>; }>; ownerRoutes?: Hono<OysterEnv, BlankSchema, "/">; capabilities?: readonly Readonly<object & object>[]; workbench?: Readonly<{ directory: Promise<Readonly<{ apps: readonly …[]; roles: OysterRootRoles; computer?: … | …; }>>; storage: Pick<AppStorageWire, "read" | "write" | "reset"> & Readonly<{ events: Promise<…>; }>; }>; homeInstallationId?: string; pageScript?: string; pageAssets?: () => Promise<{ pageScript: string; publicHomeScript: string; fontStyles: string; loginFontStyles: string; shellStyles: string; grantConsentScript: string; }>; title?: string; }> | Promise<Readonly<{ approvals?: Readonly<{ submit: Promise< | { kind: …; recordId: …; description: …; } | ApprovalApplyResult>; }>; workflows?: (principal) => Promise< | Readonly<{ status: …; cancel: …; }> | null>; computerControl?: (principal) => | Readonly<{ list: Promise<…>; state: Promise<…>; start: Promise<…>; create: Promise<…>; }> | null; auth: OysterAuth; backgroundOriginKey?: () => Promise<CryptoKey>; artifacts: ArtifactStore; uiCache?: Readonly<{ match: (digest) => Promise<… | …>; put: (digest, bytes) => Promise<… | …>; }>; installations: InstallationStore; instances: InstanceDirectory; bootUi: (release) => Promise< | { kind: "passed"; } | { kind: "failed"; code: "ui_mount_failed"; diagnostics?: { failedPredicate: …; errorName?: …; finalUrlPath: …; consoleErrors: …; pageErrors: …; failedRequests: …; droppedCount: …; }; } | { kind: "not_checked"; code: | "boot_runner_unavailable" | "boot_browser_binding_missing" | "boot_clone_unavailable" | "boot_timeout" | "boot_cleanup_failed" | "ui_check_not_run_on_host"; }>; computerId?: string; computer?: (principal) => | Readonly<{ getCapabilities: (signal) => …; call: (capabilityId, input, context) => …; }> | Promise<Readonly<…> | null> | null; appToolPolicy?: (actor) => | { level: "read" | "write"; revision: string; grantedBy: string; } | Promise< | { level: …; revision: …; grantedBy: …; } | null> | null; keys?: Readonly<{ live: Promise<Readonly<…> | null>; }>; guestLimits?: Partial<Readonly<{ cpuMs: number; subRequests: number; }>>; mcp?: Readonly<{ handleRequest: (request) => Promise<Response>; close?: () => Promise<…>; }>; git?: Readonly<{ writerOf: Extract<GitWriter, { kind: "actor"; }>; workflowPass?: Promise<Readonly<…> | null>; buildPass?: Promise<Readonly<…> | null>; git: Promise<Readonly<{ push: …; read: …; binding: …; }>>; }>; ownerRoutes?: Hono<OysterEnv, BlankSchema, "/">; capabilities?: readonly Readonly<object & object>[]; workbench?: Readonly<{ directory: Promise<Readonly<{ apps: …; roles: …; computer?: …; }>>; storage: Pick<AppStorageWire, … | … | …> & Readonly<{ events: …; }>; }>; homeInstallationId?: string; pageScript?: string; pageAssets?: () => Promise<{ pageScript: string; publicHomeScript: string; fontStyles: string; loginFontStyles: string; shellStyles: string; grantConsentScript: string; }>; title?: string; }>>

(ctx, env) => WorkerEntrypoint<Env, unknown> & object


createOysterMcpOwner()function

Section titled “createOysterMcpOwner()”
Signature
function createOysterMcpOwner<Env>(host): (ctx, env) => OysterMcpOwner<Env>;

Bind the owner to the deployment’s existing host factory and options.

Type Parameter
Env extends Readonly<{ LOADER: WorkerLoader; }>
Parameter Type
host (env, scope) => | Readonly<{ approvals?: Readonly<{ submit: Promise< | { kind: "pending_approval"; recordId: string; description: { title: …; inputBytes: …; inputSha256: …; }; } | ApprovalApplyResult>; }>; workflows?: (principal) => Promise< | Readonly<{ status: Promise<…>; cancel: Promise<…>; }> | null>; computerControl?: (principal) => | Readonly<{ list: Promise<{ computers: …; nextOffset: …; }>; state: Promise<… | …>; start: Promise<… | …>; create: Promise<… | …>; }> | null; auth: OysterAuth; backgroundOriginKey?: () => Promise<CryptoKey>; artifacts: ArtifactStore; uiCache?: Readonly<{ match: (digest) => Promise<ReadableStream<…> | null>; put: (digest, bytes) => Promise<"stored" | "unstored">; }>; installations: InstallationStore; instances: InstanceDirectory; bootUi: (release) => Promise< | { kind: "passed"; } | { kind: "failed"; code: "ui_mount_failed"; diagnostics?: { failedPredicate: … | … | … | … | …; errorName?: … | … | … | … | … | … | … | …; finalUrlPath: string; consoleErrors: …[]; pageErrors: …[]; failedRequests: …[]; droppedCount: number; }; } | { kind: "not_checked"; code: | "boot_runner_unavailable" | "boot_browser_binding_missing" | "boot_clone_unavailable" | "boot_timeout" | "boot_cleanup_failed" | "ui_check_not_run_on_host"; }>; computerId?: string; computer?: (principal) => | Readonly<{ getCapabilities: (signal) => Promise<…>; call: (capabilityId, input, context) => Promise<…>; }> | Promise< | Readonly<{ getCapabilities: …; call: …; }> | null> | null; appToolPolicy?: (actor) => | { level: "read" | "write"; revision: string; grantedBy: string; } | Promise< | { level: … | …; revision: string; grantedBy: string; } | null> | null; keys?: Readonly<{ live: Promise< | Readonly<{ keyId: …; owner: …; grantVersion: …; grants: …; }> | null>; }>; guestLimits?: Partial<Readonly<{ cpuMs: number; subRequests: number; }>>; mcp?: Readonly<{ handleRequest: (request) => Promise<Response>; close?: () => Promise<void>; }>; git?: Readonly<{ writerOf: Extract<GitWriter, { kind: "actor"; }>; workflowPass?: Promise< | Readonly<{ kind: …; actor: …; role?: …; workflow?: …; }> | null>; buildPass?: Promise< | Readonly<{ kind: …; actor: …; role?: …; workflow?: …; }> | null>; git: Promise<Readonly<{ push: Promise<…>; read: Promise<…>; binding: GitBinding; }>>; }>; ownerRoutes?: Hono<OysterEnv, BlankSchema, "/">; capabilities?: readonly Readonly<object & object>[]; workbench?: Readonly<{ directory: Promise<Readonly<{ apps: readonly …[]; roles: OysterRootRoles; computer?: … | …; }>>; storage: Pick<AppStorageWire, "read" | "write" | "reset"> & Readonly<{ events: Promise<…>; }>; }>; homeInstallationId?: string; pageScript?: string; pageAssets?: () => Promise<{ pageScript: string; publicHomeScript: string; fontStyles: string; loginFontStyles: string; shellStyles: string; grantConsentScript: string; }>; title?: string; }> | Promise<Readonly<{ approvals?: Readonly<{ submit: Promise< | { kind: …; recordId: …; description: …; } | ApprovalApplyResult>; }>; workflows?: (principal) => Promise< | Readonly<{ status: …; cancel: …; }> | null>; computerControl?: (principal) => | Readonly<{ list: Promise<…>; state: Promise<…>; start: Promise<…>; create: Promise<…>; }> | null; auth: OysterAuth; backgroundOriginKey?: () => Promise<CryptoKey>; artifacts: ArtifactStore; uiCache?: Readonly<{ match: (digest) => Promise<… | …>; put: (digest, bytes) => Promise<… | …>; }>; installations: InstallationStore; instances: InstanceDirectory; bootUi: (release) => Promise< | { kind: "passed"; } | { kind: "failed"; code: "ui_mount_failed"; diagnostics?: { failedPredicate: …; errorName?: …; finalUrlPath: …; consoleErrors: …; pageErrors: …; failedRequests: …; droppedCount: …; }; } | { kind: "not_checked"; code: | "boot_runner_unavailable" | "boot_browser_binding_missing" | "boot_clone_unavailable" | "boot_timeout" | "boot_cleanup_failed" | "ui_check_not_run_on_host"; }>; computerId?: string; computer?: (principal) => | Readonly<{ getCapabilities: (signal) => …; call: (capabilityId, input, context) => …; }> | Promise<Readonly<…> | null> | null; appToolPolicy?: (actor) => | { level: "read" | "write"; revision: string; grantedBy: string; } | Promise< | { level: …; revision: …; grantedBy: …; } | null> | null; keys?: Readonly<{ live: Promise<Readonly<…> | null>; }>; guestLimits?: Partial<Readonly<{ cpuMs: number; subRequests: number; }>>; mcp?: Readonly<{ handleRequest: (request) => Promise<Response>; close?: () => Promise<…>; }>; git?: Readonly<{ writerOf: Extract<GitWriter, { kind: "actor"; }>; workflowPass?: Promise<Readonly<…> | null>; buildPass?: Promise<Readonly<…> | null>; git: Promise<Readonly<{ push: …; read: …; binding: …; }>>; }>; ownerRoutes?: Hono<OysterEnv, BlankSchema, "/">; capabilities?: readonly Readonly<object & object>[]; workbench?: Readonly<{ directory: Promise<Readonly<{ apps: …; roles: …; computer?: …; }>>; storage: Pick<AppStorageWire, … | … | …> & Readonly<{ events: …; }>; }>; homeInstallationId?: string; pageScript?: string; pageAssets?: () => Promise<{ pageScript: string; publicHomeScript: string; fontStyles: string; loginFontStyles: string; shellStyles: string; grantConsentScript: string; }>; title?: string; }>>

(ctx, env) => OysterMcpOwner<Env>


r2FileSource()function

Section titled “r2FileSource()”
Signature
function r2FileSource(bucket, prefix): FileSource;

Files in an R2 bucket under prefix (one workspace per prefix).

Parameter Type
bucket R2Bucket
prefix string

FileSource


oysterBindingEntrypoint()function

Section titled “oysterBindingEntrypoint()”
Signature
function oysterBindingEntrypoint<Env>(table): typeof WorkerEntrypoint;

The one guest binding entrypoint over table. Every binding in a frame is this export with its own props; each packet returns to its originating Instance, which serves it from the same table.

Type Parameter
Env extends Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }>; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string; AGENT_DIRECTORY?: Readonly<{ getByName: Readonly<{ readCreator: Promise<string | null>; }>; }>; OYSTER_ORIGIN: string; MCP: DurableObjectNamespace<OysterMcpOwner<Readonly<{ LOADER: WorkerLoader; }>>>; RELEASES: R2Bucket; REGISTRY: DurableObjectNamespace<OysterRegistry<Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }> | undefined; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string | undefined; AGENT_DIRECTORY?: Readonly<{ getByName(name: string): Readonly<…>; }> | undefined; … 5 more …; LOADER: WorkerLoader; }>>>; INSTANCES: DurableObjectNamespace<OysterInstance<Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }> | undefined; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string | undefined; AGENT_DIRECTORY?: Readonly<{ getByName(name: string): Readonly<…>; }> | undefined; … 5 more …; LOADER: WorkerLoader; }>>>; LOADER: WorkerLoader; }>
Parameter Type
table OysterBindingTable<Env>

typeof WorkerEntrypoint


serveOysterBootCapability()function

Section titled “serveOysterBootCapability()”
Signature
function serveOysterBootCapability(
request,
env,
scope,
): Promise<Response | null>;

Resolve a scoped boot URL through the registry-backed HTTPS asset route.

Parameter Type
request Request
env OysterWorkerEnv
scope TenantScope

Promise<Response | null>


oysterWorkerHost()function

Section titled “oysterWorkerHost()”
Signature
function oysterWorkerHost(env, auth, options?): OysterHost;

Create an Oyster host backed by this Worker environment’s registry, artifacts, Instances, and boot-check service.

Parameter Type
env OysterWorkerEnv
auth OysterAuth
options Pick<Readonly<{ approvals?: Readonly<{ submit: Promise< | { kind: "pending_approval"; recordId: string; description: { title: …; inputBytes: …; inputSha256: …; }; } | ApprovalApplyResult>; }>; workflows?: (principal) => Promise< | Readonly<{ status: Promise<…>; cancel: Promise<…>; }> | null>; computerControl?: (principal) => | Readonly<{ list: Promise<{ computers: …; nextOffset: …; }>; state: Promise<… | …>; start: Promise<… | …>; create: Promise<… | …>; }> | null; auth: OysterAuth; backgroundOriginKey?: () => Promise<CryptoKey>; artifacts: ArtifactStore; uiCache?: Readonly<{ match: (digest) => Promise<ReadableStream<…> | null>; put: (digest, bytes) => Promise<"stored" | "unstored">; }>; installations: InstallationStore; instances: InstanceDirectory; bootUi: (release) => Promise< | { kind: "passed"; } | { kind: "failed"; code: "ui_mount_failed"; diagnostics?: { failedPredicate: … | … | … | … | …; errorName?: … | … | … | … | … | … | … | …; finalUrlPath: string; consoleErrors: …[]; pageErrors: …[]; failedRequests: …[]; droppedCount: number; }; } | { kind: "not_checked"; code: | "boot_runner_unavailable" | "boot_browser_binding_missing" | "boot_clone_unavailable" | "boot_timeout" | "boot_cleanup_failed" | "ui_check_not_run_on_host"; }>; computerId?: string; computer?: (principal) => | Readonly<{ getCapabilities: (signal) => Promise<…>; call: (capabilityId, input, context) => Promise<…>; }> | Promise< | Readonly<{ getCapabilities: …; call: …; }> | null> | null; appToolPolicy?: (actor) => | { level: "read" | "write"; revision: string; grantedBy: string; } | Promise< | { level: … | …; revision: string; grantedBy: string; } | null> | null; keys?: Readonly<{ live: Promise< | Readonly<{ keyId: …; owner: …; grantVersion: …; grants: …; }> | null>; }>; guestLimits?: Partial<Readonly<{ cpuMs: number; subRequests: number; }>>; mcp?: Readonly<{ handleRequest: (request) => Promise<Response>; close?: () => Promise<void>; }>; git?: Readonly<{ writerOf: Extract<GitWriter, { kind: "actor"; }>; workflowPass?: Promise< | Readonly<{ kind: …; actor: …; role?: …; workflow?: …; }> | null>; buildPass?: Promise< | Readonly<{ kind: …; actor: …; role?: …; workflow?: …; }> | null>; git: Promise<Readonly<{ push: Promise<…>; read: Promise<…>; binding: GitBinding; }>>; }>; ownerRoutes?: Hono<OysterEnv, BlankSchema, "/">; capabilities?: readonly Readonly<object & object>[]; workbench?: Readonly<{ directory: Promise<Readonly<{ apps: readonly …[]; roles: OysterRootRoles; computer?: … | …; }>>; storage: Pick<AppStorageWire, "read" | "write" | "reset"> & Readonly<{ events: Promise<…>; }>; }>; homeInstallationId?: string; pageScript?: string; pageAssets?: () => Promise<{ pageScript: string; publicHomeScript: string; fontStyles: string; loginFontStyles: string; shellStyles: string; grantConsentScript: string; }>; title?: string; }>, "appToolPolicy" | "guestLimits"> & Readonly<{ workspace?: Readonly<{ computerId: string; files: FileSource; computer?: (principal) => | Readonly<{ getCapabilities: …; call: …; }> | Promise<… | …> | null; }>; scope?: Readonly<{ tenantId: string & Brand<"OysterTenantId">; origin: string; durableName: string; computerName: string; workspacePrefix: string; repositoryPrefix: string; }>; }>

OysterHost


createOysterWorker()function

Section titled “createOysterWorker()”
Signature
function createOysterWorker(options?): ExportedHandler<Readonly<{
BROWSER?: Readonly<{
fetch: HttpFetch;
}>;
OYSTER_OWNER_KEY: string;
OYSTER_OWNER_NAME?: string;
AGENT_DIRECTORY?: Readonly<{
getByName: Readonly<{
readCreator: Promise<string | null>;
}>;
}>;
OYSTER_ORIGIN: string;
MCP: DurableObjectNamespace<OysterMcpOwner<Readonly<{
LOADER: WorkerLoader;
}>>>;
RELEASES: R2Bucket;
REGISTRY: DurableObjectNamespace<OysterRegistry<Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }> | undefined; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string | undefined; AGENT_DIRECTORY?: Readonly<{ getByName(name: string): Readonly<...>; }> | undefined; ... 5 more ...; LOADER: WorkerLoader; }>>>;
INSTANCES: DurableObjectNamespace<OysterInstance<Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }> | undefined; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string | undefined; AGENT_DIRECTORY?: Readonly<{ getByName(name: string): Readonly<...>; }> | undefined; ... 5 more ...; LOADER: WorkerLoader; }>>>;
LOADER: WorkerLoader;
}>>;

The standalone Worker’s fetch handler; frontend hosts are cached per env. MCP transports belong to the tenant Durable Object, independent of that cache.

Parameter Type
options Pick<OysterHost, "guestLimits">

ExportedHandler<Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }>; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string; AGENT_DIRECTORY?: Readonly<{ getByName: Readonly<{ readCreator: Promise<string | null>; }>; }>; OYSTER_ORIGIN: string; MCP: DurableObjectNamespace<OysterMcpOwner<Readonly<{ LOADER: WorkerLoader; }>>>; RELEASES: R2Bucket; REGISTRY: DurableObjectNamespace<OysterRegistry<Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }> | undefined; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string | undefined; AGENT_DIRECTORY?: Readonly<{ getByName(name: string): Readonly<…>; }> | undefined; … 5 more …; LOADER: WorkerLoader; }>>>; INSTANCES: DurableObjectNamespace<OysterInstance<Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }> | undefined; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string | undefined; AGENT_DIRECTORY?: Readonly<{ getByName(name: string): Readonly<…>; }> | undefined; … 5 more …; LOADER: WorkerLoader; }>>>; LOADER: WorkerLoader; }>>

Re-exports r2ArtifactStore


Re-exports ownerKeyAuth