From 6f22fda439dfdedaba4b8a003ead1bbaee9f885f Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 26 Jun 2026 12:58:44 -0600 Subject: [PATCH] feat(provider): add agent environment provider adapters --- .changeset/provider-environment-contract.md | 11 + README.md | 10 +- packages/agent-interface/README.md | 38 +- packages/agent-interface/package.json | 9 + .../src/environment-provider.ts | 233 ++ packages/agent-interface/src/index.ts | 1 + packages/agent-provider-cli-bridge/LICENSE | 21 + packages/agent-provider-cli-bridge/README.md | 13 + .../agent-provider-cli-bridge/package.json | 54 + .../src/index.test.ts | 45 + .../agent-provider-cli-bridge/src/index.ts | 273 +++ .../agent-provider-cli-bridge/tsconfig.json | 15 + packages/agent-provider-computesdk/LICENSE | 21 + packages/agent-provider-computesdk/README.md | 13 + .../agent-provider-computesdk/package.json | 63 + .../src/index.test.ts | 45 + .../agent-provider-computesdk/src/index.ts | 249 ++ .../agent-provider-computesdk/tsconfig.json | 15 + packages/agent-provider-daytona/LICENSE | 21 + packages/agent-provider-daytona/README.md | 11 + packages/agent-provider-daytona/package.json | 63 + .../agent-provider-daytona/src/index.test.ts | 42 + packages/agent-provider-daytona/src/index.ts | 265 +++ packages/agent-provider-daytona/tsconfig.json | 15 + packages/agent-provider-e2b/LICENSE | 21 + packages/agent-provider-e2b/README.md | 11 + packages/agent-provider-e2b/package.json | 63 + packages/agent-provider-e2b/src/index.test.ts | 42 + packages/agent-provider-e2b/src/index.ts | 196 ++ packages/agent-provider-e2b/tsconfig.json | 15 + packages/agent-provider-sandbox/LICENSE | 21 + packages/agent-provider-sandbox/README.md | 12 + packages/agent-provider-sandbox/package.json | 64 + .../agent-provider-sandbox/src/index.test.ts | 61 + packages/agent-provider-sandbox/src/index.ts | 430 ++++ packages/agent-provider-sandbox/tsconfig.json | 15 + packages/agent-provider-testkit/LICENSE | 21 + packages/agent-provider-testkit/README.md | 15 + packages/agent-provider-testkit/package.json | 54 + .../agent-provider-testkit/src/index.test.ts | 76 + packages/agent-provider-testkit/src/index.ts | 149 ++ packages/agent-provider-testkit/tsconfig.json | 15 + pnpm-lock.yaml | 2020 ++++++++++++++++- 43 files changed, 4836 insertions(+), 11 deletions(-) create mode 100644 .changeset/provider-environment-contract.md create mode 100644 packages/agent-interface/src/environment-provider.ts create mode 100644 packages/agent-provider-cli-bridge/LICENSE create mode 100644 packages/agent-provider-cli-bridge/README.md create mode 100644 packages/agent-provider-cli-bridge/package.json create mode 100644 packages/agent-provider-cli-bridge/src/index.test.ts create mode 100644 packages/agent-provider-cli-bridge/src/index.ts create mode 100644 packages/agent-provider-cli-bridge/tsconfig.json create mode 100644 packages/agent-provider-computesdk/LICENSE create mode 100644 packages/agent-provider-computesdk/README.md create mode 100644 packages/agent-provider-computesdk/package.json create mode 100644 packages/agent-provider-computesdk/src/index.test.ts create mode 100644 packages/agent-provider-computesdk/src/index.ts create mode 100644 packages/agent-provider-computesdk/tsconfig.json create mode 100644 packages/agent-provider-daytona/LICENSE create mode 100644 packages/agent-provider-daytona/README.md create mode 100644 packages/agent-provider-daytona/package.json create mode 100644 packages/agent-provider-daytona/src/index.test.ts create mode 100644 packages/agent-provider-daytona/src/index.ts create mode 100644 packages/agent-provider-daytona/tsconfig.json create mode 100644 packages/agent-provider-e2b/LICENSE create mode 100644 packages/agent-provider-e2b/README.md create mode 100644 packages/agent-provider-e2b/package.json create mode 100644 packages/agent-provider-e2b/src/index.test.ts create mode 100644 packages/agent-provider-e2b/src/index.ts create mode 100644 packages/agent-provider-e2b/tsconfig.json create mode 100644 packages/agent-provider-sandbox/LICENSE create mode 100644 packages/agent-provider-sandbox/README.md create mode 100644 packages/agent-provider-sandbox/package.json create mode 100644 packages/agent-provider-sandbox/src/index.test.ts create mode 100644 packages/agent-provider-sandbox/src/index.ts create mode 100644 packages/agent-provider-sandbox/tsconfig.json create mode 100644 packages/agent-provider-testkit/LICENSE create mode 100644 packages/agent-provider-testkit/README.md create mode 100644 packages/agent-provider-testkit/package.json create mode 100644 packages/agent-provider-testkit/src/index.test.ts create mode 100644 packages/agent-provider-testkit/src/index.ts create mode 100644 packages/agent-provider-testkit/tsconfig.json diff --git a/.changeset/provider-environment-contract.md b/.changeset/provider-environment-contract.md new file mode 100644 index 0000000..050076b --- /dev/null +++ b/.changeset/provider-environment-contract.md @@ -0,0 +1,11 @@ +--- +"@tangle-network/agent-interface": minor +"@tangle-network/agent-provider-testkit": minor +"@tangle-network/agent-provider-sandbox": minor +"@tangle-network/agent-provider-cli-bridge": minor +"@tangle-network/agent-provider-computesdk": minor +"@tangle-network/agent-provider-e2b": minor +"@tangle-network/agent-provider-daytona": minor +--- + +Add the provider-neutral agent environment contract plus provider packages for Tangle Sandbox, CLI bridge, ComputeSDK, E2B, Daytona, and shared provider conformance tests. diff --git a/README.md b/README.md index a54d646..6f74d5c 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,25 @@ # agent-sdk Public home of the TypeScript SDK for building against Tangle agents. This is a -pnpm workspace containing two published packages: +pnpm workspace containing the shared contracts, core client, and provider +adapters: | Package | Description | | --- | --- | | [`@tangle-network/agent-interface`](packages/agent-interface) | Shared TypeScript types and zod schemas defining the agent/provider contract. Zero runtime beyond zod. | | [`@tangle-network/agent-core`](packages/agent-core) | Runtime primitives for talking to Tangle agents: auth token issue/verify, SSE stream parsing, transport interfaces, retries/resilience, and telemetry. Depends on `@tangle-network/agent-interface`. | +| [`@tangle-network/agent-provider-testkit`](packages/agent-provider-testkit) | Conformance checks that any `AgentEnvironmentProvider` package can run before publishing. | +| [`@tangle-network/agent-provider-sandbox`](packages/agent-provider-sandbox) | Adapter from `@tangle-network/sandbox` clients into the shared environment provider contract. | +| [`@tangle-network/agent-provider-cli-bridge`](packages/agent-provider-cli-bridge) | Adapter for a CLI bridge OpenAI-compatible HTTP endpoint. | +| [`@tangle-network/agent-provider-computesdk`](packages/agent-provider-computesdk) | Adapter for ComputeSDK-backed sandboxes. | +| [`@tangle-network/agent-provider-e2b`](packages/agent-provider-e2b) | Direct E2B adapter. | +| [`@tangle-network/agent-provider-daytona`](packages/agent-provider-daytona) | Direct Daytona adapter. | ## Install ```bash pnpm add @tangle-network/agent-core @tangle-network/agent-interface +pnpm add @tangle-network/agent-provider-sandbox ``` `@tangle-network/agent-core` uses `node:crypto` for token signing/verification, diff --git a/packages/agent-interface/README.md b/packages/agent-interface/README.md index 0d09b06..40685a8 100644 --- a/packages/agent-interface/README.md +++ b/packages/agent-interface/README.md @@ -16,7 +16,13 @@ pnpm add @tangle-network/agent-interface ## Usage ```ts -import type { BackendCapabilities, ProviderCapabilities } from "@tangle-network/agent-interface"; +import type { + AgentEnvironmentProvider, +} from "@tangle-network/agent-interface/environment-provider"; +import type { + BackendCapabilities, + ProviderCapabilities, +} from "@tangle-network/agent-interface"; const caps: ProviderCapabilities = { supportsVision: true, @@ -24,6 +30,36 @@ const caps: ProviderCapabilities = { supportsToolCalls: true, supportsComputerUse: false, }; + +const provider: AgentEnvironmentProvider = { + name: "example", + capabilities: () => ({ + profile: { + namedProfiles: false, + systemPrompt: true, + instructions: true, + tools: true, + permissions: true, + mcp: true, + subagents: false, + resources: { files: true, instructions: true, tools: true }, + hooks: false, + modes: false, + runtimeUpdate: false, + validation: true, + }, + streaming: { live: true, replay: false, detach: false, turnIdempotency: false }, + sessions: { continue: false, list: false, messages: false }, + workspace: { read: true, write: true, exec: true, git: false, upload: false, download: false }, + branching: { checkpoint: false, fork: false }, + placement: false, + usage: true, + confidential: false, + }), + create: async () => { + throw new Error("implement provider create()"); + }, +}; ``` ## License diff --git a/packages/agent-interface/package.json b/packages/agent-interface/package.json index e8ef23f..adaeba9 100644 --- a/packages/agent-interface/package.json +++ b/packages/agent-interface/package.json @@ -9,6 +9,10 @@ ".": { "import": "./dist/index.js", "types": "./src/index.ts" + }, + "./environment-provider": { + "import": "./dist/environment-provider.js", + "types": "./src/environment-provider.ts" } }, "repository": { @@ -26,6 +30,11 @@ "import": "./dist/index.js", "types": "./dist/index.d.ts", "default": "./dist/index.js" + }, + "./environment-provider": { + "import": "./dist/environment-provider.js", + "types": "./dist/environment-provider.d.ts", + "default": "./dist/environment-provider.js" } } }, diff --git a/packages/agent-interface/src/environment-provider.ts b/packages/agent-interface/src/environment-provider.ts new file mode 100644 index 0000000..50212e9 --- /dev/null +++ b/packages/agent-interface/src/environment-provider.ts @@ -0,0 +1,233 @@ +import type { + AgentProfile, + AgentProfileCapabilities, + AgentProfileValidationResult, +} from "./agent-profile.js"; +import type { InputPart, StreamEvent, TokenUsage } from "./index.js"; + +/** Portable profile reference: inline profile or provider catalog id. */ +export type AgentProfileRef = AgentProfile | string; + +export type AgentEnvironmentStatus = + | "pending" + | "provisioning" + | "running" + | "stopped" + | "failed" + | "expired" + | "unknown"; + +export type AgentSessionStatus = + | AgentEnvironmentStatus + | "completed" + | "cancelled"; + +export interface WorkspaceRequest { + /** Provider-specific environment/template id, for example "universal". */ + environment?: string; + /** Container image or image alias when the provider supports image-backed workspaces. */ + image?: string; + /** Repository to clone or mount before the agent runs. */ + repoUrl?: string; + /** Git ref for {@link repoUrl}. */ + gitRef?: string; + /** Initial working directory inside the environment. */ + cwd?: string; + /** Opaque provider-native workspace fields. */ + providerOptions?: Record; +} + +export interface ResourceRequest { + cpu?: number; + memoryMb?: number; + diskMb?: number; + gpu?: string; + providerOptions?: Record; +} + +export interface AgentEnvironmentQuery { + name?: string; + metadata?: Record; + providerOptions?: Record; +} + +export interface AgentEnvironmentSummary { + id: string; + provider: string; + name?: string; + status?: AgentEnvironmentStatus; + metadata?: Record; +} + +export interface ExecRequest { + cwd?: string; + env?: Record; + timeoutMs?: number; + signal?: AbortSignal; +} + +export interface ExecResult { + exitCode: number; + stdout: string; + stderr: string; +} + +export interface CheckpointRequest { + name?: string; + metadata?: Record; +} + +export interface CheckpointRef { + id: string; + provider?: string; + metadata?: Record; +} + +export interface ForkRequest { + name?: string; + metadata?: Record; +} + +export interface PlacementInfo { + kind: "local" | "sandbox" | "fleet" | "provider"; + sandboxId?: string; + fleetId?: string; + machineId?: string; + region?: string; + providerMetadata?: Record; +} + +export interface AgentTurnInput { + prompt?: string; + parts?: InputPart[]; + sessionId?: string; + model?: string; + timeoutMs?: number; + executionId?: string; + lastEventId?: string; + turnId?: string; + detach?: boolean; + context?: Record; + signal?: AbortSignal; + providerOptions?: Record; +} + +export interface AgentTurnResult { + text: string; + success: boolean; + error?: string; + sessionId?: string; + usage?: TokenUsage; + metadata?: Record; + events?: AgentEnvironmentEvent[]; +} + +export interface AgentSessionRef { + id: string; + provider?: string; + metadata?: Record; +} + +export interface AgentEnvironmentEvent { + type: string; + data: Record; + id?: string; + normalized?: StreamEvent; + usage?: TokenUsage; + providerEvent?: unknown; +} + +export interface AgentSession { + readonly id: string; + status(): Promise; + events(options?: { + since?: string; + signal?: AbortSignal; + }): AsyncIterable; + result(): Promise; + prompt(input: AgentTurnInput): Promise; + cancel(): Promise; +} + +export interface AgentEnvironment { + readonly id: string; + readonly provider: string; + readonly name?: string; + status(): Promise; + stream(input: AgentTurnInput): AsyncIterable; + dispatch?(input: AgentTurnInput): Promise; + session?(id: string): AgentSession; + read?(path: string, options?: { sessionId?: string }): Promise; + write?( + path: string, + content: string, + options?: { sessionId?: string }, + ): Promise; + exec?(command: string, options?: ExecRequest): Promise; + checkpoint?(options?: CheckpointRequest): Promise; + fork?( + checkpoint: CheckpointRef, + options?: ForkRequest, + ): Promise; + placement?(): Promise; + refresh?(): Promise; + destroy?(): Promise; +} + +export interface AgentEnvironmentCapabilities { + profile: AgentProfileCapabilities; + streaming: { + live: boolean; + replay: boolean; + detach: boolean; + turnIdempotency: boolean; + }; + sessions: { + continue: boolean; + list: boolean; + messages: boolean; + }; + workspace: { + read: boolean; + write: boolean; + exec: boolean; + git: boolean; + upload: boolean; + download: boolean; + }; + branching: { + checkpoint: boolean; + fork: boolean; + }; + placement: boolean; + usage: boolean; + confidential: boolean; +} + +export interface CreateAgentEnvironmentInput { + profile: AgentProfileRef; + /** Agent backend inside the provider, for example "opencode" or "codex". */ + backend?: string; + workspace?: WorkspaceRequest; + resources?: ResourceRequest; + env?: Record; + secrets?: string[] | Record; + metadata?: Record; + name?: string; + idempotencyKey?: string; + signal?: AbortSignal; + providerOptions?: Record; +} + +export interface AgentEnvironmentProvider { + readonly name: string; + capabilities(): + | AgentEnvironmentCapabilities + | Promise; + validateProfile?( + profile: AgentProfileRef, + ): AgentProfileValidationResult | Promise; + create(input: CreateAgentEnvironmentInput): Promise; + get?(id: string): Promise; + list?(query?: AgentEnvironmentQuery): Promise; +} diff --git a/packages/agent-interface/src/index.ts b/packages/agent-interface/src/index.ts index 49c5e48..15b1a97 100644 --- a/packages/agent-interface/src/index.ts +++ b/packages/agent-interface/src/index.ts @@ -6,6 +6,7 @@ */ import type { InteractionRequest, InteractionResponse } from "./interaction.js"; +export type * from "./environment-provider.js"; // Capabilities describe what a provider supports export type BackendCapabilities = { diff --git a/packages/agent-provider-cli-bridge/LICENSE b/packages/agent-provider-cli-bridge/LICENSE new file mode 100644 index 0000000..9d104f8 --- /dev/null +++ b/packages/agent-provider-cli-bridge/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Tangle Network + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/agent-provider-cli-bridge/README.md b/packages/agent-provider-cli-bridge/README.md new file mode 100644 index 0000000..c9ce3d0 --- /dev/null +++ b/packages/agent-provider-cli-bridge/README.md @@ -0,0 +1,13 @@ +# @tangle-network/agent-provider-cli-bridge + +Wraps a running `cli-bridge` server as an `AgentEnvironmentProvider`. + +```ts +import { createCliBridgeProvider } from '@tangle-network/agent-provider-cli-bridge' + +const provider = createCliBridgeProvider({ + baseUrl: 'http://127.0.0.1:8787', + bearerToken: process.env.CLI_BRIDGE_TOKEN, + defaultModel: 'codex', +}) +``` diff --git a/packages/agent-provider-cli-bridge/package.json b/packages/agent-provider-cli-bridge/package.json new file mode 100644 index 0000000..701f11e --- /dev/null +++ b/packages/agent-provider-cli-bridge/package.json @@ -0,0 +1,54 @@ +{ + "name": "@tangle-network/agent-provider-cli-bridge", + "version": "0.1.0", + "description": "AgentEnvironmentProvider adapter for cli-bridge /v1/chat/completions", + "type": "module", + "license": "MIT", + "main": "dist/index.js", + "types": "src/index.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./src/index.ts" + } + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tangle-network/agent-sdk.git", + "directory": "packages/agent-provider-cli-bridge" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + } + }, + "files": [ + "dist/index.d.ts", + "dist/index.js", + "README.md", + "LICENSE" + ], + "scripts": { + "build": "tsc -p tsconfig.json", + "check-types": "tsc --noEmit", + "clean": "rm -rf dist", + "prepare": "pnpm run build", + "test": "vitest run" + }, + "dependencies": { + "@tangle-network/agent-interface": "workspace:*" + }, + "devDependencies": { + "@types/node": "catalog:", + "typescript": "^6.0.3", + "vitest": "catalog:" + } +} diff --git a/packages/agent-provider-cli-bridge/src/index.test.ts b/packages/agent-provider-cli-bridge/src/index.test.ts new file mode 100644 index 0000000..0d1e31e --- /dev/null +++ b/packages/agent-provider-cli-bridge/src/index.test.ts @@ -0,0 +1,45 @@ +import { describe, expect, it } from "vitest"; +import { createCliBridgeProvider } from "./index.js"; + +describe("createCliBridgeProvider", () => { + it("streams OpenAI chunks as provider events", async () => { + let body: Record | undefined; + const provider = createCliBridgeProvider({ + baseUrl: "http://bridge.local", + defaultModel: "codex", + fetch: async (_url, init) => { + body = JSON.parse(String(init?.body)); + return new Response( + [ + ": connected\n\n", + 'data: {"choices":[{"delta":{"content":"hel"},"finish_reason":null}]}\n\n', + 'data: {"choices":[{"delta":{"content":"lo"},"finish_reason":"stop"}],"usage":{"prompt_tokens":2,"completion_tokens":3}}\n\n', + "data: [DONE]\n\n", + ].join(""), + { status: 200, headers: { "content-type": "text/event-stream" } }, + ); + }, + }); + const environment = await provider.create({ + profile: { name: "worker", prompt: { systemPrompt: "system" } }, + backend: "codex", + workspace: { cwd: "/workspace" }, + }); + + const events = []; + for await (const event of environment.stream({ prompt: "go", sessionId: "s1" })) events.push(event); + + expect(body).toMatchObject({ + model: "codex", + session_id: "s1", + cwd: "/workspace", + }); + expect(events.map((event) => event.type)).toEqual([ + "message.part.updated", + "usage", + "message.part.updated", + "result", + ]); + expect(events.at(-1)).toMatchObject({ data: { finalText: "hello" } }); + }); +}); diff --git a/packages/agent-provider-cli-bridge/src/index.ts b/packages/agent-provider-cli-bridge/src/index.ts new file mode 100644 index 0000000..fa79d3d --- /dev/null +++ b/packages/agent-provider-cli-bridge/src/index.ts @@ -0,0 +1,273 @@ +import type { + AgentEnvironment, + AgentEnvironmentCapabilities, + AgentEnvironmentEvent, + AgentEnvironmentProvider, + AgentEnvironmentStatus, + AgentProfileRef, + AgentTurnInput, + CreateAgentEnvironmentInput, +} from "@tangle-network/agent-interface/environment-provider"; +import type { AgentProfile, InputPart, TokenUsage } from "@tangle-network/agent-interface"; + +export interface CliBridgeProviderOptions { + baseUrl: string; + bearerToken?: string; + defaultModel?: string; + defaultMode?: "byob" | "hosted-safe" | "hosted-sandboxed"; + defaultExecution?: { kind: "host" } | { + kind: "sandbox"; + repoUrl?: string; + gitRef?: string; + capability?: string; + ttlSeconds?: number; + }; + fetch?: typeof fetch; + name?: string; + capabilities?: AgentEnvironmentCapabilities; +} + +export function createCliBridgeProvider(options: CliBridgeProviderOptions): AgentEnvironmentProvider { + const fetchImpl = options.fetch ?? globalThis.fetch; + if (!fetchImpl) throw new Error("createCliBridgeProvider requires fetch"); + const name = options.name ?? "cli-bridge"; + return { + name, + capabilities: () => options.capabilities ?? defaultCliBridgeCapabilities(), + async create(input) { + return { + id: input.idempotencyKey ?? input.name ?? crypto.randomUUID(), + provider: name, + ...(input.name ? { name: input.name } : {}), + status: async () => "running", + stream: (turn) => streamCliBridgeTurn(fetchImpl, options, input, turn), + placement: async () => ({ + kind: options.defaultExecution?.kind === "sandbox" ? "sandbox" : "local", + providerMetadata: { baseUrl: options.baseUrl }, + }), + destroy: async () => {}, + } satisfies AgentEnvironment; + }, + }; +} + +async function* streamCliBridgeTurn( + fetchImpl: typeof fetch, + options: CliBridgeProviderOptions, + environmentInput: CreateAgentEnvironmentInput, + turn: AgentTurnInput, +): AsyncIterable { + const response = await fetchImpl(`${trimSlash(options.baseUrl)}/v1/chat/completions`, { + method: "POST", + headers: { + "content-type": "application/json", + accept: "text/event-stream", + ...(options.bearerToken ? { authorization: `Bearer ${options.bearerToken}` } : {}), + ...(turn.sessionId ? { "x-session-id": turn.sessionId } : {}), + }, + body: JSON.stringify(toChatCompletionsBody(options, environmentInput, turn)), + signal: turn.signal ?? environmentInput.signal, + }); + if (!response.ok) { + throw new Error(`cli-bridge ${response.status}: ${await response.text()}`); + } + if (!response.body) throw new Error("cli-bridge response body is empty"); + + let text = ""; + let usage: TokenUsage | undefined; + for await (const event of parseSse(response.body)) { + if (event === "[DONE]") break; + const parsed = safeJson(event); + if (!parsed) continue; + if (parsed.error && typeof parsed.error === "object") { + const error = parsed.error as Record; + const message = typeof error.message === "string" ? error.message : "cli-bridge error"; + yield { type: "status", data: { status: "failed", error: message } }; + return; + } + const choice = Array.isArray(parsed.choices) ? parsed.choices[0] : undefined; + const delta = choice?.delta; + const chunk = delta && typeof delta.content === "string" ? delta.content : ""; + const nextUsage = usageFromOpenAi(parsed.usage); + if (nextUsage) { + usage = mergeUsage(usage, nextUsage); + yield { type: "usage", data: { usage: nextUsage }, usage: nextUsage }; + } + if (chunk) { + text += chunk; + yield { + type: "message.part.updated", + data: { delta: chunk }, + }; + } + if (choice?.finish_reason) { + yield { + type: "result", + data: { + finalText: text, + finishReason: choice.finish_reason, + status: choice.finish_reason === "error" ? "failed" : "completed", + }, + ...(usage ? { usage } : {}), + }; + } + } +} + +function toChatCompletionsBody( + options: CliBridgeProviderOptions, + environmentInput: CreateAgentEnvironmentInput, + turn: AgentTurnInput, +): Record { + const profile = inlineProfile(environmentInput.profile); + return { + model: turn.model ?? environmentInput.backend ?? options.defaultModel ?? "opencode", + messages: messagesFromTurn(turn, profile), + stream: true, + ...(turn.sessionId ? { session_id: turn.sessionId } : {}), + ...(options.defaultMode ? { mode: options.defaultMode } : {}), + ...(profile ? { agent_profile: profile } : {}), + ...(environmentInput.env ? { env: environmentInput.env } : {}), + ...(environmentInput.workspace?.cwd ? { cwd: environmentInput.workspace.cwd } : {}), + ...(executionFromInput(options, environmentInput) ? { execution: executionFromInput(options, environmentInput) } : {}), + metadata: { + ...(environmentInput.metadata ?? {}), + ...(turn.context ?? {}), + ...(turn.providerOptions ?? {}), + }, + }; +} + +function messagesFromTurn(turn: AgentTurnInput, profile: AgentProfile | undefined): Array> { + const messages: Array> = []; + const systemPrompt = profile?.prompt?.systemPrompt; + if (systemPrompt) messages.push({ role: "system", content: systemPrompt }); + messages.push({ role: "user", content: contentFromTurn(turn) }); + return messages; +} + +function contentFromTurn(turn: AgentTurnInput): string | InputPart[] { + if (turn.parts) return turn.parts; + return turn.prompt ?? ""; +} + +function inlineProfile(profile: AgentProfileRef): AgentProfile | undefined { + return typeof profile === "string" ? undefined : profile; +} + +function executionFromInput( + options: CliBridgeProviderOptions, + input: CreateAgentEnvironmentInput, +): CliBridgeProviderOptions["defaultExecution"] | undefined { + if (options.defaultExecution) return options.defaultExecution; + if (!input.workspace?.repoUrl) return undefined; + return { + kind: "sandbox", + repoUrl: input.workspace.repoUrl, + ...(input.workspace.gitRef ? { gitRef: input.workspace.gitRef } : {}), + }; +} + +async function* parseSse(body: ReadableStream): AsyncIterable { + const reader = body.getReader(); + const decoder = new TextDecoder(); + let buffer = ""; + try { + while (true) { + const { done, value } = await reader.read(); + if (done) break; + buffer += decoder.decode(value, { stream: true }); + let boundary = buffer.indexOf("\n\n"); + while (boundary !== -1) { + const frame = buffer.slice(0, boundary); + buffer = buffer.slice(boundary + 2); + const data = dataFromFrame(frame); + if (data !== undefined) yield data; + boundary = buffer.indexOf("\n\n"); + } + } + if (buffer) { + const data = dataFromFrame(buffer); + if (data !== undefined) yield data; + } + } finally { + reader.releaseLock(); + } +} + +function dataFromFrame(frame: string): string | undefined { + const lines = frame.split(/\r?\n/); + const data = lines + .filter((line) => line.startsWith("data:")) + .map((line) => line.slice("data:".length).trimStart()) + .join("\n"); + return data || undefined; +} + +function safeJson(value: string): Record | null { + try { + const parsed = JSON.parse(value); + return parsed && typeof parsed === "object" ? (parsed as Record) : null; + } catch { + return null; + } +} + +function usageFromOpenAi(value: unknown): TokenUsage | undefined { + if (!value || typeof value !== "object") return undefined; + const record = value as Record; + const inputTokens = number(record.prompt_tokens) ?? number(record.input_tokens); + const outputTokens = number(record.completion_tokens) ?? number(record.output_tokens); + if (inputTokens === undefined && outputTokens === undefined) return undefined; + return { inputTokens: inputTokens ?? 0, outputTokens: outputTokens ?? 0 }; +} + +function mergeUsage(left: TokenUsage | undefined, right: TokenUsage): TokenUsage { + if (!left) return right; + return { + inputTokens: left.inputTokens + right.inputTokens, + outputTokens: left.outputTokens + right.outputTokens, + ...(left.cost !== undefined || right.cost !== undefined ? { cost: (left.cost ?? 0) + (right.cost ?? 0) } : {}), + }; +} + +function number(value: unknown): number | undefined { + return typeof value === "number" && Number.isFinite(value) ? value : undefined; +} + +function trimSlash(value: string): string { + return value.replace(/\/+$/, ""); +} + +export function defaultCliBridgeCapabilities(): AgentEnvironmentCapabilities { + return { + profile: { + namedProfiles: false, + systemPrompt: true, + instructions: true, + tools: true, + permissions: true, + mcp: true, + subagents: true, + resources: { + files: true, + instructions: true, + tools: true, + skills: true, + agents: true, + commands: true, + }, + hooks: false, + modes: true, + runtimeUpdate: false, + validation: false, + }, + streaming: { live: true, replay: false, detach: false, turnIdempotency: true }, + sessions: { continue: true, list: false, messages: false }, + workspace: { read: false, write: false, exec: false, git: false, upload: false, download: false }, + branching: { checkpoint: false, fork: false }, + placement: true, + usage: true, + confidential: false, + }; +} diff --git a/packages/agent-provider-cli-bridge/tsconfig.json b/packages/agent-provider-cli-bridge/tsconfig.json new file mode 100644 index 0000000..491458e --- /dev/null +++ b/packages/agent-provider-cli-bridge/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "lib": ["ES2022", "DOM"], + "strict": true, + "skipLibCheck": true, + "declaration": true, + "outDir": "./dist", + "rootDir": "./src", + "types": ["node"] + }, + "include": ["src"] +} diff --git a/packages/agent-provider-computesdk/LICENSE b/packages/agent-provider-computesdk/LICENSE new file mode 100644 index 0000000..9d104f8 --- /dev/null +++ b/packages/agent-provider-computesdk/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Tangle Network + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/agent-provider-computesdk/README.md b/packages/agent-provider-computesdk/README.md new file mode 100644 index 0000000..7fe3212 --- /dev/null +++ b/packages/agent-provider-computesdk/README.md @@ -0,0 +1,13 @@ +# @tangle-network/agent-provider-computesdk + +Wraps a ComputeSDK-compatible `compute` object as an `AgentEnvironmentProvider`. + +```ts +import { compute } from 'computesdk' +import { createComputeSdkProvider } from '@tangle-network/agent-provider-computesdk' + +const provider = createComputeSdkProvider({ + compute, + turnCommand: ({ prompt }) => `codex exec ${JSON.stringify(prompt ?? '')}`, +}) +``` diff --git a/packages/agent-provider-computesdk/package.json b/packages/agent-provider-computesdk/package.json new file mode 100644 index 0000000..c8bdaa0 --- /dev/null +++ b/packages/agent-provider-computesdk/package.json @@ -0,0 +1,63 @@ +{ + "name": "@tangle-network/agent-provider-computesdk", + "version": "0.1.0", + "description": "AgentEnvironmentProvider adapter for ComputeSDK-compatible sandboxes", + "type": "module", + "license": "MIT", + "main": "dist/index.js", + "types": "src/index.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./src/index.ts" + } + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tangle-network/agent-sdk.git", + "directory": "packages/agent-provider-computesdk" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + } + }, + "files": [ + "dist/index.d.ts", + "dist/index.js", + "README.md", + "LICENSE" + ], + "scripts": { + "build": "tsc -p tsconfig.json", + "check-types": "tsc --noEmit", + "clean": "rm -rf dist", + "prepare": "pnpm run build", + "test": "vitest run" + }, + "dependencies": { + "@tangle-network/agent-interface": "workspace:*" + }, + "peerDependencies": { + "computesdk": "^4.1.3" + }, + "peerDependenciesMeta": { + "computesdk": { + "optional": true + } + }, + "devDependencies": { + "@tangle-network/agent-provider-testkit": "workspace:*", + "@types/node": "catalog:", + "typescript": "^6.0.3", + "vitest": "catalog:" + } +} diff --git a/packages/agent-provider-computesdk/src/index.test.ts b/packages/agent-provider-computesdk/src/index.test.ts new file mode 100644 index 0000000..4c388fc --- /dev/null +++ b/packages/agent-provider-computesdk/src/index.test.ts @@ -0,0 +1,45 @@ +import { describe, expect, it } from "vitest"; +import { runAgentEnvironmentProviderConformance } from "@tangle-network/agent-provider-testkit"; +import { + createComputeSdkProvider, + type ComputeSdkLike, +} from "./index.js"; + +describe("createComputeSdkProvider", () => { + it("wraps ComputeSDK sandboxes as provider environments", async () => { + const files = new Map(); + const compute: ComputeSdkLike = { + sandbox: { + async create() { + return { + sandboxId: "compute-1", + runCommand: async (command) => ({ exitCode: 0, stdout: `ran:${command}`, stderr: "" }), + filesystem: { + readFile: async (path) => files.get(path) ?? "", + writeFile: async (path, content) => { + files.set(path, content); + }, + }, + }; + }, + destroy: async () => {}, + }, + }; + const provider = createComputeSdkProvider({ + compute, + turnCommand: ({ prompt }) => `agent ${prompt}`, + }); + + await expect( + runAgentEnvironmentProviderConformance({ + name: "compute", + createProvider: () => provider, + }), + ).resolves.toMatchObject({ provider: "computesdk" }); + + const environment = await provider.create({ profile: "worker" }); + const events = []; + for await (const event of environment.stream({ prompt: "hello" })) events.push(event); + expect(events.at(-1)).toMatchObject({ data: { finalText: "ran:agent hello" } }); + }); +}); diff --git a/packages/agent-provider-computesdk/src/index.ts b/packages/agent-provider-computesdk/src/index.ts new file mode 100644 index 0000000..1eea851 --- /dev/null +++ b/packages/agent-provider-computesdk/src/index.ts @@ -0,0 +1,249 @@ +import type { + AgentEnvironment, + AgentEnvironmentCapabilities, + AgentEnvironmentEvent, + AgentEnvironmentProvider, + AgentEnvironmentQuery, + AgentEnvironmentSummary, + AgentTurnInput, + CheckpointRef, + CheckpointRequest, + CreateAgentEnvironmentInput, + ExecRequest, + ExecResult, + ForkRequest, + PlacementInfo, +} from "@tangle-network/agent-interface/environment-provider"; + +export interface ComputeSdkLike { + sandbox: { + create(options?: Record): Promise; + getById?(id: string): Promise; + list?(): Promise; + destroy?(id: string): Promise; + }; + snapshot?: { + create?(sandboxId: string, options?: Record): Promise<{ id: string; metadata?: Record }>; + }; +} + +export interface ComputeSandboxLike { + sandboxId?: string; + id?: string; + provider?: string; + metadata?: Record; + runCommand(command: string, options?: Record): Promise; + filesystem?: { + readFile(path: string): Promise; + writeFile(path: string, content: string): Promise; + }; +} + +export interface ComputeSdkProviderOptions { + compute: ComputeSdkLike; + name?: string; + capabilities?: AgentEnvironmentCapabilities; + turnCommand?: (input: AgentTurnInput, environment: AgentEnvironment) => string | Promise; + mapCreateInput?: (input: CreateAgentEnvironmentInput) => Record; +} + +export function createComputeSdkProvider(options: ComputeSdkProviderOptions): AgentEnvironmentProvider { + const name = options.name ?? "computesdk"; + return { + name, + capabilities: () => options.capabilities ?? defaultComputeSdkCapabilities(), + async create(input) { + const sandbox = await options.compute.sandbox.create( + options.mapCreateInput?.(input) ?? computeCreateOptions(input), + ); + return computeSandboxAsEnvironment(options, name, sandbox); + }, + ...(options.compute.sandbox.getById + ? { + async get(id: string): Promise { + const sandbox = await options.compute.sandbox.getById?.(id); + return sandbox ? computeSandboxAsEnvironment(options, name, sandbox) : null; + }, + } + : {}), + ...(options.compute.sandbox.list + ? { + async list(_query?: AgentEnvironmentQuery): Promise { + const sandboxes = await options.compute.sandbox.list?.(); + return (sandboxes ?? []).map((sandbox) => ({ + id: sandboxId(sandbox), + provider: name, + status: "running", + metadata: sandbox.metadata, + })); + }, + } + : {}), + }; +} + +function computeSandboxAsEnvironment( + options: ComputeSdkProviderOptions, + providerName: string, + sandbox: ComputeSandboxLike, +): AgentEnvironment { + const id = sandboxId(sandbox); + const environment: AgentEnvironment = { + id, + provider: providerName, + status: async () => "running", + async *stream(input: AgentTurnInput): AsyncIterable { + const command = + (await options.turnCommand?.(input, environment)) ?? + commandFromProviderOptions(input) ?? + input.prompt; + if (!command) throw new Error("ComputeSDK provider requires turnCommand, providerOptions.command, or prompt"); + const result = await environment.exec?.(command, { + cwd: stringOption(input.providerOptions?.cwd), + timeoutMs: input.timeoutMs, + signal: input.signal, + }); + const text = result?.stdout ?? ""; + yield { type: "message.part.updated", data: { delta: text } }; + yield { + type: "result", + data: { + finalText: text, + status: result?.exitCode === 0 ? "completed" : "failed", + exitCode: result?.exitCode ?? 1, + stderr: result?.stderr ?? "", + }, + }; + }, + ...(sandbox.filesystem + ? { + read: sandbox.filesystem.readFile.bind(sandbox.filesystem), + write: sandbox.filesystem.writeFile.bind(sandbox.filesystem), + } + : {}), + async exec(command: string, request?: ExecRequest): Promise { + const result = await sandbox.runCommand(command, { + ...(request?.cwd ? { cwd: request.cwd } : {}), + ...(request?.env ? { env: request.env } : {}), + ...(request?.timeoutMs ? { timeoutMs: request.timeoutMs } : {}), + ...(request?.signal ? { signal: request.signal } : {}), + }); + return execResultFromUnknown(result); + }, + ...(options.compute.snapshot?.create + ? { + async checkpoint(request?: CheckpointRequest): Promise { + const checkpoint = await options.compute.snapshot?.create?.(id, { + name: request?.name, + metadata: request?.metadata, + }); + if (!checkpoint?.id) throw new Error("ComputeSDK snapshot.create returned no id"); + return { id: checkpoint.id, provider: providerName, metadata: checkpoint.metadata }; + }, + } + : {}), + async placement(): Promise { + return { + kind: "provider", + machineId: id, + providerMetadata: { + provider: sandbox.provider, + ...(sandbox.metadata ?? {}), + }, + }; + }, + async destroy(): Promise { + await options.compute.sandbox.destroy?.(id); + }, + }; + return { + ...environment, + ...(environment.checkpoint + ? { + async fork(checkpoint: CheckpointRef, request?: ForkRequest): Promise { + const forked = await options.compute.sandbox.create({ + snapshot: checkpoint.id, + ...(request?.metadata ? { metadata: request.metadata } : {}), + }); + return computeSandboxAsEnvironment(options, providerName, forked); + }, + } + : {}), + }; +} + +function computeCreateOptions(input: CreateAgentEnvironmentInput): Record { + return { + ...(input.workspace?.environment ? { environment: input.workspace.environment } : {}), + ...(input.workspace?.image ? { image: input.workspace.image } : {}), + ...(input.workspace?.repoUrl ? { repoUrl: input.workspace.repoUrl } : {}), + ...(input.workspace?.gitRef ? { gitRef: input.workspace.gitRef } : {}), + ...(input.workspace?.cwd ? { cwd: input.workspace.cwd } : {}), + ...(input.resources ? { resources: input.resources } : {}), + ...(input.env ? { env: input.env } : {}), + ...(input.metadata ? { metadata: input.metadata } : {}), + ...(input.name ? { name: input.name } : {}), + ...(input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : {}), + ...(input.providerOptions ?? {}), + }; +} + +function commandFromProviderOptions(input: AgentTurnInput): string | undefined { + return stringOption(input.providerOptions?.command) ?? stringOption(input.providerOptions?.agentCommand); +} + +function stringOption(value: unknown): string | undefined { + return typeof value === "string" && value.length > 0 ? value : undefined; +} + +function sandboxId(sandbox: ComputeSandboxLike): string { + const id = sandbox.sandboxId ?? sandbox.id; + if (!id) throw new Error("ComputeSDK sandbox returned no id"); + return id; +} + +function execResultFromUnknown(value: unknown): ExecResult { + const record = value && typeof value === "object" ? (value as Record) : {}; + return { + exitCode: number(record.exitCode) ?? number(record.code) ?? 0, + stdout: typeof record.stdout === "string" ? record.stdout : typeof record.output === "string" ? record.output : "", + stderr: typeof record.stderr === "string" ? record.stderr : typeof record.error === "string" ? record.error : "", + }; +} + +function number(value: unknown): number | undefined { + return typeof value === "number" && Number.isFinite(value) ? value : undefined; +} + +export function defaultComputeSdkCapabilities(): AgentEnvironmentCapabilities { + return { + profile: { + namedProfiles: false, + systemPrompt: false, + instructions: false, + tools: false, + permissions: false, + mcp: false, + subagents: false, + resources: { + files: true, + instructions: false, + tools: false, + skills: false, + agents: false, + commands: false, + }, + hooks: false, + modes: false, + runtimeUpdate: false, + validation: false, + }, + streaming: { live: false, replay: false, detach: false, turnIdempotency: false }, + sessions: { continue: false, list: false, messages: false }, + workspace: { read: true, write: true, exec: true, git: false, upload: true, download: true }, + branching: { checkpoint: false, fork: false }, + placement: true, + usage: false, + confidential: false, + }; +} diff --git a/packages/agent-provider-computesdk/tsconfig.json b/packages/agent-provider-computesdk/tsconfig.json new file mode 100644 index 0000000..491458e --- /dev/null +++ b/packages/agent-provider-computesdk/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "lib": ["ES2022", "DOM"], + "strict": true, + "skipLibCheck": true, + "declaration": true, + "outDir": "./dist", + "rootDir": "./src", + "types": ["node"] + }, + "include": ["src"] +} diff --git a/packages/agent-provider-daytona/LICENSE b/packages/agent-provider-daytona/LICENSE new file mode 100644 index 0000000..9d104f8 --- /dev/null +++ b/packages/agent-provider-daytona/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Tangle Network + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/agent-provider-daytona/README.md b/packages/agent-provider-daytona/README.md new file mode 100644 index 0000000..3fcff68 --- /dev/null +++ b/packages/agent-provider-daytona/README.md @@ -0,0 +1,11 @@ +# @tangle-network/agent-provider-daytona + +Direct Daytona adapter for `AgentEnvironmentProvider`. + +```ts +import { createDaytonaProvider } from '@tangle-network/agent-provider-daytona' + +const provider = createDaytonaProvider({ + turnCommand: ({ prompt }) => `codex exec ${JSON.stringify(prompt ?? '')}`, +}) +``` diff --git a/packages/agent-provider-daytona/package.json b/packages/agent-provider-daytona/package.json new file mode 100644 index 0000000..15f7bca --- /dev/null +++ b/packages/agent-provider-daytona/package.json @@ -0,0 +1,63 @@ +{ + "name": "@tangle-network/agent-provider-daytona", + "version": "0.1.0", + "description": "AgentEnvironmentProvider adapter for Daytona workspaces", + "type": "module", + "license": "MIT", + "main": "dist/index.js", + "types": "src/index.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./src/index.ts" + } + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tangle-network/agent-sdk.git", + "directory": "packages/agent-provider-daytona" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + } + }, + "files": [ + "dist/index.d.ts", + "dist/index.js", + "README.md", + "LICENSE" + ], + "scripts": { + "build": "tsc -p tsconfig.json", + "check-types": "tsc --noEmit", + "clean": "rm -rf dist", + "prepare": "pnpm run build", + "test": "vitest run" + }, + "dependencies": { + "@tangle-network/agent-interface": "workspace:*" + }, + "peerDependencies": { + "@daytonaio/sdk": "^0.192.0" + }, + "peerDependenciesMeta": { + "@daytonaio/sdk": { + "optional": true + } + }, + "devDependencies": { + "@tangle-network/agent-provider-testkit": "workspace:*", + "@types/node": "catalog:", + "typescript": "^6.0.3", + "vitest": "catalog:" + } +} diff --git a/packages/agent-provider-daytona/src/index.test.ts b/packages/agent-provider-daytona/src/index.test.ts new file mode 100644 index 0000000..ea52ae4 --- /dev/null +++ b/packages/agent-provider-daytona/src/index.test.ts @@ -0,0 +1,42 @@ +import { describe, expect, it } from "vitest"; +import { runAgentEnvironmentProviderConformance } from "@tangle-network/agent-provider-testkit"; +import { createDaytonaProvider, type DaytonaLike } from "./index.js"; + +describe("createDaytonaProvider", () => { + it("wraps Daytona workspaces as provider environments", async () => { + const files = new Map(); + const daytona: DaytonaLike = { + async create() { + return { + id: "daytona-1", + process: { + executeCommand: async (command: string) => ({ exitCode: 0, stdout: `ran:${command}`, stderr: "" }), + }, + fs: { + readFile: async (path: string) => files.get(path) ?? "", + writeFile: async (path: string, content: string) => { + files.set(path, content); + }, + }, + delete: async () => {}, + }; + }, + }; + const provider = createDaytonaProvider({ + daytona, + turnCommand: ({ prompt }) => `agent ${prompt}`, + }); + + await expect( + runAgentEnvironmentProviderConformance({ + name: "daytona", + createProvider: () => provider, + }), + ).resolves.toMatchObject({ provider: "daytona" }); + + const environment = await provider.create({ profile: "worker" }); + const events = []; + for await (const event of environment.stream({ prompt: "hello" })) events.push(event); + expect(events.at(-1)).toMatchObject({ data: { finalText: "ran:agent hello" } }); + }); +}); diff --git a/packages/agent-provider-daytona/src/index.ts b/packages/agent-provider-daytona/src/index.ts new file mode 100644 index 0000000..85b0299 --- /dev/null +++ b/packages/agent-provider-daytona/src/index.ts @@ -0,0 +1,265 @@ +import type { + AgentEnvironment, + AgentEnvironmentCapabilities, + AgentEnvironmentEvent, + AgentEnvironmentProvider, + AgentEnvironmentQuery, + AgentEnvironmentSummary, + AgentTurnInput, + CreateAgentEnvironmentInput, + ExecRequest, + ExecResult, + PlacementInfo, +} from "@tangle-network/agent-interface/environment-provider"; + +export interface DaytonaLike { + create(params?: unknown, options?: unknown): Promise; + get?(id: string): Promise; + list?(query?: unknown): AsyncIterable | Promise; +} + +export interface DaytonaConstructor { + new (config?: unknown): DaytonaLike; +} + +export interface DaytonaSandboxLike { + id?: string; + sandboxId?: string; + instance?: { id?: string }; + state?: string; + process?: Record; + fs?: Record; + fileSystem?: Record; + delete?(): Promise; + remove?(): Promise; + stop?(): Promise; +} + +export interface DaytonaProviderOptions { + daytona?: DaytonaLike; + Daytona?: DaytonaConstructor; + config?: unknown; + name?: string; + capabilities?: AgentEnvironmentCapabilities; + turnCommand?: (input: AgentTurnInput, environment: AgentEnvironment) => string | Promise; + mapCreateInput?: (input: CreateAgentEnvironmentInput) => unknown; +} + +export function createDaytonaProvider(options: DaytonaProviderOptions = {}): AgentEnvironmentProvider { + const name = options.name ?? "daytona"; + return { + name, + capabilities: () => options.capabilities ?? defaultDaytonaCapabilities(), + async create(input) { + const daytona = await resolveDaytona(options); + const sandbox = await daytona.create( + options.mapCreateInput?.(input) ?? daytonaCreateParams(input), + ); + return daytonaSandboxAsEnvironment(options, name, sandbox); + }, + async get(id) { + const daytona = await resolveDaytona(options); + if (!daytona.get) return null; + return daytonaSandboxAsEnvironment(options, name, await daytona.get(id)); + }, + async list(query?: AgentEnvironmentQuery): Promise { + const daytona = await resolveDaytona(options); + if (!daytona.list) return []; + const listed = await daytona.list(query?.providerOptions); + const sandboxes = isAsyncIterable(listed) ? await collect(listed) : listed; + return sandboxes.map((sandbox) => ({ + id: sandboxId(sandbox), + provider: name, + status: sandbox.state === "stopped" ? "stopped" : "running", + })); + }, + }; +} + +async function resolveDaytona(options: DaytonaProviderOptions): Promise { + if (options.daytona) return options.daytona; + const Daytona = options.Daytona ?? (await loadDaytonaConstructor()); + return new Daytona(options.config); +} + +async function loadDaytonaConstructor(): Promise { + const mod = (await import("@daytonaio/sdk")) as unknown as { Daytona?: DaytonaConstructor }; + if (!mod.Daytona) throw new Error("@daytonaio/sdk does not export Daytona"); + return mod.Daytona; +} + +function daytonaSandboxAsEnvironment( + options: DaytonaProviderOptions, + providerName: string, + sandbox: DaytonaSandboxLike, +): AgentEnvironment { + const id = sandboxId(sandbox); + const environment: AgentEnvironment = { + id, + provider: providerName, + status: async () => (sandbox.state === "stopped" ? "stopped" : "running"), + async *stream(input: AgentTurnInput): AsyncIterable { + const command = + (await options.turnCommand?.(input, environment)) ?? + commandFromProviderOptions(input) ?? + input.prompt; + if (!command) throw new Error("Daytona provider requires turnCommand, providerOptions.command, or prompt"); + const result = await environment.exec?.(command, { + cwd: stringOption(input.providerOptions?.cwd), + timeoutMs: input.timeoutMs, + signal: input.signal, + }); + const text = result?.stdout ?? ""; + yield { type: "message.part.updated", data: { delta: text } }; + yield { + type: "result", + data: { + finalText: text, + status: result?.exitCode === 0 ? "completed" : "failed", + exitCode: result?.exitCode ?? 1, + stderr: result?.stderr ?? "", + }, + }; + }, + async read(path: string): Promise { + const fs = fileApi(sandbox); + const value = await callFirst(fs, ["readFile", "downloadFile"], [path]); + if (typeof value === "string") return value; + if (value instanceof Uint8Array) return new TextDecoder().decode(value); + return String(value ?? ""); + }, + async write(path: string, content: string): Promise { + const fs = fileApi(sandbox); + await callFirst(fs, ["writeFile", "uploadFile"], [path, content], [content, path]); + }, + async exec(command: string, request?: ExecRequest): Promise { + const proc = processApi(sandbox); + const result = await callFirst( + proc, + ["executeCommand", "execute", "exec", "run"], + [command, { cwd: request?.cwd, timeoutMs: request?.timeoutMs, env: request?.env, signal: request?.signal }], + ); + return execResultFromUnknown(result); + }, + placement: async (): Promise => ({ kind: "provider", machineId: id, providerMetadata: { provider: "daytona" } }), + async destroy(): Promise { + if (sandbox.delete) await sandbox.delete(); + else if (sandbox.remove) await sandbox.remove(); + else await sandbox.stop?.(); + }, + }; + return environment; +} + +function daytonaCreateParams(input: CreateAgentEnvironmentInput): Record { + return { + ...(input.workspace?.environment ? { snapshot: input.workspace.environment } : {}), + ...(input.workspace?.image ? { image: input.workspace.image } : {}), + ...(input.workspace?.repoUrl ? { source: { repository: input.workspace.repoUrl, ref: input.workspace.gitRef } } : {}), + ...(input.resources ? { resources: input.resources } : {}), + ...(input.env ? { env: input.env } : {}), + ...(input.metadata ? { labels: input.metadata } : {}), + ...(input.name ? { name: input.name } : {}), + ...(input.providerOptions ?? {}), + }; +} + +function processApi(sandbox: DaytonaSandboxLike): Record { + if (sandbox.process && typeof sandbox.process === "object") return sandbox.process; + throw new Error("Daytona sandbox does not expose a process API"); +} + +function fileApi(sandbox: DaytonaSandboxLike): Record { + const fs = sandbox.fs ?? sandbox.fileSystem; + if (fs && typeof fs === "object") return fs; + throw new Error("Daytona sandbox does not expose a filesystem API"); +} + +async function callFirst( + target: Record, + methods: string[], + args: unknown[], + fallbackArgs?: unknown[], +): Promise { + for (const method of methods) { + const fn = target[method]; + if (typeof fn !== "function") continue; + try { + return await fn.apply(target, args); + } catch (error) { + if (!fallbackArgs) throw error; + return await fn.apply(target, fallbackArgs); + } + } + throw new Error(`none of the Daytona methods are available: ${methods.join(", ")}`); +} + +function commandFromProviderOptions(input: AgentTurnInput): string | undefined { + return stringOption(input.providerOptions?.command) ?? stringOption(input.providerOptions?.agentCommand); +} + +function stringOption(value: unknown): string | undefined { + return typeof value === "string" && value.length > 0 ? value : undefined; +} + +function sandboxId(sandbox: DaytonaSandboxLike): string { + const id = sandbox.id ?? sandbox.sandboxId ?? sandbox.instance?.id; + if (!id) throw new Error("Daytona sandbox returned no id"); + return id; +} + +function execResultFromUnknown(value: unknown): ExecResult { + const record = value && typeof value === "object" ? (value as Record) : {}; + return { + exitCode: number(record.exitCode) ?? number(record.code) ?? 0, + stdout: typeof record.stdout === "string" ? record.stdout : typeof record.output === "string" ? record.output : "", + stderr: typeof record.stderr === "string" ? record.stderr : typeof record.error === "string" ? record.error : "", + }; +} + +function number(value: unknown): number | undefined { + return typeof value === "number" && Number.isFinite(value) ? value : undefined; +} + +function isAsyncIterable(value: unknown): value is AsyncIterable { + return Boolean(value && typeof value === "object" && Symbol.asyncIterator in value); +} + +async function collect(iterable: AsyncIterable): Promise { + const out: T[] = []; + for await (const value of iterable) out.push(value); + return out; +} + +export function defaultDaytonaCapabilities(): AgentEnvironmentCapabilities { + return { + profile: { + namedProfiles: false, + systemPrompt: false, + instructions: false, + tools: false, + permissions: false, + mcp: false, + subagents: false, + resources: { + files: true, + instructions: false, + tools: false, + skills: false, + agents: false, + commands: false, + }, + hooks: false, + modes: false, + runtimeUpdate: false, + validation: false, + }, + streaming: { live: false, replay: false, detach: false, turnIdempotency: false }, + sessions: { continue: false, list: false, messages: false }, + workspace: { read: true, write: true, exec: true, git: true, upload: true, download: true }, + branching: { checkpoint: false, fork: false }, + placement: true, + usage: false, + confidential: false, + }; +} diff --git a/packages/agent-provider-daytona/tsconfig.json b/packages/agent-provider-daytona/tsconfig.json new file mode 100644 index 0000000..491458e --- /dev/null +++ b/packages/agent-provider-daytona/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "lib": ["ES2022", "DOM"], + "strict": true, + "skipLibCheck": true, + "declaration": true, + "outDir": "./dist", + "rootDir": "./src", + "types": ["node"] + }, + "include": ["src"] +} diff --git a/packages/agent-provider-e2b/LICENSE b/packages/agent-provider-e2b/LICENSE new file mode 100644 index 0000000..9d104f8 --- /dev/null +++ b/packages/agent-provider-e2b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Tangle Network + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/agent-provider-e2b/README.md b/packages/agent-provider-e2b/README.md new file mode 100644 index 0000000..65ef101 --- /dev/null +++ b/packages/agent-provider-e2b/README.md @@ -0,0 +1,11 @@ +# @tangle-network/agent-provider-e2b + +Direct E2B adapter for `AgentEnvironmentProvider`. + +```ts +import { createE2BProvider } from '@tangle-network/agent-provider-e2b' + +const provider = createE2BProvider({ + turnCommand: ({ prompt }) => `codex exec ${JSON.stringify(prompt ?? '')}`, +}) +``` diff --git a/packages/agent-provider-e2b/package.json b/packages/agent-provider-e2b/package.json new file mode 100644 index 0000000..182b7c2 --- /dev/null +++ b/packages/agent-provider-e2b/package.json @@ -0,0 +1,63 @@ +{ + "name": "@tangle-network/agent-provider-e2b", + "version": "0.1.0", + "description": "AgentEnvironmentProvider adapter for E2B sandboxes", + "type": "module", + "license": "MIT", + "main": "dist/index.js", + "types": "src/index.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./src/index.ts" + } + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tangle-network/agent-sdk.git", + "directory": "packages/agent-provider-e2b" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + } + }, + "files": [ + "dist/index.d.ts", + "dist/index.js", + "README.md", + "LICENSE" + ], + "scripts": { + "build": "tsc -p tsconfig.json", + "check-types": "tsc --noEmit", + "clean": "rm -rf dist", + "prepare": "pnpm run build", + "test": "vitest run" + }, + "dependencies": { + "@tangle-network/agent-interface": "workspace:*" + }, + "peerDependencies": { + "e2b": "^2.31.0" + }, + "peerDependenciesMeta": { + "e2b": { + "optional": true + } + }, + "devDependencies": { + "@tangle-network/agent-provider-testkit": "workspace:*", + "@types/node": "catalog:", + "typescript": "^6.0.3", + "vitest": "catalog:" + } +} diff --git a/packages/agent-provider-e2b/src/index.test.ts b/packages/agent-provider-e2b/src/index.test.ts new file mode 100644 index 0000000..f280e03 --- /dev/null +++ b/packages/agent-provider-e2b/src/index.test.ts @@ -0,0 +1,42 @@ +import { describe, expect, it } from "vitest"; +import { runAgentEnvironmentProviderConformance } from "@tangle-network/agent-provider-testkit"; +import { createE2BProvider, type E2BSandboxClass } from "./index.js"; + +describe("createE2BProvider", () => { + it("wraps E2B sandboxes as provider environments", async () => { + const files = new Map(); + const Sandbox: E2BSandboxClass = { + async create() { + return { + sandboxId: "e2b-1", + commands: { + run: async (command) => ({ exitCode: 0, stdout: `ran:${command}`, stderr: "" }), + }, + files: { + read: async (path) => files.get(path) ?? "", + write: async (path, content) => { + files.set(path, content); + }, + }, + kill: async () => {}, + }; + }, + }; + const provider = createE2BProvider({ + Sandbox, + turnCommand: ({ prompt }) => `agent ${prompt}`, + }); + + await expect( + runAgentEnvironmentProviderConformance({ + name: "e2b", + createProvider: () => provider, + }), + ).resolves.toMatchObject({ provider: "e2b" }); + + const environment = await provider.create({ profile: "worker" }); + const events = []; + for await (const event of environment.stream({ prompt: "hello" })) events.push(event); + expect(events.at(-1)).toMatchObject({ data: { finalText: "ran:agent hello" } }); + }); +}); diff --git a/packages/agent-provider-e2b/src/index.ts b/packages/agent-provider-e2b/src/index.ts new file mode 100644 index 0000000..0784b3a --- /dev/null +++ b/packages/agent-provider-e2b/src/index.ts @@ -0,0 +1,196 @@ +import type { + AgentEnvironment, + AgentEnvironmentCapabilities, + AgentEnvironmentEvent, + AgentEnvironmentProvider, + AgentTurnInput, + CreateAgentEnvironmentInput, + ExecRequest, + ExecResult, + PlacementInfo, +} from "@tangle-network/agent-interface/environment-provider"; + +export interface E2BSandboxClass { + create(options?: unknown, opts?: unknown): Promise; + connect?(id: string, options?: unknown): Promise; +} + +export interface E2BSandboxLike { + sandboxId?: string; + id?: string; + commands?: { + run(command: string, options?: Record): Promise; + }; + files?: { + read(path: string): Promise; + write(path: string, content: string): Promise; + }; + kill?(): Promise; + close?(): Promise; +} + +export interface E2BProviderOptions { + Sandbox?: E2BSandboxClass; + name?: string; + template?: string; + apiKey?: string; + capabilities?: AgentEnvironmentCapabilities; + turnCommand?: (input: AgentTurnInput, environment: AgentEnvironment) => string | Promise; + mapCreateInput?: (input: CreateAgentEnvironmentInput) => unknown; +} + +export function createE2BProvider(options: E2BProviderOptions = {}): AgentEnvironmentProvider { + const name = options.name ?? "e2b"; + return { + name, + capabilities: () => options.capabilities ?? defaultE2BCapabilities(), + async create(input) { + const Sandbox = options.Sandbox ?? (await loadE2BSandbox()); + const createOptions = + options.mapCreateInput?.(input) ?? + e2bCreateOptions(options, input); + const sandbox = await Sandbox.create(createOptions); + return e2bSandboxAsEnvironment(options, name, sandbox); + }, + async get(id) { + const Sandbox = options.Sandbox ?? (await loadE2BSandbox()); + if (!Sandbox.connect) return null; + const sandbox = await Sandbox.connect(id, options.apiKey ? { apiKey: options.apiKey } : undefined); + return e2bSandboxAsEnvironment(options, name, sandbox); + }, + }; +} + +async function loadE2BSandbox(): Promise { + const mod = (await import("e2b")) as { Sandbox?: E2BSandboxClass }; + if (!mod.Sandbox) throw new Error("e2b package does not export Sandbox"); + return mod.Sandbox; +} + +function e2bSandboxAsEnvironment( + options: E2BProviderOptions, + providerName: string, + sandbox: E2BSandboxLike, +): AgentEnvironment { + const id = sandbox.sandboxId ?? sandbox.id; + if (!id) throw new Error("E2B sandbox returned no id"); + const environment: AgentEnvironment = { + id, + provider: providerName, + status: async () => "running", + async *stream(input: AgentTurnInput): AsyncIterable { + const command = + (await options.turnCommand?.(input, environment)) ?? + commandFromProviderOptions(input) ?? + input.prompt; + if (!command) throw new Error("E2B provider requires turnCommand, providerOptions.command, or prompt"); + const result = await environment.exec?.(command, { + cwd: stringOption(input.providerOptions?.cwd), + timeoutMs: input.timeoutMs, + signal: input.signal, + }); + const text = result?.stdout ?? ""; + yield { type: "message.part.updated", data: { delta: text } }; + yield { + type: "result", + data: { + finalText: text, + status: result?.exitCode === 0 ? "completed" : "failed", + exitCode: result?.exitCode ?? 1, + stderr: result?.stderr ?? "", + }, + }; + }, + ...(sandbox.files + ? { + async read(path: string): Promise { + const value = await sandbox.files?.read(path); + if (typeof value === "string") return value; + return new TextDecoder().decode(value); + }, + write: sandbox.files.write.bind(sandbox.files), + } + : {}), + async exec(command: string, request?: ExecRequest): Promise { + if (!sandbox.commands?.run) throw new Error("E2B sandbox does not expose commands.run"); + const result = await sandbox.commands.run(command, { + ...(request?.cwd ? { cwd: request.cwd } : {}), + ...(request?.env ? { env: request.env } : {}), + ...(request?.timeoutMs ? { timeoutMs: request.timeoutMs } : {}), + ...(request?.signal ? { signal: request.signal } : {}), + }); + return execResultFromUnknown(result); + }, + placement: async (): Promise => ({ kind: "provider", machineId: id, providerMetadata: { provider: "e2b" } }), + async destroy(): Promise { + if (sandbox.kill) await sandbox.kill(); + else await sandbox.close?.(); + }, + }; + return environment; +} + +function e2bCreateOptions(options: E2BProviderOptions, input: CreateAgentEnvironmentInput): Record { + const template = options.template ?? input.workspace?.environment; + return { + ...(template ? { template } : {}), + ...(options.apiKey ? { apiKey: options.apiKey } : {}), + ...(input.env ? { envs: input.env } : {}), + ...(input.metadata ? { metadata: input.metadata } : {}), + ...(input.providerOptions ?? {}), + }; +} + +function commandFromProviderOptions(input: AgentTurnInput): string | undefined { + return stringOption(input.providerOptions?.command) ?? stringOption(input.providerOptions?.agentCommand); +} + +function stringOption(value: unknown): string | undefined { + return typeof value === "string" && value.length > 0 ? value : undefined; +} + +function execResultFromUnknown(value: unknown): ExecResult { + const record = value && typeof value === "object" ? (value as Record) : {}; + return { + exitCode: number(record.exitCode) ?? number(record.code) ?? 0, + stdout: typeof record.stdout === "string" ? record.stdout : typeof record.output === "string" ? record.output : "", + stderr: typeof record.stderr === "string" ? record.stderr : typeof record.error === "string" ? record.error : "", + }; +} + +function number(value: unknown): number | undefined { + return typeof value === "number" && Number.isFinite(value) ? value : undefined; +} + +export function defaultE2BCapabilities(): AgentEnvironmentCapabilities { + return { + profile: { + namedProfiles: false, + systemPrompt: false, + instructions: false, + tools: false, + permissions: false, + mcp: false, + subagents: false, + resources: { + files: true, + instructions: false, + tools: false, + skills: false, + agents: false, + commands: false, + }, + hooks: false, + modes: false, + runtimeUpdate: false, + validation: false, + }, + streaming: { live: false, replay: false, detach: false, turnIdempotency: false }, + sessions: { continue: false, list: false, messages: false }, + workspace: { read: true, write: true, exec: true, git: false, upload: true, download: true }, + branching: { checkpoint: false, fork: false }, + placement: true, + usage: false, + confidential: false, + }; +} diff --git a/packages/agent-provider-e2b/tsconfig.json b/packages/agent-provider-e2b/tsconfig.json new file mode 100644 index 0000000..491458e --- /dev/null +++ b/packages/agent-provider-e2b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "lib": ["ES2022", "DOM"], + "strict": true, + "skipLibCheck": true, + "declaration": true, + "outDir": "./dist", + "rootDir": "./src", + "types": ["node"] + }, + "include": ["src"] +} diff --git a/packages/agent-provider-sandbox/LICENSE b/packages/agent-provider-sandbox/LICENSE new file mode 100644 index 0000000..9d104f8 --- /dev/null +++ b/packages/agent-provider-sandbox/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Tangle Network + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/agent-provider-sandbox/README.md b/packages/agent-provider-sandbox/README.md new file mode 100644 index 0000000..a072995 --- /dev/null +++ b/packages/agent-provider-sandbox/README.md @@ -0,0 +1,12 @@ +# @tangle-network/agent-provider-sandbox + +Wraps `@tangle-network/sandbox` as an `AgentEnvironmentProvider`. + +```ts +import { Sandbox } from '@tangle-network/sandbox' +import { createTangleSandboxProvider } from '@tangle-network/agent-provider-sandbox' + +const provider = createTangleSandboxProvider({ + client: new Sandbox({ apiKey: process.env.TANGLE_API_KEY }), +}) +``` diff --git a/packages/agent-provider-sandbox/package.json b/packages/agent-provider-sandbox/package.json new file mode 100644 index 0000000..bd282f6 --- /dev/null +++ b/packages/agent-provider-sandbox/package.json @@ -0,0 +1,64 @@ +{ + "name": "@tangle-network/agent-provider-sandbox", + "version": "0.1.0", + "description": "AgentEnvironmentProvider adapter for @tangle-network/sandbox", + "type": "module", + "license": "MIT", + "main": "dist/index.js", + "types": "src/index.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./src/index.ts" + } + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tangle-network/agent-sdk.git", + "directory": "packages/agent-provider-sandbox" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + } + }, + "files": [ + "dist/index.d.ts", + "dist/index.js", + "README.md", + "LICENSE" + ], + "scripts": { + "build": "tsc -p tsconfig.json", + "check-types": "tsc --noEmit", + "clean": "rm -rf dist", + "prepare": "pnpm run build", + "test": "vitest run" + }, + "dependencies": { + "@tangle-network/agent-interface": "workspace:*" + }, + "peerDependencies": { + "@tangle-network/sandbox": ">=0.8.0 <1.0.0" + }, + "peerDependenciesMeta": { + "@tangle-network/sandbox": { + "optional": false + } + }, + "devDependencies": { + "@tangle-network/agent-provider-testkit": "workspace:*", + "@tangle-network/sandbox": "^0.8.2", + "@types/node": "catalog:", + "typescript": "^6.0.3", + "vitest": "catalog:" + } +} diff --git a/packages/agent-provider-sandbox/src/index.test.ts b/packages/agent-provider-sandbox/src/index.test.ts new file mode 100644 index 0000000..48035a4 --- /dev/null +++ b/packages/agent-provider-sandbox/src/index.test.ts @@ -0,0 +1,61 @@ +import { describe, expect, it } from "vitest"; +import { runAgentEnvironmentProviderConformance } from "@tangle-network/agent-provider-testkit"; +import type { CreateSandboxOptions, SandboxEvent } from "@tangle-network/sandbox"; +import { + createTangleSandboxProvider, + type SandboxClientLike, + type SandboxInstanceLike, +} from "./index.js"; + +describe("createTangleSandboxProvider", () => { + it("maps create options, stream events, workspace methods, and dispatch sessions", async () => { + let createOptions: CreateSandboxOptions | undefined; + const files = new Map(); + const box: SandboxInstanceLike = { + id: "sbx-1", + name: "sandbox-one", + status: "running", + async *streamPrompt(prompt: string): AsyncIterable { + yield { + type: "result", + data: { + finalText: `ok:${prompt}`, + usage: { inputTokens: 2, outputTokens: 3, totalCostUsd: 0.01 }, + }, + } as SandboxEvent; + }, + dispatchPrompt: async () => ({ sessionId: "sess-1", status: "running", alreadyExisted: true }), + read: async (path) => files.get(path) ?? "", + write: async (path, content) => { + files.set(path, content); + }, + exec: async () => ({ exitCode: 0, stdout: "ok\n", stderr: "" }), + delete: async () => {}, + }; + const client: SandboxClientLike = { + async create(options) { + createOptions = options; + return box; + }, + describePlacement: () => ({ kind: "sibling", sandboxId: "sbx-1" }), + }; + const provider = createTangleSandboxProvider({ client }); + + await expect( + runAgentEnvironmentProviderConformance({ + name: "sandbox", + createProvider: () => provider, + createInput: { profile: { name: "worker" }, backend: "codex" }, + }), + ).resolves.toMatchObject({ provider: "tangle-sandbox" }); + + expect(createOptions).toMatchObject({ + backend: { type: "codex", profile: { name: "worker" } }, + }); + const environment = await provider.create({ profile: "worker", backend: "codex" }); + await expect(environment.dispatch?.({ prompt: "go" })).resolves.toMatchObject({ + id: "sess-1", + metadata: { alreadyExisted: true }, + }); + }); +}); diff --git a/packages/agent-provider-sandbox/src/index.ts b/packages/agent-provider-sandbox/src/index.ts new file mode 100644 index 0000000..9b9b10f --- /dev/null +++ b/packages/agent-provider-sandbox/src/index.ts @@ -0,0 +1,430 @@ +import type { + BackendType, + CreateSandboxOptions, + ExecResult as SandboxExecResult, + PromptOptions, + PromptResult, + SandboxEvent, +} from "@tangle-network/sandbox"; +import type { + AgentEnvironment, + AgentEnvironmentCapabilities, + AgentEnvironmentEvent, + AgentEnvironmentProvider, + AgentEnvironmentQuery, + AgentEnvironmentStatus, + AgentEnvironmentSummary, + AgentProfileRef, + AgentSession, + AgentSessionRef, + AgentSessionStatus, + AgentTurnInput, + AgentTurnResult, + CheckpointRef, + CheckpointRequest, + CreateAgentEnvironmentInput, + ExecRequest, + ExecResult, + ForkRequest, + PlacementInfo, + ResourceRequest, +} from "@tangle-network/agent-interface/environment-provider"; +import type { InputPart, TokenUsage } from "@tangle-network/agent-interface"; + +export interface SandboxClientLike { + create(options?: CreateSandboxOptions): Promise; + get?(id: string): Promise; + list?(options?: unknown): Promise; + describePlacement?(box: SandboxInstanceLike): unknown; +} + +export interface SandboxInstanceLike { + id: string; + name?: string; + status?: unknown; + metadata?: Record; + streamPrompt(message: string | InputPart[], options?: PromptOptions): AsyncIterable; + prompt?(message: string | InputPart[], options?: PromptOptions): Promise; + dispatchPrompt?(message: string | InputPart[], options?: PromptOptions): Promise; + session?(id: string): SandboxSessionLike; + read?(path: string, options?: { sessionId?: string }): Promise; + write?(path: string, content: string, options?: { sessionId?: string }): Promise; + exec?(command: string, options?: unknown): Promise; + checkpoint?(options?: unknown): Promise; + fork?(checkpointId: string, options?: unknown): Promise; + refresh?(): Promise; + delete?(): Promise; +} + +export interface SandboxSessionLike { + readonly id: string; + status(): Promise; + events(options?: { since?: string; signal?: AbortSignal }): AsyncIterable; + result(): Promise; + prompt(message: string | InputPart[], options?: PromptOptions): Promise; + cancel(): Promise; +} + +export interface TangleSandboxProviderOptions { + client: SandboxClientLike; + name?: string; + defaultBackend?: BackendType; + capabilities?: AgentEnvironmentCapabilities | (() => AgentEnvironmentCapabilities | Promise); + validateProfile?: AgentEnvironmentProvider["validateProfile"]; + mapCreateInput?: (input: CreateAgentEnvironmentInput) => CreateSandboxOptions; +} + +export function createTangleSandboxProvider( + options: TangleSandboxProviderOptions, +): AgentEnvironmentProvider { + const providerName = options.name ?? "tangle-sandbox"; + return { + name: providerName, + capabilities: async () => { + if (!options.capabilities) return defaultTangleSandboxCapabilities(); + return typeof options.capabilities === "function" ? options.capabilities() : options.capabilities; + }, + ...(options.validateProfile ? { validateProfile: options.validateProfile } : {}), + async create(input) { + const createOptions = + options.mapCreateInput?.(input) ?? + sandboxOptionsFromCreateInput(input, options.defaultBackend ?? "opencode"); + const box = await options.client.create(createOptions); + return sandboxInstanceAsEnvironment(box, providerName, options.client); + }, + ...(options.client.get + ? { + async get(id: string): Promise { + const box = await options.client.get?.(id); + return box ? sandboxInstanceAsEnvironment(box, providerName, options.client) : null; + }, + } + : {}), + ...(options.client.list + ? { + async list(query?: AgentEnvironmentQuery): Promise { + const boxes = await options.client.list?.(query?.providerOptions); + return (boxes ?? []).map((box) => ({ + id: String(box.id), + provider: providerName, + ...(box.name ? { name: box.name } : {}), + status: statusFromUnknown(box.status), + ...(box.metadata ? { metadata: box.metadata } : {}), + })); + }, + } + : {}), + }; +} + +function sandboxInstanceAsEnvironment( + box: SandboxInstanceLike, + providerName: string, + client: SandboxClientLike, +): AgentEnvironment { + return { + id: String(box.id), + provider: providerName, + ...(box.name ? { name: box.name } : {}), + async status(): Promise { + await box.refresh?.(); + return statusFromUnknown(box.status); + }, + async *stream(input: AgentTurnInput): AsyncIterable { + for await (const event of box.streamPrompt(promptFromTurnInput(input), promptOptionsFromTurnInput(input))) { + yield environmentEventFromSandboxEvent(event); + } + }, + ...(box.dispatchPrompt + ? { + async dispatch(input: AgentTurnInput): Promise { + const dispatched = await box.dispatchPrompt?.( + promptFromTurnInput(input), + promptOptionsFromTurnInput(input), + ); + return sessionRefFromSandboxDispatch(dispatched, providerName); + }, + } + : {}), + ...(box.session + ? { + session(id: string): AgentSession { + const session = box.session?.(id); + if (!session) throw new Error("sandbox session(id) returned undefined"); + return sandboxSessionAsAgentSession(session); + }, + } + : {}), + ...(box.read ? { read: box.read.bind(box) } : {}), + ...(box.write ? { write: box.write.bind(box) } : {}), + ...(box.exec + ? { + async exec(command: string, options?: ExecRequest): Promise { + return execResultFromSandboxExecResult(await box.exec?.(command, options as never)); + }, + } + : {}), + ...(box.checkpoint + ? { + async checkpoint(options?: CheckpointRequest): Promise { + const result = await box.checkpoint?.(options as never); + return { id: checkpointIdFromResult(result), provider: providerName }; + }, + } + : {}), + ...(box.fork + ? { + async fork(checkpoint: CheckpointRef, options?: ForkRequest): Promise { + const forked = await box.fork?.(checkpoint.id, options as never); + if (!forked) throw new Error("sandbox fork returned no environment"); + return sandboxInstanceAsEnvironment(forked, providerName, client); + }, + } + : {}), + async placement(): Promise { + return placementInfoFromLoopPlacement(client.describePlacement?.(box), box); + }, + async refresh(): Promise { + await box.refresh?.(); + }, + async destroy(): Promise { + await box.delete?.(); + }, + }; +} + +function sandboxSessionAsAgentSession(session: SandboxSessionLike): AgentSession { + return { + id: session.id, + async status(): Promise { + const status = await session.status(); + if (!status) return null; + return sessionStatusFromUnknown((status as { status?: unknown }).status); + }, + async *events(options?: { + since?: string; + signal?: AbortSignal; + }): AsyncIterable { + for await (const event of session.events(options)) yield environmentEventFromSandboxEvent(event); + }, + async result(): Promise { + return agentTurnResultFromPromptResult(await session.result()); + }, + async prompt(input: AgentTurnInput): Promise { + return agentTurnResultFromPromptResult( + await session.prompt(promptFromTurnInput(input), promptOptionsFromTurnInput(input)), + ); + }, + cancel: session.cancel.bind(session), + }; +} + +function sandboxOptionsFromCreateInput( + input: CreateAgentEnvironmentInput, + defaultBackend: BackendType, +): CreateSandboxOptions { + const workspace = input.workspace ?? {}; + const providerOptions = input.providerOptions?.sandboxCreateOptions; + const base = + providerOptions && typeof providerOptions === "object" + ? ({ ...(providerOptions as CreateSandboxOptions) } as CreateSandboxOptions) + : ({} satisfies CreateSandboxOptions); + return { + ...base, + ...(workspace.environment ? { environment: workspace.environment } : {}), + ...(workspace.image ? { image: workspace.image } : {}), + ...(workspace.repoUrl ? { git: { url: workspace.repoUrl, ref: workspace.gitRef } } : {}), + ...(input.resources ? { resources: input.resources as unknown as CreateSandboxOptions["resources"] } : {}), + ...(input.env ? { env: input.env } : {}), + ...(Array.isArray(input.secrets) ? { secrets: input.secrets } : {}), + ...(input.metadata ? { metadata: input.metadata } : {}), + ...(input.name ? { name: input.name } : {}), + ...(input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : {}), + backend: { + ...(base.backend ?? {}), + type: (input.backend ?? defaultBackend) as BackendType, + profile: input.profile, + }, + }; +} + +function environmentEventFromSandboxEvent(event: SandboxEvent): AgentEnvironmentEvent { + const data = + event.data && typeof event.data === "object" + ? (event.data as Record) + : ({} as Record); + return { + type: String(event.type), + data, + ...(event.id ? { id: event.id } : {}), + usage: tokenUsageFromData(data), + providerEvent: event, + }; +} + +function promptFromTurnInput(input: AgentTurnInput): string | InputPart[] { + if (input.parts) return input.parts; + return input.prompt ?? ""; +} + +function promptOptionsFromTurnInput(input: AgentTurnInput): PromptOptions { + return { + ...(input.sessionId ? { sessionId: input.sessionId } : {}), + ...(input.model ? { model: input.model } : {}), + ...(input.timeoutMs ? { timeoutMs: input.timeoutMs } : {}), + ...(input.context ? { context: input.context } : {}), + ...(input.signal ? { signal: input.signal } : {}), + ...(input.executionId ? { executionId: input.executionId } : {}), + ...(input.lastEventId ? { lastEventId: input.lastEventId } : {}), + ...(input.turnId ? { turnId: input.turnId } : {}), + ...(input.detach !== undefined ? { detach: input.detach } : {}), + }; +} + +function agentTurnResultFromPromptResult(result: PromptResult): AgentTurnResult { + const record = result as unknown as Record; + const text = + typeof record.response === "string" + ? record.response + : typeof record.text === "string" + ? record.text + : typeof record.finalText === "string" + ? record.finalText + : ""; + const success = typeof record.success === "boolean" ? record.success : true; + return { + text, + success, + ...(typeof record.error === "string" ? { error: record.error } : {}), + usage: tokenUsageFromData(record), + }; +} + +function sessionRefFromSandboxDispatch(dispatched: unknown, providerName: string): AgentSessionRef { + const record = + dispatched && typeof dispatched === "object" + ? (dispatched as Record) + : undefined; + const id = record?.sessionId ?? record?.id; + if (typeof id !== "string" || id.length === 0 || !record) { + throw new Error("sandbox dispatch returned no session id"); + } + return { + id, + provider: providerName, + metadata: { + ...(record.status ? { status: record.status } : {}), + ...(record.alreadyExisted !== undefined ? { alreadyExisted: record.alreadyExisted } : {}), + }, + }; +} + +function execResultFromSandboxExecResult(result: SandboxExecResult | undefined): ExecResult { + const record = (result ?? {}) as unknown as Record; + return { + exitCode: finiteNumber(record.exitCode) ?? finiteNumber(record.code) ?? 0, + stdout: typeof record.stdout === "string" ? record.stdout : "", + stderr: typeof record.stderr === "string" ? record.stderr : "", + }; +} + +function checkpointIdFromResult(result: unknown): string { + const record = result && typeof result === "object" ? (result as Record) : {}; + const id = record.checkpointId ?? record.id; + if (typeof id !== "string" || id.length === 0) { + throw new Error("sandbox checkpoint returned no checkpoint id"); + } + return id; +} + +function placementInfoFromLoopPlacement( + placement: unknown, + box: SandboxInstanceLike, +): PlacementInfo { + if (!placement || typeof placement !== "object") return { kind: "sandbox", sandboxId: String(box.id) }; + const record = placement as Record; + return { + kind: record.kind === "fleet" ? "fleet" : "sandbox", + sandboxId: typeof record.sandboxId === "string" ? record.sandboxId : String(box.id), + ...(typeof record.fleetId === "string" ? { fleetId: record.fleetId } : {}), + ...(typeof record.machineId === "string" ? { machineId: record.machineId } : {}), + }; +} + +function tokenUsageFromData(data: Record): TokenUsage | undefined { + const usageRecord = + data.usage && typeof data.usage === "object" + ? (data.usage as Record) + : data.tokenUsage && typeof data.tokenUsage === "object" + ? (data.tokenUsage as Record) + : data; + const inputTokens = + finiteNumber(usageRecord.inputTokens) ?? + finiteNumber(usageRecord.tokensIn) ?? + finiteNumber(usageRecord.prompt_tokens); + const outputTokens = + finiteNumber(usageRecord.outputTokens) ?? + finiteNumber(usageRecord.tokensOut) ?? + finiteNumber(usageRecord.completion_tokens); + const cost = + finiteNumber(usageRecord.cost) ?? + finiteNumber(usageRecord.costUsd) ?? + finiteNumber(usageRecord.totalCostUsd) ?? + finiteNumber(data.costUsd) ?? + finiteNumber(data.totalCostUsd); + if (inputTokens === undefined && outputTokens === undefined && cost === undefined) return undefined; + return { + inputTokens: inputTokens ?? 0, + outputTokens: outputTokens ?? 0, + ...(cost !== undefined ? { cost } : {}), + }; +} + +function statusFromUnknown(status: unknown): AgentEnvironmentStatus { + if (status === "pending" || status === "provisioning" || status === "running") return status; + if (status === "stopped" || status === "failed" || status === "expired") return status; + if (status === "completed" || status === "cancelled") return "stopped"; + return "unknown"; +} + +function sessionStatusFromUnknown(status: unknown): AgentSessionStatus { + if (status === "completed" || status === "cancelled") return status; + return statusFromUnknown(status); +} + +function finiteNumber(value: unknown): number | undefined { + return typeof value === "number" && Number.isFinite(value) ? value : undefined; +} + +export function defaultTangleSandboxCapabilities(): AgentEnvironmentCapabilities { + return { + profile: { + namedProfiles: true, + systemPrompt: true, + instructions: true, + tools: true, + permissions: true, + mcp: true, + subagents: true, + resources: { + files: true, + instructions: true, + tools: true, + skills: true, + agents: true, + commands: true, + }, + hooks: true, + modes: true, + runtimeUpdate: true, + validation: true, + }, + streaming: { live: true, replay: true, detach: true, turnIdempotency: true }, + sessions: { continue: true, list: true, messages: true }, + workspace: { read: true, write: true, exec: true, git: true, upload: true, download: true }, + branching: { checkpoint: true, fork: true }, + placement: true, + usage: true, + confidential: true, + }; +} diff --git a/packages/agent-provider-sandbox/tsconfig.json b/packages/agent-provider-sandbox/tsconfig.json new file mode 100644 index 0000000..491458e --- /dev/null +++ b/packages/agent-provider-sandbox/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "lib": ["ES2022", "DOM"], + "strict": true, + "skipLibCheck": true, + "declaration": true, + "outDir": "./dist", + "rootDir": "./src", + "types": ["node"] + }, + "include": ["src"] +} diff --git a/packages/agent-provider-testkit/LICENSE b/packages/agent-provider-testkit/LICENSE new file mode 100644 index 0000000..9d104f8 --- /dev/null +++ b/packages/agent-provider-testkit/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Tangle Network + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/agent-provider-testkit/README.md b/packages/agent-provider-testkit/README.md new file mode 100644 index 0000000..04bf4e4 --- /dev/null +++ b/packages/agent-provider-testkit/README.md @@ -0,0 +1,15 @@ +# @tangle-network/agent-provider-testkit + +Framework-neutral checks for packages that implement `AgentEnvironmentProvider`. + +```ts +import { runAgentEnvironmentProviderConformance } from '@tangle-network/agent-provider-testkit' + +await runAgentEnvironmentProviderConformance({ + name: 'my-provider', + createProvider: () => createMyProvider(), +}) +``` + +The checks create an environment, stream one turn, verify terminal completion, +exercise declared workspace methods, and destroy the environment. diff --git a/packages/agent-provider-testkit/package.json b/packages/agent-provider-testkit/package.json new file mode 100644 index 0000000..fb46352 --- /dev/null +++ b/packages/agent-provider-testkit/package.json @@ -0,0 +1,54 @@ +{ + "name": "@tangle-network/agent-provider-testkit", + "version": "0.1.0", + "description": "Framework-neutral conformance checks for AgentEnvironmentProvider implementations", + "type": "module", + "license": "MIT", + "main": "dist/index.js", + "types": "src/index.ts", + "exports": { + ".": { + "import": "./src/index.ts", + "types": "./src/index.ts" + } + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tangle-network/agent-sdk.git", + "directory": "packages/agent-provider-testkit" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + } + }, + "files": [ + "dist/index.d.ts", + "dist/index.js", + "README.md", + "LICENSE" + ], + "scripts": { + "build": "tsc -p tsconfig.json", + "check-types": "tsc --noEmit", + "clean": "rm -rf dist", + "prepare": "pnpm run build", + "test": "vitest run" + }, + "dependencies": { + "@tangle-network/agent-interface": "workspace:*" + }, + "devDependencies": { + "@types/node": "catalog:", + "typescript": "^6.0.3", + "vitest": "catalog:" + } +} diff --git a/packages/agent-provider-testkit/src/index.test.ts b/packages/agent-provider-testkit/src/index.test.ts new file mode 100644 index 0000000..26dd6bb --- /dev/null +++ b/packages/agent-provider-testkit/src/index.test.ts @@ -0,0 +1,76 @@ +import { describe, expect, it } from "vitest"; +import type { + AgentEnvironmentProvider, + AgentTurnInput, +} from "@tangle-network/agent-interface/environment-provider"; +import { runAgentEnvironmentProviderConformance } from "./index.js"; + +describe("runAgentEnvironmentProviderConformance", () => { + it("accepts a provider that implements the required lifecycle", async () => { + const report = await runAgentEnvironmentProviderConformance({ + name: "fake", + createProvider: () => fakeProvider(), + }); + + expect(report.provider).toBe("fake"); + expect(report.checked).toContain("stream"); + expect(report.checked).toContain("workspace-exec"); + }); +}); + +function fakeProvider(): AgentEnvironmentProvider { + const files = new Map(); + return { + name: "fake", + capabilities: () => ({ + profile: { + namedProfiles: true, + systemPrompt: true, + instructions: true, + tools: true, + permissions: true, + mcp: true, + subagents: true, + resources: { + files: true, + instructions: true, + tools: true, + skills: true, + agents: true, + commands: true, + }, + hooks: true, + modes: true, + runtimeUpdate: true, + validation: true, + }, + streaming: { live: true, replay: false, detach: false, turnIdempotency: true }, + sessions: { continue: true, list: false, messages: false }, + workspace: { read: true, write: true, exec: true, git: false, upload: false, download: false }, + branching: { checkpoint: false, fork: false }, + placement: false, + usage: true, + confidential: false, + }), + async create() { + return { + id: "env-1", + provider: "fake", + status: async () => "running", + async *stream(input: AgentTurnInput) { + yield { + type: "result", + data: { finalText: input.prompt ?? "ok" }, + usage: { inputTokens: 1, outputTokens: 1 }, + }; + }, + read: async (path: string) => files.get(path) ?? "", + write: async (path: string, content: string) => { + files.set(path, content); + }, + exec: async () => ({ exitCode: 0, stdout: "ok\n", stderr: "" }), + destroy: async () => {}, + }; + }, + }; +} diff --git a/packages/agent-provider-testkit/src/index.ts b/packages/agent-provider-testkit/src/index.ts new file mode 100644 index 0000000..0209388 --- /dev/null +++ b/packages/agent-provider-testkit/src/index.ts @@ -0,0 +1,149 @@ +import type { + AgentEnvironment, + AgentEnvironmentCapabilities, + AgentEnvironmentEvent, + AgentEnvironmentProvider, + CreateAgentEnvironmentInput, +} from "@tangle-network/agent-interface/environment-provider"; + +export interface ProviderConformanceOptions { + name: string; + createProvider(): AgentEnvironmentProvider | Promise; + createInput?: Partial; + prompt?: string; + requireUsage?: boolean; + requireDispatch?: boolean; +} + +export interface ProviderConformanceReport { + provider: string; + environmentId: string; + capabilities: AgentEnvironmentCapabilities; + events: number; + checked: string[]; +} + +export class ProviderConformanceError extends Error { + constructor( + message: string, + readonly checked: string[], + ) { + super(message); + this.name = "ProviderConformanceError"; + } +} + +export async function runAgentEnvironmentProviderConformance( + options: ProviderConformanceOptions, +): Promise { + const checked: string[] = []; + const provider = await options.createProvider(); + assert(provider.name, "provider.name must be non-empty", checked); + assert(typeof provider.capabilities === "function", "provider.capabilities must be a function", checked); + checked.push("provider-shape"); + + const capabilities = await provider.capabilities(); + assert(capabilities.profile !== undefined, "capabilities.profile is required", checked); + assert(capabilities.streaming !== undefined, "capabilities.streaming is required", checked); + assert(capabilities.workspace !== undefined, "capabilities.workspace is required", checked); + checked.push("capabilities"); + + const environment = await provider.create({ + profile: { name: `${options.name}-profile` }, + backend: "test", + name: `${options.name}-environment`, + ...(options.createInput ?? {}), + }); + assert(environment.id, "environment.id must be non-empty", checked); + assert(environment.provider, "environment.provider must be non-empty", checked); + checked.push("create"); + + const events = await collect( + environment.stream({ + prompt: options.prompt ?? "Return the word ok.", + sessionId: `${options.name}-session`, + turnId: `${options.name}-turn`, + }), + ); + assert(events.length > 0, "stream must emit at least one event", checked); + assert( + events.some(isTerminalEvent), + "stream must emit a terminal result/done/status event", + checked, + ); + if (options.requireUsage || capabilities.usage) { + assert( + events.some((event) => Boolean(event.usage)), + "provider declared usage support but emitted no usage", + checked, + ); + } + checked.push("stream"); + + if (options.requireDispatch || capabilities.streaming.detach) { + assert(typeof environment.dispatch === "function", "detach support requires dispatch()", checked); + const session = await environment.dispatch?.({ + prompt: options.prompt ?? "Return the word ok.", + sessionId: `${options.name}-dispatch`, + }); + assert(session?.id, "dispatch() must return a session id", checked); + checked.push("dispatch"); + } + + await checkWorkspace(environment, capabilities, checked); + + await environment.destroy?.(); + checked.push("destroy"); + + return { + provider: provider.name, + environmentId: environment.id, + capabilities, + events: events.length, + checked, + }; +} + +async function checkWorkspace( + environment: AgentEnvironment, + capabilities: AgentEnvironmentCapabilities, + checked: string[], +): Promise { + if (capabilities.workspace.write) { + assert(typeof environment.write === "function", "workspace.write requires write()", checked); + await environment.write?.("agent-provider-testkit.txt", "ok"); + checked.push("workspace-write"); + } + + if (capabilities.workspace.read) { + assert(typeof environment.read === "function", "workspace.read requires read()", checked); + await environment.read?.("agent-provider-testkit.txt"); + checked.push("workspace-read"); + } + + if (capabilities.workspace.exec) { + assert(typeof environment.exec === "function", "workspace.exec requires exec()", checked); + const result = await environment.exec?.("echo ok"); + assert(result?.exitCode !== undefined, "exec() must return an exit code", checked); + checked.push("workspace-exec"); + } +} + +async function collect(iterable: AsyncIterable): Promise { + const out: T[] = []; + for await (const value of iterable) out.push(value); + return out; +} + +function assert(value: unknown, message: string, checked: string[]): asserts value { + if (!value) throw new ProviderConformanceError(message, checked); +} + +function isTerminalEvent(event: AgentEnvironmentEvent): boolean { + if (event.type === "result" || event.type === "done" || event.type === "final") return true; + if (event.type.endsWith(".completed") || event.type.endsWith(".failed")) return true; + if (event.type === "status") { + return event.data.status === "completed" || event.data.status === "failed" || event.data.status === "cancelled"; + } + return false; +} diff --git a/packages/agent-provider-testkit/tsconfig.json b/packages/agent-provider-testkit/tsconfig.json new file mode 100644 index 0000000..491458e --- /dev/null +++ b/packages/agent-provider-testkit/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "lib": ["ES2022", "DOM"], + "strict": true, + "skipLibCheck": true, + "declaration": true, + "outDir": "./dist", + "rootDir": "./src", + "types": ["node"] + }, + "include": ["src"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9f8d0fb..e78f60c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,7 +47,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.9(@types/node@25.6.0)(vite@8.1.0(@types/node@25.6.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(vite@8.1.0(@types/node@25.6.0)(yaml@2.9.0)) packages/agent-interface: dependencies: @@ -62,8 +62,237 @@ importers: specifier: ^6.0.3 version: 6.0.3 + packages/agent-provider-cli-bridge: + dependencies: + '@tangle-network/agent-interface': + specifier: workspace:* + version: link:../agent-interface + devDependencies: + '@types/node': + specifier: 'catalog:' + version: 25.6.0 + typescript: + specifier: ^6.0.3 + version: 6.0.3 + vitest: + specifier: 'catalog:' + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(vite@8.1.0(@types/node@25.6.0)(yaml@2.9.0)) + + packages/agent-provider-computesdk: + dependencies: + '@tangle-network/agent-interface': + specifier: workspace:* + version: link:../agent-interface + computesdk: + specifier: ^4.1.3 + version: 4.1.3 + devDependencies: + '@tangle-network/agent-provider-testkit': + specifier: workspace:* + version: link:../agent-provider-testkit + '@types/node': + specifier: 'catalog:' + version: 25.6.0 + typescript: + specifier: ^6.0.3 + version: 6.0.3 + vitest: + specifier: 'catalog:' + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(vite@8.1.0(@types/node@25.6.0)(yaml@2.9.0)) + + packages/agent-provider-daytona: + dependencies: + '@daytonaio/sdk': + specifier: ^0.192.0 + version: 0.192.0(ws@8.21.0) + '@tangle-network/agent-interface': + specifier: workspace:* + version: link:../agent-interface + devDependencies: + '@tangle-network/agent-provider-testkit': + specifier: workspace:* + version: link:../agent-provider-testkit + '@types/node': + specifier: 'catalog:' + version: 25.6.0 + typescript: + specifier: ^6.0.3 + version: 6.0.3 + vitest: + specifier: 'catalog:' + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(vite@8.1.0(@types/node@25.6.0)(yaml@2.9.0)) + + packages/agent-provider-e2b: + dependencies: + '@tangle-network/agent-interface': + specifier: workspace:* + version: link:../agent-interface + e2b: + specifier: ^2.31.0 + version: 2.31.0 + devDependencies: + '@tangle-network/agent-provider-testkit': + specifier: workspace:* + version: link:../agent-provider-testkit + '@types/node': + specifier: 'catalog:' + version: 25.6.0 + typescript: + specifier: ^6.0.3 + version: 6.0.3 + vitest: + specifier: 'catalog:' + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(vite@8.1.0(@types/node@25.6.0)(yaml@2.9.0)) + + packages/agent-provider-sandbox: + dependencies: + '@tangle-network/agent-interface': + specifier: workspace:* + version: link:../agent-interface + devDependencies: + '@tangle-network/agent-provider-testkit': + specifier: workspace:* + version: link:../agent-provider-testkit + '@tangle-network/sandbox': + specifier: ^0.8.2 + version: 0.8.2 + '@types/node': + specifier: 'catalog:' + version: 25.6.0 + typescript: + specifier: ^6.0.3 + version: 6.0.3 + vitest: + specifier: 'catalog:' + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(vite@8.1.0(@types/node@25.6.0)(yaml@2.9.0)) + + packages/agent-provider-testkit: + dependencies: + '@tangle-network/agent-interface': + specifier: workspace:* + version: link:../agent-interface + devDependencies: + '@types/node': + specifier: 'catalog:' + version: 25.6.0 + typescript: + specifier: ^6.0.3 + version: 6.0.3 + vitest: + specifier: 'catalog:' + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(vite@8.1.0(@types/node@25.6.0)(yaml@2.9.0)) + packages: + '@aws-crypto/crc32@5.2.0': + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/crc32c@5.2.0': + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} + + '@aws-crypto/sha1-browser@5.2.0': + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/checksums@3.1000.8': + resolution: {integrity: sha512-v0U9S7gBIme3OTgt1LdbAF4RpvavCc+4GK1+1xqAcqtbrHsEhjQo6R45LKcjhs/+WrRJij1Y0Gztw7QPAIeUfA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/client-s3@3.1075.0': + resolution: {integrity: sha512-h1A6nIl1YX6Y45enGsTK7ef3ZrOnBiQJ1qF5R2K/nMWfsu6A9mc2Y5T66nxerABzyjjyyvign3MrzafnFoQKmA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/core@3.974.23': + resolution: {integrity: sha512-MiWR/uWjxjFXGzrE0Ghc5lWxUxzHsUWFhV+OX7M4cR9SrmrnZs6TXavnCWnzzdwJeFri34xQo81rvGNzK3c4BQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-env@3.972.49': + resolution: {integrity: sha512-liB3yQNHCM9k/gu/w36XHMKPluT7HTlnGUhRbBGSISDQkcr/Sy1zsZabiuvQj8WG5yW573u9RehrBvvnIQ9OEQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-http@3.972.51': + resolution: {integrity: sha512-XET0H2oofciJ5lMRWNIvRjAP7Q3wv2XT+JtJJEdhPWUMwe3TvQ9qcxonpu7vXmNngncvFpi4E2It+Tamas/naA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-ini@3.972.56': + resolution: {integrity: sha512-IAmc61hbgQiHht9U3x0tnRwz0lzdwOwD/i9voRgdJrKamF+JtmrBOsW9GwB7mfFonNWOWL4qARWYrF8veEMe3w==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-login@3.972.55': + resolution: {integrity: sha512-hBBkANo3cDn+h2qxxzER4a+J8JCO9o9Z/YYmU7iky6AcaarX5RRdRcHNC6SLdwY0vAXQygn6soUbDqPn3GghaA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-node@3.972.58': + resolution: {integrity: sha512-OyCLVmSI7pZO8hxwNVX6pXhTVlJqRBTp+ijdEfJSUj0RyjHnF602OfAarOzGq6wkGodeFkYBt8MmJ6A6ycRgWw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-process@3.972.49': + resolution: {integrity: sha512-C8h36lBuC/RnBSsjlO+dn6xZm3KbAl5vpJaVPAfQnMmz2/OISmKOc8XZcqMQgO2ADwBYNRMM6Kf3vz9G/TulMQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-sso@3.972.55': + resolution: {integrity: sha512-1FkOz74Ea5QGS9jtIoXp55T/IkSS3spv+nLTT07fRY/+T5xmEOqaYBVIaEmX4zTNvbV6g2lrtlaVKWEoNyJt3w==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.972.55': + resolution: {integrity: sha512-g2BoECD1q01kTPByi56+VLVvdWDzMkKIcr77qixpqH0okw2t0U5CoPv+6S8v/D1Y2Wa6QKKtn6XAtDzP+Kfpvg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/lib-storage@3.1075.0': + resolution: {integrity: sha512-Npdac3/Fv994iCdFFeqloPel+95Zv6dRiRUpfey6W/CqpB/QdnYP60U4YBhBgJj6V5020Pm3ad0HV4WzCE5hHQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@aws-sdk/client-s3': ^3.1075.0 + + '@aws-sdk/middleware-flexible-checksums@3.974.33': + resolution: {integrity: sha512-qMgQSPemQq2/eW/e/0+SpY4kYR5L7dUgBiVdEc5bd+ztHNv07ZMYiI+sTiir3TgKndFfglSw/VFi7oZJ6bZ63g==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-sdk-s3@3.972.54': + resolution: {integrity: sha512-GDfDQ0gwLFRKN9gWIKcmVrHJ3e7XagnY7N1LLzMVNgnOnuY7f/ALgmy3CuBjosWD95T/Z6e+gs1IeWmLPkyLKQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/nested-clients@3.997.23': + resolution: {integrity: sha512-gO93ZPsI2bxeFZD42f1/qjDw6FAZkNZcKRO94LIiT03fzOmcJ9e/tunxjVjA1Rl69ClmVJzz8H3G9CdKef10PA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.996.35': + resolution: {integrity: sha512-6L/VWs+Wch2stHemCGTmUNqKLMzURxQDK5boNG3Jn3kAOp71meDUuS5sbObpEvFxHDq0uWeSLFDNSYsjNt+Dlg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/token-providers@3.1074.0': + resolution: {integrity: sha512-pv80IzgGW4RnXWtft692chZOM9i6PhebVsLCcnaM4dBEPZva2fE6FXAHs76G7Rc7s3yGyX/68G0nZMrUy+Vmpg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/types@3.973.13': + resolution: {integrity: sha512-pEHZqRkAlHfnfAU9tK+WpKv/gBNjGJrHMgA3A0iYRGyswBS2t0pfez+lWlwktb3Bqa0ovh7w/QJTFwp3fDxLNg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-locate-window@3.965.8': + resolution: {integrity: sha512-uUbMs1cBZPafD0ohUj6EwNf0fPZ534NvBxHox4hjX+0Rxq5paSYUem7+hi833pYrzrcnBATKIYpR02MDXT5M9g==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/xml-builder@3.972.31': + resolution: {integrity: sha512-SzE4Pgyl+hDF+BuyuzxUSpwnuUu9lJuO1YGgteG89/4Qv0+2IQiVQqdbPV32IozLvXWQChPQcdkk/sKvb1QHiQ==} + engines: {node: '>=20.0.0'} + + '@aws/lambda-invoke-store@0.2.4': + resolution: {integrity: sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==} + engines: {node: '>=18.0.0'} + '@babel/generator@8.0.0-rc.3': resolution: {integrity: sha512-em37/13/nR320G4jab/nIIHZgc2Wz2y/D39lxnTyxB4/D/omPQncl/lSdlnJY1OhQcRGugTSIF2l/69o31C9dA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -102,6 +331,9 @@ packages: resolution: {integrity: sha512-mOm5ZrYmphGfqVWoH5YYMTITb3cDXsFgmvFlvkvWDMsR9X8RFnt7a0Wb6yNIdoFsiMO9WjYLq+U/FMtqIYAF8Q==} engines: {node: ^20.19.0 || >=22.12.0} + '@bufbuild/protobuf@2.12.1': + resolution: {integrity: sha512-BvAMfS6LrgZiryOAZ4pBYucu4wG/Ei/9o9DZ9akbREnMLbPJiom2i8b9C8IsKErQoiKqVhrerzt3kOT/RrzLHg==} + '@changesets/apply-release-plan@7.1.1': resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} @@ -157,6 +389,30 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@computesdk/cmd@0.4.1': + resolution: {integrity: sha512-hhcYrwMnOpRSwWma3gkUeAVsDFG56nURwSaQx8vCepv0IuUv39bK4mMkgszolnUQrVjBDdW7b3lV+l5B2S8fRA==} + + '@connectrpc/connect-web@2.0.0-rc.3': + resolution: {integrity: sha512-w88P8Lsn5CCsA7MFRl2e6oLY4J/5toiNtJns/YJrlyQaWOy3RO8pDgkz+iIkG98RPMhj2thuBvsd3Cn4DKKCkw==} + peerDependencies: + '@bufbuild/protobuf': ^2.2.0 + '@connectrpc/connect': 2.0.0-rc.3 + + '@connectrpc/connect@2.0.0-rc.3': + resolution: {integrity: sha512-ARBt64yEyKbanyRETTjcjJuHr2YXorzQo0etyS5+P6oSeW8xEuzajA9g+zDnMcj1hlX2dQE93foIWQGfpru7gQ==} + peerDependencies: + '@bufbuild/protobuf': ^2.2.0 + + '@daytona/api-client@0.192.0': + resolution: {integrity: sha512-fBzQ7KT9ZW2c4TgryYVGI8KUiUH02SCuKl1m0hqJQZDVkE6sbMiMlm5DZ0jwMCbQ8afWyOscvXmSSxdGQ/jUKQ==} + + '@daytona/toolbox-api-client@0.192.0': + resolution: {integrity: sha512-fEyA3YPK+IJezECBfZoNhf29qtZhy8AqI0lcgR+Bob6hEiInx9+sH26506ZkxmpGM4/5EApeLzUI1g5B9u2XHA==} + + '@daytonaio/sdk@0.192.0': + resolution: {integrity: sha512-9EHPTrxpYkLL+KcV9LdH+wJndKcpJCQC6hsVXD1xw+kfqkQ32w3HgIPqOkVJSQs1H4J1Us68hnicl9Pwi3SmDA==} + deprecated: 'Moved to @daytona/sdk, same API, no breaking changes. Please update: npm uninstall @daytonaio/sdk && npm i @daytona/sdk' + '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} @@ -175,6 +431,18 @@ packages: '@emnapi/wasi-threads@1.2.2': resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@grpc/grpc-js@1.14.4': + resolution: {integrity: sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.8.1': + resolution: {integrity: sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==} + engines: {node: '>=6'} + hasBin: true + + '@iarna/toml@2.2.5': + resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} + '@inquirer/external-editor@1.0.3': resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} @@ -184,6 +452,14 @@ packages: '@types/node': optional: true + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -197,6 +473,9 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -221,12 +500,234 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@opentelemetry/api-logs@0.217.0': + resolution: {integrity: sha512-Cdq0jW2lknrNfrAm92MyEAvpe2cRsKjdnQLHUL6xRA4IVUnsWx6P65E7NcUO0Y+L4w1Aee5iV8FvjSwd+lrs9A==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.1': + resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/configuration@0.217.0': + resolution: {integrity: sha512-xCtrYOhBqdy6ZOMfe0Oa73ZKF+2LMhoOv4L5vmwAHVvOXUg+V3fvKuEIr9ZyD0Ow+vxllEjWO6PV1wd0DOtyvw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + + '@opentelemetry/context-async-hooks@2.7.1': + resolution: {integrity: sha512-OPFBYuXEn1E4ja3Y6eeA7O+ZnLBNcXTV5Cgsn1VaqBZ6hC5FnpZPLBNme1LJY8ZtF4aOujPKFoeWN4ik487KuQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.7.1': + resolution: {integrity: sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.8.0': + resolution: {integrity: sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-logs-otlp-grpc@0.217.0': + resolution: {integrity: sha512-vC5S0Dc+noxD86CVtNu1+awCHPA5Kewi1Sg23ps+9lh4YifwsKXh3pe4XTNEKtUJiAcjpJ5dqStGakLbrSE+YQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-logs-otlp-http@0.217.0': + resolution: {integrity: sha512-KfLAdt1uilVE+3FxbgVnp2ZrzqbIawzcesnRoi+Kh9ckB5Ld5D8btUgoBvwTbdmuNx1j6b132Wsh72azq+pPNQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-logs-otlp-proto@0.217.0': + resolution: {integrity: sha512-Se0GG/ZO24mQTlQj7zprR4pNI0nKe4lPDPBsuJmi6508b9TlZEuUd3EfyuHk6oJxzL7fGyDFYAbxNigQvRP2ZQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-grpc@0.217.0': + resolution: {integrity: sha512-0GpJKnCoVaVA1rKBMVPHziznfOQlXgH72S9ktjBAF1AnAVPzX7vVEBGrhwiSxxHDAiefXk+J8znApsMb/K6Z3w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-http@0.217.0': + resolution: {integrity: sha512-1zkMzzhiNJdVmLxuwkltqWGw4fOOam47bqRxmuQNjyKJe/9NmY5cIrZ4kiQV7sVGxoOgT0ZvGUfLcjvtpC/b9Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-proto@0.217.0': + resolution: {integrity: sha512-nfxt/KxVGFkjkO/M+58y1ugHu/dwPtxG4eYq0KApcQ7xk5CHzhdn+IuLZfDSvNDrJ3Uy5q++Fj/wbK7i8yryfQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-prometheus@0.217.0': + resolution: {integrity: sha512-U9MCXxJu0sBCh5aEkylYRR4xVIL8D1CW6dGwvYXbfFr0qveSorfD0XJchCAWoW6QfAAIcY/yxjf4Dj8OgkHBPw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-grpc@0.217.0': + resolution: {integrity: sha512-fPZs2fw7veLH3pEKu8vSepUa2fQpAE2P7al6qU10aH9GrEJJ8YaPgsd5xON7by5rbcEVS71FOU2aWyK6nzB7VQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-http@0.217.0': + resolution: {integrity: sha512-38YQoqtYjglz2GV94LGUN/djLvxtvGIQO68o6qAFPVshjmwSdX1F2i0c7vn3lEl1L5B/YqjB/bgKXaVx7KO+RQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-proto@0.217.0': + resolution: {integrity: sha512-nPV8gKHUiSuTZpQcnZU3/pBlK7crSyEGpZuh5MtWySB0vv6NNG0QvvfKitQt+Fc2Mc6qfyU54KlZcurwoTbrVg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-zipkin@2.7.1': + resolution: {integrity: sha512-mfsD9bKAxcKrh5+y08TPodvClBO0CznBE3p79YAGnO81WI4LrdsGA65T53e4iTSbCalW4WaUpkbeJcbpyIUHfg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/instrumentation-http@0.217.0': + resolution: {integrity: sha512-B88Y7k5A9a60pHUboFoeJlgVwXq2T0rsZKj6dTwzSMKSOsNXR4Jz5ovwprVn3kHLAZrkyLEjQtBJ34DYHs1U4Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.217.0': + resolution: {integrity: sha512-24ucQMjz7Y34Kw3trbxL2ZrssbtgWnR+Clpaa+YdeWuuyH3Cvk23Q03PcQvqiZrDvt8AmQmjgg9v6Y9PHoxG7w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.217.0': + resolution: {integrity: sha512-eYfqnB3UhKu/5frhd1R6+FprKygbhkomuaceMXDyzxbfXB9tKgZOVmjaJ02CkLA6Tdzumxl+e2H+vo2a8jiMPQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-grpc-exporter-base@0.217.0': + resolution: {integrity: sha512-7RTAdZuOsCDnsyqTCG4+bDzrfnsWdzkRs7z0AVi/V3tEQx0oKeyc+OuRWYxnRsmaJXgxcmB8vb/lfxn58Dj6Ag==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-transformer@0.217.0': + resolution: {integrity: sha512-MKK8UHKFUOGAvbZRWh90MhwHG+Fxm6OROBdjKPCF+HQobjuJ/Kuf8Chs8CR45X1aqotxrMj7OxTdsXe8sXuGVA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/propagator-b3@2.7.1': + resolution: {integrity: sha512-RJid6E2CKyeGfKBzXKF21ejabGMHypFkPAh3qZ+NvI+SGjuIye79t3PmiqcDgtRzdKH6ynXzbfslQ8DfpRUg2A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/propagator-jaeger@2.7.1': + resolution: {integrity: sha512-KMjVBHzP4N60bOzxja76M1F1hZZ43lGPga5ix+mkv9+kk1nx9SbkxSvJsMbuVUxdPQmsPTqGShmhN8ulrMOg6Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/resources@2.7.1': + resolution: {integrity: sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/resources@2.8.0': + resolution: {integrity: sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.217.0': + resolution: {integrity: sha512-BB+PcHItcZDL63dPMW+mJvwN9rk37wuIDjRxbVlg6pPDvDR/7GL7UJHbGsllgoggOoTimsKgENaWPoGch/oE1A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.7.1': + resolution: {integrity: sha512-MpDJdkiFDs3Pm1RHO3KByuZbuBdJEXEAkiC0+yJdsZGVCdf1RpHR6n+LHDcS7ffmfrt5kVCzJSCfm4z2C7v0uQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-node@0.217.0': + resolution: {integrity: sha512-K/60pSv42+NQiZKy1pAH18nYDkxltsDV4O3SJ233J0E9raU1ksyL9gsKuS8p30bYBb4AMPCfDuutHQaHYpcv0Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.7.1': + resolution: {integrity: sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.8.0': + resolution: {integrity: sha512-mhU4jp+vW0mGbFRd+GeXHvmfA4aDqWjBjLC3pE5XMpLs0IE2ryYb019Ts2AQrOq67gaTF25D91+fgvEHDZEnuQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.7.1': + resolution: {integrity: sha512-pCpQxU68lV+I9s9svqMyVu5iHdDDUnqUpSxqwyCU8A9ejEsSnMPCbearwsUO4yk08ZJzAIUCFuReMdVQvHrdvg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.41.1': + resolution: {integrity: sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA==} + engines: {node: '>=14'} + '@oxc-project/types@0.127.0': resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} '@oxc-project/types@0.137.0': resolution: {integrity: sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==} + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.5': + resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==} + + '@protobufjs/eventemitter@1.1.1': + resolution: {integrity: sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==} + + '@protobufjs/fetch@1.1.1': + resolution: {integrity: sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.2': + resolution: {integrity: sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.1': + resolution: {integrity: sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==} + '@quansync/fs@1.0.0': resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} @@ -414,9 +915,68 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + '@smithy/core@3.26.0': + resolution: {integrity: sha512-mLUktFAn+Pa2agl1J7VgtYNFWCX8/b4GMJSK1hCu4YCvtBfM6F8Os3EP4ry+DFFlXOf3wyvlgXhuUdFoy52D3g==} + engines: {node: '>=18.0.0'} + + '@smithy/credential-provider-imds@4.4.2': + resolution: {integrity: sha512-18UMDMyrAbDcpmL1gLUA7ww0fRTcdCrSjSJOi2Sbld+tVjwD/pW+OAwjlScFLR7vvBnhZrIPQ7kVuTf1mnJLug==} + engines: {node: '>=18.0.0'} + + '@smithy/fetch-http-handler@5.5.2': + resolution: {integrity: sha512-Ei/UK/QMhq0rKaMqGPlOAkE2yS9DZeYmZdk1RAKc3vp3zxgleZHZyBLlZv8yLsxljX4svCRuMTD6u3LLIcU4Bg==} + 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/node-http-handler@4.8.2': + resolution: {integrity: sha512-wfl1uwrAqMH9/pi4kqBo5LBcFwrJLxuDLqL7p7qNcJIFcyZDUc6pzhYk4CYv+DP7fIUpQCZumwNnkhPKS52osQ==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.5.2': + resolution: {integrity: sha512-7xHpmPY4rt0IOmeAA8EfjgEH8isT+587TCdy9H6a7d4OMi5CQ0oEHhWllunvPu4j4Cq0vTFwdxXN/kABWPjdyA==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.15.0': + resolution: {integrity: sha512-Z5TAOxygoFvybJV3igo5SloFflSokHx2hu1eFA+DxDTcn+FtKxUSui+rbTRG1pAafMA888Z3MVvCWUuvCrTXjg==} + 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-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@tangle-network/agent-interface@0.8.0': + resolution: {integrity: sha512-okz9LGKwPNKODNyT9Y7+T+sQsJ4g6oTy/hpWpxR6r2BI7pS6WqIdgCOQcx98+WtlPoibkY3ewRRAb8YJMrPHog==} + + '@tangle-network/sandbox@0.8.2': + resolution: {integrity: sha512-MG3dj7SnF7vI8CagW1OwpkJSUq3IREpADBWp6knOukKxSYYCMGwJ0nPZz+O2eotI+Nl2A2LIGiHqPB82jgOvjw==} + peerDependencies: + '@mastra/core': ^1.36.0 + '@modelcontextprotocol/sdk': ^1.29.0 + ai: ^6.0.175 + openai: ^6.36.0 + viem: ^2.0.0 + peerDependenciesMeta: + '@mastra/core': + optional: true + '@modelcontextprotocol/sdk': + optional: true + ai: + optional: true + openai: + optional: true + viem: + optional: true + '@tybys/wasm-util@0.10.3': resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} @@ -467,6 +1027,20 @@ packages: '@vitest/utils@4.1.9': resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -475,6 +1049,10 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + ansis@4.3.1: resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} engines: {node: '>=14'} @@ -497,6 +1075,19 @@ packages: resolution: {integrity: sha512-8OG92q3R35qjC/4i6BLBMg8IB+fClWu/1PEwg2Z9Rn+BuNaiEgJzpzn+pxWOdHJWDCAwu2JP0wCDTozAM4QirQ==} engines: {node: ^22.18.0 || >=24.11.0} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.18.1: + resolution: {integrity: sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -504,21 +1095,71 @@ packages: birpc@4.0.0: resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} + bowser@2.14.1: + resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} + + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + buffer@5.6.0: + resolution: {integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + cac@7.0.0: resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} engines: {node: '>=20.19.0'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chardet@2.2.0: resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + cjs-module-lexer@2.2.0: + resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + + computesdk@4.1.3: + resolution: {integrity: sha512-IVC7KenrhCyiGJ1FKTs7jzXTc+mJZNCljux39yzPeR2M48v6tr03YXTtiyefoJ+VZ1J/nVthrAqTF1ng+H4uOQ==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -526,9 +1167,27 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + daemond@0.1.4: + resolution: {integrity: sha512-xiLScBiwYGGPmxfcAb24aH+FkmR/ZSd+PxOvigGpKda6OsDjE2Gj6/4oAX2N3hMWoL4atti1hYyF9dLV3FFM0A==} + engines: {node: '>=18.0.0'} + os: [linux, darwin] + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -541,6 +1200,13 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + dockerfile-ast@0.7.1: + resolution: {integrity: sha512-oX/A4I0EhSkGqrFv0YuvPkBUSYp1XiY8O8zAKc8Djglx8ocz+JfOr8gP0ryRMC2myqvDLagmnZaU9ot1vG2ijw==} + + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + dts-resolver@2.1.3: resolution: {integrity: sha512-bihc7jPC90VrosXNzK0LTE2cuLP6jr0Ro8jk+kMugHReJVLIpHz/xadeq3MhuwyO4TD4OA3L1Q8pBBFRc08Tsw==} engines: {node: '>=20.19.0'} @@ -550,6 +1216,17 @@ packages: oxc-resolver: optional: true + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + e2b@2.31.0: + resolution: {integrity: sha512-vXQomb16mOk+ufi3YFfN6eURm6eC0NZGMK49PXibfpsmy0azcvLbQuHxCkhgyAk5z5GVfrEUwc08QKVtt6KNFg==} + engines: {node: '>=20.18.1'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + empathic@2.0.1: resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} engines: {node: '>=14'} @@ -558,9 +1235,29 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + es-module-lexer@2.1.0: resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -569,6 +1266,14 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} @@ -600,6 +1305,26 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + engines: {node: '>= 6'} + + forwarded-parse@2.1.2: + resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -613,6 +1338,21 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} @@ -620,16 +1360,46 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} + engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + hookable@6.1.1: resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + human-id@4.2.0: resolution: {integrity: sha512-K3GbkIWqyvvlpfhBPlbEvD97TtqBpAYA4kt+cn2lD2x2HuohzZCibcA2nOlnJT6exqvJLggoB5nv2dNf192nEA==} hasBin: true @@ -638,18 +1408,32 @@ packages: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + import-in-the-middle@3.2.0: + resolution: {integrity: sha512-vR2B6HKIhaBjcZr2bLpFiJ1VbzOlRQ7aby4/gw5WPIzToLjqpfWw3VJ4sk1uDchoOODEirvO2jyrSPtUSL5CrQ==} + engines: {node: '>=18'} + import-without-cache@0.3.3: resolution: {integrity: sha512-bDxwDdF04gm550DfZHgffvlX+9kUlcz32UD0AeBTmVPFiWkrexF2XVmiuFFbDhiFuP8fQkrkvI2KdSNPYWAXkQ==} engines: {node: '>=20.19.0'} + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -669,6 +1453,15 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isomorphic-ws@5.0.0: + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + engines: {node: 20 || >=22} + js-yaml@3.14.2: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true @@ -759,12 +1552,26 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} + engines: {node: 20 || >=22} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -773,10 +1580,36 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + nanoid@3.3.15: resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -786,6 +1619,12 @@ packages: resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} engines: {node: '>=12.20.0'} + openapi-fetch@0.14.1: + resolution: {integrity: sha512-l7RarRHxlEZYjMLd/PR0slfMVse2/vvIAGm75/F7J6MlQ8/b9uUQmUF2kCPrQhJqMXSxmYWObVgeYXbFYzZR+A==} + + openapi-typescript-helpers@0.0.15: + resolution: {integrity: sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==} + outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} @@ -809,9 +1648,16 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@0.2.11: resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -820,6 +1666,10 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -842,6 +1692,9 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + platform@1.3.6: + resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} + postcss@8.5.15: resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} @@ -851,6 +1704,18 @@ packages: engines: {node: '>=10.13.0'} hasBin: true + protobufjs@7.6.4: + resolution: {integrity: sha512-RJJPTTpvFfHcWLkIa2JFWK4XvtSzS0yEWDmunqHXli1h3JlkbcQZXDZdcWxv+JK3Xsl5/UFDPZ0iGm7DAengYw==} + engines: {node: '>=12.0.0'} + + protobufjs@8.0.1: + resolution: {integrity: sha512-NWWCCscLjs+cOKF/s/XVNFRW7Yih0fdH+9brffR5NZCy8k42yRdl5KlWKMVXuI1vfCoy4o1z80XR/W/QUb3V3w==} + engines: {node: '>=12.0.0'} + + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} @@ -864,6 +1729,18 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-in-the-middle@8.0.1: + resolution: {integrity: sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==} + engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -907,6 +1784,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -923,6 +1803,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.9.0: + resolution: {integrity: sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -950,6 +1834,20 @@ packages: std-env@4.1.0: resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -958,6 +1856,10 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + tar@7.5.17: + resolution: {integrity: sha512-wPEBwzapC+2PaTYPH6e2L+cNOEE227S47wUYFqlegcs8zlLLmeb9Fcff1HVZY4Fwku/1Eyv38n7GYwB2aaS71g==} + engines: {node: '>=18'} + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -1027,6 +1929,10 @@ packages: undici-types@7.19.2: resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} + undici@7.28.0: + resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} + engines: {node: '>=20.18.1'} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -1041,6 +1947,9 @@ packages: synckit: optional: true + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + vite@8.1.0: resolution: {integrity: sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1125,6 +2034,12 @@ packages: jsdom: optional: true + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.18.0: + resolution: {integrity: sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g==} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -1135,11 +2050,287 @@ packages: engines: {node: '>=8'} hasBin: true + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} + engines: {node: '>=12'} + zod@4.4.3: resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} snapshots: + '@aws-crypto/crc32@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.13 + tslib: 2.8.1 + + '@aws-crypto/crc32c@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.13 + tslib: 2.8.1 + + '@aws-crypto/sha1-browser@5.2.0': + dependencies: + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.13 + '@aws-sdk/util-locate-window': 3.965.8 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-browser@5.2.0': + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.13 + '@aws-sdk/util-locate-window': 3.965.8 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.13 + tslib: 2.8.1 + + '@aws-crypto/supports-web-crypto@5.2.0': + dependencies: + tslib: 2.8.1 + + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.973.13 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-sdk/checksums@3.1000.8': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/core': 3.974.23 + '@aws-sdk/types': 3.973.13 + '@smithy/core': 3.26.0 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@aws-sdk/client-s3@3.1075.0': + dependencies: + '@aws-crypto/sha1-browser': 5.2.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.974.23 + '@aws-sdk/credential-provider-node': 3.972.58 + '@aws-sdk/middleware-flexible-checksums': 3.974.33 + '@aws-sdk/middleware-sdk-s3': 3.972.54 + '@aws-sdk/signature-v4-multi-region': 3.996.35 + '@aws-sdk/types': 3.973.13 + '@smithy/core': 3.26.0 + '@smithy/fetch-http-handler': 5.5.2 + '@smithy/node-http-handler': 4.8.2 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@aws-sdk/core@3.974.23': + dependencies: + '@aws-sdk/types': 3.973.13 + '@aws-sdk/xml-builder': 3.972.31 + '@aws/lambda-invoke-store': 0.2.4 + '@smithy/core': 3.26.0 + '@smithy/signature-v4': 5.5.2 + '@smithy/types': 4.15.0 + bowser: 2.14.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.972.49': + dependencies: + '@aws-sdk/core': 3.974.23 + '@aws-sdk/types': 3.973.13 + '@smithy/core': 3.26.0 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.972.51': + dependencies: + '@aws-sdk/core': 3.974.23 + '@aws-sdk/types': 3.973.13 + '@smithy/core': 3.26.0 + '@smithy/fetch-http-handler': 5.5.2 + '@smithy/node-http-handler': 4.8.2 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.972.56': + dependencies: + '@aws-sdk/core': 3.974.23 + '@aws-sdk/credential-provider-env': 3.972.49 + '@aws-sdk/credential-provider-http': 3.972.51 + '@aws-sdk/credential-provider-login': 3.972.55 + '@aws-sdk/credential-provider-process': 3.972.49 + '@aws-sdk/credential-provider-sso': 3.972.55 + '@aws-sdk/credential-provider-web-identity': 3.972.55 + '@aws-sdk/nested-clients': 3.997.23 + '@aws-sdk/types': 3.973.13 + '@smithy/core': 3.26.0 + '@smithy/credential-provider-imds': 4.4.2 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-login@3.972.55': + dependencies: + '@aws-sdk/core': 3.974.23 + '@aws-sdk/nested-clients': 3.997.23 + '@aws-sdk/types': 3.973.13 + '@smithy/core': 3.26.0 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-node@3.972.58': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.49 + '@aws-sdk/credential-provider-http': 3.972.51 + '@aws-sdk/credential-provider-ini': 3.972.56 + '@aws-sdk/credential-provider-process': 3.972.49 + '@aws-sdk/credential-provider-sso': 3.972.55 + '@aws-sdk/credential-provider-web-identity': 3.972.55 + '@aws-sdk/types': 3.973.13 + '@smithy/core': 3.26.0 + '@smithy/credential-provider-imds': 4.4.2 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-process@3.972.49': + dependencies: + '@aws-sdk/core': 3.974.23 + '@aws-sdk/types': 3.973.13 + '@smithy/core': 3.26.0 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.972.55': + dependencies: + '@aws-sdk/core': 3.974.23 + '@aws-sdk/nested-clients': 3.997.23 + '@aws-sdk/token-providers': 3.1074.0 + '@aws-sdk/types': 3.973.13 + '@smithy/core': 3.26.0 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-web-identity@3.972.55': + dependencies: + '@aws-sdk/core': 3.974.23 + '@aws-sdk/nested-clients': 3.997.23 + '@aws-sdk/types': 3.973.13 + '@smithy/core': 3.26.0 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@aws-sdk/lib-storage@3.1075.0(@aws-sdk/client-s3@3.1075.0)': + dependencies: + '@aws-sdk/client-s3': 3.1075.0 + '@smithy/core': 3.26.0 + '@smithy/types': 4.15.0 + buffer: 5.6.0 + events: 3.3.0 + stream-browserify: 3.0.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-flexible-checksums@3.974.33': + dependencies: + '@aws-sdk/checksums': 3.1000.8 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-s3@3.972.54': + dependencies: + '@aws-sdk/core': 3.974.23 + '@aws-sdk/signature-v4-multi-region': 3.996.35 + '@aws-sdk/types': 3.973.13 + '@smithy/core': 3.26.0 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.997.23': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.974.23 + '@aws-sdk/signature-v4-multi-region': 3.996.35 + '@aws-sdk/types': 3.973.13 + '@smithy/core': 3.26.0 + '@smithy/fetch-http-handler': 5.5.2 + '@smithy/node-http-handler': 4.8.2 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@aws-sdk/signature-v4-multi-region@3.996.35': + dependencies: + '@aws-sdk/types': 3.973.13 + '@smithy/signature-v4': 5.5.2 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.1074.0': + dependencies: + '@aws-sdk/core': 3.974.23 + '@aws-sdk/nested-clients': 3.997.23 + '@aws-sdk/types': 3.973.13 + '@smithy/core': 3.26.0 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@aws-sdk/types@3.973.13': + dependencies: + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@aws-sdk/util-locate-window@3.965.8': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.972.31': + dependencies: + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@aws/lambda-invoke-store@0.2.4': {} + '@babel/generator@8.0.0-rc.3': dependencies: '@babel/parser': 8.0.0-rc.3 @@ -1175,6 +2366,8 @@ snapshots: '@babel/helper-string-parser': 8.0.0 '@babel/helper-validator-identifier': 8.0.0-rc.3 + '@bufbuild/protobuf@2.12.1': {} + '@changesets/apply-release-plan@7.1.1': dependencies: '@changesets/config': 3.1.4 @@ -1318,6 +2511,61 @@ snapshots: human-id: 4.2.0 prettier: 2.8.8 + '@computesdk/cmd@0.4.1': {} + + '@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.12.1)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.12.1))': + dependencies: + '@bufbuild/protobuf': 2.12.1 + '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.12.1) + + '@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.12.1)': + dependencies: + '@bufbuild/protobuf': 2.12.1 + + '@daytona/api-client@0.192.0': + dependencies: + axios: 1.18.1 + transitivePeerDependencies: + - debug + - supports-color + + '@daytona/toolbox-api-client@0.192.0': + dependencies: + axios: 1.18.1 + transitivePeerDependencies: + - debug + - supports-color + + '@daytonaio/sdk@0.192.0(ws@8.21.0)': + dependencies: + '@aws-sdk/client-s3': 3.1075.0 + '@aws-sdk/lib-storage': 3.1075.0(@aws-sdk/client-s3@3.1075.0) + '@daytona/api-client': 0.192.0 + '@daytona/toolbox-api-client': 0.192.0 + '@iarna/toml': 2.2.5 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/exporter-trace-otlp-http': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-http': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-node': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + axios: 1.18.1 + busboy: 1.6.0 + dotenv: 17.4.2 + expand-tilde: 2.0.2 + fast-glob: 3.3.3 + form-data: 4.0.6 + isomorphic-ws: 5.0.0(ws@8.21.0) + pathe: 2.0.3 + shell-quote: 1.9.0 + tar: 7.5.17 + transitivePeerDependencies: + - debug + - supports-color + - ws + '@emnapi/core@1.10.0': dependencies: '@emnapi/wasi-threads': 1.2.1 @@ -1350,6 +2598,20 @@ snapshots: tslib: 2.8.1 optional: true + '@grpc/grpc-js@1.14.4': + dependencies: + '@grpc/proto-loader': 0.8.1 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.8.1': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.6.4 + yargs: 17.7.3 + + '@iarna/toml@2.2.5': {} + '@inquirer/external-editor@1.0.3(@types/node@25.6.0)': dependencies: chardet: 2.2.0 @@ -1357,6 +2619,12 @@ snapshots: optionalDependencies: '@types/node': 25.6.0 + '@isaacs/cliui@9.0.0': {} + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -1371,6 +2639,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@js-sdsl/ordered-map@4.4.2': {} + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.29.7 @@ -1413,10 +2683,298 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 + '@opentelemetry/api-logs@0.217.0': + dependencies: + '@opentelemetry/api': 1.9.1 + + '@opentelemetry/api@1.9.1': {} + + '@opentelemetry/configuration@0.217.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + yaml: 2.9.0 + + '@opentelemetry/context-async-hooks@2.7.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + + '@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.41.1 + + '@opentelemetry/core@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.41.1 + + '@opentelemetry/exporter-logs-otlp-grpc@0.217.0(@opentelemetry/api@1.9.1)': + dependencies: + '@grpc/grpc-js': 1.14.4 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-grpc-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.217.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-logs-otlp-http@0.217.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.217.0 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.217.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-logs-otlp-proto@0.217.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.217.0 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-metrics-otlp-grpc@0.217.0(@opentelemetry/api@1.9.1)': + dependencies: + '@grpc/grpc-js': 1.14.4 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-http': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-grpc-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.7.1(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-metrics-otlp-http@0.217.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.7.1(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-metrics-otlp-proto@0.217.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-http': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.7.1(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-prometheus@0.217.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + + '@opentelemetry/exporter-trace-otlp-grpc@0.217.0(@opentelemetry/api@1.9.1)': + dependencies: + '@grpc/grpc-js': 1.14.4 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-grpc-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-trace-otlp-http@0.217.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-trace-otlp-proto@0.217.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-zipkin@2.7.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + + '@opentelemetry/instrumentation-http@0.217.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + forwarded-parse: 2.1.2 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.217.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.217.0 + import-in-the-middle: 3.2.0 + require-in-the-middle: 8.0.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/otlp-exporter-base@0.217.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/otlp-grpc-exporter-base@0.217.0(@opentelemetry/api@1.9.1)': + dependencies: + '@grpc/grpc-js': 1.14.4 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/otlp-transformer@0.217.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.217.0 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) + protobufjs: 8.0.1 + + '@opentelemetry/propagator-b3@2.7.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + + '@opentelemetry/propagator-jaeger@2.7.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + + '@opentelemetry/resources@2.7.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + + '@opentelemetry/resources@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + + '@opentelemetry/sdk-logs@0.217.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.217.0 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + + '@opentelemetry/sdk-metrics@2.7.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + + '@opentelemetry/sdk-node@0.217.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.217.0 + '@opentelemetry/configuration': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/context-async-hooks': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-logs-otlp-grpc': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-logs-otlp-http': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-logs-otlp-proto': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-grpc': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-http': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-proto': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-prometheus': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-grpc': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-http': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-proto': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-zipkin': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/propagator-b3': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/propagator-jaeger': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-node': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + + '@opentelemetry/sdk-trace-base@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + + '@opentelemetry/sdk-trace-node@2.7.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/context-async-hooks': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) + + '@opentelemetry/semantic-conventions@1.41.1': {} + '@oxc-project/types@0.127.0': {} '@oxc-project/types@0.137.0': {} + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.5': {} + + '@protobufjs/eventemitter@1.1.1': {} + + '@protobufjs/fetch@1.1.1': + dependencies: + '@protobufjs/aspromise': 1.1.2 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.2': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.1': {} + '@quansync/fs@1.0.0': dependencies: quansync: 1.0.0 @@ -1523,8 +3081,64 @@ snapshots: '@rolldown/pluginutils@1.0.1': {} + '@smithy/core@3.26.0': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@smithy/credential-provider-imds@4.4.2': + dependencies: + '@smithy/core': 3.26.0 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@smithy/fetch-http-handler@5.5.2': + dependencies: + '@smithy/core': 3.26.0 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/node-http-handler@4.8.2': + dependencies: + '@smithy/core': 3.26.0 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@smithy/signature-v4@5.5.2': + dependencies: + '@smithy/core': 3.26.0 + '@smithy/types': 4.15.0 + tslib: 2.8.1 + + '@smithy/types@4.15.0': + 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-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.8.1 + '@standard-schema/spec@1.1.0': {} + '@tangle-network/agent-interface@0.8.0': + dependencies: + zod: 4.4.3 + + '@tangle-network/sandbox@0.8.2': + dependencies: + '@tangle-network/agent-interface': 0.8.0 + '@tybys/wasm-util@0.10.3': dependencies: tslib: 2.8.1 @@ -1556,13 +3170,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.9(vite@8.1.0(@types/node@25.6.0))': + '@vitest/mocker@4.1.9(vite@8.1.0(@types/node@25.6.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.1.0(@types/node@25.6.0) + vite: 8.1.0(@types/node@25.6.0)(yaml@2.9.0) '@vitest/pretty-format@4.1.9': dependencies: @@ -1588,10 +3202,26 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.0 + acorn-import-attributes@1.9.5(acorn@8.17.0): + dependencies: + acorn: 8.17.0 + + acorn@8.17.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + ansis@4.3.1: {} argparse@1.0.10: @@ -1610,22 +3240,87 @@ snapshots: estree-walker: 3.0.3 pathe: 2.0.3 + asynckit@0.4.0: {} + + axios@1.18.1: + dependencies: + follow-redirects: 1.16.0 + form-data: 4.0.6 + https-proxy-agent: 5.0.1 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + - supports-color + + balanced-match@4.0.4: {} + + base64-js@1.5.1: {} + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 birpc@4.0.0: {} + bowser@2.14.1: {} + + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 + buffer@5.6.0: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + cac@7.0.0: {} + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + chai@6.2.2: {} + chalk@5.6.2: {} + chardet@2.2.0: {} + chownr@3.0.0: {} + + cjs-module-lexer@2.2.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + compare-versions@6.1.1: {} + + computesdk@4.1.3: + dependencies: + '@computesdk/cmd': 0.4.1 + daemond: 0.1.4 + convert-source-map@2.0.0: {} cross-spawn@7.0.6: @@ -1634,8 +3329,16 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + daemond@0.1.4: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + defu@6.1.7: {} + delayed-stream@1.0.0: {} + detect-indent@6.1.0: {} detect-libc@2.1.2: {} @@ -1644,8 +3347,37 @@ snapshots: dependencies: path-type: 4.0.0 + dockerfile-ast@0.7.1: + dependencies: + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.18.0 + + dotenv@17.4.2: {} + dts-resolver@2.1.3: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + e2b@2.31.0: + dependencies: + '@bufbuild/protobuf': 2.12.1 + '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.12.1) + '@connectrpc/connect-web': 2.0.0-rc.3(@bufbuild/protobuf@2.12.1)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.12.1)) + chalk: 5.6.2 + compare-versions: 6.1.1 + dockerfile-ast: 0.7.1 + glob: 11.1.0 + openapi-fetch: 0.14.1 + platform: 1.3.6 + tar: 7.5.17 + undici: 7.28.0 + + emoji-regex@8.0.0: {} + empathic@2.0.1: {} enquirer@2.4.1: @@ -1653,14 +3385,37 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + es-module-lexer@2.1.0: {} + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + escalade@3.2.0: {} + esprima@4.0.1: {} estree-walker@3.0.3: dependencies: '@types/estree': 1.0.9 + events@3.3.0: {} + + expand-tilde@2.0.2: + dependencies: + homedir-polyfill: 1.0.3 + expect-type@1.3.0: {} extendable-error@0.1.7: {} @@ -1690,6 +3445,23 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 + follow-redirects@1.16.0: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.6: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 + + forwarded-parse@2.1.2: {} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -1705,6 +3477,28 @@ snapshots: fsevents@2.3.3: optional: true + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -1713,6 +3507,15 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@11.1.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.2.3 + minimatch: 10.2.5 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.2 + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -1722,22 +3525,58 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + gopd@1.2.0: {} + graceful-fs@4.2.11: {} + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + homedir-polyfill@1.0.3: + dependencies: + parse-passwd: 1.0.0 + hookable@6.1.1: {} + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + human-id@4.2.0: {} iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 + ieee754@1.2.1: {} + ignore@5.3.2: {} + import-in-the-middle@3.2.0: + dependencies: + acorn: 8.17.0 + acorn-import-attributes: 1.9.5(acorn@8.17.0) + cjs-module-lexer: 2.2.0 + module-details-from-path: 1.0.4 + import-without-cache@0.3.3: {} + inherits@2.0.4: {} + is-extglob@2.1.1: {} + is-fullwidth-code-point@3.0.0: {} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -1752,6 +3591,14 @@ snapshots: isexe@2.0.0: {} + isomorphic-ws@5.0.0(ws@8.21.0): + dependencies: + ws: 8.21.0 + + jackspeak@4.2.3: + dependencies: + '@isaacs/cliui': 9.0.0 + js-yaml@3.14.2: dependencies: argparse: 1.0.10 @@ -1820,12 +3667,20 @@ snapshots: dependencies: p-locate: 4.1.0 + lodash.camelcase@4.3.0: {} + lodash.startcase@4.4.0: {} + long@5.3.2: {} + + lru-cache@11.5.1: {} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + math-intrinsics@1.1.0: {} + merge2@1.4.1: {} micromatch@4.0.8: @@ -1833,12 +3688,38 @@ snapshots: braces: 3.0.3 picomatch: 2.3.2 + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + + minipass@7.1.3: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.3 + + module-details-from-path@1.0.4: {} + mri@1.2.0: {} + ms@2.1.3: {} + nanoid@3.3.15: {} obug@2.1.3: {} + openapi-fetch@0.14.1: + dependencies: + openapi-typescript-helpers: 0.0.15 + + openapi-typescript-helpers@0.0.15: {} + outdent@0.5.0: {} p-filter@2.1.0: @@ -1857,14 +3738,23 @@ snapshots: p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} + package-manager-detector@0.2.11: dependencies: quansync: 0.2.11 + parse-passwd@1.0.0: {} + path-exists@4.0.0: {} path-key@3.1.1: {} + path-scurry@2.0.2: + dependencies: + lru-cache: 11.5.1 + minipass: 7.1.3 + path-type@4.0.0: {} pathe@2.0.3: {} @@ -1877,6 +3767,8 @@ snapshots: pify@4.0.1: {} + platform@1.3.6: {} + postcss@8.5.15: dependencies: nanoid: 3.3.15 @@ -1885,6 +3777,37 @@ snapshots: prettier@2.8.8: {} + protobufjs@7.6.4: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.5 + '@protobufjs/eventemitter': 1.1.1 + '@protobufjs/fetch': 1.1.1 + '@protobufjs/float': 1.0.2 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.1 + '@types/node': 25.6.0 + long: 5.3.2 + + protobufjs@8.0.1: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.5 + '@protobufjs/eventemitter': 1.1.1 + '@protobufjs/fetch': 1.1.1 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.2 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.1 + '@types/node': 25.6.0 + long: 5.3.2 + + proxy-from-env@2.1.0: {} + quansync@0.2.11: {} quansync@1.0.0: {} @@ -1898,6 +3821,21 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + require-directory@2.1.1: {} + + require-in-the-middle@8.0.1: + dependencies: + debug: 4.4.3 + module-details-from-path: 1.0.4 + transitivePeerDependencies: + - supports-color + resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -1968,6 +3906,8 @@ snapshots: dependencies: queue-microtask: 1.2.3 + safe-buffer@5.2.1: {} + safer-buffer@2.1.2: {} semver@7.8.5: {} @@ -1978,6 +3918,8 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.9.0: {} + siginfo@2.0.0: {} signal-exit@4.1.0: {} @@ -1997,12 +3939,37 @@ snapshots: std-env@4.1.0: {} + stream-browserify@3.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + streamsearch@1.1.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 strip-bom@3.0.0: {} + tar@7.5.17: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + yallist: 5.0.0 + term-size@2.2.1: {} tinybench@2.9.0: {} @@ -2049,8 +4016,7 @@ snapshots: - synckit - vue-tsc - tslib@2.8.1: - optional: true + tslib@2.8.1: {} typescript@6.0.3: {} @@ -2061,13 +4027,17 @@ snapshots: undici-types@7.19.2: {} + undici@7.28.0: {} + universalify@0.1.2: {} unrun@0.2.39: dependencies: rolldown: 1.0.0-rc.17 - vite@8.1.0(@types/node@25.6.0): + util-deprecate@1.0.2: {} + + vite@8.1.0(@types/node@25.6.0)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -2077,11 +4047,12 @@ snapshots: optionalDependencies: '@types/node': 25.6.0 fsevents: 2.3.3 + yaml: 2.9.0 - vitest@4.1.9(@types/node@25.6.0)(vite@8.1.0(@types/node@25.6.0)): + vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(vite@8.1.0(@types/node@25.6.0)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.9 - '@vitest/mocker': 4.1.9(vite@8.1.0(@types/node@25.6.0)) + '@vitest/mocker': 4.1.9(vite@8.1.0(@types/node@25.6.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.9 '@vitest/runner': 4.1.9 '@vitest/snapshot': 4.1.9 @@ -2098,13 +4069,18 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.1.0(@types/node@25.6.0) + vite: 8.1.0(@types/node@25.6.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: + '@opentelemetry/api': 1.9.1 '@types/node': 25.6.0 transitivePeerDependencies: - msw + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.18.0: {} + which@2.0.2: dependencies: isexe: 2.0.0 @@ -2114,4 +4090,30 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + ws@8.21.0: {} + + y18n@5.0.8: {} + + yallist@5.0.0: {} + + yaml@2.9.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.3: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + zod@4.4.3: {}