@finalai/final-agent-provider 0.6.4 → 0.8.0

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.
Files changed (106) hide show
  1. package/HOSTING.md +4 -4
  2. package/README.md +113 -2
  3. package/dist/modules/authoring-final-channel.mjs +2 -2
  4. package/dist/modules/authoring-final-channel.mjs.map +2 -2
  5. package/dist/modules/channel-factories.d.mts +5 -7
  6. package/dist/modules/channel-factories.mjs +4 -50
  7. package/dist/modules/channel-factories.mjs.map +2 -2
  8. package/dist/modules/channels/channel-utils.d.mts +132 -0
  9. package/dist/modules/channels/channel-utils.mjs +445 -0
  10. package/dist/modules/channels/channel-utils.mjs.map +7 -0
  11. package/dist/modules/channels/delivery.d.mts +5 -5
  12. package/dist/modules/channels/delivery.mjs.map +1 -1
  13. package/dist/modules/channels/direct-messaging.d.mts +2 -2
  14. package/dist/modules/channels/direct-messaging.mjs.map +2 -2
  15. package/dist/modules/channels/discord-dispatch.d.mts +17 -0
  16. package/dist/modules/channels/discord-dispatch.mjs +139 -0
  17. package/dist/modules/channels/discord-dispatch.mjs.map +7 -0
  18. package/dist/modules/channels/discord-gateway.d.mts +19 -0
  19. package/dist/modules/channels/discord-gateway.mjs +233 -0
  20. package/dist/modules/channels/discord-gateway.mjs.map +7 -0
  21. package/dist/modules/channels/discord.d.mts +9 -0
  22. package/dist/modules/channels/discord.mjs +904 -0
  23. package/dist/modules/channels/discord.mjs.map +7 -0
  24. package/dist/modules/channels/fake-platform.d.mts +2 -7
  25. package/dist/modules/channels/fake-platform.mjs +2 -38
  26. package/dist/modules/channels/fake-platform.mjs.map +2 -2
  27. package/dist/modules/channels/github.d.mts +5 -0
  28. package/dist/modules/channels/github.mjs +720 -0
  29. package/dist/modules/channels/github.mjs.map +7 -0
  30. package/dist/modules/channels/group-messaging.d.mts +2 -2
  31. package/dist/modules/channels/group-messaging.mjs.map +2 -2
  32. package/dist/modules/channels/index.d.mts +7 -3
  33. package/dist/modules/channels/index.mjs +7 -3
  34. package/dist/modules/channels/index.mjs.map +2 -2
  35. package/dist/modules/channels/linear.d.mts +4 -0
  36. package/dist/modules/channels/linear.mjs +621 -0
  37. package/dist/modules/channels/linear.mjs.map +7 -0
  38. package/dist/modules/channels/messaging-channel.d.mts +3 -3
  39. package/dist/modules/channels/messaging-channel.mjs +2 -2
  40. package/dist/modules/channels/messaging-channel.mjs.map +2 -2
  41. package/dist/modules/channels/phone.d.mts +8 -0
  42. package/dist/modules/channels/phone.mjs +382 -0
  43. package/dist/modules/channels/phone.mjs.map +7 -0
  44. package/dist/modules/channels/projection.mjs.map +1 -1
  45. package/dist/modules/channels/reply-receipts.d.mts +31 -0
  46. package/dist/modules/channels/reply-receipts.mjs +63 -0
  47. package/dist/modules/channels/reply-receipts.mjs.map +7 -0
  48. package/dist/modules/channels/routing.d.mts +1 -0
  49. package/dist/modules/channels/routing.mjs +5 -1
  50. package/dist/modules/channels/routing.mjs.map +2 -2
  51. package/dist/modules/channels/slack.d.mts +7 -0
  52. package/dist/modules/channels/slack.mjs +1134 -0
  53. package/dist/modules/channels/slack.mjs.map +7 -0
  54. package/dist/modules/channels/voice-recording.d.mts +7 -0
  55. package/dist/modules/channels/voice-recording.mjs +49 -0
  56. package/dist/modules/channels/voice-recording.mjs.map +7 -0
  57. package/dist/modules/channels/voice.d.mts +33 -0
  58. package/dist/modules/channels/voice.mjs +851 -0
  59. package/dist/modules/channels/voice.mjs.map +7 -0
  60. package/dist/modules/channels/webhook.d.mts +5 -0
  61. package/dist/modules/channels/webhook.mjs +76 -0
  62. package/dist/modules/channels/webhook.mjs.map +7 -0
  63. package/dist/modules/harnesses/acp-describe.mjs +1 -1
  64. package/dist/modules/harnesses/acp-describe.mjs.map +2 -2
  65. package/dist/modules/harnesses/fidelity.mjs +17 -17
  66. package/dist/modules/harnesses/fidelity.mjs.map +2 -2
  67. package/dist/modules/harnesses/remote-url.mjs.map +1 -1
  68. package/dist/modules/runtime/remote-host.mjs.map +1 -1
  69. package/dist/modules/sandboxes/build-scripts.mjs.map +1 -1
  70. package/dist/modules/sandboxes/bytes.d.mts +1 -0
  71. package/dist/modules/sandboxes/bytes.mjs +7 -1
  72. package/dist/modules/sandboxes/bytes.mjs.map +2 -2
  73. package/dist/modules/sandboxes/computer.mjs +5 -1
  74. package/dist/modules/sandboxes/computer.mjs.map +2 -2
  75. package/dist/modules/sandboxes/computers-api-transport.d.mts +1 -1
  76. package/dist/modules/sandboxes/computers-api-transport.mjs +8 -0
  77. package/dist/modules/sandboxes/computers-api-transport.mjs.map +2 -2
  78. package/dist/modules/sandboxes/device-api.mjs +8 -0
  79. package/dist/modules/sandboxes/device-api.mjs.map +2 -2
  80. package/dist/modules/sandboxes/device.mjs +6 -0
  81. package/dist/modules/sandboxes/device.mjs.map +2 -2
  82. package/dist/modules/sandboxes/paths.mjs.map +1 -1
  83. package/dist/modules/sandboxes/session.d.mts +1 -0
  84. package/dist/modules/sandboxes/session.mjs +106 -36
  85. package/dist/modules/sandboxes/session.mjs.map +3 -3
  86. package/dist/modules/sandboxes/testing/conformance.mjs +3 -0
  87. package/dist/modules/sandboxes/testing/conformance.mjs.map +2 -2
  88. package/dist/modules/sandboxes/testing/fake-machine.mjs +11 -0
  89. package/dist/modules/sandboxes/testing/fake-machine.mjs.map +2 -2
  90. package/dist/modules/sandboxes/transport.d.mts +1 -0
  91. package/dist/modules/sandboxes/transport.mjs.map +2 -2
  92. package/dist/modules/testing/harness.mjs +2 -2
  93. package/dist/modules/testing/harness.mjs.map +1 -1
  94. package/package.json +45 -19
  95. package/dist/modules/channels/address-context.d.mts +0 -7
  96. package/dist/modules/channels/address-context.mjs +0 -80
  97. package/dist/modules/channels/address-context.mjs.map +0 -7
  98. package/dist/modules/channels/agent-events.d.mts +0 -103
  99. package/dist/modules/channels/agent-events.mjs +0 -341
  100. package/dist/modules/channels/agent-events.mjs.map +0 -7
  101. package/dist/modules/channels/agent-schedules.d.mts +0 -25
  102. package/dist/modules/channels/agent-schedules.mjs +0 -96
  103. package/dist/modules/channels/agent-schedules.mjs.map +0 -7
  104. package/dist/modules/channels/service-input.d.mts +0 -22
  105. package/dist/modules/channels/service-input.mjs +0 -32
  106. package/dist/modules/channels/service-input.mjs.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/sandboxes/computer.ts"],
4
- "sourcesContent": ["import { ProcessInspectionOperation } from '@finalai/agent-protocol/process-inspection';\nimport {\n formatProviderRef,\n NetworkPolicy,\n packageRef,\n SandboxAccess,\n type JsonValue,\n} from '@finalai/agent-provider';\nimport {\n defineSandboxProvider,\n withSandboxNetworking,\n mapSandboxHandle,\n SandboxExecutionOperation,\n type SandboxNetworkingExtensionIface,\n type SandboxNetworkingControllerIface,\n type SandboxNetworkingControllerOptionsIface,\n materializeSandboxSeeds,\n PLATFORM_ENVIRONMENT_NAMES,\n platformProcessEnvironment,\n PortProtocol,\n reportPlatformNetworkPolicy,\n SandboxCapability,\n sandboxSeedArtifact,\n sandboxSeedArtifactSchema,\n sandboxSeedFiles,\n sandboxSeedFilesForStart,\n sandboxSeedIdentity,\n sandboxWorkspaceId,\n SandboxWorkspace,\n withPlatformEgressHosts,\n writePlatformFiles,\n type NetworkPolicyIface,\n type NetworkSandboxSessionIface,\n type SandboxGuidesIface,\n type SandboxPrepareContextIface,\n type SandboxProviderHandleIface,\n type SandboxProviderIface,\n type SandboxProviderImplementationIface,\n type SandboxCredentialsIface,\n type SandboxStartContextIface,\n} from '@finalai/agent-provider/sandbox';\nimport {\n ComputerBaseState,\n ComputerCommandMode,\n ComputerEgressPolicy,\n ComputerIdlePolicy,\n ComputerImageState,\n ComputerState,\n type ComputerBaseIface,\n type ComputerImageIface,\n type ComputerInfoIface,\n} from '@finalai/computers';\nimport * as z from 'zod';\nimport {\n HOME_BASELINE_MISSING_EXIT_CODE,\n HOME_BASELINE_ROOT,\n homeBaselineScript,\n homeContentScript,\n} from \"./build-scripts.mjs\";\nimport { sleep as defaultSleep, sha256Hex } from \"./bytes.mjs\";\nimport { computerEditor } from \"./computer-editor.mjs\";\nimport { readComputerSnapshot } from \"./computer-snapshots.mjs\";\nimport {\n createComputersApiClient,\n isComputersApiError,\n isComputersApiStatus,\n type ComputersApiClientIface,\n type ComputersApiConfigIface,\n type CreateComputerBodyIface,\n} from \"./computers-api.mjs\";\nimport { createComputerUseEndpoint } from \"./computers-api-mcp.mjs\";\nimport { createComputersApiTransport } from \"./computers-api-transport.mjs\";\nimport {\n COMPUTER_SANDBOX_SPECIFIER,\n computerEnvironmentSchema,\n computerOpenOptionsSchema,\n ComputerWorkspacePolicy,\n} from \"./environment.mjs\";\nimport {\n computeComputerArtifactKey,\n computerNeedsBuild,\n DEFAULT_COMPUTER_IMAGE,\n resolveComputerSpec,\n type ResolvedComputerSpecIface,\n} from \"./guide.mjs\";\nimport { createTransportSession, sessionForAccess } from \"./session.mjs\";\nimport type { SandboxTransportIface } from \"./transport.mjs\";\nimport {\n guideCommands,\n installGuideCommands,\n mountRepositories,\n repositoryPath,\n runWorkspaceSetup,\n startServices,\n WORKSPACE_ROOT,\n type GuideCommandIface,\n type SetupLogIface,\n} from \"./workspace-setup.mjs\";\n\nexport const computerWorkspaceName = async (options: {\n bindingId: string;\n conversationId: string | null;\n target: string;\n conversationWorkspace: boolean;\n}): Promise<string> =>\n options.conversationWorkspace && options.conversationId != null\n ? `ac-${(await sha256Hex(`${options.conversationId}:${options.target}`)).slice(0, 24)}`\n : `ab-${compactId(options.bindingId)}`;\n\nexport type { ComputersApiConfigIface } from \"./computers-api.mjs\";\nexport type { FinalPlatformAccessIface } from '@finalai/agent-provider/sandbox';\nexport { COMPUTER_SANDBOX_SPECIFIER } from \"./environment.mjs\";\nexport { computeComputerArtifactKey } from \"./guide.mjs\";\nexport type { ComputerGuideVersionIface } from \"./guide.mjs\";\nexport type { RepositoryCloneSourceIface } from \"./workspace-setup.mjs\";\n\n// The `computer` sandbox: a Final computer from the\n// public Computers API, set up from a computer setup guide, with lifecycle,\n// files and processes all through that API, exactly as a third-party provider\n// drives its vendor. Like every provider, the host runs this handle and serves\n// the handle RPC and MCP projection from it.\n//\n// A guide with build or verify steps is built once on a builder computer and\n// captured as a base (POST /v1/computers/:id/capture); its computers are created\n// from that base. Network and idle policies are create options, as for any\n// API customer.\n//\n// Guides, variables and repository credentials come from the contract's\n// prepare and start contexts (`guides`, `variables`, `repositories`), which the\n// host serves to every provider alike.\n\nexport interface ComputerSandboxLogIface {\n (message: string, fields?: Record<string, string | number | boolean | null>): void;\n}\n\nexport interface ComputerSandboxProviderConfigIface {\n // Transport options; the Computers API origin and token come from each\n // context's `credentials.computersAccess`.\n computersApi?: ComputersApiConfigIface;\n networking?: SandboxNetworkingExtensionIface;\n // A registry credential (`creg_...`) the organization stored for private image references.\n registryCredentialId?: string;\n // Image for an empty environment without an organization default guide.\n defaultImage?: string;\n regionSlug?: string;\n machine?: { vcpu?: number; memoryMb?: number; diskGb?: number };\n idleTimeoutSeconds?: number;\n // How long `start` waits for a registered image version to finish building.\n imageWaitMs?: number;\n imagePollMs?: number;\n // How long `prepare` waits for a guide's base capture to publish.\n buildWaitMs?: number;\n buildPollMs?: number;\n // How long ending a conversation workspace waits for its computer to shelve.\n shelveWaitMs?: number;\n shelvePollMs?: number;\n // How long start, resume and a guide build wait for a computer to run before\n // touching it (default 5 min); polled from runningPollMs (default 250 ms), doubling to 5 s.\n runningWaitMs?: number;\n runningPollMs?: number;\n log?: ComputerSandboxLogIface;\n randomUuid?: () => string;\n now?: () => number;\n sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;\n}\n\n// An `image` base: `imageVersionId` is the registered version (`cimv_...`) of an\n// image reference, registered at prepare; a `lineage:` image resolves its newest\n// version at start. A `captured` base is a guide's build, captured as a base\n// (`part_...`) that computers are created from.\nconst computerArtifactSchema = sandboxSeedArtifactSchema.extend({\n version: z.literal(1),\n key: z.string(),\n image: z.string(),\n diskGb: z.number().nullable(),\n base: z.discriminatedUnion('kind', [\n z.object({\n kind: z.literal('image'),\n image: z.string(),\n imageVersionId: z.string().nullable().default(null),\n }),\n z.object({ kind: z.literal('captured'), baseId: z.string() }),\n ]),\n});\n\nconst computerStateSchema = z.object({\n version: z.literal(1),\n computerId: z.string(),\n computerName: z.string(),\n workspace: z.nativeEnum(ComputerWorkspacePolicy),\n access: z.nativeEnum(SandboxAccess),\n guideVersionId: z.string().nullable(),\n setupHash: z.string().nullable(),\n setupPending: z.boolean().default(false),\n workspaceId: z.string().optional(),\n networkPolicySaved: z.boolean().optional(),\n});\n\n// The provider's own view of a computer while it sets it up.\ninterface SetupSessionIface {\n sandbox: NetworkSandboxSessionIface;\n transport: SandboxTransportIface;\n}\n\nexport type ComputerSandboxArtifact = z.infer<typeof computerArtifactSchema>;\nexport type ComputerSandboxState = z.infer<typeof computerStateSchema>;\n\n// What Build needs to know about a started computer beyond the handle.\nexport interface ComputerSandboxDescriptionIface {\n provider: 'computer';\n computerId: string;\n computerName: string;\n workspaceRoot: string;\n transport: string;\n guide: { slug: string; number: number } | null;\n repositories: { alias: string; path: string; repository: string }[];\n services: { name: string; readyUrl: string | null }[];\n commands: GuideCommandIface[];\n capabilities: SandboxCapability[];\n}\n\nexport interface ComputerSandboxSessionIface extends NetworkSandboxSessionIface {\n describe(): ComputerSandboxDescriptionIface;\n // What this computer's handle offers (the host reports it).\n readonly capabilities: readonly SandboxCapability[];\n}\n\nexport type ComputerSandboxProviderIface = SandboxProviderIface<\n JsonValue,\n JsonValue,\n ComputerSandboxArtifact,\n ComputerSandboxState,\n ComputerSandboxSessionIface\n>;\n\nexport interface ComputerSandboxErrorIface extends Error {\n code:\n | 'artifact_unavailable'\n | 'computer_gone'\n | 'computer_not_running'\n | 'invalid_environment'\n | 'build_failed';\n}\n\nconst computerSandboxError = (\n code: ComputerSandboxErrorIface['code'],\n message: string,\n): ComputerSandboxErrorIface =>\n Object.assign(new Error(message), { name: 'ComputerSandboxError', code });\n\n// FINAL_NODE_* and the session basics belong to the platform, as do the\n// platform environment's variables.\nconst RESERVED_ENV = new Set([\n ...PLATFORM_ENVIRONMENT_NAMES,\n 'DISPLAY',\n 'XDG_RUNTIME_DIR',\n 'PATH',\n 'HOME',\n 'USER',\n 'SHELL',\n 'HOSTNAME',\n]);\nconst isReservedEnvName = (name: string): boolean =>\n name.startsWith('FINAL_NODE_') || RESERVED_ENV.has(name);\n\nconst HTTP_TOKEN_LIFETIME_MS = 60 * 60_000;\nconst HTTP_TOKEN_RENEW_MS = 5 * 60_000;\n\n// Builds run from here; the capture scrub removes /tmp/*.\nconst BUILD_ROOT = '/tmp/final-build';\n// Guide publication supplies build inputs in files; agent revisions supply workspace seeds.\nconst seedsFor = (ctx: SandboxPrepareContextIface): Record<string, string> =>\n sandboxSeedFiles({\n files: ctx.resources.guide == null ? ctx.files : {},\n resources: ctx.resources,\n });\n// What the Computers API's capture scrub removes, so the home check skips it.\nconst CAPTURE_SCRUBBED_PATHS = [\n '/home/user/.bash_history',\n '/home/user/.zsh_history',\n '/home/user/.sh_history',\n '/home/user/.git-credentials',\n '/home/user/.config/gh/hosts.yml',\n '/home/user/.npmrc',\n '/home/user/.pypirc',\n '/home/user/.cargo/credentials',\n '/home/user/.cargo/credentials.toml',\n '/home/user/.aws',\n '/home/user/.config/gcloud',\n '/home/user/.azure',\n '/home/user/.docker/config.json',\n '/home/user/.netrc',\n '/home/user/.ssh',\n];\nconst BUILDER_IDLE_TIMEOUT_SECONDS = 2 * 60 * 60;\n\ninterface ComputerEgressConfigIface {\n egress: ComputerEgressPolicy;\n allow?: string[];\n}\nconst networkPolicyFor = (\n network: ComputerEgressConfigIface | null | undefined,\n): NetworkPolicyIface => ({\n mode:\n network?.egress === ComputerEgressPolicy.Internet\n ? NetworkPolicy.AllowAll\n : network?.egress === ComputerEgressPolicy.Allowlist\n ? NetworkPolicy.Allowlist\n : NetworkPolicy.DenyAll,\n allow: network?.allow ?? [],\n});\nconst computerEgressOf = (policy: NetworkPolicyIface): ComputerEgressConfigIface => {\n if (policy.mode === NetworkPolicy.AllowAll) return { egress: ComputerEgressPolicy.Internet };\n if (policy.mode === NetworkPolicy.DenyAll) return { egress: ComputerEgressPolicy.None };\n return { egress: ComputerEgressPolicy.Allowlist, allow: policy.allow ?? [] };\n};\n\n// An allowlist also admits the platform's egress hosts, so its proxy stays reachable.\nconst egressFor = (\n ctx: Pick<SandboxStartContextIface, 'platformEgressHosts'>,\n requested: NetworkPolicyIface,\n): ComputerEgressConfigIface => computerEgressOf(withPlatformEgressHosts(ctx, requested));\n\nconst LINEAGE_PREFIX = 'lineage:';\n\nconst portOf = (url: string): number | null => {\n try {\n const parsed = new URL(url);\n if (parsed.port !== '') return Number(parsed.port);\n return parsed.protocol === 'https:' ? 443 : 80;\n } catch {\n return null;\n }\n};\n\nconst compactId = (id: string): string => id.replaceAll('-', '');\n\nconst sandboxWorkspaceOf = {\n [ComputerWorkspacePolicy.Session]: SandboxWorkspace.Session,\n [ComputerWorkspacePolicy.Conversation]: SandboxWorkspace.Conversation,\n [ComputerWorkspacePolicy.Ephemeral]: SandboxWorkspace.Ephemeral,\n} satisfies Record<ComputerWorkspacePolicy, SandboxWorkspace>;\n\nconst isRunningState = (state: ComputerState): boolean =>\n state === ComputerState.Running ||\n state === ComputerState.Paused ||\n state === ComputerState.Resuming;\n\n// Nothing runs on these to pause, and the Computers API refuses a pause of them:\n// stopped or shelved (the disk at rest), errored (resume reports it gone), or deleted.\nconst hasNothingToPause = (state: ComputerState): boolean =>\n state === ComputerState.Stopped ||\n state === ComputerState.Shelved ||\n state === ComputerState.Error ||\n state === ComputerState.Deleted;\n\n// A refusal (409), a missing computer (404) or a failed host command (5xx) can\n// mean the computer came to rest on its own; a request or auth failure cannot.\nconst pauseMayHaveSettled = (error: unknown): boolean =>\n isComputersApiError(error) &&\n error.statusCode != null &&\n (error.statusCode === 404 || error.statusCode === 409 || error.statusCode >= 500);\n\nconst RUNNING_POLL_MAX_MS = 5_000;\n\nexport const createComputerSandboxProvider = (\n config: ComputerSandboxProviderConfigIface,\n): ComputerSandboxProviderIface => {\n const log: SetupLogIface = config.log ?? (() => undefined);\n const randomUuid = config.randomUuid ?? (() => crypto.randomUUID());\n const now = config.now ?? (() => Date.now());\n const sleep = config.sleep ?? defaultSleep;\n const defaultImage = config.defaultImage ?? DEFAULT_COMPUTER_IMAGE;\n const runningWaitMs = config.runningWaitMs ?? 5 * 60_000;\n\n const clientFor = (credentials: SandboxCredentialsIface | undefined): ComputersApiClientIface =>\n createComputersApiClient({ config: config.computersApi ?? {}, credentials });\n\n const registerImage = (client: ComputersApiClientIface, reference: string) =>\n client.registerImage(\n config.registryCredentialId == null\n ? { reference }\n : { reference, registryCredentialId: config.registryCredentialId },\n );\n\n // Computers are created from registered image versions, as any API customer's are.\n // A `lineage:` image is the newest ready version of that lineage (the\n // organization's or the platform's); a reference is registered once, at prepare,\n // and registered again here when its version expired.\n const readyImageVersion = async (\n client: ComputersApiClientIface,\n base: { image: string; imageVersionId: string | null },\n ): Promise<string> => {\n if (base.image.startsWith(LINEAGE_PREFIX)) {\n const lineage = base.image.slice(LINEAGE_PREFIX.length);\n const [newest] = await client.listImages({ lineage, state: ComputerImageState.Ready });\n if (newest == null) {\n throw computerSandboxError(\n 'artifact_unavailable',\n `the Computers API has no ready image version in lineage ${lineage}`,\n );\n }\n return newest.id;\n }\n let version: ComputerImageIface | null = null;\n if (base.imageVersionId != null) {\n try {\n version = await client.getImage(base.imageVersionId);\n } catch (error) {\n if (!isComputersApiStatus(error, 404)) throw error;\n }\n }\n if (version == null || version.state === ComputerImageState.Expired) {\n version = await registerImage(client, base.image);\n }\n const deadline = now() + (config.imageWaitMs ?? 15 * 60_000);\n while (\n version.state === ComputerImageState.Pending ||\n version.state === ComputerImageState.Building\n ) {\n if (now() >= deadline) throw new Error(`image ${base.image} is still building`);\n await sleep(config.imagePollMs ?? 5_000);\n version = await client.getImage(version.id);\n }\n if (version.state !== ComputerImageState.Ready) {\n throw computerSandboxError(\n 'artifact_unavailable',\n `image ${base.image} is ${version.state}${version.error == null ? '' : `: ${version.error}`}`,\n );\n }\n return version.id;\n };\n\n const loadVariables = async (\n ctx: SandboxStartContextIface,\n spec: ResolvedComputerSpecIface,\n ): Promise<Record<string, string>> => {\n const env: Record<string, string> = {};\n for (const [name, value] of Object.entries(spec.parameters.env)) {\n if (isReservedEnvName(name))\n throw computerSandboxError('invalid_environment', `${name} is reserved`);\n env[name] = value;\n }\n for (const name of spec.parameters.variables) {\n if (isReservedEnvName(name))\n throw computerSandboxError('invalid_environment', `${name} is reserved`);\n const value = await ctx.variables.get(name);\n if (value == null)\n throw computerSandboxError('invalid_environment', `variable ${name} is not set`);\n env[name] = value;\n }\n return env;\n };\n\n const mcpClosers = new Map<string, Set<() => Promise<void>>>();\n const closeComputerMcp = async (computerId: string) => {\n const results = await Promise.allSettled(\n [...(mcpClosers.get(computerId) ?? [])].map((close) => close()),\n );\n for (const result of results) if (result.status === 'rejected') throw result.reason;\n };\n const deletedAfterFenceError = async (options: {\n client: ComputersApiClientIface;\n computerId: string;\n cause: unknown;\n }): Promise<boolean> => {\n if (isComputersApiStatus(options.cause, 404)) return true;\n if (!isComputersApiStatus(options.cause, 409)) return false;\n try {\n const current = await options.client.getComputer(options.computerId);\n return current == null || current.state === ComputerState.Deleted;\n } catch (lookup) {\n throw new AggregateError(\n [options.cause, lookup],\n 'Computer fence and deletion lookup failed',\n );\n }\n };\n\n const buildHandle = async (args: {\n ctx: SandboxStartContextIface;\n client: ComputersApiClientIface;\n info: ComputerInfoIface;\n spec: ResolvedComputerSpecIface;\n access: SandboxAccess;\n env: () => Promise<Record<string, string>>;\n networking?: SandboxNetworkingControllerIface;\n networkingManaged?: boolean;\n beforeUse?: () => Promise<void>;\n closeSetup?: () => void;\n }): Promise<{ handle: SandboxProviderHandleIface<ComputerSandboxSessionIface> }> => {\n const { client, info, spec } = args;\n const commands = await guideCommands(spec.template);\n const commandHelp = commands\n .map(\n (command) =>\n `Guide command ${command.name}: bash ${command.path}${command.description == null ? '' : ` \u2014 ${command.description}`}`,\n )\n .join('\\n');\n const transport = createComputersApiTransport({ client, computerId: info.id });\n const ports = [\n ...new Set(\n spec.template.services.flatMap((service) => {\n const port = service.ready == null ? null : portOf(service.ready.url);\n return port == null ? [] : [port];\n }),\n ),\n ];\n let httpToken: { token: string; expiresAtMs: number } | null = null;\n const session = createTransportSession({\n id: info.id,\n description: `Final computer ${info.name}${spec.guide == null ? '' : ` (${spec.guide.title} v${spec.guide.number})`}${commands.length === 0 ? '' : `\\n${commandHelp}`}`,\n workspaceRoot: WORKSPACE_ROOT,\n transport,\n baseEnv: args.env,\n randomUuid,\n network: {\n ports,\n // The computer's hostname with a preview token, which opens its HTTP ports only.\n getPortEndpoint: async ({ port, protocol }) => {\n const managed =\n args.networkingManaged === true ||\n (args.access === SandboxAccess.Read &&\n (await needsWorkspaceNetworking(\n args.ctx,\n sandboxWorkspaceId({\n session: args.ctx.session,\n workspace: sandboxWorkspaceOf[args.spec.parameters.workspace],\n }),\n { access: args.access },\n )));\n if (managed && args.networking == null)\n throw new Error('Managed workspace previews require an active write binding');\n const deadline = (await args.networking?.authorizeExternalAccess())?.expiresAtMs;\n if (deadline != null && deadline <= now())\n throw new Error('Refresh workspace networking before preview access');\n const hostname = info.hostname ?? (await client.getComputer(info.id))?.hostname ?? null;\n if (hostname == null) throw new Error(`computer ${info.name} has no public hostname`);\n if (\n httpToken == null ||\n httpToken.expiresAtMs - now() < HTTP_TOKEN_RENEW_MS ||\n (deadline != null && httpToken.expiresAtMs > deadline)\n ) {\n const expiresAtMs = Math.min(now() + HTTP_TOKEN_LIFETIME_MS, deadline ?? Infinity);\n const token = await client.createPreviewToken({\n computerId: info.id,\n name: `agent sandbox ${args.ctx.session.bindingId}`,\n expiresAt: new Date(expiresAtMs),\n });\n httpToken = { token, expiresAtMs };\n }\n const scheme = protocol === PortProtocol.Ws ? 'wss' : 'https';\n return {\n url: `${scheme}://${port === 443 ? hostname : `${hostname}:${port}`}`,\n headers: { authorization: `Bearer ${httpToken.token}` },\n };\n },\n stop: async () => {\n const failures: unknown[] = [];\n try {\n if (args.networking != null)\n await client.setNetworkPolicy(\n info.id,\n { egress: ComputerEgressPolicy.None },\n { autoResume: false },\n );\n else if (args.access !== SandboxAccess.Read)\n await teardownComputer({\n ctx: args.ctx,\n computerId: info.id,\n computerName: info.name,\n workspace: spec.parameters.workspace,\n policySaved: args.networkingManaged === true,\n workspaceId: args.ctx.session.workspaceId,\n fence: true,\n finish: async () => {},\n });\n } catch (cause) {\n try {\n if (!(await deletedAfterFenceError({ client, computerId: info.id, cause })))\n failures.push(cause);\n } catch (lookup) {\n failures.push(lookup);\n }\n }\n try {\n await closeComputerMcp(info.id);\n } catch (cause) {\n if (!isComputersApiStatus(cause, 404)) failures.push(cause);\n }\n try {\n await client.action(info.id, 'stop');\n } catch (cause) {\n if (!isComputersApiStatus(cause, 404)) failures.push(cause);\n }\n transport.close();\n args.closeSetup?.();\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1)\n throw new AggregateError(failures, 'Computer stop or networking fence failed');\n },\n destroy: async () => {\n const finish = async () => {\n const failures: unknown[] = [];\n try {\n await closeComputerMcp(info.id);\n } catch (cause) {\n failures.push(cause);\n }\n transport.close();\n\n try {\n await client.action(info.id, 'delete');\n } catch (cause) {\n if (!isComputersApiStatus(cause, 404)) failures.push(cause);\n }\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1)\n throw new AggregateError(failures, 'Computer delete or MCP cleanup failed');\n };\n if (args.networking == null && args.access !== SandboxAccess.Read)\n await teardownComputer({\n ctx: args.ctx,\n computerId: info.id,\n computerName: info.name,\n workspace: spec.parameters.workspace,\n policySaved: args.networkingManaged === true,\n workspaceId: args.ctx.session.workspaceId,\n fence: true,\n finish,\n });\n else await finish();\n },\n },\n });\n let computerUseInstalled: boolean | null = null;\n if (args.access !== SandboxAccess.Read) {\n try {\n computerUseInstalled = (await client.computerUseStatus(info.id, AbortSignal.timeout(1000)))\n .installed;\n } catch {\n /* Optional discovery must never fail the sandbox. */\n }\n }\n const computerUse =\n args.access === SandboxAccess.Read || computerUseInstalled === false\n ? null\n : createComputerUseEndpoint({ client, computerId: info.id, cwd: WORKSPACE_ROOT });\n const closeMcp = async () => {\n try {\n await computerUse?.close();\n } catch (error) {\n log('computer_use.close_failed', {\n computerId: info.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n const closers = mcpClosers.get(info.id);\n closers?.delete(closeMcp);\n if (closers?.size === 0) mcpClosers.delete(info.id);\n };\n if (computerUse != null) {\n const closers = mcpClosers.get(info.id) ?? new Set<() => Promise<void>>();\n closers.add(closeMcp);\n mcpClosers.set(info.id, closers);\n }\n const capabilities = [SandboxCapability.Files, SandboxCapability.Ports];\n let screenAvailable = false;\n try {\n screenAvailable = (await client.screenStatus(info.id, AbortSignal.timeout(1000))).available;\n } catch {\n /* Optional desktop discovery leaves headless computers usable. */\n }\n if (screenAvailable) capabilities.push(SandboxCapability.Screen);\n if (computerUse != null) capabilities.push(SandboxCapability.ComputerUse);\n if (args.access !== SandboxAccess.Read)\n capabilities.push(SandboxCapability.Process, SandboxCapability.NetworkPolicy);\n if (args.access === SandboxAccess.Write && args.networking != null)\n capabilities.push(...(config.networking?.capabilities ?? []));\n const description: ComputerSandboxDescriptionIface = {\n provider: 'computer',\n computerId: info.id,\n computerName: info.name,\n workspaceRoot: WORKSPACE_ROOT,\n transport: transport.kind,\n guide: spec.guide == null ? null : { slug: spec.guide.slug, number: spec.guide.number },\n repositories: spec.parameters.repositories.map((repository) => ({\n alias: repository.alias,\n path: repositoryPath(repository.alias),\n repository: repository.repository,\n })),\n services: spec.template.services.map((service) => ({\n name: service.name,\n readyUrl: service.ready?.url ?? null,\n })),\n commands,\n capabilities,\n };\n const full: ComputerSandboxSessionIface = {\n ...session,\n setNetworkPolicy: async (policy) => {\n if (args.access === SandboxAccess.Read)\n throw new Error('this sandbox binding is read-only');\n await client.setNetworkPolicy(info.id, egressFor(args.ctx, policy));\n },\n describe: () => description,\n capabilities,\n };\n if (computerUse != null) full.computerUse = async () => computerUse.endpoint;\n if (screenAvailable) {\n full.screen = (options) => client.openScreen(info.id, options);\n }\n const sandbox = full;\n let handle: SandboxProviderHandleIface<ComputerSandboxSessionIface> = {\n sandbox,\n onSandboxStop: async () => {\n const failures: unknown[] = [];\n try {\n if (args.networking != null)\n await client.setNetworkPolicy(\n info.id,\n { egress: ComputerEgressPolicy.None },\n { autoResume: false },\n );\n else\n await teardownComputer({\n ctx: args.ctx,\n computerId: info.id,\n computerName: info.name,\n workspace: spec.parameters.workspace,\n policySaved: args.networkingManaged === true,\n workspaceId: args.ctx.session.workspaceId,\n fence: true,\n finish: async () => {},\n });\n } catch (cause) {\n try {\n if (!(await deletedAfterFenceError({ client, computerId: info.id, cause })))\n failures.push(cause);\n } catch (lookup) {\n failures.push(lookup);\n }\n }\n for (const finish of [closeMcp, () => transport.close(), () => args.closeSetup?.()]) {\n try {\n await finish();\n } catch (cause) {\n failures.push(cause);\n }\n }\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1)\n throw new AggregateError(failures, 'Computer fence and MCP cleanup failed');\n },\n onSandboxDelete: async () => {\n const finish = async () => {\n const failures: unknown[] = [];\n try {\n await closeMcp();\n } catch (cause) {\n failures.push(cause);\n }\n transport.close();\n args.closeSetup?.();\n try {\n await client.action(info.id, 'delete');\n } catch (cause) {\n if (!isComputersApiStatus(cause, 404)) failures.push(cause);\n }\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1)\n throw new AggregateError(failures, 'Computer delete or MCP cleanup failed');\n };\n if (args.networking == null)\n await teardownComputer({\n ctx: args.ctx,\n computerId: info.id,\n computerName: info.name,\n workspace: spec.parameters.workspace,\n policySaved: args.networkingManaged === true,\n workspaceId: args.ctx.session.workspaceId,\n fence: true,\n finish,\n });\n else await finish();\n },\n onRuntimeShutdown: async () => {\n try {\n await closeMcp();\n } finally {\n transport.close();\n args.closeSetup?.();\n }\n },\n };\n if (args.networking != null)\n handle = await withSandboxNetworking({\n handle,\n controller: args.networking,\n access: args.access,\n initialized: true,\n fetch: config.networking?.fetch,\n executionPolicy: args.ctx.executionPolicy,\n beforeUse: args.beforeUse,\n });\n else if (config.networking != null)\n handle = await withSandboxNetworking({\n handle,\n access: args.access,\n fetch: config.networking?.fetch,\n executionPolicy: args.ctx.executionPolicy,\n admission: async () => {\n if (\n await needsWorkspaceNetworking(\n args.ctx,\n sandboxWorkspaceId({\n session: args.ctx.session,\n workspace: sandboxWorkspaceOf[args.spec.parameters.workspace],\n }),\n { access: args.access },\n )\n )\n throw new Error(\n 'Workspace networking changed; reconnect this sandbox before running tools',\n );\n },\n });\n return {\n handle: mapSandboxHandle({\n handle,\n mapSandbox: (sandbox) => sessionForAccess(sandbox, args.access),\n }),\n };\n };\n\n // Setup (repositories, workspace.setup, services) is the provider's own work, so it\n // runs with the organization's credential, never through the binding's lease: a\n // ordinary read binding gets setup; managed reads defer it until guarded write access.\n const setupSession = (args: {\n client: ComputersApiClientIface;\n info: ComputerInfoIface;\n env: () => Promise<Record<string, string>>;\n }): SetupSessionIface => {\n const transport = createComputersApiTransport({\n client: args.client,\n computerId: args.info.id,\n });\n const sandbox = createTransportSession({\n id: args.info.id,\n description: `setup of ${args.info.name}`,\n workspaceRoot: WORKSPACE_ROOT,\n transport,\n baseEnv: args.env,\n randomUuid,\n network: {\n ports: [],\n getPortEndpoint: async () => {\n throw new Error('setup sessions expose no ports');\n },\n stop: async () => undefined,\n destroy: async () => undefined,\n },\n });\n return { sandbox, transport };\n };\n\n const createNetworkingController = (\n options: SandboxNetworkingControllerOptionsIface,\n ): SandboxNetworkingControllerIface => {\n try {\n if (config.networking == null) throw new Error('Workspace networking extension is required');\n return config.networking.controller(options);\n } catch (cause) {\n options.onClose?.();\n throw cause;\n }\n };\n const workspaceNetworking = (args: {\n ctx: SandboxStartContextIface;\n sandbox: NetworkSandboxSessionIface;\n client: ComputersApiClientIface;\n info: ComputerInfoIface;\n spec: ResolvedComputerSpecIface;\n onClose: () => void;\n initialNetworkPolicy: NetworkPolicyIface;\n enabled: boolean;\n access: SandboxAccess;\n }) => {\n if (config.networking == null || !args.enabled) return undefined;\n return createNetworkingController({\n ctx: {\n platformEgressHosts: args.ctx.platformEgressHosts,\n platformNetworkPolicy: args.ctx.platformNetworkPolicy,\n organizationId: args.ctx.session.organizationId,\n credentials: args.ctx.credentials,\n actingUser: args.ctx.actingUser,\n bindings: args.ctx.bindings,\n },\n sandbox: args.sandbox,\n workspaceId: sandboxWorkspaceId({\n session: args.ctx.session,\n workspace: sandboxWorkspaceOf[args.spec.parameters.workspace],\n }),\n access: args.access,\n onClose: args.onClose,\n initialNetworkPolicy: args.initialNetworkPolicy,\n namespaceExists: async () => {\n const current = await args.client.getComputer(args.info.id);\n return current?.state === ComputerState.Running;\n },\n log,\n afterBlock: () =>\n args.client.setNetworkPolicy(\n args.info.id,\n { egress: ComputerEgressPolicy.None },\n { autoResume: false },\n ),\n afterGuard: (policy) =>\n args.client.setNetworkPolicy(\n args.info.id,\n egressFor(args.ctx, policy ?? { mode: NetworkPolicy.DenyAll }),\n { autoResume: false },\n ),\n });\n };\n const managedWorkspaces = new Set<string>();\n const savedPolicyWorkspaces = new Set<string>();\n const preservePolicy = async (args: {\n ctx: SandboxStartContextIface;\n workspaceId: string;\n policy: NetworkPolicyIface;\n }) => {\n if (config.networking == null) throw new Error('Workspace networking extension is required');\n const retained = await config.networking.prepare({\n ctx: {\n platformEgressHosts: args.ctx.platformEgressHosts,\n platformNetworkPolicy: args.ctx.platformNetworkPolicy,\n organizationId: args.ctx.session.organizationId,\n credentials: args.ctx.credentials,\n actingUser: args.ctx.actingUser,\n bindings: args.ctx.bindings,\n },\n workspaceId: args.workspaceId,\n policy: args.policy,\n });\n await reportPlatformNetworkPolicy(args.ctx, retained ?? args.policy);\n savedPolicyWorkspaces.add(args.ctx.session.organizationId + ':' + args.workspaceId);\n };\n const needsWorkspaceNetworking = async (\n ctx: SandboxStartContextIface,\n workspaceId: string,\n query: { teardown?: boolean; access?: SandboxAccess } = {},\n ): Promise<boolean> => {\n const needed =\n (await config.networking?.enabled({\n ctx: {\n platformEgressHosts: ctx.platformEgressHosts,\n organizationId: ctx.session.organizationId,\n credentials: ctx.credentials,\n actingUser: ctx.actingUser,\n bindings: ctx.bindings,\n },\n workspaceId,\n access: SandboxAccess.Write,\n ...query,\n })) ?? false;\n if (needed) managedWorkspaces.add(ctx.session.organizationId + ':' + workspaceId);\n return needed || managedWorkspaces.has(ctx.session.organizationId + ':' + workspaceId);\n };\n const teardownComputer = async (args: {\n ctx: SandboxStartContextIface;\n computerId: string;\n computerName: string;\n workspace: ComputerWorkspacePolicy;\n policySaved: boolean;\n workspaceId: string | undefined;\n fence: boolean;\n finish: () => Promise<void>;\n }): Promise<string> => {\n let workspaceId: string;\n try {\n workspaceId =\n args.workspaceId ??\n sandboxWorkspaceId({\n session: args.ctx.session,\n workspace: sandboxWorkspaceOf[args.workspace],\n });\n } catch (cause) {\n try {\n await args.finish();\n } catch (cleanup) {\n throw new AggregateError([cause, cleanup], 'Computer identity and teardown failed');\n }\n throw cause;\n }\n const failures: unknown[] = [];\n let managed =\n args.policySaved ||\n managedWorkspaces.has(args.ctx.session.organizationId + ':' + workspaceId);\n let queryFailed = false;\n try {\n managed =\n (await needsWorkspaceNetworking(args.ctx, workspaceId, { teardown: true })) ||\n args.policySaved;\n } catch (cause) {\n failures.push(cause);\n queryFailed = true;\n }\n const results = await Promise.allSettled([\n (async () => {\n if (managed && args.fence) {\n const client = clientFor(args.ctx.credentials);\n let mayFence =\n args.policySaved ||\n savedPolicyWorkspaces.has(args.ctx.session.organizationId + ':' + workspaceId);\n try {\n if (config.networking != null) {\n await preservePolicy({\n ctx: args.ctx,\n workspaceId,\n policy: networkPolicyFor(await client.getNetworkPolicy(args.computerId)),\n });\n mayFence = true;\n }\n } catch (cause) {\n if (isComputersApiStatus(cause, 404)) mayFence = false;\n else failures.push(cause);\n }\n if (mayFence) {\n try {\n await client.setNetworkPolicy(\n args.computerId,\n { egress: ComputerEgressPolicy.None },\n { autoResume: false },\n );\n } catch (cause) {\n let settled = isComputersApiStatus(cause, 404);\n if (!settled && isComputersApiStatus(cause, 409)) {\n try {\n const latest = await client.getComputer(args.computerId);\n settled = latest == null || latest.state === ComputerState.Deleted;\n } catch (lookup) {\n failures.push(lookup);\n }\n }\n if (!settled) failures.push(cause);\n }\n }\n }\n await args.finish();\n })(),\n (async () => {\n if (managed && config.networking == null)\n throw new Error(\n 'Managed Computer teardown requires the workspace egress integration to revoke Device access',\n );\n if (config.networking != null && (managed || queryFailed))\n await config.networking.suspend({\n ctx: {\n organizationId: args.ctx.session.organizationId,\n credentials: args.ctx.credentials,\n actingUser: args.ctx.actingUser,\n bindings: args.ctx.bindings,\n },\n workspaceId,\n });\n })(),\n ]);\n for (const result of results) if (result.status === 'rejected') failures.push(result.reason);\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1)\n throw new AggregateError(failures, 'Computer teardown and egress revocation failed');\n return workspaceId;\n };\n\n // A captured base, once it is ready; a failed or expired one must be built again.\n const awaitBase = async (\n client: ComputersApiClientIface,\n baseId: string,\n key: string,\n ): Promise<ComputerBaseIface> => {\n const deadline = now() + (config.buildWaitMs ?? 30 * 60_000);\n for (;;) {\n const base = await client.getBase(baseId);\n if (base == null || base.state === ComputerBaseState.Expired) {\n throw computerSandboxError(\n 'artifact_unavailable',\n `computer base ${key} (${baseId}) is ${base == null ? 'gone' : 'expired'}; prepare it again`,\n );\n }\n if (base.state === ComputerBaseState.Ready) return base;\n if (base.state === ComputerBaseState.Failed) {\n throw computerSandboxError(\n 'build_failed',\n `computer base ${key} failed to capture: ${base.error ?? 'unknown error'}`,\n );\n }\n if (now() >= deadline) throw new Error(`computer base ${key} is still capturing`);\n await sleep(config.buildPollMs ?? 5_000);\n }\n };\n\n // The Computers API answers a computer it created or started before the\n // computer has a host, and refuses commands and file writes until it runs\n // (`autoResume: false`), so nothing touches it before this resolves. Only\n // Running counts: a paused computer still refuses them.\n const awaitComputerRunning = async (\n client: ComputersApiClientIface,\n computerId: string,\n timeoutMs: number,\n ): Promise<ComputerInfoIface> => {\n const deadline = now() + timeoutMs;\n let pollMs = config.runningPollMs ?? 250;\n for (;;) {\n const computer = await client.getComputer(computerId);\n if (computer == null || computer.state === ComputerState.Deleted)\n throw computerSandboxError('computer_gone', `computer ${computerId} is gone`);\n if (computer.state === ComputerState.Error)\n throw computerSandboxError(\n 'computer_gone',\n `computer ${computer.name} is in the Error state`,\n );\n if (computer.state === ComputerState.Running) return computer;\n const left = deadline - now();\n if (left <= 0)\n throw computerSandboxError(\n 'computer_not_running',\n `computer ${computer.name} was not running within ${Math.round(timeoutMs / 1000)} s (it is ${ComputerState[computer.state]})`,\n );\n await sleep(Math.min(pollMs, left));\n pollMs = Math.min(pollMs * 2, RUNNING_POLL_MAX_MS);\n }\n };\n\n const awaitShelved = async (client: ComputersApiClientIface, computerId: string) => {\n const deadline = now() + (config.shelveWaitMs ?? 5 * 60_000);\n for (;;) {\n const computer = await client.getComputer(computerId);\n if (\n computer == null ||\n computer.state === ComputerState.Shelved ||\n computer.state === ComputerState.Deleted\n )\n return;\n if (computer.state === ComputerState.Error)\n throw computerSandboxError('computer_gone', `computer ${computerId} failed to shelve`);\n if (now() >= deadline) throw new Error(`computer ${computerId} is still shelving`);\n await sleep(config.shelvePollMs ?? 2_000);\n }\n };\n\n // Run build.steps, then build.verify, on a builder computer of the guide's\n // image, captured as a base its computers are created from.\n const build = async (\n ctx: SandboxPrepareContextIface,\n spec: ResolvedComputerSpecIface,\n key: string,\n ): Promise<ComputerSandboxArtifact> => {\n const client = clientFor(ctx.credentials);\n const diskGb = config.machine?.diskGb ?? null;\n const imageVersionId = await readyImageVersion(client, {\n image: spec.image,\n imageVersionId: null,\n });\n const body: CreateComputerBodyIface = {\n name: `ag-${key.slice(4, 20)}-${compactId(randomUuid()).slice(0, 8)}`,\n imageVersionId,\n ...config.machine,\n // The base is the root disk; a user volume would keep /home and /workspaces off it.\n userVolumeGb: null,\n // Nothing secret at create: the create env lands in the guest.\n env: {},\n commandMode: ComputerCommandMode.Custom,\n customCommand: 'sleep infinity',\n autoResume: false,\n idleTimeoutSeconds: BUILDER_IDLE_TIMEOUT_SECONDS,\n tags: ['final-agent-sandbox-build'],\n };\n if (config.regionSlug != null) body.regionSlug = config.regionSlug;\n // One builder per attempt: a retry after a failed build starts clean.\n const builder = await client.createComputer(\n body,\n `agent-guide-build-${(await sha256Hex(`${key}:${randomUuid()}`)).slice(0, 32)}`,\n );\n ctx.log?.(`building computer base ${key} on ${builder.name}`);\n try {\n await awaitComputerRunning(client, builder.id, runningWaitMs);\n const sandbox = setupSession({ client, info: builder, env: async () => ({}) }).sandbox;\n const prepared = await sandbox.run({\n command: '/bin/sh',\n args: ['-c', `mkdir -p ${BUILD_ROOT}\\n${homeBaselineScript()}`],\n cwd: '/',\n });\n if (prepared.exitCode !== 0) {\n throw computerSandboxError('build_failed', 'failed to record the pre-build home baseline');\n }\n const steps = [\n ...spec.template.build.steps.map((step) => ({ step, label: 'build step' })),\n ...spec.template.build.verify.map((step) => ({ step, label: 'verify step' })),\n ];\n for (const [index, { step, label }] of steps.entries()) {\n ctx.log?.(`${label} ${index + 1}/${steps.length}`);\n const result = await sandbox.run({\n command: `set -eu\\n${step.run}`,\n shell: true,\n cwd: BUILD_ROOT,\n timeoutMs: step.timeoutMinutes * 60_000,\n });\n if (result.exitCode !== 0) {\n throw computerSandboxError(\n 'build_failed',\n `${label} ${index + 1} failed (exit ${result.exitCode}): ${result.stderr.trim().slice(-2000)}`,\n );\n }\n }\n const homeContent = await sandbox.run({\n command: '/bin/sh',\n args: ['-c', homeContentScript({ excludedPaths: CAPTURE_SCRUBBED_PATHS })],\n cwd: '/',\n });\n if (homeContent.exitCode === HOME_BASELINE_MISSING_EXIT_CODE) {\n throw computerSandboxError(\n 'build_failed',\n `build steps removed ${HOME_BASELINE_ROOT}, which the home content check needs; leave /var/tmp/final-template-build in place.`,\n );\n }\n if (homeContent.exitCode !== 0) {\n const offending = homeContent.stdout\n .trim()\n .split('\\n')\n .filter((line) => line !== '');\n throw computerSandboxError(\n 'build_failed',\n `build steps left content under /home or /workspaces, which each computer's own volume hides: ${offending.join(', ')}. Install tools and configuration to system paths such as /usr/local, or point the tool's home there (for example CARGO_HOME=/usr/local/cargo, RUSTUP_HOME=/usr/local/rustup, NVM_DIR=/usr/local/nvm), put home files in /usr/share/final-vm/home-skel, and use /etc/gitconfig instead of git config --global.`,\n );\n }\n const captured = await client.captureComputer(builder.id, { retained: true });\n if (!captured.retained)\n throw computerSandboxError(\n 'build_failed',\n 'the Computers API did not retain the built base',\n );\n ctx.log?.(`capturing computer base ${key} as ${captured.id}`);\n const base = await awaitBase(client, captured.id, key);\n return {\n version: 1,\n key,\n image: spec.image,\n diskGb: diskGb ?? base.diskGb,\n seedFiles: {},\n base: { kind: 'captured', baseId: base.id },\n };\n } finally {\n // The capture stopped the builder; it is not part of the base.\n try {\n await client.action(builder.id, 'delete');\n } catch (error) {\n log('computer_sandbox.builder_delete_failed', {\n computerId: builder.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n };\n\n const environment = (\n rawOptions?: JsonValue,\n ): SandboxProviderImplementationIface<\n JsonValue,\n ComputerSandboxArtifact,\n ComputerSandboxState,\n ComputerSandboxSessionIface\n > => {\n const parsed = computerEnvironmentSchema.safeParse(rawOptions ?? {});\n if (!parsed.success) {\n throw computerSandboxError(\n 'invalid_environment',\n `invalid computer environment: ${parsed.error.message}`,\n );\n }\n const options = parsed.data;\n const resolve = (guides: SandboxGuidesIface): Promise<ResolvedComputerSpecIface> =>\n resolveComputerSpec({ options, guides, defaultImage });\n const keyFor = async (\n spec: ResolvedComputerSpecIface,\n files: Record<string, string>,\n ): Promise<string> => {\n const baseKey = await computeComputerArtifactKey({\n image: spec.image,\n template: spec.template,\n diskGb: config.machine?.diskGb ?? null,\n });\n return Object.keys(files).length === 0\n ? baseKey\n : `${baseKey}-s${await sha256Hex(sandboxSeedIdentity(files))}`;\n };\n\n const startServicesFor = async (args: {\n setup: SetupSessionIface;\n spec: ResolvedComputerSpecIface;\n env: () => Promise<Record<string, string>>;\n }): Promise<void> => {\n await startServices({\n sandbox: args.setup.sandbox,\n transport: args.setup.transport,\n template: args.spec.template,\n // Services run for the computer's life, with the platform's values as they are now.\n env: await args.env(),\n randomUuid,\n log,\n });\n };\n\n const awaitRunning = (\n ctx: SandboxStartContextIface,\n rawState: Pick<ComputerSandboxState, 'computerId'>,\n options: { timeoutMs: number },\n ): Promise<ComputerInfoIface> =>\n awaitComputerRunning(\n clientFor(ctx.credentials),\n computerStateSchema.pick({ computerId: true }).parse(rawState).computerId,\n options.timeoutMs,\n );\n\n return {\n processes: async (ctx, rawState, request) => {\n const state = computerStateSchema.parse(rawState);\n if (\n request.operation === ProcessInspectionOperation.Stop &&\n state.access === SandboxAccess.Read\n )\n throw new Error('stopping processes requires execute access');\n const result = await clientFor(ctx.credentials).inspectProcesses(state.computerId, request);\n return request.operation === ProcessInspectionOperation.Available && 'available' in result\n ? { ...result, canStop: state.access !== SandboxAccess.Read }\n : result;\n },\n editor: async (ctx, rawState, request) => {\n const state = computerStateSchema.parse(rawState);\n if (state.access !== SandboxAccess.Write) {\n if (request.operation === 'available') return { available: false };\n throw new Error('editor requires write access');\n }\n const client = clientFor(ctx.credentials);\n const open = (expiresAtMs?: number) =>\n computerEditor({\n client,\n computerId: state.computerId,\n request,\n randomUuid,\n expiresAtMs,\n });\n if (request.operation === 'available' || request.operation === 'close') return open();\n const workspaceId = ctx.workspaceId ?? state.workspaceId;\n if (\n state.networkPolicySaved === true &&\n ctx.workspaceId != null &&\n state.workspaceId != null &&\n ctx.workspaceId !== state.workspaceId\n )\n throw new Error('Editor workspace identity does not match its retained provider state');\n if (config.networking == null) {\n if (state.networkPolicySaved === true)\n throw new Error('Device networking control is required before opening this editor');\n return open();\n }\n if (workspaceId == null)\n throw new Error(\n 'The host must supply logical workspace identity before opening an egress-aware editor',\n );\n const managedKey = ctx.organizationId + ':' + workspaceId;\n const managed =\n state.networkPolicySaved === true ||\n managedWorkspaces.has(managedKey) ||\n (await config.networking.enabled({ ctx, workspaceId, access: SandboxAccess.Write }));\n if (!managed) return open();\n managedWorkspaces.add(managedKey);\n config.networking.validateWorkspaceId?.(workspaceId);\n const info = await client.getComputer(state.computerId);\n if (info == null || info.state !== ComputerState.Running)\n throw new Error('Computer must be running before editor access');\n const initialNetworkPolicy = networkPolicyFor(await client.getNetworkPolicy(info.id));\n const setup = setupSession({ client, info, env: async () => ({}) });\n const manager = createNetworkingController({\n sandbox: setup.sandbox,\n onClose: () => setup.transport.close(),\n workspaceId,\n ctx,\n access: SandboxAccess.Write,\n initialNetworkPolicy,\n afterBlock: () =>\n client.setNetworkPolicy(\n info.id,\n { egress: ComputerEgressPolicy.None },\n { autoResume: false },\n ),\n afterGuard: async (policy) =>\n client.setNetworkPolicy(\n info.id,\n policy == null ? { egress: ComputerEgressPolicy.None } : egressFor(ctx, policy),\n { autoResume: false },\n ),\n allowOwnerChange: false,\n });\n const { expiresAtMs: deadline } = await manager\n .authorizeExternalAccess()\n .finally(async () => {\n try {\n await manager.close();\n } finally {\n setup.transport.close();\n }\n });\n if (deadline != null && deadline <= now())\n throw new Error('Refresh workspace egress before opening the editor');\n return open(deadline ?? undefined);\n },\n readSnapshot: async (ctx, rawState, request) => {\n const state = computerStateSchema.parse(rawState);\n return readComputerSnapshot({\n client: clientFor(ctx.credentials),\n computerId: state.computerId,\n request,\n });\n },\n // The merged parameters' workspace: the binding's, else the saved version's default.\n workspace: async (ctx) =>\n sandboxWorkspaceOf[(await resolve(ctx.guides)).parameters.workspace],\n // Screen and computer-use availability is known only after attaching the actual Computer.\n additionalCapabilities: async () => config.networking?.capabilities.slice() ?? [],\n artifactKey: async (ctx) => keyFor(await resolve(ctx.guides), seedsFor(ctx)),\n // Registers an image reference so its version builds ahead of the first start;\n // a lineage needs nothing until then.\n prepare: async (ctx) => {\n const spec = await resolve(ctx.guides);\n const seedFiles = seedsFor(ctx);\n const key = await keyFor(spec, seedFiles);\n const seedArtifact = await sandboxSeedArtifact(ctx, seedFiles);\n if (computerNeedsBuild(spec)) {\n const baseKey = await keyFor(spec, {});\n const prepared = spec.guide?.preparedArtifact;\n if (\n prepared?.key === baseKey &&\n prepared.providerRef === formatProviderRef(packageRef(COMPUTER_SANDBOX_SPECIFIER))\n ) {\n const cached = computerArtifactSchema.safeParse(prepared.artifact);\n if (\n cached.success &&\n cached.data.key === baseKey &&\n cached.data.base.kind === 'captured'\n ) {\n const base = await clientFor(ctx.credentials).getBase(cached.data.base.baseId);\n if (base?.state === ComputerBaseState.Ready) {\n if (!base.retained) {\n const retained = await clientFor(ctx.credentials).setBaseRetention(base.id, true);\n if (!retained.retained)\n throw computerSandboxError(\n 'build_failed',\n 'the Computers API did not retain the prepared base',\n );\n }\n return { ...cached.data, key, ...seedArtifact };\n }\n }\n }\n const cached = computerArtifactSchema.safeParse(await ctx.artifacts?.get(baseKey));\n if (\n cached.success &&\n cached.data.key === baseKey &&\n cached.data.base.kind === 'captured'\n ) {\n const base = await clientFor(ctx.credentials).getBase(cached.data.base.baseId);\n if (base?.state === ComputerBaseState.Ready) {\n if (!base.retained) {\n const retained = await clientFor(ctx.credentials).setBaseRetention(base.id, true);\n if (!retained.retained)\n throw computerSandboxError(\n 'build_failed',\n 'the Computers API did not retain the prepared base',\n );\n }\n return { ...cached.data, key, ...seedArtifact };\n }\n }\n const built = await build(ctx, spec, baseKey);\n await ctx.artifacts?.put(baseKey, built);\n return { ...built, key, ...seedArtifact };\n }\n const imageVersionId = spec.image.startsWith(LINEAGE_PREFIX)\n ? null\n : (await registerImage(clientFor(ctx.credentials), spec.image)).id;\n ctx.log?.(`computer base ${key} is image ${spec.image}`);\n return {\n version: 1,\n key,\n image: spec.image,\n diskGb: config.machine?.diskGb ?? null,\n ...seedArtifact,\n base: { kind: 'image', image: spec.image, imageVersionId },\n };\n },\n awaitRunning: async (ctx, state, options) => {\n await awaitRunning(ctx, state, options);\n },\n start: async (ctx, openOptions, rawArtifact) => {\n const access = computerOpenOptionsSchema.parse(openOptions ?? {}).access;\n const spec = await resolve(ctx.guides);\n const policy = withPlatformEgressHosts(ctx, spec.parameters.networkPolicy);\n const egress = computerEgressOf(policy);\n const artifact = computerArtifactSchema.safeParse(rawArtifact);\n if (!artifact.success) {\n throw computerSandboxError(\n 'artifact_unavailable',\n 'this computer base predates the public Computers API provider; prepare it again',\n );\n }\n const base = artifact.data.base;\n if (computerNeedsBuild(spec) && base.kind !== 'captured') {\n throw computerSandboxError(\n 'artifact_unavailable',\n `computer base ${artifact.data.key} was prepared without its build steps; prepare it again`,\n );\n }\n // Variables resolve before anything is created, so a missing one costs nothing.\n const env = platformProcessEnvironment(ctx, await loadVariables(ctx, spec));\n const client = clientFor(ctx.credentials);\n const workspace = spec.parameters.workspace;\n const name = await computerWorkspaceName({\n ...ctx.session,\n conversationWorkspace: workspace === ComputerWorkspacePolicy.Conversation,\n });\n const workspaceId = sandboxWorkspaceId({\n session: ctx.session,\n workspace: sandboxWorkspaceOf[workspace],\n });\n const manageNetworking =\n (await needsWorkspaceNetworking(ctx, workspaceId)) ||\n (access !== SandboxAccess.Read &&\n (await needsWorkspaceNetworking(ctx, workspaceId, { access })));\n if (manageNetworking)\n config.networking?.validateWorkspaceId?.(\n sandboxWorkspaceId({ session: ctx.session, workspace: sandboxWorkspaceOf[workspace] }),\n );\n const existing = await client.getComputer(name);\n if (existing?.state === ComputerState.Error)\n throw computerSandboxError(\n 'computer_gone',\n `Computer ${existing.id} (${name}) is in the Error state. Recover it through the Computers API before retrying; its workspace is preserved.`,\n );\n if (\n manageNetworking &&\n access === SandboxAccess.Read &&\n existing != null &&\n existing.state !== ComputerState.Deleted &&\n existing.state !== ComputerState.Running\n )\n throw new Error('A managed Computer requires a write binding to resume networking');\n const initialNetworkPolicy =\n manageNetworking && existing != null && existing.state !== ComputerState.Deleted\n ? networkPolicyFor(await client.getNetworkPolicy(existing.id))\n : networkPolicyFor(egress);\n if (\n manageNetworking &&\n access !== SandboxAccess.Read &&\n existing?.state === ComputerState.Running\n )\n await client.disableAutoResume(existing.id);\n if (manageNetworking && config.networking != null)\n await preservePolicy({\n ctx,\n workspaceId: sandboxWorkspaceId({\n session: ctx.session,\n workspace: sandboxWorkspaceOf[workspace],\n }),\n policy: initialNetworkPolicy,\n });\n let info: ComputerInfoIface;\n let fresh = true;\n if (existing != null && existing.state !== ComputerState.Deleted) {\n info = existing;\n fresh = !isRunningState(existing.state);\n if (manageNetworking && existing.state !== ComputerState.Running)\n await client.setNetworkPolicy(\n existing.id,\n { egress: ComputerEgressPolicy.None },\n { autoResume: false },\n );\n if (existing.state === ComputerState.Paused) await client.action(existing.id, 'resume');\n else if (fresh) await client.action(existing.id, 'start');\n } else {\n const source: Pick<CreateComputerBodyIface, 'baseId' | 'imageVersionId'> =\n base.kind === 'captured'\n ? { baseId: (await awaitBase(client, base.baseId, artifact.data.key)).id }\n : { imageVersionId: await readyImageVersion(client, base) };\n const body: CreateComputerBodyIface = {\n name,\n ...source,\n ...config.machine,\n env: {},\n autoResume: !manageNetworking,\n idleTimeoutSeconds: config.idleTimeoutSeconds ?? 15 * 60,\n // Provider teardown owns deletion; VM-level ephemeral disks cannot be paused.\n ephemeral: false,\n network: manageNetworking ? { egress: ComputerEgressPolicy.None } : egress,\n tags: [\n 'final-agent-sandbox',\n `agent-binding:${ctx.session.bindingId}`,\n 'agent-runtime-attachment:v1',\n 'agent-runtime-role:sandbox',\n ],\n };\n // Session teardown owns deletion, including ephemeral computers. Idle must preserve files.\n body.idlePolicy = ComputerIdlePolicy.Pause;\n if (config.regionSlug != null) body.regionSlug = config.regionSlug;\n // Keyed by the source too: a retry after re-registering is a different request.\n const idempotencyKey = `agent-sandbox-${(await sha256Hex(`${ctx.session.bindingId}:${name}:${source.baseId ?? source.imageVersionId}:${manageNetworking}`)).slice(0, 32)}`;\n info = await client.createComputer(body, idempotencyKey);\n }\n const reused = existing != null && existing.id === info.id;\n log('computer_sandbox.started', { computerId: info.id, reused });\n let cleanupSetup: (() => Promise<void>) | null = null;\n try {\n info = await awaitRunning(ctx, { computerId: info.id }, { timeoutMs: runningWaitMs });\n // A reused computer keeps whatever policy it last ran under; it gets the spec's again.\n if (!manageNetworking) {\n if (reused) await client.setNetworkPolicy(info.id, egress);\n await reportPlatformNetworkPolicy(ctx, policy);\n }\n const setup = setupSession({ client, info, env });\n cleanupSetup = async () => setup.transport.close();\n if (!manageNetworking || access !== SandboxAccess.Read)\n await writePlatformFiles(ctx, setup.sandbox);\n const manager = workspaceNetworking({\n ctx,\n enabled: manageNetworking && access !== SandboxAccess.Read,\n access,\n sandbox: setup.sandbox,\n client,\n info,\n spec,\n onClose: () => setup.transport.close(),\n initialNetworkPolicy,\n });\n cleanupSetup = async () => {\n try {\n await manager?.closeOnFailure();\n } finally {\n setup.transport.close();\n }\n };\n const servicesMarker = WORKSPACE_ROOT + '/.final-workspace-services';\n if (fresh && manageNetworking)\n await setup.sandbox.writeTextFile({ path: servicesMarker, content: 'pending' });\n await manager?.initialize();\n const preparationMarker =\n WORKSPACE_ROOT + '/.final/workspace-prepared/' + (await sha256Hex(artifact.data.key));\n let preparation: Promise<string | null> | null = null;\n const prepareWorkspace = (): Promise<string | null> =>\n (preparation ??= (async () => {\n await mountRepositories({\n sandbox: setup.sandbox,\n repositories: spec.parameters.repositories,\n resolver: ctx.repositories,\n log,\n });\n await materializeSandboxSeeds({\n sandbox: setup.sandbox,\n root: WORKSPACE_ROOT,\n files: await sandboxSeedFilesForStart(ctx, artifact.data),\n });\n await installGuideCommands({ sandbox: setup.sandbox, template: spec.template });\n const result = await runWorkspaceSetup({\n sandbox: setup.sandbox,\n template: spec.template,\n repositories: spec.parameters.repositories,\n log,\n });\n const servicesPending =\n manager != null &&\n (await setup.sandbox.stat({ path: servicesMarker })) != null &&\n (await setup.sandbox.readTextFile({ path: servicesMarker })) === 'pending';\n if (fresh || servicesPending) {\n await startServicesFor({ setup, spec, env });\n if (manageNetworking)\n await setup.sandbox.writeTextFile({ path: servicesMarker, content: 'complete' });\n }\n if (manager != null)\n await setup.sandbox.writeTextFile({ path: preparationMarker, content: 'complete' });\n return result;\n })().catch((cause: unknown) => {\n preparation = null;\n throw cause;\n }));\n // A blocked workspace still opens its egress control; setup waits for an authorized exit.\n let ready = !manageNetworking || access !== SandboxAccess.Read;\n if (manager != null) {\n try {\n await ctx.executionPolicy?.beforeExecution({\n operation: SandboxExecutionOperation.Run,\n background: false,\n });\n await manager.guard();\n } catch {\n log('workspace_networking.setup_deferred', {\n provider: 'computer',\n computerId: info.id,\n });\n ready = false;\n }\n }\n const setupHash = ready ? await prepareWorkspace() : null;\n const { handle } = await buildHandle({\n ctx,\n client,\n info,\n spec,\n access,\n env,\n networking: manager,\n networkingManaged: manageNetworking,\n closeSetup: () => setup.transport.close(),\n beforeUse: async () => {\n await prepareWorkspace();\n },\n });\n return {\n handle,\n region: info.regionSlug ?? config.regionSlug ?? null,\n state: {\n version: 1,\n computerId: info.id,\n computerName: info.name,\n workspace,\n access,\n guideVersionId: spec.guide?.versionId ?? null,\n setupHash,\n setupPending: !ready,\n workspaceId: sandboxWorkspaceId({\n session: ctx.session,\n workspace: sandboxWorkspaceOf[workspace],\n }),\n networkPolicySaved: manageNetworking,\n },\n };\n } catch (error) {\n let cause = error;\n try {\n await cleanupSetup?.();\n } catch (cleanupError) {\n cause = new AggregateError(\n [error, cleanupError],\n 'Computer setup and egress cleanup failed',\n );\n }\n // No state reaches the caller on failure; clean up only this start's new computer.\n if (!reused) {\n try {\n await client.action(info.id, 'delete');\n } catch (cleanupError) {\n throw new AggregateError(\n [cause, cleanupError],\n `computer ${info.name} setup and cleanup failed`,\n );\n }\n }\n throw cause;\n }\n },\n resumePassive: async (ctx, _artifact, rawState) => {\n const state = computerStateSchema.parse(rawState);\n if (ctx.session.workspaceId == null && state.workspaceId != null)\n ctx = { ...ctx, session: { ...ctx.session, workspaceId: state.workspaceId } };\n if (\n state.networkPolicySaved === true &&\n state.workspaceId != null &&\n ctx.session.workspaceId !== state.workspaceId\n )\n throw new Error('Passive workspace identity does not match retained provider state');\n const client = clientFor(ctx.credentials);\n const info = await client.getComputer(state.computerId);\n if (info == null || info.state !== ComputerState.Running)\n throw computerSandboxError(\n 'computer_not_running',\n 'computer is not running for passive access',\n );\n await awaitRunning(ctx, state, { timeoutMs: runningWaitMs });\n const spec = await resolve(ctx.guides);\n const env = platformProcessEnvironment(ctx, await loadVariables(ctx, spec));\n return (\n await buildHandle({\n ctx,\n client,\n info,\n spec,\n access: SandboxAccess.Read,\n env,\n networkingManaged: state.networkPolicySaved === true,\n })\n ).handle;\n },\n resume: async (ctx, _artifact, rawState) => {\n const state = computerStateSchema.parse(rawState);\n if (state.networkPolicySaved === true) {\n if (config.networking == null)\n throw new Error('Device networking control is required before resume');\n }\n if (state.workspaceId != null) {\n if (\n state.networkPolicySaved === true &&\n ctx.session.workspaceId != null &&\n ctx.session.workspaceId !== state.workspaceId\n )\n throw new Error('Resume workspace identity does not match retained provider state');\n if (ctx.session.workspaceId == null)\n ctx = { ...ctx, session: { ...ctx.session, workspaceId: state.workspaceId } };\n }\n if (ctx.session.workspaceId == null)\n ctx = {\n ...ctx,\n session: {\n ...ctx.session,\n workspaceId: sandboxWorkspaceId({\n session: ctx.session,\n workspace: sandboxWorkspaceOf[state.workspace],\n }),\n },\n };\n const client = clientFor(ctx.credentials);\n const workspaceId = sandboxWorkspaceId({\n session: ctx.session,\n workspace: sandboxWorkspaceOf[state.workspace],\n });\n const manageNetworking =\n state.networkPolicySaved === true ||\n (await needsWorkspaceNetworking(ctx, workspaceId)) ||\n (state.access !== SandboxAccess.Read &&\n (await needsWorkspaceNetworking(ctx, workspaceId, { access: state.access })));\n if (manageNetworking)\n config.networking?.validateWorkspaceId?.(\n sandboxWorkspaceId({\n session: ctx.session,\n workspace: sandboxWorkspaceOf[state.workspace],\n }),\n );\n const info = await client.getComputer(state.computerId);\n if (\n info == null ||\n info.state === ComputerState.Deleted ||\n info.state === ComputerState.Error\n ) {\n throw computerSandboxError('computer_gone', `computer ${state.computerName} is gone`);\n }\n // Computers pause when idle, so a resume usually continues in place; one the\n // platform stopped or shelved meanwhile boots again.\n if (\n manageNetworking &&\n state.access === SandboxAccess.Read &&\n info.state !== ComputerState.Running\n )\n throw new Error('A managed Computer requires a write binding to resume networking');\n const initialNetworkPolicy = manageNetworking\n ? networkPolicyFor(await client.getNetworkPolicy(info.id))\n : null;\n if (\n initialNetworkPolicy != null &&\n state.access !== SandboxAccess.Read &&\n info.state === ComputerState.Running\n )\n await client.disableAutoResume(info.id);\n const rebooted = !isRunningState(info.state);\n if (manageNetworking && config.networking != null && initialNetworkPolicy != null)\n await preservePolicy({\n ctx,\n workspaceId: sandboxWorkspaceId({\n session: ctx.session,\n workspace: sandboxWorkspaceOf[state.workspace],\n }),\n policy: initialNetworkPolicy,\n });\n if (manageNetworking && info.state !== ComputerState.Running)\n await client.setNetworkPolicy(\n info.id,\n { egress: ComputerEgressPolicy.None },\n { autoResume: false },\n );\n if (info.state === ComputerState.Paused) await client.action(info.id, 'resume');\n else if (rebooted) await client.action(info.id, 'start');\n const running = await awaitRunning(ctx, state, { timeoutMs: runningWaitMs });\n const spec = await resolve(ctx.guides);\n const env = platformProcessEnvironment(ctx, await loadVariables(ctx, spec));\n if (!manageNetworking) {\n const policy = withPlatformEgressHosts(ctx, spec.parameters.networkPolicy);\n await client.setNetworkPolicy(running.id, computerEgressOf(policy));\n await reportPlatformNetworkPolicy(ctx, policy);\n }\n const setup = setupSession({ client, info: running, env });\n const manager = workspaceNetworking({\n ctx,\n enabled: manageNetworking && state.access !== SandboxAccess.Read,\n access: state.access,\n sandbox: setup.sandbox,\n client,\n info: running,\n spec,\n onClose: () => setup.transport.close(),\n initialNetworkPolicy:\n initialNetworkPolicy ?? networkPolicyFor(egressFor(ctx, spec.parameters.networkPolicy)),\n });\n try {\n if (!manageNetworking || state.access !== SandboxAccess.Read)\n await writePlatformFiles(ctx, setup.sandbox);\n if (manageNetworking && rebooted)\n await setup.sandbox.writeTextFile({\n path: WORKSPACE_ROOT + '/.final-workspace-services',\n content: 'pending',\n });\n await manager?.initialize();\n let preparation: Promise<void> | null = null;\n const prepareWorkspace = (): Promise<void> =>\n (preparation ??= (async () => {\n const artifact = state.setupPending ? computerArtifactSchema.parse(_artifact) : null;\n const marker =\n artifact == null\n ? null\n : WORKSPACE_ROOT +\n '/.final/workspace-prepared/' +\n (await sha256Hex(artifact.key));\n const pending =\n marker != null && (await setup.sandbox.stat({ path: marker })) == null;\n if (pending && artifact != null) {\n await mountRepositories({\n sandbox: setup.sandbox,\n repositories: spec.parameters.repositories,\n resolver: ctx.repositories,\n log,\n });\n await materializeSandboxSeeds({\n sandbox: setup.sandbox,\n root: WORKSPACE_ROOT,\n files: await sandboxSeedFilesForStart(ctx, artifact),\n });\n }\n await installGuideCommands({ sandbox: setup.sandbox, template: spec.template });\n if (pending)\n await runWorkspaceSetup({\n sandbox: setup.sandbox,\n template: spec.template,\n repositories: spec.parameters.repositories,\n log,\n });\n const servicesMarker = WORKSPACE_ROOT + '/.final-workspace-services';\n const servicesPending =\n manageNetworking &&\n (await setup.sandbox.stat({ path: servicesMarker })) != null &&\n (await setup.sandbox.readTextFile({ path: servicesMarker })) === 'pending';\n if (rebooted || servicesPending) {\n await startServicesFor({ setup, spec, env });\n if (manageNetworking)\n await setup.sandbox.writeTextFile({ path: servicesMarker, content: 'complete' });\n }\n if (pending && marker != null)\n await setup.sandbox.writeTextFile({ path: marker, content: 'complete' });\n })().catch((cause: unknown) => {\n preparation = null;\n throw cause;\n }));\n let ready = !manageNetworking || state.access !== SandboxAccess.Read;\n if (manager != null) {\n try {\n await ctx.executionPolicy?.beforeExecution({\n operation: SandboxExecutionOperation.Run,\n background: false,\n });\n await manager.guard();\n } catch {\n log('workspace_networking.setup_deferred', {\n provider: 'computer',\n computerId: info.id,\n });\n ready = false;\n }\n }\n if (ready) await prepareWorkspace();\n const { handle } = await buildHandle({\n ctx,\n client,\n info: running,\n spec,\n access: state.access,\n env,\n networking: manager,\n networkingManaged: manageNetworking,\n closeSetup: () => setup.transport.close(),\n beforeUse: prepareWorkspace,\n });\n return handle;\n } catch (error) {\n try {\n await manager?.closeOnFailure();\n } catch (cleanupError) {\n throw new AggregateError(\n [error, cleanupError],\n 'Computer resume and egress cleanup failed',\n );\n } finally {\n setup.transport.close();\n }\n throw error;\n }\n },\n park: async (ctx, _artifact, rawState) => {\n const state = computerStateSchema.parse(rawState);\n const workspaceId = await teardownComputer({\n ctx,\n computerId: state.computerId,\n computerName: state.computerName,\n workspace: state.workspace,\n policySaved: state.networkPolicySaved === true,\n workspaceId:\n state.networkPolicySaved === true\n ? state.workspaceId\n : (ctx.session.workspaceId ?? state.workspaceId),\n fence: true,\n finish: async () => {\n const failures: unknown[] = [];\n try {\n await closeComputerMcp(state.computerId);\n } catch (cause) {\n failures.push(cause);\n }\n try {\n const client = clientFor(ctx.credentials);\n // Park reads the computer's state rather than trusting a pause's status\n // alone: a pause that cannot land would otherwise fail on every retry.\n let current: ComputerInfoIface | null | undefined;\n try {\n current = await client.getComputer(state.computerId);\n } catch (cause) {\n failures.push(cause);\n }\n if (current !== undefined && (current == null || hasNothingToPause(current.state))) {\n log('computer_sandbox.park_at_rest', {\n computerId: state.computerId,\n state: current?.state ?? null,\n });\n } else {\n // A paused computer is paused again: a resume may be in flight.\n try {\n await client.action(state.computerId, 'pause');\n } catch (error) {\n if (!pauseMayHaveSettled(error)) throw error;\n // Parked if it came to rest meanwhile (an idle pause or stop, a delete);\n // otherwise the pause did not happen and park is retried.\n const settled = await client.getComputer(state.computerId);\n if (\n settled != null &&\n settled.state !== ComputerState.Paused &&\n !hasNothingToPause(settled.state)\n )\n throw error;\n log('computer_sandbox.park_at_rest', {\n computerId: state.computerId,\n state: settled?.state ?? null,\n });\n }\n }\n } catch (cause) {\n failures.push(cause);\n }\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1) throw new AggregateError(failures, 'Computer pause failed');\n },\n });\n const key = ctx.session.organizationId + ':' + workspaceId;\n return {\n ...state,\n workspaceId,\n networkPolicySaved: state.networkPolicySaved === true || savedPolicyWorkspaces.has(key),\n };\n },\n onSessionEnd: async (ctx, _artifact, rawState, { reason }) => {\n const state = computerStateSchema.parse(rawState);\n const client = clientFor(ctx.credentials);\n const finish = async () => {\n // A conversation workspace outlives its binding (the conversation was\n // archived, or its workspace replaced): it is shelved, its disk backed up\n // to storage with no host held, and the next binding for the\n // conversation starts it again by name. Session and ephemeral disks end\n // with their binding.\n const action =\n state.workspace === ComputerWorkspacePolicy.Conversation ? 'stop' : 'delete';\n log('computer_sandbox.session_end', { computerId: state.computerId, reason, action });\n try {\n await client.action(state.computerId, action);\n } catch (error) {\n if (isComputersApiStatus(error, 404)) return;\n if (!isComputersApiStatus(error, 409)) throw error;\n // A conflict is done only when the computer is already where the action\n // takes it; one mid-transition (an idle pause committing) is retried.\n const current = await client.getComputer(state.computerId);\n const settled =\n current == null ||\n current.state === ComputerState.Deleted ||\n (action === 'stop' && current.state === ComputerState.Shelved);\n if (!settled) throw error;\n return;\n }\n // `stop` returns once the shelve is scheduled: the cleanup (and the\n // host's fence on reusing the workspace) lasts until it is.\n if (action === 'stop') await awaitShelved(client, state.computerId);\n };\n await teardownComputer({\n ctx,\n computerId: state.computerId,\n computerName: state.computerName,\n workspace: state.workspace,\n policySaved: state.networkPolicySaved === true,\n workspaceId:\n state.networkPolicySaved === true\n ? state.workspaceId\n : (ctx.session.workspaceId ?? state.workspaceId),\n fence: state.workspace === ComputerWorkspacePolicy.Conversation,\n finish,\n });\n },\n };\n };\n\n return defineSandboxProvider({\n name: 'computer',\n stateProtocolVersion: 1,\n environment,\n });\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { ProcessInspectionOperation } from '@finalai/agent-protocol/process-inspection';\nimport {\n formatProviderRef,\n NetworkPolicy,\n packageRef,\n SandboxAccess,\n type JsonValue,\n} from '@finalai/agent-provider';\nimport {\n defineSandboxProvider,\n withSandboxNetworking,\n mapSandboxHandle,\n SandboxExecutionOperation,\n type SandboxNetworkingExtensionIface,\n type SandboxNetworkingControllerIface,\n type SandboxNetworkingControllerOptionsIface,\n materializeSandboxSeeds,\n PLATFORM_ENVIRONMENT_NAMES,\n platformProcessEnvironment,\n PortProtocol,\n reportPlatformNetworkPolicy,\n SandboxCapability,\n sandboxSeedArtifact,\n sandboxSeedArtifactSchema,\n sandboxSeedFiles,\n sandboxSeedFilesForStart,\n sandboxSeedIdentity,\n sandboxWorkspaceId,\n SandboxWorkspace,\n withPlatformEgressHosts,\n writePlatformFiles,\n type NetworkPolicyIface,\n type NetworkSandboxSessionIface,\n type SandboxGuidesIface,\n type SandboxPrepareContextIface,\n type SandboxProviderHandleIface,\n type SandboxProviderIface,\n type SandboxProviderImplementationIface,\n type SandboxCredentialsIface,\n type SandboxStartContextIface,\n} from '@finalai/agent-provider/sandbox';\nimport {\n ComputerBaseState,\n ComputerCommandMode,\n ComputerEgressPolicy,\n ComputerIdlePolicy,\n ComputerImageState,\n ComputerState,\n type ComputerBaseIface,\n type ComputerImageIface,\n type ComputerInfoIface,\n} from '@finalai/computers';\nimport * as z from 'zod';\nimport {\n HOME_BASELINE_MISSING_EXIT_CODE,\n HOME_BASELINE_ROOT,\n homeBaselineScript,\n homeContentScript,\n} from \"./build-scripts.mjs\";\nimport { sleep as defaultSleep, sha256Hex } from \"./bytes.mjs\";\nimport { computerEditor } from \"./computer-editor.mjs\";\nimport { readComputerSnapshot } from \"./computer-snapshots.mjs\";\nimport {\n createComputersApiClient,\n isComputersApiError,\n isComputersApiStatus,\n type ComputersApiClientIface,\n type ComputersApiConfigIface,\n type CreateComputerBodyIface,\n} from \"./computers-api.mjs\";\nimport { createComputerUseEndpoint } from \"./computers-api-mcp.mjs\";\nimport { createComputersApiTransport } from \"./computers-api-transport.mjs\";\nimport {\n COMPUTER_SANDBOX_SPECIFIER,\n computerEnvironmentSchema,\n computerOpenOptionsSchema,\n ComputerWorkspacePolicy,\n} from \"./environment.mjs\";\nimport {\n computeComputerArtifactKey,\n computerNeedsBuild,\n DEFAULT_COMPUTER_IMAGE,\n resolveComputerSpec,\n type ResolvedComputerSpecIface,\n} from \"./guide.mjs\";\nimport { createTransportSession, sessionForAccess } from \"./session.mjs\";\nimport type { SandboxTransportIface } from \"./transport.mjs\";\nimport {\n guideCommands,\n installGuideCommands,\n mountRepositories,\n repositoryPath,\n runWorkspaceSetup,\n startServices,\n WORKSPACE_ROOT,\n type GuideCommandIface,\n type SetupLogIface,\n} from \"./workspace-setup.mjs\";\n\nexport const computerWorkspaceName = async (options: {\n bindingId: string;\n conversationId: string | null;\n target: string;\n conversationWorkspace: boolean;\n}): Promise<string> =>\n options.conversationWorkspace && options.conversationId != null\n ? `ac-${(await sha256Hex(`${options.conversationId}:${options.target}`)).slice(0, 24)}`\n : `ab-${compactId(options.bindingId)}`;\n\nexport type { ComputersApiConfigIface } from \"./computers-api.mjs\";\nexport type { FinalPlatformAccessIface } from '@finalai/agent-provider/sandbox';\nexport { COMPUTER_SANDBOX_SPECIFIER } from \"./environment.mjs\";\nexport { computeComputerArtifactKey } from \"./guide.mjs\";\nexport type { ComputerGuideVersionIface } from \"./guide.mjs\";\nexport type { RepositoryCloneSourceIface } from \"./workspace-setup.mjs\";\n\n// The `computer` sandbox: a Final computer from the\n// public Computers API, set up from a computer setup guide, with lifecycle,\n// files and processes all through that API, exactly as a third-party provider\n// drives its vendor. Like every provider, the host runs this handle and serves\n// the handle RPC and MCP projection from it.\n//\n// A guide with build or verify steps is built once on a builder computer and\n// captured as a base (POST /v1/computers/:id/capture); its computers are created\n// from that base. Network and idle policies are create options, as for any\n// API customer.\n//\n// Guides, variables and repository credentials come from the contract's\n// prepare and start contexts (`guides`, `variables`, `repositories`), which the\n// host serves to every provider alike.\n\nexport interface ComputerSandboxLogIface {\n (message: string, fields?: Record<string, string | number | boolean | null>): void;\n}\n\nexport interface ComputerSandboxProviderConfigIface {\n // Transport options; the Computers API origin and token come from each\n // context's `credentials.computersAccess`.\n computersApi?: ComputersApiConfigIface;\n networking?: SandboxNetworkingExtensionIface;\n // A registry credential (`creg_...`) the organization stored for private image references.\n registryCredentialId?: string;\n // Image for an empty environment without an organization default guide.\n defaultImage?: string;\n regionSlug?: string;\n machine?: { vcpu?: number; memoryMb?: number; diskGb?: number };\n idleTimeoutSeconds?: number;\n // How long `start` waits for a registered image version to finish building.\n imageWaitMs?: number;\n imagePollMs?: number;\n // How long `prepare` waits for a guide's base capture to publish.\n buildWaitMs?: number;\n buildPollMs?: number;\n // How long ending a conversation workspace waits for its computer to shelve.\n shelveWaitMs?: number;\n shelvePollMs?: number;\n // How long start, resume and a guide build wait for a computer to run before\n // touching it (default 5 min); polled from runningPollMs (default 250 ms), doubling to 5 s.\n runningWaitMs?: number;\n runningPollMs?: number;\n log?: ComputerSandboxLogIface;\n randomUuid?: () => string;\n now?: () => number;\n sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;\n}\n\n// An `image` base: `imageVersionId` is the registered version (`cimv_...`) of an\n// image reference, registered at prepare; a `lineage:` image resolves its newest\n// version at start. A `captured` base is a guide's build, captured as a base\n// (`part_...`) that computers are created from.\nconst computerArtifactSchema = sandboxSeedArtifactSchema.extend({\n version: z.literal(1),\n key: z.string(),\n image: z.string(),\n diskGb: z.number().nullable(),\n base: z.discriminatedUnion('kind', [\n z.object({\n kind: z.literal('image'),\n image: z.string(),\n imageVersionId: z.string().nullable().default(null),\n }),\n z.object({ kind: z.literal('captured'), baseId: z.string() }),\n ]),\n});\n\nconst computerStateSchema = z.object({\n version: z.literal(1),\n computerId: z.string(),\n computerName: z.string(),\n workspace: z.nativeEnum(ComputerWorkspacePolicy),\n access: z.nativeEnum(SandboxAccess),\n guideVersionId: z.string().nullable(),\n setupHash: z.string().nullable(),\n setupPending: z.boolean().default(false),\n workspaceId: z.string().optional(),\n networkPolicySaved: z.boolean().optional(),\n});\n\n// The provider's own view of a computer while it sets it up.\ninterface SetupSessionIface {\n sandbox: NetworkSandboxSessionIface;\n transport: SandboxTransportIface;\n}\n\nexport type ComputerSandboxArtifact = z.infer<typeof computerArtifactSchema>;\nexport type ComputerSandboxState = z.infer<typeof computerStateSchema>;\n\n// What Build needs to know about a started computer beyond the handle.\nexport interface ComputerSandboxDescriptionIface {\n provider: 'computer';\n computerId: string;\n computerName: string;\n workspaceRoot: string;\n transport: string;\n guide: { slug: string; number: number } | null;\n repositories: { alias: string; path: string; repository: string }[];\n services: { name: string; readyUrl: string | null }[];\n commands: GuideCommandIface[];\n capabilities: SandboxCapability[];\n}\n\nexport interface ComputerSandboxSessionIface extends NetworkSandboxSessionIface {\n describe(): ComputerSandboxDescriptionIface;\n // What this computer's handle offers (the host reports it).\n readonly capabilities: readonly SandboxCapability[];\n}\n\nexport type ComputerSandboxProviderIface = SandboxProviderIface<\n JsonValue,\n JsonValue,\n ComputerSandboxArtifact,\n ComputerSandboxState,\n ComputerSandboxSessionIface\n>;\n\nexport interface ComputerSandboxErrorIface extends Error {\n code:\n | 'artifact_unavailable'\n | 'computer_gone'\n | 'computer_not_running'\n | 'invalid_environment'\n | 'build_failed';\n}\n\nconst computerSandboxError = (\n code: ComputerSandboxErrorIface['code'],\n message: string,\n): ComputerSandboxErrorIface =>\n Object.assign(new Error(message), { name: 'ComputerSandboxError', code });\n\n// FINAL_NODE_* and the session basics belong to the platform, as do the\n// platform environment's variables.\nconst RESERVED_ENV = new Set([\n ...PLATFORM_ENVIRONMENT_NAMES,\n 'DISPLAY',\n 'XDG_RUNTIME_DIR',\n 'PATH',\n 'HOME',\n 'USER',\n 'SHELL',\n 'HOSTNAME',\n]);\nconst isReservedEnvName = (name: string): boolean =>\n name.startsWith('FINAL_NODE_') || RESERVED_ENV.has(name);\n\nconst HTTP_TOKEN_LIFETIME_MS = 60 * 60_000;\nconst HTTP_TOKEN_RENEW_MS = 5 * 60_000;\n\n// Builds run from here; the capture scrub removes /tmp/*.\nconst BUILD_ROOT = '/tmp/final-build';\n// Guide publication supplies build inputs in files; agent revisions supply workspace seeds.\nconst seedsFor = (ctx: SandboxPrepareContextIface): Record<string, string> =>\n sandboxSeedFiles({\n files: ctx.resources.guide == null ? ctx.files : {},\n resources: ctx.resources,\n });\n// What the Computers API's capture scrub removes, so the home check skips it.\nconst CAPTURE_SCRUBBED_PATHS = [\n '/home/user/.bash_history',\n '/home/user/.zsh_history',\n '/home/user/.sh_history',\n '/home/user/.git-credentials',\n '/home/user/.config/gh/hosts.yml',\n '/home/user/.npmrc',\n '/home/user/.pypirc',\n '/home/user/.cargo/credentials',\n '/home/user/.cargo/credentials.toml',\n '/home/user/.aws',\n '/home/user/.config/gcloud',\n '/home/user/.azure',\n '/home/user/.docker/config.json',\n '/home/user/.netrc',\n '/home/user/.ssh',\n];\nconst BUILDER_IDLE_TIMEOUT_SECONDS = 2 * 60 * 60;\n\ninterface ComputerEgressConfigIface {\n egress: ComputerEgressPolicy;\n allow?: string[];\n}\nconst networkPolicyFor = (\n network: ComputerEgressConfigIface | null | undefined,\n): NetworkPolicyIface => ({\n mode:\n network?.egress === ComputerEgressPolicy.Internet\n ? NetworkPolicy.AllowAll\n : network?.egress === ComputerEgressPolicy.Allowlist\n ? NetworkPolicy.Allowlist\n : NetworkPolicy.DenyAll,\n allow: network?.allow ?? [],\n});\nconst computerEgressOf = (policy: NetworkPolicyIface): ComputerEgressConfigIface => {\n if (policy.mode === NetworkPolicy.AllowAll) return { egress: ComputerEgressPolicy.Internet };\n if (policy.mode === NetworkPolicy.DenyAll) return { egress: ComputerEgressPolicy.None };\n return { egress: ComputerEgressPolicy.Allowlist, allow: policy.allow ?? [] };\n};\n\n// An allowlist also admits the platform's egress hosts, so its proxy stays reachable.\nconst egressFor = (\n ctx: Pick<SandboxStartContextIface, 'platformEgressHosts'>,\n requested: NetworkPolicyIface,\n): ComputerEgressConfigIface => computerEgressOf(withPlatformEgressHosts(ctx, requested));\n\nconst LINEAGE_PREFIX = 'lineage:';\n\nconst portOf = (url: string): number | null => {\n try {\n const parsed = new URL(url);\n if (parsed.port !== '') return Number(parsed.port);\n return parsed.protocol === 'https:' ? 443 : 80;\n } catch {\n return null;\n }\n};\n\nconst compactId = (id: string): string => id.replaceAll('-', '');\n\nconst sandboxWorkspaceOf = {\n [ComputerWorkspacePolicy.Session]: SandboxWorkspace.Session,\n [ComputerWorkspacePolicy.Conversation]: SandboxWorkspace.Conversation,\n [ComputerWorkspacePolicy.Ephemeral]: SandboxWorkspace.Ephemeral,\n} satisfies Record<ComputerWorkspacePolicy, SandboxWorkspace>;\n\nconst isRunningState = (state: ComputerState): boolean =>\n state === ComputerState.Running ||\n state === ComputerState.Paused ||\n state === ComputerState.Resuming;\n\n// Nothing runs on these to pause, and the Computers API refuses a pause of them:\n// stopped or shelved (the disk at rest), errored (resume reports it gone), or deleted.\nconst hasNothingToPause = (state: ComputerState): boolean =>\n state === ComputerState.Stopped ||\n state === ComputerState.Shelved ||\n state === ComputerState.Error ||\n state === ComputerState.Deleted;\n\n// A refusal (409), a missing computer (404) or a failed host command (5xx) can\n// mean the computer came to rest on its own; a request or auth failure cannot.\nconst pauseMayHaveSettled = (error: unknown): boolean =>\n isComputersApiError(error) &&\n error.statusCode != null &&\n (error.statusCode === 404 || error.statusCode === 409 || error.statusCode >= 500);\n\nconst RUNNING_POLL_MAX_MS = 5_000;\n\nexport const createComputerSandboxProvider = (\n config: ComputerSandboxProviderConfigIface,\n): ComputerSandboxProviderIface => {\n const log: SetupLogIface = config.log ?? (() => undefined);\n const randomUuid = config.randomUuid ?? (() => crypto.randomUUID());\n const now = config.now ?? (() => Date.now());\n const sleep = config.sleep ?? defaultSleep;\n const defaultImage = config.defaultImage ?? DEFAULT_COMPUTER_IMAGE;\n const runningWaitMs = config.runningWaitMs ?? 5 * 60_000;\n\n const clientFor = (credentials: SandboxCredentialsIface | undefined): ComputersApiClientIface =>\n createComputersApiClient({ config: config.computersApi ?? {}, credentials });\n\n const registerImage = (client: ComputersApiClientIface, reference: string) =>\n client.registerImage(\n config.registryCredentialId == null\n ? { reference }\n : { reference, registryCredentialId: config.registryCredentialId },\n );\n\n // Computers are created from registered image versions, as any API customer's are.\n // A `lineage:` image is the newest ready version of that lineage (the\n // organization's or the platform's); a reference is registered once, at prepare,\n // and registered again here when its version expired.\n const readyImageVersion = async (\n client: ComputersApiClientIface,\n base: { image: string; imageVersionId: string | null },\n ): Promise<string> => {\n if (base.image.startsWith(LINEAGE_PREFIX)) {\n const lineage = base.image.slice(LINEAGE_PREFIX.length);\n const [newest] = await client.listImages({ lineage, state: ComputerImageState.Ready });\n if (newest == null) {\n throw computerSandboxError(\n 'artifact_unavailable',\n `the Computers API has no ready image version in lineage ${lineage}`,\n );\n }\n return newest.id;\n }\n let version: ComputerImageIface | null = null;\n if (base.imageVersionId != null) {\n try {\n version = await client.getImage(base.imageVersionId);\n } catch (error) {\n if (!isComputersApiStatus(error, 404)) throw error;\n }\n }\n if (version == null || version.state === ComputerImageState.Expired) {\n version = await registerImage(client, base.image);\n }\n const deadline = now() + (config.imageWaitMs ?? 15 * 60_000);\n while (\n version.state === ComputerImageState.Pending ||\n version.state === ComputerImageState.Building\n ) {\n if (now() >= deadline) throw new Error(`image ${base.image} is still building`);\n await sleep(config.imagePollMs ?? 5_000);\n version = await client.getImage(version.id);\n }\n if (version.state !== ComputerImageState.Ready) {\n throw computerSandboxError(\n 'artifact_unavailable',\n `image ${base.image} is ${version.state}${version.error == null ? '' : `: ${version.error}`}`,\n );\n }\n return version.id;\n };\n\n const loadVariables = async (\n ctx: SandboxStartContextIface,\n spec: ResolvedComputerSpecIface,\n ): Promise<Record<string, string>> => {\n const env: Record<string, string> = {};\n for (const [name, value] of Object.entries(spec.parameters.env)) {\n if (isReservedEnvName(name))\n throw computerSandboxError('invalid_environment', `${name} is reserved`);\n env[name] = value;\n }\n for (const name of spec.parameters.variables) {\n if (isReservedEnvName(name))\n throw computerSandboxError('invalid_environment', `${name} is reserved`);\n const value = await ctx.variables.get(name);\n if (value == null)\n throw computerSandboxError('invalid_environment', `variable ${name} is not set`);\n env[name] = value;\n }\n return env;\n };\n\n const mcpClosers = new Map<string, Set<() => Promise<void>>>();\n const closeComputerMcp = async (computerId: string) => {\n const results = await Promise.allSettled(\n [...(mcpClosers.get(computerId) ?? [])].map((close) => close()),\n );\n for (const result of results) if (result.status === 'rejected') throw result.reason;\n };\n const deletedAfterFenceError = async (options: {\n client: ComputersApiClientIface;\n computerId: string;\n cause: unknown;\n }): Promise<boolean> => {\n if (isComputersApiStatus(options.cause, 404)) return true;\n if (!isComputersApiStatus(options.cause, 409)) return false;\n try {\n const current = await options.client.getComputer(options.computerId);\n return current == null || current.state === ComputerState.Deleted;\n } catch (lookup) {\n throw new AggregateError(\n [options.cause, lookup],\n 'Computer fence and deletion lookup failed',\n );\n }\n };\n\n const buildHandle = async (args: {\n ctx: SandboxStartContextIface;\n client: ComputersApiClientIface;\n info: ComputerInfoIface;\n spec: ResolvedComputerSpecIface;\n access: SandboxAccess;\n env: () => Promise<Record<string, string>>;\n networking?: SandboxNetworkingControllerIface;\n networkingManaged?: boolean;\n beforeUse?: () => Promise<void>;\n closeSetup?: () => void;\n }): Promise<{ handle: SandboxProviderHandleIface<ComputerSandboxSessionIface> }> => {\n const { client, info, spec } = args;\n const commands = await guideCommands(spec.template);\n const commandHelp = commands\n .map(\n (command) =>\n `Guide command ${command.name}: bash ${command.path}${command.description == null ? '' : ` \u2014 ${command.description}`}`,\n )\n .join('\\n');\n const transport = createComputersApiTransport({ client, computerId: info.id });\n const ports = [\n ...new Set(\n spec.template.services.flatMap((service) => {\n const port = service.ready == null ? null : portOf(service.ready.url);\n return port == null ? [] : [port];\n }),\n ),\n ];\n let httpToken: { token: string; expiresAtMs: number } | null = null;\n const session = createTransportSession({\n id: info.id,\n description: `Final computer ${info.name}${spec.guide == null ? '' : ` (${spec.guide.title} v${spec.guide.number})`}${commands.length === 0 ? '' : `\\n${commandHelp}`}`,\n workspaceRoot: WORKSPACE_ROOT,\n transport,\n baseEnv: args.env,\n randomUuid,\n network: {\n ports,\n // The computer's hostname with a preview token, which opens its HTTP ports only.\n getPortEndpoint: async ({ port, protocol }) => {\n const managed =\n args.networkingManaged === true ||\n (args.access === SandboxAccess.Read &&\n (await needsWorkspaceNetworking(\n args.ctx,\n sandboxWorkspaceId({\n session: args.ctx.session,\n workspace: sandboxWorkspaceOf[args.spec.parameters.workspace],\n }),\n { access: args.access },\n )));\n if (managed && args.networking == null)\n throw new Error('Managed workspace previews require an active write binding');\n const deadline = (await args.networking?.authorizeExternalAccess())?.expiresAtMs;\n if (deadline != null && deadline <= now())\n throw new Error('Refresh workspace networking before preview access');\n const hostname = info.hostname ?? (await client.getComputer(info.id))?.hostname ?? null;\n if (hostname == null) throw new Error(`computer ${info.name} has no public hostname`);\n if (\n httpToken == null ||\n httpToken.expiresAtMs - now() < HTTP_TOKEN_RENEW_MS ||\n (deadline != null && httpToken.expiresAtMs > deadline)\n ) {\n const expiresAtMs = Math.min(now() + HTTP_TOKEN_LIFETIME_MS, deadline ?? Infinity);\n const token = await client.createPreviewToken({\n computerId: info.id,\n name: `agent sandbox ${args.ctx.session.bindingId}`,\n expiresAt: new Date(expiresAtMs),\n });\n httpToken = { token, expiresAtMs };\n }\n const scheme = protocol === PortProtocol.Ws ? 'wss' : 'https';\n return {\n url: `${scheme}://${port === 443 ? hostname : `${hostname}:${port}`}`,\n headers: { authorization: `Bearer ${httpToken.token}` },\n };\n },\n stop: async () => {\n const failures: unknown[] = [];\n try {\n if (args.networking != null)\n await client.setNetworkPolicy(\n info.id,\n { egress: ComputerEgressPolicy.None },\n { autoResume: false },\n );\n else if (args.access !== SandboxAccess.Read)\n await teardownComputer({\n ctx: args.ctx,\n computerId: info.id,\n computerName: info.name,\n workspace: spec.parameters.workspace,\n policySaved: args.networkingManaged === true,\n workspaceId: args.ctx.session.workspaceId,\n fence: true,\n finish: async () => {},\n });\n } catch (cause) {\n try {\n if (!(await deletedAfterFenceError({ client, computerId: info.id, cause })))\n failures.push(cause);\n } catch (lookup) {\n failures.push(lookup);\n }\n }\n try {\n await closeComputerMcp(info.id);\n } catch (cause) {\n if (!isComputersApiStatus(cause, 404)) failures.push(cause);\n }\n try {\n await client.action(info.id, 'stop');\n } catch (cause) {\n if (!isComputersApiStatus(cause, 404)) failures.push(cause);\n }\n transport.close();\n args.closeSetup?.();\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1)\n throw new AggregateError(failures, 'Computer stop or networking fence failed');\n },\n destroy: async () => {\n const finish = async () => {\n const failures: unknown[] = [];\n try {\n await closeComputerMcp(info.id);\n } catch (cause) {\n failures.push(cause);\n }\n transport.close();\n\n try {\n await client.action(info.id, 'delete');\n } catch (cause) {\n if (!isComputersApiStatus(cause, 404)) failures.push(cause);\n }\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1)\n throw new AggregateError(failures, 'Computer delete or MCP cleanup failed');\n };\n if (args.networking == null && args.access !== SandboxAccess.Read)\n await teardownComputer({\n ctx: args.ctx,\n computerId: info.id,\n computerName: info.name,\n workspace: spec.parameters.workspace,\n policySaved: args.networkingManaged === true,\n workspaceId: args.ctx.session.workspaceId,\n fence: true,\n finish,\n });\n else await finish();\n },\n },\n });\n let computerUseInstalled: boolean | null = null;\n if (args.access !== SandboxAccess.Read) {\n try {\n computerUseInstalled = (await client.computerUseStatus(info.id, AbortSignal.timeout(1000)))\n .installed;\n } catch {\n /* Optional discovery must never fail the sandbox. */\n }\n }\n const computerUse =\n args.access === SandboxAccess.Read || computerUseInstalled === false\n ? null\n : createComputerUseEndpoint({ client, computerId: info.id, cwd: WORKSPACE_ROOT });\n const closeMcp = async () => {\n try {\n await computerUse?.close();\n } catch (error) {\n log('computer_use.close_failed', {\n computerId: info.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n const closers = mcpClosers.get(info.id);\n closers?.delete(closeMcp);\n if (closers?.size === 0) mcpClosers.delete(info.id);\n };\n if (computerUse != null) {\n const closers = mcpClosers.get(info.id) ?? new Set<() => Promise<void>>();\n closers.add(closeMcp);\n mcpClosers.set(info.id, closers);\n }\n const capabilities = [SandboxCapability.Files, SandboxCapability.Ports];\n let screenAvailable = false;\n try {\n screenAvailable = (await client.screenStatus(info.id, AbortSignal.timeout(1000))).available;\n } catch {\n /* Optional desktop discovery leaves headless computers usable. */\n }\n if (screenAvailable) capabilities.push(SandboxCapability.Screen);\n if (computerUse != null) capabilities.push(SandboxCapability.ComputerUse);\n if (args.access !== SandboxAccess.Read)\n capabilities.push(\n SandboxCapability.Process,\n SandboxCapability.DurableProcesses,\n SandboxCapability.NetworkPolicy,\n );\n if (args.access === SandboxAccess.Write && args.networking != null)\n capabilities.push(...(config.networking?.capabilities ?? []));\n const description: ComputerSandboxDescriptionIface = {\n provider: 'computer',\n computerId: info.id,\n computerName: info.name,\n workspaceRoot: WORKSPACE_ROOT,\n transport: transport.kind,\n guide: spec.guide == null ? null : { slug: spec.guide.slug, number: spec.guide.number },\n repositories: spec.parameters.repositories.map((repository) => ({\n alias: repository.alias,\n path: repositoryPath(repository.alias),\n repository: repository.repository,\n })),\n services: spec.template.services.map((service) => ({\n name: service.name,\n readyUrl: service.ready?.url ?? null,\n })),\n commands,\n capabilities,\n };\n const full: ComputerSandboxSessionIface = {\n ...session,\n setNetworkPolicy: async (policy) => {\n if (args.access === SandboxAccess.Read)\n throw new Error('this sandbox binding is read-only');\n await client.setNetworkPolicy(info.id, egressFor(args.ctx, policy));\n },\n describe: () => description,\n capabilities,\n };\n if (computerUse != null) full.computerUse = async () => computerUse.endpoint;\n if (screenAvailable) {\n full.screen = (options) => client.openScreen(info.id, options);\n }\n const sandbox = full;\n let handle: SandboxProviderHandleIface<ComputerSandboxSessionIface> = {\n sandbox,\n onSandboxStop: async () => {\n const failures: unknown[] = [];\n try {\n if (args.networking != null)\n await client.setNetworkPolicy(\n info.id,\n { egress: ComputerEgressPolicy.None },\n { autoResume: false },\n );\n else\n await teardownComputer({\n ctx: args.ctx,\n computerId: info.id,\n computerName: info.name,\n workspace: spec.parameters.workspace,\n policySaved: args.networkingManaged === true,\n workspaceId: args.ctx.session.workspaceId,\n fence: true,\n finish: async () => {},\n });\n } catch (cause) {\n try {\n if (!(await deletedAfterFenceError({ client, computerId: info.id, cause })))\n failures.push(cause);\n } catch (lookup) {\n failures.push(lookup);\n }\n }\n for (const finish of [closeMcp, () => transport.close(), () => args.closeSetup?.()]) {\n try {\n await finish();\n } catch (cause) {\n failures.push(cause);\n }\n }\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1)\n throw new AggregateError(failures, 'Computer fence and MCP cleanup failed');\n },\n onSandboxDelete: async () => {\n const finish = async () => {\n const failures: unknown[] = [];\n try {\n await closeMcp();\n } catch (cause) {\n failures.push(cause);\n }\n transport.close();\n args.closeSetup?.();\n try {\n await client.action(info.id, 'delete');\n } catch (cause) {\n if (!isComputersApiStatus(cause, 404)) failures.push(cause);\n }\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1)\n throw new AggregateError(failures, 'Computer delete or MCP cleanup failed');\n };\n if (args.networking == null)\n await teardownComputer({\n ctx: args.ctx,\n computerId: info.id,\n computerName: info.name,\n workspace: spec.parameters.workspace,\n policySaved: args.networkingManaged === true,\n workspaceId: args.ctx.session.workspaceId,\n fence: true,\n finish,\n });\n else await finish();\n },\n onRuntimeShutdown: async () => {\n try {\n await closeMcp();\n } finally {\n transport.close();\n args.closeSetup?.();\n }\n },\n };\n if (args.networking != null)\n handle = await withSandboxNetworking({\n handle,\n controller: args.networking,\n access: args.access,\n initialized: true,\n fetch: config.networking?.fetch,\n executionPolicy: args.ctx.executionPolicy,\n beforeUse: args.beforeUse,\n });\n else if (config.networking != null)\n handle = await withSandboxNetworking({\n handle,\n access: args.access,\n fetch: config.networking?.fetch,\n executionPolicy: args.ctx.executionPolicy,\n admission: async () => {\n if (\n await needsWorkspaceNetworking(\n args.ctx,\n sandboxWorkspaceId({\n session: args.ctx.session,\n workspace: sandboxWorkspaceOf[args.spec.parameters.workspace],\n }),\n { access: args.access },\n )\n )\n throw new Error(\n 'Workspace networking changed; reconnect this sandbox before running tools',\n );\n },\n });\n return {\n handle: mapSandboxHandle({\n handle,\n mapSandbox: (sandbox) => sessionForAccess(sandbox, args.access),\n }),\n };\n };\n\n // Setup (repositories, workspace.setup, services) is the provider's own work, so it\n // runs with the organization's credential, never through the binding's lease: a\n // ordinary read binding gets setup; managed reads defer it until guarded write access.\n const setupSession = (args: {\n client: ComputersApiClientIface;\n info: ComputerInfoIface;\n env: () => Promise<Record<string, string>>;\n }): SetupSessionIface => {\n const transport = createComputersApiTransport({\n client: args.client,\n computerId: args.info.id,\n });\n const sandbox = createTransportSession({\n id: args.info.id,\n description: `setup of ${args.info.name}`,\n workspaceRoot: WORKSPACE_ROOT,\n transport,\n baseEnv: args.env,\n randomUuid,\n network: {\n ports: [],\n getPortEndpoint: async () => {\n throw new Error('setup sessions expose no ports');\n },\n stop: async () => undefined,\n destroy: async () => undefined,\n },\n });\n return { sandbox, transport };\n };\n\n const createNetworkingController = (\n options: SandboxNetworkingControllerOptionsIface,\n ): SandboxNetworkingControllerIface => {\n try {\n if (config.networking == null) throw new Error('Workspace networking extension is required');\n return config.networking.controller(options);\n } catch (cause) {\n options.onClose?.();\n throw cause;\n }\n };\n const workspaceNetworking = (args: {\n ctx: SandboxStartContextIface;\n sandbox: NetworkSandboxSessionIface;\n client: ComputersApiClientIface;\n info: ComputerInfoIface;\n spec: ResolvedComputerSpecIface;\n onClose: () => void;\n initialNetworkPolicy: NetworkPolicyIface;\n enabled: boolean;\n access: SandboxAccess;\n }) => {\n if (config.networking == null || !args.enabled) return undefined;\n return createNetworkingController({\n ctx: {\n platformEgressHosts: args.ctx.platformEgressHosts,\n platformNetworkPolicy: args.ctx.platformNetworkPolicy,\n organizationId: args.ctx.session.organizationId,\n credentials: args.ctx.credentials,\n actingUser: args.ctx.actingUser,\n bindings: args.ctx.bindings,\n },\n sandbox: args.sandbox,\n workspaceId: sandboxWorkspaceId({\n session: args.ctx.session,\n workspace: sandboxWorkspaceOf[args.spec.parameters.workspace],\n }),\n access: args.access,\n onClose: args.onClose,\n initialNetworkPolicy: args.initialNetworkPolicy,\n namespaceExists: async () => {\n const current = await args.client.getComputer(args.info.id);\n return current?.state === ComputerState.Running;\n },\n log,\n afterBlock: () =>\n args.client.setNetworkPolicy(\n args.info.id,\n { egress: ComputerEgressPolicy.None },\n { autoResume: false },\n ),\n afterGuard: (policy) =>\n args.client.setNetworkPolicy(\n args.info.id,\n egressFor(args.ctx, policy ?? { mode: NetworkPolicy.DenyAll }),\n { autoResume: false },\n ),\n });\n };\n const managedWorkspaces = new Set<string>();\n const savedPolicyWorkspaces = new Set<string>();\n const preservePolicy = async (args: {\n ctx: SandboxStartContextIface;\n workspaceId: string;\n policy: NetworkPolicyIface;\n }) => {\n if (config.networking == null) throw new Error('Workspace networking extension is required');\n const retained = await config.networking.prepare({\n ctx: {\n platformEgressHosts: args.ctx.platformEgressHosts,\n platformNetworkPolicy: args.ctx.platformNetworkPolicy,\n organizationId: args.ctx.session.organizationId,\n credentials: args.ctx.credentials,\n actingUser: args.ctx.actingUser,\n bindings: args.ctx.bindings,\n },\n workspaceId: args.workspaceId,\n policy: args.policy,\n });\n await reportPlatformNetworkPolicy(args.ctx, retained ?? args.policy);\n savedPolicyWorkspaces.add(args.ctx.session.organizationId + ':' + args.workspaceId);\n };\n const needsWorkspaceNetworking = async (\n ctx: SandboxStartContextIface,\n workspaceId: string,\n query: { teardown?: boolean; access?: SandboxAccess } = {},\n ): Promise<boolean> => {\n const needed =\n (await config.networking?.enabled({\n ctx: {\n platformEgressHosts: ctx.platformEgressHosts,\n organizationId: ctx.session.organizationId,\n credentials: ctx.credentials,\n actingUser: ctx.actingUser,\n bindings: ctx.bindings,\n },\n workspaceId,\n access: SandboxAccess.Write,\n ...query,\n })) ?? false;\n if (needed) managedWorkspaces.add(ctx.session.organizationId + ':' + workspaceId);\n return needed || managedWorkspaces.has(ctx.session.organizationId + ':' + workspaceId);\n };\n const teardownComputer = async (args: {\n ctx: SandboxStartContextIface;\n computerId: string;\n computerName: string;\n workspace: ComputerWorkspacePolicy;\n policySaved: boolean;\n workspaceId: string | undefined;\n fence: boolean;\n finish: () => Promise<void>;\n }): Promise<string> => {\n let workspaceId: string;\n try {\n workspaceId =\n args.workspaceId ??\n sandboxWorkspaceId({\n session: args.ctx.session,\n workspace: sandboxWorkspaceOf[args.workspace],\n });\n } catch (cause) {\n try {\n await args.finish();\n } catch (cleanup) {\n throw new AggregateError([cause, cleanup], 'Computer identity and teardown failed');\n }\n throw cause;\n }\n const failures: unknown[] = [];\n let managed =\n args.policySaved ||\n managedWorkspaces.has(args.ctx.session.organizationId + ':' + workspaceId);\n let queryFailed = false;\n try {\n managed =\n (await needsWorkspaceNetworking(args.ctx, workspaceId, { teardown: true })) ||\n args.policySaved;\n } catch (cause) {\n failures.push(cause);\n queryFailed = true;\n }\n const results = await Promise.allSettled([\n (async () => {\n if (managed && args.fence) {\n const client = clientFor(args.ctx.credentials);\n let mayFence =\n args.policySaved ||\n savedPolicyWorkspaces.has(args.ctx.session.organizationId + ':' + workspaceId);\n try {\n if (config.networking != null) {\n await preservePolicy({\n ctx: args.ctx,\n workspaceId,\n policy: networkPolicyFor(await client.getNetworkPolicy(args.computerId)),\n });\n mayFence = true;\n }\n } catch (cause) {\n if (isComputersApiStatus(cause, 404)) mayFence = false;\n else failures.push(cause);\n }\n if (mayFence) {\n try {\n await client.setNetworkPolicy(\n args.computerId,\n { egress: ComputerEgressPolicy.None },\n { autoResume: false },\n );\n } catch (cause) {\n let settled = isComputersApiStatus(cause, 404);\n if (!settled && isComputersApiStatus(cause, 409)) {\n try {\n const latest = await client.getComputer(args.computerId);\n settled = latest == null || latest.state === ComputerState.Deleted;\n } catch (lookup) {\n failures.push(lookup);\n }\n }\n if (!settled) failures.push(cause);\n }\n }\n }\n await args.finish();\n })(),\n (async () => {\n if (managed && config.networking == null)\n throw new Error(\n 'Managed Computer teardown requires the workspace egress integration to revoke Device access',\n );\n if (config.networking != null && (managed || queryFailed))\n await config.networking.suspend({\n ctx: {\n organizationId: args.ctx.session.organizationId,\n credentials: args.ctx.credentials,\n actingUser: args.ctx.actingUser,\n bindings: args.ctx.bindings,\n },\n workspaceId,\n });\n })(),\n ]);\n for (const result of results) if (result.status === 'rejected') failures.push(result.reason);\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1)\n throw new AggregateError(failures, 'Computer teardown and egress revocation failed');\n return workspaceId;\n };\n\n // A captured base, once it is ready; a failed or expired one must be built again.\n const awaitBase = async (\n client: ComputersApiClientIface,\n baseId: string,\n key: string,\n ): Promise<ComputerBaseIface> => {\n const deadline = now() + (config.buildWaitMs ?? 30 * 60_000);\n for (;;) {\n const base = await client.getBase(baseId);\n if (base == null || base.state === ComputerBaseState.Expired) {\n throw computerSandboxError(\n 'artifact_unavailable',\n `computer base ${key} (${baseId}) is ${base == null ? 'gone' : 'expired'}; prepare it again`,\n );\n }\n if (base.state === ComputerBaseState.Ready) return base;\n if (base.state === ComputerBaseState.Failed) {\n throw computerSandboxError(\n 'build_failed',\n `computer base ${key} failed to capture: ${base.error ?? 'unknown error'}`,\n );\n }\n if (now() >= deadline) throw new Error(`computer base ${key} is still capturing`);\n await sleep(config.buildPollMs ?? 5_000);\n }\n };\n\n // The Computers API answers a computer it created or started before the\n // computer has a host, and refuses commands and file writes until it runs\n // (`autoResume: false`), so nothing touches it before this resolves. Only\n // Running counts: a paused computer still refuses them.\n const awaitComputerRunning = async (\n client: ComputersApiClientIface,\n computerId: string,\n timeoutMs: number,\n ): Promise<ComputerInfoIface> => {\n const deadline = now() + timeoutMs;\n let pollMs = config.runningPollMs ?? 250;\n for (;;) {\n const computer = await client.getComputer(computerId);\n if (computer == null || computer.state === ComputerState.Deleted)\n throw computerSandboxError('computer_gone', `computer ${computerId} is gone`);\n if (computer.state === ComputerState.Error)\n throw computerSandboxError(\n 'computer_gone',\n `computer ${computer.name} is in the Error state`,\n );\n if (computer.state === ComputerState.Running) return computer;\n const left = deadline - now();\n if (left <= 0)\n throw computerSandboxError(\n 'computer_not_running',\n `computer ${computer.name} was not running within ${Math.round(timeoutMs / 1000)} s (it is ${ComputerState[computer.state]})`,\n );\n await sleep(Math.min(pollMs, left));\n pollMs = Math.min(pollMs * 2, RUNNING_POLL_MAX_MS);\n }\n };\n\n const awaitShelved = async (client: ComputersApiClientIface, computerId: string) => {\n const deadline = now() + (config.shelveWaitMs ?? 5 * 60_000);\n for (;;) {\n const computer = await client.getComputer(computerId);\n if (\n computer == null ||\n computer.state === ComputerState.Shelved ||\n computer.state === ComputerState.Deleted\n )\n return;\n if (computer.state === ComputerState.Error)\n throw computerSandboxError('computer_gone', `computer ${computerId} failed to shelve`);\n if (now() >= deadline) throw new Error(`computer ${computerId} is still shelving`);\n await sleep(config.shelvePollMs ?? 2_000);\n }\n };\n\n // Run build.steps, then build.verify, on a builder computer of the guide's\n // image, captured as a base its computers are created from.\n const build = async (\n ctx: SandboxPrepareContextIface,\n spec: ResolvedComputerSpecIface,\n key: string,\n ): Promise<ComputerSandboxArtifact> => {\n const client = clientFor(ctx.credentials);\n const diskGb = config.machine?.diskGb ?? null;\n const imageVersionId = await readyImageVersion(client, {\n image: spec.image,\n imageVersionId: null,\n });\n const body: CreateComputerBodyIface = {\n name: `ag-${key.slice(4, 20)}-${compactId(randomUuid()).slice(0, 8)}`,\n imageVersionId,\n ...config.machine,\n // The base is the root disk; a user volume would keep /home and /workspaces off it.\n userVolumeGb: null,\n // Nothing secret at create: the create env lands in the guest.\n env: {},\n commandMode: ComputerCommandMode.Custom,\n customCommand: 'sleep infinity',\n autoResume: false,\n idleTimeoutSeconds: BUILDER_IDLE_TIMEOUT_SECONDS,\n tags: ['final-agent-sandbox-build'],\n };\n if (config.regionSlug != null) body.regionSlug = config.regionSlug;\n // One builder per attempt: a retry after a failed build starts clean.\n const builder = await client.createComputer(\n body,\n `agent-guide-build-${(await sha256Hex(`${key}:${randomUuid()}`)).slice(0, 32)}`,\n );\n ctx.log?.(`building computer base ${key} on ${builder.name}`);\n try {\n await awaitComputerRunning(client, builder.id, runningWaitMs);\n const sandbox = setupSession({ client, info: builder, env: async () => ({}) }).sandbox;\n const prepared = await sandbox.run({\n command: '/bin/sh',\n args: ['-c', `mkdir -p ${BUILD_ROOT}\\n${homeBaselineScript()}`],\n cwd: '/',\n });\n if (prepared.exitCode !== 0) {\n throw computerSandboxError('build_failed', 'failed to record the pre-build home baseline');\n }\n const steps = [\n ...spec.template.build.steps.map((step) => ({ step, label: 'build step' })),\n ...spec.template.build.verify.map((step) => ({ step, label: 'verify step' })),\n ];\n for (const [index, { step, label }] of steps.entries()) {\n ctx.log?.(`${label} ${index + 1}/${steps.length}`);\n const result = await sandbox.run({\n command: `set -eu\\n${step.run}`,\n shell: true,\n cwd: BUILD_ROOT,\n timeoutMs: step.timeoutMinutes * 60_000,\n });\n if (result.exitCode !== 0) {\n throw computerSandboxError(\n 'build_failed',\n `${label} ${index + 1} failed (exit ${result.exitCode}): ${result.stderr.trim().slice(-2000)}`,\n );\n }\n }\n const homeContent = await sandbox.run({\n command: '/bin/sh',\n args: ['-c', homeContentScript({ excludedPaths: CAPTURE_SCRUBBED_PATHS })],\n cwd: '/',\n });\n if (homeContent.exitCode === HOME_BASELINE_MISSING_EXIT_CODE) {\n throw computerSandboxError(\n 'build_failed',\n `build steps removed ${HOME_BASELINE_ROOT}, which the home content check needs; leave /var/tmp/final-template-build in place.`,\n );\n }\n if (homeContent.exitCode !== 0) {\n const offending = homeContent.stdout\n .trim()\n .split('\\n')\n .filter((line) => line !== '');\n throw computerSandboxError(\n 'build_failed',\n `build steps left content under /home or /workspaces, which each computer's own volume hides: ${offending.join(', ')}. Install tools and configuration to system paths such as /usr/local, or point the tool's home there (for example CARGO_HOME=/usr/local/cargo, RUSTUP_HOME=/usr/local/rustup, NVM_DIR=/usr/local/nvm), put home files in /usr/share/final-vm/home-skel, and use /etc/gitconfig instead of git config --global.`,\n );\n }\n const captured = await client.captureComputer(builder.id, { retained: true });\n if (!captured.retained)\n throw computerSandboxError(\n 'build_failed',\n 'the Computers API did not retain the built base',\n );\n ctx.log?.(`capturing computer base ${key} as ${captured.id}`);\n const base = await awaitBase(client, captured.id, key);\n return {\n version: 1,\n key,\n image: spec.image,\n diskGb: diskGb ?? base.diskGb,\n seedFiles: {},\n base: { kind: 'captured', baseId: base.id },\n };\n } finally {\n // The capture stopped the builder; it is not part of the base.\n try {\n await client.action(builder.id, 'delete');\n } catch (error) {\n log('computer_sandbox.builder_delete_failed', {\n computerId: builder.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n };\n\n const environment = (\n rawOptions?: JsonValue,\n ): SandboxProviderImplementationIface<\n JsonValue,\n ComputerSandboxArtifact,\n ComputerSandboxState,\n ComputerSandboxSessionIface\n > => {\n const parsed = computerEnvironmentSchema.safeParse(rawOptions ?? {});\n if (!parsed.success) {\n throw computerSandboxError(\n 'invalid_environment',\n `invalid computer environment: ${parsed.error.message}`,\n );\n }\n const options = parsed.data;\n const resolve = (guides: SandboxGuidesIface): Promise<ResolvedComputerSpecIface> =>\n resolveComputerSpec({ options, guides, defaultImage });\n const keyFor = async (\n spec: ResolvedComputerSpecIface,\n files: Record<string, string>,\n ): Promise<string> => {\n const baseKey = await computeComputerArtifactKey({\n image: spec.image,\n template: spec.template,\n diskGb: config.machine?.diskGb ?? null,\n });\n return Object.keys(files).length === 0\n ? baseKey\n : `${baseKey}-s${await sha256Hex(sandboxSeedIdentity(files))}`;\n };\n\n const startServicesFor = async (args: {\n setup: SetupSessionIface;\n spec: ResolvedComputerSpecIface;\n env: () => Promise<Record<string, string>>;\n }): Promise<void> => {\n await startServices({\n sandbox: args.setup.sandbox,\n transport: args.setup.transport,\n template: args.spec.template,\n // Services run for the computer's life, with the platform's values as they are now.\n env: await args.env(),\n randomUuid,\n log,\n });\n };\n\n const awaitRunning = (\n ctx: SandboxStartContextIface,\n rawState: Pick<ComputerSandboxState, 'computerId'>,\n options: { timeoutMs: number },\n ): Promise<ComputerInfoIface> =>\n awaitComputerRunning(\n clientFor(ctx.credentials),\n computerStateSchema.pick({ computerId: true }).parse(rawState).computerId,\n options.timeoutMs,\n );\n\n return {\n processes: async (ctx, rawState, request) => {\n const state = computerStateSchema.parse(rawState);\n if (\n request.operation === ProcessInspectionOperation.Stop &&\n state.access === SandboxAccess.Read\n )\n throw new Error('stopping processes requires execute access');\n const result = await clientFor(ctx.credentials).inspectProcesses(state.computerId, request);\n return request.operation === ProcessInspectionOperation.Available && 'available' in result\n ? { ...result, canStop: state.access !== SandboxAccess.Read }\n : result;\n },\n editor: async (ctx, rawState, request) => {\n const state = computerStateSchema.parse(rawState);\n if (state.access !== SandboxAccess.Write) {\n if (request.operation === 'available') return { available: false };\n throw new Error('editor requires write access');\n }\n const client = clientFor(ctx.credentials);\n const open = (expiresAtMs?: number) =>\n computerEditor({\n client,\n computerId: state.computerId,\n request,\n randomUuid,\n expiresAtMs,\n });\n if (request.operation === 'available' || request.operation === 'close') return open();\n const workspaceId = ctx.workspaceId ?? state.workspaceId;\n if (\n state.networkPolicySaved === true &&\n ctx.workspaceId != null &&\n state.workspaceId != null &&\n ctx.workspaceId !== state.workspaceId\n )\n throw new Error('Editor workspace identity does not match its retained provider state');\n if (config.networking == null) {\n if (state.networkPolicySaved === true)\n throw new Error('Device networking control is required before opening this editor');\n return open();\n }\n if (workspaceId == null)\n throw new Error(\n 'The host must supply logical workspace identity before opening an egress-aware editor',\n );\n const managedKey = ctx.organizationId + ':' + workspaceId;\n const managed =\n state.networkPolicySaved === true ||\n managedWorkspaces.has(managedKey) ||\n (await config.networking.enabled({ ctx, workspaceId, access: SandboxAccess.Write }));\n if (!managed) return open();\n managedWorkspaces.add(managedKey);\n config.networking.validateWorkspaceId?.(workspaceId);\n const info = await client.getComputer(state.computerId);\n if (info == null || info.state !== ComputerState.Running)\n throw new Error('Computer must be running before editor access');\n const initialNetworkPolicy = networkPolicyFor(await client.getNetworkPolicy(info.id));\n const setup = setupSession({ client, info, env: async () => ({}) });\n const manager = createNetworkingController({\n sandbox: setup.sandbox,\n onClose: () => setup.transport.close(),\n workspaceId,\n ctx,\n access: SandboxAccess.Write,\n initialNetworkPolicy,\n afterBlock: () =>\n client.setNetworkPolicy(\n info.id,\n { egress: ComputerEgressPolicy.None },\n { autoResume: false },\n ),\n afterGuard: async (policy) =>\n client.setNetworkPolicy(\n info.id,\n policy == null ? { egress: ComputerEgressPolicy.None } : egressFor(ctx, policy),\n { autoResume: false },\n ),\n allowOwnerChange: false,\n });\n const { expiresAtMs: deadline } = await manager\n .authorizeExternalAccess()\n .finally(async () => {\n try {\n await manager.close();\n } finally {\n setup.transport.close();\n }\n });\n if (deadline != null && deadline <= now())\n throw new Error('Refresh workspace egress before opening the editor');\n return open(deadline ?? undefined);\n },\n readSnapshot: async (ctx, rawState, request) => {\n const state = computerStateSchema.parse(rawState);\n return readComputerSnapshot({\n client: clientFor(ctx.credentials),\n computerId: state.computerId,\n request,\n });\n },\n // The merged parameters' workspace: the binding's, else the saved version's default.\n workspace: async (ctx) =>\n sandboxWorkspaceOf[(await resolve(ctx.guides)).parameters.workspace],\n // Screen and computer-use availability is known only after attaching the actual Computer.\n additionalCapabilities: async () => config.networking?.capabilities.slice() ?? [],\n artifactKey: async (ctx) => keyFor(await resolve(ctx.guides), seedsFor(ctx)),\n // Registers an image reference so its version builds ahead of the first start;\n // a lineage needs nothing until then.\n prepare: async (ctx) => {\n const spec = await resolve(ctx.guides);\n const seedFiles = seedsFor(ctx);\n const key = await keyFor(spec, seedFiles);\n const seedArtifact = await sandboxSeedArtifact(ctx, seedFiles);\n if (computerNeedsBuild(spec)) {\n const baseKey = await keyFor(spec, {});\n const prepared = spec.guide?.preparedArtifact;\n if (\n prepared?.key === baseKey &&\n prepared.providerRef === formatProviderRef(packageRef(COMPUTER_SANDBOX_SPECIFIER))\n ) {\n const cached = computerArtifactSchema.safeParse(prepared.artifact);\n if (\n cached.success &&\n cached.data.key === baseKey &&\n cached.data.base.kind === 'captured'\n ) {\n const base = await clientFor(ctx.credentials).getBase(cached.data.base.baseId);\n if (base?.state === ComputerBaseState.Ready) {\n if (!base.retained) {\n const retained = await clientFor(ctx.credentials).setBaseRetention(base.id, true);\n if (!retained.retained)\n throw computerSandboxError(\n 'build_failed',\n 'the Computers API did not retain the prepared base',\n );\n }\n return { ...cached.data, key, ...seedArtifact };\n }\n }\n }\n const cached = computerArtifactSchema.safeParse(await ctx.artifacts?.get(baseKey));\n if (\n cached.success &&\n cached.data.key === baseKey &&\n cached.data.base.kind === 'captured'\n ) {\n const base = await clientFor(ctx.credentials).getBase(cached.data.base.baseId);\n if (base?.state === ComputerBaseState.Ready) {\n if (!base.retained) {\n const retained = await clientFor(ctx.credentials).setBaseRetention(base.id, true);\n if (!retained.retained)\n throw computerSandboxError(\n 'build_failed',\n 'the Computers API did not retain the prepared base',\n );\n }\n return { ...cached.data, key, ...seedArtifact };\n }\n }\n const built = await build(ctx, spec, baseKey);\n await ctx.artifacts?.put(baseKey, built);\n return { ...built, key, ...seedArtifact };\n }\n const imageVersionId = spec.image.startsWith(LINEAGE_PREFIX)\n ? null\n : (await registerImage(clientFor(ctx.credentials), spec.image)).id;\n ctx.log?.(`computer base ${key} is image ${spec.image}`);\n return {\n version: 1,\n key,\n image: spec.image,\n diskGb: config.machine?.diskGb ?? null,\n ...seedArtifact,\n base: { kind: 'image', image: spec.image, imageVersionId },\n };\n },\n awaitRunning: async (ctx, state, options) => {\n await awaitRunning(ctx, state, options);\n },\n start: async (ctx, openOptions, rawArtifact) => {\n const access = computerOpenOptionsSchema.parse(openOptions ?? {}).access;\n const spec = await resolve(ctx.guides);\n const policy = withPlatformEgressHosts(ctx, spec.parameters.networkPolicy);\n const egress = computerEgressOf(policy);\n const artifact = computerArtifactSchema.safeParse(rawArtifact);\n if (!artifact.success) {\n throw computerSandboxError(\n 'artifact_unavailable',\n 'this computer base predates the public Computers API provider; prepare it again',\n );\n }\n const base = artifact.data.base;\n if (computerNeedsBuild(spec) && base.kind !== 'captured') {\n throw computerSandboxError(\n 'artifact_unavailable',\n `computer base ${artifact.data.key} was prepared without its build steps; prepare it again`,\n );\n }\n // Variables resolve before anything is created, so a missing one costs nothing.\n const env = platformProcessEnvironment(ctx, await loadVariables(ctx, spec));\n const client = clientFor(ctx.credentials);\n const workspace = spec.parameters.workspace;\n const name = await computerWorkspaceName({\n ...ctx.session,\n conversationWorkspace: workspace === ComputerWorkspacePolicy.Conversation,\n });\n const workspaceId = sandboxWorkspaceId({\n session: ctx.session,\n workspace: sandboxWorkspaceOf[workspace],\n });\n const manageNetworking =\n (await needsWorkspaceNetworking(ctx, workspaceId)) ||\n (access !== SandboxAccess.Read &&\n (await needsWorkspaceNetworking(ctx, workspaceId, { access })));\n if (manageNetworking)\n config.networking?.validateWorkspaceId?.(\n sandboxWorkspaceId({ session: ctx.session, workspace: sandboxWorkspaceOf[workspace] }),\n );\n const existing = await client.getComputer(name);\n if (existing?.state === ComputerState.Error)\n throw computerSandboxError(\n 'computer_gone',\n `Computer ${existing.id} (${name}) is in the Error state. Recover it through the Computers API before retrying; its workspace is preserved.`,\n );\n if (\n manageNetworking &&\n access === SandboxAccess.Read &&\n existing != null &&\n existing.state !== ComputerState.Deleted &&\n existing.state !== ComputerState.Running\n )\n throw new Error('A managed Computer requires a write binding to resume networking');\n const initialNetworkPolicy =\n manageNetworking && existing != null && existing.state !== ComputerState.Deleted\n ? networkPolicyFor(await client.getNetworkPolicy(existing.id))\n : networkPolicyFor(egress);\n if (\n manageNetworking &&\n access !== SandboxAccess.Read &&\n existing?.state === ComputerState.Running\n )\n await client.disableAutoResume(existing.id);\n if (manageNetworking && config.networking != null)\n await preservePolicy({\n ctx,\n workspaceId: sandboxWorkspaceId({\n session: ctx.session,\n workspace: sandboxWorkspaceOf[workspace],\n }),\n policy: initialNetworkPolicy,\n });\n let info: ComputerInfoIface;\n let fresh = true;\n if (existing != null && existing.state !== ComputerState.Deleted) {\n info = existing;\n fresh = !isRunningState(existing.state);\n if (manageNetworking && existing.state !== ComputerState.Running)\n await client.setNetworkPolicy(\n existing.id,\n { egress: ComputerEgressPolicy.None },\n { autoResume: false },\n );\n if (existing.state === ComputerState.Paused) await client.action(existing.id, 'resume');\n else if (fresh) await client.action(existing.id, 'start');\n } else {\n const source: Pick<CreateComputerBodyIface, 'baseId' | 'imageVersionId'> =\n base.kind === 'captured'\n ? { baseId: (await awaitBase(client, base.baseId, artifact.data.key)).id }\n : { imageVersionId: await readyImageVersion(client, base) };\n const body: CreateComputerBodyIface = {\n name,\n ...source,\n ...config.machine,\n env: {},\n autoResume: !manageNetworking,\n idleTimeoutSeconds: config.idleTimeoutSeconds ?? 15 * 60,\n // Provider teardown owns deletion; VM-level ephemeral disks cannot be paused.\n ephemeral: false,\n network: manageNetworking ? { egress: ComputerEgressPolicy.None } : egress,\n tags: [\n 'final-agent-sandbox',\n `agent-binding:${ctx.session.bindingId}`,\n 'agent-runtime-attachment:v1',\n 'agent-runtime-role:sandbox',\n ],\n };\n // Session teardown owns deletion, including ephemeral computers. Idle must preserve files.\n body.idlePolicy = ComputerIdlePolicy.Pause;\n if (config.regionSlug != null) body.regionSlug = config.regionSlug;\n // Keyed by the source too: a retry after re-registering is a different request.\n const idempotencyKey = `agent-sandbox-${(await sha256Hex(`${ctx.session.bindingId}:${name}:${source.baseId ?? source.imageVersionId}:${manageNetworking}`)).slice(0, 32)}`;\n info = await client.createComputer(body, idempotencyKey);\n }\n const reused = existing != null && existing.id === info.id;\n log('computer_sandbox.started', { computerId: info.id, reused });\n let cleanupSetup: (() => Promise<void>) | null = null;\n try {\n info = await awaitRunning(ctx, { computerId: info.id }, { timeoutMs: runningWaitMs });\n // A reused computer keeps whatever policy it last ran under; it gets the spec's again.\n if (!manageNetworking) {\n if (reused) await client.setNetworkPolicy(info.id, egress);\n await reportPlatformNetworkPolicy(ctx, policy);\n }\n const setup = setupSession({ client, info, env });\n cleanupSetup = async () => setup.transport.close();\n if (!manageNetworking || access !== SandboxAccess.Read)\n await writePlatformFiles(ctx, setup.sandbox);\n const manager = workspaceNetworking({\n ctx,\n enabled: manageNetworking && access !== SandboxAccess.Read,\n access,\n sandbox: setup.sandbox,\n client,\n info,\n spec,\n onClose: () => setup.transport.close(),\n initialNetworkPolicy,\n });\n cleanupSetup = async () => {\n try {\n await manager?.closeOnFailure();\n } finally {\n setup.transport.close();\n }\n };\n const servicesMarker = WORKSPACE_ROOT + '/.final-workspace-services';\n if (fresh && manageNetworking)\n await setup.sandbox.writeTextFile({ path: servicesMarker, content: 'pending' });\n await manager?.initialize();\n const preparationMarker =\n WORKSPACE_ROOT + '/.final/workspace-prepared/' + (await sha256Hex(artifact.data.key));\n let preparation: Promise<string | null> | null = null;\n const prepareWorkspace = (): Promise<string | null> =>\n (preparation ??= (async () => {\n await mountRepositories({\n sandbox: setup.sandbox,\n repositories: spec.parameters.repositories,\n resolver: ctx.repositories,\n log,\n });\n await materializeSandboxSeeds({\n sandbox: setup.sandbox,\n root: WORKSPACE_ROOT,\n files: await sandboxSeedFilesForStart(ctx, artifact.data),\n });\n await installGuideCommands({ sandbox: setup.sandbox, template: spec.template });\n const result = await runWorkspaceSetup({\n sandbox: setup.sandbox,\n template: spec.template,\n repositories: spec.parameters.repositories,\n log,\n });\n const servicesPending =\n manager != null &&\n (await setup.sandbox.stat({ path: servicesMarker })) != null &&\n (await setup.sandbox.readTextFile({ path: servicesMarker })) === 'pending';\n if (fresh || servicesPending) {\n await startServicesFor({ setup, spec, env });\n if (manageNetworking)\n await setup.sandbox.writeTextFile({ path: servicesMarker, content: 'complete' });\n }\n if (manager != null)\n await setup.sandbox.writeTextFile({ path: preparationMarker, content: 'complete' });\n return result;\n })().catch((cause: unknown) => {\n preparation = null;\n throw cause;\n }));\n // A blocked workspace still opens its egress control; setup waits for an authorized exit.\n let ready = !manageNetworking || access !== SandboxAccess.Read;\n if (manager != null) {\n try {\n await ctx.executionPolicy?.beforeExecution({\n operation: SandboxExecutionOperation.Run,\n background: false,\n });\n await manager.guard();\n } catch {\n log('workspace_networking.setup_deferred', {\n provider: 'computer',\n computerId: info.id,\n });\n ready = false;\n }\n }\n const setupHash = ready ? await prepareWorkspace() : null;\n const { handle } = await buildHandle({\n ctx,\n client,\n info,\n spec,\n access,\n env,\n networking: manager,\n networkingManaged: manageNetworking,\n closeSetup: () => setup.transport.close(),\n beforeUse: async () => {\n await prepareWorkspace();\n },\n });\n return {\n handle,\n region: info.regionSlug ?? config.regionSlug ?? null,\n state: {\n version: 1,\n computerId: info.id,\n computerName: info.name,\n workspace,\n access,\n guideVersionId: spec.guide?.versionId ?? null,\n setupHash,\n setupPending: !ready,\n workspaceId: sandboxWorkspaceId({\n session: ctx.session,\n workspace: sandboxWorkspaceOf[workspace],\n }),\n networkPolicySaved: manageNetworking,\n },\n };\n } catch (error) {\n let cause = error;\n try {\n await cleanupSetup?.();\n } catch (cleanupError) {\n cause = new AggregateError(\n [error, cleanupError],\n 'Computer setup and egress cleanup failed',\n );\n }\n // No state reaches the caller on failure; clean up only this start's new computer.\n if (!reused) {\n try {\n await client.action(info.id, 'delete');\n } catch (cleanupError) {\n throw new AggregateError(\n [cause, cleanupError],\n `computer ${info.name} setup and cleanup failed`,\n );\n }\n }\n throw cause;\n }\n },\n resumePassive: async (ctx, _artifact, rawState) => {\n const state = computerStateSchema.parse(rawState);\n if (ctx.session.workspaceId == null && state.workspaceId != null)\n ctx = { ...ctx, session: { ...ctx.session, workspaceId: state.workspaceId } };\n if (\n state.networkPolicySaved === true &&\n state.workspaceId != null &&\n ctx.session.workspaceId !== state.workspaceId\n )\n throw new Error('Passive workspace identity does not match retained provider state');\n const client = clientFor(ctx.credentials);\n const info = await client.getComputer(state.computerId);\n if (info == null || info.state !== ComputerState.Running)\n throw computerSandboxError(\n 'computer_not_running',\n 'computer is not running for passive access',\n );\n await awaitRunning(ctx, state, { timeoutMs: runningWaitMs });\n const spec = await resolve(ctx.guides);\n const env = platformProcessEnvironment(ctx, await loadVariables(ctx, spec));\n return (\n await buildHandle({\n ctx,\n client,\n info,\n spec,\n access: SandboxAccess.Read,\n env,\n networkingManaged: state.networkPolicySaved === true,\n })\n ).handle;\n },\n resume: async (ctx, _artifact, rawState) => {\n const state = computerStateSchema.parse(rawState);\n if (state.networkPolicySaved === true) {\n if (config.networking == null)\n throw new Error('Device networking control is required before resume');\n }\n if (state.workspaceId != null) {\n if (\n state.networkPolicySaved === true &&\n ctx.session.workspaceId != null &&\n ctx.session.workspaceId !== state.workspaceId\n )\n throw new Error('Resume workspace identity does not match retained provider state');\n if (ctx.session.workspaceId == null)\n ctx = { ...ctx, session: { ...ctx.session, workspaceId: state.workspaceId } };\n }\n if (ctx.session.workspaceId == null)\n ctx = {\n ...ctx,\n session: {\n ...ctx.session,\n workspaceId: sandboxWorkspaceId({\n session: ctx.session,\n workspace: sandboxWorkspaceOf[state.workspace],\n }),\n },\n };\n const client = clientFor(ctx.credentials);\n const workspaceId = sandboxWorkspaceId({\n session: ctx.session,\n workspace: sandboxWorkspaceOf[state.workspace],\n });\n const manageNetworking =\n state.networkPolicySaved === true ||\n (await needsWorkspaceNetworking(ctx, workspaceId)) ||\n (state.access !== SandboxAccess.Read &&\n (await needsWorkspaceNetworking(ctx, workspaceId, { access: state.access })));\n if (manageNetworking)\n config.networking?.validateWorkspaceId?.(\n sandboxWorkspaceId({\n session: ctx.session,\n workspace: sandboxWorkspaceOf[state.workspace],\n }),\n );\n const info = await client.getComputer(state.computerId);\n if (\n info == null ||\n info.state === ComputerState.Deleted ||\n info.state === ComputerState.Error\n ) {\n throw computerSandboxError('computer_gone', `computer ${state.computerName} is gone`);\n }\n // Computers pause when idle, so a resume usually continues in place; one the\n // platform stopped or shelved meanwhile boots again.\n if (\n manageNetworking &&\n state.access === SandboxAccess.Read &&\n info.state !== ComputerState.Running\n )\n throw new Error('A managed Computer requires a write binding to resume networking');\n const initialNetworkPolicy = manageNetworking\n ? networkPolicyFor(await client.getNetworkPolicy(info.id))\n : null;\n if (\n initialNetworkPolicy != null &&\n state.access !== SandboxAccess.Read &&\n info.state === ComputerState.Running\n )\n await client.disableAutoResume(info.id);\n const rebooted = !isRunningState(info.state);\n if (manageNetworking && config.networking != null && initialNetworkPolicy != null)\n await preservePolicy({\n ctx,\n workspaceId: sandboxWorkspaceId({\n session: ctx.session,\n workspace: sandboxWorkspaceOf[state.workspace],\n }),\n policy: initialNetworkPolicy,\n });\n if (manageNetworking && info.state !== ComputerState.Running)\n await client.setNetworkPolicy(\n info.id,\n { egress: ComputerEgressPolicy.None },\n { autoResume: false },\n );\n if (info.state === ComputerState.Paused) await client.action(info.id, 'resume');\n else if (rebooted) await client.action(info.id, 'start');\n const running = await awaitRunning(ctx, state, { timeoutMs: runningWaitMs });\n const spec = await resolve(ctx.guides);\n const env = platformProcessEnvironment(ctx, await loadVariables(ctx, spec));\n if (!manageNetworking) {\n const policy = withPlatformEgressHosts(ctx, spec.parameters.networkPolicy);\n await client.setNetworkPolicy(running.id, computerEgressOf(policy));\n await reportPlatformNetworkPolicy(ctx, policy);\n }\n const setup = setupSession({ client, info: running, env });\n const manager = workspaceNetworking({\n ctx,\n enabled: manageNetworking && state.access !== SandboxAccess.Read,\n access: state.access,\n sandbox: setup.sandbox,\n client,\n info: running,\n spec,\n onClose: () => setup.transport.close(),\n initialNetworkPolicy:\n initialNetworkPolicy ?? networkPolicyFor(egressFor(ctx, spec.parameters.networkPolicy)),\n });\n try {\n if (!manageNetworking || state.access !== SandboxAccess.Read)\n await writePlatformFiles(ctx, setup.sandbox);\n if (manageNetworking && rebooted)\n await setup.sandbox.writeTextFile({\n path: WORKSPACE_ROOT + '/.final-workspace-services',\n content: 'pending',\n });\n await manager?.initialize();\n let preparation: Promise<void> | null = null;\n const prepareWorkspace = (): Promise<void> =>\n (preparation ??= (async () => {\n const artifact = state.setupPending ? computerArtifactSchema.parse(_artifact) : null;\n const marker =\n artifact == null\n ? null\n : WORKSPACE_ROOT +\n '/.final/workspace-prepared/' +\n (await sha256Hex(artifact.key));\n const pending =\n marker != null && (await setup.sandbox.stat({ path: marker })) == null;\n if (pending && artifact != null) {\n await mountRepositories({\n sandbox: setup.sandbox,\n repositories: spec.parameters.repositories,\n resolver: ctx.repositories,\n log,\n });\n await materializeSandboxSeeds({\n sandbox: setup.sandbox,\n root: WORKSPACE_ROOT,\n files: await sandboxSeedFilesForStart(ctx, artifact),\n });\n }\n await installGuideCommands({ sandbox: setup.sandbox, template: spec.template });\n if (pending)\n await runWorkspaceSetup({\n sandbox: setup.sandbox,\n template: spec.template,\n repositories: spec.parameters.repositories,\n log,\n });\n const servicesMarker = WORKSPACE_ROOT + '/.final-workspace-services';\n const servicesPending =\n manageNetworking &&\n (await setup.sandbox.stat({ path: servicesMarker })) != null &&\n (await setup.sandbox.readTextFile({ path: servicesMarker })) === 'pending';\n if (rebooted || servicesPending) {\n await startServicesFor({ setup, spec, env });\n if (manageNetworking)\n await setup.sandbox.writeTextFile({ path: servicesMarker, content: 'complete' });\n }\n if (pending && marker != null)\n await setup.sandbox.writeTextFile({ path: marker, content: 'complete' });\n })().catch((cause: unknown) => {\n preparation = null;\n throw cause;\n }));\n let ready = !manageNetworking || state.access !== SandboxAccess.Read;\n if (manager != null) {\n try {\n await ctx.executionPolicy?.beforeExecution({\n operation: SandboxExecutionOperation.Run,\n background: false,\n });\n await manager.guard();\n } catch {\n log('workspace_networking.setup_deferred', {\n provider: 'computer',\n computerId: info.id,\n });\n ready = false;\n }\n }\n if (ready) await prepareWorkspace();\n const { handle } = await buildHandle({\n ctx,\n client,\n info: running,\n spec,\n access: state.access,\n env,\n networking: manager,\n networkingManaged: manageNetworking,\n closeSetup: () => setup.transport.close(),\n beforeUse: prepareWorkspace,\n });\n return handle;\n } catch (error) {\n try {\n await manager?.closeOnFailure();\n } catch (cleanupError) {\n throw new AggregateError(\n [error, cleanupError],\n 'Computer resume and egress cleanup failed',\n );\n } finally {\n setup.transport.close();\n }\n throw error;\n }\n },\n park: async (ctx, _artifact, rawState) => {\n const state = computerStateSchema.parse(rawState);\n const workspaceId = await teardownComputer({\n ctx,\n computerId: state.computerId,\n computerName: state.computerName,\n workspace: state.workspace,\n policySaved: state.networkPolicySaved === true,\n workspaceId:\n state.networkPolicySaved === true\n ? state.workspaceId\n : (ctx.session.workspaceId ?? state.workspaceId),\n fence: true,\n finish: async () => {\n const failures: unknown[] = [];\n try {\n await closeComputerMcp(state.computerId);\n } catch (cause) {\n failures.push(cause);\n }\n try {\n const client = clientFor(ctx.credentials);\n // Park reads the computer's state rather than trusting a pause's status\n // alone: a pause that cannot land would otherwise fail on every retry.\n let current: ComputerInfoIface | null | undefined;\n try {\n current = await client.getComputer(state.computerId);\n } catch (cause) {\n failures.push(cause);\n }\n if (current !== undefined && (current == null || hasNothingToPause(current.state))) {\n log('computer_sandbox.park_at_rest', {\n computerId: state.computerId,\n state: current?.state ?? null,\n });\n } else {\n // A paused computer is paused again: a resume may be in flight.\n try {\n await client.action(state.computerId, 'pause');\n } catch (error) {\n if (!pauseMayHaveSettled(error)) throw error;\n // Parked if it came to rest meanwhile (an idle pause or stop, a delete);\n // otherwise the pause did not happen and park is retried.\n const settled = await client.getComputer(state.computerId);\n if (\n settled != null &&\n settled.state !== ComputerState.Paused &&\n !hasNothingToPause(settled.state)\n )\n throw error;\n log('computer_sandbox.park_at_rest', {\n computerId: state.computerId,\n state: settled?.state ?? null,\n });\n }\n }\n } catch (cause) {\n failures.push(cause);\n }\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1) throw new AggregateError(failures, 'Computer pause failed');\n },\n });\n const key = ctx.session.organizationId + ':' + workspaceId;\n return {\n ...state,\n workspaceId,\n networkPolicySaved: state.networkPolicySaved === true || savedPolicyWorkspaces.has(key),\n };\n },\n onSessionEnd: async (ctx, _artifact, rawState, { reason }) => {\n const state = computerStateSchema.parse(rawState);\n const client = clientFor(ctx.credentials);\n const finish = async () => {\n // A conversation workspace outlives its binding (the conversation was\n // archived, or its workspace replaced): it is shelved, its disk backed up\n // to storage with no host held, and the next binding for the\n // conversation starts it again by name. Session and ephemeral disks end\n // with their binding.\n const action =\n state.workspace === ComputerWorkspacePolicy.Conversation ? 'stop' : 'delete';\n log('computer_sandbox.session_end', { computerId: state.computerId, reason, action });\n try {\n await client.action(state.computerId, action);\n } catch (error) {\n if (isComputersApiStatus(error, 404)) return;\n if (!isComputersApiStatus(error, 409)) throw error;\n // A conflict is done only when the computer is already where the action\n // takes it; one mid-transition (an idle pause committing) is retried.\n const current = await client.getComputer(state.computerId);\n const settled =\n current == null ||\n current.state === ComputerState.Deleted ||\n (action === 'stop' && current.state === ComputerState.Shelved);\n if (!settled) throw error;\n return;\n }\n // `stop` returns once the shelve is scheduled: the cleanup (and the\n // host's fence on reusing the workspace) lasts until it is.\n if (action === 'stop') await awaitShelved(client, state.computerId);\n };\n await teardownComputer({\n ctx,\n computerId: state.computerId,\n computerName: state.computerName,\n workspace: state.workspace,\n policySaved: state.networkPolicySaved === true,\n workspaceId:\n state.networkPolicySaved === true\n ? state.workspaceId\n : (ctx.session.workspaceId ?? state.workspaceId),\n fence: state.workspace === ComputerWorkspacePolicy.Conversation,\n finish,\n });\n },\n };\n };\n\n return defineSandboxProvider({\n name: 'computer',\n stateProtocolVersion: 1,\n environment,\n });\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["COMPUTER_SANDBOX_SPECIFIER", "computeComputerArtifactKey", "sandbox", "options", "cached"]
7
7
  }