@finalai/final-agent-provider 0.10.0 → 0.11.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 (161) hide show
  1. package/HOSTING.md +334 -245
  2. package/README.md +126 -40
  3. package/WORKSPACE-EGRESS.md +11 -11
  4. package/dist/modules/catalog.d.mts +9 -0
  5. package/dist/modules/catalog.mjs +21 -0
  6. package/dist/modules/catalog.mjs.map +7 -0
  7. package/dist/modules/channels/projection.mjs +15 -8
  8. package/dist/modules/channels/projection.mjs.map +2 -2
  9. package/dist/modules/harnesses/acp-agent.d.mts +4 -0
  10. package/dist/modules/harnesses/acp-agent.mjs +35 -0
  11. package/dist/modules/harnesses/acp-agent.mjs.map +7 -0
  12. package/dist/modules/harnesses/adapters.d.mts +7 -0
  13. package/dist/modules/harnesses/adapters.mjs +74 -0
  14. package/dist/modules/harnesses/adapters.mjs.map +7 -0
  15. package/dist/modules/harnesses/claude-code.d.mts +14 -0
  16. package/dist/modules/harnesses/claude-code.mjs +79 -0
  17. package/dist/modules/harnesses/claude-code.mjs.map +7 -0
  18. package/dist/modules/harnesses/codex.d.mts +12 -0
  19. package/dist/modules/harnesses/codex.mjs +90 -0
  20. package/dist/modules/harnesses/codex.mjs.map +7 -0
  21. package/dist/modules/harnesses/config-fields.d.mts +98 -57
  22. package/dist/modules/harnesses/config-fields.mjs +58 -35
  23. package/dist/modules/harnesses/config-fields.mjs.map +3 -3
  24. package/dist/modules/harnesses/definitions.d.mts +3 -0
  25. package/dist/modules/harnesses/definitions.mjs +21 -0
  26. package/dist/modules/harnesses/definitions.mjs.map +7 -0
  27. package/dist/modules/harnesses/fidelity.d.mts +1 -1
  28. package/dist/modules/harnesses/fidelity.mjs +19 -16
  29. package/dist/modules/harnesses/fidelity.mjs.map +2 -2
  30. package/dist/modules/harnesses/final.d.mts +12 -0
  31. package/dist/modules/harnesses/final.mjs +70 -0
  32. package/dist/modules/harnesses/final.mjs.map +7 -0
  33. package/dist/modules/harnesses/index.d.mts +13 -12
  34. package/dist/modules/harnesses/index.mjs +86 -45
  35. package/dist/modules/harnesses/index.mjs.map +3 -3
  36. package/dist/modules/harnesses/names.d.mts +43 -0
  37. package/dist/modules/harnesses/names.mjs +59 -0
  38. package/dist/modules/harnesses/names.mjs.map +7 -0
  39. package/dist/modules/harnesses/nanocode-claude.d.mts +18 -0
  40. package/dist/modules/harnesses/nanocode-claude.mjs +101 -0
  41. package/dist/modules/harnesses/nanocode-claude.mjs.map +7 -0
  42. package/dist/modules/harnesses/nanocode-codex.d.mts +13 -0
  43. package/dist/modules/harnesses/nanocode-codex.mjs +64 -0
  44. package/dist/modules/harnesses/nanocode-codex.mjs.map +7 -0
  45. package/dist/modules/harnesses/pi.d.mts +12 -0
  46. package/dist/modules/harnesses/pi.mjs +71 -0
  47. package/dist/modules/harnesses/pi.mjs.map +7 -0
  48. package/dist/modules/integrations.d.mts +9 -0
  49. package/dist/modules/integrations.mjs +29 -0
  50. package/dist/modules/integrations.mjs.map +7 -0
  51. package/dist/modules/provider/general.bundle.d.mts +1 -0
  52. package/dist/modules/provider/general.bundle.mjs +5 -0
  53. package/dist/modules/provider/general.bundle.mjs.map +7 -0
  54. package/dist/modules/provider/general.d.mts +11 -0
  55. package/dist/modules/provider/general.mjs +130 -0
  56. package/dist/modules/provider/general.mjs.map +7 -0
  57. package/dist/modules/provider/index.d.mts +3 -0
  58. package/dist/modules/provider/index.mjs +13 -0
  59. package/dist/modules/provider/index.mjs.map +7 -0
  60. package/dist/modules/sandboxes/access.d.mts +34 -0
  61. package/dist/modules/sandboxes/access.mjs +15 -0
  62. package/dist/modules/sandboxes/access.mjs.map +7 -0
  63. package/dist/modules/sandboxes/computer.d.mts +24 -51
  64. package/dist/modules/sandboxes/computer.mjs +523 -888
  65. package/dist/modules/sandboxes/computer.mjs.map +3 -3
  66. package/dist/modules/sandboxes/computers-api.d.mts +3 -2
  67. package/dist/modules/sandboxes/computers-api.mjs +2 -4
  68. package/dist/modules/sandboxes/computers-api.mjs.map +2 -2
  69. package/dist/modules/sandboxes/device-api.d.mts +4 -3
  70. package/dist/modules/sandboxes/device-api.mjs +2 -4
  71. package/dist/modules/sandboxes/device-api.mjs.map +2 -2
  72. package/dist/modules/sandboxes/device.d.mts +6 -6
  73. package/dist/modules/sandboxes/device.mjs +126 -121
  74. package/dist/modules/sandboxes/device.mjs.map +3 -3
  75. package/dist/modules/sandboxes/egress.d.mts +10 -9
  76. package/dist/modules/sandboxes/egress.mjs +73 -56
  77. package/dist/modules/sandboxes/egress.mjs.map +2 -2
  78. package/dist/modules/sandboxes/environment.d.mts +35 -269
  79. package/dist/modules/sandboxes/environment.mjs +27 -104
  80. package/dist/modules/sandboxes/environment.mjs.map +3 -3
  81. package/dist/modules/sandboxes/index.d.mts +9 -69
  82. package/dist/modules/sandboxes/index.mjs +35 -95
  83. package/dist/modules/sandboxes/index.mjs.map +3 -3
  84. package/dist/modules/sandboxes/local.d.mts +28 -0
  85. package/dist/modules/sandboxes/local.mjs +499 -0
  86. package/dist/modules/sandboxes/local.mjs.map +7 -0
  87. package/dist/modules/sandboxes/session.d.mts +0 -3
  88. package/dist/modules/sandboxes/session.mjs +2 -22
  89. package/dist/modules/sandboxes/session.mjs.map +2 -2
  90. package/dist/modules/sandboxes/testing/fake-machine.mjs +0 -28
  91. package/dist/modules/sandboxes/testing/fake-machine.mjs.map +2 -2
  92. package/package.json +76 -104
  93. package/dist/modules/connections.d.mts +0 -11
  94. package/dist/modules/connections.mjs +0 -16
  95. package/dist/modules/connections.mjs.map +0 -7
  96. package/dist/modules/harnesses/acp-describe.d.mts +0 -20
  97. package/dist/modules/harnesses/acp-describe.mjs +0 -110
  98. package/dist/modules/harnesses/acp-describe.mjs.map +0 -7
  99. package/dist/modules/harnesses/local-stdio.d.mts +0 -47
  100. package/dist/modules/harnesses/local-stdio.mjs +0 -41
  101. package/dist/modules/harnesses/local-stdio.mjs.map +0 -7
  102. package/dist/modules/harnesses/remote-acp.d.mts +0 -76
  103. package/dist/modules/harnesses/remote-acp.mjs +0 -83
  104. package/dist/modules/harnesses/remote-acp.mjs.map +0 -7
  105. package/dist/modules/harnesses/remote-claude-code.d.mts +0 -88
  106. package/dist/modules/harnesses/remote-claude-code.mjs +0 -113
  107. package/dist/modules/harnesses/remote-claude-code.mjs.map +0 -7
  108. package/dist/modules/harnesses/remote-client-tls.d.mts +0 -35
  109. package/dist/modules/harnesses/remote-client-tls.mjs +0 -37
  110. package/dist/modules/harnesses/remote-client-tls.mjs.map +0 -7
  111. package/dist/modules/harnesses/remote-codex.d.mts +0 -98
  112. package/dist/modules/harnesses/remote-codex.mjs +0 -128
  113. package/dist/modules/harnesses/remote-codex.mjs.map +0 -7
  114. package/dist/modules/harnesses/remote-pi.d.mts +0 -78
  115. package/dist/modules/harnesses/remote-pi.mjs +0 -104
  116. package/dist/modules/harnesses/remote-pi.mjs.map +0 -7
  117. package/dist/modules/harnesses/remote-url.d.mts +0 -5
  118. package/dist/modules/harnesses/remote-url.mjs +0 -19
  119. package/dist/modules/harnesses/remote-url.mjs.map +0 -7
  120. package/dist/modules/harnesses/serverless-final.d.mts +0 -63
  121. package/dist/modules/harnesses/serverless-final.mjs +0 -88
  122. package/dist/modules/harnesses/serverless-final.mjs.map +0 -7
  123. package/dist/modules/harnesses/serverless-nanocode-claude.d.mts +0 -64
  124. package/dist/modules/harnesses/serverless-nanocode-claude.mjs +0 -105
  125. package/dist/modules/harnesses/serverless-nanocode-claude.mjs.map +0 -7
  126. package/dist/modules/harnesses/serverless-nanocode-codex.d.mts +0 -66
  127. package/dist/modules/harnesses/serverless-nanocode-codex.mjs +0 -113
  128. package/dist/modules/harnesses/serverless-nanocode-codex.mjs.map +0 -7
  129. package/dist/modules/harnesses/serverless-pi.d.mts +0 -64
  130. package/dist/modules/harnesses/serverless-pi.mjs +0 -98
  131. package/dist/modules/harnesses/serverless-pi.mjs.map +0 -7
  132. package/dist/modules/runtime/index.d.mts +0 -7
  133. package/dist/modules/runtime/index.mjs +0 -18
  134. package/dist/modules/runtime/index.mjs.map +0 -7
  135. package/dist/modules/runtime/local-stdio.d.mts +0 -10
  136. package/dist/modules/runtime/local-stdio.mjs +0 -106
  137. package/dist/modules/runtime/local-stdio.mjs.map +0 -7
  138. package/dist/modules/runtime/remote-acp.d.mts +0 -16
  139. package/dist/modules/runtime/remote-acp.mjs +0 -152
  140. package/dist/modules/runtime/remote-acp.mjs.map +0 -7
  141. package/dist/modules/runtime/remote-claude-code.d.mts +0 -5
  142. package/dist/modules/runtime/remote-claude-code.mjs +0 -47
  143. package/dist/modules/runtime/remote-claude-code.mjs.map +0 -7
  144. package/dist/modules/runtime/remote-codex.d.mts +0 -5
  145. package/dist/modules/runtime/remote-codex.mjs +0 -47
  146. package/dist/modules/runtime/remote-codex.mjs.map +0 -7
  147. package/dist/modules/runtime/remote-host.d.mts +0 -127
  148. package/dist/modules/runtime/remote-host.mjs +0 -387
  149. package/dist/modules/runtime/remote-host.mjs.map +0 -7
  150. package/dist/modules/runtime/remote-pi.d.mts +0 -5
  151. package/dist/modules/runtime/remote-pi.mjs +0 -44
  152. package/dist/modules/runtime/remote-pi.mjs.map +0 -7
  153. package/dist/modules/sandboxes/guide.d.mts +0 -35
  154. package/dist/modules/sandboxes/guide.mjs +0 -119
  155. package/dist/modules/sandboxes/guide.mjs.map +0 -7
  156. package/dist/modules/sandboxes/workspace-setup.d.mts +0 -42
  157. package/dist/modules/sandboxes/workspace-setup.mjs +0 -242
  158. package/dist/modules/sandboxes/workspace-setup.mjs.map +0 -7
  159. package/dist/modules/testing/harness.d.mts +0 -9
  160. package/dist/modules/testing/harness.mjs +0 -123
  161. package/dist/modules/testing/harness.mjs.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/sandboxes/computers-api.ts"],
4
- "sourcesContent": ["import {\n ProcessInspectionOperation,\n type ProcessInspectionRequestIface,\n type ProcessInspectionResultIface,\n} from '@finalai/agent-protocol/process-inspection';\nimport {\n jsonValueSchema,\n type JsonValue,\n type SandboxCredentialsIface,\n} from '@finalai/agent-provider';\nimport {\n computerBrowserAccessSchema,\n ComputerImageState,\n computerSnapshotResponseSchema,\n createTransport,\n normalizeComputerBase,\n normalizeComputerImage,\n normalizeComputerInfo,\n ok,\n type ComputerBaseIface,\n type ComputerBrowserAccessIface,\n type ComputerBrowserAccessOptionsIface,\n type ComputerCommandMode,\n ComputerEgressPolicy,\n type ComputerIdlePolicy,\n type ComputerImageIface,\n type ComputerInfoIface,\n type ComputerScreenOpenOptionsIface,\n type ComputerSnapshotRequestIface,\n type ComputerSnapshotResponseIface,\n} from '@finalai/computers';\nimport * as z from 'zod';\nimport { inspectComputerProcesses } from \"./computer-processes.mjs\";\n// The public Computers API (`/v1`), authenticated with the context's\n// `credentials.computersAccess`. This speaks the REST surface directly, reusing\n// @finalai/computers's row normalization, because the provider needs an injected\n// fetch and per-call abort signals that the SDK's client does not take.\n\nexport interface ComputersApiConfigIface {\n fetch?: typeof fetch;\n requestTimeoutMs?: number;\n}\n\nexport enum ComputersApiErrorCode {\n CredentialMissing = 'credential_missing',\n RequestFailed = 'request_failed',\n}\n\nexport interface ComputersApiErrorIface extends Error {\n code: ComputersApiErrorCode;\n statusCode: number | null;\n}\n\nexport const computersApiError = (\n message: string,\n statusCode: number | null,\n code: ComputersApiErrorCode = ComputersApiErrorCode.RequestFailed,\n): ComputersApiErrorIface =>\n Object.assign(new Error(message), { name: 'ComputersApiError', code, statusCode });\n\nexport const isComputersApiError = (cause: unknown): cause is ComputersApiErrorIface =>\n cause instanceof Error && 'statusCode' in cause && 'code' in cause;\n\nexport const isComputersApiStatus = (cause: unknown, ...statuses: number[]): boolean =>\n isComputersApiError(cause) && cause.statusCode != null && statuses.includes(cause.statusCode);\n\n// Exactly one of imageVersionId (a registered image) and baseId (a captured computer).\nexport interface CreateComputerBodyIface {\n name: string;\n imageVersionId?: string;\n baseId?: string;\n regionSlug?: string;\n vcpu?: number;\n memoryMb?: number;\n diskGb?: number;\n // Null: no user volume, so everything the computer writes is on the disk a capture takes.\n userVolumeGb?: number | null;\n env: Record<string, string>;\n commandMode?: ComputerCommandMode;\n customCommand?: string;\n ephemeral?: boolean;\n idleTimeoutSeconds?: number;\n idlePolicy?: ComputerIdlePolicy;\n network?: { egress: ComputerEgressPolicy; allow?: string[] };\n autoResume?: boolean;\n tags?: string[];\n}\n\nexport interface ExecBodyIface {\n autoResume?: boolean;\n command: string;\n env?: Record<string, string>;\n cwd?: string;\n user?: string;\n timeoutMs?: number;\n readyTimeoutMs?: number;\n}\n\n// `stop` shelves a computer that is not ephemeral: its disks go to storage and\n// its host is released; `start` brings it back with its files.\nexport type ComputerAction = 'start' | 'stop' | 'pause' | 'resume' | 'delete';\n\nconst outputStreamSchema = z.object({\n dataB64: z.string(),\n offset: z.number(),\n nextOffset: z.number(),\n eof: z.boolean(),\n});\nconst processOutputSchema = z.object({\n stdout: outputStreamSchema,\n stderr: outputStreamSchema,\n state: z.union([z.literal('running'), z.literal('exited')]),\n result: z.object({ exitCode: z.number().nullable(), signal: z.string().nullable() }).nullable(),\n});\nexport type ComputerProcessOutputIface = z.infer<typeof processOutputSchema>;\nconst runResponseSchema = processOutputSchema.extend({\n id: z.string(),\n bootId: z.string(),\n timedOut: z.boolean(),\n});\nexport type ComputerRunResultIface = z.infer<typeof runResponseSchema>;\nconst execResponseSchema = z.object({ id: z.string(), bootId: z.string() });\nconst fileReadSchema = z.object({\n dataB64: z.string(),\n eof: z.boolean(),\n offset: z.number().optional(),\n});\nconst tokenSchema = z.object({ id: z.string(), token: z.string() });\nconst computerResponseSchema = z.object({ computer: jsonValueSchema });\nconst imageResponseSchema = z.object({ image: jsonValueSchema });\nconst baseResponseSchema = z.object({ base: jsonValueSchema });\nconst imagesResponseSchema = z.object({ images: z.array(jsonValueSchema) });\n\nexport interface ComputersApiClientIface {\n disableAutoResume(computerId: string): Promise<void>;\n inspectProcesses(\n computerId: string,\n input: ProcessInspectionRequestIface,\n ): Promise<ProcessInspectionResultIface>;\n openBrowserAccess(\n computerId: string,\n options: ComputerBrowserAccessOptionsIface,\n ): Promise<ComputerBrowserAccessIface>;\n closeBrowserAccess(computerId: string, tokenId: string): Promise<void>;\n readSnapshot(\n computerId: string,\n request: ComputerSnapshotRequestIface,\n ): Promise<ComputerSnapshotResponseIface>;\n screenStatus(computerId: string, signal?: AbortSignal): Promise<{ available: boolean }>;\n openScreen(\n computerId: string,\n options?: ComputerScreenOpenOptionsIface,\n ): Promise<{ url: string; token: string; expiresAt: string }>;\n computerUseStatus(\n computerId: string,\n signal?: AbortSignal,\n ): Promise<{ available: boolean; installed: boolean }>;\n openComputerUse(\n computerId: string,\n options: { cwd: string; readyTimeoutMs?: number; signal?: AbortSignal },\n ): Promise<{ id: string; bootId: string }>;\n setNetworkPolicy(\n computerId: string,\n policy: { egress: ComputerEgressPolicy; allow?: string[] },\n lifecycle?: { autoResume: false },\n ): Promise<void>;\n createComputer(body: CreateComputerBodyIface, idempotencyKey: string): Promise<ComputerInfoIface>;\n // Null when the computer does not exist (or was deleted).\n getComputer(idOrName: string): Promise<ComputerInfoIface | null>;\n getNetworkPolicy(\n idOrName: string,\n ): Promise<{ egress: ComputerEgressPolicy; allow: string[] } | null>;\n action(idOrName: string, action: ComputerAction): Promise<void>;\n exec(computerId: string, body: ExecBodyIface): Promise<{ id: string; bootId: string }>;\n run(\n computerId: string,\n body: ExecBodyIface & { waitMs?: number },\n ): Promise<ComputerRunResultIface>;\n output(args: {\n computerId: string;\n processId: string;\n bootId: string;\n stdoutOffset: number;\n stderrOffset: number;\n waitMs: number;\n signal?: AbortSignal;\n }): Promise<ComputerProcessOutputIface>;\n input(args: {\n computerId: string;\n processId: string;\n body: Record<string, JsonValue>;\n signal?: AbortSignal;\n }): Promise<void>;\n terminate(args: { computerId: string; processId: string; bootId: string }): Promise<void>;\n readFile(args: {\n computerId: string;\n path: string;\n offset: number;\n length: number;\n signal?: AbortSignal;\n }): Promise<{ dataB64: string; eof: boolean }>;\n writeFile(args: {\n computerId: string;\n path: string;\n dataB64: string;\n append: boolean;\n signal?: AbortSignal;\n }): Promise<void>;\n // An `http`-scoped token for one computer's ports (a preview token).\n createPreviewToken(args: { computerId: string; name: string; expiresAt: Date }): Promise<string>;\n // The organization's and the platform's image versions, newest first.\n listImages(args: { lineage: string; state: ComputerImageState }): Promise<ComputerImageIface[]>;\n // Registering a digest the organization already has returns that version.\n registerImage(args: {\n reference: string;\n registryCredentialId?: string;\n }): Promise<ComputerImageIface>;\n getImage(imageVersionId: string): Promise<ComputerImageIface>;\n // Captures a running computer as a base; the computer stops for it.\n captureComputer(idOrName: string, options?: { retained?: boolean }): Promise<ComputerBaseIface>;\n setBaseRetention(baseId: string, retained: boolean): Promise<ComputerBaseIface>;\n // Null when the base does not exist.\n getBase(baseId: string): Promise<ComputerBaseIface | null>;\n}\n\nexport const createComputersApiClient = (args: {\n config: ComputersApiConfigIface;\n // The context's credentials; asked for access before each request.\n credentials: SandboxCredentialsIface | undefined;\n}): ComputersApiClientIface => {\n const request = async <T>(req: {\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n query?: Record<string, string>;\n body?: object;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n schema: z.ZodType<T>;\n }): Promise<T> => {\n const send = async (refresh: boolean) => {\n const access = await args.credentials?.computersAccess({ refresh });\n if (access == null) {\n throw computersApiError(\n 'the host granted the computer sandbox no Computers API access',\n null,\n ComputersApiErrorCode.CredentialMissing,\n );\n }\n return createTransport({\n baseUrl: access.baseUrl,\n auth: { apiKey: access.token },\n fetch: args.config.fetch,\n requestTimeoutMs: args.config.requestTimeoutMs,\n }).request({\n method: req.method,\n path: req.path,\n query: req.query,\n jsonBody: req.body,\n headers: req.headers,\n signal: req.signal,\n });\n };\n let response = await send(false);\n // A rejected token is asked for again once, in case it expired.\n if (!response.ok && response.statusCode === 401) response = await send(true);\n if (!response.ok) throw computersApiError(response.error, response.statusCode ?? null);\n const parsed = response.data;\n const result = req.schema.safeParse(parsed);\n if (!result.success)\n throw computersApiError(`unexpected Computers API ${req.path} response`, null);\n return result.data;\n };\n\n const computerPath = (idOrName: string): string => `/computers/${encodeURIComponent(idOrName)}`;\n const toInfo = (row: JsonValue): ComputerInfoIface => {\n const info = normalizeComputerInfo(row);\n if (info == null) throw computersApiError('unexpected computer shape', null);\n return info;\n };\n const toImage = (row: JsonValue): ComputerImageIface => {\n const image = normalizeComputerImage(row);\n if (image == null) throw computersApiError('unexpected image shape', null);\n return image;\n };\n const toBase = (row: JsonValue): ComputerBaseIface => {\n const base = normalizeComputerBase(row);\n if (base == null) throw computersApiError('unexpected base shape', null);\n return base;\n };\n const anyBody = jsonValueSchema;\n\n return {\n inspectProcesses: async (computerId, input) => {\n const result = await inspectComputerProcesses({\n computerPath: computerPath(computerId),\n request: input,\n transport: {\n request: async (args) =>\n ok(\n await request({\n method: args.method,\n path: args.path,\n query: args.query,\n body: args.jsonBody,\n schema: jsonValueSchema,\n }),\n ),\n },\n });\n if (!result.ok) throw computersApiError(result.error, result.statusCode ?? null);\n return input.operation === ProcessInspectionOperation.Available && 'available' in result.data\n ? { ...result.data, canStop: true }\n : result.data;\n },\n createComputer: async (body, idempotencyKey) => {\n // The token determines the project.\n const response = await request({\n method: 'POST',\n path: '/computers',\n body,\n headers: { 'idempotency-key': idempotencyKey },\n schema: computerResponseSchema,\n });\n return toInfo(response.computer);\n },\n getNetworkPolicy: async (idOrName) => {\n const response = await request({\n method: 'GET',\n path: computerPath(idOrName),\n schema: computerResponseSchema,\n });\n const parsed = z\n .object({\n network: z.object({\n egress: z.nativeEnum(ComputerEgressPolicy),\n allow: z.array(z.string()).default([]),\n }),\n })\n .safeParse(response.computer);\n if (!parsed.success)\n throw computersApiError(\n 'The public Computers API did not return a supported network policy',\n null,\n );\n return parsed.data.network;\n },\n getComputer: async (idOrName) => {\n try {\n const response = await request({\n method: 'GET',\n path: computerPath(idOrName),\n schema: computerResponseSchema,\n });\n return toInfo(response.computer);\n } catch (error) {\n if (isComputersApiStatus(error, 404)) return null;\n throw error;\n }\n },\n action: async (idOrName, action) => {\n await request({\n method: 'POST',\n path: `${computerPath(idOrName)}/actions/${action}`,\n body: {},\n schema: anyBody,\n });\n },\n openBrowserAccess: (computerId, options) =>\n request({\n method: 'POST',\n path: `${computerPath(computerId)}/browser-access`,\n body: options,\n schema: computerBrowserAccessSchema,\n }),\n closeBrowserAccess: async (computerId, tokenId) => {\n await request({\n method: 'DELETE',\n path: `${computerPath(computerId)}/browser-access/${encodeURIComponent(tokenId)}`,\n schema: anyBody,\n });\n },\n readSnapshot: (computerId, body) =>\n request({\n method: 'POST',\n path: `${computerPath(computerId)}/file-snapshots/read`,\n body,\n schema: computerSnapshotResponseSchema,\n }),\n screenStatus: (computerId, signal) =>\n request({\n method: 'GET',\n path: `${computerPath(computerId)}/screen`,\n signal,\n schema: z.object({ available: z.boolean() }),\n }),\n openScreen: (computerId, options) =>\n request({\n method: 'POST',\n path: `${computerPath(computerId)}/screen`,\n body: options ?? {},\n schema: z.object({ url: z.string().url(), token: z.string(), expiresAt: z.string() }),\n }),\n computerUseStatus: async (computerId, signal) =>\n request({\n method: 'GET',\n path: `${computerPath(computerId)}/computer-use`,\n signal,\n schema: z.object({ available: z.boolean(), installed: z.boolean().default(false) }),\n }),\n openComputerUse: (computerId, options) =>\n request({\n method: 'POST',\n path: `${computerPath(computerId)}/computer-use`,\n body: { cwd: options.cwd, readyTimeoutMs: options.readyTimeoutMs },\n signal: options.signal,\n schema: execResponseSchema,\n }),\n disableAutoResume: async (computerId) => {\n await request({\n method: 'PATCH',\n path: computerPath(computerId),\n body: { autoResume: false },\n schema: computerResponseSchema,\n });\n },\n setNetworkPolicy: async (computerId, policy, lifecycle) => {\n await request({\n method: 'PATCH',\n path: computerPath(computerId),\n body: { network: policy, ...lifecycle },\n schema: computerResponseSchema,\n });\n },\n exec: (computerId, body) =>\n request({\n method: 'POST',\n path: `${computerPath(computerId)}/exec`,\n body,\n schema: execResponseSchema,\n }),\n run: (computerId, body) =>\n request({\n method: 'POST',\n path: `${computerPath(computerId)}/run`,\n body,\n schema: runResponseSchema,\n }),\n output: (o) =>\n request({\n method: 'GET',\n path: `${computerPath(o.computerId)}/processes/${encodeURIComponent(o.processId)}/output`,\n query: {\n bootId: o.bootId,\n stdoutOffset: String(o.stdoutOffset),\n stderrOffset: String(o.stderrOffset),\n waitMs: String(o.waitMs),\n },\n signal: o.signal,\n schema: processOutputSchema,\n }),\n input: async (o) => {\n await request({\n method: 'POST',\n path: `${computerPath(o.computerId)}/processes/${encodeURIComponent(o.processId)}/input`,\n body: o.body,\n signal: o.signal,\n schema: anyBody,\n });\n },\n terminate: async (o) => {\n await request({\n method: 'POST',\n path: `${computerPath(o.computerId)}/processes/${encodeURIComponent(o.processId)}/terminate`,\n body: { bootId: o.bootId },\n schema: anyBody,\n });\n },\n readFile: async (o) => {\n const read = await request({\n method: 'GET',\n path: `${computerPath(o.computerId)}/files`,\n query: {\n path: o.path,\n offset: String(o.offset),\n length: String(o.length),\n autoResume: 'false',\n },\n signal: o.signal,\n schema: fileReadSchema,\n });\n // The API echoes the offset; a server that ignored the range would hand back the start again.\n if (o.offset > 0 && read.offset !== o.offset) {\n throw computersApiError(\n 'the Computers API ignored a ranged file read; partial contents refused',\n null,\n );\n }\n return { dataB64: read.dataB64, eof: read.eof };\n },\n writeFile: async (o) => {\n await request({\n method: 'PUT',\n path: `${computerPath(o.computerId)}/files`,\n body: { path: o.path, dataB64: o.dataB64, append: o.append },\n signal: o.signal,\n schema: anyBody,\n });\n },\n createPreviewToken: async (o) =>\n (\n await request({\n method: 'POST',\n path: '/tokens',\n body: {\n name: o.name,\n computerId: o.computerId,\n scopes: ['http'],\n expiresAt: o.expiresAt.toISOString(),\n },\n schema: tokenSchema,\n })\n ).token,\n listImages: async (o) =>\n (\n await request({\n method: 'GET',\n path: '/images',\n query: { lineage: o.lineage, state: o.state },\n schema: imagesResponseSchema,\n })\n ).images.map(toImage),\n registerImage: async (o) =>\n toImage(\n (\n await request({\n method: 'POST',\n path: '/images',\n body: o.registryCredentialId == null ? { reference: o.reference } : o,\n schema: imageResponseSchema,\n })\n ).image,\n ),\n getImage: async (imageVersionId) =>\n toImage(\n (\n await request({\n method: 'GET',\n path: `/images/${encodeURIComponent(imageVersionId)}`,\n schema: imageResponseSchema,\n })\n ).image,\n ),\n captureComputer: async (idOrName, options) =>\n toBase(\n (\n await request({\n method: 'POST',\n path: `${computerPath(idOrName)}/capture`,\n body: options ?? {},\n schema: baseResponseSchema,\n })\n ).base,\n ),\n setBaseRetention: async (baseId, retained) =>\n toBase(\n (\n await request({\n method: 'PATCH',\n path: `/bases/${encodeURIComponent(baseId)}`,\n body: { retained },\n schema: baseResponseSchema,\n })\n ).base,\n ),\n getBase: async (baseId) => {\n try {\n const response = await request({\n method: 'GET',\n path: `/bases/${encodeURIComponent(baseId)}`,\n schema: baseResponseSchema,\n });\n return toBase(response.base);\n } catch (error) {\n if (isComputersApiStatus(error, 404)) return null;\n throw error;\n }\n },\n };\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n ProcessInspectionOperation,\n type ProcessInspectionRequestIface,\n type ProcessInspectionResultIface,\n} from '@finalai/agent-protocol/process-inspection';\nimport { jsonValueSchema, type JsonValue } from '@finalai/agent-provider';\nimport type { ComputersApiCredentialsIface } from \"./access.mjs\";\nimport {\n computerBrowserAccessSchema,\n ComputerImageState,\n computerSnapshotResponseSchema,\n createTransport,\n normalizeComputerBase,\n normalizeComputerImage,\n normalizeComputerInfo,\n ok,\n type ComputerBaseIface,\n type ComputerBrowserAccessIface,\n type ComputerBrowserAccessOptionsIface,\n type ComputerCommandMode,\n ComputerEgressPolicy,\n type ComputerIdlePolicy,\n type ComputerImageIface,\n type ComputerInfoIface,\n type ComputerScreenOpenOptionsIface,\n type ComputerSnapshotRequestIface,\n type ComputerSnapshotResponseIface,\n} from '@finalai/computers';\nimport * as z from 'zod';\nimport { inspectComputerProcesses } from \"./computer-processes.mjs\";\n// The public Computers API (`/v1`), authenticated with the provider's\n// configured access (./access.ts). This speaks the REST surface directly, reusing\n// @finalai/computers's row normalization, because the provider needs an injected\n// fetch and per-call abort signals that the SDK's client does not take.\n\nexport interface ComputersApiConfigIface {\n fetch?: typeof fetch;\n requestTimeoutMs?: number;\n}\n\nexport enum ComputersApiErrorCode {\n CredentialMissing = 'credential_missing',\n RequestFailed = 'request_failed',\n}\n\nexport interface ComputersApiErrorIface extends Error {\n code: ComputersApiErrorCode;\n statusCode: number | null;\n}\n\nexport const computersApiError = (\n message: string,\n statusCode: number | null,\n code: ComputersApiErrorCode = ComputersApiErrorCode.RequestFailed,\n): ComputersApiErrorIface =>\n Object.assign(new Error(message), { name: 'ComputersApiError', code, statusCode });\n\nexport const isComputersApiError = (cause: unknown): cause is ComputersApiErrorIface =>\n cause instanceof Error && 'statusCode' in cause && 'code' in cause;\n\nexport const isComputersApiStatus = (cause: unknown, ...statuses: number[]): boolean =>\n isComputersApiError(cause) && cause.statusCode != null && statuses.includes(cause.statusCode);\n\n// Exactly one of imageVersionId (a registered image) and baseId (a captured computer).\nexport interface CreateComputerBodyIface {\n name: string;\n imageVersionId?: string;\n baseId?: string;\n regionSlug?: string;\n vcpu?: number;\n memoryMb?: number;\n diskGb?: number;\n // Null: no user volume, so everything the computer writes is on the disk a capture takes.\n userVolumeGb?: number | null;\n env: Record<string, string>;\n commandMode?: ComputerCommandMode;\n customCommand?: string;\n ephemeral?: boolean;\n idleTimeoutSeconds?: number;\n idlePolicy?: ComputerIdlePolicy;\n network?: { egress: ComputerEgressPolicy; allow?: string[] };\n autoResume?: boolean;\n tags?: string[];\n}\n\nexport interface ExecBodyIface {\n autoResume?: boolean;\n command: string;\n env?: Record<string, string>;\n cwd?: string;\n user?: string;\n timeoutMs?: number;\n readyTimeoutMs?: number;\n}\n\n// `stop` shelves a computer that is not ephemeral: its disks go to storage and\n// its host is released; `start` brings it back with its files.\nexport type ComputerAction = 'start' | 'stop' | 'pause' | 'resume' | 'delete';\n\nconst outputStreamSchema = z.object({\n dataB64: z.string(),\n offset: z.number(),\n nextOffset: z.number(),\n eof: z.boolean(),\n});\nconst processOutputSchema = z.object({\n stdout: outputStreamSchema,\n stderr: outputStreamSchema,\n state: z.union([z.literal('running'), z.literal('exited')]),\n result: z.object({ exitCode: z.number().nullable(), signal: z.string().nullable() }).nullable(),\n});\nexport type ComputerProcessOutputIface = z.infer<typeof processOutputSchema>;\nconst runResponseSchema = processOutputSchema.extend({\n id: z.string(),\n bootId: z.string(),\n timedOut: z.boolean(),\n});\nexport type ComputerRunResultIface = z.infer<typeof runResponseSchema>;\nconst execResponseSchema = z.object({ id: z.string(), bootId: z.string() });\nconst fileReadSchema = z.object({\n dataB64: z.string(),\n eof: z.boolean(),\n offset: z.number().optional(),\n});\nconst tokenSchema = z.object({ id: z.string(), token: z.string() });\nconst computerResponseSchema = z.object({ computer: jsonValueSchema });\nconst imageResponseSchema = z.object({ image: jsonValueSchema });\nconst baseResponseSchema = z.object({ base: jsonValueSchema });\nconst imagesResponseSchema = z.object({ images: z.array(jsonValueSchema) });\n\nexport interface ComputersApiClientIface {\n disableAutoResume(computerId: string): Promise<void>;\n inspectProcesses(\n computerId: string,\n input: ProcessInspectionRequestIface,\n ): Promise<ProcessInspectionResultIface>;\n openBrowserAccess(\n computerId: string,\n options: ComputerBrowserAccessOptionsIface,\n ): Promise<ComputerBrowserAccessIface>;\n closeBrowserAccess(computerId: string, tokenId: string): Promise<void>;\n readSnapshot(\n computerId: string,\n request: ComputerSnapshotRequestIface,\n ): Promise<ComputerSnapshotResponseIface>;\n screenStatus(computerId: string, signal?: AbortSignal): Promise<{ available: boolean }>;\n openScreen(\n computerId: string,\n options?: ComputerScreenOpenOptionsIface,\n ): Promise<{ url: string; token: string; expiresAt: string }>;\n computerUseStatus(\n computerId: string,\n signal?: AbortSignal,\n ): Promise<{ available: boolean; installed: boolean }>;\n openComputerUse(\n computerId: string,\n options: { cwd: string; readyTimeoutMs?: number; signal?: AbortSignal },\n ): Promise<{ id: string; bootId: string }>;\n setNetworkPolicy(\n computerId: string,\n policy: { egress: ComputerEgressPolicy; allow?: string[] },\n lifecycle?: { autoResume: false },\n ): Promise<void>;\n createComputer(body: CreateComputerBodyIface, idempotencyKey: string): Promise<ComputerInfoIface>;\n // Null when the computer does not exist (or was deleted).\n getComputer(idOrName: string): Promise<ComputerInfoIface | null>;\n getNetworkPolicy(\n idOrName: string,\n ): Promise<{ egress: ComputerEgressPolicy; allow: string[] } | null>;\n action(idOrName: string, action: ComputerAction): Promise<void>;\n exec(computerId: string, body: ExecBodyIface): Promise<{ id: string; bootId: string }>;\n run(\n computerId: string,\n body: ExecBodyIface & { waitMs?: number },\n ): Promise<ComputerRunResultIface>;\n output(args: {\n computerId: string;\n processId: string;\n bootId: string;\n stdoutOffset: number;\n stderrOffset: number;\n waitMs: number;\n signal?: AbortSignal;\n }): Promise<ComputerProcessOutputIface>;\n input(args: {\n computerId: string;\n processId: string;\n body: Record<string, JsonValue>;\n signal?: AbortSignal;\n }): Promise<void>;\n terminate(args: { computerId: string; processId: string; bootId: string }): Promise<void>;\n readFile(args: {\n computerId: string;\n path: string;\n offset: number;\n length: number;\n signal?: AbortSignal;\n }): Promise<{ dataB64: string; eof: boolean }>;\n writeFile(args: {\n computerId: string;\n path: string;\n dataB64: string;\n append: boolean;\n signal?: AbortSignal;\n }): Promise<void>;\n // An `http`-scoped token for one computer's ports (a preview token).\n createPreviewToken(args: { computerId: string; name: string; expiresAt: Date }): Promise<string>;\n // The organization's and the platform's image versions, newest first.\n listImages(args: { lineage: string; state: ComputerImageState }): Promise<ComputerImageIface[]>;\n // Registering a digest the organization already has returns that version.\n registerImage(args: {\n reference: string;\n registryCredentialId?: string;\n }): Promise<ComputerImageIface>;\n getImage(imageVersionId: string): Promise<ComputerImageIface>;\n // Captures a running computer as a base; the computer stops for it.\n captureComputer(idOrName: string, options?: { retained?: boolean }): Promise<ComputerBaseIface>;\n setBaseRetention(baseId: string, retained: boolean): Promise<ComputerBaseIface>;\n // Null when the base does not exist.\n getBase(baseId: string): Promise<ComputerBaseIface | null>;\n}\n\nexport const createComputersApiClient = (args: {\n config: ComputersApiConfigIface;\n // Asked for access before each request.\n credentials: ComputersApiCredentialsIface | undefined;\n}): ComputersApiClientIface => {\n const request = async <T>(req: {\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n query?: Record<string, string>;\n body?: object;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n schema: z.ZodType<T>;\n }): Promise<T> => {\n const send = async (refresh: boolean) => {\n const access = await args.credentials?.computersAccess({ refresh });\n if (access == null) {\n throw computersApiError(\n 'the computer provider was granted no Computers API access',\n null,\n ComputersApiErrorCode.CredentialMissing,\n );\n }\n return createTransport({\n baseUrl: access.baseUrl,\n auth: { apiKey: access.token },\n fetch: args.config.fetch,\n requestTimeoutMs: args.config.requestTimeoutMs,\n }).request({\n method: req.method,\n path: req.path,\n query: req.query,\n jsonBody: req.body,\n headers: req.headers,\n signal: req.signal,\n });\n };\n let response = await send(false);\n // A rejected token is asked for again once, in case it expired.\n if (!response.ok && response.statusCode === 401) response = await send(true);\n if (!response.ok) throw computersApiError(response.error, response.statusCode ?? null);\n const parsed = response.data;\n const result = req.schema.safeParse(parsed);\n if (!result.success)\n throw computersApiError(`unexpected Computers API ${req.path} response`, null);\n return result.data;\n };\n\n const computerPath = (idOrName: string): string => `/computers/${encodeURIComponent(idOrName)}`;\n const toInfo = (row: JsonValue): ComputerInfoIface => {\n const info = normalizeComputerInfo(row);\n if (info == null) throw computersApiError('unexpected computer shape', null);\n return info;\n };\n const toImage = (row: JsonValue): ComputerImageIface => {\n const image = normalizeComputerImage(row);\n if (image == null) throw computersApiError('unexpected image shape', null);\n return image;\n };\n const toBase = (row: JsonValue): ComputerBaseIface => {\n const base = normalizeComputerBase(row);\n if (base == null) throw computersApiError('unexpected base shape', null);\n return base;\n };\n const anyBody = jsonValueSchema;\n\n return {\n inspectProcesses: async (computerId, input) => {\n const result = await inspectComputerProcesses({\n computerPath: computerPath(computerId),\n request: input,\n transport: {\n request: async (args) =>\n ok(\n await request({\n method: args.method,\n path: args.path,\n query: args.query,\n body: args.jsonBody,\n schema: jsonValueSchema,\n }),\n ),\n },\n });\n if (!result.ok) throw computersApiError(result.error, result.statusCode ?? null);\n return input.operation === ProcessInspectionOperation.Available && 'available' in result.data\n ? { ...result.data, canStop: true }\n : result.data;\n },\n createComputer: async (body, idempotencyKey) => {\n // The token determines the project.\n const response = await request({\n method: 'POST',\n path: '/computers',\n body,\n headers: { 'idempotency-key': idempotencyKey },\n schema: computerResponseSchema,\n });\n return toInfo(response.computer);\n },\n getNetworkPolicy: async (idOrName) => {\n const response = await request({\n method: 'GET',\n path: computerPath(idOrName),\n schema: computerResponseSchema,\n });\n const parsed = z\n .object({\n network: z.object({\n egress: z.nativeEnum(ComputerEgressPolicy),\n allow: z.array(z.string()).default([]),\n }),\n })\n .safeParse(response.computer);\n if (!parsed.success)\n throw computersApiError(\n 'The public Computers API did not return a supported network policy',\n null,\n );\n return parsed.data.network;\n },\n getComputer: async (idOrName) => {\n try {\n const response = await request({\n method: 'GET',\n path: computerPath(idOrName),\n schema: computerResponseSchema,\n });\n return toInfo(response.computer);\n } catch (error) {\n if (isComputersApiStatus(error, 404)) return null;\n throw error;\n }\n },\n action: async (idOrName, action) => {\n await request({\n method: 'POST',\n path: `${computerPath(idOrName)}/actions/${action}`,\n body: {},\n schema: anyBody,\n });\n },\n openBrowserAccess: (computerId, options) =>\n request({\n method: 'POST',\n path: `${computerPath(computerId)}/browser-access`,\n body: options,\n schema: computerBrowserAccessSchema,\n }),\n closeBrowserAccess: async (computerId, tokenId) => {\n await request({\n method: 'DELETE',\n path: `${computerPath(computerId)}/browser-access/${encodeURIComponent(tokenId)}`,\n schema: anyBody,\n });\n },\n readSnapshot: (computerId, body) =>\n request({\n method: 'POST',\n path: `${computerPath(computerId)}/file-snapshots/read`,\n body,\n schema: computerSnapshotResponseSchema,\n }),\n screenStatus: (computerId, signal) =>\n request({\n method: 'GET',\n path: `${computerPath(computerId)}/screen`,\n signal,\n schema: z.object({ available: z.boolean() }),\n }),\n openScreen: (computerId, options) =>\n request({\n method: 'POST',\n path: `${computerPath(computerId)}/screen`,\n body: options ?? {},\n schema: z.object({ url: z.string().url(), token: z.string(), expiresAt: z.string() }),\n }),\n computerUseStatus: async (computerId, signal) =>\n request({\n method: 'GET',\n path: `${computerPath(computerId)}/computer-use`,\n signal,\n schema: z.object({ available: z.boolean(), installed: z.boolean().default(false) }),\n }),\n openComputerUse: (computerId, options) =>\n request({\n method: 'POST',\n path: `${computerPath(computerId)}/computer-use`,\n body: { cwd: options.cwd, readyTimeoutMs: options.readyTimeoutMs },\n signal: options.signal,\n schema: execResponseSchema,\n }),\n disableAutoResume: async (computerId) => {\n await request({\n method: 'PATCH',\n path: computerPath(computerId),\n body: { autoResume: false },\n schema: computerResponseSchema,\n });\n },\n setNetworkPolicy: async (computerId, policy, lifecycle) => {\n await request({\n method: 'PATCH',\n path: computerPath(computerId),\n body: { network: policy, ...lifecycle },\n schema: computerResponseSchema,\n });\n },\n exec: (computerId, body) =>\n request({\n method: 'POST',\n path: `${computerPath(computerId)}/exec`,\n body,\n schema: execResponseSchema,\n }),\n run: (computerId, body) =>\n request({\n method: 'POST',\n path: `${computerPath(computerId)}/run`,\n body,\n schema: runResponseSchema,\n }),\n output: (o) =>\n request({\n method: 'GET',\n path: `${computerPath(o.computerId)}/processes/${encodeURIComponent(o.processId)}/output`,\n query: {\n bootId: o.bootId,\n stdoutOffset: String(o.stdoutOffset),\n stderrOffset: String(o.stderrOffset),\n waitMs: String(o.waitMs),\n },\n signal: o.signal,\n schema: processOutputSchema,\n }),\n input: async (o) => {\n await request({\n method: 'POST',\n path: `${computerPath(o.computerId)}/processes/${encodeURIComponent(o.processId)}/input`,\n body: o.body,\n signal: o.signal,\n schema: anyBody,\n });\n },\n terminate: async (o) => {\n await request({\n method: 'POST',\n path: `${computerPath(o.computerId)}/processes/${encodeURIComponent(o.processId)}/terminate`,\n body: { bootId: o.bootId },\n schema: anyBody,\n });\n },\n readFile: async (o) => {\n const read = await request({\n method: 'GET',\n path: `${computerPath(o.computerId)}/files`,\n query: {\n path: o.path,\n offset: String(o.offset),\n length: String(o.length),\n autoResume: 'false',\n },\n signal: o.signal,\n schema: fileReadSchema,\n });\n // The API echoes the offset; a server that ignored the range would hand back the start again.\n if (o.offset > 0 && read.offset !== o.offset) {\n throw computersApiError(\n 'the Computers API ignored a ranged file read; partial contents refused',\n null,\n );\n }\n return { dataB64: read.dataB64, eof: read.eof };\n },\n writeFile: async (o) => {\n await request({\n method: 'PUT',\n path: `${computerPath(o.computerId)}/files`,\n body: { path: o.path, dataB64: o.dataB64, append: o.append },\n signal: o.signal,\n schema: anyBody,\n });\n },\n createPreviewToken: async (o) =>\n (\n await request({\n method: 'POST',\n path: '/tokens',\n body: {\n name: o.name,\n computerId: o.computerId,\n scopes: ['http'],\n expiresAt: o.expiresAt.toISOString(),\n },\n schema: tokenSchema,\n })\n ).token,\n listImages: async (o) =>\n (\n await request({\n method: 'GET',\n path: '/images',\n query: { lineage: o.lineage, state: o.state },\n schema: imagesResponseSchema,\n })\n ).images.map(toImage),\n registerImage: async (o) =>\n toImage(\n (\n await request({\n method: 'POST',\n path: '/images',\n body: o.registryCredentialId == null ? { reference: o.reference } : o,\n schema: imageResponseSchema,\n })\n ).image,\n ),\n getImage: async (imageVersionId) =>\n toImage(\n (\n await request({\n method: 'GET',\n path: `/images/${encodeURIComponent(imageVersionId)}`,\n schema: imageResponseSchema,\n })\n ).image,\n ),\n captureComputer: async (idOrName, options) =>\n toBase(\n (\n await request({\n method: 'POST',\n path: `${computerPath(idOrName)}/capture`,\n body: options ?? {},\n schema: baseResponseSchema,\n })\n ).base,\n ),\n setBaseRetention: async (baseId, retained) =>\n toBase(\n (\n await request({\n method: 'PATCH',\n path: `/bases/${encodeURIComponent(baseId)}`,\n body: { retained },\n schema: baseResponseSchema,\n })\n ).base,\n ),\n getBase: async (baseId) => {\n try {\n const response = await request({\n method: 'GET',\n path: `/bases/${encodeURIComponent(baseId)}`,\n schema: baseResponseSchema,\n });\n return toBase(response.base);\n } catch (error) {\n if (isComputersApiStatus(error, 404)) return null;\n throw error;\n }\n },\n };\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["ComputersApiErrorCode", "args"]
7
7
  }
@@ -1,12 +1,13 @@
1
1
  import { deviceEgressEnrollmentSchema, deviceEgressLeaseSchema, deviceEgressWorkspaceSchema, deviceWorkspaceNetworkStateSchema, type WorkspaceNetworkPolicyIface } from '@finalai/agent-protocol/device-egress';
2
2
  import { type ProcessInspectionRequestIface, type ProcessInspectionResultIface } from '@finalai/agent-protocol/process-inspection';
3
- import { type SandboxActingUserIface, type SandboxCredentialsIface } from '@finalai/agent-provider/sandbox';
3
+ import { type SandboxActingUserIface } from '@finalai/agent-provider/sandbox';
4
+ import type { DeviceApiCredentialsIface } from "./access.mjs";
4
5
  import * as z from 'zod';
5
6
  import type { SandboxTransportIface } from "./transport.mjs";
6
7
  export { DEVICE_API_ACTING_USER_HEADER } from "./environment.mjs";
7
8
  export interface DeviceApiCallerIface {
8
9
  organizationId: string;
9
- credentials?: SandboxCredentialsIface;
10
+ credentials?: DeviceApiCredentialsIface;
10
11
  actingUser: SandboxActingUserIface;
11
12
  }
12
13
  export interface DeviceApiConfigIface {
@@ -77,7 +78,7 @@ export interface DeviceApiClientIface {
77
78
  egress: {
78
79
  networkState(args: {
79
80
  organizationId: string;
80
- credentials?: SandboxCredentialsIface;
81
+ credentials?: DeviceApiCredentialsIface;
81
82
  workspaceId: string;
82
83
  }): Promise<z.infer<typeof deviceWorkspaceNetworkStateSchema>>;
83
84
  setNetworkPolicy(args: {
@@ -12,9 +12,7 @@ import {
12
12
  processInspectionResultSchema
13
13
  } from "@finalai/agent-protocol/process-inspection";
14
14
  import { jsonObjectSchema, jsonValueSchema } from "@finalai/agent-provider";
15
- import {
16
- SandboxEntryType
17
- } from "@finalai/agent-provider/sandbox";
15
+ import { SandboxEntryType } from "@finalai/agent-provider/sandbox";
18
16
  import * as z from "zod";
19
17
  import { decodeBase64, encodeBase64 } from "./bytes.mjs";
20
18
  import { DEVICE_API_ACTING_USER_HEADER } from "./environment.mjs";
@@ -114,7 +112,7 @@ var DeviceApiClientErrorCode = /* @__PURE__ */ ((DeviceApiClientErrorCode2) => {
114
112
  const apiError = (status, code, message) => Object.assign(new Error(`Device API ${status} ${code}: ${message}`), { status, code });
115
113
  const credentialMissing = (actingUserId) => Object.assign(
116
114
  new Error(
117
- `Device API access is unavailable ${actingUserId == null ? "for workspace networking (no acting user)" : "for this acting user"}: the host's credentials.deviceAccess granted none`
115
+ `Device API access is unavailable ${actingUserId == null ? "for workspace networking (no acting user)" : "for this acting user"}: the provider's configured Device API access granted none`
118
116
  ),
119
117
  { status: null, code: "credential_missing" /* CredentialMissing */ }
120
118
  );
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/sandboxes/device-api.ts"],
4
- "sourcesContent": ["import {\n deviceEgressCreateRequestSchema,\n deviceEgressWorkspaceIdSchema,\n deviceEgressEnrollmentSchema,\n deviceEgressLeaseSchema,\n deviceEgressWorkspaceSchema,\n workspaceNetworkPolicySchema,\n deviceWorkspaceNetworkStateSchema,\n type WorkspaceNetworkPolicyIface,\n} from '@finalai/agent-protocol/device-egress';\nimport {\n ProcessInspectionOperation,\n processInspectionResultSchema,\n type ProcessInspectionRequestIface,\n type ProcessInspectionResultIface,\n} from '@finalai/agent-protocol/process-inspection';\nimport { jsonObjectSchema, jsonValueSchema, type JsonValue } from '@finalai/agent-provider';\nimport {\n SandboxEntryType,\n type FinalPlatformAccessIface,\n type SandboxActingUserIface,\n type SandboxCredentialsIface,\n} from '@finalai/agent-provider/sandbox';\nimport * as z from 'zod';\nimport { decodeBase64, encodeBase64 } from \"./bytes.mjs\";\nimport { DEVICE_API_ACTING_USER_HEADER } from \"./environment.mjs\";\nimport type {\n SandboxTransportIface,\n TransportDirEntryIface,\n TransportOutputIface,\n TransportStatIface,\n} from \"./transport.mjs\";\n\n// A client of the Device API, authenticated with the context's\n// `credentials.deviceAccess`. Device operations also name the acting user; the API\n// enforces ownership independently of the token.\n\n// The Device API's header naming the user a request acts for (a Final user id).\nexport { DEVICE_API_ACTING_USER_HEADER } from \"./environment.mjs\";\n\n// The organization, credentials and user a call acts for; the user is read on each\n// call. Workspace networking also calls with no user (admission, policy\n// persistence and cleanup), which needs service access from `deviceAccess`.\nexport interface DeviceApiCallerIface {\n organizationId: string;\n credentials?: SandboxCredentialsIface;\n actingUser: SandboxActingUserIface;\n}\n\n// Transport options; the API origin and token come from the caller's credentials.\nexport interface DeviceApiConfigIface {\n fetch?: DeviceApiFetchIface;\n}\n\nexport interface DeviceApiFetchIface {\n (input: string, init: RequestInit): Promise<Response>;\n}\n\nexport enum DeviceApiLeaseAccess {\n Read = 'read',\n Write = 'write',\n}\n\nexport enum DeviceApiCapability {\n Files = 'files',\n Process = 'process',\n ComputerUse = 'computer-use',\n LocalMcp = 'local-mcp',\n}\n\nexport const DEVICE_API_COMPUTER_USE_SERVER = 'computer-use';\n\n// Unknown values from a newer API read as absent rather than failing the call.\nconst tolerantEnum = <T extends Record<string, string>>(values: T) =>\n z.string().transform((value): T[keyof T] | null => {\n const parsed = z.nativeEnum(values).safeParse(value);\n return parsed.success ? parsed.data : null;\n });\n\nconst deviceSchema = z.object({\n id: z.string(),\n organizationId: z.string(),\n displayName: z.string(),\n os: z.string(),\n online: z.boolean(),\n writable: z.boolean(),\n allowProcesses: z.boolean(),\n computerUseReady: z.boolean(),\n screenReady: z.boolean(),\n});\nexport type DeviceApiDeviceIface = z.infer<typeof deviceSchema>;\n\nconst leaseSchema = z.object({\n lease: z.string(),\n deviceId: z.string(),\n generation: z.number(),\n workspaceRoot: z.string(),\n platform: z.string(),\n access: z.nativeEnum(DeviceApiLeaseAccess),\n capabilities: z.array(tolerantEnum(DeviceApiCapability)),\n expiresAt: z.string(),\n});\nexport interface DeviceApiLeaseIface {\n lease: string;\n deviceId: string;\n generation: number;\n workspaceRoot: string;\n platform: string;\n access: DeviceApiLeaseAccess;\n capabilities: DeviceApiCapability[];\n expiresAtMs: number;\n}\n\ninterface ProcessInputBodyIface {\n bootId: string;\n dataBase64?: string;\n eof?: boolean;\n}\n\nconst errorBodySchema = z.object({ error: z.object({ code: z.string(), message: z.string() }) });\nconst statBodySchema = z.object({\n stat: z\n .object({\n type: tolerantEnum(SandboxEntryType),\n size: z.number(),\n modifiedAtMs: z.number().nullable(),\n mode: z.number().nullable(),\n })\n .nullable(),\n});\nconst dirBodySchema = z.object({\n entries: z.array(\n z.object({\n name: z.string(),\n type: tolerantEnum(SandboxEntryType),\n size: z.number().nullable(),\n }),\n ),\n});\nconst processSchema = z.object({ id: z.string(), bootId: z.string() });\nconst outputStreamSchema = z.object({\n dataBase64: z.string(),\n nextOffset: z.number(),\n eof: z.boolean(),\n});\nconst outputSchema = z.object({\n stdout: outputStreamSchema,\n stderr: outputStreamSchema,\n exited: z.boolean(),\n exitCode: z.number().nullable(),\n exitSignal: z.string().nullable(),\n});\nconst devicesSchema = z.object({ devices: z.array(deviceSchema) });\nconst serversSchema = z.object({ servers: z.array(z.string()) });\n// A Device server's tool as the API recorded it; checked against the tool\n// descriptor contract where the provider hands it on.\nconst catalogToolSchema = jsonObjectSchema;\nconst mcpCatalogSchema = z.object({\n computerUse: z.object({ tools: z.array(catalogToolSchema) }).nullable(),\n localServers: z\n .object({\n servers: z.array(\n z.object({ name: z.string(), tools: z.array(catalogToolSchema).nullable() }),\n ),\n })\n .nullable(),\n});\nexport type DeviceApiMcpCatalogIface = z.infer<typeof mcpCatalogSchema>;\nconst pipeReadSchema = z.object({ dataBase64: z.string().optional() });\nconst screenSchema = z.object({ url: z.string(), token: z.string(), expiresAt: z.string() });\nconst emptySchema = z.unknown();\n\n// One ranged read or write; the API splits it into the Device's own chunks.\nexport const DEVICE_API_FILE_CHUNK_BYTES = 4 * 1024 * 1024;\n// The API long-polls the Device for output up to this long.\nexport const DEVICE_API_OUTPUT_WAIT_MS = 15_000;\n// How the Device reports a lease process it no longer has (relayed as a 502):\n// unknown in this lease, from an earlier runtime, or retired after its output\n// was read to the end.\nconst DEVICE_PROCESS_GONE_MESSAGE =\n /unknown process|belongs to another device runtime|consumed output has expired/i;\n\nexport enum DeviceApiClientErrorCode {\n // The host granted no access for this user or trusted service call.\n CredentialMissing = 'credential_missing',\n // The session acts for no user, and a Device is only used for its owner.\n NoActingUser = 'no_acting_user',\n EgressEnrollmentLost = 'egress_enrollment_lost',\n}\n\nexport interface DeviceApiErrorIface extends Error {\n status: number | null;\n code: string;\n}\n\nconst apiError = (status: number, code: string, message: string): DeviceApiErrorIface =>\n Object.assign(new Error(`Device API ${status} ${code}: ${message}`), { status, code });\n\nconst credentialMissing = (actingUserId: string | null): DeviceApiErrorIface =>\n Object.assign(\n new Error(\n `Device API access is unavailable ${actingUserId == null ? 'for workspace networking (no acting user)' : 'for this acting user'}: the host's credentials.deviceAccess granted none`,\n ),\n { status: null, code: DeviceApiClientErrorCode.CredentialMissing },\n );\n\nconst noActingUser = (): DeviceApiErrorIface =>\n Object.assign(\n new Error(\n 'this session acts for no user, and a Final Device is only used by sessions acting for its owner',\n ),\n { status: null, code: DeviceApiClientErrorCode.NoActingUser },\n );\n\nconst statusSchema = z.object({ status: z.number() });\nexport const deviceApiCodeOf = (cause: unknown): string | null =>\n z.object({ code: z.string() }).safeParse(cause).data?.code ?? null;\n\nexport const deviceApiStatusOf = (cause: Error): number | null =>\n statusSchema.safeParse(cause).data?.status ?? null;\n\nconst parseJson = (text: string): JsonValue => {\n try {\n return jsonValueSchema.parse(JSON.parse(text));\n } catch {\n return null;\n }\n};\n\nconst leaseOf = (raw: z.infer<typeof leaseSchema>): DeviceApiLeaseIface => ({\n lease: raw.lease,\n deviceId: raw.deviceId,\n generation: raw.generation,\n workspaceRoot: raw.workspaceRoot,\n platform: raw.platform,\n access: raw.access,\n capabilities: raw.capabilities.filter((capability) => capability != null),\n expiresAtMs: Date.parse(raw.expiresAt),\n});\n\nexport interface DeviceApiClientIface {\n egress: {\n networkState(args: {\n organizationId: string;\n credentials?: SandboxCredentialsIface;\n workspaceId: string;\n }): Promise<z.infer<typeof deviceWorkspaceNetworkStateSchema>>;\n setNetworkPolicy(args: {\n caller: DeviceApiCallerIface;\n workspaceId: string;\n policy: WorkspaceNetworkPolicyIface;\n initializeIfMissing?: boolean;\n }): Promise<void>;\n workspace(args: {\n caller: DeviceApiCallerIface;\n workspaceId: string;\n }): Promise<z.infer<typeof deviceEgressWorkspaceSchema>>;\n create(args: {\n caller: DeviceApiCallerIface;\n workspaceId: string;\n deviceIds: string[];\n dnsResolvers?: string[];\n }): Promise<z.infer<typeof deviceEgressEnrollmentSchema>>;\n renew(args: {\n caller: DeviceApiCallerIface;\n leaseId: string;\n }): Promise<z.infer<typeof deviceEgressLeaseSchema>>;\n activate(args: {\n caller: DeviceApiCallerIface;\n leaseId: string;\n }): Promise<z.infer<typeof deviceEgressLeaseSchema>>;\n revoke(args: {\n caller: DeviceApiCallerIface;\n leaseId: string;\n workspaceId: string;\n }): Promise<void>;\n disable(args: { caller: DeviceApiCallerIface; workspaceId: string }): Promise<void>;\n suspend(args: { caller: DeviceApiCallerIface; workspaceId: string }): Promise<void>;\n };\n releaseWorkspaceLeases(args: {\n caller: DeviceApiCallerIface;\n deviceId: string;\n bindingId: string;\n }): Promise<void>;\n inspectProcesses(args: {\n caller: DeviceApiCallerIface;\n deviceId: string;\n bindingId: string;\n request: ProcessInspectionRequestIface;\n }): Promise<ProcessInspectionResultIface>;\n getDevice(args: {\n caller: DeviceApiCallerIface;\n deviceId: string;\n }): Promise<DeviceApiDeviceIface | null>;\n // The Devices of the user the call acts for.\n listDevices(args: { caller: DeviceApiCallerIface }): Promise<DeviceApiDeviceIface[]>;\n resolvePairing(args: {\n caller: DeviceApiCallerIface;\n code: string;\n }): Promise<DeviceApiDeviceIface | null>;\n lease(args: {\n caller: DeviceApiCallerIface;\n deviceId: string;\n sessionId: string;\n bindingId: string;\n access: DeviceApiLeaseAccess;\n ttlMs: number;\n afterGeneration?: number;\n }): Promise<DeviceApiLeaseIface>;\n recoverLease(args: {\n caller: DeviceApiCallerIface;\n deviceId: string;\n sessionId: string;\n bindingId: string;\n access: DeviceApiLeaseAccess;\n }): Promise<DeviceApiLeaseIface>;\n renew(args: {\n caller: DeviceApiCallerIface;\n lease: string;\n ttlMs: number;\n }): Promise<DeviceApiLeaseIface>;\n release(args: { caller: DeviceApiCallerIface; lease: string }): Promise<void>;\n // The sandbox transport over one lease; `lease()` is the current handle.\n transport(args: {\n caller: DeviceApiCallerIface;\n lease: () => Promise<string>;\n }): SandboxTransportIface;\n localMcpServers(args: { caller: DeviceApiCallerIface; lease: string }): Promise<string[]>;\n // What the Device's MCP servers last listed through the API, without a lease.\n mcpCatalog(args: {\n caller: DeviceApiCallerIface;\n deviceId: string;\n }): Promise<DeviceApiMcpCatalogIface>;\n pipe(args: {\n caller: DeviceApiCallerIface;\n lease: string;\n server: string;\n action: 'open' | 'write' | 'read' | 'close';\n clientId: string;\n dataBase64?: string;\n signal?: AbortSignal;\n }): Promise<string>;\n screen(args: {\n caller: DeviceApiCallerIface;\n deviceId: string;\n sessionId: string;\n viewOnly?: boolean;\n }): Promise<{ url: string; token: string; expiresAt: string }>;\n}\n\nexport const createDeviceApiClient = (config: {\n api: DeviceApiConfigIface | (() => DeviceApiConfigIface);\n fetch?: DeviceApiFetchIface;\n}): DeviceApiClientIface => {\n const readApi = () => (typeof config.api === 'function' ? config.api() : config.api);\n const failure = async (response: Response): Promise<DeviceApiErrorIface> => {\n // Read as text so proxy and load balancer error pages survive.\n const text = await response.text().catch(() => '');\n const body = errorBodySchema.safeParse(parseJson(text));\n return body.success\n ? apiError(response.status, body.data.error.code, body.data.error.message)\n : apiError(response.status, 'http', text.slice(0, 200) || response.statusText);\n };\n\n const accessFor = async (args: {\n caller: DeviceApiCallerIface;\n actingUserId: string | null;\n refresh: boolean;\n }): Promise<FinalPlatformAccessIface> => {\n const access = await args.caller.credentials?.deviceAccess({\n actingUserId: args.actingUserId,\n refresh: args.refresh,\n });\n if (access == null) throw credentialMissing(args.actingUserId);\n return access;\n };\n\n // One authenticated call for the user it acts for; rejected access is asked for\n // again once, in case it expired.\n const send = async (args: {\n caller: DeviceApiCallerIface;\n method: string;\n path: string;\n query?: Record<string, string>;\n body?: BodyInit;\n contentType?: string;\n signal?: AbortSignal;\n anonymous?: boolean;\n }): Promise<Response> => {\n const api = readApi();\n const actingUserId = await args.caller.actingUser.current();\n if (actingUserId == null && !args.anonymous) throw noActingUser();\n const attempt = async (refresh: boolean): Promise<Response> => {\n const access = await accessFor({ caller: args.caller, actingUserId, refresh });\n const url = new URL(`${access.baseUrl.replace(/\\/+$/, '')}${args.path}`);\n for (const [key, value] of Object.entries(args.query ?? {})) url.searchParams.set(key, value);\n const headers = new Headers({ authorization: `Bearer ${access.token}` });\n if (actingUserId != null) headers.set(DEVICE_API_ACTING_USER_HEADER, actingUserId);\n if (args.contentType != null) headers.set('content-type', args.contentType);\n return (config.fetch ?? api.fetch ?? fetch)(url.toString(), {\n method: args.method,\n headers,\n body: args.body,\n signal: args.signal,\n });\n };\n let response = await attempt(false);\n if (response.status === 401) {\n await response.text().catch(() => '');\n response = await attempt(true);\n }\n return response;\n };\n\n const json = async <T extends z.ZodType>(\n schema: T,\n args: Parameters<typeof send>[0] & { json?: unknown },\n ): Promise<z.infer<T>> => {\n const response = await send({\n ...args,\n body: args.json === undefined ? args.body : JSON.stringify(args.json),\n contentType: args.json === undefined ? args.contentType : 'application/json',\n });\n if (!response.ok) throw await failure(response);\n const text = await response.text();\n return schema.parse(text === '' ? null : parseJson(text));\n };\n\n // A 404 reads as absent.\n const orNull = async <T>(work: Promise<T>): Promise<T | null> => {\n try {\n return await work;\n } catch (cause) {\n if (cause instanceof Error && deviceApiStatusOf(cause) === 404) return null;\n throw cause;\n }\n };\n\n const leasePath = (lease: string, rest: string): string =>\n `/v1/leases/${encodeURIComponent(lease)}${rest}`;\n\n const transport: DeviceApiClientIface['transport'] = ({ caller, lease }) => {\n const call = async <T extends z.ZodType>(\n schema: T,\n args: Omit<Parameters<typeof json>[1], 'caller' | 'path'> & { path: string },\n ): Promise<z.infer<T>> =>\n json(schema, { ...args, caller, path: leasePath(await lease(), args.path) });\n const processPath = (id: string, rest: string): string =>\n `/processes/${encodeURIComponent(id)}${rest}`;\n return {\n kind: 'device-api',\n fileChunkBytes: DEVICE_API_FILE_CHUNK_BYTES,\n outputWaitMs: DEVICE_API_OUTPUT_WAIT_MS,\n stat: async ({ path, signal }): Promise<TransportStatIface | null> => {\n const { stat } = await call(statBodySchema, {\n method: 'GET',\n path: '/files/stat',\n query: { path },\n signal,\n });\n return stat == null ? null : { ...stat, type: stat.type ?? SandboxEntryType.Other };\n },\n readDir: async ({ path, signal }): Promise<TransportDirEntryIface[]> =>\n (\n await call(dirBodySchema, { method: 'GET', path: '/files/dir', query: { path }, signal })\n ).entries.map((entry) => ({ ...entry, type: entry.type ?? SandboxEntryType.Other })),\n readChunk: async ({ path, offset, length, signal }) => {\n const response = await send({\n caller,\n method: 'GET',\n path: leasePath(await lease(), '/files/content'),\n query: { path, offset: String(offset), length: String(length) },\n signal,\n });\n if (!response.ok) throw await failure(response);\n const bytes = new Uint8Array(await response.arrayBuffer());\n return { bytes, eof: bytes.byteLength < length };\n },\n writeChunk: async ({ path, offset, bytes, signal }) => {\n await call(emptySchema, {\n method: 'PUT',\n path: '/files/content',\n query: { path, offset: String(offset) },\n body: new Blob([bytes.slice()]),\n contentType: 'application/octet-stream',\n signal,\n });\n },\n createDirectory: async ({ path, signal }) => {\n await call(emptySchema, {\n method: 'POST',\n path: '/files/directories',\n json: { path },\n signal,\n });\n },\n remove: async ({ path, recursive, force, signal }) => {\n await call(emptySchema, {\n method: 'DELETE',\n path: '/files',\n query: { path, recursive: String(recursive), force: String(force) },\n signal,\n });\n },\n exec: async ({ id, command, cwd, env, timeoutMs, signal }) =>\n call(processSchema, {\n method: 'POST',\n path: '/processes',\n json: { id, command, cwd, env, timeoutMs },\n signal,\n }),\n output: async ({ process, stdoutOffset, stderrOffset, waitMs, signal }) => {\n const output = await call(outputSchema, {\n method: 'POST',\n path: processPath(process.id, '/output'),\n json: { bootId: process.bootId, stdoutOffset, stderrOffset, waitMs },\n signal,\n });\n const stream = (value: z.infer<typeof outputStreamSchema>) => ({\n data: decodeBase64(value.dataBase64),\n nextOffset: value.nextOffset,\n eof: value.eof,\n });\n const result: TransportOutputIface = {\n stdout: stream(output.stdout),\n stderr: stream(output.stderr),\n exited: output.exited,\n exitCode: output.exitCode,\n exitSignal: output.exitSignal,\n };\n return result;\n },\n input: async ({ process, data, eof, signal, terminate, abortSignal }) => {\n if (terminate === true || signal != null) {\n await call(emptySchema, {\n method: 'POST',\n path: processPath(process.id, '/kill'),\n json:\n terminate === true ? { bootId: process.bootId } : { bootId: process.bootId, signal },\n signal: abortSignal,\n });\n if (terminate === true) return;\n }\n if ((data != null && data.byteLength > 0) || eof === true) {\n const body: ProcessInputBodyIface = {\n bootId: process.bootId,\n };\n if (data != null && data.byteLength > 0) body.dataBase64 = encodeBase64(data);\n if (eof === true) body.eof = true;\n await call(emptySchema, {\n method: 'POST',\n path: processPath(process.id, '/input'),\n json: body,\n signal: abortSignal,\n });\n }\n },\n // Lease processes run on the Device and are found again by id and boot\n // while the lease generation lasts.\n processGone: (cause) => {\n if (!(cause instanceof Error)) return false;\n const status = deviceApiStatusOf(cause);\n return (\n status === 404 || (status === 502 && DEVICE_PROCESS_GONE_MESSAGE.test(cause.message))\n );\n },\n close: () => undefined,\n };\n };\n\n return {\n egress: {\n networkState: ({ organizationId, credentials, workspaceId }) =>\n json(deviceWorkspaceNetworkStateSchema, {\n caller: { organizationId, credentials, actingUser: { current: async () => null } },\n anonymous: true,\n method: 'GET',\n path: `/v1/egress/workspaces/${encodeURIComponent(deviceEgressWorkspaceIdSchema.parse(workspaceId))}/network-state`,\n signal: AbortSignal.timeout(30_000),\n }),\n setNetworkPolicy: async ({ caller, workspaceId, policy, initializeIfMissing }) => {\n const userId = await caller.actingUser.current();\n const anonymous = userId == null;\n const resolvedCaller = { ...caller, actingUser: { current: async () => userId } };\n const result = await json(z.object({ ok: z.boolean() }), {\n caller: resolvedCaller,\n method: initializeIfMissing === true ? 'POST' : 'PUT',\n anonymous,\n path: `/v1/egress/workspaces/${encodeURIComponent(deviceEgressWorkspaceIdSchema.parse(workspaceId))}/${initializeIfMissing === true ? 'network-state/initialize' : anonymous ? 'network-state' : 'network-policy'}`,\n json: workspaceNetworkPolicySchema.parse(policy),\n signal: AbortSignal.timeout(30_000),\n });\n if (!result.ok) throw new Error('Device API did not save the workspace network policy');\n },\n workspace: ({ caller, workspaceId }) =>\n json(deviceEgressWorkspaceSchema, {\n caller,\n method: 'GET',\n path: `/v1/egress/workspaces/${encodeURIComponent(deviceEgressWorkspaceIdSchema.parse(workspaceId))}`,\n signal: AbortSignal.timeout(30_000),\n }),\n create: ({ caller, ...input }) =>\n json(deviceEgressEnrollmentSchema, {\n caller,\n method: 'POST',\n path: '/v1/egress/leases',\n json: deviceEgressCreateRequestSchema.parse(input),\n signal: AbortSignal.timeout(180_000),\n }),\n renew: ({ caller, leaseId }) =>\n json(deviceEgressLeaseSchema, {\n caller,\n method: 'POST',\n path: `/v1/egress/leases/${encodeURIComponent(leaseId)}/renew`,\n signal: AbortSignal.timeout(180_000),\n }),\n activate: ({ caller, leaseId }) =>\n json(deviceEgressLeaseSchema, {\n caller,\n method: 'POST',\n path: `/v1/egress/leases/${encodeURIComponent(leaseId)}/activate`,\n signal: AbortSignal.timeout(60_000),\n }),\n revoke: async ({ caller, leaseId, workspaceId }) => {\n await json(emptySchema, {\n caller,\n method: 'DELETE',\n json: { workspaceId },\n path: `/v1/egress/leases/${encodeURIComponent(leaseId)}`,\n signal: AbortSignal.timeout(60_000),\n });\n },\n suspend: async ({\n caller,\n workspaceId,\n }: {\n caller: DeviceApiCallerIface;\n workspaceId: string;\n }) => {\n const userId = await caller.actingUser.current();\n const anonymous = userId == null;\n const resolvedCaller = { ...caller, actingUser: { current: async () => userId } };\n await json(emptySchema, {\n caller: resolvedCaller,\n anonymous,\n method: 'POST',\n path: `/v1/egress/workspaces/${encodeURIComponent(deviceEgressWorkspaceIdSchema.parse(workspaceId))}/${anonymous ? 'network-state/suspend' : 'suspend'}`,\n signal: AbortSignal.timeout(60_000),\n });\n },\n disable: async ({ caller, workspaceId }) => {\n await json(emptySchema, {\n caller,\n method: 'DELETE',\n path: `/v1/egress/workspaces/${encodeURIComponent(deviceEgressWorkspaceIdSchema.parse(workspaceId))}`,\n signal: AbortSignal.timeout(60_000),\n });\n },\n },\n releaseWorkspaceLeases: async ({ caller, deviceId, bindingId }) => {\n const result = await json(z.object({ released: z.boolean() }), {\n caller,\n method: 'DELETE',\n path:\n '/v1/devices/' +\n encodeURIComponent(deviceId) +\n '/workspaces/' +\n encodeURIComponent(bindingId) +\n '/leases',\n });\n if (!result.released) throw new Error('The Device did not release its workspace leases');\n },\n inspectProcesses: ({ caller, deviceId, bindingId, request }) => {\n const suffix =\n request.operation === ProcessInspectionOperation.Available\n ? '/available'\n : 'processId' in request\n ? '/' + encodeURIComponent(request.processId)\n : '';\n const query: Record<string, string> = {};\n if (bindingId != null) query.bindingId = bindingId;\n if ('bootId' in request) query.bootId = request.bootId;\n if ('cursor' in request && request.cursor != null) query.cursor = request.cursor;\n if ('limit' in request && request.limit != null) query.limit = String(request.limit);\n return json(processInspectionResultSchema, {\n caller,\n method: request.operation === ProcessInspectionOperation.Stop ? 'DELETE' : 'GET',\n path: '/v1/devices/' + encodeURIComponent(deviceId) + '/processes' + suffix,\n query,\n });\n },\n getDevice: ({ caller, deviceId }) =>\n orNull(\n json(deviceSchema, {\n caller,\n method: 'GET',\n path: `/v1/devices/${encodeURIComponent(deviceId)}`,\n }),\n ),\n listDevices: async ({ caller }) =>\n (await json(devicesSchema, { caller, method: 'GET', path: '/v1/devices' })).devices,\n resolvePairing: ({ caller, code }) =>\n orNull(\n json(deviceSchema, {\n caller,\n method: 'POST',\n path: '/v1/pairings/resolve',\n json: { code },\n }),\n ),\n lease: async ({ caller, deviceId, sessionId, bindingId, access, ttlMs, afterGeneration }) =>\n leaseOf(\n await json(leaseSchema, {\n caller,\n method: 'POST',\n path: `/v1/devices/${encodeURIComponent(deviceId)}/leases`,\n json: { sessionId, bindingId, access, ttlMs, afterGeneration },\n }),\n ),\n recoverLease: async ({ caller, deviceId, sessionId, bindingId, access }) =>\n leaseOf(\n await json(leaseSchema, {\n caller,\n method: 'POST',\n path: `/v1/devices/${encodeURIComponent(deviceId)}/leases/recover`,\n json: { sessionId, bindingId, access },\n }),\n ),\n renew: async ({ caller, lease, ttlMs }) =>\n leaseOf(\n await json(leaseSchema, {\n caller,\n method: 'POST',\n path: leasePath(lease, '/renew'),\n json: { ttlMs },\n }),\n ),\n release: async ({ caller, lease }) => {\n await json(emptySchema, { caller, method: 'DELETE', path: leasePath(lease, '') });\n },\n transport,\n mcpCatalog: ({ caller, deviceId }) =>\n json(mcpCatalogSchema, {\n caller,\n method: 'GET',\n path: `/v1/devices/${encodeURIComponent(deviceId)}/mcp`,\n }),\n localMcpServers: async ({ caller, lease }) =>\n (await json(serversSchema, { caller, method: 'GET', path: leasePath(lease, '/mcp') }))\n .servers,\n pipe: async ({ caller, lease, server, action, clientId, dataBase64, signal }) =>\n (\n await json(pipeReadSchema, {\n caller,\n method: 'POST',\n path: leasePath(lease, `/mcp/${encodeURIComponent(server)}/${action}`),\n json: dataBase64 == null ? { clientId } : { clientId, dataBase64 },\n signal,\n })\n ).dataBase64 ?? '',\n screen: ({ caller, deviceId, sessionId, viewOnly }) =>\n json(screenSchema, {\n caller,\n method: 'POST',\n path: `/v1/devices/${encodeURIComponent(deviceId)}/screen`,\n json: { sessionId, viewOnly },\n }),\n };\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n deviceEgressCreateRequestSchema,\n deviceEgressWorkspaceIdSchema,\n deviceEgressEnrollmentSchema,\n deviceEgressLeaseSchema,\n deviceEgressWorkspaceSchema,\n workspaceNetworkPolicySchema,\n deviceWorkspaceNetworkStateSchema,\n type WorkspaceNetworkPolicyIface,\n} from '@finalai/agent-protocol/device-egress';\nimport {\n ProcessInspectionOperation,\n processInspectionResultSchema,\n type ProcessInspectionRequestIface,\n type ProcessInspectionResultIface,\n} from '@finalai/agent-protocol/process-inspection';\nimport { jsonObjectSchema, jsonValueSchema, type JsonValue } from '@finalai/agent-provider';\nimport { SandboxEntryType, type SandboxActingUserIface } from '@finalai/agent-provider/sandbox';\nimport type { DeviceApiCredentialsIface, FinalPlatformAccessIface } from \"./access.mjs\";\nimport * as z from 'zod';\nimport { decodeBase64, encodeBase64 } from \"./bytes.mjs\";\nimport { DEVICE_API_ACTING_USER_HEADER } from \"./environment.mjs\";\nimport type {\n SandboxTransportIface,\n TransportDirEntryIface,\n TransportOutputIface,\n TransportStatIface,\n} from \"./transport.mjs\";\n\n// A client of the Device API, authenticated with the provider's configured\n// access (./access.ts). Device operations also name the acting user; the API\n// enforces ownership independently of the token.\n\n// The Device API's header naming the user a request acts for (a Final user id).\nexport { DEVICE_API_ACTING_USER_HEADER } from \"./environment.mjs\";\n\n// The organization, credentials and user a call acts for; the user is read on each\n// call. Workspace networking also calls with no user (admission, policy\n// persistence and cleanup), which needs service access from `deviceAccess`.\nexport interface DeviceApiCallerIface {\n organizationId: string;\n credentials?: DeviceApiCredentialsIface;\n actingUser: SandboxActingUserIface;\n}\n\n// Transport options; the API origin and token come from the caller's credentials.\nexport interface DeviceApiConfigIface {\n fetch?: DeviceApiFetchIface;\n}\n\nexport interface DeviceApiFetchIface {\n (input: string, init: RequestInit): Promise<Response>;\n}\n\nexport enum DeviceApiLeaseAccess {\n Read = 'read',\n Write = 'write',\n}\n\nexport enum DeviceApiCapability {\n Files = 'files',\n Process = 'process',\n ComputerUse = 'computer-use',\n LocalMcp = 'local-mcp',\n}\n\nexport const DEVICE_API_COMPUTER_USE_SERVER = 'computer-use';\n\n// Unknown values from a newer API read as absent rather than failing the call.\nconst tolerantEnum = <T extends Record<string, string>>(values: T) =>\n z.string().transform((value): T[keyof T] | null => {\n const parsed = z.nativeEnum(values).safeParse(value);\n return parsed.success ? parsed.data : null;\n });\n\nconst deviceSchema = z.object({\n id: z.string(),\n organizationId: z.string(),\n displayName: z.string(),\n os: z.string(),\n online: z.boolean(),\n writable: z.boolean(),\n allowProcesses: z.boolean(),\n computerUseReady: z.boolean(),\n screenReady: z.boolean(),\n});\nexport type DeviceApiDeviceIface = z.infer<typeof deviceSchema>;\n\nconst leaseSchema = z.object({\n lease: z.string(),\n deviceId: z.string(),\n generation: z.number(),\n workspaceRoot: z.string(),\n platform: z.string(),\n access: z.nativeEnum(DeviceApiLeaseAccess),\n capabilities: z.array(tolerantEnum(DeviceApiCapability)),\n expiresAt: z.string(),\n});\nexport interface DeviceApiLeaseIface {\n lease: string;\n deviceId: string;\n generation: number;\n workspaceRoot: string;\n platform: string;\n access: DeviceApiLeaseAccess;\n capabilities: DeviceApiCapability[];\n expiresAtMs: number;\n}\n\ninterface ProcessInputBodyIface {\n bootId: string;\n dataBase64?: string;\n eof?: boolean;\n}\n\nconst errorBodySchema = z.object({ error: z.object({ code: z.string(), message: z.string() }) });\nconst statBodySchema = z.object({\n stat: z\n .object({\n type: tolerantEnum(SandboxEntryType),\n size: z.number(),\n modifiedAtMs: z.number().nullable(),\n mode: z.number().nullable(),\n })\n .nullable(),\n});\nconst dirBodySchema = z.object({\n entries: z.array(\n z.object({\n name: z.string(),\n type: tolerantEnum(SandboxEntryType),\n size: z.number().nullable(),\n }),\n ),\n});\nconst processSchema = z.object({ id: z.string(), bootId: z.string() });\nconst outputStreamSchema = z.object({\n dataBase64: z.string(),\n nextOffset: z.number(),\n eof: z.boolean(),\n});\nconst outputSchema = z.object({\n stdout: outputStreamSchema,\n stderr: outputStreamSchema,\n exited: z.boolean(),\n exitCode: z.number().nullable(),\n exitSignal: z.string().nullable(),\n});\nconst devicesSchema = z.object({ devices: z.array(deviceSchema) });\nconst serversSchema = z.object({ servers: z.array(z.string()) });\n// A Device server's tool as the API recorded it; checked against the tool\n// descriptor contract where the provider hands it on.\nconst catalogToolSchema = jsonObjectSchema;\nconst mcpCatalogSchema = z.object({\n computerUse: z.object({ tools: z.array(catalogToolSchema) }).nullable(),\n localServers: z\n .object({\n servers: z.array(\n z.object({ name: z.string(), tools: z.array(catalogToolSchema).nullable() }),\n ),\n })\n .nullable(),\n});\nexport type DeviceApiMcpCatalogIface = z.infer<typeof mcpCatalogSchema>;\nconst pipeReadSchema = z.object({ dataBase64: z.string().optional() });\nconst screenSchema = z.object({ url: z.string(), token: z.string(), expiresAt: z.string() });\nconst emptySchema = z.unknown();\n\n// One ranged read or write; the API splits it into the Device's own chunks.\nexport const DEVICE_API_FILE_CHUNK_BYTES = 4 * 1024 * 1024;\n// The API long-polls the Device for output up to this long.\nexport const DEVICE_API_OUTPUT_WAIT_MS = 15_000;\n// How the Device reports a lease process it no longer has (relayed as a 502):\n// unknown in this lease, from an earlier runtime, or retired after its output\n// was read to the end.\nconst DEVICE_PROCESS_GONE_MESSAGE =\n /unknown process|belongs to another device runtime|consumed output has expired/i;\n\nexport enum DeviceApiClientErrorCode {\n // The host granted no access for this user or trusted service call.\n CredentialMissing = 'credential_missing',\n // The session acts for no user, and a Device is only used for its owner.\n NoActingUser = 'no_acting_user',\n EgressEnrollmentLost = 'egress_enrollment_lost',\n}\n\nexport interface DeviceApiErrorIface extends Error {\n status: number | null;\n code: string;\n}\n\nconst apiError = (status: number, code: string, message: string): DeviceApiErrorIface =>\n Object.assign(new Error(`Device API ${status} ${code}: ${message}`), { status, code });\n\nconst credentialMissing = (actingUserId: string | null): DeviceApiErrorIface =>\n Object.assign(\n new Error(\n `Device API access is unavailable ${actingUserId == null ? 'for workspace networking (no acting user)' : 'for this acting user'}: the provider's configured Device API access granted none`,\n ),\n { status: null, code: DeviceApiClientErrorCode.CredentialMissing },\n );\n\nconst noActingUser = (): DeviceApiErrorIface =>\n Object.assign(\n new Error(\n 'this session acts for no user, and a Final Device is only used by sessions acting for its owner',\n ),\n { status: null, code: DeviceApiClientErrorCode.NoActingUser },\n );\n\nconst statusSchema = z.object({ status: z.number() });\nexport const deviceApiCodeOf = (cause: unknown): string | null =>\n z.object({ code: z.string() }).safeParse(cause).data?.code ?? null;\n\nexport const deviceApiStatusOf = (cause: Error): number | null =>\n statusSchema.safeParse(cause).data?.status ?? null;\n\nconst parseJson = (text: string): JsonValue => {\n try {\n return jsonValueSchema.parse(JSON.parse(text));\n } catch {\n return null;\n }\n};\n\nconst leaseOf = (raw: z.infer<typeof leaseSchema>): DeviceApiLeaseIface => ({\n lease: raw.lease,\n deviceId: raw.deviceId,\n generation: raw.generation,\n workspaceRoot: raw.workspaceRoot,\n platform: raw.platform,\n access: raw.access,\n capabilities: raw.capabilities.filter((capability) => capability != null),\n expiresAtMs: Date.parse(raw.expiresAt),\n});\n\nexport interface DeviceApiClientIface {\n egress: {\n networkState(args: {\n organizationId: string;\n credentials?: DeviceApiCredentialsIface;\n workspaceId: string;\n }): Promise<z.infer<typeof deviceWorkspaceNetworkStateSchema>>;\n setNetworkPolicy(args: {\n caller: DeviceApiCallerIface;\n workspaceId: string;\n policy: WorkspaceNetworkPolicyIface;\n initializeIfMissing?: boolean;\n }): Promise<void>;\n workspace(args: {\n caller: DeviceApiCallerIface;\n workspaceId: string;\n }): Promise<z.infer<typeof deviceEgressWorkspaceSchema>>;\n create(args: {\n caller: DeviceApiCallerIface;\n workspaceId: string;\n deviceIds: string[];\n dnsResolvers?: string[];\n }): Promise<z.infer<typeof deviceEgressEnrollmentSchema>>;\n renew(args: {\n caller: DeviceApiCallerIface;\n leaseId: string;\n }): Promise<z.infer<typeof deviceEgressLeaseSchema>>;\n activate(args: {\n caller: DeviceApiCallerIface;\n leaseId: string;\n }): Promise<z.infer<typeof deviceEgressLeaseSchema>>;\n revoke(args: {\n caller: DeviceApiCallerIface;\n leaseId: string;\n workspaceId: string;\n }): Promise<void>;\n disable(args: { caller: DeviceApiCallerIface; workspaceId: string }): Promise<void>;\n suspend(args: { caller: DeviceApiCallerIface; workspaceId: string }): Promise<void>;\n };\n releaseWorkspaceLeases(args: {\n caller: DeviceApiCallerIface;\n deviceId: string;\n bindingId: string;\n }): Promise<void>;\n inspectProcesses(args: {\n caller: DeviceApiCallerIface;\n deviceId: string;\n bindingId: string;\n request: ProcessInspectionRequestIface;\n }): Promise<ProcessInspectionResultIface>;\n getDevice(args: {\n caller: DeviceApiCallerIface;\n deviceId: string;\n }): Promise<DeviceApiDeviceIface | null>;\n // The Devices of the user the call acts for.\n listDevices(args: { caller: DeviceApiCallerIface }): Promise<DeviceApiDeviceIface[]>;\n resolvePairing(args: {\n caller: DeviceApiCallerIface;\n code: string;\n }): Promise<DeviceApiDeviceIface | null>;\n lease(args: {\n caller: DeviceApiCallerIface;\n deviceId: string;\n sessionId: string;\n bindingId: string;\n access: DeviceApiLeaseAccess;\n ttlMs: number;\n afterGeneration?: number;\n }): Promise<DeviceApiLeaseIface>;\n recoverLease(args: {\n caller: DeviceApiCallerIface;\n deviceId: string;\n sessionId: string;\n bindingId: string;\n access: DeviceApiLeaseAccess;\n }): Promise<DeviceApiLeaseIface>;\n renew(args: {\n caller: DeviceApiCallerIface;\n lease: string;\n ttlMs: number;\n }): Promise<DeviceApiLeaseIface>;\n release(args: { caller: DeviceApiCallerIface; lease: string }): Promise<void>;\n // The sandbox transport over one lease; `lease()` is the current handle.\n transport(args: {\n caller: DeviceApiCallerIface;\n lease: () => Promise<string>;\n }): SandboxTransportIface;\n localMcpServers(args: { caller: DeviceApiCallerIface; lease: string }): Promise<string[]>;\n // What the Device's MCP servers last listed through the API, without a lease.\n mcpCatalog(args: {\n caller: DeviceApiCallerIface;\n deviceId: string;\n }): Promise<DeviceApiMcpCatalogIface>;\n pipe(args: {\n caller: DeviceApiCallerIface;\n lease: string;\n server: string;\n action: 'open' | 'write' | 'read' | 'close';\n clientId: string;\n dataBase64?: string;\n signal?: AbortSignal;\n }): Promise<string>;\n screen(args: {\n caller: DeviceApiCallerIface;\n deviceId: string;\n sessionId: string;\n viewOnly?: boolean;\n }): Promise<{ url: string; token: string; expiresAt: string }>;\n}\n\nexport const createDeviceApiClient = (config: {\n api: DeviceApiConfigIface | (() => DeviceApiConfigIface);\n fetch?: DeviceApiFetchIface;\n}): DeviceApiClientIface => {\n const readApi = () => (typeof config.api === 'function' ? config.api() : config.api);\n const failure = async (response: Response): Promise<DeviceApiErrorIface> => {\n // Read as text so proxy and load balancer error pages survive.\n const text = await response.text().catch(() => '');\n const body = errorBodySchema.safeParse(parseJson(text));\n return body.success\n ? apiError(response.status, body.data.error.code, body.data.error.message)\n : apiError(response.status, 'http', text.slice(0, 200) || response.statusText);\n };\n\n const accessFor = async (args: {\n caller: DeviceApiCallerIface;\n actingUserId: string | null;\n refresh: boolean;\n }): Promise<FinalPlatformAccessIface> => {\n const access = await args.caller.credentials?.deviceAccess({\n actingUserId: args.actingUserId,\n refresh: args.refresh,\n });\n if (access == null) throw credentialMissing(args.actingUserId);\n return access;\n };\n\n // One authenticated call for the user it acts for; rejected access is asked for\n // again once, in case it expired.\n const send = async (args: {\n caller: DeviceApiCallerIface;\n method: string;\n path: string;\n query?: Record<string, string>;\n body?: BodyInit;\n contentType?: string;\n signal?: AbortSignal;\n anonymous?: boolean;\n }): Promise<Response> => {\n const api = readApi();\n const actingUserId = await args.caller.actingUser.current();\n if (actingUserId == null && !args.anonymous) throw noActingUser();\n const attempt = async (refresh: boolean): Promise<Response> => {\n const access = await accessFor({ caller: args.caller, actingUserId, refresh });\n const url = new URL(`${access.baseUrl.replace(/\\/+$/, '')}${args.path}`);\n for (const [key, value] of Object.entries(args.query ?? {})) url.searchParams.set(key, value);\n const headers = new Headers({ authorization: `Bearer ${access.token}` });\n if (actingUserId != null) headers.set(DEVICE_API_ACTING_USER_HEADER, actingUserId);\n if (args.contentType != null) headers.set('content-type', args.contentType);\n return (config.fetch ?? api.fetch ?? fetch)(url.toString(), {\n method: args.method,\n headers,\n body: args.body,\n signal: args.signal,\n });\n };\n let response = await attempt(false);\n if (response.status === 401) {\n await response.text().catch(() => '');\n response = await attempt(true);\n }\n return response;\n };\n\n const json = async <T extends z.ZodType>(\n schema: T,\n args: Parameters<typeof send>[0] & { json?: unknown },\n ): Promise<z.infer<T>> => {\n const response = await send({\n ...args,\n body: args.json === undefined ? args.body : JSON.stringify(args.json),\n contentType: args.json === undefined ? args.contentType : 'application/json',\n });\n if (!response.ok) throw await failure(response);\n const text = await response.text();\n return schema.parse(text === '' ? null : parseJson(text));\n };\n\n // A 404 reads as absent.\n const orNull = async <T>(work: Promise<T>): Promise<T | null> => {\n try {\n return await work;\n } catch (cause) {\n if (cause instanceof Error && deviceApiStatusOf(cause) === 404) return null;\n throw cause;\n }\n };\n\n const leasePath = (lease: string, rest: string): string =>\n `/v1/leases/${encodeURIComponent(lease)}${rest}`;\n\n const transport: DeviceApiClientIface['transport'] = ({ caller, lease }) => {\n const call = async <T extends z.ZodType>(\n schema: T,\n args: Omit<Parameters<typeof json>[1], 'caller' | 'path'> & { path: string },\n ): Promise<z.infer<T>> =>\n json(schema, { ...args, caller, path: leasePath(await lease(), args.path) });\n const processPath = (id: string, rest: string): string =>\n `/processes/${encodeURIComponent(id)}${rest}`;\n return {\n kind: 'device-api',\n fileChunkBytes: DEVICE_API_FILE_CHUNK_BYTES,\n outputWaitMs: DEVICE_API_OUTPUT_WAIT_MS,\n stat: async ({ path, signal }): Promise<TransportStatIface | null> => {\n const { stat } = await call(statBodySchema, {\n method: 'GET',\n path: '/files/stat',\n query: { path },\n signal,\n });\n return stat == null ? null : { ...stat, type: stat.type ?? SandboxEntryType.Other };\n },\n readDir: async ({ path, signal }): Promise<TransportDirEntryIface[]> =>\n (\n await call(dirBodySchema, { method: 'GET', path: '/files/dir', query: { path }, signal })\n ).entries.map((entry) => ({ ...entry, type: entry.type ?? SandboxEntryType.Other })),\n readChunk: async ({ path, offset, length, signal }) => {\n const response = await send({\n caller,\n method: 'GET',\n path: leasePath(await lease(), '/files/content'),\n query: { path, offset: String(offset), length: String(length) },\n signal,\n });\n if (!response.ok) throw await failure(response);\n const bytes = new Uint8Array(await response.arrayBuffer());\n return { bytes, eof: bytes.byteLength < length };\n },\n writeChunk: async ({ path, offset, bytes, signal }) => {\n await call(emptySchema, {\n method: 'PUT',\n path: '/files/content',\n query: { path, offset: String(offset) },\n body: new Blob([bytes.slice()]),\n contentType: 'application/octet-stream',\n signal,\n });\n },\n createDirectory: async ({ path, signal }) => {\n await call(emptySchema, {\n method: 'POST',\n path: '/files/directories',\n json: { path },\n signal,\n });\n },\n remove: async ({ path, recursive, force, signal }) => {\n await call(emptySchema, {\n method: 'DELETE',\n path: '/files',\n query: { path, recursive: String(recursive), force: String(force) },\n signal,\n });\n },\n exec: async ({ id, command, cwd, env, timeoutMs, signal }) =>\n call(processSchema, {\n method: 'POST',\n path: '/processes',\n json: { id, command, cwd, env, timeoutMs },\n signal,\n }),\n output: async ({ process, stdoutOffset, stderrOffset, waitMs, signal }) => {\n const output = await call(outputSchema, {\n method: 'POST',\n path: processPath(process.id, '/output'),\n json: { bootId: process.bootId, stdoutOffset, stderrOffset, waitMs },\n signal,\n });\n const stream = (value: z.infer<typeof outputStreamSchema>) => ({\n data: decodeBase64(value.dataBase64),\n nextOffset: value.nextOffset,\n eof: value.eof,\n });\n const result: TransportOutputIface = {\n stdout: stream(output.stdout),\n stderr: stream(output.stderr),\n exited: output.exited,\n exitCode: output.exitCode,\n exitSignal: output.exitSignal,\n };\n return result;\n },\n input: async ({ process, data, eof, signal, terminate, abortSignal }) => {\n if (terminate === true || signal != null) {\n await call(emptySchema, {\n method: 'POST',\n path: processPath(process.id, '/kill'),\n json:\n terminate === true ? { bootId: process.bootId } : { bootId: process.bootId, signal },\n signal: abortSignal,\n });\n if (terminate === true) return;\n }\n if ((data != null && data.byteLength > 0) || eof === true) {\n const body: ProcessInputBodyIface = {\n bootId: process.bootId,\n };\n if (data != null && data.byteLength > 0) body.dataBase64 = encodeBase64(data);\n if (eof === true) body.eof = true;\n await call(emptySchema, {\n method: 'POST',\n path: processPath(process.id, '/input'),\n json: body,\n signal: abortSignal,\n });\n }\n },\n // Lease processes run on the Device and are found again by id and boot\n // while the lease generation lasts.\n processGone: (cause) => {\n if (!(cause instanceof Error)) return false;\n const status = deviceApiStatusOf(cause);\n return (\n status === 404 || (status === 502 && DEVICE_PROCESS_GONE_MESSAGE.test(cause.message))\n );\n },\n close: () => undefined,\n };\n };\n\n return {\n egress: {\n networkState: ({ organizationId, credentials, workspaceId }) =>\n json(deviceWorkspaceNetworkStateSchema, {\n caller: { organizationId, credentials, actingUser: { current: async () => null } },\n anonymous: true,\n method: 'GET',\n path: `/v1/egress/workspaces/${encodeURIComponent(deviceEgressWorkspaceIdSchema.parse(workspaceId))}/network-state`,\n signal: AbortSignal.timeout(30_000),\n }),\n setNetworkPolicy: async ({ caller, workspaceId, policy, initializeIfMissing }) => {\n const userId = await caller.actingUser.current();\n const anonymous = userId == null;\n const resolvedCaller = { ...caller, actingUser: { current: async () => userId } };\n const result = await json(z.object({ ok: z.boolean() }), {\n caller: resolvedCaller,\n method: initializeIfMissing === true ? 'POST' : 'PUT',\n anonymous,\n path: `/v1/egress/workspaces/${encodeURIComponent(deviceEgressWorkspaceIdSchema.parse(workspaceId))}/${initializeIfMissing === true ? 'network-state/initialize' : anonymous ? 'network-state' : 'network-policy'}`,\n json: workspaceNetworkPolicySchema.parse(policy),\n signal: AbortSignal.timeout(30_000),\n });\n if (!result.ok) throw new Error('Device API did not save the workspace network policy');\n },\n workspace: ({ caller, workspaceId }) =>\n json(deviceEgressWorkspaceSchema, {\n caller,\n method: 'GET',\n path: `/v1/egress/workspaces/${encodeURIComponent(deviceEgressWorkspaceIdSchema.parse(workspaceId))}`,\n signal: AbortSignal.timeout(30_000),\n }),\n create: ({ caller, ...input }) =>\n json(deviceEgressEnrollmentSchema, {\n caller,\n method: 'POST',\n path: '/v1/egress/leases',\n json: deviceEgressCreateRequestSchema.parse(input),\n signal: AbortSignal.timeout(180_000),\n }),\n renew: ({ caller, leaseId }) =>\n json(deviceEgressLeaseSchema, {\n caller,\n method: 'POST',\n path: `/v1/egress/leases/${encodeURIComponent(leaseId)}/renew`,\n signal: AbortSignal.timeout(180_000),\n }),\n activate: ({ caller, leaseId }) =>\n json(deviceEgressLeaseSchema, {\n caller,\n method: 'POST',\n path: `/v1/egress/leases/${encodeURIComponent(leaseId)}/activate`,\n signal: AbortSignal.timeout(60_000),\n }),\n revoke: async ({ caller, leaseId, workspaceId }) => {\n await json(emptySchema, {\n caller,\n method: 'DELETE',\n json: { workspaceId },\n path: `/v1/egress/leases/${encodeURIComponent(leaseId)}`,\n signal: AbortSignal.timeout(60_000),\n });\n },\n suspend: async ({\n caller,\n workspaceId,\n }: {\n caller: DeviceApiCallerIface;\n workspaceId: string;\n }) => {\n const userId = await caller.actingUser.current();\n const anonymous = userId == null;\n const resolvedCaller = { ...caller, actingUser: { current: async () => userId } };\n await json(emptySchema, {\n caller: resolvedCaller,\n anonymous,\n method: 'POST',\n path: `/v1/egress/workspaces/${encodeURIComponent(deviceEgressWorkspaceIdSchema.parse(workspaceId))}/${anonymous ? 'network-state/suspend' : 'suspend'}`,\n signal: AbortSignal.timeout(60_000),\n });\n },\n disable: async ({ caller, workspaceId }) => {\n await json(emptySchema, {\n caller,\n method: 'DELETE',\n path: `/v1/egress/workspaces/${encodeURIComponent(deviceEgressWorkspaceIdSchema.parse(workspaceId))}`,\n signal: AbortSignal.timeout(60_000),\n });\n },\n },\n releaseWorkspaceLeases: async ({ caller, deviceId, bindingId }) => {\n const result = await json(z.object({ released: z.boolean() }), {\n caller,\n method: 'DELETE',\n path:\n '/v1/devices/' +\n encodeURIComponent(deviceId) +\n '/workspaces/' +\n encodeURIComponent(bindingId) +\n '/leases',\n });\n if (!result.released) throw new Error('The Device did not release its workspace leases');\n },\n inspectProcesses: ({ caller, deviceId, bindingId, request }) => {\n const suffix =\n request.operation === ProcessInspectionOperation.Available\n ? '/available'\n : 'processId' in request\n ? '/' + encodeURIComponent(request.processId)\n : '';\n const query: Record<string, string> = {};\n if (bindingId != null) query.bindingId = bindingId;\n if ('bootId' in request) query.bootId = request.bootId;\n if ('cursor' in request && request.cursor != null) query.cursor = request.cursor;\n if ('limit' in request && request.limit != null) query.limit = String(request.limit);\n return json(processInspectionResultSchema, {\n caller,\n method: request.operation === ProcessInspectionOperation.Stop ? 'DELETE' : 'GET',\n path: '/v1/devices/' + encodeURIComponent(deviceId) + '/processes' + suffix,\n query,\n });\n },\n getDevice: ({ caller, deviceId }) =>\n orNull(\n json(deviceSchema, {\n caller,\n method: 'GET',\n path: `/v1/devices/${encodeURIComponent(deviceId)}`,\n }),\n ),\n listDevices: async ({ caller }) =>\n (await json(devicesSchema, { caller, method: 'GET', path: '/v1/devices' })).devices,\n resolvePairing: ({ caller, code }) =>\n orNull(\n json(deviceSchema, {\n caller,\n method: 'POST',\n path: '/v1/pairings/resolve',\n json: { code },\n }),\n ),\n lease: async ({ caller, deviceId, sessionId, bindingId, access, ttlMs, afterGeneration }) =>\n leaseOf(\n await json(leaseSchema, {\n caller,\n method: 'POST',\n path: `/v1/devices/${encodeURIComponent(deviceId)}/leases`,\n json: { sessionId, bindingId, access, ttlMs, afterGeneration },\n }),\n ),\n recoverLease: async ({ caller, deviceId, sessionId, bindingId, access }) =>\n leaseOf(\n await json(leaseSchema, {\n caller,\n method: 'POST',\n path: `/v1/devices/${encodeURIComponent(deviceId)}/leases/recover`,\n json: { sessionId, bindingId, access },\n }),\n ),\n renew: async ({ caller, lease, ttlMs }) =>\n leaseOf(\n await json(leaseSchema, {\n caller,\n method: 'POST',\n path: leasePath(lease, '/renew'),\n json: { ttlMs },\n }),\n ),\n release: async ({ caller, lease }) => {\n await json(emptySchema, { caller, method: 'DELETE', path: leasePath(lease, '') });\n },\n transport,\n mcpCatalog: ({ caller, deviceId }) =>\n json(mcpCatalogSchema, {\n caller,\n method: 'GET',\n path: `/v1/devices/${encodeURIComponent(deviceId)}/mcp`,\n }),\n localMcpServers: async ({ caller, lease }) =>\n (await json(serversSchema, { caller, method: 'GET', path: leasePath(lease, '/mcp') }))\n .servers,\n pipe: async ({ caller, lease, server, action, clientId, dataBase64, signal }) =>\n (\n await json(pipeReadSchema, {\n caller,\n method: 'POST',\n path: leasePath(lease, `/mcp/${encodeURIComponent(server)}/${action}`),\n json: dataBase64 == null ? { clientId } : { clientId, dataBase64 },\n signal,\n })\n ).dataBase64 ?? '',\n screen: ({ caller, deviceId, sessionId, viewOnly }) =>\n json(screenSchema, {\n caller,\n method: 'POST',\n path: `/v1/devices/${encodeURIComponent(deviceId)}/screen`,\n json: { sessionId, viewOnly },\n }),\n };\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["DEVICE_API_ACTING_USER_HEADER", "DeviceApiLeaseAccess", "DeviceApiCapability", "DeviceApiClientErrorCode"]
7
7
  }
@@ -1,14 +1,15 @@
1
- import { SandboxAccess, type JsonValue } from '@finalai/agent-provider';
1
+ import { type JsonValue } from '@finalai/agent-provider';
2
2
  import { SandboxCapability, type NetworkSandboxSessionIface, type SandboxProviderIface } from '@finalai/agent-provider/sandbox';
3
3
  import * as z from 'zod';
4
4
  import { type DeviceApiConfigIface, type DeviceApiFetchIface } from "./device-api.mjs";
5
5
  export { DEVICE_API_ACTING_USER_HEADER, DeviceApiClientErrorCode } from "./device-api.mjs";
6
6
  export type { DeviceApiConfigIface, DeviceApiFetchIface } from "./device-api.mjs";
7
- export { DEVICE_SANDBOX_SPECIFIER } from "./environment.mjs";
8
- export type { FinalPlatformAccessIface } from '@finalai/agent-provider/sandbox';
7
+ export { DEVICE_PROVIDER } from "./environment.mjs";
8
+ export type { FinalPlatformAccessIface } from "./access.mjs";
9
9
  export { SandboxPlatform } from "./paths.mjs";
10
10
  export interface DeviceSandboxProviderConfigIface {
11
11
  api: DeviceApiConfigIface;
12
+ deviceApiUrl: string;
12
13
  fetch?: DeviceApiFetchIface;
13
14
  leaseTtlMs?: number;
14
15
  onlineWaitMs?: number;
@@ -22,10 +23,9 @@ declare const deviceArtifactSchema: z.ZodObject<{
22
23
  deviceId: z.ZodString;
23
24
  }, z.core.$strip>;
24
25
  declare const deviceStateSchema: z.ZodObject<{
25
- version: z.ZodLiteral<1>;
26
+ version: z.ZodLiteral<2>;
26
27
  deviceId: z.ZodString;
27
28
  generation: z.ZodNumber;
28
- access: z.ZodEnum<typeof SandboxAccess>;
29
29
  }, z.core.$strip>;
30
30
  export type DeviceSandboxArtifact = z.infer<typeof deviceArtifactSchema>;
31
31
  export type DeviceSandboxState = z.infer<typeof deviceStateSchema>;
@@ -33,5 +33,5 @@ export declare const DEVICE_COMPUTER_USE_SERVER = "computer-use";
33
33
  export interface DeviceSandboxSessionIface extends NetworkSandboxSessionIface {
34
34
  readonly capabilities: readonly SandboxCapability[];
35
35
  }
36
- export type DeviceSandboxProviderIface = SandboxProviderIface<JsonValue, JsonValue, DeviceSandboxArtifact, DeviceSandboxState, DeviceSandboxSessionIface>;
36
+ export type DeviceSandboxProviderIface = SandboxProviderIface<JsonValue, DeviceSandboxArtifact, DeviceSandboxState, DeviceSandboxSessionIface>;
37
37
  export declare const createDeviceSandboxProvider: (config: DeviceSandboxProviderConfigIface) => DeviceSandboxProviderIface;