@agent-vm/managed-vm 0.0.124 → 0.0.126
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/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -9
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -122,8 +122,8 @@ interface OwnedHostDirectoryTransfer {
|
|
|
122
122
|
type ManagedVmFilteredWorkspaceVisibility = {
|
|
123
123
|
readonly kind: 'whole-root-writable';
|
|
124
124
|
} | {
|
|
125
|
-
readonly kind: 'positive-paths';
|
|
126
|
-
readonly visiblePaths: readonly string[];
|
|
125
|
+
readonly kind: 'positive-paths'; /** Normalized workspace-relative paths; an empty path selects the owned workspace root. */
|
|
126
|
+
readonly visiblePaths: readonly string[]; /** Normalized workspace-relative paths; an empty path selects the owned workspace root. */
|
|
127
127
|
readonly writablePaths: readonly string[];
|
|
128
128
|
};
|
|
129
129
|
interface ManagedVmFilteredWorkspaceReadonlyInput {
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/managed-vm-contracts.ts","../src/filtered-workspace-policy.ts","../src/owned-host-directory.ts"],"mappings":";;KACY,oBAAA;AAAA,KAEA,uBAAA;EAAA,SAAqC,IAAA;AAAA;EAAA,SAA+B,IAAA;AAAA;;;;;UAM/D,6BAAA;EAAA,SACP,MAAA,EAAQ,uBAAA;EAAA,SACR,MAAA,EAAQ,uBAAA;EAAA,SACR,WAAA;AAAA;AAAA,UAGO,oBAAA;EAAA,SACP,IAAA;EAAA,SACA,GAAA;EAAA,SACA,GAAA,uBAA0B,QAAA,CAAS,MAAA;EAAA,SACnC,MAAA,GAAS,6BAAA;EAAA,SACT,GAAA;EAAA,SACA,MAAA,GAAS,WAAA;EAAA,SACT,KAAA,YAAiB,UAAA,GAAa,aAAA,CAAc,UAAA;AAAA;AAAA,UAGrC,mBAAA;EAAA,SACP,QAAA;EAAA,SACA,EAAA;EAAA,SACA,MAAA;EAAA,SACA,MAAA;EAAA,SACA,YAAA,EAAc,UAAA;EAAA,SACd,MAAA;EAAA,SACA,YAAA,EAAc,UAAA;EACvB,IAAA,YAAgB,MAAA;EAChB,KAAA;EACA,QAAA;AAAA;;;;;UAOgB,oBAAA,SACR,WAAA,CAAY,mBAAA,GAAsB,aAAA;EAC1C,KAAA,kBACC,UAAA,IAAc,MAAA,EAAQ,KAAA,KAAU,OAAA,GAAU,WAAA,CAAY,OAAA,IACpD,OAAA,CAAQ,mBAAA,GAAsB,OAAA;EACjC,GAAA;EACA,OAAA,CAAQ,SAAA,gBAAyB,OAAA,CAAQ,mBAAA;EACzC,KAAA,IAAS,aAAA;EACT,MAAA,IAAU,aAAA,CAAc,wBAAA;EAAA,SACf,MAAA,EAAQ,OAAA,CAAQ,mBAAA;EACzB,MAAA,CAAO,IAAA,UAAc,OAAA;EACrB,KAAA,CAAM,IAAA,WAAe,UAAA;AAAA;AAAA,UAGL,wBAAA;EAAA,SACP,IAAA,EAAM,UAAA;EAAA,SACN,MAAA;EAAA,SACA,IAAA;AAAA;AAAA,UAGO,yBAAA;EAAA,SACP,SAAA;EAAA,SACA,eAAA;AAAA;AAAA,UAGO,qBAAA;EAChB,KAAA,IAAS,OAAA;EAAA,SACA,IAAA;EAAA,SACA,IAAA;EAAA,SACA,GAAA;AAAA;AAAA,UAGO,kBAAA,SAA2B,qBAAA;EAAA,SAClC,OAAA;EAAA,SACA,YAAA;EAAA,SACA,aAAA,EAAe,yBAAA;EAAA,SACf,IAAA;AAAA;AAAA,UAGO,yBAAA;EAAA,SACP,UAAA;EAAA,SACA,UAAA;EAAA,SACA,IAAA;AAAA;AAAA,UAGO,uBAAA;EAAA,SACP,eAAA;EAAA,SACA,UAAA;EAAA,SACA,kBAAA;EAAA,SACA,UAAA;EAAA,SACA,4BAAA;EAAA,SACA,uBAAA;EAAA,SACA,yBAAA;AAAA;AAAA,UAGO,qBAAA;EAAA,SACP,IAAA;EAAA,SACA,MAAA;EAAA,SACA,WAAA;AAAA;AAAA,UAGO,kBAAA;EAAA,SACP,QAAA;EAAA,SACA,MAAA;AAAA;AAAA,KAGE,mBAAA;AAAA,UAEK,mCAAA;EAnER;EAAA,SAqEC,aAAA;EAAA,SACA,MAAA;EAAA,SACA,KAAA;AAAA;AAAA,KAGE,uBAAA;;;;;;UAOK,kBAAA;EAChB,KAAA;EACA,OAAA,IAAW,0BAAA;EAAA,SACF,QAAA,EAAU,mCAAA;EAAA,SACV,KAAA,EAAO,uBAAA;AAAA;;UAIA,0BAAA;EAChB,KAAA;EAAA,SACS,QAAA,EAAU,mCAAA;EAAA,SACV,KAAA;AAAA;AAAA,KAGE,oCAAA;EAAA,SACE,IAAA;AAAA;EAAA,SAEF,IAAA;EAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/managed-vm-contracts.ts","../src/filtered-workspace-policy.ts","../src/owned-host-directory.ts"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -34,17 +34,21 @@ function validateManagedVmFinalizeMemoryMountRequest(request) {
|
|
|
34
34
|
}
|
|
35
35
|
//#endregion
|
|
36
36
|
//#region src/filtered-workspace-policy.ts
|
|
37
|
-
function assertNormalizedRelativePath(relativePath, fieldName) {
|
|
38
|
-
if (relativePath.length === 0
|
|
37
|
+
function assertNormalizedRelativePath(relativePath, fieldName, allowWorkspaceRoot = false) {
|
|
38
|
+
if (relativePath.length === 0) {
|
|
39
|
+
if (allowWorkspaceRoot) return;
|
|
40
|
+
throw new Error(`${fieldName} must be a normalized workspace-relative path: ${relativePath}`);
|
|
41
|
+
}
|
|
42
|
+
if (relativePath.includes("\0") || relativePath.includes("\\") || relativePath.endsWith("/") || path.posix.isAbsolute(relativePath) || path.posix.normalize(relativePath) !== relativePath || relativePath.split("/").some((segment) => segment === "." || segment === "..")) throw new Error(`${fieldName} must be a normalized workspace-relative path: ${relativePath}`);
|
|
39
43
|
}
|
|
40
44
|
function isEqualOrDescendant(candidatePath, ancestorPath) {
|
|
41
|
-
return candidatePath === ancestorPath || candidatePath.startsWith(`${ancestorPath}/`);
|
|
45
|
+
return ancestorPath.length === 0 || candidatePath === ancestorPath || candidatePath.startsWith(`${ancestorPath}/`);
|
|
42
46
|
}
|
|
43
47
|
function pathsOverlap(firstPath, secondPath) {
|
|
44
48
|
return isEqualOrDescendant(firstPath, secondPath) || isEqualOrDescendant(secondPath, firstPath);
|
|
45
49
|
}
|
|
46
|
-
function validatePathSet(paths, label) {
|
|
47
|
-
for (const relativePath of paths) assertNormalizedRelativePath(relativePath, label);
|
|
50
|
+
function validatePathSet(paths, label, allowWorkspaceRoot = false) {
|
|
51
|
+
for (const relativePath of paths) assertNormalizedRelativePath(relativePath, label, allowWorkspaceRoot);
|
|
48
52
|
const seenPaths = /* @__PURE__ */ new Set();
|
|
49
53
|
for (const relativePath of paths) {
|
|
50
54
|
if (seenPaths.has(relativePath)) throw new Error(`Managed filtered workspace policy has a duplicate ${label}: ${relativePath}`);
|
|
@@ -52,10 +56,10 @@ function validatePathSet(paths, label) {
|
|
|
52
56
|
}
|
|
53
57
|
for (let pathIndex = 0; pathIndex < paths.length; pathIndex += 1) {
|
|
54
58
|
const firstPath = paths[pathIndex];
|
|
55
|
-
if (
|
|
59
|
+
if (firstPath === void 0) continue;
|
|
56
60
|
for (let comparedIndex = pathIndex + 1; comparedIndex < paths.length; comparedIndex += 1) {
|
|
57
61
|
const secondPath = paths[comparedIndex];
|
|
58
|
-
if (secondPath && pathsOverlap(firstPath, secondPath)) throw new Error(`Managed filtered workspace policy has overlapping ${label}s: ${firstPath} and ${secondPath}`);
|
|
62
|
+
if (secondPath !== void 0 && pathsOverlap(firstPath, secondPath)) throw new Error(`Managed filtered workspace policy has overlapping ${label}s: ${firstPath} and ${secondPath}`);
|
|
59
63
|
}
|
|
60
64
|
}
|
|
61
65
|
}
|
|
@@ -97,8 +101,8 @@ function validateManagedVmFilteredWorkspacePolicy(policy) {
|
|
|
97
101
|
validatePathSet(policy.temporaryPaths, "temporary path");
|
|
98
102
|
validateReadonlyInputs(policy.readonlyInputs);
|
|
99
103
|
if (policy.visibility.kind === "positive-paths") {
|
|
100
|
-
validatePathSet(policy.visibility.visiblePaths, "visible path");
|
|
101
|
-
validatePathSet(policy.visibility.writablePaths, "writable path");
|
|
104
|
+
validatePathSet(policy.visibility.visiblePaths, "visible path", true);
|
|
105
|
+
validatePathSet(policy.visibility.writablePaths, "writable path", true);
|
|
102
106
|
if (policy.visibility.visiblePaths.length === 0) throw new Error("A positive filtered workspace policy must admit at least one visible path.");
|
|
103
107
|
for (const writablePath of policy.visibility.writablePaths) assertWithinPositiveVisibility(writablePath, policy.visibility.visiblePaths, "Writable path");
|
|
104
108
|
for (const temporaryPath of policy.temporaryPaths) assertWithinPositiveVisibility(temporaryPath, policy.visibility.visiblePaths, "Temporary path");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/managed-vm-contracts.ts","../src/filtered-workspace-policy.ts","../src/owned-host-directory.ts"],"sourcesContent":["/** A command executed in the guest. */\nexport type ManagedVmExecCommand = string | readonly string[];\n\nexport type ManagedVmExecStreamMode = { readonly kind: 'discard' } | { readonly kind: 'pipe' };\n\n/**\n * Explicit bounded streaming policy. Omitting this group preserves the\n * backend's buffered execution behavior for existing non-streaming callers.\n */\nexport interface ManagedVmExecStreamingOptions {\n\treadonly stderr: ManagedVmExecStreamMode;\n\treadonly stdout: ManagedVmExecStreamMode;\n\treadonly windowBytes: number;\n}\n\nexport interface ManagedVmExecOptions {\n\treadonly argv?: readonly string[];\n\treadonly cwd?: string;\n\treadonly env?: readonly string[] | Readonly<Record<string, string>>;\n\treadonly output?: ManagedVmExecStreamingOptions;\n\treadonly pty?: boolean;\n\treadonly signal?: AbortSignal;\n\treadonly stdin?: string | Uint8Array | AsyncIterable<Uint8Array>;\n}\n\nexport interface ManagedVmExecResult {\n\treadonly exitCode: number;\n\treadonly ok: boolean;\n\treadonly signal?: number;\n\treadonly stderr: string;\n\treadonly stderrBuffer: Uint8Array;\n\treadonly stdout: string;\n\treadonly stdoutBuffer: Uint8Array;\n\tjson<TValue>(): TValue;\n\tlines(): readonly string[];\n\ttoString(): string;\n}\n\n/**\n * A guest execution is awaitable and may also stream decoded output. The\n * contract deliberately excludes backend process handles and Node streams.\n */\nexport interface ManagedVmExecProcess\n\textends PromiseLike<ManagedVmExecResult>, AsyncIterable<string> {\n\tcatch<TResult = never>(\n\t\tonRejected?: (reason: Error) => TResult | PromiseLike<TResult>,\n\t): Promise<ManagedVmExecResult | TResult>;\n\tend(): void;\n\tfinally(onFinally?: () => void): Promise<ManagedVmExecResult>;\n\tlines(): AsyncIterable<string>;\n\toutput(): AsyncIterable<ManagedVmExecOutputChunk>;\n\treadonly result: Promise<ManagedVmExecResult>;\n\tresize(rows: number, columns: number): void;\n\twrite(data: string | Uint8Array): void;\n}\n\nexport interface ManagedVmExecOutputChunk {\n\treadonly data: Uint8Array;\n\treadonly stream: 'stderr' | 'stdout';\n\treadonly text: string;\n}\n\nexport interface ManagedVmSshServerHostKey {\n\treadonly algorithm: 'ssh-ed25519';\n\treadonly publicKeyBase64: string;\n}\n\nexport interface ManagedVmAccessHandle {\n\tclose(): Promise<void>;\n\treadonly host: string;\n\treadonly port: number;\n\treadonly url?: string;\n}\n\nexport interface ManagedVmSshAccess extends ManagedVmAccessHandle {\n\treadonly command: string;\n\treadonly identityFile: string;\n\treadonly serverHostKey: ManagedVmSshServerHostKey;\n\treadonly user: string;\n}\n\nexport interface ManagedVmEnableSshOptions {\n\treadonly listenHost?: string;\n\treadonly listenPort?: number;\n\treadonly user?: string;\n}\n\nexport interface ManagedVmIngressOptions {\n\treadonly allowWebSockets?: boolean;\n\treadonly listenHost?: string;\n\treadonly bufferResponseBody?: boolean;\n\treadonly listenPort?: number;\n\treadonly maxBufferedResponseBodyBytes?: number;\n\treadonly upstreamHeaderTimeoutMs?: number;\n\treadonly upstreamResponseTimeoutMs?: number;\n}\n\nexport interface ManagedVmIngressRoute {\n\treadonly port: number;\n\treadonly prefix: string;\n\treadonly stripPrefix: boolean;\n}\n\nexport interface ManagedVmResources {\n\treadonly cpuCount: number;\n\treadonly memory: string;\n}\n\nexport type ManagedVmRootfsMode = 'readonly' | 'memory' | 'cow';\n\nexport interface ManagedVmCanonicalDirectoryIdentity {\n\t/** Canonical path is descriptive identity; it is never a mount authority. */\n\treadonly canonicalPath: string;\n\treadonly device: number;\n\treadonly inode: number;\n}\n\nexport type OwnedHostDirectoryState = 'acquired' | 'adapter-owned' | 'closed';\n\n/**\n * Single-use host-directory authority. Passing this object to createManagedVm\n * authorizes the provider to call consume exactly once. It exposes no native\n * handle, file descriptor, or raw-path fallback.\n */\nexport interface OwnedHostDirectory {\n\tclose(): void;\n\tconsume(): OwnedHostDirectoryTransfer;\n\treadonly identity: ManagedVmCanonicalDirectoryIdentity;\n\treadonly state: OwnedHostDirectoryState;\n}\n\n/** Ownership retained by the provider after successful consumption. */\nexport interface OwnedHostDirectoryTransfer {\n\tclose(): void;\n\treadonly identity: ManagedVmCanonicalDirectoryIdentity;\n\treadonly state: 'adapter-owned' | 'closed';\n}\n\nexport type ManagedVmFilteredWorkspaceVisibility =\n\t| { readonly kind: 'whole-root-writable' }\n\t| {\n\t\t\treadonly kind: 'positive-paths';\n\t\t\treadonly visiblePaths: readonly string[];\n\t\t\treadonly writablePaths: readonly string[];\n\t };\n\nexport interface ManagedVmFilteredWorkspaceReadonlyInput {\n\treadonly destinationRelativePath: string;\n\treadonly sourceRelativePath: string;\n}\n\n/** Controller-authored policy over one owned canonical workspace root. */\nexport interface ManagedVmFilteredWorkspacePolicy {\n\treadonly hiddenPaths: readonly string[];\n\treadonly readonlyInputs: readonly ManagedVmFilteredWorkspaceReadonlyInput[];\n\treadonly temporaryPaths: readonly string[];\n\treadonly visibility: ManagedVmFilteredWorkspaceVisibility;\n}\n\nexport type ManagedVmMount =\n\t| {\n\t\t\treadonly access: 'read-only' | 'read-write';\n\t\t\treadonly hostPath: string;\n\t\t\treadonly kind: 'host-directory';\n\t }\n\t| {\n\t\t\treadonly access: 'read-only' | 'read-write';\n\t\t\treadonly directory: OwnedHostDirectory;\n\t\t\treadonly kind: 'owned-host-directory';\n\t }\n\t| {\n\t\t\treadonly directory: OwnedHostDirectory;\n\t\t\treadonly kind: 'owned-filtered-workspace';\n\t\t\treadonly policy: ManagedVmFilteredWorkspacePolicy;\n\t }\n\t| {\n\t\t\treadonly access: 'read-only' | 'read-write';\n\t\t\treadonly kind: 'finalizable-memory';\n\t }\n\t| { readonly kind: 'memory' }\n\t| {\n\t\t\treadonly deny: readonly string[];\n\t\t\treadonly hostPath: string;\n\t\t\treadonly kind: 'shadow';\n\t\t\treadonly temporaryFilesystems: readonly string[];\n\t };\n\nexport interface ManagedVmMediatedSecretDescriptor {\n\treadonly allowedHosts: readonly string[];\n\treadonly environmentVariable: string;\n\t/** Opaque, non-secret token used to represent the mediated value inside the guest. */\n\treadonly guestPlaceholder?: string;\n\t/**\n\t * Resolved only at the trusted host/provider boundary. The provider must use\n\t * this value solely for outbound HTTP mediation and must never inject the raw\n\t * value into the guest environment or VM image.\n\t */\n\treadonly value: string;\n}\n\nexport interface ManagedVmRequestMediation {\n\treadonly onRequest?: (request: Request) => Promise<Request | Response | void>;\n\treadonly onResponse?: (response: Response) => Promise<Response | void>;\n}\n\nexport interface ManagedVmTcpHostMapping {\n\treadonly guestHost: string;\n\treadonly target: string;\n}\n\nexport interface ManagedVmGitReadOnlySshEgress {\n\treadonly allowedHosts: readonly string[];\n\treadonly allowedRepositories?: readonly string[];\n\treadonly agentSocket?: string;\n\treadonly kind: 'git-read-only';\n\treadonly knownHostsFile?: string;\n}\n\nexport interface ManagedVmCreateRequest {\n\treadonly allowedHosts: readonly string[];\n\treadonly environment: Readonly<Record<string, string>>;\n\treadonly imageReference: string;\n\treadonly mediatedSecrets: readonly ManagedVmMediatedSecretDescriptor[];\n\treadonly mediation?: ManagedVmRequestMediation;\n\treadonly mounts: Readonly<Record<string, ManagedVmMount>>;\n\treadonly resources: ManagedVmResources;\n\treadonly rootfsMode: ManagedVmRootfsMode;\n\treadonly runtimeRootfsSize?: string;\n\treadonly sessionLabel: string;\n\treadonly sshEgress?: ManagedVmGitReadOnlySshEgress;\n\treadonly tcpHosts: readonly ManagedVmTcpHostMapping[];\n}\n\nexport interface ManagedVmFinalizableMemoryFile {\n\treadonly contents: Uint8Array;\n\treadonly mode: number;\n\treadonly relativePath: string;\n}\n\nexport interface ManagedVmFinalizeMemoryMountRequest {\n\treadonly files: readonly ManagedVmFinalizableMemoryFile[];\n\treadonly guestPath: string;\n}\n\nexport interface ManagedVmFinalizableMemoryMountCapability {\n\tfinalizeMemoryMount(request: ManagedVmFinalizeMemoryMountRequest): Promise<void>;\n}\n\nfunction isCanonicalRelativeMemoryFilePath(relativePath: string): boolean {\n\tif (\n\t\trelativePath.length === 0 ||\n\t\trelativePath.startsWith('/') ||\n\t\trelativePath.endsWith('/') ||\n\t\trelativePath.includes('\\\\') ||\n\t\trelativePath.includes('\\0')\n\t) {\n\t\treturn false;\n\t}\n\tconst segments = relativePath.split('/');\n\treturn segments.every((segment) => segment.length > 0 && segment !== '.' && segment !== '..');\n}\n\nfunction isCanonicalAbsoluteGuestPath(guestPath: string): boolean {\n\tif (\n\t\t!guestPath.startsWith('/') ||\n\t\tguestPath.length === 1 ||\n\t\tguestPath.endsWith('/') ||\n\t\tguestPath.includes('\\\\') ||\n\t\tguestPath.includes('\\0')\n\t) {\n\t\treturn false;\n\t}\n\treturn guestPath\n\t\t.slice(1)\n\t\t.split('/')\n\t\t.every((segment) => segment.length > 0 && segment !== '.' && segment !== '..');\n}\n\nexport function validateManagedVmFinalizeMemoryMountRequest(\n\trequest: ManagedVmFinalizeMemoryMountRequest,\n): ManagedVmFinalizeMemoryMountRequest {\n\tif (!isCanonicalAbsoluteGuestPath(request.guestPath)) {\n\t\tthrow new Error(\n\t\t\t'Managed VM finalizable memory mount guest path must be absolute and canonical.',\n\t\t);\n\t}\n\tconst copiedFiles = request.files.map((file) => {\n\t\tif (!isCanonicalRelativeMemoryFilePath(file.relativePath)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Managed VM finalizable memory file path must be one canonical relative path: ${file.relativePath}`,\n\t\t\t);\n\t\t}\n\t\tif (!Number.isSafeInteger(file.mode) || file.mode < 0 || file.mode > 0o777) {\n\t\t\tthrow new Error(\n\t\t\t\t`Managed VM finalizable memory file '${file.relativePath}' must use a permission mode between 0000 and 0777.`,\n\t\t\t);\n\t\t}\n\t\tif (!(file.contents instanceof Uint8Array)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Managed VM finalizable memory file '${file.relativePath}' contents must be a Uint8Array.`,\n\t\t\t);\n\t\t}\n\t\treturn {\n\t\t\tcontents: new Uint8Array(file.contents),\n\t\t\tmode: file.mode,\n\t\t\trelativePath: file.relativePath,\n\t\t} satisfies ManagedVmFinalizableMemoryFile;\n\t});\n\tconst sortedPaths = copiedFiles.map((file) => file.relativePath).toSorted();\n\tfor (let index = 0; index < sortedPaths.length; index += 1) {\n\t\tconst currentPath = sortedPaths[index];\n\t\tconst nextPath = sortedPaths[index + 1];\n\t\tif (currentPath === nextPath) {\n\t\t\tthrow new Error(\n\t\t\t\t`Managed VM finalizable memory inventory contains duplicate relative path: ${currentPath}`,\n\t\t\t);\n\t\t}\n\t\tif (currentPath !== undefined && nextPath?.startsWith(`${currentPath}/`)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Managed VM finalizable memory inventory contains a file-directory collision: ${currentPath}`,\n\t\t\t);\n\t\t}\n\t}\n\treturn {\n\t\tfiles: copiedFiles,\n\t\tguestPath: request.guestPath,\n\t};\n}\n\nexport interface ManagedVm {\n\tclose(): Promise<void>;\n\tconfigureIngressRoutes(routes: readonly ManagedVmIngressRoute[]): void;\n\tenableIngress(options?: ManagedVmIngressOptions): Promise<ManagedVmAccessHandle>;\n\tenableSsh(options?: ManagedVmEnableSshOptions): Promise<ManagedVmSshAccess>;\n\texec(command: ManagedVmExecCommand, options?: ManagedVmExecOptions): ManagedVmExecProcess;\n\treadonly finalizeMemoryMount?: ManagedVmFinalizableMemoryMountCapability['finalizeMemoryMount'];\n\t/** Null before start succeeds or after the owned host process exits. */\n\tgetHostProcessId(): number | null;\n\treadonly id: string;\n\tstart(): Promise<void>;\n}\n\n/** Durable controller identity captured before authority admission. */\nexport interface ManagedVmHostProcessIdentity {\n\treadonly command: string;\n\treadonly hostProcessId: number;\n\treadonly processStartIdentity: string;\n\treadonly vmId: string;\n}\n\nexport interface ManagedVmExactProcessTerminationRequest {\n\treadonly contextLabel: string;\n\treadonly identity: ManagedVmHostProcessIdentity;\n}\n\nexport type ManagedVmExactProcessTerminationOutcome =\n\t| { readonly hostProcessId: number; readonly kind: 'already-absent' }\n\t| { readonly hostProcessId: number; readonly kind: 'terminated' };\n\nexport interface ManagedVmExactProcessTerminationCapability {\n\tterminateRecordedHostProcess(\n\t\trequest: ManagedVmExactProcessTerminationRequest,\n\t): Promise<ManagedVmExactProcessTerminationOutcome>;\n}\n\nexport interface ManagedVmFactory {\n\tcreateManagedVm(request: ManagedVmCreateRequest): Promise<ManagedVm>;\n}\n\nexport interface ManagedVmImageBuildRequest {\n\treadonly cacheDirectory: string;\n\treadonly forceRebuild?: boolean;\n\treadonly recipePath: string;\n}\n\nexport interface ManagedVmImageBuildResult {\n\treadonly built: boolean;\n\treadonly fingerprint: string;\n\treadonly imageReference: string;\n}\n\nexport interface ManagedVmImageCapability {\n\tprepareImage(request: ManagedVmImageBuildRequest): Promise<ManagedVmImageBuildResult>;\n}\n\nexport interface ManagedVmCompatibilityDiagnostic {\n\treadonly code: string;\n\treadonly message: string;\n\treadonly severity: 'error' | 'warning';\n}\n\nexport interface ManagedVmDiagnosticsCapability {\n\tcheckCompatibility(): Promise<readonly ManagedVmCompatibilityDiagnostic[]>;\n}\n\nexport interface ManagedVmOwnedDirectoryCapability {\n\topenHostDirectory(hostPath: string): OwnedHostDirectory;\n}\n\n/** Aggregate available only at application composition boundaries. */\nexport interface ManagedVmProvider {\n\treadonly diagnostics: ManagedVmDiagnosticsCapability;\n\treadonly exactProcessTermination: ManagedVmExactProcessTerminationCapability;\n\treadonly factory: ManagedVmFactory;\n\treadonly images: ManagedVmImageCapability;\n\treadonly ownedDirectories: ManagedVmOwnedDirectoryCapability;\n}\n","import path from 'node:path';\n\nimport type {\n\tManagedVmFilteredWorkspacePolicy,\n\tManagedVmFilteredWorkspaceReadonlyInput,\n} from './managed-vm-contracts.js';\n\nfunction assertNormalizedRelativePath(relativePath: string, fieldName: string): void {\n\tif (\n\t\trelativePath.length === 0 ||\n\t\trelativePath.includes('\\0') ||\n\t\trelativePath.includes('\\\\') ||\n\t\trelativePath.endsWith('/') ||\n\t\tpath.posix.isAbsolute(relativePath) ||\n\t\tpath.posix.normalize(relativePath) !== relativePath ||\n\t\trelativePath.split('/').some((segment) => segment === '.' || segment === '..')\n\t) {\n\t\tthrow new Error(`${fieldName} must be a normalized workspace-relative path: ${relativePath}`);\n\t}\n}\n\nfunction isEqualOrDescendant(candidatePath: string, ancestorPath: string): boolean {\n\treturn candidatePath === ancestorPath || candidatePath.startsWith(`${ancestorPath}/`);\n}\n\nfunction pathsOverlap(firstPath: string, secondPath: string): boolean {\n\treturn isEqualOrDescendant(firstPath, secondPath) || isEqualOrDescendant(secondPath, firstPath);\n}\n\nfunction validatePathSet(paths: readonly string[], label: string): void {\n\tfor (const relativePath of paths) {\n\t\tassertNormalizedRelativePath(relativePath, label);\n\t}\n\tconst seenPaths = new Set<string>();\n\tfor (const relativePath of paths) {\n\t\tif (seenPaths.has(relativePath)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Managed filtered workspace policy has a duplicate ${label}: ${relativePath}`,\n\t\t\t);\n\t\t}\n\t\tseenPaths.add(relativePath);\n\t}\n\tfor (let pathIndex = 0; pathIndex < paths.length; pathIndex += 1) {\n\t\tconst firstPath = paths[pathIndex];\n\t\tif (!firstPath) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (let comparedIndex = pathIndex + 1; comparedIndex < paths.length; comparedIndex += 1) {\n\t\t\tconst secondPath = paths[comparedIndex];\n\t\t\tif (secondPath && pathsOverlap(firstPath, secondPath)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Managed filtered workspace policy has overlapping ${label}s: ${firstPath} and ${secondPath}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction validateReadonlyInputs(\n\treadonlyInputs: readonly ManagedVmFilteredWorkspaceReadonlyInput[],\n): void {\n\tfor (const readonlyInput of readonlyInputs) {\n\t\tassertNormalizedRelativePath(readonlyInput.sourceRelativePath, 'Read-only input source path');\n\t\tassertNormalizedRelativePath(\n\t\t\treadonlyInput.destinationRelativePath,\n\t\t\t'Read-only input destination path',\n\t\t);\n\t}\n\tconst destinationPaths = readonlyInputs.map(\n\t\t(readonlyInput) => readonlyInput.destinationRelativePath,\n\t);\n\tconst seenDestinations = new Set<string>();\n\tfor (const destinationPath of destinationPaths) {\n\t\tif (seenDestinations.has(destinationPath)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Managed filtered workspace policy has a duplicate read-only destination: ${destinationPath}`,\n\t\t\t);\n\t\t}\n\t\tseenDestinations.add(destinationPath);\n\t}\n\tfor (let inputIndex = 0; inputIndex < destinationPaths.length; inputIndex += 1) {\n\t\tconst firstDestination = destinationPaths[inputIndex];\n\t\tif (!firstDestination) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (\n\t\t\tlet comparedIndex = inputIndex + 1;\n\t\t\tcomparedIndex < destinationPaths.length;\n\t\t\tcomparedIndex += 1\n\t\t) {\n\t\t\tconst secondDestination = destinationPaths[comparedIndex];\n\t\t\tif (secondDestination && pathsOverlap(firstDestination, secondDestination)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Managed filtered workspace policy has overlapping read-only destinations: ${firstDestination} and ${secondDestination}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertWithinPositiveVisibility(\n\trelativePath: string,\n\tvisiblePaths: readonly string[],\n\tfieldName: string,\n): void {\n\tif (!visiblePaths.some((visiblePath) => isEqualOrDescendant(relativePath, visiblePath))) {\n\t\tthrow new Error(`${fieldName} '${relativePath}' is outside the positive visibility allowlist.`);\n\t}\n}\n\nfunction readonlyInputSourceIsWritable(\n\treadonlyInput: ManagedVmFilteredWorkspaceReadonlyInput,\n\tpolicy: ManagedVmFilteredWorkspacePolicy,\n): boolean {\n\tconst sourcePath = readonlyInput.sourceRelativePath;\n\tif (\n\t\tpolicy.hiddenPaths.some((hiddenPath) => isEqualOrDescendant(sourcePath, hiddenPath)) ||\n\t\tpolicy.temporaryPaths.some((temporaryPath) => isEqualOrDescendant(sourcePath, temporaryPath)) ||\n\t\tpolicy.readonlyInputs.some((candidateInput) =>\n\t\t\tisEqualOrDescendant(sourcePath, candidateInput.destinationRelativePath),\n\t\t)\n\t) {\n\t\treturn false;\n\t}\n\tif (policy.visibility.kind === 'whole-root-writable') {\n\t\treturn true;\n\t}\n\treturn policy.visibility.writablePaths.some((writablePath) =>\n\t\tisEqualOrDescendant(sourcePath, writablePath),\n\t);\n}\n\n/**\n * Validates the complete policy before VM construction reaches a native provider.\n * Paths are rejected rather than silently normalized so one spelling has one meaning.\n */\nexport function validateManagedVmFilteredWorkspacePolicy(\n\tpolicy: ManagedVmFilteredWorkspacePolicy,\n): ManagedVmFilteredWorkspacePolicy {\n\tvalidatePathSet(policy.hiddenPaths, 'hidden path');\n\tvalidatePathSet(policy.temporaryPaths, 'temporary path');\n\tvalidateReadonlyInputs(policy.readonlyInputs);\n\n\tif (policy.visibility.kind === 'positive-paths') {\n\t\tvalidatePathSet(policy.visibility.visiblePaths, 'visible path');\n\t\tvalidatePathSet(policy.visibility.writablePaths, 'writable path');\n\t\tif (policy.visibility.visiblePaths.length === 0) {\n\t\t\tthrow new Error('A positive filtered workspace policy must admit at least one visible path.');\n\t\t}\n\t\tfor (const writablePath of policy.visibility.writablePaths) {\n\t\t\tassertWithinPositiveVisibility(writablePath, policy.visibility.visiblePaths, 'Writable path');\n\t\t}\n\t\tfor (const temporaryPath of policy.temporaryPaths) {\n\t\t\tassertWithinPositiveVisibility(\n\t\t\t\ttemporaryPath,\n\t\t\t\tpolicy.visibility.visiblePaths,\n\t\t\t\t'Temporary path',\n\t\t\t);\n\t\t}\n\t\tfor (const readonlyInput of policy.readonlyInputs) {\n\t\t\tassertWithinPositiveVisibility(\n\t\t\t\treadonlyInput.destinationRelativePath,\n\t\t\t\tpolicy.visibility.visiblePaths,\n\t\t\t\t'Read-only destination',\n\t\t\t);\n\t\t}\n\t\tfor (const hiddenPath of policy.hiddenPaths) {\n\t\t\tif (\n\t\t\t\t!policy.visibility.visiblePaths.some((visiblePath) => pathsOverlap(hiddenPath, visiblePath))\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Hidden path '${hiddenPath}' is outside the positive visibility allowlist.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const readonlyInput of policy.readonlyInputs) {\n\t\tif (readonlyInputSourceIsWritable(readonlyInput, policy)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Read-only input source '${readonlyInput.sourceRelativePath}' remains writable at its original workspace path.`,\n\t\t\t);\n\t\t}\n\t\tfor (const writablePath of policy.visibility.kind === 'positive-paths'\n\t\t\t? policy.visibility.writablePaths\n\t\t\t: []) {\n\t\t\tif (\n\t\t\t\twritablePath !== readonlyInput.destinationRelativePath &&\n\t\t\t\tisEqualOrDescendant(writablePath, readonlyInput.destinationRelativePath)\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`writable path '${writablePath}' has read-only ancestor '${readonlyInput.destinationRelativePath}'.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\thiddenPaths: [...policy.hiddenPaths],\n\t\treadonlyInputs: policy.readonlyInputs.map((readonlyInput) => ({ ...readonlyInput })),\n\t\ttemporaryPaths: [...policy.temporaryPaths],\n\t\tvisibility:\n\t\t\tpolicy.visibility.kind === 'whole-root-writable'\n\t\t\t\t? { kind: 'whole-root-writable' }\n\t\t\t\t: {\n\t\t\t\t\t\tkind: 'positive-paths',\n\t\t\t\t\t\tvisiblePaths: [...policy.visibility.visiblePaths],\n\t\t\t\t\t\twritablePaths: [...policy.visibility.writablePaths],\n\t\t\t\t\t},\n\t};\n}\n","import type {\n\tManagedVmCanonicalDirectoryIdentity,\n\tOwnedHostDirectory,\n\tOwnedHostDirectoryState,\n\tOwnedHostDirectoryTransfer,\n} from './managed-vm-contracts.js';\n\nexport interface OwnedHostDirectoryControllerOptions {\n\treadonly identity: ManagedVmCanonicalDirectoryIdentity;\n\treadonly onClose: () => void;\n\treadonly onConsume?: () => void;\n}\n\n/**\n * Creates the backend-neutral half of an owned-directory capability. Native\n * resources remain captured by provider callbacks and never enter this object.\n */\nexport function createOwnedHostDirectoryController(\n\toptions: OwnedHostDirectoryControllerOptions,\n): OwnedHostDirectory {\n\ttype InternalOwnedHostDirectoryState = OwnedHostDirectoryState | 'transferring';\n\tlet currentState: InternalOwnedHostDirectoryState = 'acquired';\n\tlet resourceClosed = false;\n\tlet resourceClosing = false;\n\tconst getInternalState = (): InternalOwnedHostDirectoryState => currentState;\n\n\tconst closeResource = (): boolean => {\n\t\tif (resourceClosed) {\n\t\t\treturn true;\n\t\t}\n\t\tif (resourceClosing) {\n\t\t\treturn false;\n\t\t}\n\t\tresourceClosing = true;\n\t\ttry {\n\t\t\toptions.onClose();\n\t\t\tresourceClosed = true;\n\t\t\treturn true;\n\t\t} finally {\n\t\t\tresourceClosing = false;\n\t\t}\n\t};\n\n\tconst transfer: OwnedHostDirectoryTransfer = {\n\t\tclose(): void {\n\t\t\tif (currentState !== 'adapter-owned') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (closeResource()) {\n\t\t\t\tcurrentState = 'closed';\n\t\t\t}\n\t\t},\n\t\tget identity(): ManagedVmCanonicalDirectoryIdentity {\n\t\t\treturn options.identity;\n\t\t},\n\t\tget state(): 'adapter-owned' | 'closed' {\n\t\t\treturn currentState === 'adapter-owned' ? 'adapter-owned' : 'closed';\n\t\t},\n\t};\n\n\treturn {\n\t\tclose(): void {\n\t\t\tif (currentState === 'adapter-owned') {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Owned host directory cannot be closed by its former owner after transfer.',\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (getInternalState() === 'closed') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (closeResource()) {\n\t\t\t\tcurrentState = 'closed';\n\t\t\t}\n\t\t},\n\t\tconsume(): OwnedHostDirectoryTransfer {\n\t\t\tif (currentState !== 'acquired') {\n\t\t\t\tthrow new Error(`Owned host directory cannot be consumed while ${currentState}.`);\n\t\t\t}\n\t\t\tcurrentState = 'transferring';\n\t\t\ttry {\n\t\t\t\toptions.onConsume?.();\n\t\t\t} catch (consumeError) {\n\t\t\t\ttry {\n\t\t\t\t\tif (closeResource()) {\n\t\t\t\t\t\tcurrentState = 'closed';\n\t\t\t\t\t}\n\t\t\t\t} catch (closeError) {\n\t\t\t\t\t// oxlint-disable-next-line preserve-caught-error -- AggregateError.errors retains cleanup failure while cause retains the transfer failure.\n\t\t\t\t\tthrow new AggregateError(\n\t\t\t\t\t\t[consumeError, closeError],\n\t\t\t\t\t\t'Owned host directory transfer and cleanup both failed.',\n\t\t\t\t\t\t{ cause: consumeError },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow consumeError;\n\t\t\t}\n\t\t\tif (getInternalState() === 'closed') {\n\t\t\t\tthrow new Error('Owned host directory closed during ownership transfer.');\n\t\t\t}\n\t\t\tcurrentState = 'adapter-owned';\n\t\t\treturn transfer;\n\t\t},\n\t\tget identity(): ManagedVmCanonicalDirectoryIdentity {\n\t\t\treturn options.identity;\n\t\t},\n\t\tget state(): OwnedHostDirectoryState {\n\t\t\treturn currentState === 'transferring' ? 'acquired' : currentState;\n\t\t},\n\t};\n}\n\nexport function assertPositiveHostProcessId(hostProcessId: number | null): number {\n\tif (!Number.isSafeInteger(hostProcessId) || hostProcessId === null || hostProcessId <= 0) {\n\t\tthrow new Error('A started managed VM must expose a positive stable host process ID.');\n\t}\n\treturn hostProcessId;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/managed-vm-contracts.ts","../src/filtered-workspace-policy.ts","../src/owned-host-directory.ts"],"sourcesContent":["/** A command executed in the guest. */\nexport type ManagedVmExecCommand = string | readonly string[];\n\nexport type ManagedVmExecStreamMode = { readonly kind: 'discard' } | { readonly kind: 'pipe' };\n\n/**\n * Explicit bounded streaming policy. Omitting this group preserves the\n * backend's buffered execution behavior for existing non-streaming callers.\n */\nexport interface ManagedVmExecStreamingOptions {\n\treadonly stderr: ManagedVmExecStreamMode;\n\treadonly stdout: ManagedVmExecStreamMode;\n\treadonly windowBytes: number;\n}\n\nexport interface ManagedVmExecOptions {\n\treadonly argv?: readonly string[];\n\treadonly cwd?: string;\n\treadonly env?: readonly string[] | Readonly<Record<string, string>>;\n\treadonly output?: ManagedVmExecStreamingOptions;\n\treadonly pty?: boolean;\n\treadonly signal?: AbortSignal;\n\treadonly stdin?: string | Uint8Array | AsyncIterable<Uint8Array>;\n}\n\nexport interface ManagedVmExecResult {\n\treadonly exitCode: number;\n\treadonly ok: boolean;\n\treadonly signal?: number;\n\treadonly stderr: string;\n\treadonly stderrBuffer: Uint8Array;\n\treadonly stdout: string;\n\treadonly stdoutBuffer: Uint8Array;\n\tjson<TValue>(): TValue;\n\tlines(): readonly string[];\n\ttoString(): string;\n}\n\n/**\n * A guest execution is awaitable and may also stream decoded output. The\n * contract deliberately excludes backend process handles and Node streams.\n */\nexport interface ManagedVmExecProcess\n\textends PromiseLike<ManagedVmExecResult>, AsyncIterable<string> {\n\tcatch<TResult = never>(\n\t\tonRejected?: (reason: Error) => TResult | PromiseLike<TResult>,\n\t): Promise<ManagedVmExecResult | TResult>;\n\tend(): void;\n\tfinally(onFinally?: () => void): Promise<ManagedVmExecResult>;\n\tlines(): AsyncIterable<string>;\n\toutput(): AsyncIterable<ManagedVmExecOutputChunk>;\n\treadonly result: Promise<ManagedVmExecResult>;\n\tresize(rows: number, columns: number): void;\n\twrite(data: string | Uint8Array): void;\n}\n\nexport interface ManagedVmExecOutputChunk {\n\treadonly data: Uint8Array;\n\treadonly stream: 'stderr' | 'stdout';\n\treadonly text: string;\n}\n\nexport interface ManagedVmSshServerHostKey {\n\treadonly algorithm: 'ssh-ed25519';\n\treadonly publicKeyBase64: string;\n}\n\nexport interface ManagedVmAccessHandle {\n\tclose(): Promise<void>;\n\treadonly host: string;\n\treadonly port: number;\n\treadonly url?: string;\n}\n\nexport interface ManagedVmSshAccess extends ManagedVmAccessHandle {\n\treadonly command: string;\n\treadonly identityFile: string;\n\treadonly serverHostKey: ManagedVmSshServerHostKey;\n\treadonly user: string;\n}\n\nexport interface ManagedVmEnableSshOptions {\n\treadonly listenHost?: string;\n\treadonly listenPort?: number;\n\treadonly user?: string;\n}\n\nexport interface ManagedVmIngressOptions {\n\treadonly allowWebSockets?: boolean;\n\treadonly listenHost?: string;\n\treadonly bufferResponseBody?: boolean;\n\treadonly listenPort?: number;\n\treadonly maxBufferedResponseBodyBytes?: number;\n\treadonly upstreamHeaderTimeoutMs?: number;\n\treadonly upstreamResponseTimeoutMs?: number;\n}\n\nexport interface ManagedVmIngressRoute {\n\treadonly port: number;\n\treadonly prefix: string;\n\treadonly stripPrefix: boolean;\n}\n\nexport interface ManagedVmResources {\n\treadonly cpuCount: number;\n\treadonly memory: string;\n}\n\nexport type ManagedVmRootfsMode = 'readonly' | 'memory' | 'cow';\n\nexport interface ManagedVmCanonicalDirectoryIdentity {\n\t/** Canonical path is descriptive identity; it is never a mount authority. */\n\treadonly canonicalPath: string;\n\treadonly device: number;\n\treadonly inode: number;\n}\n\nexport type OwnedHostDirectoryState = 'acquired' | 'adapter-owned' | 'closed';\n\n/**\n * Single-use host-directory authority. Passing this object to createManagedVm\n * authorizes the provider to call consume exactly once. It exposes no native\n * handle, file descriptor, or raw-path fallback.\n */\nexport interface OwnedHostDirectory {\n\tclose(): void;\n\tconsume(): OwnedHostDirectoryTransfer;\n\treadonly identity: ManagedVmCanonicalDirectoryIdentity;\n\treadonly state: OwnedHostDirectoryState;\n}\n\n/** Ownership retained by the provider after successful consumption. */\nexport interface OwnedHostDirectoryTransfer {\n\tclose(): void;\n\treadonly identity: ManagedVmCanonicalDirectoryIdentity;\n\treadonly state: 'adapter-owned' | 'closed';\n}\n\nexport type ManagedVmFilteredWorkspaceVisibility =\n\t| { readonly kind: 'whole-root-writable' }\n\t| {\n\t\t\treadonly kind: 'positive-paths';\n\t\t\t/** Normalized workspace-relative paths; an empty path selects the owned workspace root. */\n\t\t\treadonly visiblePaths: readonly string[];\n\t\t\t/** Normalized workspace-relative paths; an empty path selects the owned workspace root. */\n\t\t\treadonly writablePaths: readonly string[];\n\t };\n\nexport interface ManagedVmFilteredWorkspaceReadonlyInput {\n\treadonly destinationRelativePath: string;\n\treadonly sourceRelativePath: string;\n}\n\n/** Controller-authored policy over one owned canonical workspace root. */\nexport interface ManagedVmFilteredWorkspacePolicy {\n\treadonly hiddenPaths: readonly string[];\n\treadonly readonlyInputs: readonly ManagedVmFilteredWorkspaceReadonlyInput[];\n\treadonly temporaryPaths: readonly string[];\n\treadonly visibility: ManagedVmFilteredWorkspaceVisibility;\n}\n\nexport type ManagedVmMount =\n\t| {\n\t\t\treadonly access: 'read-only' | 'read-write';\n\t\t\treadonly hostPath: string;\n\t\t\treadonly kind: 'host-directory';\n\t }\n\t| {\n\t\t\treadonly access: 'read-only' | 'read-write';\n\t\t\treadonly directory: OwnedHostDirectory;\n\t\t\treadonly kind: 'owned-host-directory';\n\t }\n\t| {\n\t\t\treadonly directory: OwnedHostDirectory;\n\t\t\treadonly kind: 'owned-filtered-workspace';\n\t\t\treadonly policy: ManagedVmFilteredWorkspacePolicy;\n\t }\n\t| {\n\t\t\treadonly access: 'read-only' | 'read-write';\n\t\t\treadonly kind: 'finalizable-memory';\n\t }\n\t| { readonly kind: 'memory' }\n\t| {\n\t\t\treadonly deny: readonly string[];\n\t\t\treadonly hostPath: string;\n\t\t\treadonly kind: 'shadow';\n\t\t\treadonly temporaryFilesystems: readonly string[];\n\t };\n\nexport interface ManagedVmMediatedSecretDescriptor {\n\treadonly allowedHosts: readonly string[];\n\treadonly environmentVariable: string;\n\t/** Opaque, non-secret token used to represent the mediated value inside the guest. */\n\treadonly guestPlaceholder?: string;\n\t/**\n\t * Resolved only at the trusted host/provider boundary. The provider must use\n\t * this value solely for outbound HTTP mediation and must never inject the raw\n\t * value into the guest environment or VM image.\n\t */\n\treadonly value: string;\n}\n\nexport interface ManagedVmRequestMediation {\n\treadonly onRequest?: (request: Request) => Promise<Request | Response | void>;\n\treadonly onResponse?: (response: Response) => Promise<Response | void>;\n}\n\nexport interface ManagedVmTcpHostMapping {\n\treadonly guestHost: string;\n\treadonly target: string;\n}\n\nexport interface ManagedVmGitReadOnlySshEgress {\n\treadonly allowedHosts: readonly string[];\n\treadonly allowedRepositories?: readonly string[];\n\treadonly agentSocket?: string;\n\treadonly kind: 'git-read-only';\n\treadonly knownHostsFile?: string;\n}\n\nexport interface ManagedVmCreateRequest {\n\treadonly allowedHosts: readonly string[];\n\treadonly environment: Readonly<Record<string, string>>;\n\treadonly imageReference: string;\n\treadonly mediatedSecrets: readonly ManagedVmMediatedSecretDescriptor[];\n\treadonly mediation?: ManagedVmRequestMediation;\n\treadonly mounts: Readonly<Record<string, ManagedVmMount>>;\n\treadonly resources: ManagedVmResources;\n\treadonly rootfsMode: ManagedVmRootfsMode;\n\treadonly runtimeRootfsSize?: string;\n\treadonly sessionLabel: string;\n\treadonly sshEgress?: ManagedVmGitReadOnlySshEgress;\n\treadonly tcpHosts: readonly ManagedVmTcpHostMapping[];\n}\n\nexport interface ManagedVmFinalizableMemoryFile {\n\treadonly contents: Uint8Array;\n\treadonly mode: number;\n\treadonly relativePath: string;\n}\n\nexport interface ManagedVmFinalizeMemoryMountRequest {\n\treadonly files: readonly ManagedVmFinalizableMemoryFile[];\n\treadonly guestPath: string;\n}\n\nexport interface ManagedVmFinalizableMemoryMountCapability {\n\tfinalizeMemoryMount(request: ManagedVmFinalizeMemoryMountRequest): Promise<void>;\n}\n\nfunction isCanonicalRelativeMemoryFilePath(relativePath: string): boolean {\n\tif (\n\t\trelativePath.length === 0 ||\n\t\trelativePath.startsWith('/') ||\n\t\trelativePath.endsWith('/') ||\n\t\trelativePath.includes('\\\\') ||\n\t\trelativePath.includes('\\0')\n\t) {\n\t\treturn false;\n\t}\n\tconst segments = relativePath.split('/');\n\treturn segments.every((segment) => segment.length > 0 && segment !== '.' && segment !== '..');\n}\n\nfunction isCanonicalAbsoluteGuestPath(guestPath: string): boolean {\n\tif (\n\t\t!guestPath.startsWith('/') ||\n\t\tguestPath.length === 1 ||\n\t\tguestPath.endsWith('/') ||\n\t\tguestPath.includes('\\\\') ||\n\t\tguestPath.includes('\\0')\n\t) {\n\t\treturn false;\n\t}\n\treturn guestPath\n\t\t.slice(1)\n\t\t.split('/')\n\t\t.every((segment) => segment.length > 0 && segment !== '.' && segment !== '..');\n}\n\nexport function validateManagedVmFinalizeMemoryMountRequest(\n\trequest: ManagedVmFinalizeMemoryMountRequest,\n): ManagedVmFinalizeMemoryMountRequest {\n\tif (!isCanonicalAbsoluteGuestPath(request.guestPath)) {\n\t\tthrow new Error(\n\t\t\t'Managed VM finalizable memory mount guest path must be absolute and canonical.',\n\t\t);\n\t}\n\tconst copiedFiles = request.files.map((file) => {\n\t\tif (!isCanonicalRelativeMemoryFilePath(file.relativePath)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Managed VM finalizable memory file path must be one canonical relative path: ${file.relativePath}`,\n\t\t\t);\n\t\t}\n\t\tif (!Number.isSafeInteger(file.mode) || file.mode < 0 || file.mode > 0o777) {\n\t\t\tthrow new Error(\n\t\t\t\t`Managed VM finalizable memory file '${file.relativePath}' must use a permission mode between 0000 and 0777.`,\n\t\t\t);\n\t\t}\n\t\tif (!(file.contents instanceof Uint8Array)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Managed VM finalizable memory file '${file.relativePath}' contents must be a Uint8Array.`,\n\t\t\t);\n\t\t}\n\t\treturn {\n\t\t\tcontents: new Uint8Array(file.contents),\n\t\t\tmode: file.mode,\n\t\t\trelativePath: file.relativePath,\n\t\t} satisfies ManagedVmFinalizableMemoryFile;\n\t});\n\tconst sortedPaths = copiedFiles.map((file) => file.relativePath).toSorted();\n\tfor (let index = 0; index < sortedPaths.length; index += 1) {\n\t\tconst currentPath = sortedPaths[index];\n\t\tconst nextPath = sortedPaths[index + 1];\n\t\tif (currentPath === nextPath) {\n\t\t\tthrow new Error(\n\t\t\t\t`Managed VM finalizable memory inventory contains duplicate relative path: ${currentPath}`,\n\t\t\t);\n\t\t}\n\t\tif (currentPath !== undefined && nextPath?.startsWith(`${currentPath}/`)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Managed VM finalizable memory inventory contains a file-directory collision: ${currentPath}`,\n\t\t\t);\n\t\t}\n\t}\n\treturn {\n\t\tfiles: copiedFiles,\n\t\tguestPath: request.guestPath,\n\t};\n}\n\nexport interface ManagedVm {\n\tclose(): Promise<void>;\n\tconfigureIngressRoutes(routes: readonly ManagedVmIngressRoute[]): void;\n\tenableIngress(options?: ManagedVmIngressOptions): Promise<ManagedVmAccessHandle>;\n\tenableSsh(options?: ManagedVmEnableSshOptions): Promise<ManagedVmSshAccess>;\n\texec(command: ManagedVmExecCommand, options?: ManagedVmExecOptions): ManagedVmExecProcess;\n\treadonly finalizeMemoryMount?: ManagedVmFinalizableMemoryMountCapability['finalizeMemoryMount'];\n\t/** Null before start succeeds or after the owned host process exits. */\n\tgetHostProcessId(): number | null;\n\treadonly id: string;\n\tstart(): Promise<void>;\n}\n\n/** Durable controller identity captured before authority admission. */\nexport interface ManagedVmHostProcessIdentity {\n\treadonly command: string;\n\treadonly hostProcessId: number;\n\treadonly processStartIdentity: string;\n\treadonly vmId: string;\n}\n\nexport interface ManagedVmExactProcessTerminationRequest {\n\treadonly contextLabel: string;\n\treadonly identity: ManagedVmHostProcessIdentity;\n}\n\nexport type ManagedVmExactProcessTerminationOutcome =\n\t| { readonly hostProcessId: number; readonly kind: 'already-absent' }\n\t| { readonly hostProcessId: number; readonly kind: 'terminated' };\n\nexport interface ManagedVmExactProcessTerminationCapability {\n\tterminateRecordedHostProcess(\n\t\trequest: ManagedVmExactProcessTerminationRequest,\n\t): Promise<ManagedVmExactProcessTerminationOutcome>;\n}\n\nexport interface ManagedVmFactory {\n\tcreateManagedVm(request: ManagedVmCreateRequest): Promise<ManagedVm>;\n}\n\nexport interface ManagedVmImageBuildRequest {\n\treadonly cacheDirectory: string;\n\treadonly forceRebuild?: boolean;\n\treadonly recipePath: string;\n}\n\nexport interface ManagedVmImageBuildResult {\n\treadonly built: boolean;\n\treadonly fingerprint: string;\n\treadonly imageReference: string;\n}\n\nexport interface ManagedVmImageCapability {\n\tprepareImage(request: ManagedVmImageBuildRequest): Promise<ManagedVmImageBuildResult>;\n}\n\nexport interface ManagedVmCompatibilityDiagnostic {\n\treadonly code: string;\n\treadonly message: string;\n\treadonly severity: 'error' | 'warning';\n}\n\nexport interface ManagedVmDiagnosticsCapability {\n\tcheckCompatibility(): Promise<readonly ManagedVmCompatibilityDiagnostic[]>;\n}\n\nexport interface ManagedVmOwnedDirectoryCapability {\n\topenHostDirectory(hostPath: string): OwnedHostDirectory;\n}\n\n/** Aggregate available only at application composition boundaries. */\nexport interface ManagedVmProvider {\n\treadonly diagnostics: ManagedVmDiagnosticsCapability;\n\treadonly exactProcessTermination: ManagedVmExactProcessTerminationCapability;\n\treadonly factory: ManagedVmFactory;\n\treadonly images: ManagedVmImageCapability;\n\treadonly ownedDirectories: ManagedVmOwnedDirectoryCapability;\n}\n","import path from 'node:path';\n\nimport type {\n\tManagedVmFilteredWorkspacePolicy,\n\tManagedVmFilteredWorkspaceReadonlyInput,\n} from './managed-vm-contracts.js';\n\nfunction assertNormalizedRelativePath(\n\trelativePath: string,\n\tfieldName: string,\n\tallowWorkspaceRoot = false,\n): void {\n\tif (relativePath.length === 0) {\n\t\tif (allowWorkspaceRoot) {\n\t\t\treturn;\n\t\t}\n\t\tthrow new Error(`${fieldName} must be a normalized workspace-relative path: ${relativePath}`);\n\t}\n\tif (\n\t\trelativePath.includes('\\0') ||\n\t\trelativePath.includes('\\\\') ||\n\t\trelativePath.endsWith('/') ||\n\t\tpath.posix.isAbsolute(relativePath) ||\n\t\tpath.posix.normalize(relativePath) !== relativePath ||\n\t\trelativePath.split('/').some((segment) => segment === '.' || segment === '..')\n\t) {\n\t\tthrow new Error(`${fieldName} must be a normalized workspace-relative path: ${relativePath}`);\n\t}\n}\n\nfunction isEqualOrDescendant(candidatePath: string, ancestorPath: string): boolean {\n\treturn (\n\t\tancestorPath.length === 0 ||\n\t\tcandidatePath === ancestorPath ||\n\t\tcandidatePath.startsWith(`${ancestorPath}/`)\n\t);\n}\n\nfunction pathsOverlap(firstPath: string, secondPath: string): boolean {\n\treturn isEqualOrDescendant(firstPath, secondPath) || isEqualOrDescendant(secondPath, firstPath);\n}\n\nfunction validatePathSet(\n\tpaths: readonly string[],\n\tlabel: string,\n\tallowWorkspaceRoot = false,\n): void {\n\tfor (const relativePath of paths) {\n\t\tassertNormalizedRelativePath(relativePath, label, allowWorkspaceRoot);\n\t}\n\tconst seenPaths = new Set<string>();\n\tfor (const relativePath of paths) {\n\t\tif (seenPaths.has(relativePath)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Managed filtered workspace policy has a duplicate ${label}: ${relativePath}`,\n\t\t\t);\n\t\t}\n\t\tseenPaths.add(relativePath);\n\t}\n\tfor (let pathIndex = 0; pathIndex < paths.length; pathIndex += 1) {\n\t\tconst firstPath = paths[pathIndex];\n\t\tif (firstPath === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (let comparedIndex = pathIndex + 1; comparedIndex < paths.length; comparedIndex += 1) {\n\t\t\tconst secondPath = paths[comparedIndex];\n\t\t\tif (secondPath !== undefined && pathsOverlap(firstPath, secondPath)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Managed filtered workspace policy has overlapping ${label}s: ${firstPath} and ${secondPath}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction validateReadonlyInputs(\n\treadonlyInputs: readonly ManagedVmFilteredWorkspaceReadonlyInput[],\n): void {\n\tfor (const readonlyInput of readonlyInputs) {\n\t\tassertNormalizedRelativePath(readonlyInput.sourceRelativePath, 'Read-only input source path');\n\t\tassertNormalizedRelativePath(\n\t\t\treadonlyInput.destinationRelativePath,\n\t\t\t'Read-only input destination path',\n\t\t);\n\t}\n\tconst destinationPaths = readonlyInputs.map(\n\t\t(readonlyInput) => readonlyInput.destinationRelativePath,\n\t);\n\tconst seenDestinations = new Set<string>();\n\tfor (const destinationPath of destinationPaths) {\n\t\tif (seenDestinations.has(destinationPath)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Managed filtered workspace policy has a duplicate read-only destination: ${destinationPath}`,\n\t\t\t);\n\t\t}\n\t\tseenDestinations.add(destinationPath);\n\t}\n\tfor (let inputIndex = 0; inputIndex < destinationPaths.length; inputIndex += 1) {\n\t\tconst firstDestination = destinationPaths[inputIndex];\n\t\tif (!firstDestination) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (\n\t\t\tlet comparedIndex = inputIndex + 1;\n\t\t\tcomparedIndex < destinationPaths.length;\n\t\t\tcomparedIndex += 1\n\t\t) {\n\t\t\tconst secondDestination = destinationPaths[comparedIndex];\n\t\t\tif (secondDestination && pathsOverlap(firstDestination, secondDestination)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Managed filtered workspace policy has overlapping read-only destinations: ${firstDestination} and ${secondDestination}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertWithinPositiveVisibility(\n\trelativePath: string,\n\tvisiblePaths: readonly string[],\n\tfieldName: string,\n): void {\n\tif (!visiblePaths.some((visiblePath) => isEqualOrDescendant(relativePath, visiblePath))) {\n\t\tthrow new Error(`${fieldName} '${relativePath}' is outside the positive visibility allowlist.`);\n\t}\n}\n\nfunction readonlyInputSourceIsWritable(\n\treadonlyInput: ManagedVmFilteredWorkspaceReadonlyInput,\n\tpolicy: ManagedVmFilteredWorkspacePolicy,\n): boolean {\n\tconst sourcePath = readonlyInput.sourceRelativePath;\n\tif (\n\t\tpolicy.hiddenPaths.some((hiddenPath) => isEqualOrDescendant(sourcePath, hiddenPath)) ||\n\t\tpolicy.temporaryPaths.some((temporaryPath) => isEqualOrDescendant(sourcePath, temporaryPath)) ||\n\t\tpolicy.readonlyInputs.some((candidateInput) =>\n\t\t\tisEqualOrDescendant(sourcePath, candidateInput.destinationRelativePath),\n\t\t)\n\t) {\n\t\treturn false;\n\t}\n\tif (policy.visibility.kind === 'whole-root-writable') {\n\t\treturn true;\n\t}\n\treturn policy.visibility.writablePaths.some((writablePath) =>\n\t\tisEqualOrDescendant(sourcePath, writablePath),\n\t);\n}\n\n/**\n * Validates the complete policy before VM construction reaches a native provider.\n * Paths are rejected rather than silently normalized so one spelling has one meaning.\n */\nexport function validateManagedVmFilteredWorkspacePolicy(\n\tpolicy: ManagedVmFilteredWorkspacePolicy,\n): ManagedVmFilteredWorkspacePolicy {\n\tvalidatePathSet(policy.hiddenPaths, 'hidden path');\n\tvalidatePathSet(policy.temporaryPaths, 'temporary path');\n\tvalidateReadonlyInputs(policy.readonlyInputs);\n\n\tif (policy.visibility.kind === 'positive-paths') {\n\t\tvalidatePathSet(policy.visibility.visiblePaths, 'visible path', true);\n\t\tvalidatePathSet(policy.visibility.writablePaths, 'writable path', true);\n\t\tif (policy.visibility.visiblePaths.length === 0) {\n\t\t\tthrow new Error('A positive filtered workspace policy must admit at least one visible path.');\n\t\t}\n\t\tfor (const writablePath of policy.visibility.writablePaths) {\n\t\t\tassertWithinPositiveVisibility(writablePath, policy.visibility.visiblePaths, 'Writable path');\n\t\t}\n\t\tfor (const temporaryPath of policy.temporaryPaths) {\n\t\t\tassertWithinPositiveVisibility(\n\t\t\t\ttemporaryPath,\n\t\t\t\tpolicy.visibility.visiblePaths,\n\t\t\t\t'Temporary path',\n\t\t\t);\n\t\t}\n\t\tfor (const readonlyInput of policy.readonlyInputs) {\n\t\t\tassertWithinPositiveVisibility(\n\t\t\t\treadonlyInput.destinationRelativePath,\n\t\t\t\tpolicy.visibility.visiblePaths,\n\t\t\t\t'Read-only destination',\n\t\t\t);\n\t\t}\n\t\tfor (const hiddenPath of policy.hiddenPaths) {\n\t\t\tif (\n\t\t\t\t!policy.visibility.visiblePaths.some((visiblePath) => pathsOverlap(hiddenPath, visiblePath))\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Hidden path '${hiddenPath}' is outside the positive visibility allowlist.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const readonlyInput of policy.readonlyInputs) {\n\t\tif (readonlyInputSourceIsWritable(readonlyInput, policy)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Read-only input source '${readonlyInput.sourceRelativePath}' remains writable at its original workspace path.`,\n\t\t\t);\n\t\t}\n\t\tfor (const writablePath of policy.visibility.kind === 'positive-paths'\n\t\t\t? policy.visibility.writablePaths\n\t\t\t: []) {\n\t\t\tif (\n\t\t\t\twritablePath !== readonlyInput.destinationRelativePath &&\n\t\t\t\tisEqualOrDescendant(writablePath, readonlyInput.destinationRelativePath)\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`writable path '${writablePath}' has read-only ancestor '${readonlyInput.destinationRelativePath}'.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\thiddenPaths: [...policy.hiddenPaths],\n\t\treadonlyInputs: policy.readonlyInputs.map((readonlyInput) => ({ ...readonlyInput })),\n\t\ttemporaryPaths: [...policy.temporaryPaths],\n\t\tvisibility:\n\t\t\tpolicy.visibility.kind === 'whole-root-writable'\n\t\t\t\t? { kind: 'whole-root-writable' }\n\t\t\t\t: {\n\t\t\t\t\t\tkind: 'positive-paths',\n\t\t\t\t\t\tvisiblePaths: [...policy.visibility.visiblePaths],\n\t\t\t\t\t\twritablePaths: [...policy.visibility.writablePaths],\n\t\t\t\t\t},\n\t};\n}\n","import type {\n\tManagedVmCanonicalDirectoryIdentity,\n\tOwnedHostDirectory,\n\tOwnedHostDirectoryState,\n\tOwnedHostDirectoryTransfer,\n} from './managed-vm-contracts.js';\n\nexport interface OwnedHostDirectoryControllerOptions {\n\treadonly identity: ManagedVmCanonicalDirectoryIdentity;\n\treadonly onClose: () => void;\n\treadonly onConsume?: () => void;\n}\n\n/**\n * Creates the backend-neutral half of an owned-directory capability. Native\n * resources remain captured by provider callbacks and never enter this object.\n */\nexport function createOwnedHostDirectoryController(\n\toptions: OwnedHostDirectoryControllerOptions,\n): OwnedHostDirectory {\n\ttype InternalOwnedHostDirectoryState = OwnedHostDirectoryState | 'transferring';\n\tlet currentState: InternalOwnedHostDirectoryState = 'acquired';\n\tlet resourceClosed = false;\n\tlet resourceClosing = false;\n\tconst getInternalState = (): InternalOwnedHostDirectoryState => currentState;\n\n\tconst closeResource = (): boolean => {\n\t\tif (resourceClosed) {\n\t\t\treturn true;\n\t\t}\n\t\tif (resourceClosing) {\n\t\t\treturn false;\n\t\t}\n\t\tresourceClosing = true;\n\t\ttry {\n\t\t\toptions.onClose();\n\t\t\tresourceClosed = true;\n\t\t\treturn true;\n\t\t} finally {\n\t\t\tresourceClosing = false;\n\t\t}\n\t};\n\n\tconst transfer: OwnedHostDirectoryTransfer = {\n\t\tclose(): void {\n\t\t\tif (currentState !== 'adapter-owned') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (closeResource()) {\n\t\t\t\tcurrentState = 'closed';\n\t\t\t}\n\t\t},\n\t\tget identity(): ManagedVmCanonicalDirectoryIdentity {\n\t\t\treturn options.identity;\n\t\t},\n\t\tget state(): 'adapter-owned' | 'closed' {\n\t\t\treturn currentState === 'adapter-owned' ? 'adapter-owned' : 'closed';\n\t\t},\n\t};\n\n\treturn {\n\t\tclose(): void {\n\t\t\tif (currentState === 'adapter-owned') {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Owned host directory cannot be closed by its former owner after transfer.',\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (getInternalState() === 'closed') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (closeResource()) {\n\t\t\t\tcurrentState = 'closed';\n\t\t\t}\n\t\t},\n\t\tconsume(): OwnedHostDirectoryTransfer {\n\t\t\tif (currentState !== 'acquired') {\n\t\t\t\tthrow new Error(`Owned host directory cannot be consumed while ${currentState}.`);\n\t\t\t}\n\t\t\tcurrentState = 'transferring';\n\t\t\ttry {\n\t\t\t\toptions.onConsume?.();\n\t\t\t} catch (consumeError) {\n\t\t\t\ttry {\n\t\t\t\t\tif (closeResource()) {\n\t\t\t\t\t\tcurrentState = 'closed';\n\t\t\t\t\t}\n\t\t\t\t} catch (closeError) {\n\t\t\t\t\t// oxlint-disable-next-line preserve-caught-error -- AggregateError.errors retains cleanup failure while cause retains the transfer failure.\n\t\t\t\t\tthrow new AggregateError(\n\t\t\t\t\t\t[consumeError, closeError],\n\t\t\t\t\t\t'Owned host directory transfer and cleanup both failed.',\n\t\t\t\t\t\t{ cause: consumeError },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow consumeError;\n\t\t\t}\n\t\t\tif (getInternalState() === 'closed') {\n\t\t\t\tthrow new Error('Owned host directory closed during ownership transfer.');\n\t\t\t}\n\t\t\tcurrentState = 'adapter-owned';\n\t\t\treturn transfer;\n\t\t},\n\t\tget identity(): ManagedVmCanonicalDirectoryIdentity {\n\t\t\treturn options.identity;\n\t\t},\n\t\tget state(): OwnedHostDirectoryState {\n\t\t\treturn currentState === 'transferring' ? 'acquired' : currentState;\n\t\t},\n\t};\n}\n\nexport function assertPositiveHostProcessId(hostProcessId: number | null): number {\n\tif (!Number.isSafeInteger(hostProcessId) || hostProcessId === null || hostProcessId <= 0) {\n\t\tthrow new Error('A started managed VM must expose a positive stable host process ID.');\n\t}\n\treturn hostProcessId;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED