agentkernel 0.14.0 → 0.15.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.
- package/dist/index.cjs +162 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +78 -1
- package/dist/index.d.ts +78 -1
- package/dist/index.js +162 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -547,6 +547,13 @@ var AgentKernel = class {
|
|
|
547
547
|
async getSandbox(name) {
|
|
548
548
|
return this.request("GET", `/sandboxes/${encodeURIComponent(name)}`);
|
|
549
549
|
}
|
|
550
|
+
/** Get info about a sandbox by UUID. */
|
|
551
|
+
async getSandboxByUuid(uuid) {
|
|
552
|
+
return this.request(
|
|
553
|
+
"GET",
|
|
554
|
+
`/sandboxes/by-uuid/${encodeURIComponent(uuid)}`
|
|
555
|
+
);
|
|
556
|
+
}
|
|
550
557
|
/** Remove a sandbox. */
|
|
551
558
|
async removeSandbox(name) {
|
|
552
559
|
await this.request("DELETE", `/sandboxes/${encodeURIComponent(name)}`);
|
|
@@ -647,6 +654,161 @@ var AgentKernel = class {
|
|
|
647
654
|
`/sandboxes/${encodeURIComponent(name)}/exec/detached`
|
|
648
655
|
);
|
|
649
656
|
}
|
|
657
|
+
/** List all orchestrations. */
|
|
658
|
+
async listOrchestrations() {
|
|
659
|
+
return this.request("GET", "/orchestrations");
|
|
660
|
+
}
|
|
661
|
+
/** Create a new orchestration. */
|
|
662
|
+
async createOrchestration(payload) {
|
|
663
|
+
return this.request("POST", "/orchestrations", payload);
|
|
664
|
+
}
|
|
665
|
+
/** Get info about an orchestration by identifier. */
|
|
666
|
+
async getOrchestration(id) {
|
|
667
|
+
return this.request(
|
|
668
|
+
"GET",
|
|
669
|
+
`/orchestrations/${encodeURIComponent(id)}`
|
|
670
|
+
);
|
|
671
|
+
}
|
|
672
|
+
/** Raise an external event for an orchestration. */
|
|
673
|
+
async signalOrchestration(id, payload) {
|
|
674
|
+
return this.request(
|
|
675
|
+
"POST",
|
|
676
|
+
`/orchestrations/${encodeURIComponent(id)}/events`,
|
|
677
|
+
payload
|
|
678
|
+
);
|
|
679
|
+
}
|
|
680
|
+
/** Terminate an orchestration. */
|
|
681
|
+
async terminateOrchestration(id, payload) {
|
|
682
|
+
return this.request(
|
|
683
|
+
"POST",
|
|
684
|
+
`/orchestrations/${encodeURIComponent(id)}/terminate`,
|
|
685
|
+
payload ?? {}
|
|
686
|
+
);
|
|
687
|
+
}
|
|
688
|
+
/** List orchestration definitions. */
|
|
689
|
+
async listOrchestrationDefinitions() {
|
|
690
|
+
return this.request(
|
|
691
|
+
"GET",
|
|
692
|
+
"/orchestrations/definitions"
|
|
693
|
+
);
|
|
694
|
+
}
|
|
695
|
+
/** Register or update an orchestration definition. */
|
|
696
|
+
async upsertOrchestrationDefinition(payload) {
|
|
697
|
+
return this.request(
|
|
698
|
+
"POST",
|
|
699
|
+
"/orchestrations/definitions",
|
|
700
|
+
payload
|
|
701
|
+
);
|
|
702
|
+
}
|
|
703
|
+
/** Get an orchestration definition by name. */
|
|
704
|
+
async getOrchestrationDefinition(name) {
|
|
705
|
+
return this.request(
|
|
706
|
+
"GET",
|
|
707
|
+
`/orchestrations/definitions/${encodeURIComponent(name)}`
|
|
708
|
+
);
|
|
709
|
+
}
|
|
710
|
+
/** Delete an orchestration definition by name. */
|
|
711
|
+
async deleteOrchestrationDefinition(name) {
|
|
712
|
+
return this.request(
|
|
713
|
+
"DELETE",
|
|
714
|
+
`/orchestrations/definitions/${encodeURIComponent(name)}`
|
|
715
|
+
);
|
|
716
|
+
}
|
|
717
|
+
/** List all objects. */
|
|
718
|
+
async listObjects() {
|
|
719
|
+
return this.request("GET", "/objects");
|
|
720
|
+
}
|
|
721
|
+
/** Create a new object. */
|
|
722
|
+
async createObject(payload) {
|
|
723
|
+
return this.request("POST", "/objects", payload);
|
|
724
|
+
}
|
|
725
|
+
/** Get an object by identifier. */
|
|
726
|
+
async getObject(id) {
|
|
727
|
+
return this.request(
|
|
728
|
+
"GET",
|
|
729
|
+
`/objects/${encodeURIComponent(id)}`
|
|
730
|
+
);
|
|
731
|
+
}
|
|
732
|
+
/** Call a method on a durable object (auto-creates/wakes if needed). */
|
|
733
|
+
async callObject(className, objectId, method, args) {
|
|
734
|
+
const resp = await this.request(
|
|
735
|
+
"POST",
|
|
736
|
+
`/objects/${encodeURIComponent(className)}/${encodeURIComponent(objectId)}/call/${encodeURIComponent(method)}`,
|
|
737
|
+
args ?? {}
|
|
738
|
+
);
|
|
739
|
+
return resp;
|
|
740
|
+
}
|
|
741
|
+
/** Delete a durable object by identifier. */
|
|
742
|
+
async deleteObject(id) {
|
|
743
|
+
return this.request("DELETE", `/objects/${encodeURIComponent(id)}`);
|
|
744
|
+
}
|
|
745
|
+
/** Partially update a durable object (storage and/or status). */
|
|
746
|
+
async patchObject(id, payload) {
|
|
747
|
+
return this.request(
|
|
748
|
+
"PATCH",
|
|
749
|
+
`/objects/${encodeURIComponent(id)}`,
|
|
750
|
+
payload
|
|
751
|
+
);
|
|
752
|
+
}
|
|
753
|
+
/** List all schedules. */
|
|
754
|
+
async listSchedules() {
|
|
755
|
+
return this.request("GET", "/schedules");
|
|
756
|
+
}
|
|
757
|
+
/** Create a new schedule. */
|
|
758
|
+
async createSchedule(payload) {
|
|
759
|
+
return this.request("POST", "/schedules", payload);
|
|
760
|
+
}
|
|
761
|
+
/** Get a schedule by identifier. */
|
|
762
|
+
async getSchedule(id) {
|
|
763
|
+
return this.request(
|
|
764
|
+
"GET",
|
|
765
|
+
`/schedules/${encodeURIComponent(id)}`
|
|
766
|
+
);
|
|
767
|
+
}
|
|
768
|
+
/** Delete a schedule by identifier. */
|
|
769
|
+
async deleteSchedule(id) {
|
|
770
|
+
return this.request("DELETE", `/schedules/${encodeURIComponent(id)}`);
|
|
771
|
+
}
|
|
772
|
+
/** List all durable stores. */
|
|
773
|
+
async listStores() {
|
|
774
|
+
return this.request("GET", "/stores");
|
|
775
|
+
}
|
|
776
|
+
/** Create a durable store. */
|
|
777
|
+
async createStore(payload) {
|
|
778
|
+
return this.request("POST", "/stores", payload);
|
|
779
|
+
}
|
|
780
|
+
/** Get a durable store by identifier. */
|
|
781
|
+
async getStore(id) {
|
|
782
|
+
return this.request("GET", `/stores/${encodeURIComponent(id)}`);
|
|
783
|
+
}
|
|
784
|
+
/** Delete a durable store by identifier. */
|
|
785
|
+
async deleteStore(id) {
|
|
786
|
+
return this.request("DELETE", `/stores/${encodeURIComponent(id)}`);
|
|
787
|
+
}
|
|
788
|
+
/** Execute a read query against a durable store. */
|
|
789
|
+
async queryStore(id, payload) {
|
|
790
|
+
return this.request(
|
|
791
|
+
"POST",
|
|
792
|
+
`/stores/${encodeURIComponent(id)}/query`,
|
|
793
|
+
payload
|
|
794
|
+
);
|
|
795
|
+
}
|
|
796
|
+
/** Execute a write statement against a durable store. */
|
|
797
|
+
async executeStore(id, payload) {
|
|
798
|
+
return this.request(
|
|
799
|
+
"POST",
|
|
800
|
+
`/stores/${encodeURIComponent(id)}/execute`,
|
|
801
|
+
payload
|
|
802
|
+
);
|
|
803
|
+
}
|
|
804
|
+
/** Execute a command against a durable store (Redis-style engines). */
|
|
805
|
+
async commandStore(id, payload) {
|
|
806
|
+
return this.request(
|
|
807
|
+
"POST",
|
|
808
|
+
`/stores/${encodeURIComponent(id)}/command`,
|
|
809
|
+
payload
|
|
810
|
+
);
|
|
811
|
+
}
|
|
650
812
|
/**
|
|
651
813
|
* Create a sandbox session with automatic cleanup.
|
|
652
814
|
*
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/errors.ts","../src/browser.ts","../src/sandbox.ts","../src/sse.ts","../src/client.ts"],"sourcesContent":["export { AgentKernel } from \"./client.js\";\nexport { BrowserSession, BROWSER_SETUP_CMD } from \"./browser.js\";\nexport { SandboxSession } from \"./sandbox.js\";\nexport {\n AgentKernelError,\n AuthError,\n NotFoundError,\n ValidationError,\n ServerError,\n NetworkError,\n StreamError,\n} from \"./errors.js\";\nexport type {\n AgentKernelOptions,\n AriaSnapshot,\n BatchFileWriteResponse,\n BrowserEvent,\n CreateSandboxOptions,\n DetachedCommand,\n DetachedLogsResponse,\n DetachedStatus,\n ExecOptions,\n ExtendTtlOptions,\n ExtendTtlResponse,\n PageLink,\n PageResult,\n RunOptions,\n RunOutput,\n SandboxInfo,\n SnapshotMeta,\n StreamEvent,\n StreamEventType,\n SecurityProfile,\n SandboxStatus,\n TakeSnapshotOptions,\n ApiResponse,\n} from \"./types.js\";\n","import type { AgentKernelOptions } from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"http://localhost:18888\";\nconst DEFAULT_TIMEOUT = 30_000;\n\n/** Resolve configuration from constructor args, env vars, and defaults. */\nexport function resolveConfig(opts?: AgentKernelOptions) {\n const baseUrl =\n opts?.baseUrl ??\n process.env.AGENTKERNEL_BASE_URL ??\n DEFAULT_BASE_URL;\n\n const apiKey =\n opts?.apiKey ??\n process.env.AGENTKERNEL_API_KEY ??\n undefined;\n\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n\n return {\n baseUrl: baseUrl.replace(/\\/+$/, \"\"),\n apiKey,\n timeout,\n };\n}\n","/** Base error for all agentkernel SDK errors. */\nexport class AgentKernelError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AgentKernelError\";\n }\n}\n\n/** 401 Unauthorized. */\nexport class AuthError extends AgentKernelError {\n readonly status = 401;\n constructor(message = \"Unauthorized\") {\n super(message);\n this.name = \"AuthError\";\n }\n}\n\n/** 404 Not Found. */\nexport class NotFoundError extends AgentKernelError {\n readonly status = 404;\n constructor(message = \"Not found\") {\n super(message);\n this.name = \"NotFoundError\";\n }\n}\n\n/** 400 Bad Request. */\nexport class ValidationError extends AgentKernelError {\n readonly status = 400;\n constructor(message = \"Bad request\") {\n super(message);\n this.name = \"ValidationError\";\n }\n}\n\n/** 500 Internal Server Error. */\nexport class ServerError extends AgentKernelError {\n readonly status = 500;\n constructor(message = \"Internal server error\") {\n super(message);\n this.name = \"ServerError\";\n }\n}\n\n/** Network / connection error. */\nexport class NetworkError extends AgentKernelError {\n constructor(message = \"Network error\") {\n super(message);\n this.name = \"NetworkError\";\n }\n}\n\n/** SSE streaming error. */\nexport class StreamError extends AgentKernelError {\n constructor(message = \"Stream error\") {\n super(message);\n this.name = \"StreamError\";\n }\n}\n\n/** Map an HTTP status code + body to the appropriate error. */\nexport function errorFromStatus(status: number, body: string): AgentKernelError {\n let message: string;\n try {\n const parsed = JSON.parse(body);\n message = parsed.error ?? body;\n } catch {\n message = body;\n }\n\n switch (status) {\n case 400:\n return new ValidationError(message);\n case 401:\n return new AuthError(message);\n case 404:\n return new NotFoundError(message);\n default:\n return new ServerError(message);\n }\n}\n","/**\n * Browser session for orchestrating headless browsers in sandboxes.\n *\n * Each method generates a self-contained Python/Playwright script,\n * runs it inside the sandbox, and parses the JSON result.\n */\n\nimport type { AriaSnapshot, PageResult, RunOutput } from \"./types.js\";\n\ntype RunInSandboxFn = (\n name: string,\n command: string[],\n) => Promise<RunOutput>;\ntype RemoveSandboxFn = (name: string) => Promise<void>;\n\nconst GOTO_SCRIPT = `\nimport asyncio, json, sys\nfrom playwright.async_api import async_playwright\nasync def main():\n url = sys.argv[1]\n async with async_playwright() as p:\n b = await p.chromium.launch()\n page = await b.new_page()\n await page.goto(url, timeout=30000)\n title = await page.title()\n url_final = page.url\n text = await page.evaluate(\"() => document.body.innerText.slice(0, 8000)\")\n links = await page.evaluate('''() =>\n Array.from(document.querySelectorAll('a[href]'))\n .slice(0, 50)\n .map(a => ({text: a.textContent.trim(), href: a.href}))\n .filter(l => l.href.startsWith(\"http\"))\n ''')\n print(json.dumps({\"title\": title, \"url\": url_final, \"text\": text, \"links\": links}))\n await b.close()\nasyncio.run(main())\n`;\n\nconst SCREENSHOT_SCRIPT = `\nimport asyncio, base64, sys\nfrom playwright.async_api import async_playwright\nasync def main():\n url = sys.argv[1]\n async with async_playwright() as p:\n b = await p.chromium.launch()\n page = await b.new_page()\n await page.goto(url, timeout=30000)\n data = await page.screenshot()\n print(base64.b64encode(data).decode())\n await b.close()\nasyncio.run(main())\n`;\n\nconst EVALUATE_SCRIPT = `\nimport asyncio, json, sys\nfrom playwright.async_api import async_playwright\nasync def main():\n url = sys.argv[1]\n expr = sys.argv[2]\n async with async_playwright() as p:\n b = await p.chromium.launch()\n page = await b.new_page()\n await page.goto(url, timeout=30000)\n result = await page.evaluate(expr)\n print(json.dumps(result))\n await b.close()\nasyncio.run(main())\n`;\n\n/** Command to install Playwright + Chromium inside the sandbox. */\nexport const BROWSER_SETUP_CMD = [\n \"sh\",\n \"-c\",\n \"pip install -q playwright && playwright install --with-deps chromium\",\n];\n\n// --- v2 scripts ---\n\nconst BROWSER_HEALTH_SCRIPT = `\nimport json, urllib.request, sys\nport = sys.argv[1] if len(sys.argv) > 1 else \"9222\"\ntry:\n req = urllib.request.urlopen(f\"http://127.0.0.1:{port}/health\", timeout=5)\n print(req.read().decode())\nexcept Exception as e:\n print(json.dumps({\"status\": \"down\", \"error\": str(e)}))\n sys.exit(1)\n`;\n\nconst BROWSER_REQUEST_SCRIPT = `\nimport json, urllib.request, sys\nport = sys.argv[1] if len(sys.argv) > 1 else \"9222\"\nmethod = sys.argv[2] if len(sys.argv) > 2 else \"GET\"\npath = sys.argv[3] if len(sys.argv) > 3 else \"/health\"\nbody_str = sys.argv[4] if len(sys.argv) > 4 else None\nurl = f\"http://127.0.0.1:{port}{path}\"\ndata = body_str.encode() if body_str else None\nreq = urllib.request.Request(url, data=data, method=method)\nif data:\n req.add_header(\"Content-Type\", \"application/json\")\ntry:\n resp = urllib.request.urlopen(req, timeout=60)\n print(resp.read().decode())\nexcept urllib.error.HTTPError as e:\n print(e.read().decode())\n sys.exit(1)\nexcept Exception as e:\n print(json.dumps({\"error\": str(e)}))\n sys.exit(1)\n`;\n\n/**\n * A sandboxed headless browser controlled from outside.\n *\n * The browser (Chromium via Playwright) runs inside an agentkernel sandbox.\n * You call high-level methods; the SDK generates and runs scripts internally.\n *\n * @example\n * ```ts\n * await using browser = await client.browser(\"my-browser\");\n * const page = await browser.goto(\"https://example.com\");\n * console.log(page.title, page.links);\n * ```\n */\nexport class BrowserSession implements AsyncDisposable {\n readonly name: string;\n private _removed = false;\n private _lastUrl: string | null = null;\n private readonly _run: RunInSandboxFn;\n private readonly _remove: RemoveSandboxFn;\n\n /** @internal */\n constructor(name: string, runFn: RunInSandboxFn, removeFn: RemoveSandboxFn) {\n this.name = name;\n this._run = runFn;\n this._remove = removeFn;\n }\n\n /** Navigate to a URL and return page data (title, text, links). */\n async goto(url: string): Promise<PageResult> {\n const result = await this._run(this.name, [\n \"python3\",\n \"-c\",\n GOTO_SCRIPT,\n url,\n ]);\n this._lastUrl = url;\n return JSON.parse(result.output) as PageResult;\n }\n\n /** Take a PNG screenshot. Returns a base64-encoded string. */\n async screenshot(url?: string): Promise<string> {\n const target = url ?? this._lastUrl;\n if (!target) {\n throw new Error(\"No URL specified and no previous goto() call\");\n }\n const result = await this._run(this.name, [\n \"python3\",\n \"-c\",\n SCREENSHOT_SCRIPT,\n target,\n ]);\n return result.output.trim();\n }\n\n /** Run a JavaScript expression on a page and return the result. */\n async evaluate(expression: string, url?: string): Promise<unknown> {\n const target = url ?? this._lastUrl;\n if (!target) {\n throw new Error(\"No URL specified and no previous goto() call\");\n }\n const result = await this._run(this.name, [\n \"python3\",\n \"-c\",\n EVALUATE_SCRIPT,\n target,\n expression,\n ]);\n return JSON.parse(result.output);\n }\n\n // --- v2 methods (ARIA snapshots, persistent pages, ref-based interaction) ---\n\n /** Navigate to a URL and return an ARIA snapshot. */\n async open(url: string, page = \"default\"): Promise<AriaSnapshot> {\n await this._ensureServer();\n const result = await this._browserRequest(\n \"POST\",\n `/pages/${page}/goto`,\n JSON.stringify({ url }),\n );\n return JSON.parse(result.output) as AriaSnapshot;\n }\n\n /** Get the current ARIA snapshot without navigating. */\n async snapshot(page = \"default\"): Promise<AriaSnapshot> {\n await this._ensureServer();\n const result = await this._browserRequest(\n \"GET\",\n `/pages/${page}/snapshot`,\n );\n return JSON.parse(result.output) as AriaSnapshot;\n }\n\n /** Click an element by ref ID or CSS selector. Returns new snapshot. */\n async click(opts: { ref?: string; selector?: string; page?: string }): Promise<AriaSnapshot> {\n const page = opts.page ?? \"default\";\n await this._ensureServer();\n const body: Record<string, string> = {};\n if (opts.ref) body.ref = opts.ref;\n if (opts.selector) body.selector = opts.selector;\n const result = await this._browserRequest(\n \"POST\",\n `/pages/${page}/click`,\n JSON.stringify(body),\n );\n const data = JSON.parse(result.output);\n if (data.error) throw new Error(data.error);\n return data as AriaSnapshot;\n }\n\n /** Fill an input by ref ID or CSS selector. Returns new snapshot. */\n async fill(\n value: string,\n opts: { ref?: string; selector?: string; page?: string },\n ): Promise<AriaSnapshot> {\n const page = opts.page ?? \"default\";\n await this._ensureServer();\n const body: Record<string, string> = { value };\n if (opts.ref) body.ref = opts.ref;\n if (opts.selector) body.selector = opts.selector;\n const result = await this._browserRequest(\n \"POST\",\n `/pages/${page}/fill`,\n JSON.stringify(body),\n );\n const data = JSON.parse(result.output);\n if (data.error) throw new Error(data.error);\n return data as AriaSnapshot;\n }\n\n /** Close a named page. */\n async closePage(page = \"default\"): Promise<void> {\n await this._ensureServer();\n await this._browserRequest(\"DELETE\", `/pages/${page}`);\n }\n\n /** List active page names. */\n async listPages(): Promise<string[]> {\n await this._ensureServer();\n const result = await this._browserRequest(\"GET\", \"/pages\");\n const data = JSON.parse(result.output);\n return data.pages ?? [];\n }\n\n private _serverStarted = false;\n\n private async _ensureServer(): Promise<void> {\n if (this._serverStarted) return;\n // Health check\n try {\n const result = await this._run(this.name, [\n \"python3\", \"-c\", BROWSER_HEALTH_SCRIPT, \"9222\",\n ]);\n if (result.output.includes('\"status\":\"ok\"') || result.output.includes('\"status\": \"ok\"')) {\n this._serverStarted = true;\n return;\n }\n } catch {\n // Server not running, start it\n }\n // Start would require the full server script + ARIA JS — for SDK use,\n // the server is expected to already be running (started via browser_create or MCP)\n throw new Error(\n \"Browser server not running. Use browser_create to set up the sandbox, \" +\n \"or use the MCP browser_open tool which auto-starts the server.\",\n );\n }\n\n private async _browserRequest(\n method: string,\n path: string,\n body?: string,\n ): Promise<RunOutput> {\n const cmd = [\"python3\", \"-c\", BROWSER_REQUEST_SCRIPT, \"9222\", method, path];\n if (body) cmd.push(body);\n return this._run(this.name, cmd);\n }\n\n // --- v1 methods (backward compatible) ---\n\n /** Remove the sandbox. Idempotent. */\n async remove(): Promise<void> {\n if (this._removed) return;\n this._removed = true;\n await this._remove(this.name);\n }\n\n /** Auto-cleanup for `await using`. */\n async [Symbol.asyncDispose](): Promise<void> {\n await this.remove();\n }\n}\n","import type {\n BatchFileWriteResponse,\n ExecOptions,\n RunOutput,\n SandboxInfo,\n} from \"./types.js\";\n\ntype ExecFn = (\n name: string,\n command: string[],\n opts?: ExecOptions,\n) => Promise<RunOutput>;\ntype RemoveFn = (name: string) => Promise<void>;\ntype GetFn = (name: string) => Promise<SandboxInfo>;\ntype WriteFilesFn = (\n name: string,\n files: Record<string, string>,\n) => Promise<BatchFileWriteResponse>;\n\n/**\n * A sandbox session that auto-removes the sandbox on dispose.\n *\n * Supports both explicit cleanup via remove() and automatic cleanup via\n * Symbol.asyncDispose (TS 5.2+ `await using`).\n *\n * @example\n * ```ts\n * await using sb = await client.sandbox(\"test\");\n * await sb.exec([\"echo\", \"hello\"]);\n * // sandbox auto-removed when scope exits\n * ```\n */\nexport class SandboxSession implements AsyncDisposable {\n readonly name: string;\n private _removed = false;\n private readonly _execInSandbox: ExecFn;\n private readonly _removeSandbox: RemoveFn;\n private readonly _getSandbox: GetFn;\n private readonly _writeFiles: WriteFilesFn;\n\n /** @internal */\n constructor(\n name: string,\n execInSandbox: ExecFn,\n removeSandbox: RemoveFn,\n getSandbox: GetFn,\n writeFiles: WriteFilesFn,\n ) {\n this.name = name;\n this._execInSandbox = execInSandbox;\n this._removeSandbox = removeSandbox;\n this._getSandbox = getSandbox;\n this._writeFiles = writeFiles;\n }\n\n /** Run a command in this sandbox. */\n async run(command: string[], opts?: ExecOptions): Promise<RunOutput> {\n return this._execInSandbox(this.name, command, opts);\n }\n\n /** Get sandbox info. */\n async info(): Promise<SandboxInfo> {\n return this._getSandbox(this.name);\n }\n\n /** Write multiple files in one request. */\n async writeFiles(\n files: Record<string, string>,\n ): Promise<BatchFileWriteResponse> {\n return this._writeFiles(this.name, files);\n }\n\n /** Remove the sandbox. Idempotent. */\n async remove(): Promise<void> {\n if (this._removed) return;\n this._removed = true;\n await this._removeSandbox(this.name);\n }\n\n /** Auto-cleanup for `await using`. */\n async [Symbol.asyncDispose](): Promise<void> {\n await this.remove();\n }\n}\n","import { createParser, type EventSourceMessage } from \"eventsource-parser\";\nimport type { StreamEvent, StreamEventType } from \"./types.js\";\n\nconst KNOWN_EVENTS = new Set<string>([\"started\", \"progress\", \"output\", \"done\", \"error\"]);\n\n/** Shared mutable state between the pump and the generator. */\ninterface PumpState {\n events: StreamEvent[];\n resolve: (() => void) | null;\n done: boolean;\n}\n\nfunction pushEvent(state: PumpState, event: StreamEvent): void {\n state.events.push(event);\n if (state.resolve) {\n const cb = state.resolve;\n state.resolve = null;\n cb();\n }\n}\n\n/**\n * Parse an SSE response body into an async generator of StreamEvents.\n *\n * Consumes a ReadableStream<Uint8Array> from fetch() and yields typed events\n * until the stream closes or a \"done\"/\"error\" event is received.\n */\nexport async function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<StreamEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n const state: PumpState = { events: [], resolve: null, done: false };\n\n const parser = createParser({\n onEvent(event: EventSourceMessage) {\n const type = event.event ?? \"message\";\n if (!KNOWN_EVENTS.has(type)) return;\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(event.data);\n } catch {\n data = { raw: event.data };\n }\n\n pushEvent(state, { type: type as StreamEventType, data });\n },\n });\n\n // Read the stream in the background\n const pump = (async () => {\n try {\n for (;;) {\n const result = await reader.read();\n if (result.done) break;\n parser.feed(decoder.decode(result.value, { stream: true }));\n }\n } catch (err) {\n pushEvent(state, {\n type: \"error\",\n data: { message: err instanceof Error ? err.message : String(err) },\n });\n } finally {\n state.done = true;\n if (state.resolve) {\n const cb = state.resolve;\n state.resolve = null;\n cb();\n }\n }\n })();\n\n try {\n for (;;) {\n // Yield all buffered events\n while (state.events.length > 0) {\n const event = state.events.shift()!;\n yield event;\n if (event.type === \"done\" || event.type === \"error\") return;\n }\n\n // If the stream is done and no more events, exit\n if (state.done) return;\n\n // Wait for the next event\n await new Promise<void>((r) => {\n state.resolve = r;\n });\n }\n } finally {\n reader.cancel().catch(() => {});\n await pump.catch(() => {});\n }\n}\n","import { resolveConfig } from \"./config.js\";\nimport {\n AgentKernelError,\n NetworkError,\n errorFromStatus,\n} from \"./errors.js\";\nimport { BrowserSession, BROWSER_SETUP_CMD } from \"./browser.js\";\nimport { SandboxSession } from \"./sandbox.js\";\nimport { parseSSE } from \"./sse.js\";\nimport type {\n AgentKernelOptions,\n ApiResponse,\n BatchCommand,\n BatchFileWriteResponse,\n BatchRunResponse,\n CreateSandboxOptions,\n DetachedCommand,\n DetachedLogsResponse,\n ExecOptions,\n ExtendTtlOptions,\n ExtendTtlResponse,\n FileReadResponse,\n FileWriteOptions,\n RunOptions,\n RunOutput,\n SandboxInfo,\n SnapshotMeta,\n StreamEvent,\n TakeSnapshotOptions,\n} from \"./types.js\";\n\nconst SDK_VERSION = \"0.3.0\";\n\n/**\n * Client for the agentkernel HTTP API.\n *\n * @example\n * ```ts\n * const client = new AgentKernel();\n * const result = await client.run([\"echo\", \"hello\"]);\n * console.log(result.output); // \"hello\\n\"\n * ```\n */\nexport class AgentKernel {\n private readonly baseUrl: string;\n private readonly apiKey: string | undefined;\n private readonly timeout: number;\n\n constructor(opts?: AgentKernelOptions) {\n const config = resolveConfig(opts);\n this.baseUrl = config.baseUrl;\n this.apiKey = config.apiKey;\n this.timeout = config.timeout;\n }\n\n // -- Core API methods --\n\n /** Health check. Returns \"ok\" if the server is running. */\n async health(): Promise<string> {\n const res = await this.request<string>(\"GET\", \"/health\");\n return res;\n }\n\n /** Run a command in a temporary sandbox. */\n async run(command: string[], opts?: RunOptions): Promise<RunOutput> {\n return this.request<RunOutput>(\"POST\", \"/run\", {\n command,\n image: opts?.image,\n profile: opts?.profile,\n fast: opts?.fast ?? true,\n });\n }\n\n /**\n * Run a command with SSE streaming output.\n *\n * @example\n * ```ts\n * for await (const event of client.runStream([\"python3\", \"script.py\"])) {\n * if (event.type === \"output\") process.stdout.write(String(event.data.data));\n * }\n * ```\n */\n async *runStream(\n command: string[],\n opts?: RunOptions,\n ): AsyncGenerator<StreamEvent> {\n const body = JSON.stringify({\n command,\n image: opts?.image,\n profile: opts?.profile,\n fast: opts?.fast ?? true,\n });\n\n const response = await this.fetch(\"/run/stream\", {\n method: \"POST\",\n headers: this.headers(\"application/json\"),\n body,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw errorFromStatus(response.status, text);\n }\n\n if (!response.body) {\n throw new AgentKernelError(\"No response body for SSE stream\");\n }\n\n yield* parseSSE(response.body);\n }\n\n /** List all sandboxes. */\n async listSandboxes(): Promise<SandboxInfo[]> {\n return this.request<SandboxInfo[]>(\"GET\", \"/sandboxes\");\n }\n\n /** Create a new sandbox. */\n async createSandbox(\n name: string,\n opts?: CreateSandboxOptions,\n ): Promise<SandboxInfo> {\n return this.request<SandboxInfo>(\"POST\", \"/sandboxes\", {\n name,\n image: opts?.image,\n vcpus: opts?.vcpus,\n memory_mb: opts?.memory_mb,\n profile: opts?.profile,\n source_url: opts?.source_url,\n source_ref: opts?.source_ref,\n volumes: opts?.volumes,\n secrets: opts?.secrets,\n secret_files: opts?.secret_files,\n });\n }\n\n /** Get info about a sandbox. */\n async getSandbox(name: string): Promise<SandboxInfo> {\n return this.request<SandboxInfo>(\"GET\", `/sandboxes/${encodeURIComponent(name)}`);\n }\n\n /** Remove a sandbox. */\n async removeSandbox(name: string): Promise<void> {\n await this.request<string>(\"DELETE\", `/sandboxes/${encodeURIComponent(name)}`);\n }\n\n /** Run a command in an existing sandbox. */\n async execInSandbox(\n name: string,\n command: string[],\n opts?: ExecOptions,\n ): Promise<RunOutput> {\n return this.request<RunOutput>(\n \"POST\",\n `/sandboxes/${encodeURIComponent(name)}/exec`,\n {\n command,\n env: opts?.env,\n workdir: opts?.workdir,\n sudo: opts?.sudo,\n },\n );\n }\n\n /** Read a file from a sandbox. */\n async readFile(name: string, path: string): Promise<FileReadResponse> {\n return this.request<FileReadResponse>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/files/${path}`,\n );\n }\n\n /** Write a file to a sandbox. */\n async writeFile(\n name: string,\n path: string,\n content: string,\n opts?: FileWriteOptions,\n ): Promise<string> {\n return this.request<string>(\n \"PUT\",\n `/sandboxes/${encodeURIComponent(name)}/files/${path}`,\n { content, encoding: opts?.encoding ?? \"utf8\" },\n );\n }\n\n /** Delete a file from a sandbox. */\n async deleteFile(name: string, path: string): Promise<string> {\n return this.request<string>(\n \"DELETE\",\n `/sandboxes/${encodeURIComponent(name)}/files/${path}`,\n );\n }\n\n /** Get audit log entries for a sandbox. */\n async getSandboxLogs(name: string): Promise<Record<string, unknown>[]> {\n return this.request<Record<string, unknown>[]>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/logs`,\n );\n }\n\n /** Write multiple files to a sandbox in one request. */\n async writeFiles(\n name: string,\n files: Record<string, string>,\n ): Promise<BatchFileWriteResponse> {\n return this.request<BatchFileWriteResponse>(\n \"POST\",\n `/sandboxes/${encodeURIComponent(name)}/files`,\n { files },\n );\n }\n\n /** Run multiple commands in parallel. */\n async batchRun(commands: BatchCommand[]): Promise<BatchRunResponse> {\n return this.request<BatchRunResponse>(\"POST\", \"/batch/run\", { commands });\n }\n\n /** Start a detached (background) command in a sandbox. */\n async execDetached(\n name: string,\n command: string[],\n opts?: ExecOptions,\n ): Promise<DetachedCommand> {\n return this.request<DetachedCommand>(\n \"POST\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detach`,\n {\n command,\n env: opts?.env,\n workdir: opts?.workdir,\n sudo: opts?.sudo,\n },\n );\n }\n\n /** Get the status of a detached command. */\n async detachedStatus(\n name: string,\n cmdId: string,\n ): Promise<DetachedCommand> {\n return this.request<DetachedCommand>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detached/${encodeURIComponent(cmdId)}`,\n );\n }\n\n /** Get logs from a detached command. */\n async detachedLogs(\n name: string,\n cmdId: string,\n stream?: \"stdout\" | \"stderr\",\n ): Promise<DetachedLogsResponse> {\n const query = stream === \"stderr\" ? \"?stream=stderr\" : \"\";\n return this.request<DetachedLogsResponse>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detached/${encodeURIComponent(cmdId)}/logs${query}`,\n );\n }\n\n /** Kill a detached command. */\n async detachedKill(name: string, cmdId: string): Promise<string> {\n return this.request<string>(\n \"DELETE\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detached/${encodeURIComponent(cmdId)}`,\n );\n }\n\n /** List detached commands in a sandbox. */\n async detachedList(name: string): Promise<DetachedCommand[]> {\n return this.request<DetachedCommand[]>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detached`,\n );\n }\n\n /**\n * Create a sandbox session with automatic cleanup.\n *\n * The returned SandboxSession implements AsyncDisposable,\n * so it works with `await using` (TS 5.2+):\n *\n * @example\n * ```ts\n * await using sb = await client.sandbox(\"test\", { image: \"python:3.12-alpine\" });\n * await sb.run([\"pip\", \"install\", \"numpy\"]);\n * // sandbox auto-removed when scope exits\n * ```\n */\n async sandbox(\n name: string,\n opts?: CreateSandboxOptions,\n ): Promise<SandboxSession> {\n await this.createSandbox(name, opts);\n return new SandboxSession(\n name,\n (n, cmd, o) => this.execInSandbox(n, cmd, o),\n (n) => this.removeSandbox(n),\n (n) => this.getSandbox(n),\n (n, f) => this.writeFiles(n, f),\n );\n }\n\n /**\n * Create a sandboxed browser session with automatic cleanup.\n *\n * Creates a sandbox with Chromium pre-installed via Playwright.\n * Use `goto()`, `screenshot()`, and `evaluate()` to interact with web pages.\n *\n * @example\n * ```ts\n * await using browser = await client.browser(\"my-browser\");\n * const page = await browser.goto(\"https://example.com\");\n * console.log(page.title, page.links);\n * // sandbox auto-removed when scope exits\n * ```\n */\n async browser(\n name: string,\n opts?: { memory_mb?: number },\n ): Promise<BrowserSession> {\n await this.createSandbox(name, {\n image: \"python:3.12-slim\",\n memory_mb: opts?.memory_mb ?? 2048,\n profile: \"moderate\",\n });\n await this.execInSandbox(name, BROWSER_SETUP_CMD);\n return new BrowserSession(\n name,\n (n, cmd) => this.execInSandbox(n, cmd),\n (n) => this.removeSandbox(n),\n );\n }\n\n // -- TTL & Snapshot methods --\n\n /** Extend a sandbox's TTL. Returns the new expiry time. */\n async extendTtl(name: string, opts: ExtendTtlOptions): Promise<ExtendTtlResponse> {\n return this.request<ExtendTtlResponse>(\n \"POST\",\n `/sandboxes/${encodeURIComponent(name)}/extend`,\n { by: opts.by },\n );\n }\n\n /** List all snapshots. */\n async listSnapshots(): Promise<SnapshotMeta[]> {\n return this.request<SnapshotMeta[]>(\"GET\", \"/snapshots\");\n }\n\n /** Take a snapshot of a sandbox. */\n async takeSnapshot(opts: TakeSnapshotOptions): Promise<SnapshotMeta> {\n return this.request<SnapshotMeta>(\"POST\", \"/snapshots\", opts);\n }\n\n /** Get info about a snapshot. */\n async getSnapshot(name: string): Promise<SnapshotMeta> {\n return this.request<SnapshotMeta>(\n \"GET\",\n `/snapshots/${encodeURIComponent(name)}`,\n );\n }\n\n /** Delete a snapshot. */\n async deleteSnapshot(name: string): Promise<void> {\n await this.request<string>(\n \"DELETE\",\n `/snapshots/${encodeURIComponent(name)}`,\n );\n }\n\n /** Restore a sandbox from a snapshot. */\n async restoreSnapshot(name: string): Promise<SandboxInfo> {\n return this.request<SandboxInfo>(\n \"POST\",\n `/snapshots/${encodeURIComponent(name)}/restore`,\n );\n }\n\n // -- Internal helpers --\n\n private headers(contentType?: string): Record<string, string> {\n const h: Record<string, string> = {\n \"User-Agent\": `agentkernel-nodejs-sdk/${SDK_VERSION}`,\n };\n if (contentType) h[\"Content-Type\"] = contentType;\n if (this.apiKey) h[\"Authorization\"] = `Bearer ${this.apiKey}`;\n return h;\n }\n\n private async fetch(path: string, init: RequestInit): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n try {\n return await fetch(url, {\n ...init,\n signal: AbortSignal.timeout(this.timeout),\n });\n } catch (err) {\n if (err instanceof DOMException && err.name === \"TimeoutError\") {\n throw new NetworkError(`Request timed out after ${this.timeout}ms`);\n }\n if (err instanceof TypeError) {\n throw new NetworkError(`Failed to connect to ${this.baseUrl}: ${err.message}`);\n }\n throw new NetworkError(\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n ): Promise<T> {\n const init: RequestInit = {\n method,\n headers: this.headers(body ? \"application/json\" : undefined),\n };\n if (body) init.body = JSON.stringify(body);\n\n const response = await this.fetch(path, init);\n\n const text = await response.text();\n if (!response.ok) {\n throw errorFromStatus(response.status, text);\n }\n\n const parsed: ApiResponse<T> = JSON.parse(text);\n if (!parsed.success) {\n throw new AgentKernelError(parsed.error ?? \"Unknown error\");\n }\n return parsed.data as T;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/errors.ts","../src/browser.ts","../src/sandbox.ts","../src/sse.ts","../src/client.ts"],"sourcesContent":["export { AgentKernel } from \"./client.js\";\nexport { BrowserSession, BROWSER_SETUP_CMD } from \"./browser.js\";\nexport { SandboxSession } from \"./sandbox.js\";\nexport {\n AgentKernelError,\n AuthError,\n NotFoundError,\n ValidationError,\n ServerError,\n NetworkError,\n StreamError,\n} from \"./errors.js\";\nexport type {\n AgentKernelOptions,\n AriaSnapshot,\n BatchFileWriteResponse,\n BrowserEvent,\n CreateSandboxOptions,\n CreateObjectRequest,\n CreateOrchestrationRequest,\n CreateScheduleRequest,\n CreateStoreRequest,\n DetachedCommand,\n DetachedLogsResponse,\n DetachedStatus,\n ExecOptions,\n ExtendTtlOptions,\n ExtendTtlResponse,\n DurableObject,\n DurableStore,\n DurableStoreCommandResponse,\n DurableStoreExecuteResponse,\n DurableStoreQueryResponse,\n PageLink,\n PageResult,\n RunOptions,\n RunOutput,\n Orchestration,\n OrchestrationDefinition,\n SandboxInfo,\n SnapshotMeta,\n StreamEvent,\n StreamEventType,\n SecurityProfile,\n SandboxStatus,\n Schedule,\n TakeSnapshotOptions,\n ApiResponse,\n} from \"./types.js\";\n","import type { AgentKernelOptions } from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"http://localhost:18888\";\nconst DEFAULT_TIMEOUT = 30_000;\n\n/** Resolve configuration from constructor args, env vars, and defaults. */\nexport function resolveConfig(opts?: AgentKernelOptions) {\n const baseUrl =\n opts?.baseUrl ??\n process.env.AGENTKERNEL_BASE_URL ??\n DEFAULT_BASE_URL;\n\n const apiKey =\n opts?.apiKey ??\n process.env.AGENTKERNEL_API_KEY ??\n undefined;\n\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n\n return {\n baseUrl: baseUrl.replace(/\\/+$/, \"\"),\n apiKey,\n timeout,\n };\n}\n","/** Base error for all agentkernel SDK errors. */\nexport class AgentKernelError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AgentKernelError\";\n }\n}\n\n/** 401 Unauthorized. */\nexport class AuthError extends AgentKernelError {\n readonly status = 401;\n constructor(message = \"Unauthorized\") {\n super(message);\n this.name = \"AuthError\";\n }\n}\n\n/** 404 Not Found. */\nexport class NotFoundError extends AgentKernelError {\n readonly status = 404;\n constructor(message = \"Not found\") {\n super(message);\n this.name = \"NotFoundError\";\n }\n}\n\n/** 400 Bad Request. */\nexport class ValidationError extends AgentKernelError {\n readonly status = 400;\n constructor(message = \"Bad request\") {\n super(message);\n this.name = \"ValidationError\";\n }\n}\n\n/** 500 Internal Server Error. */\nexport class ServerError extends AgentKernelError {\n readonly status = 500;\n constructor(message = \"Internal server error\") {\n super(message);\n this.name = \"ServerError\";\n }\n}\n\n/** Network / connection error. */\nexport class NetworkError extends AgentKernelError {\n constructor(message = \"Network error\") {\n super(message);\n this.name = \"NetworkError\";\n }\n}\n\n/** SSE streaming error. */\nexport class StreamError extends AgentKernelError {\n constructor(message = \"Stream error\") {\n super(message);\n this.name = \"StreamError\";\n }\n}\n\n/** Map an HTTP status code + body to the appropriate error. */\nexport function errorFromStatus(status: number, body: string): AgentKernelError {\n let message: string;\n try {\n const parsed = JSON.parse(body);\n message = parsed.error ?? body;\n } catch {\n message = body;\n }\n\n switch (status) {\n case 400:\n return new ValidationError(message);\n case 401:\n return new AuthError(message);\n case 404:\n return new NotFoundError(message);\n default:\n return new ServerError(message);\n }\n}\n","/**\n * Browser session for orchestrating headless browsers in sandboxes.\n *\n * Each method generates a self-contained Python/Playwright script,\n * runs it inside the sandbox, and parses the JSON result.\n */\n\nimport type { AriaSnapshot, PageResult, RunOutput } from \"./types.js\";\n\ntype RunInSandboxFn = (\n name: string,\n command: string[],\n) => Promise<RunOutput>;\ntype RemoveSandboxFn = (name: string) => Promise<void>;\n\nconst GOTO_SCRIPT = `\nimport asyncio, json, sys\nfrom playwright.async_api import async_playwright\nasync def main():\n url = sys.argv[1]\n async with async_playwright() as p:\n b = await p.chromium.launch()\n page = await b.new_page()\n await page.goto(url, timeout=30000)\n title = await page.title()\n url_final = page.url\n text = await page.evaluate(\"() => document.body.innerText.slice(0, 8000)\")\n links = await page.evaluate('''() =>\n Array.from(document.querySelectorAll('a[href]'))\n .slice(0, 50)\n .map(a => ({text: a.textContent.trim(), href: a.href}))\n .filter(l => l.href.startsWith(\"http\"))\n ''')\n print(json.dumps({\"title\": title, \"url\": url_final, \"text\": text, \"links\": links}))\n await b.close()\nasyncio.run(main())\n`;\n\nconst SCREENSHOT_SCRIPT = `\nimport asyncio, base64, sys\nfrom playwright.async_api import async_playwright\nasync def main():\n url = sys.argv[1]\n async with async_playwright() as p:\n b = await p.chromium.launch()\n page = await b.new_page()\n await page.goto(url, timeout=30000)\n data = await page.screenshot()\n print(base64.b64encode(data).decode())\n await b.close()\nasyncio.run(main())\n`;\n\nconst EVALUATE_SCRIPT = `\nimport asyncio, json, sys\nfrom playwright.async_api import async_playwright\nasync def main():\n url = sys.argv[1]\n expr = sys.argv[2]\n async with async_playwright() as p:\n b = await p.chromium.launch()\n page = await b.new_page()\n await page.goto(url, timeout=30000)\n result = await page.evaluate(expr)\n print(json.dumps(result))\n await b.close()\nasyncio.run(main())\n`;\n\n/** Command to install Playwright + Chromium inside the sandbox. */\nexport const BROWSER_SETUP_CMD = [\n \"sh\",\n \"-c\",\n \"pip install -q playwright && playwright install --with-deps chromium\",\n];\n\n// --- v2 scripts ---\n\nconst BROWSER_HEALTH_SCRIPT = `\nimport json, urllib.request, sys\nport = sys.argv[1] if len(sys.argv) > 1 else \"9222\"\ntry:\n req = urllib.request.urlopen(f\"http://127.0.0.1:{port}/health\", timeout=5)\n print(req.read().decode())\nexcept Exception as e:\n print(json.dumps({\"status\": \"down\", \"error\": str(e)}))\n sys.exit(1)\n`;\n\nconst BROWSER_REQUEST_SCRIPT = `\nimport json, urllib.request, sys\nport = sys.argv[1] if len(sys.argv) > 1 else \"9222\"\nmethod = sys.argv[2] if len(sys.argv) > 2 else \"GET\"\npath = sys.argv[3] if len(sys.argv) > 3 else \"/health\"\nbody_str = sys.argv[4] if len(sys.argv) > 4 else None\nurl = f\"http://127.0.0.1:{port}{path}\"\ndata = body_str.encode() if body_str else None\nreq = urllib.request.Request(url, data=data, method=method)\nif data:\n req.add_header(\"Content-Type\", \"application/json\")\ntry:\n resp = urllib.request.urlopen(req, timeout=60)\n print(resp.read().decode())\nexcept urllib.error.HTTPError as e:\n print(e.read().decode())\n sys.exit(1)\nexcept Exception as e:\n print(json.dumps({\"error\": str(e)}))\n sys.exit(1)\n`;\n\n/**\n * A sandboxed headless browser controlled from outside.\n *\n * The browser (Chromium via Playwright) runs inside an agentkernel sandbox.\n * You call high-level methods; the SDK generates and runs scripts internally.\n *\n * @example\n * ```ts\n * await using browser = await client.browser(\"my-browser\");\n * const page = await browser.goto(\"https://example.com\");\n * console.log(page.title, page.links);\n * ```\n */\nexport class BrowserSession implements AsyncDisposable {\n readonly name: string;\n private _removed = false;\n private _lastUrl: string | null = null;\n private readonly _run: RunInSandboxFn;\n private readonly _remove: RemoveSandboxFn;\n\n /** @internal */\n constructor(name: string, runFn: RunInSandboxFn, removeFn: RemoveSandboxFn) {\n this.name = name;\n this._run = runFn;\n this._remove = removeFn;\n }\n\n /** Navigate to a URL and return page data (title, text, links). */\n async goto(url: string): Promise<PageResult> {\n const result = await this._run(this.name, [\n \"python3\",\n \"-c\",\n GOTO_SCRIPT,\n url,\n ]);\n this._lastUrl = url;\n return JSON.parse(result.output) as PageResult;\n }\n\n /** Take a PNG screenshot. Returns a base64-encoded string. */\n async screenshot(url?: string): Promise<string> {\n const target = url ?? this._lastUrl;\n if (!target) {\n throw new Error(\"No URL specified and no previous goto() call\");\n }\n const result = await this._run(this.name, [\n \"python3\",\n \"-c\",\n SCREENSHOT_SCRIPT,\n target,\n ]);\n return result.output.trim();\n }\n\n /** Run a JavaScript expression on a page and return the result. */\n async evaluate(expression: string, url?: string): Promise<unknown> {\n const target = url ?? this._lastUrl;\n if (!target) {\n throw new Error(\"No URL specified and no previous goto() call\");\n }\n const result = await this._run(this.name, [\n \"python3\",\n \"-c\",\n EVALUATE_SCRIPT,\n target,\n expression,\n ]);\n return JSON.parse(result.output);\n }\n\n // --- v2 methods (ARIA snapshots, persistent pages, ref-based interaction) ---\n\n /** Navigate to a URL and return an ARIA snapshot. */\n async open(url: string, page = \"default\"): Promise<AriaSnapshot> {\n await this._ensureServer();\n const result = await this._browserRequest(\n \"POST\",\n `/pages/${page}/goto`,\n JSON.stringify({ url }),\n );\n return JSON.parse(result.output) as AriaSnapshot;\n }\n\n /** Get the current ARIA snapshot without navigating. */\n async snapshot(page = \"default\"): Promise<AriaSnapshot> {\n await this._ensureServer();\n const result = await this._browserRequest(\n \"GET\",\n `/pages/${page}/snapshot`,\n );\n return JSON.parse(result.output) as AriaSnapshot;\n }\n\n /** Click an element by ref ID or CSS selector. Returns new snapshot. */\n async click(opts: { ref?: string; selector?: string; page?: string }): Promise<AriaSnapshot> {\n const page = opts.page ?? \"default\";\n await this._ensureServer();\n const body: Record<string, string> = {};\n if (opts.ref) body.ref = opts.ref;\n if (opts.selector) body.selector = opts.selector;\n const result = await this._browserRequest(\n \"POST\",\n `/pages/${page}/click`,\n JSON.stringify(body),\n );\n const data = JSON.parse(result.output);\n if (data.error) throw new Error(data.error);\n return data as AriaSnapshot;\n }\n\n /** Fill an input by ref ID or CSS selector. Returns new snapshot. */\n async fill(\n value: string,\n opts: { ref?: string; selector?: string; page?: string },\n ): Promise<AriaSnapshot> {\n const page = opts.page ?? \"default\";\n await this._ensureServer();\n const body: Record<string, string> = { value };\n if (opts.ref) body.ref = opts.ref;\n if (opts.selector) body.selector = opts.selector;\n const result = await this._browserRequest(\n \"POST\",\n `/pages/${page}/fill`,\n JSON.stringify(body),\n );\n const data = JSON.parse(result.output);\n if (data.error) throw new Error(data.error);\n return data as AriaSnapshot;\n }\n\n /** Close a named page. */\n async closePage(page = \"default\"): Promise<void> {\n await this._ensureServer();\n await this._browserRequest(\"DELETE\", `/pages/${page}`);\n }\n\n /** List active page names. */\n async listPages(): Promise<string[]> {\n await this._ensureServer();\n const result = await this._browserRequest(\"GET\", \"/pages\");\n const data = JSON.parse(result.output);\n return data.pages ?? [];\n }\n\n private _serverStarted = false;\n\n private async _ensureServer(): Promise<void> {\n if (this._serverStarted) return;\n // Health check\n try {\n const result = await this._run(this.name, [\n \"python3\", \"-c\", BROWSER_HEALTH_SCRIPT, \"9222\",\n ]);\n if (result.output.includes('\"status\":\"ok\"') || result.output.includes('\"status\": \"ok\"')) {\n this._serverStarted = true;\n return;\n }\n } catch {\n // Server not running, start it\n }\n // Start would require the full server script + ARIA JS — for SDK use,\n // the server is expected to already be running (started via browser_create or MCP)\n throw new Error(\n \"Browser server not running. Use browser_create to set up the sandbox, \" +\n \"or use the MCP browser_open tool which auto-starts the server.\",\n );\n }\n\n private async _browserRequest(\n method: string,\n path: string,\n body?: string,\n ): Promise<RunOutput> {\n const cmd = [\"python3\", \"-c\", BROWSER_REQUEST_SCRIPT, \"9222\", method, path];\n if (body) cmd.push(body);\n return this._run(this.name, cmd);\n }\n\n // --- v1 methods (backward compatible) ---\n\n /** Remove the sandbox. Idempotent. */\n async remove(): Promise<void> {\n if (this._removed) return;\n this._removed = true;\n await this._remove(this.name);\n }\n\n /** Auto-cleanup for `await using`. */\n async [Symbol.asyncDispose](): Promise<void> {\n await this.remove();\n }\n}\n","import type {\n BatchFileWriteResponse,\n ExecOptions,\n RunOutput,\n SandboxInfo,\n} from \"./types.js\";\n\ntype ExecFn = (\n name: string,\n command: string[],\n opts?: ExecOptions,\n) => Promise<RunOutput>;\ntype RemoveFn = (name: string) => Promise<void>;\ntype GetFn = (name: string) => Promise<SandboxInfo>;\ntype WriteFilesFn = (\n name: string,\n files: Record<string, string>,\n) => Promise<BatchFileWriteResponse>;\n\n/**\n * A sandbox session that auto-removes the sandbox on dispose.\n *\n * Supports both explicit cleanup via remove() and automatic cleanup via\n * Symbol.asyncDispose (TS 5.2+ `await using`).\n *\n * @example\n * ```ts\n * await using sb = await client.sandbox(\"test\");\n * await sb.exec([\"echo\", \"hello\"]);\n * // sandbox auto-removed when scope exits\n * ```\n */\nexport class SandboxSession implements AsyncDisposable {\n readonly name: string;\n private _removed = false;\n private readonly _execInSandbox: ExecFn;\n private readonly _removeSandbox: RemoveFn;\n private readonly _getSandbox: GetFn;\n private readonly _writeFiles: WriteFilesFn;\n\n /** @internal */\n constructor(\n name: string,\n execInSandbox: ExecFn,\n removeSandbox: RemoveFn,\n getSandbox: GetFn,\n writeFiles: WriteFilesFn,\n ) {\n this.name = name;\n this._execInSandbox = execInSandbox;\n this._removeSandbox = removeSandbox;\n this._getSandbox = getSandbox;\n this._writeFiles = writeFiles;\n }\n\n /** Run a command in this sandbox. */\n async run(command: string[], opts?: ExecOptions): Promise<RunOutput> {\n return this._execInSandbox(this.name, command, opts);\n }\n\n /** Get sandbox info. */\n async info(): Promise<SandboxInfo> {\n return this._getSandbox(this.name);\n }\n\n /** Write multiple files in one request. */\n async writeFiles(\n files: Record<string, string>,\n ): Promise<BatchFileWriteResponse> {\n return this._writeFiles(this.name, files);\n }\n\n /** Remove the sandbox. Idempotent. */\n async remove(): Promise<void> {\n if (this._removed) return;\n this._removed = true;\n await this._removeSandbox(this.name);\n }\n\n /** Auto-cleanup for `await using`. */\n async [Symbol.asyncDispose](): Promise<void> {\n await this.remove();\n }\n}\n","import { createParser, type EventSourceMessage } from \"eventsource-parser\";\nimport type { StreamEvent, StreamEventType } from \"./types.js\";\n\nconst KNOWN_EVENTS = new Set<string>([\"started\", \"progress\", \"output\", \"done\", \"error\"]);\n\n/** Shared mutable state between the pump and the generator. */\ninterface PumpState {\n events: StreamEvent[];\n resolve: (() => void) | null;\n done: boolean;\n}\n\nfunction pushEvent(state: PumpState, event: StreamEvent): void {\n state.events.push(event);\n if (state.resolve) {\n const cb = state.resolve;\n state.resolve = null;\n cb();\n }\n}\n\n/**\n * Parse an SSE response body into an async generator of StreamEvents.\n *\n * Consumes a ReadableStream<Uint8Array> from fetch() and yields typed events\n * until the stream closes or a \"done\"/\"error\" event is received.\n */\nexport async function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<StreamEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n const state: PumpState = { events: [], resolve: null, done: false };\n\n const parser = createParser({\n onEvent(event: EventSourceMessage) {\n const type = event.event ?? \"message\";\n if (!KNOWN_EVENTS.has(type)) return;\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(event.data);\n } catch {\n data = { raw: event.data };\n }\n\n pushEvent(state, { type: type as StreamEventType, data });\n },\n });\n\n // Read the stream in the background\n const pump = (async () => {\n try {\n for (;;) {\n const result = await reader.read();\n if (result.done) break;\n parser.feed(decoder.decode(result.value, { stream: true }));\n }\n } catch (err) {\n pushEvent(state, {\n type: \"error\",\n data: { message: err instanceof Error ? err.message : String(err) },\n });\n } finally {\n state.done = true;\n if (state.resolve) {\n const cb = state.resolve;\n state.resolve = null;\n cb();\n }\n }\n })();\n\n try {\n for (;;) {\n // Yield all buffered events\n while (state.events.length > 0) {\n const event = state.events.shift()!;\n yield event;\n if (event.type === \"done\" || event.type === \"error\") return;\n }\n\n // If the stream is done and no more events, exit\n if (state.done) return;\n\n // Wait for the next event\n await new Promise<void>((r) => {\n state.resolve = r;\n });\n }\n } finally {\n reader.cancel().catch(() => {});\n await pump.catch(() => {});\n }\n}\n","import { resolveConfig } from \"./config.js\";\nimport {\n AgentKernelError,\n NetworkError,\n errorFromStatus,\n} from \"./errors.js\";\nimport { BrowserSession, BROWSER_SETUP_CMD } from \"./browser.js\";\nimport { SandboxSession } from \"./sandbox.js\";\nimport { parseSSE } from \"./sse.js\";\nimport type {\n AgentKernelOptions,\n ApiResponse,\n BatchCommand,\n BatchFileWriteResponse,\n BatchRunResponse,\n CreateStoreRequest,\n CreateObjectRequest,\n CreateOrchestrationRequest,\n CreateScheduleRequest,\n CreateSandboxOptions,\n DetachedCommand,\n DetachedLogsResponse,\n ExecOptions,\n ExtendTtlOptions,\n ExtendTtlResponse,\n DurableObject,\n DurableStore,\n DurableStoreCommandResponse,\n DurableStoreExecuteResponse,\n DurableStoreQueryResponse,\n FileReadResponse,\n FileWriteOptions,\n OrchestrationDefinition,\n RunOptions,\n RunOutput,\n Orchestration,\n SandboxInfo,\n Schedule,\n SnapshotMeta,\n StreamEvent,\n TakeSnapshotOptions,\n} from \"./types.js\";\n\nconst SDK_VERSION = \"0.3.0\";\n\n/**\n * Client for the agentkernel HTTP API.\n *\n * @example\n * ```ts\n * const client = new AgentKernel();\n * const result = await client.run([\"echo\", \"hello\"]);\n * console.log(result.output); // \"hello\\n\"\n * ```\n */\nexport class AgentKernel {\n private readonly baseUrl: string;\n private readonly apiKey: string | undefined;\n private readonly timeout: number;\n\n constructor(opts?: AgentKernelOptions) {\n const config = resolveConfig(opts);\n this.baseUrl = config.baseUrl;\n this.apiKey = config.apiKey;\n this.timeout = config.timeout;\n }\n\n // -- Core API methods --\n\n /** Health check. Returns \"ok\" if the server is running. */\n async health(): Promise<string> {\n const res = await this.request<string>(\"GET\", \"/health\");\n return res;\n }\n\n /** Run a command in a temporary sandbox. */\n async run(command: string[], opts?: RunOptions): Promise<RunOutput> {\n return this.request<RunOutput>(\"POST\", \"/run\", {\n command,\n image: opts?.image,\n profile: opts?.profile,\n fast: opts?.fast ?? true,\n });\n }\n\n /**\n * Run a command with SSE streaming output.\n *\n * @example\n * ```ts\n * for await (const event of client.runStream([\"python3\", \"script.py\"])) {\n * if (event.type === \"output\") process.stdout.write(String(event.data.data));\n * }\n * ```\n */\n async *runStream(\n command: string[],\n opts?: RunOptions,\n ): AsyncGenerator<StreamEvent> {\n const body = JSON.stringify({\n command,\n image: opts?.image,\n profile: opts?.profile,\n fast: opts?.fast ?? true,\n });\n\n const response = await this.fetch(\"/run/stream\", {\n method: \"POST\",\n headers: this.headers(\"application/json\"),\n body,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw errorFromStatus(response.status, text);\n }\n\n if (!response.body) {\n throw new AgentKernelError(\"No response body for SSE stream\");\n }\n\n yield* parseSSE(response.body);\n }\n\n /** List all sandboxes. */\n async listSandboxes(): Promise<SandboxInfo[]> {\n return this.request<SandboxInfo[]>(\"GET\", \"/sandboxes\");\n }\n\n /** Create a new sandbox. */\n async createSandbox(\n name: string,\n opts?: CreateSandboxOptions,\n ): Promise<SandboxInfo> {\n return this.request<SandboxInfo>(\"POST\", \"/sandboxes\", {\n name,\n image: opts?.image,\n vcpus: opts?.vcpus,\n memory_mb: opts?.memory_mb,\n profile: opts?.profile,\n source_url: opts?.source_url,\n source_ref: opts?.source_ref,\n volumes: opts?.volumes,\n secrets: opts?.secrets,\n secret_files: opts?.secret_files,\n });\n }\n\n /** Get info about a sandbox. */\n async getSandbox(name: string): Promise<SandboxInfo> {\n return this.request<SandboxInfo>(\"GET\", `/sandboxes/${encodeURIComponent(name)}`);\n }\n\n /** Get info about a sandbox by UUID. */\n async getSandboxByUuid(uuid: string): Promise<SandboxInfo> {\n return this.request<SandboxInfo>(\n \"GET\",\n `/sandboxes/by-uuid/${encodeURIComponent(uuid)}`,\n );\n }\n\n /** Remove a sandbox. */\n async removeSandbox(name: string): Promise<void> {\n await this.request<string>(\"DELETE\", `/sandboxes/${encodeURIComponent(name)}`);\n }\n\n /** Run a command in an existing sandbox. */\n async execInSandbox(\n name: string,\n command: string[],\n opts?: ExecOptions,\n ): Promise<RunOutput> {\n return this.request<RunOutput>(\n \"POST\",\n `/sandboxes/${encodeURIComponent(name)}/exec`,\n {\n command,\n env: opts?.env,\n workdir: opts?.workdir,\n sudo: opts?.sudo,\n },\n );\n }\n\n /** Read a file from a sandbox. */\n async readFile(name: string, path: string): Promise<FileReadResponse> {\n return this.request<FileReadResponse>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/files/${path}`,\n );\n }\n\n /** Write a file to a sandbox. */\n async writeFile(\n name: string,\n path: string,\n content: string,\n opts?: FileWriteOptions,\n ): Promise<string> {\n return this.request<string>(\n \"PUT\",\n `/sandboxes/${encodeURIComponent(name)}/files/${path}`,\n { content, encoding: opts?.encoding ?? \"utf8\" },\n );\n }\n\n /** Delete a file from a sandbox. */\n async deleteFile(name: string, path: string): Promise<string> {\n return this.request<string>(\n \"DELETE\",\n `/sandboxes/${encodeURIComponent(name)}/files/${path}`,\n );\n }\n\n /** Get audit log entries for a sandbox. */\n async getSandboxLogs(name: string): Promise<Record<string, unknown>[]> {\n return this.request<Record<string, unknown>[]>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/logs`,\n );\n }\n\n /** Write multiple files to a sandbox in one request. */\n async writeFiles(\n name: string,\n files: Record<string, string>,\n ): Promise<BatchFileWriteResponse> {\n return this.request<BatchFileWriteResponse>(\n \"POST\",\n `/sandboxes/${encodeURIComponent(name)}/files`,\n { files },\n );\n }\n\n /** Run multiple commands in parallel. */\n async batchRun(commands: BatchCommand[]): Promise<BatchRunResponse> {\n return this.request<BatchRunResponse>(\"POST\", \"/batch/run\", { commands });\n }\n\n /** Start a detached (background) command in a sandbox. */\n async execDetached(\n name: string,\n command: string[],\n opts?: ExecOptions,\n ): Promise<DetachedCommand> {\n return this.request<DetachedCommand>(\n \"POST\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detach`,\n {\n command,\n env: opts?.env,\n workdir: opts?.workdir,\n sudo: opts?.sudo,\n },\n );\n }\n\n /** Get the status of a detached command. */\n async detachedStatus(\n name: string,\n cmdId: string,\n ): Promise<DetachedCommand> {\n return this.request<DetachedCommand>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detached/${encodeURIComponent(cmdId)}`,\n );\n }\n\n /** Get logs from a detached command. */\n async detachedLogs(\n name: string,\n cmdId: string,\n stream?: \"stdout\" | \"stderr\",\n ): Promise<DetachedLogsResponse> {\n const query = stream === \"stderr\" ? \"?stream=stderr\" : \"\";\n return this.request<DetachedLogsResponse>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detached/${encodeURIComponent(cmdId)}/logs${query}`,\n );\n }\n\n /** Kill a detached command. */\n async detachedKill(name: string, cmdId: string): Promise<string> {\n return this.request<string>(\n \"DELETE\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detached/${encodeURIComponent(cmdId)}`,\n );\n }\n\n /** List detached commands in a sandbox. */\n async detachedList(name: string): Promise<DetachedCommand[]> {\n return this.request<DetachedCommand[]>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detached`,\n );\n }\n\n /** List all orchestrations. */\n async listOrchestrations(): Promise<Orchestration[]> {\n return this.request<Orchestration[]>(\"GET\", \"/orchestrations\");\n }\n\n /** Create a new orchestration. */\n async createOrchestration(payload: CreateOrchestrationRequest): Promise<Orchestration> {\n return this.request<Orchestration>(\"POST\", \"/orchestrations\", payload);\n }\n\n /** Get info about an orchestration by identifier. */\n async getOrchestration(id: string): Promise<Orchestration> {\n return this.request<Orchestration>(\n \"GET\",\n `/orchestrations/${encodeURIComponent(id)}`,\n );\n }\n\n /** Raise an external event for an orchestration. */\n async signalOrchestration(\n id: string,\n payload: Record<string, unknown>,\n ): Promise<Orchestration> {\n return this.request<Orchestration>(\n \"POST\",\n `/orchestrations/${encodeURIComponent(id)}/events`,\n payload,\n );\n }\n\n /** Terminate an orchestration. */\n async terminateOrchestration(\n id: string,\n payload?: Record<string, unknown>,\n ): Promise<Orchestration> {\n return this.request<Orchestration>(\n \"POST\",\n `/orchestrations/${encodeURIComponent(id)}/terminate`,\n payload ?? {},\n );\n }\n\n /** List orchestration definitions. */\n async listOrchestrationDefinitions(): Promise<OrchestrationDefinition[]> {\n return this.request<OrchestrationDefinition[]>(\n \"GET\",\n \"/orchestrations/definitions\",\n );\n }\n\n /** Register or update an orchestration definition. */\n async upsertOrchestrationDefinition(\n payload: OrchestrationDefinition,\n ): Promise<OrchestrationDefinition> {\n return this.request<OrchestrationDefinition>(\n \"POST\",\n \"/orchestrations/definitions\",\n payload,\n );\n }\n\n /** Get an orchestration definition by name. */\n async getOrchestrationDefinition(\n name: string,\n ): Promise<OrchestrationDefinition> {\n return this.request<OrchestrationDefinition>(\n \"GET\",\n `/orchestrations/definitions/${encodeURIComponent(name)}`,\n );\n }\n\n /** Delete an orchestration definition by name. */\n async deleteOrchestrationDefinition(name: string): Promise<string> {\n return this.request<string>(\n \"DELETE\",\n `/orchestrations/definitions/${encodeURIComponent(name)}`,\n );\n }\n\n /** List all objects. */\n async listObjects(): Promise<DurableObject[]> {\n return this.request<DurableObject[]>(\"GET\", \"/objects\");\n }\n\n /** Create a new object. */\n async createObject(payload: CreateObjectRequest): Promise<DurableObject> {\n return this.request<DurableObject>(\"POST\", \"/objects\", payload);\n }\n\n /** Get an object by identifier. */\n async getObject(id: string): Promise<DurableObject> {\n return this.request<DurableObject>(\n \"GET\",\n `/objects/${encodeURIComponent(id)}`,\n );\n }\n\n /** Call a method on a durable object (auto-creates/wakes if needed). */\n async callObject(\n className: string,\n objectId: string,\n method: string,\n args?: Record<string, unknown>,\n ): Promise<unknown> {\n const resp = await this.request(\n \"POST\",\n `/objects/${encodeURIComponent(className)}/${encodeURIComponent(objectId)}/call/${encodeURIComponent(method)}`,\n args ?? {},\n );\n return resp;\n }\n\n /** Delete a durable object by identifier. */\n async deleteObject(id: string): Promise<string> {\n return this.request<string>(\"DELETE\", `/objects/${encodeURIComponent(id)}`);\n }\n\n /** Partially update a durable object (storage and/or status). */\n async patchObject(\n id: string,\n payload: { storage?: unknown; status?: string },\n ): Promise<DurableObject> {\n return this.request<DurableObject>(\n \"PATCH\",\n `/objects/${encodeURIComponent(id)}`,\n payload,\n );\n }\n\n /** List all schedules. */\n async listSchedules(): Promise<Schedule[]> {\n return this.request<Schedule[]>(\"GET\", \"/schedules\");\n }\n\n /** Create a new schedule. */\n async createSchedule(payload: CreateScheduleRequest): Promise<Schedule> {\n return this.request<Schedule>(\"POST\", \"/schedules\", payload);\n }\n\n /** Get a schedule by identifier. */\n async getSchedule(id: string): Promise<Schedule> {\n return this.request<Schedule>(\n \"GET\",\n `/schedules/${encodeURIComponent(id)}`,\n );\n }\n\n /** Delete a schedule by identifier. */\n async deleteSchedule(id: string): Promise<string> {\n return this.request<string>(\"DELETE\", `/schedules/${encodeURIComponent(id)}`);\n }\n\n /** List all durable stores. */\n async listStores(): Promise<DurableStore[]> {\n return this.request<DurableStore[]>(\"GET\", \"/stores\");\n }\n\n /** Create a durable store. */\n async createStore(payload: CreateStoreRequest): Promise<DurableStore> {\n return this.request<DurableStore>(\"POST\", \"/stores\", payload);\n }\n\n /** Get a durable store by identifier. */\n async getStore(id: string): Promise<DurableStore> {\n return this.request<DurableStore>(\"GET\", `/stores/${encodeURIComponent(id)}`);\n }\n\n /** Delete a durable store by identifier. */\n async deleteStore(id: string): Promise<string> {\n return this.request<string>(\"DELETE\", `/stores/${encodeURIComponent(id)}`);\n }\n\n /** Execute a read query against a durable store. */\n async queryStore(\n id: string,\n payload: Record<string, unknown>,\n ): Promise<DurableStoreQueryResponse> {\n return this.request<DurableStoreQueryResponse>(\n \"POST\",\n `/stores/${encodeURIComponent(id)}/query`,\n payload,\n );\n }\n\n /** Execute a write statement against a durable store. */\n async executeStore(\n id: string,\n payload: Record<string, unknown>,\n ): Promise<DurableStoreExecuteResponse> {\n return this.request<DurableStoreExecuteResponse>(\n \"POST\",\n `/stores/${encodeURIComponent(id)}/execute`,\n payload,\n );\n }\n\n /** Execute a command against a durable store (Redis-style engines). */\n async commandStore(\n id: string,\n payload: Record<string, unknown>,\n ): Promise<DurableStoreCommandResponse> {\n return this.request<DurableStoreCommandResponse>(\n \"POST\",\n `/stores/${encodeURIComponent(id)}/command`,\n payload,\n );\n }\n\n /**\n * Create a sandbox session with automatic cleanup.\n *\n * The returned SandboxSession implements AsyncDisposable,\n * so it works with `await using` (TS 5.2+):\n *\n * @example\n * ```ts\n * await using sb = await client.sandbox(\"test\", { image: \"python:3.12-alpine\" });\n * await sb.run([\"pip\", \"install\", \"numpy\"]);\n * // sandbox auto-removed when scope exits\n * ```\n */\n async sandbox(\n name: string,\n opts?: CreateSandboxOptions,\n ): Promise<SandboxSession> {\n await this.createSandbox(name, opts);\n return new SandboxSession(\n name,\n (n, cmd, o) => this.execInSandbox(n, cmd, o),\n (n) => this.removeSandbox(n),\n (n) => this.getSandbox(n),\n (n, f) => this.writeFiles(n, f),\n );\n }\n\n /**\n * Create a sandboxed browser session with automatic cleanup.\n *\n * Creates a sandbox with Chromium pre-installed via Playwright.\n * Use `goto()`, `screenshot()`, and `evaluate()` to interact with web pages.\n *\n * @example\n * ```ts\n * await using browser = await client.browser(\"my-browser\");\n * const page = await browser.goto(\"https://example.com\");\n * console.log(page.title, page.links);\n * // sandbox auto-removed when scope exits\n * ```\n */\n async browser(\n name: string,\n opts?: { memory_mb?: number },\n ): Promise<BrowserSession> {\n await this.createSandbox(name, {\n image: \"python:3.12-slim\",\n memory_mb: opts?.memory_mb ?? 2048,\n profile: \"moderate\",\n });\n await this.execInSandbox(name, BROWSER_SETUP_CMD);\n return new BrowserSession(\n name,\n (n, cmd) => this.execInSandbox(n, cmd),\n (n) => this.removeSandbox(n),\n );\n }\n\n // -- TTL & Snapshot methods --\n\n /** Extend a sandbox's TTL. Returns the new expiry time. */\n async extendTtl(name: string, opts: ExtendTtlOptions): Promise<ExtendTtlResponse> {\n return this.request<ExtendTtlResponse>(\n \"POST\",\n `/sandboxes/${encodeURIComponent(name)}/extend`,\n { by: opts.by },\n );\n }\n\n /** List all snapshots. */\n async listSnapshots(): Promise<SnapshotMeta[]> {\n return this.request<SnapshotMeta[]>(\"GET\", \"/snapshots\");\n }\n\n /** Take a snapshot of a sandbox. */\n async takeSnapshot(opts: TakeSnapshotOptions): Promise<SnapshotMeta> {\n return this.request<SnapshotMeta>(\"POST\", \"/snapshots\", opts);\n }\n\n /** Get info about a snapshot. */\n async getSnapshot(name: string): Promise<SnapshotMeta> {\n return this.request<SnapshotMeta>(\n \"GET\",\n `/snapshots/${encodeURIComponent(name)}`,\n );\n }\n\n /** Delete a snapshot. */\n async deleteSnapshot(name: string): Promise<void> {\n await this.request<string>(\n \"DELETE\",\n `/snapshots/${encodeURIComponent(name)}`,\n );\n }\n\n /** Restore a sandbox from a snapshot. */\n async restoreSnapshot(name: string): Promise<SandboxInfo> {\n return this.request<SandboxInfo>(\n \"POST\",\n `/snapshots/${encodeURIComponent(name)}/restore`,\n );\n }\n\n // -- Internal helpers --\n\n private headers(contentType?: string): Record<string, string> {\n const h: Record<string, string> = {\n \"User-Agent\": `agentkernel-nodejs-sdk/${SDK_VERSION}`,\n };\n if (contentType) h[\"Content-Type\"] = contentType;\n if (this.apiKey) h[\"Authorization\"] = `Bearer ${this.apiKey}`;\n return h;\n }\n\n private async fetch(path: string, init: RequestInit): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n try {\n return await fetch(url, {\n ...init,\n signal: AbortSignal.timeout(this.timeout),\n });\n } catch (err) {\n if (err instanceof DOMException && err.name === \"TimeoutError\") {\n throw new NetworkError(`Request timed out after ${this.timeout}ms`);\n }\n if (err instanceof TypeError) {\n throw new NetworkError(`Failed to connect to ${this.baseUrl}: ${err.message}`);\n }\n throw new NetworkError(\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n ): Promise<T> {\n const init: RequestInit = {\n method,\n headers: this.headers(body ? \"application/json\" : undefined),\n };\n if (body) init.body = JSON.stringify(body);\n\n const response = await this.fetch(path, init);\n\n const text = await response.text();\n if (!response.ok) {\n throw errorFromStatus(response.status, text);\n }\n\n const parsed: ApiResponse<T> = JSON.parse(text);\n if (!parsed.success) {\n throw new AgentKernelError(parsed.error ?? \"Unknown error\");\n }\n return parsed.data as T;\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -63,6 +63,7 @@ interface RunOutput {
|
|
|
63
63
|
/** Information about a sandbox. */
|
|
64
64
|
interface SandboxInfo {
|
|
65
65
|
name: string;
|
|
66
|
+
uuid?: string;
|
|
66
67
|
status: SandboxStatus;
|
|
67
68
|
backend: string;
|
|
68
69
|
image?: string;
|
|
@@ -103,6 +104,19 @@ interface BatchRunResponse {
|
|
|
103
104
|
interface BatchFileWriteResponse {
|
|
104
105
|
written: number;
|
|
105
106
|
}
|
|
107
|
+
/** Opaque orchestration payload/response body. */
|
|
108
|
+
type Orchestration = Record<string, unknown>;
|
|
109
|
+
type OrchestrationDefinition = Record<string, unknown>;
|
|
110
|
+
/** Opaque object payload/response body. */
|
|
111
|
+
type DurableObject = Record<string, unknown>;
|
|
112
|
+
/** Opaque schedule payload/response body. */
|
|
113
|
+
type Schedule = Record<string, unknown>;
|
|
114
|
+
/** Opaque durable store payload/response body. */
|
|
115
|
+
type DurableStore = Record<string, unknown>;
|
|
116
|
+
type CreateStoreRequest = Record<string, unknown>;
|
|
117
|
+
type DurableStoreQueryResponse = Record<string, unknown>;
|
|
118
|
+
type DurableStoreExecuteResponse = Record<string, unknown>;
|
|
119
|
+
type DurableStoreCommandResponse = Record<string, unknown>;
|
|
106
120
|
/** Status of a detached command. */
|
|
107
121
|
type DetachedStatus = "running" | "completed" | "failed";
|
|
108
122
|
/** A detached (background) command running in a sandbox. */
|
|
@@ -120,6 +134,12 @@ interface DetachedLogsResponse {
|
|
|
120
134
|
stdout?: string;
|
|
121
135
|
stderr?: string;
|
|
122
136
|
}
|
|
137
|
+
/** Opaque payload used when creating orchestrations. */
|
|
138
|
+
type CreateOrchestrationRequest = Record<string, unknown>;
|
|
139
|
+
/** Opaque payload used when creating objects. */
|
|
140
|
+
type CreateObjectRequest = Record<string, unknown>;
|
|
141
|
+
/** Opaque payload used when creating schedules. */
|
|
142
|
+
type CreateScheduleRequest = Record<string, unknown>;
|
|
123
143
|
/** API response wrapper. */
|
|
124
144
|
interface ApiResponse<T> {
|
|
125
145
|
success: boolean;
|
|
@@ -333,6 +353,8 @@ declare class AgentKernel {
|
|
|
333
353
|
createSandbox(name: string, opts?: CreateSandboxOptions): Promise<SandboxInfo>;
|
|
334
354
|
/** Get info about a sandbox. */
|
|
335
355
|
getSandbox(name: string): Promise<SandboxInfo>;
|
|
356
|
+
/** Get info about a sandbox by UUID. */
|
|
357
|
+
getSandboxByUuid(uuid: string): Promise<SandboxInfo>;
|
|
336
358
|
/** Remove a sandbox. */
|
|
337
359
|
removeSandbox(name: string): Promise<void>;
|
|
338
360
|
/** Run a command in an existing sandbox. */
|
|
@@ -359,6 +381,61 @@ declare class AgentKernel {
|
|
|
359
381
|
detachedKill(name: string, cmdId: string): Promise<string>;
|
|
360
382
|
/** List detached commands in a sandbox. */
|
|
361
383
|
detachedList(name: string): Promise<DetachedCommand[]>;
|
|
384
|
+
/** List all orchestrations. */
|
|
385
|
+
listOrchestrations(): Promise<Orchestration[]>;
|
|
386
|
+
/** Create a new orchestration. */
|
|
387
|
+
createOrchestration(payload: CreateOrchestrationRequest): Promise<Orchestration>;
|
|
388
|
+
/** Get info about an orchestration by identifier. */
|
|
389
|
+
getOrchestration(id: string): Promise<Orchestration>;
|
|
390
|
+
/** Raise an external event for an orchestration. */
|
|
391
|
+
signalOrchestration(id: string, payload: Record<string, unknown>): Promise<Orchestration>;
|
|
392
|
+
/** Terminate an orchestration. */
|
|
393
|
+
terminateOrchestration(id: string, payload?: Record<string, unknown>): Promise<Orchestration>;
|
|
394
|
+
/** List orchestration definitions. */
|
|
395
|
+
listOrchestrationDefinitions(): Promise<OrchestrationDefinition[]>;
|
|
396
|
+
/** Register or update an orchestration definition. */
|
|
397
|
+
upsertOrchestrationDefinition(payload: OrchestrationDefinition): Promise<OrchestrationDefinition>;
|
|
398
|
+
/** Get an orchestration definition by name. */
|
|
399
|
+
getOrchestrationDefinition(name: string): Promise<OrchestrationDefinition>;
|
|
400
|
+
/** Delete an orchestration definition by name. */
|
|
401
|
+
deleteOrchestrationDefinition(name: string): Promise<string>;
|
|
402
|
+
/** List all objects. */
|
|
403
|
+
listObjects(): Promise<DurableObject[]>;
|
|
404
|
+
/** Create a new object. */
|
|
405
|
+
createObject(payload: CreateObjectRequest): Promise<DurableObject>;
|
|
406
|
+
/** Get an object by identifier. */
|
|
407
|
+
getObject(id: string): Promise<DurableObject>;
|
|
408
|
+
/** Call a method on a durable object (auto-creates/wakes if needed). */
|
|
409
|
+
callObject(className: string, objectId: string, method: string, args?: Record<string, unknown>): Promise<unknown>;
|
|
410
|
+
/** Delete a durable object by identifier. */
|
|
411
|
+
deleteObject(id: string): Promise<string>;
|
|
412
|
+
/** Partially update a durable object (storage and/or status). */
|
|
413
|
+
patchObject(id: string, payload: {
|
|
414
|
+
storage?: unknown;
|
|
415
|
+
status?: string;
|
|
416
|
+
}): Promise<DurableObject>;
|
|
417
|
+
/** List all schedules. */
|
|
418
|
+
listSchedules(): Promise<Schedule[]>;
|
|
419
|
+
/** Create a new schedule. */
|
|
420
|
+
createSchedule(payload: CreateScheduleRequest): Promise<Schedule>;
|
|
421
|
+
/** Get a schedule by identifier. */
|
|
422
|
+
getSchedule(id: string): Promise<Schedule>;
|
|
423
|
+
/** Delete a schedule by identifier. */
|
|
424
|
+
deleteSchedule(id: string): Promise<string>;
|
|
425
|
+
/** List all durable stores. */
|
|
426
|
+
listStores(): Promise<DurableStore[]>;
|
|
427
|
+
/** Create a durable store. */
|
|
428
|
+
createStore(payload: CreateStoreRequest): Promise<DurableStore>;
|
|
429
|
+
/** Get a durable store by identifier. */
|
|
430
|
+
getStore(id: string): Promise<DurableStore>;
|
|
431
|
+
/** Delete a durable store by identifier. */
|
|
432
|
+
deleteStore(id: string): Promise<string>;
|
|
433
|
+
/** Execute a read query against a durable store. */
|
|
434
|
+
queryStore(id: string, payload: Record<string, unknown>): Promise<DurableStoreQueryResponse>;
|
|
435
|
+
/** Execute a write statement against a durable store. */
|
|
436
|
+
executeStore(id: string, payload: Record<string, unknown>): Promise<DurableStoreExecuteResponse>;
|
|
437
|
+
/** Execute a command against a durable store (Redis-style engines). */
|
|
438
|
+
commandStore(id: string, payload: Record<string, unknown>): Promise<DurableStoreCommandResponse>;
|
|
362
439
|
/**
|
|
363
440
|
* Create a sandbox session with automatic cleanup.
|
|
364
441
|
*
|
|
@@ -440,4 +517,4 @@ declare class StreamError extends AgentKernelError {
|
|
|
440
517
|
constructor(message?: string);
|
|
441
518
|
}
|
|
442
519
|
|
|
443
|
-
export { AgentKernel, AgentKernelError, type AgentKernelOptions, type ApiResponse, type AriaSnapshot, AuthError, BROWSER_SETUP_CMD, type BatchFileWriteResponse, type BrowserEvent, BrowserSession, type CreateSandboxOptions, type DetachedCommand, type DetachedLogsResponse, type DetachedStatus, type ExecOptions, type ExtendTtlOptions, type ExtendTtlResponse, NetworkError, NotFoundError, type PageLink, type PageResult, type RunOptions, type RunOutput, type SandboxInfo, SandboxSession, type SandboxStatus, type SecurityProfile, ServerError, type SnapshotMeta, StreamError, type StreamEvent, type StreamEventType, type TakeSnapshotOptions, ValidationError };
|
|
520
|
+
export { AgentKernel, AgentKernelError, type AgentKernelOptions, type ApiResponse, type AriaSnapshot, AuthError, BROWSER_SETUP_CMD, type BatchFileWriteResponse, type BrowserEvent, BrowserSession, type CreateObjectRequest, type CreateOrchestrationRequest, type CreateSandboxOptions, type CreateScheduleRequest, type CreateStoreRequest, type DetachedCommand, type DetachedLogsResponse, type DetachedStatus, type DurableObject, type DurableStore, type DurableStoreCommandResponse, type DurableStoreExecuteResponse, type DurableStoreQueryResponse, type ExecOptions, type ExtendTtlOptions, type ExtendTtlResponse, NetworkError, NotFoundError, type Orchestration, type OrchestrationDefinition, type PageLink, type PageResult, type RunOptions, type RunOutput, type SandboxInfo, SandboxSession, type SandboxStatus, type Schedule, type SecurityProfile, ServerError, type SnapshotMeta, StreamError, type StreamEvent, type StreamEventType, type TakeSnapshotOptions, ValidationError };
|
package/dist/index.d.ts
CHANGED
|
@@ -63,6 +63,7 @@ interface RunOutput {
|
|
|
63
63
|
/** Information about a sandbox. */
|
|
64
64
|
interface SandboxInfo {
|
|
65
65
|
name: string;
|
|
66
|
+
uuid?: string;
|
|
66
67
|
status: SandboxStatus;
|
|
67
68
|
backend: string;
|
|
68
69
|
image?: string;
|
|
@@ -103,6 +104,19 @@ interface BatchRunResponse {
|
|
|
103
104
|
interface BatchFileWriteResponse {
|
|
104
105
|
written: number;
|
|
105
106
|
}
|
|
107
|
+
/** Opaque orchestration payload/response body. */
|
|
108
|
+
type Orchestration = Record<string, unknown>;
|
|
109
|
+
type OrchestrationDefinition = Record<string, unknown>;
|
|
110
|
+
/** Opaque object payload/response body. */
|
|
111
|
+
type DurableObject = Record<string, unknown>;
|
|
112
|
+
/** Opaque schedule payload/response body. */
|
|
113
|
+
type Schedule = Record<string, unknown>;
|
|
114
|
+
/** Opaque durable store payload/response body. */
|
|
115
|
+
type DurableStore = Record<string, unknown>;
|
|
116
|
+
type CreateStoreRequest = Record<string, unknown>;
|
|
117
|
+
type DurableStoreQueryResponse = Record<string, unknown>;
|
|
118
|
+
type DurableStoreExecuteResponse = Record<string, unknown>;
|
|
119
|
+
type DurableStoreCommandResponse = Record<string, unknown>;
|
|
106
120
|
/** Status of a detached command. */
|
|
107
121
|
type DetachedStatus = "running" | "completed" | "failed";
|
|
108
122
|
/** A detached (background) command running in a sandbox. */
|
|
@@ -120,6 +134,12 @@ interface DetachedLogsResponse {
|
|
|
120
134
|
stdout?: string;
|
|
121
135
|
stderr?: string;
|
|
122
136
|
}
|
|
137
|
+
/** Opaque payload used when creating orchestrations. */
|
|
138
|
+
type CreateOrchestrationRequest = Record<string, unknown>;
|
|
139
|
+
/** Opaque payload used when creating objects. */
|
|
140
|
+
type CreateObjectRequest = Record<string, unknown>;
|
|
141
|
+
/** Opaque payload used when creating schedules. */
|
|
142
|
+
type CreateScheduleRequest = Record<string, unknown>;
|
|
123
143
|
/** API response wrapper. */
|
|
124
144
|
interface ApiResponse<T> {
|
|
125
145
|
success: boolean;
|
|
@@ -333,6 +353,8 @@ declare class AgentKernel {
|
|
|
333
353
|
createSandbox(name: string, opts?: CreateSandboxOptions): Promise<SandboxInfo>;
|
|
334
354
|
/** Get info about a sandbox. */
|
|
335
355
|
getSandbox(name: string): Promise<SandboxInfo>;
|
|
356
|
+
/** Get info about a sandbox by UUID. */
|
|
357
|
+
getSandboxByUuid(uuid: string): Promise<SandboxInfo>;
|
|
336
358
|
/** Remove a sandbox. */
|
|
337
359
|
removeSandbox(name: string): Promise<void>;
|
|
338
360
|
/** Run a command in an existing sandbox. */
|
|
@@ -359,6 +381,61 @@ declare class AgentKernel {
|
|
|
359
381
|
detachedKill(name: string, cmdId: string): Promise<string>;
|
|
360
382
|
/** List detached commands in a sandbox. */
|
|
361
383
|
detachedList(name: string): Promise<DetachedCommand[]>;
|
|
384
|
+
/** List all orchestrations. */
|
|
385
|
+
listOrchestrations(): Promise<Orchestration[]>;
|
|
386
|
+
/** Create a new orchestration. */
|
|
387
|
+
createOrchestration(payload: CreateOrchestrationRequest): Promise<Orchestration>;
|
|
388
|
+
/** Get info about an orchestration by identifier. */
|
|
389
|
+
getOrchestration(id: string): Promise<Orchestration>;
|
|
390
|
+
/** Raise an external event for an orchestration. */
|
|
391
|
+
signalOrchestration(id: string, payload: Record<string, unknown>): Promise<Orchestration>;
|
|
392
|
+
/** Terminate an orchestration. */
|
|
393
|
+
terminateOrchestration(id: string, payload?: Record<string, unknown>): Promise<Orchestration>;
|
|
394
|
+
/** List orchestration definitions. */
|
|
395
|
+
listOrchestrationDefinitions(): Promise<OrchestrationDefinition[]>;
|
|
396
|
+
/** Register or update an orchestration definition. */
|
|
397
|
+
upsertOrchestrationDefinition(payload: OrchestrationDefinition): Promise<OrchestrationDefinition>;
|
|
398
|
+
/** Get an orchestration definition by name. */
|
|
399
|
+
getOrchestrationDefinition(name: string): Promise<OrchestrationDefinition>;
|
|
400
|
+
/** Delete an orchestration definition by name. */
|
|
401
|
+
deleteOrchestrationDefinition(name: string): Promise<string>;
|
|
402
|
+
/** List all objects. */
|
|
403
|
+
listObjects(): Promise<DurableObject[]>;
|
|
404
|
+
/** Create a new object. */
|
|
405
|
+
createObject(payload: CreateObjectRequest): Promise<DurableObject>;
|
|
406
|
+
/** Get an object by identifier. */
|
|
407
|
+
getObject(id: string): Promise<DurableObject>;
|
|
408
|
+
/** Call a method on a durable object (auto-creates/wakes if needed). */
|
|
409
|
+
callObject(className: string, objectId: string, method: string, args?: Record<string, unknown>): Promise<unknown>;
|
|
410
|
+
/** Delete a durable object by identifier. */
|
|
411
|
+
deleteObject(id: string): Promise<string>;
|
|
412
|
+
/** Partially update a durable object (storage and/or status). */
|
|
413
|
+
patchObject(id: string, payload: {
|
|
414
|
+
storage?: unknown;
|
|
415
|
+
status?: string;
|
|
416
|
+
}): Promise<DurableObject>;
|
|
417
|
+
/** List all schedules. */
|
|
418
|
+
listSchedules(): Promise<Schedule[]>;
|
|
419
|
+
/** Create a new schedule. */
|
|
420
|
+
createSchedule(payload: CreateScheduleRequest): Promise<Schedule>;
|
|
421
|
+
/** Get a schedule by identifier. */
|
|
422
|
+
getSchedule(id: string): Promise<Schedule>;
|
|
423
|
+
/** Delete a schedule by identifier. */
|
|
424
|
+
deleteSchedule(id: string): Promise<string>;
|
|
425
|
+
/** List all durable stores. */
|
|
426
|
+
listStores(): Promise<DurableStore[]>;
|
|
427
|
+
/** Create a durable store. */
|
|
428
|
+
createStore(payload: CreateStoreRequest): Promise<DurableStore>;
|
|
429
|
+
/** Get a durable store by identifier. */
|
|
430
|
+
getStore(id: string): Promise<DurableStore>;
|
|
431
|
+
/** Delete a durable store by identifier. */
|
|
432
|
+
deleteStore(id: string): Promise<string>;
|
|
433
|
+
/** Execute a read query against a durable store. */
|
|
434
|
+
queryStore(id: string, payload: Record<string, unknown>): Promise<DurableStoreQueryResponse>;
|
|
435
|
+
/** Execute a write statement against a durable store. */
|
|
436
|
+
executeStore(id: string, payload: Record<string, unknown>): Promise<DurableStoreExecuteResponse>;
|
|
437
|
+
/** Execute a command against a durable store (Redis-style engines). */
|
|
438
|
+
commandStore(id: string, payload: Record<string, unknown>): Promise<DurableStoreCommandResponse>;
|
|
362
439
|
/**
|
|
363
440
|
* Create a sandbox session with automatic cleanup.
|
|
364
441
|
*
|
|
@@ -440,4 +517,4 @@ declare class StreamError extends AgentKernelError {
|
|
|
440
517
|
constructor(message?: string);
|
|
441
518
|
}
|
|
442
519
|
|
|
443
|
-
export { AgentKernel, AgentKernelError, type AgentKernelOptions, type ApiResponse, type AriaSnapshot, AuthError, BROWSER_SETUP_CMD, type BatchFileWriteResponse, type BrowserEvent, BrowserSession, type CreateSandboxOptions, type DetachedCommand, type DetachedLogsResponse, type DetachedStatus, type ExecOptions, type ExtendTtlOptions, type ExtendTtlResponse, NetworkError, NotFoundError, type PageLink, type PageResult, type RunOptions, type RunOutput, type SandboxInfo, SandboxSession, type SandboxStatus, type SecurityProfile, ServerError, type SnapshotMeta, StreamError, type StreamEvent, type StreamEventType, type TakeSnapshotOptions, ValidationError };
|
|
520
|
+
export { AgentKernel, AgentKernelError, type AgentKernelOptions, type ApiResponse, type AriaSnapshot, AuthError, BROWSER_SETUP_CMD, type BatchFileWriteResponse, type BrowserEvent, BrowserSession, type CreateObjectRequest, type CreateOrchestrationRequest, type CreateSandboxOptions, type CreateScheduleRequest, type CreateStoreRequest, type DetachedCommand, type DetachedLogsResponse, type DetachedStatus, type DurableObject, type DurableStore, type DurableStoreCommandResponse, type DurableStoreExecuteResponse, type DurableStoreQueryResponse, type ExecOptions, type ExtendTtlOptions, type ExtendTtlResponse, NetworkError, NotFoundError, type Orchestration, type OrchestrationDefinition, type PageLink, type PageResult, type RunOptions, type RunOutput, type SandboxInfo, SandboxSession, type SandboxStatus, type Schedule, type SecurityProfile, ServerError, type SnapshotMeta, StreamError, type StreamEvent, type StreamEventType, type TakeSnapshotOptions, ValidationError };
|
package/dist/index.js
CHANGED
|
@@ -511,6 +511,13 @@ var AgentKernel = class {
|
|
|
511
511
|
async getSandbox(name) {
|
|
512
512
|
return this.request("GET", `/sandboxes/${encodeURIComponent(name)}`);
|
|
513
513
|
}
|
|
514
|
+
/** Get info about a sandbox by UUID. */
|
|
515
|
+
async getSandboxByUuid(uuid) {
|
|
516
|
+
return this.request(
|
|
517
|
+
"GET",
|
|
518
|
+
`/sandboxes/by-uuid/${encodeURIComponent(uuid)}`
|
|
519
|
+
);
|
|
520
|
+
}
|
|
514
521
|
/** Remove a sandbox. */
|
|
515
522
|
async removeSandbox(name) {
|
|
516
523
|
await this.request("DELETE", `/sandboxes/${encodeURIComponent(name)}`);
|
|
@@ -611,6 +618,161 @@ var AgentKernel = class {
|
|
|
611
618
|
`/sandboxes/${encodeURIComponent(name)}/exec/detached`
|
|
612
619
|
);
|
|
613
620
|
}
|
|
621
|
+
/** List all orchestrations. */
|
|
622
|
+
async listOrchestrations() {
|
|
623
|
+
return this.request("GET", "/orchestrations");
|
|
624
|
+
}
|
|
625
|
+
/** Create a new orchestration. */
|
|
626
|
+
async createOrchestration(payload) {
|
|
627
|
+
return this.request("POST", "/orchestrations", payload);
|
|
628
|
+
}
|
|
629
|
+
/** Get info about an orchestration by identifier. */
|
|
630
|
+
async getOrchestration(id) {
|
|
631
|
+
return this.request(
|
|
632
|
+
"GET",
|
|
633
|
+
`/orchestrations/${encodeURIComponent(id)}`
|
|
634
|
+
);
|
|
635
|
+
}
|
|
636
|
+
/** Raise an external event for an orchestration. */
|
|
637
|
+
async signalOrchestration(id, payload) {
|
|
638
|
+
return this.request(
|
|
639
|
+
"POST",
|
|
640
|
+
`/orchestrations/${encodeURIComponent(id)}/events`,
|
|
641
|
+
payload
|
|
642
|
+
);
|
|
643
|
+
}
|
|
644
|
+
/** Terminate an orchestration. */
|
|
645
|
+
async terminateOrchestration(id, payload) {
|
|
646
|
+
return this.request(
|
|
647
|
+
"POST",
|
|
648
|
+
`/orchestrations/${encodeURIComponent(id)}/terminate`,
|
|
649
|
+
payload ?? {}
|
|
650
|
+
);
|
|
651
|
+
}
|
|
652
|
+
/** List orchestration definitions. */
|
|
653
|
+
async listOrchestrationDefinitions() {
|
|
654
|
+
return this.request(
|
|
655
|
+
"GET",
|
|
656
|
+
"/orchestrations/definitions"
|
|
657
|
+
);
|
|
658
|
+
}
|
|
659
|
+
/** Register or update an orchestration definition. */
|
|
660
|
+
async upsertOrchestrationDefinition(payload) {
|
|
661
|
+
return this.request(
|
|
662
|
+
"POST",
|
|
663
|
+
"/orchestrations/definitions",
|
|
664
|
+
payload
|
|
665
|
+
);
|
|
666
|
+
}
|
|
667
|
+
/** Get an orchestration definition by name. */
|
|
668
|
+
async getOrchestrationDefinition(name) {
|
|
669
|
+
return this.request(
|
|
670
|
+
"GET",
|
|
671
|
+
`/orchestrations/definitions/${encodeURIComponent(name)}`
|
|
672
|
+
);
|
|
673
|
+
}
|
|
674
|
+
/** Delete an orchestration definition by name. */
|
|
675
|
+
async deleteOrchestrationDefinition(name) {
|
|
676
|
+
return this.request(
|
|
677
|
+
"DELETE",
|
|
678
|
+
`/orchestrations/definitions/${encodeURIComponent(name)}`
|
|
679
|
+
);
|
|
680
|
+
}
|
|
681
|
+
/** List all objects. */
|
|
682
|
+
async listObjects() {
|
|
683
|
+
return this.request("GET", "/objects");
|
|
684
|
+
}
|
|
685
|
+
/** Create a new object. */
|
|
686
|
+
async createObject(payload) {
|
|
687
|
+
return this.request("POST", "/objects", payload);
|
|
688
|
+
}
|
|
689
|
+
/** Get an object by identifier. */
|
|
690
|
+
async getObject(id) {
|
|
691
|
+
return this.request(
|
|
692
|
+
"GET",
|
|
693
|
+
`/objects/${encodeURIComponent(id)}`
|
|
694
|
+
);
|
|
695
|
+
}
|
|
696
|
+
/** Call a method on a durable object (auto-creates/wakes if needed). */
|
|
697
|
+
async callObject(className, objectId, method, args) {
|
|
698
|
+
const resp = await this.request(
|
|
699
|
+
"POST",
|
|
700
|
+
`/objects/${encodeURIComponent(className)}/${encodeURIComponent(objectId)}/call/${encodeURIComponent(method)}`,
|
|
701
|
+
args ?? {}
|
|
702
|
+
);
|
|
703
|
+
return resp;
|
|
704
|
+
}
|
|
705
|
+
/** Delete a durable object by identifier. */
|
|
706
|
+
async deleteObject(id) {
|
|
707
|
+
return this.request("DELETE", `/objects/${encodeURIComponent(id)}`);
|
|
708
|
+
}
|
|
709
|
+
/** Partially update a durable object (storage and/or status). */
|
|
710
|
+
async patchObject(id, payload) {
|
|
711
|
+
return this.request(
|
|
712
|
+
"PATCH",
|
|
713
|
+
`/objects/${encodeURIComponent(id)}`,
|
|
714
|
+
payload
|
|
715
|
+
);
|
|
716
|
+
}
|
|
717
|
+
/** List all schedules. */
|
|
718
|
+
async listSchedules() {
|
|
719
|
+
return this.request("GET", "/schedules");
|
|
720
|
+
}
|
|
721
|
+
/** Create a new schedule. */
|
|
722
|
+
async createSchedule(payload) {
|
|
723
|
+
return this.request("POST", "/schedules", payload);
|
|
724
|
+
}
|
|
725
|
+
/** Get a schedule by identifier. */
|
|
726
|
+
async getSchedule(id) {
|
|
727
|
+
return this.request(
|
|
728
|
+
"GET",
|
|
729
|
+
`/schedules/${encodeURIComponent(id)}`
|
|
730
|
+
);
|
|
731
|
+
}
|
|
732
|
+
/** Delete a schedule by identifier. */
|
|
733
|
+
async deleteSchedule(id) {
|
|
734
|
+
return this.request("DELETE", `/schedules/${encodeURIComponent(id)}`);
|
|
735
|
+
}
|
|
736
|
+
/** List all durable stores. */
|
|
737
|
+
async listStores() {
|
|
738
|
+
return this.request("GET", "/stores");
|
|
739
|
+
}
|
|
740
|
+
/** Create a durable store. */
|
|
741
|
+
async createStore(payload) {
|
|
742
|
+
return this.request("POST", "/stores", payload);
|
|
743
|
+
}
|
|
744
|
+
/** Get a durable store by identifier. */
|
|
745
|
+
async getStore(id) {
|
|
746
|
+
return this.request("GET", `/stores/${encodeURIComponent(id)}`);
|
|
747
|
+
}
|
|
748
|
+
/** Delete a durable store by identifier. */
|
|
749
|
+
async deleteStore(id) {
|
|
750
|
+
return this.request("DELETE", `/stores/${encodeURIComponent(id)}`);
|
|
751
|
+
}
|
|
752
|
+
/** Execute a read query against a durable store. */
|
|
753
|
+
async queryStore(id, payload) {
|
|
754
|
+
return this.request(
|
|
755
|
+
"POST",
|
|
756
|
+
`/stores/${encodeURIComponent(id)}/query`,
|
|
757
|
+
payload
|
|
758
|
+
);
|
|
759
|
+
}
|
|
760
|
+
/** Execute a write statement against a durable store. */
|
|
761
|
+
async executeStore(id, payload) {
|
|
762
|
+
return this.request(
|
|
763
|
+
"POST",
|
|
764
|
+
`/stores/${encodeURIComponent(id)}/execute`,
|
|
765
|
+
payload
|
|
766
|
+
);
|
|
767
|
+
}
|
|
768
|
+
/** Execute a command against a durable store (Redis-style engines). */
|
|
769
|
+
async commandStore(id, payload) {
|
|
770
|
+
return this.request(
|
|
771
|
+
"POST",
|
|
772
|
+
`/stores/${encodeURIComponent(id)}/command`,
|
|
773
|
+
payload
|
|
774
|
+
);
|
|
775
|
+
}
|
|
614
776
|
/**
|
|
615
777
|
* Create a sandbox session with automatic cleanup.
|
|
616
778
|
*
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/errors.ts","../src/browser.ts","../src/sandbox.ts","../src/sse.ts","../src/client.ts"],"sourcesContent":["import type { AgentKernelOptions } from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"http://localhost:18888\";\nconst DEFAULT_TIMEOUT = 30_000;\n\n/** Resolve configuration from constructor args, env vars, and defaults. */\nexport function resolveConfig(opts?: AgentKernelOptions) {\n const baseUrl =\n opts?.baseUrl ??\n process.env.AGENTKERNEL_BASE_URL ??\n DEFAULT_BASE_URL;\n\n const apiKey =\n opts?.apiKey ??\n process.env.AGENTKERNEL_API_KEY ??\n undefined;\n\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n\n return {\n baseUrl: baseUrl.replace(/\\/+$/, \"\"),\n apiKey,\n timeout,\n };\n}\n","/** Base error for all agentkernel SDK errors. */\nexport class AgentKernelError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AgentKernelError\";\n }\n}\n\n/** 401 Unauthorized. */\nexport class AuthError extends AgentKernelError {\n readonly status = 401;\n constructor(message = \"Unauthorized\") {\n super(message);\n this.name = \"AuthError\";\n }\n}\n\n/** 404 Not Found. */\nexport class NotFoundError extends AgentKernelError {\n readonly status = 404;\n constructor(message = \"Not found\") {\n super(message);\n this.name = \"NotFoundError\";\n }\n}\n\n/** 400 Bad Request. */\nexport class ValidationError extends AgentKernelError {\n readonly status = 400;\n constructor(message = \"Bad request\") {\n super(message);\n this.name = \"ValidationError\";\n }\n}\n\n/** 500 Internal Server Error. */\nexport class ServerError extends AgentKernelError {\n readonly status = 500;\n constructor(message = \"Internal server error\") {\n super(message);\n this.name = \"ServerError\";\n }\n}\n\n/** Network / connection error. */\nexport class NetworkError extends AgentKernelError {\n constructor(message = \"Network error\") {\n super(message);\n this.name = \"NetworkError\";\n }\n}\n\n/** SSE streaming error. */\nexport class StreamError extends AgentKernelError {\n constructor(message = \"Stream error\") {\n super(message);\n this.name = \"StreamError\";\n }\n}\n\n/** Map an HTTP status code + body to the appropriate error. */\nexport function errorFromStatus(status: number, body: string): AgentKernelError {\n let message: string;\n try {\n const parsed = JSON.parse(body);\n message = parsed.error ?? body;\n } catch {\n message = body;\n }\n\n switch (status) {\n case 400:\n return new ValidationError(message);\n case 401:\n return new AuthError(message);\n case 404:\n return new NotFoundError(message);\n default:\n return new ServerError(message);\n }\n}\n","/**\n * Browser session for orchestrating headless browsers in sandboxes.\n *\n * Each method generates a self-contained Python/Playwright script,\n * runs it inside the sandbox, and parses the JSON result.\n */\n\nimport type { AriaSnapshot, PageResult, RunOutput } from \"./types.js\";\n\ntype RunInSandboxFn = (\n name: string,\n command: string[],\n) => Promise<RunOutput>;\ntype RemoveSandboxFn = (name: string) => Promise<void>;\n\nconst GOTO_SCRIPT = `\nimport asyncio, json, sys\nfrom playwright.async_api import async_playwright\nasync def main():\n url = sys.argv[1]\n async with async_playwright() as p:\n b = await p.chromium.launch()\n page = await b.new_page()\n await page.goto(url, timeout=30000)\n title = await page.title()\n url_final = page.url\n text = await page.evaluate(\"() => document.body.innerText.slice(0, 8000)\")\n links = await page.evaluate('''() =>\n Array.from(document.querySelectorAll('a[href]'))\n .slice(0, 50)\n .map(a => ({text: a.textContent.trim(), href: a.href}))\n .filter(l => l.href.startsWith(\"http\"))\n ''')\n print(json.dumps({\"title\": title, \"url\": url_final, \"text\": text, \"links\": links}))\n await b.close()\nasyncio.run(main())\n`;\n\nconst SCREENSHOT_SCRIPT = `\nimport asyncio, base64, sys\nfrom playwright.async_api import async_playwright\nasync def main():\n url = sys.argv[1]\n async with async_playwright() as p:\n b = await p.chromium.launch()\n page = await b.new_page()\n await page.goto(url, timeout=30000)\n data = await page.screenshot()\n print(base64.b64encode(data).decode())\n await b.close()\nasyncio.run(main())\n`;\n\nconst EVALUATE_SCRIPT = `\nimport asyncio, json, sys\nfrom playwright.async_api import async_playwright\nasync def main():\n url = sys.argv[1]\n expr = sys.argv[2]\n async with async_playwright() as p:\n b = await p.chromium.launch()\n page = await b.new_page()\n await page.goto(url, timeout=30000)\n result = await page.evaluate(expr)\n print(json.dumps(result))\n await b.close()\nasyncio.run(main())\n`;\n\n/** Command to install Playwright + Chromium inside the sandbox. */\nexport const BROWSER_SETUP_CMD = [\n \"sh\",\n \"-c\",\n \"pip install -q playwright && playwright install --with-deps chromium\",\n];\n\n// --- v2 scripts ---\n\nconst BROWSER_HEALTH_SCRIPT = `\nimport json, urllib.request, sys\nport = sys.argv[1] if len(sys.argv) > 1 else \"9222\"\ntry:\n req = urllib.request.urlopen(f\"http://127.0.0.1:{port}/health\", timeout=5)\n print(req.read().decode())\nexcept Exception as e:\n print(json.dumps({\"status\": \"down\", \"error\": str(e)}))\n sys.exit(1)\n`;\n\nconst BROWSER_REQUEST_SCRIPT = `\nimport json, urllib.request, sys\nport = sys.argv[1] if len(sys.argv) > 1 else \"9222\"\nmethod = sys.argv[2] if len(sys.argv) > 2 else \"GET\"\npath = sys.argv[3] if len(sys.argv) > 3 else \"/health\"\nbody_str = sys.argv[4] if len(sys.argv) > 4 else None\nurl = f\"http://127.0.0.1:{port}{path}\"\ndata = body_str.encode() if body_str else None\nreq = urllib.request.Request(url, data=data, method=method)\nif data:\n req.add_header(\"Content-Type\", \"application/json\")\ntry:\n resp = urllib.request.urlopen(req, timeout=60)\n print(resp.read().decode())\nexcept urllib.error.HTTPError as e:\n print(e.read().decode())\n sys.exit(1)\nexcept Exception as e:\n print(json.dumps({\"error\": str(e)}))\n sys.exit(1)\n`;\n\n/**\n * A sandboxed headless browser controlled from outside.\n *\n * The browser (Chromium via Playwright) runs inside an agentkernel sandbox.\n * You call high-level methods; the SDK generates and runs scripts internally.\n *\n * @example\n * ```ts\n * await using browser = await client.browser(\"my-browser\");\n * const page = await browser.goto(\"https://example.com\");\n * console.log(page.title, page.links);\n * ```\n */\nexport class BrowserSession implements AsyncDisposable {\n readonly name: string;\n private _removed = false;\n private _lastUrl: string | null = null;\n private readonly _run: RunInSandboxFn;\n private readonly _remove: RemoveSandboxFn;\n\n /** @internal */\n constructor(name: string, runFn: RunInSandboxFn, removeFn: RemoveSandboxFn) {\n this.name = name;\n this._run = runFn;\n this._remove = removeFn;\n }\n\n /** Navigate to a URL and return page data (title, text, links). */\n async goto(url: string): Promise<PageResult> {\n const result = await this._run(this.name, [\n \"python3\",\n \"-c\",\n GOTO_SCRIPT,\n url,\n ]);\n this._lastUrl = url;\n return JSON.parse(result.output) as PageResult;\n }\n\n /** Take a PNG screenshot. Returns a base64-encoded string. */\n async screenshot(url?: string): Promise<string> {\n const target = url ?? this._lastUrl;\n if (!target) {\n throw new Error(\"No URL specified and no previous goto() call\");\n }\n const result = await this._run(this.name, [\n \"python3\",\n \"-c\",\n SCREENSHOT_SCRIPT,\n target,\n ]);\n return result.output.trim();\n }\n\n /** Run a JavaScript expression on a page and return the result. */\n async evaluate(expression: string, url?: string): Promise<unknown> {\n const target = url ?? this._lastUrl;\n if (!target) {\n throw new Error(\"No URL specified and no previous goto() call\");\n }\n const result = await this._run(this.name, [\n \"python3\",\n \"-c\",\n EVALUATE_SCRIPT,\n target,\n expression,\n ]);\n return JSON.parse(result.output);\n }\n\n // --- v2 methods (ARIA snapshots, persistent pages, ref-based interaction) ---\n\n /** Navigate to a URL and return an ARIA snapshot. */\n async open(url: string, page = \"default\"): Promise<AriaSnapshot> {\n await this._ensureServer();\n const result = await this._browserRequest(\n \"POST\",\n `/pages/${page}/goto`,\n JSON.stringify({ url }),\n );\n return JSON.parse(result.output) as AriaSnapshot;\n }\n\n /** Get the current ARIA snapshot without navigating. */\n async snapshot(page = \"default\"): Promise<AriaSnapshot> {\n await this._ensureServer();\n const result = await this._browserRequest(\n \"GET\",\n `/pages/${page}/snapshot`,\n );\n return JSON.parse(result.output) as AriaSnapshot;\n }\n\n /** Click an element by ref ID or CSS selector. Returns new snapshot. */\n async click(opts: { ref?: string; selector?: string; page?: string }): Promise<AriaSnapshot> {\n const page = opts.page ?? \"default\";\n await this._ensureServer();\n const body: Record<string, string> = {};\n if (opts.ref) body.ref = opts.ref;\n if (opts.selector) body.selector = opts.selector;\n const result = await this._browserRequest(\n \"POST\",\n `/pages/${page}/click`,\n JSON.stringify(body),\n );\n const data = JSON.parse(result.output);\n if (data.error) throw new Error(data.error);\n return data as AriaSnapshot;\n }\n\n /** Fill an input by ref ID or CSS selector. Returns new snapshot. */\n async fill(\n value: string,\n opts: { ref?: string; selector?: string; page?: string },\n ): Promise<AriaSnapshot> {\n const page = opts.page ?? \"default\";\n await this._ensureServer();\n const body: Record<string, string> = { value };\n if (opts.ref) body.ref = opts.ref;\n if (opts.selector) body.selector = opts.selector;\n const result = await this._browserRequest(\n \"POST\",\n `/pages/${page}/fill`,\n JSON.stringify(body),\n );\n const data = JSON.parse(result.output);\n if (data.error) throw new Error(data.error);\n return data as AriaSnapshot;\n }\n\n /** Close a named page. */\n async closePage(page = \"default\"): Promise<void> {\n await this._ensureServer();\n await this._browserRequest(\"DELETE\", `/pages/${page}`);\n }\n\n /** List active page names. */\n async listPages(): Promise<string[]> {\n await this._ensureServer();\n const result = await this._browserRequest(\"GET\", \"/pages\");\n const data = JSON.parse(result.output);\n return data.pages ?? [];\n }\n\n private _serverStarted = false;\n\n private async _ensureServer(): Promise<void> {\n if (this._serverStarted) return;\n // Health check\n try {\n const result = await this._run(this.name, [\n \"python3\", \"-c\", BROWSER_HEALTH_SCRIPT, \"9222\",\n ]);\n if (result.output.includes('\"status\":\"ok\"') || result.output.includes('\"status\": \"ok\"')) {\n this._serverStarted = true;\n return;\n }\n } catch {\n // Server not running, start it\n }\n // Start would require the full server script + ARIA JS — for SDK use,\n // the server is expected to already be running (started via browser_create or MCP)\n throw new Error(\n \"Browser server not running. Use browser_create to set up the sandbox, \" +\n \"or use the MCP browser_open tool which auto-starts the server.\",\n );\n }\n\n private async _browserRequest(\n method: string,\n path: string,\n body?: string,\n ): Promise<RunOutput> {\n const cmd = [\"python3\", \"-c\", BROWSER_REQUEST_SCRIPT, \"9222\", method, path];\n if (body) cmd.push(body);\n return this._run(this.name, cmd);\n }\n\n // --- v1 methods (backward compatible) ---\n\n /** Remove the sandbox. Idempotent. */\n async remove(): Promise<void> {\n if (this._removed) return;\n this._removed = true;\n await this._remove(this.name);\n }\n\n /** Auto-cleanup for `await using`. */\n async [Symbol.asyncDispose](): Promise<void> {\n await this.remove();\n }\n}\n","import type {\n BatchFileWriteResponse,\n ExecOptions,\n RunOutput,\n SandboxInfo,\n} from \"./types.js\";\n\ntype ExecFn = (\n name: string,\n command: string[],\n opts?: ExecOptions,\n) => Promise<RunOutput>;\ntype RemoveFn = (name: string) => Promise<void>;\ntype GetFn = (name: string) => Promise<SandboxInfo>;\ntype WriteFilesFn = (\n name: string,\n files: Record<string, string>,\n) => Promise<BatchFileWriteResponse>;\n\n/**\n * A sandbox session that auto-removes the sandbox on dispose.\n *\n * Supports both explicit cleanup via remove() and automatic cleanup via\n * Symbol.asyncDispose (TS 5.2+ `await using`).\n *\n * @example\n * ```ts\n * await using sb = await client.sandbox(\"test\");\n * await sb.exec([\"echo\", \"hello\"]);\n * // sandbox auto-removed when scope exits\n * ```\n */\nexport class SandboxSession implements AsyncDisposable {\n readonly name: string;\n private _removed = false;\n private readonly _execInSandbox: ExecFn;\n private readonly _removeSandbox: RemoveFn;\n private readonly _getSandbox: GetFn;\n private readonly _writeFiles: WriteFilesFn;\n\n /** @internal */\n constructor(\n name: string,\n execInSandbox: ExecFn,\n removeSandbox: RemoveFn,\n getSandbox: GetFn,\n writeFiles: WriteFilesFn,\n ) {\n this.name = name;\n this._execInSandbox = execInSandbox;\n this._removeSandbox = removeSandbox;\n this._getSandbox = getSandbox;\n this._writeFiles = writeFiles;\n }\n\n /** Run a command in this sandbox. */\n async run(command: string[], opts?: ExecOptions): Promise<RunOutput> {\n return this._execInSandbox(this.name, command, opts);\n }\n\n /** Get sandbox info. */\n async info(): Promise<SandboxInfo> {\n return this._getSandbox(this.name);\n }\n\n /** Write multiple files in one request. */\n async writeFiles(\n files: Record<string, string>,\n ): Promise<BatchFileWriteResponse> {\n return this._writeFiles(this.name, files);\n }\n\n /** Remove the sandbox. Idempotent. */\n async remove(): Promise<void> {\n if (this._removed) return;\n this._removed = true;\n await this._removeSandbox(this.name);\n }\n\n /** Auto-cleanup for `await using`. */\n async [Symbol.asyncDispose](): Promise<void> {\n await this.remove();\n }\n}\n","import { createParser, type EventSourceMessage } from \"eventsource-parser\";\nimport type { StreamEvent, StreamEventType } from \"./types.js\";\n\nconst KNOWN_EVENTS = new Set<string>([\"started\", \"progress\", \"output\", \"done\", \"error\"]);\n\n/** Shared mutable state between the pump and the generator. */\ninterface PumpState {\n events: StreamEvent[];\n resolve: (() => void) | null;\n done: boolean;\n}\n\nfunction pushEvent(state: PumpState, event: StreamEvent): void {\n state.events.push(event);\n if (state.resolve) {\n const cb = state.resolve;\n state.resolve = null;\n cb();\n }\n}\n\n/**\n * Parse an SSE response body into an async generator of StreamEvents.\n *\n * Consumes a ReadableStream<Uint8Array> from fetch() and yields typed events\n * until the stream closes or a \"done\"/\"error\" event is received.\n */\nexport async function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<StreamEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n const state: PumpState = { events: [], resolve: null, done: false };\n\n const parser = createParser({\n onEvent(event: EventSourceMessage) {\n const type = event.event ?? \"message\";\n if (!KNOWN_EVENTS.has(type)) return;\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(event.data);\n } catch {\n data = { raw: event.data };\n }\n\n pushEvent(state, { type: type as StreamEventType, data });\n },\n });\n\n // Read the stream in the background\n const pump = (async () => {\n try {\n for (;;) {\n const result = await reader.read();\n if (result.done) break;\n parser.feed(decoder.decode(result.value, { stream: true }));\n }\n } catch (err) {\n pushEvent(state, {\n type: \"error\",\n data: { message: err instanceof Error ? err.message : String(err) },\n });\n } finally {\n state.done = true;\n if (state.resolve) {\n const cb = state.resolve;\n state.resolve = null;\n cb();\n }\n }\n })();\n\n try {\n for (;;) {\n // Yield all buffered events\n while (state.events.length > 0) {\n const event = state.events.shift()!;\n yield event;\n if (event.type === \"done\" || event.type === \"error\") return;\n }\n\n // If the stream is done and no more events, exit\n if (state.done) return;\n\n // Wait for the next event\n await new Promise<void>((r) => {\n state.resolve = r;\n });\n }\n } finally {\n reader.cancel().catch(() => {});\n await pump.catch(() => {});\n }\n}\n","import { resolveConfig } from \"./config.js\";\nimport {\n AgentKernelError,\n NetworkError,\n errorFromStatus,\n} from \"./errors.js\";\nimport { BrowserSession, BROWSER_SETUP_CMD } from \"./browser.js\";\nimport { SandboxSession } from \"./sandbox.js\";\nimport { parseSSE } from \"./sse.js\";\nimport type {\n AgentKernelOptions,\n ApiResponse,\n BatchCommand,\n BatchFileWriteResponse,\n BatchRunResponse,\n CreateSandboxOptions,\n DetachedCommand,\n DetachedLogsResponse,\n ExecOptions,\n ExtendTtlOptions,\n ExtendTtlResponse,\n FileReadResponse,\n FileWriteOptions,\n RunOptions,\n RunOutput,\n SandboxInfo,\n SnapshotMeta,\n StreamEvent,\n TakeSnapshotOptions,\n} from \"./types.js\";\n\nconst SDK_VERSION = \"0.3.0\";\n\n/**\n * Client for the agentkernel HTTP API.\n *\n * @example\n * ```ts\n * const client = new AgentKernel();\n * const result = await client.run([\"echo\", \"hello\"]);\n * console.log(result.output); // \"hello\\n\"\n * ```\n */\nexport class AgentKernel {\n private readonly baseUrl: string;\n private readonly apiKey: string | undefined;\n private readonly timeout: number;\n\n constructor(opts?: AgentKernelOptions) {\n const config = resolveConfig(opts);\n this.baseUrl = config.baseUrl;\n this.apiKey = config.apiKey;\n this.timeout = config.timeout;\n }\n\n // -- Core API methods --\n\n /** Health check. Returns \"ok\" if the server is running. */\n async health(): Promise<string> {\n const res = await this.request<string>(\"GET\", \"/health\");\n return res;\n }\n\n /** Run a command in a temporary sandbox. */\n async run(command: string[], opts?: RunOptions): Promise<RunOutput> {\n return this.request<RunOutput>(\"POST\", \"/run\", {\n command,\n image: opts?.image,\n profile: opts?.profile,\n fast: opts?.fast ?? true,\n });\n }\n\n /**\n * Run a command with SSE streaming output.\n *\n * @example\n * ```ts\n * for await (const event of client.runStream([\"python3\", \"script.py\"])) {\n * if (event.type === \"output\") process.stdout.write(String(event.data.data));\n * }\n * ```\n */\n async *runStream(\n command: string[],\n opts?: RunOptions,\n ): AsyncGenerator<StreamEvent> {\n const body = JSON.stringify({\n command,\n image: opts?.image,\n profile: opts?.profile,\n fast: opts?.fast ?? true,\n });\n\n const response = await this.fetch(\"/run/stream\", {\n method: \"POST\",\n headers: this.headers(\"application/json\"),\n body,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw errorFromStatus(response.status, text);\n }\n\n if (!response.body) {\n throw new AgentKernelError(\"No response body for SSE stream\");\n }\n\n yield* parseSSE(response.body);\n }\n\n /** List all sandboxes. */\n async listSandboxes(): Promise<SandboxInfo[]> {\n return this.request<SandboxInfo[]>(\"GET\", \"/sandboxes\");\n }\n\n /** Create a new sandbox. */\n async createSandbox(\n name: string,\n opts?: CreateSandboxOptions,\n ): Promise<SandboxInfo> {\n return this.request<SandboxInfo>(\"POST\", \"/sandboxes\", {\n name,\n image: opts?.image,\n vcpus: opts?.vcpus,\n memory_mb: opts?.memory_mb,\n profile: opts?.profile,\n source_url: opts?.source_url,\n source_ref: opts?.source_ref,\n volumes: opts?.volumes,\n secrets: opts?.secrets,\n secret_files: opts?.secret_files,\n });\n }\n\n /** Get info about a sandbox. */\n async getSandbox(name: string): Promise<SandboxInfo> {\n return this.request<SandboxInfo>(\"GET\", `/sandboxes/${encodeURIComponent(name)}`);\n }\n\n /** Remove a sandbox. */\n async removeSandbox(name: string): Promise<void> {\n await this.request<string>(\"DELETE\", `/sandboxes/${encodeURIComponent(name)}`);\n }\n\n /** Run a command in an existing sandbox. */\n async execInSandbox(\n name: string,\n command: string[],\n opts?: ExecOptions,\n ): Promise<RunOutput> {\n return this.request<RunOutput>(\n \"POST\",\n `/sandboxes/${encodeURIComponent(name)}/exec`,\n {\n command,\n env: opts?.env,\n workdir: opts?.workdir,\n sudo: opts?.sudo,\n },\n );\n }\n\n /** Read a file from a sandbox. */\n async readFile(name: string, path: string): Promise<FileReadResponse> {\n return this.request<FileReadResponse>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/files/${path}`,\n );\n }\n\n /** Write a file to a sandbox. */\n async writeFile(\n name: string,\n path: string,\n content: string,\n opts?: FileWriteOptions,\n ): Promise<string> {\n return this.request<string>(\n \"PUT\",\n `/sandboxes/${encodeURIComponent(name)}/files/${path}`,\n { content, encoding: opts?.encoding ?? \"utf8\" },\n );\n }\n\n /** Delete a file from a sandbox. */\n async deleteFile(name: string, path: string): Promise<string> {\n return this.request<string>(\n \"DELETE\",\n `/sandboxes/${encodeURIComponent(name)}/files/${path}`,\n );\n }\n\n /** Get audit log entries for a sandbox. */\n async getSandboxLogs(name: string): Promise<Record<string, unknown>[]> {\n return this.request<Record<string, unknown>[]>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/logs`,\n );\n }\n\n /** Write multiple files to a sandbox in one request. */\n async writeFiles(\n name: string,\n files: Record<string, string>,\n ): Promise<BatchFileWriteResponse> {\n return this.request<BatchFileWriteResponse>(\n \"POST\",\n `/sandboxes/${encodeURIComponent(name)}/files`,\n { files },\n );\n }\n\n /** Run multiple commands in parallel. */\n async batchRun(commands: BatchCommand[]): Promise<BatchRunResponse> {\n return this.request<BatchRunResponse>(\"POST\", \"/batch/run\", { commands });\n }\n\n /** Start a detached (background) command in a sandbox. */\n async execDetached(\n name: string,\n command: string[],\n opts?: ExecOptions,\n ): Promise<DetachedCommand> {\n return this.request<DetachedCommand>(\n \"POST\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detach`,\n {\n command,\n env: opts?.env,\n workdir: opts?.workdir,\n sudo: opts?.sudo,\n },\n );\n }\n\n /** Get the status of a detached command. */\n async detachedStatus(\n name: string,\n cmdId: string,\n ): Promise<DetachedCommand> {\n return this.request<DetachedCommand>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detached/${encodeURIComponent(cmdId)}`,\n );\n }\n\n /** Get logs from a detached command. */\n async detachedLogs(\n name: string,\n cmdId: string,\n stream?: \"stdout\" | \"stderr\",\n ): Promise<DetachedLogsResponse> {\n const query = stream === \"stderr\" ? \"?stream=stderr\" : \"\";\n return this.request<DetachedLogsResponse>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detached/${encodeURIComponent(cmdId)}/logs${query}`,\n );\n }\n\n /** Kill a detached command. */\n async detachedKill(name: string, cmdId: string): Promise<string> {\n return this.request<string>(\n \"DELETE\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detached/${encodeURIComponent(cmdId)}`,\n );\n }\n\n /** List detached commands in a sandbox. */\n async detachedList(name: string): Promise<DetachedCommand[]> {\n return this.request<DetachedCommand[]>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detached`,\n );\n }\n\n /**\n * Create a sandbox session with automatic cleanup.\n *\n * The returned SandboxSession implements AsyncDisposable,\n * so it works with `await using` (TS 5.2+):\n *\n * @example\n * ```ts\n * await using sb = await client.sandbox(\"test\", { image: \"python:3.12-alpine\" });\n * await sb.run([\"pip\", \"install\", \"numpy\"]);\n * // sandbox auto-removed when scope exits\n * ```\n */\n async sandbox(\n name: string,\n opts?: CreateSandboxOptions,\n ): Promise<SandboxSession> {\n await this.createSandbox(name, opts);\n return new SandboxSession(\n name,\n (n, cmd, o) => this.execInSandbox(n, cmd, o),\n (n) => this.removeSandbox(n),\n (n) => this.getSandbox(n),\n (n, f) => this.writeFiles(n, f),\n );\n }\n\n /**\n * Create a sandboxed browser session with automatic cleanup.\n *\n * Creates a sandbox with Chromium pre-installed via Playwright.\n * Use `goto()`, `screenshot()`, and `evaluate()` to interact with web pages.\n *\n * @example\n * ```ts\n * await using browser = await client.browser(\"my-browser\");\n * const page = await browser.goto(\"https://example.com\");\n * console.log(page.title, page.links);\n * // sandbox auto-removed when scope exits\n * ```\n */\n async browser(\n name: string,\n opts?: { memory_mb?: number },\n ): Promise<BrowserSession> {\n await this.createSandbox(name, {\n image: \"python:3.12-slim\",\n memory_mb: opts?.memory_mb ?? 2048,\n profile: \"moderate\",\n });\n await this.execInSandbox(name, BROWSER_SETUP_CMD);\n return new BrowserSession(\n name,\n (n, cmd) => this.execInSandbox(n, cmd),\n (n) => this.removeSandbox(n),\n );\n }\n\n // -- TTL & Snapshot methods --\n\n /** Extend a sandbox's TTL. Returns the new expiry time. */\n async extendTtl(name: string, opts: ExtendTtlOptions): Promise<ExtendTtlResponse> {\n return this.request<ExtendTtlResponse>(\n \"POST\",\n `/sandboxes/${encodeURIComponent(name)}/extend`,\n { by: opts.by },\n );\n }\n\n /** List all snapshots. */\n async listSnapshots(): Promise<SnapshotMeta[]> {\n return this.request<SnapshotMeta[]>(\"GET\", \"/snapshots\");\n }\n\n /** Take a snapshot of a sandbox. */\n async takeSnapshot(opts: TakeSnapshotOptions): Promise<SnapshotMeta> {\n return this.request<SnapshotMeta>(\"POST\", \"/snapshots\", opts);\n }\n\n /** Get info about a snapshot. */\n async getSnapshot(name: string): Promise<SnapshotMeta> {\n return this.request<SnapshotMeta>(\n \"GET\",\n `/snapshots/${encodeURIComponent(name)}`,\n );\n }\n\n /** Delete a snapshot. */\n async deleteSnapshot(name: string): Promise<void> {\n await this.request<string>(\n \"DELETE\",\n `/snapshots/${encodeURIComponent(name)}`,\n );\n }\n\n /** Restore a sandbox from a snapshot. */\n async restoreSnapshot(name: string): Promise<SandboxInfo> {\n return this.request<SandboxInfo>(\n \"POST\",\n `/snapshots/${encodeURIComponent(name)}/restore`,\n );\n }\n\n // -- Internal helpers --\n\n private headers(contentType?: string): Record<string, string> {\n const h: Record<string, string> = {\n \"User-Agent\": `agentkernel-nodejs-sdk/${SDK_VERSION}`,\n };\n if (contentType) h[\"Content-Type\"] = contentType;\n if (this.apiKey) h[\"Authorization\"] = `Bearer ${this.apiKey}`;\n return h;\n }\n\n private async fetch(path: string, init: RequestInit): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n try {\n return await fetch(url, {\n ...init,\n signal: AbortSignal.timeout(this.timeout),\n });\n } catch (err) {\n if (err instanceof DOMException && err.name === \"TimeoutError\") {\n throw new NetworkError(`Request timed out after ${this.timeout}ms`);\n }\n if (err instanceof TypeError) {\n throw new NetworkError(`Failed to connect to ${this.baseUrl}: ${err.message}`);\n }\n throw new NetworkError(\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n ): Promise<T> {\n const init: RequestInit = {\n method,\n headers: this.headers(body ? \"application/json\" : undefined),\n };\n if (body) init.body = JSON.stringify(body);\n\n const response = await this.fetch(path, init);\n\n const text = await response.text();\n if (!response.ok) {\n throw errorFromStatus(response.status, text);\n }\n\n const parsed: ApiResponse<T> = JSON.parse(text);\n if (!parsed.success) {\n throw new AgentKernelError(parsed.error ?? \"Unknown error\");\n }\n return parsed.data as T;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/errors.ts","../src/browser.ts","../src/sandbox.ts","../src/sse.ts","../src/client.ts"],"sourcesContent":["import type { AgentKernelOptions } from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"http://localhost:18888\";\nconst DEFAULT_TIMEOUT = 30_000;\n\n/** Resolve configuration from constructor args, env vars, and defaults. */\nexport function resolveConfig(opts?: AgentKernelOptions) {\n const baseUrl =\n opts?.baseUrl ??\n process.env.AGENTKERNEL_BASE_URL ??\n DEFAULT_BASE_URL;\n\n const apiKey =\n opts?.apiKey ??\n process.env.AGENTKERNEL_API_KEY ??\n undefined;\n\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n\n return {\n baseUrl: baseUrl.replace(/\\/+$/, \"\"),\n apiKey,\n timeout,\n };\n}\n","/** Base error for all agentkernel SDK errors. */\nexport class AgentKernelError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AgentKernelError\";\n }\n}\n\n/** 401 Unauthorized. */\nexport class AuthError extends AgentKernelError {\n readonly status = 401;\n constructor(message = \"Unauthorized\") {\n super(message);\n this.name = \"AuthError\";\n }\n}\n\n/** 404 Not Found. */\nexport class NotFoundError extends AgentKernelError {\n readonly status = 404;\n constructor(message = \"Not found\") {\n super(message);\n this.name = \"NotFoundError\";\n }\n}\n\n/** 400 Bad Request. */\nexport class ValidationError extends AgentKernelError {\n readonly status = 400;\n constructor(message = \"Bad request\") {\n super(message);\n this.name = \"ValidationError\";\n }\n}\n\n/** 500 Internal Server Error. */\nexport class ServerError extends AgentKernelError {\n readonly status = 500;\n constructor(message = \"Internal server error\") {\n super(message);\n this.name = \"ServerError\";\n }\n}\n\n/** Network / connection error. */\nexport class NetworkError extends AgentKernelError {\n constructor(message = \"Network error\") {\n super(message);\n this.name = \"NetworkError\";\n }\n}\n\n/** SSE streaming error. */\nexport class StreamError extends AgentKernelError {\n constructor(message = \"Stream error\") {\n super(message);\n this.name = \"StreamError\";\n }\n}\n\n/** Map an HTTP status code + body to the appropriate error. */\nexport function errorFromStatus(status: number, body: string): AgentKernelError {\n let message: string;\n try {\n const parsed = JSON.parse(body);\n message = parsed.error ?? body;\n } catch {\n message = body;\n }\n\n switch (status) {\n case 400:\n return new ValidationError(message);\n case 401:\n return new AuthError(message);\n case 404:\n return new NotFoundError(message);\n default:\n return new ServerError(message);\n }\n}\n","/**\n * Browser session for orchestrating headless browsers in sandboxes.\n *\n * Each method generates a self-contained Python/Playwright script,\n * runs it inside the sandbox, and parses the JSON result.\n */\n\nimport type { AriaSnapshot, PageResult, RunOutput } from \"./types.js\";\n\ntype RunInSandboxFn = (\n name: string,\n command: string[],\n) => Promise<RunOutput>;\ntype RemoveSandboxFn = (name: string) => Promise<void>;\n\nconst GOTO_SCRIPT = `\nimport asyncio, json, sys\nfrom playwright.async_api import async_playwright\nasync def main():\n url = sys.argv[1]\n async with async_playwright() as p:\n b = await p.chromium.launch()\n page = await b.new_page()\n await page.goto(url, timeout=30000)\n title = await page.title()\n url_final = page.url\n text = await page.evaluate(\"() => document.body.innerText.slice(0, 8000)\")\n links = await page.evaluate('''() =>\n Array.from(document.querySelectorAll('a[href]'))\n .slice(0, 50)\n .map(a => ({text: a.textContent.trim(), href: a.href}))\n .filter(l => l.href.startsWith(\"http\"))\n ''')\n print(json.dumps({\"title\": title, \"url\": url_final, \"text\": text, \"links\": links}))\n await b.close()\nasyncio.run(main())\n`;\n\nconst SCREENSHOT_SCRIPT = `\nimport asyncio, base64, sys\nfrom playwright.async_api import async_playwright\nasync def main():\n url = sys.argv[1]\n async with async_playwright() as p:\n b = await p.chromium.launch()\n page = await b.new_page()\n await page.goto(url, timeout=30000)\n data = await page.screenshot()\n print(base64.b64encode(data).decode())\n await b.close()\nasyncio.run(main())\n`;\n\nconst EVALUATE_SCRIPT = `\nimport asyncio, json, sys\nfrom playwright.async_api import async_playwright\nasync def main():\n url = sys.argv[1]\n expr = sys.argv[2]\n async with async_playwright() as p:\n b = await p.chromium.launch()\n page = await b.new_page()\n await page.goto(url, timeout=30000)\n result = await page.evaluate(expr)\n print(json.dumps(result))\n await b.close()\nasyncio.run(main())\n`;\n\n/** Command to install Playwright + Chromium inside the sandbox. */\nexport const BROWSER_SETUP_CMD = [\n \"sh\",\n \"-c\",\n \"pip install -q playwright && playwright install --with-deps chromium\",\n];\n\n// --- v2 scripts ---\n\nconst BROWSER_HEALTH_SCRIPT = `\nimport json, urllib.request, sys\nport = sys.argv[1] if len(sys.argv) > 1 else \"9222\"\ntry:\n req = urllib.request.urlopen(f\"http://127.0.0.1:{port}/health\", timeout=5)\n print(req.read().decode())\nexcept Exception as e:\n print(json.dumps({\"status\": \"down\", \"error\": str(e)}))\n sys.exit(1)\n`;\n\nconst BROWSER_REQUEST_SCRIPT = `\nimport json, urllib.request, sys\nport = sys.argv[1] if len(sys.argv) > 1 else \"9222\"\nmethod = sys.argv[2] if len(sys.argv) > 2 else \"GET\"\npath = sys.argv[3] if len(sys.argv) > 3 else \"/health\"\nbody_str = sys.argv[4] if len(sys.argv) > 4 else None\nurl = f\"http://127.0.0.1:{port}{path}\"\ndata = body_str.encode() if body_str else None\nreq = urllib.request.Request(url, data=data, method=method)\nif data:\n req.add_header(\"Content-Type\", \"application/json\")\ntry:\n resp = urllib.request.urlopen(req, timeout=60)\n print(resp.read().decode())\nexcept urllib.error.HTTPError as e:\n print(e.read().decode())\n sys.exit(1)\nexcept Exception as e:\n print(json.dumps({\"error\": str(e)}))\n sys.exit(1)\n`;\n\n/**\n * A sandboxed headless browser controlled from outside.\n *\n * The browser (Chromium via Playwright) runs inside an agentkernel sandbox.\n * You call high-level methods; the SDK generates and runs scripts internally.\n *\n * @example\n * ```ts\n * await using browser = await client.browser(\"my-browser\");\n * const page = await browser.goto(\"https://example.com\");\n * console.log(page.title, page.links);\n * ```\n */\nexport class BrowserSession implements AsyncDisposable {\n readonly name: string;\n private _removed = false;\n private _lastUrl: string | null = null;\n private readonly _run: RunInSandboxFn;\n private readonly _remove: RemoveSandboxFn;\n\n /** @internal */\n constructor(name: string, runFn: RunInSandboxFn, removeFn: RemoveSandboxFn) {\n this.name = name;\n this._run = runFn;\n this._remove = removeFn;\n }\n\n /** Navigate to a URL and return page data (title, text, links). */\n async goto(url: string): Promise<PageResult> {\n const result = await this._run(this.name, [\n \"python3\",\n \"-c\",\n GOTO_SCRIPT,\n url,\n ]);\n this._lastUrl = url;\n return JSON.parse(result.output) as PageResult;\n }\n\n /** Take a PNG screenshot. Returns a base64-encoded string. */\n async screenshot(url?: string): Promise<string> {\n const target = url ?? this._lastUrl;\n if (!target) {\n throw new Error(\"No URL specified and no previous goto() call\");\n }\n const result = await this._run(this.name, [\n \"python3\",\n \"-c\",\n SCREENSHOT_SCRIPT,\n target,\n ]);\n return result.output.trim();\n }\n\n /** Run a JavaScript expression on a page and return the result. */\n async evaluate(expression: string, url?: string): Promise<unknown> {\n const target = url ?? this._lastUrl;\n if (!target) {\n throw new Error(\"No URL specified and no previous goto() call\");\n }\n const result = await this._run(this.name, [\n \"python3\",\n \"-c\",\n EVALUATE_SCRIPT,\n target,\n expression,\n ]);\n return JSON.parse(result.output);\n }\n\n // --- v2 methods (ARIA snapshots, persistent pages, ref-based interaction) ---\n\n /** Navigate to a URL and return an ARIA snapshot. */\n async open(url: string, page = \"default\"): Promise<AriaSnapshot> {\n await this._ensureServer();\n const result = await this._browserRequest(\n \"POST\",\n `/pages/${page}/goto`,\n JSON.stringify({ url }),\n );\n return JSON.parse(result.output) as AriaSnapshot;\n }\n\n /** Get the current ARIA snapshot without navigating. */\n async snapshot(page = \"default\"): Promise<AriaSnapshot> {\n await this._ensureServer();\n const result = await this._browserRequest(\n \"GET\",\n `/pages/${page}/snapshot`,\n );\n return JSON.parse(result.output) as AriaSnapshot;\n }\n\n /** Click an element by ref ID or CSS selector. Returns new snapshot. */\n async click(opts: { ref?: string; selector?: string; page?: string }): Promise<AriaSnapshot> {\n const page = opts.page ?? \"default\";\n await this._ensureServer();\n const body: Record<string, string> = {};\n if (opts.ref) body.ref = opts.ref;\n if (opts.selector) body.selector = opts.selector;\n const result = await this._browserRequest(\n \"POST\",\n `/pages/${page}/click`,\n JSON.stringify(body),\n );\n const data = JSON.parse(result.output);\n if (data.error) throw new Error(data.error);\n return data as AriaSnapshot;\n }\n\n /** Fill an input by ref ID or CSS selector. Returns new snapshot. */\n async fill(\n value: string,\n opts: { ref?: string; selector?: string; page?: string },\n ): Promise<AriaSnapshot> {\n const page = opts.page ?? \"default\";\n await this._ensureServer();\n const body: Record<string, string> = { value };\n if (opts.ref) body.ref = opts.ref;\n if (opts.selector) body.selector = opts.selector;\n const result = await this._browserRequest(\n \"POST\",\n `/pages/${page}/fill`,\n JSON.stringify(body),\n );\n const data = JSON.parse(result.output);\n if (data.error) throw new Error(data.error);\n return data as AriaSnapshot;\n }\n\n /** Close a named page. */\n async closePage(page = \"default\"): Promise<void> {\n await this._ensureServer();\n await this._browserRequest(\"DELETE\", `/pages/${page}`);\n }\n\n /** List active page names. */\n async listPages(): Promise<string[]> {\n await this._ensureServer();\n const result = await this._browserRequest(\"GET\", \"/pages\");\n const data = JSON.parse(result.output);\n return data.pages ?? [];\n }\n\n private _serverStarted = false;\n\n private async _ensureServer(): Promise<void> {\n if (this._serverStarted) return;\n // Health check\n try {\n const result = await this._run(this.name, [\n \"python3\", \"-c\", BROWSER_HEALTH_SCRIPT, \"9222\",\n ]);\n if (result.output.includes('\"status\":\"ok\"') || result.output.includes('\"status\": \"ok\"')) {\n this._serverStarted = true;\n return;\n }\n } catch {\n // Server not running, start it\n }\n // Start would require the full server script + ARIA JS — for SDK use,\n // the server is expected to already be running (started via browser_create or MCP)\n throw new Error(\n \"Browser server not running. Use browser_create to set up the sandbox, \" +\n \"or use the MCP browser_open tool which auto-starts the server.\",\n );\n }\n\n private async _browserRequest(\n method: string,\n path: string,\n body?: string,\n ): Promise<RunOutput> {\n const cmd = [\"python3\", \"-c\", BROWSER_REQUEST_SCRIPT, \"9222\", method, path];\n if (body) cmd.push(body);\n return this._run(this.name, cmd);\n }\n\n // --- v1 methods (backward compatible) ---\n\n /** Remove the sandbox. Idempotent. */\n async remove(): Promise<void> {\n if (this._removed) return;\n this._removed = true;\n await this._remove(this.name);\n }\n\n /** Auto-cleanup for `await using`. */\n async [Symbol.asyncDispose](): Promise<void> {\n await this.remove();\n }\n}\n","import type {\n BatchFileWriteResponse,\n ExecOptions,\n RunOutput,\n SandboxInfo,\n} from \"./types.js\";\n\ntype ExecFn = (\n name: string,\n command: string[],\n opts?: ExecOptions,\n) => Promise<RunOutput>;\ntype RemoveFn = (name: string) => Promise<void>;\ntype GetFn = (name: string) => Promise<SandboxInfo>;\ntype WriteFilesFn = (\n name: string,\n files: Record<string, string>,\n) => Promise<BatchFileWriteResponse>;\n\n/**\n * A sandbox session that auto-removes the sandbox on dispose.\n *\n * Supports both explicit cleanup via remove() and automatic cleanup via\n * Symbol.asyncDispose (TS 5.2+ `await using`).\n *\n * @example\n * ```ts\n * await using sb = await client.sandbox(\"test\");\n * await sb.exec([\"echo\", \"hello\"]);\n * // sandbox auto-removed when scope exits\n * ```\n */\nexport class SandboxSession implements AsyncDisposable {\n readonly name: string;\n private _removed = false;\n private readonly _execInSandbox: ExecFn;\n private readonly _removeSandbox: RemoveFn;\n private readonly _getSandbox: GetFn;\n private readonly _writeFiles: WriteFilesFn;\n\n /** @internal */\n constructor(\n name: string,\n execInSandbox: ExecFn,\n removeSandbox: RemoveFn,\n getSandbox: GetFn,\n writeFiles: WriteFilesFn,\n ) {\n this.name = name;\n this._execInSandbox = execInSandbox;\n this._removeSandbox = removeSandbox;\n this._getSandbox = getSandbox;\n this._writeFiles = writeFiles;\n }\n\n /** Run a command in this sandbox. */\n async run(command: string[], opts?: ExecOptions): Promise<RunOutput> {\n return this._execInSandbox(this.name, command, opts);\n }\n\n /** Get sandbox info. */\n async info(): Promise<SandboxInfo> {\n return this._getSandbox(this.name);\n }\n\n /** Write multiple files in one request. */\n async writeFiles(\n files: Record<string, string>,\n ): Promise<BatchFileWriteResponse> {\n return this._writeFiles(this.name, files);\n }\n\n /** Remove the sandbox. Idempotent. */\n async remove(): Promise<void> {\n if (this._removed) return;\n this._removed = true;\n await this._removeSandbox(this.name);\n }\n\n /** Auto-cleanup for `await using`. */\n async [Symbol.asyncDispose](): Promise<void> {\n await this.remove();\n }\n}\n","import { createParser, type EventSourceMessage } from \"eventsource-parser\";\nimport type { StreamEvent, StreamEventType } from \"./types.js\";\n\nconst KNOWN_EVENTS = new Set<string>([\"started\", \"progress\", \"output\", \"done\", \"error\"]);\n\n/** Shared mutable state between the pump and the generator. */\ninterface PumpState {\n events: StreamEvent[];\n resolve: (() => void) | null;\n done: boolean;\n}\n\nfunction pushEvent(state: PumpState, event: StreamEvent): void {\n state.events.push(event);\n if (state.resolve) {\n const cb = state.resolve;\n state.resolve = null;\n cb();\n }\n}\n\n/**\n * Parse an SSE response body into an async generator of StreamEvents.\n *\n * Consumes a ReadableStream<Uint8Array> from fetch() and yields typed events\n * until the stream closes or a \"done\"/\"error\" event is received.\n */\nexport async function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<StreamEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n const state: PumpState = { events: [], resolve: null, done: false };\n\n const parser = createParser({\n onEvent(event: EventSourceMessage) {\n const type = event.event ?? \"message\";\n if (!KNOWN_EVENTS.has(type)) return;\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(event.data);\n } catch {\n data = { raw: event.data };\n }\n\n pushEvent(state, { type: type as StreamEventType, data });\n },\n });\n\n // Read the stream in the background\n const pump = (async () => {\n try {\n for (;;) {\n const result = await reader.read();\n if (result.done) break;\n parser.feed(decoder.decode(result.value, { stream: true }));\n }\n } catch (err) {\n pushEvent(state, {\n type: \"error\",\n data: { message: err instanceof Error ? err.message : String(err) },\n });\n } finally {\n state.done = true;\n if (state.resolve) {\n const cb = state.resolve;\n state.resolve = null;\n cb();\n }\n }\n })();\n\n try {\n for (;;) {\n // Yield all buffered events\n while (state.events.length > 0) {\n const event = state.events.shift()!;\n yield event;\n if (event.type === \"done\" || event.type === \"error\") return;\n }\n\n // If the stream is done and no more events, exit\n if (state.done) return;\n\n // Wait for the next event\n await new Promise<void>((r) => {\n state.resolve = r;\n });\n }\n } finally {\n reader.cancel().catch(() => {});\n await pump.catch(() => {});\n }\n}\n","import { resolveConfig } from \"./config.js\";\nimport {\n AgentKernelError,\n NetworkError,\n errorFromStatus,\n} from \"./errors.js\";\nimport { BrowserSession, BROWSER_SETUP_CMD } from \"./browser.js\";\nimport { SandboxSession } from \"./sandbox.js\";\nimport { parseSSE } from \"./sse.js\";\nimport type {\n AgentKernelOptions,\n ApiResponse,\n BatchCommand,\n BatchFileWriteResponse,\n BatchRunResponse,\n CreateStoreRequest,\n CreateObjectRequest,\n CreateOrchestrationRequest,\n CreateScheduleRequest,\n CreateSandboxOptions,\n DetachedCommand,\n DetachedLogsResponse,\n ExecOptions,\n ExtendTtlOptions,\n ExtendTtlResponse,\n DurableObject,\n DurableStore,\n DurableStoreCommandResponse,\n DurableStoreExecuteResponse,\n DurableStoreQueryResponse,\n FileReadResponse,\n FileWriteOptions,\n OrchestrationDefinition,\n RunOptions,\n RunOutput,\n Orchestration,\n SandboxInfo,\n Schedule,\n SnapshotMeta,\n StreamEvent,\n TakeSnapshotOptions,\n} from \"./types.js\";\n\nconst SDK_VERSION = \"0.3.0\";\n\n/**\n * Client for the agentkernel HTTP API.\n *\n * @example\n * ```ts\n * const client = new AgentKernel();\n * const result = await client.run([\"echo\", \"hello\"]);\n * console.log(result.output); // \"hello\\n\"\n * ```\n */\nexport class AgentKernel {\n private readonly baseUrl: string;\n private readonly apiKey: string | undefined;\n private readonly timeout: number;\n\n constructor(opts?: AgentKernelOptions) {\n const config = resolveConfig(opts);\n this.baseUrl = config.baseUrl;\n this.apiKey = config.apiKey;\n this.timeout = config.timeout;\n }\n\n // -- Core API methods --\n\n /** Health check. Returns \"ok\" if the server is running. */\n async health(): Promise<string> {\n const res = await this.request<string>(\"GET\", \"/health\");\n return res;\n }\n\n /** Run a command in a temporary sandbox. */\n async run(command: string[], opts?: RunOptions): Promise<RunOutput> {\n return this.request<RunOutput>(\"POST\", \"/run\", {\n command,\n image: opts?.image,\n profile: opts?.profile,\n fast: opts?.fast ?? true,\n });\n }\n\n /**\n * Run a command with SSE streaming output.\n *\n * @example\n * ```ts\n * for await (const event of client.runStream([\"python3\", \"script.py\"])) {\n * if (event.type === \"output\") process.stdout.write(String(event.data.data));\n * }\n * ```\n */\n async *runStream(\n command: string[],\n opts?: RunOptions,\n ): AsyncGenerator<StreamEvent> {\n const body = JSON.stringify({\n command,\n image: opts?.image,\n profile: opts?.profile,\n fast: opts?.fast ?? true,\n });\n\n const response = await this.fetch(\"/run/stream\", {\n method: \"POST\",\n headers: this.headers(\"application/json\"),\n body,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw errorFromStatus(response.status, text);\n }\n\n if (!response.body) {\n throw new AgentKernelError(\"No response body for SSE stream\");\n }\n\n yield* parseSSE(response.body);\n }\n\n /** List all sandboxes. */\n async listSandboxes(): Promise<SandboxInfo[]> {\n return this.request<SandboxInfo[]>(\"GET\", \"/sandboxes\");\n }\n\n /** Create a new sandbox. */\n async createSandbox(\n name: string,\n opts?: CreateSandboxOptions,\n ): Promise<SandboxInfo> {\n return this.request<SandboxInfo>(\"POST\", \"/sandboxes\", {\n name,\n image: opts?.image,\n vcpus: opts?.vcpus,\n memory_mb: opts?.memory_mb,\n profile: opts?.profile,\n source_url: opts?.source_url,\n source_ref: opts?.source_ref,\n volumes: opts?.volumes,\n secrets: opts?.secrets,\n secret_files: opts?.secret_files,\n });\n }\n\n /** Get info about a sandbox. */\n async getSandbox(name: string): Promise<SandboxInfo> {\n return this.request<SandboxInfo>(\"GET\", `/sandboxes/${encodeURIComponent(name)}`);\n }\n\n /** Get info about a sandbox by UUID. */\n async getSandboxByUuid(uuid: string): Promise<SandboxInfo> {\n return this.request<SandboxInfo>(\n \"GET\",\n `/sandboxes/by-uuid/${encodeURIComponent(uuid)}`,\n );\n }\n\n /** Remove a sandbox. */\n async removeSandbox(name: string): Promise<void> {\n await this.request<string>(\"DELETE\", `/sandboxes/${encodeURIComponent(name)}`);\n }\n\n /** Run a command in an existing sandbox. */\n async execInSandbox(\n name: string,\n command: string[],\n opts?: ExecOptions,\n ): Promise<RunOutput> {\n return this.request<RunOutput>(\n \"POST\",\n `/sandboxes/${encodeURIComponent(name)}/exec`,\n {\n command,\n env: opts?.env,\n workdir: opts?.workdir,\n sudo: opts?.sudo,\n },\n );\n }\n\n /** Read a file from a sandbox. */\n async readFile(name: string, path: string): Promise<FileReadResponse> {\n return this.request<FileReadResponse>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/files/${path}`,\n );\n }\n\n /** Write a file to a sandbox. */\n async writeFile(\n name: string,\n path: string,\n content: string,\n opts?: FileWriteOptions,\n ): Promise<string> {\n return this.request<string>(\n \"PUT\",\n `/sandboxes/${encodeURIComponent(name)}/files/${path}`,\n { content, encoding: opts?.encoding ?? \"utf8\" },\n );\n }\n\n /** Delete a file from a sandbox. */\n async deleteFile(name: string, path: string): Promise<string> {\n return this.request<string>(\n \"DELETE\",\n `/sandboxes/${encodeURIComponent(name)}/files/${path}`,\n );\n }\n\n /** Get audit log entries for a sandbox. */\n async getSandboxLogs(name: string): Promise<Record<string, unknown>[]> {\n return this.request<Record<string, unknown>[]>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/logs`,\n );\n }\n\n /** Write multiple files to a sandbox in one request. */\n async writeFiles(\n name: string,\n files: Record<string, string>,\n ): Promise<BatchFileWriteResponse> {\n return this.request<BatchFileWriteResponse>(\n \"POST\",\n `/sandboxes/${encodeURIComponent(name)}/files`,\n { files },\n );\n }\n\n /** Run multiple commands in parallel. */\n async batchRun(commands: BatchCommand[]): Promise<BatchRunResponse> {\n return this.request<BatchRunResponse>(\"POST\", \"/batch/run\", { commands });\n }\n\n /** Start a detached (background) command in a sandbox. */\n async execDetached(\n name: string,\n command: string[],\n opts?: ExecOptions,\n ): Promise<DetachedCommand> {\n return this.request<DetachedCommand>(\n \"POST\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detach`,\n {\n command,\n env: opts?.env,\n workdir: opts?.workdir,\n sudo: opts?.sudo,\n },\n );\n }\n\n /** Get the status of a detached command. */\n async detachedStatus(\n name: string,\n cmdId: string,\n ): Promise<DetachedCommand> {\n return this.request<DetachedCommand>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detached/${encodeURIComponent(cmdId)}`,\n );\n }\n\n /** Get logs from a detached command. */\n async detachedLogs(\n name: string,\n cmdId: string,\n stream?: \"stdout\" | \"stderr\",\n ): Promise<DetachedLogsResponse> {\n const query = stream === \"stderr\" ? \"?stream=stderr\" : \"\";\n return this.request<DetachedLogsResponse>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detached/${encodeURIComponent(cmdId)}/logs${query}`,\n );\n }\n\n /** Kill a detached command. */\n async detachedKill(name: string, cmdId: string): Promise<string> {\n return this.request<string>(\n \"DELETE\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detached/${encodeURIComponent(cmdId)}`,\n );\n }\n\n /** List detached commands in a sandbox. */\n async detachedList(name: string): Promise<DetachedCommand[]> {\n return this.request<DetachedCommand[]>(\n \"GET\",\n `/sandboxes/${encodeURIComponent(name)}/exec/detached`,\n );\n }\n\n /** List all orchestrations. */\n async listOrchestrations(): Promise<Orchestration[]> {\n return this.request<Orchestration[]>(\"GET\", \"/orchestrations\");\n }\n\n /** Create a new orchestration. */\n async createOrchestration(payload: CreateOrchestrationRequest): Promise<Orchestration> {\n return this.request<Orchestration>(\"POST\", \"/orchestrations\", payload);\n }\n\n /** Get info about an orchestration by identifier. */\n async getOrchestration(id: string): Promise<Orchestration> {\n return this.request<Orchestration>(\n \"GET\",\n `/orchestrations/${encodeURIComponent(id)}`,\n );\n }\n\n /** Raise an external event for an orchestration. */\n async signalOrchestration(\n id: string,\n payload: Record<string, unknown>,\n ): Promise<Orchestration> {\n return this.request<Orchestration>(\n \"POST\",\n `/orchestrations/${encodeURIComponent(id)}/events`,\n payload,\n );\n }\n\n /** Terminate an orchestration. */\n async terminateOrchestration(\n id: string,\n payload?: Record<string, unknown>,\n ): Promise<Orchestration> {\n return this.request<Orchestration>(\n \"POST\",\n `/orchestrations/${encodeURIComponent(id)}/terminate`,\n payload ?? {},\n );\n }\n\n /** List orchestration definitions. */\n async listOrchestrationDefinitions(): Promise<OrchestrationDefinition[]> {\n return this.request<OrchestrationDefinition[]>(\n \"GET\",\n \"/orchestrations/definitions\",\n );\n }\n\n /** Register or update an orchestration definition. */\n async upsertOrchestrationDefinition(\n payload: OrchestrationDefinition,\n ): Promise<OrchestrationDefinition> {\n return this.request<OrchestrationDefinition>(\n \"POST\",\n \"/orchestrations/definitions\",\n payload,\n );\n }\n\n /** Get an orchestration definition by name. */\n async getOrchestrationDefinition(\n name: string,\n ): Promise<OrchestrationDefinition> {\n return this.request<OrchestrationDefinition>(\n \"GET\",\n `/orchestrations/definitions/${encodeURIComponent(name)}`,\n );\n }\n\n /** Delete an orchestration definition by name. */\n async deleteOrchestrationDefinition(name: string): Promise<string> {\n return this.request<string>(\n \"DELETE\",\n `/orchestrations/definitions/${encodeURIComponent(name)}`,\n );\n }\n\n /** List all objects. */\n async listObjects(): Promise<DurableObject[]> {\n return this.request<DurableObject[]>(\"GET\", \"/objects\");\n }\n\n /** Create a new object. */\n async createObject(payload: CreateObjectRequest): Promise<DurableObject> {\n return this.request<DurableObject>(\"POST\", \"/objects\", payload);\n }\n\n /** Get an object by identifier. */\n async getObject(id: string): Promise<DurableObject> {\n return this.request<DurableObject>(\n \"GET\",\n `/objects/${encodeURIComponent(id)}`,\n );\n }\n\n /** Call a method on a durable object (auto-creates/wakes if needed). */\n async callObject(\n className: string,\n objectId: string,\n method: string,\n args?: Record<string, unknown>,\n ): Promise<unknown> {\n const resp = await this.request(\n \"POST\",\n `/objects/${encodeURIComponent(className)}/${encodeURIComponent(objectId)}/call/${encodeURIComponent(method)}`,\n args ?? {},\n );\n return resp;\n }\n\n /** Delete a durable object by identifier. */\n async deleteObject(id: string): Promise<string> {\n return this.request<string>(\"DELETE\", `/objects/${encodeURIComponent(id)}`);\n }\n\n /** Partially update a durable object (storage and/or status). */\n async patchObject(\n id: string,\n payload: { storage?: unknown; status?: string },\n ): Promise<DurableObject> {\n return this.request<DurableObject>(\n \"PATCH\",\n `/objects/${encodeURIComponent(id)}`,\n payload,\n );\n }\n\n /** List all schedules. */\n async listSchedules(): Promise<Schedule[]> {\n return this.request<Schedule[]>(\"GET\", \"/schedules\");\n }\n\n /** Create a new schedule. */\n async createSchedule(payload: CreateScheduleRequest): Promise<Schedule> {\n return this.request<Schedule>(\"POST\", \"/schedules\", payload);\n }\n\n /** Get a schedule by identifier. */\n async getSchedule(id: string): Promise<Schedule> {\n return this.request<Schedule>(\n \"GET\",\n `/schedules/${encodeURIComponent(id)}`,\n );\n }\n\n /** Delete a schedule by identifier. */\n async deleteSchedule(id: string): Promise<string> {\n return this.request<string>(\"DELETE\", `/schedules/${encodeURIComponent(id)}`);\n }\n\n /** List all durable stores. */\n async listStores(): Promise<DurableStore[]> {\n return this.request<DurableStore[]>(\"GET\", \"/stores\");\n }\n\n /** Create a durable store. */\n async createStore(payload: CreateStoreRequest): Promise<DurableStore> {\n return this.request<DurableStore>(\"POST\", \"/stores\", payload);\n }\n\n /** Get a durable store by identifier. */\n async getStore(id: string): Promise<DurableStore> {\n return this.request<DurableStore>(\"GET\", `/stores/${encodeURIComponent(id)}`);\n }\n\n /** Delete a durable store by identifier. */\n async deleteStore(id: string): Promise<string> {\n return this.request<string>(\"DELETE\", `/stores/${encodeURIComponent(id)}`);\n }\n\n /** Execute a read query against a durable store. */\n async queryStore(\n id: string,\n payload: Record<string, unknown>,\n ): Promise<DurableStoreQueryResponse> {\n return this.request<DurableStoreQueryResponse>(\n \"POST\",\n `/stores/${encodeURIComponent(id)}/query`,\n payload,\n );\n }\n\n /** Execute a write statement against a durable store. */\n async executeStore(\n id: string,\n payload: Record<string, unknown>,\n ): Promise<DurableStoreExecuteResponse> {\n return this.request<DurableStoreExecuteResponse>(\n \"POST\",\n `/stores/${encodeURIComponent(id)}/execute`,\n payload,\n );\n }\n\n /** Execute a command against a durable store (Redis-style engines). */\n async commandStore(\n id: string,\n payload: Record<string, unknown>,\n ): Promise<DurableStoreCommandResponse> {\n return this.request<DurableStoreCommandResponse>(\n \"POST\",\n `/stores/${encodeURIComponent(id)}/command`,\n payload,\n );\n }\n\n /**\n * Create a sandbox session with automatic cleanup.\n *\n * The returned SandboxSession implements AsyncDisposable,\n * so it works with `await using` (TS 5.2+):\n *\n * @example\n * ```ts\n * await using sb = await client.sandbox(\"test\", { image: \"python:3.12-alpine\" });\n * await sb.run([\"pip\", \"install\", \"numpy\"]);\n * // sandbox auto-removed when scope exits\n * ```\n */\n async sandbox(\n name: string,\n opts?: CreateSandboxOptions,\n ): Promise<SandboxSession> {\n await this.createSandbox(name, opts);\n return new SandboxSession(\n name,\n (n, cmd, o) => this.execInSandbox(n, cmd, o),\n (n) => this.removeSandbox(n),\n (n) => this.getSandbox(n),\n (n, f) => this.writeFiles(n, f),\n );\n }\n\n /**\n * Create a sandboxed browser session with automatic cleanup.\n *\n * Creates a sandbox with Chromium pre-installed via Playwright.\n * Use `goto()`, `screenshot()`, and `evaluate()` to interact with web pages.\n *\n * @example\n * ```ts\n * await using browser = await client.browser(\"my-browser\");\n * const page = await browser.goto(\"https://example.com\");\n * console.log(page.title, page.links);\n * // sandbox auto-removed when scope exits\n * ```\n */\n async browser(\n name: string,\n opts?: { memory_mb?: number },\n ): Promise<BrowserSession> {\n await this.createSandbox(name, {\n image: \"python:3.12-slim\",\n memory_mb: opts?.memory_mb ?? 2048,\n profile: \"moderate\",\n });\n await this.execInSandbox(name, BROWSER_SETUP_CMD);\n return new BrowserSession(\n name,\n (n, cmd) => this.execInSandbox(n, cmd),\n (n) => this.removeSandbox(n),\n );\n }\n\n // -- TTL & Snapshot methods --\n\n /** Extend a sandbox's TTL. Returns the new expiry time. */\n async extendTtl(name: string, opts: ExtendTtlOptions): Promise<ExtendTtlResponse> {\n return this.request<ExtendTtlResponse>(\n \"POST\",\n `/sandboxes/${encodeURIComponent(name)}/extend`,\n { by: opts.by },\n );\n }\n\n /** List all snapshots. */\n async listSnapshots(): Promise<SnapshotMeta[]> {\n return this.request<SnapshotMeta[]>(\"GET\", \"/snapshots\");\n }\n\n /** Take a snapshot of a sandbox. */\n async takeSnapshot(opts: TakeSnapshotOptions): Promise<SnapshotMeta> {\n return this.request<SnapshotMeta>(\"POST\", \"/snapshots\", opts);\n }\n\n /** Get info about a snapshot. */\n async getSnapshot(name: string): Promise<SnapshotMeta> {\n return this.request<SnapshotMeta>(\n \"GET\",\n `/snapshots/${encodeURIComponent(name)}`,\n );\n }\n\n /** Delete a snapshot. */\n async deleteSnapshot(name: string): Promise<void> {\n await this.request<string>(\n \"DELETE\",\n `/snapshots/${encodeURIComponent(name)}`,\n );\n }\n\n /** Restore a sandbox from a snapshot. */\n async restoreSnapshot(name: string): Promise<SandboxInfo> {\n return this.request<SandboxInfo>(\n \"POST\",\n `/snapshots/${encodeURIComponent(name)}/restore`,\n );\n }\n\n // -- Internal helpers --\n\n private headers(contentType?: string): Record<string, string> {\n const h: Record<string, string> = {\n \"User-Agent\": `agentkernel-nodejs-sdk/${SDK_VERSION}`,\n };\n if (contentType) h[\"Content-Type\"] = contentType;\n if (this.apiKey) h[\"Authorization\"] = `Bearer ${this.apiKey}`;\n return h;\n }\n\n private async fetch(path: string, init: RequestInit): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n try {\n return await fetch(url, {\n ...init,\n signal: AbortSignal.timeout(this.timeout),\n });\n } catch (err) {\n if (err instanceof DOMException && err.name === \"TimeoutError\") {\n throw new NetworkError(`Request timed out after ${this.timeout}ms`);\n }\n if (err instanceof TypeError) {\n throw new NetworkError(`Failed to connect to ${this.baseUrl}: ${err.message}`);\n }\n throw new NetworkError(\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n ): Promise<T> {\n const init: RequestInit = {\n method,\n headers: this.headers(body ? \"application/json\" : undefined),\n };\n if (body) init.body = JSON.stringify(body);\n\n const response = await this.fetch(path, init);\n\n const text = await response.text();\n if (!response.ok) {\n throw errorFromStatus(response.status, text);\n }\n\n const parsed: ApiResponse<T> = JSON.parse(text);\n if (!parsed.success) {\n throw new AgentKernelError(parsed.error ?? \"Unknown error\");\n }\n return parsed.data as T;\n }\n}\n"],"mappings":"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","names":[]}
|