{"version":3,"file":"webix-client.cjs","names":["WebixHost","baseCmd: CommandData","stored: StoredCommand","stored","fin: CommandFinishedData","normalizePath","files: { name: string; content: Uint8Array; mode?: number }[]","bytes: Uint8Array","meta: SnapshotMetadata"],"sources":["../../src/api-client/webix-client.ts"],"sourcesContent":["/**\n * WebixApiClient — a drop-in replacement for the remote HTTP APIClient that\n * drives a self-contained in-browser x86_64 Linux microVM (webix / Blink WASM)\n * instead of contacting Vercel. It implements the same method surface that\n * Sandbox/Session/Snapshot/Command call, returning the same `{ json }`-wrapped\n * response shapes, so the higher-level classes are unchanged.\n *\n * There is no network: the Blink build is NOSOCK, so ports/domains/dev-servers\n * are unavailable and the corresponding methods throw {@link NotSupportedError}.\n */\nimport { WebixHost, type WebixHostOptions } from \"../webix/host.js\";\nimport { normalizePath } from \"../utils/normalizePath.js\";\nimport type {\n  SessionMetaData,\n  SandboxMetaData,\n  SnapshotMetadata,\n  CommandData,\n  CommandFinishedData,\n  SandboxRouteData,\n} from \"./validators.js\";\n\nexport class NotSupportedError extends Error {\n  name = \"NotSupportedError\";\n}\n\n/** Wrap a value as the `{ json }` Parsed shape the callers consume. */\nfunction parsed<T>(json: T): { json: T; response: Response; text: string } {\n  return { json, response: new Response(null), text: \"\" };\n}\n\nfunction now(): number {\n  return Date.now();\n}\n\ninterface StoredCommand {\n  data: CommandData;\n  finished?: CommandFinishedData;\n  stdout: string;\n  stderr: string;\n}\n\ninterface StoredSnapshot {\n  meta: SnapshotMetadata;\n  blink: ReturnType<WebixHost[\"snapshot\"]>;\n}\n\nconst DEFAULT_CWD = \"/root\";\n\nexport class WebixApiClient {\n  private host: WebixHost;\n  private booted = false;\n  private sessionId = \"sbx_local_\" + Math.random().toString(36).slice(2, 12);\n  private sandboxName: string;\n  private runtime: string;\n  private cwd = DEFAULT_CWD;\n  private status: SessionMetaData[\"status\"] = \"pending\";\n  private commands = new Map<string, StoredCommand>();\n  private snapshots = new Map<string, StoredSnapshot>();\n  private createdAt = now();\n\n  constructor(opts: WebixHostOptions & { name?: string; runtime?: string } = {}) {\n    this.host = new WebixHost(opts);\n    this.sandboxName = opts.name ?? \"local-\" + Math.random().toString(36).slice(2, 8);\n    this.runtime = opts.runtime ?? \"x86_64-linux\";\n  }\n\n  private async ensureBooted(): Promise<void> {\n    if (this.booted) return;\n    await this.host.boot();\n    this.booted = true;\n    this.status = \"running\";\n  }\n\n  private sessionMeta(): SessionMetaData {\n    return {\n      id: this.sessionId,\n      memory: 2048,\n      vcpus: 1,\n      region: \"local\",\n      runtime: this.runtime,\n      timeout: 0,\n      status: this.status,\n      requestedAt: this.createdAt,\n      startedAt: this.createdAt,\n      createdAt: this.createdAt,\n      updatedAt: now(),\n      cwd: this.cwd,\n    };\n  }\n\n  private sandboxMeta(): SandboxMetaData {\n    return {\n      name: this.sandboxName,\n      persistent: false,\n      region: \"local\",\n      vcpus: 1,\n      memory: 2048,\n      runtime: this.runtime,\n      timeout: 0,\n      createdAt: this.createdAt,\n      updatedAt: now(),\n      currentSessionId: this.sessionId,\n      status: this.status,\n      cwd: this.cwd,\n    };\n  }\n\n  // ── Lifecycle ──────────────────────────────────────────────────────────\n\n  async createSandbox(params: { name?: string; runtime?: string; cwd?: string }) {\n    if (params.name) this.sandboxName = params.name;\n    if (params.runtime) this.runtime = params.runtime;\n    await this.ensureBooted();\n    if (params.cwd) this.cwd = params.cwd;\n    return parsed({\n      sandbox: this.sandboxMeta(),\n      session: this.sessionMeta(),\n      routes: [] as SandboxRouteData[],\n    });\n  }\n\n  async getSandbox() {\n    await this.ensureBooted();\n    return parsed({\n      sandbox: this.sandboxMeta(),\n      session: this.sessionMeta(),\n      routes: [] as SandboxRouteData[],\n    });\n  }\n\n  async getSession(_params?: { sessionId?: string; signal?: AbortSignal }) {\n    return parsed({ session: this.sessionMeta(), routes: [] as SandboxRouteData[] });\n  }\n\n  async stopSession(_params?: { sessionId?: string; signal?: AbortSignal }) {\n    this.status = \"stopped\";\n    this.host.stop();\n    return parsed({\n      session: this.sessionMeta(),\n      sandbox: this.sandboxMeta(),\n      snapshot: undefined as SnapshotMetadata | undefined,\n    });\n  }\n\n  async extendTimeout(_params?: {\n    sessionId?: string;\n    duration?: number;\n    signal?: AbortSignal;\n  }) {\n    // No timeout for a local sandbox; the host lives until stopped.\n    return parsed({ session: this.sessionMeta() });\n  }\n\n  // ── Commands ───────────────────────────────────────────────────────────\n\n  /** Resolve and run a command, returning its full result. */\n  private async exec(\n    command: string,\n    args: string[],\n    cwd?: string,\n    env?: Record<string, string>,\n  ): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n    await this.ensureBooted();\n    const wd = cwd ?? this.cwd;\n\n    // Build the argv. To honor cwd/env without shell-injection, run the command\n    // under `env` + a `cd` via busybox `sh -c` ONLY with a safely-quoted line;\n    // otherwise invoke the applet/binary directly.\n    const needsShell = !!cwd || (env && Object.keys(env).length > 0);\n    const fs = this.host.fs;\n    const isAbsolute = command.startsWith(\"/\");\n    const exists = (p: string) => {\n      try {\n        fs.stat(p);\n        return true;\n      } catch {\n        return false;\n      }\n    };\n\n    if (!needsShell) {\n      // Absolute path to a binary in the guest → run it directly.\n      if (isAbsolute && exists(command)) {\n        const bytes = fs.readFile(command);\n        return this.host.runElf({ bytes }, [command.split(\"/\").pop()!, ...args]);\n      }\n      // Otherwise dispatch as a busybox applet.\n      return this.host.runBusybox([command, ...args]);\n    }\n\n    // Shell path: cd + env, with every value single-quote-escaped.\n    const q = (s: string) => \"'\" + s.replace(/'/g, \"'\\\\''\") + \"'\";\n    const envPrefix = env\n      ? Object.entries(env)\n          .map(([k, v]) => `${k}=${q(v)}`)\n          .join(\" \") + \" \"\n      : \"\";\n    const line = `cd ${q(wd)} && ${envPrefix}${[command, ...args].map(q).join(\" \")}`;\n    return this.host.runBusybox([\"sh\", \"-c\", line]);\n  }\n\n  async runCommand(params: {\n    sessionId: string;\n    cwd?: string;\n    command: string;\n    args: string[];\n    env: Record<string, string>;\n    sudo: boolean;\n    wait: true;\n    signal?: AbortSignal;\n  }): Promise<{ command: CommandData; finished: Promise<CommandFinishedData> }>;\n  async runCommand(params: {\n    sessionId: string;\n    cwd?: string;\n    command: string;\n    args: string[];\n    env: Record<string, string>;\n    sudo: boolean;\n    wait?: false;\n    signal?: AbortSignal;\n  }): Promise<{ json: { command: CommandData } }>;\n  async runCommand(params: {\n    sessionId?: string;\n    cwd?: string;\n    command: string;\n    args: string[];\n    env: Record<string, string>;\n    sudo: boolean;\n    wait?: boolean;\n    signal?: AbortSignal;\n  }): Promise<\n    | { command: CommandData; finished: Promise<CommandFinishedData> }\n    | { json: { command: CommandData } }\n  > {\n    const id = \"cmd_\" + Math.random().toString(36).slice(2, 12);\n    const startedAt = now();\n    const baseCmd: CommandData = {\n      id,\n      name: params.command,\n      args: params.args,\n      cwd: params.cwd ?? this.cwd,\n      sessionId: this.sessionId,\n      exitCode: null,\n      startedAt,\n    };\n\n    if (params.wait) {\n      const stored: StoredCommand = { data: baseCmd, stdout: \"\", stderr: \"\" };\n      this.commands.set(id, stored);\n      const finished = (async (): Promise<CommandFinishedData> => {\n        const r = await this.exec(\n          params.command,\n          params.args,\n          params.cwd,\n          params.env,\n        );\n        stored.stdout = r.stdout;\n        stored.stderr = r.stderr;\n        const fin: CommandFinishedData = { ...baseCmd, exitCode: r.exitCode };\n        stored.finished = fin;\n        return fin;\n      })();\n      return { command: baseCmd, finished };\n    }\n\n    // Detached: kick off, store result when done.\n    const stored: StoredCommand = { data: baseCmd, stdout: \"\", stderr: \"\" };\n    this.commands.set(id, stored);\n    void this.exec(params.command, params.args, params.cwd, params.env).then(\n      (r) => {\n        stored.stdout = r.stdout;\n        stored.stderr = r.stderr;\n        stored.finished = { ...baseCmd, exitCode: r.exitCode };\n      },\n    );\n    return { json: { command: baseCmd } };\n  }\n\n  async getCommand(params: {\n    sessionId?: string;\n    cmdId: string;\n    wait?: boolean;\n    signal?: AbortSignal;\n  }) {\n    const stored = this.commands.get(params.cmdId);\n    if (!stored) throw new Error(`webix: unknown command ${params.cmdId}`);\n    if (params.wait && stored.finished) {\n      return parsed({ command: stored.finished });\n    }\n    return parsed({ command: stored.finished ?? stored.data });\n  }\n\n  async killCommand(params: {\n    sessionId?: string;\n    commandId: string;\n    signal?: number;\n    abortSignal?: AbortSignal;\n  }) {\n    // Runs are synchronous to completion; nothing to interrupt mid-run.\n    const stored = this.commands.get(params.commandId);\n    return parsed({ command: stored?.finished ?? stored?.data ?? null });\n  }\n\n  getLogs(params: {\n    sessionId?: string;\n    cmdId: string;\n    signal?: AbortSignal;\n  }): AsyncGenerator<\n    { stream: \"stdout\" | \"stderr\"; data: string },\n    void,\n    void\n  > &\n    Disposable & { close(): void } {\n    const stored = this.commands.get(params.cmdId);\n    const gen = (async function* () {\n      if (!stored) return;\n      // Yield buffered output line-by-line once the run has settled.\n      const emit = function* (\n        text: string,\n        stream: \"stdout\" | \"stderr\",\n      ): Generator<{ stream: \"stdout\" | \"stderr\"; data: string }> {\n        for (const line of text.split(/(?<=\\n)/)) {\n          if (line) yield { stream, data: line };\n        }\n      };\n      yield* emit(stored.stdout, \"stdout\");\n      yield* emit(stored.stderr, \"stderr\");\n    })();\n    return Object.assign(gen, {\n      [Symbol.dispose]() {},\n      close() {},\n    });\n  }\n\n  // ── Filesystem ─────────────────────────────────────────────────────────\n\n  async mkDir(params: {\n    sessionId?: string;\n    path: string;\n    cwd?: string;\n    signal?: AbortSignal;\n  }) {\n    await this.ensureBooted();\n    const full = normalizePath({\n      filePath: params.path,\n      cwd: params.cwd ?? this.cwd,\n      extractDir: \"/\",\n    });\n    this.mkdirp(\"/\" + full);\n    return parsed({});\n  }\n\n  private mkdirp(p: string): void {\n    const fs = this.host.fs;\n    let cur = \"\";\n    for (const seg of p.split(\"/\").filter(Boolean)) {\n      cur += \"/\" + seg;\n      try {\n        fs.mkdir(cur, 0o755);\n      } catch {\n        /* exists */\n      }\n    }\n  }\n\n  getFileWriter(params: {\n    sessionId?: string;\n    extractDir: string;\n    signal?: AbortSignal;\n  }) {\n    const files: { name: string; content: Uint8Array; mode?: number }[] = [];\n    const client = this;\n    const writer = {\n      async addFile(file: {\n        name: string;\n        content: string | Uint8Array;\n        mode?: number;\n      }) {\n        const content =\n          typeof file.content === \"string\"\n            ? new TextEncoder().encode(file.content)\n            : file.content;\n        files.push({ name: file.name, content, mode: file.mode });\n      },\n      end() {\n        /* settled via response promise below */\n      },\n    };\n    const response = (async () => {\n      await client.ensureBooted();\n      const fs = client.host.fs;\n      for (const f of files) {\n        const full = \"/\" + f.name.replace(/^\\/+/, \"\");\n        client.mkdirp(full.replace(/\\/[^/]*$/, \"\") || \"/\");\n        try {\n          fs.unlink(full);\n        } catch {\n          /* new file */\n        }\n        const s = fs.open(full, \"w+\");\n        if (f.content.length) fs.write(s, f.content, 0, f.content.length, 0);\n        fs.close(s);\n        fs.chmod(full, f.mode ?? 0o644);\n      }\n      return parsed({});\n    });\n    return { writer, response: response() };\n  }\n\n  async writeFiles(params: {\n    sessionId?: string;\n    cwd: string;\n    files: { path: string; content: string | Uint8Array; mode?: number }[];\n    extractDir: string;\n    signal?: AbortSignal;\n  }) {\n    const { writer, response } = this.getFileWriter({ extractDir: params.extractDir });\n    for (const file of params.files) {\n      await writer.addFile({\n        name: normalizePath({\n          filePath: file.path,\n          extractDir: params.extractDir,\n          cwd: params.cwd,\n        }),\n        content: file.content,\n        mode: file.mode,\n      });\n    }\n    writer.end();\n    await response;\n    return parsed({});\n  }\n\n  async readFile(params: {\n    sessionId?: string;\n    path: string;\n    cwd?: string;\n    signal?: AbortSignal;\n  }): Promise<ReadableStream | null> {\n    await this.ensureBooted();\n    const full = \"/\" + normalizePath({\n      filePath: params.path,\n      cwd: params.cwd ?? this.cwd,\n      extractDir: \"/\",\n    });\n    let bytes: Uint8Array;\n    try {\n      bytes = this.host.fs.readFile(full);\n    } catch {\n      return null;\n    }\n    return new ReadableStream<Uint8Array>({\n      start(controller) {\n        controller.enqueue(bytes);\n        controller.close();\n      },\n    });\n  }\n\n  // ── Snapshots ──────────────────────────────────────────────────────────\n\n  async createSnapshot(_params?: {\n    sessionId?: string;\n    expiration?: number;\n    signal?: AbortSignal;\n  }) {\n    await this.ensureBooted();\n    const blink = this.host.snapshot();\n    const id = \"snap_\" + Math.random().toString(36).slice(2, 12);\n    const meta: SnapshotMetadata = {\n      id,\n      sourceSessionId: this.sessionId,\n      region: \"local\",\n      status: \"created\",\n      sizeBytes: blink.memory.byteLength,\n      createdAt: now(),\n      updatedAt: now(),\n    };\n    this.snapshots.set(id, { meta, blink });\n    this.status = \"running\";\n    return parsed({ snapshot: meta, session: this.sessionMeta() });\n  }\n\n  async getSnapshot(params: { snapshotId: string; signal?: AbortSignal }) {\n    const s = this.snapshots.get(params.snapshotId);\n    if (!s) throw new Error(`webix: unknown snapshot ${params.snapshotId}`);\n    return parsed({ snapshot: s.meta });\n  }\n\n  async deleteSnapshot(params: { snapshotId: string; signal?: AbortSignal }) {\n    const s = this.snapshots.get(params.snapshotId);\n    if (!s) throw new Error(`webix: unknown snapshot ${params.snapshotId}`);\n    s.meta.status = \"deleted\";\n    this.snapshots.delete(params.snapshotId);\n    return parsed({ snapshot: s.meta });\n  }\n\n  async listSnapshots() {\n    return parsed({\n      snapshots: [...this.snapshots.values()].map((s) => s.meta),\n      pagination: { count: this.snapshots.size, next: null },\n    });\n  }\n\n  async getSnapshotTree() {\n    return parsed({\n      snapshots: [],\n      pagination: { count: 0, next: null },\n    });\n  }\n\n  /** Restore a previously captured snapshot into the live host. */\n  async restoreSnapshot(snapshotId: string): Promise<void> {\n    await this.ensureBooted();\n    const s = this.snapshots.get(snapshotId);\n    if (!s) throw new Error(`webix: unknown snapshot ${snapshotId}`);\n    this.host.restore(s.blink);\n  }\n\n  // ── Display + input (in-browser framebuffer device) ────────────────────\n\n  /** Attach a canvas to the guest framebuffer (rAF blit + input forwarding). */\n  async attachDisplay(canvas: unknown, opts?: { fpsCap?: number }) {\n    await this.ensureBooted();\n    return this.host.attachDisplay(canvas, opts);\n  }\n\n  /** Push one input event (key/mouse) into the guest input device. */\n  async pushInput(evt: {\n    type: \"key\" | \"motion\" | \"button\";\n    code?: number;\n    button?: number;\n    x?: number;\n    y?: number;\n    down?: number;\n    value?: number;\n  }): Promise<boolean> {\n    await this.ensureBooted();\n    return this.host.pushInput(evt);\n  }\n\n  /** Current framebuffer geometry, or null if no guest registered one. */\n  async displayInfo() {\n    await this.ensureBooted();\n    return this.host.fbInfo();\n  }\n\n  /**\n   * Snapshot the guest framebuffer pixels as a contiguous RGBA Uint8ClampedArray\n   * (assembled page-by-page by the host), or null if no guest registered a\n   * framebuffer. For callers that drive their own blit loop (e.g. a render-once\n   * GUI app) instead of attachDisplay.\n   */\n  async displayPixels() {\n    await this.ensureBooted();\n    return this.host.fbView();\n  }\n\n  /** Capability flags of the running Blink build. */\n  async capabilities() {\n    await this.ensureBooted();\n    return this.host.capabilities;\n  }\n\n  // ── Listing ────────────────────────────────────────────────────────────\n\n  async listSessions() {\n    return parsed({\n      sessions: [this.sessionMeta()],\n      pagination: { count: 1, next: null },\n    });\n  }\n\n  async listSandboxes() {\n    return parsed({\n      sandboxes: [this.sandboxMeta()],\n      pagination: { count: 1, next: null },\n    });\n  }\n\n  async updateSandbox(params: { runtime?: string; cwd?: string }) {\n    if (params.runtime) this.runtime = params.runtime;\n    if (params.cwd) this.cwd = params.cwd;\n    return parsed({ sandbox: this.sandboxMeta(), routes: [] as SandboxRouteData[] });\n  }\n\n  async deleteSandbox() {\n    this.status = \"stopped\";\n    this.host.stop();\n    return parsed({ sandbox: this.sandboxMeta(), routes: [] as SandboxRouteData[] });\n  }\n\n  // ── Networking (unavailable: Blink is NOSOCK) ────────────────────────────\n\n  async updateNetworkPolicy(_params?: {\n    sessionId?: string;\n    networkPolicy?: unknown;\n    signal?: AbortSignal;\n  }): Promise<{ json: { session: SessionMetaData } }> {\n    throw new NotSupportedError(\n      \"Network policies are unavailable: the in-browser sandbox has no networking (Blink build is NOSOCK).\",\n    );\n  }\n}\n"],"mappings":"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"}