@fungi.computer/computer 0.0.0-stage → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Dockerfile +85 -0
- package/LICENSE +21 -0
- package/README.md +228 -2
- package/container/computer-init.mjs +119 -0
- package/container/computer-start.sh +24 -0
- package/container/package.json +14 -0
- package/container/pnpm-lock.yaml +378 -0
- package/container/pnpm-workspace.yaml +5 -0
- package/container/resource-bounds.mjs +54 -0
- package/container/runtime-privileges.cc +37 -0
- package/container/runtime-privileges.mjs +11 -0
- package/container/terminal-assets/README.md +35 -0
- package/container/terminal-assets/bashrc +49 -0
- package/container/terminal-assets/git-prompt.sh +586 -0
- package/container/terminal-protocol.mjs +58 -0
- package/container/terminal-runtime.mjs +10 -0
- package/container/terminal-server.mjs +243 -0
- package/dist/apply-patch/LICENSE.codex +201 -0
- package/dist/apply-patch/build.mjs +98 -0
- package/dist/apply-patch/cache.mjs +168 -0
- package/dist/apply-patch/compile.mjs +199 -0
- package/dist/apply-patch/docker/darwin.Dockerfile +15 -0
- package/dist/apply-patch/docker/linux-arm64.Dockerfile +38 -0
- package/dist/apply-patch/docker/linux-x64.Dockerfile +23 -0
- package/dist/apply-patch/main.rs +320 -0
- package/dist/apply-patch/notices.mjs +44 -0
- package/dist/apply-patch/pin.mjs +8 -0
- package/dist/apply-patch/toolchain.mjs +39 -0
- package/dist/computer-backends.d.ts +94 -0
- package/dist/computer-backends.js +103 -0
- package/dist/computerd.cjs +18010 -0
- package/dist/container-policy.d.ts +7 -0
- package/dist/container-policy.js +24 -0
- package/dist/container-system-trust.d.ts +8 -0
- package/dist/container-system-trust.js +66 -0
- package/dist/egress-policy.d.ts +89 -0
- package/dist/egress-policy.js +240 -0
- package/dist/execution-result.d.ts +3 -0
- package/dist/execution-result.js +28 -0
- package/dist/files-patch.d.ts +20 -0
- package/dist/files-patch.js +108 -0
- package/dist/files.d.ts +75 -0
- package/dist/files.js +136 -0
- package/dist/fleet/admission.d.ts +14 -0
- package/dist/fleet/admission.js +10 -0
- package/dist/fleet/backing.d.ts +52 -0
- package/dist/fleet/backing.js +242 -0
- package/dist/fleet/computers.d.ts +62 -0
- package/dist/fleet/computers.js +35 -0
- package/dist/fleet/index.d.ts +11 -0
- package/dist/fleet/index.js +11 -0
- package/dist/fleet/inventory-wire.d.ts +29 -0
- package/dist/fleet/inventory-wire.js +15 -0
- package/dist/fleet/inventory.d.ts +24 -0
- package/dist/fleet/inventory.js +152 -0
- package/dist/fleet/lifecycle.d.ts +99 -0
- package/dist/fleet/lifecycle.js +423 -0
- package/dist/fleet/runtime-usage.d.ts +50 -0
- package/dist/fleet/runtime-usage.js +145 -0
- package/dist/fleet/slots.d.ts +30 -0
- package/dist/fleet/slots.js +46 -0
- package/dist/fleet/wire.d.ts +228 -0
- package/dist/fleet/wire.js +127 -0
- package/dist/host-config.d.ts +12 -0
- package/dist/host-config.js +10 -0
- package/dist/index.d.ts +282 -0
- package/dist/index.js +1237 -0
- package/dist/light-shell.d.ts +44 -0
- package/dist/light-shell.js +376 -0
- package/dist/local-backend.d.ts +52 -0
- package/dist/local-backend.js +143 -0
- package/dist/metered-container-host.d.ts +26 -0
- package/dist/metered-container-host.js +48 -0
- package/dist/on-box-vm.d.ts +119 -0
- package/dist/on-box-vm.js +294 -0
- package/dist/operation-contract.d.ts +456 -0
- package/dist/operation-contract.js +452 -0
- package/dist/operation-record.d.ts +50 -0
- package/dist/operation-record.js +162 -0
- package/dist/preview.d.ts +55 -0
- package/dist/preview.js +151 -0
- package/dist/process-inventory.d.ts +80 -0
- package/dist/process-inventory.js +427 -0
- package/dist/pull-pending.d.ts +26 -0
- package/dist/pull-pending.js +35 -0
- package/dist/team-candidate-builder.mjs +28170 -0
- package/dist/transport-backend.d.ts +3 -0
- package/dist/transport-backend.js +99 -0
- package/dist/workspace-stream.d.ts +2 -0
- package/dist/workspace-stream.js +31 -0
- package/package.json +126 -3
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { Workspace, WorkspaceProxy, WorkspaceServiceProxy, type WorkspaceStubHost } from "@fungi.computer/cloudflare-computer";
|
|
2
|
+
import { type WorkerShellBackendOptions } from "@fungi.computer/cloudflare-computer/backends/worker-shell";
|
|
3
|
+
import { type IWorkspaceContainerAPI } from "@fungi.computer/cloudflare-computer/backends/container";
|
|
4
|
+
import { DurableObject } from "cloudflare:workers";
|
|
5
|
+
import type { FilesPort } from "@fungi.computer/knapsack";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { type ComputerExecutionBudget, type ComputerExecRequest, type ComputerOperationResult, type ComputerFileReadInput, type ComputerFileByteReadInput, type ComputerFileReplacement, type ComputerFileReplacementResult, type ComputerValue, writeInputSchema, writeOutputSchema, type ComputerProcess } from "./operation-contract.js";
|
|
8
|
+
import { createWorkspaceFilesPort } from "./files.js";
|
|
9
|
+
import { OnBoxVmContainerHost, type OnBoxVmEnv, type OnBoxVmPlacement } from "./on-box-vm.js";
|
|
10
|
+
import { type AttachedBackend, type AttachedBackendView, type BackendNeed, type BackendRoute, type ContainerRuntimeStart, type HostedBacking } from "./computer-backends.js";
|
|
11
|
+
import { LocalBackendConnections } from "./local-backend.js";
|
|
12
|
+
/** The exact RPC surface of one Computer Durable Object. */
|
|
13
|
+
export type ComputerRpc = WorkspaceStubHost & Readonly<{
|
|
14
|
+
getCapabilities: ComputerDO["getCapabilities"];
|
|
15
|
+
call: (capabilityId: ComputerValue, input: ComputerValue) => Promise<ComputerValue>;
|
|
16
|
+
readFile: (input: ComputerFileReadInput) => Promise<ReadableStream<Uint8Array>>;
|
|
17
|
+
writeFile: (input: ComputerFileReadInput, content: ReadableStream<Uint8Array>) => Promise<void>;
|
|
18
|
+
exposePort: (input: {
|
|
19
|
+
port: number;
|
|
20
|
+
}) => Promise<{
|
|
21
|
+
port: number;
|
|
22
|
+
exposed: boolean;
|
|
23
|
+
}>;
|
|
24
|
+
listPorts: () => Promise<{
|
|
25
|
+
ports: number[];
|
|
26
|
+
}>;
|
|
27
|
+
unexposePort: (input: {
|
|
28
|
+
port: number;
|
|
29
|
+
}) => Promise<{
|
|
30
|
+
port: number;
|
|
31
|
+
removed: boolean;
|
|
32
|
+
}>;
|
|
33
|
+
replaceFileIfUnchanged: (input: ComputerFileReplacement) => Promise<ComputerFileReplacementResult>;
|
|
34
|
+
}>;
|
|
35
|
+
/** The Cloudflare binding projection needed to select one named Computer. */
|
|
36
|
+
export type ComputerNamespace = Readonly<{
|
|
37
|
+
getByName: (name: string) => ComputerRpc;
|
|
38
|
+
}>;
|
|
39
|
+
/** Cloudflare bindings required by the first durable Computer host. */
|
|
40
|
+
export type ComputerEnv = OnBoxVmEnv & Readonly<{
|
|
41
|
+
/** Host-supplied native loopback binding; not a process environment variable. */
|
|
42
|
+
COMPUTER_EGRESS?: (options: {
|
|
43
|
+
props: {
|
|
44
|
+
computerObjectId: string;
|
|
45
|
+
};
|
|
46
|
+
}) => Fetcher;
|
|
47
|
+
/** Platform kill switch for container-backed Computer operations. */
|
|
48
|
+
HOSTED_COMPUTERS?: string;
|
|
49
|
+
LOADER?: NonNullable<WorkerShellBackendOptions["loader"]>;
|
|
50
|
+
}>;
|
|
51
|
+
/** A command could not be placed on an attached backend. */
|
|
52
|
+
export declare class ComputerBackendUnavailableError extends Error {
|
|
53
|
+
readonly code: "no_backend" | "backend_unavailable";
|
|
54
|
+
constructor(code: "no_backend" | "backend_unavailable");
|
|
55
|
+
}
|
|
56
|
+
declare class ComputerDurableObject extends DurableObject<ComputerEnv> {
|
|
57
|
+
get bindings(): ComputerEnv;
|
|
58
|
+
get state(): DurableObjectState;
|
|
59
|
+
}
|
|
60
|
+
declare const ContainerComputerBase: typeof ComputerDurableObject & (new (...args: any[]) => ComputerDurableObject & {
|
|
61
|
+
getWorkspaceContainer(): import("@fungi.computer/cloudflare-computer/backends/container").WorkspaceContainerAPI;
|
|
62
|
+
});
|
|
63
|
+
/**
|
|
64
|
+
* The Computer owns its Workspace. `@cloudflare/computer` fixes a Workspace's
|
|
65
|
+
* backends when it is constructed, so the Workspace is rebuilt whenever the
|
|
66
|
+
* attached set changes; the previous generation is closed and a command still
|
|
67
|
+
* running on it ends as a transport failure. A local machine connecting or
|
|
68
|
+
* leaving changes status, not the set, and rebuilds nothing.
|
|
69
|
+
*/
|
|
70
|
+
declare class ContainerComputer extends ContainerComputerBase {
|
|
71
|
+
#private;
|
|
72
|
+
/** Parked dial-ins from attached machines; survives Workspace rebuilds. */
|
|
73
|
+
readonly localConnections: LocalBackendConnections;
|
|
74
|
+
constructor(ctx: DurableObjectState, env: ComputerEnv);
|
|
75
|
+
getWorkspaceContainer(): import("@fungi.computer/cloudflare-computer/backends/container").WorkspaceContainerAPI;
|
|
76
|
+
/**
|
|
77
|
+
* This Computer's attached backends, in attach order. The standalone
|
|
78
|
+
* runtime attaches its Worker's default host; a Computer owner (Hub)
|
|
79
|
+
* overrides this with the list its Team projected down.
|
|
80
|
+
*/
|
|
81
|
+
protected attachedBackends(): readonly AttachedBackend[];
|
|
82
|
+
/** A runtime of a hosted backend started; owners meter it. */
|
|
83
|
+
protected containerRuntimeStarted(start: ContainerRuntimeStart): void;
|
|
84
|
+
/** The single routing decision over this Computer's attached backends. */
|
|
85
|
+
protected routeBackend(backend: string | undefined, need: BackendNeed): Extract<BackendRoute, {
|
|
86
|
+
kind: "routed";
|
|
87
|
+
}>;
|
|
88
|
+
/**
|
|
89
|
+
* The hosted backend that terminals, processes and ports use: the first in
|
|
90
|
+
* the default order, or none when only local machines are attached.
|
|
91
|
+
*/
|
|
92
|
+
protected hostedRoute(): Readonly<{
|
|
93
|
+
id: string;
|
|
94
|
+
backing: HostedBacking;
|
|
95
|
+
}> | undefined;
|
|
96
|
+
/** The hosted route, or the typed failure a caller maps to unavailable. */
|
|
97
|
+
protected requireHostedRoute(): Readonly<{
|
|
98
|
+
id: string;
|
|
99
|
+
backing: HostedBacking;
|
|
100
|
+
}>;
|
|
101
|
+
/** This Computer's attached backends with their live status. */
|
|
102
|
+
protected describeBackends(): AttachedBackendView[];
|
|
103
|
+
/** The metered container host behind one hosted backend. */
|
|
104
|
+
protected hostedContainerHost(backing: HostedBacking): IWorkspaceContainerAPI;
|
|
105
|
+
/** The on-box VM host service for `hostId`, one per placement. */
|
|
106
|
+
protected onBoxVmHost(hostId: string): OnBoxVmContainerHost;
|
|
107
|
+
/** Let the consuming owner admit boots while preserving the runtime host seam. */
|
|
108
|
+
protected createOnBoxVmHost(placement: OnBoxVmPlacement): OnBoxVmContainerHost;
|
|
109
|
+
/** Whether a hosted backend's runtime is running now. */
|
|
110
|
+
protected containerRunning(backing: HostedBacking): Promise<boolean>;
|
|
111
|
+
/** A consuming host supplies its admitted shell loopback context. */
|
|
112
|
+
protected workerShellContext(): Pick<DurableObjectState, "exports">;
|
|
113
|
+
/** The Workspace for the current attached set, rebuilt when it changes. */
|
|
114
|
+
protected workspace(): Workspace;
|
|
115
|
+
/**
|
|
116
|
+
* The current Workspace once its mount index is ready and its guest mount
|
|
117
|
+
* root exists. Every backend mounts `/workspace`, so a host write there
|
|
118
|
+
* (such as a Workflow step's one-shot Git credential file) must not depend
|
|
119
|
+
* on a guest having booted first.
|
|
120
|
+
*/
|
|
121
|
+
protected readyWorkspace(): Promise<Workspace>;
|
|
122
|
+
/** `getWorkspace(stub)` reaches the current generation through this door. */
|
|
123
|
+
__getWorkspaceStub(): Promise<import("@fungi.computer/cloudflare-computer").WorkspaceStub>;
|
|
124
|
+
/**
|
|
125
|
+
* Backend doors. An attached machine dials in on its public connect path.
|
|
126
|
+
* A container backend's `/ws` upgrade and egress: the platform container's
|
|
127
|
+
* arrive as `/ws` through WorkspaceProxy; an on-box VM's through the
|
|
128
|
+
* verified ingress door as `/__vm/<hostId>/ws`.
|
|
129
|
+
*/
|
|
130
|
+
fetch(request: Request): Promise<Response>;
|
|
131
|
+
}
|
|
132
|
+
/** One upstream Cloudflare Workspace that advertises and runs its capabilities. */
|
|
133
|
+
export declare class ComputerDO extends ContainerComputer {
|
|
134
|
+
#private;
|
|
135
|
+
/** Persist the bounded set of ports admitted for preview on this Computer. */
|
|
136
|
+
exposePort(input: {
|
|
137
|
+
port: number;
|
|
138
|
+
}): Promise<{
|
|
139
|
+
port: number;
|
|
140
|
+
exposed: boolean;
|
|
141
|
+
}>;
|
|
142
|
+
/** Host checks current authority at the write boundary. */
|
|
143
|
+
protected exposePortAfterAcceptance(input: {
|
|
144
|
+
port: number;
|
|
145
|
+
}, accept: () => void): Promise<{
|
|
146
|
+
port: number;
|
|
147
|
+
exposed: boolean;
|
|
148
|
+
}>;
|
|
149
|
+
/** List only the durable port-admission metadata for this Computer. */
|
|
150
|
+
listPorts(): Promise<{
|
|
151
|
+
ports: number[];
|
|
152
|
+
}>;
|
|
153
|
+
/** Host checks current authority before returning the admitted port set. */
|
|
154
|
+
protected listPortsAfterAcceptance(accept: () => void): Promise<{
|
|
155
|
+
ports: number[];
|
|
156
|
+
}>;
|
|
157
|
+
/** Remove one port from the Computer's durable preview admission set. */
|
|
158
|
+
unexposePort(input: {
|
|
159
|
+
port: number;
|
|
160
|
+
}): Promise<{
|
|
161
|
+
port: number;
|
|
162
|
+
removed: boolean;
|
|
163
|
+
}>;
|
|
164
|
+
/** Host checks current authority at the write boundary. */
|
|
165
|
+
protected unexposePortAfterAcceptance(input: {
|
|
166
|
+
port: number;
|
|
167
|
+
}, accept: () => void): Promise<{
|
|
168
|
+
port: number;
|
|
169
|
+
removed: boolean;
|
|
170
|
+
}>;
|
|
171
|
+
/**
|
|
172
|
+
* Proxy one admitted request to this Computer's container. The host must
|
|
173
|
+
* pass a Request whose URL is service-relative, using the `http://localhost`
|
|
174
|
+
* placeholder origin and a path/query with the Hub route prefix removed.
|
|
175
|
+
*/
|
|
176
|
+
protected portPreviewAfterAcceptance(portInput: number, request: Request, accept: () => void): Promise<Response>;
|
|
177
|
+
getCapabilities(): Promise<{
|
|
178
|
+
id: string;
|
|
179
|
+
name: string;
|
|
180
|
+
kind: string;
|
|
181
|
+
description: string;
|
|
182
|
+
parameters: Record<string, unknown>;
|
|
183
|
+
output: Record<string, unknown>;
|
|
184
|
+
}[]>;
|
|
185
|
+
/** Read bounded native bytes before releasing the single-owner Workspace. */
|
|
186
|
+
readFile(input: ComputerFileReadInput): Promise<ReadableStream<Uint8Array>>;
|
|
187
|
+
/** Resource hosts may accept authority after the file queue and Workspace are ready. */
|
|
188
|
+
protected readFileAfterAcceptance(input: ComputerFileByteReadInput, accept: () => void, maximumBytes?: number): Promise<{
|
|
189
|
+
offset: number;
|
|
190
|
+
total: number;
|
|
191
|
+
length: number;
|
|
192
|
+
body: ReadableStream<Uint8Array<ArrayBufferLike>>;
|
|
193
|
+
}>;
|
|
194
|
+
/** Completion means the maintained Workspace writer consumed and committed the stream. */
|
|
195
|
+
writeFile(input: ComputerFileReadInput, content: ReadableStream<Uint8Array>): Promise<void>;
|
|
196
|
+
/** Resource hosts may accept authority after the file queue and Workspace are ready. */
|
|
197
|
+
protected writeFileAfterAcceptance(input: ComputerFileReadInput, content: ReadableStream<Uint8Array>, accept: () => void): Promise<void>;
|
|
198
|
+
/** Keep one Workspace lease around one authorized structured Files operation. */
|
|
199
|
+
protected withFilesAfterAcceptance<A>(accept: () => void, operation: (files: ReturnType<typeof createWorkspaceFilesPort>) => Promise<A>): Promise<A>;
|
|
200
|
+
/** A Files write uses the packaged native engine and the ordinary metered backend. */
|
|
201
|
+
protected applyPatchAfterAcceptance(input: {
|
|
202
|
+
patch: string;
|
|
203
|
+
}, accept: () => void): Promise<{
|
|
204
|
+
status: "completed" | "failed" | "cancelled";
|
|
205
|
+
exitCode: number;
|
|
206
|
+
stdout: string;
|
|
207
|
+
stderr: string;
|
|
208
|
+
truncated: boolean;
|
|
209
|
+
} | {
|
|
210
|
+
status: "completed" | "failed" | "cancelled";
|
|
211
|
+
exitCode: number;
|
|
212
|
+
stdout: string;
|
|
213
|
+
stderr: string;
|
|
214
|
+
truncated: boolean;
|
|
215
|
+
error: {
|
|
216
|
+
kind: "mismatch";
|
|
217
|
+
};
|
|
218
|
+
}>;
|
|
219
|
+
/** Write bounded UTF-8 text after the resource host accepts local authority. */
|
|
220
|
+
protected writeTextAfterAcceptance(input: z.output<typeof writeInputSchema>, accept: () => void): Promise<z.output<typeof writeOutputSchema>>;
|
|
221
|
+
call(capabilityId: ComputerValue, input: ComputerValue): Promise<ComputerValue>;
|
|
222
|
+
/** Resource hosts may accept authority once the Workspace is ready to dispatch. */
|
|
223
|
+
protected callAfterAcceptance(capabilityId: ComputerValue, input: ComputerValue, accept: () => void): Promise<ComputerValue>;
|
|
224
|
+
/**
|
|
225
|
+
* Execute a host request once, after the host accepts current authority.
|
|
226
|
+
* `exec` runs on the Workspace's built-in Worker shell unless it names an
|
|
227
|
+
* attached backend; `bash` always runs on an attached backend, the named one
|
|
228
|
+
* or the first available in the default order.
|
|
229
|
+
*/
|
|
230
|
+
protected executeOperationAfterAcceptance(input: ComputerExecRequest, accept: () => void, kind: "exec" | "bash", budget?: ComputerExecutionBudget, signal?: AbortSignal): Promise<ComputerOperationResult>;
|
|
231
|
+
/**
|
|
232
|
+
* Run one command on a routed backend. Owners admit and meter hosted
|
|
233
|
+
* backends here; a member's own machine is neither reserved nor metered.
|
|
234
|
+
*/
|
|
235
|
+
protected runOnBackend<T>(route: Extract<BackendRoute, {
|
|
236
|
+
kind: "routed";
|
|
237
|
+
}>, run: () => Promise<T>): Promise<T>;
|
|
238
|
+
/** Start one long-running container process with a durable identity. */
|
|
239
|
+
startProcess(input: ComputerValue): Promise<ComputerProcess>;
|
|
240
|
+
/** The host accepts authority when the running slot is reserved. */
|
|
241
|
+
protected startProcessAfterAcceptance(input: ComputerValue, accept: () => void): Promise<ComputerProcess>;
|
|
242
|
+
/** List this Computer's processes, reconciling live ones with computerd. */
|
|
243
|
+
listProcesses(): Promise<{
|
|
244
|
+
processes: ComputerProcess[];
|
|
245
|
+
}>;
|
|
246
|
+
protected listProcessesAfterAcceptance(accept: () => void): Promise<{
|
|
247
|
+
processes: ComputerProcess[];
|
|
248
|
+
}>;
|
|
249
|
+
/** Send SIGTERM to one running process; its exit is recorded when observed. */
|
|
250
|
+
killProcess(input: ComputerValue): Promise<{
|
|
251
|
+
process: ComputerProcess;
|
|
252
|
+
signalled: boolean;
|
|
253
|
+
}>;
|
|
254
|
+
protected killProcessAfterAcceptance(input: ComputerValue, accept: () => void): Promise<{
|
|
255
|
+
process: ComputerProcess;
|
|
256
|
+
signalled: boolean;
|
|
257
|
+
}>;
|
|
258
|
+
protected getOperationStatusAfterAcceptance(requestId: string, accept: () => void): ComputerOperationResult;
|
|
259
|
+
/**
|
|
260
|
+
* Relay one authorized terminal upgrade to this Computer's own terminal
|
|
261
|
+
* server, which keeps the PTY for `session` across socket reconnects.
|
|
262
|
+
*/
|
|
263
|
+
protected terminalAfterAcceptance(request: Request, principalKey: string, accept: () => void): Promise<Response>;
|
|
264
|
+
protected withHostedResponse(_backing: HostedBacking, run: () => Promise<Response>): Promise<Response>;
|
|
265
|
+
/** Host-owned display labels only; never credentials or provider URLs. */
|
|
266
|
+
protected terminalDisplayEnvironment(): Promise<Record<string, string>>;
|
|
267
|
+
/** Atomically replace one bounded file only when its raw contents still match. */
|
|
268
|
+
replaceFileIfUnchanged(input: ComputerFileReplacement): Promise<ComputerFileReplacementResult>;
|
|
269
|
+
/** Stale-safe replacement with authority checked at the transaction boundary. */
|
|
270
|
+
protected replaceFileIfUnchangedAfterAcceptance(input: ComputerFileReplacement, accept: () => void): Promise<ComputerFileReplacementResult>;
|
|
271
|
+
}
|
|
272
|
+
export { WorkspaceProxy, WorkspaceServiceProxy };
|
|
273
|
+
export { OnBoxVmContainerHost, onBoxVmPlacement, onBoxVmIngress, type OnBoxVmEnv, type OnBoxVmState, } from "./on-box-vm.js";
|
|
274
|
+
export { computerContainerSleepAfterMs } from "./container-policy.js";
|
|
275
|
+
export * from "./computer-backends.js";
|
|
276
|
+
export { LocalBackendOfflineError, localBackendAudience, localBackendDialPath, verifyLocalBackendDial, } from "./local-backend.js";
|
|
277
|
+
/** Keep each native Workspace lease inside the operation that uses it. */
|
|
278
|
+
export declare function createComputerFilesPort(computer: ComputerRpc): FilesPort;
|
|
279
|
+
export { createWorkspaceFilesPort, type WorkspaceFilesOwner } from "./files.js";
|
|
280
|
+
export * from "./operation-contract.js";
|
|
281
|
+
export { ComputerOperationConflictError, ComputerOperationLimitError, ComputerRequestInvalidError, } from "./operation-record.js";
|
|
282
|
+
export type { ContainerComputer };
|