diff --git a/CLAUDE.md b/CLAUDE.md index 422a5fd494..5a88f0d61b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -201,7 +201,7 @@ When the user asks to track something in a note, store it in `~/.agents/notes/` - **rivetkit-core** (`rivetkit-rust/packages/rivetkit-core/`) — Core RivetKit logic in Rust, language-agnostic. Lifecycle state machine, sleep logic, shutdown sequencing, state persistence, action dispatch, event broadcast, queue management, schedule system, inspector, metrics. All callbacks are dynamic closures with opaque bytes. All load-bearing logic must live here. Config conversion helpers and HTTP request/response parsing for foreign runtimes belong here. - **rivetkit (Rust)** (`rivetkit-rust/packages/rivetkit/`) — Rust-friendly typed API. `Actor` trait, `Ctx`, `Registry` builder, CBOR serde at boundaries. Thin wrapper over rivetkit-core. No load-bearing logic. - **rivetkit-napi** (`rivetkit-typescript/packages/rivetkit-napi/`) — NAPI bindings only. ThreadsafeFunction wrappers, JS object construction, Promise-to-Future conversion. No load-bearing logic. Must only translate between JS types and rivetkit-core types. Only consumed by `rivetkit-typescript/packages/rivetkit/`. -- **rivetkit (TypeScript)** (`rivetkit-typescript/packages/rivetkit/`) — TypeScript-friendly API. Calls into rivetkit-core via NAPI for lifecycle logic. Owns workflow engine, agent-os, and client library. Zod validation for user-provided schemas runs here. +- **rivetkit (TypeScript)** (`rivetkit-typescript/packages/rivetkit/`) — TypeScript-friendly API. Calls into rivetkit-core via NAPI for lifecycle logic. Owns workflow engine and client library. Zod validation for user-provided schemas runs here. ### Layer constraints @@ -212,7 +212,7 @@ When the user asks to track something in a note, store it in `~/.agents/notes/` - NAPI `ActorContext.sql()` returns `JsNativeDatabase` directly; do not reintroduce a standalone `SqliteDb` wrapper export. - TypeScript runtime adapters expose `CoreRuntime` from `rivetkit/src/registry/runtime.ts`; keep raw `@rivetkit/rivetkit-napi` and future `@rivetkit/rivetkit-wasm` imports inside `src/registry/*-runtime.ts`. - rivetkit (Rust) is a thin typed wrapper. If it does more than deserialize, delegate to core, and serialize, the logic should move to rivetkit-core. -- rivetkit (TypeScript) owns only: workflow engine, agent-os, client library, Zod schema validation for user-defined types, and actor definition types. +- rivetkit (TypeScript) owns only: workflow engine, client library, Zod schema validation for user-defined types, and actor definition types. - Errors use universal `RivetError` (group/code/message/metadata) at all boundaries. No custom error classes in TS. - CBOR serialization at all cross-language boundaries. JSON only for HTTP inspector endpoints. - Pegboard orchestrates actor exclusivity: at most one actor instance for a given actor id may be running or accessing that actor's storage at a time. This is the actor single-writer invariant: a Rivet Actor is the single writer for both KV and SQLite. `pegboard-envoy`, `envoy-client`, and remote/wasm SQLite may rely on this invariant and must not add envoy-protocol lease keys, engine-side transaction ownership, or separate same-actor concurrency fences. Coordinate LocalNative and remote/wasm transactions through the same actor-local `rivetkit-core` coordinator before backend dispatch. Actor Runtime Socket `leaseKey` values identify connection-local transaction handles and never cross depot, envoy, or engine boundaries. The lost-timeout + ping protocol is responsible for making overlapping actor generations impossible. diff --git a/examples/agent-os-e2e/README.md b/examples/agent-os-e2e/README.md deleted file mode 100644 index 99fe1492d2..0000000000 --- a/examples/agent-os-e2e/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# Agent OS E2E Smoke Test - -End-to-end smoke test for agentOS via the rivetkit actor wrapper. Boots a VM with WASM coreutils and the Pi coding agent, then exercises filesystem operations, subprocess execution, and an LLM-driven agent session. - -## Prerequisites - -- `ANTHROPIC_API_KEY` environment variable - -## Getting Started - -Install dependencies: - -```bash -npm install -``` - -Start the server in one terminal: - -```bash -npx tsx src/server.ts -``` - -Run the smoke test in another terminal: - -```bash -npx tsx src/client.ts -``` - -## Features - -- Filesystem round-trip: write, read, mkdir, readdir, exists -- Subprocess execution: echo, pipes, grep, cat -- Preview URL: spawn HTTP server in VM, create signed preview URL, fetch through proxy -- Pi agent session with streaming events -- Host-side verification of agent-created files - -## Implementation - -The server boots an agentOS actor with `common` (WASM coreutils) and `pi` (Pi coding agent) software packages. The client connects over HTTP and runs a sequence of assertions. - -See the implementation in [`src/server.ts`](https://github.com/rivet-dev/rivet/tree/main/examples/agent-os-e2e/src/server.ts) and [`src/client.ts`](https://github.com/rivet-dev/rivet/tree/main/examples/agent-os-e2e/src/client.ts). - -## Resources - -- [agentOS Quickstart](/docs/agent-os/quickstart) -- [agentOS Core](/docs/agent-os/core) -- [Software Packages](/docs/agent-os/software) - -## License - -MIT diff --git a/examples/agent-os-e2e/package.json b/examples/agent-os-e2e/package.json deleted file mode 100644 index 71e95d7f62..0000000000 --- a/examples/agent-os-e2e/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "example-agent-os-e2e", - "version": "2.0.21", - "private": true, - "type": "module", - "scripts": { - "test:server": "tsx src/server.ts", - "test": "tsx src/client.ts", - "check-types": "tsc --noEmit" - }, - "dependencies": { - "rivetkit": "workspace:*", - "@rivet-dev/agent-os-common": "*", - "@rivet-dev/agent-os-pi": "^0.1.1" - }, - "devDependencies": { - "@types/node": "^22.13.9", - "tsx": "^3.12.7", - "typescript": "^5.5.2" - }, - "template": { - "technologies": ["typescript"], - "tags": ["agent-os", "vm", "e2e"], - "noFrontend": true, - "skipVercel": true - }, - "stableVersion": "0.8.0", - "license": "MIT" -} diff --git a/examples/agent-os-e2e/src/client.ts b/examples/agent-os-e2e/src/client.ts deleted file mode 100644 index 128daf9d93..0000000000 --- a/examples/agent-os-e2e/src/client.ts +++ /dev/null @@ -1,177 +0,0 @@ -// Agent OS E2E Smoke Test -// -// Tests: VM boot, filesystem, subprocess execution, preview URLs, agent session. -// -// Usage: -// 1. Start the server: npx tsx src/server.ts -// 2. Run the client: npx tsx src/client.ts -// -// Requires ANTHROPIC_API_KEY environment variable. - -import { createClient } from "rivetkit/client"; -import type { registry } from "./server.ts"; - -const ANTHROPIC_API_KEY = process.env.ANTHROPIC_API_KEY; -if (!ANTHROPIC_API_KEY) { - console.error("ANTHROPIC_API_KEY is required"); - process.exit(1); -} - -const client = createClient("http://localhost:6420"); -const agent = client.vm.getOrCreate(["e2e-test"]); - -// --- Step 1: Filesystem basics --- -console.log("=== Step 1: Filesystem ==="); -await agent.writeFile("/tmp/hello.txt", "Hello from Agent OS!"); -const raw = (await agent.readFile("/tmp/hello.txt")) as Uint8Array; -const text = new TextDecoder().decode(raw); -console.log(`writeFile + readFile: "${text.trim()}"`); -assert(text.includes("Hello from Agent OS!"), "filesystem round-trip"); - -await agent.mkdir("/home/user/project"); -const entries = (await agent.readdir("/home/user/project")) as string[]; -console.log( - "mkdir + readdir:", - entries.filter((e) => e !== "." && e !== ".."), -); -console.log( - "exists /home/user/project:", - await agent.exists("/home/user/project"), -); -console.log("exists /nonexistent:", await agent.exists("/nonexistent")); - -// --- Step 2: Subprocess execution --- -console.log("\n=== Step 2: Processes ==="); -const echo = (await agent.exec("echo 'hello from bash'")) as { - stdout: string; - exitCode: number; -}; -console.log(`exec echo: "${echo.stdout.trim()}" (exit ${echo.exitCode})`); -assert(echo.exitCode === 0, "echo exit code"); -assert(echo.stdout.trim() === "hello from bash", "echo output"); - -const pipe = (await agent.exec("echo hello | tr a-z A-Z")) as { - stdout: string; -}; -console.log(`exec pipe: "${pipe.stdout.trim()}"`); -assert(pipe.stdout.trim() === "HELLO", "pipe output"); - -await agent.writeFile("/tmp/data.txt", "apple\nbanana\ncherry\napricot\n"); -const grep = (await agent.exec("grep ap /tmp/data.txt")) as { - stdout: string; -}; -console.log(`exec grep: "${grep.stdout.trim()}"`); -assert(grep.stdout.includes("apple"), "grep apple"); -assert(grep.stdout.includes("apricot"), "grep apricot"); - -const cat = (await agent.exec("cat /tmp/hello.txt")) as { stdout: string }; -console.log(`exec cat: "${cat.stdout.trim()}"`); -assert( - cat.stdout.includes("Hello from Agent OS!"), - "cat reads file written by writeFile", -); - -// --- Step 3: Preview URL --- -console.log("\n=== Step 3: Preview URL ==="); - -// Write a tiny HTTP server script into the VM -await agent.writeFile( - "/tmp/server.mjs", - `import http from "node:http"; -const server = http.createServer((req, res) => { - res.writeHead(200, { "Content-Type": "text/plain" }); - res.end("preview ok"); -}); -server.listen(8080, () => console.log("listening on 8080")); -`, -); - -// Spawn the server inside the VM -const serverProc = (await agent.spawn("node", ["/tmp/server.mjs"])) as { - pid: number; -}; -console.log(`Spawned preview server: pid ${serverProc.pid}`); - -// Give the server a moment to bind -await new Promise((r) => setTimeout(r, 1000)); - -// Create a signed preview URL for port 8080 -const preview = (await agent.createSignedPreviewUrl(8080, 60)) as { - path: string; - token: string; - port: number; - expiresAt: number; -}; -console.log(`Preview path: ${preview.path}`); -console.log(`Preview token: ${preview.token}`); - -// Fetch through the preview proxy -const gatewayUrl = await agent.getGatewayUrl(); -const previewUrl = `${gatewayUrl}${preview.path}`; -console.log(`Fetching preview URL: ${previewUrl}`); -const previewResponse = await fetch(previewUrl); -const previewBody = await previewResponse.text(); -console.log(`Preview response: ${previewResponse.status} "${previewBody}"`); -assert(previewResponse.status === 200, "preview status 200"); -assert(previewBody === "preview ok", "preview body matches"); - -// Clean up the server process -await agent.killProcess(serverProc.pid); - -// --- Step 4: Agent session (Pi + Anthropic) --- -console.log("\n=== Step 4: Agent session ==="); -console.log("Creating Pi agent session..."); -const session = (await agent.createSession("pi", { - env: { ANTHROPIC_API_KEY }, -})) as { sessionId: string }; -console.log(`Session created: ${session.sessionId}`); - -// Subscribe to streaming events via WebSocket connection -const conn = agent.connect(); -conn.on("sessionEvent", (data: any) => { - const event = data?.event ?? data; - const params = event?.params; - if (params?.update?.sessionUpdate === "agent_message_chunk") { - process.stdout.write(params.update.content?.text ?? ""); - } -}); - -// Wait for WebSocket to establish -await new Promise((r) => setTimeout(r, 500)); - -console.log("\nSending prompt..."); -const response = (await agent.sendPrompt( - session.sessionId, - 'Write the text "E2E test passed!" to /tmp/e2e-result.txt using the write tool. Then use the bash tool to run `cat /tmp/e2e-result.txt` and tell me what it says.', -)) as { stopReason?: string }; -console.log(`\n\nPrompt completed: ${response?.stopReason ?? "done"}`); - -// --- Step 5: Verify agent wrote the file --- -console.log("\n=== Step 5: Verify agent output ==="); -try { - const agentData = (await agent.readFile( - "/tmp/e2e-result.txt", - )) as Uint8Array; - const agentText = new TextDecoder().decode(agentData); - console.log(`Agent wrote: "${agentText.trim()}"`); - assert(agentText.includes("E2E test passed!"), "agent file content"); -} catch (err: any) { - console.error(`Failed to read agent output: ${err.message}`); - process.exit(1); -} - -// --- Cleanup --- -await conn.dispose(); -await agent.closeSession(session.sessionId); - -console.log("\n=== Results ==="); -console.log("All checks passed!"); - -// Simple assertion helper -function assert(condition: boolean, label: string) { - if (!condition) { - console.error(`FAILED: ${label}`); - process.exit(1); - } - console.log(` OK: ${label}`); -} diff --git a/examples/agent-os-e2e/src/server.ts b/examples/agent-os-e2e/src/server.ts deleted file mode 100644 index 7522c60853..0000000000 --- a/examples/agent-os-e2e/src/server.ts +++ /dev/null @@ -1,9 +0,0 @@ -import common from "@rivet-dev/agent-os-common"; -import pi from "@rivet-dev/agent-os-pi"; -import { setup } from "rivetkit"; -import { agentOs } from "rivetkit/agent-os"; - -const vm = agentOs({ options: { software: [common, pi] } }); - -export const registry = setup({ use: { vm } }); -registry.start(); diff --git a/examples/agent-os-e2e/tsconfig.json b/examples/agent-os-e2e/tsconfig.json deleted file mode 100644 index c3382bb665..0000000000 --- a/examples/agent-os-e2e/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "target": "esnext", - "lib": ["esnext"], - "module": "esnext", - "moduleResolution": "bundler", - "types": ["node"], - "noEmit": true, - "strict": true, - "skipLibCheck": true, - "allowImportingTsExtensions": true, - "rewriteRelativeImportExtensions": true - }, - "include": ["src/**/*"] -} diff --git a/examples/agent-os-e2e/turbo.json b/examples/agent-os-e2e/turbo.json deleted file mode 100644 index 29d4cb2625..0000000000 --- a/examples/agent-os-e2e/turbo.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "extends": ["//"] -} diff --git a/examples/agent-os/.gitignore b/examples/agent-os/.gitignore deleted file mode 100644 index dc6f607390..0000000000 --- a/examples/agent-os/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.actorcore -node_modules diff --git a/examples/agent-os/README.md b/examples/agent-os/README.md deleted file mode 100644 index 0af43c18a4..0000000000 --- a/examples/agent-os/README.md +++ /dev/null @@ -1,130 +0,0 @@ -# agentOS - -Run coding agents inside isolated VMs with full filesystem, process, and network control using RivetKit. - -## Getting Started - -Install dependencies: - -```bash -pnpm install -``` - -Each example has a server and a client. Start the server in one terminal, then run the client in another. - -**Hello World** - Write a file and read it back: - -```bash -pnpm hello-world:server -# In another terminal: -pnpm hello-world -``` - -**Git** - Clone a repository and check out a branch: - -```bash -pnpm git:server -# In another terminal: -pnpm git -``` - -**Filesystem** - Directories, stat, move, delete, and mount configuration: - -```bash -pnpm filesystem:server -# In another terminal: -pnpm filesystem -``` - -**Processes** - Run shell commands and spawn processes: - -```bash -pnpm processes:server -# In another terminal: -pnpm processes -``` - -**Network** - Start a server inside the VM, fetch from it, and create preview URLs: - -```bash -pnpm network:server -# In another terminal: -pnpm network -``` - -**Cron** - Schedule and manage recurring jobs: - -```bash -pnpm cron:server -# In another terminal: -pnpm cron -``` - -**Tools** - Define host toolkits callable from inside the VM: - -```bash -pnpm tools:server -# In another terminal: -pnpm tools -``` - -**Agent Session** - Create a PI agent session and send prompts (requires `ANTHROPIC_API_KEY`): - -```bash -pnpm agent-session:server -# In another terminal: -ANTHROPIC_API_KEY=sk-... pnpm agent-session -``` - -**Sandbox Mounting** - Mount a sandbox into the VM (requires Docker for demonstrating local sandbox): - -```bash -pnpm sandbox:server -# In another terminal: -pnpm sandbox -``` - -## Features - -- Isolated VM execution with filesystem, process, and network APIs -- Client-server architecture with type-safe RPC via RivetKit actors -- In-VM networking with `vmFetch` and signed preview URLs for external access -- Process spawning and lifecycle management through actor actions -- Cron scheduling for recurring commands and agent sessions -- Host toolkits that expose JavaScript functions as CLI commands inside the VM -- Sandbox mounting for heavy workloads via Docker containers - -## Prerequisites - -- `ANTHROPIC_API_KEY` for the agent-session example -- Docker for the sandbox mounting example - -## Implementation - -Each example folder contains a `server.ts` that configures an agentOS actor and a `client.ts` that connects to it. The server boots an isolated VM on first use. The client calls actor actions over WebSocket. - -- [`src/hello-world/`](https://github.com/rivet-dev/rivet/tree/main/examples/agent-os/src/hello-world) - Minimal write/read file -- [`src/git/`](https://github.com/rivet-dev/rivet/tree/main/examples/agent-os/src/git) - Local clone and branch checkout -- [`src/filesystem/`](https://github.com/rivet-dev/rivet/tree/main/examples/agent-os/src/filesystem) - Full filesystem operations with mount config -- [`src/processes/`](https://github.com/rivet-dev/rivet/tree/main/examples/agent-os/src/processes) - Shell commands and process management -- [`src/network/`](https://github.com/rivet-dev/rivet/tree/main/examples/agent-os/src/network) - In-VM HTTP server with vmFetch and preview URLs -- [`src/cron/`](https://github.com/rivet-dev/rivet/tree/main/examples/agent-os/src/cron) - Cron job scheduling -- [`src/tools/`](https://github.com/rivet-dev/rivet/tree/main/examples/agent-os/src/tools) - Host toolkits with Zod schemas -- [`src/agent-session/`](https://github.com/rivet-dev/rivet/tree/main/examples/agent-os/src/agent-session) - PI agent session with prompts -- [`src/sandbox/`](https://github.com/rivet-dev/rivet/tree/main/examples/agent-os/src/sandbox) - Docker sandbox filesystem and toolkit - -## Resources - -- [agentOS Overview](/docs/agent-os) -- [Quickstart](/docs/agent-os/quickstart) -- [Filesystem](/docs/agent-os/filesystem) -- [Processes](/docs/agent-os/processes) -- [Networking](/docs/agent-os/networking) -- [Cron](/docs/agent-os/cron) -- [Tools](/docs/agent-os/tools) -- [Sessions](/docs/agent-os/sessions) -- [Sandbox Mounting](/docs/agent-os/sandbox) - -## License - -MIT diff --git a/examples/agent-os/package.json b/examples/agent-os/package.json deleted file mode 100644 index 364d659f0a..0000000000 --- a/examples/agent-os/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "example-agent-os", - "version": "2.0.21", - "private": true, - "type": "module", - "scripts": { - "hello-world:server": "tsx src/hello-world/server.ts", - "hello-world": "tsx src/hello-world/client.ts", - "git:server": "tsx src/git/server.ts", - "git": "tsx src/git/client.ts", - "filesystem:server": "tsx src/filesystem/server.ts", - "filesystem": "tsx src/filesystem/client.ts", - "processes:server": "tsx src/processes/server.ts", - "processes": "tsx src/processes/client.ts", - "network:server": "tsx src/network/server.ts", - "network": "tsx src/network/client.ts", - "cron:server": "tsx src/cron/server.ts", - "cron": "tsx src/cron/client.ts", - "tools:server": "tsx src/tools/server.ts", - "tools": "tsx src/tools/client.ts", - "agent-session:server": "tsx src/agent-session/server.ts", - "agent-session": "tsx src/agent-session/client.ts", - "sandbox:server": "tsx src/sandbox/server.ts", - "sandbox": "tsx src/sandbox/client.ts", - "check-types": "tsc --noEmit" - }, - "dependencies": { - "rivetkit": "*", - "zod": "^3.25.0" - }, - "devDependencies": { - "@types/node": "^22.13.9", - "tsx": "^3.12.7", - "typescript": "^5.5.2" - }, - "template": { - "technologies": [ - "typescript" - ], - "tags": [ - "agent-os", - "vm" - ], - "noFrontend": true, - "skipVercel": true - }, - "stableVersion": "0.8.0", - "license": "MIT" -} \ No newline at end of file diff --git a/examples/agent-os/src/agent-session/client.ts b/examples/agent-os/src/agent-session/client.ts deleted file mode 100644 index eb9fcf9b75..0000000000 --- a/examples/agent-os/src/agent-session/client.ts +++ /dev/null @@ -1,32 +0,0 @@ -// Create an agent session and send a prompt using the PI coding agent. -// -// NOTE: This example requires ANTHROPIC_API_KEY and a working PI agent -// runtime. It may not complete in all environments. - -import { createClient } from "rivetkit/client"; -import type { registry } from "./server.ts"; - -const client = createClient("http://localhost:6420"); -const agent = client.vm.getOrCreate(["my-agent"]); - -const ANTHROPIC_API_KEY = process.env.ANTHROPIC_API_KEY; -if (!ANTHROPIC_API_KEY) { - console.error("ANTHROPIC_API_KEY is required."); - process.exit(1); -} - -// Create a session with the PI coding agent -const session = (await agent.createSession("pi", { - env: { ANTHROPIC_API_KEY }, -})) as { sessionId: string }; -console.log("Session ID:", session.sessionId); - -// Send a prompt and wait for the response -const response = await agent.sendPrompt( - session.sessionId, - "What is 2 + 2? Reply with just the number.", -); -console.log("Response:", JSON.stringify(response)); - -// Close the session -await agent.closeSession(session.sessionId); diff --git a/examples/agent-os/src/agent-session/server.ts b/examples/agent-os/src/agent-session/server.ts deleted file mode 100644 index 7522c60853..0000000000 --- a/examples/agent-os/src/agent-session/server.ts +++ /dev/null @@ -1,9 +0,0 @@ -import common from "@rivet-dev/agent-os-common"; -import pi from "@rivet-dev/agent-os-pi"; -import { setup } from "rivetkit"; -import { agentOs } from "rivetkit/agent-os"; - -const vm = agentOs({ options: { software: [common, pi] } }); - -export const registry = setup({ use: { vm } }); -registry.start(); diff --git a/examples/agent-os/src/cron/client.ts b/examples/agent-os/src/cron/client.ts deleted file mode 100644 index 2b72111282..0000000000 --- a/examples/agent-os/src/cron/client.ts +++ /dev/null @@ -1,33 +0,0 @@ -// Cron scheduling: schedule recurring commands inside the VM. - -import { createClient } from "rivetkit/client"; -import type { registry } from "./server.ts"; - -const client = createClient("http://localhost:6420"); -const agent = client.vm.getOrCreate(["my-agent"]); - -// Schedule a command to run every second (for demo purposes) -const job = (await agent.scheduleCron({ - schedule: "* * * * * *", - action: { type: "exec", command: "echo", args: ["cron tick"] }, -})) as { id: string }; -console.log("Scheduled cron job:", job.id); - -// List all scheduled jobs -const jobs = (await agent.listCronJobs()) as Array<{ - id: string; - schedule: string; -}>; -console.log("Active cron jobs:", jobs); - -// Wait a few seconds to let the cron fire -console.log("Waiting 3 seconds for cron ticks..."); -await new Promise((r) => setTimeout(r, 3000)); - -// Cancel the job -await agent.cancelCronJob(job.id); -console.log("Cancelled cron job:", job.id); - -// Verify it's gone -const remaining = (await agent.listCronJobs()) as Array<{ id: string }>; -console.log("Remaining cron jobs:", remaining.length); diff --git a/examples/agent-os/src/cron/server.ts b/examples/agent-os/src/cron/server.ts deleted file mode 100644 index b4e759e13a..0000000000 --- a/examples/agent-os/src/cron/server.ts +++ /dev/null @@ -1,8 +0,0 @@ -import common from "@rivet-dev/agent-os-common"; -import { setup } from "rivetkit"; -import { agentOs } from "rivetkit/agent-os"; - -const vm = agentOs({ options: { software: [common] } }); - -export const registry = setup({ use: { vm } }); -registry.start(); diff --git a/examples/agent-os/src/filesystem/client.ts b/examples/agent-os/src/filesystem/client.ts deleted file mode 100644 index 53666cd3ba..0000000000 --- a/examples/agent-os/src/filesystem/client.ts +++ /dev/null @@ -1,61 +0,0 @@ -// Filesystem operations: write, read, mkdir, readdir, stat, move, delete. -// -// The VM mounts a filesystem at /home/user by default. Custom mounts -// (S3, host directories) can be configured in the server. - -import { createClient } from "rivetkit/client"; -import type { registry } from "./server.ts"; - -const client = createClient("http://localhost:6420"); -const agent = client.vm.getOrCreate(["my-agent"]); - -// Create a directory structure -await agent.mkdir("/home/user/project"); -await agent.mkdir("/home/user/project/src"); -await agent.writeFile( - "/home/user/project/src/index.ts", - 'console.log("hello");', -); -await agent.writeFile("/home/user/project/README.md", "# My Project"); - -// List directory contents (filter out . and ..) -const entries = (await agent.readdir("/home/user/project")) as string[]; -console.log( - "project/:", - entries.filter((e) => e !== "." && e !== ".."), -); - -// Stat a file -const info = (await agent.stat("/home/user/project/src/index.ts")) as { - size: number; - isDirectory: boolean; -}; -console.log("index.ts size:", info.size, "isDirectory:", info.isDirectory); - -// Recursive directory listing -const tree = (await agent.readdirRecursive("/home/user/project", { - maxDepth: 3, -})) as Array<{ path: string; isDirectory: boolean }>; -console.log("Recursive listing:", tree); - -// Check existence -console.log( - "/home/user/project exists:", - await agent.exists("/home/user/project"), -); -console.log("/missing exists:", await agent.exists("/missing")); - -// Move a file -await agent.move("/home/user/project/README.md", "/home/user/project/docs.md"); -console.log( - "docs.md exists:", - await agent.exists("/home/user/project/docs.md"), -); - -// Delete a file, then delete directory recursively -await agent.deleteFile("/home/user/project/docs.md"); -await agent.deleteFile("/home/user/project", { recursive: true }); -console.log( - "project exists after delete:", - await agent.exists("/home/user/project"), -); diff --git a/examples/agent-os/src/filesystem/server.ts b/examples/agent-os/src/filesystem/server.ts deleted file mode 100644 index 84304fd150..0000000000 --- a/examples/agent-os/src/filesystem/server.ts +++ /dev/null @@ -1,24 +0,0 @@ -import common from "@rivet-dev/agent-os-common"; -import { setup } from "rivetkit"; -import { agentOs } from "rivetkit/agent-os"; - -// The default agentOS actor mounts an in-memory filesystem at /home/user. -// You can add custom mounts for S3, host directories, or other backends: -// -// import { S3BlockStore } from "@rivet-dev/agent-os-s3"; -// const vm = agentOs({ -// options: { -// software: [common], -// mounts: [{ -// path: "/data", -// driver: createChunkedVfs(sqliteMetadata, new S3BlockStore({ bucket: "my-bucket" })), -// }], -// }, -// }); -// -// For this example, we use the default in-memory mount. - -const vm = agentOs({ options: { software: [common] } }); - -export const registry = setup({ use: { vm } }); -registry.start(); diff --git a/examples/agent-os/src/git/client.ts b/examples/agent-os/src/git/client.ts deleted file mode 100644 index 12dcb14906..0000000000 --- a/examples/agent-os/src/git/client.ts +++ /dev/null @@ -1,66 +0,0 @@ -// Clone a local repository and check out a feature branch in the clone. - -import { createClient } from "rivetkit/client"; -import type { registry } from "./server.ts"; - -type ExecResult = { - stdout: string; - stderr: string; - exitCode: number; -}; - -function parseCurrentBranch(output: string): string { - const branch = output - .split("\n") - .map((line) => line.trim()) - .find((line) => line.startsWith("* ")) - ?.slice(2) - .trim(); - - if (!branch) { - throw new Error(`could not determine current branch from:\n${output}`); - } - - return branch; -} - -const client = createClient("http://localhost:6420"); -const agent = client.vm.getOrCreate(["my-agent"]); - -async function run(command: string): Promise { - const result = (await agent.exec(command)) as ExecResult; - if (result.exitCode !== 0) { - throw new Error( - `command failed: ${command}\n${result.stderr || result.stdout}`, - ); - } - return result; -} - -await run("git init /tmp/origin"); -await agent.writeFile("/tmp/origin/README.md", "# demo repo\n"); -await run("git -C /tmp/origin add README.md"); -await run("git -C /tmp/origin commit -m 'initial commit'"); - -const defaultBranch = parseCurrentBranch( - (await run("git -C /tmp/origin branch")).stdout, -); - -await run("git -C /tmp/origin checkout -b feature"); -await agent.writeFile("/tmp/origin/feature.txt", "checked out from feature\n"); -await run("git -C /tmp/origin add feature.txt"); -await run("git -C /tmp/origin commit -m 'add feature file'"); -await run(`git -C /tmp/origin checkout ${defaultBranch}`); - -await run("git clone /tmp/origin /tmp/clone"); -console.log("clone branches before checkout:"); -console.log((await run("git -C /tmp/clone branch")).stdout.trim()); - -await run("git -C /tmp/clone checkout feature"); -console.log("clone branches after checkout:"); -console.log((await run("git -C /tmp/clone branch")).stdout.trim()); - -const featureFile = (await agent.readFile( - "/tmp/clone/feature.txt", -)) as Uint8Array; -console.log("feature.txt:", new TextDecoder().decode(featureFile).trim()); diff --git a/examples/agent-os/src/git/server.ts b/examples/agent-os/src/git/server.ts deleted file mode 100644 index 0833c35031..0000000000 --- a/examples/agent-os/src/git/server.ts +++ /dev/null @@ -1,9 +0,0 @@ -import common from "@rivet-dev/agent-os-common"; -import git from "@rivet-dev/agent-os-git"; -import { setup } from "rivetkit"; -import { agentOs } from "rivetkit/agent-os"; - -const vm = agentOs({ options: { software: [common, git] } }); - -export const registry = setup({ use: { vm } }); -registry.start(); diff --git a/examples/agent-os/src/hello-world/client.ts b/examples/agent-os/src/hello-world/client.ts deleted file mode 100644 index 0296acc6ad..0000000000 --- a/examples/agent-os/src/hello-world/client.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Minimal agentOS example: create a VM, write a file, read it back. - -import { createClient } from "rivetkit/client"; -import type { registry } from "./server.ts"; - -const client = createClient("http://localhost:6420"); -const agent = client.vm.getOrCreate(["my-agent"]); - -await agent.writeFile("/hello.txt", "Hello from agentOS!"); -const content = (await agent.readFile("/hello.txt")) as Uint8Array; -console.log(new TextDecoder().decode(content)); diff --git a/examples/agent-os/src/hello-world/server.ts b/examples/agent-os/src/hello-world/server.ts deleted file mode 100644 index b4e759e13a..0000000000 --- a/examples/agent-os/src/hello-world/server.ts +++ /dev/null @@ -1,8 +0,0 @@ -import common from "@rivet-dev/agent-os-common"; -import { setup } from "rivetkit"; -import { agentOs } from "rivetkit/agent-os"; - -const vm = agentOs({ options: { software: [common] } }); - -export const registry = setup({ use: { vm } }); -registry.start(); diff --git a/examples/agent-os/src/network/client.ts b/examples/agent-os/src/network/client.ts deleted file mode 100644 index dd38f79675..0000000000 --- a/examples/agent-os/src/network/client.ts +++ /dev/null @@ -1,54 +0,0 @@ -// Networking: start a server inside the VM, fetch from it, and create a preview URL. - -import { createClient } from "rivetkit/client"; -import type { registry } from "./server.ts"; - -const client = createClient("http://localhost:6420"); -const agent = client.vm.getOrCreate(["my-agent"]); - -// Write a server script to run inside the VM on a fixed port -await agent.writeFile( - "/tmp/server.js", - ` -const http = require("http"); -const server = http.createServer((req, res) => { - res.writeHead(200, { "Content-Type": "application/json" }); - res.end(JSON.stringify({ status: "ok", method: req.method, url: req.url })); -}); -server.listen(3000, "0.0.0.0", () => { - console.log("Server ready on port 3000"); -}); -`, -); - -// Spawn the server inside the VM -const proc = (await agent.spawn("node", ["/tmp/server.js"])) as { - pid: number; -}; -console.log("Spawned server process:", proc.pid); - -// Give the server time to start -await new Promise((r) => setTimeout(r, 1000)); - -// vmFetch routes HTTP requests to the VM's localhost -const response = (await agent.vmFetch(3000, "http://localhost/api/test")) as { - body: Uint8Array; -}; -const body = JSON.parse(new TextDecoder().decode(response.body)); -console.log("vmFetch response:", body); - -// Create a signed preview URL for external access -const preview = (await agent.createSignedPreviewUrl(3000)) as { - path: string; - token: string; - port: number; - expiresAt: number; -}; -console.log("Preview URL path:", preview.path); -console.log("Expires at:", new Date(preview.expiresAt).toISOString()); - -// Expire the preview URL -await agent.expireSignedPreviewUrl(preview.token); -console.log("Preview URL expired"); - -await agent.killProcess(proc.pid); diff --git a/examples/agent-os/src/network/server.ts b/examples/agent-os/src/network/server.ts deleted file mode 100644 index b4e759e13a..0000000000 --- a/examples/agent-os/src/network/server.ts +++ /dev/null @@ -1,8 +0,0 @@ -import common from "@rivet-dev/agent-os-common"; -import { setup } from "rivetkit"; -import { agentOs } from "rivetkit/agent-os"; - -const vm = agentOs({ options: { software: [common] } }); - -export const registry = setup({ use: { vm } }); -registry.start(); diff --git a/examples/agent-os/src/processes/client.ts b/examples/agent-os/src/processes/client.ts deleted file mode 100644 index 84890ed07b..0000000000 --- a/examples/agent-os/src/processes/client.ts +++ /dev/null @@ -1,60 +0,0 @@ -// Execute commands and manage processes inside the VM. - -import { createClient } from "rivetkit/client"; -import type { registry } from "./server.ts"; - -const client = createClient("http://localhost:6420"); -const agent = client.vm.getOrCreate(["my-agent"]); - -// Run shell commands with exec() -const result = (await agent.exec("echo 'hello from shell'")) as { - stdout: string; - stderr: string; - exitCode: number; -}; -console.log("exec stdout:", result.stdout.trim()); -console.log("exec exit code:", result.exitCode); - -// Shell pipeline -const piped = (await agent.exec("echo hello | tr a-z A-Z")) as { - stdout: string; -}; -console.log("piped:", piped.stdout.trim()); - -// grep -await agent.writeFile("/tmp/data.txt", "apple\nbanana\ncherry\napricot\n"); -const grepped = (await agent.exec("grep ap /tmp/data.txt")) as { - stdout: string; -}; -console.log("grep:", grepped.stdout.trim()); - -// sed -const sedResult = (await agent.exec( - "echo 'hello world' | sed 's/world/agentOS/'", -)) as { stdout: string }; -console.log("sed:", sedResult.stdout.trim()); - -// Spawn a Node.js script and wait for it to complete -await agent.writeFile( - "/tmp/counter.mjs", - ` -let i = 0; -const interval = setInterval(() => { - console.log("tick " + i++); - if (i >= 3) { clearInterval(interval); } -}, 100); -`, -); - -const proc = (await agent.spawn("node", ["/tmp/counter.mjs"])) as { - pid: number; -}; -console.log("Spawned process:", proc.pid); - -// Wait for it to finish -const exitCode = (await agent.waitProcess(proc.pid)) as number; -console.log("Process exited with code:", exitCode); - -// List all processes -const processes = await agent.listProcesses(); -console.log("Processes:", JSON.stringify(processes)); diff --git a/examples/agent-os/src/processes/server.ts b/examples/agent-os/src/processes/server.ts deleted file mode 100644 index b4e759e13a..0000000000 --- a/examples/agent-os/src/processes/server.ts +++ /dev/null @@ -1,8 +0,0 @@ -import common from "@rivet-dev/agent-os-common"; -import { setup } from "rivetkit"; -import { agentOs } from "rivetkit/agent-os"; - -const vm = agentOs({ options: { software: [common] } }); - -export const registry = setup({ use: { vm } }); -registry.start(); diff --git a/examples/agent-os/src/sandbox/client.ts b/examples/agent-os/src/sandbox/client.ts deleted file mode 100644 index 84bcee872b..0000000000 --- a/examples/agent-os/src/sandbox/client.ts +++ /dev/null @@ -1,65 +0,0 @@ -// Sandbox extension: write files and run commands in a Docker sandbox. -// -// The /sandbox mount projects the sandbox filesystem into the VM. -// The sandbox toolkit is accessible via the tools RPC server. - -import { createClient } from "rivetkit/client"; -import type { registry } from "./server.ts"; - -const client = createClient("http://localhost:6420"); -const agent = client.vm.getOrCreate(["my-agent"]); - -// Write and read a file through the mounted sandbox filesystem -await agent.writeFile("/sandbox/hello.txt", "Hello from agentOS!"); -const content = (await agent.readFile("/sandbox/hello.txt")) as Uint8Array; -console.log("Read from sandbox mount:", new TextDecoder().decode(content)); - -// Get the tools RPC port to call sandbox commands -const env = (await agent.exec("echo $AGENTOS_TOOLS_PORT")) as { - stdout: string; -}; -const port = env.stdout.trim(); - -// Run a command inside the Docker sandbox via the toolkit RPC -await agent.writeFile( - "/tmp/sandbox-cmd.mjs", - ` -import { writeFileSync } from "node:fs"; -const res = await fetch("http://127.0.0.1:${port}/call", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - toolkit: "sandbox", - tool: "run-command", - input: { command: "echo", args: ["hello from Docker sandbox"] }, - }), -}); -writeFileSync("/tmp/sandbox-out.json", await res.text()); -`, -); -const proc = (await agent.spawn("node", ["/tmp/sandbox-cmd.mjs"])) as { - pid: number; -}; -await agent.waitProcess(proc.pid); -const result = (await agent.readFile("/tmp/sandbox-out.json")) as Uint8Array; -console.log("Sandbox command:", new TextDecoder().decode(result)); - -// List processes in the sandbox -await agent.writeFile( - "/tmp/sandbox-ps.mjs", - ` -import { writeFileSync } from "node:fs"; -const res = await fetch("http://127.0.0.1:${port}/call", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ toolkit: "sandbox", tool: "list-processes", input: {} }), -}); -writeFileSync("/tmp/sandbox-ps.json", await res.text()); -`, -); -const psProc = (await agent.spawn("node", ["/tmp/sandbox-ps.mjs"])) as { - pid: number; -}; -await agent.waitProcess(psProc.pid); -const psList = (await agent.readFile("/tmp/sandbox-ps.json")) as Uint8Array; -console.log("Sandbox processes:", new TextDecoder().decode(psList)); diff --git a/examples/agent-os/src/sandbox/server.ts b/examples/agent-os/src/sandbox/server.ts deleted file mode 100644 index b489bbd863..0000000000 --- a/examples/agent-os/src/sandbox/server.ts +++ /dev/null @@ -1,36 +0,0 @@ -// Sandbox extension: mount a remote Docker sandbox into the VM. -// -// Requires Docker running locally. The sandbox-agent package manages the -// container lifecycle. The sandbox filesystem is mounted at /sandbox and -// the toolkit exposes process management as CLI commands. - -import common from "@rivet-dev/agent-os-common"; -import { - createSandboxFs, - createSandboxToolkit, -} from "@rivet-dev/agent-os-sandbox"; -import { setup } from "rivetkit"; -import { agentOs } from "rivetkit/agent-os"; -import { SandboxAgent } from "sandbox-agent"; -import { docker } from "sandbox-agent/docker"; - -// Start a Docker-backed sandbox. -const sandbox = await SandboxAgent.start({ - sandbox: docker(), -}); - -const vm = agentOs({ - options: { - software: [common], - mounts: [ - { - path: "/sandbox", - driver: createSandboxFs({ client: sandbox }), - }, - ], - toolKits: [createSandboxToolkit({ client: sandbox })], - }, -}); - -export const registry = setup({ use: { vm } }); -registry.start(); diff --git a/examples/agent-os/src/tools/client.ts b/examples/agent-os/src/tools/client.ts deleted file mode 100644 index bb05b53def..0000000000 --- a/examples/agent-os/src/tools/client.ts +++ /dev/null @@ -1,34 +0,0 @@ -// Host toolkits are exposed as CLI commands inside the VM. -// -// When toolkits are registered in server.ts, CLI shims are auto-installed -// at /usr/local/bin/agentos-{toolkit} and the tool list is injected into -// the agent's system prompt. -// -// The agent calls tools as shell commands: -// agentos-weather forecast --city Paris --days 3 -// -// Responses are JSON: -// {"ok":true,"result":{"city":"Paris","days":3,"temperature":22,"conditions":"sunny"}} - -import { createClient } from "rivetkit/client"; -import type { registry } from "./server.ts"; - -const client = createClient("http://localhost:6420"); -const agent = client.vm.getOrCreate(["my-agent"]); - -// Call a tool using the auto-generated CLI command -const result = (await agent.exec( - "agentos-weather forecast --city Paris --days 3", -)) as { - stdout: string; - exitCode: number; -}; -console.log("Weather:", result.stdout.trim()); - -// Create a session and let the agent use tools naturally -const session = (await agent.createSession("pi", { - env: { ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY! }, -})) as { sessionId: string }; - -// The agent will call agentos-weather forecast automatically -await agent.sendPrompt(session.sessionId, "What's the weather in Paris?"); diff --git a/examples/agent-os/src/tools/server.ts b/examples/agent-os/src/tools/server.ts deleted file mode 100644 index 761bf16dc3..0000000000 --- a/examples/agent-os/src/tools/server.ts +++ /dev/null @@ -1,56 +0,0 @@ -import common from "@rivet-dev/agent-os-common"; -import { hostTool, toolKit } from "@rivet-dev/agent-os-core"; -import pi from "@rivet-dev/agent-os-pi"; -import { setup } from "rivetkit"; -import { agentOs } from "rivetkit/agent-os"; -import { z } from "zod"; - -const weatherToolkit = toolKit({ - name: "weather", - description: "Look up weather information for cities.", - tools: { - forecast: hostTool({ - description: "Get the weather forecast for a city.", - inputSchema: z.object({ - city: z.string().describe("City name (e.g. 'Paris')."), - days: z.number().optional().describe("Number of days"), - }), - execute: async ({ city, days }) => ({ - city, - days: days ?? 3, - temperature: 22, - conditions: "sunny", - }), - examples: [ - { - description: "3-day forecast for Paris", - input: { city: "Paris", days: 3 }, - }, - ], - }), - }, -}); - -// Tools are exposed as CLI commands inside the VM: -// -// # List all available toolkits -// agentos list-tools -// -// # Get help for a tool -// agentos-weather forecast --help -// -// # Call a tool with flags -// agentos-weather forecast --city Paris --days 3 -// -// # Call with inline JSON -// agentos-weather forecast --json '{"city":"Paris","days":3}' - -const vm = agentOs({ - options: { - software: [common, pi], - toolKits: [weatherToolkit], - }, -}); - -export const registry = setup({ use: { vm } }); -registry.start(); diff --git a/examples/agent-os/tsconfig.json b/examples/agent-os/tsconfig.json deleted file mode 100644 index c3382bb665..0000000000 --- a/examples/agent-os/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "target": "esnext", - "lib": ["esnext"], - "module": "esnext", - "moduleResolution": "bundler", - "types": ["node"], - "noEmit": true, - "strict": true, - "skipLibCheck": true, - "allowImportingTsExtensions": true, - "rewriteRelativeImportExtensions": true - }, - "include": ["src/**/*"] -} diff --git a/examples/agent-os/turbo.json b/examples/agent-os/turbo.json deleted file mode 100644 index 29d4cb2625..0000000000 --- a/examples/agent-os/turbo.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "extends": ["//"] -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4eae8e3a96..4f24a31118 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -233,47 +233,6 @@ importers: specifier: ^3.1.1 version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.10)(less@4.4.1)(lightningcss@1.33.0)(msw@2.14.6(@types/node@22.19.10)(typescript@5.9.3))(sass@1.93.2)(stylus@0.62.0)(terser@5.46.0) - examples/agent-os: - dependencies: - rivetkit: - specifier: workspace:* - version: link:../../rivetkit-typescript/packages/rivetkit - zod: - specifier: ^3.25.0 - version: 3.25.76 - devDependencies: - '@types/node': - specifier: ^22.13.9 - version: 22.19.15 - tsx: - specifier: ^3.12.7 - version: 3.14.0 - typescript: - specifier: ^5.5.2 - version: 5.9.3 - - examples/agent-os-e2e: - dependencies: - '@rivet-dev/agent-os-common': - specifier: '*' - version: 0.0.260331072558 - '@rivet-dev/agent-os-pi': - specifier: ^0.1.1 - version: 0.1.1(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(ws@8.22.0)(zod@3.25.76) - rivetkit: - specifier: workspace:* - version: link:../../rivetkit-typescript/packages/rivetkit - devDependencies: - '@types/node': - specifier: ^22.13.9 - version: 22.19.15 - tsx: - specifier: ^3.12.7 - version: 3.14.0 - typescript: - specifier: ^5.5.2 - version: 5.9.3 - examples/ai-agent: dependencies: '@ai-sdk/openai': @@ -3652,9 +3611,6 @@ importers: '@opentelemetry/api': specifier: ^1.1.0 version: 1.9.0 - '@rivet-dev/agent-os-core': - specifier: ^0.1.1 - version: 0.1.1(pyodide@0.28.3) '@rivet-dev/services': specifier: ^0.2.0 version: 0.2.0 @@ -3734,12 +3690,6 @@ importers: '@opentelemetry/sdk-trace-node': specifier: 2.11.0 version: 2.11.0(@opentelemetry/api@1.9.0) - '@rivet-dev/agent-os-common': - specifier: '*' - version: 0.0.260331072558 - '@rivet-dev/agent-os-pi': - specifier: ^0.1.1 - version: 0.1.1(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.1.13))(pyodide@0.28.3)(ws@8.19.0)(zod@4.1.13) '@standard-schema/spec': specifier: ^1.0.0 version: 1.0.0 @@ -3993,11 +3943,6 @@ packages: '@adobe/css-tools@4.3.3': resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} - '@agentclientprotocol/sdk@0.16.1': - resolution: {integrity: sha512-1ad+Sc/0sCtZGHthxxvgEUo5Wsbw16I+aF+YwdiLnPwkZG8KAGUEAPK6LM6Pf69lCyJPt1Aomk1d+8oE3C4ZEw==} - peerDependencies: - zod: ^3.25.0 || ^4.0.0 - '@ai-sdk/anthropic@1.2.12': resolution: {integrity: sha512-YSzjlko7JvuiyQFmI9RN1tNZdEiZxc+6xld/0tq/VkJaHpEzGAb1yiNxxvmYVcjvfu/PcvCxAAYXmTYQQ63IHQ==} engines: {node: '>=18'} @@ -4093,15 +4038,6 @@ packages: '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} - '@anthropic-ai/sdk@0.73.0': - resolution: {integrity: sha512-URURVzhxXGJDGUGFunIOtBlSl7KWvZiAAKY/ttTkZAkXT9bTPqdk2eK0b8qqSxXpikh3QKPnPYpiyX98zf5ebw==} - hasBin: true - peerDependencies: - zod: ^3.25.0 || ^4.0.0 - peerDependenciesMeta: - zod: - optional: true - '@anthropic-ai/sdk@0.91.1': resolution: {integrity: sha512-LAmu761tSN9r66ixvmciswUj/ZC+1Q4iAfpedTfSVLeswRwnY3n2Nb6Tsk+cLPP28aLOPWeMgIuTuCcMC6W/iw==} hasBin: true @@ -4125,10 +4061,6 @@ packages: peerDependencies: zod: ^4.0.0 - '@aws-crypto/crc32@5.2.0': - resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} - engines: {node: '>=16.0.0'} - '@aws-crypto/sha256-browser@5.2.0': resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} @@ -4142,18 +4074,10 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-bedrock-runtime@3.1024.0': - resolution: {integrity: sha512-nIhsn0/eYrL2fTh4kMO7Hpfmhv+AkkXl0KGNpD6+fdmotGvRBWcDv9/PmP/+sT6gvrKTYyzH3vu4efpTPzzP0Q==} - engines: {node: '>=20.0.0'} - '@aws-sdk/client-bedrock-runtime@3.1048.0': resolution: {integrity: sha512-u+NT61JZEkRFtpL0CAw1N1dwxnaLgwVXQl/zjJxTGgLyS/jTIdg2SdoEoCTHxgDyCnqa1HEi9QOoE9/pYRNpOQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.973.26': - resolution: {integrity: sha512-A/E6n2W42ruU+sfWk+mMUOyVXbsSgGrY3MJ9/0Az5qUdG67y8I6HYzzoAa+e/lzxxl1uCYmEL6BTMi9ZiZnplQ==} - engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.977.4': resolution: {integrity: sha512-CEkcQlMOQJCvul60U7wdAOACjtdgFWDsfJI+6wUOGdhGNV2lGbuJpi/R50QLpFG3Tp+sQxa/RmzC3X7KHbhuTA==} engines: {node: '>=20.0.0'} @@ -4181,10 +4105,6 @@ packages: resolution: {integrity: sha512-L+Z85anONJd8MaiuraO4wRxATCdEejBZ3K3eymzWI5JPXa9sOS9CkIm72PBKqXKX+Z9p9NGMX5AIMXm0LEflgw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.29': - resolution: {integrity: sha512-clSzDcvndpFJAggLDnDb36sPdlZYyEs5Zm6zgZjjUhwsJgSWiWKwFIXUVBcbruidNyBdbpOv2tNDL9sX8y3/0g==} - engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.84': resolution: {integrity: sha512-oHt854odINVwzwsh+c5x69j0ajm4DbqqqVJ+O1ECsCIZeMDAbzFpXItaqP7UZstJj/ATdTk/KFSH0LaNAgV+kA==} engines: {node: '>=20.0.0'} @@ -4205,10 +4125,6 @@ packages: resolution: {integrity: sha512-/y9WvNtlcPBGLR0qc1a+9J/xtYZfVczvLUOuXaVWylzttH7ewsxwHtjmiJSolNrVSDorIxHGHMU61CbonRkmwA==} engines: {node: '>=20.0.0'} - '@aws-sdk/eventstream-handler-node@3.972.12': - resolution: {integrity: sha512-ruyc/MNR6e+cUrGCth7fLQ12RXBZDy/bV06tgqB9Z5n/0SN/C0m6bsQEV8FF9zPI6VSAOaRd0rNgmpYVnGawrQ==} - engines: {node: '>=20.0.0'} - '@aws-sdk/eventstream-handler-node@3.972.35': resolution: {integrity: sha512-a8xilRoRaalvSPZdfrs0VY3/BPc0uYhXW56Z/k6nmZ5Vk430LHeowf9APIPq8utM3tMJSNGSSuJMlB9YrPsN+A==} engines: {node: '>=20.0.0'} @@ -4217,30 +4133,6 @@ packages: resolution: {integrity: sha512-B6gvZlcnRBNWraKgyEjKsbhv+VjtbyHmpU7hmtTHzXpDSxHPpCJnYLpglEOOsF+SFne20DbZC5IVC1aNr2Pb4A==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-eventstream@3.972.8': - resolution: {integrity: sha512-r+oP+tbCxgqXVC3pu3MUVePgSY0ILMjA+aEwOosS77m3/DRbtvHrHwqvMcw+cjANMeGzJ+i0ar+n77KXpRA8RQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-host-header@3.972.8': - resolution: {integrity: sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-logger@3.972.8': - resolution: {integrity: sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-recursion-detection@3.972.9': - resolution: {integrity: sha512-/Wt5+CT8dpTFQxEJ9iGy/UGrXr7p2wlIOEHvIr/YcHYByzoLjrqkYqXdJjd9UIgWjv7eqV2HnFJen93UTuwfTQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-user-agent@3.972.28': - resolution: {integrity: sha512-cfWZFlVh7Va9lRay4PN2A9ARFzaBYcA097InT5M2CdRS05ECF5yaz86jET8Wsl2WcyKYEvVr/QNmKtYtafUHtQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-websocket@3.972.14': - resolution: {integrity: sha512-qnfDlIHjm6DrTYNvWOUbnZdVKgtoKbO/Qzj+C0Wp5Y7VUrsvBRQtGKxD+hc+mRTS4N0kBJ6iZ3+zxm4N1OSyjg==} - engines: {node: '>= 14.0.0'} - '@aws-sdk/middleware-websocket@3.972.54': resolution: {integrity: sha512-bhESdru8u8KosziH8jcVta/NM/dNreeRz2+2aU86si5bfBYOiJ6IiqD+9U4URUcU5WJO3Yw+jO3GLDIHlscXMQ==} engines: {node: '>= 14.0.0'} @@ -4253,10 +4145,6 @@ packages: resolution: {integrity: sha512-oRxtBcka/JGHGs9l9p9IVajGoTP8vTPmoAzdHGy4Qcy9P5vPnDf6nhIeM/COQNY9k/OahImTRaLkHftoXvfcmQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/region-config-resolver@3.972.10': - resolution: {integrity: sha512-1dq9ToC6e070QvnVhhbAs3bb5r6cQ10gTVc6cyRV5uvQe7P138TV2uG2i6+Yok4bAkVAcx5AqkTEBUvWEtBlsQ==} - engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.996.43': resolution: {integrity: sha512-lKekx8bLBXSv4O+cslk9Zfnw2XKSkWBs3uWL5QGhH2ZAQfNS7FE0vcSSN2vD/AhxX54ZTywWxR4STThoeOXlBA==} engines: {node: '>=20.0.0'} @@ -4265,10 +4153,6 @@ packages: resolution: {integrity: sha512-Zk08macMvQTHzQJCLJVkOlviVoqwYMrpXv4lmLN7b7sAbiMoOK7Go0NYdR5UeF+MW8LIbRmwrNy9u/5VvX1U5g==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.1024.0': - resolution: {integrity: sha512-eoyTMgd6OzoE1dq50um5Y53NrosEkWsjH0W6pswi7vrv1W9hY/7hR43jDcPevqqj+OQksf/5lc++FTqRlb8Y1Q==} - engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.1048.0': resolution: {integrity: sha512-k0y/GcuesuSfWyUM0WamrGyeZmltRYaPbHO82UDA6mZ/doB+FOHKutikPAtSXMn/hDz970cF+iRuuiYO9VEbAA==} engines: {node: '>=20.0.0'} @@ -4277,10 +4161,6 @@ packages: resolution: {integrity: sha512-GpyAr0DD63YOEmYFM6Df+gJuIgC92MMTiBK4FTKfxii5MJ9ge20epR7LyroulscYlG89J+ZB2ivFDPjvfQhzdw==} engines: {node: '>=20.0.0'} - '@aws-sdk/types@3.973.6': - resolution: {integrity: sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==} - engines: {node: '>=20.0.0'} - '@aws-sdk/types@3.974.2': resolution: {integrity: sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA==} engines: {node: '>=20.0.0'} @@ -4289,30 +4169,10 @@ packages: resolution: {integrity: sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.996.5': - resolution: {integrity: sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-format-url@3.972.8': - resolution: {integrity: sha512-J6DS9oocrgxM8xlUTTmQOuwRF6rnAGEujAN9SAzllcrQmwn5iJ58ogxy3SEhD0Q7JZvlA5jvIXBkpQRqEqlE9A==} - engines: {node: '>=20.0.0'} - '@aws-sdk/util-locate-window@3.965.5': resolution: {integrity: sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-user-agent-browser@3.972.8': - resolution: {integrity: sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==} - - '@aws-sdk/util-user-agent-node@3.973.14': - resolution: {integrity: sha512-vNSB/DYaPOyujVZBg/zUznH9QC142MaTHVmaFlF7uzzfg3CgT9f/l4C0Yi+vU/tbBhxVcXVB90Oohk5+o+ZbWw==} - engines: {node: '>=20.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - '@aws-sdk/xml-builder@3.972.37': resolution: {integrity: sha512-zKq4HQum8JwDyEuyfuI4bbiAcU0KxP6qy+9PR/IsR92IyE/DaBAikzAS50tjxip4bqIIANpCcG+Yyj6CVhXupg==} engines: {node: '>=20.0.0'} @@ -4321,10 +4181,6 @@ packages: resolution: {integrity: sha512-ctjVSyCMegrWfXlx6VqzSBFI6UqmQ5ZlnfMhdLIiWmhoH8UAQxSCP5N3OpG7X3k4LnS7ou74C4mt20+bfTW2aQ==} engines: {node: '>=20.0.0'} - '@aws/lambda-invoke-store@0.2.3': - resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==} - engines: {node: '>=18.0.0'} - '@aws/lambda-invoke-store@0.3.0': resolution: {integrity: sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==} engines: {node: '>=18.0.0'} @@ -6566,15 +6422,6 @@ packages: '@fortawesome/fontawesome-svg-core': ~1 || ~6 || ~7 react: 19.1.0 - '@google/genai@1.48.0': - resolution: {integrity: sha512-plonYK4ML2PrxsRD9SeqmFt76eREWkQdPCglOA6aYDzL1AAbE+7PUnT54SvpWGfws13L0AZEqGSpL7+1IPnTxQ==} - engines: {node: '>=20.0.0'} - peerDependencies: - '@modelcontextprotocol/sdk': ^1.25.2 - peerDependenciesMeta: - '@modelcontextprotocol/sdk': - optional: true - '@google/genai@1.52.0': resolution: {integrity: sha512-gwSvbpiN/17O9TbsqSsE/OzZcpv5Fo4RQjdngGgogtuB9RsyJ8ZHhX5KjHj1bp5N9snN2eK8LDGXSaWW2hof8Q==} engines: {node: '>=20.0.0'} @@ -7276,95 +7123,6 @@ packages: '@marijn/find-cluster-break@1.0.2': resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} - '@mariozechner/clipboard-darwin-arm64@0.3.2': - resolution: {integrity: sha512-uBf6K7Je1ihsgvmWxA8UCGCeI+nbRVRXoarZdLjl6slz94Zs1tNKFZqx7aCI5O1i3e0B6ja82zZ06BWrl0MCVw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@mariozechner/clipboard-darwin-universal@0.3.2': - resolution: {integrity: sha512-mxSheKTW2U9LsBdXy0SdmdCAE5HqNS9QUmpNHLnfJ+SsbFKALjEZc5oRrVMXxGQSirDvYf5bjmRyT0QYYonnlg==} - engines: {node: '>= 10'} - os: [darwin] - - '@mariozechner/clipboard-darwin-x64@0.3.2': - resolution: {integrity: sha512-U1BcVEoidvwIp95+HJswSW+xr28EQiHR7rZjH6pn8Sja5yO4Yoe3yCN0Zm8Lo72BbSOK/fTSq0je7CJpaPCspg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@mariozechner/clipboard-linux-arm64-gnu@0.3.2': - resolution: {integrity: sha512-BsinwG3yWTIjdgNCxsFlip7LkfwPk+ruw/aFCXHUg/fb5XC/Ksp+YMQ7u0LUtiKzIv/7LMXgZInJQH6gxbAaqQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@mariozechner/clipboard-linux-arm64-musl@0.3.2': - resolution: {integrity: sha512-0/Gi5Xq2V6goXBop19ePoHvXsmJD9SzFlO3S+d6+T2b+BlPcpOu3Oa0wTjl+cZrLAAEzA86aPNBI+VVAFDFPKw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@mariozechner/clipboard-linux-riscv64-gnu@0.3.2': - resolution: {integrity: sha512-2AFFiXB24qf0zOZsxI1GJGb9wQGlOJyN6UwoXqmKS3dpQi/l6ix30IzDDA4c4ZcCcx4D+9HLYXhC1w7Sov8pXA==} - engines: {node: '>= 10'} - cpu: [riscv64] - os: [linux] - - '@mariozechner/clipboard-linux-x64-gnu@0.3.2': - resolution: {integrity: sha512-v6fVnsn7WMGg73Dab8QMwyFce7tzGfgEixKgzLP8f1GJqkJZi5zO4k4FOHzSgUufgLil63gnxvMpjWkgfeQN7A==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@mariozechner/clipboard-linux-x64-musl@0.3.2': - resolution: {integrity: sha512-xVUtnoMQ8v2JVyfJLKKXACA6avdnchdbBkTsZs8BgJQo29qwCp5NIHAUO8gbJ40iaEGToW5RlmVk2M9V0HsHEw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@mariozechner/clipboard-win32-arm64-msvc@0.3.2': - resolution: {integrity: sha512-AEgg95TNi8TGgak2wSXZkXKCvAUTjWoU1Pqb0ON7JHrX78p616XUFNTJohtIon3e0w6k0pYPZeCuqRCza/Tqeg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@mariozechner/clipboard-win32-x64-msvc@0.3.2': - resolution: {integrity: sha512-tGRuYpZwDOD7HBrCpyRuhGnHHSCknELvqwKKUG4JSfSB7JIU7LKRh6zx6fMUOQd8uISK35TjFg5UcNih+vJhFA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@mariozechner/clipboard@0.3.2': - resolution: {integrity: sha512-IHQpksNjo7EAtGuHFU+tbWDp5LarH3HU/8WiB9O70ZEoBPHOg0/6afwSLK0QyNMMmx4Bpi/zl6+DcBXe95nWYA==} - engines: {node: '>= 10'} - - '@mariozechner/jiti@2.6.5': - resolution: {integrity: sha512-faGUlTcXka5l7rv0lP3K3vGW/ejRuOS24RR2aSFWREUQqzjgdsuWNo/IiPqL3kWRGt6Ahl2+qcDAwtdeWeuGUw==} - hasBin: true - - '@mariozechner/pi-agent-core@0.60.0': - resolution: {integrity: sha512-1zQcfFp8r0iwZCxCBQ9/ccFJoagns68cndLPTJJXl1ZqkYirzSld1zBOPxLAgeAKWIz3OX8dB2WQwTJFhmEojQ==} - engines: {node: '>=20.0.0'} - deprecated: please use @earendil-works/pi-agent-core instead going forward - - '@mariozechner/pi-ai@0.60.0': - resolution: {integrity: sha512-OiMuXQturnEDPmA+ho7eLe4G8plO2z21yjNMs9niQREauoblWOz7Glv58I66KPzczLED4aZTlQLTRdU6t1rz8A==} - engines: {node: '>=20.0.0'} - deprecated: please use @earendil-works/pi-ai instead going forward - hasBin: true - - '@mariozechner/pi-coding-agent@0.60.0': - resolution: {integrity: sha512-IOv7cTU4nbznFNUE5ofi13k2dmSG39coBoGWIBQTVw3iVyl0HxuHbg0NiTx3ktrPIDNtkii+y7tWXzWqwoo4lw==} - engines: {node: '>=20.6.0'} - deprecated: please use @earendil-works/pi-coding-agent instead going forward - hasBin: true - - '@mariozechner/pi-tui@0.60.0': - resolution: {integrity: sha512-ZAK5gxYhGmfJqMjfWcRBjB8glITltDbTrYJXvcDtfengbKTZN0p39p5uO5pvUB8/PiAWKTRS06yaNMhf/LG26g==} - engines: {node: '>=20.0.0'} - deprecated: please use @earendil-works/pi-tui instead going forward - '@marsidev/react-turnstile@1.5.0': resolution: {integrity: sha512-Ph6mcj8u9WBDsBO7s9jKPsyRDz1sBPBJwrk+Ngx09vFInvKsQ6U6kW5amEcGq4dHOreB6DgFrOJk7/fy318YlQ==} peerDependencies: @@ -7412,9 +7170,6 @@ packages: '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} - '@mistralai/mistralai@1.14.1': - resolution: {integrity: sha512-IiLmmZFCCTReQgPAT33r7KQ1nYo5JPdvGkrkZqA8qQ2qB1GHgs5LoP5K2ICyrjnpw2n8oSxMM/VP+liiKcGNlQ==} - '@mistralai/mistralai@2.2.6': resolution: {integrity: sha512-W8pX7zHxjJvMIpw8JMxeJEleapXX0Q9NPszdNzqkM3MIEoIGPObdodujj+WHteXEvGfaP/AMwlNyRfEzSY6dQQ==} peerDependencies: @@ -8103,21 +7858,12 @@ packages: '@protobufjs/base64@1.1.2': resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - '@protobufjs/codegen@2.0.5': resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==} - '@protobufjs/eventemitter@1.1.0': - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - '@protobufjs/eventemitter@1.1.1': resolution: {integrity: sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==} - '@protobufjs/fetch@1.1.0': - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - '@protobufjs/fetch@1.1.1': resolution: {integrity: sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==} @@ -8133,9 +7879,6 @@ packages: '@protobufjs/pool@1.1.0': resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@protobufjs/utf8@1.1.2': resolution: {integrity: sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==} @@ -9025,51 +8768,6 @@ packages: peerDependencies: '@redis/client': ^6.3.0 - '@rivet-dev/agent-os-common@0.0.260331072558': - resolution: {integrity: sha512-bkMU6yqLxNLoXYA2/f2qRf0JrlqbIiBRKRpP3d+tbmF+VV2wrAY+iLJDHN6Jw+Q8q3CkT6jB5KTnCZkcYEF3RQ==} - - '@rivet-dev/agent-os-core@0.1.1': - resolution: {integrity: sha512-Uw5jr+gUXDY7TDUFqlypjGe1BD2KL9kTHPNo/f1iNS1R+l9IWuvT+FF/MXsLOEkc3fB06OPVu2ZvUuNwp9MpLQ==} - - '@rivet-dev/agent-os-coreutils@0.0.260331072558': - resolution: {integrity: sha512-vI/J2MJnpsJQZ7F5DU/udGqGMtliqhTg28lE6XZ/qEGyjUvmEQ9AiV8CaAcX5HrImAUWOofBbTv6/XGKjOhT1w==} - - '@rivet-dev/agent-os-diffutils@0.0.260331072558': - resolution: {integrity: sha512-OiTesXIVqGjEHm/LBvqa20kBu8b+W741EyjRptDKkBju+nQY1hKs0+qFE3vSuBe8N8I7F1GdoXUdwzj8easong==} - - '@rivet-dev/agent-os-findutils@0.0.260331072558': - resolution: {integrity: sha512-Bqc85t0jDJlDj/3afLg4iuzk1qGVHMroRx6HDEWQ2kdishfVMTMUSfac+q5IbqUOaQquhf3ixZzTt+utyc7Qew==} - - '@rivet-dev/agent-os-gawk@0.0.260331072558': - resolution: {integrity: sha512-Y2vW1ox1C0ky0Wij2RLLt3NKRY8/pghoy5CM0fDU91bAnWMyB2Jn7aD/GsluK7h8X8ptwqL0q8E1szASIlJK4A==} - - '@rivet-dev/agent-os-grep@0.0.260331072558': - resolution: {integrity: sha512-VlBOteHBFlAtlKfh1abk0FouJwgtqAXEqQGFU8Gnk6FLNgRss5S0yXBnj9p0qwrmZsKlopljrKJIpJp1GCwJrw==} - - '@rivet-dev/agent-os-gzip@0.0.260331072558': - resolution: {integrity: sha512-id9iOrZFAuaXaFWIIiQEo70Ze/poI7hodSqWfo9ro0sajV0xI7kSp0BbXgS4PvGc9O2+VWcOE2qzqTUnKNlBzQ==} - - '@rivet-dev/agent-os-pi@0.1.1': - resolution: {integrity: sha512-+PWE8Kubl6ZfXAPETFXhPRBoPKJbsnbXKK3gvrgGqvBa7kJvzPCYM5muUipSsSPwXurLOtIN+vnCiu8bU/Q7kA==} - hasBin: true - - '@rivet-dev/agent-os-posix@0.1.0': - resolution: {integrity: sha512-NIrI7cCb9x6jdmzRPPx7dAeXoTF/YCqf93ydEzYFA2zshIelLW9Rp5KtgP/2hM6fP0ly4+vVnOeavxJW0wYtcA==} - - '@rivet-dev/agent-os-python@0.1.0': - resolution: {integrity: sha512-1tH1beMf1ceSpicQKwN/a6h+NmJrmfuT4GStiRDZmvN/UWfZhkxuy7HR5VPTQpE/feUZJ01FdtBS3Em/Qoxb2Q==} - peerDependencies: - pyodide: '>=0.28.0' - peerDependenciesMeta: - pyodide: - optional: true - - '@rivet-dev/agent-os-sed@0.0.260331072558': - resolution: {integrity: sha512-i/6ifWCcGE2TEfPWR5ig5tMVKUc0qL0ng59htgS+sqt6zdMaPIllwVztOgXNxMEdFM1TF646e/OkMfMzmYZDCA==} - - '@rivet-dev/agent-os-tar@0.0.260331072558': - resolution: {integrity: sha512-LAa8fm4jombNBQRR42O/57WxY6VA13Uea8JFChh6yPN4VtFP84KI5Kg4/Zzne3YDronGZlgJivznNUH3dtTMzA==} - '@rivet-dev/labs-flue-cli@1.0.0-beta.9-rivet.1': resolution: {integrity: sha512-8FgAXSKENE09WiLlls2MauMJuCNczxvQVMX2xGidQNFNKA9zuGBwN5S352uiaYk5o8qHhZV23+otSeak/cWspw==} engines: {node: '>=22.19.0'} @@ -9556,35 +9254,6 @@ packages: '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@secure-exec/core@0.2.1': - resolution: {integrity: sha512-HsnUv6gClpMA1BBRmX86j30TKTZtgJC/fO1tVavr7IpM2zNKbHU8LgSlBd7mv2SNy02ImTmU/GnQ3aYB4NSbEg==} - - '@secure-exec/nodejs@0.2.1': - resolution: {integrity: sha512-UJMJqVFxexlHJV0Q9nWURvrz6GElj8673DDOOFln6FHR6JS+9SaSU3eISrN158DuNC3SFi4rgjb/scKnK4YOYQ==} - - '@secure-exec/v8-darwin-arm64@0.2.1': - resolution: {integrity: sha512-gEWhMHzUpLwzuBNAD0lVkZXE8wFlWMLp4IOZ+56FYwOW/C+m07cYxuW4TjHyPqZ+vPm3IkoaMqqH5yT9VhjX/Q==} - cpu: [arm64] - os: [darwin] - - '@secure-exec/v8-darwin-x64@0.2.1': - resolution: {integrity: sha512-H2Z5K+Cq+fn/kxjGvhJzepnNFWG6qNdyhZybVWGr5bAAZoSz/Qkad4WnXcurWU+880tKDtnf19LHBXrg7zewNQ==} - cpu: [x64] - os: [darwin] - - '@secure-exec/v8-linux-arm64-gnu@0.2.1': - resolution: {integrity: sha512-14subGhVV/gW35mYYm7Gv1Keeex7PxIgQfoKji/JH7wYyDuarP6kgaES0nJw+JXVkxEVud52c+kbcIjIggqCEw==} - cpu: [arm64] - os: [linux] - - '@secure-exec/v8-linux-x64-gnu@0.2.1': - resolution: {integrity: sha512-Az4s+vUf+78vWtsC7rTn/jQc6WKJafAdt2YpEjB4Gnu+sX+FFTIst1hRV4gJonbRyJdy6SW+OQ6DZatmwczorQ==} - cpu: [x64] - os: [linux] - - '@secure-exec/v8@0.2.1': - resolution: {integrity: sha512-ye/seCqzvyMGnvyP+AO7RkVMR/lE3x9m0D2PfmiAXA457R78ZmOFmZ6v+JlJG2vv3LM30KsSXTUhwpG+Teh0hw==} - '@sentry-internal/browser-utils@8.55.0': resolution: {integrity: sha512-ROgqtQfpH/82AQIpESPqPQe0UyWywKJsmVIqi3c5Fh+zkds5LUxnssTj3yNd1x+kxaPDVB023jAP+3ibNgeNDw==} engines: {node: '>=14.18'} @@ -9721,9 +9390,6 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@silvia-odwyer/photon-node@0.3.4': - resolution: {integrity: sha512-bnly4BKB3KDTFxrUIcgCLbaeVVS8lrAkri1pEzskpmxu9MdfGQTy8b8EgcD83ywD3RPMsIulY8xJH5Awa+t9fA==} - '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -9758,14 +9424,6 @@ packages: peerDependencies: size-limit: 11.2.0 - '@smithy/config-resolver@4.4.13': - resolution: {integrity: sha512-iIzMC5NmOUP6WL6o8iPBjFhUhBZ9pPjpUpQYWMUFQqKyXXzOftbfK8zcQCz/jFV1Psmf05BK5ypx4K2r4Tnwdg==} - engines: {node: '>=18.0.0'} - - '@smithy/core@3.23.13': - resolution: {integrity: sha512-J+2TT9D6oGsUVXVEMvz8h2EmdVnkBiy2auCie4aSJMvKlzUtO5hqjEzXhoCUkIMo7gAYjbQcN0g/MMSXEhDs1Q==} - engines: {node: '>=18.0.0'} - '@smithy/core@3.31.1': resolution: {integrity: sha512-CyogUINxvi7C7LDsh8Syo6hVJOT9ckz4rG8dRZfTJ8r91HkMY59PnNooaj7WcHyxEkxPfBAmbgztZU+xTo76lg==} engines: {node: '>=18.0.0'} @@ -9778,30 +9436,6 @@ packages: resolution: {integrity: sha512-A9uSdn72ozbRUSit0eib0TW7nXuNPlaeM0zcGkJ+nE6tFcSDbnmtwoxbTCFBukVQcszDAyvsd7+rTduPTXpygg==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.2.12': - resolution: {integrity: sha512-FE3bZdEl62ojmy8x4FHqxq2+BuOHlcxiH5vaZ6aqHJr3AIZzwF5jfx8dEiU/X0a8RboyNDjmXjlbr8AdEyLgiA==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-browser@4.2.12': - resolution: {integrity: sha512-XUSuMxlTxV5pp4VpqZf6Sa3vT/Q75FVkLSpSSE3KkWBvAQWeuWt1msTv8fJfgA4/jcJhrbrbMzN1AC/hvPmm5A==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-config-resolver@4.3.12': - resolution: {integrity: sha512-7epsAZ3QvfHkngz6RXQYseyZYHlmWXSTPOfPmXkiS+zA6TBNo1awUaMFL9vxyXlGdoELmCZyZe1nQE+imbmV+Q==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-node@4.2.12': - resolution: {integrity: sha512-D1pFuExo31854eAvg89KMn9Oab/wEeJR6Buy32B49A9Ogdtx5fwZPqBHUlDzaCDpycTFk2+fSQgX689Qsk7UGA==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-universal@4.2.12': - resolution: {integrity: sha512-+yNuTiyBACxOJUTvbsNsSOfH9G9oKbaJE1lNL3YHpGcuucl6rPZMi3nrpehpVOVR2E07YqFFmtwpImtpzlouHQ==} - engines: {node: '>=18.0.0'} - - '@smithy/fetch-http-handler@5.3.15': - resolution: {integrity: sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==} - engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.6.13': resolution: {integrity: sha512-4fW86pEUOMbrD5nkbyl/tTvPHHWJFbuB2odl6ps9lWfHoXf9HWh3Q/Smh59qH1g7+c/BSZghX6bbUk4gsiMs8A==} engines: {node: '>=18.0.0'} @@ -9810,82 +9444,18 @@ packages: resolution: {integrity: sha512-ycSJu3tFAQ4v04CBB0agqFMVsSQ1iG3yw+SpgxRqKfaURpQD4CZ8Wn0zPMmSnOuTpTh65Vz+EA0rMrw089wvkA==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.2.12': - resolution: {integrity: sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==} - engines: {node: '>=18.0.0'} - - '@smithy/invalid-dependency@4.2.12': - resolution: {integrity: sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==} - engines: {node: '>=18.0.0'} - '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/is-array-buffer@4.2.2': - resolution: {integrity: sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-content-length@4.2.12': - resolution: {integrity: sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-endpoint@4.4.28': - resolution: {integrity: sha512-p1gfYpi91CHcs5cBq982UlGlDrxoYUX6XdHSo91cQ2KFuz6QloHosO7Jc60pJiVmkWrKOV8kFYlGFFbQ2WUKKQ==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-retry@4.4.46': - resolution: {integrity: sha512-SpvWNNOPOrKQGUqZbEPO+es+FRXMWvIyzUKUOYdDgdlA6BdZj/R58p4umoQ76c2oJC44PiM7mKizyyex1IJzow==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-serde@4.2.16': - resolution: {integrity: sha512-beqfV+RZ9RSv+sQqor3xroUUYgRFCGRw6niGstPG8zO9LgTl0B0MCucxjmrH/2WwksQN7UUgI7KNANoZv+KALA==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-stack@4.2.12': - resolution: {integrity: sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==} - engines: {node: '>=18.0.0'} - - '@smithy/node-config-provider@4.3.12': - resolution: {integrity: sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==} - engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.12.1': resolution: {integrity: sha512-ThMkboGeONWXAelq9FvGsuJC4rOi+qyC4/zhUF58xYpxUg5sQKx2VXZYJmtNjr4dSuBJ1HeJXETQILCz3wOHvw==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.5.1': - resolution: {integrity: sha512-ejjxdAXjkPIs9lyYyVutOGNOraqUE9v/NjGMKwwFrfOM354wfSD8lmlj8hVwUzQmlLLF4+udhfCX9Exnbmvfzw==} - engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.7.3': resolution: {integrity: sha512-/jPhevcTFPMVl6KNjbaI47iOg1zxC7IsnX4PQDGVZKMFceOXtB8IEYaB7a9VvkP/3oC60WzTeKocvSI7vLT0vA==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.2.12': - resolution: {integrity: sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==} - engines: {node: '>=18.0.0'} - - '@smithy/protocol-http@5.3.12': - resolution: {integrity: sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==} - engines: {node: '>=18.0.0'} - - '@smithy/querystring-builder@4.2.12': - resolution: {integrity: sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg==} - engines: {node: '>=18.0.0'} - - '@smithy/querystring-parser@4.2.12': - resolution: {integrity: sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==} - engines: {node: '>=18.0.0'} - - '@smithy/service-error-classification@4.2.12': - resolution: {integrity: sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==} - engines: {node: '>=18.0.0'} - - '@smithy/shared-ini-file-loader@4.4.7': - resolution: {integrity: sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==} - engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.6.12': resolution: {integrity: sha512-I6KLtq3H0qqSuV9vLglfi8puHqzygzWHOnI4z/Rdoo+q50vvo18vBRdPAvvEtcaKROz7Zn6qnPa14kRfPH6PcQ==} engines: {node: '>=18.0.0'} @@ -9894,14 +9464,6 @@ packages: resolution: {integrity: sha512-tHy0K0VtqNd5Y7Y41h0a0Lhh0L1GzC08dTWg0F7vRJWFtTENg7IZikf3wQkanYIRdb7ngoIPMTmqgUi401fEeQ==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.12.8': - resolution: {integrity: sha512-aJaAX7vHe5i66smoSSID7t4rKY08PbD8EBU7DOloixvhOozfYWdcSYE4l6/tjkZ0vBZhGjheWzB2mh31sLgCMA==} - engines: {node: '>=18.0.0'} - - '@smithy/types@4.13.1': - resolution: {integrity: sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==} - engines: {node: '>=18.0.0'} - '@smithy/types@4.16.1': resolution: {integrity: sha512-0JFs3V2y2M9tKW5na/qxe69Zv+uxLMO7QBbhxF/FHu/Gp2NFZAAL9tWl9PU02xxo07pb3G9FTyjNc6D5uZrJIg==} engines: {node: '>=18.0.0'} @@ -9910,78 +9472,14 @@ packages: resolution: {integrity: sha512-r7jh49VJxGerfAcTQA6gXcKc+98zOp/tqRwzYjgOE+iSQsP6cEU1hq2QzbuipmP68QtYdY9wKEhiCQZIzHgZ4Q==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.2.12': - resolution: {integrity: sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==} - engines: {node: '>=18.0.0'} - - '@smithy/util-base64@4.3.2': - resolution: {integrity: sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-body-length-browser@4.2.2': - resolution: {integrity: sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-body-length-node@4.2.3': - resolution: {integrity: sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==} - engines: {node: '>=18.0.0'} - '@smithy/util-buffer-from@2.2.0': resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} - '@smithy/util-buffer-from@4.2.2': - resolution: {integrity: sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==} - engines: {node: '>=18.0.0'} - - '@smithy/util-config-provider@4.2.2': - resolution: {integrity: sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-defaults-mode-browser@4.3.44': - resolution: {integrity: sha512-eZg6XzaCbVr2S5cAErU5eGBDaOVTuTo1I65i4tQcHENRcZ8rMWhQy1DaIYUSLyZjsfXvmCqZrstSMYyGFocvHA==} - engines: {node: '>=18.0.0'} - - '@smithy/util-defaults-mode-node@4.2.48': - resolution: {integrity: sha512-FqOKTlqSaoV3nzO55pMs5NBnZX8EhoI0DGmn9kbYeXWppgHD6dchyuj2HLqp4INJDJbSrj6OFYJkAh/WhSzZPg==} - engines: {node: '>=18.0.0'} - - '@smithy/util-endpoints@3.3.3': - resolution: {integrity: sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==} - engines: {node: '>=18.0.0'} - - '@smithy/util-hex-encoding@4.2.2': - resolution: {integrity: sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==} - engines: {node: '>=18.0.0'} - - '@smithy/util-middleware@4.2.12': - resolution: {integrity: sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-retry@4.2.13': - resolution: {integrity: sha512-qQQsIvL0MGIbUjeSrg0/VlQ3jGNKyM3/2iU3FPNgy01z+Sp4OvcaxbgIoFOTvB61ZoohtutuOvOcgmhbD0katQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-stream@4.5.21': - resolution: {integrity: sha512-KzSg+7KKywLnkoKejRtIBXDmwBfjGvg1U1i/etkC7XSWUyFCoLno1IohV2c74IzQqdhX5y3uE44r/8/wuK+A7Q==} - engines: {node: '>=18.0.0'} - - '@smithy/util-uri-escape@4.2.2': - resolution: {integrity: sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==} - engines: {node: '>=18.0.0'} - '@smithy/util-utf8@2.3.0': resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} - '@smithy/util-utf8@4.2.2': - resolution: {integrity: sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==} - engines: {node: '>=18.0.0'} - - '@smithy/uuid@1.1.2': - resolution: {integrity: sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==} - engines: {node: '>=18.0.0'} - '@speed-highlight/core@1.2.17': resolution: {integrity: sha512-Z92FwKpCtfaW1V0jTU/fh3QzYEZN8wDwrzRIBoADCJfn4mJCNcJN/XegifX7BDrQ8/h9Xh/JnbyMchL0FqXrkg==} @@ -10523,9 +10021,6 @@ packages: '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} - '@tootallnate/quickjs-emscripten@0.23.0': - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@trpc/client@11.6.0': resolution: {integrity: sha512-DyWbYk2hd50BaVrXWVkaUnaSwgAF5g/lfBkXtkF1Aqlk6BtSzGUo3owPkgqQO2I5LwWy1+ra9TsSfBBvIZpTwg==} peerDependencies: @@ -10780,9 +10275,6 @@ packages: '@types/mdx@2.0.13': resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} - '@types/mime-types@2.1.4': - resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} - '@types/mime@4.0.0': resolution: {integrity: sha512-5eEkJZ/BLvTE3vXGKkWlyTSUVZuzj23Wj8PoyOq2lt5I3CYbiLBOPb3XmCW6QcuOibIUE6emHXHt9E/F/rCa6w==} deprecated: This is a stub types definition. mime provides its own type definitions, so you do not need this installed. @@ -10900,9 +10392,6 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@uiw/codemirror-extensions-basic-setup@4.25.1': resolution: {integrity: sha512-zxgA2QkvP3ZDKxTBc9UltNFTrSeFezGXcZtZj6qcsBxiMzowoEMP5mVwXcKjpzldpZVRuY+JCC+RsekEgid4vg==} peerDependencies: @@ -11716,10 +11205,6 @@ packages: resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==} engines: {node: '>=20.19.0'} - ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - ast-types@0.16.1: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} @@ -11876,11 +11361,6 @@ packages: resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} hasBin: true - basic-ftp@5.2.0: - resolution: {integrity: sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==} - engines: {node: '>=10.0.0'} - deprecated: Security vulnerability fixed in 5.2.1, please upgrade - bcp-47-match@2.0.3: resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} @@ -12076,9 +11556,6 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -12622,10 +12099,6 @@ packages: crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} - croner@10.0.1: - resolution: {integrity: sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==} - engines: {node: '>=18.0'} - cronstrue@3.24.0: resolution: {integrity: sha512-t/Ji3Ur2c/pzhIAWNwC0ftl3JAE4dLfCjAdZoTZXmPDZwcispnS1PaMcMS4OmIIXyIVouAz+yw+mfQiE3hz5OQ==} hasBin: true @@ -12832,10 +12305,6 @@ packages: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} - data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} - date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} @@ -12975,10 +12444,6 @@ packages: defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} - degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} - delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} @@ -13609,11 +13074,6 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -13659,10 +13119,6 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -13863,11 +13319,6 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - fast-copy@3.0.2: resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} @@ -13952,9 +13403,6 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fdb-tuple@1.0.0: resolution: {integrity: sha512-8jSvKPCYCgTpi9Pt87qlfTk6griyMx4Gk3Xv31Dp72Qp8b6XgIyFsMm8KzPmFJ9iJ8K4pGvRxvOS8D0XGnrkjw==} @@ -14218,10 +13666,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -14240,10 +13684,6 @@ packages: get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} - get-uri@6.0.5: - resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} - engines: {node: '>= 14'} - getenv@1.0.0: resolution: {integrity: sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==} engines: {node: '>=6'} @@ -14504,10 +13944,6 @@ packages: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} - hosted-git-info@9.0.2: - resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} - engines: {node: ^20.17.0 || >=22.9.0} - html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} @@ -15092,9 +14528,6 @@ packages: resolution: {integrity: sha512-zPPuIt+ku1iCpFBRwseMcPYQ1cJL8l60rSmKeOuGfOXyE6YnTBmf2aEFNL2HQGrD0cPcLO/t+v9RTgC+fwEh/g==} engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} - koffi@2.15.4: - resolution: {integrity: sha512-6l7xxt8heHWQ63WyGd8ofne4TrzhqeKHhvSlI3GnxMIHp3PlDrOPyZbW5YNINXNma1qrKkpM/PGLY8U0V8Hxbw==} - kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} @@ -15416,9 +14849,6 @@ packages: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} - long-timeout@0.1.1: - resolution: {integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==} - long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} @@ -15456,10 +14886,6 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - lucide-react@0.344.0: resolution: {integrity: sha512-6YyBnn91GB45VuVT96bYCOKElbJzUHqp65vX8cDcu55MQL9T969v4dhGClpljamuI/+KMO9P6w9Acq1CVQGvIQ==} peerDependencies: @@ -15524,11 +14950,6 @@ packages: engines: {node: '>= 18'} hasBin: true - marked@15.0.12: - resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} - engines: {node: '>= 18'} - hasBin: true - marked@16.4.2: resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} engines: {node: '>= 20'} @@ -16129,10 +15550,6 @@ packages: nested-error-stacks@2.0.1: resolution: {integrity: sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==} - netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - next@16.1.1: resolution: {integrity: sha512-QI+T7xrxt1pF6SQ/JYFz95ro/mg/1Znk5vBebsWwbpejj1T0A23hO7GYEaVac9QUOT2BIMiuzm0L99ooq7k0/w==} engines: {node: '>=20.9.0'} @@ -16519,14 +15936,6 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - pac-proxy-agent@7.2.0: - resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} - engines: {node: '>= 14'} - - pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} - package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -17006,16 +16415,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - proper-lockfile@4.1.2: - resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} - property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - protobufjs@7.5.4: - resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} - engines: {node: '>=12.0.0'} - protobufjs@7.6.6: resolution: {integrity: sha512-dYDWdjSl5RNb7SgPxGQcRU+GtvP7s2fpkrY0r432PcOIaZ0/rBcxEZnQN67iJhFuQiVw754JDoPruPCNdGsbjg==} engines: {node: '>=12.0.0'} @@ -17028,10 +16430,6 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - proxy-agent@6.5.0: - resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} - engines: {node: '>= 14'} - proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -17536,10 +16934,6 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -17651,9 +17045,6 @@ packages: scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} - secure-exec@0.2.1: - resolution: {integrity: sha512-oaQDzTPDSCOckYC8G0PimIqzEVxY6sYEvcx0fMGsRR/Wl4wkFVHaZgQ3kc2DHWysV6WHWt5g1AXc/6seafO2XQ==} - secure-exec@https://pkg.pr.new/rivet-dev/secure-exec@7659aba: resolution: {tarball: https://pkg.pr.new/rivet-dev/secure-exec@7659aba} version: 0.1.0 @@ -17864,10 +17255,6 @@ packages: resolution: {integrity: sha512-HVk9X1E0gz3mSpoi60h/saazLKXKaZThMLU3u/aNwoYn8/xQyX2MGxL0ui2eaokkD7tF+Zo+cKTHUbe1mmmGzA==} engines: {node: '>=8.0.0'} - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - smol-toml@1.6.0: resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} engines: {node: '>= 18'} @@ -17875,14 +17262,6 @@ packages: snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - socks-proxy-agent@8.0.5: - resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} - engines: {node: '>= 14'} - - socks@2.8.7: - resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - sonic-boom@4.2.0: resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} @@ -18685,10 +18064,6 @@ packages: resolution: {integrity: sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==} engines: {node: '>=18.17'} - undici@7.24.7: - resolution: {integrity: sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ==} - engines: {node: '>=20.18.1'} - undici@7.24.8: resolution: {integrity: sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==} engines: {node: '>=20.18.1'} @@ -19471,10 +18846,6 @@ packages: resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} engines: {node: '>= 14'} - web-streams-polyfill@4.2.0: - resolution: {integrity: sha512-0rYDzGOh9EZpig92umN5g5D/9A1Kff7k0/mzPSSCY8jEQeYkgRMoY7LhbXtUCWzLCMX0TUE9aoHkjFNB7D9pfA==} - engines: {node: '>= 8'} - web-vitals@4.2.4: resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==} @@ -19773,11 +19144,6 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.8.2: - resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} - engines: {node: '>= 14.6'} - hasBin: true - yaml@2.9.0: resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} @@ -19799,9 +19165,6 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - yauzl@3.4.0: resolution: {integrity: sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==} engines: {node: '>=12'} @@ -19890,14 +19253,6 @@ snapshots: '@adobe/css-tools@4.3.3': optional: true - '@agentclientprotocol/sdk@0.16.1(zod@3.25.76)': - dependencies: - zod: 3.25.76 - - '@agentclientprotocol/sdk@0.16.1(zod@4.1.13)': - dependencies: - zod: 4.1.13 - '@ai-sdk/anthropic@1.2.12(zod@4.1.13)': dependencies: '@ai-sdk/provider': 1.1.3 @@ -20061,18 +19416,6 @@ snapshots: package-manager-detector: 1.6.0 tinyexec: 1.0.2 - '@anthropic-ai/sdk@0.73.0(zod@3.25.76)': - dependencies: - json-schema-to-ts: 3.1.1 - optionalDependencies: - zod: 3.25.76 - - '@anthropic-ai/sdk@0.73.0(zod@4.1.13)': - dependencies: - json-schema-to-ts: 3.1.1 - optionalDependencies: - zod: 4.1.13 - '@anthropic-ai/sdk@0.91.1(zod@3.25.76)': dependencies: json-schema-to-ts: 3.1.1 @@ -20105,12 +19448,6 @@ snapshots: openapi3-ts: 4.5.0 zod: 4.1.13 - '@aws-crypto/crc32@5.2.0': - dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.974.6 - tslib: 2.8.1 - '@aws-crypto/sha256-browser@5.2.0': dependencies: '@aws-crypto/sha256-js': 5.2.0 @@ -20137,58 +19474,6 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-bedrock-runtime@3.1024.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.26 - '@aws-sdk/credential-provider-node': 3.972.29 - '@aws-sdk/eventstream-handler-node': 3.972.12 - '@aws-sdk/middleware-eventstream': 3.972.8 - '@aws-sdk/middleware-host-header': 3.972.8 - '@aws-sdk/middleware-logger': 3.972.8 - '@aws-sdk/middleware-recursion-detection': 3.972.9 - '@aws-sdk/middleware-user-agent': 3.972.28 - '@aws-sdk/middleware-websocket': 3.972.14 - '@aws-sdk/region-config-resolver': 3.972.10 - '@aws-sdk/token-providers': 3.1024.0 - '@aws-sdk/types': 3.973.6 - '@aws-sdk/util-endpoints': 3.996.5 - '@aws-sdk/util-user-agent-browser': 3.972.8 - '@aws-sdk/util-user-agent-node': 3.973.14 - '@smithy/config-resolver': 4.4.13 - '@smithy/core': 3.23.13 - '@smithy/eventstream-serde-browser': 4.2.12 - '@smithy/eventstream-serde-config-resolver': 4.3.12 - '@smithy/eventstream-serde-node': 4.2.12 - '@smithy/fetch-http-handler': 5.3.15 - '@smithy/hash-node': 4.2.12 - '@smithy/invalid-dependency': 4.2.12 - '@smithy/middleware-content-length': 4.2.12 - '@smithy/middleware-endpoint': 4.4.28 - '@smithy/middleware-retry': 4.4.46 - '@smithy/middleware-serde': 4.2.16 - '@smithy/middleware-stack': 4.2.12 - '@smithy/node-config-provider': 4.3.12 - '@smithy/node-http-handler': 4.5.1 - '@smithy/protocol-http': 5.3.12 - '@smithy/smithy-client': 4.12.8 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.12 - '@smithy/util-base64': 4.3.2 - '@smithy/util-body-length-browser': 4.2.2 - '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.44 - '@smithy/util-defaults-mode-node': 4.2.48 - '@smithy/util-endpoints': 3.3.3 - '@smithy/util-middleware': 4.2.12 - '@smithy/util-retry': 4.2.13 - '@smithy/util-stream': 4.5.21 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/client-bedrock-runtime@3.1048.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -20206,22 +19491,6 @@ snapshots: '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/core@3.973.26': - dependencies: - '@aws-sdk/types': 3.974.6 - '@aws-sdk/xml-builder': 3.972.41 - '@smithy/core': 3.35.0 - '@smithy/node-config-provider': 4.3.12 - '@smithy/property-provider': 4.2.12 - '@smithy/protocol-http': 5.3.12 - '@smithy/signature-v4': 5.7.4 - '@smithy/smithy-client': 4.12.8 - '@smithy/types': 4.19.0 - '@smithy/util-base64': 4.3.2 - '@smithy/util-middleware': 4.2.12 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - '@aws-sdk/core@3.977.4': dependencies: '@aws-sdk/types': 3.974.2 @@ -20287,21 +19556,6 @@ snapshots: '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-node@3.972.29': - dependencies: - '@aws-sdk/credential-provider-env': 3.972.72 - '@aws-sdk/credential-provider-http': 3.972.74 - '@aws-sdk/credential-provider-ini': 3.973.17 - '@aws-sdk/credential-provider-process': 3.972.72 - '@aws-sdk/credential-provider-sso': 3.973.16 - '@aws-sdk/credential-provider-web-identity': 3.972.78 - '@aws-sdk/types': 3.974.6 - '@smithy/credential-provider-imds': 4.5.2 - '@smithy/property-provider': 4.2.12 - '@smithy/shared-ini-file-loader': 4.4.7 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - '@aws-sdk/credential-provider-node@3.972.84': dependencies: '@aws-sdk/credential-provider-env': 3.972.72 @@ -20352,13 +19606,6 @@ snapshots: '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/eventstream-handler-node@3.972.12': - dependencies: - '@aws-sdk/types': 3.974.6 - '@smithy/eventstream-codec': 4.2.12 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - '@aws-sdk/eventstream-handler-node@3.972.35': dependencies: '@aws-sdk/types': 3.974.6 @@ -20373,60 +19620,6 @@ snapshots: '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/middleware-eventstream@3.972.8': - dependencies: - '@aws-sdk/types': 3.974.6 - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-host-header@3.972.8': - dependencies: - '@aws-sdk/types': 3.974.6 - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-logger@3.972.8': - dependencies: - '@aws-sdk/types': 3.974.6 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-recursion-detection@3.972.9': - dependencies: - '@aws-sdk/types': 3.974.6 - '@aws/lambda-invoke-store': 0.2.3 - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-user-agent@3.972.28': - dependencies: - '@aws-sdk/core': 3.978.1 - '@aws-sdk/types': 3.974.6 - '@aws-sdk/util-endpoints': 3.996.5 - '@smithy/core': 3.35.0 - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.19.0 - '@smithy/util-retry': 4.2.13 - tslib: 2.8.1 - - '@aws-sdk/middleware-websocket@3.972.14': - dependencies: - '@aws-sdk/types': 3.974.6 - '@aws-sdk/util-format-url': 3.972.8 - '@smithy/eventstream-codec': 4.2.12 - '@smithy/eventstream-serde-browser': 4.2.12 - '@smithy/fetch-http-handler': 5.8.0 - '@smithy/protocol-http': 5.3.12 - '@smithy/signature-v4': 5.7.4 - '@smithy/types': 4.19.0 - '@smithy/util-base64': 4.3.2 - '@smithy/util-hex-encoding': 4.2.2 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - '@aws-sdk/middleware-websocket@3.972.54': dependencies: '@aws-sdk/core': 3.978.1 @@ -20459,14 +19652,6 @@ snapshots: '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/region-config-resolver@3.972.10': - dependencies: - '@aws-sdk/types': 3.974.6 - '@smithy/config-resolver': 4.4.13 - '@smithy/node-config-provider': 4.3.12 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.996.43': dependencies: '@aws-sdk/types': 3.974.6 @@ -20481,16 +19666,6 @@ snapshots: '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.1024.0': - dependencies: - '@aws-sdk/core': 3.978.1 - '@aws-sdk/nested-clients': 3.997.46 - '@aws-sdk/types': 3.974.6 - '@smithy/property-provider': 4.2.12 - '@smithy/shared-ini-file-loader': 4.4.7 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - '@aws-sdk/token-providers@3.1048.0': dependencies: '@aws-sdk/core': 3.978.1 @@ -20509,11 +19684,6 @@ snapshots: '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/types@3.973.6': - dependencies: - '@smithy/types': 4.19.0 - tslib: 2.8.1 - '@aws-sdk/types@3.974.2': dependencies: '@smithy/types': 4.16.1 @@ -20524,41 +19694,10 @@ snapshots: '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.996.5': - dependencies: - '@aws-sdk/types': 3.974.6 - '@smithy/types': 4.19.0 - '@smithy/url-parser': 4.2.12 - '@smithy/util-endpoints': 3.3.3 - tslib: 2.8.1 - - '@aws-sdk/util-format-url@3.972.8': - dependencies: - '@aws-sdk/types': 3.974.6 - '@smithy/querystring-builder': 4.2.12 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.965.5': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.972.8': - dependencies: - '@aws-sdk/types': 3.974.6 - '@smithy/types': 4.19.0 - bowser: 2.14.1 - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-node@3.973.14': - dependencies: - '@aws-sdk/middleware-user-agent': 3.972.28 - '@aws-sdk/types': 3.974.6 - '@smithy/node-config-provider': 4.3.12 - '@smithy/types': 4.19.0 - '@smithy/util-config-provider': 4.2.2 - tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.37': dependencies: '@smithy/types': 4.19.0 @@ -20569,8 +19708,6 @@ snapshots: '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws/lambda-invoke-store@0.2.3': {} - '@aws/lambda-invoke-store@0.3.0': {} '@babel/code-frame@7.10.4': @@ -22679,32 +21816,6 @@ snapshots: prop-types: 15.8.1 react: 19.1.0 - '@google/genai@1.48.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))': - dependencies: - google-auth-library: 10.6.2 - p-retry: 4.6.2 - protobufjs: 7.5.4 - ws: 8.21.0 - optionalDependencies: - '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@google/genai@1.48.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.1.13))': - dependencies: - google-auth-library: 10.6.2 - p-retry: 4.6.2 - protobufjs: 7.5.4 - ws: 8.21.0 - optionalDependencies: - '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(zod@4.1.13) - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - '@google/genai@1.52.0(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))': dependencies: google-auth-library: 10.6.2 @@ -23511,201 +22622,6 @@ snapshots: '@marijn/find-cluster-break@1.0.2': {} - '@mariozechner/clipboard-darwin-arm64@0.3.2': - optional: true - - '@mariozechner/clipboard-darwin-universal@0.3.2': - optional: true - - '@mariozechner/clipboard-darwin-x64@0.3.2': - optional: true - - '@mariozechner/clipboard-linux-arm64-gnu@0.3.2': - optional: true - - '@mariozechner/clipboard-linux-arm64-musl@0.3.2': - optional: true - - '@mariozechner/clipboard-linux-riscv64-gnu@0.3.2': - optional: true - - '@mariozechner/clipboard-linux-x64-gnu@0.3.2': - optional: true - - '@mariozechner/clipboard-linux-x64-musl@0.3.2': - optional: true - - '@mariozechner/clipboard-win32-arm64-msvc@0.3.2': - optional: true - - '@mariozechner/clipboard-win32-x64-msvc@0.3.2': - optional: true - - '@mariozechner/clipboard@0.3.2': - optionalDependencies: - '@mariozechner/clipboard-darwin-arm64': 0.3.2 - '@mariozechner/clipboard-darwin-universal': 0.3.2 - '@mariozechner/clipboard-darwin-x64': 0.3.2 - '@mariozechner/clipboard-linux-arm64-gnu': 0.3.2 - '@mariozechner/clipboard-linux-arm64-musl': 0.3.2 - '@mariozechner/clipboard-linux-riscv64-gnu': 0.3.2 - '@mariozechner/clipboard-linux-x64-gnu': 0.3.2 - '@mariozechner/clipboard-linux-x64-musl': 0.3.2 - '@mariozechner/clipboard-win32-arm64-msvc': 0.3.2 - '@mariozechner/clipboard-win32-x64-msvc': 0.3.2 - optional: true - - '@mariozechner/jiti@2.6.5': - dependencies: - std-env: 3.10.0 - yoctocolors: 2.1.2 - - '@mariozechner/pi-agent-core@0.60.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(ws@8.22.0)(zod@3.25.76)': - dependencies: - '@mariozechner/pi-ai': 0.60.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(ws@8.22.0)(zod@3.25.76) - transitivePeerDependencies: - - '@modelcontextprotocol/sdk' - - aws-crt - - bufferutil - - supports-color - - utf-8-validate - - ws - - zod - - '@mariozechner/pi-agent-core@0.60.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.1.13))(ws@8.19.0)(zod@4.1.13)': - dependencies: - '@mariozechner/pi-ai': 0.60.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.1.13))(ws@8.19.0)(zod@4.1.13) - transitivePeerDependencies: - - '@modelcontextprotocol/sdk' - - aws-crt - - bufferutil - - supports-color - - utf-8-validate - - ws - - zod - - '@mariozechner/pi-ai@0.60.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(ws@8.22.0)(zod@3.25.76)': - dependencies: - '@anthropic-ai/sdk': 0.73.0(zod@3.25.76) - '@aws-sdk/client-bedrock-runtime': 3.1024.0 - '@google/genai': 1.48.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76)) - '@mistralai/mistralai': 1.14.1 - '@sinclair/typebox': 0.34.41 - ajv: 8.17.1 - ajv-formats: 3.0.1(ajv@8.17.1) - chalk: 5.6.2 - openai: 6.26.0(ws@8.22.0)(zod@3.25.76) - partial-json: 0.1.7 - proxy-agent: 6.5.0 - undici: 7.24.7 - zod-to-json-schema: 3.25.1(zod@3.25.76) - transitivePeerDependencies: - - '@modelcontextprotocol/sdk' - - aws-crt - - bufferutil - - supports-color - - utf-8-validate - - ws - - zod - - '@mariozechner/pi-ai@0.60.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.1.13))(ws@8.19.0)(zod@4.1.13)': - dependencies: - '@anthropic-ai/sdk': 0.73.0(zod@4.1.13) - '@aws-sdk/client-bedrock-runtime': 3.1024.0 - '@google/genai': 1.48.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.1.13)) - '@mistralai/mistralai': 1.14.1 - '@sinclair/typebox': 0.34.41 - ajv: 8.17.1 - ajv-formats: 3.0.1(ajv@8.17.1) - chalk: 5.6.2 - openai: 6.26.0(ws@8.19.0)(zod@4.1.13) - partial-json: 0.1.7 - proxy-agent: 6.5.0 - undici: 7.24.7 - zod-to-json-schema: 3.25.1(zod@4.1.13) - transitivePeerDependencies: - - '@modelcontextprotocol/sdk' - - aws-crt - - bufferutil - - supports-color - - utf-8-validate - - ws - - zod - - '@mariozechner/pi-coding-agent@0.60.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(ws@8.22.0)(zod@3.25.76)': - dependencies: - '@mariozechner/jiti': 2.6.5 - '@mariozechner/pi-agent-core': 0.60.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(ws@8.22.0)(zod@3.25.76) - '@mariozechner/pi-ai': 0.60.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(ws@8.22.0)(zod@3.25.76) - '@mariozechner/pi-tui': 0.60.0 - '@silvia-odwyer/photon-node': 0.3.4 - chalk: 5.6.2 - cli-highlight: 2.1.11 - diff: 8.0.3 - extract-zip: 2.0.1 - file-type: 21.3.4 - glob: 13.0.6 - hosted-git-info: 9.0.2 - ignore: 7.0.5 - marked: 15.0.12 - minimatch: 10.2.5 - proper-lockfile: 4.1.2 - strip-ansi: 7.1.2 - undici: 7.24.7 - yaml: 2.8.2 - optionalDependencies: - '@mariozechner/clipboard': 0.3.2 - transitivePeerDependencies: - - '@modelcontextprotocol/sdk' - - aws-crt - - bufferutil - - supports-color - - utf-8-validate - - ws - - zod - - '@mariozechner/pi-coding-agent@0.60.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.1.13))(ws@8.19.0)(zod@4.1.13)': - dependencies: - '@mariozechner/jiti': 2.6.5 - '@mariozechner/pi-agent-core': 0.60.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.1.13))(ws@8.19.0)(zod@4.1.13) - '@mariozechner/pi-ai': 0.60.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.1.13))(ws@8.19.0)(zod@4.1.13) - '@mariozechner/pi-tui': 0.60.0 - '@silvia-odwyer/photon-node': 0.3.4 - chalk: 5.6.2 - cli-highlight: 2.1.11 - diff: 8.0.3 - extract-zip: 2.0.1 - file-type: 21.3.4 - glob: 13.0.6 - hosted-git-info: 9.0.2 - ignore: 7.0.5 - marked: 15.0.12 - minimatch: 10.2.5 - proper-lockfile: 4.1.2 - strip-ansi: 7.1.2 - undici: 7.24.7 - yaml: 2.8.2 - optionalDependencies: - '@mariozechner/clipboard': 0.3.2 - transitivePeerDependencies: - - '@modelcontextprotocol/sdk' - - aws-crt - - bufferutil - - supports-color - - utf-8-validate - - ws - - zod - - '@mariozechner/pi-tui@0.60.0': - dependencies: - '@types/mime-types': 2.1.4 - chalk: 5.6.2 - get-east-asian-width: 1.6.0 - marked: 15.0.12 - mime-types: 3.0.2 - optionalDependencies: - koffi: 2.15.4 - '@marsidev/react-turnstile@1.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: react: 19.1.0 @@ -23911,15 +22827,6 @@ snapshots: '@microsoft/tsdoc@0.15.1': optional: true - '@mistralai/mistralai@1.14.1': - dependencies: - ws: 8.21.0 - zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@mistralai/mistralai@2.2.6(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/semantic-conventions': 1.40.0 @@ -24074,31 +22981,6 @@ snapshots: - supports-color optional: true - '@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.1.13)': - dependencies: - '@hono/node-server': 1.19.13(hono@4.12.33) - ajv: 8.17.1 - ajv-formats: 3.0.1(ajv@8.17.1) - content-type: 1.0.5 - cors: 2.8.5 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.0.6 - express: 5.2.1 - express-rate-limit: 8.6.1(express@5.2.1) - hono: 4.12.33 - jose: 6.1.3 - json-schema-typed: 8.0.2 - pkce-challenge: 5.0.1 - raw-body: 3.0.2 - zod: 4.1.13 - zod-to-json-schema: 3.25.1(zod@4.1.13) - optionalDependencies: - '@cfworker/json-schema': 4.1.1 - transitivePeerDependencies: - - supports-color - optional: true - '@monaco-editor/loader@1.7.0': dependencies: state-local: 1.0.7 @@ -24721,19 +23603,10 @@ snapshots: '@protobufjs/base64@1.1.2': {} - '@protobufjs/codegen@2.0.4': {} - '@protobufjs/codegen@2.0.5': {} - '@protobufjs/eventemitter@1.1.0': {} - '@protobufjs/eventemitter@1.1.1': {} - '@protobufjs/fetch@1.1.0': - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/fetch@1.1.1': dependencies: '@protobufjs/aspromise': 1.1.2 @@ -24746,8 +23619,6 @@ snapshots: '@protobufjs/pool@1.1.0': {} - '@protobufjs/utf8@1.1.0': {} - '@protobufjs/utf8@1.1.2': {} '@publint/pack@0.1.4': {} @@ -25727,88 +24598,6 @@ snapshots: dependencies: '@redis/client': 6.3.0(@opentelemetry/api@1.9.1) - '@rivet-dev/agent-os-common@0.0.260331072558': - dependencies: - '@rivet-dev/agent-os-coreutils': 0.0.260331072558 - '@rivet-dev/agent-os-diffutils': 0.0.260331072558 - '@rivet-dev/agent-os-findutils': 0.0.260331072558 - '@rivet-dev/agent-os-gawk': 0.0.260331072558 - '@rivet-dev/agent-os-grep': 0.0.260331072558 - '@rivet-dev/agent-os-gzip': 0.0.260331072558 - '@rivet-dev/agent-os-sed': 0.0.260331072558 - '@rivet-dev/agent-os-tar': 0.0.260331072558 - - '@rivet-dev/agent-os-core@0.1.1(pyodide@0.28.3)': - dependencies: - '@rivet-dev/agent-os-posix': 0.1.0 - '@rivet-dev/agent-os-python': 0.1.0(pyodide@0.28.3) - '@secure-exec/core': 0.2.1 - '@secure-exec/nodejs': 0.2.1 - '@secure-exec/v8': 0.2.1 - croner: 10.0.1 - long-timeout: 0.1.1 - secure-exec: 0.2.1 - transitivePeerDependencies: - - pyodide - - '@rivet-dev/agent-os-coreutils@0.0.260331072558': {} - - '@rivet-dev/agent-os-diffutils@0.0.260331072558': {} - - '@rivet-dev/agent-os-findutils@0.0.260331072558': {} - - '@rivet-dev/agent-os-gawk@0.0.260331072558': {} - - '@rivet-dev/agent-os-grep@0.0.260331072558': {} - - '@rivet-dev/agent-os-gzip@0.0.260331072558': {} - - '@rivet-dev/agent-os-pi@0.1.1(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(ws@8.22.0)(zod@3.25.76)': - dependencies: - '@agentclientprotocol/sdk': 0.16.1(zod@3.25.76) - '@mariozechner/pi-ai': 0.60.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(ws@8.22.0)(zod@3.25.76) - '@mariozechner/pi-coding-agent': 0.60.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(ws@8.22.0)(zod@3.25.76) - '@rivet-dev/agent-os-core': 0.1.1(pyodide@0.28.3) - transitivePeerDependencies: - - '@modelcontextprotocol/sdk' - - aws-crt - - bufferutil - - pyodide - - supports-color - - utf-8-validate - - ws - - zod - - '@rivet-dev/agent-os-pi@0.1.1(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.1.13))(pyodide@0.28.3)(ws@8.19.0)(zod@4.1.13)': - dependencies: - '@agentclientprotocol/sdk': 0.16.1(zod@4.1.13) - '@mariozechner/pi-ai': 0.60.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.1.13))(ws@8.19.0)(zod@4.1.13) - '@mariozechner/pi-coding-agent': 0.60.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.1.13))(ws@8.19.0)(zod@4.1.13) - '@rivet-dev/agent-os-core': 0.1.1(pyodide@0.28.3) - transitivePeerDependencies: - - '@modelcontextprotocol/sdk' - - aws-crt - - bufferutil - - pyodide - - supports-color - - utf-8-validate - - ws - - zod - - '@rivet-dev/agent-os-posix@0.1.0': - dependencies: - '@secure-exec/core': 0.2.1 - - '@rivet-dev/agent-os-python@0.1.0(pyodide@0.28.3)': - dependencies: - '@secure-exec/core': 0.2.1 - optionalDependencies: - pyodide: 0.28.3 - - '@rivet-dev/agent-os-sed@0.0.260331072558': {} - - '@rivet-dev/agent-os-tar@0.0.260331072558': {} - '@rivet-dev/labs-flue-cli@1.0.0-beta.9-rivet.1(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(@types/node@25.6.0)(esbuild@0.28.2)(hono@4.12.33)(jiti@2.7.0)(less@4.4.1)(sass@1.93.2)(stylus@0.62.0)(terser@5.46.0)(tsx@4.23.1)(typebox@1.3.27)(typescript@6.0.3)(wrangler@4.100.0)(ws@8.22.0)(yaml@2.9.0)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76)': dependencies: '@cloudflare/vite-plugin': 1.50.0(vite@8.2.0(@types/node@25.6.0)(esbuild@0.28.2)(jiti@2.7.0)(less@4.4.1)(sass@1.93.2)(stylus@0.62.0)(terser@5.46.0)(tsx@4.23.1)(yaml@2.9.0))(wrangler@4.100.0) @@ -26345,42 +25134,6 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} - '@secure-exec/core@0.2.1': - dependencies: - better-sqlite3: 12.8.0 - - '@secure-exec/nodejs@0.2.1': - dependencies: - '@secure-exec/core': 0.2.1 - '@secure-exec/v8': 0.2.1 - cbor-x: 1.6.4 - cjs-module-lexer: 2.2.0 - es-module-lexer: 1.7.0 - esbuild: 0.27.3 - node-stdlib-browser: 1.3.1 - web-streams-polyfill: 4.2.0 - - '@secure-exec/v8-darwin-arm64@0.2.1': - optional: true - - '@secure-exec/v8-darwin-x64@0.2.1': - optional: true - - '@secure-exec/v8-linux-arm64-gnu@0.2.1': - optional: true - - '@secure-exec/v8-linux-x64-gnu@0.2.1': - optional: true - - '@secure-exec/v8@0.2.1': - dependencies: - cbor-x: 1.6.4 - optionalDependencies: - '@secure-exec/v8-darwin-arm64': 0.2.1 - '@secure-exec/v8-darwin-x64': 0.2.1 - '@secure-exec/v8-linux-arm64-gnu': 0.2.1 - '@secure-exec/v8-linux-x64-gnu': 0.2.1 - '@sentry-internal/browser-utils@8.55.0': dependencies: '@sentry/core': 8.55.0 @@ -26563,8 +25316,6 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} - '@silvia-odwyer/photon-node@0.3.4': {} - '@sinclair/typebox@0.27.8': {} '@sinclair/typebox@0.34.41': {} @@ -26589,28 +25340,6 @@ snapshots: dependencies: size-limit: 11.2.0 - '@smithy/config-resolver@4.4.13': - dependencies: - '@smithy/node-config-provider': 4.3.12 - '@smithy/types': 4.19.0 - '@smithy/util-config-provider': 4.2.2 - '@smithy/util-endpoints': 3.3.3 - '@smithy/util-middleware': 4.2.12 - tslib: 2.8.1 - - '@smithy/core@3.23.13': - dependencies: - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.19.0 - '@smithy/url-parser': 4.2.12 - '@smithy/util-base64': 4.3.2 - '@smithy/util-body-length-browser': 4.2.2 - '@smithy/util-middleware': 4.2.12 - '@smithy/util-stream': 4.5.21 - '@smithy/util-utf8': 4.2.2 - '@smithy/uuid': 1.1.2 - tslib: 2.8.1 - '@smithy/core@3.31.1': dependencies: '@smithy/types': 4.16.1 @@ -26627,44 +25356,6 @@ snapshots: '@smithy/types': 4.19.0 tslib: 2.8.1 - '@smithy/eventstream-codec@4.2.12': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.19.0 - '@smithy/util-hex-encoding': 4.2.2 - tslib: 2.8.1 - - '@smithy/eventstream-serde-browser@4.2.12': - dependencies: - '@smithy/eventstream-serde-universal': 4.2.12 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@smithy/eventstream-serde-config-resolver@4.3.12': - dependencies: - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@smithy/eventstream-serde-node@4.2.12': - dependencies: - '@smithy/eventstream-serde-universal': 4.2.12 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@smithy/eventstream-serde-universal@4.2.12': - dependencies: - '@smithy/eventstream-codec': 4.2.12 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@smithy/fetch-http-handler@5.3.15': - dependencies: - '@smithy/protocol-http': 5.3.12 - '@smithy/querystring-builder': 4.2.12 - '@smithy/types': 4.19.0 - '@smithy/util-base64': 4.3.2 - tslib: 2.8.1 - '@smithy/fetch-http-handler@5.6.13': dependencies: '@smithy/core': 3.35.0 @@ -26677,123 +25368,22 @@ snapshots: '@smithy/types': 4.19.0 tslib: 2.8.1 - '@smithy/hash-node@4.2.12': - dependencies: - '@smithy/types': 4.19.0 - '@smithy/util-buffer-from': 4.2.2 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - - '@smithy/invalid-dependency@4.2.12': - dependencies: - '@smithy/types': 4.19.0 - tslib: 2.8.1 - '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/is-array-buffer@4.2.2': - dependencies: - tslib: 2.8.1 - - '@smithy/middleware-content-length@4.2.12': - dependencies: - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@smithy/middleware-endpoint@4.4.28': - dependencies: - '@smithy/core': 3.35.0 - '@smithy/middleware-serde': 4.2.16 - '@smithy/node-config-provider': 4.3.12 - '@smithy/shared-ini-file-loader': 4.4.7 - '@smithy/types': 4.19.0 - '@smithy/url-parser': 4.2.12 - '@smithy/util-middleware': 4.2.12 - tslib: 2.8.1 - - '@smithy/middleware-retry@4.4.46': - dependencies: - '@smithy/node-config-provider': 4.3.12 - '@smithy/protocol-http': 5.3.12 - '@smithy/service-error-classification': 4.2.12 - '@smithy/smithy-client': 4.12.8 - '@smithy/types': 4.19.0 - '@smithy/util-middleware': 4.2.12 - '@smithy/util-retry': 4.2.13 - '@smithy/uuid': 1.1.2 - tslib: 2.8.1 - - '@smithy/middleware-serde@4.2.16': - dependencies: - '@smithy/core': 3.35.0 - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@smithy/middleware-stack@4.2.12': - dependencies: - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@smithy/node-config-provider@4.3.12': - dependencies: - '@smithy/property-provider': 4.2.12 - '@smithy/shared-ini-file-loader': 4.4.7 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - '@smithy/node-http-handler@4.12.1': dependencies: '@smithy/core': 3.35.0 '@smithy/types': 4.19.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.5.1': - dependencies: - '@smithy/protocol-http': 5.3.12 - '@smithy/querystring-builder': 4.2.12 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - '@smithy/node-http-handler@4.7.3': dependencies: '@smithy/core': 3.35.0 '@smithy/types': 4.19.0 tslib: 2.8.1 - '@smithy/property-provider@4.2.12': - dependencies: - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@smithy/protocol-http@5.3.12': - dependencies: - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@smithy/querystring-builder@4.2.12': - dependencies: - '@smithy/types': 4.19.0 - '@smithy/util-uri-escape': 4.2.2 - tslib: 2.8.1 - - '@smithy/querystring-parser@4.2.12': - dependencies: - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@smithy/service-error-classification@4.2.12': - dependencies: - '@smithy/types': 4.19.0 - - '@smithy/shared-ini-file-loader@4.4.7': - dependencies: - '@smithy/types': 4.19.0 - tslib: 2.8.1 - '@smithy/signature-v4@5.6.12': dependencies: '@smithy/core': 3.35.0 @@ -26806,20 +25396,6 @@ snapshots: '@smithy/types': 4.19.0 tslib: 2.8.1 - '@smithy/smithy-client@4.12.8': - dependencies: - '@smithy/core': 3.35.0 - '@smithy/middleware-endpoint': 4.4.28 - '@smithy/middleware-stack': 4.2.12 - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.19.0 - '@smithy/util-stream': 4.5.21 - tslib: 2.8.1 - - '@smithy/types@4.13.1': - dependencies: - tslib: 2.8.1 - '@smithy/types@4.16.1': dependencies: tslib: 2.8.1 @@ -26828,107 +25404,16 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.2.12': - dependencies: - '@smithy/querystring-parser': 4.2.12 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@smithy/util-base64@4.3.2': - dependencies: - '@smithy/util-buffer-from': 4.2.2 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - - '@smithy/util-body-length-browser@4.2.2': - dependencies: - tslib: 2.8.1 - - '@smithy/util-body-length-node@4.2.3': - dependencies: - tslib: 2.8.1 - '@smithy/util-buffer-from@2.2.0': dependencies: '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 - '@smithy/util-buffer-from@4.2.2': - dependencies: - '@smithy/is-array-buffer': 4.2.2 - tslib: 2.8.1 - - '@smithy/util-config-provider@4.2.2': - dependencies: - tslib: 2.8.1 - - '@smithy/util-defaults-mode-browser@4.3.44': - dependencies: - '@smithy/property-provider': 4.2.12 - '@smithy/smithy-client': 4.12.8 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@smithy/util-defaults-mode-node@4.2.48': - dependencies: - '@smithy/config-resolver': 4.4.13 - '@smithy/credential-provider-imds': 4.5.2 - '@smithy/node-config-provider': 4.3.12 - '@smithy/property-provider': 4.2.12 - '@smithy/smithy-client': 4.12.8 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@smithy/util-endpoints@3.3.3': - dependencies: - '@smithy/node-config-provider': 4.3.12 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@smithy/util-hex-encoding@4.2.2': - dependencies: - tslib: 2.8.1 - - '@smithy/util-middleware@4.2.12': - dependencies: - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@smithy/util-retry@4.2.13': - dependencies: - '@smithy/service-error-classification': 4.2.12 - '@smithy/types': 4.19.0 - tslib: 2.8.1 - - '@smithy/util-stream@4.5.21': - dependencies: - '@smithy/fetch-http-handler': 5.8.0 - '@smithy/node-http-handler': 4.12.1 - '@smithy/types': 4.19.0 - '@smithy/util-base64': 4.3.2 - '@smithy/util-buffer-from': 4.2.2 - '@smithy/util-hex-encoding': 4.2.2 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - - '@smithy/util-uri-escape@4.2.2': - dependencies: - tslib: 2.8.1 - '@smithy/util-utf8@2.3.0': dependencies: '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 - '@smithy/util-utf8@4.2.2': - dependencies: - '@smithy/util-buffer-from': 4.2.2 - tslib: 2.8.1 - - '@smithy/uuid@1.1.2': - dependencies: - tslib: 2.8.1 - '@speed-highlight/core@1.2.17': {} '@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(quansync@0.2.11)(typebox@1.3.27)(valibot@1.4.2(typescript@6.0.3))(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76)': @@ -27397,8 +25882,6 @@ snapshots: '@tokenizer/token@0.3.0': {} - '@tootallnate/quickjs-emscripten@0.23.0': {} - '@trpc/client@11.6.0(@trpc/server@11.6.0(typescript@5.9.3))(typescript@5.9.3)': dependencies: '@trpc/server': 11.6.0(typescript@5.9.3) @@ -27679,8 +26162,6 @@ snapshots: '@types/mdx@2.0.13': {} - '@types/mime-types@2.1.4': {} - '@types/mime@4.0.0': dependencies: mime: 4.0.7 @@ -27809,11 +26290,6 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 22.19.15 - optional: true - '@uiw/codemirror-extensions-basic-setup@4.25.1(@codemirror/autocomplete@6.18.7)(@codemirror/commands@6.8.1)(@codemirror/language@6.11.3)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/view@6.38.2)': dependencies: '@codemirror/autocomplete': 6.18.7 @@ -29229,10 +27705,6 @@ snapshots: '@babel/parser': 7.29.0 pathe: 2.0.3 - ast-types@0.13.4: - dependencies: - tslib: 2.8.1 - ast-types@0.16.1: dependencies: tslib: 2.8.1 @@ -29436,8 +27908,6 @@ snapshots: baseline-browser-mapping@2.9.19: {} - basic-ftp@5.2.0: {} - bcp-47-match@2.0.3: {} bcryptjs@2.4.3: {} @@ -29532,6 +28002,7 @@ snapshots: dependencies: bindings: 1.5.0 prebuild-install: 7.1.3 + optional: true big-integer@1.6.52: {} @@ -29553,12 +28024,14 @@ snapshots: bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 + optional: true bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 + optional: true blake3-wasm@2.1.5: {} @@ -29697,8 +28170,6 @@ snapshots: dependencies: node-int64: 0.4.0 - buffer-crc32@0.2.13: {} - buffer-equal-constant-time@1.0.1: {} buffer-from@1.1.2: {} @@ -29959,7 +28430,8 @@ snapshots: dependencies: readdirp: 5.0.0 - chownr@1.1.4: {} + chownr@1.1.4: + optional: true chownr@3.0.0: {} @@ -30298,8 +28770,6 @@ snapshots: crelt@1.0.6: {} - croner@10.0.1: {} - cronstrue@3.24.0: {} cross-fetch@4.1.0: @@ -30537,8 +29007,6 @@ snapshots: data-uri-to-buffer@4.0.1: {} - data-uri-to-buffer@6.0.2: {} - date-fns@4.1.0: {} dateformat@4.6.3: {} @@ -30583,6 +29051,7 @@ snapshots: decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 + optional: true dedent@1.7.0(babel-plugin-macros@3.1.0): optionalDependencies: @@ -30629,12 +29098,6 @@ snapshots: defu@6.1.7: {} - degenerator@5.0.1: - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 - delaunator@5.0.1: dependencies: robust-predicates: 3.0.2 @@ -31164,14 +29627,6 @@ snapshots: escape-string-regexp@5.0.0: {} - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 @@ -31188,7 +29643,8 @@ snapshots: estraverse@4.3.0: optional: true - estraverse@5.3.0: {} + estraverse@5.3.0: + optional: true estree-util-attach-comments@3.0.0: dependencies: @@ -31225,8 +29681,6 @@ snapshots: dependencies: '@types/estree': 1.0.9 - esutils@2.0.3: {} - etag@1.8.1: {} event-target-shim@5.0.1: {} @@ -31301,7 +29755,8 @@ snapshots: strip-final-newline: 4.0.0 yoctocolors: 2.1.2 - expand-template@2.0.3: {} + expand-template@2.0.3: + optional: true expect-type@1.2.2: {} @@ -31504,16 +29959,6 @@ snapshots: extend@3.0.2: {} - extract-zip@2.0.1: - dependencies: - debug: 4.4.3(supports-color@8.1.1) - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - fast-copy@3.0.2: {} fast-decode-uri-component@1.0.1: {} @@ -31593,10 +30038,6 @@ snapshots: dependencies: bser: 2.1.1 - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - fdb-tuple@1.0.0: {} fdir@6.5.0(picomatch@4.0.3): @@ -31633,7 +30074,8 @@ snapshots: transitivePeerDependencies: - supports-color - file-uri-to-path@1.0.0: {} + file-uri-to-path@1.0.0: + optional: true filelist@1.0.6: dependencies: @@ -31825,7 +30267,8 @@ snapshots: fresh@2.0.0: {} - fs-constants@1.0.0: {} + fs-constants@1.0.0: + optional: true fs-extra@11.3.4: dependencies: @@ -31901,10 +30344,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stream@5.2.0: - dependencies: - pump: 3.0.4 - get-stream@6.0.1: {} get-stream@8.0.1: {} @@ -31922,21 +30361,14 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - get-uri@6.0.5: - dependencies: - basic-ftp: 5.2.0 - data-uri-to-buffer: 6.0.2 - debug: 4.4.3(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - getenv@1.0.0: {} getenv@2.0.0: {} giget@3.3.1: {} - github-from-package@0.0.0: {} + github-from-package@0.0.0: + optional: true glob-parent@5.1.2: dependencies: @@ -32304,10 +30736,6 @@ snapshots: dependencies: lru-cache: 10.4.3 - hosted-git-info@9.0.2: - dependencies: - lru-cache: 11.2.6 - html-void-elements@3.0.0: {} http-assert@1.5.0: @@ -32896,9 +31324,6 @@ snapshots: transitivePeerDependencies: - supports-color - koffi@2.15.4: - optional: true - kolorist@1.8.0: {} kysely@0.29.5: {} @@ -33166,8 +31591,6 @@ snapshots: chalk: 5.6.2 is-unicode-supported: 1.3.0 - long-timeout@0.1.1: {} - long@5.3.2: {} longest-streak@3.1.0: {} @@ -33200,8 +31623,6 @@ snapshots: dependencies: yallist: 4.0.0 - lru-cache@7.18.3: {} - lucide-react@0.344.0(react@19.1.0): dependencies: react: 19.1.0 @@ -33271,8 +31692,6 @@ snapshots: marked@14.0.0: {} - marked@15.0.12: {} - marked@16.4.2: {} marked@9.1.6: {} @@ -34142,7 +32561,8 @@ snapshots: mimic-function@5.0.1: {} - mimic-response@3.1.0: {} + mimic-response@3.1.0: + optional: true mimic-response@4.0.0: {} @@ -34227,7 +32647,8 @@ snapshots: mixpart@0.0.6: {} - mkdirp-classic@0.5.3: {} + mkdirp-classic@0.5.3: + optional: true mkdirp@1.0.4: {} @@ -34449,7 +32870,8 @@ snapshots: nanostores@1.2.0: {} - napi-build-utils@2.0.0: {} + napi-build-utils@2.0.0: + optional: true needle@3.3.1: dependencies: @@ -34467,8 +32889,6 @@ snapshots: nested-error-stacks@2.0.1: {} - netmask@2.0.2: {} - next@16.1.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.93.2): dependencies: '@next/env': 16.1.1 @@ -34562,6 +32982,7 @@ snapshots: node-abi@3.88.0: dependencies: semver: 7.8.5 + optional: true node-addon-api@6.1.0: {} @@ -34808,11 +33229,6 @@ snapshots: transitivePeerDependencies: - encoding - openai@6.26.0(ws@8.19.0)(zod@4.1.13): - optionalDependencies: - ws: 8.19.0 - zod: 4.1.13 - openai@6.26.0(ws@8.22.0)(zod@3.25.76): optionalDependencies: ws: 8.22.0 @@ -34916,24 +33332,6 @@ snapshots: p-try@2.2.0: {} - pac-proxy-agent@7.2.0: - dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.4 - debug: 4.4.3(supports-color@8.1.1) - get-uri: 6.0.5 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color - - pac-resolver@7.0.1: - dependencies: - degenerator: 5.0.1 - netmask: 2.0.2 - package-json-from-dist@1.0.1: {} package-manager-detector@1.6.0: {} @@ -35362,6 +33760,7 @@ snapshots: simple-get: 4.0.1 tar-fs: 2.1.4 tunnel-agent: 0.6.0 + optional: true prettier@2.7.1: {} @@ -35419,29 +33818,8 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - proper-lockfile@4.1.2: - dependencies: - graceful-fs: 4.2.11 - retry: 0.12.0 - signal-exit: 3.0.7 - property-information@7.1.0: {} - protobufjs@7.5.4: - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 22.19.15 - long: 5.3.2 - protobufjs@7.6.6: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -35476,19 +33854,6 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-agent@6.5.0: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3(supports-color@8.1.1) - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - lru-cache: 7.18.3 - pac-proxy-agent: 7.2.0 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color - proxy-from-env@1.1.0: {} prr@1.0.1: @@ -36136,8 +34501,6 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - retry@0.12.0: {} - retry@0.13.1: {} rettime@0.11.11: {} @@ -36315,11 +34678,6 @@ snapshots: scule@1.3.0: {} - secure-exec@0.2.1: - dependencies: - '@secure-exec/core': 0.2.1 - '@secure-exec/nodejs': 0.2.1 - secure-exec@https://pkg.pr.new/rivet-dev/secure-exec@7659aba: dependencies: buffer: 6.0.3 @@ -36635,13 +34993,15 @@ snapshots: signal-exit@4.1.0: {} - simple-concat@1.0.1: {} + simple-concat@1.0.1: + optional: true simple-get@4.0.1: dependencies: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 + optional: true simple-plist@1.3.1: dependencies: @@ -36675,8 +35035,6 @@ snapshots: slugify@1.6.8: {} - smart-buffer@4.2.0: {} - smol-toml@1.6.0: {} snake-case@3.0.4: @@ -36684,19 +35042,6 @@ snapshots: dot-case: 3.0.4 tslib: 2.8.1 - socks-proxy-agent@8.0.5: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3(supports-color@8.1.1) - socks: 2.8.7 - transitivePeerDependencies: - - supports-color - - socks@2.8.7: - dependencies: - ip-address: 10.4.0 - smart-buffer: 4.2.0 - sonic-boom@4.2.0: dependencies: atomic-sleep: 1.0.0 @@ -37048,6 +35393,7 @@ snapshots: mkdirp-classic: 0.5.3 pump: 3.0.4 tar-stream: 2.2.0 + optional: true tar-stream@2.2.0: dependencies: @@ -37056,6 +35402,7 @@ snapshots: fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 + optional: true tar-stream@3.1.7: dependencies: @@ -37540,6 +35887,7 @@ snapshots: tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 + optional: true turbo-darwin-64@2.5.6: optional: true @@ -37686,8 +36034,6 @@ snapshots: undici@6.24.1: {} - undici@7.24.7: {} - undici@7.24.8: {} undici@7.28.0: {} @@ -38797,8 +37143,6 @@ snapshots: web-streams-polyfill@4.0.0-beta.3: {} - web-streams-polyfill@4.2.0: {} - web-vitals@4.2.4: {} web-worker@1.5.0: {} @@ -39102,8 +37446,6 @@ snapshots: yaml@1.10.2: {} - yaml@2.8.2: {} - yaml@2.9.0: {} yargs-parser@20.2.9: {} @@ -39130,11 +37472,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - yauzl@3.4.0: dependencies: pend: 1.2.0 diff --git a/rivetkit-typescript/packages/rivetkit/fixtures/driver-test-suite/agent-os.ts b/rivetkit-typescript/packages/rivetkit/fixtures/driver-test-suite/agent-os.ts deleted file mode 100644 index 883965a50c..0000000000 --- a/rivetkit-typescript/packages/rivetkit/fixtures/driver-test-suite/agent-os.ts +++ /dev/null @@ -1,4 +0,0 @@ -import common from "@rivet-dev/agent-os-common"; -import { agentOs } from "rivetkit/agent-os"; - -export const agentOsTestActor = agentOs({ options: { software: [common] } }); diff --git a/rivetkit-typescript/packages/rivetkit/fixtures/driver-test-suite/registry-static.ts b/rivetkit-typescript/packages/rivetkit/fixtures/driver-test-suite/registry-static.ts index ac165dd402..a352a7cc8f 100644 --- a/rivetkit-typescript/packages/rivetkit/fixtures/driver-test-suite/registry-static.ts +++ b/rivetkit-typescript/packages/rivetkit/fixtures/driver-test-suite/registry-static.ts @@ -191,18 +191,6 @@ import { workflowTryActor, } from "./workflow"; -let agentOsTestActor: - | Awaited["agentOsTestActor"] - | undefined; - -try { - ({ agentOsTestActor } = await import("./agent-os")); -} catch (error) { - if (!(error instanceof Error) || !error.message.includes("agent-os")) { - throw error; - } -} - // Consolidated setup with all actors export const registry = setup({ use: { @@ -404,11 +392,5 @@ export const registry = setup({ beforeConnectGenericErrorActor, stateChangeRecursionActor, stateChangeReentrantMutationActor, - ...(agentOsTestActor - ? { - // From agent-os.ts - agentOsTestActor, - } - : {}), }, }); diff --git a/rivetkit-typescript/packages/rivetkit/package.json b/rivetkit-typescript/packages/rivetkit/package.json index 54bb9c7041..78046fe0c7 100644 --- a/rivetkit-typescript/packages/rivetkit/package.json +++ b/rivetkit-typescript/packages/rivetkit/package.json @@ -210,7 +210,6 @@ "dependencies": { "@hono/zod-openapi": "^1.1.5", "@opentelemetry/api": "^1.1.0", - "@rivet-dev/agent-os-core": "^0.1.1", "@rivet-dev/services": "^0.2.0", "@rivetkit/bare-ts": "^0.6.2", "@rivetkit/engine-api-full": "workspace:*", @@ -238,8 +237,6 @@ "@hono/node-server": "^1.18.2", "@hono/node-ws": "^1.1.1", "@opentelemetry/sdk-trace-node": "2.11.0", - "@rivet-dev/agent-os-common": "*", - "@rivet-dev/agent-os-pi": "^0.1.1", "@standard-schema/spec": "^1.0.0", "@types/invariant": "^2", "@types/node": "^22.13.1", diff --git a/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/cron.ts b/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/cron.ts deleted file mode 100644 index 053b850e40..0000000000 --- a/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/cron.ts +++ /dev/null @@ -1,84 +0,0 @@ -import type { CronAction, CronJobInfo } from "@rivet-dev/agent-os-core"; -import type { AgentOsActorConfig } from "../config"; -import type { - AgentOsActionContext, - SerializableCronAction, - SerializableCronJobInfo, - SerializableCronJobOptions, -} from "../types"; -import { ensureVm } from "./index"; - -function serializeCronAction(action: CronAction): SerializableCronAction { - switch (action.type) { - case "session": - return { - type: "session", - agentType: action.agentType, - prompt: action.prompt, - cwd: action.options?.cwd, - }; - case "exec": - return { - type: "exec", - command: action.command, - args: action.args, - }; - case "callback": - throw new TypeError("callback cron actions are not serializable"); - } -} - -function serializeCronJob(job: CronJobInfo): SerializableCronJobInfo { - return { - id: job.id, - schedule: job.schedule, - action: serializeCronAction(job.action), - overlap: job.overlap, - lastRun: job.lastRun?.toISOString(), - nextRun: job.nextRun?.toISOString(), - runCount: job.runCount, - running: job.running, - }; -} - -// Build cron scheduling actions for the actor factory. -export function buildCronActions( - config: AgentOsActorConfig, -) { - return { - scheduleCron: async ( - c: AgentOsActionContext, - options: SerializableCronJobOptions, - ): Promise<{ id: string }> => { - const agentOs = await ensureVm(c, config); - const job = agentOs.scheduleCron({ - id: options.id, - schedule: options.schedule, - action: options.action as CronAction, - overlap: options.overlap, - }); - c.log.info({ - msg: "agent-os cron job scheduled", - jobId: job.id, - schedule: options.schedule, - }); - return { id: job.id }; - }, - - listCronJobs: async ( - c: AgentOsActionContext, - ): Promise => { - const agentOs = await ensureVm(c, config); - return agentOs.listCronJobs().map(serializeCronJob); - }, - - cancelCronJob: async ( - c: AgentOsActionContext, - id: string, - ): Promise => { - const agentOs = await ensureVm(c, config); - agentOs.cancelCronJob(id); - c.log.info({ msg: "agent-os cron job cancelled", jobId: id }); - }, - }; -} diff --git a/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/db.ts b/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/db.ts deleted file mode 100644 index e1b1374f59..0000000000 --- a/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/db.ts +++ /dev/null @@ -1,54 +0,0 @@ -import type { RawAccess } from "@/common/database/config"; - -export async function migrateAgentOsTables(db: RawAccess): Promise { - await db.execute(` - CREATE TABLE IF NOT EXISTS agent_os_preview_tokens ( - token TEXT PRIMARY KEY, - port INTEGER NOT NULL, - created_at INTEGER NOT NULL, - expires_at INTEGER NOT NULL - ); - - CREATE INDEX IF NOT EXISTS idx_preview_tokens_expires_at - ON agent_os_preview_tokens(expires_at); - - CREATE TABLE IF NOT EXISTS agent_os_fs_entries ( - path TEXT PRIMARY KEY, - is_directory INTEGER NOT NULL DEFAULT 0, - content BLOB, - mode INTEGER NOT NULL DEFAULT 33188, - uid INTEGER NOT NULL DEFAULT 0, - gid INTEGER NOT NULL DEFAULT 0, - size INTEGER NOT NULL DEFAULT 0, - atime_ms INTEGER NOT NULL, - mtime_ms INTEGER NOT NULL, - ctime_ms INTEGER NOT NULL, - birthtime_ms INTEGER NOT NULL, - symlink_target TEXT, - nlink INTEGER NOT NULL DEFAULT 1 - ); - - CREATE INDEX IF NOT EXISTS idx_fs_entries_parent - ON agent_os_fs_entries(path); - - CREATE TABLE IF NOT EXISTS agent_os_sessions ( - session_id TEXT PRIMARY KEY, - agent_type TEXT NOT NULL, - capabilities TEXT NOT NULL, - agent_info TEXT, - created_at INTEGER NOT NULL - ); - - CREATE TABLE IF NOT EXISTS agent_os_session_events ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - session_id TEXT NOT NULL, - seq INTEGER NOT NULL, - event TEXT NOT NULL, - created_at INTEGER NOT NULL, - FOREIGN KEY (session_id) REFERENCES agent_os_sessions(session_id) ON DELETE CASCADE - ); - - CREATE INDEX IF NOT EXISTS idx_session_events_session_seq - ON agent_os_session_events(session_id, seq); - `); -} diff --git a/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/filesystem.ts b/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/filesystem.ts deleted file mode 100644 index 2f17d14388..0000000000 --- a/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/filesystem.ts +++ /dev/null @@ -1,131 +0,0 @@ -import type { - AgentRegistryEntry, - BatchReadResult, - BatchWriteEntry, - BatchWriteResult, - DirEntry, - ReaddirRecursiveOptions, -} from "@rivet-dev/agent-os-core"; -import type { AgentOsActorConfig } from "../config"; -import type { AgentOsActionContext } from "../types"; -import { ensureVm } from "./index"; - -// Infer types from AgentOs methods since @secure-exec/core is not a direct dep. -type VirtualStat = Awaited< - ReturnType ->; -type DeleteOptions = Parameters< - import("@rivet-dev/agent-os-core").AgentOs["delete"] ->[1]; - -// Build filesystem and agent registry actions for the actor factory. -export function buildFilesystemActions( - config: AgentOsActorConfig, -) { - return { - readFile: async ( - c: AgentOsActionContext, - path: string, - ): Promise => { - const agentOs = await ensureVm(c, config); - return agentOs.readFile(path); - }, - - writeFile: async ( - c: AgentOsActionContext, - path: string, - content: string | Uint8Array, - ): Promise => { - const agentOs = await ensureVm(c, config); - await agentOs.writeFile(path, content); - }, - - readFiles: async ( - c: AgentOsActionContext, - paths: string[], - ): Promise => { - const agentOs = await ensureVm(c, config); - return agentOs.readFiles(paths); - }, - - writeFiles: async ( - c: AgentOsActionContext, - entries: BatchWriteEntry[], - ): Promise => { - const agentOs = await ensureVm(c, config); - return agentOs.writeFiles(entries); - }, - - mkdir: async ( - c: AgentOsActionContext, - path: string, - options?: { recursive?: boolean }, - ): Promise => { - const agentOs = await ensureVm(c, config); - await agentOs.mkdir(path, options); - }, - - readdir: async ( - c: AgentOsActionContext, - path: string, - ): Promise => { - const agentOs = await ensureVm(c, config); - return agentOs.readdir(path); - }, - - readdirRecursive: async ( - c: AgentOsActionContext, - path: string, - options?: ReaddirRecursiveOptions, - ): Promise => { - const agentOs = await ensureVm(c, config); - return agentOs.readdirRecursive(path, options); - }, - - stat: async ( - c: AgentOsActionContext, - path: string, - ): Promise => { - const agentOs = await ensureVm(c, config); - return agentOs.stat(path); - }, - - exists: async ( - c: AgentOsActionContext, - path: string, - ): Promise => { - const agentOs = await ensureVm(c, config); - return agentOs.exists(path); - }, - - move: async ( - c: AgentOsActionContext, - from: string, - to: string, - ): Promise => { - const agentOs = await ensureVm(c, config); - await agentOs.move(from, to); - }, - - deleteFile: async ( - c: AgentOsActionContext, - path: string, - options?: DeleteOptions, - ): Promise => { - const agentOs = await ensureVm(c, config); - await agentOs.delete(path, options); - }, - - // TODO: mountFs and unmountFs are not exposed as actor actions because - // filesystem drivers (VirtualFileSystem) are not serializable over the - // network. Mount filesystems via the `options.mounts` config in agentOs() - // instead. See: https://github.com/rivet-dev/rivet/issues/XXXX - - listAgents: async ( - c: AgentOsActionContext, - ): Promise => { - const agentOs = await ensureVm(c, config); - return agentOs.listAgents(); - }, - }; -} diff --git a/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/index.ts b/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/index.ts deleted file mode 100644 index accac8eec4..0000000000 --- a/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/index.ts +++ /dev/null @@ -1,285 +0,0 @@ -import type { AgentOsOptions, MountConfig } from "@rivet-dev/agent-os-core"; -import { AgentOs, createInMemoryFileSystem } from "@rivet-dev/agent-os-core"; -import { type ActorDefinition, actor, event } from "@/actor/mod"; -import type { DatabaseProvider, RawAccess } from "@/common/database/config"; -import { db } from "@/common/database/mod"; -import { - type AgentOsActorConfig, - type AgentOsActorConfigInput, - agentOsActorConfigSchema, -} from "../config"; -import type { - AgentOsActionContext, - AgentOsActorState, - AgentOsActorVars, - CronEventPayload, - PermissionRequestPayload, - ProcessExitPayload, - ProcessOutputPayload, - SessionEventPayload, - ShellDataPayload, - VmBootedPayload, - VmShutdownPayload, -} from "../types"; -import { buildCronActions } from "./cron"; -import { migrateAgentOsTables } from "./db"; -import { buildFilesystemActions } from "./filesystem"; -import { buildNetworkActions } from "./network"; -import { buildOnRequestHandler, buildPreviewActions } from "./preview"; -import { buildProcessActions } from "./process"; -import { - buildConfigActions, - buildPromptActions, - buildSessionActions, - buildSessionPersistenceActions, -} from "./session"; -import { buildShellActions } from "./shell"; - -// --- VM lifecycle helpers --- - -async function ensureVm( - c: AgentOsActionContext, - config: AgentOsActorConfig, -): Promise { - if (c.vars.agentOs) { - return c.vars.agentOs; - } - - const start = Date.now(); - - // Build options with in-memory VFS as default working directory mount. - const options = buildVmOptions(config.options); - - const agentOs = await AgentOs.create(options); - c.vars.agentOs = agentOs; - - // Wire cron events to actor events. - agentOs.onCronEvent((cronEvent) => { - c.broadcast("cronEvent", { event: cronEvent }); - }); - - c.broadcast("vmBooted", {}); - c.log.info({ - msg: "agent-os vm booted", - bootDurationMs: Date.now() - start, - }); - - return agentOs; -} - -function buildVmOptions(userOptions?: AgentOsOptions): AgentOsOptions { - const userMounts = userOptions?.mounts ?? []; - - // Check if the user already provided a mount at /home/user. If so, respect - // their override and skip the default in-memory VFS mount. - const hasWorkdirMount = userMounts.some( - (m: MountConfig) => m.path === "/home/user", - ); - - if (hasWorkdirMount) { - return userOptions ?? {}; - } - - // TODO: Reimplement with persistent backend (SQLite-backed metadata and - // actor storage-backed blocks) so VM filesystem state survives sleep/wake. - const memMount: MountConfig = { - path: "/home/user", - driver: createInMemoryFileSystem(), - }; - - return { - ...userOptions, - mounts: [memMount, ...userMounts], - }; -} - -// --- Prevent-sleep coordination --- - -function syncPreventSleep( - c: AgentOsActionContext, -): void { - const shouldPrevent = - c.vars.activeSessionIds.size > 0 || - c.vars.activeProcesses.size > 0 || - c.vars.activeHooks.size > 0 || - c.vars.activeShells.size > 0; - - c.setPreventSleep(shouldPrevent); - - c.log.info({ - msg: "agent-os prevent sleep sync", - preventSleep: shouldPrevent, - activeSessions: c.vars.activeSessionIds.size, - activeProcesses: c.vars.activeProcesses.size, - activeHooks: c.vars.activeHooks.size, - activeShells: c.vars.activeShells.size, - }); -} - -// --- Hook tracking --- - -function runHook( - c: AgentOsActionContext, - name: string, - callback: () => void | Promise, -): void { - const promise = Promise.resolve(callback()) - .catch((error) => - c.log.error({ msg: "agent-os hook failed", hookName: name, error }), - ) - .finally(() => { - c.vars.activeHooks.delete(promise); - syncPreventSleep(c); - }); - c.vars.activeHooks.add(promise); - syncPreventSleep(c); - c.waitUntil(promise); -} - -// --- Public API --- - -export function agentOs( - config: AgentOsActorConfigInput, -): ActorDefinition< - AgentOsActorState, - TConnParams, - undefined, - AgentOsActorVars, - undefined, - DatabaseProvider, - { - sessionEvent: typeof sessionEventToken; - permissionRequest: typeof permissionRequestToken; - vmBooted: typeof vmBootedToken; - vmShutdown: typeof vmShutdownToken; - processOutput: typeof processOutputToken; - processExit: typeof processExitToken; - shellData: typeof shellDataToken; - cronEvent: typeof cronEventToken; - }, - Record, - any -> { - const parsedConfig = agentOsActorConfigSchema.parse( - config, - ) as AgentOsActorConfig; - const actions = { - ...buildSessionActions(parsedConfig), - ...buildPromptActions(parsedConfig), - ...buildConfigActions(parsedConfig), - ...buildSessionPersistenceActions(parsedConfig), - ...buildProcessActions(parsedConfig), - ...buildFilesystemActions(parsedConfig), - ...buildPreviewActions(parsedConfig), - ...buildShellActions(parsedConfig), - ...buildCronActions(parsedConfig), - ...buildNetworkActions(parsedConfig), - }; - - return actor< - AgentOsActorState, - TConnParams, - undefined, - AgentOsActorVars, - undefined, - DatabaseProvider, - { - sessionEvent: typeof sessionEventToken; - permissionRequest: typeof permissionRequestToken; - vmBooted: typeof vmBootedToken; - vmShutdown: typeof vmShutdownToken; - processOutput: typeof processOutputToken; - processExit: typeof processExitToken; - shellData: typeof shellDataToken; - cronEvent: typeof cronEventToken; - }, - Record, - typeof actions - >({ - options: { - sleepGracePeriod: 900_000, - actionTimeout: 900_000, - }, - createState: async () => ({}), - createVars: () => ({ - agentOs: null, - activeSessionIds: new Set(), - activeProcesses: new Set(), - activeHooks: new Set>(), - activeShells: new Set(), - sessions: new Set(), - }), - db: db({ - onMigrate: migrateAgentOsTables, - }), - events: { - sessionEvent: sessionEventToken, - permissionRequest: permissionRequestToken, - vmBooted: vmBootedToken, - vmShutdown: vmShutdownToken, - processOutput: processOutputToken, - processExit: processExitToken, - shellData: shellDataToken, - cronEvent: cronEventToken, - }, - onBeforeConnect: parsedConfig.onBeforeConnect - ? async (ctx, params) => { - // Skip user auth for preview URL requests. The signed token - // in onRequest is the credential; browsers navigating preview - // URLs cannot supply actor connection params. - if (ctx.request) { - const url = new URL(ctx.request.url); - if (url.pathname.startsWith("/fetch/")) { - return; - } - } - await parsedConfig.onBeforeConnect?.(ctx, params); - } - : undefined, - onRequest: buildOnRequestHandler(parsedConfig), - onSleep: async (c) => { - c.log.info({ - msg: "agent-os vm shutdown for sleep", - activeSessions: c.vars.sessions.size, - activeProcesses: c.vars.activeProcesses.size, - activeShells: c.vars.activeShells.size, - }); - - if (c.vars.agentOs) { - await c.vars.agentOs.dispose(); - c.vars.agentOs = null; - } - - c.broadcast("vmShutdown", { reason: "sleep" as const }); - }, - onDestroy: async (c) => { - c.log.info({ - msg: "agent-os vm shutdown for destroy", - activeSessions: c.vars.sessions.size, - activeProcesses: c.vars.activeProcesses.size, - activeShells: c.vars.activeShells.size, - }); - - if (c.vars.agentOs) { - await c.vars.agentOs.dispose(); - c.vars.agentOs = null; - } - - c.broadcast("vmShutdown", { reason: "destroy" as const }); - }, - actions, - }); -} - -// Event type tokens. Declared at module level so they can be referenced in -// the actor generic type parameters. -const sessionEventToken = event(); -const permissionRequestToken = event(); -const vmBootedToken = event(); -const vmShutdownToken = event(); -const processOutputToken = event(); -const processExitToken = event(); -const shellDataToken = event(); -const cronEventToken = event(); - -export { ensureVm, syncPreventSleep, runHook }; diff --git a/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/network.ts b/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/network.ts deleted file mode 100644 index 8dbf418d1a..0000000000 --- a/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/network.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { AgentOsActorConfig } from "../config"; -import type { AgentOsActionContext } from "../types"; -import { ensureVm } from "./index"; - -// Serializable fetch options for the actor action boundary. -export interface VmFetchOptions { - method?: string; - headers?: Record; - body?: string | Uint8Array; -} - -// Serializable fetch result returned by the actor action. -export interface VmFetchResult { - status: number; - statusText: string; - headers: Record; - body: Uint8Array; -} - -// Build network actions for the actor factory. -export function buildNetworkActions( - config: AgentOsActorConfig, -) { - return { - vmFetch: async ( - c: AgentOsActionContext, - port: number, - url: string, - options?: VmFetchOptions, - ): Promise => { - const agentOs = await ensureVm(c, config); - - const headers = new Headers(options?.headers); - const request = new Request(url, { - method: options?.method ?? "GET", - headers, - body: options?.body ?? null, - }); - - const response = await agentOs.fetch(port, request); - - // Serialize response headers to a plain object. - const responseHeaders: Record = {}; - response.headers.forEach((value, key) => { - responseHeaders[key] = value; - }); - - const body = new Uint8Array(await response.arrayBuffer()); - - return { - status: response.status, - statusText: response.statusText, - headers: responseHeaders, - body, - }; - }, - }; -} diff --git a/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/preview.ts b/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/preview.ts deleted file mode 100644 index 3e5f9f7e96..0000000000 --- a/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/preview.ts +++ /dev/null @@ -1,190 +0,0 @@ -import crypto from "node:crypto"; -import type { RequestContext } from "@/actor/config"; -import type { DatabaseProvider, RawAccess } from "@/common/database/config"; -import type { AgentOsActorConfig } from "../config"; -import type { - AgentOsActionContext, - AgentOsActorState, - AgentOsActorVars, -} from "../types"; -import { ensureVm } from "./index"; - -// Generate a 32-character lowercase alphanumeric token (a-z0-9). -// 36^32 ~= 1.6e49 possible tokens, brute-force infeasible. -export function generateToken(): string { - const bytes = crypto.randomBytes(32); - const alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"; - let token = ""; - for (let i = 0; i < 32; i++) { - token += alphabet[bytes[i]! % alphabet.length]; - } - return token; -} - -// CORS headers added to all preview proxy responses. -const CORS_HEADERS: Record = { - "Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS", - "Access-Control-Allow-Headers": "*", -}; - -function addCorsHeaders(response: Response): Response { - const headers = new Headers(response.headers); - for (const [key, value] of Object.entries(CORS_HEADERS)) { - headers.set(key, value); - } - return new Response(response.body, { - status: response.status, - statusText: response.statusText, - headers, - }); -} - -type AgentOsRequestContext = RequestContext< - AgentOsActorState, - TConnParams, - undefined, - AgentOsActorVars, - undefined, - DatabaseProvider ->; - -export function buildOnRequestHandler( - config: AgentOsActorConfig, -) { - return async ( - c: AgentOsRequestContext, - request: Request, - ): Promise => { - const url = new URL(request.url); - const pathname = url.pathname; - - // Expect paths like /fetch/{token} or /fetch/{token}/remaining/path. - const match = pathname.match(/^\/fetch\/([a-z0-9]+)(\/.*)?$/); - if (!match) { - return new Response("Not Found", { status: 404 }); - } - - // Handle OPTIONS preflight before token validation. - if (request.method === "OPTIONS") { - return new Response(null, { status: 204, headers: CORS_HEADERS }); - } - - const token = match[1]!; - const remainingPath = match[2] ?? "/"; - - // Validate token from SQLite. - const now = Date.now(); - const rows: { port: number }[] = await c.db.execute( - `SELECT port FROM agent_os_preview_tokens WHERE token = ? AND expires_at > ?`, - token, - now, - ); - - if (rows.length === 0) { - c.log.warn({ msg: "agent-os preview auth failed", token }); - return addCorsHeaders(new Response("Forbidden", { status: 403 })); - } - - const port = rows[0]?.port; - - // Boot the VM if needed. - const agentOs = await ensureVm( - c as AgentOsActionContext, - config, - ); - - // Build the request to proxy through the VM's virtual network. - const vmUrl = `http://localhost:${port}${remainingPath}${url.search}`; - const vmRequest = new Request(vmUrl, { - method: request.method, - headers: request.headers, - body: request.body, - duplex: "half", - } as RequestInit); - - const vmResponse = await agentOs.fetch(port, vmRequest); - - c.log.info({ - msg: "agent-os preview request proxied", - port, - method: request.method, - path: remainingPath, - status: vmResponse.status, - }); - - return addCorsHeaders(vmResponse); - }; -} - -export function buildPreviewActions( - config: AgentOsActorConfig, -) { - return { - createSignedPreviewUrl: async ( - c: AgentOsActionContext, - port: number, - expiresInSeconds?: number, - ): Promise<{ - path: string; - token: string; - port: number; - expiresAt: number; - }> => { - await ensureVm(c, config); - - const effectiveExpires = - expiresInSeconds ?? config.preview.defaultExpiresInSeconds; - const maxExpires = config.preview.maxExpiresInSeconds; - - if (effectiveExpires < 1 || effectiveExpires > maxExpires) { - throw new Error( - `expiresInSeconds must be between 1 and ${maxExpires}`, - ); - } - - const token = generateToken(); - const now = Date.now(); - const expiresAt = now + effectiveExpires * 1000; - - // Insert token and lazy-delete expired tokens. - await c.db.execute( - `INSERT INTO agent_os_preview_tokens (token, port, created_at, expires_at) - VALUES (?, ?, ?, ?)`, - token, - port, - now, - expiresAt, - ); - await c.db.execute( - `DELETE FROM agent_os_preview_tokens WHERE expires_at <= ?`, - now, - ); - - // Path relative to the actor's gateway URL. Full URL is - // `${gatewayUrl}/request/fetch/${token}` where gatewayUrl - // comes from the client's getGatewayUrl(). - const path = `/request/fetch/${token}`; - - c.log.info({ - msg: "agent-os preview token created", - port, - expiresInSeconds: effectiveExpires, - }); - - return { path, token, port, expiresAt }; - }, - - expireSignedPreviewUrl: async ( - c: AgentOsActionContext, - token: string, - ): Promise => { - await c.db.execute( - `DELETE FROM agent_os_preview_tokens WHERE token = ?`, - token, - ); - - c.log.info({ msg: "agent-os preview token expired", token }); - }, - }; -} diff --git a/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/process.ts b/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/process.ts deleted file mode 100644 index a64f135b26..0000000000 --- a/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/process.ts +++ /dev/null @@ -1,177 +0,0 @@ -import type { - ProcessInfo, - ProcessTreeNode, - SpawnedProcessInfo, -} from "@rivet-dev/agent-os-core"; -import { isRivetErrorCode } from "@/actor/errors"; -import type { AgentOsActorConfig } from "../config"; -import type { AgentOsActionContext } from "../types"; -import { ensureVm, syncPreventSleep } from "./index"; - -// Infer types from AgentOs methods since @secure-exec/core is not a direct dep. -type ExecResult = Awaited< - ReturnType ->; -type ExecOptions = Parameters< - import("@rivet-dev/agent-os-core").AgentOs["exec"] ->[1]; -type SpawnOptions = Parameters< - import("@rivet-dev/agent-os-core").AgentOs["spawn"] ->[2]; - -function broadcastProcessEvent( - c: AgentOsActionContext, - name: "processOutput" | "processExit", - payload: unknown, -) { - try { - c.broadcast(name, payload); - } catch (error) { - if (isRivetErrorCode(error, "actor", "stopping")) { - return; - } - throw error; - } -} - -// Build process execution actions for the actor factory. -export function buildProcessActions( - config: AgentOsActorConfig, -) { - return { - exec: async ( - c: AgentOsActionContext, - command: string, - options?: ExecOptions, - ): Promise => { - const agentOs = await ensureVm(c, config); - return agentOs.exec(command, options); - }, - - spawn: async ( - c: AgentOsActionContext, - command: string, - args: string[], - options?: SpawnOptions, - ): Promise<{ pid: number }> => { - const agentOs = await ensureVm(c, config); - const { pid } = agentOs.spawn(command, args, { - ...options, - onStdout: (data: Uint8Array) => { - broadcastProcessEvent(c, "processOutput", { - pid, - stream: "stdout" as const, - data, - }); - options?.onStdout?.(data); - }, - onStderr: (data: Uint8Array) => { - broadcastProcessEvent(c, "processOutput", { - pid, - stream: "stderr" as const, - data, - }); - options?.onStderr?.(data); - }, - }); - - c.vars.activeProcesses.add(pid); - syncPreventSleep(c); - c.log.info({ - msg: "agent-os process spawned", - pid, - command, - }); - - agentOs - .waitProcess(pid) - .then((exitCode) => { - broadcastProcessEvent(c, "processExit", { pid, exitCode }); - c.log.info({ - msg: "agent-os process exited", - pid, - exitCode, - }); - }) - .catch(() => { - // Process killed during dispose. Silently clean up. - }) - .finally(() => { - c.vars.activeProcesses.delete(pid); - syncPreventSleep(c); - }); - - return { pid }; - }, - - writeProcessStdin: async ( - c: AgentOsActionContext, - pid: number, - data: string | Uint8Array, - ): Promise => { - const agentOs = await ensureVm(c, config); - agentOs.writeProcessStdin(pid, data); - }, - - closeProcessStdin: async ( - c: AgentOsActionContext, - pid: number, - ): Promise => { - const agentOs = await ensureVm(c, config); - agentOs.closeProcessStdin(pid); - }, - - waitProcess: async ( - c: AgentOsActionContext, - pid: number, - ): Promise => { - const agentOs = await ensureVm(c, config); - return agentOs.waitProcess(pid); - }, - - listProcesses: async ( - c: AgentOsActionContext, - ): Promise => { - const agentOs = await ensureVm(c, config); - return agentOs.listProcesses(); - }, - - allProcesses: async ( - c: AgentOsActionContext, - ): Promise => { - const agentOs = await ensureVm(c, config); - return agentOs.allProcesses(); - }, - - processTree: async ( - c: AgentOsActionContext, - ): Promise => { - const agentOs = await ensureVm(c, config); - return agentOs.processTree(); - }, - - getProcess: async ( - c: AgentOsActionContext, - pid: number, - ): Promise => { - const agentOs = await ensureVm(c, config); - return agentOs.getProcess(pid); - }, - - stopProcess: async ( - c: AgentOsActionContext, - pid: number, - ): Promise => { - const agentOs = await ensureVm(c, config); - agentOs.stopProcess(pid); - }, - - killProcess: async ( - c: AgentOsActionContext, - pid: number, - ): Promise => { - const agentOs = await ensureVm(c, config); - agentOs.killProcess(pid); - }, - }; -} diff --git a/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/session.ts b/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/session.ts deleted file mode 100644 index 136c33fbb8..0000000000 --- a/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/session.ts +++ /dev/null @@ -1,518 +0,0 @@ -import type { - AgentOs, - AgentType, - CreateSessionOptions, - GetEventsOptions, - JsonRpcNotification, - JsonRpcResponse, - PermissionReply, - SequencedEvent, - SessionConfigOption, - SessionInfo, - SessionModeState, -} from "@rivet-dev/agent-os-core"; -import type { AgentOsActorConfig } from "../config"; -import type { - AgentOsActionContext, - PersistedSessionEvent, - PersistedSessionRecord, - PromptResult, - SessionRecord, -} from "../types"; -import { ensureVm, runHook, syncPreventSleep } from "./index"; - -// Strip non-serializable values (functions) from agent-os-core responses so -// CBOR/BARE encoding doesn't fail. The JsonRpcResponse objects from -// secure-exec can contain function properties. -function stripFunctions(value: unknown): unknown { - if (value === null || value === undefined) return value; - if (typeof value === "function") return undefined; - if (typeof value !== "object") return value; - if (Array.isArray(value)) return value.map(stripFunctions); - const out: Record = {}; - for (const [k, v] of Object.entries(value as Record)) { - if (typeof v !== "function") { - out[k] = stripFunctions(v); - } - } - return out; -} - -// Helper to verify a session exists in the VM. Throws via AgentOs if not found. -function assertSessionExists( - c: AgentOsActionContext, - sessionId: string, -): void { - if (!c.vars.sessions.has(sessionId)) { - throw new Error(`session not found: ${sessionId}`); - } -} - -// Build a SessionRecord from AgentOs flat API. -function toSessionRecord( - agentOs: AgentOs, - sessionId: string, - agentType: string, -): SessionRecord { - return { - sessionId, - agentType, - capabilities: agentOs.getSessionCapabilities(sessionId) ?? {}, - agentInfo: agentOs.getSessionAgentInfo(sessionId), - }; -} - -// --- Session persistence helpers --- - -// Persist a session record to SQLite when it is created. -async function persistSession( - c: AgentOsActionContext, - agentOs: AgentOs, - sessionId: string, - agentType: string, -): Promise { - const now = Date.now(); - const capabilities = agentOs.getSessionCapabilities(sessionId) ?? {}; - const agentInfo = agentOs.getSessionAgentInfo(sessionId); - await c.db.execute( - `INSERT OR REPLACE INTO agent_os_sessions (session_id, agent_type, capabilities, agent_info, created_at) - VALUES (?, ?, ?, ?, ?)`, - sessionId, - agentType, - JSON.stringify(capabilities), - agentInfo ? JSON.stringify(agentInfo) : null, - now, - ); -} - -// Persist a session event to SQLite with an auto-incrementing sequence number. -async function persistSessionEvent( - c: AgentOsActionContext, - sessionId: string, - event: JsonRpcNotification, -): Promise { - const now = Date.now(); - - // Compute next sequence number for this session. - const rows: { max_seq: number | null }[] = await c.db.execute( - `SELECT MAX(seq) as max_seq FROM agent_os_session_events WHERE session_id = ?`, - sessionId, - ); - const nextSeq = (rows[0]?.max_seq ?? -1) + 1; - - await c.db.execute( - `INSERT INTO agent_os_session_events (session_id, seq, event, created_at) - VALUES (?, ?, ?, ?)`, - sessionId, - nextSeq, - JSON.stringify(event), - now, - ); -} - -// Remove a session and its events from SQLite. -async function deletePersistedSession( - c: AgentOsActionContext, - sessionId: string, -): Promise { - await c.db.execute( - `DELETE FROM agent_os_session_events WHERE session_id = ?`, - sessionId, - ); - await c.db.execute( - `DELETE FROM agent_os_sessions WHERE session_id = ?`, - sessionId, - ); -} - -// Subscribe to a session's event and permission streams via the flat AgentOs API, -// broadcasting events and running user-provided hooks. -export function subscribeToSession( - c: AgentOsActionContext, - agentOs: AgentOs, - sessionId: string, - parsedConfig: AgentOsActorConfig, -): void { - agentOs.onSessionEvent(sessionId, (event) => { - c.broadcast( - "sessionEvent", - JSON.parse(JSON.stringify({ sessionId, event })), - ); - - // Persist event to SQLite for sleep/wake recovery. - persistSessionEvent(c, sessionId, event).catch((error) => - c.log.error({ - msg: "agent-os failed to persist session event", - sessionId, - error, - }), - ); - - if (parsedConfig.onSessionEvent) { - runHook(c, "onSessionEvent", () => - parsedConfig.onSessionEvent?.(c, sessionId, event), - ); - } - }); - - agentOs.onPermissionRequest(sessionId, (request) => { - c.broadcast( - "permissionRequest", - JSON.parse(JSON.stringify({ sessionId, request })), - ); - - if (parsedConfig.onPermissionRequest) { - runHook(c, "onPermissionRequest", () => - parsedConfig.onPermissionRequest?.(c, sessionId, request), - ); - } - }); - - c.vars.sessions.add(sessionId); -} - -// Build session management actions for the actor factory. -export function buildSessionActions( - config: AgentOsActorConfig, -) { - return { - createSession: async ( - c: AgentOsActionContext, - agentType: AgentType, - options?: CreateSessionOptions, - ): Promise => { - const agentOs = await ensureVm(c, config); - const { sessionId } = await agentOs.createSession( - agentType, - options, - ); - subscribeToSession(c, agentOs, sessionId, config); - - // Persist session metadata to SQLite for sleep/wake recovery. - await persistSession(c, agentOs, sessionId, agentType); - - c.log.info({ - msg: "agent-os session created", - sessionId, - agentType, - }); - return toSessionRecord(agentOs, sessionId, agentType); - }, - - listSessions: async ( - c: AgentOsActionContext, - ): Promise => { - const agentOs = await ensureVm(c, config); - return agentOs.listSessions(); - }, - - getSession: async ( - c: AgentOsActionContext, - sessionId: string, - ): Promise => { - assertSessionExists(c, sessionId); - const agentOs = await ensureVm(c, config); - const info = agentOs - .listSessions() - .find((s) => s.sessionId === sessionId); - if (!info) { - throw new Error(`session not found: ${sessionId}`); - } - return toSessionRecord(agentOs, sessionId, info.agentType); - }, - - destroySession: async ( - c: AgentOsActionContext, - sessionId: string, - ): Promise => { - const agentOs = await ensureVm(c, config); - await agentOs.destroySession(sessionId); - c.vars.sessions.delete(sessionId); - c.vars.activeSessionIds.delete(sessionId); - syncPreventSleep(c); - - // Clean up persisted session and events from SQLite. - await deletePersistedSession(c, sessionId); - - c.log.info({ msg: "agent-os session destroyed", sessionId }); - }, - - resumeSession: async ( - c: AgentOsActionContext, - sessionId: string, - ): Promise<{ sessionId: string }> => { - const agentOs = await ensureVm(c, config); - return agentOs.resumeSession(sessionId); - }, - - closeSession: async ( - c: AgentOsActionContext, - sessionId: string, - ): Promise => { - const agentOs = await ensureVm(c, config); - agentOs.closeSession(sessionId); - c.vars.sessions.delete(sessionId); - c.vars.activeSessionIds.delete(sessionId); - syncPreventSleep(c); - - // Clean up persisted session and events from SQLite. - await deletePersistedSession(c, sessionId); - - c.log.info({ msg: "agent-os session closed", sessionId }); - }, - }; -} - -// Build prompt, cancel, and permission actions for the actor factory. -export function buildPromptActions( - _config: AgentOsActorConfig, -) { - return { - sendPrompt: async ( - c: AgentOsActionContext, - sessionId: string, - text: string, - ): Promise => { - if (c.aborted) { - throw new Error( - "actor is shutting down, cannot start new prompt", - ); - } - - assertSessionExists(c, sessionId); - const agentOs = c.vars.agentOs; - if (!agentOs) { - throw new Error("VM not initialized"); - } - - c.vars.activeSessionIds.add(sessionId); - syncPreventSleep(c); - c.log.info({ msg: "agent-os prompt turn started", sessionId }); - - const start = Date.now(); - try { - const result = await agentOs.prompt(sessionId, text); - return { - response: JSON.parse(JSON.stringify(result.response)), - text: result.text, - }; - } finally { - c.vars.activeSessionIds.delete(sessionId); - syncPreventSleep(c); - c.log.info({ - msg: "agent-os prompt turn ended", - sessionId, - durationMs: Date.now() - start, - }); - } - }, - - cancelPrompt: async ( - c: AgentOsActionContext, - sessionId: string, - ): Promise => { - assertSessionExists(c, sessionId); - const agentOs = c.vars.agentOs; - if (!agentOs) { - throw new Error("VM not initialized"); - } - return stripFunctions( - agentOs.cancelSession(sessionId), - ) as JsonRpcResponse; - }, - - respondPermission: async ( - c: AgentOsActionContext, - sessionId: string, - permissionId: string, - reply: PermissionReply, - ): Promise => { - assertSessionExists(c, sessionId); - const agentOs = c.vars.agentOs; - if (!agentOs) { - throw new Error("VM not initialized"); - } - return stripFunctions( - agentOs.respondPermission(sessionId, permissionId, reply), - ) as JsonRpcResponse; - }, - }; -} - -// Build session configuration proxy actions for the actor factory. -export function buildConfigActions( - _config: AgentOsActorConfig, -) { - return { - setMode: async ( - c: AgentOsActionContext, - sessionId: string, - modeId: string, - ): Promise => { - assertSessionExists(c, sessionId); - const agentOs = c.vars.agentOs; - if (!agentOs) { - throw new Error("VM not initialized"); - } - return stripFunctions( - agentOs.setSessionMode(sessionId, modeId), - ) as JsonRpcResponse; - }, - - getModes: async ( - c: AgentOsActionContext, - sessionId: string, - ): Promise => { - assertSessionExists(c, sessionId); - const agentOs = c.vars.agentOs; - if (!agentOs) { - throw new Error("VM not initialized"); - } - return agentOs.getSessionModes(sessionId); - }, - - setModel: async ( - c: AgentOsActionContext, - sessionId: string, - model: string, - ): Promise => { - assertSessionExists(c, sessionId); - const agentOs = c.vars.agentOs; - if (!agentOs) { - throw new Error("VM not initialized"); - } - return stripFunctions( - agentOs.setSessionModel(sessionId, model), - ) as JsonRpcResponse; - }, - - setThoughtLevel: async ( - c: AgentOsActionContext, - sessionId: string, - level: string, - ): Promise => { - assertSessionExists(c, sessionId); - const agentOs = c.vars.agentOs; - if (!agentOs) { - throw new Error("VM not initialized"); - } - return stripFunctions( - agentOs.setSessionThoughtLevel(sessionId, level), - ) as JsonRpcResponse; - }, - - getConfigOptions: async ( - c: AgentOsActionContext, - sessionId: string, - ): Promise => { - assertSessionExists(c, sessionId); - const agentOs = c.vars.agentOs; - if (!agentOs) { - throw new Error("VM not initialized"); - } - return agentOs.getSessionConfigOptions(sessionId); - }, - - getEvents: async ( - c: AgentOsActionContext, - sessionId: string, - options?: GetEventsOptions, - ): Promise => { - assertSessionExists(c, sessionId); - const agentOs = c.vars.agentOs; - if (!agentOs) { - throw new Error("VM not initialized"); - } - return agentOs - .getSessionEvents(sessionId, options) - .map((e) => e.notification); - }, - - getSequencedEvents: async ( - c: AgentOsActionContext, - sessionId: string, - options?: GetEventsOptions, - ): Promise => { - assertSessionExists(c, sessionId); - const agentOs = c.vars.agentOs; - if (!agentOs) { - throw new Error("VM not initialized"); - } - return agentOs.getSessionEvents(sessionId, options); - }, - - rawSend: async ( - c: AgentOsActionContext, - sessionId: string, - method: string, - params?: Record, - ): Promise => { - assertSessionExists(c, sessionId); - const agentOs = c.vars.agentOs; - if (!agentOs) { - throw new Error("VM not initialized"); - } - return stripFunctions( - agentOs.rawSessionSend(sessionId, method, params), - ) as JsonRpcResponse; - }, - }; -} - -// Build actions for querying persisted session data from SQLite. -// These work without a running VM and return data from prior sessions -// that survived sleep/wake cycles. -export function buildSessionPersistenceActions( - _config: AgentOsActorConfig, -) { - return { - listPersistedSessions: async ( - c: AgentOsActionContext, - ): Promise => { - const rows: { - session_id: string; - agent_type: string; - capabilities: string; - agent_info: string | null; - created_at: number; - }[] = await c.db.execute( - `SELECT session_id, agent_type, capabilities, agent_info, created_at - FROM agent_os_sessions - ORDER BY created_at ASC`, - ); - - return rows.map((row) => ({ - sessionId: row.session_id, - agentType: row.agent_type, - capabilities: JSON.parse(row.capabilities), - agentInfo: row.agent_info ? JSON.parse(row.agent_info) : null, - createdAt: row.created_at, - })); - }, - - getSessionEvents: async ( - c: AgentOsActionContext, - sessionId: string, - ): Promise => { - const rows: { - session_id: string; - seq: number; - event: string; - created_at: number; - }[] = await c.db.execute( - `SELECT session_id, seq, event, created_at - FROM agent_os_session_events - WHERE session_id = ? - ORDER BY seq ASC`, - sessionId, - ); - - return rows.map((row) => ({ - sessionId: row.session_id, - seq: row.seq, - event: JSON.parse(row.event), - createdAt: row.created_at, - })); - }, - }; -} diff --git a/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/shell.ts b/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/shell.ts deleted file mode 100644 index c44513ee45..0000000000 --- a/rivetkit-typescript/packages/rivetkit/src/agent-os/actor/shell.ts +++ /dev/null @@ -1,60 +0,0 @@ -import type { OpenShellOptions } from "@rivet-dev/agent-os-core"; -import type { AgentOsActorConfig } from "../config"; -import type { AgentOsActionContext } from "../types"; -import { ensureVm, syncPreventSleep } from "./index"; - -// Build shell actions for the actor factory. -export function buildShellActions( - config: AgentOsActorConfig, -) { - return { - openShell: async ( - c: AgentOsActionContext, - options?: OpenShellOptions, - ): Promise<{ shellId: string }> => { - const agentOs = await ensureVm(c, config); - const { shellId } = agentOs.openShell(options); - - // Wire shell data to actor events. - agentOs.onShellData(shellId, (data: Uint8Array) => { - c.broadcast("shellData", { shellId, data }); - }); - - c.vars.activeShells.add(shellId); - syncPreventSleep(c); - c.log.info({ msg: "agent-os shell opened", shellId }); - - return { shellId }; - }, - - writeShell: async ( - c: AgentOsActionContext, - shellId: string, - data: string | Uint8Array, - ): Promise => { - const agentOs = await ensureVm(c, config); - agentOs.writeShell(shellId, data); - }, - - resizeShell: async ( - c: AgentOsActionContext, - shellId: string, - cols: number, - rows: number, - ): Promise => { - const agentOs = await ensureVm(c, config); - agentOs.resizeShell(shellId, cols, rows); - }, - - closeShell: async ( - c: AgentOsActionContext, - shellId: string, - ): Promise => { - const agentOs = await ensureVm(c, config); - agentOs.closeShell(shellId); - c.vars.activeShells.delete(shellId); - syncPreventSleep(c); - c.log.info({ msg: "agent-os shell closed", shellId }); - }, - }; -} diff --git a/rivetkit-typescript/packages/rivetkit/src/agent-os/config.ts b/rivetkit-typescript/packages/rivetkit/src/agent-os/config.ts deleted file mode 100644 index a0ed59b30b..0000000000 --- a/rivetkit-typescript/packages/rivetkit/src/agent-os/config.ts +++ /dev/null @@ -1,79 +0,0 @@ -import type { - AgentOsOptions, - JsonRpcNotification, - PermissionRequest, -} from "@rivet-dev/agent-os-core"; -import { z } from "zod/v4"; -import type { ActorContext, BeforeConnectContext } from "@/actor/config"; -import type { AgentOsActorState, AgentOsActorVars } from "./types"; - -const zFunction = < - T extends (...args: any[]) => any = (...args: unknown[]) => unknown, ->() => z.custom((val) => typeof val === "function"); - -const AgentOsOptionsSchema = z.custom( - (val) => typeof val === "object" && val !== null, -); - -export const agentOsActorConfigSchema = z - .object({ - options: AgentOsOptionsSchema.optional(), - preview: z - .object({ - defaultExpiresInSeconds: z.number().positive().default(3600), - maxExpiresInSeconds: z.number().positive().default(86400), - }) - .strict() - .prefault(() => ({})), - onBeforeConnect: zFunction().optional(), - onSessionEvent: zFunction().optional(), - onPermissionRequest: zFunction().optional(), - }) - .strict(); - -// --- Typed config types (generic callbacks overlaid on the Zod schema) --- - -type AgentOsActorContext = ActorContext< - AgentOsActorState, - TConnParams, - undefined, - AgentOsActorVars, - undefined, - any ->; - -interface AgentOsActorConfigCallbacks { - onBeforeConnect?: ( - c: BeforeConnectContext< - AgentOsActorState, - AgentOsActorVars, - undefined, - any - >, - params: TConnParams, - ) => void | Promise; - onSessionEvent?: ( - c: AgentOsActorContext, - sessionId: string, - event: JsonRpcNotification, - ) => void | Promise; - onPermissionRequest?: ( - c: AgentOsActorContext, - sessionId: string, - request: PermissionRequest, - ) => void | Promise; -} - -// Parsed config (after Zod defaults/transforms applied). -export type AgentOsActorConfig = Omit< - z.infer, - "onBeforeConnect" | "onSessionEvent" | "onPermissionRequest" -> & - AgentOsActorConfigCallbacks; - -// Input config (what users pass in before Zod transforms). -export type AgentOsActorConfigInput = Omit< - z.input, - "onBeforeConnect" | "onSessionEvent" | "onPermissionRequest" -> & - AgentOsActorConfigCallbacks; diff --git a/rivetkit-typescript/packages/rivetkit/src/agent-os/fs/database-vfs.ts b/rivetkit-typescript/packages/rivetkit/src/agent-os/fs/database-vfs.ts deleted file mode 100644 index 4ad96621fb..0000000000 --- a/rivetkit-typescript/packages/rivetkit/src/agent-os/fs/database-vfs.ts +++ /dev/null @@ -1,624 +0,0 @@ -/** - * SQLite-backed VirtualFileSystem implementation. - * - * Stores file content, metadata (mode, timestamps), and directory structure - * in SQLite tables managed by the RivetKit actor's database. This allows VM - * filesystem state to persist across sleep/wake cycles. - * - * We use SQLite instead of actor KV because SQLite handles bulk write - * optimizations (transactions, WAL mode, page caching) under the hood. With KV - * we would need to manually chunk writes to stay under batch size limits, - * implement our own indexing for directory listing queries, and handle - * consistency across multiple KV operations. SQLite gives us all of this for - * free. - * - * All paths are normalized to POSIX form (forward slashes, rooted at "/"). - */ - -import * as posixPath from "node:path/posix"; -import type { RawAccess } from "@/common/database/config"; - -// Infer VirtualFileSystem from PlainMountConfig.driver since -// @secure-exec/core is not a direct dependency of this package. -type VirtualFileSystem = - import("@rivet-dev/agent-os-core").PlainMountConfig["driver"]; - -// Infer VirtualStat from AgentOs.stat() return type. -type VirtualStat = Awaited< - ReturnType ->; - -// Infer VirtualDirEntry from readDirWithTypes. -// VirtualDirEntry has: name, isDirectory, isSymbolicLink?, ino? -interface VirtualDirEntry { - name: string; - isDirectory: boolean; - isSymbolicLink?: boolean; - ino?: number; -} - -// POSIX mode constants. -const S_IFDIR = 0o040000; -const S_IFREG = 0o100000; -const S_IFLNK = 0o120000; -const DEFAULT_FILE_MODE = S_IFREG | 0o644; -const DEFAULT_DIR_MODE = S_IFDIR | 0o755; - -interface FsRow extends Record { - path: string; - is_directory: number; - content: Uint8Array | null; - mode: number; - uid: number; - gid: number; - size: number; - atime_ms: number; - mtime_ms: number; - ctime_ms: number; - birthtime_ms: number; - symlink_target: string | null; - nlink: number; -} - -function normPath(p: string): string { - const normalized = posixPath.normalize(`/${p}`); - // Remove trailing slash unless it's the root. - if (normalized.length > 1 && normalized.endsWith("/")) { - return normalized.slice(0, -1); - } - return normalized; -} - -function parentPath(p: string): string { - const parent = posixPath.dirname(p); - return parent; -} - -function throwENOENT(path: string): never { - const err = new Error(`ENOENT: no such file or directory: ${path}`); - err.name = "ENOENT"; - throw err; -} - -function throwEEXIST(path: string): never { - const err = new Error(`EEXIST: file already exists: ${path}`); - err.name = "EEXIST"; - throw err; -} - -function throwENOTDIR(path: string): never { - const err = new Error(`ENOTDIR: not a directory: ${path}`); - err.name = "ENOTDIR"; - throw err; -} - -function throwEISDIR(path: string): never { - const err = new Error(`EISDIR: illegal operation on a directory: ${path}`); - err.name = "EISDIR"; - throw err; -} - -function throwENOTEMPTY(path: string): never { - const err = new Error(`ENOTEMPTY: directory not empty: ${path}`); - err.name = "ENOTEMPTY"; - throw err; -} - -function throwENOSYS(op: string): never { - const err = new Error(`ENOSYS: function not implemented: ${op}`); - err.name = "ENOSYS"; - throw err; -} - -function rowToStat(row: FsRow): VirtualStat { - return { - mode: row.mode, - size: row.size, - isDirectory: row.is_directory === 1, - isSymbolicLink: row.symlink_target !== null, - atimeMs: row.atime_ms, - mtimeMs: row.mtime_ms, - ctimeMs: row.ctime_ms, - birthtimeMs: row.birthtime_ms, - ino: 0, - nlink: row.nlink, - uid: row.uid, - gid: row.gid, - }; -} - -export interface DatabaseVfsOptions { - /** The RawAccess database handle from the actor's db provider. */ - db: RawAccess; -} - -/** - * Create a VirtualFileSystem backed by SQLite. - * - * The returned filesystem stores all content and metadata in the - * `agent_os_fs_entries` table. The table must be created beforehand - * via `migrateAgentOsTables()`. - */ -export function createDatabaseVfs( - options: DatabaseVfsOptions, -): VirtualFileSystem { - const { db } = options; - - async function getEntry(path: string): Promise { - const rows = await db.execute( - "SELECT * FROM agent_os_fs_entries WHERE path = ?", - path, - ); - return rows[0]; - } - - async function getEntryOrThrow(path: string): Promise { - const entry = await getEntry(path); - if (!entry) { - throwENOENT(path); - } - return entry; - } - - async function ensureParentExists(path: string): Promise { - const parent = parentPath(path); - if (parent === path) return; // root - const entry = await getEntry(parent); - if (!entry) { - throwENOENT(parent); - } - if (entry.is_directory !== 1) { - throwENOTDIR(parent); - } - } - - async function getChildEntries(dirPath: string): Promise { - // Find direct children by matching paths that are one level deeper. - // A direct child of "/foo" has path like "/foo/bar" but NOT "/foo/bar/baz". - const prefix = dirPath === "/" ? "/" : `${dirPath}/`; - const rows = await db.execute( - "SELECT * FROM agent_os_fs_entries WHERE path LIKE ? AND path != ?", - `${prefix}%`, - dirPath, - ); - // Filter to direct children only. - return rows.filter((row) => { - const relative = row.path.slice(prefix.length); - return relative.length > 0 && !relative.includes("/"); - }); - } - - // Ensure root directory exists. - const rootInit = (async () => { - const root = await getEntry("/"); - if (!root) { - const now = Date.now(); - await db.execute( - `INSERT OR IGNORE INTO agent_os_fs_entries (path, is_directory, content, mode, uid, gid, size, atime_ms, mtime_ms, ctime_ms, birthtime_ms, symlink_target, nlink) VALUES (?, 1, NULL, ?, 0, 0, 0, ?, ?, ?, ?, NULL, 2)`, - "/", - DEFAULT_DIR_MODE, - now, - now, - now, - now, - ); - } - })(); - - const backend: VirtualFileSystem = { - async readFile(p: string): Promise { - await rootInit; - const path = normPath(p); - const entry = await getEntryOrThrow(path); - if (entry.is_directory === 1) { - throwEISDIR(path); - } - return entry.content ?? new Uint8Array(0); - }, - - async readTextFile(p: string): Promise { - const data = await backend.readFile(p); - return new TextDecoder().decode(data); - }, - - async readDir(p: string): Promise { - await rootInit; - const path = normPath(p); - const entry = await getEntryOrThrow(path); - if (entry.is_directory !== 1) { - throwENOTDIR(path); - } - const children = await getChildEntries(path); - return children.map((child) => posixPath.basename(child.path)); - }, - - async readDirWithTypes(p: string): Promise { - await rootInit; - const path = normPath(p); - const entry = await getEntryOrThrow(path); - if (entry.is_directory !== 1) { - throwENOTDIR(path); - } - const children = await getChildEntries(path); - return children.map((child) => ({ - name: posixPath.basename(child.path), - isDirectory: child.is_directory === 1, - isSymbolicLink: child.symlink_target !== null, - ino: 0, - })); - }, - - async writeFile( - p: string, - content: string | Uint8Array, - ): Promise { - await rootInit; - const path = normPath(p); - await ensureParentExists(path); - - const existing = await getEntry(path); - if (existing && existing.is_directory === 1) { - throwEISDIR(path); - } - - const data = - typeof content === "string" - ? new TextEncoder().encode(content) - : content; - const now = Date.now(); - - if (existing) { - await db.execute( - `UPDATE agent_os_fs_entries SET content = ?, size = ?, mtime_ms = ?, ctime_ms = ?, atime_ms = ? WHERE path = ?`, - data, - data.byteLength, - now, - now, - now, - path, - ); - } else { - await db.execute( - `INSERT INTO agent_os_fs_entries (path, is_directory, content, mode, uid, gid, size, atime_ms, mtime_ms, ctime_ms, birthtime_ms, symlink_target, nlink) VALUES (?, 0, ?, ?, 0, 0, ?, ?, ?, ?, ?, NULL, 1)`, - path, - data, - DEFAULT_FILE_MODE, - data.byteLength, - now, - now, - now, - now, - ); - } - }, - - async createDir(p: string): Promise { - await rootInit; - const path = normPath(p); - await ensureParentExists(path); - - const existing = await getEntry(path); - if (existing) { - throwEEXIST(path); - } - - const now = Date.now(); - await db.execute( - `INSERT INTO agent_os_fs_entries (path, is_directory, content, mode, uid, gid, size, atime_ms, mtime_ms, ctime_ms, birthtime_ms, symlink_target, nlink) VALUES (?, 1, NULL, ?, 0, 0, 0, ?, ?, ?, ?, NULL, 2)`, - path, - DEFAULT_DIR_MODE, - now, - now, - now, - now, - ); - }, - - async mkdir( - p: string, - options?: { recursive?: boolean }, - ): Promise { - await rootInit; - const path = normPath(p); - - if (options?.recursive) { - const parts = path.split("/").filter(Boolean); - let current = ""; - for (const part of parts) { - current += `/${part}`; - const existing = await getEntry(current); - if (!existing) { - const now = Date.now(); - await db.execute( - `INSERT INTO agent_os_fs_entries (path, is_directory, content, mode, uid, gid, size, atime_ms, mtime_ms, ctime_ms, birthtime_ms, symlink_target, nlink) VALUES (?, 1, NULL, ?, 0, 0, 0, ?, ?, ?, ?, NULL, 2)`, - current, - DEFAULT_DIR_MODE, - now, - now, - now, - now, - ); - } else if (existing.is_directory !== 1) { - throwENOTDIR(current); - } - } - } else { - await backend.createDir(p); - } - }, - - async exists(p: string): Promise { - await rootInit; - const path = normPath(p); - const entry = await getEntry(path); - return entry !== undefined; - }, - - async stat(p: string): Promise { - await rootInit; - const path = normPath(p); - const entry = await getEntryOrThrow(path); - return rowToStat(entry); - }, - - async removeFile(p: string): Promise { - await rootInit; - const path = normPath(p); - const entry = await getEntryOrThrow(path); - if (entry.is_directory === 1) { - throwEISDIR(path); - } - await db.execute( - "DELETE FROM agent_os_fs_entries WHERE path = ?", - path, - ); - }, - - async removeDir(p: string): Promise { - await rootInit; - const path = normPath(p); - const entry = await getEntryOrThrow(path); - if (entry.is_directory !== 1) { - throwENOTDIR(path); - } - const children = await getChildEntries(path); - if (children.length > 0) { - throwENOTEMPTY(path); - } - await db.execute( - "DELETE FROM agent_os_fs_entries WHERE path = ?", - path, - ); - }, - - async rename(oldPath: string, newPath: string): Promise { - await rootInit; - const from = normPath(oldPath); - const to = normPath(newPath); - - const entry = await getEntryOrThrow(from); - await ensureParentExists(to); - - // Remove destination if it exists (overwrite semantics). - const destEntry = await getEntry(to); - if (destEntry) { - if (destEntry.is_directory === 1) { - const children = await getChildEntries(to); - if (children.length > 0) { - throwENOTEMPTY(to); - } - } - await db.execute( - "DELETE FROM agent_os_fs_entries WHERE path = ?", - to, - ); - } - - if (entry.is_directory === 1) { - // Move all descendants by updating path prefixes. - const prefix = from === "/" ? "/" : `${from}/`; - const newPrefix = to === "/" ? "/" : `${to}/`; - - // Get all descendants first, then update them. - const descendants = await db.execute( - "SELECT path FROM agent_os_fs_entries WHERE path LIKE ?", - `${prefix}%`, - ); - - for (const desc of descendants) { - const newDescPath = - newPrefix + desc.path.slice(prefix.length); - await db.execute( - "UPDATE agent_os_fs_entries SET path = ? WHERE path = ?", - newDescPath, - desc.path, - ); - } - } - - // Update the entry itself. - const now = Date.now(); - await db.execute( - "UPDATE agent_os_fs_entries SET path = ?, ctime_ms = ? WHERE path = ?", - to, - now, - from, - ); - }, - - async realpath(p: string): Promise { - await rootInit; - const path = normPath(p); - const entry = await getEntryOrThrow(path); - if (entry.symlink_target !== null) { - return normPath(entry.symlink_target); - } - return path; - }, - - async symlink(target: string, linkPath: string): Promise { - await rootInit; - const link = normPath(linkPath); - await ensureParentExists(link); - - const existing = await getEntry(link); - if (existing) { - throwEEXIST(link); - } - - const now = Date.now(); - await db.execute( - `INSERT INTO agent_os_fs_entries (path, is_directory, content, mode, uid, gid, size, atime_ms, mtime_ms, ctime_ms, birthtime_ms, symlink_target, nlink) VALUES (?, 0, NULL, ?, 0, 0, ?, ?, ?, ?, ?, ?, 1)`, - link, - S_IFLNK | 0o777, - target.length, - now, - now, - now, - now, - target, - ); - }, - - async readlink(p: string): Promise { - await rootInit; - const path = normPath(p); - const entry = await getEntryOrThrow(path); - if (entry.symlink_target === null) { - const err = new Error(`EINVAL: not a symlink: ${path}`); - err.name = "EINVAL"; - throw err; - } - return entry.symlink_target; - }, - - async lstat(p: string): Promise { - // lstat does not follow symlinks; same as stat for our storage model. - return backend.stat(p); - }, - - async link(_oldPath: string, _newPath: string): Promise { - throwENOSYS("link"); - }, - - async chmod(p: string, mode: number): Promise { - await rootInit; - const path = normPath(p); - await getEntryOrThrow(path); - const now = Date.now(); - await db.execute( - "UPDATE agent_os_fs_entries SET mode = ?, ctime_ms = ? WHERE path = ?", - mode, - now, - path, - ); - }, - - async chown(p: string, uid: number, gid: number): Promise { - await rootInit; - const path = normPath(p); - await getEntryOrThrow(path); - const now = Date.now(); - await db.execute( - "UPDATE agent_os_fs_entries SET uid = ?, gid = ?, ctime_ms = ? WHERE path = ?", - uid, - gid, - now, - path, - ); - }, - - async utimes(p: string, atime: number, mtime: number): Promise { - await rootInit; - const path = normPath(p); - await getEntryOrThrow(path); - const now = Date.now(); - await db.execute( - "UPDATE agent_os_fs_entries SET atime_ms = ?, mtime_ms = ?, ctime_ms = ? WHERE path = ?", - atime, - mtime, - now, - path, - ); - }, - - async truncate(p: string, length: number): Promise { - await rootInit; - const path = normPath(p); - const entry = await getEntryOrThrow(path); - if (entry.is_directory === 1) { - throwEISDIR(path); - } - - const existing = entry.content ?? new Uint8Array(0); - let newContent: Uint8Array; - if (length >= existing.byteLength) { - // Extend with zeros. - newContent = new Uint8Array(length); - newContent.set(existing); - } else { - // Truncate. - newContent = existing.slice(0, length); - } - - const now = Date.now(); - await db.execute( - "UPDATE agent_os_fs_entries SET content = ?, size = ?, mtime_ms = ?, ctime_ms = ? WHERE path = ?", - newContent, - length, - now, - now, - path, - ); - }, - - async pread( - p: string, - offset: number, - length: number, - ): Promise { - await rootInit; - const path = normPath(p); - const entry = await getEntryOrThrow(path); - if (entry.is_directory === 1) { - throwEISDIR(path); - } - const content = entry.content ?? new Uint8Array(0); - const end = Math.min(offset + length, content.byteLength); - if (offset >= content.byteLength) { - return new Uint8Array(0); - } - return content.slice(offset, end); - }, - - async pwrite( - p: string, - offset: number, - data: Uint8Array, - ): Promise { - await rootInit; - const path = normPath(p); - const entry = await getEntryOrThrow(path); - if (entry.is_directory === 1) { - throwEISDIR(path); - } - const content = entry.content ?? new Uint8Array(0); - const end = offset + data.byteLength; - const newSize = Math.max(content.byteLength, end); - const buf = new Uint8Array(newSize); - buf.set(content); - buf.set(data, offset); - const now = Date.now(); - await db.execute( - `UPDATE agent_os_fs_entries SET content = ?, size = ?, mtime_ms = ?, ctime_ms = ? WHERE path = ?`, - buf, - newSize, - now, - now, - path, - ); - }, - }; - - return backend; -} diff --git a/rivetkit-typescript/packages/rivetkit/src/agent-os/index.ts b/rivetkit-typescript/packages/rivetkit/src/agent-os/index.ts index 6e2023359b..fd48c890ba 100644 --- a/rivetkit-typescript/packages/rivetkit/src/agent-os/index.ts +++ b/rivetkit-typescript/packages/rivetkit/src/agent-os/index.ts @@ -1,65 +1,5 @@ -// Database migration - -// Cron actions -export { buildCronActions } from "./actor/cron"; -export { migrateAgentOsTables } from "./actor/db"; -// Filesystem actions -export { buildFilesystemActions } from "./actor/filesystem"; -// Actor factory and VM lifecycle helpers -export { agentOs, ensureVm, runHook, syncPreventSleep } from "./actor/index"; -// Network actions -export { - buildNetworkActions, - type VmFetchOptions, - type VmFetchResult, -} from "./actor/network"; -// Preview actions -export { - buildOnRequestHandler, - buildPreviewActions, - generateToken, -} from "./actor/preview"; -// Process actions -export { buildProcessActions } from "./actor/process"; -// Session actions -export { - buildConfigActions, - buildPromptActions, - buildSessionActions, - buildSessionPersistenceActions, - subscribeToSession, -} from "./actor/session"; -// Shell actions -export { buildShellActions } from "./actor/shell"; -// Config schema and types -export { - type AgentOsActorConfig, - type AgentOsActorConfigInput, - agentOsActorConfigSchema, -} from "./config"; -// Database-backed VFS -export { - createDatabaseVfs, - type DatabaseVfsOptions, -} from "./fs/database-vfs"; -// Domain types and event payloads -export type { - AgentOsActionContext, - AgentOsActorState, - AgentOsActorVars, - AgentOsEvents, - CronEventPayload, - PermissionRequestPayload, - PersistedSessionEvent, - PersistedSessionRecord, - ProcessExitPayload, - ProcessOutputPayload, - PromptResult, - SerializableCronAction, - SerializableCronJobOptions, - SessionEventPayload, - SessionRecord, - ShellDataPayload, - VmBootedPayload, - VmShutdownPayload, -} from "./types"; +// agentOS no longer ships inside RivetKit. This entrypoint remains so existing +// imports fail with migration guidance instead of a missing-module error. +throw new Error( + "rivetkit/agent-os has been removed. Use @rivet-dev/agentos-core to run agentOS VMs in your process, or hosted agentOS with @rivet-dev/agentos. See https://rivet.dev/agentos/docs", +); diff --git a/rivetkit-typescript/packages/rivetkit/src/agent-os/types.ts b/rivetkit-typescript/packages/rivetkit/src/agent-os/types.ts deleted file mode 100644 index 5b5b943865..0000000000 --- a/rivetkit-typescript/packages/rivetkit/src/agent-os/types.ts +++ /dev/null @@ -1,148 +0,0 @@ -import type { - AgentCapabilities, - AgentInfo, - AgentOs, - CronEvent, - JsonRpcNotification, - JsonRpcResponse, - PermissionRequest, -} from "@rivet-dev/agent-os-core"; -import type { ActionContext } from "@/actor/config"; - -// --- Actor state (persisted across sleep/wake) --- - -// biome-ignore lint/complexity/noBannedTypes: empty state placeholder, consumers extend via generics -export type AgentOsActorState = {}; - -// --- Actor vars (ephemeral, recreated on wake) --- - -export interface AgentOsActorVars { - agentOs: AgentOs | null; - activeSessionIds: Set; - activeProcesses: Set; - activeHooks: Set>; - activeShells: Set; - sessions: Set; -} - -// --- Event payloads --- - -export interface SessionEventPayload { - sessionId: string; - event: JsonRpcNotification; -} - -export interface PermissionRequestPayload { - sessionId: string; - request: PermissionRequest; -} - -export type VmBootedPayload = Record; - -export interface VmShutdownPayload { - reason: "sleep" | "destroy" | "error"; -} - -export interface ProcessOutputPayload { - pid: number; - stream: "stdout" | "stderr"; - data: Uint8Array; -} - -export interface ProcessExitPayload { - pid: number; - exitCode: number; -} - -export interface ShellDataPayload { - shellId: string; - data: Uint8Array; -} - -export interface CronEventPayload { - event: CronEvent; -} - -// --- Event schema map (used by actor() events config) --- - -export interface AgentOsEvents { - sessionEvent: SessionEventPayload; - permissionRequest: PermissionRequestPayload; - vmBooted: VmBootedPayload; - vmShutdown: VmShutdownPayload; - processOutput: ProcessOutputPayload; - processExit: ProcessExitPayload; - shellData: ShellDataPayload; - cronEvent: CronEventPayload; -} - -// --- Prompt result --- - -/** Result from sendPrompt. */ -export interface PromptResult { - /** Raw JSON-RPC response from the ACP adapter. */ - response: JsonRpcResponse; - /** Accumulated agent text output from streamed message chunks. */ - text: string; -} - -// --- Session serialization --- - -export interface SessionRecord { - sessionId: string; - agentType: string; - capabilities: AgentCapabilities; - agentInfo: AgentInfo | null; -} - -// --- Persisted session types --- - -export interface PersistedSessionRecord { - sessionId: string; - agentType: string; - capabilities: AgentCapabilities; - agentInfo: AgentInfo | null; - createdAt: number; -} - -export interface PersistedSessionEvent { - sessionId: string; - seq: number; - event: JsonRpcNotification; - createdAt: number; -} - -// --- Serializable cron action (excludes callback type) --- - -export type SerializableCronAction = - | { type: "session"; agentType: string; prompt: string; cwd?: string } - | { type: "exec"; command: string; args?: string[] }; - -export interface SerializableCronJobOptions { - id?: string; - schedule: string; - action: SerializableCronAction; - overlap?: "allow" | "skip" | "queue"; -} - -export interface SerializableCronJobInfo { - id: string; - schedule: string; - action: SerializableCronAction; - overlap: "allow" | "skip" | "queue"; - lastRun?: string; - nextRun?: string; - runCount: number; - running: boolean; -} - -// --- Action context alias --- - -export type AgentOsActionContext = ActionContext< - AgentOsActorState, - TConnParams, - undefined, - AgentOsActorVars, - undefined, - any ->; diff --git a/rivetkit-typescript/packages/rivetkit/tests/driver/actor-agent-os.test.ts b/rivetkit-typescript/packages/rivetkit/tests/driver/actor-agent-os.test.ts deleted file mode 100644 index 68d81e9d1e..0000000000 --- a/rivetkit-typescript/packages/rivetkit/tests/driver/actor-agent-os.test.ts +++ /dev/null @@ -1,306 +0,0 @@ -import { createRequire } from "node:module"; -import { describe, expect, test } from "vitest"; -import { describeDriverMatrix } from "./shared-matrix"; -import { setupDriverTest } from "./shared-utils"; - -const require = createRequire(import.meta.url); -const hasAgentOsCore = (() => { - try { - require.resolve("@rivet-dev/agent-os-core"); - return true; - } catch { - return false; - } -})(); - -describeDriverMatrix("Actor Agent Os", (driverTestConfig) => { - describe.skipIf(driverTestConfig.skip?.agentOs || !hasAgentOsCore)( - "Actor agentOS Tests", - () => { - // --- Filesystem --- - - test("writeFile and readFile round-trip", async (c) => { - const { client } = await setupDriverTest(c, { - ...driverTestConfig, - useRealTimers: true, - }); - const actor = client.agentOsTestActor.getOrCreate([ - `fs-${crypto.randomUUID()}`, - ]); - - await actor.writeFile("/home/user/hello.txt", "hello world"); - const data = await actor.readFile("/home/user/hello.txt"); - expect(new TextDecoder().decode(data)).toBe("hello world"); - }, 60_000); - - test("mkdir and readdir", async (c) => { - const { client } = await setupDriverTest(c, { - ...driverTestConfig, - useRealTimers: true, - }); - const actor = client.agentOsTestActor.getOrCreate([ - `dir-${crypto.randomUUID()}`, - ]); - - await actor.mkdir("/home/user/subdir"); - await actor.writeFile("/home/user/subdir/a.txt", "a"); - await actor.writeFile("/home/user/subdir/b.txt", "b"); - const entries = await actor.readdir("/home/user/subdir"); - const filtered = entries.filter( - (e: string) => e !== "." && e !== "..", - ); - expect(filtered.sort()).toEqual(["a.txt", "b.txt"]); - }, 60_000); - - test("stat returns file metadata", async (c) => { - const { client } = await setupDriverTest(c, { - ...driverTestConfig, - useRealTimers: true, - }); - const actor = client.agentOsTestActor.getOrCreate([ - `stat-${crypto.randomUUID()}`, - ]); - - await actor.writeFile("/home/user/stat-test.txt", "content"); - const s = await actor.stat("/home/user/stat-test.txt"); - expect(s.isDirectory).toBe(false); - expect(s.size).toBe(7); - }, 60_000); - - test("exists returns true for existing file", async (c) => { - const { client } = await setupDriverTest(c, { - ...driverTestConfig, - useRealTimers: true, - }); - const actor = client.agentOsTestActor.getOrCreate([ - `exists-${crypto.randomUUID()}`, - ]); - - await actor.writeFile("/home/user/exists.txt", "x"); - expect(await actor.exists("/home/user/exists.txt")).toBe(true); - expect(await actor.exists("/home/user/nope.txt")).toBe(false); - }, 60_000); - - test("move renames a file", async (c) => { - const { client } = await setupDriverTest(c, { - ...driverTestConfig, - useRealTimers: true, - }); - const actor = client.agentOsTestActor.getOrCreate([ - `move-${crypto.randomUUID()}`, - ]); - - await actor.writeFile("/home/user/old.txt", "data"); - await actor.move("/home/user/old.txt", "/home/user/new.txt"); - expect(await actor.exists("/home/user/old.txt")).toBe(false); - expect(await actor.exists("/home/user/new.txt")).toBe(true); - }, 60_000); - - test("deleteFile removes a file", async (c) => { - const { client } = await setupDriverTest(c, { - ...driverTestConfig, - useRealTimers: true, - }); - const actor = client.agentOsTestActor.getOrCreate([ - `del-${crypto.randomUUID()}`, - ]); - - await actor.writeFile("/home/user/todelete.txt", "gone"); - await actor.deleteFile("/home/user/todelete.txt"); - expect(await actor.exists("/home/user/todelete.txt")).toBe( - false, - ); - }, 60_000); - - test("writeFiles and readFiles batch operations", async (c) => { - const { client } = await setupDriverTest(c, { - ...driverTestConfig, - useRealTimers: true, - }); - const actor = client.agentOsTestActor.getOrCreate([ - `batch-${crypto.randomUUID()}`, - ]); - - const writeResults = await actor.writeFiles([ - { path: "/home/user/batch-a.txt", content: "aaa" }, - { path: "/home/user/batch-b.txt", content: "bbb" }, - ]); - expect(writeResults.every((r: any) => r.success)).toBe(true); - - const readResults = await actor.readFiles([ - "/home/user/batch-a.txt", - "/home/user/batch-b.txt", - ]); - expect(new TextDecoder().decode(readResults[0].content)).toBe( - "aaa", - ); - expect(new TextDecoder().decode(readResults[1].content)).toBe( - "bbb", - ); - }, 60_000); - - test("readdirRecursive lists nested files", async (c) => { - const { client } = await setupDriverTest(c, { - ...driverTestConfig, - useRealTimers: true, - }); - const actor = client.agentOsTestActor.getOrCreate([ - `recursive-${crypto.randomUUID()}`, - ]); - - await actor.mkdir("/home/user/rdir"); - await actor.mkdir("/home/user/rdir/sub"); - await actor.writeFile("/home/user/rdir/top.txt", "t"); - await actor.writeFile("/home/user/rdir/sub/deep.txt", "d"); - const entries = await actor.readdirRecursive("/home/user/rdir"); - const paths = entries.map((e: any) => e.path); - expect(paths).toContain("/home/user/rdir/top.txt"); - expect(paths).toContain("/home/user/rdir/sub"); - expect(paths).toContain("/home/user/rdir/sub/deep.txt"); - }, 60_000); - - // --- Process execution --- - - test("exec runs a command and returns output", async (c) => { - const { client } = await setupDriverTest(c, { - ...driverTestConfig, - useRealTimers: true, - }); - const actor = client.agentOsTestActor.getOrCreate([ - `exec-${crypto.randomUUID()}`, - ]); - - const result = await actor.exec("echo hello"); - expect(result.exitCode).toBe(0); - expect(result.stdout.trim()).toBe("hello"); - }, 60_000); - - test("spawn and waitProcess", async (c) => { - const { client } = await setupDriverTest(c, { - ...driverTestConfig, - useRealTimers: true, - }); - const actor = client.agentOsTestActor.getOrCreate([ - `spawn-${crypto.randomUUID()}`, - ]); - - // Write a script that exits with code 42. - await actor.writeFile("/tmp/exit42.js", "process.exit(42);"); - - const { pid } = await actor.spawn("node", ["/tmp/exit42.js"]); - expect(typeof pid).toBe("number"); - - const exitCode = await actor.waitProcess(pid); - expect(exitCode).toBe(42); - }, 60_000); - - test("listProcesses returns spawned processes", async (c) => { - const { client } = await setupDriverTest(c, { - ...driverTestConfig, - useRealTimers: true, - }); - const actor = client.agentOsTestActor.getOrCreate([ - `list-proc-${crypto.randomUUID()}`, - ]); - - // Write a long-running script. - await actor.writeFile( - "/tmp/long.js", - "setTimeout(() => {}, 30000);", - ); - - const { pid } = await actor.spawn("node", ["/tmp/long.js"]); - const procs = await actor.listProcesses(); - expect(procs.some((p: any) => p.pid === pid)).toBe(true); - - await actor.killProcess(pid); - }, 60_000); - - test("killProcess terminates a running process", async (c) => { - const { client } = await setupDriverTest(c, { - ...driverTestConfig, - useRealTimers: true, - }); - const actor = client.agentOsTestActor.getOrCreate([ - `kill-${crypto.randomUUID()}`, - ]); - - await actor.writeFile( - "/tmp/hang.js", - "setTimeout(() => {}, 60000);", - ); - - const { pid } = await actor.spawn("node", ["/tmp/hang.js"]); - await actor.killProcess(pid); - const exitCode = await actor.waitProcess(pid); - // SIGKILL results in non-zero exit code. - expect(exitCode).not.toBe(0); - }, 60_000); - - // --- Network --- - - test("vmFetch proxies request to VM service", async (c) => { - const { client } = await setupDriverTest(c, { - ...driverTestConfig, - useRealTimers: true, - }); - const actor = client.agentOsTestActor.getOrCreate([ - `fetch-${crypto.randomUUID()}`, - ]); - - // Write and spawn a simple HTTP server inside the VM. - await actor.writeFile( - "/tmp/server.js", - ` -const http = require("http"); -const server = http.createServer((req, res) => { - res.writeHead(200, { "Content-Type": "text/plain" }); - res.end("vm-response"); -}); -server.listen(9876, "127.0.0.1", () => { - console.log("listening"); -}); -`, - ); - await actor.spawn("node", ["/tmp/server.js"]); - - // Wait for server to start. - await new Promise((r) => setTimeout(r, 2000)); - - const result = await actor.vmFetch( - 9876, - "http://127.0.0.1:9876/test", - ); - expect(result.status).toBe(200); - expect(new TextDecoder().decode(result.body)).toBe( - "vm-response", - ); - }, 60_000); - - // --- Cron --- - - test("scheduleCron and listCronJobs", async (c) => { - const { client } = await setupDriverTest(c, { - ...driverTestConfig, - useRealTimers: true, - }); - const actor = client.agentOsTestActor.getOrCreate([ - `cron-${crypto.randomUUID()}`, - ]); - - const { id } = await actor.scheduleCron({ - schedule: "* * * * *", - action: { type: "exec", command: "echo cron-tick" }, - }); - expect(typeof id).toBe("string"); - - const jobs = await actor.listCronJobs(); - expect(jobs.some((j: any) => j.id === id)).toBe(true); - - await actor.cancelCronJob(id); - const jobsAfter = await actor.listCronJobs(); - expect(jobsAfter.some((j: any) => j.id === id)).toBe(false); - }, 60_000); - }, - ); -}); diff --git a/rivetkit-typescript/packages/rivetkit/tsup.config.ts b/rivetkit-typescript/packages/rivetkit/tsup.config.ts index 2e22dd42ab..bc2a55f257 100644 --- a/rivetkit-typescript/packages/rivetkit/tsup.config.ts +++ b/rivetkit-typescript/packages/rivetkit/tsup.config.ts @@ -19,7 +19,6 @@ export default defineConfig({ "@rivetkit/traces/encoding", "@rivetkit/traces/otlp", "@rivetkit/workflow-engine", - "@rivet-dev/agent-os-core", ]; }, define: { diff --git a/scripts/publish/src/lib/packages.ts b/scripts/publish/src/lib/packages.ts index cc2aa797d0..99d608d301 100644 --- a/scripts/publish/src/lib/packages.ts +++ b/scripts/publish/src/lib/packages.ts @@ -47,8 +47,6 @@ export const EXCLUDED = new Set([ "@rivetkit/engine-frontend", "@rivetkit/sqlite-native", "@rivetkit/sqlite-wasm", - "example-agent-os", - "example-agent-os-e2e", ]); /**