{"version":3,"file":"index.mjs","names":["templateView: ManagedSandboxSession","managedSession: ManagedSandboxSession"],"sources":["../../src/eve/index.ts"],"sourcesContent":["import type {\n  SandboxBackend,\n  SandboxBackendHandle,\n  SandboxNetworkPolicy as EveNetworkPolicy,\n  SandboxSession as EveSandboxSession,\n} from \"eve/sandbox\";\nimport { isSandboxError, SandboxError } from \"../core/errors\";\nimport type {\n  ManagedSandboxProvider,\n  ManagedSandboxSession,\n  SandboxNetworkPolicy,\n  SandboxProvider,\n} from \"../core/provider\";\nimport { toAISandboxSession } from \"../ai/index\";\n\nexport interface EveSandboxUseOptions {\n  networkPolicy?: EveNetworkPolicy;\n}\n\nexport interface CreateEveSandboxBackendOptions {\n  provider: SandboxProvider<unknown>;\n  ports?: ReadonlyArray<number>;\n  cwd?: string;\n  env?: Readonly<Record<string, string>>;\n}\n\n/** Create an Eve beta SandboxBackend backed by a managed sandbox-sdk provider. */\nexport function createEveSandboxBackend(\n  options: CreateEveSandboxBackendOptions,\n): SandboxBackend<EveSandboxUseOptions, EveSandboxUseOptions> {\n  const managed = requireManaged(options.provider);\n  const prewarmed = new Set<string>();\n\n  return {\n    name: `sandbox-sdk-${options.provider.id}`,\n    async prewarm(input) {\n      if (prewarmed.has(input.templateKey)) return { reused: true };\n      input.log?.(`Preparing ${options.provider.id} sandbox template ${input.templateKey}`);\n      const template = await managed.create({\n        sessionId: templateSessionId(input.templateKey),\n        identity: input.templateKey,\n        cwd: options.cwd,\n        env: options.env,\n        ports: options.ports,\n        onFirstCreate: async (sandbox) => {\n          await Promise.all(\n            input.seedFiles.map((file) =>\n              sandbox.files.write(resolveSandboxPath(sandbox.cwd, file.path), file.content),\n            ),\n          );\n          if (input.bootstrap) {\n            const templateView: ManagedSandboxSession = {\n              id: templateSessionId(input.templateKey),\n              sandbox,\n              defaultWorkingDirectory: sandbox.cwd,\n              ports: options.ports ?? [],\n              getPortUrl: async () => {\n                throw new Error(\"Template ports are not available during prewarm\");\n              },\n              stop: async () => {},\n              resume: async () => {},\n              destroy: async () => {},\n            };\n            await input.bootstrap({ use: createUseFn(templateView) });\n          }\n        },\n      });\n      await template.destroy();\n      prewarmed.add(input.templateKey);\n      return { reused: false };\n    },\n    async create(input) {\n      const reconnectId = readString(input.existingMetadata, \"managedSessionId\");\n      let managedSession: ManagedSandboxSession;\n      if (reconnectId) {\n        managedSession = await managed.resume({ sessionId: reconnectId });\n      } else {\n        managedSession = await managed.create({\n          sessionId: input.sessionKey,\n          identity: input.templateKey ?? undefined,\n          cwd: options.cwd,\n          env: options.env,\n          ports: options.ports,\n        });\n      }\n      return createHandle(managedSession, createUseFn(managedSession), options.provider.id);\n    },\n  };\n}\n\nfunction createHandle(\n  managed: ManagedSandboxSession,\n  useSessionFn: (options?: EveSandboxUseOptions) => Promise<EveSandboxSession>,\n  providerId: string,\n): SandboxBackendHandle<EveSandboxUseOptions> {\n  return {\n    session: toEveSession(managed, providerId),\n    useSessionFn,\n    async captureState() {\n      return {\n        backendName: `sandbox-sdk-${providerId}`,\n        sessionKey: managed.id,\n        metadata: { managedSessionId: managed.id, provider: providerId },\n      };\n    },\n    shutdown: () => managed.stop(),\n  };\n}\n\nfunction createUseFn(managed: ManagedSandboxSession) {\n  const session = toEveSession(managed, managed.sandbox.provider);\n  return async (options?: EveSandboxUseOptions): Promise<EveSandboxSession> => {\n    if (options?.networkPolicy !== undefined) {\n      if (!managed.setNetworkPolicy) throw unsupportedNetwork(managed.sandbox.provider);\n      await managed.setNetworkPolicy(toCoreNetworkPolicy(options.networkPolicy));\n    }\n    return session;\n  };\n}\n\nfunction toEveSession(managed: ManagedSandboxSession, providerId: string): EveSandboxSession {\n  const ai = toAISandboxSession(managed.sandbox);\n  return {\n    run: ai.run,\n    spawn: ai.spawn,\n    readFile: ai.readFile,\n    readBinaryFile: ai.readBinaryFile,\n    readTextFile: ai.readTextFile,\n    writeFile: ai.writeFile,\n    writeBinaryFile: ai.writeBinaryFile,\n    writeTextFile: ai.writeTextFile,\n    id: managed.id,\n    resolvePath: (path) => resolveSandboxPath(managed.defaultWorkingDirectory, path),\n    async removePath({ path, force }) {\n      try {\n        await managed.sandbox.files.remove(\n          resolveSandboxPath(managed.defaultWorkingDirectory, path),\n        );\n      } catch (error) {\n        if (force && isSandboxError(error) && error.code === \"not_found\") return;\n        throw error;\n      }\n    },\n    async setNetworkPolicy(policy) {\n      if (!managed.setNetworkPolicy) throw unsupportedNetwork(providerId);\n      await managed.setNetworkPolicy(toCoreNetworkPolicy(policy));\n    },\n  };\n}\n\nfunction toCoreNetworkPolicy(policy: EveNetworkPolicy): SandboxNetworkPolicy {\n  if (policy === \"allow-all\") return { mode: \"allow-all\" };\n  if (policy === \"deny-all\") return { mode: \"deny-all\" };\n  return { mode: \"native\", value: policy };\n}\n\nfunction resolveSandboxPath(cwd: string, path: string): string {\n  if (path.includes(\"\\0\") || path.split(\"/\").includes(\"..\")) {\n    throw new SandboxError({\n      code: \"invalid_input\",\n      provider: \"eve\",\n      operation: \"resolvePath\",\n      message: `Invalid sandbox path: ${path}`,\n    });\n  }\n  return path.startsWith(\"/\") ? path : `${cwd.replace(/\\/$/, \"\")}/${path}`;\n}\n\nfunction templateSessionId(templateKey: string): string {\n  return `eve-template-${templateKey}`;\n}\n\nfunction readString(record: Record<string, unknown> | undefined, key: string): string | undefined {\n  const value = record?.[key];\n  return typeof value === \"string\" ? value : undefined;\n}\n\nfunction unsupportedNetwork(provider: string): SandboxError {\n  return new SandboxError({\n    code: \"unsupported\",\n    provider,\n    operation: \"network.policy\",\n    message: `Provider ${provider} does not support network-policy mutation`,\n  });\n}\n\nfunction requireManaged(provider: SandboxProvider<unknown>): ManagedSandboxProvider {\n  if (!provider.managed) {\n    throw new SandboxError({\n      code: \"unsupported\",\n      provider: provider.id,\n      operation: \"eve.createBackend\",\n      message: `Provider ${provider.id} does not implement managed sandbox sessions`,\n    });\n  }\n  return provider.managed;\n}\n\nexport type { SandboxBackend, SandboxBackendHandle, EveSandboxSession };\n"],"mappings":"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"}