From f09ed7cb9a50711fbbe070105ff10a1c6ce09b30 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Thu, 5 Feb 2026 23:07:40 -0800 Subject: [PATCH 01/19] fix: default logging to stdout with configurable target (#91) --- docs/cli.mdx | 3 ++- research/opencode-tmux-test.md | 5 +++-- server/packages/sandbox-agent/src/main.rs | 23 +++++++++++++++++++---- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/docs/cli.mdx b/docs/cli.mdx index 6466cc7..d5cf6f7 100644 --- a/docs/cli.mdx +++ b/docs/cli.mdx @@ -24,12 +24,13 @@ sandbox-agent server [OPTIONS] | `-A, --cors-allow-header
` | all | CORS allowed header (repeatable) | | `-C, --cors-allow-credentials` | - | Enable CORS credentials | | `--no-telemetry` | - | Disable anonymous telemetry | +| `--log-to-file` | - | Redirect server logs to a daily log file | ```bash sandbox-agent server --token "$TOKEN" --port 3000 ``` -Server logs are redirected to a daily log file under the sandbox-agent data directory (for example, `~/.local/share/sandbox-agent/logs`). Override with `SANDBOX_AGENT_LOG_DIR`, or set `SANDBOX_AGENT_LOG_STDOUT=1` to keep logs on stdout/stderr. +Server logs print to stdout/stderr by default. Use `--log-to-file` or `SANDBOX_AGENT_LOG_TO_FILE=1` to redirect logs to a daily log file under the sandbox-agent data directory (for example, `~/.local/share/sandbox-agent/logs`). Override the directory with `SANDBOX_AGENT_LOG_DIR`, or set `SANDBOX_AGENT_LOG_STDOUT=1` to force stdout/stderr. HTTP request logging is enabled by default. Control it with: - `SANDBOX_AGENT_LOG_HTTP=0` to disable request logs diff --git a/research/opencode-tmux-test.md b/research/opencode-tmux-test.md index ff553c0..96cc3ab 100644 --- a/research/opencode-tmux-test.md +++ b/research/opencode-tmux-test.md @@ -9,7 +9,8 @@ This plan captures OpenCode TUI output and sends input via tmux so we can valida ## Environment - `SANDBOX_AGENT_LOG_DIR=/path` to set server log dir -- `SANDBOX_AGENT_LOG_STDOUT=1` to keep logs on stdout/stderr +- `SANDBOX_AGENT_LOG_TO_FILE=1` to redirect logs to files +- `SANDBOX_AGENT_LOG_STDOUT=1` to force logs on stdout/stderr - `SANDBOX_AGENT_LOG_HTTP=0` to disable request logs - `SANDBOX_AGENT_LOG_HTTP_HEADERS=1` to include request headers (Authorization redacted) - `RUST_LOG=...` for trace filtering @@ -42,7 +43,7 @@ This plan captures OpenCode TUI output and sends input via tmux so we can valida ```bash tmux capture-pane -pt opencode:0.0 -S -200 > /tmp/opencode-screen.txt ``` -6. Inspect server logs for requests: +6. Inspect server logs for requests (when log-to-file is enabled): ```bash tail -n 200 ~/.local/share/sandbox-agent/logs/log-$(date +%m-%d-%y) ``` diff --git a/server/packages/sandbox-agent/src/main.rs b/server/packages/sandbox-agent/src/main.rs index 46a9efe..0a2b72e 100644 --- a/server/packages/sandbox-agent/src/main.rs +++ b/server/packages/sandbox-agent/src/main.rs @@ -92,6 +92,9 @@ struct ServerArgs { #[arg(long = "no-telemetry")] no_telemetry: bool, + + #[arg(long = "log-to-file")] + log_to_file: bool, } #[derive(Args, Debug)] @@ -388,8 +391,8 @@ fn main() { } fn init_logging(cli: &Cli) -> Result<(), CliError> { - if matches!(cli.command, Command::Server(_)) { - maybe_redirect_server_logs(); + if let Command::Server(server) = &cli.command { + maybe_redirect_server_logs(server); } let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")); @@ -472,8 +475,20 @@ fn default_server_log_dir() -> PathBuf { .unwrap_or_else(|| PathBuf::from(".").join(".sandbox-agent").join("logs")) } -fn maybe_redirect_server_logs() { - if std::env::var("SANDBOX_AGENT_LOG_STDOUT").is_ok() { +fn maybe_redirect_server_logs(server: &ServerArgs) { + let force_stdout = match std::env::var("SANDBOX_AGENT_LOG_STDOUT") { + Ok(value) if value == "0" || value.eq_ignore_ascii_case("false") => false, + Ok(_) => true, + Err(_) => false, + }; + let log_to_file_env = match std::env::var("SANDBOX_AGENT_LOG_TO_FILE") { + Ok(value) if value == "0" || value.eq_ignore_ascii_case("false") => false, + Ok(_) => true, + Err(_) => false, + }; + let log_to_file = server.log_to_file || log_to_file_env; + + if force_stdout || !log_to_file { return; } From 5dbfde5424d8f34879555701ab9cf0fb546f20bc Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 6 Feb 2026 02:40:07 -0800 Subject: [PATCH 02/19] feat: log session config on create (#93) ## Summary - Adds a `session_created` telemetry event that fires when a new session is created - Logs safe session config fields: agent, agent_mode, permission_mode, model, variant - Does not include workdir or any sensitive paths - Respects existing telemetry enabled/disabled flag (`--no-telemetry`) - Sends asynchronously via spawned task to avoid blocking session creation ## Test plan - [x] `cargo check` passes - [ ] Verify event reaches telemetry endpoint with correct fields - [ ] Verify no event is sent when `--no-telemetry` is set --- server/packages/sandbox-agent/src/router.rs | 14 +++ .../packages/sandbox-agent/src/telemetry.rs | 117 +++++++++++++++--- 2 files changed, 111 insertions(+), 20 deletions(-) diff --git a/server/packages/sandbox-agent/src/router.rs b/server/packages/sandbox-agent/src/router.rs index 92460d5..06434a9 100644 --- a/server/packages/sandbox-agent/src/router.rs +++ b/server/packages/sandbox-agent/src/router.rs @@ -40,6 +40,7 @@ use utoipa::{Modify, OpenApi, ToSchema}; use crate::agent_server_logs::AgentServerLogs; use crate::opencode_compat::{build_opencode_router, OpenCodeAppState}; +use crate::telemetry; use crate::ui; use sandbox_agent_agent_management::agents::{ AgentError as ManagerError, AgentId, AgentManager, InstallOptions, SpawnOptions, StreamingSpawn, @@ -1622,6 +1623,9 @@ impl SessionManager { session.native_session_id = Some(format!("mock-{session_id}")); } + let telemetry_agent = request.agent.clone(); + let telemetry_model = request.model.clone(); + let telemetry_variant = request.variant.clone(); let metadata = json!({ "agent": request.agent, "agentMode": session.agent_mode, @@ -1651,6 +1655,8 @@ impl SessionManager { } let native_session_id = session.native_session_id.clone(); + let telemetry_agent_mode = session.agent_mode.clone(); + let telemetry_permission_mode = session.permission_mode.clone(); let mut sessions = self.sessions.lock().await; sessions.push(session); drop(sessions); @@ -1664,6 +1670,14 @@ impl SessionManager { self.ensure_opencode_stream(session_id).await?; } + telemetry::log_session_created(telemetry::SessionConfig { + agent: telemetry_agent, + agent_mode: Some(telemetry_agent_mode), + permission_mode: Some(telemetry_permission_mode), + model: telemetry_model, + variant: telemetry_variant, + }); + Ok(CreateSessionResponse { healthy: true, error: None, diff --git a/server/packages/sandbox-agent/src/telemetry.rs b/server/packages/sandbox-agent/src/telemetry.rs index 6ff221b..6bed31e 100644 --- a/server/packages/sandbox-agent/src/telemetry.rs +++ b/server/packages/sandbox-agent/src/telemetry.rs @@ -3,6 +3,7 @@ use std::env; use std::fs; use std::io::{Read, Write}; use std::path::{Path, PathBuf}; +use std::sync::atomic::{AtomicBool, Ordering}; use std::time::{Duration, SystemTime, UNIX_EPOCH}; use reqwest::Client; @@ -10,6 +11,8 @@ use serde::Serialize; use time::OffsetDateTime; use tokio::time::Instant; +static TELEMETRY_ENABLED: AtomicBool = AtomicBool::new(false); + const TELEMETRY_URL: &str = "https://tc.rivet.dev"; const TELEMETRY_ENV_DEBUG: &str = "SANDBOX_AGENT_TELEMETRY_DEBUG"; const TELEMETRY_ID_FILE: &str = "telemetry_id"; @@ -19,7 +22,7 @@ const TELEMETRY_INTERVAL_SECS: u64 = 300; const TELEMETRY_MIN_GAP_SECS: i64 = 300; #[derive(Debug, Serialize)] -struct TelemetryEvent { +struct TelemetryEvent { // p = project identifier p: String, // dt = unix timestamp (seconds) @@ -31,13 +34,13 @@ struct TelemetryEvent { // ev = event name ev: String, // d = data payload - d: TelemetryData, + d: D, // v = schema version v: u8, } #[derive(Debug, Serialize)] -struct TelemetryData { +struct BeaconData { version: String, os: OsInfo, provider: ProviderInfo, @@ -60,15 +63,17 @@ struct ProviderInfo { } pub fn telemetry_enabled(no_telemetry: bool) -> bool { - if no_telemetry { - return false; - } - if cfg!(debug_assertions) { - return env::var(TELEMETRY_ENV_DEBUG) + let enabled = if no_telemetry { + false + } else if cfg!(debug_assertions) { + env::var(TELEMETRY_ENV_DEBUG) .map(|value| matches!(value.as_str(), "1" | "true" | "TRUE")) - .unwrap_or(false); - } - true + .unwrap_or(false) + } else { + true + }; + TELEMETRY_ENABLED.store(enabled, Ordering::Relaxed); + enabled } pub fn log_enabled_message() { @@ -105,7 +110,7 @@ async fn attempt_send(client: &Client) { return; } - let event = build_event(dt); + let event = build_beacon_event(dt); if let Err(err) = client.post(TELEMETRY_URL).json(&event).send().await { tracing::debug!(error = %err, "telemetry request failed"); return; @@ -113,15 +118,12 @@ async fn attempt_send(client: &Client) { write_last_sent(dt); } -fn build_event(dt: i64) -> TelemetryEvent { - let eid = load_or_create_id(); - TelemetryEvent { - p: "sandbox-agent".to_string(), +fn build_beacon_event(dt: i64) -> TelemetryEvent { + new_event( dt, - et: "sandbox".to_string(), - eid, - ev: "entity_beacon".to_string(), - d: TelemetryData { + "sandbox", + "entity_beacon", + BeaconData { version: env!("CARGO_PKG_VERSION").to_string(), os: OsInfo { name: std::env::consts::OS.to_string(), @@ -130,6 +132,18 @@ fn build_event(dt: i64) -> TelemetryEvent { }, provider: detect_provider(), }, + ) +} + +fn new_event(dt: i64, entity_type: &str, event_name: &str, data: D) -> TelemetryEvent { + let eid = load_or_create_id(); + TelemetryEvent { + p: "sandbox-agent".to_string(), + dt, + et: entity_type.to_string(), + eid, + ev: event_name.to_string(), + d: data, v: 1, } } @@ -431,3 +445,66 @@ fn metadata_or_none( Some(map) } } + +#[derive(Debug, Serialize)] +struct SessionCreatedData { + version: String, + agent: String, + #[serde(skip_serializing_if = "Option::is_none")] + agent_mode: Option, + #[serde(skip_serializing_if = "Option::is_none")] + permission_mode: Option, + #[serde(skip_serializing_if = "Option::is_none")] + model: Option, + #[serde(skip_serializing_if = "Option::is_none")] + variant: Option, +} + +pub struct SessionConfig { + pub agent: String, + pub agent_mode: Option, + pub permission_mode: Option, + pub model: Option, + pub variant: Option, +} + +pub fn log_session_created(config: SessionConfig) { + if !TELEMETRY_ENABLED.load(Ordering::Relaxed) { + return; + } + + let event = new_event( + OffsetDateTime::now_utc().unix_timestamp(), + "session", + "session_created", + SessionCreatedData { + version: env!("CARGO_PKG_VERSION").to_string(), + agent: config.agent, + agent_mode: config.agent_mode, + permission_mode: config.permission_mode, + model: config.model, + variant: config.variant, + }, + ); + + spawn_send(event); +} + +fn spawn_send(event: TelemetryEvent) { + tokio::spawn(async move { + let client = match Client::builder() + .timeout(Duration::from_millis(TELEMETRY_TIMEOUT_MS)) + .build() + { + Ok(client) => client, + Err(err) => { + tracing::debug!(error = %err, "failed to build telemetry client"); + return; + } + }; + + if let Err(err) = client.post(TELEMETRY_URL).json(&event).send().await { + tracing::debug!(error = %err, "telemetry send failed"); + } + }); +} From 0a73d1d8e8ce4fcd54aa976107be9214a578330f Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 6 Feb 2026 02:49:13 -0800 Subject: [PATCH 03/19] feat: add anycode daemonized opencode CLI and docs (#90) --- .turbo | 1 + dist | 1 + node_modules | 1 + target | 1 + 4 files changed, 4 insertions(+) create mode 120000 .turbo create mode 120000 dist create mode 120000 node_modules create mode 120000 target diff --git a/.turbo b/.turbo new file mode 120000 index 0000000..0b7d9ca --- /dev/null +++ b/.turbo @@ -0,0 +1 @@ +/home/nathan/sandbox-agent/.turbo \ No newline at end of file diff --git a/dist b/dist new file mode 120000 index 0000000..f02d77f --- /dev/null +++ b/dist @@ -0,0 +1 @@ +/home/nathan/sandbox-agent/dist \ No newline at end of file diff --git a/node_modules b/node_modules new file mode 120000 index 0000000..501480b --- /dev/null +++ b/node_modules @@ -0,0 +1 @@ +/home/nathan/sandbox-agent/node_modules \ No newline at end of file diff --git a/target b/target new file mode 120000 index 0000000..3d6ad8c --- /dev/null +++ b/target @@ -0,0 +1 @@ +/home/nathan/sandbox-agent/target \ No newline at end of file From a02393436cd85e29c91f9dac2d40ed1684a3813c Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 6 Feb 2026 02:55:57 -0800 Subject: [PATCH 04/19] feat: gigacode (#92) --- .github/workflows/release.yaml | 8 + CLAUDE.md | 4 + README.md | 11 + docker/release/build.sh | 8 + docker/release/linux-aarch64.Dockerfile | 5 +- docker/release/linux-x86_64.Dockerfile | 5 +- docker/release/macos-aarch64.Dockerfile | 5 +- docker/release/macos-x86_64.Dockerfile | 5 +- docker/release/windows.Dockerfile | 5 +- docs/cli.mdx | 51 +- docs/daemon.mdx | 96 ++ docs/docs.json | 19 +- docs/gigacode.mdx | 6 + docs/openapi.json | 2 +- .../website/src/components/GetStarted.tsx | 3 + justfile | 17 + pnpm-lock.yaml | 36 + pnpm-workspace.yaml | 2 + scripts/release/promote-artifacts.ts | 23 + scripts/release/sdk.ts | 113 +- scripts/release/static/gigacode-install.ps1 | 51 + scripts/release/static/gigacode-install.sh | 103 ++ scripts/release/update_version.ts | 10 + sdks/cli-shared/src/index.ts | 13 +- sdks/gigacode/bin/gigacode | 66 + sdks/gigacode/package.json | 32 + .../platforms/darwin-arm64/package.json | 22 + .../platforms/darwin-x64/package.json | 22 + .../platforms/linux-arm64/package.json | 22 + .../gigacode/platforms/linux-x64/package.json | 22 + .../gigacode/platforms/win32-x64/package.json | 19 + server/packages/gigacode/Cargo.toml | 17 + server/packages/gigacode/README.md | 80 + server/packages/gigacode/src/main.rs | 28 + server/packages/sandbox-agent/build.rs | 43 + server/packages/sandbox-agent/src/cli.rs | 1320 +++++++++++++++++ server/packages/sandbox-agent/src/daemon.rs | 487 ++++++ server/packages/sandbox-agent/src/lib.rs | 2 + server/packages/sandbox-agent/src/main.rs | 1279 +--------------- target | 1 - 40 files changed, 2736 insertions(+), 1327 deletions(-) create mode 100644 docs/daemon.mdx create mode 100644 docs/gigacode.mdx create mode 100644 scripts/release/static/gigacode-install.ps1 create mode 100644 scripts/release/static/gigacode-install.sh create mode 100644 sdks/gigacode/bin/gigacode create mode 100644 sdks/gigacode/package.json create mode 100644 sdks/gigacode/platforms/darwin-arm64/package.json create mode 100644 sdks/gigacode/platforms/darwin-x64/package.json create mode 100644 sdks/gigacode/platforms/linux-arm64/package.json create mode 100644 sdks/gigacode/platforms/linux-x64/package.json create mode 100644 sdks/gigacode/platforms/win32-x64/package.json create mode 100644 server/packages/gigacode/Cargo.toml create mode 100644 server/packages/gigacode/README.md create mode 100644 server/packages/gigacode/src/main.rs create mode 100644 server/packages/sandbox-agent/src/cli.rs create mode 100644 server/packages/sandbox-agent/src/daemon.rs delete mode 120000 target diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index d1bad4c..ce5b8a7 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -153,6 +153,7 @@ jobs: COMMIT_SHA_SHORT="${GITHUB_SHA::7}" BINARY_PATH="dist/sandbox-agent-${{ matrix.target }}${{ matrix.binary_ext }}" + GIGACODE_PATH="dist/gigacode-${{ matrix.target }}${{ matrix.binary_ext }}" # Must specify --checksum-algorithm for compatibility with R2 aws s3 cp \ @@ -162,6 +163,13 @@ jobs: --endpoint-url https://2a94c6a0ced8d35ea63cddc86c2681e7.r2.cloudflarestorage.com \ --checksum-algorithm CRC32 + aws s3 cp \ + "${GIGACODE_PATH}" \ + "s3://rivet-releases/sandbox-agent/${COMMIT_SHA_SHORT}/binaries/gigacode-${{ matrix.target }}${{ matrix.binary_ext }}" \ + --region auto \ + --endpoint-url https://2a94c6a0ced8d35ea63cddc86c2681e7.r2.cloudflarestorage.com \ + --checksum-algorithm CRC32 + docker: name: "Build & Push Docker Images" needs: [setup] diff --git a/CLAUDE.md b/CLAUDE.md index 9f6a874..f5e0e45 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -80,6 +80,10 @@ The OpenCode compatibility suite lives at `server/packages/sandbox-agent/tests/o SANDBOX_AGENT_SKIP_INSPECTOR=1 pnpm --filter @sandbox-agent/opencode-compat-tests test ``` +## Naming + +- The product name is "GigaCode" (capital G, capital C). The CLI binary/package is `gigacode` (lowercase). + ## Git Commits - Do not include any co-authors in commit messages (no `Co-Authored-By` lines) diff --git a/README.md b/README.md index 1aff0bb..dbaf6d6 100644 --- a/README.md +++ b/README.md @@ -189,6 +189,17 @@ npx sandbox-agent --help bunx sandbox-agent --help ``` +Quick OpenCode attach (runs `sandbox-agent opencode` by default): + +```bash +npx gigacode --token "$SANDBOX_TOKEN" +``` + +```bash +npm install -g gigacode +gigacode --token "$SANDBOX_TOKEN" +``` + [CLI documentation](https://sandboxagent.dev/docs/cli) ### Inspector diff --git a/docker/release/build.sh b/docker/release/build.sh index 6e7d66f..2f5204e 100755 --- a/docker/release/build.sh +++ b/docker/release/build.sh @@ -17,30 +17,35 @@ case $TARGET in DOCKERFILE="linux-x86_64.Dockerfile" TARGET_STAGE="x86_64-builder" BINARY="sandbox-agent-$TARGET" + GIGACODE="gigacode-$TARGET" ;; aarch64-unknown-linux-musl) echo "Building for Linux aarch64 musl" DOCKERFILE="linux-aarch64.Dockerfile" TARGET_STAGE="aarch64-builder" BINARY="sandbox-agent-$TARGET" + GIGACODE="gigacode-$TARGET" ;; x86_64-pc-windows-gnu) echo "Building for Windows x86_64" DOCKERFILE="windows.Dockerfile" TARGET_STAGE="" BINARY="sandbox-agent-$TARGET.exe" + GIGACODE="gigacode-$TARGET.exe" ;; x86_64-apple-darwin) echo "Building for macOS x86_64" DOCKERFILE="macos-x86_64.Dockerfile" TARGET_STAGE="x86_64-builder" BINARY="sandbox-agent-$TARGET" + GIGACODE="gigacode-$TARGET" ;; aarch64-apple-darwin) echo "Building for macOS aarch64" DOCKERFILE="macos-aarch64.Dockerfile" TARGET_STAGE="aarch64-builder" BINARY="sandbox-agent-$TARGET" + GIGACODE="gigacode-$TARGET" ;; *) echo "Unsupported target: $TARGET" @@ -59,10 +64,13 @@ CONTAINER_ID=$(docker create "sandbox-agent-builder-$TARGET") mkdir -p dist docker cp "$CONTAINER_ID:/artifacts/$BINARY" "dist/" +docker cp "$CONTAINER_ID:/artifacts/$GIGACODE" "dist/" docker rm "$CONTAINER_ID" if [[ "$BINARY" != *.exe ]]; then chmod +x "dist/$BINARY" + chmod +x "dist/$GIGACODE" fi echo "Binary saved to: dist/$BINARY" +echo "Binary saved to: dist/$GIGACODE" diff --git a/docker/release/linux-aarch64.Dockerfile b/docker/release/linux-aarch64.Dockerfile index e1f3acd..290ecc4 100644 --- a/docker/release/linux-aarch64.Dockerfile +++ b/docker/release/linux-aarch64.Dockerfile @@ -66,9 +66,10 @@ COPY --from=inspector-build /app/frontend/packages/inspector/dist ./frontend/pac RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/usr/local/cargo/git \ --mount=type=cache,target=/build/target \ - cargo build -p sandbox-agent --release --target aarch64-unknown-linux-musl && \ + cargo build -p sandbox-agent -p gigacode --release --target aarch64-unknown-linux-musl && \ mkdir -p /artifacts && \ - cp target/aarch64-unknown-linux-musl/release/sandbox-agent /artifacts/sandbox-agent-aarch64-unknown-linux-musl + cp target/aarch64-unknown-linux-musl/release/sandbox-agent /artifacts/sandbox-agent-aarch64-unknown-linux-musl && \ + cp target/aarch64-unknown-linux-musl/release/gigacode /artifacts/gigacode-aarch64-unknown-linux-musl # Default command to show help CMD ["ls", "-la", "/artifacts"] diff --git a/docker/release/linux-x86_64.Dockerfile b/docker/release/linux-x86_64.Dockerfile index 89a8a30..1269740 100644 --- a/docker/release/linux-x86_64.Dockerfile +++ b/docker/release/linux-x86_64.Dockerfile @@ -100,9 +100,10 @@ COPY --from=inspector-build /app/frontend/packages/inspector/dist ./frontend/pac RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/usr/local/cargo/git \ --mount=type=cache,target=/build/target \ - cargo build -p sandbox-agent --release --target x86_64-unknown-linux-musl && \ + cargo build -p sandbox-agent -p gigacode --release --target x86_64-unknown-linux-musl && \ mkdir -p /artifacts && \ - cp target/x86_64-unknown-linux-musl/release/sandbox-agent /artifacts/sandbox-agent-x86_64-unknown-linux-musl + cp target/x86_64-unknown-linux-musl/release/sandbox-agent /artifacts/sandbox-agent-x86_64-unknown-linux-musl && \ + cp target/x86_64-unknown-linux-musl/release/gigacode /artifacts/gigacode-x86_64-unknown-linux-musl # Default command to show help CMD ["ls", "-la", "/artifacts"] diff --git a/docker/release/macos-aarch64.Dockerfile b/docker/release/macos-aarch64.Dockerfile index dbb173a..ecc4e40 100644 --- a/docker/release/macos-aarch64.Dockerfile +++ b/docker/release/macos-aarch64.Dockerfile @@ -98,9 +98,10 @@ COPY --from=inspector-build /app/frontend/packages/inspector/dist ./frontend/pac RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/usr/local/cargo/git \ --mount=type=cache,target=/build/target \ - cargo build -p sandbox-agent --release --target aarch64-apple-darwin && \ + cargo build -p sandbox-agent -p gigacode --release --target aarch64-apple-darwin && \ mkdir -p /artifacts && \ - cp target/aarch64-apple-darwin/release/sandbox-agent /artifacts/sandbox-agent-aarch64-apple-darwin + cp target/aarch64-apple-darwin/release/sandbox-agent /artifacts/sandbox-agent-aarch64-apple-darwin && \ + cp target/aarch64-apple-darwin/release/gigacode /artifacts/gigacode-aarch64-apple-darwin # Default command to show help CMD ["ls", "-la", "/artifacts"] diff --git a/docker/release/macos-x86_64.Dockerfile b/docker/release/macos-x86_64.Dockerfile index 98d3a31..9150a3a 100644 --- a/docker/release/macos-x86_64.Dockerfile +++ b/docker/release/macos-x86_64.Dockerfile @@ -98,9 +98,10 @@ COPY --from=inspector-build /app/frontend/packages/inspector/dist ./frontend/pac RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/usr/local/cargo/git \ --mount=type=cache,target=/build/target \ - cargo build -p sandbox-agent --release --target x86_64-apple-darwin && \ + cargo build -p sandbox-agent -p gigacode --release --target x86_64-apple-darwin && \ mkdir -p /artifacts && \ - cp target/x86_64-apple-darwin/release/sandbox-agent /artifacts/sandbox-agent-x86_64-apple-darwin + cp target/x86_64-apple-darwin/release/sandbox-agent /artifacts/sandbox-agent-x86_64-apple-darwin && \ + cp target/x86_64-apple-darwin/release/gigacode /artifacts/gigacode-x86_64-apple-darwin # Default command to show help CMD ["ls", "-la", "/artifacts"] diff --git a/docker/release/windows.Dockerfile b/docker/release/windows.Dockerfile index ca7eb16..462350c 100644 --- a/docker/release/windows.Dockerfile +++ b/docker/release/windows.Dockerfile @@ -84,9 +84,10 @@ COPY --from=inspector-build /app/frontend/packages/inspector/dist ./frontend/pac RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/usr/local/cargo/git \ --mount=type=cache,target=/build/target \ - cargo build -p sandbox-agent --release --target x86_64-pc-windows-gnu && \ + cargo build -p sandbox-agent -p gigacode --release --target x86_64-pc-windows-gnu && \ mkdir -p /artifacts && \ - cp target/x86_64-pc-windows-gnu/release/sandbox-agent.exe /artifacts/sandbox-agent-x86_64-pc-windows-gnu.exe + cp target/x86_64-pc-windows-gnu/release/sandbox-agent.exe /artifacts/sandbox-agent-x86_64-pc-windows-gnu.exe && \ + cp target/x86_64-pc-windows-gnu/release/gigacode.exe /artifacts/gigacode-x86_64-pc-windows-gnu.exe # Default command to show help CMD ["ls", "-la", "/artifacts"] diff --git a/docs/cli.mdx b/docs/cli.mdx index d5cf6f7..5f0c47d 100644 --- a/docs/cli.mdx +++ b/docs/cli.mdx @@ -58,7 +58,7 @@ sandbox-agent install-agent claude --reinstall ## OpenCode (Experimental) -Start a sandbox-agent server and attach an OpenCode session (uses `opencode attach`): +Start (or reuse) a sandbox-agent daemon and attach an OpenCode session (uses `opencode attach`): ```bash sandbox-agent opencode [OPTIONS] @@ -77,7 +77,54 @@ sandbox-agent opencode [OPTIONS] sandbox-agent opencode --token "$TOKEN" ``` -Requires the `opencode` binary to be installed (or set `OPENCODE_BIN` / `--opencode-bin`). +The daemon logs to a per-host log file under the sandbox-agent data directory (for example, `~/.local/share/sandbox-agent/daemon/daemon-127-0-0-1-2468.log`). + +Requires the `opencode` binary to be installed (or set `OPENCODE_BIN` / `--opencode-bin`). If it is not found on `PATH`, sandbox-agent installs it automatically. + +--- + +## Daemon + +Manage the background daemon. See the [Daemon](/daemon) docs for details on lifecycle and auto-upgrade. + +### Start + +```bash +sandbox-agent daemon start [OPTIONS] +``` + +| Option | Default | Description | +|--------|---------|-------------| +| `-H, --host ` | `127.0.0.1` | Host to bind to | +| `-p, --port ` | `2468` | Port to bind to | +| `-t, --token ` | - | Authentication token | +| `-n, --no-token` | - | Disable authentication | + +```bash +sandbox-agent daemon start --no-token +``` + +### Stop + +```bash +sandbox-agent daemon stop [OPTIONS] +``` + +| Option | Default | Description | +|--------|---------|-------------| +| `-H, --host ` | `127.0.0.1` | Host of the daemon | +| `-p, --port ` | `2468` | Port of the daemon | + +### Status + +```bash +sandbox-agent daemon status [OPTIONS] +``` + +| Option | Default | Description | +|--------|---------|-------------| +| `-H, --host ` | `127.0.0.1` | Host of the daemon | +| `-p, --port ` | `2468` | Port of the daemon | --- diff --git a/docs/daemon.mdx b/docs/daemon.mdx new file mode 100644 index 0000000..b76c8f8 --- /dev/null +++ b/docs/daemon.mdx @@ -0,0 +1,96 @@ +--- +title: "Daemon" +description: "Background daemon lifecycle, auto-upgrade, and management." +icon: "microchip" +--- + +The sandbox-agent daemon is a background server process that stays running between sessions. Commands like `sandbox-agent opencode` and `gigacode` automatically start it when needed and restart it when the binary is updated. + +## How it works + +1. When you run `sandbox-agent opencode`, `sandbox-agent daemon start`, or `gigacode`, the CLI checks if a daemon is already healthy at the configured host and port. +2. If no daemon is running, one is spawned in the background with stdout/stderr redirected to a log file. +3. The CLI writes a PID file and a build ID file to track the running process and its version. +4. On subsequent invocations, if the daemon is still running but was built from a different commit, the CLI automatically stops the old daemon and starts a new one. + +## Auto-upgrade + +Each build of sandbox-agent embeds a unique **build ID** (the git short hash, or a version-timestamp fallback). When a daemon is started, this build ID is written to a version file alongside the PID file. + +On every invocation of `ensure_running` (called by `opencode`, `gigacode`, and `daemon start`), the CLI compares the stored build ID against the current binary's build ID. If they differ, the running daemon is stopped and replaced automatically: + +``` +daemon outdated (build a1b2c3d -> f4e5d6c), restarting... +``` + +This means installing a new version of sandbox-agent and running any daemon-aware command is enough to upgrade — no manual restart needed. + +## Managing the daemon + +### Start + +Start a daemon in the background. If one is already running and healthy, this is a no-op. + +```bash +sandbox-agent daemon start [OPTIONS] +``` + +| Option | Default | Description | +|--------|---------|-------------| +| `-H, --host ` | `127.0.0.1` | Host to bind to | +| `-p, --port ` | `2468` | Port to bind to | +| `-t, --token ` | - | Authentication token | +| `-n, --no-token` | - | Disable authentication | + +```bash +sandbox-agent daemon start --no-token +``` + +### Stop + +Stop a running daemon. Sends SIGTERM and waits up to 5 seconds for a graceful shutdown before falling back to SIGKILL. + +```bash +sandbox-agent daemon stop [OPTIONS] +``` + +| Option | Default | Description | +|--------|---------|-------------| +| `-H, --host ` | `127.0.0.1` | Host of the daemon | +| `-p, --port ` | `2468` | Port of the daemon | + +```bash +sandbox-agent daemon stop +``` + +### Status + +Show whether the daemon is running, its PID, build ID, and log path. + +```bash +sandbox-agent daemon status [OPTIONS] +``` + +| Option | Default | Description | +|--------|---------|-------------| +| `-H, --host ` | `127.0.0.1` | Host of the daemon | +| `-p, --port ` | `2468` | Port of the daemon | + +```bash +sandbox-agent daemon status +# Daemon running (PID 12345, build a1b2c3d, logs: ~/.local/share/sandbox-agent/daemon/daemon-127-0-0-1-2468.log) +``` + +If the daemon was started with an older binary, the status includes an `[outdated, restart recommended]` notice. + +## Files + +All daemon state files live under the sandbox-agent data directory (typically `~/.local/share/sandbox-agent/daemon/`): + +| File | Purpose | +|------|---------| +| `daemon-{host}-{port}.pid` | PID of the running daemon process | +| `daemon-{host}-{port}.version` | Build ID of the running daemon | +| `daemon-{host}-{port}.log` | Daemon stdout/stderr log output | + +Multiple daemons can run on different host/port combinations without conflicting. diff --git a/docs/docs.json b/docs/docs.json index 45a3fa5..61bfbf9 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -41,7 +41,12 @@ "pages": [ { "group": "Getting started", - "pages": ["quickstart", "building-chat-ui", "manage-sessions", "opencode-compatibility"] + "pages": [ + "quickstart", + "building-chat-ui", + "manage-sessions", + "opencode-compatibility" + ] }, { "group": "Deploy", @@ -61,18 +66,18 @@ }, { "group": "Reference", - "pages": [ - "cli", - "inspector", - "session-transcript-schema", - "cors", + "pages": [ + "cli", + "inspector", + "session-transcript-schema", + "gigacode", { "group": "AI", "pages": ["ai/skill", "ai/llms-txt"] }, { "group": "Advanced", - "pages": ["telemetry"] + "pages": ["daemon", "cors", "telemetry"] } ] }, diff --git a/docs/gigacode.mdx b/docs/gigacode.mdx new file mode 100644 index 0000000..8cbf7b3 --- /dev/null +++ b/docs/gigacode.mdx @@ -0,0 +1,6 @@ +--- +title: GigaCode +url: "https://github.com/rivet-dev/sandbox-agent/tree/main/server/packages/gigacode" +--- + + diff --git a/docs/openapi.json b/docs/openapi.json index 76c76f0..69a809a 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -10,7 +10,7 @@ "license": { "name": "Apache-2.0" }, - "version": "0.1.6-rc.1" + "version": "0.1.6" }, "servers": [ { diff --git a/frontend/packages/website/src/components/GetStarted.tsx b/frontend/packages/website/src/components/GetStarted.tsx index 63c87ef..f89a798 100644 --- a/frontend/packages/website/src/components/GetStarted.tsx +++ b/frontend/packages/website/src/components/GetStarted.tsx @@ -103,6 +103,9 @@ export function GetStarted() {

Choose the installation method that works best for your use case.

+

+ Quick OpenCode attach: npx gigacode +

diff --git a/justfile b/justfile index f9d4103..b70c53c 100644 --- a/justfile +++ b/justfile @@ -51,3 +51,20 @@ fmt: [group('dev')] dev-docs: cd docs && pnpm dlx mintlify dev + +install: + pnpm install + pnpm build --filter @sandbox-agent/inspector... + cargo install --path server/packages/sandbox-agent --debug + cargo install --path server/packages/gigacode --debug + +install-fast: + SANDBOX_AGENT_SKIP_INSPECTOR=1 cargo install --path server/packages/sandbox-agent --debug + SANDBOX_AGENT_SKIP_INSPECTOR=1 cargo install --path server/packages/gigacode --debug + +install-release: + pnpm install + pnpm build --filter @sandbox-agent/inspector... + cargo install --path server/packages/sandbox-agent + cargo install --path server/packages/gigacode + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5bfc5da..ffa0f74 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -382,6 +382,42 @@ importers: sdks/cli/platforms/win32-x64: {} + sdks/gigacode: + dependencies: + '@sandbox-agent/cli-shared': + specifier: workspace:* + version: link:../cli-shared + optionalDependencies: + gigacode-darwin-arm64: + specifier: workspace:* + version: link:platforms/darwin-arm64 + gigacode-darwin-x64: + specifier: workspace:* + version: link:platforms/darwin-x64 + gigacode-linux-arm64: + specifier: workspace:* + version: link:platforms/linux-arm64 + gigacode-linux-x64: + specifier: workspace:* + version: link:platforms/linux-x64 + gigacode-win32-x64: + specifier: workspace:* + version: link:platforms/win32-x64 + devDependencies: + vitest: + specifier: ^3.0.0 + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) + + sdks/gigacode/platforms/darwin-arm64: {} + + sdks/gigacode/platforms/darwin-x64: {} + + sdks/gigacode/platforms/linux-arm64: {} + + sdks/gigacode/platforms/linux-x64: {} + + sdks/gigacode/platforms/win32-x64: {} + sdks/typescript: dependencies: '@sandbox-agent/cli-shared': diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index dda7e8c..f60a64a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,6 +3,8 @@ packages: - "sdks/*" - "sdks/cli" - "sdks/cli/platforms/*" + - "sdks/gigacode" + - "sdks/gigacode/platforms/*" - "resources/agent-schemas" - "resources/vercel-ai-sdk-schemas" - "scripts/release" diff --git a/scripts/release/promote-artifacts.ts b/scripts/release/promote-artifacts.ts index 9cfdff2..6d98692 100644 --- a/scripts/release/promote-artifacts.ts +++ b/scripts/release/promote-artifacts.ts @@ -35,6 +35,12 @@ export async function promoteArtifacts(opts: ReleaseOpts) { if (opts.latest) { await uploadInstallScripts(opts, "latest"); } + + // Upload gigacode install scripts + await uploadGigacodeInstallScripts(opts, opts.version); + if (opts.latest) { + await uploadGigacodeInstallScripts(opts, "latest"); + } } @@ -55,6 +61,23 @@ async function uploadInstallScripts(opts: ReleaseOpts, version: string) { } } +async function uploadGigacodeInstallScripts(opts: ReleaseOpts, version: string) { + const installScriptPaths = [ + path.resolve(opts.root, "scripts/release/static/gigacode-install.sh"), + path.resolve(opts.root, "scripts/release/static/gigacode-install.ps1"), + ]; + + for (const scriptPath of installScriptPaths) { + let scriptContent = await fs.readFile(scriptPath, "utf-8"); + scriptContent = scriptContent.replace(/__VERSION__/g, version); + + const uploadKey = `${PREFIX}/${version}/${scriptPath.split("/").pop() ?? ""}`; + + console.log(`Uploading gigacode install script: ${uploadKey}`); + await uploadContentToReleases(scriptContent, uploadKey); + } +} + async function copyPath(sourcePrefix: string, targetPrefix: string) { console.log(`Copying ${sourcePrefix} -> ${targetPrefix}`); await deleteReleasesPath(targetPrefix); diff --git a/scripts/release/sdk.ts b/scripts/release/sdk.ts index 78f3e6a..27285eb 100644 --- a/scripts/release/sdk.ts +++ b/scripts/release/sdk.ts @@ -12,6 +12,7 @@ const CRATES = [ "universal-agent-schema", "agent-management", "sandbox-agent", + "gigacode", ] as const; // NPM CLI packages @@ -22,15 +23,69 @@ const CLI_PACKAGES = [ "@sandbox-agent/cli-win32-x64", "@sandbox-agent/cli-darwin-x64", "@sandbox-agent/cli-darwin-arm64", + "gigacode", + "gigacode-linux-x64", + "gigacode-linux-arm64", + "gigacode-win32-x64", + "gigacode-darwin-x64", + "gigacode-darwin-arm64", ] as const; // Mapping from npm package name to Rust target and binary extension -const CLI_PLATFORM_MAP: Record = { - "@sandbox-agent/cli-linux-x64": { target: "x86_64-unknown-linux-musl", binaryExt: "" }, - "@sandbox-agent/cli-linux-arm64": { target: "aarch64-unknown-linux-musl", binaryExt: "" }, - "@sandbox-agent/cli-win32-x64": { target: "x86_64-pc-windows-gnu", binaryExt: ".exe" }, - "@sandbox-agent/cli-darwin-x64": { target: "x86_64-apple-darwin", binaryExt: "" }, - "@sandbox-agent/cli-darwin-arm64": { target: "aarch64-apple-darwin", binaryExt: "" }, +const CLI_PLATFORM_MAP: Record< + string, + { target: string; binaryExt: string; binaryName: string } +> = { + "@sandbox-agent/cli-linux-x64": { + target: "x86_64-unknown-linux-musl", + binaryExt: "", + binaryName: "sandbox-agent", + }, + "@sandbox-agent/cli-linux-arm64": { + target: "aarch64-unknown-linux-musl", + binaryExt: "", + binaryName: "sandbox-agent", + }, + "@sandbox-agent/cli-win32-x64": { + target: "x86_64-pc-windows-gnu", + binaryExt: ".exe", + binaryName: "sandbox-agent", + }, + "@sandbox-agent/cli-darwin-x64": { + target: "x86_64-apple-darwin", + binaryExt: "", + binaryName: "sandbox-agent", + }, + "@sandbox-agent/cli-darwin-arm64": { + target: "aarch64-apple-darwin", + binaryExt: "", + binaryName: "sandbox-agent", + }, + "gigacode-linux-x64": { + target: "x86_64-unknown-linux-musl", + binaryExt: "", + binaryName: "gigacode", + }, + "gigacode-linux-arm64": { + target: "aarch64-unknown-linux-musl", + binaryExt: "", + binaryName: "gigacode", + }, + "gigacode-win32-x64": { + target: "x86_64-pc-windows-gnu", + binaryExt: ".exe", + binaryName: "gigacode", + }, + "gigacode-darwin-x64": { + target: "x86_64-apple-darwin", + binaryExt: "", + binaryName: "gigacode", + }, + "gigacode-darwin-arm64": { + target: "aarch64-apple-darwin", + binaryExt: "", + binaryName: "gigacode", + }, }; async function npmVersionExists( @@ -246,33 +301,41 @@ export async function publishNpmCli(opts: ReleaseOpts) { let packagePath: string; if (packageName === "@sandbox-agent/cli") { packagePath = join(opts.root, "sdks/cli"); - } else { + } else if (packageName === "gigacode") { + packagePath = join(opts.root, "sdks/gigacode"); + } else if (packageName.startsWith("@sandbox-agent/cli-")) { // Platform-specific packages: @sandbox-agent/cli-linux-x64 -> sdks/cli/platforms/linux-x64 const platform = packageName.replace("@sandbox-agent/cli-", ""); packagePath = join(opts.root, "sdks/cli/platforms", platform); + } else if (packageName.startsWith("gigacode-")) { + // Platform-specific packages: gigacode-linux-x64 -> sdks/gigacode/platforms/linux-x64 + const platform = packageName.replace("gigacode-", ""); + packagePath = join(opts.root, "sdks/gigacode/platforms", platform); + } else { + throw new Error(`Unknown CLI package: ${packageName}`); + } - // Download binary from R2 for platform-specific packages - const platformInfo = CLI_PLATFORM_MAP[packageName]; - if (platformInfo) { - const binDir = join(packagePath, "bin"); - const binaryName = `sandbox-agent${platformInfo.binaryExt}`; - const localBinaryPath = join(binDir, binaryName); - const remoteBinaryPath = `${PREFIX}/${sourceCommit}/binaries/sandbox-agent-${platformInfo.target}${platformInfo.binaryExt}`; + // Download binary from R2 for platform-specific packages + const platformInfo = CLI_PLATFORM_MAP[packageName]; + if (platformInfo) { + const binDir = join(packagePath, "bin"); + const binaryName = `${platformInfo.binaryName}${platformInfo.binaryExt}`; + const localBinaryPath = join(binDir, binaryName); + const remoteBinaryPath = `${PREFIX}/${sourceCommit}/binaries/${platformInfo.binaryName}-${platformInfo.target}${platformInfo.binaryExt}`; - console.log(`==> Downloading binary for ${packageName}`); - console.log(` From: ${remoteBinaryPath}`); - console.log(` To: ${localBinaryPath}`); + console.log(`==> Downloading binary for ${packageName}`); + console.log(` From: ${remoteBinaryPath}`); + console.log(` To: ${localBinaryPath}`); - // Create bin directory - await fs.mkdir(binDir, { recursive: true }); + // Create bin directory + await fs.mkdir(binDir, { recursive: true }); - // Download binary - await downloadFromReleases(remoteBinaryPath, localBinaryPath); + // Download binary + await downloadFromReleases(remoteBinaryPath, localBinaryPath); - // Make binary executable (not needed on Windows) - if (!platformInfo.binaryExt) { - await fs.chmod(localBinaryPath, 0o755); - } + // Make binary executable (not needed on Windows) + if (!platformInfo.binaryExt) { + await fs.chmod(localBinaryPath, 0o755); } } diff --git a/scripts/release/static/gigacode-install.ps1 b/scripts/release/static/gigacode-install.ps1 new file mode 100644 index 0000000..0b3e6c1 --- /dev/null +++ b/scripts/release/static/gigacode-install.ps1 @@ -0,0 +1,51 @@ +#!/usr/bin/env pwsh + +$ErrorActionPreference = 'Stop' + +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + +# Create bin directory for gigacode +$BinDir = $env:BIN_DIR +$GigacodeInstall = if ($BinDir) { + $BinDir +} else { + "${Home}\.gigacode\bin" +} + +if (!(Test-Path $GigacodeInstall)) { + New-Item $GigacodeInstall -ItemType Directory | Out-Null +} + +$GigacodeExe = "$GigacodeInstall\gigacode.exe" +$Version = '__VERSION__' +$FileName = 'gigacode-x86_64-pc-windows-gnu.exe' + +Write-Host +Write-Host "> Installing gigacode ${Version}" + +# Download binary +$DownloadUrl = "https://releases.rivet.dev/sandbox-agent/${Version}/binaries/${FileName}" +Write-Host +Write-Host "> Downloading ${DownloadUrl}" +Invoke-WebRequest $DownloadUrl -OutFile $GigacodeExe -UseBasicParsing + +# Install to PATH +Write-Host +Write-Host "> Installing gigacode" +$User = [System.EnvironmentVariableTarget]::User +$Path = [System.Environment]::GetEnvironmentVariable('Path', $User) +if (!(";${Path};".ToLower() -like "*;${GigacodeInstall};*".ToLower())) { + [System.Environment]::SetEnvironmentVariable('Path', "${Path};${GigacodeInstall}", $User) + $Env:Path += ";${GigacodeInstall}" + Write-Host "Please restart your PowerShell session or run the following command to refresh the environment variables:" + Write-Host "[System.Environment]::SetEnvironmentVariable('Path', '${Path};${GigacodeInstall}', [System.EnvironmentVariableTarget]::Process)" +} + +Write-Host +Write-Host "> Checking installation" +gigacode.exe --version + +Write-Host +Write-Host "gigacode was installed successfully to ${GigacodeExe}." +Write-Host "Run 'gigacode --help' to get started." +Write-Host diff --git a/scripts/release/static/gigacode-install.sh b/scripts/release/static/gigacode-install.sh new file mode 100644 index 0000000..4c4110c --- /dev/null +++ b/scripts/release/static/gigacode-install.sh @@ -0,0 +1,103 @@ +#!/bin/sh +# shellcheck enable=add-default-case +# shellcheck enable=avoid-nullary-conditions +# shellcheck enable=check-unassigned-uppercase +# shellcheck enable=deprecate-which +# shellcheck enable=quote-safe-variables +# shellcheck enable=require-variable-braces +set -eu + +rm -rf /tmp/gigacode_install +mkdir /tmp/gigacode_install +cd /tmp/gigacode_install + +GIGACODE_VERSION="${GIGACODE_VERSION:-__VERSION__}" +UNAME="$(uname -s)" +ARCH="$(uname -m)" + +# Find asset suffix +if [ "$(printf '%s' "$UNAME" | cut -c 1-6)" = "Darwin" ]; then + echo + echo "> Detected macOS" + + if [ "$ARCH" = "x86_64" ]; then + FILE_NAME="gigacode-x86_64-apple-darwin" + elif [ "$ARCH" = "arm64" ]; then + FILE_NAME="gigacode-aarch64-apple-darwin" + else + echo "Unknown arch $ARCH" 1>&2 + exit 1 + fi +elif [ "$(printf '%s' "$UNAME" | cut -c 1-5)" = "Linux" ]; then + echo + echo "> Detected Linux ($(getconf LONG_BIT) bit)" + + FILE_NAME="gigacode-x86_64-unknown-linux-musl" +else + echo "Unable to determine platform" 1>&2 + exit 1 +fi + +# Determine install location +set +u +if [ -z "$BIN_DIR" ]; then + BIN_DIR="/usr/local/bin" +fi +set -u +INSTALL_PATH="$BIN_DIR/gigacode" + +if [ ! -d "$BIN_DIR" ]; then + # Find the base parent directory. We're using mkdir -p, which recursively creates directories, so we can't rely on `dirname`. + CHECK_DIR="$BIN_DIR" + while [ ! -d "$CHECK_DIR" ] && [ "$CHECK_DIR" != "/" ]; do + CHECK_DIR=$(dirname "$CHECK_DIR") + done + + # Check if the directory is writable + if [ ! -w "$CHECK_DIR" ]; then + echo + echo "> Creating directory $BIN_DIR (requires sudo)" + sudo mkdir -p "$BIN_DIR" + else + echo + echo "> Creating directory $BIN_DIR" + mkdir -p "$BIN_DIR" + fi + +fi + +# Download binary +URL="https://releases.rivet.dev/sandbox-agent/${GIGACODE_VERSION}/binaries/${FILE_NAME}" +echo +echo "> Downloading $URL" +curl -fsSL "$URL" -o gigacode +chmod +x gigacode + +# Move binary +if [ ! -w "$BIN_DIR" ]; then + echo + echo "> Installing gigacode to $INSTALL_PATH (requires sudo)" + sudo mv ./gigacode "$INSTALL_PATH" +else + echo + echo "> Installing gigacode to $INSTALL_PATH" + mv ./gigacode "$INSTALL_PATH" +fi + +# Check if path may be incorrect +case ":$PATH:" in + *:$BIN_DIR:*) ;; + *) + echo "WARNING: $BIN_DIR is not in \$PATH" + echo "For instructions on how to add it to your PATH, visit:" + echo "https://opensource.com/article/17/6/set-path-linux" + ;; +esac + +echo +echo "> Checking installation" +"$BIN_DIR/gigacode" --version + +echo +echo "gigacode was installed successfully." +echo "Run 'gigacode --help' to get started." diff --git a/scripts/release/update_version.ts b/scripts/release/update_version.ts index e8c4afc..c7c1c60 100644 --- a/scripts/release/update_version.ts +++ b/scripts/release/update_version.ts @@ -32,11 +32,21 @@ export async function updateVersion(opts: ReleaseOpts) { find: /"version": ".*"/, replace: `"version": "${opts.version}"`, }, + { + path: "sdks/gigacode/package.json", + find: /"version": ".*"/, + replace: `"version": "${opts.version}"`, + }, { path: "sdks/cli/platforms/*/package.json", find: /"version": ".*"/, replace: `"version": "${opts.version}"`, }, + { + path: "sdks/gigacode/platforms/*/package.json", + find: /"version": ".*"/, + replace: `"version": "${opts.version}"`, + }, ]; // Update internal crate versions in workspace dependencies diff --git a/sdks/cli-shared/src/index.ts b/sdks/cli-shared/src/index.ts index da2773f..c80125e 100644 --- a/sdks/cli-shared/src/index.ts +++ b/sdks/cli-shared/src/index.ts @@ -8,6 +8,7 @@ export type NonExecutableBinaryMessageOptions = { trustPackages: string; bunInstallBlocks: InstallCommandBlock[]; genericInstallCommands?: string[]; + binaryName?: string; }; export type FsSubset = { @@ -63,10 +64,16 @@ export function assertExecutable(binPath: string, fs: FsSubset): boolean { export function formatNonExecutableBinaryMessage( options: NonExecutableBinaryMessageOptions, ): string { - const { binPath, trustPackages, bunInstallBlocks, genericInstallCommands } = - options; + const { + binPath, + trustPackages, + bunInstallBlocks, + genericInstallCommands, + binaryName, + } = options; - const lines = [`sandbox-agent binary is not executable: ${binPath}`]; + const label = binaryName ?? "sandbox-agent"; + const lines = [`${label} binary is not executable: ${binPath}`]; if (isBunRuntime()) { lines.push( diff --git a/sdks/gigacode/bin/gigacode b/sdks/gigacode/bin/gigacode new file mode 100644 index 0000000..53f2cf5 --- /dev/null +++ b/sdks/gigacode/bin/gigacode @@ -0,0 +1,66 @@ +#!/usr/bin/env node +const { execFileSync } = require("child_process"); +const { + assertExecutable, + formatNonExecutableBinaryMessage, +} = require("@sandbox-agent/cli-shared"); +const fs = require("fs"); +const path = require("path"); + +const TRUST_PACKAGES = + "gigacode-linux-x64 gigacode-linux-arm64 gigacode-darwin-arm64 gigacode-darwin-x64 gigacode-win32-x64"; + +function formatHint(binPath) { + return formatNonExecutableBinaryMessage({ + binPath, + binaryName: "gigacode", + trustPackages: TRUST_PACKAGES, + bunInstallBlocks: [ + { + label: "Project install", + commands: [ + `bun pm trust ${TRUST_PACKAGES}`, + "bun add gigacode", + ], + }, + { + label: "Global install", + commands: [ + `bun pm -g trust ${TRUST_PACKAGES}`, + "bun add -g gigacode", + ], + }, + ], + }); +} + +const PLATFORMS = { + "darwin-arm64": "gigacode-darwin-arm64", + "darwin-x64": "gigacode-darwin-x64", + "linux-x64": "gigacode-linux-x64", + "linux-arm64": "gigacode-linux-arm64", + "win32-x64": "gigacode-win32-x64", +}; + +const key = `${process.platform}-${process.arch}`; +const pkg = PLATFORMS[key]; +if (!pkg) { + console.error(`Unsupported platform: ${key}`); + process.exit(1); +} + +try { + const pkgPath = require.resolve(`${pkg}/package.json`); + const bin = process.platform === "win32" ? "gigacode.exe" : "gigacode"; + const binPath = path.join(path.dirname(pkgPath), "bin", bin); + + if (!assertExecutable(binPath, fs)) { + console.error(formatHint(binPath)); + process.exit(1); + } + + execFileSync(binPath, process.argv.slice(2), { stdio: "inherit" }); +} catch (e) { + if (e.status !== undefined) process.exit(e.status); + throw e; +} diff --git a/sdks/gigacode/package.json b/sdks/gigacode/package.json new file mode 100644 index 0000000..90affe4 --- /dev/null +++ b/sdks/gigacode/package.json @@ -0,0 +1,32 @@ +{ + "name": "gigacode", + "version": "0.1.6", + "description": "Gigacode CLI (sandbox-agent with OpenCode attach by default)", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/rivet-dev/sandbox-agent" + }, + "bin": { + "gigacode": "bin/gigacode" + }, + "scripts": { + "test": "vitest run" + }, + "dependencies": { + "@sandbox-agent/cli-shared": "workspace:*" + }, + "devDependencies": { + "vitest": "^3.0.0" + }, + "optionalDependencies": { + "gigacode-linux-x64": "workspace:*", + "gigacode-linux-arm64": "workspace:*", + "gigacode-darwin-arm64": "workspace:*", + "gigacode-darwin-x64": "workspace:*", + "gigacode-win32-x64": "workspace:*" + }, + "files": [ + "bin" + ] +} diff --git a/sdks/gigacode/platforms/darwin-arm64/package.json b/sdks/gigacode/platforms/darwin-arm64/package.json new file mode 100644 index 0000000..99d30ff --- /dev/null +++ b/sdks/gigacode/platforms/darwin-arm64/package.json @@ -0,0 +1,22 @@ +{ + "name": "gigacode-darwin-arm64", + "version": "0.1.6", + "description": "gigacode CLI binary for macOS arm64", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/rivet-dev/sandbox-agent" + }, + "os": [ + "darwin" + ], + "cpu": [ + "arm64" + ], + "scripts": { + "postinstall": "chmod +x bin/gigacode || true" + }, + "files": [ + "bin" + ] +} diff --git a/sdks/gigacode/platforms/darwin-x64/package.json b/sdks/gigacode/platforms/darwin-x64/package.json new file mode 100644 index 0000000..791cb1b --- /dev/null +++ b/sdks/gigacode/platforms/darwin-x64/package.json @@ -0,0 +1,22 @@ +{ + "name": "gigacode-darwin-x64", + "version": "0.1.6", + "description": "gigacode CLI binary for macOS x64", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/rivet-dev/sandbox-agent" + }, + "os": [ + "darwin" + ], + "cpu": [ + "x64" + ], + "scripts": { + "postinstall": "chmod +x bin/gigacode || true" + }, + "files": [ + "bin" + ] +} diff --git a/sdks/gigacode/platforms/linux-arm64/package.json b/sdks/gigacode/platforms/linux-arm64/package.json new file mode 100644 index 0000000..1a4d799 --- /dev/null +++ b/sdks/gigacode/platforms/linux-arm64/package.json @@ -0,0 +1,22 @@ +{ + "name": "gigacode-linux-arm64", + "version": "0.1.6", + "description": "gigacode CLI binary for Linux arm64", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/rivet-dev/sandbox-agent" + }, + "os": [ + "linux" + ], + "cpu": [ + "arm64" + ], + "scripts": { + "postinstall": "chmod +x bin/gigacode || true" + }, + "files": [ + "bin" + ] +} diff --git a/sdks/gigacode/platforms/linux-x64/package.json b/sdks/gigacode/platforms/linux-x64/package.json new file mode 100644 index 0000000..c7950dd --- /dev/null +++ b/sdks/gigacode/platforms/linux-x64/package.json @@ -0,0 +1,22 @@ +{ + "name": "gigacode-linux-x64", + "version": "0.1.6", + "description": "gigacode CLI binary for Linux x64", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/rivet-dev/sandbox-agent" + }, + "os": [ + "linux" + ], + "cpu": [ + "x64" + ], + "scripts": { + "postinstall": "chmod +x bin/gigacode || true" + }, + "files": [ + "bin" + ] +} diff --git a/sdks/gigacode/platforms/win32-x64/package.json b/sdks/gigacode/platforms/win32-x64/package.json new file mode 100644 index 0000000..1658a1b --- /dev/null +++ b/sdks/gigacode/platforms/win32-x64/package.json @@ -0,0 +1,19 @@ +{ + "name": "gigacode-win32-x64", + "version": "0.1.6", + "description": "gigacode CLI binary for Windows x64", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/rivet-dev/sandbox-agent" + }, + "os": [ + "win32" + ], + "cpu": [ + "x64" + ], + "files": [ + "bin" + ] +} diff --git a/server/packages/gigacode/Cargo.toml b/server/packages/gigacode/Cargo.toml new file mode 100644 index 0000000..29a4e86 --- /dev/null +++ b/server/packages/gigacode/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "gigacode" +version.workspace = true +edition.workspace = true +authors.workspace = true +license.workspace = true +description = "Sandbox Agent CLI with OpenCode attach by default" +repository.workspace = true + +[[bin]] +name = "gigacode" +path = "src/main.rs" + +[dependencies] +clap.workspace = true +sandbox-agent.workspace = true +tracing.workspace = true diff --git a/server/packages/gigacode/README.md b/server/packages/gigacode/README.md new file mode 100644 index 0000000..25da901 --- /dev/null +++ b/server/packages/gigacode/README.md @@ -0,0 +1,80 @@ +# GigaCode + +Use [OpenCode](https://opencode.ai)'s UI with any coding agent. + +Supports Claude Code, Codex, and Amp. + +This is __not__ a fork. It's powered by [Sandbox Agent SDK](https://sandboxagent.dev)'s wizardry. + +> **Experimental**: This project is under active development. Please report bugs on [GitHub Issues](https://github.com/rivet-dev/sandbox-agent/issues) or join our [Discord](https://rivet.dev/discord). + +## How It Works + +``` +┌─ GigaCode ────────────────────────────────────────────────────────┐ +│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ +│ │ OpenCode TUI │───▶│ Sandbox Agent │───▶│ Claude Code / │ │ +│ │ │ │ │ │ Codex / Amp │ │ +│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ +└───────────────────────────────────────────────────────────────────┘ +``` + +- [Sandbox Agent SDK](https://sandboxagent.dev) provides a universal HTTP API for controlling Claude Code, Codex, and Amp +- Sandbox Agent SDK exposes an [OpenCode-compatible endpoint](https://sandboxagent.dev/opencode-compatibility) so OpenCode can talk to any agent +- OpenCode connects to Sandbox Agent SDK via [`attach`](https://opencode.ai/docs/cli/#attach) + +## Install + +**macOS / Linux / WSL (Recommended)** + +```bash +curl -fsSL https://releases.rivet.dev/sandbox-agent/latest/gigacode-install.sh | sh +``` + +**npm i -g** + +```bash +npm install -g gigacode +gigacode --help +``` + +**bun add -g** + +```bash +bun add -g gigacode +# Allow Bun to run postinstall scripts for native binaries. +bun pm -g trust gigacode-linux-x64 gigacode-linux-arm64 gigacode-darwin-arm64 gigacode-darwin-x64 gigacode-win32-x64 +gigacode --help +``` + +**npx** + +```bash +npx gigacode --help +``` + +**bunx** + +```bash +bunx gigacode --help +``` + +> **Note:** Windows is unsupported. Please use [WSL](https://learn.microsoft.com/en-us/windows/wsl/install). + +## Usage + +**TUI** + +Launch the OpenCode TUI with any coding agent: + +```bash +gigacode +``` + +**Web UI** + +Use the [OpenCode Web UI](https://sandboxagent.dev/opencode-compatibility) to control any coding agent from the browser. + +**OpenCode SDK** + +Use the [`@opencode-ai/sdk`](https://sandboxagent.dev/opencode-compatibility) to programmatically control any coding agent. diff --git a/server/packages/gigacode/src/main.rs b/server/packages/gigacode/src/main.rs new file mode 100644 index 0000000..5aa64c0 --- /dev/null +++ b/server/packages/gigacode/src/main.rs @@ -0,0 +1,28 @@ +use clap::Parser; +use sandbox_agent::cli::{ + CliConfig, CliError, Command, GigacodeCli, OpencodeArgs, init_logging, run_command, +}; + +fn main() { + if let Err(err) = run() { + tracing::error!(error = %err, "gigacode failed"); + std::process::exit(1); + } +} + +fn run() -> Result<(), CliError> { + let cli = GigacodeCli::parse(); + let config = CliConfig { + token: cli.token, + no_token: cli.no_token, + gigacode: true, + }; + let command = cli + .command + .unwrap_or_else(|| Command::Opencode(OpencodeArgs::default())); + if let Err(err) = init_logging(&command) { + eprintln!("failed to init logging: {err}"); + return Err(err); + } + run_command(&command, &config) +} diff --git a/server/packages/sandbox-agent/build.rs b/server/packages/sandbox-agent/build.rs index 170c05a..515a20c 100644 --- a/server/packages/sandbox-agent/build.rs +++ b/server/packages/sandbox-agent/build.rs @@ -19,9 +19,22 @@ fn main() { println!("cargo:rerun-if-env-changed=SANDBOX_AGENT_VERSION"); println!("cargo:rerun-if-changed={}", dist_dir.display()); + // Rebuild when the git HEAD changes so BUILD_ID stays current. + let git_head = manifest_dir.join(".git/HEAD"); + if git_head.exists() { + println!("cargo:rerun-if-changed={}", git_head.display()); + } else { + // In a workspace the .git dir lives at the repo root. + let root_git_head = root_dir.join(".git/HEAD"); + if root_git_head.exists() { + println!("cargo:rerun-if-changed={}", root_git_head.display()); + } + } + // Generate version constant from environment variable or fallback to Cargo.toml version let out_dir = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR")); generate_version(&out_dir); + generate_build_id(&out_dir); let skip = env::var("SANDBOX_AGENT_SKIP_INSPECTOR").is_ok(); let out_file = out_dir.join("inspector_assets.rs"); @@ -81,3 +94,33 @@ fn generate_version(out_dir: &Path) { fs::write(&out_file, contents).expect("write version.rs"); } + +fn generate_build_id(out_dir: &Path) { + use std::process::Command; + + let build_id = Command::new("git") + .args(["rev-parse", "--short", "HEAD"]) + .output() + .ok() + .filter(|o| o.status.success()) + .and_then(|o| String::from_utf8(o.stdout).ok()) + .map(|s| s.trim().to_string()) + .unwrap_or_else(|| { + // Fallback: use the package version + compile-time timestamp + let version = env::var("CARGO_PKG_VERSION").unwrap_or_default(); + let timestamp = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .map(|d| d.as_secs().to_string()) + .unwrap_or_default(); + format!("{version}-{timestamp}") + }); + + let out_file = out_dir.join("build_id.rs"); + let contents = format!( + "/// Unique identifier for this build (git short hash or version-timestamp fallback).\n\ + pub const BUILD_ID: &str = \"{}\";\n", + build_id + ); + + fs::write(&out_file, contents).expect("write build_id.rs"); +} diff --git a/server/packages/sandbox-agent/src/cli.rs b/server/packages/sandbox-agent/src/cli.rs new file mode 100644 index 0000000..323f596 --- /dev/null +++ b/server/packages/sandbox-agent/src/cli.rs @@ -0,0 +1,1320 @@ +use std::collections::HashMap; +use std::io::Write; +use std::path::PathBuf; +use std::process::{Command as ProcessCommand, Stdio}; +use std::sync::Arc; +use std::time::Duration; + +use clap::{Args, Parser, Subcommand}; + +// Include the generated version constant +mod build_version { + include!(concat!(env!("OUT_DIR"), "/version.rs")); +} +use reqwest::blocking::Client as HttpClient; +use reqwest::Method; +use crate::router::{build_router_with_state, shutdown_servers}; +use crate::router::{ + AgentInstallRequest, AppState, AuthConfig, CreateSessionRequest, MessageRequest, + PermissionReply, PermissionReplyRequest, QuestionReplyRequest, +}; +use crate::router::{ + AgentListResponse, AgentModesResponse, CreateSessionResponse, EventsResponse, + SessionListResponse, +}; +use crate::server_logs::ServerLogs; +use crate::telemetry; +use crate::ui; +use sandbox_agent_agent_management::agents::{AgentId, AgentManager, InstallOptions}; +use sandbox_agent_agent_management::credentials::{ + extract_all_credentials, AuthType, CredentialExtractionOptions, ExtractedCredentials, + ProviderCredentials, +}; +use serde::Serialize; +use serde_json::{json, Value}; +use thiserror::Error; +use tower_http::cors::{Any, CorsLayer}; +use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter}; + +const API_PREFIX: &str = "/v1"; +const DEFAULT_HOST: &str = "127.0.0.1"; +const DEFAULT_PORT: u16 = 2468; +const LOGS_RETENTION: Duration = Duration::from_secs(7 * 24 * 60 * 60); + +#[derive(Parser, Debug)] +#[command(name = "sandbox-agent", bin_name = "sandbox-agent")] +#[command(about = "https://sandboxagent.dev", version = build_version::VERSION)] +#[command(arg_required_else_help = true)] +pub struct SandboxAgentCli { + #[command(subcommand)] + command: Command, + + #[arg(long, short = 't', global = true)] + token: Option, + + #[arg(long, short = 'n', global = true)] + no_token: bool, +} + +#[derive(Parser, Debug)] +#[command(name = "gigacode", bin_name = "gigacode")] +#[command(about = "https://sandboxagent.dev", version = build_version::VERSION)] +pub struct GigacodeCli { + #[command(subcommand)] + pub command: Option, + + #[arg(long, short = 't', global = true)] + pub token: Option, + + #[arg(long, short = 'n', global = true)] + pub no_token: bool, +} + +#[derive(Subcommand, Debug)] +pub enum Command { + /// Run the sandbox agent HTTP server. + Server(ServerArgs), + /// Call the HTTP API without writing client code. + Api(ApiArgs), + /// EXPERIMENTAL: Start a sandbox-agent server and attach an OpenCode session. + Opencode(OpencodeArgs), + /// Manage the sandbox-agent background daemon. + Daemon(DaemonArgs), + /// Install or reinstall an agent without running the server. + InstallAgent(InstallAgentArgs), + /// Inspect locally discovered credentials. + Credentials(CredentialsArgs), +} + +#[derive(Args, Debug)] +pub struct ServerArgs { + #[arg(long, short = 'H', default_value = DEFAULT_HOST)] + host: String, + + #[arg(long, short = 'p', default_value_t = DEFAULT_PORT)] + port: u16, + + #[arg(long = "cors-allow-origin", short = 'O')] + cors_allow_origin: Vec, + + #[arg(long = "cors-allow-method", short = 'M')] + cors_allow_method: Vec, + + #[arg(long = "cors-allow-header", short = 'A')] + cors_allow_header: Vec, + + #[arg(long = "cors-allow-credentials", short = 'C')] + cors_allow_credentials: bool, + + #[arg(long = "no-telemetry")] + no_telemetry: bool, +} + +#[derive(Args, Debug)] +pub struct ApiArgs { + #[command(subcommand)] + command: ApiCommand, +} + +#[derive(Args, Debug)] +pub struct OpencodeArgs { + #[arg(long, short = 'H', default_value = DEFAULT_HOST)] + host: String, + + #[arg(long, short = 'p', default_value_t = DEFAULT_PORT)] + port: u16, + + #[arg(long)] + session_title: Option, + + #[arg(long)] + opencode_bin: Option, +} + +impl Default for OpencodeArgs { + fn default() -> Self { + Self { + host: DEFAULT_HOST.to_string(), + port: DEFAULT_PORT, + session_title: None, + opencode_bin: None, + } + } +} + +#[derive(Args, Debug)] +pub struct CredentialsArgs { + #[command(subcommand)] + command: CredentialsCommand, +} + +#[derive(Args, Debug)] +pub struct DaemonArgs { + #[command(subcommand)] + command: DaemonCommand, +} + +#[derive(Subcommand, Debug)] +pub enum DaemonCommand { + /// Start the daemon in the background. + Start(DaemonStartArgs), + /// Stop a running daemon. + Stop(DaemonStopArgs), + /// Show daemon status. + Status(DaemonStatusArgs), +} + +#[derive(Args, Debug)] +pub struct DaemonStartArgs { + #[arg(long, short = 'H', default_value = DEFAULT_HOST)] + host: String, + + #[arg(long, short = 'p', default_value_t = DEFAULT_PORT)] + port: u16, +} + +#[derive(Args, Debug)] +pub struct DaemonStopArgs { + #[arg(long, short = 'H', default_value = DEFAULT_HOST)] + host: String, + + #[arg(long, short = 'p', default_value_t = DEFAULT_PORT)] + port: u16, +} + +#[derive(Args, Debug)] +pub struct DaemonStatusArgs { + #[arg(long, short = 'H', default_value = DEFAULT_HOST)] + host: String, + + #[arg(long, short = 'p', default_value_t = DEFAULT_PORT)] + port: u16, +} + +#[derive(Subcommand, Debug)] +pub enum ApiCommand { + /// Manage installed agents and their modes. + Agents(AgentsArgs), + /// Create sessions and interact with session events. + Sessions(SessionsArgs), +} + +#[derive(Subcommand, Debug)] +pub enum CredentialsCommand { + /// Extract credentials using local discovery rules. + Extract(CredentialsExtractArgs), + /// Output credentials as environment variable assignments. + #[command(name = "extract-env")] + ExtractEnv(CredentialsExtractEnvArgs), +} + +#[derive(Args, Debug)] +pub struct AgentsArgs { + #[command(subcommand)] + command: AgentsCommand, +} + +#[derive(Args, Debug)] +pub struct SessionsArgs { + #[command(subcommand)] + command: SessionsCommand, +} + +#[derive(Subcommand, Debug)] +pub enum AgentsCommand { + /// List all agents and install status. + List(ClientArgs), + /// Install or reinstall an agent. + Install(ApiInstallAgentArgs), + /// Show available modes for an agent. + Modes(AgentModesArgs), +} + +#[derive(Subcommand, Debug)] +pub enum SessionsCommand { + /// List active sessions. + List(ClientArgs), + /// Create a new session for an agent. + Create(CreateSessionArgs), + #[command(name = "send-message")] + /// Send a message to an existing session. + SendMessage(SessionMessageArgs), + #[command(name = "send-message-stream")] + /// Send a message and stream the response for one turn. + SendMessageStream(SessionMessageStreamArgs), + #[command(name = "terminate")] + /// Terminate a session. + Terminate(SessionTerminateArgs), + #[command(name = "get-messages")] + /// Alias for events; returns session events. + GetMessages(SessionEventsArgs), + #[command(name = "events")] + /// Fetch session events with offset/limit. + Events(SessionEventsArgs), + #[command(name = "events-sse")] + /// Stream session events over SSE. + EventsSse(SessionEventsSseArgs), + #[command(name = "reply-question")] + /// Reply to a question event. + ReplyQuestion(QuestionReplyArgs), + #[command(name = "reject-question")] + /// Reject a question event. + RejectQuestion(QuestionRejectArgs), + #[command(name = "reply-permission")] + /// Reply to a permission request. + ReplyPermission(PermissionReplyArgs), +} + +#[derive(Args, Debug, Clone)] +pub struct ClientArgs { + #[arg(long, short = 'e')] + endpoint: Option, +} + +#[derive(Args, Debug)] +pub struct ApiInstallAgentArgs { + agent: String, + #[arg(long, short = 'r')] + reinstall: bool, + #[command(flatten)] + client: ClientArgs, +} + +#[derive(Args, Debug)] +pub struct InstallAgentArgs { + agent: String, + #[arg(long, short = 'r')] + reinstall: bool, +} + +#[derive(Args, Debug)] +pub struct AgentModesArgs { + agent: String, + #[command(flatten)] + client: ClientArgs, +} + +#[derive(Args, Debug)] +pub struct CreateSessionArgs { + session_id: String, + #[arg(long, short = 'a')] + agent: String, + #[arg(long, short = 'g')] + agent_mode: Option, + #[arg(long, short = 'p')] + permission_mode: Option, + #[arg(long, short = 'm')] + model: Option, + #[arg(long, short = 'v')] + variant: Option, + #[arg(long, short = 'A')] + agent_version: Option, + #[command(flatten)] + client: ClientArgs, +} + +#[derive(Args, Debug)] +pub struct SessionMessageArgs { + session_id: String, + #[arg(long, short = 'm')] + message: String, + #[command(flatten)] + client: ClientArgs, +} + +#[derive(Args, Debug)] +pub struct SessionMessageStreamArgs { + session_id: String, + #[arg(long, short = 'm')] + message: String, + #[arg(long)] + include_raw: bool, + #[command(flatten)] + client: ClientArgs, +} + +#[derive(Args, Debug)] +pub struct SessionEventsArgs { + session_id: String, + #[arg(long, short = 'o')] + offset: Option, + #[arg(long, short = 'l')] + limit: Option, + #[arg(long)] + include_raw: bool, + #[command(flatten)] + client: ClientArgs, +} + +#[derive(Args, Debug)] +pub struct SessionEventsSseArgs { + session_id: String, + #[arg(long, short = 'o')] + offset: Option, + #[arg(long)] + include_raw: bool, + #[command(flatten)] + client: ClientArgs, +} + +#[derive(Args, Debug)] +pub struct SessionTerminateArgs { + session_id: String, + #[command(flatten)] + client: ClientArgs, +} + +#[derive(Args, Debug)] +pub struct QuestionReplyArgs { + session_id: String, + question_id: String, + #[arg(long, short = 'a')] + answers: String, + #[command(flatten)] + client: ClientArgs, +} + +#[derive(Args, Debug)] +pub struct QuestionRejectArgs { + session_id: String, + question_id: String, + #[command(flatten)] + client: ClientArgs, +} + +#[derive(Args, Debug)] +pub struct PermissionReplyArgs { + session_id: String, + permission_id: String, + #[arg(long, short = 'r')] + reply: PermissionReply, + #[command(flatten)] + client: ClientArgs, +} + +#[derive(Args, Debug)] +pub struct CredentialsExtractArgs { + #[arg(long, short = 'a', value_enum)] + agent: Option, + #[arg(long, short = 'p')] + provider: Option, + #[arg(long, short = 'd')] + home_dir: Option, + #[arg(long)] + no_oauth: bool, + #[arg(long, short = 'r')] + reveal: bool, +} + +#[derive(Args, Debug)] +pub struct CredentialsExtractEnvArgs { + /// Prefix each line with "export " for shell sourcing. + #[arg(long, short = 'e')] + export: bool, + #[arg(long, short = 'd')] + home_dir: Option, + #[arg(long)] + no_oauth: bool, +} + +#[derive(Debug, Error)] +pub enum CliError { + #[error("missing --token or --no-token for server mode")] + MissingToken, + #[error("invalid cors origin: {0}")] + InvalidCorsOrigin(String), + #[error("invalid cors method: {0}")] + InvalidCorsMethod(String), + #[error("invalid cors header: {0}")] + InvalidCorsHeader(String), + #[error("http error: {0}")] + Http(#[from] reqwest::Error), + #[error("io error: {0}")] + Io(#[from] std::io::Error), + #[error("json error: {0}")] + Json(#[from] serde_json::Error), + #[error("server error: {0}")] + Server(String), + #[error("unexpected http status: {0}")] + HttpStatus(reqwest::StatusCode), +} + +pub struct CliConfig { + pub token: Option, + pub no_token: bool, + pub gigacode: bool, +} + +pub fn run_sandbox_agent() -> Result<(), CliError> { + let cli = SandboxAgentCli::parse(); + let SandboxAgentCli { + command, + token, + no_token, + } = cli; + let config = CliConfig { token, no_token, gigacode: false }; + if let Err(err) = init_logging(&command) { + eprintln!("failed to init logging: {err}"); + return Err(err); + } + run_command(&command, &config) +} + +pub fn init_logging(command: &Command) -> Result<(), CliError> { + if matches!(command, Command::Server(_)) { + maybe_redirect_server_logs(); + } + + let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")); + tracing_subscriber::registry() + .with(filter) + .with( + tracing_logfmt::builder() + .layer() + .with_writer(std::io::stderr), + ) + .init(); + Ok(()) +} + +pub fn run_command(command: &Command, cli: &CliConfig) -> Result<(), CliError> { + match command { + Command::Server(args) => run_server(cli, args), + Command::Api(subcommand) => run_api(&subcommand.command, cli), + Command::Opencode(args) => run_opencode(cli, args), + Command::Daemon(subcommand) => run_daemon(&subcommand.command, cli), + Command::InstallAgent(args) => install_agent_local(args), + Command::Credentials(subcommand) => run_credentials(&subcommand.command), + } +} + +fn run_server(cli: &CliConfig, server: &ServerArgs) -> Result<(), CliError> { + let auth = if cli.no_token { + AuthConfig::disabled() + } else if let Some(token) = cli.token.clone() { + AuthConfig::with_token(token) + } else { + return Err(CliError::MissingToken); + }; + + let agent_manager = AgentManager::new(default_install_dir()) + .map_err(|err| CliError::Server(err.to_string()))?; + let state = Arc::new(AppState::new(auth, agent_manager)); + let (mut router, state) = build_router_with_state(state); + + let cors = build_cors_layer(server)?; + router = router.layer(cors); + + let addr = format!("{}:{}", server.host, server.port); + let display_host = match server.host.as_str() { + "0.0.0.0" | "::" => "localhost", + other => other, + }; + let inspector_url = format!("http://{}:{}/ui", display_host, server.port); + let runtime = tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build() + .map_err(|err| CliError::Server(err.to_string()))?; + + let telemetry_enabled = telemetry::telemetry_enabled(server.no_telemetry); + + runtime.block_on(async move { + if telemetry_enabled { + telemetry::log_enabled_message(); + telemetry::spawn_telemetry_task(); + } + let listener = tokio::net::TcpListener::bind(&addr).await?; + tracing::info!(addr = %addr, "server listening"); + if ui::is_enabled() { + tracing::info!(url = %inspector_url, "inspector ui available"); + } else { + tracing::info!("inspector ui not embedded; set SANDBOX_AGENT_SKIP_INSPECTOR=1 to skip embedding during builds"); + } + let shutdown_state = state.clone(); + axum::serve(listener, router) + .with_graceful_shutdown(async move { + let _ = tokio::signal::ctrl_c().await; + shutdown_servers(&shutdown_state).await; + }) + .await + .map_err(|err| CliError::Server(err.to_string())) + }) +} + +fn default_install_dir() -> PathBuf { + dirs::data_dir() + .map(|dir| dir.join("sandbox-agent").join("bin")) + .unwrap_or_else(|| PathBuf::from(".").join(".sandbox-agent").join("bin")) +} + +fn default_server_log_dir() -> PathBuf { + if let Ok(dir) = std::env::var("SANDBOX_AGENT_LOG_DIR") { + return PathBuf::from(dir); + } + dirs::data_dir() + .map(|dir| dir.join("sandbox-agent").join("logs")) + .unwrap_or_else(|| PathBuf::from(".").join(".sandbox-agent").join("logs")) +} + +fn maybe_redirect_server_logs() { + if std::env::var("SANDBOX_AGENT_LOG_STDOUT").is_ok() { + return; + } + + let log_dir = default_server_log_dir(); + if let Err(err) = ServerLogs::new(log_dir, LOGS_RETENTION).start_sync() { + eprintln!("failed to redirect logs: {err}"); + } +} + +fn run_api(command: &ApiCommand, cli: &CliConfig) -> Result<(), CliError> { + match command { + ApiCommand::Agents(subcommand) => run_agents(&subcommand.command, cli), + ApiCommand::Sessions(subcommand) => run_sessions(&subcommand.command, cli), + } +} + +fn run_opencode(cli: &CliConfig, args: &OpencodeArgs) -> Result<(), CliError> { + let name = if cli.gigacode { "GigaCode" } else { "OpenCode command" }; + write_stderr_line(&format!("EXPERIMENTAL: Please report bugs to:\n- GitHub: https://github.com/rivet-dev/sandbox-agent/issues\n- Discord: https://rivet.dev/discord\n\n{name} is powered by:- OpenCode (TUI): https://opencode.ai/\n- Sandbox Agent SDK (multi-agent compatibility): https://sandboxagent.dev/\n\n"))?; + + let token = cli.token.clone(); + + let base_url = format!("http://{}:{}", args.host, args.port); + crate::daemon::ensure_running(cli, &args.host, args.port, token.as_deref())?; + + let session_id = + create_opencode_session(&base_url, token.as_deref(), args.session_title.as_deref())?; + write_stdout_line(&format!("OpenCode session: {session_id}"))?; + + let attach_url = format!("{base_url}/opencode"); + let opencode_bin = resolve_opencode_bin(args.opencode_bin.as_ref())?; + let mut opencode_cmd = ProcessCommand::new(opencode_bin); + opencode_cmd + .arg("attach") + .arg(&attach_url) + .arg("--session") + .arg(&session_id) + .stdin(Stdio::inherit()) + .stdout(Stdio::inherit()) + .stderr(Stdio::inherit()); + if let Some(token) = token.as_deref() { + opencode_cmd.arg("--password").arg(token); + } + + let status = opencode_cmd + .status() + .map_err(|err| CliError::Server(format!("failed to start opencode: {err}")))?; + + if !status.success() { + return Err(CliError::Server(format!( + "opencode exited with status {status}" + ))); + } + + Ok(()) +} + +fn run_daemon(command: &DaemonCommand, cli: &CliConfig) -> Result<(), CliError> { + let token = cli.token.as_deref(); + match command { + DaemonCommand::Start(args) => { + crate::daemon::start(cli, &args.host, args.port, token) + } + DaemonCommand::Stop(args) => { + crate::daemon::stop(&args.host, args.port) + } + DaemonCommand::Status(args) => { + let st = crate::daemon::status(&args.host, args.port, token)?; + write_stderr_line(&st.to_string())?; + Ok(()) + } + } +} + +fn run_agents(command: &AgentsCommand, cli: &CliConfig) -> Result<(), CliError> { + match command { + AgentsCommand::List(args) => { + let ctx = ClientContext::new(cli, args)?; + let response = ctx.get(&format!("{API_PREFIX}/agents"))?; + print_json_response::(response) + } + AgentsCommand::Install(args) => { + let ctx = ClientContext::new(cli, &args.client)?; + let body = AgentInstallRequest { + reinstall: if args.reinstall { Some(true) } else { None }, + }; + let path = format!("{API_PREFIX}/agents/{}/install", args.agent); + let response = ctx.post(&path, &body)?; + print_empty_response(response) + } + AgentsCommand::Modes(args) => { + let ctx = ClientContext::new(cli, &args.client)?; + let path = format!("{API_PREFIX}/agents/{}/modes", args.agent); + let response = ctx.get(&path)?; + print_json_response::(response) + } + } +} + +fn run_sessions(command: &SessionsCommand, cli: &CliConfig) -> Result<(), CliError> { + match command { + SessionsCommand::List(args) => { + let ctx = ClientContext::new(cli, args)?; + let response = ctx.get(&format!("{API_PREFIX}/sessions"))?; + print_json_response::(response) + } + SessionsCommand::Create(args) => { + let ctx = ClientContext::new(cli, &args.client)?; + let body = CreateSessionRequest { + agent: args.agent.clone(), + agent_mode: args.agent_mode.clone(), + permission_mode: args.permission_mode.clone(), + model: args.model.clone(), + variant: args.variant.clone(), + agent_version: args.agent_version.clone(), + }; + let path = format!("{API_PREFIX}/sessions/{}", args.session_id); + let response = ctx.post(&path, &body)?; + print_json_response::(response) + } + SessionsCommand::SendMessage(args) => { + let ctx = ClientContext::new(cli, &args.client)?; + let body = MessageRequest { + message: args.message.clone(), + }; + let path = format!("{API_PREFIX}/sessions/{}/messages", args.session_id); + let response = ctx.post(&path, &body)?; + print_empty_response(response) + } + SessionsCommand::SendMessageStream(args) => { + let ctx = ClientContext::new(cli, &args.client)?; + let body = MessageRequest { + message: args.message.clone(), + }; + let path = format!("{API_PREFIX}/sessions/{}/messages/stream", args.session_id); + let response = ctx.post_with_query( + &path, + &body, + &[( + "include_raw", + if args.include_raw { + Some("true".to_string()) + } else { + None + }, + )], + )?; + print_text_response(response) + } + SessionsCommand::Terminate(args) => { + let ctx = ClientContext::new(cli, &args.client)?; + let path = format!("{API_PREFIX}/sessions/{}/terminate", args.session_id); + let response = ctx.post_empty(&path)?; + print_empty_response(response) + } + SessionsCommand::GetMessages(args) | SessionsCommand::Events(args) => { + let ctx = ClientContext::new(cli, &args.client)?; + let path = format!("{API_PREFIX}/sessions/{}/events", args.session_id); + let response = ctx.get_with_query( + &path, + &[ + ("offset", args.offset.map(|v| v.to_string())), + ("limit", args.limit.map(|v| v.to_string())), + ( + "include_raw", + if args.include_raw { + Some("true".to_string()) + } else { + None + }, + ), + ], + )?; + print_json_response::(response) + } + SessionsCommand::EventsSse(args) => { + let ctx = ClientContext::new(cli, &args.client)?; + let path = format!("{API_PREFIX}/sessions/{}/events/sse", args.session_id); + let response = ctx.get_with_query( + &path, + &[ + ("offset", args.offset.map(|v| v.to_string())), + ( + "include_raw", + if args.include_raw { + Some("true".to_string()) + } else { + None + }, + ), + ], + )?; + print_text_response(response) + } + SessionsCommand::ReplyQuestion(args) => { + let ctx = ClientContext::new(cli, &args.client)?; + let answers: Vec> = serde_json::from_str(&args.answers)?; + let body = QuestionReplyRequest { answers }; + let path = format!( + "{API_PREFIX}/sessions/{}/questions/{}/reply", + args.session_id, args.question_id + ); + let response = ctx.post(&path, &body)?; + print_empty_response(response) + } + SessionsCommand::RejectQuestion(args) => { + let ctx = ClientContext::new(cli, &args.client)?; + let path = format!( + "{API_PREFIX}/sessions/{}/questions/{}/reject", + args.session_id, args.question_id + ); + let response = ctx.post_empty(&path)?; + print_empty_response(response) + } + SessionsCommand::ReplyPermission(args) => { + let ctx = ClientContext::new(cli, &args.client)?; + let body = PermissionReplyRequest { + reply: args.reply.clone(), + }; + let path = format!( + "{API_PREFIX}/sessions/{}/permissions/{}/reply", + args.session_id, args.permission_id + ); + let response = ctx.post(&path, &body)?; + print_empty_response(response) + } + } +} + +fn create_opencode_session( + base_url: &str, + token: Option<&str>, + title: Option<&str>, +) -> Result { + let client = HttpClient::builder().build()?; + let url = format!("{base_url}/opencode/session"); + let body = if let Some(title) = title { + json!({ "title": title }) + } else { + json!({}) + }; + let mut request = client.post(&url).json(&body); + if let Ok(directory) = std::env::current_dir() { + request = request.header( + "x-opencode-directory", + directory.to_string_lossy().to_string(), + ); + } + if let Some(token) = token { + request = request.bearer_auth(token); + } + let response = request.send()?; + let status = response.status(); + let text = response.text()?; + if !status.is_success() { + print_error_body(&text)?; + return Err(CliError::HttpStatus(status)); + } + let body: Value = serde_json::from_str(&text)?; + let session_id = body + .get("id") + .and_then(|value| value.as_str()) + .ok_or_else(|| CliError::Server("opencode session missing id".to_string()))?; + Ok(session_id.to_string()) +} + +fn resolve_opencode_bin(explicit: Option<&PathBuf>) -> Result { + if let Some(path) = explicit { + return Ok(path.clone()); + } + if let Ok(path) = std::env::var("OPENCODE_BIN") { + return Ok(PathBuf::from(path)); + } + if let Some(path) = find_in_path("opencode") { + write_stderr_line(&format!("using opencode binary from PATH: {}", path.display()))?; + return Ok(path); + } + + let manager = AgentManager::new(default_install_dir()) + .map_err(|err| CliError::Server(err.to_string()))?; + match manager.resolve_binary(AgentId::Opencode) { + Ok(path) => Ok(path), + Err(_) => { + write_stderr_line("opencode not found; installing...")?; + let result = manager + .install( + AgentId::Opencode, + InstallOptions { + reinstall: false, + version: None, + }, + ) + .map_err(|err| CliError::Server(err.to_string()))?; + Ok(result.path) + } + } +} + +fn find_in_path(binary_name: &str) -> Option { + let path_var = std::env::var_os("PATH")?; + for path in std::env::split_paths(&path_var) { + let candidate = path.join(binary_name); + if candidate.exists() { + return Some(candidate); + } + } + None +} + +fn run_credentials(command: &CredentialsCommand) -> Result<(), CliError> { + match command { + CredentialsCommand::Extract(args) => { + let mut options = CredentialExtractionOptions::new(); + if let Some(home_dir) = args.home_dir.clone() { + options.home_dir = Some(home_dir); + } + if args.no_oauth { + options.include_oauth = false; + } + + let credentials = extract_all_credentials(&options); + if let Some(agent) = args.agent.clone() { + let token = select_token_for_agent(&credentials, agent, args.provider.as_deref())?; + write_stdout_line(&token)?; + return Ok(()); + } + if let Some(provider) = args.provider.as_deref() { + let token = select_token_for_provider(&credentials, provider)?; + write_stdout_line(&token)?; + return Ok(()); + } + + let output = credentials_to_output(credentials, args.reveal); + let pretty = serde_json::to_string_pretty(&output)?; + write_stdout_line(&pretty)?; + Ok(()) + } + CredentialsCommand::ExtractEnv(args) => { + let mut options = CredentialExtractionOptions::new(); + if let Some(home_dir) = args.home_dir.clone() { + options.home_dir = Some(home_dir); + } + if args.no_oauth { + options.include_oauth = false; + } + + let credentials = extract_all_credentials(&options); + let prefix = if args.export { "export " } else { "" }; + + if let Some(cred) = &credentials.anthropic { + write_stdout_line(&format!("{}ANTHROPIC_API_KEY={}", prefix, cred.api_key))?; + write_stdout_line(&format!("{}CLAUDE_API_KEY={}", prefix, cred.api_key))?; + } + if let Some(cred) = &credentials.openai { + write_stdout_line(&format!("{}OPENAI_API_KEY={}", prefix, cred.api_key))?; + write_stdout_line(&format!("{}CODEX_API_KEY={}", prefix, cred.api_key))?; + } + for (provider, cred) in &credentials.other { + let var_name = format!("{}_API_KEY", provider.to_uppercase().replace('-', "_")); + write_stdout_line(&format!("{}{}={}", prefix, var_name, cred.api_key))?; + } + + Ok(()) + } + } +} + +#[derive(Serialize)] +struct CredentialsOutput { + anthropic: Option, + openai: Option, + other: HashMap, +} + +#[derive(Serialize)] +struct CredentialSummary { + provider: String, + source: String, + auth_type: String, + api_key: String, + redacted: bool, +} + +#[derive(clap::ValueEnum, Clone, Debug)] +enum CredentialAgent { + Claude, + Codex, + Opencode, + Amp, +} + +fn credentials_to_output(credentials: ExtractedCredentials, reveal: bool) -> CredentialsOutput { + CredentialsOutput { + anthropic: credentials + .anthropic + .map(|cred| summarize_credential(&cred, reveal)), + openai: credentials + .openai + .map(|cred| summarize_credential(&cred, reveal)), + other: credentials + .other + .into_iter() + .map(|(key, cred)| (key, summarize_credential(&cred, reveal))) + .collect(), + } +} + +fn summarize_credential(credential: &ProviderCredentials, reveal: bool) -> CredentialSummary { + let api_key = if reveal { + credential.api_key.clone() + } else { + redact_key(&credential.api_key) + }; + CredentialSummary { + provider: credential.provider.clone(), + source: credential.source.clone(), + auth_type: match credential.auth_type { + AuthType::ApiKey => "api_key".to_string(), + AuthType::Oauth => "oauth".to_string(), + }, + api_key, + redacted: !reveal, + } +} + +fn redact_key(key: &str) -> String { + let trimmed = key.trim(); + let len = trimmed.len(); + if len <= 8 { + return "****".to_string(); + } + let prefix = &trimmed[..4]; + let suffix = &trimmed[len - 4..]; + format!("{prefix}...{suffix}") +} + +fn install_agent_local(args: &InstallAgentArgs) -> Result<(), CliError> { + let agent_id = AgentId::parse(&args.agent) + .ok_or_else(|| CliError::Server(format!("unsupported agent: {}", args.agent)))?; + let manager = AgentManager::new(default_install_dir()) + .map_err(|err| CliError::Server(err.to_string()))?; + manager + .install( + agent_id, + InstallOptions { + reinstall: args.reinstall, + version: None, + }, + ) + .map_err(|err| CliError::Server(err.to_string()))?; + Ok(()) +} + +fn select_token_for_agent( + credentials: &ExtractedCredentials, + agent: CredentialAgent, + provider: Option<&str>, +) -> Result { + match agent { + CredentialAgent::Claude | CredentialAgent::Amp => { + if let Some(provider) = provider { + if provider != "anthropic" { + return Err(CliError::Server(format!( + "agent {:?} only supports provider anthropic", + agent + ))); + } + } + select_token_for_provider(credentials, "anthropic") + } + CredentialAgent::Codex => { + if let Some(provider) = provider { + if provider != "openai" { + return Err(CliError::Server(format!( + "agent {:?} only supports provider openai", + agent + ))); + } + } + select_token_for_provider(credentials, "openai") + } + CredentialAgent::Opencode => { + if let Some(provider) = provider { + return select_token_for_provider(credentials, provider); + } + if let Some(openai) = credentials.openai.as_ref() { + return Ok(openai.api_key.clone()); + } + if let Some(anthropic) = credentials.anthropic.as_ref() { + return Ok(anthropic.api_key.clone()); + } + if credentials.other.len() == 1 { + if let Some((_, cred)) = credentials.other.iter().next() { + return Ok(cred.api_key.clone()); + } + } + let available = available_providers(credentials); + if available.is_empty() { + Err(CliError::Server( + "no credentials found for opencode".to_string(), + )) + } else { + Err(CliError::Server(format!( + "multiple providers available for opencode: {} (use --provider)", + available.join(", ") + ))) + } + } + } +} + +fn select_token_for_provider( + credentials: &ExtractedCredentials, + provider: &str, +) -> Result { + if let Some(cred) = provider_credential(credentials, provider) { + Ok(cred.api_key.clone()) + } else { + Err(CliError::Server(format!( + "no credentials found for provider {provider}" + ))) + } +} + +fn provider_credential<'a>( + credentials: &'a ExtractedCredentials, + provider: &str, +) -> Option<&'a ProviderCredentials> { + match provider { + "openai" => credentials.openai.as_ref(), + "anthropic" => credentials.anthropic.as_ref(), + _ => credentials.other.get(provider), + } +} + +fn available_providers(credentials: &ExtractedCredentials) -> Vec { + let mut providers = Vec::new(); + if credentials.openai.is_some() { + providers.push("openai".to_string()); + } + if credentials.anthropic.is_some() { + providers.push("anthropic".to_string()); + } + for key in credentials.other.keys() { + providers.push(key.clone()); + } + providers.sort(); + providers.dedup(); + providers +} + +fn build_cors_layer(server: &ServerArgs) -> Result { + let mut cors = CorsLayer::new(); + + // Build origins list from provided origins + let mut origins = Vec::new(); + for origin in &server.cors_allow_origin { + let value = origin + .parse() + .map_err(|_| CliError::InvalidCorsOrigin(origin.clone()))?; + origins.push(value); + } + if origins.is_empty() { + // No origins allowed - use permissive CORS with no origins (effectively disabled) + cors = cors.allow_origin(tower_http::cors::AllowOrigin::predicate(|_, _| false)); + } else { + cors = cors.allow_origin(origins); + } + + // Methods: allow any if not specified, otherwise use provided list + if server.cors_allow_method.is_empty() { + cors = cors.allow_methods(Any); + } else { + let mut methods = Vec::new(); + for method in &server.cors_allow_method { + let parsed = method + .parse() + .map_err(|_| CliError::InvalidCorsMethod(method.clone()))?; + methods.push(parsed); + } + cors = cors.allow_methods(methods); + } + + // Headers: allow any if not specified, otherwise use provided list + if server.cors_allow_header.is_empty() { + cors = cors.allow_headers(Any); + } else { + let mut headers = Vec::new(); + for header in &server.cors_allow_header { + let parsed = header + .parse() + .map_err(|_| CliError::InvalidCorsHeader(header.clone()))?; + headers.push(parsed); + } + cors = cors.allow_headers(headers); + } + + if server.cors_allow_credentials { + cors = cors.allow_credentials(true); + } + + Ok(cors) +} + +struct ClientContext { + endpoint: String, + token: Option, + client: HttpClient, +} + +impl ClientContext { + fn new(cli: &CliConfig, args: &ClientArgs) -> Result { + let endpoint = args + .endpoint + .clone() + .unwrap_or_else(|| format!("http://{}:{}", DEFAULT_HOST, DEFAULT_PORT)); + let token = if cli.no_token { + None + } else { + cli.token.clone() + }; + let client = HttpClient::builder().build()?; + Ok(Self { + endpoint, + token, + client, + }) + } + + fn url(&self, path: &str) -> String { + format!("{}{}", self.endpoint.trim_end_matches('/'), path) + } + + fn request(&self, method: Method, path: &str) -> reqwest::blocking::RequestBuilder { + let url = self.url(path); + let mut builder = self.client.request(method, url); + if let Some(token) = &self.token { + builder = builder.bearer_auth(token); + } + builder + } + + fn get(&self, path: &str) -> Result { + Ok(self.request(Method::GET, path).send()?) + } + + fn get_with_query( + &self, + path: &str, + query: &[(&str, Option)], + ) -> Result { + let mut request = self.request(Method::GET, path); + for (key, value) in query { + if let Some(value) = value { + request = request.query(&[(key, value)]); + } + } + Ok(request.send()?) + } + + fn post( + &self, + path: &str, + body: &T, + ) -> Result { + Ok(self.request(Method::POST, path).json(body).send()?) + } + + fn post_with_query( + &self, + path: &str, + body: &T, + query: &[(&str, Option)], + ) -> Result { + let mut request = self.request(Method::POST, path).json(body); + for (key, value) in query { + if let Some(value) = value { + request = request.query(&[(key, value)]); + } + } + Ok(request.send()?) + } + + fn post_empty(&self, path: &str) -> Result { + Ok(self.request(Method::POST, path).send()?) + } +} + +fn print_json_response( + response: reqwest::blocking::Response, +) -> Result<(), CliError> { + let status = response.status(); + let text = response.text()?; + + if !status.is_success() { + print_error_body(&text)?; + return Err(CliError::HttpStatus(status)); + } + + let parsed: T = serde_json::from_str(&text)?; + let pretty = serde_json::to_string_pretty(&parsed)?; + write_stdout_line(&pretty)?; + Ok(()) +} + +fn print_text_response(response: reqwest::blocking::Response) -> Result<(), CliError> { + let status = response.status(); + let text = response.text()?; + + if !status.is_success() { + print_error_body(&text)?; + return Err(CliError::HttpStatus(status)); + } + + write_stdout(&text)?; + Ok(()) +} + +fn print_empty_response(response: reqwest::blocking::Response) -> Result<(), CliError> { + let status = response.status(); + if status.is_success() { + return Ok(()); + } + let text = response.text()?; + print_error_body(&text)?; + Err(CliError::HttpStatus(status)) +} + +fn print_error_body(text: &str) -> Result<(), CliError> { + if let Ok(json) = serde_json::from_str::(text) { + let pretty = serde_json::to_string_pretty(&json)?; + write_stderr_line(&pretty)?; + } else { + write_stderr_line(text)?; + } + Ok(()) +} + +fn write_stdout(text: &str) -> Result<(), CliError> { + let mut out = std::io::stdout(); + out.write_all(text.as_bytes())?; + out.flush()?; + Ok(()) +} + +fn write_stdout_line(text: &str) -> Result<(), CliError> { + let mut out = std::io::stdout(); + out.write_all(text.as_bytes())?; + out.write_all(b"\n")?; + out.flush()?; + Ok(()) +} + +fn write_stderr_line(text: &str) -> Result<(), CliError> { + let mut out = std::io::stderr(); + out.write_all(text.as_bytes())?; + out.write_all(b"\n")?; + out.flush()?; + Ok(()) +} diff --git a/server/packages/sandbox-agent/src/daemon.rs b/server/packages/sandbox-agent/src/daemon.rs new file mode 100644 index 0000000..5e71552 --- /dev/null +++ b/server/packages/sandbox-agent/src/daemon.rs @@ -0,0 +1,487 @@ +use std::fs; +use std::path::{Path, PathBuf}; +use std::process::{Child, Command as ProcessCommand, Stdio}; +use std::time::{Duration, Instant}; + +use reqwest::blocking::Client as HttpClient; + +use crate::cli::{CliConfig, CliError}; + +mod build_id { + include!(concat!(env!("OUT_DIR"), "/build_id.rs")); +} + +pub use build_id::BUILD_ID; + +const DAEMON_HEALTH_TIMEOUT: Duration = Duration::from_secs(30); + +// --------------------------------------------------------------------------- +// Paths +// --------------------------------------------------------------------------- + +pub fn daemon_state_dir() -> PathBuf { + dirs::data_dir() + .map(|dir| dir.join("sandbox-agent").join("daemon")) + .unwrap_or_else(|| PathBuf::from(".").join(".sandbox-agent").join("daemon")) +} + +pub fn sanitize_host(host: &str) -> String { + host.chars() + .map(|ch| if ch.is_ascii_alphanumeric() { ch } else { '-' }) + .collect() +} + +pub fn daemon_pid_path(host: &str, port: u16) -> PathBuf { + let name = format!("daemon-{}-{}.pid", sanitize_host(host), port); + daemon_state_dir().join(name) +} + +pub fn daemon_log_path(host: &str, port: u16) -> PathBuf { + let name = format!("daemon-{}-{}.log", sanitize_host(host), port); + daemon_state_dir().join(name) +} + +pub fn daemon_version_path(host: &str, port: u16) -> PathBuf { + let name = format!("daemon-{}-{}.version", sanitize_host(host), port); + daemon_state_dir().join(name) +} + +// --------------------------------------------------------------------------- +// PID helpers +// --------------------------------------------------------------------------- + +pub fn read_pid(path: &Path) -> Option { + let text = fs::read_to_string(path).ok()?; + text.trim().parse::().ok() +} + +pub fn write_pid(path: &Path, pid: u32) -> Result<(), CliError> { + if let Some(parent) = path.parent() { + fs::create_dir_all(parent)?; + } + fs::write(path, pid.to_string())?; + Ok(()) +} + +pub fn remove_pid(path: &Path) -> Result<(), CliError> { + if path.exists() { + fs::remove_file(path)?; + } + Ok(()) +} + +// --------------------------------------------------------------------------- +// Version helpers +// --------------------------------------------------------------------------- + +pub fn read_daemon_version(host: &str, port: u16) -> Option { + let path = daemon_version_path(host, port); + let text = fs::read_to_string(path).ok()?; + Some(text.trim().to_string()) +} + +pub fn write_daemon_version(host: &str, port: u16) -> Result<(), CliError> { + let path = daemon_version_path(host, port); + if let Some(parent) = path.parent() { + fs::create_dir_all(parent)?; + } + fs::write(&path, BUILD_ID)?; + Ok(()) +} + +pub fn remove_version_file(host: &str, port: u16) -> Result<(), CliError> { + let path = daemon_version_path(host, port); + if path.exists() { + fs::remove_file(path)?; + } + Ok(()) +} + +pub fn is_version_current(host: &str, port: u16) -> bool { + match read_daemon_version(host, port) { + Some(v) => v == BUILD_ID, + None => false, + } +} + +// --------------------------------------------------------------------------- +// Process helpers +// --------------------------------------------------------------------------- + +#[cfg(unix)] +pub fn is_process_running(pid: u32) -> bool { + let result = unsafe { libc::kill(pid as i32, 0) }; + if result == 0 { + return true; + } + match std::io::Error::last_os_error().raw_os_error() { + Some(code) if code == libc::EPERM => true, + _ => false, + } +} + +#[cfg(windows)] +pub fn is_process_running(pid: u32) -> bool { + use windows::Win32::Foundation::{CloseHandle, HANDLE}; + use windows::Win32::System::Threading::{ + GetExitCodeProcess, OpenProcess, PROCESS_QUERY_LIMITED_INFORMATION, + }; + + unsafe { + let handle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, pid); + if handle.is_invalid() { + return false; + } + let mut exit_code = 0u32; + let ok = GetExitCodeProcess(handle, &mut exit_code).as_bool(); + let _ = CloseHandle(handle); + ok && exit_code == 259 + } +} + +// --------------------------------------------------------------------------- +// Health checks +// --------------------------------------------------------------------------- + +pub fn check_health(base_url: &str, token: Option<&str>) -> Result { + let client = HttpClient::builder().build()?; + let url = format!("{base_url}/v1/health"); + let mut request = client.get(url); + if let Some(token) = token { + request = request.bearer_auth(token); + } + match request.send() { + Ok(response) if response.status().is_success() => Ok(true), + Ok(_) => Ok(false), + Err(_) => Ok(false), + } +} + +pub fn wait_for_health( + mut server_child: Option<&mut Child>, + base_url: &str, + token: Option<&str>, + timeout: Duration, +) -> Result<(), CliError> { + let client = HttpClient::builder().build()?; + let deadline = Instant::now() + timeout; + + while Instant::now() < deadline { + if let Some(child) = server_child.as_mut() { + if let Some(status) = child.try_wait()? { + return Err(CliError::Server(format!( + "sandbox-agent exited before becoming healthy ({status})" + ))); + } + } + + let url = format!("{base_url}/v1/health"); + let mut request = client.get(&url); + if let Some(token) = token { + request = request.bearer_auth(token); + } + match request.send() { + Ok(response) if response.status().is_success() => return Ok(()), + _ => { + std::thread::sleep(Duration::from_millis(200)); + } + } + } + + Err(CliError::Server( + "timed out waiting for sandbox-agent health".to_string(), + )) +} + +// --------------------------------------------------------------------------- +// Spawn +// --------------------------------------------------------------------------- + +pub fn spawn_sandbox_agent_daemon( + cli: &CliConfig, + host: &str, + port: u16, + token: Option<&str>, + log_path: &Path, +) -> Result { + if let Some(parent) = log_path.parent() { + fs::create_dir_all(parent)?; + } + let log_file = fs::File::create(log_path)?; + let log_file_err = log_file.try_clone()?; + + let exe = std::env::current_exe()?; + let mut cmd = ProcessCommand::new(exe); + cmd.arg("server") + .arg("--host") + .arg(host) + .arg("--port") + .arg(port.to_string()) + .env("SANDBOX_AGENT_LOG_STDOUT", "1") + .stdin(Stdio::null()) + .stdout(Stdio::from(log_file)) + .stderr(Stdio::from(log_file_err)); + + if cli.no_token { + cmd.arg("--no-token"); + } else if let Some(token) = token { + cmd.arg("--token").arg(token); + } else { + return Err(CliError::MissingToken); + } + + cmd.spawn().map_err(CliError::from) +} + +// --------------------------------------------------------------------------- +// DaemonStatus +// --------------------------------------------------------------------------- + +#[derive(Debug)] +pub enum DaemonStatus { + Running { + pid: u32, + version: Option, + version_current: bool, + log_path: PathBuf, + }, + NotRunning, +} + +impl std::fmt::Display for DaemonStatus { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + DaemonStatus::Running { + pid, + version, + version_current, + log_path, + } => { + let version_str = version.as_deref().unwrap_or("unknown"); + let outdated = if *version_current { + "" + } else { + " [outdated, restart recommended]" + }; + write!( + f, + "Daemon running (PID {pid}, build {version_str}, logs: {}){}", + log_path.display(), + outdated + ) + } + DaemonStatus::NotRunning => write!(f, "Daemon not running"), + } + } +} + +// --------------------------------------------------------------------------- +// High-level commands +// --------------------------------------------------------------------------- + +pub fn status(host: &str, port: u16, token: Option<&str>) -> Result { + let pid_path = daemon_pid_path(host, port); + let log_path = daemon_log_path(host, port); + + if let Some(pid) = read_pid(&pid_path) { + if is_process_running(pid) { + let version = read_daemon_version(host, port); + let version_current = is_version_current(host, port); + return Ok(DaemonStatus::Running { + pid, + version, + version_current, + log_path, + }); + } + // Stale PID file + let _ = remove_pid(&pid_path); + let _ = remove_version_file(host, port); + } + + // Also try a health check in case the daemon is running but we lost the PID file + let base_url = format!("http://{host}:{port}"); + if check_health(&base_url, token)? { + return Ok(DaemonStatus::Running { + pid: 0, + version: read_daemon_version(host, port), + version_current: is_version_current(host, port), + log_path, + }); + } + + Ok(DaemonStatus::NotRunning) +} + +pub fn start( + cli: &CliConfig, + host: &str, + port: u16, + token: Option<&str>, +) -> Result<(), CliError> { + let base_url = format!("http://{host}:{port}"); + let pid_path = daemon_pid_path(host, port); + let log_path = daemon_log_path(host, port); + + // Already healthy? + if check_health(&base_url, token)? { + eprintln!("daemon already running at {base_url}"); + return Ok(()); + } + + // Stale PID? + if let Some(pid) = read_pid(&pid_path) { + if is_process_running(pid) { + eprintln!("daemon process {pid} exists; waiting for health"); + return wait_for_health(None, &base_url, token, DAEMON_HEALTH_TIMEOUT); + } + let _ = remove_pid(&pid_path); + } + + eprintln!( + "starting daemon at {base_url} (logs: {})", + log_path.display() + ); + + let mut child = spawn_sandbox_agent_daemon(cli, host, port, token, &log_path)?; + let pid = child.id(); + write_pid(&pid_path, pid)?; + write_daemon_version(host, port)?; + + let result = wait_for_health(Some(&mut child), &base_url, token, DAEMON_HEALTH_TIMEOUT); + if result.is_err() { + let _ = remove_pid(&pid_path); + let _ = remove_version_file(host, port); + return result; + } + + eprintln!("daemon started (PID {pid}, logs: {})", log_path.display()); + Ok(()) +} + +#[cfg(unix)] +pub fn stop(host: &str, port: u16) -> Result<(), CliError> { + let pid_path = daemon_pid_path(host, port); + + let pid = match read_pid(&pid_path) { + Some(pid) => pid, + None => { + eprintln!("daemon is not running (no PID file)"); + return Ok(()); + } + }; + + if !is_process_running(pid) { + eprintln!("daemon is not running (stale PID file)"); + let _ = remove_pid(&pid_path); + let _ = remove_version_file(host, port); + return Ok(()); + } + + eprintln!("stopping daemon (PID {pid})..."); + + // SIGTERM + unsafe { + libc::kill(pid as i32, libc::SIGTERM); + } + + // Wait up to 5 seconds for graceful exit + for _ in 0..50 { + std::thread::sleep(Duration::from_millis(100)); + if !is_process_running(pid) { + let _ = remove_pid(&pid_path); + let _ = remove_version_file(host, port); + eprintln!("daemon stopped"); + return Ok(()); + } + } + + // SIGKILL + eprintln!("daemon did not stop gracefully, sending SIGKILL..."); + unsafe { + libc::kill(pid as i32, libc::SIGKILL); + } + std::thread::sleep(Duration::from_millis(100)); + let _ = remove_pid(&pid_path); + let _ = remove_version_file(host, port); + eprintln!("daemon killed"); + Ok(()) +} + +#[cfg(windows)] +pub fn stop(host: &str, port: u16) -> Result<(), CliError> { + let pid_path = daemon_pid_path(host, port); + + let pid = match read_pid(&pid_path) { + Some(pid) => pid, + None => { + eprintln!("daemon is not running (no PID file)"); + return Ok(()); + } + }; + + if !is_process_running(pid) { + eprintln!("daemon is not running (stale PID file)"); + let _ = remove_pid(&pid_path); + let _ = remove_version_file(host, port); + return Ok(()); + } + + eprintln!("stopping daemon (PID {pid})..."); + + // Use taskkill on Windows + let _ = ProcessCommand::new("taskkill") + .args(["/PID", &pid.to_string(), "/F"]) + .status(); + + std::thread::sleep(Duration::from_millis(500)); + let _ = remove_pid(&pid_path); + let _ = remove_version_file(host, port); + eprintln!("daemon stopped"); + Ok(()) +} + +pub fn ensure_running( + cli: &CliConfig, + host: &str, + port: u16, + token: Option<&str>, +) -> Result<(), CliError> { + let base_url = format!("http://{host}:{port}"); + let pid_path = daemon_pid_path(host, port); + + // Check if daemon is already healthy + if check_health(&base_url, token)? { + // Check build version + if !is_version_current(host, port) { + let old = read_daemon_version(host, port).unwrap_or_else(|| "unknown".to_string()); + eprintln!( + "daemon outdated (build {old} -> {BUILD_ID}), restarting..." + ); + stop(host, port)?; + return start(cli, host, port, token); + } + let log_path = daemon_log_path(host, port); + if let Some(pid) = read_pid(&pid_path) { + eprintln!( + "daemon already running at {base_url} (PID {pid}, logs: {})", + log_path.display() + ); + } else { + eprintln!("daemon already running at {base_url}"); + } + return Ok(()); + } + + // Not healthy — check for stale PID + if let Some(pid) = read_pid(&pid_path) { + if is_process_running(pid) { + eprintln!("daemon process {pid} running; waiting for health"); + return wait_for_health(None, &base_url, token, DAEMON_HEALTH_TIMEOUT); + } + let _ = remove_pid(&pid_path); + let _ = remove_version_file(host, port); + } + + start(cli, host, port, token) +} diff --git a/server/packages/sandbox-agent/src/lib.rs b/server/packages/sandbox-agent/src/lib.rs index 8c11343..1f9d62c 100644 --- a/server/packages/sandbox-agent/src/lib.rs +++ b/server/packages/sandbox-agent/src/lib.rs @@ -2,8 +2,10 @@ mod agent_server_logs; pub mod credentials; +pub mod daemon; pub mod opencode_compat; pub mod router; pub mod server_logs; pub mod telemetry; pub mod ui; +pub mod cli; diff --git a/server/packages/sandbox-agent/src/main.rs b/server/packages/sandbox-agent/src/main.rs index 0a2b72e..4169fca 100644 --- a/server/packages/sandbox-agent/src/main.rs +++ b/server/packages/sandbox-agent/src/main.rs @@ -1,1283 +1,6 @@ -use std::collections::HashMap; -use std::io::Write; -use std::path::PathBuf; -use std::process::{Child, Command as ProcessCommand, Stdio}; -use std::sync::Arc; -use std::time::{Duration, Instant}; - -use clap::{Args, Parser, Subcommand}; - -// Include the generated version constant -mod build_version { - include!(concat!(env!("OUT_DIR"), "/version.rs")); -} -use reqwest::blocking::Client as HttpClient; -use reqwest::Method; -use sandbox_agent::router::{build_router_with_state, shutdown_servers}; -use sandbox_agent::router::{ - AgentInstallRequest, AppState, AuthConfig, CreateSessionRequest, MessageRequest, - PermissionReply, PermissionReplyRequest, QuestionReplyRequest, -}; -use sandbox_agent::router::{ - AgentListResponse, AgentModesResponse, CreateSessionResponse, EventsResponse, - SessionListResponse, -}; -use sandbox_agent::server_logs::ServerLogs; -use sandbox_agent::telemetry; -use sandbox_agent::ui; -use sandbox_agent_agent_management::agents::{AgentId, AgentManager, InstallOptions}; -use sandbox_agent_agent_management::credentials::{ - extract_all_credentials, AuthType, CredentialExtractionOptions, ExtractedCredentials, - ProviderCredentials, -}; -use serde::Serialize; -use serde_json::{json, Value}; -use thiserror::Error; -use tower_http::cors::{Any, CorsLayer}; -use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter}; - -const API_PREFIX: &str = "/v1"; -const DEFAULT_HOST: &str = "127.0.0.1"; -const DEFAULT_PORT: u16 = 2468; -const LOGS_RETENTION: Duration = Duration::from_secs(7 * 24 * 60 * 60); - -#[derive(Parser, Debug)] -#[command(name = "sandbox-agent", bin_name = "sandbox-agent")] -#[command(about = "https://sandboxagent.dev", version = build_version::VERSION)] -#[command(arg_required_else_help = true)] -struct Cli { - #[command(subcommand)] - command: Command, - - #[arg(long, short = 't', global = true)] - token: Option, - - #[arg(long, short = 'n', global = true)] - no_token: bool, -} - -#[derive(Subcommand, Debug)] -enum Command { - /// Run the sandbox agent HTTP server. - Server(ServerArgs), - /// Call the HTTP API without writing client code. - Api(ApiArgs), - /// EXPERIMENTAL: Start a sandbox-agent server and attach an OpenCode session. - Opencode(OpencodeArgs), - /// Install or reinstall an agent without running the server. - InstallAgent(InstallAgentArgs), - /// Inspect locally discovered credentials. - Credentials(CredentialsArgs), -} - -#[derive(Args, Debug)] -struct ServerArgs { - #[arg(long, short = 'H', default_value = DEFAULT_HOST)] - host: String, - - #[arg(long, short = 'p', default_value_t = DEFAULT_PORT)] - port: u16, - - #[arg(long = "cors-allow-origin", short = 'O')] - cors_allow_origin: Vec, - - #[arg(long = "cors-allow-method", short = 'M')] - cors_allow_method: Vec, - - #[arg(long = "cors-allow-header", short = 'A')] - cors_allow_header: Vec, - - #[arg(long = "cors-allow-credentials", short = 'C')] - cors_allow_credentials: bool, - - #[arg(long = "no-telemetry")] - no_telemetry: bool, - - #[arg(long = "log-to-file")] - log_to_file: bool, -} - -#[derive(Args, Debug)] -struct ApiArgs { - #[command(subcommand)] - command: ApiCommand, -} - -#[derive(Args, Debug)] -struct OpencodeArgs { - #[arg(long, short = 'H', default_value = DEFAULT_HOST)] - host: String, - - #[arg(long, short = 'p', default_value_t = DEFAULT_PORT)] - port: u16, - - #[arg(long)] - session_title: Option, - - #[arg(long)] - opencode_bin: Option, -} - -#[derive(Args, Debug)] -struct CredentialsArgs { - #[command(subcommand)] - command: CredentialsCommand, -} - -#[derive(Subcommand, Debug)] -enum ApiCommand { - /// Manage installed agents and their modes. - Agents(AgentsArgs), - /// Create sessions and interact with session events. - Sessions(SessionsArgs), -} - -#[derive(Subcommand, Debug)] -enum CredentialsCommand { - /// Extract credentials using local discovery rules. - Extract(CredentialsExtractArgs), - /// Output credentials as environment variable assignments. - #[command(name = "extract-env")] - ExtractEnv(CredentialsExtractEnvArgs), -} - -#[derive(Args, Debug)] -struct AgentsArgs { - #[command(subcommand)] - command: AgentsCommand, -} - -#[derive(Args, Debug)] -struct SessionsArgs { - #[command(subcommand)] - command: SessionsCommand, -} - -#[derive(Subcommand, Debug)] -enum AgentsCommand { - /// List all agents and install status. - List(ClientArgs), - /// Install or reinstall an agent. - Install(ApiInstallAgentArgs), - /// Show available modes for an agent. - Modes(AgentModesArgs), -} - -#[derive(Subcommand, Debug)] -enum SessionsCommand { - /// List active sessions. - List(ClientArgs), - /// Create a new session for an agent. - Create(CreateSessionArgs), - #[command(name = "send-message")] - /// Send a message to an existing session. - SendMessage(SessionMessageArgs), - #[command(name = "send-message-stream")] - /// Send a message and stream the response for one turn. - SendMessageStream(SessionMessageStreamArgs), - #[command(name = "terminate")] - /// Terminate a session. - Terminate(SessionTerminateArgs), - #[command(name = "get-messages")] - /// Alias for events; returns session events. - GetMessages(SessionEventsArgs), - #[command(name = "events")] - /// Fetch session events with offset/limit. - Events(SessionEventsArgs), - #[command(name = "events-sse")] - /// Stream session events over SSE. - EventsSse(SessionEventsSseArgs), - #[command(name = "reply-question")] - /// Reply to a question event. - ReplyQuestion(QuestionReplyArgs), - #[command(name = "reject-question")] - /// Reject a question event. - RejectQuestion(QuestionRejectArgs), - #[command(name = "reply-permission")] - /// Reply to a permission request. - ReplyPermission(PermissionReplyArgs), -} - -#[derive(Args, Debug, Clone)] -struct ClientArgs { - #[arg(long, short = 'e')] - endpoint: Option, -} - -#[derive(Args, Debug)] -struct ApiInstallAgentArgs { - agent: String, - #[arg(long, short = 'r')] - reinstall: bool, - #[command(flatten)] - client: ClientArgs, -} - -#[derive(Args, Debug)] -struct InstallAgentArgs { - agent: String, - #[arg(long, short = 'r')] - reinstall: bool, -} - -#[derive(Args, Debug)] -struct AgentModesArgs { - agent: String, - #[command(flatten)] - client: ClientArgs, -} - -#[derive(Args, Debug)] -struct CreateSessionArgs { - session_id: String, - #[arg(long, short = 'a')] - agent: String, - #[arg(long, short = 'g')] - agent_mode: Option, - #[arg(long, short = 'p')] - permission_mode: Option, - #[arg(long, short = 'm')] - model: Option, - #[arg(long, short = 'v')] - variant: Option, - #[arg(long, short = 'A')] - agent_version: Option, - #[command(flatten)] - client: ClientArgs, -} - -#[derive(Args, Debug)] -struct SessionMessageArgs { - session_id: String, - #[arg(long, short = 'm')] - message: String, - #[command(flatten)] - client: ClientArgs, -} - -#[derive(Args, Debug)] -struct SessionMessageStreamArgs { - session_id: String, - #[arg(long, short = 'm')] - message: String, - #[arg(long)] - include_raw: bool, - #[command(flatten)] - client: ClientArgs, -} - -#[derive(Args, Debug)] -struct SessionEventsArgs { - session_id: String, - #[arg(long, short = 'o')] - offset: Option, - #[arg(long, short = 'l')] - limit: Option, - #[arg(long)] - include_raw: bool, - #[command(flatten)] - client: ClientArgs, -} - -#[derive(Args, Debug)] -struct SessionEventsSseArgs { - session_id: String, - #[arg(long, short = 'o')] - offset: Option, - #[arg(long)] - include_raw: bool, - #[command(flatten)] - client: ClientArgs, -} - -#[derive(Args, Debug)] -struct SessionTerminateArgs { - session_id: String, - #[command(flatten)] - client: ClientArgs, -} - -#[derive(Args, Debug)] -struct QuestionReplyArgs { - session_id: String, - question_id: String, - #[arg(long, short = 'a')] - answers: String, - #[command(flatten)] - client: ClientArgs, -} - -#[derive(Args, Debug)] -struct QuestionRejectArgs { - session_id: String, - question_id: String, - #[command(flatten)] - client: ClientArgs, -} - -#[derive(Args, Debug)] -struct PermissionReplyArgs { - session_id: String, - permission_id: String, - #[arg(long, short = 'r')] - reply: PermissionReply, - #[command(flatten)] - client: ClientArgs, -} - -#[derive(Args, Debug)] -struct CredentialsExtractArgs { - #[arg(long, short = 'a', value_enum)] - agent: Option, - #[arg(long, short = 'p')] - provider: Option, - #[arg(long, short = 'd')] - home_dir: Option, - #[arg(long)] - no_oauth: bool, - #[arg(long, short = 'r')] - reveal: bool, -} - -#[derive(Args, Debug)] -struct CredentialsExtractEnvArgs { - /// Prefix each line with "export " for shell sourcing. - #[arg(long, short = 'e')] - export: bool, - #[arg(long, short = 'd')] - home_dir: Option, - #[arg(long)] - no_oauth: bool, -} - -#[derive(Debug, Error)] -enum CliError { - #[error("missing --token or --no-token for server mode")] - MissingToken, - #[error("invalid cors origin: {0}")] - InvalidCorsOrigin(String), - #[error("invalid cors method: {0}")] - InvalidCorsMethod(String), - #[error("invalid cors header: {0}")] - InvalidCorsHeader(String), - #[error("http error: {0}")] - Http(#[from] reqwest::Error), - #[error("io error: {0}")] - Io(#[from] std::io::Error), - #[error("json error: {0}")] - Json(#[from] serde_json::Error), - #[error("server error: {0}")] - Server(String), - #[error("unexpected http status: {0}")] - HttpStatus(reqwest::StatusCode), -} - fn main() { - let cli = Cli::parse(); - if let Err(err) = init_logging(&cli) { - eprintln!("failed to init logging: {err}"); - std::process::exit(1); - } - - let result = match &cli.command { - Command::Server(args) => run_server(&cli, args), - command => run_client(command, &cli), - }; - - if let Err(err) = result { + if let Err(err) = sandbox_agent::cli::run_sandbox_agent() { tracing::error!(error = %err, "sandbox-agent failed"); std::process::exit(1); } } - -fn init_logging(cli: &Cli) -> Result<(), CliError> { - if let Command::Server(server) = &cli.command { - maybe_redirect_server_logs(server); - } - - let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")); - tracing_subscriber::registry() - .with(filter) - .with( - tracing_logfmt::builder() - .layer() - .with_writer(std::io::stderr), - ) - .init(); - Ok(()) -} - -fn run_server(cli: &Cli, server: &ServerArgs) -> Result<(), CliError> { - let auth = if cli.no_token { - AuthConfig::disabled() - } else if let Some(token) = cli.token.clone() { - AuthConfig::with_token(token) - } else { - return Err(CliError::MissingToken); - }; - - let agent_manager = AgentManager::new(default_install_dir()) - .map_err(|err| CliError::Server(err.to_string()))?; - let state = Arc::new(AppState::new(auth, agent_manager)); - let (mut router, state) = build_router_with_state(state); - - let cors = build_cors_layer(server)?; - router = router.layer(cors); - - let addr = format!("{}:{}", server.host, server.port); - let display_host = match server.host.as_str() { - "0.0.0.0" | "::" => "localhost", - other => other, - }; - let inspector_url = format!("http://{}:{}/ui", display_host, server.port); - let runtime = tokio::runtime::Builder::new_multi_thread() - .enable_all() - .build() - .map_err(|err| CliError::Server(err.to_string()))?; - - let telemetry_enabled = telemetry::telemetry_enabled(server.no_telemetry); - - runtime.block_on(async move { - if telemetry_enabled { - telemetry::log_enabled_message(); - telemetry::spawn_telemetry_task(); - } - let listener = tokio::net::TcpListener::bind(&addr).await?; - tracing::info!(addr = %addr, "server listening"); - if ui::is_enabled() { - tracing::info!(url = %inspector_url, "inspector ui available"); - } else { - tracing::info!("inspector ui not embedded; set SANDBOX_AGENT_SKIP_INSPECTOR=1 to skip embedding during builds"); - } - let shutdown_state = state.clone(); - axum::serve(listener, router) - .with_graceful_shutdown(async move { - let _ = tokio::signal::ctrl_c().await; - shutdown_servers(&shutdown_state).await; - }) - .await - .map_err(|err| CliError::Server(err.to_string())) - }) -} - -fn default_install_dir() -> PathBuf { - dirs::data_dir() - .map(|dir| dir.join("sandbox-agent").join("bin")) - .unwrap_or_else(|| PathBuf::from(".").join(".sandbox-agent").join("bin")) -} - -fn default_server_log_dir() -> PathBuf { - if let Ok(dir) = std::env::var("SANDBOX_AGENT_LOG_DIR") { - return PathBuf::from(dir); - } - dirs::data_dir() - .map(|dir| dir.join("sandbox-agent").join("logs")) - .unwrap_or_else(|| PathBuf::from(".").join(".sandbox-agent").join("logs")) -} - -fn maybe_redirect_server_logs(server: &ServerArgs) { - let force_stdout = match std::env::var("SANDBOX_AGENT_LOG_STDOUT") { - Ok(value) if value == "0" || value.eq_ignore_ascii_case("false") => false, - Ok(_) => true, - Err(_) => false, - }; - let log_to_file_env = match std::env::var("SANDBOX_AGENT_LOG_TO_FILE") { - Ok(value) if value == "0" || value.eq_ignore_ascii_case("false") => false, - Ok(_) => true, - Err(_) => false, - }; - let log_to_file = server.log_to_file || log_to_file_env; - - if force_stdout || !log_to_file { - return; - } - - let log_dir = default_server_log_dir(); - if let Err(err) = ServerLogs::new(log_dir, LOGS_RETENTION).start_sync() { - eprintln!("failed to redirect logs: {err}"); - } -} - -fn run_client(command: &Command, cli: &Cli) -> Result<(), CliError> { - match command { - Command::Server(_) => Err(CliError::Server( - "server subcommand must be invoked as `sandbox-agent server`".to_string(), - )), - Command::Api(subcommand) => run_api(&subcommand.command, cli), - Command::Opencode(args) => run_opencode(cli, args), - Command::InstallAgent(args) => install_agent_local(args), - Command::Credentials(subcommand) => run_credentials(&subcommand.command), - } -} - -fn run_api(command: &ApiCommand, cli: &Cli) -> Result<(), CliError> { - match command { - ApiCommand::Agents(subcommand) => run_agents(&subcommand.command, cli), - ApiCommand::Sessions(subcommand) => run_sessions(&subcommand.command, cli), - } -} - -fn run_opencode(cli: &Cli, args: &OpencodeArgs) -> Result<(), CliError> { - write_stderr_line("experimental: opencode subcommand may change without notice")?; - - let token = if cli.no_token { - None - } else { - Some(cli.token.clone().ok_or(CliError::MissingToken)?) - }; - - let mut server_child = spawn_sandbox_agent_server(cli, args, token.as_deref())?; - let base_url = format!("http://{}:{}", args.host, args.port); - wait_for_health(&mut server_child, &base_url, token.as_deref())?; - - let session_id = - create_opencode_session(&base_url, token.as_deref(), args.session_title.as_deref())?; - write_stdout_line(&format!("OpenCode session: {session_id}"))?; - - let attach_url = format!("{base_url}/opencode"); - let opencode_bin = resolve_opencode_bin(args.opencode_bin.as_ref()); - let mut opencode_cmd = ProcessCommand::new(opencode_bin); - opencode_cmd - .arg("attach") - .arg(&attach_url) - .arg("--session") - .arg(&session_id) - .stdin(Stdio::inherit()) - .stdout(Stdio::inherit()) - .stderr(Stdio::inherit()); - if let Some(token) = token.as_deref() { - opencode_cmd.arg("--password").arg(token); - } - - let status = opencode_cmd.status().map_err(|err| { - terminate_child(&mut server_child); - CliError::Server(format!("failed to start opencode: {err}")) - })?; - - terminate_child(&mut server_child); - - if !status.success() { - return Err(CliError::Server(format!( - "opencode exited with status {status}" - ))); - } - - Ok(()) -} - -fn run_agents(command: &AgentsCommand, cli: &Cli) -> Result<(), CliError> { - match command { - AgentsCommand::List(args) => { - let ctx = ClientContext::new(cli, args)?; - let response = ctx.get(&format!("{API_PREFIX}/agents"))?; - print_json_response::(response) - } - AgentsCommand::Install(args) => { - let ctx = ClientContext::new(cli, &args.client)?; - let body = AgentInstallRequest { - reinstall: if args.reinstall { Some(true) } else { None }, - }; - let path = format!("{API_PREFIX}/agents/{}/install", args.agent); - let response = ctx.post(&path, &body)?; - print_empty_response(response) - } - AgentsCommand::Modes(args) => { - let ctx = ClientContext::new(cli, &args.client)?; - let path = format!("{API_PREFIX}/agents/{}/modes", args.agent); - let response = ctx.get(&path)?; - print_json_response::(response) - } - } -} - -fn run_sessions(command: &SessionsCommand, cli: &Cli) -> Result<(), CliError> { - match command { - SessionsCommand::List(args) => { - let ctx = ClientContext::new(cli, args)?; - let response = ctx.get(&format!("{API_PREFIX}/sessions"))?; - print_json_response::(response) - } - SessionsCommand::Create(args) => { - let ctx = ClientContext::new(cli, &args.client)?; - let body = CreateSessionRequest { - agent: args.agent.clone(), - agent_mode: args.agent_mode.clone(), - permission_mode: args.permission_mode.clone(), - model: args.model.clone(), - variant: args.variant.clone(), - agent_version: args.agent_version.clone(), - }; - let path = format!("{API_PREFIX}/sessions/{}", args.session_id); - let response = ctx.post(&path, &body)?; - print_json_response::(response) - } - SessionsCommand::SendMessage(args) => { - let ctx = ClientContext::new(cli, &args.client)?; - let body = MessageRequest { - message: args.message.clone(), - }; - let path = format!("{API_PREFIX}/sessions/{}/messages", args.session_id); - let response = ctx.post(&path, &body)?; - print_empty_response(response) - } - SessionsCommand::SendMessageStream(args) => { - let ctx = ClientContext::new(cli, &args.client)?; - let body = MessageRequest { - message: args.message.clone(), - }; - let path = format!("{API_PREFIX}/sessions/{}/messages/stream", args.session_id); - let response = ctx.post_with_query( - &path, - &body, - &[( - "include_raw", - if args.include_raw { - Some("true".to_string()) - } else { - None - }, - )], - )?; - print_text_response(response) - } - SessionsCommand::Terminate(args) => { - let ctx = ClientContext::new(cli, &args.client)?; - let path = format!("{API_PREFIX}/sessions/{}/terminate", args.session_id); - let response = ctx.post_empty(&path)?; - print_empty_response(response) - } - SessionsCommand::GetMessages(args) | SessionsCommand::Events(args) => { - let ctx = ClientContext::new(cli, &args.client)?; - let path = format!("{API_PREFIX}/sessions/{}/events", args.session_id); - let response = ctx.get_with_query( - &path, - &[ - ("offset", args.offset.map(|v| v.to_string())), - ("limit", args.limit.map(|v| v.to_string())), - ( - "include_raw", - if args.include_raw { - Some("true".to_string()) - } else { - None - }, - ), - ], - )?; - print_json_response::(response) - } - SessionsCommand::EventsSse(args) => { - let ctx = ClientContext::new(cli, &args.client)?; - let path = format!("{API_PREFIX}/sessions/{}/events/sse", args.session_id); - let response = ctx.get_with_query( - &path, - &[ - ("offset", args.offset.map(|v| v.to_string())), - ( - "include_raw", - if args.include_raw { - Some("true".to_string()) - } else { - None - }, - ), - ], - )?; - print_text_response(response) - } - SessionsCommand::ReplyQuestion(args) => { - let ctx = ClientContext::new(cli, &args.client)?; - let answers: Vec> = serde_json::from_str(&args.answers)?; - let body = QuestionReplyRequest { answers }; - let path = format!( - "{API_PREFIX}/sessions/{}/questions/{}/reply", - args.session_id, args.question_id - ); - let response = ctx.post(&path, &body)?; - print_empty_response(response) - } - SessionsCommand::RejectQuestion(args) => { - let ctx = ClientContext::new(cli, &args.client)?; - let path = format!( - "{API_PREFIX}/sessions/{}/questions/{}/reject", - args.session_id, args.question_id - ); - let response = ctx.post_empty(&path)?; - print_empty_response(response) - } - SessionsCommand::ReplyPermission(args) => { - let ctx = ClientContext::new(cli, &args.client)?; - let body = PermissionReplyRequest { - reply: args.reply.clone(), - }; - let path = format!( - "{API_PREFIX}/sessions/{}/permissions/{}/reply", - args.session_id, args.permission_id - ); - let response = ctx.post(&path, &body)?; - print_empty_response(response) - } - } -} - -fn spawn_sandbox_agent_server( - cli: &Cli, - args: &OpencodeArgs, - token: Option<&str>, -) -> Result { - let exe = std::env::current_exe()?; - let mut cmd = ProcessCommand::new(exe); - cmd.arg("server") - .arg("--host") - .arg(&args.host) - .arg("--port") - .arg(args.port.to_string()) - .stdin(Stdio::inherit()) - .stdout(Stdio::inherit()) - .stderr(Stdio::inherit()); - - if cli.no_token { - cmd.arg("--no-token"); - } else if let Some(token) = token { - cmd.arg("--token").arg(token); - } - - cmd.spawn().map_err(CliError::from) -} - -fn wait_for_health( - server_child: &mut Child, - base_url: &str, - token: Option<&str>, -) -> Result<(), CliError> { - let client = HttpClient::builder().build()?; - let deadline = Instant::now() + Duration::from_secs(30); - - while Instant::now() < deadline { - if let Some(status) = server_child.try_wait()? { - return Err(CliError::Server(format!( - "sandbox-agent exited before becoming healthy ({status})" - ))); - } - - let url = format!("{base_url}/v1/health"); - let mut request = client.get(&url); - if let Some(token) = token { - request = request.bearer_auth(token); - } - match request.send() { - Ok(response) if response.status().is_success() => return Ok(()), - _ => { - std::thread::sleep(Duration::from_millis(200)); - } - } - } - - Err(CliError::Server( - "timed out waiting for sandbox-agent health".to_string(), - )) -} - -fn create_opencode_session( - base_url: &str, - token: Option<&str>, - title: Option<&str>, -) -> Result { - let client = HttpClient::builder().build()?; - let url = format!("{base_url}/opencode/session"); - let body = if let Some(title) = title { - json!({ "title": title }) - } else { - json!({}) - }; - let mut request = client.post(&url).json(&body); - if let Ok(directory) = std::env::current_dir() { - request = request.header( - "x-opencode-directory", - directory.to_string_lossy().to_string(), - ); - } - if let Some(token) = token { - request = request.bearer_auth(token); - } - let response = request.send()?; - let status = response.status(); - let text = response.text()?; - if !status.is_success() { - print_error_body(&text)?; - return Err(CliError::HttpStatus(status)); - } - let body: Value = serde_json::from_str(&text)?; - let session_id = body - .get("id") - .and_then(|value| value.as_str()) - .ok_or_else(|| CliError::Server("opencode session missing id".to_string()))?; - Ok(session_id.to_string()) -} - -fn resolve_opencode_bin(explicit: Option<&PathBuf>) -> PathBuf { - if let Some(path) = explicit { - return path.clone(); - } - if let Ok(path) = std::env::var("OPENCODE_BIN") { - return PathBuf::from(path); - } - PathBuf::from("opencode") -} - -fn terminate_child(child: &mut Child) { - let _ = child.kill(); - let _ = child.wait(); -} - -fn run_credentials(command: &CredentialsCommand) -> Result<(), CliError> { - match command { - CredentialsCommand::Extract(args) => { - let mut options = CredentialExtractionOptions::new(); - if let Some(home_dir) = args.home_dir.clone() { - options.home_dir = Some(home_dir); - } - if args.no_oauth { - options.include_oauth = false; - } - - let credentials = extract_all_credentials(&options); - if let Some(agent) = args.agent.clone() { - let token = select_token_for_agent(&credentials, agent, args.provider.as_deref())?; - write_stdout_line(&token)?; - return Ok(()); - } - if let Some(provider) = args.provider.as_deref() { - let token = select_token_for_provider(&credentials, provider)?; - write_stdout_line(&token)?; - return Ok(()); - } - - let output = credentials_to_output(credentials, args.reveal); - let pretty = serde_json::to_string_pretty(&output)?; - write_stdout_line(&pretty)?; - Ok(()) - } - CredentialsCommand::ExtractEnv(args) => { - let mut options = CredentialExtractionOptions::new(); - if let Some(home_dir) = args.home_dir.clone() { - options.home_dir = Some(home_dir); - } - if args.no_oauth { - options.include_oauth = false; - } - - let credentials = extract_all_credentials(&options); - let prefix = if args.export { "export " } else { "" }; - - if let Some(cred) = &credentials.anthropic { - write_stdout_line(&format!("{}ANTHROPIC_API_KEY={}", prefix, cred.api_key))?; - write_stdout_line(&format!("{}CLAUDE_API_KEY={}", prefix, cred.api_key))?; - } - if let Some(cred) = &credentials.openai { - write_stdout_line(&format!("{}OPENAI_API_KEY={}", prefix, cred.api_key))?; - write_stdout_line(&format!("{}CODEX_API_KEY={}", prefix, cred.api_key))?; - } - for (provider, cred) in &credentials.other { - let var_name = format!("{}_API_KEY", provider.to_uppercase().replace('-', "_")); - write_stdout_line(&format!("{}{}={}", prefix, var_name, cred.api_key))?; - } - - Ok(()) - } - } -} - -#[derive(Serialize)] -struct CredentialsOutput { - anthropic: Option, - openai: Option, - other: HashMap, -} - -#[derive(Serialize)] -struct CredentialSummary { - provider: String, - source: String, - auth_type: String, - api_key: String, - redacted: bool, -} - -#[derive(clap::ValueEnum, Clone, Debug)] -enum CredentialAgent { - Claude, - Codex, - Opencode, - Amp, -} - -fn credentials_to_output(credentials: ExtractedCredentials, reveal: bool) -> CredentialsOutput { - CredentialsOutput { - anthropic: credentials - .anthropic - .map(|cred| summarize_credential(&cred, reveal)), - openai: credentials - .openai - .map(|cred| summarize_credential(&cred, reveal)), - other: credentials - .other - .into_iter() - .map(|(key, cred)| (key, summarize_credential(&cred, reveal))) - .collect(), - } -} - -fn summarize_credential(credential: &ProviderCredentials, reveal: bool) -> CredentialSummary { - let api_key = if reveal { - credential.api_key.clone() - } else { - redact_key(&credential.api_key) - }; - CredentialSummary { - provider: credential.provider.clone(), - source: credential.source.clone(), - auth_type: match credential.auth_type { - AuthType::ApiKey => "api_key".to_string(), - AuthType::Oauth => "oauth".to_string(), - }, - api_key, - redacted: !reveal, - } -} - -fn redact_key(key: &str) -> String { - let trimmed = key.trim(); - let len = trimmed.len(); - if len <= 8 { - return "****".to_string(); - } - let prefix = &trimmed[..4]; - let suffix = &trimmed[len - 4..]; - format!("{prefix}...{suffix}") -} - -fn install_agent_local(args: &InstallAgentArgs) -> Result<(), CliError> { - let agent_id = AgentId::parse(&args.agent) - .ok_or_else(|| CliError::Server(format!("unsupported agent: {}", args.agent)))?; - let manager = AgentManager::new(default_install_dir()) - .map_err(|err| CliError::Server(err.to_string()))?; - manager - .install( - agent_id, - InstallOptions { - reinstall: args.reinstall, - version: None, - }, - ) - .map_err(|err| CliError::Server(err.to_string()))?; - Ok(()) -} - -fn select_token_for_agent( - credentials: &ExtractedCredentials, - agent: CredentialAgent, - provider: Option<&str>, -) -> Result { - match agent { - CredentialAgent::Claude | CredentialAgent::Amp => { - if let Some(provider) = provider { - if provider != "anthropic" { - return Err(CliError::Server(format!( - "agent {:?} only supports provider anthropic", - agent - ))); - } - } - select_token_for_provider(credentials, "anthropic") - } - CredentialAgent::Codex => { - if let Some(provider) = provider { - if provider != "openai" { - return Err(CliError::Server(format!( - "agent {:?} only supports provider openai", - agent - ))); - } - } - select_token_for_provider(credentials, "openai") - } - CredentialAgent::Opencode => { - if let Some(provider) = provider { - return select_token_for_provider(credentials, provider); - } - if let Some(openai) = credentials.openai.as_ref() { - return Ok(openai.api_key.clone()); - } - if let Some(anthropic) = credentials.anthropic.as_ref() { - return Ok(anthropic.api_key.clone()); - } - if credentials.other.len() == 1 { - if let Some((_, cred)) = credentials.other.iter().next() { - return Ok(cred.api_key.clone()); - } - } - let available = available_providers(credentials); - if available.is_empty() { - Err(CliError::Server( - "no credentials found for opencode".to_string(), - )) - } else { - Err(CliError::Server(format!( - "multiple providers available for opencode: {} (use --provider)", - available.join(", ") - ))) - } - } - } -} - -fn select_token_for_provider( - credentials: &ExtractedCredentials, - provider: &str, -) -> Result { - if let Some(cred) = provider_credential(credentials, provider) { - Ok(cred.api_key.clone()) - } else { - Err(CliError::Server(format!( - "no credentials found for provider {provider}" - ))) - } -} - -fn provider_credential<'a>( - credentials: &'a ExtractedCredentials, - provider: &str, -) -> Option<&'a ProviderCredentials> { - match provider { - "openai" => credentials.openai.as_ref(), - "anthropic" => credentials.anthropic.as_ref(), - _ => credentials.other.get(provider), - } -} - -fn available_providers(credentials: &ExtractedCredentials) -> Vec { - let mut providers = Vec::new(); - if credentials.openai.is_some() { - providers.push("openai".to_string()); - } - if credentials.anthropic.is_some() { - providers.push("anthropic".to_string()); - } - for key in credentials.other.keys() { - providers.push(key.clone()); - } - providers.sort(); - providers.dedup(); - providers -} - -fn build_cors_layer(server: &ServerArgs) -> Result { - let mut cors = CorsLayer::new(); - - // Build origins list from provided origins - let mut origins = Vec::new(); - for origin in &server.cors_allow_origin { - let value = origin - .parse() - .map_err(|_| CliError::InvalidCorsOrigin(origin.clone()))?; - origins.push(value); - } - if origins.is_empty() { - // No origins allowed - use permissive CORS with no origins (effectively disabled) - cors = cors.allow_origin(tower_http::cors::AllowOrigin::predicate(|_, _| false)); - } else { - cors = cors.allow_origin(origins); - } - - // Methods: allow any if not specified, otherwise use provided list - if server.cors_allow_method.is_empty() { - cors = cors.allow_methods(Any); - } else { - let mut methods = Vec::new(); - for method in &server.cors_allow_method { - let parsed = method - .parse() - .map_err(|_| CliError::InvalidCorsMethod(method.clone()))?; - methods.push(parsed); - } - cors = cors.allow_methods(methods); - } - - // Headers: allow any if not specified, otherwise use provided list - if server.cors_allow_header.is_empty() { - cors = cors.allow_headers(Any); - } else { - let mut headers = Vec::new(); - for header in &server.cors_allow_header { - let parsed = header - .parse() - .map_err(|_| CliError::InvalidCorsHeader(header.clone()))?; - headers.push(parsed); - } - cors = cors.allow_headers(headers); - } - - if server.cors_allow_credentials { - cors = cors.allow_credentials(true); - } - - Ok(cors) -} - -struct ClientContext { - endpoint: String, - token: Option, - client: HttpClient, -} - -impl ClientContext { - fn new(cli: &Cli, args: &ClientArgs) -> Result { - let endpoint = args - .endpoint - .clone() - .unwrap_or_else(|| format!("http://{}:{}", DEFAULT_HOST, DEFAULT_PORT)); - let token = if cli.no_token { - None - } else { - cli.token.clone() - }; - let client = HttpClient::builder().build()?; - Ok(Self { - endpoint, - token, - client, - }) - } - - fn url(&self, path: &str) -> String { - format!("{}{}", self.endpoint.trim_end_matches('/'), path) - } - - fn request(&self, method: Method, path: &str) -> reqwest::blocking::RequestBuilder { - let url = self.url(path); - let mut builder = self.client.request(method, url); - if let Some(token) = &self.token { - builder = builder.bearer_auth(token); - } - builder - } - - fn get(&self, path: &str) -> Result { - Ok(self.request(Method::GET, path).send()?) - } - - fn get_with_query( - &self, - path: &str, - query: &[(&str, Option)], - ) -> Result { - let mut request = self.request(Method::GET, path); - for (key, value) in query { - if let Some(value) = value { - request = request.query(&[(key, value)]); - } - } - Ok(request.send()?) - } - - fn post( - &self, - path: &str, - body: &T, - ) -> Result { - Ok(self.request(Method::POST, path).json(body).send()?) - } - - fn post_with_query( - &self, - path: &str, - body: &T, - query: &[(&str, Option)], - ) -> Result { - let mut request = self.request(Method::POST, path).json(body); - for (key, value) in query { - if let Some(value) = value { - request = request.query(&[(key, value)]); - } - } - Ok(request.send()?) - } - - fn post_empty(&self, path: &str) -> Result { - Ok(self.request(Method::POST, path).send()?) - } -} - -fn print_json_response( - response: reqwest::blocking::Response, -) -> Result<(), CliError> { - let status = response.status(); - let text = response.text()?; - - if !status.is_success() { - print_error_body(&text)?; - return Err(CliError::HttpStatus(status)); - } - - let parsed: T = serde_json::from_str(&text)?; - let pretty = serde_json::to_string_pretty(&parsed)?; - write_stdout_line(&pretty)?; - Ok(()) -} - -fn print_text_response(response: reqwest::blocking::Response) -> Result<(), CliError> { - let status = response.status(); - let text = response.text()?; - - if !status.is_success() { - print_error_body(&text)?; - return Err(CliError::HttpStatus(status)); - } - - write_stdout(&text)?; - Ok(()) -} - -fn print_empty_response(response: reqwest::blocking::Response) -> Result<(), CliError> { - let status = response.status(); - if status.is_success() { - return Ok(()); - } - let text = response.text()?; - print_error_body(&text)?; - Err(CliError::HttpStatus(status)) -} - -fn print_error_body(text: &str) -> Result<(), CliError> { - if let Ok(json) = serde_json::from_str::(text) { - let pretty = serde_json::to_string_pretty(&json)?; - write_stderr_line(&pretty)?; - } else { - write_stderr_line(text)?; - } - Ok(()) -} - -fn write_stdout(text: &str) -> Result<(), CliError> { - let mut out = std::io::stdout(); - out.write_all(text.as_bytes())?; - out.flush()?; - Ok(()) -} - -fn write_stdout_line(text: &str) -> Result<(), CliError> { - let mut out = std::io::stdout(); - out.write_all(text.as_bytes())?; - out.write_all(b"\n")?; - out.flush()?; - Ok(()) -} - -fn write_stderr_line(text: &str) -> Result<(), CliError> { - let mut out = std::io::stderr(); - out.write_all(text.as_bytes())?; - out.write_all(b"\n")?; - out.flush()?; - Ok(()) -} diff --git a/target b/target deleted file mode 120000 index 3d6ad8c..0000000 --- a/target +++ /dev/null @@ -1 +0,0 @@ -/home/nathan/sandbox-agent/target \ No newline at end of file From 6a3345b95430da075410332dc58f9e4723234947 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 6 Feb 2026 02:57:23 -0800 Subject: [PATCH 05/19] fix: opencode compat tool call rendering and default to no-token (#95) - Fix tool name lost on ToolResult events (persist via tool_name_by_call) - Fix tool input lost on ToolResult events (persist via tool_args_by_call) - Fix tool output in wrong field (error -> output) - Fix text doubling in streaming (defer emit to ItemCompleted) - Fix missing delta field in text streaming events - Default server mode to no-token when --token not specified - Add install-fast-sa and install-fast-gigacode justfile targets --- justfile | 10 + research/agents/amp.md | 209 +- research/agents/claude.md | 53 + research/agents/codex.md | 29 + research/agents/opencode.md | 76 + research/opencode-compat/COMPARISON.md | 70 + research/opencode-compat/capture-native.ts | 260 ++ .../opencode-compat/capture-sandbox-agent.ts | 249 ++ .../snapshots/native/all-events.json | 1281 ++++++ .../snapshots/native/message-1-response.json | 69 + .../snapshots/native/message-2-response.json | 52 + .../snapshots/native/messages-after-1.json | 99 + .../snapshots/native/messages-after-2.json | 281 ++ .../snapshots/native/metadata-agent.json | 605 +++ .../snapshots/native/metadata-config.json | 102 + .../snapshots/native/metadata-providers.json | 3716 +++++++++++++++++ .../snapshots/native/session-create.json | 12 + .../snapshots/native/session-details.json | 17 + .../snapshots/native/session-events.json | 156 + .../snapshots/native/session-status.json | 1 + .../snapshots/sandbox-agent/all-events.json | 682 +++ .../sandbox-agent/messages-after-1.json | 106 + .../sandbox-agent/messages-after-2.json | 269 ++ .../sandbox-agent/metadata-agent.json | 11 + .../sandbox-agent/metadata-config.json | 1 + .../sandbox-agent/session-create.json | 12 + .../sandbox-agent/session-details.json | 12 + .../sandbox-agent/session-events.json | 655 +++ .../sandbox-agent/session-status.json | 5 + server/packages/sandbox-agent/src/cli.rs | 8 +- server/packages/sandbox-agent/src/daemon.rs | 6 +- .../sandbox-agent/src/opencode_compat.rs | 117 +- 32 files changed, 9193 insertions(+), 38 deletions(-) create mode 100644 research/opencode-compat/COMPARISON.md create mode 100644 research/opencode-compat/capture-native.ts create mode 100644 research/opencode-compat/capture-sandbox-agent.ts create mode 100644 research/opencode-compat/snapshots/native/all-events.json create mode 100644 research/opencode-compat/snapshots/native/message-1-response.json create mode 100644 research/opencode-compat/snapshots/native/message-2-response.json create mode 100644 research/opencode-compat/snapshots/native/messages-after-1.json create mode 100644 research/opencode-compat/snapshots/native/messages-after-2.json create mode 100644 research/opencode-compat/snapshots/native/metadata-agent.json create mode 100644 research/opencode-compat/snapshots/native/metadata-config.json create mode 100644 research/opencode-compat/snapshots/native/metadata-providers.json create mode 100644 research/opencode-compat/snapshots/native/session-create.json create mode 100644 research/opencode-compat/snapshots/native/session-details.json create mode 100644 research/opencode-compat/snapshots/native/session-events.json create mode 100644 research/opencode-compat/snapshots/native/session-status.json create mode 100644 research/opencode-compat/snapshots/sandbox-agent/all-events.json create mode 100644 research/opencode-compat/snapshots/sandbox-agent/messages-after-1.json create mode 100644 research/opencode-compat/snapshots/sandbox-agent/messages-after-2.json create mode 100644 research/opencode-compat/snapshots/sandbox-agent/metadata-agent.json create mode 100644 research/opencode-compat/snapshots/sandbox-agent/metadata-config.json create mode 100644 research/opencode-compat/snapshots/sandbox-agent/session-create.json create mode 100644 research/opencode-compat/snapshots/sandbox-agent/session-details.json create mode 100644 research/opencode-compat/snapshots/sandbox-agent/session-events.json create mode 100644 research/opencode-compat/snapshots/sandbox-agent/session-status.json diff --git a/justfile b/justfile index b70c53c..107139b 100644 --- a/justfile +++ b/justfile @@ -48,6 +48,16 @@ check: fmt: cargo fmt --all +[group('dev')] +install-fast-sa: + cargo build --release -p sandbox-agent + cp target/release/sandbox-agent ~/.cargo/bin/sandbox-agent + +[group('dev')] +install-fast-gigacode: + cargo build --release -p gigacode + cp target/release/gigacode ~/.cargo/bin/gigacode + [group('dev')] dev-docs: cd docs && pnpm dlx mintlify dev diff --git a/research/agents/amp.md b/research/agents/amp.md index f6b800f..ff314dd 100644 --- a/research/agents/amp.md +++ b/research/agents/amp.md @@ -4,11 +4,13 @@ Research notes on Sourcegraph Amp's configuration, credential discovery, and run ## Overview -- **Provider**: Anthropic (via Sourcegraph) +- **Provider**: Anthropic (via Sourcegraph, proxied through ampcode.com) - **Execution Method**: CLI subprocess (`amp` command) - **Session Persistence**: Session ID (string) - **SDK**: `@sourcegraph/amp-sdk` (closed source) +- **Binary**: Bun-bundled JS application (ELF wrapping Bun runtime + embedded JS) - **Binary Location**: `/usr/local/bin/amp` +- **Backend**: `https://ampcode.com/` (server-side proxy for all LLM requests) ## CLI Usage @@ -208,6 +210,211 @@ curl -fsSL "https://storage.googleapis.com/amp-public-assets-prod-0/cli/${VERSIO - Default timeout: 5 minutes (300,000 ms) - Process killed with `SIGTERM` on timeout +## Model Discovery + +**No model discovery mechanism exists.** Amp uses a server-side proxy architecture where model selection is abstracted behind "modes". + +### Architecture (Reverse Engineered) + +Amp is **NOT a Go binary** as previously thought — it is a **Bun-bundled JavaScript application** (ELF binary wrapping Bun runtime + embedded JS). The CLI logs confirm: `"argv":["bun","/$bunfs/root/amp-linux-x64",...]`. + +**Amp is a server-side proxy.** All LLM requests go through `https://ampcode.com/`: +1. CLI authenticates via `AMP_API_KEY` env var or browser-based OAuth to `https://ampcode.com/auth/cli-login` +2. On startup, calls `getUserInfo` against `https://ampcode.com/` +3. Model selection is handled **server-side**, not client-side + +### Modes Instead of Models + +Amp uses **modes** (`--mode` / `-m` flag) instead of direct model selection. Each mode bundles a model, system prompt, and tool selection together server-side. + +#### Agent Modes + +| Mode | Primary Model | Description | +|------|---------------|-------------| +| `smart` | Claude Opus 4.6 | Default. Unconstrained state-of-the-art model use, maximum capability and autonomy | +| `rush` | Claude Haiku 4.5 | Faster and cheaper, suitable for small, well-defined tasks | +| `deep` | GPT-5.2 Codex | Deep reasoning with extended thinking for complex problems. Requires `amp.experimental.modes: ["deep"]` | +| `free` | Unknown | Free tier (listed in CLI `--help` but not on docs site) | +| `large` | Unknown | Hidden/undocumented mode (referenced in docs but no details) | + +Source: [ampcode.com/manual](https://ampcode.com/manual), [ampcode.com/models](https://ampcode.com/models) + +#### Specialized Models (not user-selectable) + +Amp also uses additional models for specific subtasks: + +| Role | Model | Purpose | +|------|-------|---------| +| Review | Gemini 3 Pro | Code review and bug detection | +| Search subagent | Gemini 3 Flash | Codebase retrieval | +| Oracle subagent | GPT-5.2 | Complex code reasoning | +| Librarian subagent | Claude Sonnet 4.5 | External code research | +| Image/PDF analysis | Gemini 3 Flash | Multimodal input processing | +| Content generation | Gemini 3 Pro Image (Painter) | Image generation | +| Handoff (context) | Gemini 2.5 Flash | Context management | +| Thread categorization | Gemini 2.5 Flash-Lite | Thread organization | +| Title generation | Claude Haiku 4.5 | Thread title generation | + +#### Mode Subsettings + +- **`amp.experimental.modes`** — Array of experimental mode names to enable. Currently only `["deep"]` is documented. +- **`amp.internal.deepReasoningEffort`** — Override reasoning effort for GPT-5.2 Codex in deep mode. Options: `medium`, `high`, `xhigh`. Default: `medium`. Keyboard shortcut `Alt+D` cycles through `deep` → `deep²` → `deep³` (corresponding to medium → high → xhigh). + +#### Switching Modes + +- **CLI flag**: `--mode ` or `-m ` +- **Interactive TUI**: `Ctrl+O` → type "mode" +- **Editor extension**: Mode selector in the prompt field + +#### No Programmatic Mode Listing + +There is no CLI command (`amp modes list`) or API endpoint to list available modes. The modes are: +- Hardcoded in the `--help` text: `deep, free, rush, smart` +- Documented on [ampcode.com/manual](https://ampcode.com/manual) and [ampcode.com/models](https://ampcode.com/models) +- Up-to-date list available at [ampcode.com/manual#agent-modes](https://ampcode.com/manual#agent-modes) + +The `--model` flag also still exists on the CLI but modes are the primary interface. It's unclear if `--model` bypasses mode selection or if it's ignored. + +### Reverse Engineering Methodology + +#### Step 1: CLI help analysis + +```bash +amp --help +``` + +Revealed: +- `-m, --mode ` flag with `deep`, `free`, `rush`, `smart` options (not `--model` for models) +- `AMP_URL` env var defaults to `https://ampcode.com/` +- `AMP_API_KEY` env var for authentication +- Settings at `~/.config/amp/settings.json` +- Logs at `~/.cache/amp/logs/cli.log` + +#### Step 2: Binary analysis + +```bash +file ~/.local/bin/amp # → ELF 64-bit LSB executable, 117MB +ls -lh ~/.local/bin/amp # → 117M +strings ~/.local/bin/amp | grep 'ampcode' # → 43 matches, embedded JS visible +``` + +The `file` command showed an ELF binary, initially suggesting a compiled Go binary. But `strings` revealed embedded JavaScript source code, and the debug logs later confirmed it's actually a **Bun-bundled application** (`argv: ["bun", "/$bunfs/root/amp-linux-x64", ...]`). + +The embedded JS is minified but partially readable via `strings`. Found tool definitions (`edit_file`, `write_file`, `create_file`), skill loading code, and MCP integration code. Did not find hardcoded model lists or mode→model mappings — these are server-side. + +#### Step 3: strace (failed for network, useful for file IO) + +```bash +strace -e trace=connect -f amp --execute "say hello" ... +``` + +**Result: No `AF_INET` connections captured.** Only saw: +- `AF_UNIX` socket to `/tmp/tmux-1000/default` (tmux IPC) +- `socketpair()` for internal IPC between threads + +**Why it failed:** Bun uses `io_uring` for async network IO on Linux, which bypasses traditional `connect()`/`sendto()` syscalls. strace hooks into the syscall layer, but io_uring submits work directly to the kernel via shared memory rings, making it invisible to strace. + +Even with full syscall tracing (`strace -f -s 512` capturing 27,000 lines), zero TCP connections appeared. + +#### Step 4: Process network inspection (partial success) + +```bash +# While amp was running: +ss -tnp | grep amp +cat /proc//net/tcp6 +``` + +From `/proc/net/tcp6`, decoded a connection to port `01BB` (443/HTTPS). Resolved the destination to `34.54.147.251` via: + +```bash +dig ampcode.com +short # → 34.54.147.251 +``` + +Confirmed Amp connects to `ampcode.com:443`. But `ss -tnp` couldn't attribute the connection to the amp process (process had already exited or Bun's process model confused ss). + +#### Step 5: Debug logging (most useful) + +```bash +env AMP_API_KEY=fake-key amp --execute "say hello" --stream-json --log-level debug +# Then read: ~/.cache/amp/logs/cli.log +``` + +The debug log revealed the complete startup sequence and API flow. Key log messages: +- `"Initializing CLI context"` — shows `hasAmpAPIKey`, `hasAmpURL`, `hasSettingsFile` +- `"Resolved Amp URL"` → `https://ampcode.com/` +- `"API key lookup before login"` — `found: true/false` +- `"API request for getUserInfo failed: 401"` — confirms API call to ampcode.com with our fake key +- `"Starting Amp background services"` — proceeds even after auth failure + +#### Step 6: Fake API key to bypass login (success) + +Without `AMP_API_KEY`, Amp hangs indefinitely trying to open a browser for OAuth at `https://ampcode.com/auth/cli-login?authToken=...&callbackPort=...`. Setting `AMP_API_KEY=fake-key` bypasses the browser login flow and reaches the API call stage (where it gets a 401). + +#### Step 7: NODE_DEBUG (failed) + +```bash +env NODE_DEBUG=http,https,net amp ... +``` + +No output — Bun ignores Node.js debug environment variables. + +### What Was NOT Captured + +- **Actual HTTP request/response bodies** — Would require mitmproxy with HTTPS interception (set `amp.proxy` or `HTTPS_PROXY` env var, install custom CA cert). Not attempted. +- **Mode→model mappings** — These are server-side in ampcode.com. The CLI sends a mode name and the server selects the model. +- **Full API schema** — Only saw `getUserInfo` endpoint name in error message. Thread creation, message streaming, and other endpoints are unknown. +- **Whether `--model` bypasses mode selection** — Couldn't test without a valid API key. + +### Future Investigation + +To capture full HTTP traffic, set up mitmproxy: + +```bash +# Install mitmproxy +pip install mitmproxy + +# Start proxy +mitmproxy --listen-port 8080 + +# Run amp through proxy (amp.proxy setting or env var) +# amp respects amp.proxy setting in ~/.config/amp/settings.json: +# { "amp.proxy": "http://localhost:8080" } +# +# Then install mitmproxy's CA cert for TLS interception. +``` + +Alternatively, since amp is a Bun binary, it may respect `HTTPS_PROXY` env var by default (Go's `net/http` does, Bun's `fetch` may as well). + +### API Flow (from debug logs) + +``` +1. "Starting Amp CLI" (version 0.0.1770352274-gd36e02) +2. "Initializing CLI context" (hasAmpAPIKey: true/false) +3. "Resolved Amp URL" → https://ampcode.com/ +4. Skills loading, MCP initialization, toolbox registration +5. "API key lookup before login" +6. getUserInfo API call → https://ampcode.com/ (401 with invalid key) +7. "Starting Amp background services" +8. Thread creation + message streaming via ampcode.com +``` + +### Current Behavior + +The sandbox-agent passes `--model` through to Amp without validation: + +```rust +if let Some(model) = options.model.as_deref() { + command.arg("--model").arg(model); +} +``` + +### Possible Approaches + +1. **Proxy provider APIs** — Not applicable; Amp proxies through ampcode.com, not directly to model providers +2. **Hardcode known modes** — Expose the four modes (`deep`, `free`, `rush`, `smart`) as the available "model" options +3. **Wait for Amp API** — Amp may add model/mode discovery in a future release +4. **Scrape ampcode.com** — Check if the web UI exposes available modes/models + ## Notes - Amp is similar to Claude Code (same streaming format) diff --git a/research/agents/claude.md b/research/agents/claude.md index 42a552b..b78f278 100644 --- a/research/agents/claude.md +++ b/research/agents/claude.md @@ -226,6 +226,59 @@ Claude output is converted via `convertClaudeOutput()`: 3. Parse with `ClaudeCliResponseSchema` as fallback 4. Extract `structured_output` as metadata if present +## Model Discovery + +Claude Code's `/models` slash command uses the **standard Anthropic Models API**. + +### API Endpoint + +``` +GET https://api.anthropic.com/v1/models?beta=true +``` + +Found by reverse engineering the CLI bundle at `node_modules/@anthropic-ai/claude-code/cli.js`. + +### API Client + +The CLI contains an internal `Models` class with two methods: + +```javascript +// List all models +GET /v1/models?beta=true + +// Retrieve a single model +GET /v1/models/${modelId}?beta=true +``` + +Uses `this._client.getAPIList()` which handles paginated responses. The `?beta=true` query parameter is hardcoded to include beta/preview models. + +### Authentication + +Uses the same Anthropic API key / OAuth credentials that Claude Code uses for conversations. The request goes to the standard Anthropic API base URL. + +### Hardcoded Context Window Data + +The CLI also contains hardcoded output token limits for certain models (used as fallback): + +```javascript +{ + "claude-opus-4-20250514": 8192, + "claude-opus-4-0": 8192, + "claude-opus-4-1-20250805": 8192, + // ... more entries +} +``` + +### How to Replicate + +Call the Anthropic API directly — no need to go through the Claude CLI: + +``` +GET https://api.anthropic.com/v1/models?beta=true +x-api-key: +anthropic-version: 2023-06-01 +``` + ## Notes - Claude CLI manages its own OAuth refresh internally diff --git a/research/agents/codex.md b/research/agents/codex.md index b0e4098..8d3d970 100644 --- a/research/agents/codex.md +++ b/research/agents/codex.md @@ -318,6 +318,35 @@ fn codex_thread_id_from_server_notification(notification) -> Option { } ``` +## Model Discovery + +Codex exposes a `model/list` JSON-RPC method through its app-server process. + +### JSON-RPC Method + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "model/list", + "params": { + "cursor": null, + "limit": null + } +} +``` + +Supports pagination via `cursor` and `limit` parameters. Defined in `resources/agent-schemas/artifacts/json-schema/codex.json`. + +### How to Replicate + +Requires a running Codex app-server process. Send the JSON-RPC request to the app-server over stdio. The response contains the list of models available to the Codex instance (depends on configured API keys / providers). + +### Limitations + +- Requires an active app-server process (cannot query models without starting one) +- No standalone CLI command like `codex models` + ## Notes - SDK is dynamically imported to reduce bundle size diff --git a/research/agents/opencode.md b/research/agents/opencode.md index 8a19fd2..8708282 100644 --- a/research/agents/opencode.md +++ b/research/agents/opencode.md @@ -509,6 +509,82 @@ const pollInterval = setInterval(async () => { }, 2000); ``` +## Model Discovery + +OpenCode has the richest model discovery support with both CLI and HTTP API. + +### CLI Commands + +```bash +opencode models # List all available models +opencode models # List models for a specific provider +``` + +### HTTP Endpoint + +``` +GET /provider +``` + +### Response Schema + +```json +{ + "all": [ + { + "id": "anthropic", + "name": "Anthropic", + "api": "string", + "env": ["ANTHROPIC_API_KEY"], + "npm": "string", + "models": { + "model-key": { + "id": "string", + "name": "string", + "family": "string", + "release_date": "string", + "attachment": true, + "reasoning": false, + "tool_call": true, + "cost": { + "input": 0.003, + "output": 0.015, + "cache_read": 0.0003, + "cache_write": 0.00375 + }, + "limit": { + "context": 200000, + "input": 200000, + "output": 8192 + }, + "modalities": { + "input": ["text", "image"], + "output": ["text"] + }, + "experimental": false, + "status": "beta" + } + } + } + ], + "default": { + "anthropic": "claude-sonnet-4-20250514" + }, + "connected": ["anthropic"] +} +``` + +### SDK Usage + +```typescript +const client = createOpencodeClient(); +const response = await client.provider.list(); +``` + +### How to Replicate + +When an OpenCode server is running, call `GET /provider` on its HTTP port. Returns full model metadata including capabilities, costs, context limits, and modalities. + ## Notes - OpenCode is the most feature-rich runtime (streaming, questions, permissions) diff --git a/research/opencode-compat/COMPARISON.md b/research/opencode-compat/COMPARISON.md new file mode 100644 index 0000000..08cc040 --- /dev/null +++ b/research/opencode-compat/COMPARISON.md @@ -0,0 +1,70 @@ +# Native OpenCode vs Sandbox-Agent: OpenCode API Comparison + +## Overview + +Captured API output from both native OpenCode server (v1.1.49) and sandbox-agent's +OpenCode compatibility layer, sending identical request patterns: +1. Message 1: Simple text response (echo/text) +2. Message 2: Tool call (ls/mock.search) + +## Bugs Found and Fixed + +### 1. Tool name (`tool` field) changed between events [FIXED] + +**Bug**: The `tool` field in tool part events changed between `pending` and `running`/`completed` +states. In the `pending` event it correctly showed `"mock.search"`, but in subsequent events +(from ToolResult) it showed `"tool"` because `extract_tool_content` doesn't return tool_name +for ToolResult items. + +**Fix**: Added `tool_name_by_call` HashMap to `OpenCodeSessionRuntime` to persist tool names +from ToolCall events and look them up during ToolResult processing. + +### 2. Tool `input` lost on ToolResult events [FIXED] + +**Bug**: When the ToolResult event came in, the tool's input arguments were lost because +ToolResult content only contains `call_id` and `output`, not arguments. + +**Fix**: Added `tool_args_by_call` HashMap to `OpenCodeSessionRuntime` to persist arguments +from ToolCall events and look them up during ToolResult processing. + +### 3. Tool `output` in wrong field (`error` instead of `output`) [FIXED] + +**Bug**: When tool result status was `Failed`, the output text was put in `"error"` field. +Native OpenCode uses `"output"` field for tool output regardless of success/failure. + +**Fix**: Changed the failed tool result JSON to use `"output"` instead of `"error"`. + +### 4. Text doubling in streaming [FIXED] + +**Bug**: During text streaming, `ItemStarted` emitted a text part with full content, then +`ItemDelta` appended delta text, then `ItemCompleted` emitted again, causing doubled text. + +**Fix**: `ItemStarted` now only initializes empty text in runtime without emitting a part event. +`ItemCompleted` emits the final text using accumulated delta text or fallback to content text. + +### 5. Missing `delta` field in text streaming events [FIXED] + +**Bug**: `delta` field was not included in `message.part.updated` events for text streaming. +Native OpenCode includes `delta` on streaming events and omits it on the final event. + +**Fix**: Changed `apply_item_delta` to use `part_event_with_delta` instead of `part_event`. + +### 6. Not bugs (noted for completeness) + +- **Missing `step-start`/`step-finish` parts**: These are OpenCode-specific (git snapshot + tracking) and not expected from sandbox-agent. +- **Missing `time` on text parts**: Minor; could be added in future. +- **Missing `time.completed` on some assistant messages**: Minor timing issue. + +## Verification + +After fixes, all tool events now correctly show: +- `"tool": "mock.search"` across all states (pending, running, error) +- `"input": {"query": "example"}` preserved across all states +- `"output": "mock search results"` on the error event (not `"error"`) +- Text streaming includes `delta` field +- No text doubling + +All 28 OpenCode compat tests pass. +All 10 session snapshot tests pass. +All 3 HTTP endpoint tests pass. diff --git a/research/opencode-compat/capture-native.ts b/research/opencode-compat/capture-native.ts new file mode 100644 index 0000000..07f3336 --- /dev/null +++ b/research/opencode-compat/capture-native.ts @@ -0,0 +1,260 @@ +/** + * Capture native OpenCode server API output for comparison. + * + * Usage: + * npx tsx capture-native.ts + * + * Starts a native OpenCode headless server, creates a Claude session, + * sends 2 messages (one that triggers tool calls), and captures all + * session events and message snapshots. + */ +import { spawn, type ChildProcess } from "node:child_process"; +import { writeFileSync, mkdirSync, existsSync } from "node:fs"; +import { createServer, type AddressInfo } from "node:net"; + +const OUTPUT_DIR = new URL("./snapshots/native", import.meta.url).pathname; + +async function getFreePort(): Promise { + return new Promise((resolve, reject) => { + const server = createServer(); + server.unref(); + server.on("error", reject); + server.listen(0, "127.0.0.1", () => { + const address = server.address() as AddressInfo; + server.close(() => resolve(address.port)); + }); + }); +} + +async function waitForHealth(baseUrl: string, timeoutMs = 30_000): Promise { + const start = Date.now(); + while (Date.now() - start < timeoutMs) { + try { + const res = await fetch(`${baseUrl}/global/health`); + if (res.ok) return; + } catch {} + await new Promise((r) => setTimeout(r, 300)); + } + throw new Error("Timed out waiting for native opencode health"); +} + +function saveJson(name: string, data: unknown) { + if (!existsSync(OUTPUT_DIR)) mkdirSync(OUTPUT_DIR, { recursive: true }); + const path = `${OUTPUT_DIR}/${name}.json`; + writeFileSync(path, JSON.stringify(data, null, 2)); + console.log(` [saved] ${path}`); +} + +async function waitForIdle(baseUrl: string, sessionId: string, timeoutMs: number): Promise { + const start = Date.now(); + // Give a small initial delay for the status to change to busy + await new Promise((r) => setTimeout(r, 500)); + while (Date.now() - start < timeoutMs) { + try { + const statusRes = await fetch(`${baseUrl}/session/status`); + const statuses = await statusRes.json(); + const sessionStatus = statuses?.[sessionId]; + if (sessionStatus?.type === "idle" || sessionStatus === undefined) { + return; + } + } catch {} + await new Promise((r) => setTimeout(r, 500)); + } + throw new Error("Timed out waiting for session to become idle"); +} + +async function main() { + const port = await getFreePort(); + const baseUrl = `http://127.0.0.1:${port}`; + + console.log(`Starting native OpenCode server on port ${port}...`); + + const child: ChildProcess = spawn("opencode", ["serve", "--port", String(port)], { + stdio: "pipe", + env: { ...process.env }, + }); + + let stderr = ""; + child.stderr?.on("data", (chunk) => { + stderr += chunk.toString(); + }); + child.stdout?.on("data", (chunk) => { + const text = chunk.toString(); + if (text.includes("listening")) console.log(` [opencode] ${text.trim()}`); + }); + + // Track all SSE events in a separate array + const allEvents: any[] = []; + let sseAbort: AbortController | null = null; + let currentBaseUrl = ""; + + try { + await waitForHealth(baseUrl); + currentBaseUrl = baseUrl; + console.log("Native OpenCode server is healthy!"); + + // 1. Capture initial metadata + const [agentRes, configRes] = await Promise.all([ + fetch(`${baseUrl}/agent`).then((r) => r.json()), + fetch(`${baseUrl}/config`).then((r) => r.json()), + ]); + saveJson("metadata-agent", agentRes); + saveJson("metadata-config", configRes); + + // 2. Start SSE event collection + sseAbort = new AbortController(); + const ssePromise = (async () => { + try { + const res = await fetch(`${baseUrl}/event`, { + signal: sseAbort!.signal, + headers: { Accept: "text/event-stream" }, + }); + if (!res.ok || !res.body) { + console.error("SSE connection failed:", res.status); + return; + } + const reader = res.body.getReader(); + const decoder = new TextDecoder(); + let buffer = ""; + + while (true) { + const { done, value } = await reader.read(); + if (done) break; + buffer += decoder.decode(value, { stream: true }); + + const lines = buffer.split("\n"); + buffer = lines.pop() || ""; + + for (const line of lines) { + if (line.startsWith("data: ")) { + try { + const parsed = JSON.parse(line.slice(6)); + allEvents.push(parsed); + // Auto-approve permissions + if (parsed.type === "permission.asked" && parsed.properties?.id) { + const permId = parsed.properties.id; + console.log(` [auto-approving permission ${permId}]`); + fetch(`${currentBaseUrl}/permission/${permId}/reply`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ allow: true }), + }).catch(() => {}); + } + } catch {} + } + } + } + } catch (err: any) { + if (err.name !== "AbortError") { + // Ignore - expected when server closes + } + } + })(); + + // Give SSE time to connect + await new Promise((r) => setTimeout(r, 500)); + + // 3. Create a session + console.log("Creating session..."); + const sessionRes = await fetch(`${baseUrl}/session`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({}), + }); + const session = await sessionRes.json(); + saveJson("session-create", session); + const sessionId = session.id; + console.log(` Session ID: ${sessionId}`); + + // Use anthropic provider with a cheap model for testing + const model = { providerID: "anthropic", modelID: "claude-haiku-4-5" }; + + // 4. Send first message (simple text response) - use prompt_async + wait + console.log("Sending message 1 (simple text)..."); + await fetch(`${baseUrl}/session/${sessionId}/prompt_async`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + model, + parts: [{ type: "text", text: "Respond with exactly: 'Hello from OpenCode'. Nothing else." }], + }), + }); + + // Wait for the response to be fully processed + console.log(" Waiting for message 1 to complete..."); + await waitForIdle(baseUrl, sessionId, 60_000); + await new Promise((r) => setTimeout(r, 1000)); + + // 5. Get messages after first request + const messagesAfter1 = await fetch(`${baseUrl}/session/${sessionId}/message`).then((r) => + r.json() + ); + saveJson("messages-after-1", messagesAfter1); + console.log(` Got ${messagesAfter1.length} messages after msg 1`); + + // 6. Send second message (ask for a tool call - file write) - use prompt_async + console.log("Sending message 2 (should trigger tool calls)..."); + await fetch(`${baseUrl}/session/${sessionId}/prompt_async`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + model, + parts: [ + { + type: "text", + text: "List the files in the current directory. Use the list/ls tool. Only list the top-level contents, do not recurse.", + }, + ], + }), + }); + + // Wait for completion (longer timeout for tool calls + permissions) + console.log(" Waiting for message 2 to complete..."); + try { + await waitForIdle(baseUrl, sessionId, 120_000); + } catch (e) { + console.log(" Warning: timed out waiting for idle, capturing what we have..."); + } + await new Promise((r) => setTimeout(r, 2000)); + + // 7. Get messages after second request + const messagesAfter2 = await fetch(`${baseUrl}/session/${sessionId}/message`).then((r) => + r.json() + ); + saveJson("messages-after-2", messagesAfter2); + console.log(` Got ${messagesAfter2.length} messages after msg 2`); + + // 8. Get session details + const sessionDetails = await fetch(`${baseUrl}/session/${sessionId}`).then((r) => r.json()); + saveJson("session-details", sessionDetails); + + // 9. Get session status + const sessionStatus = await fetch(`${baseUrl}/session/status`).then((r) => r.json()); + saveJson("session-status", sessionStatus); + + // 10. Stop SSE and save events + sseAbort.abort(); + await new Promise((r) => setTimeout(r, 500)); + saveJson("all-events", allEvents); + + // Filter events for this session + const sessionEvents = allEvents.filter( + (e) => e.properties?.sessionID === sessionId || + (e.type === "session.created" && e.properties?.info?.id === sessionId) + ); + saveJson("session-events", sessionEvents); + + console.log(`\nCapture complete! ${allEvents.length} total events, ${sessionEvents.length} session events.`); + console.log(`Output saved to: ${OUTPUT_DIR}/`); + } finally { + if (sseAbort) sseAbort.abort(); + child.kill("SIGTERM"); + await new Promise((r) => setTimeout(r, 1000)); + if (child.exitCode === null) child.kill("SIGKILL"); + } +} + +main().catch((err) => { + console.error("Fatal error:", err); + process.exit(1); +}); diff --git a/research/opencode-compat/capture-sandbox-agent.ts b/research/opencode-compat/capture-sandbox-agent.ts new file mode 100644 index 0000000..9d14ea7 --- /dev/null +++ b/research/opencode-compat/capture-sandbox-agent.ts @@ -0,0 +1,249 @@ +/** + * Capture sandbox-agent OpenCode compatibility API output for comparison. + * + * Usage: + * npx tsx capture-sandbox-agent.ts + * + * Starts sandbox-agent with mock agent, creates a session via /opencode API, + * sends 2 messages (text + tool call), and captures all events/messages. + */ +import { spawn, type ChildProcess } from "node:child_process"; +import { writeFileSync, mkdirSync, existsSync } from "node:fs"; +import { createServer, type AddressInfo } from "node:net"; +import { randomBytes } from "node:crypto"; + +const OUTPUT_DIR = new URL("./snapshots/sandbox-agent", import.meta.url).pathname; + +async function getFreePort(): Promise { + return new Promise((resolve, reject) => { + const server = createServer(); + server.unref(); + server.on("error", reject); + server.listen(0, "127.0.0.1", () => { + const address = server.address() as AddressInfo; + server.close(() => resolve(address.port)); + }); + }); +} + +async function waitForHealth(baseUrl: string, token: string, timeoutMs = 30_000): Promise { + const start = Date.now(); + while (Date.now() - start < timeoutMs) { + try { + const res = await fetch(`${baseUrl}/v1/health`, { + headers: { Authorization: `Bearer ${token}` }, + }); + if (res.ok) return; + } catch {} + await new Promise((r) => setTimeout(r, 300)); + } + throw new Error("Timed out waiting for sandbox-agent health"); +} + +function saveJson(name: string, data: unknown) { + if (!existsSync(OUTPUT_DIR)) mkdirSync(OUTPUT_DIR, { recursive: true }); + const path = `${OUTPUT_DIR}/${name}.json`; + writeFileSync(path, JSON.stringify(data, null, 2)); + console.log(` [saved] ${path}`); +} + +async function main() { + const port = await getFreePort(); + const host = "127.0.0.1"; + const baseUrl = `http://${host}:${port}`; + const opencodeUrl = `${baseUrl}/opencode`; + const token = randomBytes(24).toString("hex"); + + console.log(`Starting sandbox-agent on port ${port}...`); + + // Use the locally built binary, not the installed one + const binaryPath = new URL("../../target/release/sandbox-agent", import.meta.url).pathname; + const child: ChildProcess = spawn( + binaryPath, + ["server", "--host", host, "--port", String(port), "--token", token], + { + stdio: "pipe", + env: { + ...process.env, + SANDBOX_AGENT_SKIP_INSPECTOR: "1", + }, + } + ); + + let stderr = ""; + child.stderr?.on("data", (chunk) => { + stderr += chunk.toString(); + }); + + const allEvents: any[] = []; + let sseAbort: AbortController | null = null; + + try { + await waitForHealth(baseUrl, token); + console.log("sandbox-agent is healthy!"); + + // 1. Capture initial metadata via /opencode routes + const headers = { Authorization: `Bearer ${token}` }; + const [agentRes, configRes] = await Promise.all([ + fetch(`${opencodeUrl}/agent`, { headers }).then((r) => r.json()), + fetch(`${opencodeUrl}/config`, { headers }).then((r) => r.json()), + ]); + saveJson("metadata-agent", agentRes); + saveJson("metadata-config", configRes); + + // 2. Start SSE event collection + sseAbort = new AbortController(); + const ssePromise = (async () => { + try { + const res = await fetch(`${opencodeUrl}/event`, { + signal: sseAbort!.signal, + headers: { ...headers, Accept: "text/event-stream" }, + }); + if (!res.ok || !res.body) { + console.error("SSE connection failed:", res.status, await res.text()); + return; + } + const reader = res.body.getReader(); + const decoder = new TextDecoder(); + let buffer = ""; + + while (true) { + const { done, value } = await reader.read(); + if (done) break; + buffer += decoder.decode(value, { stream: true }); + + const lines = buffer.split("\n"); + buffer = lines.pop() || ""; + + for (const line of lines) { + if (line.startsWith("data: ")) { + try { + const parsed = JSON.parse(line.slice(6)); + allEvents.push(parsed); + } catch {} + } + } + } + } catch (err: any) { + if (err.name !== "AbortError") { + // ignore + } + } + })(); + + // Give SSE time to connect + await new Promise((r) => setTimeout(r, 500)); + + // 3. Create a session + console.log("Creating session..."); + const sessionRes = await fetch(`${opencodeUrl}/session`, { + method: "POST", + headers: { ...headers, "Content-Type": "application/json" }, + body: JSON.stringify({}), + }); + const session = await sessionRes.json(); + saveJson("session-create", session); + const sessionId = session.id; + console.log(` Session ID: ${sessionId}`); + + // 4. Send first message (simple text response) using mock agent's "echo" command + console.log("Sending message 1 (simple text - echo)..."); + const msg1Res = await fetch(`${opencodeUrl}/session/${sessionId}/prompt_async`, { + method: "POST", + headers: { ...headers, "Content-Type": "application/json" }, + body: JSON.stringify({ + model: { providerID: "sandbox-agent", modelID: "mock" }, + parts: [{ type: "text", text: "echo Hello from sandbox-agent" }], + }), + }); + console.log(` prompt_async status: ${msg1Res.status}`); + + // Wait for idle + console.log(" Waiting for message 1 to complete..."); + await waitForIdle(opencodeUrl, sessionId, headers, 30_000); + await new Promise((r) => setTimeout(r, 1000)); + + // 5. Get messages after first request + const messagesAfter1 = await fetch(`${opencodeUrl}/session/${sessionId}/message`, { headers }).then((r) => r.json()); + saveJson("messages-after-1", messagesAfter1); + console.log(` Got ${messagesAfter1.length} messages after msg 1`); + + // 6. Send second message (trigger tool calls) using mock agent's "tool" command + console.log("Sending message 2 (tool calls)..."); + const msg2Res = await fetch(`${opencodeUrl}/session/${sessionId}/prompt_async`, { + method: "POST", + headers: { ...headers, "Content-Type": "application/json" }, + body: JSON.stringify({ + model: { providerID: "sandbox-agent", modelID: "mock" }, + parts: [{ type: "text", text: "tool" }], + }), + }); + console.log(` prompt_async status: ${msg2Res.status}`); + + // Wait for completion + console.log(" Waiting for message 2 to complete..."); + await waitForIdle(opencodeUrl, sessionId, headers, 30_000); + await new Promise((r) => setTimeout(r, 1000)); + + // 7. Get messages after second request + const messagesAfter2 = await fetch(`${opencodeUrl}/session/${sessionId}/message`, { headers }).then((r) => r.json()); + saveJson("messages-after-2", messagesAfter2); + console.log(` Got ${messagesAfter2.length} messages after msg 2`); + + // 8. Get session details + const sessionDetails = await fetch(`${opencodeUrl}/session/${sessionId}`, { headers }).then((r) => r.json()); + saveJson("session-details", sessionDetails); + + // 9. Get session status + const sessionStatus = await fetch(`${opencodeUrl}/session/status`, { headers }).then((r) => r.json()); + saveJson("session-status", sessionStatus); + + // 10. Stop SSE and save events + sseAbort.abort(); + await new Promise((r) => setTimeout(r, 500)); + saveJson("all-events", allEvents); + + // Filter session events + const sessionEvents = allEvents.filter( + (e) => + e.properties?.sessionID === sessionId || + (e.type === "session.created" && e.properties?.info?.id === sessionId) + ); + saveJson("session-events", sessionEvents); + + console.log(`\nCapture complete! ${allEvents.length} total events, ${sessionEvents.length} session events.`); + console.log(`Output saved to: ${OUTPUT_DIR}/`); + } finally { + if (sseAbort) sseAbort.abort(); + child.kill("SIGTERM"); + await new Promise((r) => setTimeout(r, 1000)); + if (child.exitCode === null) child.kill("SIGKILL"); + } +} + +async function waitForIdle( + opencodeUrl: string, + sessionId: string, + headers: Record, + timeoutMs: number +): Promise { + const start = Date.now(); + await new Promise((r) => setTimeout(r, 500)); + while (Date.now() - start < timeoutMs) { + try { + const statusRes = await fetch(`${opencodeUrl}/session/status`, { headers }); + const statuses = await statusRes.json(); + const sessionStatus = statuses?.[sessionId]; + if (sessionStatus?.type === "idle" || sessionStatus === undefined) { + return; + } + } catch {} + await new Promise((r) => setTimeout(r, 300)); + } + throw new Error("Timed out waiting for session to become idle"); +} + +main().catch((err) => { + console.error("Fatal error:", err); + process.exit(1); +}); diff --git a/research/opencode-compat/snapshots/native/all-events.json b/research/opencode-compat/snapshots/native/all-events.json new file mode 100644 index 0000000..7156d8e --- /dev/null +++ b/research/opencode-compat/snapshots/native/all-events.json @@ -0,0 +1,1281 @@ +[ + { + "type": "server.connected", + "properties": {} + }, + { + "type": "session.created", + "properties": { + "info": { + "id": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "slug": "witty-eagle", + "version": "1.1.49", + "projectID": "c4153c5335dc81f0e622888f1f387c4b84dc54d5", + "directory": "/home/nathan/sandbox-agent/research/opencode-compat", + "title": "New session - 2026-02-06T06:56:52.806Z", + "time": { + "created": 1770361012806, + "updated": 1770361012806 + } + } + } + }, + { + "type": "session.updated", + "properties": { + "info": { + "id": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "slug": "witty-eagle", + "version": "1.1.49", + "projectID": "c4153c5335dc81f0e622888f1f387c4b84dc54d5", + "directory": "/home/nathan/sandbox-agent/research/opencode-compat", + "title": "New session - 2026-02-06T06:56:52.806Z", + "time": { + "created": 1770361012806, + "updated": 1770361012806 + } + } + } + }, + { + "type": "message.updated", + "properties": { + "info": { + "id": "msg_c31bd424c001ICzhibLcSkazYE", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "user", + "time": { + "created": 1770361012812 + }, + "agent": "build", + "model": { + "providerID": "anthropic", + "modelID": "claude-haiku-4-5" + } + } + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd424c002I8ASgZXZGMnUf2", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd424c001ICzhibLcSkazYE", + "type": "text", + "text": "Respond with exactly: 'Hello from OpenCode'. Nothing else." + } + } + }, + { + "type": "session.updated", + "properties": { + "info": { + "id": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "slug": "witty-eagle", + "version": "1.1.49", + "projectID": "c4153c5335dc81f0e622888f1f387c4b84dc54d5", + "directory": "/home/nathan/sandbox-agent/research/opencode-compat", + "title": "New session - 2026-02-06T06:56:52.806Z", + "time": { + "created": 1770361012806, + "updated": 1770361012825 + } + } + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "busy" + } + } + }, + { + "type": "message.updated", + "properties": { + "info": { + "id": "msg_c31bd4260001o9JzwTa1Ops17t", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "assistant", + "time": { + "created": 1770361012832 + }, + "parentID": "msg_c31bd424c001ICzhibLcSkazYE", + "modelID": "claude-haiku-4-5", + "providerID": "anthropic", + "mode": "build", + "agent": "build", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent" + }, + "cost": 0, + "tokens": { + "input": 0, + "output": 0, + "reasoning": 0, + "cache": { + "read": 0, + "write": 0 + } + } + } + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "busy" + } + } + }, + { + "type": "message.updated", + "properties": { + "info": { + "id": "msg_c31bd424c001ICzhibLcSkazYE", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "user", + "time": { + "created": 1770361012812 + }, + "summary": { + "diffs": [] + }, + "agent": "build", + "model": { + "providerID": "anthropic", + "modelID": "claude-haiku-4-5" + } + } + } + }, + { + "type": "session.updated", + "properties": { + "info": { + "id": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "slug": "witty-eagle", + "version": "1.1.49", + "projectID": "c4153c5335dc81f0e622888f1f387c4b84dc54d5", + "directory": "/home/nathan/sandbox-agent/research/opencode-compat", + "title": "New session - 2026-02-06T06:56:52.806Z", + "time": { + "created": 1770361012806, + "updated": 1770361012862 + }, + "summary": { + "additions": 0, + "deletions": 0, + "files": 0 + } + } + } + }, + { + "type": "session.diff", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "diff": [] + } + }, + { + "type": "session.updated", + "properties": { + "info": { + "id": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "slug": "witty-eagle", + "version": "1.1.49", + "projectID": "c4153c5335dc81f0e622888f1f387c4b84dc54d5", + "directory": "/home/nathan/sandbox-agent/research/opencode-compat", + "title": "Hello from OpenCode", + "time": { + "created": 1770361012806, + "updated": 1770361012862 + }, + "summary": { + "additions": 0, + "deletions": 0, + "files": 0 + } + } + } + }, + { + "type": "message.updated", + "properties": { + "info": { + "id": "msg_c31bd424c001ICzhibLcSkazYE", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "user", + "time": { + "created": 1770361012812 + }, + "summary": { + "title": "Hello from OpenCode", + "diffs": [] + }, + "agent": "build", + "model": { + "providerID": "anthropic", + "modelID": "claude-haiku-4-5" + } + } + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd4779001QLU4EXzj63WQ4W", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4260001o9JzwTa1Ops17t", + "type": "step-start", + "snapshot": "302d31eedbdd77a5b1eb84e2fbc4e99e8b97e549" + } + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd477c001Gq3CWQQXR1h7fD", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4260001o9JzwTa1Ops17t", + "type": "text", + "text": "Hello from OpenCode", + "time": { + "start": 1770361014140 + } + }, + "delta": "Hello from OpenCode" + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd477c001Gq3CWQQXR1h7fD", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4260001o9JzwTa1Ops17t", + "type": "text", + "text": "Hello from OpenCode", + "time": { + "start": 1770361014146, + "end": 1770361014146 + } + } + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd4793001LdK7WQwiUgzctY", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4260001o9JzwTa1Ops17t", + "type": "step-finish", + "reason": "stop", + "snapshot": "302d31eedbdd77a5b1eb84e2fbc4e99e8b97e549", + "cost": 0, + "tokens": { + "input": 2, + "output": 7, + "reasoning": 0, + "cache": { + "read": 13540, + "write": 0 + } + } + } + } + }, + { + "type": "message.updated", + "properties": { + "info": { + "id": "msg_c31bd4260001o9JzwTa1Ops17t", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "assistant", + "time": { + "created": 1770361012832 + }, + "parentID": "msg_c31bd424c001ICzhibLcSkazYE", + "modelID": "claude-haiku-4-5", + "providerID": "anthropic", + "mode": "build", + "agent": "build", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent" + }, + "cost": 0, + "tokens": { + "input": 2, + "output": 7, + "reasoning": 0, + "cache": { + "read": 13540, + "write": 0 + } + }, + "finish": "stop" + } + } + }, + { + "type": "message.updated", + "properties": { + "info": { + "id": "msg_c31bd4260001o9JzwTa1Ops17t", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "assistant", + "time": { + "created": 1770361012832, + "completed": 1770361014171 + }, + "parentID": "msg_c31bd424c001ICzhibLcSkazYE", + "modelID": "claude-haiku-4-5", + "providerID": "anthropic", + "mode": "build", + "agent": "build", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent" + }, + "cost": 0, + "tokens": { + "input": 2, + "output": 7, + "reasoning": 0, + "cache": { + "read": 13540, + "write": 0 + } + }, + "finish": "stop" + } + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "busy" + } + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "idle" + } + } + }, + { + "type": "session.idle", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms" + } + }, + { + "type": "message.updated", + "properties": { + "info": { + "id": "msg_c31bd424c001ICzhibLcSkazYE", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "user", + "time": { + "created": 1770361012812 + }, + "summary": { + "title": "Hello from OpenCode", + "diffs": [] + }, + "agent": "build", + "model": { + "providerID": "anthropic", + "modelID": "claude-haiku-4-5" + } + } + } + }, + { + "type": "session.updated", + "properties": { + "info": { + "id": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "slug": "witty-eagle", + "version": "1.1.49", + "projectID": "c4153c5335dc81f0e622888f1f387c4b84dc54d5", + "directory": "/home/nathan/sandbox-agent/research/opencode-compat", + "title": "Hello from OpenCode", + "time": { + "created": 1770361012806, + "updated": 1770361014177 + }, + "summary": { + "additions": 0, + "deletions": 0, + "files": 0 + } + } + } + }, + { + "type": "session.diff", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "diff": [] + } + }, + { + "type": "message.updated", + "properties": { + "info": { + "id": "msg_c31bd4c1b001xWoyoqqLd1Y28L", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "user", + "time": { + "created": 1770361015323 + }, + "agent": "build", + "model": { + "providerID": "anthropic", + "modelID": "claude-haiku-4-5" + } + } + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd4c1b00250iBBBWSNWnE4G", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4c1b001xWoyoqqLd1Y28L", + "type": "text", + "text": "List the files in the current directory. Use the list/ls tool. Only list the top-level contents, do not recurse." + } + } + }, + { + "type": "session.updated", + "properties": { + "info": { + "id": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "slug": "witty-eagle", + "version": "1.1.49", + "projectID": "c4153c5335dc81f0e622888f1f387c4b84dc54d5", + "directory": "/home/nathan/sandbox-agent/research/opencode-compat", + "title": "Hello from OpenCode", + "time": { + "created": 1770361012806, + "updated": 1770361015323 + }, + "summary": { + "additions": 0, + "deletions": 0, + "files": 0 + } + } + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "busy" + } + } + }, + { + "type": "message.updated", + "properties": { + "info": { + "id": "msg_c31bd4c1c001iWeGOWfwf5UD2Y", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "assistant", + "time": { + "created": 1770361015324 + }, + "parentID": "msg_c31bd4c1b001xWoyoqqLd1Y28L", + "modelID": "claude-haiku-4-5", + "providerID": "anthropic", + "mode": "build", + "agent": "build", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent" + }, + "cost": 0, + "tokens": { + "input": 0, + "output": 0, + "reasoning": 0, + "cache": { + "read": 0, + "write": 0 + } + } + } + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "busy" + } + } + }, + { + "type": "message.updated", + "properties": { + "info": { + "id": "msg_c31bd4c1b001xWoyoqqLd1Y28L", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "user", + "time": { + "created": 1770361015323 + }, + "summary": { + "diffs": [] + }, + "agent": "build", + "model": { + "providerID": "anthropic", + "modelID": "claude-haiku-4-5" + } + } + } + }, + { + "type": "session.updated", + "properties": { + "info": { + "id": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "slug": "witty-eagle", + "version": "1.1.49", + "projectID": "c4153c5335dc81f0e622888f1f387c4b84dc54d5", + "directory": "/home/nathan/sandbox-agent/research/opencode-compat", + "title": "Hello from OpenCode", + "time": { + "created": 1770361012806, + "updated": 1770361015333 + }, + "summary": { + "additions": 0, + "deletions": 0, + "files": 0 + } + } + } + }, + { + "type": "session.diff", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "diff": [] + } + }, + { + "type": "message.updated", + "properties": { + "info": { + "id": "msg_c31bd4c1b001xWoyoqqLd1Y28L", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "user", + "time": { + "created": 1770361015323 + }, + "summary": { + "title": "List directory contents", + "diffs": [] + }, + "agent": "build", + "model": { + "providerID": "anthropic", + "modelID": "claude-haiku-4-5" + } + } + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd4ef7001AOk3Asd0o7j5fD", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4c1c001iWeGOWfwf5UD2Y", + "type": "step-start", + "snapshot": "8793fb311ffba7bff79cd1b25f87942c22349ae3" + } + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd4ef8001ovzy76OXAT5Qin", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4c1c001iWeGOWfwf5UD2Y", + "type": "tool", + "callID": "toolu_017THj1iZNELroZgmFbqC6Ma", + "tool": "bash", + "state": { + "status": "pending", + "input": {}, + "raw": "" + } + } + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd4ef8001ovzy76OXAT5Qin", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4c1c001iWeGOWfwf5UD2Y", + "type": "tool", + "callID": "toolu_017THj1iZNELroZgmFbqC6Ma", + "tool": "bash", + "state": { + "status": "running", + "input": { + "command": "ls -la", + "description": "List files in current directory" + }, + "time": { + "start": 1770361016309 + } + } + } + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd4ef8001ovzy76OXAT5Qin", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4c1c001iWeGOWfwf5UD2Y", + "type": "tool", + "callID": "toolu_017THj1iZNELroZgmFbqC6Ma", + "tool": "bash", + "state": { + "status": "running", + "input": { + "command": "ls -la", + "description": "List files in current directory" + }, + "metadata": { + "output": "", + "description": "List files in current directory" + }, + "time": { + "start": 1770361016328 + } + } + } + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd4ef8001ovzy76OXAT5Qin", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4c1c001iWeGOWfwf5UD2Y", + "type": "tool", + "callID": "toolu_017THj1iZNELroZgmFbqC6Ma", + "tool": "bash", + "state": { + "status": "running", + "input": { + "command": "ls -la", + "description": "List files in current directory" + }, + "metadata": { + "output": "total 24\ndrwxr-xr-x 3 nathan nathan 4096 Feb 5 22:56 .\ndrwxr-xr-x 5 nathan nathan 4096 Feb 5 22:44 ..\n-rw-r--r-- 1 nathan nathan 9120 Feb 5 22:56 capture-native.ts\ndrwxr-xr-x 3 nathan nathan 4096 Feb 5 22:45 snapshots\n", + "description": "List files in current directory" + }, + "time": { + "start": 1770361016329 + } + } + } + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd4ef8001ovzy76OXAT5Qin", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4c1c001iWeGOWfwf5UD2Y", + "type": "tool", + "callID": "toolu_017THj1iZNELroZgmFbqC6Ma", + "tool": "bash", + "state": { + "status": "completed", + "input": { + "command": "ls -la", + "description": "List files in current directory" + }, + "output": "total 24\ndrwxr-xr-x 3 nathan nathan 4096 Feb 5 22:56 .\ndrwxr-xr-x 5 nathan nathan 4096 Feb 5 22:44 ..\n-rw-r--r-- 1 nathan nathan 9120 Feb 5 22:56 capture-native.ts\ndrwxr-xr-x 3 nathan nathan 4096 Feb 5 22:45 snapshots\n", + "title": "List files in current directory", + "metadata": { + "output": "total 24\ndrwxr-xr-x 3 nathan nathan 4096 Feb 5 22:56 .\ndrwxr-xr-x 5 nathan nathan 4096 Feb 5 22:44 ..\n-rw-r--r-- 1 nathan nathan 9120 Feb 5 22:56 capture-native.ts\ndrwxr-xr-x 3 nathan nathan 4096 Feb 5 22:45 snapshots\n", + "exit": 0, + "description": "List files in current directory", + "truncated": false + }, + "time": { + "start": 1770361016309, + "end": 1770361016330 + } + } + } + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd500e001MnhwCXaWI2pfAw", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4c1c001iWeGOWfwf5UD2Y", + "type": "step-finish", + "reason": "tool-calls", + "snapshot": "8793fb311ffba7bff79cd1b25f87942c22349ae3", + "cost": 0, + "tokens": { + "input": 2, + "output": 78, + "reasoning": 0, + "cache": { + "read": 13547, + "write": 31 + } + } + } + } + }, + { + "type": "message.updated", + "properties": { + "info": { + "id": "msg_c31bd4c1c001iWeGOWfwf5UD2Y", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "assistant", + "time": { + "created": 1770361015324 + }, + "parentID": "msg_c31bd4c1b001xWoyoqqLd1Y28L", + "modelID": "claude-haiku-4-5", + "providerID": "anthropic", + "mode": "build", + "agent": "build", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent" + }, + "cost": 0, + "tokens": { + "input": 2, + "output": 78, + "reasoning": 0, + "cache": { + "read": 13547, + "write": 31 + } + }, + "finish": "tool-calls" + } + } + }, + { + "type": "message.updated", + "properties": { + "info": { + "id": "msg_c31bd4c1c001iWeGOWfwf5UD2Y", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "assistant", + "time": { + "created": 1770361015324, + "completed": 1770361016339 + }, + "parentID": "msg_c31bd4c1b001xWoyoqqLd1Y28L", + "modelID": "claude-haiku-4-5", + "providerID": "anthropic", + "mode": "build", + "agent": "build", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent" + }, + "cost": 0, + "tokens": { + "input": 2, + "output": 78, + "reasoning": 0, + "cache": { + "read": 13547, + "write": 31 + } + }, + "finish": "tool-calls" + } + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "busy" + } + } + }, + { + "type": "message.updated", + "properties": { + "info": { + "id": "msg_c31bd5014001lZUdLPnaNuUzrb", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "assistant", + "time": { + "created": 1770361016340 + }, + "parentID": "msg_c31bd4c1b001xWoyoqqLd1Y28L", + "modelID": "claude-haiku-4-5", + "providerID": "anthropic", + "mode": "build", + "agent": "build", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent" + }, + "cost": 0, + "tokens": { + "input": 0, + "output": 0, + "reasoning": 0, + "cache": { + "read": 0, + "write": 0 + } + } + } + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "busy" + } + } + }, + { + "type": "message.updated", + "properties": { + "info": { + "id": "msg_c31bd4c1b001xWoyoqqLd1Y28L", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "user", + "time": { + "created": 1770361015323 + }, + "summary": { + "title": "List directory contents", + "diffs": [] + }, + "agent": "build", + "model": { + "providerID": "anthropic", + "modelID": "claude-haiku-4-5" + } + } + } + }, + { + "type": "session.updated", + "properties": { + "info": { + "id": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "slug": "witty-eagle", + "version": "1.1.49", + "projectID": "c4153c5335dc81f0e622888f1f387c4b84dc54d5", + "directory": "/home/nathan/sandbox-agent/research/opencode-compat", + "title": "Hello from OpenCode", + "time": { + "created": 1770361012806, + "updated": 1770361016350 + }, + "summary": { + "additions": 0, + "deletions": 0, + "files": 0 + } + } + } + }, + { + "type": "session.diff", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "diff": [] + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd53580017z4yaEbtkZX0zx", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd5014001lZUdLPnaNuUzrb", + "type": "step-start", + "snapshot": "8793fb311ffba7bff79cd1b25f87942c22349ae3" + } + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd53580021848cNw3geDcGF", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd5014001lZUdLPnaNuUzrb", + "type": "text", + "text": "Here", + "time": { + "start": 1770361017176 + } + }, + "delta": "Here" + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd53580021848cNw3geDcGF", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd5014001lZUdLPnaNuUzrb", + "type": "text", + "text": "Here are the top", + "time": { + "start": 1770361017176 + } + }, + "delta": " are the top" + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd53580021848cNw3geDcGF", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd5014001lZUdLPnaNuUzrb", + "type": "text", + "text": "Here are the top-level contents", + "time": { + "start": 1770361017176 + } + }, + "delta": "-level contents" + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd53580021848cNw3geDcGF", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd5014001lZUdLPnaNuUzrb", + "type": "text", + "text": "Here are the top-level contents of the current directory:\n\n-", + "time": { + "start": 1770361017176 + } + }, + "delta": " of the current directory:\n\n-" + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd53580021848cNw3geDcGF", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd5014001lZUdLPnaNuUzrb", + "type": "text", + "text": "Here are the top-level contents of the current directory:\n\n- **", + "time": { + "start": 1770361017176 + } + }, + "delta": " **" + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd53580021848cNw3geDcGF", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd5014001lZUdLPnaNuUzrb", + "type": "text", + "text": "Here are the top-level contents of the current directory:\n\n- **capture-native.ts** - A", + "time": { + "start": 1770361017176 + } + }, + "delta": "capture-native.ts** - A" + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd53580021848cNw3geDcGF", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd5014001lZUdLPnaNuUzrb", + "type": "text", + "text": "Here are the top-level contents of the current directory:\n\n- **capture-native.ts** - A TypeScript file", + "time": { + "start": 1770361017176 + } + }, + "delta": " TypeScript file" + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd53580021848cNw3geDcGF", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd5014001lZUdLPnaNuUzrb", + "type": "text", + "text": "Here are the top-level contents of the current directory:\n\n- **capture-native.ts** - A TypeScript file\n- **snapshots/**", + "time": { + "start": 1770361017176 + } + }, + "delta": "\n- **snapshots/**" + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd53580021848cNw3geDcGF", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd5014001lZUdLPnaNuUzrb", + "type": "text", + "text": "Here are the top-level contents of the current directory:\n\n- **capture-native.ts** - A TypeScript file\n- **snapshots/** - A directory", + "time": { + "start": 1770361017176 + } + }, + "delta": " - A directory" + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd53580021848cNw3geDcGF", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd5014001lZUdLPnaNuUzrb", + "type": "text", + "text": "Here are the top-level contents of the current directory:\n\n- **capture-native.ts** - A TypeScript file\n- **snapshots/** - A directory", + "time": { + "start": 1770361017436, + "end": 1770361017436 + } + } + } + }, + { + "type": "message.part.updated", + "properties": { + "part": { + "id": "prt_c31bd546d001cppsZFrg2ZJy7S", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd5014001lZUdLPnaNuUzrb", + "type": "step-finish", + "reason": "stop", + "snapshot": "8793fb311ffba7bff79cd1b25f87942c22349ae3", + "cost": 0, + "tokens": { + "input": 5, + "output": 38, + "reasoning": 0, + "cache": { + "read": 13578, + "write": 207 + } + } + } + } + }, + { + "type": "message.updated", + "properties": { + "info": { + "id": "msg_c31bd5014001lZUdLPnaNuUzrb", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "assistant", + "time": { + "created": 1770361016340 + }, + "parentID": "msg_c31bd4c1b001xWoyoqqLd1Y28L", + "modelID": "claude-haiku-4-5", + "providerID": "anthropic", + "mode": "build", + "agent": "build", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent" + }, + "cost": 0, + "tokens": { + "input": 5, + "output": 38, + "reasoning": 0, + "cache": { + "read": 13578, + "write": 207 + } + }, + "finish": "stop" + } + } + }, + { + "type": "message.updated", + "properties": { + "info": { + "id": "msg_c31bd5014001lZUdLPnaNuUzrb", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "assistant", + "time": { + "created": 1770361016340, + "completed": 1770361017458 + }, + "parentID": "msg_c31bd4c1b001xWoyoqqLd1Y28L", + "modelID": "claude-haiku-4-5", + "providerID": "anthropic", + "mode": "build", + "agent": "build", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent" + }, + "cost": 0, + "tokens": { + "input": 5, + "output": 38, + "reasoning": 0, + "cache": { + "read": 13578, + "write": 207 + } + }, + "finish": "stop" + } + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "busy" + } + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "idle" + } + } + }, + { + "type": "session.idle", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms" + } + }, + { + "type": "message.updated", + "properties": { + "info": { + "id": "msg_c31bd4c1b001xWoyoqqLd1Y28L", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "user", + "time": { + "created": 1770361015323 + }, + "summary": { + "title": "List directory contents", + "diffs": [] + }, + "agent": "build", + "model": { + "providerID": "anthropic", + "modelID": "claude-haiku-4-5" + } + } + } + }, + { + "type": "session.updated", + "properties": { + "info": { + "id": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "slug": "witty-eagle", + "version": "1.1.49", + "projectID": "c4153c5335dc81f0e622888f1f387c4b84dc54d5", + "directory": "/home/nathan/sandbox-agent/research/opencode-compat", + "title": "Hello from OpenCode", + "time": { + "created": 1770361012806, + "updated": 1770361017462 + }, + "summary": { + "additions": 0, + "deletions": 0, + "files": 0 + } + } + } + }, + { + "type": "session.diff", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "diff": [] + } + } +] \ No newline at end of file diff --git a/research/opencode-compat/snapshots/native/message-1-response.json b/research/opencode-compat/snapshots/native/message-1-response.json new file mode 100644 index 0000000..2cfeb88 --- /dev/null +++ b/research/opencode-compat/snapshots/native/message-1-response.json @@ -0,0 +1,69 @@ +{ + "info": { + "id": "msg_c31b8e048001p0fSvme0VWmKR0", + "sessionID": "ses_3ce471fc8ffeS9ZUpB7rVDen7k", + "role": "assistant", + "time": { + "created": 1770360725576, + "completed": 1770360727252 + }, + "parentID": "msg_c31b8e040001pIkL4AzVtzdVRd", + "modelID": "claude-haiku-4-5", + "providerID": "anthropic", + "mode": "build", + "agent": "build", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent" + }, + "cost": 0, + "tokens": { + "input": 2, + "output": 7, + "reasoning": 0, + "cache": { + "read": 0, + "write": 13540 + } + }, + "finish": "stop" + }, + "parts": [ + { + "id": "prt_c31b8e6b10012vw5mZVWX51UQm", + "sessionID": "ses_3ce471fc8ffeS9ZUpB7rVDen7k", + "messageID": "msg_c31b8e048001p0fSvme0VWmKR0", + "type": "step-start", + "snapshot": "f93f1b3f790c9b1fe51007d1b4a46bcb2d528a91" + }, + { + "id": "prt_c31b8e6b1002OBaD5M55iOVva6", + "sessionID": "ses_3ce471fc8ffeS9ZUpB7rVDen7k", + "messageID": "msg_c31b8e048001p0fSvme0VWmKR0", + "type": "text", + "text": "Hello from OpenCode", + "time": { + "start": 1770360727218, + "end": 1770360727218 + } + }, + { + "id": "prt_c31b8e6cd0012b1geOngJvrf2q", + "sessionID": "ses_3ce471fc8ffeS9ZUpB7rVDen7k", + "messageID": "msg_c31b8e048001p0fSvme0VWmKR0", + "type": "step-finish", + "reason": "stop", + "snapshot": "f93f1b3f790c9b1fe51007d1b4a46bcb2d528a91", + "cost": 0, + "tokens": { + "input": 2, + "output": 7, + "reasoning": 0, + "cache": { + "read": 0, + "write": 13540 + } + } + } + ] +} \ No newline at end of file diff --git a/research/opencode-compat/snapshots/native/message-2-response.json b/research/opencode-compat/snapshots/native/message-2-response.json new file mode 100644 index 0000000..19c5b2c --- /dev/null +++ b/research/opencode-compat/snapshots/native/message-2-response.json @@ -0,0 +1,52 @@ +{ + "info": { + "id": "msg_c31b349c3001C3jUz57fj5vRae", + "sessionID": "ses_3ce4cbd76ffeHVa3mLvB00FXDV", + "role": "assistant", + "time": { + "created": 1770360359363, + "completed": 1770360359565 + }, + "error": { + "name": "APIError", + "data": { + "message": "Unauthorized: {\"type\":\"error\",\"error\":{\"type\":\"AuthError\",\"message\":\"Invalid API key.\"}}", + "statusCode": 401, + "isRetryable": false, + "responseHeaders": { + "cf-placement": "local-SJC", + "cf-ray": "9c98b01658355024-SJC", + "connection": "keep-alive", + "content-length": "74", + "content-type": "text/plain;charset=UTF-8", + "date": "Fri, 06 Feb 2026 06:45:59 GMT", + "server": "cloudflare" + }, + "responseBody": "{\"type\":\"error\",\"error\":{\"type\":\"AuthError\",\"message\":\"Invalid API key.\"}}", + "metadata": { + "url": "https://opencode.ai/zen/v1/models/gemini-3-pro:streamGenerateContent?alt=sse" + } + } + }, + "parentID": "msg_c31b349c2001kJD7I7MRSAVo57", + "modelID": "gemini-3-pro", + "providerID": "opencode", + "mode": "build", + "agent": "build", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent" + }, + "cost": 0, + "tokens": { + "input": 0, + "output": 0, + "reasoning": 0, + "cache": { + "read": 0, + "write": 0 + } + } + }, + "parts": [] +} \ No newline at end of file diff --git a/research/opencode-compat/snapshots/native/messages-after-1.json b/research/opencode-compat/snapshots/native/messages-after-1.json new file mode 100644 index 0000000..0daa794 --- /dev/null +++ b/research/opencode-compat/snapshots/native/messages-after-1.json @@ -0,0 +1,99 @@ +[ + { + "info": { + "id": "msg_c31bd424c001ICzhibLcSkazYE", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "user", + "time": { + "created": 1770361012812 + }, + "summary": { + "title": "Hello from OpenCode", + "diffs": [] + }, + "agent": "build", + "model": { + "providerID": "anthropic", + "modelID": "claude-haiku-4-5" + } + }, + "parts": [ + { + "id": "prt_c31bd424c002I8ASgZXZGMnUf2", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd424c001ICzhibLcSkazYE", + "type": "text", + "text": "Respond with exactly: 'Hello from OpenCode'. Nothing else." + } + ] + }, + { + "info": { + "id": "msg_c31bd4260001o9JzwTa1Ops17t", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "assistant", + "time": { + "created": 1770361012832, + "completed": 1770361014171 + }, + "parentID": "msg_c31bd424c001ICzhibLcSkazYE", + "modelID": "claude-haiku-4-5", + "providerID": "anthropic", + "mode": "build", + "agent": "build", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent" + }, + "cost": 0, + "tokens": { + "input": 2, + "output": 7, + "reasoning": 0, + "cache": { + "read": 13540, + "write": 0 + } + }, + "finish": "stop" + }, + "parts": [ + { + "id": "prt_c31bd4779001QLU4EXzj63WQ4W", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4260001o9JzwTa1Ops17t", + "type": "step-start", + "snapshot": "302d31eedbdd77a5b1eb84e2fbc4e99e8b97e549" + }, + { + "id": "prt_c31bd477c001Gq3CWQQXR1h7fD", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4260001o9JzwTa1Ops17t", + "type": "text", + "text": "Hello from OpenCode", + "time": { + "start": 1770361014146, + "end": 1770361014146 + } + }, + { + "id": "prt_c31bd4793001LdK7WQwiUgzctY", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4260001o9JzwTa1Ops17t", + "type": "step-finish", + "reason": "stop", + "snapshot": "302d31eedbdd77a5b1eb84e2fbc4e99e8b97e549", + "cost": 0, + "tokens": { + "input": 2, + "output": 7, + "reasoning": 0, + "cache": { + "read": 13540, + "write": 0 + } + } + } + ] + } +] \ No newline at end of file diff --git a/research/opencode-compat/snapshots/native/messages-after-2.json b/research/opencode-compat/snapshots/native/messages-after-2.json new file mode 100644 index 0000000..886ba3d --- /dev/null +++ b/research/opencode-compat/snapshots/native/messages-after-2.json @@ -0,0 +1,281 @@ +[ + { + "info": { + "id": "msg_c31bd424c001ICzhibLcSkazYE", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "user", + "time": { + "created": 1770361012812 + }, + "summary": { + "title": "Hello from OpenCode", + "diffs": [] + }, + "agent": "build", + "model": { + "providerID": "anthropic", + "modelID": "claude-haiku-4-5" + } + }, + "parts": [ + { + "id": "prt_c31bd424c002I8ASgZXZGMnUf2", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd424c001ICzhibLcSkazYE", + "type": "text", + "text": "Respond with exactly: 'Hello from OpenCode'. Nothing else." + } + ] + }, + { + "info": { + "id": "msg_c31bd4260001o9JzwTa1Ops17t", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "assistant", + "time": { + "created": 1770361012832, + "completed": 1770361014171 + }, + "parentID": "msg_c31bd424c001ICzhibLcSkazYE", + "modelID": "claude-haiku-4-5", + "providerID": "anthropic", + "mode": "build", + "agent": "build", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent" + }, + "cost": 0, + "tokens": { + "input": 2, + "output": 7, + "reasoning": 0, + "cache": { + "read": 13540, + "write": 0 + } + }, + "finish": "stop" + }, + "parts": [ + { + "id": "prt_c31bd4779001QLU4EXzj63WQ4W", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4260001o9JzwTa1Ops17t", + "type": "step-start", + "snapshot": "302d31eedbdd77a5b1eb84e2fbc4e99e8b97e549" + }, + { + "id": "prt_c31bd477c001Gq3CWQQXR1h7fD", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4260001o9JzwTa1Ops17t", + "type": "text", + "text": "Hello from OpenCode", + "time": { + "start": 1770361014146, + "end": 1770361014146 + } + }, + { + "id": "prt_c31bd4793001LdK7WQwiUgzctY", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4260001o9JzwTa1Ops17t", + "type": "step-finish", + "reason": "stop", + "snapshot": "302d31eedbdd77a5b1eb84e2fbc4e99e8b97e549", + "cost": 0, + "tokens": { + "input": 2, + "output": 7, + "reasoning": 0, + "cache": { + "read": 13540, + "write": 0 + } + } + } + ] + }, + { + "info": { + "id": "msg_c31bd4c1b001xWoyoqqLd1Y28L", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "user", + "time": { + "created": 1770361015323 + }, + "summary": { + "title": "List directory contents", + "diffs": [] + }, + "agent": "build", + "model": { + "providerID": "anthropic", + "modelID": "claude-haiku-4-5" + } + }, + "parts": [ + { + "id": "prt_c31bd4c1b00250iBBBWSNWnE4G", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4c1b001xWoyoqqLd1Y28L", + "type": "text", + "text": "List the files in the current directory. Use the list/ls tool. Only list the top-level contents, do not recurse." + } + ] + }, + { + "info": { + "id": "msg_c31bd4c1c001iWeGOWfwf5UD2Y", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "assistant", + "time": { + "created": 1770361015324, + "completed": 1770361016339 + }, + "parentID": "msg_c31bd4c1b001xWoyoqqLd1Y28L", + "modelID": "claude-haiku-4-5", + "providerID": "anthropic", + "mode": "build", + "agent": "build", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent" + }, + "cost": 0, + "tokens": { + "input": 2, + "output": 78, + "reasoning": 0, + "cache": { + "read": 13547, + "write": 31 + } + }, + "finish": "tool-calls" + }, + "parts": [ + { + "id": "prt_c31bd4ef7001AOk3Asd0o7j5fD", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4c1c001iWeGOWfwf5UD2Y", + "type": "step-start", + "snapshot": "8793fb311ffba7bff79cd1b25f87942c22349ae3" + }, + { + "id": "prt_c31bd4ef8001ovzy76OXAT5Qin", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4c1c001iWeGOWfwf5UD2Y", + "type": "tool", + "callID": "toolu_017THj1iZNELroZgmFbqC6Ma", + "tool": "bash", + "state": { + "status": "completed", + "input": { + "command": "ls -la", + "description": "List files in current directory" + }, + "output": "total 24\ndrwxr-xr-x 3 nathan nathan 4096 Feb 5 22:56 .\ndrwxr-xr-x 5 nathan nathan 4096 Feb 5 22:44 ..\n-rw-r--r-- 1 nathan nathan 9120 Feb 5 22:56 capture-native.ts\ndrwxr-xr-x 3 nathan nathan 4096 Feb 5 22:45 snapshots\n", + "title": "List files in current directory", + "metadata": { + "output": "total 24\ndrwxr-xr-x 3 nathan nathan 4096 Feb 5 22:56 .\ndrwxr-xr-x 5 nathan nathan 4096 Feb 5 22:44 ..\n-rw-r--r-- 1 nathan nathan 9120 Feb 5 22:56 capture-native.ts\ndrwxr-xr-x 3 nathan nathan 4096 Feb 5 22:45 snapshots\n", + "exit": 0, + "description": "List files in current directory", + "truncated": false + }, + "time": { + "start": 1770361016309, + "end": 1770361016330 + } + } + }, + { + "id": "prt_c31bd500e001MnhwCXaWI2pfAw", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd4c1c001iWeGOWfwf5UD2Y", + "type": "step-finish", + "reason": "tool-calls", + "snapshot": "8793fb311ffba7bff79cd1b25f87942c22349ae3", + "cost": 0, + "tokens": { + "input": 2, + "output": 78, + "reasoning": 0, + "cache": { + "read": 13547, + "write": 31 + } + } + } + ] + }, + { + "info": { + "id": "msg_c31bd5014001lZUdLPnaNuUzrb", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "role": "assistant", + "time": { + "created": 1770361016340, + "completed": 1770361017458 + }, + "parentID": "msg_c31bd4c1b001xWoyoqqLd1Y28L", + "modelID": "claude-haiku-4-5", + "providerID": "anthropic", + "mode": "build", + "agent": "build", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent" + }, + "cost": 0, + "tokens": { + "input": 5, + "output": 38, + "reasoning": 0, + "cache": { + "read": 13578, + "write": 207 + } + }, + "finish": "stop" + }, + "parts": [ + { + "id": "prt_c31bd53580017z4yaEbtkZX0zx", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd5014001lZUdLPnaNuUzrb", + "type": "step-start", + "snapshot": "8793fb311ffba7bff79cd1b25f87942c22349ae3" + }, + { + "id": "prt_c31bd53580021848cNw3geDcGF", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd5014001lZUdLPnaNuUzrb", + "type": "text", + "text": "Here are the top-level contents of the current directory:\n\n- **capture-native.ts** - A TypeScript file\n- **snapshots/** - A directory", + "time": { + "start": 1770361017436, + "end": 1770361017436 + } + }, + { + "id": "prt_c31bd546d001cppsZFrg2ZJy7S", + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "messageID": "msg_c31bd5014001lZUdLPnaNuUzrb", + "type": "step-finish", + "reason": "stop", + "snapshot": "8793fb311ffba7bff79cd1b25f87942c22349ae3", + "cost": 0, + "tokens": { + "input": 5, + "output": 38, + "reasoning": 0, + "cache": { + "read": 13578, + "write": 207 + } + } + } + ] + } +] \ No newline at end of file diff --git a/research/opencode-compat/snapshots/native/metadata-agent.json b/research/opencode-compat/snapshots/native/metadata-agent.json new file mode 100644 index 0000000..fd13d2a --- /dev/null +++ b/research/opencode-compat/snapshots/native/metadata-agent.json @@ -0,0 +1,605 @@ +[ + { + "name": "build", + "description": "The default agent. Executes tools based on configured permissions.", + "options": {}, + "permission": [ + { + "permission": "*", + "action": "allow", + "pattern": "*" + }, + { + "permission": "doom_loop", + "action": "ask", + "pattern": "*" + }, + { + "permission": "external_directory", + "pattern": "*", + "action": "ask" + }, + { + "permission": "external_directory", + "pattern": "/home/nathan/.local/share/opencode/tool-output/*", + "action": "allow" + }, + { + "permission": "question", + "action": "deny", + "pattern": "*" + }, + { + "permission": "plan_enter", + "action": "deny", + "pattern": "*" + }, + { + "permission": "plan_exit", + "action": "deny", + "pattern": "*" + }, + { + "permission": "read", + "pattern": "*", + "action": "allow" + }, + { + "permission": "read", + "pattern": "*.env", + "action": "ask" + }, + { + "permission": "read", + "pattern": "*.env.*", + "action": "ask" + }, + { + "permission": "read", + "pattern": "*.env.example", + "action": "allow" + }, + { + "permission": "question", + "action": "allow", + "pattern": "*" + }, + { + "permission": "plan_enter", + "action": "allow", + "pattern": "*" + }, + { + "permission": "external_directory", + "pattern": "/home/nathan/.local/share/opencode/tool-output/*", + "action": "allow" + } + ], + "mode": "primary", + "native": true + }, + { + "name": "plan", + "description": "Plan mode. Disallows all edit tools.", + "options": {}, + "permission": [ + { + "permission": "*", + "action": "allow", + "pattern": "*" + }, + { + "permission": "doom_loop", + "action": "ask", + "pattern": "*" + }, + { + "permission": "external_directory", + "pattern": "*", + "action": "ask" + }, + { + "permission": "external_directory", + "pattern": "/home/nathan/.local/share/opencode/tool-output/*", + "action": "allow" + }, + { + "permission": "question", + "action": "deny", + "pattern": "*" + }, + { + "permission": "plan_enter", + "action": "deny", + "pattern": "*" + }, + { + "permission": "plan_exit", + "action": "deny", + "pattern": "*" + }, + { + "permission": "read", + "pattern": "*", + "action": "allow" + }, + { + "permission": "read", + "pattern": "*.env", + "action": "ask" + }, + { + "permission": "read", + "pattern": "*.env.*", + "action": "ask" + }, + { + "permission": "read", + "pattern": "*.env.example", + "action": "allow" + }, + { + "permission": "question", + "action": "allow", + "pattern": "*" + }, + { + "permission": "plan_exit", + "action": "allow", + "pattern": "*" + }, + { + "permission": "external_directory", + "pattern": "/home/nathan/.local/share/opencode/plans/*", + "action": "allow" + }, + { + "permission": "edit", + "pattern": "*", + "action": "deny" + }, + { + "permission": "edit", + "pattern": ".opencode/plans/*.md", + "action": "allow" + }, + { + "permission": "edit", + "pattern": "../.local/share/opencode/plans/*.md", + "action": "allow" + }, + { + "permission": "external_directory", + "pattern": "/home/nathan/.local/share/opencode/tool-output/*", + "action": "allow" + } + ], + "mode": "primary", + "native": true + }, + { + "name": "general", + "description": "General-purpose agent for researching complex questions and executing multi-step tasks. Use this agent to execute multiple units of work in parallel.", + "permission": [ + { + "permission": "*", + "action": "allow", + "pattern": "*" + }, + { + "permission": "doom_loop", + "action": "ask", + "pattern": "*" + }, + { + "permission": "external_directory", + "pattern": "*", + "action": "ask" + }, + { + "permission": "external_directory", + "pattern": "/home/nathan/.local/share/opencode/tool-output/*", + "action": "allow" + }, + { + "permission": "question", + "action": "deny", + "pattern": "*" + }, + { + "permission": "plan_enter", + "action": "deny", + "pattern": "*" + }, + { + "permission": "plan_exit", + "action": "deny", + "pattern": "*" + }, + { + "permission": "read", + "pattern": "*", + "action": "allow" + }, + { + "permission": "read", + "pattern": "*.env", + "action": "ask" + }, + { + "permission": "read", + "pattern": "*.env.*", + "action": "ask" + }, + { + "permission": "read", + "pattern": "*.env.example", + "action": "allow" + }, + { + "permission": "todoread", + "action": "deny", + "pattern": "*" + }, + { + "permission": "todowrite", + "action": "deny", + "pattern": "*" + }, + { + "permission": "external_directory", + "pattern": "/home/nathan/.local/share/opencode/tool-output/*", + "action": "allow" + } + ], + "options": {}, + "mode": "subagent", + "native": true + }, + { + "name": "explore", + "permission": [ + { + "permission": "*", + "action": "allow", + "pattern": "*" + }, + { + "permission": "doom_loop", + "action": "ask", + "pattern": "*" + }, + { + "permission": "external_directory", + "pattern": "*", + "action": "ask" + }, + { + "permission": "external_directory", + "pattern": "/home/nathan/.local/share/opencode/tool-output/*", + "action": "allow" + }, + { + "permission": "question", + "action": "deny", + "pattern": "*" + }, + { + "permission": "plan_enter", + "action": "deny", + "pattern": "*" + }, + { + "permission": "plan_exit", + "action": "deny", + "pattern": "*" + }, + { + "permission": "read", + "pattern": "*", + "action": "allow" + }, + { + "permission": "read", + "pattern": "*.env", + "action": "ask" + }, + { + "permission": "read", + "pattern": "*.env.*", + "action": "ask" + }, + { + "permission": "read", + "pattern": "*.env.example", + "action": "allow" + }, + { + "permission": "*", + "action": "deny", + "pattern": "*" + }, + { + "permission": "grep", + "action": "allow", + "pattern": "*" + }, + { + "permission": "glob", + "action": "allow", + "pattern": "*" + }, + { + "permission": "list", + "action": "allow", + "pattern": "*" + }, + { + "permission": "bash", + "action": "allow", + "pattern": "*" + }, + { + "permission": "webfetch", + "action": "allow", + "pattern": "*" + }, + { + "permission": "websearch", + "action": "allow", + "pattern": "*" + }, + { + "permission": "codesearch", + "action": "allow", + "pattern": "*" + }, + { + "permission": "read", + "action": "allow", + "pattern": "*" + }, + { + "permission": "external_directory", + "pattern": "/home/nathan/.local/share/opencode/tool-output/*", + "action": "allow" + }, + { + "permission": "external_directory", + "pattern": "/home/nathan/.local/share/opencode/tool-output/*", + "action": "allow" + } + ], + "description": "Fast agent specialized for exploring codebases. Use this when you need to quickly find files by patterns (eg. \"src/components/**/*.tsx\"), search code for keywords (eg. \"API endpoints\"), or answer questions about the codebase (eg. \"how do API endpoints work?\"). When calling this agent, specify the desired thoroughness level: \"quick\" for basic searches, \"medium\" for moderate exploration, or \"very thorough\" for comprehensive analysis across multiple locations and naming conventions.", + "prompt": "You are a file search specialist. You excel at thoroughly navigating and exploring codebases.\n\nYour strengths:\n- Rapidly finding files using glob patterns\n- Searching code and text with powerful regex patterns\n- Reading and analyzing file contents\n\nGuidelines:\n- Use Glob for broad file pattern matching\n- Use Grep for searching file contents with regex\n- Use Read when you know the specific file path you need to read\n- Use Bash for file operations like copying, moving, or listing directory contents\n- Adapt your search approach based on the thoroughness level specified by the caller\n- Return file paths as absolute paths in your final response\n- For clear communication, avoid using emojis\n- Do not create any files, or run bash commands that modify the user's system state in any way\n\nComplete the user's search request efficiently and report your findings clearly.\n", + "options": {}, + "mode": "subagent", + "native": true + }, + { + "name": "compaction", + "mode": "primary", + "native": true, + "hidden": true, + "prompt": "You are a helpful AI assistant tasked with summarizing conversations.\n\nWhen asked to summarize, provide a detailed but concise summary of the conversation. \nFocus on information that would be helpful for continuing the conversation, including:\n- What was done\n- What is currently being worked on\n- Which files are being modified\n- What needs to be done next\n- Key user requests, constraints, or preferences that should persist\n- Important technical decisions and why they were made\n\nYour summary should be comprehensive enough to provide context but concise enough to be quickly understood.\n", + "permission": [ + { + "permission": "*", + "action": "allow", + "pattern": "*" + }, + { + "permission": "doom_loop", + "action": "ask", + "pattern": "*" + }, + { + "permission": "external_directory", + "pattern": "*", + "action": "ask" + }, + { + "permission": "external_directory", + "pattern": "/home/nathan/.local/share/opencode/tool-output/*", + "action": "allow" + }, + { + "permission": "question", + "action": "deny", + "pattern": "*" + }, + { + "permission": "plan_enter", + "action": "deny", + "pattern": "*" + }, + { + "permission": "plan_exit", + "action": "deny", + "pattern": "*" + }, + { + "permission": "read", + "pattern": "*", + "action": "allow" + }, + { + "permission": "read", + "pattern": "*.env", + "action": "ask" + }, + { + "permission": "read", + "pattern": "*.env.*", + "action": "ask" + }, + { + "permission": "read", + "pattern": "*.env.example", + "action": "allow" + }, + { + "permission": "*", + "action": "deny", + "pattern": "*" + }, + { + "permission": "external_directory", + "pattern": "/home/nathan/.local/share/opencode/tool-output/*", + "action": "allow" + } + ], + "options": {} + }, + { + "name": "title", + "mode": "primary", + "options": {}, + "native": true, + "hidden": true, + "temperature": 0.5, + "permission": [ + { + "permission": "*", + "action": "allow", + "pattern": "*" + }, + { + "permission": "doom_loop", + "action": "ask", + "pattern": "*" + }, + { + "permission": "external_directory", + "pattern": "*", + "action": "ask" + }, + { + "permission": "external_directory", + "pattern": "/home/nathan/.local/share/opencode/tool-output/*", + "action": "allow" + }, + { + "permission": "question", + "action": "deny", + "pattern": "*" + }, + { + "permission": "plan_enter", + "action": "deny", + "pattern": "*" + }, + { + "permission": "plan_exit", + "action": "deny", + "pattern": "*" + }, + { + "permission": "read", + "pattern": "*", + "action": "allow" + }, + { + "permission": "read", + "pattern": "*.env", + "action": "ask" + }, + { + "permission": "read", + "pattern": "*.env.*", + "action": "ask" + }, + { + "permission": "read", + "pattern": "*.env.example", + "action": "allow" + }, + { + "permission": "*", + "action": "deny", + "pattern": "*" + }, + { + "permission": "external_directory", + "pattern": "/home/nathan/.local/share/opencode/tool-output/*", + "action": "allow" + } + ], + "prompt": "You are a title generator. You output ONLY a thread title. Nothing else.\n\n\nGenerate a brief title that would help the user find this conversation later.\n\nFollow all rules in \nUse the so you know what a good title looks like.\nYour output must be:\n- A single line\n- ≤50 characters\n- No explanations\n\n\n\n- you MUST use the same language as the user message you are summarizing\n- Title must be grammatically correct and read naturally - no word salad\n- Never include tool names in the title (e.g. \"read tool\", \"bash tool\", \"edit tool\")\n- Focus on the main topic or question the user needs to retrieve\n- Vary your phrasing - avoid repetitive patterns like always starting with \"Analyzing\"\n- When a file is mentioned, focus on WHAT the user wants to do WITH the file, not just that they shared it\n- Keep exact: technical terms, numbers, filenames, HTTP codes\n- Remove: the, this, my, a, an\n- Never assume tech stack\n- Never use tools\n- NEVER respond to questions, just generate a title for the conversation\n- The title should NEVER include \"summarizing\" or \"generating\" when generating a title\n- DO NOT SAY YOU CANNOT GENERATE A TITLE OR COMPLAIN ABOUT THE INPUT\n- Always output something meaningful, even if the input is minimal.\n- If the user message is short or conversational (e.g. \"hello\", \"lol\", \"what's up\", \"hey\"):\n → create a title that reflects the user's tone or intent (such as Greeting, Quick check-in, Light chat, Intro message, etc.)\n\n\n\n\"debug 500 errors in production\" → Debugging production 500 errors\n\"refactor user service\" → Refactoring user service\n\"why is app.js failing\" → app.js failure investigation\n\"implement rate limiting\" → Rate limiting implementation\n\"how do I connect postgres to my API\" → Postgres API connection\n\"best practices for React hooks\" → React hooks best practices\n\"@src/auth.ts can you add refresh token support\" → Auth refresh token support\n\"@utils/parser.ts this is broken\" → Parser bug fix\n\"look at @config.json\" → Config review\n\"@App.tsx add dark mode toggle\" → Dark mode toggle in App\n\n" + }, + { + "name": "summary", + "mode": "primary", + "options": {}, + "native": true, + "hidden": true, + "permission": [ + { + "permission": "*", + "action": "allow", + "pattern": "*" + }, + { + "permission": "doom_loop", + "action": "ask", + "pattern": "*" + }, + { + "permission": "external_directory", + "pattern": "*", + "action": "ask" + }, + { + "permission": "external_directory", + "pattern": "/home/nathan/.local/share/opencode/tool-output/*", + "action": "allow" + }, + { + "permission": "question", + "action": "deny", + "pattern": "*" + }, + { + "permission": "plan_enter", + "action": "deny", + "pattern": "*" + }, + { + "permission": "plan_exit", + "action": "deny", + "pattern": "*" + }, + { + "permission": "read", + "pattern": "*", + "action": "allow" + }, + { + "permission": "read", + "pattern": "*.env", + "action": "ask" + }, + { + "permission": "read", + "pattern": "*.env.*", + "action": "ask" + }, + { + "permission": "read", + "pattern": "*.env.example", + "action": "allow" + }, + { + "permission": "*", + "action": "deny", + "pattern": "*" + }, + { + "permission": "external_directory", + "pattern": "/home/nathan/.local/share/opencode/tool-output/*", + "action": "allow" + } + ], + "prompt": "Summarize what was done in this conversation. Write like a pull request description.\n\nRules:\n- 2-3 sentences max\n- Describe the changes made, not the process\n- Do not mention running tests, builds, or other validation steps\n- Do not explain what the user asked for\n- Write in first person (I added..., I fixed...)\n- Never ask questions or add new questions\n- If the conversation ends with an unanswered question to the user, preserve that exact question\n- If the conversation ends with an imperative statement or request to the user (e.g. \"Now please run the command and paste the console output\"), always include that exact request in the summary\n" + } +] \ No newline at end of file diff --git a/research/opencode-compat/snapshots/native/metadata-config.json b/research/opencode-compat/snapshots/native/metadata-config.json new file mode 100644 index 0000000..2170fdb --- /dev/null +++ b/research/opencode-compat/snapshots/native/metadata-config.json @@ -0,0 +1,102 @@ +{ + "agent": {}, + "mode": {}, + "plugin": [], + "command": {}, + "username": "nathan", + "keybinds": { + "leader": "ctrl+x", + "app_exit": "ctrl+c,ctrl+d,q", + "editor_open": "e", + "theme_list": "t", + "sidebar_toggle": "b", + "scrollbar_toggle": "none", + "username_toggle": "none", + "status_view": "s", + "session_export": "x", + "session_new": "n", + "session_list": "l", + "session_timeline": "g", + "session_fork": "none", + "session_rename": "ctrl+r", + "session_delete": "ctrl+d", + "stash_delete": "ctrl+d", + "model_provider_list": "ctrl+a", + "model_favorite_toggle": "ctrl+f", + "session_share": "none", + "session_unshare": "none", + "session_interrupt": "escape", + "session_compact": "c", + "messages_page_up": "pageup,ctrl+alt+b", + "messages_page_down": "pagedown,ctrl+alt+f", + "messages_line_up": "ctrl+alt+y", + "messages_line_down": "ctrl+alt+e", + "messages_half_page_up": "ctrl+alt+u", + "messages_half_page_down": "ctrl+alt+d", + "messages_first": "ctrl+g,home", + "messages_last": "ctrl+alt+g,end", + "messages_next": "none", + "messages_previous": "none", + "messages_last_user": "none", + "messages_copy": "y", + "messages_undo": "u", + "messages_redo": "r", + "messages_toggle_conceal": "h", + "tool_details": "none", + "model_list": "m", + "model_cycle_recent": "f2", + "model_cycle_recent_reverse": "shift+f2", + "model_cycle_favorite": "none", + "model_cycle_favorite_reverse": "none", + "command_list": "ctrl+p", + "agent_list": "a", + "agent_cycle": "tab", + "agent_cycle_reverse": "shift+tab", + "variant_cycle": "ctrl+t", + "input_clear": "ctrl+c", + "input_paste": "ctrl+v", + "input_submit": "return", + "input_newline": "shift+return,ctrl+return,alt+return,ctrl+j", + "input_move_left": "left,ctrl+b", + "input_move_right": "right,ctrl+f", + "input_move_up": "up", + "input_move_down": "down", + "input_select_left": "shift+left", + "input_select_right": "shift+right", + "input_select_up": "shift+up", + "input_select_down": "shift+down", + "input_line_home": "ctrl+a", + "input_line_end": "ctrl+e", + "input_select_line_home": "ctrl+shift+a", + "input_select_line_end": "ctrl+shift+e", + "input_visual_line_home": "alt+a", + "input_visual_line_end": "alt+e", + "input_select_visual_line_home": "alt+shift+a", + "input_select_visual_line_end": "alt+shift+e", + "input_buffer_home": "home", + "input_buffer_end": "end", + "input_select_buffer_home": "shift+home", + "input_select_buffer_end": "shift+end", + "input_delete_line": "ctrl+shift+d", + "input_delete_to_line_end": "ctrl+k", + "input_delete_to_line_start": "ctrl+u", + "input_backspace": "backspace,shift+backspace", + "input_delete": "ctrl+d,delete,shift+delete", + "input_undo": "ctrl+-,super+z", + "input_redo": "ctrl+.,super+shift+z", + "input_word_forward": "alt+f,alt+right,ctrl+right", + "input_word_backward": "alt+b,alt+left,ctrl+left", + "input_select_word_forward": "alt+shift+f,alt+shift+right", + "input_select_word_backward": "alt+shift+b,alt+shift+left", + "input_delete_word_forward": "alt+d,alt+delete,ctrl+delete", + "input_delete_word_backward": "ctrl+w,ctrl+backspace,alt+backspace", + "history_previous": "up", + "history_next": "down", + "session_child_cycle": "right", + "session_child_cycle_reverse": "left", + "session_parent": "up", + "terminal_suspend": "ctrl+z", + "terminal_title_toggle": "none", + "tips_toggle": "h" + } +} \ No newline at end of file diff --git a/research/opencode-compat/snapshots/native/metadata-providers.json b/research/opencode-compat/snapshots/native/metadata-providers.json new file mode 100644 index 0000000..69e05fc --- /dev/null +++ b/research/opencode-compat/snapshots/native/metadata-providers.json @@ -0,0 +1,3716 @@ +{ + "providers": [ + { + "id": "opencode", + "source": "api", + "name": "OpenCode Zen", + "env": [ + "OPENCODE_API_KEY" + ], + "options": {}, + "models": { + "glm-4.7": { + "id": "glm-4.7", + "providerID": "opencode", + "name": "GLM-4.7", + "family": "glm", + "api": { + "id": "glm-4.7", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai-compatible" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0.6, + "output": 2.2, + "cache": { + "read": 0.1, + "write": 0 + } + }, + "limit": { + "context": 204800, + "output": 131072 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": false, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": { + "field": "reasoning_content" + } + }, + "release_date": "2025-12-22", + "variants": {} + }, + "qwen3-coder": { + "id": "qwen3-coder", + "providerID": "opencode", + "name": "Qwen3 Coder", + "family": "qwen", + "api": { + "id": "qwen3-coder", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai-compatible" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0.45, + "output": 1.8, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 262144, + "output": 65536 + }, + "capabilities": { + "temperature": true, + "reasoning": false, + "attachment": false, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-07-23", + "variants": {} + }, + "claude-opus-4-1": { + "id": "claude-opus-4-1", + "providerID": "opencode", + "name": "Claude Opus 4.1", + "family": "claude-opus", + "api": { + "id": "claude-opus-4-1", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 15, + "output": 75, + "cache": { + "read": 1.5, + "write": 18.75 + } + }, + "limit": { + "context": 200000, + "output": 32000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-08-05", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 15999 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "kimi-k2": { + "id": "kimi-k2", + "providerID": "opencode", + "name": "Kimi K2", + "family": "kimi", + "api": { + "id": "kimi-k2", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai-compatible" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0.4, + "output": 2.5, + "cache": { + "read": 0.4, + "write": 0 + } + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "capabilities": { + "temperature": true, + "reasoning": false, + "attachment": false, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-09-05", + "variants": {} + }, + "gpt-5.2-codex": { + "id": "gpt-5.2-codex", + "providerID": "opencode", + "name": "GPT-5.2 Codex", + "family": "gpt-codex", + "api": { + "id": "gpt-5.2-codex", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 1.75, + "output": 14, + "cache": { + "read": 0.175, + "write": 0 + } + }, + "limit": { + "context": 400000, + "input": 272000, + "output": 128000 + }, + "capabilities": { + "temperature": false, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2026-01-14", + "variants": { + "low": { + "reasoningEffort": "low", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "medium": { + "reasoningEffort": "medium", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "high": { + "reasoningEffort": "high", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "xhigh": { + "reasoningEffort": "xhigh", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + } + } + }, + "gpt-5.1-codex": { + "id": "gpt-5.1-codex", + "providerID": "opencode", + "name": "GPT-5.1 Codex", + "family": "gpt-codex", + "api": { + "id": "gpt-5.1-codex", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 1.07, + "output": 8.5, + "cache": { + "read": 0.107, + "write": 0 + } + }, + "limit": { + "context": 400000, + "input": 272000, + "output": 128000 + }, + "capabilities": { + "temperature": false, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-11-13", + "variants": { + "low": { + "reasoningEffort": "low", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "medium": { + "reasoningEffort": "medium", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "high": { + "reasoningEffort": "high", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + } + } + }, + "claude-haiku-4-5": { + "id": "claude-haiku-4-5", + "providerID": "opencode", + "name": "Claude Haiku 4.5", + "family": "claude-haiku", + "api": { + "id": "claude-haiku-4-5", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 1, + "output": 5, + "cache": { + "read": 0.1, + "write": 1.25 + } + }, + "limit": { + "context": 200000, + "output": 64000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-10-15", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 16000 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "claude-opus-4-6": { + "id": "claude-opus-4-6", + "providerID": "opencode", + "name": "Claude Opus 4.6", + "family": "claude-opus", + "api": { + "id": "claude-opus-4-6", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 5, + "output": 25, + "cache": { + "read": 0.5, + "write": 6.25 + }, + "experimentalOver200K": { + "cache": { + "read": 1, + "write": 12.5 + }, + "input": 10, + "output": 37.5 + } + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2026-02-05", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 16000 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "trinity-large-preview-free": { + "id": "trinity-large-preview-free", + "providerID": "opencode", + "name": "Trinity Large Preview", + "family": "trinity", + "api": { + "id": "trinity-large-preview-free", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai-compatible" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 131072, + "output": 131072 + }, + "capabilities": { + "temperature": true, + "reasoning": false, + "attachment": false, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2026-01-28", + "variants": {} + }, + "claude-opus-4-5": { + "id": "claude-opus-4-5", + "providerID": "opencode", + "name": "Claude Opus 4.5", + "family": "claude-opus", + "api": { + "id": "claude-opus-4-5", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 5, + "output": 25, + "cache": { + "read": 0.5, + "write": 6.25 + } + }, + "limit": { + "context": 200000, + "output": 64000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-11-24", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 16000 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "kimi-k2.5": { + "id": "kimi-k2.5", + "providerID": "opencode", + "name": "Kimi K2.5", + "family": "kimi", + "api": { + "id": "kimi-k2.5", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai-compatible" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0.6, + "output": 3, + "cache": { + "read": 0.08, + "write": 0 + } + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": true, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": { + "field": "reasoning_content" + } + }, + "release_date": "2026-01-27", + "variants": {} + }, + "gemini-3-pro": { + "id": "gemini-3-pro", + "providerID": "opencode", + "name": "Gemini 3 Pro", + "family": "gemini-pro", + "api": { + "id": "gemini-3-pro", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/google" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 2, + "output": 12, + "cache": { + "read": 0.2, + "write": 0 + }, + "experimentalOver200K": { + "cache": { + "read": 0.4, + "write": 0 + }, + "input": 4, + "output": 18 + } + }, + "limit": { + "context": 1048576, + "output": 65536 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": true, + "image": true, + "video": true, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-11-18", + "variants": { + "low": { + "includeThoughts": true, + "thinkingLevel": "low" + }, + "high": { + "includeThoughts": true, + "thinkingLevel": "high" + } + } + }, + "claude-sonnet-4-5": { + "id": "claude-sonnet-4-5", + "providerID": "opencode", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "api": { + "id": "claude-sonnet-4-5", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 3, + "output": 15, + "cache": { + "read": 0.3, + "write": 3.75 + }, + "experimentalOver200K": { + "cache": { + "read": 0.6, + "write": 7.5 + }, + "input": 6, + "output": 22.5 + } + }, + "limit": { + "context": 1000000, + "output": 64000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": true + }, + "release_date": "2025-09-29", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 16000 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "gpt-5.1-codex-mini": { + "id": "gpt-5.1-codex-mini", + "providerID": "opencode", + "name": "GPT-5.1 Codex Mini", + "family": "gpt-codex", + "api": { + "id": "gpt-5.1-codex-mini", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0.25, + "output": 2, + "cache": { + "read": 0.025, + "write": 0 + } + }, + "limit": { + "context": 400000, + "input": 272000, + "output": 128000 + }, + "capabilities": { + "temperature": false, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-11-13", + "variants": { + "low": { + "reasoningEffort": "low", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "medium": { + "reasoningEffort": "medium", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "high": { + "reasoningEffort": "high", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + } + } + }, + "kimi-k2-thinking": { + "id": "kimi-k2-thinking", + "providerID": "opencode", + "name": "Kimi K2 Thinking", + "family": "kimi-thinking", + "api": { + "id": "kimi-k2-thinking", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai-compatible" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0.4, + "output": 2.5, + "cache": { + "read": 0.4, + "write": 0 + } + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": false, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": { + "field": "reasoning_content" + } + }, + "release_date": "2025-09-05", + "variants": {} + }, + "gpt-5.1": { + "id": "gpt-5.1", + "providerID": "opencode", + "name": "GPT-5.1", + "family": "gpt", + "api": { + "id": "gpt-5.1", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 1.07, + "output": 8.5, + "cache": { + "read": 0.107, + "write": 0 + } + }, + "limit": { + "context": 400000, + "input": 272000, + "output": 128000 + }, + "capabilities": { + "temperature": false, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-11-13", + "variants": { + "none": { + "reasoningEffort": "none", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "low": { + "reasoningEffort": "low", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "medium": { + "reasoningEffort": "medium", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "high": { + "reasoningEffort": "high", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + } + } + }, + "gpt-5-nano": { + "id": "gpt-5-nano", + "providerID": "opencode", + "name": "GPT-5 Nano", + "family": "gpt-nano", + "api": { + "id": "gpt-5-nano", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 400000, + "input": 272000, + "output": 128000 + }, + "capabilities": { + "temperature": false, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-08-07", + "variants": { + "minimal": { + "reasoningEffort": "minimal", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "low": { + "reasoningEffort": "low", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "medium": { + "reasoningEffort": "medium", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "high": { + "reasoningEffort": "high", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + } + } + }, + "gpt-5-codex": { + "id": "gpt-5-codex", + "providerID": "opencode", + "name": "GPT-5 Codex", + "family": "gpt-codex", + "api": { + "id": "gpt-5-codex", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 1.07, + "output": 8.5, + "cache": { + "read": 0.107, + "write": 0 + } + }, + "limit": { + "context": 400000, + "input": 272000, + "output": 128000 + }, + "capabilities": { + "temperature": false, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-09-15", + "variants": { + "low": { + "reasoningEffort": "low", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "medium": { + "reasoningEffort": "medium", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "high": { + "reasoningEffort": "high", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + } + } + }, + "big-pickle": { + "id": "big-pickle", + "providerID": "opencode", + "name": "Big Pickle", + "family": "big-pickle", + "api": { + "id": "big-pickle", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai-compatible" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 128000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": false, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-10-17", + "variants": { + "low": { + "reasoningEffort": "low" + }, + "medium": { + "reasoningEffort": "medium" + }, + "high": { + "reasoningEffort": "high" + } + } + }, + "claude-3-5-haiku": { + "id": "claude-3-5-haiku", + "providerID": "opencode", + "name": "Claude Haiku 3.5", + "family": "claude-haiku", + "api": { + "id": "claude-3-5-haiku", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0.8, + "output": 4, + "cache": { + "read": 0.08, + "write": 1 + } + }, + "limit": { + "context": 200000, + "output": 8192 + }, + "capabilities": { + "temperature": true, + "reasoning": false, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2024-10-22", + "variants": {} + }, + "glm-4.6": { + "id": "glm-4.6", + "providerID": "opencode", + "name": "GLM-4.6", + "family": "glm", + "api": { + "id": "glm-4.6", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai-compatible" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0.6, + "output": 2.2, + "cache": { + "read": 0.1, + "write": 0 + } + }, + "limit": { + "context": 204800, + "output": 131072 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": false, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-09-30", + "variants": {} + }, + "glm-4.7-free": { + "id": "glm-4.7-free", + "providerID": "opencode", + "name": "GLM-4.7 Free", + "family": "glm-free", + "api": { + "id": "glm-4.7-free", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai-compatible" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 204800, + "output": 131072 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": false, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": { + "field": "reasoning_content" + } + }, + "release_date": "2025-12-22", + "variants": {} + }, + "gemini-3-flash": { + "id": "gemini-3-flash", + "providerID": "opencode", + "name": "Gemini 3 Flash", + "family": "gemini-flash", + "api": { + "id": "gemini-3-flash", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/google" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0.5, + "output": 3, + "cache": { + "read": 0.05, + "write": 0 + } + }, + "limit": { + "context": 1048576, + "output": 65536 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": true, + "image": true, + "video": true, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-12-17", + "variants": { + "low": { + "includeThoughts": true, + "thinkingLevel": "low" + }, + "high": { + "includeThoughts": true, + "thinkingLevel": "high" + } + } + }, + "gpt-5.1-codex-max": { + "id": "gpt-5.1-codex-max", + "providerID": "opencode", + "name": "GPT-5.1 Codex Max", + "family": "gpt-codex", + "api": { + "id": "gpt-5.1-codex-max", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 1.25, + "output": 10, + "cache": { + "read": 0.125, + "write": 0 + } + }, + "limit": { + "context": 400000, + "input": 272000, + "output": 128000 + }, + "capabilities": { + "temperature": false, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-11-13", + "variants": { + "low": { + "reasoningEffort": "low", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "medium": { + "reasoningEffort": "medium", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "high": { + "reasoningEffort": "high", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + } + } + }, + "minimax-m2.1-free": { + "id": "minimax-m2.1-free", + "providerID": "opencode", + "name": "MiniMax M2.1 Free", + "family": "minimax-free", + "api": { + "id": "minimax-m2.1-free", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 204800, + "output": 131072 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": false, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-12-23", + "variants": {} + }, + "kimi-k2.5-free": { + "id": "kimi-k2.5-free", + "providerID": "opencode", + "name": "Kimi K2.5 Free", + "family": "kimi-free", + "api": { + "id": "kimi-k2.5-free", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai-compatible" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": true, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": { + "field": "reasoning_content" + } + }, + "release_date": "2026-01-27", + "variants": {} + }, + "claude-sonnet-4": { + "id": "claude-sonnet-4", + "providerID": "opencode", + "name": "Claude Sonnet 4", + "family": "claude-sonnet", + "api": { + "id": "claude-sonnet-4", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 3, + "output": 15, + "cache": { + "read": 0.3, + "write": 3.75 + }, + "experimentalOver200K": { + "cache": { + "read": 0.6, + "write": 7.5 + }, + "input": 6, + "output": 22.5 + } + }, + "limit": { + "context": 1000000, + "output": 64000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-05-22", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 16000 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "gpt-5": { + "id": "gpt-5", + "providerID": "opencode", + "name": "GPT-5", + "family": "gpt", + "api": { + "id": "gpt-5", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 1.07, + "output": 8.5, + "cache": { + "read": 0.107, + "write": 0 + } + }, + "limit": { + "context": 400000, + "input": 272000, + "output": 128000 + }, + "capabilities": { + "temperature": false, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-08-07", + "variants": { + "minimal": { + "reasoningEffort": "minimal", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "low": { + "reasoningEffort": "low", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "medium": { + "reasoningEffort": "medium", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "high": { + "reasoningEffort": "high", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + } + } + }, + "minimax-m2.1": { + "id": "minimax-m2.1", + "providerID": "opencode", + "name": "MiniMax M2.1", + "family": "minimax", + "api": { + "id": "minimax-m2.1", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai-compatible" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0.3, + "output": 1.2, + "cache": { + "read": 0.1, + "write": 0 + } + }, + "limit": { + "context": 204800, + "output": 131072 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": false, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": { + "field": "reasoning_content" + } + }, + "release_date": "2025-12-23", + "variants": {} + }, + "gpt-5.2": { + "id": "gpt-5.2", + "providerID": "opencode", + "name": "GPT-5.2", + "family": "gpt", + "api": { + "id": "gpt-5.2", + "url": "https://opencode.ai/zen/v1", + "npm": "@ai-sdk/openai" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 1.75, + "output": 14, + "cache": { + "read": 0.175, + "write": 0 + } + }, + "limit": { + "context": 400000, + "input": 272000, + "output": 128000 + }, + "capabilities": { + "temperature": false, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-12-11", + "variants": { + "none": { + "reasoningEffort": "none", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "low": { + "reasoningEffort": "low", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "medium": { + "reasoningEffort": "medium", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "high": { + "reasoningEffort": "high", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "xhigh": { + "reasoningEffort": "xhigh", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + } + } + } + }, + "key": "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" + }, + { + "id": "cerebras", + "source": "api", + "name": "Cerebras", + "env": [ + "CEREBRAS_API_KEY" + ], + "options": { + "headers": { + "X-Cerebras-3rd-Party-Integration": "opencode" + } + }, + "models": { + "zai-glm-4.7": { + "id": "zai-glm-4.7", + "providerID": "cerebras", + "name": "Z.AI GLM-4.7", + "api": { + "id": "zai-glm-4.7", + "npm": "@ai-sdk/cerebras" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 131072, + "output": 40000 + }, + "capabilities": { + "temperature": true, + "reasoning": false, + "attachment": false, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2026-01-10", + "variants": {} + }, + "qwen-3-235b-a22b-instruct-2507": { + "id": "qwen-3-235b-a22b-instruct-2507", + "providerID": "cerebras", + "name": "Qwen 3 235B Instruct", + "family": "qwen", + "api": { + "id": "qwen-3-235b-a22b-instruct-2507", + "npm": "@ai-sdk/cerebras" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0.6, + "output": 1.2, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 131000, + "output": 32000 + }, + "capabilities": { + "temperature": true, + "reasoning": false, + "attachment": false, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-07-22", + "variants": {} + }, + "gpt-oss-120b": { + "id": "gpt-oss-120b", + "providerID": "cerebras", + "name": "GPT OSS 120B", + "family": "gpt-oss", + "api": { + "id": "gpt-oss-120b", + "npm": "@ai-sdk/cerebras" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0.25, + "output": 0.69, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 131072, + "output": 32768 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": false, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-08-05", + "variants": { + "low": { + "reasoningEffort": "low" + }, + "medium": { + "reasoningEffort": "medium" + }, + "high": { + "reasoningEffort": "high" + } + } + } + }, + "key": "csk-me9n8whxtf2eekkfxe36569ppxpmk3ewh54d9t29cch5wnyd" + }, + { + "id": "openai", + "source": "custom", + "name": "OpenAI", + "env": [ + "OPENAI_API_KEY" + ], + "options": { + "apiKey": "opencode-oauth-dummy-key" + }, + "models": { + "gpt-5.2-codex": { + "id": "gpt-5.2-codex", + "providerID": "openai", + "name": "GPT-5.2 Codex", + "family": "gpt-codex", + "api": { + "id": "gpt-5.2-codex", + "npm": "@ai-sdk/openai" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 400000, + "input": 272000, + "output": 128000 + }, + "capabilities": { + "temperature": false, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-12-11", + "variants": { + "low": { + "reasoningEffort": "low", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "medium": { + "reasoningEffort": "medium", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "high": { + "reasoningEffort": "high", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "xhigh": { + "reasoningEffort": "xhigh", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + } + } + }, + "gpt-5.1-codex": { + "id": "gpt-5.1-codex", + "providerID": "openai", + "name": "GPT-5.1 Codex", + "family": "gpt-codex", + "api": { + "id": "gpt-5.1-codex", + "npm": "@ai-sdk/openai" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 400000, + "input": 272000, + "output": 128000 + }, + "capabilities": { + "temperature": false, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-11-13", + "variants": { + "low": { + "reasoningEffort": "low", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "medium": { + "reasoningEffort": "medium", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "high": { + "reasoningEffort": "high", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + } + } + }, + "gpt-5.1-codex-mini": { + "id": "gpt-5.1-codex-mini", + "providerID": "openai", + "name": "GPT-5.1 Codex mini", + "family": "gpt-codex", + "api": { + "id": "gpt-5.1-codex-mini", + "npm": "@ai-sdk/openai" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 400000, + "input": 272000, + "output": 128000 + }, + "capabilities": { + "temperature": false, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-11-13", + "variants": { + "low": { + "reasoningEffort": "low", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "medium": { + "reasoningEffort": "medium", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "high": { + "reasoningEffort": "high", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + } + } + }, + "gpt-5.1-codex-max": { + "id": "gpt-5.1-codex-max", + "providerID": "openai", + "name": "GPT-5.1 Codex Max", + "family": "gpt-codex", + "api": { + "id": "gpt-5.1-codex-max", + "npm": "@ai-sdk/openai" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 400000, + "input": 272000, + "output": 128000 + }, + "capabilities": { + "temperature": false, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-11-13", + "variants": { + "low": { + "reasoningEffort": "low", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "medium": { + "reasoningEffort": "medium", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "high": { + "reasoningEffort": "high", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + } + } + }, + "gpt-5.2": { + "id": "gpt-5.2", + "providerID": "openai", + "name": "GPT-5.2", + "family": "gpt", + "api": { + "id": "gpt-5.2", + "npm": "@ai-sdk/openai" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 400000, + "input": 272000, + "output": 128000 + }, + "capabilities": { + "temperature": false, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": false + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-12-11", + "variants": { + "none": { + "reasoningEffort": "none", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "low": { + "reasoningEffort": "low", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "medium": { + "reasoningEffort": "medium", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "high": { + "reasoningEffort": "high", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + }, + "xhigh": { + "reasoningEffort": "xhigh", + "reasoningSummary": "auto", + "include": [ + "reasoning.encrypted_content" + ] + } + } + } + } + }, + { + "id": "anthropic", + "source": "custom", + "name": "Anthropic", + "env": [ + "ANTHROPIC_API_KEY" + ], + "options": { + "apiKey": "", + "headers": { + "anthropic-beta": "claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14" + } + }, + "models": { + "claude-opus-4-0": { + "id": "claude-opus-4-0", + "providerID": "anthropic", + "name": "Claude Opus 4 (latest)", + "family": "claude-opus", + "api": { + "id": "claude-opus-4-0", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 32000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-05-22", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 15999 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "claude-3-5-sonnet-20241022": { + "id": "claude-3-5-sonnet-20241022", + "providerID": "anthropic", + "name": "Claude Sonnet 3.5 v2", + "family": "claude-sonnet", + "api": { + "id": "claude-3-5-sonnet-20241022", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 8192 + }, + "capabilities": { + "temperature": true, + "reasoning": false, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2024-10-22", + "variants": {} + }, + "claude-opus-4-1": { + "id": "claude-opus-4-1", + "providerID": "anthropic", + "name": "Claude Opus 4.1 (latest)", + "family": "claude-opus", + "api": { + "id": "claude-opus-4-1", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 32000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-08-05", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 15999 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "claude-haiku-4-5": { + "id": "claude-haiku-4-5", + "providerID": "anthropic", + "name": "Claude Haiku 4.5 (latest)", + "family": "claude-haiku", + "api": { + "id": "claude-haiku-4-5", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 64000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-10-15", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 16000 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "claude-3-5-sonnet-20240620": { + "id": "claude-3-5-sonnet-20240620", + "providerID": "anthropic", + "name": "Claude Sonnet 3.5", + "family": "claude-sonnet", + "api": { + "id": "claude-3-5-sonnet-20240620", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 8192 + }, + "capabilities": { + "temperature": true, + "reasoning": false, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2024-06-20", + "variants": {} + }, + "claude-opus-4-6": { + "id": "claude-opus-4-6", + "providerID": "anthropic", + "name": "Claude Opus 4.6", + "family": "claude-opus", + "api": { + "id": "claude-opus-4-6", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2026-02-05", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 16000 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "claude-3-5-haiku-latest": { + "id": "claude-3-5-haiku-latest", + "providerID": "anthropic", + "name": "Claude Haiku 3.5 (latest)", + "family": "claude-haiku", + "api": { + "id": "claude-3-5-haiku-latest", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 8192 + }, + "capabilities": { + "temperature": true, + "reasoning": false, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2024-10-22", + "variants": {} + }, + "claude-opus-4-5": { + "id": "claude-opus-4-5", + "providerID": "anthropic", + "name": "Claude Opus 4.5 (latest)", + "family": "claude-opus", + "api": { + "id": "claude-opus-4-5", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 64000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-11-24", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 16000 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "claude-3-opus-20240229": { + "id": "claude-3-opus-20240229", + "providerID": "anthropic", + "name": "Claude Opus 3", + "family": "claude-opus", + "api": { + "id": "claude-3-opus-20240229", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 4096 + }, + "capabilities": { + "temperature": true, + "reasoning": false, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2024-02-29", + "variants": {} + }, + "claude-opus-4-5-20251101": { + "id": "claude-opus-4-5-20251101", + "providerID": "anthropic", + "name": "Claude Opus 4.5", + "family": "claude-opus", + "api": { + "id": "claude-opus-4-5-20251101", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 64000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-11-01", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 16000 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "claude-sonnet-4-5": { + "id": "claude-sonnet-4-5", + "providerID": "anthropic", + "name": "Claude Sonnet 4.5 (latest)", + "family": "claude-sonnet", + "api": { + "id": "claude-sonnet-4-5", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 64000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-09-29", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 16000 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "claude-sonnet-4-5-20250929": { + "id": "claude-sonnet-4-5-20250929", + "providerID": "anthropic", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "api": { + "id": "claude-sonnet-4-5-20250929", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 64000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-09-29", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 16000 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "claude-sonnet-4-20250514": { + "id": "claude-sonnet-4-20250514", + "providerID": "anthropic", + "name": "Claude Sonnet 4", + "family": "claude-sonnet", + "api": { + "id": "claude-sonnet-4-20250514", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 64000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-05-22", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 16000 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "claude-opus-4-20250514": { + "id": "claude-opus-4-20250514", + "providerID": "anthropic", + "name": "Claude Opus 4", + "family": "claude-opus", + "api": { + "id": "claude-opus-4-20250514", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 32000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-05-22", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 15999 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "claude-3-5-haiku-20241022": { + "id": "claude-3-5-haiku-20241022", + "providerID": "anthropic", + "name": "Claude Haiku 3.5", + "family": "claude-haiku", + "api": { + "id": "claude-3-5-haiku-20241022", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 8192 + }, + "capabilities": { + "temperature": true, + "reasoning": false, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2024-10-22", + "variants": {} + }, + "claude-3-haiku-20240307": { + "id": "claude-3-haiku-20240307", + "providerID": "anthropic", + "name": "Claude Haiku 3", + "family": "claude-haiku", + "api": { + "id": "claude-3-haiku-20240307", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 4096 + }, + "capabilities": { + "temperature": true, + "reasoning": false, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2024-03-13", + "variants": {} + }, + "claude-3-7-sonnet-20250219": { + "id": "claude-3-7-sonnet-20250219", + "providerID": "anthropic", + "name": "Claude Sonnet 3.7", + "family": "claude-sonnet", + "api": { + "id": "claude-3-7-sonnet-20250219", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 64000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-02-19", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 16000 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "claude-3-7-sonnet-latest": { + "id": "claude-3-7-sonnet-latest", + "providerID": "anthropic", + "name": "Claude Sonnet 3.7 (latest)", + "family": "claude-sonnet", + "api": { + "id": "claude-3-7-sonnet-latest", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 64000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-02-19", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 16000 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "claude-sonnet-4-0": { + "id": "claude-sonnet-4-0", + "providerID": "anthropic", + "name": "Claude Sonnet 4 (latest)", + "family": "claude-sonnet", + "api": { + "id": "claude-sonnet-4-0", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 64000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-05-22", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 16000 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "claude-opus-4-1-20250805": { + "id": "claude-opus-4-1-20250805", + "providerID": "anthropic", + "name": "Claude Opus 4.1", + "family": "claude-opus", + "api": { + "id": "claude-opus-4-1-20250805", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 32000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-08-05", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 15999 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + }, + "claude-3-sonnet-20240229": { + "id": "claude-3-sonnet-20240229", + "providerID": "anthropic", + "name": "Claude Sonnet 3", + "family": "claude-sonnet", + "api": { + "id": "claude-3-sonnet-20240229", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 4096 + }, + "capabilities": { + "temperature": true, + "reasoning": false, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2024-03-04", + "variants": {} + }, + "claude-haiku-4-5-20251001": { + "id": "claude-haiku-4-5-20251001", + "providerID": "anthropic", + "name": "Claude Haiku 4.5", + "family": "claude-haiku", + "api": { + "id": "claude-haiku-4-5-20251001", + "npm": "@ai-sdk/anthropic" + }, + "status": "active", + "headers": {}, + "options": {}, + "cost": { + "input": 0, + "output": 0, + "cache": { + "read": 0, + "write": 0 + } + }, + "limit": { + "context": 200000, + "output": 64000 + }, + "capabilities": { + "temperature": true, + "reasoning": true, + "attachment": true, + "toolcall": true, + "input": { + "text": true, + "audio": false, + "image": true, + "video": false, + "pdf": true + }, + "output": { + "text": true, + "audio": false, + "image": false, + "video": false, + "pdf": false + }, + "interleaved": false + }, + "release_date": "2025-10-15", + "variants": { + "high": { + "thinking": { + "type": "enabled", + "budgetTokens": 16000 + } + }, + "max": { + "thinking": { + "type": "enabled", + "budgetTokens": 31999 + } + } + } + } + } + } + ], + "default": { + "opencode": "gemini-3-pro", + "cerebras": "zai-glm-4.7", + "openai": "gpt-5.2-codex", + "anthropic": "claude-sonnet-4-5-20250929" + } +} \ No newline at end of file diff --git a/research/opencode-compat/snapshots/native/session-create.json b/research/opencode-compat/snapshots/native/session-create.json new file mode 100644 index 0000000..eb38538 --- /dev/null +++ b/research/opencode-compat/snapshots/native/session-create.json @@ -0,0 +1,12 @@ +{ + "id": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "slug": "witty-eagle", + "version": "1.1.49", + "projectID": "c4153c5335dc81f0e622888f1f387c4b84dc54d5", + "directory": "/home/nathan/sandbox-agent/research/opencode-compat", + "title": "New session - 2026-02-06T06:56:52.806Z", + "time": { + "created": 1770361012806, + "updated": 1770361012806 + } +} \ No newline at end of file diff --git a/research/opencode-compat/snapshots/native/session-details.json b/research/opencode-compat/snapshots/native/session-details.json new file mode 100644 index 0000000..f3e4a40 --- /dev/null +++ b/research/opencode-compat/snapshots/native/session-details.json @@ -0,0 +1,17 @@ +{ + "id": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "slug": "witty-eagle", + "version": "1.1.49", + "projectID": "c4153c5335dc81f0e622888f1f387c4b84dc54d5", + "directory": "/home/nathan/sandbox-agent/research/opencode-compat", + "title": "Hello from OpenCode", + "time": { + "created": 1770361012806, + "updated": 1770361017462 + }, + "summary": { + "additions": 0, + "deletions": 0, + "files": 0 + } +} \ No newline at end of file diff --git a/research/opencode-compat/snapshots/native/session-events.json b/research/opencode-compat/snapshots/native/session-events.json new file mode 100644 index 0000000..a6630cc --- /dev/null +++ b/research/opencode-compat/snapshots/native/session-events.json @@ -0,0 +1,156 @@ +[ + { + "type": "session.created", + "properties": { + "info": { + "id": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "slug": "witty-eagle", + "version": "1.1.49", + "projectID": "c4153c5335dc81f0e622888f1f387c4b84dc54d5", + "directory": "/home/nathan/sandbox-agent/research/opencode-compat", + "title": "New session - 2026-02-06T06:56:52.806Z", + "time": { + "created": 1770361012806, + "updated": 1770361012806 + } + } + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "busy" + } + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "busy" + } + } + }, + { + "type": "session.diff", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "diff": [] + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "busy" + } + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "idle" + } + } + }, + { + "type": "session.idle", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms" + } + }, + { + "type": "session.diff", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "diff": [] + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "busy" + } + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "busy" + } + } + }, + { + "type": "session.diff", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "diff": [] + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "busy" + } + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "busy" + } + } + }, + { + "type": "session.diff", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "diff": [] + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "busy" + } + } + }, + { + "type": "session.status", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "status": { + "type": "idle" + } + } + }, + { + "type": "session.idle", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms" + } + }, + { + "type": "session.diff", + "properties": { + "sessionID": "ses_3ce42bdb9ffeEIUUu08AuKTJms", + "diff": [] + } + } +] \ No newline at end of file diff --git a/research/opencode-compat/snapshots/native/session-status.json b/research/opencode-compat/snapshots/native/session-status.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/research/opencode-compat/snapshots/native/session-status.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/research/opencode-compat/snapshots/sandbox-agent/all-events.json b/research/opencode-compat/snapshots/sandbox-agent/all-events.json new file mode 100644 index 0000000..1ff6540 --- /dev/null +++ b/research/opencode-compat/snapshots/sandbox-agent/all-events.json @@ -0,0 +1,682 @@ +[ + { + "properties": {}, + "type": "server.connected" + }, + { + "properties": { + "branch": "main", + "name": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "type": "worktree.ready" + }, + { + "properties": {}, + "type": "server.heartbeat" + }, + { + "properties": { + "info": { + "directory": "/home/nathan/sandbox-agent/research/opencode-compat", + "id": "ses_1", + "projectID": "proj_1", + "slug": "session-ses_1", + "time": { + "created": 1770362164904, + "updated": 1770362164904 + }, + "title": "Session ses_1", + "version": "0" + } + }, + "type": "session.created" + }, + { + "properties": { + "sessionID": "ses_1", + "status": { + "type": "busy" + } + }, + "type": "session.status" + }, + { + "properties": { + "info": { + "agent": "build", + "id": "msg_1", + "model": { + "modelID": "mock", + "providerID": "sandbox-agent" + }, + "role": "user", + "sessionID": "ses_1", + "time": { + "completed": 1770362164907, + "created": 1770362164907 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "messageID": "msg_1", + "part": { + "id": "part_1", + "messageID": "msg_1", + "sessionID": "ses_1", + "text": "echo Hello from sandbox-agent", + "type": "text" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_1_assistant", + "mode": "default", + "modelID": "mock", + "parentID": "msg_1", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "created": 1770362165109 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "delta": "echo Hello from sandbox-agent", + "messageID": "msg_1_assistant", + "part": { + "id": "msg_1_assistant_text", + "messageID": "msg_1_assistant", + "sessionID": "ses_1", + "text": "echo Hello from sandbox-agent", + "type": "text" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_1_assistant_00000000000000000005", + "mode": "default", + "modelID": "mock", + "parentID": "msg_1", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "created": 1770362165309 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_1_assistant_00000000000000000005", + "mode": "default", + "modelID": "mock", + "parentID": "msg_1", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "created": 1770362165511 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "delta": "Hello from sandbox-agent", + "messageID": "msg_1_assistant_00000000000000000005", + "part": { + "id": "msg_1_assistant_00000000000000000005_text", + "messageID": "msg_1_assistant_00000000000000000005", + "sessionID": "ses_1", + "text": "Hello from sandbox-agent", + "type": "text" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_1_assistant_00000000000000000005", + "mode": "default", + "modelID": "mock", + "parentID": "msg_1", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "completed": 1770362165511, + "created": 1770362165511 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "messageID": "msg_1_assistant_00000000000000000005", + "part": { + "id": "msg_1_assistant_00000000000000000005_text", + "messageID": "msg_1_assistant_00000000000000000005", + "sessionID": "ses_1", + "text": "Hello from sandbox-agent", + "type": "text" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "sessionID": "ses_1", + "status": { + "type": "idle" + } + }, + "type": "session.status" + }, + { + "properties": { + "sessionID": "ses_1" + }, + "type": "session.idle" + }, + { + "properties": { + "sessionID": "ses_1", + "status": { + "type": "busy" + } + }, + "type": "session.status" + }, + { + "properties": { + "info": { + "agent": "build", + "id": "msg_2", + "model": { + "modelID": "mock", + "providerID": "sandbox-agent" + }, + "role": "user", + "sessionID": "ses_1", + "time": { + "completed": 1770362166412, + "created": 1770362166412 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "messageID": "msg_2", + "part": { + "id": "part_2", + "messageID": "msg_2", + "sessionID": "ses_1", + "text": "tool", + "type": "text" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_2_assistant", + "mode": "default", + "modelID": "mock", + "parentID": "msg_2", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "created": 1770362166614 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "delta": "tool", + "messageID": "msg_2_assistant", + "part": { + "id": "msg_2_assistant_text", + "messageID": "msg_2_assistant", + "sessionID": "ses_1", + "text": "tool", + "type": "text" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_2_assistant_00000000000000000011", + "mode": "default", + "modelID": "mock", + "parentID": "msg_2", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "created": 1770362166815 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "messageID": "msg_2_assistant_00000000000000000011", + "part": { + "callID": "mock_2_call", + "id": "part_3", + "messageID": "msg_2_assistant_00000000000000000011", + "metadata": {}, + "sessionID": "ses_1", + "state": { + "input": { + "query": "example" + }, + "raw": "{\"query\":\"example\"}", + "status": "pending" + }, + "tool": "mock.search", + "type": "tool" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_2_assistant_00000000000000000011", + "mode": "default", + "modelID": "mock", + "parentID": "msg_2", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "completed": 1770362167016, + "created": 1770362167016 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "messageID": "msg_2_assistant_00000000000000000011", + "part": { + "callID": "mock_2_call", + "id": "part_3", + "messageID": "msg_2_assistant_00000000000000000011", + "metadata": {}, + "sessionID": "ses_1", + "state": { + "input": { + "query": "example" + }, + "status": "running", + "time": { + "start": 1770362167016 + } + }, + "tool": "mock.search", + "type": "tool" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_2_assistant_00000000000000000011", + "mode": "default", + "modelID": "mock", + "parentID": "msg_2", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "created": 1770362167218 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "messageID": "msg_2_assistant_00000000000000000011", + "part": { + "callID": "mock_2_call", + "id": "part_3", + "messageID": "msg_2_assistant_00000000000000000011", + "metadata": {}, + "sessionID": "ses_1", + "state": { + "input": { + "query": "example" + }, + "status": "running", + "time": { + "start": 1770362167218 + } + }, + "tool": "mock.search", + "type": "tool" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_2_assistant_00000000000000000011", + "mode": "default", + "modelID": "mock", + "parentID": "msg_2", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "completed": 1770362167418, + "created": 1770362167418 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "messageID": "msg_2_assistant_00000000000000000011", + "part": { + "filename": "mock_2/readme.md", + "id": "part_4", + "messageID": "msg_2_assistant_00000000000000000011", + "mime": "text/plain", + "sessionID": "ses_1", + "type": "file", + "url": "file://mock_2/readme.md" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "messageID": "msg_2_assistant_00000000000000000011", + "part": { + "filename": "mock_2/output.txt", + "id": "part_5", + "messageID": "msg_2_assistant_00000000000000000011", + "mime": "text/plain", + "sessionID": "ses_1", + "source": { + "path": "mock_2/output.txt", + "text": { + "end": 13, + "start": 0, + "value": "+mock output\n" + }, + "type": "file" + }, + "type": "file", + "url": "file://mock_2/output.txt" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "file": "mock_2/output.txt" + }, + "type": "file.edited" + }, + { + "properties": { + "messageID": "msg_2_assistant_00000000000000000011", + "part": { + "filename": "mock_2/patch.txt", + "id": "part_6", + "messageID": "msg_2_assistant_00000000000000000011", + "mime": "text/x-diff", + "sessionID": "ses_1", + "source": { + "path": "mock_2/patch.txt", + "text": { + "end": 26, + "start": 0, + "value": "@@ -1,1 +1,1 @@\n-old\n+new\n" + }, + "type": "file" + }, + "type": "file", + "url": "file://mock_2/patch.txt" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "file": "mock_2/patch.txt" + }, + "type": "file.edited" + }, + { + "properties": { + "messageID": "msg_2_assistant_00000000000000000011", + "part": { + "callID": "mock_2_call", + "id": "part_3", + "messageID": "msg_2_assistant_00000000000000000011", + "metadata": {}, + "sessionID": "ses_1", + "state": { + "input": { + "query": "example" + }, + "metadata": {}, + "output": "mock search results", + "status": "error", + "time": { + "end": 1770362167418, + "start": 1770362167418 + } + }, + "tool": "mock.search", + "type": "tool" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + } +] \ No newline at end of file diff --git a/research/opencode-compat/snapshots/sandbox-agent/messages-after-1.json b/research/opencode-compat/snapshots/sandbox-agent/messages-after-1.json new file mode 100644 index 0000000..432dfe8 --- /dev/null +++ b/research/opencode-compat/snapshots/sandbox-agent/messages-after-1.json @@ -0,0 +1,106 @@ +[ + { + "info": { + "agent": "build", + "id": "msg_1", + "model": { + "modelID": "mock", + "providerID": "sandbox-agent" + }, + "role": "user", + "sessionID": "ses_1", + "time": { + "completed": 1770362164907, + "created": 1770362164907 + } + }, + "parts": [ + { + "id": "part_1", + "messageID": "msg_1", + "sessionID": "ses_1", + "text": "echo Hello from sandbox-agent", + "type": "text" + } + ] + }, + { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_1_assistant", + "mode": "default", + "modelID": "mock", + "parentID": "msg_1", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "created": 1770362165109 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "parts": [ + { + "id": "msg_1_assistant_text", + "messageID": "msg_1_assistant", + "sessionID": "ses_1", + "text": "echo Hello from sandbox-agent", + "type": "text" + } + ] + }, + { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_1_assistant_00000000000000000005", + "mode": "default", + "modelID": "mock", + "parentID": "msg_1", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "completed": 1770362165511, + "created": 1770362165511 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "parts": [ + { + "id": "msg_1_assistant_00000000000000000005_text", + "messageID": "msg_1_assistant_00000000000000000005", + "sessionID": "ses_1", + "text": "Hello from sandbox-agent", + "type": "text" + } + ] + } +] \ No newline at end of file diff --git a/research/opencode-compat/snapshots/sandbox-agent/messages-after-2.json b/research/opencode-compat/snapshots/sandbox-agent/messages-after-2.json new file mode 100644 index 0000000..778c702 --- /dev/null +++ b/research/opencode-compat/snapshots/sandbox-agent/messages-after-2.json @@ -0,0 +1,269 @@ +[ + { + "info": { + "agent": "build", + "id": "msg_1", + "model": { + "modelID": "mock", + "providerID": "sandbox-agent" + }, + "role": "user", + "sessionID": "ses_1", + "time": { + "completed": 1770362164907, + "created": 1770362164907 + } + }, + "parts": [ + { + "id": "part_1", + "messageID": "msg_1", + "sessionID": "ses_1", + "text": "echo Hello from sandbox-agent", + "type": "text" + } + ] + }, + { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_1_assistant", + "mode": "default", + "modelID": "mock", + "parentID": "msg_1", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "created": 1770362165109 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "parts": [ + { + "id": "msg_1_assistant_text", + "messageID": "msg_1_assistant", + "sessionID": "ses_1", + "text": "echo Hello from sandbox-agent", + "type": "text" + } + ] + }, + { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_1_assistant_00000000000000000005", + "mode": "default", + "modelID": "mock", + "parentID": "msg_1", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "completed": 1770362165511, + "created": 1770362165511 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "parts": [ + { + "id": "msg_1_assistant_00000000000000000005_text", + "messageID": "msg_1_assistant_00000000000000000005", + "sessionID": "ses_1", + "text": "Hello from sandbox-agent", + "type": "text" + } + ] + }, + { + "info": { + "agent": "build", + "id": "msg_2", + "model": { + "modelID": "mock", + "providerID": "sandbox-agent" + }, + "role": "user", + "sessionID": "ses_1", + "time": { + "completed": 1770362166412, + "created": 1770362166412 + } + }, + "parts": [ + { + "id": "part_2", + "messageID": "msg_2", + "sessionID": "ses_1", + "text": "tool", + "type": "text" + } + ] + }, + { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_2_assistant", + "mode": "default", + "modelID": "mock", + "parentID": "msg_2", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "created": 1770362166614 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "parts": [ + { + "id": "msg_2_assistant_text", + "messageID": "msg_2_assistant", + "sessionID": "ses_1", + "text": "tool", + "type": "text" + } + ] + }, + { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_2_assistant_00000000000000000011", + "mode": "default", + "modelID": "mock", + "parentID": "msg_2", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "completed": 1770362167418, + "created": 1770362167418 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "parts": [ + { + "callID": "mock_2_call", + "id": "part_3", + "messageID": "msg_2_assistant_00000000000000000011", + "metadata": {}, + "sessionID": "ses_1", + "state": { + "input": { + "query": "example" + }, + "metadata": {}, + "output": "mock search results", + "status": "error", + "time": { + "end": 1770362167418, + "start": 1770362167418 + } + }, + "tool": "mock.search", + "type": "tool" + }, + { + "filename": "mock_2/readme.md", + "id": "part_4", + "messageID": "msg_2_assistant_00000000000000000011", + "mime": "text/plain", + "sessionID": "ses_1", + "type": "file", + "url": "file://mock_2/readme.md" + }, + { + "filename": "mock_2/output.txt", + "id": "part_5", + "messageID": "msg_2_assistant_00000000000000000011", + "mime": "text/plain", + "sessionID": "ses_1", + "source": { + "path": "mock_2/output.txt", + "text": { + "end": 13, + "start": 0, + "value": "+mock output\n" + }, + "type": "file" + }, + "type": "file", + "url": "file://mock_2/output.txt" + }, + { + "filename": "mock_2/patch.txt", + "id": "part_6", + "messageID": "msg_2_assistant_00000000000000000011", + "mime": "text/x-diff", + "sessionID": "ses_1", + "source": { + "path": "mock_2/patch.txt", + "text": { + "end": 26, + "start": 0, + "value": "@@ -1,1 +1,1 @@\n-old\n+new\n" + }, + "type": "file" + }, + "type": "file", + "url": "file://mock_2/patch.txt" + } + ] + } +] \ No newline at end of file diff --git a/research/opencode-compat/snapshots/sandbox-agent/metadata-agent.json b/research/opencode-compat/snapshots/sandbox-agent/metadata-agent.json new file mode 100644 index 0000000..fc8b612 --- /dev/null +++ b/research/opencode-compat/snapshots/sandbox-agent/metadata-agent.json @@ -0,0 +1,11 @@ +[ + { + "description": "Sandbox Agent compatibility layer", + "hidden": false, + "mode": "all", + "name": "Sandbox Agent", + "native": false, + "options": {}, + "permission": [] + } +] \ No newline at end of file diff --git a/research/opencode-compat/snapshots/sandbox-agent/metadata-config.json b/research/opencode-compat/snapshots/sandbox-agent/metadata-config.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/research/opencode-compat/snapshots/sandbox-agent/metadata-config.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/research/opencode-compat/snapshots/sandbox-agent/session-create.json b/research/opencode-compat/snapshots/sandbox-agent/session-create.json new file mode 100644 index 0000000..36e0784 --- /dev/null +++ b/research/opencode-compat/snapshots/sandbox-agent/session-create.json @@ -0,0 +1,12 @@ +{ + "directory": "/home/nathan/sandbox-agent/research/opencode-compat", + "id": "ses_1", + "projectID": "proj_1", + "slug": "session-ses_1", + "time": { + "created": 1770362164904, + "updated": 1770362164904 + }, + "title": "Session ses_1", + "version": "0" +} \ No newline at end of file diff --git a/research/opencode-compat/snapshots/sandbox-agent/session-details.json b/research/opencode-compat/snapshots/sandbox-agent/session-details.json new file mode 100644 index 0000000..36e0784 --- /dev/null +++ b/research/opencode-compat/snapshots/sandbox-agent/session-details.json @@ -0,0 +1,12 @@ +{ + "directory": "/home/nathan/sandbox-agent/research/opencode-compat", + "id": "ses_1", + "projectID": "proj_1", + "slug": "session-ses_1", + "time": { + "created": 1770362164904, + "updated": 1770362164904 + }, + "title": "Session ses_1", + "version": "0" +} \ No newline at end of file diff --git a/research/opencode-compat/snapshots/sandbox-agent/session-events.json b/research/opencode-compat/snapshots/sandbox-agent/session-events.json new file mode 100644 index 0000000..66b86ab --- /dev/null +++ b/research/opencode-compat/snapshots/sandbox-agent/session-events.json @@ -0,0 +1,655 @@ +[ + { + "properties": { + "info": { + "directory": "/home/nathan/sandbox-agent/research/opencode-compat", + "id": "ses_1", + "projectID": "proj_1", + "slug": "session-ses_1", + "time": { + "created": 1770362164904, + "updated": 1770362164904 + }, + "title": "Session ses_1", + "version": "0" + } + }, + "type": "session.created" + }, + { + "properties": { + "sessionID": "ses_1", + "status": { + "type": "busy" + } + }, + "type": "session.status" + }, + { + "properties": { + "info": { + "agent": "build", + "id": "msg_1", + "model": { + "modelID": "mock", + "providerID": "sandbox-agent" + }, + "role": "user", + "sessionID": "ses_1", + "time": { + "completed": 1770362164907, + "created": 1770362164907 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "messageID": "msg_1", + "part": { + "id": "part_1", + "messageID": "msg_1", + "sessionID": "ses_1", + "text": "echo Hello from sandbox-agent", + "type": "text" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_1_assistant", + "mode": "default", + "modelID": "mock", + "parentID": "msg_1", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "created": 1770362165109 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "delta": "echo Hello from sandbox-agent", + "messageID": "msg_1_assistant", + "part": { + "id": "msg_1_assistant_text", + "messageID": "msg_1_assistant", + "sessionID": "ses_1", + "text": "echo Hello from sandbox-agent", + "type": "text" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_1_assistant_00000000000000000005", + "mode": "default", + "modelID": "mock", + "parentID": "msg_1", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "created": 1770362165309 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_1_assistant_00000000000000000005", + "mode": "default", + "modelID": "mock", + "parentID": "msg_1", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "created": 1770362165511 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "delta": "Hello from sandbox-agent", + "messageID": "msg_1_assistant_00000000000000000005", + "part": { + "id": "msg_1_assistant_00000000000000000005_text", + "messageID": "msg_1_assistant_00000000000000000005", + "sessionID": "ses_1", + "text": "Hello from sandbox-agent", + "type": "text" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_1_assistant_00000000000000000005", + "mode": "default", + "modelID": "mock", + "parentID": "msg_1", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "completed": 1770362165511, + "created": 1770362165511 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "messageID": "msg_1_assistant_00000000000000000005", + "part": { + "id": "msg_1_assistant_00000000000000000005_text", + "messageID": "msg_1_assistant_00000000000000000005", + "sessionID": "ses_1", + "text": "Hello from sandbox-agent", + "type": "text" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "sessionID": "ses_1", + "status": { + "type": "idle" + } + }, + "type": "session.status" + }, + { + "properties": { + "sessionID": "ses_1" + }, + "type": "session.idle" + }, + { + "properties": { + "sessionID": "ses_1", + "status": { + "type": "busy" + } + }, + "type": "session.status" + }, + { + "properties": { + "info": { + "agent": "build", + "id": "msg_2", + "model": { + "modelID": "mock", + "providerID": "sandbox-agent" + }, + "role": "user", + "sessionID": "ses_1", + "time": { + "completed": 1770362166412, + "created": 1770362166412 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "messageID": "msg_2", + "part": { + "id": "part_2", + "messageID": "msg_2", + "sessionID": "ses_1", + "text": "tool", + "type": "text" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_2_assistant", + "mode": "default", + "modelID": "mock", + "parentID": "msg_2", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "created": 1770362166614 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "delta": "tool", + "messageID": "msg_2_assistant", + "part": { + "id": "msg_2_assistant_text", + "messageID": "msg_2_assistant", + "sessionID": "ses_1", + "text": "tool", + "type": "text" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_2_assistant_00000000000000000011", + "mode": "default", + "modelID": "mock", + "parentID": "msg_2", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "created": 1770362166815 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "messageID": "msg_2_assistant_00000000000000000011", + "part": { + "callID": "mock_2_call", + "id": "part_3", + "messageID": "msg_2_assistant_00000000000000000011", + "metadata": {}, + "sessionID": "ses_1", + "state": { + "input": { + "query": "example" + }, + "raw": "{\"query\":\"example\"}", + "status": "pending" + }, + "tool": "mock.search", + "type": "tool" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_2_assistant_00000000000000000011", + "mode": "default", + "modelID": "mock", + "parentID": "msg_2", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "completed": 1770362167016, + "created": 1770362167016 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "messageID": "msg_2_assistant_00000000000000000011", + "part": { + "callID": "mock_2_call", + "id": "part_3", + "messageID": "msg_2_assistant_00000000000000000011", + "metadata": {}, + "sessionID": "ses_1", + "state": { + "input": { + "query": "example" + }, + "status": "running", + "time": { + "start": 1770362167016 + } + }, + "tool": "mock.search", + "type": "tool" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_2_assistant_00000000000000000011", + "mode": "default", + "modelID": "mock", + "parentID": "msg_2", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "created": 1770362167218 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "messageID": "msg_2_assistant_00000000000000000011", + "part": { + "callID": "mock_2_call", + "id": "part_3", + "messageID": "msg_2_assistant_00000000000000000011", + "metadata": {}, + "sessionID": "ses_1", + "state": { + "input": { + "query": "example" + }, + "status": "running", + "time": { + "start": 1770362167218 + } + }, + "tool": "mock.search", + "type": "tool" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "agent": "build", + "cost": 0, + "finish": "stop", + "id": "msg_2_assistant_00000000000000000011", + "mode": "default", + "modelID": "mock", + "parentID": "msg_2", + "path": { + "cwd": "/home/nathan/sandbox-agent/research/opencode-compat", + "root": "/home/nathan/sandbox-agent/research/opencode-compat" + }, + "providerID": "sandbox-agent", + "role": "assistant", + "sessionID": "ses_1", + "time": { + "completed": 1770362167418, + "created": 1770362167418 + }, + "tokens": { + "cache": { + "read": 0, + "write": 0 + }, + "input": 0, + "output": 0, + "reasoning": 0 + } + }, + "sessionID": "ses_1" + }, + "type": "message.updated" + }, + { + "properties": { + "messageID": "msg_2_assistant_00000000000000000011", + "part": { + "filename": "mock_2/readme.md", + "id": "part_4", + "messageID": "msg_2_assistant_00000000000000000011", + "mime": "text/plain", + "sessionID": "ses_1", + "type": "file", + "url": "file://mock_2/readme.md" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "messageID": "msg_2_assistant_00000000000000000011", + "part": { + "filename": "mock_2/output.txt", + "id": "part_5", + "messageID": "msg_2_assistant_00000000000000000011", + "mime": "text/plain", + "sessionID": "ses_1", + "source": { + "path": "mock_2/output.txt", + "text": { + "end": 13, + "start": 0, + "value": "+mock output\n" + }, + "type": "file" + }, + "type": "file", + "url": "file://mock_2/output.txt" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "messageID": "msg_2_assistant_00000000000000000011", + "part": { + "filename": "mock_2/patch.txt", + "id": "part_6", + "messageID": "msg_2_assistant_00000000000000000011", + "mime": "text/x-diff", + "sessionID": "ses_1", + "source": { + "path": "mock_2/patch.txt", + "text": { + "end": 26, + "start": 0, + "value": "@@ -1,1 +1,1 @@\n-old\n+new\n" + }, + "type": "file" + }, + "type": "file", + "url": "file://mock_2/patch.txt" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + }, + { + "properties": { + "messageID": "msg_2_assistant_00000000000000000011", + "part": { + "callID": "mock_2_call", + "id": "part_3", + "messageID": "msg_2_assistant_00000000000000000011", + "metadata": {}, + "sessionID": "ses_1", + "state": { + "input": { + "query": "example" + }, + "metadata": {}, + "output": "mock search results", + "status": "error", + "time": { + "end": 1770362167418, + "start": 1770362167418 + } + }, + "tool": "mock.search", + "type": "tool" + }, + "sessionID": "ses_1" + }, + "type": "message.part.updated" + } +] \ No newline at end of file diff --git a/research/opencode-compat/snapshots/sandbox-agent/session-status.json b/research/opencode-compat/snapshots/sandbox-agent/session-status.json new file mode 100644 index 0000000..8afc386 --- /dev/null +++ b/research/opencode-compat/snapshots/sandbox-agent/session-status.json @@ -0,0 +1,5 @@ +{ + "ses_1": { + "type": "idle" + } +} \ No newline at end of file diff --git a/server/packages/sandbox-agent/src/cli.rs b/server/packages/sandbox-agent/src/cli.rs index 323f596..b0a40d7 100644 --- a/server/packages/sandbox-agent/src/cli.rs +++ b/server/packages/sandbox-agent/src/cli.rs @@ -419,8 +419,6 @@ pub struct CredentialsExtractEnvArgs { #[derive(Debug, Error)] pub enum CliError { - #[error("missing --token or --no-token for server mode")] - MissingToken, #[error("invalid cors origin: {0}")] InvalidCorsOrigin(String), #[error("invalid cors method: {0}")] @@ -489,12 +487,10 @@ pub fn run_command(command: &Command, cli: &CliConfig) -> Result<(), CliError> { } fn run_server(cli: &CliConfig, server: &ServerArgs) -> Result<(), CliError> { - let auth = if cli.no_token { - AuthConfig::disabled() - } else if let Some(token) = cli.token.clone() { + let auth = if let Some(token) = cli.token.clone() { AuthConfig::with_token(token) } else { - return Err(CliError::MissingToken); + AuthConfig::disabled() }; let agent_manager = AgentManager::new(default_install_dir()) diff --git a/server/packages/sandbox-agent/src/daemon.rs b/server/packages/sandbox-agent/src/daemon.rs index 5e71552..f711f6f 100644 --- a/server/packages/sandbox-agent/src/daemon.rs +++ b/server/packages/sandbox-agent/src/daemon.rs @@ -222,12 +222,8 @@ pub fn spawn_sandbox_agent_daemon( .stdout(Stdio::from(log_file)) .stderr(Stdio::from(log_file_err)); - if cli.no_token { - cmd.arg("--no-token"); - } else if let Some(token) = token { + if let Some(token) = token { cmd.arg("--token").arg(token); - } else { - return Err(CliError::MissingToken); } cmd.spawn().map_err(CliError::from) diff --git a/server/packages/sandbox-agent/src/opencode_compat.rs b/server/packages/sandbox-agent/src/opencode_compat.rs index 427d440..6fbcd9e 100644 --- a/server/packages/sandbox-agent/src/opencode_compat.rs +++ b/server/packages/sandbox-agent/src/opencode_compat.rs @@ -212,6 +212,10 @@ struct OpenCodeSessionRuntime { part_id_by_message: HashMap, tool_part_by_call: HashMap, tool_message_by_call: HashMap, + /// Tool name by call_id, persisted from ToolCall for use in ToolResult events + tool_name_by_call: HashMap, + /// Tool arguments by call_id, persisted from ToolCall for use in ToolResult events + tool_args_by_call: HashMap, } pub struct OpenCodeState { @@ -1586,25 +1590,48 @@ async fn apply_item_event( .entry(message_id.clone()) .or_insert_with(|| format!("{}_text", message_id)) .clone(); - runtime - .text_by_message - .insert(message_id.clone(), text.clone()); - let part = build_text_part_with_id(&session_id, &message_id, &part_id, &text); - upsert_message_part(&state.opencode, &session_id, &message_id, part.clone()).await; - state - .opencode - .emit_event(part_event("message.part.updated", &part)); - let _ = state - .opencode - .update_runtime(&session_id, |runtime| { - runtime - .text_by_message - .insert(message_id.clone(), text.clone()); - runtime - .part_id_by_message - .insert(message_id.clone(), part_id.clone()); - }) - .await; + if event.event_type == UniversalEventType::ItemStarted { + // For ItemStarted, only store the text in runtime as the initial value + // without emitting a part event. Deltas will handle streaming, and + // ItemCompleted will emit the final text part. + let _ = state + .opencode + .update_runtime(&session_id, |runtime| { + runtime + .text_by_message + .insert(message_id.clone(), String::new()); + runtime + .part_id_by_message + .insert(message_id.clone(), part_id.clone()); + }) + .await; + } else { + // For ItemCompleted, emit the final text part with the complete text. + // Use the accumulated text from deltas if available, otherwise use + // the text from the completed event. + let final_text = runtime + .text_by_message + .get(&message_id) + .filter(|t| !t.is_empty()) + .cloned() + .unwrap_or_else(|| text.clone()); + let part = build_text_part_with_id(&session_id, &message_id, &part_id, &final_text); + upsert_message_part(&state.opencode, &session_id, &message_id, part.clone()).await; + state + .opencode + .emit_event(part_event("message.part.updated", &part)); + let _ = state + .opencode + .update_runtime(&session_id, |runtime| { + runtime + .text_by_message + .insert(message_id.clone(), final_text.clone()); + runtime + .part_id_by_message + .insert(message_id.clone(), part_id.clone()); + }) + .await; + } } for part in item.content.iter() { @@ -1634,9 +1661,10 @@ async fn apply_item_event( .entry(call_id.clone()) .or_insert_with(|| next_id("part_", &PART_COUNTER)) .clone(); + let input_value = tool_input_from_arguments(Some(arguments.as_str())); let state_value = json!({ "status": "pending", - "input": {"arguments": arguments}, + "input": input_value, "raw": arguments, }); let tool_part = build_tool_part( @@ -1661,6 +1689,12 @@ async fn apply_item_event( runtime .tool_message_by_call .insert(call_id.clone(), message_id.clone()); + runtime + .tool_name_by_call + .insert(call_id.clone(), name.clone()); + runtime + .tool_args_by_call + .insert(call_id.clone(), arguments.clone()); }) .await; } @@ -1670,9 +1704,22 @@ async fn apply_item_event( .entry(call_id.clone()) .or_insert_with(|| next_id("part_", &PART_COUNTER)) .clone(); + // Resolve tool name from stored ToolCall data + let tool_name = runtime + .tool_name_by_call + .get(call_id) + .cloned() + .unwrap_or_else(|| "tool".to_string()); + // Resolve input from stored ToolCall arguments + let input_value = runtime + .tool_args_by_call + .get(call_id) + .and_then(|args| tool_input_from_arguments(Some(args.as_str())).as_object().cloned()) + .map(Value::Object) + .unwrap_or_else(|| json!({})); let state_value = json!({ "status": "completed", - "input": {}, + "input": input_value, "output": output, "title": "Tool result", "metadata": {}, @@ -1684,7 +1731,7 @@ async fn apply_item_event( &message_id, &part_id, call_id, - "tool", + &tool_name, state_value, ); upsert_message_part(&state.opencode, &session_id, &message_id, tool_part.clone()) @@ -1877,12 +1924,19 @@ async fn apply_tool_item_event( .get(&call_id) .cloned() .unwrap_or_else(|| next_id("part_", &PART_COUNTER)); + // Resolve tool name: prefer current event's data, fall back to stored value from ToolCall let tool_name = tool_info .tool_name .clone() + .or_else(|| runtime.tool_name_by_call.get(&call_id).cloned()) .unwrap_or_else(|| "tool".to_string()); - let input_value = tool_input_from_arguments(tool_info.arguments.as_deref()); - let raw_args = tool_info.arguments.clone().unwrap_or_default(); + // Resolve arguments: prefer current event's data, fall back to stored value from ToolCall + let effective_arguments = tool_info + .arguments + .clone() + .or_else(|| runtime.tool_args_by_call.get(&call_id).cloned()); + let input_value = tool_input_from_arguments(effective_arguments.as_deref()); + let raw_args = effective_arguments.clone().unwrap_or_default(); let output_value = tool_info .output .clone() @@ -1910,7 +1964,7 @@ async fn apply_tool_item_event( json!({ "status": "error", "input": input_value, - "error": output_value.unwrap_or_else(|| "Tool failed".to_string()), + "output": output_value.unwrap_or_else(|| "Tool failed".to_string()), "metadata": {}, "time": {"start": now, "end": now}, }) @@ -1962,6 +2016,17 @@ async fn apply_tool_item_event( runtime .tool_message_by_call .insert(call_id.clone(), message_id.clone()); + // Persist tool name and arguments from ToolCall for later ToolResult events + if let Some(name) = tool_info.tool_name.as_ref() { + runtime + .tool_name_by_call + .insert(call_id.clone(), name.clone()); + } + if let Some(args) = tool_info.arguments.as_ref() { + runtime + .tool_args_by_call + .insert(call_id.clone(), args.clone()); + } }) .await; } @@ -2071,7 +2136,7 @@ async fn apply_item_delta( upsert_message_part(&state.opencode, &session_id, &message_id, part.clone()).await; state .opencode - .emit_event(part_event("message.part.updated", &part)); + .emit_event(part_event_with_delta("message.part.updated", &part, Some(&delta))); let _ = state .opencode .update_runtime(&session_id, |runtime| { From b74539172b0ea850a918713d018df991c288d41e Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 6 Feb 2026 02:59:23 -0800 Subject: [PATCH 06/19] feat: model list (#96) --- CLAUDE.md | 1 + docs/cli.mdx | 11 + docs/openapi.json | 89 ++++ docs/session-transcript-schema.mdx | 4 + frontend/packages/inspector/src/App.tsx | 55 ++ .../agents/FeatureCoverageBadges.tsx | 4 +- .../src/components/chat/ChatPanel.tsx | 23 +- .../src/components/chat/ChatSetup.tsx | 114 ++++- .../packages/inspector/src/types/agents.ts | 2 + sdks/typescript/src/client.ts | 5 + sdks/typescript/src/generated/openapi.ts | 34 ++ sdks/typescript/src/index.ts | 2 + sdks/typescript/src/types.ts | 2 + server/packages/sandbox-agent/src/cli.rs | 19 +- .../sandbox-agent/src/opencode_compat.rs | 179 ++++++- server/packages/sandbox-agent/src/router.rs | 480 +++++++++++++++++- .../sandbox-agent/tests/common/http.rs | 75 +++ .../tests/http/agent_endpoints.rs | 23 + ..._endpoints_snapshots@agent_models_amp.snap | 19 + ...dpoints_snapshots@agent_models_claude.snap | 8 + ...ndpoints_snapshots@agent_models_codex.snap | 8 + ...endpoints_snapshots@agent_models_mock.snap | 12 + ...oints_snapshots@agent_models_opencode.snap | 8 + .../tests/opencode-compat/models.test.ts | 49 ++ 24 files changed, 1174 insertions(+), 52 deletions(-) create mode 100644 server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_amp.snap create mode 100644 server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_claude.snap create mode 100644 server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_codex.snap create mode 100644 server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_mock.snap create mode 100644 server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_opencode.snap create mode 100644 server/packages/sandbox-agent/tests/opencode-compat/models.test.ts diff --git a/CLAUDE.md b/CLAUDE.md index f5e0e45..5eec975 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -53,6 +53,7 @@ Universal schema guidance: - `sandbox-agent api agents list` ↔ `GET /v1/agents` - `sandbox-agent api agents install` ↔ `POST /v1/agents/{agent}/install` - `sandbox-agent api agents modes` ↔ `GET /v1/agents/{agent}/modes` +- `sandbox-agent api agents models` ↔ `GET /v1/agents/{agent}/models` - `sandbox-agent api sessions list` ↔ `GET /v1/sessions` - `sandbox-agent api sessions create` ↔ `POST /v1/sessions/{sessionId}` - `sandbox-agent api sessions send-message` ↔ `POST /v1/sessions/{sessionId}/messages` diff --git a/docs/cli.mdx b/docs/cli.mdx index 5f0c47d..b01f4e4 100644 --- a/docs/cli.mdx +++ b/docs/cli.mdx @@ -217,6 +217,16 @@ sandbox-agent api agents modes sandbox-agent api agents modes claude ``` +#### Get Agent Models + +```bash +sandbox-agent api agents models +``` + +```bash +sandbox-agent api agents models claude +``` + --- ### Sessions @@ -377,6 +387,7 @@ sandbox-agent api sessions reply-permission my-session perm1 --reply once | `api agents list` | `GET /v1/agents` | | `api agents install` | `POST /v1/agents/{agent}/install` | | `api agents modes` | `GET /v1/agents/{agent}/modes` | +| `api agents models` | `GET /v1/agents/{agent}/models` | | `api sessions list` | `GET /v1/sessions` | | `api sessions create` | `POST /v1/sessions/{sessionId}` | | `api sessions send-message` | `POST /v1/sessions/{sessionId}/messages` | diff --git a/docs/openapi.json b/docs/openapi.json index 69a809a..d422563 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -102,6 +102,47 @@ } } }, + "/v1/agents/{agent}/models": { + "get": { + "tags": [ + "agents" + ], + "operationId": "get_agent_models", + "parameters": [ + { + "name": "agent", + "in": "path", + "description": "Agent id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AgentModelsResponse" + } + } + } + }, + "400": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, "/v1/agents/{agent}/modes": { "get": { "tags": [ @@ -669,6 +710,7 @@ "mcpTools", "streamingDeltas", "itemStarted", + "variants", "sharedProcess" ], "properties": { @@ -726,6 +768,9 @@ }, "toolResults": { "type": "boolean" + }, + "variants": { + "type": "boolean" } } }, @@ -832,6 +877,50 @@ } } }, + "AgentModelInfo": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "defaultVariant": { + "type": "string", + "nullable": true + }, + "id": { + "type": "string" + }, + "name": { + "type": "string", + "nullable": true + }, + "variants": { + "type": "array", + "items": { + "type": "string" + }, + "nullable": true + } + } + }, + "AgentModelsResponse": { + "type": "object", + "required": [ + "models" + ], + "properties": { + "defaultModel": { + "type": "string", + "nullable": true + }, + "models": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentModelInfo" + } + } + } + }, "AgentModesResponse": { "type": "object", "required": [ diff --git a/docs/session-transcript-schema.mdx b/docs/session-transcript-schema.mdx index a5a0158..3abc82f 100644 --- a/docs/session-transcript-schema.mdx +++ b/docs/session-transcript-schema.mdx @@ -29,6 +29,7 @@ This table shows which agent feature coverage appears in the universal event str | File Changes | - | ✓ | - | - | | MCP Tools | - | ✓ | - | - | | Streaming Deltas | ✓ | ✓ | ✓ | - | +| Variants | | ✓ | ✓ | ✓ | Agents: [Claude Code](https://docs.anthropic.com/en/docs/agents-and-tools/claude-code/overview) · [Codex](https://github.com/openai/codex) · [OpenCode](https://github.com/opencode-ai/opencode) · [Amp](https://ampcode.com) @@ -76,6 +77,9 @@ Agents: [Claude Code](https://docs.anthropic.com/en/docs/agents-and-tools/claude Native streaming of content deltas. When not supported, the daemon emits a single synthetic delta before `item.completed`. + + Model variants such as reasoning effort or depth. Agents may expose different variant sets per model. + Want support for another agent? [Open an issue](https://github.com/rivet-dev/sandbox-agent/issues/new) to request it. diff --git a/frontend/packages/inspector/src/App.tsx b/frontend/packages/inspector/src/App.tsx index cd4e118..5429dcd 100644 --- a/frontend/packages/inspector/src/App.tsx +++ b/frontend/packages/inspector/src/App.tsx @@ -3,6 +3,7 @@ import { SandboxAgentError, SandboxAgent, type AgentInfo, + type AgentModelInfo, type AgentModeInfo, type PermissionEventData, type QuestionEventData, @@ -89,6 +90,8 @@ export default function App() { const [agents, setAgents] = useState([]); const [modesByAgent, setModesByAgent] = useState>({}); + const [modelsByAgent, setModelsByAgent] = useState>({}); + const [defaultModelByAgent, setDefaultModelByAgent] = useState>({}); const [sessions, setSessions] = useState([]); const [agentsLoading, setAgentsLoading] = useState(false); const [agentsError, setAgentsError] = useState(null); @@ -96,6 +99,8 @@ export default function App() { const [sessionsError, setSessionsError] = useState(null); const [modesLoadingByAgent, setModesLoadingByAgent] = useState>({}); const [modesErrorByAgent, setModesErrorByAgent] = useState>({}); + const [modelsLoadingByAgent, setModelsLoadingByAgent] = useState>({}); + const [modelsErrorByAgent, setModelsErrorByAgent] = useState>({}); const [agentId, setAgentId] = useState("claude"); const [agentMode, setAgentMode] = useState(""); @@ -252,10 +257,14 @@ export default function App() { stopTurnStream(); setAgents([]); setSessions([]); + setModelsByAgent({}); + setDefaultModelByAgent({}); setAgentsLoading(false); setSessionsLoading(false); setAgentsError(null); setSessionsError(null); + setModelsLoadingByAgent({}); + setModelsErrorByAgent({}); }; const refreshAgents = async () => { @@ -268,6 +277,7 @@ export default function App() { for (const agent of agentList) { if (agent.installed) { loadModes(agent.id); + loadModels(agent.id); } } } catch (error) { @@ -314,6 +324,29 @@ export default function App() { } }; + const loadModels = async (targetId: string) => { + setModelsLoadingByAgent((prev) => ({ ...prev, [targetId]: true })); + setModelsErrorByAgent((prev) => ({ ...prev, [targetId]: null })); + try { + const data = await getClient().getAgentModels(targetId); + const models = data.models ?? []; + setModelsByAgent((prev) => ({ ...prev, [targetId]: models })); + if (data.defaultModel) { + setDefaultModelByAgent((prev) => ({ ...prev, [targetId]: data.defaultModel! })); + } else { + setDefaultModelByAgent((prev) => { + const next = { ...prev }; + delete next[targetId]; + return next; + }); + } + } catch { + setModelsErrorByAgent((prev) => ({ ...prev, [targetId]: "Unable to load models." })); + } finally { + setModelsLoadingByAgent((prev) => ({ ...prev, [targetId]: false })); + } + }; + const sendMessage = async () => { const prompt = message.trim(); if (!prompt || !sessionId || turnStreaming) return; @@ -825,6 +858,12 @@ export default function App() { } }, [connected, agentId]); + useEffect(() => { + if (connected && agentId && !modelsByAgent[agentId]) { + loadModels(agentId); + } + }, [connected, agentId]); + useEffect(() => { const modes = modesByAgent[agentId]; if (modes && modes.length > 0 && !agentMode) { @@ -836,6 +875,15 @@ export default function App() { const activeModes = modesByAgent[agentId] ?? []; const modesLoading = modesLoadingByAgent[agentId] ?? false; const modesError = modesErrorByAgent[agentId] ?? null; + const modelOptions = modelsByAgent[agentId] ?? []; + const modelsLoading = modelsLoadingByAgent[agentId] ?? false; + const modelsError = modelsErrorByAgent[agentId] ?? null; + const defaultModel = defaultModelByAgent[agentId] ?? ""; + const selectedModelId = model || defaultModel; + const selectedModel = modelOptions.find((entry) => entry.id === selectedModelId); + const variantOptions = selectedModel?.variants ?? []; + const defaultVariant = selectedModel?.defaultVariant ?? ""; + const supportsVariants = Boolean(currentAgent?.capabilities?.variants); const agentDisplayNames: Record = { claude: "Claude Code", codex: "Codex", @@ -936,6 +984,13 @@ export default function App() { permissionMode={permissionMode} model={model} variant={variant} + modelOptions={modelOptions} + defaultModel={defaultModel} + modelsLoading={modelsLoading} + modelsError={modelsError} + variantOptions={variantOptions} + defaultVariant={defaultVariant} + supportsVariants={supportsVariants} streamMode={streamMode} activeModes={activeModes} currentAgentVersion={currentAgent?.version ?? null} diff --git a/frontend/packages/inspector/src/components/agents/FeatureCoverageBadges.tsx b/frontend/packages/inspector/src/components/agents/FeatureCoverageBadges.tsx index 59ebb92..0ff41d0 100644 --- a/frontend/packages/inspector/src/components/agents/FeatureCoverageBadges.tsx +++ b/frontend/packages/inspector/src/components/agents/FeatureCoverageBadges.tsx @@ -10,6 +10,7 @@ import { GitBranch, HelpCircle, Image, + Layers, MessageSquare, Paperclip, PlayCircle, @@ -37,7 +38,8 @@ const badges = [ { key: "fileChanges", label: "File Changes", icon: FileDiff }, { key: "mcpTools", label: "MCP", icon: Plug }, { key: "streamingDeltas", label: "Deltas", icon: Activity }, - { key: "itemStarted", label: "Item Start", icon: CircleDot } + { key: "itemStarted", label: "Item Start", icon: CircleDot }, + { key: "variants", label: "Variants", icon: Layers } ] as const; type BadgeItem = (typeof badges)[number]; diff --git a/frontend/packages/inspector/src/components/chat/ChatPanel.tsx b/frontend/packages/inspector/src/components/chat/ChatPanel.tsx index 4faea51..e6c1f9e 100644 --- a/frontend/packages/inspector/src/components/chat/ChatPanel.tsx +++ b/frontend/packages/inspector/src/components/chat/ChatPanel.tsx @@ -1,6 +1,6 @@ import { MessageSquare, PauseCircle, PlayCircle, Plus, Square, Terminal } from "lucide-react"; import { useEffect, useRef, useState } from "react"; -import type { AgentInfo, AgentModeInfo, PermissionEventData, QuestionEventData } from "sandbox-agent"; +import type { AgentInfo, AgentModelInfo, AgentModeInfo, PermissionEventData, QuestionEventData } from "sandbox-agent"; import ApprovalsTab from "../debug/ApprovalsTab"; import ChatInput from "./ChatInput"; import ChatMessages from "./ChatMessages"; @@ -28,6 +28,13 @@ const ChatPanel = ({ permissionMode, model, variant, + modelOptions, + defaultModel, + modelsLoading, + modelsError, + variantOptions, + defaultVariant, + supportsVariants, streamMode, activeModes, currentAgentVersion, @@ -70,6 +77,13 @@ const ChatPanel = ({ permissionMode: string; model: string; variant: string; + modelOptions: AgentModelInfo[]; + defaultModel: string; + modelsLoading: boolean; + modelsError: string | null; + variantOptions: string[]; + defaultVariant: string; + supportsVariants: boolean; streamMode: "poll" | "sse" | "turn"; activeModes: AgentModeInfo[]; currentAgentVersion?: string | null; @@ -277,6 +291,13 @@ const ChatPanel = ({ permissionMode={permissionMode} model={model} variant={variant} + modelOptions={modelOptions} + defaultModel={defaultModel} + modelsLoading={modelsLoading} + modelsError={modelsError} + variantOptions={variantOptions} + defaultVariant={defaultVariant} + supportsVariants={supportsVariants} activeModes={activeModes} modesLoading={modesLoading} modesError={modesError} diff --git a/frontend/packages/inspector/src/components/chat/ChatSetup.tsx b/frontend/packages/inspector/src/components/chat/ChatSetup.tsx index ded3825..c04bb6b 100644 --- a/frontend/packages/inspector/src/components/chat/ChatSetup.tsx +++ b/frontend/packages/inspector/src/components/chat/ChatSetup.tsx @@ -1,10 +1,17 @@ -import type { AgentModeInfo } from "sandbox-agent"; +import type { AgentModelInfo, AgentModeInfo } from "sandbox-agent"; const ChatSetup = ({ agentMode, permissionMode, model, variant, + modelOptions, + defaultModel, + modelsLoading, + modelsError, + variantOptions, + defaultVariant, + supportsVariants, activeModes, hasSession, modesLoading, @@ -18,6 +25,13 @@ const ChatSetup = ({ permissionMode: string; model: string; variant: string; + modelOptions: AgentModelInfo[]; + defaultModel: string; + modelsLoading: boolean; + modelsError: string | null; + variantOptions: string[]; + defaultVariant: string; + supportsVariants: boolean; activeModes: AgentModeInfo[]; hasSession: boolean; modesLoading: boolean; @@ -27,6 +41,16 @@ const ChatSetup = ({ onModelChange: (value: string) => void; onVariantChange: (value: string) => void; }) => { + const showModelSelect = modelsLoading || Boolean(modelsError) || modelOptions.length > 0; + const hasModelOptions = modelOptions.length > 0; + const showVariantSelect = + supportsVariants && (modelsLoading || Boolean(modelsError) || variantOptions.length > 0); + const hasVariantOptions = variantOptions.length > 0; + const modelCustom = + model && hasModelOptions && !modelOptions.some((entry) => entry.id === model); + const variantCustom = + variant && hasVariantOptions && !variantOptions.includes(variant); + return (
@@ -71,26 +95,82 @@ const ChatSetup = ({
Model - onModelChange(e.target.value)} - placeholder="Model" - title="Model" - disabled={!hasSession} - /> + {showModelSelect ? ( + + ) : ( + onModelChange(e.target.value)} + placeholder="Model" + title="Model" + disabled={!hasSession} + /> + )}
Variant - onVariantChange(e.target.value)} - placeholder="Variant" - title="Variant" - disabled={!hasSession} - /> + {showVariantSelect ? ( + + ) : ( + onVariantChange(e.target.value)} + placeholder={supportsVariants ? "Variant" : "Variants unsupported"} + title="Variant" + disabled={!hasSession || !supportsVariants} + /> + )}
); diff --git a/frontend/packages/inspector/src/types/agents.ts b/frontend/packages/inspector/src/types/agents.ts index 80e7e5b..4a1b9f6 100644 --- a/frontend/packages/inspector/src/types/agents.ts +++ b/frontend/packages/inspector/src/types/agents.ts @@ -14,6 +14,7 @@ export type FeatureCoverageView = AgentCapabilities & { mcpTools?: boolean; streamingDeltas?: boolean; itemStarted?: boolean; + variants?: boolean; }; export const emptyFeatureCoverage: FeatureCoverageView = { @@ -34,5 +35,6 @@ export const emptyFeatureCoverage: FeatureCoverageView = { mcpTools: false, streamingDeltas: false, itemStarted: false, + variants: false, sharedProcess: false }; diff --git a/sdks/typescript/src/client.ts b/sdks/typescript/src/client.ts index 7f9ad95..f290406 100644 --- a/sdks/typescript/src/client.ts +++ b/sdks/typescript/src/client.ts @@ -2,6 +2,7 @@ import type { SandboxAgentSpawnHandle, SandboxAgentSpawnOptions } from "./spawn. import type { AgentInstallRequest, AgentListResponse, + AgentModelsResponse, AgentModesResponse, CreateSessionRequest, CreateSessionResponse, @@ -113,6 +114,10 @@ export class SandboxAgent { return this.requestJson("GET", `${API_PREFIX}/agents/${encodeURIComponent(agent)}/modes`); } + async getAgentModels(agent: string): Promise { + return this.requestJson("GET", `${API_PREFIX}/agents/${encodeURIComponent(agent)}/models`); + } + async createSession(sessionId: string, request: CreateSessionRequest): Promise { return this.requestJson("POST", `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}`, { body: request, diff --git a/sdks/typescript/src/generated/openapi.ts b/sdks/typescript/src/generated/openapi.ts index 52816ad..1e3239e 100644 --- a/sdks/typescript/src/generated/openapi.ts +++ b/sdks/typescript/src/generated/openapi.ts @@ -11,6 +11,9 @@ export interface paths { "/v1/agents/{agent}/install": { post: operations["install_agent"]; }; + "/v1/agents/{agent}/models": { + get: operations["get_agent_models"]; + }; "/v1/agents/{agent}/modes": { get: operations["get_agent_modes"]; }; @@ -73,6 +76,7 @@ export interface components { textMessages: boolean; toolCalls: boolean; toolResults: boolean; + variants: boolean; }; AgentError: { agent?: string | null; @@ -100,6 +104,16 @@ export interface components { id: string; name: string; }; + AgentModelInfo: { + defaultVariant?: string | null; + id: string; + name?: string | null; + variants?: string[] | null; + }; + AgentModelsResponse: { + defaultModel?: string | null; + models: components["schemas"]["AgentModelInfo"][]; + }; AgentModesResponse: { modes: components["schemas"]["AgentModeInfo"][]; }; @@ -383,6 +397,26 @@ export interface operations { }; }; }; + get_agent_models: { + parameters: { + path: { + /** @description Agent id */ + agent: string; + }; + }; + responses: { + 200: { + content: { + "application/json": components["schemas"]["AgentModelsResponse"]; + }; + }; + 400: { + content: { + "application/json": components["schemas"]["ProblemDetails"]; + }; + }; + }; + }; get_agent_modes: { parameters: { path: { diff --git a/sdks/typescript/src/index.ts b/sdks/typescript/src/index.ts index db8b4eb..1d5d349 100644 --- a/sdks/typescript/src/index.ts +++ b/sdks/typescript/src/index.ts @@ -10,6 +10,8 @@ export type { AgentInfo, AgentInstallRequest, AgentListResponse, + AgentModelInfo, + AgentModelsResponse, AgentModeInfo, AgentModesResponse, AgentUnparsedData, diff --git a/sdks/typescript/src/types.ts b/sdks/typescript/src/types.ts index e0c43df..350df6b 100644 --- a/sdks/typescript/src/types.ts +++ b/sdks/typescript/src/types.ts @@ -6,6 +6,8 @@ export type AgentCapabilities = S["AgentCapabilities"]; export type AgentInfo = S["AgentInfo"]; export type AgentInstallRequest = S["AgentInstallRequest"]; export type AgentListResponse = S["AgentListResponse"]; +export type AgentModelInfo = S["AgentModelInfo"]; +export type AgentModelsResponse = S["AgentModelsResponse"]; export type AgentModeInfo = S["AgentModeInfo"]; export type AgentModesResponse = S["AgentModesResponse"]; export type AgentUnparsedData = S["AgentUnparsedData"]; diff --git a/server/packages/sandbox-agent/src/cli.rs b/server/packages/sandbox-agent/src/cli.rs index b0a40d7..724468c 100644 --- a/server/packages/sandbox-agent/src/cli.rs +++ b/server/packages/sandbox-agent/src/cli.rs @@ -19,8 +19,8 @@ use crate::router::{ PermissionReply, PermissionReplyRequest, QuestionReplyRequest, }; use crate::router::{ - AgentListResponse, AgentModesResponse, CreateSessionResponse, EventsResponse, - SessionListResponse, + AgentListResponse, AgentModelsResponse, AgentModesResponse, CreateSessionResponse, + EventsResponse, SessionListResponse, }; use crate::server_logs::ServerLogs; use crate::telemetry; @@ -228,6 +228,8 @@ pub enum AgentsCommand { Install(ApiInstallAgentArgs), /// Show available modes for an agent. Modes(AgentModesArgs), + /// Show available models for an agent. + Models(AgentModelsArgs), } #[derive(Subcommand, Debug)] @@ -294,6 +296,13 @@ pub struct AgentModesArgs { client: ClientArgs, } +#[derive(Args, Debug)] +pub struct AgentModelsArgs { + agent: String, + #[command(flatten)] + client: ClientArgs, +} + #[derive(Args, Debug)] pub struct CreateSessionArgs { session_id: String, @@ -650,6 +659,12 @@ fn run_agents(command: &AgentsCommand, cli: &CliConfig) -> Result<(), CliError> let response = ctx.get(&path)?; print_json_response::(response) } + AgentsCommand::Models(args) => { + let ctx = ClientContext::new(cli, &args.client)?; + let path = format!("{API_PREFIX}/agents/{}/models", args.agent); + let response = ctx.get(&path)?; + print_json_response::(response) + } } } diff --git a/server/packages/sandbox-agent/src/opencode_compat.rs b/server/packages/sandbox-agent/src/opencode_compat.rs index 6fbcd9e..982cdcc 100644 --- a/server/packages/sandbox-agent/src/opencode_compat.rs +++ b/server/packages/sandbox-agent/src/opencode_compat.rs @@ -23,7 +23,7 @@ use tokio::sync::{broadcast, Mutex}; use tokio::time::interval; use utoipa::{IntoParams, OpenApi, ToSchema}; -use crate::router::{AppState, CreateSessionRequest, PermissionReply}; +use crate::router::{AgentModelInfo, AppState, CreateSessionRequest, PermissionReply}; use sandbox_agent_agent_management::agents::AgentId; use sandbox_agent_error::SandboxError; use sandbox_agent_universal_agent_schema::{ @@ -218,6 +218,19 @@ struct OpenCodeSessionRuntime { tool_args_by_call: HashMap, } +#[derive(Clone, Debug)] +struct OpenCodeModelEntry { + agent: AgentId, + model: AgentModelInfo, +} + +#[derive(Clone, Debug)] +struct OpenCodeModelCache { + entries: Vec, + model_lookup: HashMap, + default_model: String, +} + pub struct OpenCodeState { config: OpenCodeCompatConfig, default_project_id: String, @@ -229,6 +242,7 @@ pub struct OpenCodeState { session_runtime: Mutex>, session_streams: Mutex>, event_broadcaster: broadcast::Sender, + model_cache: Mutex>, } impl OpenCodeState { @@ -246,6 +260,7 @@ impl OpenCodeState { session_runtime: Mutex::new(HashMap::new()), session_streams: Mutex::new(HashMap::new()), event_broadcaster, + model_cache: Mutex::new(None), } } @@ -591,12 +606,88 @@ fn default_agent_mode() -> &'static str { OPENCODE_DEFAULT_AGENT_MODE } -fn resolve_agent_from_model(provider_id: &str, model_id: &str) -> Option { - if provider_id == OPENCODE_PROVIDER_ID { - AgentId::parse(model_id) - } else { - None +async fn opencode_model_cache(state: &OpenCodeAppState) -> OpenCodeModelCache { + { + let cache = state.opencode.model_cache.lock().await; + if let Some(cache) = cache.as_ref() { + return cache.clone(); + } } + + let cache = build_opencode_model_cache(state).await; + let mut slot = state.opencode.model_cache.lock().await; + *slot = Some(cache.clone()); + cache +} + +async fn build_opencode_model_cache(state: &OpenCodeAppState) -> OpenCodeModelCache { + let mut entries = Vec::new(); + let mut model_lookup = HashMap::new(); + let mut default_model: Option = None; + + for agent in available_agent_ids() { + let response = match state.inner.session_manager().agent_models(agent).await { + Ok(response) => response, + Err(_) => continue, + }; + + if default_model.is_none() { + default_model = response + .default_model + .clone() + .or_else(|| response.models.first().map(|model| model.id.clone())); + } + + for model in response.models { + let model_id = model.id.clone(); + if model_lookup.contains_key(&model_id) { + continue; + } + model_lookup.insert(model_id.clone(), agent); + entries.push(OpenCodeModelEntry { agent, model }); + } + } + + let default_model = if model_lookup.contains_key(OPENCODE_DEFAULT_MODEL_ID) { + OPENCODE_DEFAULT_MODEL_ID.to_string() + } else { + default_model.unwrap_or_else(|| OPENCODE_DEFAULT_MODEL_ID.to_string()) + }; + + OpenCodeModelCache { + entries, + model_lookup, + default_model, + } +} + +fn resolve_agent_from_model( + cache: &OpenCodeModelCache, + provider_id: &str, + model_id: &str, +) -> Option { + if provider_id != OPENCODE_PROVIDER_ID { + return None; + } + if let Some(agent) = cache.model_lookup.get(model_id) { + return Some(*agent); + } + if let Some(agent) = AgentId::parse(model_id) { + return Some(agent); + } + if model_id.contains('/') { + return Some(AgentId::Opencode); + } + if model_id.starts_with("claude-") { + return Some(AgentId::Claude); + } + if ["smart", "rush", "deep", "free"].contains(&model_id) { + return Some(AgentId::Amp); + } + if model_id.starts_with("gpt-") || model_id.starts_with('o') { + return Some(AgentId::Codex); + } + None } fn normalize_agent_mode(agent: Option) -> String { @@ -611,19 +702,22 @@ async fn resolve_session_agent( requested_provider: Option<&str>, requested_model: Option<&str>, ) -> (String, String, String) { + let cache = opencode_model_cache(state).await; + let default_model_id = cache.default_model.clone(); let mut provider_id = requested_provider .filter(|value| !value.is_empty()) .unwrap_or(OPENCODE_PROVIDER_ID) .to_string(); let mut model_id = requested_model .filter(|value| !value.is_empty()) - .unwrap_or(OPENCODE_DEFAULT_MODEL_ID) + .unwrap_or(default_model_id.as_str()) .to_string(); - let mut resolved_agent = resolve_agent_from_model(&provider_id, &model_id); + let mut resolved_agent = resolve_agent_from_model(&cache, &provider_id, &model_id); if resolved_agent.is_none() { provider_id = OPENCODE_PROVIDER_ID.to_string(); - model_id = OPENCODE_DEFAULT_MODEL_ID.to_string(); - resolved_agent = Some(default_agent_id()); + model_id = default_model_id.clone(); + resolved_agent = + resolve_agent_from_model(&cache, &provider_id, &model_id).or_else(|| Some(default_agent_id())); } let mut resolved_agent_id: Option = None; @@ -654,7 +748,7 @@ async fn resolve_session_agent( fn agent_display_name(agent: AgentId) -> &'static str { match agent { - AgentId::Claude => "Claude", + AgentId::Claude => "Claude Code", AgentId::Codex => "Codex", AgentId::Opencode => "OpenCode", AgentId::Amp => "Amp", @@ -662,17 +756,19 @@ fn agent_display_name(agent: AgentId) -> &'static str { } } -fn model_config_entry(agent: AgentId) -> Value { +fn model_config_entry(agent: AgentId, model: &AgentModelInfo) -> Value { + let model_name = model.name.clone().unwrap_or_else(|| model.id.clone()); + let variants = model_variants_object(model); json!({ - "id": agent.as_str(), + "id": model.id, "providerID": OPENCODE_PROVIDER_ID, "api": { "id": "sandbox-agent", "url": "http://localhost", "npm": "@sandbox-agent/sdk" }, - "name": agent_display_name(agent), - "family": "sandbox-agent", + "name": model_name, + "family": agent_display_name(agent), "capabilities": { "temperature": true, "reasoning": true, @@ -707,14 +803,17 @@ fn model_config_entry(agent: AgentId) -> Value { "options": {}, "headers": {}, "release_date": "2024-01-01", - "variants": {} + "variants": variants }) } -fn model_summary_entry(agent: AgentId) -> Value { +fn model_summary_entry(agent: AgentId, model: &AgentModelInfo) -> Value { + let model_name = model.name.clone().unwrap_or_else(|| model.id.clone()); + let variants = model_variants_object(model); json!({ - "id": agent.as_str(), - "name": agent_display_name(agent), + "id": model.id, + "name": model_name, + "family": agent_display_name(agent), "release_date": "2024-01-01", "attachment": false, "reasoning": true, @@ -724,10 +823,22 @@ fn model_summary_entry(agent: AgentId) -> Value { "limit": { "context": 128000, "output": 4096 - } + }, + "variants": variants }) } +fn model_variants_object(model: &AgentModelInfo) -> Value { + let Some(variants) = model.variants.as_ref() else { + return json!({}); + }; + let mut map = serde_json::Map::new(); + for variant in variants { + map.insert(variant.clone(), json!({})); + } + Value::Object(map) +} + fn bad_request(message: &str) -> (StatusCode, Json) { ( StatusCode::BAD_REQUEST, @@ -2351,10 +2462,16 @@ async fn oc_config_patch(Json(body): Json) -> impl IntoResponse { responses((status = 200)), tag = "opencode" )] -async fn oc_config_providers() -> impl IntoResponse { +async fn oc_config_providers( + State(state): State>, +) -> impl IntoResponse { + let cache = opencode_model_cache(&state).await; let mut models = serde_json::Map::new(); - for agent in available_agent_ids() { - models.insert(agent.as_str().to_string(), model_config_entry(agent)); + for entry in &cache.entries { + models.insert( + entry.model.id.clone(), + model_config_entry(entry.agent, &entry.model), + ); } let providers = json!({ "providers": [ @@ -2369,7 +2486,7 @@ async fn oc_config_providers() -> impl IntoResponse { } ], "default": { - OPENCODE_PROVIDER_ID: OPENCODE_DEFAULT_MODEL_ID + OPENCODE_PROVIDER_ID: cache.default_model } }); (StatusCode::OK, Json(providers)) @@ -3648,10 +3765,16 @@ async fn oc_question_reject( responses((status = 200)), tag = "opencode" )] -async fn oc_provider_list() -> impl IntoResponse { +async fn oc_provider_list( + State(state): State>, +) -> impl IntoResponse { + let cache = opencode_model_cache(&state).await; let mut models = serde_json::Map::new(); - for agent in available_agent_ids() { - models.insert(agent.as_str().to_string(), model_summary_entry(agent)); + for entry in &cache.entries { + models.insert( + entry.model.id.clone(), + model_summary_entry(entry.agent, &entry.model), + ); } let providers = json!({ "all": [ @@ -3663,7 +3786,7 @@ async fn oc_provider_list() -> impl IntoResponse { } ], "default": { - OPENCODE_PROVIDER_ID: OPENCODE_DEFAULT_MODEL_ID + OPENCODE_PROVIDER_ID: cache.default_model }, "connected": [OPENCODE_PROVIDER_ID] }); diff --git a/server/packages/sandbox-agent/src/router.rs b/server/packages/sandbox-agent/src/router.rs index 06434a9..8ac6e25 100644 --- a/server/packages/sandbox-agent/src/router.rs +++ b/server/packages/sandbox-agent/src/router.rs @@ -46,11 +46,14 @@ use sandbox_agent_agent_management::agents::{ AgentError as ManagerError, AgentId, AgentManager, InstallOptions, SpawnOptions, StreamingSpawn, }; use sandbox_agent_agent_management::credentials::{ - extract_all_credentials, CredentialExtractionOptions, ExtractedCredentials, + extract_all_credentials, AuthType, CredentialExtractionOptions, ExtractedCredentials, + ProviderCredentials, }; const MOCK_EVENT_DELAY_MS: u64 = 200; static USER_MESSAGE_COUNTER: AtomicU64 = AtomicU64::new(1); +const ANTHROPIC_MODELS_URL: &str = "https://api.anthropic.com/v1/models?beta=true"; +const ANTHROPIC_VERSION: &str = "2023-06-01"; #[derive(Debug)] pub struct AppState { @@ -103,6 +106,7 @@ pub fn build_router_with_state(shared: Arc) -> (Router, Arc) .route("/agents", get(list_agents)) .route("/agents/:agent/install", post(install_agent)) .route("/agents/:agent/modes", get(get_agent_modes)) + .route("/agents/:agent/models", get(get_agent_models)) .route("/sessions", get(list_sessions)) .route("/sessions/:session_id", post(create_session)) .route("/sessions/:session_id/messages", post(post_message)) @@ -218,6 +222,7 @@ pub async fn shutdown_servers(state: &Arc) { get_health, install_agent, get_agent_modes, + get_agent_models, list_agents, list_sessions, create_session, @@ -235,6 +240,8 @@ pub async fn shutdown_servers(state: &Arc) { AgentInstallRequest, AgentModeInfo, AgentModesResponse, + AgentModelInfo, + AgentModelsResponse, AgentCapabilities, AgentInfo, AgentListResponse, @@ -1703,6 +1710,25 @@ impl SessionManager { } } + pub(crate) async fn agent_models( + self: &Arc, + agent: AgentId, + ) -> Result { + match agent { + AgentId::Claude => self.fetch_claude_models().await, + AgentId::Codex => self.fetch_codex_models().await, + AgentId::Opencode => match self.fetch_opencode_models().await { + Ok(models) => Ok(models), + Err(_) => Ok(AgentModelsResponse { + models: Vec::new(), + default_model: None, + }), + }, + AgentId::Amp => Ok(amp_models_response()), + AgentId::Mock => Ok(mock_models_response()), + } + } + pub(crate) async fn send_message( self: &Arc, session_id: String, @@ -3155,7 +3181,7 @@ impl SessionManager { approval_policy: codex_approval_policy(Some(&session.permission_mode)), collaboration_mode: None, cwd: None, - effort: None, + effort: codex_effort_from_variant(session.variant.as_deref()), input: vec![codex_schema::UserInput::Text { text: prompt_text, text_elements: Vec::new(), @@ -3213,6 +3239,254 @@ impl SessionManager { }) } + async fn fetch_claude_models(&self) -> Result { + let credentials = self.extract_credentials().await?; + let Some(cred) = credentials.anthropic else { + return Ok(AgentModelsResponse { + models: Vec::new(), + default_model: None, + }); + }; + + let headers = build_anthropic_headers(&cred)?; + let response = self + .http_client + .get(ANTHROPIC_MODELS_URL) + .headers(headers) + .send() + .await + .map_err(|err| SandboxError::StreamError { + message: err.to_string(), + })?; + if !response.status().is_success() { + let status = response.status(); + let body = response.text().await.unwrap_or_default(); + return Err(SandboxError::StreamError { + message: format!("Anthropic models request failed {status}: {body}"), + }); + } + + let value: Value = response + .json() + .await + .map_err(|err| SandboxError::StreamError { + message: err.to_string(), + })?; + let data = value + .get("data") + .and_then(Value::as_array) + .cloned() + .unwrap_or_default(); + + let mut models = Vec::new(); + let mut default_model: Option = None; + let mut default_created: Option = None; + for item in data { + let Some(id) = item.get("id").and_then(Value::as_str) else { + continue; + }; + let name = item + .get("display_name") + .and_then(Value::as_str) + .map(|value| value.to_string()); + let created = item + .get("created_at") + .and_then(Value::as_str) + .map(|value| value.to_string()); + if let Some(created) = created.as_ref() { + let should_update = match default_created.as_deref() { + Some(current) => created.as_str() > current, + None => true, + }; + if should_update { + default_created = Some(created.clone()); + default_model = Some(id.to_string()); + } + } + models.push(AgentModelInfo { + id: id.to_string(), + name, + variants: None, + default_variant: None, + }); + } + models.sort_by(|a, b| a.id.cmp(&b.id)); + if default_model.is_none() { + default_model = models.first().map(|model| model.id.clone()); + } + + Ok(AgentModelsResponse { + models, + default_model, + }) + } + + async fn fetch_codex_models(self: &Arc) -> Result { + let server = self.ensure_codex_server().await?; + let mut models: Vec = Vec::new(); + let mut default_model: Option = None; + let mut seen = HashSet::new(); + let mut cursor: Option = None; + + loop { + let id = server.next_request_id(); + let request = json!({ + "jsonrpc": "2.0", + "id": id, + "method": "model/list", + "params": { + "cursor": cursor, + "limit": null + } + }); + let rx = server + .send_request(id, &request) + .ok_or_else(|| SandboxError::StreamError { + message: "failed to send model/list request".to_string(), + })?; + + let result = tokio::time::timeout(Duration::from_secs(30), rx).await; + let value = match result { + Ok(Ok(value)) => value, + Ok(Err(_)) => { + return Err(SandboxError::StreamError { + message: "model/list request cancelled".to_string(), + }) + } + Err(_) => { + return Err(SandboxError::StreamError { + message: "model/list request timed out".to_string(), + }) + } + }; + + let data = value + .get("data") + .and_then(Value::as_array) + .cloned() + .unwrap_or_default(); + + for item in data { + let model_id = item + .get("model") + .and_then(Value::as_str) + .or_else(|| item.get("id").and_then(Value::as_str)); + let Some(model_id) = model_id else { + continue; + }; + if !seen.insert(model_id.to_string()) { + continue; + } + + let name = item + .get("displayName") + .and_then(Value::as_str) + .map(|value| value.to_string()); + let default_variant = item + .get("defaultReasoningEffort") + .and_then(Value::as_str) + .map(|value| value.to_string()); + let mut variants: Vec = item + .get("supportedReasoningEfforts") + .and_then(Value::as_array) + .map(|values| { + values + .iter() + .filter_map(|value| { + value + .get("reasoningEffort") + .and_then(Value::as_str) + .or_else(|| value.as_str()) + .map(|entry| entry.to_string()) + }) + .collect::>() + }) + .unwrap_or_default(); + if variants.is_empty() { + variants = codex_variants(); + } + variants.sort(); + variants.dedup(); + + if default_model.is_none() + && item + .get("isDefault") + .and_then(Value::as_bool) + .unwrap_or(false) + { + default_model = Some(model_id.to_string()); + } + + models.push(AgentModelInfo { + id: model_id.to_string(), + name, + variants: Some(variants), + default_variant, + }); + } + + let next_cursor = value + .get("nextCursor") + .and_then(Value::as_str) + .map(|value| value.to_string()); + if next_cursor.is_none() { + break; + } + cursor = next_cursor; + } + + models.sort_by(|a, b| a.id.cmp(&b.id)); + if default_model.is_none() { + default_model = models.first().map(|model| model.id.clone()); + } + + Ok(AgentModelsResponse { + models, + default_model, + }) + } + + async fn fetch_opencode_models(&self) -> Result { + let base_url = self.ensure_opencode_server().await?; + let endpoints = [ + format!("{base_url}/config/providers"), + format!("{base_url}/provider"), + ]; + for url in endpoints { + let response = self.http_client.get(&url).send().await; + let response = match response { + Ok(response) => response, + Err(_) => continue, + }; + if !response.status().is_success() { + continue; + } + let value: Value = response + .json() + .await + .map_err(|err| SandboxError::StreamError { + message: err.to_string(), + })?; + if let Some(models) = parse_opencode_models(&value) { + return Ok(models); + } + } + Err(SandboxError::StreamError { + message: "OpenCode models unavailable".to_string(), + }) + } + + async fn extract_credentials(&self) -> Result { + tokio::task::spawn_blocking(move || { + let options = CredentialExtractionOptions::new(); + extract_all_credentials(&options) + }) + .await + .map_err(|err| SandboxError::StreamError { + message: err.to_string(), + }) + } + async fn create_opencode_session(&self) -> Result { let base_url = self.ensure_opencode_server().await?; let url = format!("{base_url}/session"); @@ -3479,6 +3753,26 @@ pub struct AgentModesResponse { pub modes: Vec, } +#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct AgentModelInfo { + pub id: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub variants: Option>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub default_variant: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct AgentModelsResponse { + pub models: Vec, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub default_model: Option, +} + #[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)] #[serde(rename_all = "camelCase")] pub struct AgentCapabilities { @@ -3500,6 +3794,7 @@ pub struct AgentCapabilities { pub mcp_tools: bool, pub streaming_deltas: bool, pub item_started: bool, + pub variants: bool, /// Whether this agent uses a shared long-running server process (vs per-turn subprocess) pub shared_process: bool, } @@ -3733,6 +4028,25 @@ async fn get_agent_modes( Ok(Json(AgentModesResponse { modes })) } +#[utoipa::path( + get, + path = "/v1/agents/{agent}/models", + responses( + (status = 200, body = AgentModelsResponse), + (status = 400, body = ProblemDetails) + ), + params(("agent" = String, Path, description = "Agent id")), + tag = "agents" +)] +async fn get_agent_models( + State(state): State>, + Path(agent): Path, +) -> Result, ApiError> { + let agent_id = parse_agent_id(&agent)?; + let models = state.session_manager.agent_models(agent_id).await?; + Ok(Json(models)) +} + const SERVER_INFO: &str = "\ This is a Sandbox Agent server. Available endpoints:\n\ - GET / - Server info\n\ @@ -4133,6 +4447,7 @@ fn agent_capabilities_for(agent: AgentId) -> AgentCapabilities { mcp_tools: false, streaming_deltas: true, item_started: false, + variants: false, shared_process: false, // per-turn subprocess with --resume }, AgentId::Codex => AgentCapabilities { @@ -4153,6 +4468,7 @@ fn agent_capabilities_for(agent: AgentId) -> AgentCapabilities { mcp_tools: true, streaming_deltas: true, item_started: true, + variants: true, shared_process: true, // shared app-server via JSON-RPC }, AgentId::Opencode => AgentCapabilities { @@ -4173,6 +4489,7 @@ fn agent_capabilities_for(agent: AgentId) -> AgentCapabilities { mcp_tools: false, streaming_deltas: true, item_started: true, + variants: true, shared_process: true, // shared HTTP server }, AgentId::Amp => AgentCapabilities { @@ -4193,6 +4510,7 @@ fn agent_capabilities_for(agent: AgentId) -> AgentCapabilities { mcp_tools: false, streaming_deltas: false, item_started: false, + variants: true, shared_process: false, // per-turn subprocess with --continue }, AgentId::Mock => AgentCapabilities { @@ -4213,6 +4531,7 @@ fn agent_capabilities_for(agent: AgentId) -> AgentCapabilities { mcp_tools: true, streaming_deltas: true, item_started: true, + variants: false, shared_process: false, // in-memory mock (no subprocess) }, } @@ -4287,6 +4606,118 @@ fn agent_modes_for(agent: AgentId) -> Vec { } } +fn amp_models_response() -> AgentModelsResponse { + // NOTE: Amp models are hardcoded based on ampcode.com manual: + // - smart + // - rush + // - deep + // - free + let models = ["smart", "rush", "deep", "free"] + .into_iter() + .map(|id| AgentModelInfo { + id: id.to_string(), + name: None, + variants: Some(amp_variants()), + default_variant: Some("medium".to_string()), + }) + .collect(); + AgentModelsResponse { + models, + default_model: Some("smart".to_string()), + } +} + +fn mock_models_response() -> AgentModelsResponse { + AgentModelsResponse { + models: vec![AgentModelInfo { + id: "mock".to_string(), + name: Some("Mock".to_string()), + variants: None, + default_variant: None, + }], + default_model: Some("mock".to_string()), + } +} + +fn amp_variants() -> Vec { + vec!["medium", "high", "xhigh"] + .into_iter() + .map(|value| value.to_string()) + .collect() +} + +fn codex_variants() -> Vec { + vec!["none", "minimal", "low", "medium", "high", "xhigh"] + .into_iter() + .map(|value| value.to_string()) + .collect() +} + +fn parse_opencode_models(value: &Value) -> Option { + let providers = value + .get("providers") + .and_then(Value::as_array) + .or_else(|| value.get("all").and_then(Value::as_array))?; + let default_map = value + .get("default") + .and_then(Value::as_object) + .cloned() + .unwrap_or_default(); + + let mut models = Vec::new(); + let mut provider_order = Vec::new(); + for provider in providers { + let provider_id = provider.get("id").and_then(Value::as_str)?; + provider_order.push(provider_id.to_string()); + let Some(model_map) = provider.get("models").and_then(Value::as_object) else { + continue; + }; + for (key, model) in model_map { + let model_id = model + .get("id") + .and_then(Value::as_str) + .unwrap_or(key.as_str()); + let name = model + .get("name") + .and_then(Value::as_str) + .map(|value| value.to_string()); + let mut variants = model + .get("variants") + .and_then(Value::as_object) + .map(|map| map.keys().cloned().collect::>()); + if let Some(variants) = variants.as_mut() { + variants.sort(); + } + models.push(AgentModelInfo { + id: format!("{provider_id}/{model_id}"), + name, + variants, + default_variant: None, + }); + } + } + models.sort_by(|a, b| a.id.cmp(&b.id)); + + let mut default_model = None; + for provider_id in provider_order { + if let Some(model_id) = default_map + .get(&provider_id) + .and_then(Value::as_str) + { + default_model = Some(format!("{provider_id}/{model_id}")); + break; + } + } + if default_model.is_none() { + default_model = models.first().map(|model| model.id.clone()); + } + + Some(AgentModelsResponse { + models, + default_model, + }) +} + fn normalize_agent_mode(agent: AgentId, agent_mode: Option<&str>) -> Result { let mode = agent_mode.unwrap_or("build"); match agent { @@ -4590,6 +5021,7 @@ struct CodexAppServerState { next_id: i64, prompt: String, model: Option, + effort: Option, cwd: Option, approval_policy: Option, sandbox_mode: Option, @@ -4614,6 +5046,7 @@ impl CodexAppServerState { next_id: 1, prompt, model: options.model.clone(), + effort: codex_effort_from_variant(options.variant.as_deref()), cwd, approval_policy: codex_approval_policy(options.permission_mode.as_deref()), sandbox_mode: codex_sandbox_mode(options.permission_mode.as_deref()), @@ -4859,7 +5292,7 @@ impl CodexAppServerState { approval_policy: self.approval_policy, collaboration_mode: None, cwd: self.cwd.clone(), - effort: None, + effort: self.effort.clone(), input: vec![codex_schema::UserInput::Text { text: self.prompt.clone(), text_elements: Vec::new(), @@ -4902,6 +5335,15 @@ fn codex_prompt_for_mode(prompt: &str, mode: Option<&str>) -> String { } } +fn codex_effort_from_variant(variant: Option<&str>) -> Option { + let variant = variant?.trim(); + if variant.is_empty() { + return None; + } + let normalized = variant.to_lowercase(); + serde_json::from_value(Value::String(normalized)).ok() +} + fn codex_approval_policy(mode: Option<&str>) -> Option { match mode { Some("plan") => Some(codex_schema::AskForApproval::Untrusted), @@ -6497,3 +6939,35 @@ pub fn add_token_header(headers: &mut HeaderMap, token: &str) { headers.insert(axum::http::header::AUTHORIZATION, header); } } + +fn build_anthropic_headers( + credentials: &ProviderCredentials, +) -> Result { + let mut headers = reqwest::header::HeaderMap::new(); + match credentials.auth_type { + AuthType::ApiKey => { + let value = + reqwest::header::HeaderValue::from_str(&credentials.api_key).map_err(|_| { + SandboxError::StreamError { + message: "invalid anthropic api key header".to_string(), + } + })?; + headers.insert("x-api-key", value); + } + AuthType::Oauth => { + let value = format!("Bearer {}", credentials.api_key); + let header = + reqwest::header::HeaderValue::from_str(&value).map_err(|_| { + SandboxError::StreamError { + message: "invalid anthropic oauth header".to_string(), + } + })?; + headers.insert(reqwest::header::AUTHORIZATION, header); + } + } + headers.insert( + "anthropic-version", + reqwest::header::HeaderValue::from_static(ANTHROPIC_VERSION), + ); + Ok(headers) +} diff --git a/server/packages/sandbox-agent/tests/common/http.rs b/server/packages/sandbox-agent/tests/common/http.rs index 8910e62..18a4e6c 100644 --- a/server/packages/sandbox-agent/tests/common/http.rs +++ b/server/packages/sandbox-agent/tests/common/http.rs @@ -736,6 +736,81 @@ fn normalize_agent_modes(value: &Value) -> Value { json!({ "modes": normalized }) } +fn normalize_agent_models(value: &Value, agent: AgentId) -> Value { + let models = value + .get("models") + .and_then(Value::as_array) + .cloned() + .unwrap_or_default(); + let default_model = value.get("defaultModel").and_then(Value::as_str); + + let mut map = Map::new(); + let model_count = models.len(); + map.insert("nonEmpty".to_string(), Value::Bool(model_count > 0)); + map.insert("hasDefault".to_string(), Value::Bool(default_model.is_some())); + let default_in_list = default_model.map_or(false, |default_id| { + models + .iter() + .any(|model| model.get("id").and_then(Value::as_str) == Some(default_id)) + }); + map.insert( + "defaultInList".to_string(), + Value::Bool(default_in_list), + ); + let has_variants = models.iter().any(|model| { + model + .get("variants") + .and_then(Value::as_array) + .is_some_and(|variants| !variants.is_empty()) + }); + match agent { + AgentId::Claude | AgentId::Opencode => { + map.insert( + "hasVariants".to_string(), + Value::String("".to_string()), + ); + } + _ => { + map.insert("hasVariants".to_string(), Value::Bool(has_variants)); + } + } + + if matches!(agent, AgentId::Amp | AgentId::Mock) { + map.insert( + "modelCount".to_string(), + Value::Number(model_count.into()), + ); + let mut ids: Vec = models + .iter() + .filter_map(|model| model.get("id").and_then(Value::as_str).map(|id| id.to_string())) + .collect(); + ids.sort(); + map.insert("ids".to_string(), json!(ids)); + if let Some(default_model) = default_model { + map.insert( + "defaultModel".to_string(), + Value::String(default_model.to_string()), + ); + } + if agent == AgentId::Amp { + if let Some(variants) = models + .first() + .and_then(|model| model.get("variants")) + .and_then(Value::as_array) + { + let mut variant_ids: Vec = variants + .iter() + .filter_map(|variant| variant.as_str().map(|id| id.to_string())) + .collect(); + variant_ids.sort(); + map.insert("variants".to_string(), json!(variant_ids)); + } + } + } + + Value::Object(map) +} + fn normalize_sessions(value: &Value) -> Value { let sessions = value .get("sessions") diff --git a/server/packages/sandbox-agent/tests/http/agent_endpoints.rs b/server/packages/sandbox-agent/tests/http/agent_endpoints.rs index f195205..b0fa269 100644 --- a/server/packages/sandbox-agent/tests/http/agent_endpoints.rs +++ b/server/packages/sandbox-agent/tests/http/agent_endpoints.rs @@ -162,4 +162,27 @@ async fn agent_endpoints_snapshots() { insta::assert_yaml_snapshot!(normalize_agent_modes(&modes)); }); } + + for config in &configs { + let _guard = apply_credentials(&config.credentials); + let (status, models) = send_json( + &app.app, + Method::GET, + &format!("/v1/agents/{}/models", config.agent.as_str()), + None, + ) + .await; + assert_eq!(status, StatusCode::OK, "agent models"); + let model_count = models + .get("models") + .and_then(|value| value.as_array()) + .map(|models| models.len()) + .unwrap_or_default(); + assert!(model_count > 0, "agent models should not be empty"); + insta::with_settings!({ + snapshot_suffix => snapshot_name("agent_models", Some(config.agent)), + }, { + insta::assert_yaml_snapshot!(normalize_agent_models(&models, config.agent)); + }); + } } diff --git a/server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_amp.snap b/server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_amp.snap new file mode 100644 index 0000000..10c6ff5 --- /dev/null +++ b/server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_amp.snap @@ -0,0 +1,19 @@ +--- +source: server/packages/sandbox-agent/tests/http_sse_snapshots.rs +expression: normalize_agent_models(&models, config.agent) +--- +nonEmpty: true +hasDefault: true +defaultInList: true +hasVariants: true +modelCount: 4 +ids: + - deep + - free + - rush + - smart +defaultModel: smart +variants: + - high + - medium + - xhigh diff --git a/server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_claude.snap b/server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_claude.snap new file mode 100644 index 0000000..d493d4a --- /dev/null +++ b/server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_claude.snap @@ -0,0 +1,8 @@ +--- +source: server/packages/sandbox-agent/tests/http_sse_snapshots.rs +expression: normalize_agent_models(&models, config.agent) +--- +nonEmpty: true +hasDefault: true +defaultInList: true +hasVariants: "" diff --git a/server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_codex.snap b/server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_codex.snap new file mode 100644 index 0000000..977a38c --- /dev/null +++ b/server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_codex.snap @@ -0,0 +1,8 @@ +--- +source: server/packages/sandbox-agent/tests/http_sse_snapshots.rs +expression: normalize_agent_models(&models, config.agent) +--- +nonEmpty: true +hasDefault: true +defaultInList: true +hasVariants: true diff --git a/server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_mock.snap b/server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_mock.snap new file mode 100644 index 0000000..f5e2b0a --- /dev/null +++ b/server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_mock.snap @@ -0,0 +1,12 @@ +--- +source: server/packages/sandbox-agent/tests/http_sse_snapshots.rs +expression: normalize_agent_models(&models, config.agent) +--- +nonEmpty: true +hasDefault: true +defaultInList: true +hasVariants: false +modelCount: 1 +ids: + - mock +defaultModel: mock diff --git a/server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_opencode.snap b/server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_opencode.snap new file mode 100644 index 0000000..d493d4a --- /dev/null +++ b/server/packages/sandbox-agent/tests/http/snapshots/agent_endpoints__agent_endpoints_snapshots@agent_models_opencode.snap @@ -0,0 +1,8 @@ +--- +source: server/packages/sandbox-agent/tests/http_sse_snapshots.rs +expression: normalize_agent_models(&models, config.agent) +--- +nonEmpty: true +hasDefault: true +defaultInList: true +hasVariants: "" diff --git a/server/packages/sandbox-agent/tests/opencode-compat/models.test.ts b/server/packages/sandbox-agent/tests/opencode-compat/models.test.ts new file mode 100644 index 0000000..68ef0c0 --- /dev/null +++ b/server/packages/sandbox-agent/tests/opencode-compat/models.test.ts @@ -0,0 +1,49 @@ +/** + * Tests for OpenCode-compatible provider/model listing. + */ + +import { describe, it, expect, beforeAll, afterEach, beforeEach } from "vitest"; +import { createOpencodeClient, type OpencodeClient } from "@opencode-ai/sdk"; +import { spawnSandboxAgent, buildSandboxAgent, type SandboxAgentHandle } from "./helpers/spawn"; + +describe("OpenCode-compatible Model API", () => { + let handle: SandboxAgentHandle; + let client: OpencodeClient; + + beforeAll(async () => { + await buildSandboxAgent(); + }); + + beforeEach(async () => { + handle = await spawnSandboxAgent({ opencodeCompat: true }); + client = createOpencodeClient({ + baseUrl: `${handle.baseUrl}/opencode`, + headers: { Authorization: `Bearer ${handle.token}` }, + }); + }); + + afterEach(async () => { + await handle?.dispose(); + }); + + it("should list models grouped by agent with real model IDs", async () => { + const response = await client.provider.list(); + const provider = response.data?.all?.find((entry) => entry.id === "sandbox-agent"); + expect(provider).toBeDefined(); + + const models = provider?.models ?? {}; + const modelIds = Object.keys(models); + expect(modelIds.length).toBeGreaterThan(0); + + expect(models["mock"]).toBeDefined(); + expect(models["mock"].id).toBe("mock"); + expect(models["mock"].family).toBe("Mock"); + + expect(models["smart"]).toBeDefined(); + expect(models["smart"].id).toBe("smart"); + expect(models["smart"].family).toBe("Amp"); + + expect(models["amp"]).toBeUndefined(); + expect(response.data?.default?.["sandbox-agent"]).toBe("mock"); + }); +}); From c0800e1a4372435d9a20c1b6ad071babb12db887 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 6 Feb 2026 03:01:24 -0800 Subject: [PATCH 07/19] fix: consistent turn.completed signal and OpenCode session.idle timing (#97) --- .../sandbox-agent/src/opencode_compat.rs | 32 ++++--- server/packages/sandbox-agent/src/router.rs | 35 ++++--- .../tests/opencode-compat/events.test.ts | 94 +++++++++++++++++++ .../universal-agent-schema/src/agents/amp.rs | 7 +- .../src/agents/claude.rs | 17 ++-- .../universal-agent-schema/src/lib.rs | 21 +++++ 6 files changed, 171 insertions(+), 35 deletions(-) diff --git a/server/packages/sandbox-agent/src/opencode_compat.rs b/server/packages/sandbox-agent/src/opencode_compat.rs index 982cdcc..d91d26c 100644 --- a/server/packages/sandbox-agent/src/opencode_compat.rs +++ b/server/packages/sandbox-agent/src/opencode_compat.rs @@ -1410,6 +1410,25 @@ async fn apply_universal_event(state: Arc, event: UniversalEve match event.event_type { UniversalEventType::ItemStarted | UniversalEventType::ItemCompleted => { if let UniversalEventData::Item(ItemEventData { item }) = &event.data { + // turn.completed or session.idle status → emit session.idle + if event.event_type == UniversalEventType::ItemCompleted + && item.kind == ItemKind::Status + { + if let Some(ContentPart::Status { label, .. }) = item.content.first() { + if label == "turn.completed" || label == "session.idle" { + let session_id = event.session_id.clone(); + state.opencode.emit_event(json!({ + "type": "session.status", + "properties": {"sessionID": session_id, "status": {"type": "idle"}} + })); + state.opencode.emit_event(json!({ + "type": "session.idle", + "properties": {"sessionID": session_id} + })); + return; + } + } + } apply_item_event(state, event.clone(), item.clone()).await; } } @@ -1894,19 +1913,6 @@ async fn apply_item_event( } } - if event.event_type == UniversalEventType::ItemCompleted { - state.opencode.emit_event(json!({ - "type": "session.status", - "properties": { - "sessionID": session_id, - "status": {"type": "idle"} - } - })); - state.opencode.emit_event(json!({ - "type": "session.idle", - "properties": { "sessionID": session_id } - })); - } } async fn apply_tool_item_event( diff --git a/server/packages/sandbox-agent/src/router.rs b/server/packages/sandbox-agent/src/router.rs index 8ac6e25..3746240 100644 --- a/server/packages/sandbox-agent/src/router.rs +++ b/server/packages/sandbox-agent/src/router.rs @@ -22,8 +22,8 @@ use reqwest::Client; use sandbox_agent_error::{AgentError, ErrorType, ProblemDetails, SandboxError}; use sandbox_agent_universal_agent_schema::{ codex as codex_schema, convert_amp, convert_claude, convert_codex, convert_opencode, - AgentUnparsedData, ContentPart, ErrorData, EventConversion, EventSource, FileAction, - ItemDeltaData, ItemEventData, ItemKind, ItemRole, ItemStatus, PermissionEventData, + turn_completed_event, AgentUnparsedData, ContentPart, ErrorData, EventConversion, EventSource, + FileAction, ItemDeltaData, ItemEventData, ItemKind, ItemRole, ItemStatus, PermissionEventData, PermissionStatus, QuestionEventData, QuestionStatus, ReasoningVisibility, SessionEndReason, SessionEndedData, SessionStartedData, StderrOutput, TerminatedBy, UniversalEvent, UniversalEventData, UniversalEventType, UniversalItem, @@ -6029,7 +6029,26 @@ fn mock_command_conversions(prefix: &str, input: &str) -> Vec { if trimmed.is_empty() { return vec![]; } + let mut events = mock_command_events(prefix, trimmed); + if should_append_turn_completed(&events) { + events.push(turn_completed_event()); + } + events +} +fn should_append_turn_completed(events: &[EventConversion]) -> bool { + let Some(last) = events.last() else { + return false; + }; + !matches!( + last.event_type, + UniversalEventType::SessionEnded + | UniversalEventType::PermissionRequested + | UniversalEventType::QuestionRequested + ) +} + +fn mock_command_events(prefix: &str, trimmed: &str) -> Vec { if trimmed.eq_ignore_ascii_case(MOCK_OK_PROMPT) { return mock_assistant_message(format!("{prefix}_ok"), "OK".to_string()); } @@ -6864,7 +6883,7 @@ fn stream_turn_events( }) } -fn is_turn_terminal(event: &UniversalEvent, agent: AgentId) -> bool { +fn is_turn_terminal(event: &UniversalEvent, _agent: AgentId) -> bool { match event.event_type { UniversalEventType::SessionEnded | UniversalEventType::Error @@ -6875,15 +6894,7 @@ fn is_turn_terminal(event: &UniversalEvent, agent: AgentId) -> bool { let UniversalEventData::Item(ItemEventData { item }) = &event.data else { return false; }; - if let Some(label) = status_label(item) { - if label == "turn.completed" || label == "session.idle" { - return true; - } - } - if matches!(item.role, Some(ItemRole::Assistant)) && item.kind == ItemKind::Message { - return agent != AgentId::Codex; - } - false + matches!(status_label(item), Some("turn.completed" | "session.idle")) } _ => false, } diff --git a/server/packages/sandbox-agent/tests/opencode-compat/events.test.ts b/server/packages/sandbox-agent/tests/opencode-compat/events.test.ts index 587ebf3..61ab1f3 100644 --- a/server/packages/sandbox-agent/tests/opencode-compat/events.test.ts +++ b/server/packages/sandbox-agent/tests/opencode-compat/events.test.ts @@ -145,4 +145,98 @@ describe("OpenCode-compatible Event Streaming", () => { expect(response.data).toBeDefined(); }); }); + + describe("session.idle count", () => { + it("should emit exactly one session.idle for echo flow", async () => { + const session = await client.session.create(); + const sessionId = session.data?.id!; + + const eventStream = await client.event.subscribe(); + const idleEvents: any[] = []; + + // Wait for first idle, then linger 1s for duplicates + const collectIdle = new Promise((resolve, reject) => { + let lingerTimer: ReturnType | null = null; + const timeout = setTimeout(() => reject(new Error("Timed out waiting for session.idle")), 15_000); + (async () => { + try { + for await (const event of (eventStream as any).stream) { + if (event.type === "session.idle") { + idleEvents.push(event); + if (!lingerTimer) { + lingerTimer = setTimeout(() => { + clearTimeout(timeout); + resolve(); + }, 1000); + } + } + } + } catch { + // Stream ended + } + })(); + }); + + await client.session.prompt({ + path: { id: sessionId }, + body: { + model: { providerID: "sandbox-agent", modelID: "mock" }, + parts: [{ type: "text", text: "echo hello" }], + }, + }); + + await collectIdle; + expect(idleEvents.length).toBe(1); + }); + + it("should emit exactly one session.idle for tool flow", async () => { + const session = await client.session.create(); + const sessionId = session.data?.id!; + + const eventStream = await client.event.subscribe(); + const allEvents: any[] = []; + const idleEvents: any[] = []; + + const collectIdle = new Promise((resolve, reject) => { + let lingerTimer: ReturnType | null = null; + const timeout = setTimeout(() => reject(new Error("Timed out waiting for session.idle")), 15_000); + (async () => { + try { + for await (const event of (eventStream as any).stream) { + allEvents.push(event); + if (event.type === "session.idle") { + idleEvents.push(event); + if (!lingerTimer) { + lingerTimer = setTimeout(() => { + clearTimeout(timeout); + resolve(); + }, 1000); + } + } + } + } catch { + // Stream ended + } + })(); + }); + + await client.session.prompt({ + path: { id: sessionId }, + body: { + model: { providerID: "sandbox-agent", modelID: "mock" }, + parts: [{ type: "text", text: "tool" }], + }, + }); + + await collectIdle; + + expect(idleEvents.length).toBe(1); + + // All tool parts should have been emitted before idle + const toolParts = allEvents.filter( + (e) => e.type === "message.part.updated" && e.properties?.part?.type === "tool" + ); + expect(toolParts.length).toBeGreaterThan(0); + }); + }); }); diff --git a/server/packages/universal-agent-schema/src/agents/amp.rs b/server/packages/universal-agent-schema/src/agents/amp.rs index 75326fc..7134896 100644 --- a/server/packages/universal-agent-schema/src/agents/amp.rs +++ b/server/packages/universal-agent-schema/src/agents/amp.rs @@ -4,9 +4,9 @@ use serde_json::Value; use crate::amp as schema; use crate::{ - ContentPart, ErrorData, EventConversion, ItemDeltaData, ItemEventData, ItemKind, ItemRole, - ItemStatus, SessionEndReason, SessionEndedData, TerminatedBy, UniversalEventData, - UniversalEventType, UniversalItem, + turn_completed_event, ContentPart, ErrorData, EventConversion, ItemDeltaData, ItemEventData, + ItemKind, ItemRole, ItemStatus, SessionEndReason, SessionEndedData, TerminatedBy, + UniversalEventData, UniversalEventType, UniversalItem, }; static TEMP_ID: AtomicU64 = AtomicU64::new(1); @@ -99,6 +99,7 @@ pub fn event_to_universal( )); } schema::StreamJsonMessageType::Done => { + events.push(turn_completed_event()); events.push( EventConversion::new( UniversalEventType::SessionEnded, diff --git a/server/packages/universal-agent-schema/src/agents/claude.rs b/server/packages/universal-agent-schema/src/agents/claude.rs index 5e5c7bc..94ff081 100644 --- a/server/packages/universal-agent-schema/src/agents/claude.rs +++ b/server/packages/universal-agent-schema/src/agents/claude.rs @@ -3,9 +3,9 @@ use std::sync::atomic::{AtomicU64, Ordering}; use serde_json::Value; use crate::{ - ContentPart, EventConversion, ItemDeltaData, ItemEventData, ItemKind, ItemRole, ItemStatus, - PermissionEventData, PermissionStatus, QuestionEventData, QuestionStatus, SessionStartedData, - UniversalEventData, UniversalEventType, UniversalItem, + turn_completed_event, ContentPart, EventConversion, ItemDeltaData, ItemEventData, ItemKind, + ItemRole, ItemStatus, PermissionEventData, PermissionStatus, QuestionEventData, QuestionStatus, + SessionStartedData, UniversalEventData, UniversalEventType, UniversalItem, }; static TEMP_ID: AtomicU64 = AtomicU64::new(1); @@ -420,10 +420,13 @@ fn result_event_to_universal(event: &Value, session_id: &str) -> Vec String { diff --git a/server/packages/universal-agent-schema/src/lib.rs b/server/packages/universal-agent-schema/src/lib.rs index f4735f0..d30d93f 100644 --- a/server/packages/universal-agent-schema/src/lib.rs +++ b/server/packages/universal-agent-schema/src/lib.rs @@ -317,6 +317,27 @@ impl EventConversion { } } +pub fn turn_completed_event() -> EventConversion { + EventConversion::new( + UniversalEventType::ItemCompleted, + UniversalEventData::Item(ItemEventData { + item: UniversalItem { + item_id: String::new(), + native_item_id: None, + parent_id: None, + kind: ItemKind::Status, + role: Some(ItemRole::System), + content: vec![ContentPart::Status { + label: "turn.completed".to_string(), + detail: None, + }], + status: ItemStatus::Completed, + }, + }), + ) + .synthetic() +} + pub fn item_from_text(role: ItemRole, text: String) -> UniversalItem { UniversalItem { item_id: String::new(), From dc2a2b168761a7822c90ad271236877ebb2a45f7 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 6 Feb 2026 03:03:24 -0800 Subject: [PATCH 08/19] chore: update readme (#98) --- .github/media/gigacode-header.jpeg | Bin 0 -> 643540 bytes CLAUDE.md | 2 +- Cargo.toml | 2 +- README.md | 4 + docs/gigacode.mdx | 4 +- docs/opencode-compatibility.mdx | 3 +- .../packages/gigacode => gigacode}/Cargo.toml | 0 .../packages/gigacode => gigacode}/README.md | 35 +- .../gigacode => gigacode}/src/main.rs | 0 justfile | 6 +- server/packages/sandbox-agent/src/cli.rs | 2 +- .../sandbox-agent/src/opencode_compat.rs | 377 +++++++++++++----- server/packages/sandbox-agent/src/router.rs | 21 + .../tests/opencode-compat/events.test.ts | 6 +- .../tests/opencode-compat/messaging.test.ts | 12 +- .../tests/opencode-compat/models.test.ts | 31 +- .../tests/opencode-compat/permissions.test.ts | 4 +- .../tests/opencode-compat/questions.test.ts | 4 +- .../tests/opencode-compat/tools.test.ts | 2 +- 19 files changed, 379 insertions(+), 136 deletions(-) create mode 100644 .github/media/gigacode-header.jpeg rename {server/packages/gigacode => gigacode}/Cargo.toml (100%) rename {server/packages/gigacode => gigacode}/README.md (51%) rename {server/packages/gigacode => gigacode}/src/main.rs (100%) diff --git a/.github/media/gigacode-header.jpeg b/.github/media/gigacode-header.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4708249cdad3edb416a33e1bdc2bffe47a19383f GIT binary patch literal 643540 zcmex=3)=m5zjCKnfgXdIZ4f#KUVkm(EzmvwQd!6(d_l3JY1z`*cfiVEYE(!^9W?*1UVPIg;NJnBPA+eJS zia_dn7#J9Aa&t;Sc7fc($iTqBlbRPA%)r3F!N9;E!%)l+#Nf{01oA&f0Ruz+A_fMF zuM7;#6A)raGZ`4Rw=ytD+(L+{EMQ>ZZ((5Ab{-*y2$O=uqC~KHEDQ_`OlfHh44;-W zFz`k)FbH2@VBm@d%P}x8;BcD)*lq3%`3(6C=?pmxsSFAXo(y>m$qaf73JgXJ1`LJ_ zX8&(9I5Tjtv9YtUaQU@rdy9aC7rW3JLRz$V$n}$x6w{D5&VED=6tG%gAV$ zYw8#nnwXf#t6SPy7}@9mU6C*PdD-$ytD+?ntBNIO( zlOVH@B7-4|u##h-Q6g($Bb$h_)5L|wK^qTVWKVkd!8y3-qo_)9(U{8U?#}Oz{t$P#K_Fd%*?_Bat|XDvmlG2p(CqM zpm1WLlF^68i3>%PHyS%#e0cDqN>GxC^Z#26Jj{#?OoGgU4E7AaxtV)yyMC{MQoSHh846_-2p9zQdJJbAWxM>()nJ4ScTTWcb|)OW4P*#o!U?z1=JpDR(u zqPgm{!sce3Q=Wa-Vr-GzAl4RmD6rTI9BUg=qgP9S(CAQ#fpPx|D0jn_L=2z;>#;% zHC99}xx4kO`i_o%|NZ-BHm?>cp6z;9&F!%K^skqkwi=xD2@7NN=#FSIlVGx{+a=%W zv0!r2ky{%iPIM>v)Sp}7tfcO6r}IYVjq3i7+a`KcwO)Ie&EVD9!{Bt{)bpCOl0y<~ zTO@VnpJ`4ykXnAs|Lw|2Q9H^NS1piL5Vn4(E_~zr=QUQ|aj&{IFz$NMtYkQ`Kcm;0 zHLE}Hy`Z!pQ+4m=IWJEga?Ij7QzPUV$?%@R@oVMr+*qT9S5LDm?sCx#-uUxBL#^MU z*_|7kSarNoRtl>KnV;`pH}|Z;)xf5c0t}f9c^pUlo;#}qbv0@pIr<vKCLq4R5ft#9O{>qTA<7d}#W^oDbOeyvqdwue)%VUj^3L(gQng-e!5 zO6wObU1W7j*E+wGB|9i7LBxE9%EZEnH}^iyO>0v+ZPm<>u%&~|f1mAFl{9VN8OEzu zUC|9(uu=L1li6Rt*~|g#!G!`3T1C}-nqNtLe7o(}iUg5KOQ)o4E;;va;hvf=Eg?<^ z*j6b_RAG4HCvp7!+qL4Rj-Fm8yEo*i)drcJ>$>EirLt!eljezc4#u}kEVtaedNkk# z$Bao*g^gP`OP)LKw0d%2uPD!f-ZNi$MEj+m`)Ycv*HfFxDqx~9adv^N;r$ygW`;Pe zT(N9H(t!=CO&z~-=e$ata+Qm_VXx7Y-x~!pKmN{NvsGkc!14wC56`LDyt6+xL7;2Z zp-U^4T~(R7&45wz@0KtP4tKN7+QJvMOC)akapK&(73(xhqn3tw#`yi4_$z;@Nb6B< zhh6ugwl7LKbzrjnb03jlo`b6#9ekTuW}Z6t{C241E^k(a+vcJNgbnk5Z{dw}D>GQa z_9E!OPv*ThJ}$VjY^C-~;cA_8j6yc^|CO9uV7fs+von*~ZteDS_icTr6{~0|oYtOw zQbG56DU)H}ie5Pv%NHyuOo{2qIyNV+xhY6(?_03;nl5`n#N(@PmoLpyTGbG-c7wzl z>zQ(EUL-7f9uRTv$VMO2jj!HX-uQ7X%xU{cwWUUfLQYCITw=-J`1$P`iRl62JSj{^ z?(n2;YnmVS{FeMUif$pfj0`}o`^Ph7C}iu`A0rH2^|$3EVF zzI54vpcyJ9lhm#X)CRfzyLJ4dSBvK)mow)s_!+KlnYH^QON(jf(i1FR&)hhYN}att zSU4xMcAnqN|I&(EKz6~-1J7g(Z+S3Fm8r6MCbFDVWS&s{IJ~ao;F5OUY*t%`?H=co zY;spluq@SOH})wxAh>1n&+2UXBMJ)NW==ZrjHib;+mY+o%d`V`9!$((6nwv?u=Raf zntl+6*~|bXzxsc&3{kV&bzX_&xFi`1-VRw6KV@}b=Uv`2jIsv=%q|^zB({X@2nSPj z?!?uc_a20FXelmeIn)?)r=GmF4oc6B4eDpSjF{D*=&+GRyL*|D=YNKh zYz^HY8O{?t(FxTDfZkhj~!SQbHn!WXsGeHdD?ziXn9muVWHCNC1)C{_I^1y^QXWPL#31%Dotho z@|WHBl|Fd4eMaqr6XJ}wtwOejo((ql{Nu=Q%t+a1dLwJIvIh%C&zl>6O(M=2vM~1h z>vjti9lM|~ael_XTMW0ElQ!*$Joos?uC+&xp3<8vDdh9mj&0%s11%Qj3D4EcOL5dr`(|sv+`1*kjt}s&!4V~=RI(JeWc*& z;AL;b9x1vsGSyGFetn~c{h`SYKe4q}UI&M3>pPo@o@D4svu`U@f4+Xb=hE4ijcrWp zoKIX#Gj#d4(*1!v`|1M)rP&{49KC#&M(#+E*kRxtq?N|vT=VtLQZAFj;z`$9Oy%2o z^pDxSQJ0gl{Zc8aRp`1p_>WbV*e$zNY~jl$GhSK#S>m1PxpiCG`Hn4>nxp6>v~(TE z!y_J9PKrwec(N8*EH-`W?rM!?p~q$kA5aj}EQP9t|Uh4{N2Z>?5e zTqCx6H7f&?Rxsm)UoFAHHg}i2_^>uoZK3PK6${KSEmNP`#2u7i)oE#G8Ydg8z3J+T zshP{G5?Ys7ok*FGwtUX(%lbC_oI$UWR%_ka$~f^yQ#hNN(#iw9VO?jfIvg38-gy1$ zdvHMT?D4;IjW0a=EGRu$i$6R-%PrO=Y2o+xtFA5$TefR~rtSOV+YL_R!-`C(ZwE}<_ES#GmfG9+|#d^?lzD{Ccd?-9n1 z4L>9%amw$TG%0G;!d%9p(9Q%G4v7=@?YA{6daJs7B&v#Rdr(!oB!l~?_RZ#!?wO96 z%0;V;?|+vwdBW`_mN%VS<>+!2mppr4y~wFkW+kjl(-vqrcjH_M!-cJZnj*_4r0`TK z-FW}}R>>)ekUgE5I=+S-Z)(JjHH)$~1+)BG$YV4^$<4f{Zdb9_uWpYGPNz;K%#4|= zydl}BM4?A>N5~3pk#^O_+&+%CCC98Y=dN6+S$*fUZei~u&c45U-Y*PVV05lUPfDVJ z!S;h%T~$C9TNszuZJs6uvx#g;Y1WwyCz`ITEIobcfR(5^lXvyoU)jMyJ()}rqLx~o z2Ffdb{(Kpr>lT{Cb0+@hySB+af@*eAstKzNcQ&%zxqpN~RJB3w^XFaxJyB_1mF=EM zM%@&)nh9|8dbggkiC@ro;^<_vB7ViJvdo^fPzQI2suK z*{8$ecFoJy2mTMQD?QAXR^Vx#Jo(SAQ?Bko+#; z*WI|Ti0e9Rzr_*p%e}u=aK(vb`gT(tH81f9s@C8B&ro)uZKub!8!0b5?r}8#S!`E+ z&25&`LcgF@O=0t@dw6mevaC2>bE8(peYxa^;zi%CoL%;KTKS}aX@&|VeTOqIvzr;F zv7g;!pz@{XSjN1o)X4gOA2cvzSoD{PE_U+P@1g_0j3{pxT zY-GRTk}c_cI=e}ngX1N`h8yME-2VC9l4R)qzDsUKRL(-DsN3t8{AbXgzii$|pAsgO zHC)+B{Qc{GaRkj~Q<{;$$f|O%fp_06rDsVyR15C9g>)P`p3BqV)gZQF#hKNGZD(Ah z%YMDE;6EKLE}WCV%&sl_FRsMbDZ*)sfU~4pB>RF9yGkE+Q_nj`S#Ogdp78wZpb{be~FN_nM(Te zRmR1Ps;<3C*D{1`ai$^M_$6*+hU=NPC?b$qWdL(S~q zl~=+EQ>PiY%=w|cO+4SKBlyDd*)rR*9T+wm6$%>6w{7p`PFr>FQc{Fxu#%en?YHlj zB?hiyHFro_Y<47thu^2(SB&wd40j=)z|S5|xyf&(d4sn(MP;sJI2pFl>)6Fi+ikZ! zCI>o)Xm=!T) z<6io{Cc%?ad9EB#;Cse#X5y=fi&C@I!-JWbmb^(;zb{q7p|;xS?4jJPQ#N$6uPU^E zl40y^E$O|%a>g6Cruc>=9Ch5oZ0?XOsoVSU{f5g7yjClGPjN4d>^x}TpZMU_ zDF-RPzBi4|PTd_`m(;IRukX!TwCd8f$!uvs3#RIL-iiHpfBsyC#v7X#O?bXjVZwoj zExGTP)iwJltl&t_OlFv<#KC-d#iFe#ZKA4rXHFUvZg^`rf8I=q%O#0oBFah(MrOU! zYgM=0^brr)5gf$3a1Z~qt_{JLHn2rbU$N4#QCYd>cjh+UPkzDHNF6qQWI8cy+-sP-z~O|2`t!v{bWNipJzg;|+z4{dsrkZq zAnkv;)`?XYIt?IRB#Z_%Ja~M1YnQIMN6OP{C zTiw|3b57EGxw~5ze{gBjdgf5t;K-K8u8>ymt2Aqw!!tvT3;kR&%?*i#H~5t|Ub@JC zI_SuToef+&6C4dLH`vHeo6&k^bwO0iro)V^Q`3|D{5w8Bk65ts$gRj3aW0Z`I?o)l zi!-?@A<7oAQgEWmlO~Q^wtv4!Og_RoJ;BHOfmdgvVBhDtOkF(=;k*7bM5wNvaq!r; z{|s}}!d=ac?>u4CSn^$N;$+GG>yZId5*(*yu(*`gMfUq$s@)P7`0j<=#LHJgPO$Lg z{>q$km|(JR(!`chw^EyUA^~G8ef6E znW<^_6(fN)jyxZDCT?UdJNS0dS*-`t98UQ#F*J8de66m2p=%%)>V3sw$*LKVf+~+| zzwml3T(#~)37z0yfj&z)~tv&bPrP5oMR z&*LX0DaEU%BfAlKFZ<-YmViq2=g{Je!ZB)aq8R|Mzf}qt!GYt z{#ld!dQoJDxYapk*2%_#{ZA*9U+((0FV!75zAu-h0v54?29c_&d+`OpJ6VC z(&}lxix@LrDsKI) zP!RHAGEm5I>nKw6-Nd!QKxOVWIk(>)mn{?425jB7u)|LM5__%KQx=7Vtp+Yfm-HR} z_UmQVOs5muR$ZQ&Rd|V~Gg836etE5E(=LSj{PYjB*?Q?=*CoL;Y##v+C41#x+?2WQC7-t$_q z$f@ar>ovhV+Y?7Gf4a!BQEa8+rrg^SbGLuH=CS;;ue9N%KhZHWEwbR&l&Fdemh)qW9Htt5K9f2FS@SZ&R)FzVkA-`Qs$gF|Fn1C ztP;17Q?pvESsOEQJa!-WTQc>eYL?c@nMK?&5i_UGJ1qS>cTr=(nP(P|*r*}3vdLpI3+rumr>W)%&YR^HUuTe8e|r1! z`z{mG(p=dEm}UqRI5zmbe!uvKOU%NCu+VLjWS9l>Y^{ZFyX>0Pc(|pBo8^^pLr9Xc z;L>f&qb3MCa4kz?Xwns&`TkeNUe2AeQn}l86ee%Wm9F@_Z{7i|NnuB~91Lp|^4P+k z`(=S~$kvG$cs9J*q$YB#_UlYp&YZ3cp01?aErLCHHN1?bc`6!BOAHlN1RTH2d;6b3 z;u_=1zHK@eq=m}nwtr6da$OgCa1(>zgq;QsJ#+e}tD zJ~P>P<|Le3$H34R5yYsNXEv>)Kk%~<+h)(?vjwZFL(V6QmtAA5@-CebR$jjC;l>GU zj|@zfdM**38n9%xx5JDRyl)ptYT0U~tt?<*m^GDkNuzOjzm-`_u*)$<52nX=4%)W& z@}=5udSb^eC?1UOU3!QjI67!@NvX__~au{{x+xo^>hE^ z;IxEmjQN2EY?s(uFDdBE+3qIXxr5WV^}y|#WAnal+0@L~zCd_d|CRLmTn5!Z$53UN z4S}^Rw;7Ui-V5G&yR?N{jXz+jL&QO8J+seWFRipWR&=R=K{nt(BeS%uG2d$6D^sJy z6T+U#&5(S*uZyQqQ`f7dI3Q)=Hsxx!nv~2-i!>En6pfq&j19udEzhI}P1tf=AnvLQ zkJAc8zBl1Q>HA6^-7E;_*nIhFCd(6v`_>r-YAaMvZB&@yaQ5<+=0Ep!URxU%GDb4H z%&4@GmXO$;{5*Qv!q;(Jw>-I(?z}m~GI>$=>9hiGQHH6yTnPt_rN3V^a*~?WmT=l9 z?eJxVV-Gxcq#t>)d9&`ZIS*sJsumd?d2_erNk-InjgX{mq9ONQG#4J@&tKQI@tO3c zPhO`CWgU)r^#0wuMZ|B{WYx$izcx#-ui){UGCeI-&CzJVY>$_H>(|{{Xs(%ecbx&J zV`#isnT~7_%-)5SCynw5#0|s(ID0+i}w~UBma~wcD=Dxbc&xm_=us=R`Yk z>A9SHr7lf%515v-=bJ?XoAKPpM&0Xb=bvThxIAbuJM&`BwA*u=*9c#|R(&LgFU0@r zrM>1Mrkn|$0bb0Lm2~efGyisfU)LnYz`{@iiHS2$MBcme{_RpzW>2@2gwT#I>efy3PI;(_GnDl1{&uWe#^UIys$Jcp4IB(^ zZpGVktu86)O;~f7p+U^y(18F%fYPELNRqA#(n=3<#>}Hie zTiRCJ8!D`noE2&ESz_u*%fF`1zSCB=vR!a&({XzudhDl_Ki82ZvwBwfMK6d6uW9^q z@%LP*jt3zpA}v{5`X}67?DIn6bew96q{PG>$5+?-+>t#sJ!p~F`YS#Yr`?vjm97x9 zj5*e~sa^5R(uGSHRgSMd@`B6fl{1TC!;6$1Gx{TK|1+GMDL5@OXVNBSCQpf`8wVw? zF)dzeW_E93!cMiP6C@_Euyx+v*AXgiZD{_hL5Jgw(u3qmQ*7dCxUv;F(mYL48NC80BWv^{g5U$^d*lASk~#V@MM=cw;yOBUu= z>ZQ%hFPFDgA7t!iT3dCp=fLgD`!l{@(Di+_)M?p=Bi%PnS_X0S`v^;=ZMc}SLZ8R$ zpjor*#@Y3;B3oV=7DN~^I5oI#lu$_4e!s2P#OTW9Qn}R((j5#xP9B>*WewBXhk1WC zcS;IXm;W`DTC=Ussr1mBOAZH)nf1m6vomz^vMI;~d^sUE@o_EpvJ2;!8;cJ9O)@C) zn)=5oCqUcv>{g)4kH>$TKTL!{wAfEgfJ#Xwj^)q>C!(h zt2k^F7pn-ijohtV%=|gagJD5v?#3HWk8U;;zV|l5Y8OZ3jA~B?2LIK$zmLsYYSgtb z^R(cm-{oowa|KQIh=k}gSZxSu&xtMkyeIwGFPR0avshIcRu)Zf-m(At-%?kF4Px3G zwLEoF?#jBj@%%d+yrJMLv$N6B3uhRTH>%6F{M*04aMe`-d-D%7zQlM-$ZgJb%cV$ND znp2Dod@7v%e&wI7Bqj2)wT@5qosGaJCW;$D5jS9qucx+_0W4$gnd&OkG-m+48F7ys1aTCYsCq zXZWSSY{etZ;mP5^*y42e&yMpu|8D7;wEm2ONleb4_8k8i-!5}&EtZyG*ovK;Y8N6pCiZ{Nv5&XXS{i$!!-8eHK7*&&Y@Mz(t!CrOZ!+22IW~j$1X^0 zIABm0w?;NJ#B?Rs>kX4<9Gq-F+qFs8Aym|35=+cZ1p(g6cbXSGNsU+^CK4jVBlzmA zo&95<1*Rd%eqNn_+?pI4JOy9fmYN-PWnyE|k`t2{R?464sXuU$cV<=#-%_!zCi6G< zBO2c?%v>6(d2x@<$(NIoTnw#ww_KTGG$qhrTa!d-#hkiXJSY53m(G!3@|-+TUiZ(> z%UsujR|ge{Oj`C-b+LubdkB@A&fX-Y@g*q1RIc^fTBv4<28B@Z%b* z^^t{FwH_9;8>)YLAriEuZE{r;XUMj)j`^o=N6mINoFE~c=MbgGtf`#&u~&n|TcJ%h z?95b!gMqz$GiOFj{W8Jn*8Q_hO4hP0ue8F_($kkEMY>+%uwIjAJY(+HXtkA+Y0EY+ zM7zvgYgc|jxvDGDy*i=`usa=O06#g?9+I}})#&GJ&wr7QxR!_WC zuF`wrKf`mUNm31L(Ko|c|N8Jq_a~&tRP(%YT9U69G?BwAnpgjd^3@v>_VLTsDTSDH z-U!LCJeMHx?UJ^(t-)9Q3O!awaTg|^a(TU9X?}^}lP6wTa7)U1ro?5=T*Di=X~bOH$nMtrE~r%?Q~)| zU@CD^Vd6w~$@{L>0_PL6QjNIm>kdmtf4&g%a_jnL=ATuKXR4DUn^xaeyKpq($eAZP zf-ld%U3=zb_$G;|UpA^mZ@V{_QR}V$PD$oz3g>K9-k3^dZDE@1>$=dvq-Db-MlJ?} zebtPQBj-tot*DA%V%a)T$n3<)b1MV67Q32Bn4Dd%rBvmT{?Ekev(n7jZ60zd?n~VJ zUoHpI9?mEiK@LMWfmF%|hEom(tA zRC~rQo7nDh6Bg=maRA&5ud!&lPmJC!^vCLb-&V9EMGNi&aX~JSLZ8SKaU8{&w0_q zYaWpjnfA0bQHbTx@!tOowSnG-d@37lUBy(6-F&;!(S7#R8DBagco+>P`Ei^poe}dU za!NzO`M_6yX6LG;TWK3@HZ)~j%-O1L{PM)@`}h4bz6f6846f*4;hTEQegFAmQ^a3p zHO)OFeuZ_p(Cn1zx!GQmIhHVmazy7GXl38=U5ax>_|{WWNi%q414^E8NSsiv4Q*Ym zz*V-SWJ$}(CW)RuTbd?Ki&`MEMcPBW=%94&D%2w=@ zj4(`QnWW~J$gF<*`J#?5uUI&ABr}htU)}bf;kM(8jnxc+j6L6-QtlW|o~yxPvEoJ3 zqU{E&n65qOZd8!8*L4w5yUnV!&Dh+_&5(EE{?m>VHb0wc)fyQm5mPSoTtcDqS4OGg zRxg$Awv_Ef2N?JLTI=i^ap=p$31@R}JN73pdLrZ7uE!Hy__D|@TK?k_uins=YznJQ z^gX<{8M*kGPMn(MwYz2Y1g-;3=PI*ga5jLOe72QT~c=-5+pqe-Wv4mc>fnY~y4de!rfqE_b3%v1-?<%X9T za{n`wT~UdxNZVLoB%&#x`+2fu@0QH2GN$di-FfDoOf27jzL?#$*XMb%VAC_!^l zo}J_UJsFOdGDDKCtO@eoboN@$X$H3E$7Zh72n$%uJmYB4r6oS*J1@lqu1!=hmJ#OQ z$XjXsqvQR8t6a?dInEmzccn zLO#5Ix2$^^chbq_)Ix>x0g8{x-U}PvcI^%+$b1@=7Ipgr%bX)Q0Vg8`8C%Ih2ilAiy7CM-`XF4^{2ci>)~-#4i1iOAJtr{E3bR| z_MQsx@p`}@)BN(}xBF4LVXIbe?ka2dU+{6tt&Vk1($@dbT&Weypq1#&+TdP#{_Dkn z1#Hog7ot2^Pc*;mziw6O)#aqYoGBYs1$SwA^f#b|`$0v+g6Han6I7kavpZI=B%Sif~h>qWzuot$! zh3^MX3*0jGAj^WL%t;O*vu#pdZBx(=?P&0pKbw(x;_8v?KH6Tic8&pJbEg;py==h2P5?`GV$a$;_8 z*rE8~(ZzWy-+#Kc!C2#23U|*;i<{g3ZuPTByy_e46w)AnDPnu(e5+)pMbo=)c(pe~ zDX-|bU#s1e6L6X*rOoW__JIDEYaCX1r*=F0iN+-O%~1Z3l_58Axo_m*6JeTMhff+d z*>7votXktVZL-R3^GbG!UbcDBV&XfQm{Rs`oV+D>vC8ykrLhG~Ngr=NWp~KF#Wllw zX0F0;jRGaNQZDKAT2#_;~RON`uy)+6+t|48mbH=c>SD*1~<+W7eHcQQrvUADjN>&Y8+<>jqIch8(uNinJT_WeRy z+luW*4vT>hW#%WEm#*Z*-~Lcq{OTK%-fM#9zxrN zM7Mo?!|lIqcBICAk*_jrhr8i1W{!>Y* zS?qK;>JjVFj>8hW7>{pT;udUi=W4C3WAAmPX-98ZC?C%)x99)CTBmCHm0fT0tfaXP zGpqYVnt#^cmFhpZk3IO&)yk<&A&WwHmb?==E^yM=xAO+${e63%^Lq-0v@Hy7U(wzk zr0E=TPeUfrrRw>%ZB?=S+qBmAx3$MVEi`srR~IA4|M2U|;-m&K`@8KAVnQBeG7AL! zXE4t#i@CZm=2BQ3@5)awZ8Ovvr>?9jUH*Q&K<#hnPRC59VzitDOQ;N@Vq|9#;7 zI$x1GxqkL}a+5#2Jz1{ADwNyBEaZ6W;o74nM-4lQCx=|MoV1*yXUgetsxeyq1sXNzDhc^(^GAWUpe)rZDFOkXZX=wpB7bqNF)R30OVVyno zh!yL~?5?894Gyh5$un)g&A4b3%6E0qeBPHTt8VBfO03}f{KjVBpSGq)uT&tg^&yXQioo-IclT~#nydMUV_jaF z>J{51AzS#iF_t&W`x>n(lI4GVZ)xN#k8hhY@=391= zAEw-!9Td#?v(0r;<%EKiV-E6vUUanu`z>{GDSD@?HE*Nr8TaI0ncD6e8=SuD={02? zv{k9uziy_h+TPA^{>!D8vUnc9w5!ha3}{#}HTBDh=V0{6l2n$nRJN*m z;(N>cj{Z6gPXktn3wYnOpRTNY|9<3@qO+&2Oq+D~O4{L1(m#*gxb4?imgJE)smV`e zg%M|jfL}LTl+MwJsHN+;cqVR6NSS#1+a*)Kq!Uh}Wf9EN6}}4JtKEODf$`ztb?zo- zW=O|z%5O8_tE{hN*c6gxeruybO8ckc{uLLxS1B)VvnZK@y;mV~|>kUlTL}-W~@%HT9{wqT&DfX|IS(jYtg2s2fp+OWlBl)Kk;hI%^UGPjuNUtzLzJ?f4$(!%`8Kv zd$Sc&rrl%wz%p0gEA)ABl{16Ovt$nT?-vew35A3$nY3{2R5r%uqz2pFWl{^ZeS-CJ zxtS}ttq;6kssAv@T!O2~hjj~+mCwv`#s3+kvRpgjqBXb7_nEE2H}k#WzOG=`sg7G; zPI3NY@=rpV!Q2Ii-;za^X{ShYNEuJZo?{bK6$Fkroa``M&A~ct=EeqtRSaC#vis(*o3KjR zXi2bwxI&MDd8x;p>I_4-)kUk$s;jPlrNAl9@iXg`+p%SWQ3CN-B$`@g3chj#UpS_NUd^4PJIfQL# zfDYr0D5=H%1}QxZW%jxvOLdlQI<`TvLp4v2y8P! zCs@n={{4QD-&ag5>`+hGjoFSpE;-5d_q`S^HDQ!k5v0Px5Zu7JKu|^g{bEm%qYmrV zvvO)NI`7G!c`Y@-Q8zQdV9}%L$#tI>eK|C7*_jifQW7!Ug)!$o&R4%5(cn1I+KX?& zf^+UW&%az+#G4wbVrrDW{eBR~`oNWw*$aKPE;!@t ze&Mly!K#%}vlq8(2W#gZ5a9MHyYCRl+@e}lq`O6i$o~h9M z_+Lq&tDA{OaDiGBXTip~d;c@!8Xi3+u6^n9boJX?WSK1ZBwH1O7N6=~`EczdHa7O= zPZzU)t~>49b9)-2H{ZHBy=|ZWy;c6KI^!hIrHfoz4oWxQuzh|jRkm#5Q{5HcL?$;~ z+;l$o+!_VNofkB!YZWIJ_MhH%g!ex~EknnmB{v%xJTi{7N^~5Xb?mvx5w`BVZX93U zZo7GL5w8`G!eWhpYX?I6PucF9`_+tfjX}h$W^~t{`fvYy1`tovx zlIt724U$cUEdLpjmnM7MKfATpbZ4{9RJN*y&dGB!_$FS7nzeGLqk>d|UsADc?AOj` zmsa|0R||WX&=-4oLb6)=_R9{Zy0-FKuPN9r!N8OBcDwSg3@rr(rPY#qZY(%^+t6@N zQ}VaVUy6Nh8)-$&+>#P&zs_Xc0jZKhx6Mt2?8<+CJM#Uui?L%tR#5b^2Yi0^CiP}5 zVh<0smQU4DbPz4;JofXpe}UUvZ|DQ6d@ zalw6A{D;OJZOJLcoCnpVJ1%cM*V-VerD1mHj!fslBm7b!i2-6f+JkIs#aEm%{S|w)5 zY0;Uoi@#l4A$f%@cyC8su~F`Od0Xb70L@Kb#b2^SN!{q1$)s$5-D8ifrPxZt6KwO`u0DP`{POw*FMGdEa@uI4XsUrs@`^b% zk6ogJ=4DPl?_ukBqS^SC?e7nl2RwiwTXqnM8gYD*=xt|wkto56q?XZ$bciFV5Mx0D;j=j34RtHQHSg5#2dU}IP z^1h#+R~2*ZG+K0JMsacQ1ViS^pD&$mMi?#NS{C(qR=t9n=X~p$Ej&jVbQ3~7QdO8V zPyE?&a;~aW&dLC#sE3^m3pmdQ9D9(S{T$8Z{xd9pyJ}jP;vGW` z=k8)Qj$JkBK8hTHK?{~mnYy&=*321f@8`^axhz3z(RA;KDJ!qE9CMl6`*(|ED64^P z!ZD{SnM$1I{T0emN4rDRE*!b_#Bh^i-{O1j{Z@Lc`CP5BJu6ci7;<}NNdI7V)H9V? zwe>B-jsWhCuaXkVPiI_XFqU*(5pNKFU2w9sU{B4LiJmjpMt2?$5e#Ec=y_!4oXgDJ z|7eBRq|`$5pLREn^;Y?diaOdHs)}?mDYLjOxW+R?Vdn0u#ZhOJI3$ncFLhct^ZL5Q zYqX<8Lbg?<{J1E_v6i7tJ&0b zPhEX^?)FRbT{U?`W}NIZm!-qk)!|>~s3#v-nm|7G9In82hjsG*atyELkpejB+&@nj6Tl3&S zWveqiN0eKqs9nyz#>A7rVHK5{xmjB@U{TWRt~nh2l^0UZtZI0{we|+*WOljQ-5GLG zbB*3M`m|>zFbNyo`~7OpHuDX;E^N>d%<-J4T=Va6P*x-FnQsj#9k%9v>B;+MbmwH{ zEM7jtbF%d5+{tfOYBMeLo;`tyGhx+sx7uLo@4fnuiyBRy+*-oM#L42>VBl7`_(xXU zgw(dolf7r|GNd~&`>(ryhC_=%*Fx8#U;XLI$ukmt?|SPBe4lAF&F|Xe&Iu-~#SJ`G zpEZv-!EWfs=keA)aE;y!j@TQGe-14SFt**@bF5^l@2M4*dD^;*S8=cGG+;YWcGWR; zS?uA(SN4`A7OZgjGEsv0_U#a@Ygf8wNJeuoz5V5wujJtFD*Z+8ku(?PT!$ zyXV!3ptYBMefk0$%@5iNKgih0m2*{M$`aO#Jd1azg`Bv}ZguLQR#3SE=dAK~DKZ*@ z^L~DlI>Ej5FJJ#9<3e-h%M3Y&zhC-x^S(@F^xzYzfBSD1)AJP?%afWG>9Xh?_h9~R zyZpA#RLO&hj1v>rFg;P}WR`X-U3n#7{~VS8-V0m_4r)H{jF-6m2{c>H)+BOXXA8$I z^NXxZEa_j2N;WOJfBK!W^uhDzeR-Cw3N8sTQix4Z_^M}AynWwPk0{qUEuA~qk7^vV z`FY!=b-`AlO0SNCJdCF!zE;1r_hsc^njYl3=uu!USMkK&uO<$huFI|*Q0G{1KrR2o zz2dJ|T2n<%8|j+w2&r~ib*8)X$lJA{4x!H+LU#VTv*n;|#J~Bzq5-SRL+zG!wMHf`~cN9n4fqSO&LN>76a+%XQ^UvcynJags1WAPG|7dJ_xQO-U zuZ*6M&6h*JY?vwXHtZdzVUx9ctu|j1*S#aIttnR&9A`+pGtpMFjN6vjTry2rp?7h8 zF4KkvPEjqxmuVVWLLB`W^KU!4yRCG)#?Ur3p+Npd<1J-xt}~GVHy+*ia<{onu*3Gx zvALH-d#3U1?T9`xQ|?Cp<=~3ynQLWEzg(g8EOT;xqrCmP?t_lWr6D_KIW?{1@vxNF z|9LggGdqlR$(l{gIZreM1?Ob?M)|}&OW=Fsp?q|s@jbI^ZmWIN4I+IwEw`{SUzR<1 za^~BG6BapSdg^qE9yPM(nelR)O6BEXQH_nPy6gfS_WZd$DT4C*nu5I?lv=%Aw=Ft5 znMHrc%yTp6v<2ui6rD@Ce1OHJW`C^k#8d_mjV{egDy&Oun+@}fHy%G7RB&h08!q=a zhbab*3XFT???+C!uq1YdvWCi52P>XQe&#H{Uu<31x9S|D>JtVo4}(j7>2~E;nWr#t zoze^rcw2Tv&^Gp2{kvav5qi8@*~uY$>Lfp_uKTQ%oKyWOH)+MnQZXA(oho--V3E`1+t zw_JJHv^wV0v4=S;6#nJU`*DHw!s!(SPXq+>b|gi42>xgATg1>c;k5sZa}E=<5RHn(L8ow2K%pkAqf zGv>{llPmnD#51dHq25xTRTF0)oHu9g6Q180c?wYnCvi6fFXdBsn0)NlY|#LTD;wAY zA`@z6UiNlMQZ={T^~lWDTTjwSIay$7UUP3;tU+PkfEWe4Xw!^!tdxNiCeOm%8f zEIfVi)cf}fuCmM)4ZXa!ak99O9-H~Z?O!e!?lElp6RZ>>B|-`Oc} zUe}24{UaBdj9}+Ld(jY^>07?a&GGN-I5tOd#haBAibOjYJP&_=f7>NBYoVs?_BO^f zJqc%TNKc$`Y0;)>feukuy+s?guY6ay=lsj%-U}Txbq=0M*mpPh@0Kl%CRZag%Y1sz zW^@?$zn#2jw$4*dy)~P~JZiTa?&#h7WzWuKoC#kQ8nQTbT#hubDc}C{;-AD4rqy!U zzdD&`D*X7*(7PozH@#-|<%}(Rgqt65eqK0n)~UA_BIA~BPGJ)$sNuUcJ$PePaFF^6 z1%Wi(6Sr9We%$xDDzKBW*Xh~eRO?P9AK}L}b9Me%mz?(T%s*A_;`Za;FZCx+ov-Zr z9aWjQX0pNwX2CqppR!+_mIWXY`A!dC8fUCtGlR!r&f8I$AO8vj`!C~301C5 z+@k+*V)~-w<=^_}H7%JcwqlF6y9amPjT7$|sA>ru+$AM+Rqf~-HtUzn!F%s+IN^HT z>%rEpE7ul&bqw;HJnc4nPW8)~zRxD=w3H`Vr)*$;zI|Kk!kA0Z zOdEGF+5c^GHFv=y4uCR(0-l5acZ z+hwt3Q&YdM)V}64YoZE&?Y^DYqVMdUBx4|u-yE21!7MoMm#ApmGxziat_clH2R&Kc ze_m$R+8BJwDRhb?XV#wcJ`=ZBUT}4D&(i(TykwK3;*^=eN(|DuYje$cC%pformk@Q zshz^axmI=}E45r2+|OUm_*pi03s=Tum&<%1vB?^YO+6*K8*jUYuF`m!!sV9Bbcd5! zQtsb>23;+wkeAM_4jbK+e_p`KYNfSkRxlTn=CX;2 za~M3%=Zbmm_S(lY4G-Ky%F3mQf2|CI|a#!y^I}&zL^`tX3w0Wk*vJpaqWpqfg*Q* zb}U%DrPWbsp@OHHAxqgsF_FmWI@@m=WiiS|-ro41!Ae2MLVHV zJU>^QD`szi>ki`dm{_Xq;%&lm z=1+&=GEvc&jHeY8U-B?)a%tkP|9N>aYf$FpWWO0sB3DvFn_4DCbe^1SarxG%Ct9r2 z3`AM#-_5vx`*wth^g1rlZf?(nW(AYuH4>kfx|`fmm?7+TzB5X@99DB^zp=|i&_O~mmLRzxrr*ZC>q?D3+#P9OPtKLuF zy$%ZLwl@*bo8*$dz4g77cJMMzW8Yg*{tsJsBS3^_|L!|Ts8ShYmDJ*?Y4@UOodA9waZ<-tT%{BAJ_FXiqbRe zT~z-4+ZiR*fY4tboP;cZksgK+=b(j@Fmer>D39mTh<3!F`6rHbc*Ou^SaHv z!(#IC6>p|A#~irL+M}Q%p!<2|Jrn8nw2Y}+niwO#jS`Xo^<)^e%nL>x&qxiwbUjk%)D>! zE4pISrl^PcS|L*e&)m4f^L7EV>Gnxa8V*=XCM5Xq?)Mc>3JjB+!n!3+-O8( zEy5Wp?`^;Ige}_bnO4Ah<$S1zK<+t(a~D@xRF&OXc;rA><|LJFx6A)bl$cgKX@?|K zZA{BEs`B`&^5=`*ignH@(@g%V@GBMe7HwG0`W)@DrFobf`<%Kz^h6TxYZXICav-(>LmVf}vTilb{Ccto`h z>@XHK9g z;})z8I6Cd{c|E2x=c?bnl`3#puqu^Tg(q@Gi9?f=UyAUPq-tK*SC#=?9&O5cQWwf} z)%Sn9BotwLDs8S+BB#dDyls~plG2T=%jQNsXuH?6{L0e3w(ssg?Nv?xW2vxq(-X^o z5@*l2JgM8IG<8eU)Rn%OoZDV>*q(V>+n=}~>1BqNlf$lvW6!TPZ{Id~n%t}{^EQ^g z@G;%s?DMv zPM`degSHg{ZVCMP_g&Xkg>4Ks4e{1l`p=`ukNwMKjU<(XnFkY?JB~OW_|LGsR$C}U zL~TQ2fk>3TbjResrd=C!vs!dcL_S$n)gmE$i_dPB%>m9djRzAmLuWV6oBRFy-z{tQ z>T!SW=H3-^=R>*VG5g}h5i6(tano8h^N+W)%!Bl+3cLYgn~HtCCaS$kn5L9FQS7;) z5v4`vah|*|73_hUlJo&Yv95%fq&xLHQSpa6-B(G=S^2>inf$v?`1l%HEnj( zqs&P@tv9+i|B`wC`O>79p)cDbxs{&lW*CcC3jZ}xV!5LjHh0dV(+ZO_84e3t{*+BK zInAYWNiv^tgUcju0lOJ?Cg&O3eIt3I*EVptJUMv#!1>&?AgholgQF3W-E@X8X%tM@6=#w+YuScy@<#PRZ+& ze;54DKlGu-Sf4$7?vYS|NGbo$0PFf2*IQp-iR!MZHGkjVr4Q@4mdzIo zntiQiMdb7YulnwOTtDgKe+H39b=pBo&Bj@z~8+tNe%Uc@i^nWSJLypOFm?)U4% zA8zlzByEYJhQ*+hf}Y zvRoND1s>u|3)k;{Dg5f>xtaXsx}q;9C|$UucEiBsKSQnRwUutQ%eW;q`(?jhZrwS3 z#sdW=(c33vRm$z3J4zkAvTcPB-?d5}&i5;JckP|d_JWB+Axc1S=jZvamqvzZb)VKQ zUDBy3Jjs9JDsh1)6Lz;Un+d7Js(ZQi9G$*1Y2Bv~fs~2X{<%s)-jPnbmOuRT;C#{U z3CC~WcDP({G-SgBsfZ+x&f{M$&r6z-cH=*Tf!L9mcK2?v&v@FQQ`MPxH%;OEr|%b5 zGl}LYFqtX8WRbM@$<$@d-68!vQ?;{M`M_o7A5-ppb#6DfRL$fthxfVLLf47cd3-t> zl8hAIE_*V?X!An-(wj*)cxPCAyU6rFuu{B=0}r>r|8zF=lcuk>D{u^5gwd z-7_nBDto7yoisA+ueZ`U$Nq_P>pNRT;eu-a{CUefx;>K)OyyM&?-V<5<9Kc0!359p zBrC6J0>=#)J}>19no)2jv^^}BEk$(Z*ScRDj&}y}YjiT*KfH4TgMrhWC%<2nczS&= z;ae&fNNl>v+FOMmi-TKd$$omZMHeD2Xb87O{ zO!oYBvjurWCpvZ*UhMC$mJ48s(hil?r<+$Y!_H$+_6w3H&&GD5w{_d=&hUdyA5B5(Js^65J{b7Hopa0Ny z{-9G+kKC~^k9?H*K+J94Y`+ibQg5%%J-sp@yz1RG?w6rjdwjP?ZRx#{U>mq^+bvs> z%fH^ay-SaOs`mZG_ANq_3Qk5(J$z;HQCq(x@dB=Ek=ZX4*qD2lf4w?kxyn|zm7Y^{ z6^o*_wH@b|tG_GFE44*-MzNN?z*fzj#ZIeMtVrFJ$x!epVSa9LZ0{f6pv+kZbOj@M z;#4NPNX|<$|Cya}S=ni7YH`riv_+!*e3{qGRBbyJE&lBP`TeR7TjtH2)ijs&;aj(K zo|C>+dCPTNpFEQf-SRP%DP(P;W4h5BPK#wX|Ec6u3orM&x}!zrS)#9^WJOoQT2r%b ztu-fC?y31A9JNH~*i<{20M^VaE0$Fha&x#G789PIxGrE@cUNy{hN{3?{*2!{EX^g2 z)#_Yc3Qt=oHF2e{X18d}Ee#z`KF&!#3C~PZ!hWy%bZgTlX%79$WlHq|lX;u>e7~UJ zl_5U4RQd3kJJ+RBJa%^4Iy7(mZ1u!AI*a*aM*2xTfs+c8l^j1>9NVxpi*2><&YHuz zp-WeuP>Qyj+3}X$&(kZTB_wFm(bxkVE?-R~o9A1p%vxZw>dK0DnhU$;t=Mox+_JlN z>&j_sdKglIcCX;#WWUCLdfQsBOAHP!8(BqhEOZ zl>G9ocT2Fcmf?;zzN71AcXvq6ZK=3&G&z8+ly_>u+B<$9-|)X(mVHVj;mF;pzQk82 zPBd>RyDV_Zn=koJh+MqS^TIit_n$9e4Gq(2F|nGUYqmP7y2A1=+r-XCniGB2Y}AU- z6wg->Do87yyXD+&3_B{`(d~p8D#T2F7vb0i`=%6$e zX_xogUoUmlxw>%1>L%8yiqS<(&+BVaGI+h(r^PfrY^;u$)9sSuX8iu^5<|Z7?dKw_0n^rtkqP6qPb9-H5vE@EY7cXasO6AUIwQNe?H&bBsLi27Hfpc8T zZYWHi{M?~m;fkj#3yYib1&_wEV)cl{`#iWpd|VIuJo$b8je5krm6rpV7i^imM3X^4 z;@r=_U-T4KDlQ07T$kX*#3RP=c7yc$Um}7|x*_~2Y>KOmLpJZ3R9)@2;y}|Wm!}bW zM?CMP=Y3o$x}w)qbJs-&58i;1UrT0K23coKY27;O!YRqlK$WS-cqVT%yKN=mbK2lE z3ztj-i}0VzUvB$#X=%D_J#xx(*W2F9Z>lqPYKEq4wmrDUebRvgIxN4+|1(H==|u+K z*nE&>=AX;2BL3|CB2}=;V@0fU1fw{U%LHo&>uggGfip)ujV5fL`1n7=yyNFqdA!mr zR%V;J%wf;G2PeM&EoD!AcGt)FvxFGe@pa}K&hSrD!(?8eI1O-aT(nC)!?Zyu;>yxT0WppC)g z4C}d1<;SnP_?~9vJL=3gm8F&C)aINQS7;%n6g; zaQJRyGXH$rG3(26!z?8Y-NG6*rEBN>3jZ@4+py|f=-O0)rAHV9Iwst_$6u4|Bzfau z_ms^l8VpNTvX#%jd~AcMLU+?tq085kt0xurX0=XQsCXmfRaA;Yv9kA%c7ReKi z>b0AHXKQftURubzp!J53D$mc}j~lL)#ig(bXGR2HNjA%G>-+s$xHP~#+H3DQMV1a0 zzbB6axVB0?DJ@-Qu<4kW!CPUL3H6B!8DkT7YAp?&work)x!>y(#!4rfw#sabocni4|FnsZM67qo?3}fDndfQFQ}bmv zm`q4z<~}T-R4CSLIdR8-1}oN83T{c87|Q|{#FXvwyk(vFHZ_f7joc%(m)b@tCudCl zGFK=+L`z~`>g(*2AItvD&%f>1>ZbZIWWx!Dvo{0|l{5&6>6T^aIcnD_OclO7@8>e^lFEcE?XF3e30pJGkX%_*Cdm3%V#|J%rk?{XhZjQPubryua&R%32x`oytV8T>%NKXCv7(_h?DfSTF1NA=-`4m zhlT1EKb2CLRwYuwVa@@?))-N@GMR3%zMNy1f@8uY> zJ>n7k{C-*W%N_IbbyH3n=6I_1oD9D0*!m#kj|Vr~V}`WU-O0D3PWV`;tVsOXsl?Lc zcjNYb4+aHoHZ#esQC>bXEx*jTooi64vt*j$i4{&)RC;%9KXjr)s$^+Ut0<$JXozL% zm#1EpZC$IhAhP4c`Q`PO-8>vbWg5Qo z1y>zB?>V>quawYyAG8XUg`Ll&5B<9%0lM!F57Nt6!GraGZc{?z0ZqAN1 z5&>?nnvEaZ+hpEdyi{;O=Szhco)ePy?|Yo;c(QoCfxsG(GZWSB%#rxJ#fMqaOmk6- zi8kxp@3G$}n3`8jE;8Mab7t!T0o}$X|9Q8|u6E5@ePv-+x9e3F0l(V^a~Qu~<9VI> z#(~viXM-{`o4Lw=hFCu7=`8o22r5P`JoG@&pvWY7+LDb4s~p*XGJd!I{C17LYjfc*z_IwWxAAyDABbsjh)O z#pY_d0qIvieY>)=JL2B-iMwXihI6vU)h(8)YT+_GqvmZOzA|CSd*he#m%U;%Pa8DJ zHt#DGa$vvwgzuM-&Uf84SE3%78`kfTyST0OZ0eJRhQ&;|{5=yV%l>)0Kw=|<*d&*t z8w|Id*VQWLuj|a}4(w`6ieSuSv6^7CWJc%A_x;m4n-7~V*^%&_b*uX$kBKakH^@g^ zF!N|QqsEr@AT9jHOUtgN<))t}aAePzsBnw%AoH=A>$a_Y^_rpTVO$#15Buf0u1_Q; zUwS9md&--MvGZj^dB?e)En;C}?3)b?=S`eA^K#6I#+9X_|J(!)$ootdUaIuzxUEH! z)sx;9pV-gR$2Lt#$m@>26;DV`P~5!pp#1fKAm+7ixU`=5do0)9^8NnHB~?=y z3KnW^YB;fbs!_Qe|If=!&dNco9zhD*7yQV1zhqSw!@(JBlfs_sCTQO?7q-%l$Xv0c zfoT&%-fnZ{JLgt-l!~`;I9MLtY?PkA?3dU10;Z@VMu&cIvYfP>WZT!ZVw%!}Luqk- zDNUZ1k`o_0&M;h|%I?Y1z&N=>`L>thq*?9zc#JkZ{ifLR_L)saU!MZgR{qcjcMUjB z-oO0zcZTxh!$D1)hed-}FSrLZZ%hAjfu%_5$Gp_FqVZ}8LhMhO*p#CtuG;X%S*Ycf z*nuaxpANiV#QWjZR|nkZ#verJcS(V3P~%Fs7$(h;8(axV49Hk&$~*~-0V?mMPW>PsCgl#I7^s|E+Hv2~g% zUXs9gpZng+GyfTS87g)Cj)ypTxi9-85%|ugpWRh7Xh-%#7Y#`UCL^Pw0-oQm#j~7L zb{}7T909bzymuujc0TzU}9+UqV%G3$wcwv<~L(*vTxbZkh3)VY$y* z&p=PL8G+(r+-XO2GNxuZN_`Ct63x$D*T`;Z`Tl;?wdH;@#GCdi#I~L|?0M3H+2v3u z@6nYDG&YHHEOBshynp_(&)H-{*JVtr4OHR+em^&UyL8!`D3J~~ZR2tcQTA0n{y(o~ z?OtxQGH9u{sHrq_r4Hk%xyOF#Ngj_@nrf;yN#g7zzT}tNH(n?@sdIc<2lK|{jPJSM z?z20HxwbruQgTp;7MC>sS_^WU+3gqJwC>EP zoOE>Bn~rDF4mt{t|NV`4zVzYgNoQ85M!FnHmsEC*Fg~i8x*}|)V#h9rQy=HD7O`+xZsEM2VfQOk zbxr&70<8^AFIYH()$421@{jG1OAO3CY{_!!J>%l1`=;+X1RXXWndh&Ut&r@RnikODdv?Ro zgL`J&colxATK2(EFN6%Al|V^Am1#`R=AW`osJm~= z^0Pl|p`eFzO!+I82_c*ZB__Ws$+q5l<}qtm?==rLrU?bLf43Zb#j3M?YO>0HhVJ4!`P zotpb(?(+Ly5nbnNnnW~&OD3u*)ke=>agkx+w(B9w6l3otIWYRA%xs?X+(k%6XNSus zr#lYYl-X>KO)&i$bJj#jht>UIjP-L%;oDB#g1${`EQ-^zniyF;lGW0;eXz-Vxoefb zkxs;(lUhnu%lA}XjB+|OW7(I3O)EV7SKhBxTp`_&SU6SqN})eXlS8Mx@r|sWTDFB2 z2}gD}o)Rd!P-I^f3zJ2?C0IS2d z&yrF;4Lo;vN~?Jp1B{gocQItxDt=NqaLaUkT34v$#1bZ%ItAGvgxw%tmBC8%v4v*mnT+2qkaetmd3mNT^MZ3l<-f}0 zbv5=dCZ6KLN) zbw;qm!PEEj5=*?Ae0DI`+MY|DdxGl|V}i2$Y)jdHiyfVVwGKwjIvgW#Kzepxk^Pbv zJqzFEty}FZy?ux9)qU>UCOU=&`yLhx7EqbI_og+!-0#KaJJF*{Flv! zZRtG9;X?VdhVYZYU=%dm9Eq})#W9a@6Ec$jp;c{ z`R$-kE&tQ2b*_A7Y`D4TMSyyN_3x|`-}kT=oH(;dgyHVn^Ou#6wK}ofX!+908g==O zfSSVN!so%I=}S&txym)=sLu=|v2nO<@(``F;gm3KS2<`nmS84h)X=dxmKNVtloH?!e9^dz=S}AmH`ZSh^&lb(X+Y5UI z829!rjJv9JLFLNNG`6~`lL1$@Y`&EC=R?{Dl_-`6O>QMyqrR-zvn=UUIPYua>|Be# zyEE^tjGJcE^Nl-#;Sk@=na6(Vh)iRhBsg2a-NSmS@Aq?^%|WiNPj_pm9VkD#*?RK* z``)L+(pG3)Db6X`*eu(gaJ$#ky<8>w$|2UXJMJmSnE2J#GTmC5vTJpR&?OJXMTSDf z&CkzmTDZjNi-sGQzGWa2xA)zJ4+)1@GvlDnbr&nMkH z^Qytx7RWmZCsvgu!Qy4Jdf=aDw-$0{rhF`t#fJ#(_+oI3H7to z>SmphJ1nHdkTU&1=a!9@P1af4KWoKJkeJ}&sKx*6{^bR870;!zG(|~Z^Th;(R0 zvj{%^x!iTq)5){IO0mH*Ho#cYRWbzxP1gvBzk__w+a;3OjGn` zYh+MtY@0kOMgFp<%aoR&6Au+#y;{3G1?2o!Tl{*V9bjQ9$yJufZB}-!*xr|Gjgz|} z^C~9>J&gp=e0K8lMY7$c8qW4VrCu}k2h6w5Hn|kaI8*3eqNs#J&dE$;>EtaLMpg&6 zd}cbR=ptss(({0c|IZ7iY06^D&UmV5>O|-_cf9@mnrTtg9G9;mtmhtI-ltZwB8H8T zUq@@katYhF$J{P2bDko4_;PW{+VzcASstjGiQKpxyWXXHlMm0Y?dRv;>U%mj zYC)hy)4$`)fA8Jjw=819A*W3YkI#gn&Rx8dwP)KiE2GI;2`d^5_irw{$m!0v zz;rExzy;;J$?R7Jmvbj~TY0oHZ)%o)UN7b4nkB(?mcgK4cTdW<-8GrBW`EAynWn>Z zw@Pzo@t~Yj4_W!FF}IV&sfT9`_zFyxmsP zpcXLVtgb#P$MFrWXj@74+-J;ta-4M)U6PpHUj-@dPDLYC#4 zl~t{2T1zG!3wivrs6@p4k;u|~PlrnpZNlR6^3Q$57Of2__{wP3;FDL~__I2Tfmf~| zz)6IK;ZOuaTKS>ZzDuqYT-&{}Win4v!n?5YiBDeZn)Q5TT41s8*7T2{4f z;w4w(W|jlFI za|^|K7_7O=mTb+uP;r%VXi-Edo82TeC6(tsfty^lqj+o{xgE2gz3p8I+(SRA~ind$K!0o(X@wp+GbU6&US79-$w zkCTN>VW% zn-db_=O4cPtUHY%boBs6`TP%6^TgI1gQ`6kzr?>o$ z{I*v6iVXYVSL>B>iwz4H1YG3(l;b$ARBZ|^a46d_QC(8Bhj;3H~yfB*G}eZ9L)k62&X6II^B zcBka~Tzvxx#)Gw;p|%d546@5i)+XP}GmkN9DoD$spsd&TFACB3lGxjy4KoC8-Vfu@3JJQfVc}+-8=dU; zJ+859END6Ly5o%N?dL%%GmafmJH&fRl}$@Rq4O*Mb+?F+gdP`TPBo>J=eMoSv}R5S zFiv1*@OdYF>{pOp==K5+TO&{5wr|%w=k}agxa-5w^?~~*s{CiryA@V+<%F&{XR4a- z;r|Q|ugV5oY1$rfgz5RV0=H{#rC1wmj;V5+Z5AT;WwpI^OB)(#s{}wDqL9+8e2|n zZQgn7{`-~MGY>N5nqg0JjKr=`sH2>$7( zRNegNcCWOzx5hn5)=hkuB7R;q-pLpqn5{M6Lq&+eaHs8`j1>Zh7bZ08cv?H|j*Rrx zDtSAN%VBS)5l5%A-yB7O0|Gm`cje!|`t?HJl1)KR*seI_>Le=_C4YLgI%xJ{5f(?5 z=qARQy0*Jtd1y@)tQO0jQa115-u>I=UYmQ?*FjfM&71F0?Z%bbN5p39t_Wy4;GY5IaTx27F}O9 zG1pq?&g~{o`NQA8UthXAG-kDk^Pzvs?#=7Zp7gL_K3|>QUMmN~tfq%qN0=ElOr9$H z_02#24|UuRzho}D^el8y#~;@`*@*qZf^41hJ&yDi@9-0v%P0Nrj`>3c1!L7Sf9?oe zDqEDS!g1Yd?&~Alg-gA1EVEo?rX~taaTGjlJmcDX-=*Cl@AvGq&D-~EQQ;Abk_=I< zM~k+qRfkXf&oDDBcgccN2bo^pVP1DY)$3}kXyCm??1fGXLbplQGnFO&Tz+omq}9gz z1>X8>HeKtI%93#5$jqa+zh7mN3O{6Jc(P8GlVj#TnI=7zQpV@;ap&7vmUY)gar(7} zb9}iI#G=huqH1iQ+wTmvCx-1Z|^=xK`&AI!!nxQfW14Tn5yIQv0p3davcJG3zm&s2* zv4dB*nu8X8>%RW8N5bybj->(W8fW9CD$iiLdteS)9dWs*&eJ);-ma*k5*%-i`^8B*ox^!@3n7 zItv|kAOLbkio$bzh`P&XFU5l^#oD}wDKNH<-|EY8v)0Mu-MJskO zvgO*PrTbl8SaXHbbIO_30<9a_6#g?9yk9V5x$nCmiNl^vjs`CEX3I~mIpZz8hM|E^ zU13Ad-TCVN0kcA0#!Oh|&>7ly_&-DWX)BFYyTbSjwoH`JGGI9Wd;gZq%+;nLvnFs& zVAq+!#IsRN{m-jKFDD48aY*O08@`g7!Jrge(!N=I(jmr39X7oiKmUGdkbJ^)RWYK? z;lZR;38m?0j?J90>C?$D?hCyBr;1-m2=?bPoDmH@ZJ=~DETE<1?#5QkxzsBG%w#8EBllFn8w3bGMI8*r;=+=|JkzC!02?l=7}^TqLpAg=?*v z>lwWyN5e8(JF_#Hk{(W5Lu{`ztoxy?zJe#($jI!9*b0uUhKGy{%98Jm|1)g=ljWs( zqeu7U>|8OK37+gf>mP?~*wT@pC2;C>r*h%UmkOD&nOD|zO!5+1!!j+lhyUASD;-{~ zse&=vJeywo`UiKg-L#0QuhsC&7RqYVyS7E>V2j7*ZF7BtG`saC=nB{#w4c5Ix+lZR zC0a_iR+Ve%axqFjzserGBxTaKmIlrw&vV~pmou3<`gGNnoHpd1CN3d8?f7cnROgJu zq7BL`TxJ|Sz%iHaGUKF%)it6zC$>f$_<7{L#b48n9ycVX@i0_X%ZGgX_bXxPR3Aen zuIY^V$DbXa^P+7FQ>Kx9!p)y|>e@^kL(P57nHDr{+SzQkc&D&cSbJW=mYrd#$vP=a z_J3m21hhr|Gkl(?5a(&A#?AOMWv)=mErDGc3At?d=Ch@-P1tl%JJ}%AvB`k*-~{%k z_xHSDbU5JE!sL7)+ChNbbB^BSuNQ<94hZmv8X6pUtp4fPYObO!e${Mg09 zBV%-DiG?0lr~U*-$s0_jM)@nV_dYx^l}F*s(G4jXD+&u%Y_(j-(t1~onWgu@eY;!7 zCNC(Qz^M}%eu?2g?4R^!CERBexgFBgKMGAdJ82nb|ID8?Tm7O0J~%TeFK{@hR{z~^ zBKH<6Es?bI`W7mavy+V{@9TAuT&@x#a6q`kIRi> zyZ>Y~D+W5XGf0GWG%_6auX(xhs?(84TVAXXk~k^E()Px1>5{LNnZ8S|GB0}+A;ACa zKSS9@lT{b0y*BmKDc{~9AW@s(*QIlMYTC1+E4QxlIP*QTkJY`BTg@Z#$LOMf(#zz> z7C&Dbm@6CYT6ZL}&A@TbkM|w7y{4RvSz=L^x=-zg{A_uPD|}p^yuEICCav4y<8jnEwr)Pz$ zjKssXZ06g!ok51D!y@wMi>|(yRS$Q?X>KcLVzh34E)|uuz-+^oX{jow9S<@H|Ma-H zT;H$RXjRBo%Q>6;9wfR|rGJ}iDS2XTprg{l6OBLjs!JYm>owyHdgRF~tjpzj@8akC zo>PLn_bPE1ZBTf8`HkCu247Kc*60hflAeYxW8hMm5OUAC+IVtv|zS_Bf#o;#R#i@W1KyI&^v8im&Mj!dSTGxG27&+9s~FxzRy z%-Dud3#C6NZQIZLdWm;zjbNL|bjU~Yw0Y;`B~L=5U5|EDFJj!q{?Ez%^nIzSDJK$5 z&KRaDwmx0v!SbI$uf(OXXXmW$8K;E~3-{f;9Gv#FLFPabQx2c~-@97`Tdk57y0i9s z)=mDDaff;PWw%+oH60?CufE{OYwc5&z$HESL)v`+DuE`JN4B; zi%1oYFY^xnd2zco&0&eNqu9N0X1UY1|73ak7-+mWox>p7bz6ZseVbp?UY1FECLbFu z*^@SYI=4*jmcxoL-YbWuJ7`bv>YS8hSEZPxtTpwehuC@#3B%0$x4&LUlR40vW01sa zRJ2p+=D%Aj+xlYNwm40=F2b(h!%#M}|9Z#{ald5EEq4~I%$scgZ`$w7u(<&qsfm}k z8U9+R<-X&)eA|lG_pYQ)6SKn&y$@wyv$WYn9`br)*d$UYxfuII*2^e_PUx?|&};&Psci)EV@~Aky1M_MC0tB8^s8*Tkd=r#y-$NHDTn z&$}h^PRF6F!QiSoi=;Wfm7{MrYg&5IUdCIOo);D{vp=zU)pjLRXBDHcYC_rUzRSz_ zf>(4sxcq1JkF-KA$J2ffUUY|^Zek2gn-;8Gc%^?7&cGeP@5%c+e{W7;h)v+`!;Ra9LJ$@IAtS` zLU*-`-}H-q2Xdm)SKV8|!pNm?=uF)_lY>{<_||f;UO2O<{N=Y>eqAyLgEofc2u@{j zX8yB3-YP5Yhz>`B!;WAHm5Toid$$DU2QUO@Dtx-e;<=6Uz4WWn?yJ=zErnvYm_>t> z!lnOwIk406 zVne9~Zc!JQ)++fhY~VQOc<5epx6*>n6uip8c$+i1tVky(L4eNe4NzD22al=Ks z(^AvCVuWTjvoz^SPP%!?FtQ-x81J@|5fg29`LW#!n0|V#QAm^SiZci1{%Y@+w~d`L z>EM-yh$x@VgI}wwWkXMLtymf;!y$a>fy14<48Q7+Z4A;1VeR0(qQW>sQjX1JbJArmFK@=C#_GaFgEHRsfP{GHL&kvZv|gS7KIGb3x6x1X-1t_o;z ziVb+9%U;p^=ayH^Hl9p|lVx0w96$ei%N)2$w#xN_)I3H9GXekkzn^LH{`dUta~am23NB0vyLi^DP2wa2-->yMU8JUMnyQ>6 z>l->jna$<7(^8YFT))b!t^my#oz7{KCrX_-Vvs7faME;5rprPSb0({~pN?d{l9#Hm z-BF7#UwQM1Ba$C)J9fLeu9$y>VQcSuOWnuEOoCQjeYW&yPIg1ujt=Vy{7W9YPJ3k8 zz?yXW>g*3bGPygYb4-|9o2HyHOyKx(?h&7w`Gq^L1eSINm|8aQ?>kZ{*>P#9!$F5q zm4*ik?wnw=-6A%5Ww!IGCU=i>MlADg*OnSg7c*mHxW)A^Ai<&0P@(P@JC|zn##BKI zm5uRFzg?{AJjL4K5LTIW zFu~)*mLG2yb($;hSaHBWFhendbH?}nmupkSmUsrqhO^Ds@hIt1VfoL?Eal6yzA$;} z`mYk{KWTBlmg{cx``i4QzZTjx!x# zGk;(H{jO$idCZk-Y+9f*Z^tsuTURH(6q-liJ=3F`VwG1hSTp~6 z`^#rX)ESS0r=fR4gcwyDw@d&0b~TIH$LfHPkA`%f>mu8@TY@ZMA_0?LZ9CY!Q*t81 z`)$R`m+>AvsOmKJ7$cKGxv`bZuEvP73mRNh7hSghH~mlMqgfU~i?bh`{APFg{eoV{ zA7P(GU0Tdn<`^>Z)w;Z#n5+8e+Jw|2vQtVK?;k(!?HM(jbp_ACty+RCC$ue2GuY=E ziDzyw6mm?yXzly=N!ia=P4!$&fl)0I-2Sr?`sb8iFbta+uv7hWu)3O~nxFfROKdBG zCI>Ano+5CDbCQCy|9=Ln#kUTuZN09%X4>Q#EET;TH>M>t{#-akB>1&jmFN8vCocvE z9Sb@W_Hx$?mC5D(ehwG+1TS%J+I;tz*^S>de_o1&1O!iWRn2x`Ha6aQ$IU*L!SupK z(zvS9oAyG^ zR*=ycmGE?K$JX*&##iOPWbqzu)6bo=;e>;h&q4MT^Upqhxo@rOq>Zwy)4#pl^DkFX z*z0uUo2~l=rWpn1q8|}G@Lj0IurjS+tSr3tHWpIo?o4F zkAM1c(d*1w->HX1c|M;xyTr%v#ME#9ZeH%1DmH7XP(!~KqaB0X{MxL{z}zJ7FPl9X z^X{|RYe?6c@Oe#5pK#%t&culsY_^tGta@vXYzJEg>^APn6PYV6 zIkUDpIZARiIL=vLy-7Xqmg0=dJA|AJUrmcHT7Kuuf%{JvEShY<{Zc#YkZ|5{mAPL| zF|5+_5zfoYo2e}SPH^AUI9-O;ogSe%OfG^-YHvR-xE!*nP1SX=D9^!(3J34!Uw3;J zm$aERs>s=xiKRU6SAy&+Pg{jIA)EqgkENUE-EzFvaFOk?@=8yhG~Q!&&A(qP+nc7j ze`!m}uN0X{er|5}_ic&x5y)kUzkV&`$)w_K4Q^SjA)YhtRZH+FOTYhgAw}D9=fPKE z6TD|I<-JsJ_xOHMVQpa0;X%J8>kt{V zfaRSKhqgjf^5y>fepkgrgCg&_9__B~U@pAx+OQ(x&Y7GNhD|Hfl6Y2rWVf*W5C8hG_%WoHL-@KFA+UHA$NgI4pdv2rrcKeD zTw;2s=DxeVZ{o^Dmjap=G4vcz^82Z7KP&y~MbCo8zD@#b88lNB7?fG&#LlUH`EtjK z+_33KrcKUJ@BmF7Yt*pou=(r|DDU{1`}Nwg>A_r#WkM>GR2=Rw?(h4>aO~*fu%+%y zGj>{b`Q0#LFP`yl)>S5Dsg@o?o`P)&6C&mwPq01KTr$g7uZwA;s2HPw%0?we>37D9 zPxG{T6spY3OjfE5QnG*S!Wx>QAQ0Ngut~_}gt_O5nZL4HXH52cSTWmK=z`+}pE6}D zQN8GNodP|{WHv_TPrX?aB%6-RTO_;af#alfvlnZ5S~OS#99j>sr6vC?`}<|Z>7X@7 z-I5-!%se5f0E*mx~UpC&>pq#eovudZ3 zdtj2Xf*-@jg;`f(TRo@MBsM26x841MDf9AcPc^Jk} zL|ZkpTjlp%6jHW*d9}=$&BR5>QQ^RR`^&CbA$rVK8+1+`WmI`EQI5~}^QBGujZ`K@ z_%=*sI2V3D^KEbF%Wek^=GDTlw94!zSReb(5G!i_G&E$@`GR{~lZyO3gkN3MIdy#U zAMf644GRvQ=)7nBf-Bd{=^oQUu~iRv4$hdpWyL8OQP&L(c}6PwC*`&_wkLrm9cW2H(D@855i7Oh+&5R}fs#2c@0&ONRFg=y9re_dXSphL_; z8*IM_vIIK_t#Dg5?RMZAA%@fC*7^TR7hdhuu3%rdpl=fYin*KkrcVzD3UDqKbZo!1 zgxe!cdC%{RxY%iIVj)6j5_-P!PwTv~TG9LE(v@nXLZ&AJ8&HJ8Vd<#_9r-}%9yqHk^ zpW*F)hTe>XWpkZ>OyIq8SXf!ecJtp7S%yEVL8@z2RKF((7~5L@E&1|p#jA*o+itJP z{Mev;c|lr|v#uwPXP8hib7|l0OhyioCwDWu(nLJ_=G*-$Qkt3S+?>NV??1!z8;`$S zU==*IfweYlg^ruO=C85~ip#dFWYc3>GBf1;1f_cO%=dG}oQ@py;3*T{GpByHRQAOy zOxssXDynLjkmz1`-#cc@=8z&rR$ZpMokn}#^$PJtW`*)(aqv!6miPb8|9NRt!6K~$ z-36;|Z%KHr`=7xoH7qUL*7D1`2R#Dyv;Vx%JAqj32d>r0_SPn*z2+>Ggrn2zBHjfkc?M#~5RUdFWonT2>aEC$JcoE}Yeu}oxws81Bf%m8zXpHE&~U#7j%NlW!r7&BkPjfuVAj^}1?kTzL6t(8e6 zU18$RiT(4MR;45!I@E5QPpJCfvPKEelro62ojLqiq6}<`T?l>}eqzSAQ4D{-mQ}d_3HbiJHbJq04 z)Y=qI@yG14UyZiBHr;cyEWtfMk89rfj?Vd)@B3zN4dBbS5apTvCXLN-nYm$t$ciQb zA=Zy7Ox9VNoJ#{k@7$5xSR}H8Q{X^n$1j=8rmZGgHMgY9-sc=&zU4)5#m@d9OS7pS zYK|(BM|huAf4im=$+^tRt3khSg<;|`yQ;>Otg4=`+F2`W11*$u^p^Ohh8n1PO=6kU zF0R#a>frtS%Wl^<`kIziD0(U|vU6^`_bchN?`iE_tEO`03M@G8f8yLaXR%OLR`X@< ze!^#DFEpFo}@#x;;bGKR*O?oIIsO2+FTcW}2z0WxdR`wj9G28&%5ND7h(&864!3O zvS_jBgan~O=HINc^1>z^WG%cd-6-T|P=2XZGhm|U(Pxh{~;))@88uA{t0_5*xkLxlWj&R>jDlnHv7l%YL9okQ+_nZHEZjtkQG}cCak;GWX;^W zSn7IK>6MGKGVawM&R+O&YW(V3dl&x;`*HtR#rf`!Y0D*!UV9zB>_YCmIsAURwq?&a zdW4+xdj3*NcmQ;MdHZLu$IPBA_ z+}q2#3jHp!cx5VHoxZYROR1psIs@^D6(*NdMSWK*>E?fHFtYs`Jw=GKZ&QES0RbM4 zw<{VM44f8vyy9-$&}iLX>+^J)`N^&;p%aT%VQrK?9<~=c(xPRL+j+0^y!dH$hYB+c`o#DOV zD`g)|=4J{CFI1*D{E5q(w5^W!*OS7WKCCsJN8U$@cg*i|M(|)y;XTf4U6tSOMdgoMN`%+<~ZxI zh>1TpzU|e%bvDR|(cJjai-{~1*H`}b{g$-;@Xk3^Q`fql)wwUfUszcgw^X&y z+xKY4#Qf9NuUXYZgjBnZ`ZWH#U)cLKZpQuOjl8~j$wmrKCQjgB$m3g9kl9$UwQG`? zl0$=`;lEO^%%TR-11t_P(bntSZbkbWdIYdUYi$bXn4n(!{gO~pav>MS!GV?#fRL7l-XTJ9b$j{zznXSQ4Mfcm>jvL!<|E_-N zSrm3OEGfZ(yCkjp;FX>)JNi->omQ*;WbE3o#YSdw@0Sq8>;`c`CYLiQvG&GGnX+WM zuBUk1@o4hT|8e<>cdupijKhYBe>}duZC4Z*;pOKf%r9)K)DkE%tMV z7H&yOkx9s&e5hdRk6A0d=BgD2&J;=vTWEZ##^u=V_l>o43y+7cK6(|xHlo_%FC`T2cud}GA(>d0Gh-CaBX!5L2GT!Tdq9h?*oF4NLF`_!A!^}tPsKbPkg z&1(MeXt}M{#br!^&k~vpEWMPxJik`Y&3_ZQ?5f>{C#6>1v%3Di_PG@7_w;FFK%d<1 z7IWQ=xhjmsKC_p6V~?4->?_0K$jVHIzEvgXABb`3EWLcCt?2N%i7QugO?Bm(ayLjK zIPr%?{NdpIpe;|1nVwkgyYge#i91sl`_0l?uzO0uHD=kwC7y5Br#D1gnQQejK*ma= zL9lzSGn(P zk(hc&r!YSk&Z7+XP)Hk+-?Q;M(f^*7zBX+mIfLRN;4|b#- zU*$G!s@54MvyhDiJqMi+vi;F%w%v9$NXuyHo&y{VNihj`JSCL;OrGc(nq0XY6nXSu zQ-nmLY>+`s&DK?c-f~^Hi@!)WPG^zX(vxCVc6mm0=;;uB6>XUv2c{V|nO#)8HN#9S zsDW)ouBq`xh9tJyKbbqy7-wcN#j~v1*u9;_%*njIgghNak?sOwu@iRxK#9V^JbozjHgzZyL16wXj75PeVOU+jaIjy&@_ zTzVTOxdBhbz6ZAgXZe?1NZEVc8p&?Q2?o$8r=g<52TyJNTb&J26 zaFEMzV)Oe2b+Jkw8N24WFda=wogz5*!ST7C6LYrkMST_OQesrOv%%K=_`Y?o^c2Kh zgHQcYa5&&&eg<*L!e>-E2~snbG@q3*)qzYdvFC z?%3wGefcWm(s%i>^WvpbMAHI321K4wV%ervc0a@`{}hMF|V@rKvY43rR+aLub|1YZCYJRr}i+te%0W(kL|ww`=vJ5 z6g3ZS+2yaXrkq*%@;md(Osxwewwg^8d%D4QXUAu&pzFcu%l))Om15UTWBKwp_xlC$ z1c9p)!kLsl9X!#XQ03Y4W3JGZD@>u&c(?s$&=g2;IQ7#yce#RYw%(z$HV2M*MD*_c zeyMHQsimG`-x*4HJbwMW=rt*1k?yo^)RhSvv%C5fU%2>s8w4*9PlG|FycZ0c7O3jvQ zO)5tXw)-yAVJq5T{-*ZJsSxgt71LHEZV5hkejnS!OA8fqIWvoYBuFbIG`R?+C$F6P z;$6e)sfiU^TNlh=a(TZ0$EBs3JgYO#E?79D**y2v(Xg1-0|rGGg$-w1kV=ibcr_wUFC;0%*=2Hnz}x#yDH_X`9(!j` zV#nEhhw=H-MPJesUw*pf)4+OK$k9T{>_dr2+!H3%Zl(i%4`!VB^7~csIX8|yhXMqu zw@hR8?BU_v@~S&(A$yTz>VY{P%*=VeSPOWaLnS*^5_Uro1NZ1s#sD&|&<$3At+|8>TZM_^qwKyGA{TO36nHeu~*1G8{8XB0p{lft> zX6bTe>sJL+&MaNBMBt#ORuV^y>8c3AXK5iRY*sF9vg$v#y!#sV)IqfAPEL$+ zx~1gY{rjdKe=L-sb24)>gAm8DPh}sMXHIHkN?aVK};!n*mH)vI3 zWO*>h_2O+m4~1OatKy6q=fiG4N%mCr6gcxnKQSZVh>Km3nZ(6tRc672;KHz%`;sEQ z&#C(rn!d+WA!33Eb9Y0}MrHOIS*uM~S528Arn5=;^EzY0o@4ES(QDafzH;6z!)drt zI%AIE*A`LE9fH?&qN>dk_ca7vx%yXq8Ef3^MFj_VcmFL7TF>ILkcG*EJ6Kvm0(9U- z)UUpv$0a?C6$%ed+>m?hux9xbC)Sm!)3q~Hgt-bEd%v6)og=<+;ac9DdFyUhm7PBy zlu((g^_BZUTkkWS<2mnF75yxo(Kaddoe<7=Key}8#-&RbL=IgxIcp&5&=jT+eJ9;P zb3#V<^eLGQoXa>FBo1wql+Illq4&qNsh7(?bYo+lvHg};R|T8dOx`JaBt=MjHi>YY znD_72(X~sp)^x0r=#+0Op4juOgzHpflc>mB-9lbQMm9+g>G`+(udwk%E-~#`uc#+H zQ{h;&{I*tW&BaO!f?9TRr1Z>4R95+MnT;#U;l!(y2^TnRlcguw=Q3=Ku=I<4r7@}6W+9~*WtXt~Zx?TTHG z%}>b29doHQarH<`T610Z*bA9M%WHB4tt1$}WNp%#$@`-8`Ks}vp2bV$zZU)IqVuX|;+%GN6%1Q$H<`)v1%B`1_Y)m5;v zk!!)-sS1+$`M+Xcu25{!4xRK-_8E6dzWjav+{OnJL_N1MsFpVw?)*$v~{xi&i=1bz;)@<8x&c2qnGa-fP>54vqCUHJ7l}Rqb zJsI&% z>K+rclv{%i&yZ;SYtaN2n+rqLzR85y5NknkQ`P{5T z9i25IDojCDoZPJ{xyyu<7OG}7Fgx((xvcrmP(QDmDdLudkzvf1mIF#GDU~0sUl?j# zEY>%gG&yVbiGC)NrIOxir_wLn>wR>At?Z)WAyp?Y1Fk6LMdi$FDepgD2rc6*)Dm$C zl5kR2m^k-9ujmxrjs735F}8}WkUVjG^=-Eq(a)~xtSvgID`1pl8)lifmNB#&AG(UsbBnoI~5EEpIwIYqqC>LCJfay zncCBFK%mO+^X+Jz*1j{m_8~&`({q=({P|L~Yi`uh^a!nnsp_oi$8Pp+;Sg=zDzf)z z$CN_73yHf5}k+;RN%)3{-b#F8IhuySJ_UH+3+tKv>u+W9Y{~78o+n%_{ zID<8XapfIuL+yPGGb6>BZ#<7!#Ihu_r7hJqe%9@x6yF<1UUm9LUD)zWr6u0mN4m2| z{`aQgx;1SiDxz^m2GeK8HOmb2(`}2L9W;b0iyL0hR+~nZx z0X@|jw=5IRrtN(c(O4;$kj(t;(k!)0d;PS87$TxKl^?v}aJ-haAvHL8?V=E&4ZNG1 z$~*qeY79EVA>fg^(~ZBv;>+XOz%1=jtzQogoXnAADSLl^+h()KsR_3e_-?4gayiVn zm+q3Bs9mUa{S5D!yd9D;F9UOy=5UowYB<7r0?)*f@5 zp^~W>_f*HSE7$krvcinp%EorTmVWf}nqiq8!L9f4ng3jK3stYYHK9H{E1Lz3E-m0x zcPP4}y41;Wg%igXldsIrQeL%v_2%d}ndSY$&gG}v@!*v{Gd;H`Dkj7PSLALsGThdY z)iddAn}TO5YuAzP#^$RFgr0S?>vl`z&PrHmG4tTDnKL72I#fIExZ}XRbB9}6b*4+u z(hFyf-R?NlEWLf=zI(TrvYG{$RaB$1)-K*MO{J>s=eG-986Jv(>jRvlJXDi)JJ^}* zq893`>Glkq>LK)dL!+*3$KNlan-1ocY8U7@?)m=LBxnVH80Trte@c@ggvMYm8V={~wfmjv(e>6`Qn_yRf(arA4xIb_ z=gWiEf;GOqN`8OOZeTl{`R$6+Y9`578$^??rCF%RZm?B9zi(#Xq^V1GIc|yCz;f`I z*;~UkeT!x&a%r(LFflDty4llc{aWirgQ;nNK_u@rL8d!B{q?yb)Aa9&URS#MDj@3Q zamVIn26<+mPyxLYCoK%TCh&zYPD;00m|FdErc{Ubh|=R8HBhdILYox z@tnBlMKTMo-`uBDE^iQ0E!gfkmBBOlPX5{qujvMYXY@Q`w~I5m{o;1I^+Y54uW!N^ zNlPJPYqyzG*T0HRTI_RBi{~p(o?pWiue7gu5j6&^dN(F<$li7ddVV#NL@<^y1iDxTjEZJ zv98xbM;(=(mBtK$H9ay9YPPIc9VKz&I>QsbMGub1U7WaT`mR+|6*o@0$mjB&S^iH( z#}vMujF;9Lg=z^cTYLD@Awwbd+OOp$A!3GXiV+i3nqQtvu2o!S(OROoGyn45?GyJr zmM*h8=Uj4S8P^qwo~_Pojz>5?FVWVz#Bg)(*GCnxXZ@<}XSWpz1f&V%%|4h^3F zf)=>l{I_d1x86#h_7%@ApSdx?M~{W~Tgs;6Kf7e98nWuyz10ei-2L;Wc0^<|b)_9qES%HLAhnQHmrI51m6Fnw z=7~K|{{0G&nd7Upv1p;#5}zY|k4(4&x)N6XlWW8A6{&)SCm3APGu5oCGq@^Jy|SK6lx>z| z``IHn$353Uv?_u7G?Qb>!6t=m<{y_i`>od8Ve8~(eBU;B+byMM5urS9ujIAu;Sj2k z$=z1E%DCv~g6T<|t~<1@G%6J;hcuQ)U1w@KCN3OU6_Mk3OsQ_;ilC&)`CgMVlD6G( zy^$ypc;owJQ<;#0wISAtA&qD6FI|$rZ+EMz-=uY=>VYjYR3D|tBxHyzc{cSNXVSq> z2`8HPpIm4-6{^d2W0H~6+=ia@KQFRO=UF;OEJfU5#=J)69GAJNRXy@cmaKZ>_WV=s z%X7aHSTjSIX6$wJUfI#xA?+D?ZJ5`3Pt~f<&Kb&*YGt>rs$h&09FR@zu<~B|#Z~jXy7fB)qsrtP9slBgUb<>#70SoDsqJYqLk|P{@{_l7 zBNkTeF6j(7xXAPDM(OI8ma09s!X6uYG-e*q@=5Wpu^u%P*ztZ&zud3t1lGPSW(%1r(*<^?$UU=u$ziG$tjE-_G~$kxUPl1K znV%OXuAZuKVAb(pCKmzqC5#*2uVo9}X?8g%p2^l>W{hXf+upBB9bfJhniXTf;KcsE zm(zPyaCBqzw2PCP4G#SKI9Etn$z7wBtARm+VMfGEBe&=i->yy76KPeMmTBZDed0*$ zHonrGJ#mXHxD$C8Eg71xHtu_5+gCbob-<#CNeV*e9QxBgZ_j6TJ($_xJ^L+-_PnH9 z67pv^w0*m(y6#`4L?gqIl#PGxU$fn^A|#Y!`=kT2pCrre={<8Kck$^Z5!#m~#C?4i zbLg~8@_&Z8EQf@;vsTA9Y+W)C%#I>OzczFc4bmJ19a7+(q?)w1Rq+tY?J0)35iqlm2>lgINY|1dMLI( zRW8_Z;>2ISDe6ItmtI~Lk~-vJU^ub&Ylx}FWwjM0uKfc0l7;VEEiP){TXRH&MKknJ z$Ha{Lx4l^J1W(XmT*j2F@Kv*C`&d~Vj z%~QXt89tcH)BNR1X^N1@jtxQ~ohJ;%)0F+5eQQgQ-jL*=FjK|htAo{ni4J=Nb+k0{ zPpUlsa;EyFuT`(#a-FX{Z2=+@Jx?Suj#Ou8F=UlZW%URbpY6@#X)(dQSG8ew=2o+8 zr>`kHB%3X6{QEVVIqtr*P8*A#8}IFe?>#+rJ&r2_UE5sOG)%~EV6cxq;Kc6|Fu;b+0+o9b?o5f8QF8i`&;mJu3Dm@xAer0o&&r5a72=2_(HPTI#V3uEa zt$O9sOHvDULbdqg178{#C@23dxf;@^AQUArCCDSdM~Llqa(%5^gzo3-kuybo1fD4= zx!shsIuR>$WZA1@ny1!#JxGxF^85H)t30mF0%v!vICjW*$H8-xj<3ut4G>~pVU!}s z#VN`D^6wT8zS)|aR!!p((_C55a6r)~SJ^F5>9LOvW6qa`!VG4+f9ftPwz{^>Ru)lv zxj{h5aOUyXi@tgUIdX_-8g_Gj@A-ByC2N|FL$uSzu*6L(*)KDzB?m2w6k8_9Fv&~j zfRI|U?v__;ecc1678(j99BiIAncXkM(MfUL?1*ND$vTERKQ2mC_DpmZtYXvf&|#G1 z{m-!Dz1%O6Yjab=qjPlDiSA-x`L#&xeXeu|%dWj-QqfE%E7$kYgNHVS(l&x8KfRxTA!~Wu5)fvD(_jtD+d}gKk&`e#1OG1u}+!7J6+eF8wZF^QI zqkXA37PG+o|!@bFN`+Rj_=J9#so?o~? zCv&pW{54{y9=542-}vo<>$8WqK0S$wJQ?0$l+0BZxMp&sz-Fh7yKeWTr#0TH&Sp9t zv{=i~R5Fe^xiAlUWVDdl&!C5S(CZE~@(|^zee{6qy;pvTc{| zhpsFZn^v4Dbi`?b-^I7q|9;I}cPgYw;-nDo!V_vC>FoD?r>^*rRh7%jz^o$eIQQ@0 zFGtve*nS@oVqG98YgGR8mA~Iqp=G^Y57rvF+9d{fv>bEz+kQGk@7M~34uw+Yk~FR( z|9*L?tl$Y);My0xMRa?rf&bSFr}b9|rX(ne5vYbnonj|@ux6C0_=1yYRqwUPR{~6MQ z6CTdhYI)kk5%|+BFNy8*gCAF=mNv}V;1ql9_=O@zrLv#ZnUPL2y)OtIQ)7xXI&LYy z=iIs?4zA_XIKFIrm9a@pqHb5zgo86ZChR$2!`%J+cc%Np*;P0H#-9;+6X$vRwtH7r zjHz(c*3u|T9m&p#3g_PxzBAQYrP-gPl%5gPq02Hw%VFidn2u@RK1zME&)j#j;E$}< z9)0d3OQV)Z<#0Adxw&_ovwpqmclft6_STILc|(^)h^_M7&f^(zg8BFB16R@tu4b7Y z-F(S7po!^uU+|X?Z4)uzJXu$>yxjpk6IhPvM{f3$L!>pJ@a!5FGYw3 z`*xR1-uv-qU317+4x3}F9W&>p^b0o`E{vRd+~7@^{3`uUvBuj`*Ifk#rAx$CuDBdF zSzBmQwECgP8P|ADoDJ9{aG@n3R#Li{~)AMmr^kK}c%Zq#rP*DIel z!Si1ApDpTw8?A({YHeSsT{>C#Wz75AK61~dwlduEI6H~mhbRBOPu9jqj>WTCn$oPJ zh4=5b6~4g-|;Cuj7u{(m1C8l*Q!O`D?1Eo{xf`D z;wCWV{pJ;XbEc@Id4BHI&|zTxnHXZQ=T7Fto^Q5a#ncNEt~9c)T)Rf*$fO0$`)B^$ zqIT$r%lcrQv&;MgfA-ztepQw7MSsag=IJ|Go+r=09Mi|};p7qRLX%aqf+u=0%61F+ zxvkkav!mysP}jSZ*2JmI0)EWt+x$%5*Kr^IW7mHpzN7F^)2uh!#Fc)k8CmE5HJP8W z@9c+?eawgdct7l|RdFoVkCr*1lm0t<=MVnF^Va{W4x6(!IL27uxFtj1{N?Z0FFL#P z`;7UW{~6j=hpygUbSBj2yTH%vP^Us48KzV9CXTzo`XUx?y}R>jl~w)iwaa(E`OhGJpvKo<;Ofei z3m!6^6gDdVxZdiHyy*AB(3MlYj;_4CBFHsBUG7L$Hh*Q)p@$W0`6{w4k4#_NX?~m6 ze#GwdhyM)xak70a! z##j9LlE>|m8yyX&*84g%6|_rya^E-2GFN$lf{Ijjf#->z=jKgXRn)bqJ1O_orUaL{ z&pi&VeA3XpMQk?5d*;fk{Vj7ID;;BL5{Z)I%e^DqBl&Up3ZoMqOt)tU%gsNdyp7F- z$7uUXr#apXLXK^Ajvv=ZhRrez67?(+G8ESFdHZ%zuZZ5!Fb)>WEz!n5mw!FB%&PT? z>Vr5#-5}-FHyW2^HuT(lKf6QW;pUF}q09E%TG3!^Y_&afQCZvlZ8Hz{EZOu*lVROe zp(4X@i37L&ro?wXX6HY=aAnYn9SYID4s1TZYfW#~Xg|D@E^;a(FlvIH$d#_#(2&ET z>POzLPyDdIE%?C??+jbFtYeEcgDmf)u?MJhE4;IQ{pQk3t=*QZGqOzYdCj(8)cf?n zkN5+V+7D!w7Tk$^BrB>Q@tD6V+@11d7%_gwm;Ag2PJF{1dulL(A&)0R?g^H$y4a*p9br@$# zAKP9Mz3fiarDxhZLr?8pHTOhC>1yAKKBYxh796;^YDs63PwoBO#=fxhBKUw?(uewg1w`kV1&?VEjR!rtPR%uxH`q+O4-LS=1y=PqI>Jyr4 zS#;)J=BBxGI$wRimLnJ*7G=t@(Er`JEALiJmy8>*NS0}QEVd1 zyaZ;+bGBcrJy^I`E}YeSB{amNZTIioRmGASv--|0^-L@{#9SU|yv4KcmPNu_*~1;? zQ#;$#>htGK@Cpkw6`efg(8|4Q{xh6VV0iM|ZIgz`)R^{_TxZ;$Ys;rO;`4;4kUH+Rgc(9du3Q;yo8_f%r5bI~Mc<};IT+Zsv< zsz1|i^qG}kn6mYAiRTvPJC)zACG}=&MAWr~_3e>seq^GxQ&8vJkx5Jw7Hw?edjHto zaLp>_(8Q_T9Gmn664}b-%8VB^g_o>2|07W}SD3@F+xY#=kISEa(J@`uJ}qLQie__$ z`j0MY1ccNch6Df=03Z+TU=LJO?RF$cym^r{W8P*_f~4JG@Z_#sctYhS$eH$ z@sh^<*UwGRSDU-3`!u72hhM~7d;6Em!bE-vi*0l`!n)1D?ET#DQd}3aKfMZ0nq1lT z^sbPUU)?;DfE5?j7O!|Z`A4sOyLIaJIj^nOd8RzO9Pr^kL+7apF30!O7B7mpH2WFj z%(UIpT;5rqP!CC2ab;oF1cio(31aEiX@<)Vh$>tOTd_$^&pIznt^UUaUC*oY=DIG~ zHeIJn{pNp$2fY?6Ib<6JiWp`b6gJ+rG{97H$;{Un+=&C_h&&J|oEDsohNia`;F ziXn?P^X;cSy&2EAO3r4LPFo}tvf__p-v;&sj`=gLI&WMRbX?Yly(bc&jLUN)&Nto-Fs;P&in>9JlPOz!Cu*C9YV8_zPcw6m19@gnQZu>m{ zz|^E=QZny-gNsn%_FAzuca~>M9`0m};7fTXZoAlp{fYG*t)O(BOre9m&sFp<*Q%a! z4oh3{xjbspqLgljw{kV#FHcK*BfmJ`JDI9on~u9yj--x z@G`gO#-{2sFRwT+Y7}5<`p+;$;$^at|4*qX*9cCYZ8}fdHYo@c&;0y;f!3+7652{r z8x_Pf__^ni0X61czI`N8q3d51k^Tlf`ES5+z zrd6ulnBAE?S>e6BuInU*fRH^!S6vUecFmssaew}0*SQ)~Rs^z44qYq%Z_a;)Tp~YCh?P$_eHA81J+Z-k-^-MwO$1WNVUrr4vSo3N9wOXGg-UmJ| zp7rJ6R%Wp?9s8O1%-;UW;5y6Nq2iIK!}5lk=Z$sWFLR;mCzCTl4*%7un~gt&mxJJwL7Yk}n~UI<`PMHyOnY^V4Hc%pVlkPt!{WwshgK%-qE{D0Q-X9(NxZk& zIlunCuf~=un@eKEE;(}Xln9vL-#5c_Rq`uurj(=`Qdu6ES3*KJ%@asrV6!UxTXK@) z-jtVXHT>i!b?MG{xJoi6CeXh@pKoM0}v!XTGU7d<~Y<>pm72mDq`M!IzLbKsj zq|)IldhB=oZXa85=G>hPT8biXCOwb};`1wh{Bq^&=d)B~A2DzwbT4^t|2X8$(aew) zCpxd#3mjr(dGlHF#>-Zh z4_T(g^#;Fqw}gFKz9PijF)Gdb?VJfL`BDsTwnpe1#%7s&%;Y&eNj*{UKSQ!-sOIjw zRo8fyrrrKIfpg0@!5!-7<~>VG(|F>$MlC=12IoQ9=LauOH*0BNW>`I2q|rjoaKR+0 z##XOh-!oI#n5N$oe%|}F*I;!4)2vl3dvrY5n1sq_{@WGi^2cG(>S;RDIf4#&Zjd~F zK0I9K*}|+s<#OG99N+AIm36H2I+>x7H)YDnNG0)a_S;shi3zT{(&ZV*W3)L#`@Qh>yOQT0W@c(#VG#B1yV)b;Gx`1dMc-yDo6^2~%9Ix7+--u7 z%2~|6UY?a0mvE_3Cz-o^r$F)Ni%}a*Wx5;K_(LZ%G*!P0o9i{fnUQsGUOi9m68`YH zEbm;>!Zw`-MbrYg?jj?a9_zh%q0LuKD@`|rpqnLI6E z)m2lghP1B}*_^&L|24^IF`vcJ@3uhCU5794z{xi*wI!18Sgr(lI~To7o+)^>@a?vb z8!vBHy|&6KZn?zkJxAVJoVX~gf6mp|Ywd#tJZaz95~>^Rzhv$-Zx0L3Zt6XIupmt& zS8#)sX^d3H_1Nl@tX;F_8VcH4*WC)w+ZLC6@5F&AjNV7StSgr*33XPUaO!P>!Kobq z%9mV{)asf&be4(6PI~clc7p5^{kpqf=6rp=)LgNdgY9%P6VH-!pVa(JPM5l~Oj7Nxi<7x98i+oj1ALw(2QNov3L4ym*b~EHAA)3y-dP^Xzp(WB&Z>=cdixuz}&q zp-BrILL&@>D}Nn4e%@7JCgU3JOUtWOc$h6`yqC_LawlwVsk?bgZ`1k@#|+=!|9UM= zH@l?cPIGbag!=VAuk8&u>!#4r@YhxOjQsr9i=2Z4xNh*AVBuyF@+qIZphIR?-cqOF zCCrV1wK|-y=Kc05`}JyqtZu+;F@_~ko@$@f?|;9jvU0+j1D|Sc9T4NelBB!*1e{lI}%eZl`lorZ{NPJBRH$Abk&jA1}Tr53ldyju@FO>lNr3?)THZA3|QD3XWCCQ zo!E0lC8V(ES9uY~snZEeJm>fQIyN&+D`rF5B%j$=dRubYjNdMraQ4|E*XU0i(anx3 zdIme*f4Z(T+ko-5&hzSAwt7w3J?Z=RExX^DCEbz2vguHan({fuzgx0c_boI^jpSC) z@;KS}&gO;K)Ri3Tw(I+@Y`DO){t{bFc2HH!HI74`CKp;~G{0ndS5Uf6C#z(^p@w^l z4xCx`!$R`fvaiazQzv)}81RW4d2anXqlIHxV_K^gLxPrAV?)4`yF35wS`imvE~v4f zJB(MyrP7$)%FC41Dr132sDMv*kjt^3*6H^{_Bl4EPDsCU+WK5wdTibp)sJCpP8Yh#RRa=2=|6Hl5s?$X|(s-O4_BJwXId?eY+l8zg?K-8y zsvfUw6|Xd2{qnI_v?27?qL8WytAdr5ZvJb(Z69|G;tU+@ajIj8FJ+n z4`+G-tK-|uBh~%a{jO|nwR*H7*lTe}m}8A#@YPEWA5zlq`yA1cYS|>5Bhe;sY2L-> zH!`kFT^ypdwfI!3wqoTGe~)wa&s|pvy){+!?3+1>=gaTPxx6PUmOVTec=fcIo~I<| z?>T?IOu2BVE2nLSqF~oFEh($of5pqxRtARNF!vKNJ@Sl;w~Z&=ZL1rP)4WYwO;H#4 zKfQl-kFO&kBFM>}XGN<62d4l>xsjDKyzu=%TbLGbcnp2!aJ{?^on!r`=vr)aW zcVE;*^_+}<5{x0DrZSC}7*uBOtNi=b|1jUP*$gqC6MyA<9?pKPIXUHk*1op|3&GWZ!Z(OvQ#Z=Sw;k%~pS35dR$R(9sxe>IUW5w3> z0S^vz&74|y;E4a+sM!*%j^egw=FQ&5+9KSatF0{^(r_j>VU=I5vQe4*b;m`sS>q4q zWzGogOJw4IIe*#mgf-JFmppvgqPFPQiOFnb2mhYy+HMfDv}4{oeskswi)Q)d`&N9- zGJKVA!u61E6U&L-59Sxxqe?Yra=Z?i%9EHU*=nzGAvL?|$wCH(EpKP2FSp&FEA`@3 z#EKOcdNxg1x+u|6ouxi`X;g!_dnU|Y6 z?guTkovsoN+JtzQe22XA&a3j=`l#MiIu6W13uOn6Oz%K$Oxm)F{)}85d6m|KsEw=1fp;WZ9Zh&OB*;mOoQ7s;gLN0C} z7nuJ`TB*_?Vc_(`*52o(&*x>6FDHEJd9^cX$rt~O&uA1ab%dgIzjA`8ZW`dTDd!Fy> z$alzI73}6%yXJDrxr98kW78H*4q0u)>^rl?W!ba$EB^gbTED_^IhRDcL5NA`LF0+P zU$B=&IleSpAy<{qYRTHE`_k@a^R}+MRA$#%Q@D3MVQi?kE0_H;U2HY$$p$T^hz$uF zb(E9eE?@HM%PM1Ul_sm@I~Cq<-_~o&uz)9I<1^E@8TC2}kDvC6EDX49W^TMvjccQT zbAMs;vIJixhOj+tI;*)pDLj9s{^f$?60g;}owfus#72KY&xS0?Ivnyc zszsY2>ww%ui(jv$)}B=qote<&z@;U)>7=o;?cyL#Q3uWGrkWEzaW20g(^Ta-_w&9V zR;;dXGekXPmZy66-3Y2lku^JWeD#L|jBR;rDf!LHzcSeO?rfOgw0`Bb9)S?q2k+mR z+~`o+8I{GfYE`#G>6bgTV*OM6<{XOVnKDJx@p4A&(&YP=KeN4cJ=`UD)||PpSmF5O zJN`Q_2dl<%nq6jlYQWp@Zpry#%U_vXr`kG{x;`CX6`!^vCRz61EVmG+$X1i6u&vuX zo$`dNC1-qVUeukh6}a-&#B1M0l@uf_FSwL0JE$e#oao7P#;I$7ShyN4<7V za_CUxI?0pr{ok$@rmoJYOU}YSCQfVIdihuKw~JisEK7aW)3XooDL!bDvZ>CvC@U78V_7)iu+jm}JA(Ue-1q)tRGAZYL06?iAnAm>&+k{0P6Wz?lrai4?ABby z!?d7$l6`%y?xRUlp9L@K_scR1S1o5Rq_Wi`YyC1>-Ax3$?F2%=9pi z5s+5%{Zzl;PKI7s8LqR)OzELYlZ)GucgGe7r~OL`d)@V&_jm5w)te-*%{JM% z>_qO0ODdB#>eUDee!0M#yM5Ef(i3X;(vH1&D`$Uf-5TDKufLiZVmNn;=WpNmdBtLj zFdg0_Z3l!dxTV$9d|{iky0^KQV-?rh>5~{H-*c(=)tb7(F(rJ($wEy(?oAUM>`&jW zx4V_PW5anv=cppi8nzwj44Kor(j0?kZEk0rzUuZdMuoD@_flQP>NA6$nySrex>)vv zgURidql$oJ)6CFtvDiIp1SfvEWmMXzbv0BiD`88NL_-1p{Oiff>QY@HJhRM9q2Eg2 zO2)c}3mQDRSOhQj+a$^Ps7BbOIg&Rygv zxK?fInHSxsCr>?U!F!E;f8(5E-CJG4#Elp>W($fe$#0%{`{kOfwFYaP7fsf_{F1F| zS+TO+<>wyOsZm{vCRsJBYzT0SJdt4iB=`OD(^DC`W9}xci#Q{u?h(5-bk}Wq_zJ$N30lFXRYwmrNtwmp_KUP{n=1D0 zjCPcq!fvk!En8e_hOSnl4B!t{=DVBhd1h+c(hoQ(aPDSE%;OK z$L;&psm{8pveRR3GlQq3eQe=X*;j%Ao7se(RyD`)`}mnlUdWo#S(dpxgKf%`a}Qc4 zCEH&QvE^HHX0D!y7{e462I1!`+sZ?V&ibZZ<2&FYqr><6YL$&04QDBZNzmfl;?HNB&Z&OA41($VOkI5Ceu!Q#!l*=gNH9-O93JTUFPY zlJ}G9-@Inu#waE+Y0akq#-Aa2ih81BR zNxED(TuCgJg_Ux3eqF=5%vEnDtgD-jnk;(27a*kjX$Jq(Vo zS{cL?jvlto?N!nBzM`Po!RFJ|!r;to&3OB^+leEmPOS zSyxvF&YUnq;P->$9se0Nui?4q^z_CCF4qIaDrpQB{~3CPL*KpJcWALfYj~$vrxC~f zmx~1F&roR9Iv^ksc_v7)@q_X2m#;LEP6RrxxW**L9mTo*w(OTHq0^>1ExF1g#bN8S z)2u1U+oh@7{lg`+m+`-GzzFWep6{&FuBHO4If+d+fTb;;qCj5`I-z@ z7B_R9vFCWw!#wk9*ixpYX{v!jaWV&-??1P+yJhNY#2>p&NTOIFSkhd6-b|S(Jfbgq z<{U6NI9YeTGW^LoUjpFCIi&oI}CYtFX1T$4pYkAp;wXNvnz{%ex-K=k&E z#5n0yUh_kE_Z*v}ttm3I(bLeBGl9c4{+4xS=BYs2aM89-PKAH@ubUsch^)|-WSOcY zZg&5rx%)Ncz@@2GC9|%q$hsXct7NUHlFIX(=TBE@MJ1fxXwI7WY8&e%AI7)u7tGDM za;Hr*K}EB$8c2E0yQQ_Pl_eBhS< zzBwDx%eE~Ha?D#H>L8FStYkM!W*XbG)uj&>P1<(P$m!f8o9`Dx7;Y?HA`&QWdQFf? z;+$W}!fBIFY&qB)AO*vc1!Acty#YsST=Ruvb9}oZ~JBOtWE3B=53taIJt@I_NJfn*+V%NR)##e z8?b0&^xs0EFq^!DbRPx@wpTeGW(UINFzh_yo-3A~8{?O{M0RNN@3O={g(4DhY1Bob;WuMU5{B5#c+EuyRPy4d0ihv zE{e?RT41%hytj49zyA!|TH2C2o=6o%Y}~Q#iJ{7`f`kmVNm^5a zL)$%=o(Y+$B;Ay-yY=dy`Nv=J>)=TpgG-BF8gJcoDXVmH`IloC z|1;>#cYdt7S+MBY=l={`8lnzzD^(^wkvO69cIDEq4%2x214HdL%1^iG`*l!(y{Mo_ z%x6Qhl6A(FB!$rZY`%Mq4F#-wUO(*LToiPbX#(#lm#PJp@~0oWv@oyC=i@MYV0n(M zz)>o7rB;^dfy9L({c|@Nzh9elnuX=m9R2W9_b#uVJdGtZW2?l*4u;8%EdHPKS58%% zyNTP;;mqw$g9ZMp|Cv0omY(&4rPE@9V}t!&E8d`mucOy0%-Eu_L#EMwcE}lj-Am4< z4>n||d}-hivOWLvqD~+qV^v7QAs?B9=e4E=U$t3S#F;L6+}D#j0{|qa?9jU3EqrY*!#PY)*ODps{xZ0)`sm-46IYW0J+rFt@{j4AQ+jcrVZe6xE zv?IxVj^vDEx6|Y0e>^{2aZdWt*Z8)F6|-XO4JHPPG^rcgw*C8gedTZYZ;N`PJU^W8 z3^lE6(@RxzV5oJO`}OsbD@XTS46mu3SM}D`d}a5w9k&hM2tSTb`Ddv0(qsFIct43Z zE|Rxzzg)Mu^S9!MIE#=+JK{T3tuh*KIv=}ntn~T6Yc-s8yvK}n%U4YOHCc#ZqM+=? zb&c8Ami7A2c{NphW$2n+$@%&3*Kg)@?plWi9V?^XM>@^tP@zsE-G`oT`KyBXEA=$6AGmRKL38CEwlzX*pME&cHP z>%OS^mpA|YXZTTQCwZv#q1Kj5B2rUNJGZX#zM9}N%VlQhM3$Pb=YtP_Otjdim^m@j z((h#8l&gs^MHW0_xhwsWtNF;vM_F6l_HZuJ%|5&T;F(X)ub7_Mwp?iGrM2#Y=6jO0Y}9Q(!Mgog*8Tn?Y-+D(O_VX&Y&fZ&!%s4O_0x5wYU{36tnRjt zUFEDP$bRwZ!TX_tULheDmIuuei=LEctIT$SCv8pn)mNc5#vvsPmx8u*P48e~%(VYC z^Wb;M%RzOTf~#U}Rdy|EoiVZbKf_AFeKU+_uM}6kBbBoHTv}3^tAqOM`_3xMMOqE3 zmb%((-R8A|rDW@orsquMm)A;dS6n7GchMD=X(m1#JbG>F+t2&^cD%~qWAI2Wh}33W zaQ4?$lk!yy@9bI-Gf`O3{Mhs3ryaGfyefLXLU-BPf~X}&joG{pm-0N2jXIv?#`lUO!PH6Q?6RP=}E`ieWoFN%vvkG zQf4Qq2zgGPyY2hAj!D6xNg*38CnTS_!}p*%^QAW1(`h?B*%@Z4S+&ezsLo*F73F5v z=2^q{#?Xj=N$%g0xXGJmUzj$pT_whkr~lh`+m8zm#as+L6tb$f>g3kmGcKMH7EJE1 zmn9u#^-8dH^L7!~bI3^fc5OggR8H7J4VM{;<^BHKuY1X?Oph!&#VPWj$=y?7a>x6H z+dL%htoK{AYs+?ruM1~zUu{+qs(!ii#gXQqnP&`yj-C;4ILF66xz}dz0qN+12Tvx5 zJaj*2BCt2$+3GJA3JnRO_B$*tMif1rI%o6N6VnqIZ#oFhul;HwKPzY3CGR5)$t?dF z%-H;9O?TM$V0{7Gjb@fFopvkUFYEfoB$ptrdQQ&a7NxgXyq-F)|6%z#@wTe7K>@{bZd1l`K!e(Xu8I9#Ivb*=5~t6=CPP8KLmeITIF z#PhIr_w&fOS*s3uwJv;^GW~{-aidDcZmw9j#gj`oST`98SeO5N*(JIxKxkE!LomBa zRqehg&dI*d9Lg9B&xk3^ZMeshEzQkbsqt9gg1m(0Ou;uLCwwDT#4TxH42ihE>s<1m zY>|Yk3cE!k#U?7TKauUpnjq}9LWgOi3cHfeJ4K%d&rGJuTDm&NYn|43az?oI{A$0b zr6H>8Y*i!T43!1hE02G_7S->km$l9zZGwtckHe?CUpaK$Lf3d~X;aLTnET7EHv0Mf z$W=lePu~hCw9T*M*s&?Sg@@YJi6!M$97ZoqqI``3R(Va0TEDyd(PV3#G z(zvG3N0_s3v-%dFIrC+o`(2gHVi8+vP;9H{*!y|soQ$CIunilxFf7=-qT`5J+FOA& zj#^BH0*s8ghCff-e`%%29UO2@>Y}g6?4IZy=0ZhwRhm9)-8McHjOl*bVR>5e#L31_ zS0!&)i)}4z)3!Y4DbfFN5vx~PmbJiiBk^M{@7SOA?wiGVRoUpkDuJi5=h#v^*tOp- zb=3~+mYU#^eADleTdm>k+kOi^-MF0AX}B%T19aQle};84QeRHsj^$xsFi-HA{POLx zKUyKVN~e$ZaRw~&WNC^Jsx_9l?H4yAut+gnVa?v_4rdp8Us<>1Y=Fz8gWq+yj_!Z^ zd6iMa6MA#boCr`j@%{7iC1;|Z?r6QE(9wCUxct1M zdE}C{vXNYVB24a{Myh-NZaF0>HFwQiLnCh&L4`?0_kO8b=9(xNn>`Wxe&Wrog!k9$ zLkyH0UfytafA*ijiZxw8WP-{q=FVR-@0(XnTCg!)tD%Xzr$Xp3&r&k}qfDH|@ogrGcF>+#A^nm1ULluR8?Jb2i!{v|e2B z&dK}A%2HaD3szP~UJ=!9R^m{$o7jK1q2el2N1qVB z5Q8ust|tk(cBRcb(iwz46m)S;s21*2K0kk6XL*&+!f7v+L=W(HiZztK{c?e;G;o2` zmYavBDtHQQZcx9vbV=JWrWJuInmcruf0`fse&0{qN-4CAVTP`t>=VYl_l`$qcF)lf zW4d(Gn0foZx8fUWrsy1CRXiBm(7<7N@*dyTHK!!Rye8=Gn5L1OCd~3;3upAEnrDvR z-W4u7wc1r-Luf`TBIat&`ZMqyXRqHIHV~?QqkBiGAJ@~R11R5L-GjFe$ zd`D1BYS0~?)gIfOE~7u&hGEz2^nITq>}ke65(;QmbcPT9v*ZCg~;wWf*csV+Sw zGr?0`;m74RMPD~9hTAh|mrwgy*8JeLbGPN0*bCF#%b1nYl35)8Gi+SS@#aXYR{tdl zhuV{qJiq*Szhc1}5vjDrlU1i|+`^IMd2rJHTPE*RBPX!3|KyOa%b))9VtBS{9%Dz6 z)5%E}_g&mplOD;uTa3@!U?Okn%{%qma|I>%mPSrlJ>dbn(IEzvbZ&d!e`{idw(l&+ z?3Yp;7fMOT+S4 zh0jW^Z8zEKYO~2}s^Nq(F7cL(hYi=T{3` zKM!%Za(5Q%k?Gm4s}d%DP42(!aHULflB~;0;rWKb;x%7Ir{2;`@tPpxdccQiv-R`h zMTbtMunA1E7hK}gq{8?6{Tj)YOfh$wS*&9(B{?#e{ViFc%~*8mP{}<92bQXa_wR4< zt#Z8Z>B60qCi@QehaNW$PTv2{Cez&8*LoOC30@H^(@f-0@s{oBa!sw_XotMF?@o zaZZSq?cJR5WEdQFbiSRy zo|93~^Wn{v!#2}Xb-WK|^etr1w^G^27`23}VFhDH*gIW?bN4q`sa#3j>3ZU@+DvY9 zm#NkV&hOj)i6yBrL9A6J!QInh{?E&7!GZx2D|(hZxO6a8Io0^~x!$VA8MF1nW1?;r zZe-$<@HugL!HTCh17ZwcsruLO9nbv|`6`5W8dqp{WJ9@t^||}Yy2PS#`PQ^-`YP=p zJB{&l_4{R^rHoS?SPTQq1zYXk-S+gc>S}V-&JQ(X@tWMMes%8o*Q;2TpWo6dbev_z ztF|V_&ijsbzE&P5eW&I!icHf9d3<%w78k$bHPIg(Vz`oSuaey6a5!D%_sf@8)=iPv z-O44}xx&pz?Zx|LJg>H|Xj;(S?|1yO@b8QQC#g)E2~2k?+t_aE&NTkJwdiZ!AopP1AqQcVgC{Khx~)r9XA!#))Dsfi z>GWQ#r!(0ysBCV?lw|>-Y7ejQy5H%&Ws||(wbe?ORiJ6Pq%q6)?SAXl9Gx;PEc@*0 zE#K!${CvgA8~9Ab{WptWZSdV>r>_ZHrpavN3)K>cNM2dI<=btC&=96m+k+Eg#3p$& z87=;q@aPF4u|#g!pBZa)t-jwY!xu+@DE_C75uq*Rot6%=N!2= zO2nQpyqEktBU#~u=Bl+`M>JI!SU7CA-@pHS$)baIq@5z!m-v)vUH-XIcv)z5^mLuW zi-ir;jQpZ&UcQR+n%?RxtGkh1u>Y)qi6EcU7N-f5cCIKm#t{~~T+MEl(VUZ6i$V_Y zBv02e_<8c@&&xrkAr3quN1GOVaCgp}^VqBN48x_VsWVhW58l}{<9tun@&^*3%Ql}$ z)k@(zEv(velBM#pt*ObW7y$+k<3i?>bB~{w&JNx@C&rq|IlAOgLMiWJiOaLLO6JL$ z9P*FkX1D&&u>I-dz~B`RLISje4z6#@S$Qr&-hbOI9>)aDNz9rl%RCqk>j%7-yq$5; zd(v8$4nIB&+M)m0MM-H2FA$Sst@|yPtR5N6phi`5J@8G^41QUlUSm zc=zpcUAHuI@jq>8l{4oKIW;#v-!^OG>XS{$>^eyj>4HBC?R~|vCtXWpnBcUUbzgFZ zrBHn>^NB^edn0E^L~gNUNOXCetFEy@4u-W$Rj*?+xQZ5(wvL`>Hl$U#Zey8KDb~AOsYH0qlMR#f44B!Bl2Uknt$qKlG;Gh6G!8ph41`l$Q5Ihp5?5~=-bH?a;R}a zczwwCi+ikA@B|C8n;n!es*Q?2TBodb)q*Qr$>mS8U%KneTXS}rIJ74RbUPg5EC0L2 z$~VzZ>vH!3soCr9s#~ht>(|D~sm`7a9GR`&!Ma zQae~Yb~9a^!P5E0T-o6&qnD9n#DuV`Vs}}lGMvxP^;`f>-`N6zhgEj_J(=X7{JGjgYJ=K&kHt5x zToSu6{53QnxQls-eB>#myPo#&S)zWw#;Npq;cOqEl&)de_|tuv*b#kKNr zuyRQ#TTb4(S>l4JbKd{Y`+pWBZRBlwr*NpWb+Pj4hy-uT`b0O z%XE%;7>lptP~u~&eP(hkG%B1SRN~IHiEIwGcDMVETQT{1Px0EZ<5Q!N3*Te|mU`z^ zliW6T2b=9O+L7&eVzO9zz2WjO10S}OBR=W{e5oY*)6l* z8vbq@`^Plgo?Th1hz|GA~-!Lj6v*9Ha+&m`Xs?w-Q0jQ6dQ^;uEMU+7$@ zcCv|?6Lf8f$|Z)4J3W<_IIyWm{JH;m<;B(68%3jz7#(#8*uc_0??1y0UdE^`FS}=U z-E!o5c40vSL(Y?Po2)*)VF*fC`0MP^B9}?kW%3`Fc~59`nJwz@I!Hmn=;-d3ch|bD z4BVNK*m~%ZGTQ@#aw*oJtIQ`{9HK7VZJe`xLQS@%U(4*ZHiz}aW*8l}luo`MIrCaa zNV*o|QD>G7>gvWUFZJ}or@c47Q<*KO@N4<@?WY}1olJ1zj@8js^Gh-NH|JH!`<2}x zD^g3J&W|w2`zCi&;_AG~%#~b+@=vPVQAjcqwD^AIaOj#|m9^%ZxVA|)vWPPL@_)TR zSK*eQkEv6%nu5^I1MiaEoEp{!OiOU!yd=G2yKxWmqRs%Dpr94z9q;p(-##~?xYFrE z&(kE0CllCC)$RSlC>yuN)-`*|jO9O%R~P?!tvGGP(X^)%ynR2GdoVm`T(!Y$PjkS* zfW@Dg|Lptiw|RGHV9^ebH#(gxPT$%8nFu9|a;QcalrVkbJ90qym0Zaw$F5b!9Jfqm z;h3RSJlXd9wYsFvWl79BmxS(GbN`9s6+@NnOo*i(mI(Uom^DRTeeT#%{KFSU9jC|QY zk;U^y@~w2ARaaicT!?%ym0z`uQG1TtrXycNcAIN{oxxW4_I5;Y%eGI884fmDbl2bR zxLD=;a__4%c{PkID>BZkU^(`z=Gdx-%~#l0N_uKFbiPxzF#hY-D*5zF8&8A@%a(~7 zJNumFrA}QJDR86>FE35 z{=(ECD@5lix7_N`0v3T<<@3p(t~y%>FZtfGlm0m)E9;7yYjDOq{d+eExlh6?)s#R&%SY*}6c8;f+MHchIwvASOrEgUypA5)7ih zN-@3K8q03Lofxul5@$1uPwW=IW>IgiNvl$%XECw$2wEC9e!j{bvh3*11_wvgu7)J` z@SW1NrW34YxTo4RYqM{AevYT+OUU7=%M_+^GV8uj-YitCe12}=D~00X1xg9qd~Hvt zTgaJqt_j)6wPfDJ@D=MbEPv)MUA6A%%$;4%r(!NJbDnH|`SW)Mv*Hbb+=M5_PyJjb zTE@(gx4Xr8g;8};iWUQRX}9aQpAk?pV1 zyPd(a)XCF=MJQlqVzaW{{M;=IZ!ex9u=2#t-m`)e7!NSp$KActuxas(gVDtu78d^* zaw^`KZ2Gj(Z$Vgr?;5MlKZmXPuS+QenqO=TlzNq-thhDGi0j~OuUGLaou-yGg}m=S zk>Yl#E-G!B;>2caR%4&0D8tKYCR;;VS4?#@pVSiL`+%v+!NTJ2mcW@Rix-EiSP*0D z<8p#Uf~CGTXko#b>xz@YxT82a8`&%0Kgf3V_G#OCV&00E7L9X1FI^rZ9Bf`>pJx{s)a_RGO`fxTU(=?w%1X1YxNTn|w&g@a%_NQsL5yuXcE;ZHRKK6W zyUo-wY|+8Q3(H>WGPcbNNn*OU9xM4C;)%PCRT9^DqC(P-A#fvSaxLUxQ0rl1GosFECxT z+gw1zXvMNi&W1XhI9|yfE8suBZFSh}5U+$iQ`&-#X9(oU{{CCCA}S)Vs*zcMSu=oR z?($B)arDphZoCQsWiXU4(%+`Zf8X0B;mwbrEDTfjlh z)AIi1{&}WaTeaji<$E`KPP4dk;H~_=u0^}TCPWxaI2AI<^T5Oz-1ffdE3$Mvq@C{O zOk{JB-TXUSJ3L|0p_Cp70@vw5*zM=WvDd!>`+$)BFF7xt!=v$jmtR*?4WxOMOD=Y>IED~yhIvRgE7 z;C?Ro&1(6>rKjr@gB2EHTsB|+euUte_7$_gtaYC4!O&zs%Ta2zsav?-5tR;|iJd|m_sToIT?{T;$-0+| zWx@QCPv;?PP-~Gxyf4<645IsG}cbi7$-2H*#5riT#_Nd25`lEf`KSN+bwxK!>u#8IA?Nl!|K;BdPLhxc_J9{?8yaYi&@M)@I`g5*w8~gA_X6-gnVl>A&>q zIyK4WkdtpbI*(7>Hf>gj3F9hmp$1XE)`|{omI?O9cFJrMIkfiLYR~P$Mx9>2N_e*)Zd#Y@G#naUim+;WTfbVwZ zYTFcd)0k*Budk9H7UU(QM}+K{HQjJ|<~}23C6P)wW#`Se7!ZT<-CuH7G)pb?G`K-Xm^&7nhklIr}DL%gF}0`dRFM9=rO) z26ZT)H6A1S%h%6%iFx$^*1kitm<@)?F;{zB6^#_<@U;;WevK4KGRqn zU6mvp%+5dU@joBB;JSs@v181Nj@uF%cv5RWFZSrZ!Je+PXd{>2_5`PnFOTbu7bMJN zoi!uDqb$_+^W{fALdGjY!g#Z#nGSD~theisE5E8+=)G=sLdy9CJq-+!*8;NG(|Pv4 z4eUxdAG9Uq=lR?{EiW3v)@CJgpBB?v>L_$k{@ty*T?I?$Ijv$#$Zs|~@>eSP+l75G zS42*Pu;m6_FrL^mxhG?n=q!hMYlQ6s4zWeoDohY%{qnG~jq{{>63YyUjGpQj9099r zW7TG?$T`Nc@qFChy<4)PHu}z5syuJ?Vit$Y-v12ex|S$vt-5V@yHUtfxt3XM*_jgz z>2tQY9%$V8rhbEzo5`)M<_QcN95PRyY3rY7w<}e^QRs%kbcHqvg>5SGQXlVU+T99z zF!4tm)6TU=gPD9CM5Ekm^6$r)ufLo%KWpAKlkfVWuU)L=x7cS@#5Z3q2@iWL^<-J= z$9vq#+YaB3*Z8sg$g7(0{?$jX^6C{TvDXMyXI7lrYB6i!YT>{$n(2}&P8qB8=Q;%H zY~=`W$hb32?@;#FXZPtW?YMdL> zZq8j&Ze=)sQ`TgqnPDdlSfcxmpDVevRk9;Mg~`dY!IOQPbi~DSbET7!Dz|)GI_3Pg z&2!nbLCw8}p?o59tP?;ehjq%2YEtEdTjG+hOcu^y zK6#99hp+Ep_N{Lfgg6@Rzf-e~`lWw^f7kK@755YZmA0B@CTzE6Q1k4O&#k(-{cCnt zyxOL}VY!5t4_ z#71M^6TRP?&G^}@B51wMM6j0e z!M_ZJNo+^{GrYU~{bK4ift7mdHMfcU6-pB|dL-?^JEOAFjqF88$I2D1sxp z!~gTuMGh;2UPxHJWoUdg_uOX7Ajzp*hC!@*pLnW#|8{M1=!}Irx20R|3$i?B$(Wg3 ze0Zh!1fEUPjLdic&JJlbxx%T-a3ym$`xS&tzXAMC>J zU7|ZyDNW7tIn*_8VPHf4qa;>)_So%*_AylG$^NKwzFJZicxIX2N^_?x6EFKS@z<7J zS^4SZ#TCoeTuF1ddZt*bR9|bwc9DYz>~-@@ZgFKE4gK`2^j^^J{fq8hcwF=&PifaI zlUnC%XFQ$wSQjg`bj~dkS=p88sCiFg)NY0_Bj(DyiWa*`Dv%+ zJcK>wpPX~%d8kR?jahdr1Mg;@u9?+SHhJc?rLHTK7P8G)p1~`=RcFQ1%P&vKG?ku6 zkXp6D^rfqzj}e2|w6f)w)sn4`lwIU{wA4<1?e#f}UftQEu_0yW(kAbpS0}QbIX3IQ z(!Y>aziG`rN2XcJ|Ki@oD!OX%r_96qjiwkZ+jQ3>*VcXCuP2LG_f8FA$(}r|>&}h| z5e{GF<(>yK_Xf=rS=BYAku7qHuV>6xJ=>K348BGEeqY{cEIf43aEt7wfA@Z!nX_ok z!5ndi?Myy*3}4x)`%TeWQgqsqN8--Hycw+h{wq?BnYtWR^qae?b;jh}vl(w3jclX& zuZJvIaYlzLi=8K?dwJ&WjNJbWxk+n|hUgp*uv@95GAH5fuep{%N3^z>J=i(nvcM6y z$J>reN%~9)Y-M0k+3H*}q2A0!aM`N3RSP(rgvGa63-j1yc5Ap5Us=B9&bB7AbJo?b za@I_l&{mXmu~ElmMv@zQufR1`Q_%zS&vAQv^||B!RQMO;N++RINl$@I+@cDTZ-4sF z5F4rZN>nGd=Rbo0v$2Jet@8HywOWhUw5z@r;FR`c*A{I3`SYUBORiPE2PQ2mEcy1I z;r8t>7gkv2Y2CZz^+5mGf#bhx9=~4t>S>F}t6*)dH4Pje)XctLOA9S5^^lNNiez?R zbjh`1S+<(%%c);p)0X>8o}sYtjm@hyEe3nIk}G-DtZ#q4@3n2VbG+w?hV7042DuC= zxmJ0hN7n4RwP#0Q?&g`nLTL%}a|QcX3weAMeR(eJPRh&ZscsJ$vr?EkGZ@aeoDa#o zsy1Pb=*qj-yh?A|9{jieveyd5D-2$9xGK4d@;VxP-o9NlV`WKd5QDnqTMBHX7u^_zI>bcm4>pQkSz^d6Bc+%Z&Y!;rFbZ% zL1&sJL&Je%{`>#FUAcJuL#C}(D?3G(%sX(uWB$*pqPYreJom%q_DpQxf4SqD$$_A) z^Jf-pG4+~Qa^M65=ZwE40s2*wE4e~$MJ1Gr_g^zvTd?Gsbe_(lj~SC9(u%^$e!e<) zo@FMJBijuY#+fRax?ZcfL~lBB&$K_o_;JU5C)d`6_dZQki(<@FuKac((RZc5wOw1f zXNbR7UjDOmXI7ToIJQj+JY+#+l#Q86xhgUGVso}`ZWn6a- z%UejkJU4aKS|zT9O`A?NOv>%iGrOoIGNUZuY=X&!q-tjA{P|W9sU;x^YdF#v*J*Fi zGAQiNW$SW{bSb*pspy!b!m<6f&sK(Tm57c-k0fRYPS{|-tXsEvMiiI(h5(}^HW$CG zuHIgoHfZZ`E%|hs_n1-n-;xN$l&7~MU7A$wd3@$>H(r$a)oN8k{ViK#TZbcJ?^m`h z`{C;3ahLaqOLLymn`6C!C;wQQJ2QwdXP(@_aoSPhqKLwkfHT`9c3w-n`#k^bT=s0H zMxTv5Uf(1-)K9zA{W@}WkJy(J2}&2zlYD$H-*%1R$V!aZvUk;H1DBb$-;OnA2D4li zyTc>k(HX>Yw@2p0ZI2UrMP7%0`FfRmGYb8y-FDxP|>($f^_?HOqs$Krpkc8iax zYv?nUeO&YY{r*)tWABkYO^KZ<3`veLY4@+!N_o5v6ujA?c60l_-~So(I-*<`XdO9p z$3cs6>g>X)pXUY&9Eh8w*lna4Bq8{6j@z%GKc{)kUhdXuN{~2qGxE+0<)>5bt^JvD z>;eZv*@^k{y3VZ#m{#N)Whow4KGtqRc;tx1y(ENn2IkYsfD_{IyKJA1-Bf~uBYncCWS|E%19hIMl@ z6}f(^aScc&IUZ9Qe3sMb?$l><_iPycJ5iN(MXUFPl6?{gKwxw3iMc zCDRg$(vR+&@iS}6h2Sk*IU*al*mNguVE%NjaoMS*cP9F1ur9JyIiY0Myku2dT zBri!$o@;E(D!28vUaf%}oAKwj3xZZBCN-=&&9MBUl2w7t%%3l!PVyW$;~c3aUZLGQ ziAO$hnaIPtOj}I?4lhl*Y8{nq|Kw$6pujfDY12jRwfpPyA{ z_OvL?HGUzecJ=$cvai{!3P!CrnwBhV;>mxyJma?C>M+L!)oz2(`&%YI4|;g$;!;oM z-5Xp515bP znGfRSJGtZ;N|Wz1OX+Yf<7Az}bBeK;_q4~cP9}lYP@w}G6&S)ErStY~Rd3z9F3j6^ z;f0O7Dw6i6H@w~U+~>{t7*m6Ds*~(R{&Ln!uU-x!v_ZHN0 zV`%c4Bb{bzzpc?Dgzu!!oh8htW6t|A_N-MSdh|3hlhAlHKq~CE|=Fs-_UMY6$ zXs&(}-*JHg&ih`fj$z9g6biV7J5P3et)ClrGST-{VyD=N0LFO>dw*wUHv8r&JxE>Z zrttIo1io9G7sHlq%L`uWBg&AZGXLyjx4CB1R|w6k)i~tyD9^6&cjn3!^X9FKQ@;{* z_oU&ggIA7}Y+_Kv*Bqy!1;eIe5tEKg^3+v$;Qr}Z$vf{2TO`>ot*dot-e+L=J7ZF&y5X)6rc2Mv?#NVC zzi9okz|d^s&pvg*ZDD@PIK8q1g2Y)*uTVBJFjOu4owaAXSKjFYWpUQq#*)(2uhLgC zbM<+stX{#gBICdj_x+6ve`>d+Eo+^o8@e-O=DVfto%d@p|K^<@`Ltz|WI!^RH4mD~}iZw`4Ix+bBFCqPcd?JF(x%J7|W`eA9L@O zT7P@5;VbSHGNLSs%f5Gw^hGky8EL$G>EQmU4z97b^VLIRE_i z75jaYm3Y^suM#cmKdVx;B`n<8RZAl;I>pQNF#D?NbIG-utIlQa7JSVb_UOoC^JI4G z%!QRAO_pU13+J!ccFdz=m%7VJH*ui{TUO-Fe&QZx{-2>&U`^KvE74tyYzx1-q&7%5 zsAMw>2T87+H#_Oh%t=SSef;|+^i;6ZmN{N`t}C#191moEDp$I4jk1z>l6OM)yE_Mu zaJ>C;;pv<&8-rFI^-Ro6o8WQIX#ZosSSOK`q}DeqTjpDSJ1BM5!)Rrj%Cy7J(i~Xa zmpiSpn#dpIEVL@od7|3oe*YgAv~R~XWXo_!cYB@VX#QFFJ7eRrLvy`TIv6fH7bx`b zfBX6C#X^C~a)T2)7#qr@bAP?y4qF~GT_87Rf&zDl+r3{)rm%5rKP<@fs`9v}SpU4b=H!t6#8KYF)aUa9L@b(%$b*MA0~`_EL8|IJl0H(IQ8 zPhrlqU190-Cdq5xH4|qQTsqPMx|>L6(nx)zg^&Z zYSrm$O0y$c4hlF1-^e!DbE`*lOV#8R4M|FF$Lw=;43>1B$#P{nv^?A6P{*mcogb<* zmbp8I9$r(*EH0eWxS`+rwX3OX!fT%u!buLtKmBL8Y_<6Krzr|kb{0y@BpW4r`%l+9 z#HhYt)!m$qsh?{8v`t{9pFJl83uMSpvy!pTm0oEgKj}-jM zuUwtUsPsHzSEQ4v6N|tlLpI~yEqqHBXm#bNFLI1jk=%bfS9@B_AN!_ao+xsQ{ zGf18HdZw5rknx$a|$I`@0b#|DPe*&x&EWuZM!5#@_GTD!B`; zWT`G#HQ_b$(gcqqnmxTf5m^n9*6%zI%1^(QRPt}RIoq;_R~JYsBsd7Zw65E4o2{!Q zu_L>Ei+hMhPxJlPOB6kph4SUbY>Fz}(DLzp->);LR!1JSYExm%-8ot8am9VNOLz4m zB|22um&mgj&oyb7tYDPBEQW(cX!E@i;hfqQ|^vWUg8Mz zzqiM_gLp(wM=OY`rc6lkylru8V`OuV#C)F~0Zx_v@ZPLkl@$eNT&IU5cstB&+<5L* zlZ*4}kO-YqhhEk$@-*D>c3BG3YzI|uQN<;dUpa0co3k~H>sstot#wH*yhl827kdP( z*1E*!7%Xz=;ewuxO116RouXc6u4d7jXyn6GY<}WKzTK~Lfw>7D=05i%5Gf(ead@$mS?6Lcg9WRErmpHtdnDbVk>=pZRpT5YIEfeOSV|noGLXz(H zOAKjK7&bC9hz1oatTFFNf4(R(YO}zE6wS;@jLesmmC7##3%;_=vNbf5U|#BQ;`Y;J zT7eQlJH2M7irqFd*m2_Xq7UxnPpzk(QdAA9_41f1xbO4ANXaTamlT$!DbLuF?thp2 z{if#S8+WD^X$%XeEl@jjS=A@y%zuVnMgPNF?w-+ByEdtTL)E2b`JERMYui66Y&24g z+{I~KzuPx{Mw`w}pRFGx_-95-Sg^|tVxR^oEff=l4cidksSGdgR ztl#oL0nVu$Qc9i^mF#AT94z*1EP5gkb-}y!jIe-`f9C~Vk9Ca~^>;~V>j*1Ml9_+{ zpK{0srCoC-cOTes;#T3rrCXaDJkR@{-|Lj(%yDdEd8Db9P~P1sD<<$X|GWRml#L~3 zm6(mm(c9nt#r$XR)e4D9<-Q?ywAn*u8=L*@Wug)W`(}vgZd$$ZAcMr0gZFc?i`8ar z2-sRxC_a^?A%yYv{q2|i8lzGyqn#SKCam(@aZqgX?emw9H8ri7-zL!Q%$nVFPSGWI zxoDOm>j_&+NwJB-8J)e$U#^@oKh)e!Rw81{#GjmR7X&?;^;xWYI+r(B(&gvN%GHIp zt@5>yHCUA!AuPl>_1G`3@SQsRo(hxpI?Yec?6>|~;?bBblq>7y)2igLUBLf`6k}6k zujxyb37iFPjvaFA?PCL9?qr*KVU=2R661e{?;Dq<=o~rRsIkRBzs~(EZ;T^2~jR0ro`&Crn zv`yY4U9#z-bkkwEHUEAwGVPi1D&vc&fZ6=-DfPXxnW97SF-o`9w-<5{bDV5)Lg5c z*pOdYlKT>xTvGb(>*{Mv(6U_daYly2fg{t7J$|`BSFb^*wOqwm&ss9EU%+k_SJ*X` zg@)C4J5?lixv_t{9HnC&qN~8hzV5!7b=l8s1D>OeI+yOMFrK*+Rk-CpgX3H)$s?Ee zB6GP;IX|mme#O> z_g%twWwrn}|7FRSZ@VPdZd#Yf@zN_rD377@UrfdAeG^!tngYHWIyp_-@}S%EX8Gi0 z3P!>zA!gH*SFD)WyI1A?Ep$}W0`}~Vl$&$ZB2a9yM6mqI%UnGNES6=?*sQ!Rxmi`clh-pIS-{TUz(CrClpHDGZkG~nB^hE-Q^)D#JFRU`8kunK_4W} z7zVT)d$7Uq)qe)*j5Q%EGZe0T*^sxUr_JK4OT~SMwfv`*W*u&*>P#@3c})7)<}X1! zmm1z&HOr9D*>V5*jm)<}jJd1w*67ZZo|DJ%e$ABzu4mQ85{&`<&s37XUAU`aa(j*r zd$B0*CQj?e`SP|l)5W_ggX1AwH>)vC;Izhp2Ib6qCSo)99;n*Z#&Cj5q~m3v zB)eSoi{6BPvTX(lJX$kl?N`hdRgIj$w(X|Pgydquo=N6EGn+nV#q7r^7!A zygbf$ocPaRb%cerv1A47ld8474;Xj8|9nCAZ(WW;!uh`bhSo_wir!{>J;QERVWS+L^-i^49IT>I1NwTe|)Yhrh{zKY|%_52Ws?oB_(vtsXT-H5xf@?+)3+tDa z9ZW29`g1d*C-^$>@O!kLV6EF%Un{!uH1mRmOg95n`E<`6cW7L~aB5+u&YeZC`EIDB z3onf}2w0Hvvhj*YPm|%y`7c))a77;ebXdY-$E6*0vyX4<4l!BT9du!hIRlH}9NySYQS#^f{oA+gi~KhKt@EF>ol9L~Ev$PR zY_~VDht%iR%vu{0*}HxE?Zp?auUsv-#d`hL{kau!+HEU8+!L&P9mvdec!`9v`VQq| zdl*8eg*Z6R=H$$ouQJzaS4g!7vv~sl5doIJ{9i6L7qpsB6FTx_r*v|Z_x7ya;amN- zdoSI-Z27e&OT7n;)pvO(jX zU*hXBWS!-ydxeA1+2zaRzh9sIvb@{1c=G8}SB^eRa-28+`tOX-u9qIf94efl#3=c1 z*R1=#ft)+myMIne(SLbAd`FX^q)?QS{p7Fzc6kclVio>*=vMCOn1BZj?7bmOJ>0F! z1UMBO0+P9(l`Obj`av*3Xth|b_WREl+>Vg2h%*S zTEEY|ev2;Ks?EN4Wne%>?#Aom5Z>&As`rx1N=`}B&&M}!ReXg|r%kM`g58L{2?Oe9JQ}ODYqemK+ zxo>&F3BGb?G9Vk|K)O6TK%s1*>-2H{cxAN<2vV-X{XT&(TL^-zdi5SkJ$4c z(ajT`6IQwPiojWg$1m5{f5_if&;RJ3{NVz5iN&Ee7}iEMWS@9flV^JV;XmGQdGiG> z9t~Wxz~u9+ly|%3?%$5v|MKOkV%I>y@6)GRot~EQWxvar<39`QE*8#lm;WZ+w))5g zo9B(WVXq9E-2c8`&wHRIYCE&nq7PpsOan5TST{@Se-&Qu`ECB&bk1XoKFsG|9{%pc z^A%2AEol@dLYzo<+Zp5bABdi=3wQ||+&4!0xT!@^pwR_5A>x~IVtXeY-i`LI% zO@DshVZy2isg%YH$zGAWmX(DS4I`+?C*jCn1vgx4LG{qJT4Ws1}=lHB&EwNe=)x^IEPg+(Dw#c4^=fSf7h9H?fC7)$1rE(E3PIw#dLNv``pd7Ut- zUuN1Tm0Vc5CSAF#@vkX|#-^Xyxw5`~3+G6@Qb=;Vra0qktJdAJU!iSAF8OPwEn-d8 ziL7#FSTHH=#r>D-y+7RFJk?^KY*yGx|Cs^telyHwb$8DY;&JaycNL9UeQid?D^syI z!EcLV%@5Zx9{rQ?_jW_5xQ@EOE2j+tK3fv{Zhfog{SnUp;gq*`TgkdPL92F$6)o>R z9`g1yxAfev=N|s>3aQ9*XXy^>z8JNwk@wi9M%^YI<>R%*uU4$u!qKO;G(q&{ON}@K z(InAoO~JRnU)L|cbUDlX>4{fgubYbc{byJzVA-~5tySo>HNk2-w*HtFbiXYjLF48& z!`0Uoy+11T<#4E})KbN;8Qc5=P3B8DxUUXf?y@y?NAP;TJ=&qmCfsph`(tFU;=Zc- zWpCEHylsyI=S}8|>6*84QH}fO>{soFT$ZgY4SBe_sUeu(k8$=!7a^k=Uu(XeTJEd4 ziDCYM(j{{?mU^kPPjg^%oT>YMY3eH7f>T>UCAkf62(hbZ9Q;_mZD)+pqFaZyMx|IS z+{)A{Ys(_Z+Y|fyMJkuc>PF91w_PjB1tNqpjTv-<+=FI!%>BI1TS>`y=W?H>C951o zI3{X&2pda&zp$)DJNAbn!%_p@20;$ad+%?RUk#L6xI=VFN0p=SX%+@&$7aJ`ruA%^ zGZQ*<4;?kh%hT-!jNQyJ+#J%+^J}$F$6dJcDwy%q7S?4K zQXZ=pKYzK3OK0oNDZ5Mr90Hl@P2SJw72>d{u85n^c_~hO)wRi24fk(bu|;#gQE$fq zfy7;%9g01@AGdFta@_RiC8bEG?giz!+waT$D)i0l_AFSug1y;t(gnM8Db1-aM>s30 zJvuF>Ddd!hL}b~T+-cU?*0!Z_vfM3~Wi6jtPfMyQX!}Snc~Z07MQ~Yyrp-*p4)?a*S15VIVX%U0+>ecamShTSYE=<%VGwoTa^bG|TXO96 zOzs3-6Q)^A2AwVHESf!?_g^jxZOmhIJ)P2(!q{kGUAIe&FMZWj&j24o&t~EGUvEb( z*3et$Yt$gvxxu8#;k)Ifz?oLpzKC7cHBYwd!lz92rUtB|>Mux~*0&+^ZyR z8a+c-q*I%T)%cm;C-tXuqi0ku-=HYxVyLD<} z3q#=9Q!98Hl2?42*&DE7uk38W!kCn|b*5%En;9lv@|mF6$C1Az_w$9r)~gq^wq%q| zWN2jaUGU@fZJ)H$fnwK`c%nE29B16&ZLhe-^lORi`Jj%&YxF#SzDis4>DsmQbcW{O z^4@1`JoO(+JOdV}7&&vTVVsb*Kw*aZw)@+<#WmMTfL z`=Zp?+kNi@M>+ccGd*<1{w#W;X~1-LdA-FslO>D$4=F9Wl9XCjz+Qa2aG^)L>!dS1j9)ryIFoOOE zs?^hmJ?b94!HT%Ln1=A%R zhFj`$j?JAq^F)|^2iNHa{a_VFLBVCqP6s-R@9^9etYgG=&dm1jmXLXK)z_Wn4*GaH zZHx1n2|Pc3y=pvcwcT4py7ySpjoy86re=8sj8V>C*ez#F5;MD1{OKyM>&_@ooo~Vq z^5wtZcMxHaa8fm4WLhcF)6!tp|IcL2m6sb=1Xfw;1uRfVQ1Sa{`0M3_kWH_hLK-#r zJ&aV{j+~$TpFv7*b?O5FXTeK)T0Aw|@9*mfU!!^H(4rd)dz(c*%YJ+wwYG6;f;O8n z%WOBF0|NfrItwpP_6=feHuGUpHlF`_jg;u&X-=$1v>F7O_wRYJC^dYEs*#a_V#MUD zf|F8`y;y9dIX!2*6>|2JTg36#uUmsf3sYBzN6NjY*W=J`ry-=*?BDg!fw7BukmpZ!&KX~MeK z9xD~+RfXLYP-ybc$yge2_J>!BfbSuZok5IhMf|UqHTy0NlzP_iT}VQ3_QuQipG&D8 zT#+W_`d7(&B2#+ezI(rdyhV4WSc`HUU<}SUo^kHqFON&QVTzqA7?l<|TM8+3e0)Dw zOkk_1>lxn0sR`u@!jHGSm|V1a(m5%wYGz?zIB`G1UVYkWPj?+X&E+4SsW3~| z`=%De-j!^Oo8(o+XZZf}x!F_n5?WR>*d~~+@|i#9KSQnuXJWMT)MclZg|a^N&oG>C zyEVYU+2jDn6Q_SMKK&{ufEAdt0WO{IFuLXmOkK{Y^ z3ny>A$`YIZ&|yc^1aURL>Pe+54ckqw&GYy6J;ru+``fjd+JTu9WW*AcoX*T%ZawFC z$Au-&W)_@^;Au#D_cy>gIX7;CsN9VeQ|85NU2=~9S;xWqa@DUAcF%6yrFhnjF>E25 zWPjz6{$;BZjD6Z8S)w-R-IB>x4ytor>vZLgu8V@h3I*=|SNxX)gO`b|y0y~x;*1py zRt-HfWf$Mye(_Ly(pw*2Ho9vdcv$)gGLa{_sY9N%JJ09>(Y1YzvYLls57pBJI$7yeqxl-GhFH6IuQ;21%0T1Urw{)M+u0~7>foau*v8#PWE(B<}d zZdYubzOCc1)xl*)WLu_AN?ev~r|i)BDOR*AX|YuDK?C5MHKPBf|)Zux#;!Wv(ZQcE6=oet3*?8~aNxlB4I`*swiOqspzU}W#c{T`@R_~msqal z$~+~!b-}^Lo=*Au?n_qIZEaZHAvoVh{`Z`W20`aF^NxvMD(t`Qs`RN%lYvn~>f#F) zjmF-6yQb?Z2389Dt}C!QYxuTj@+a9pS*@`Fty|dy^P#sU?QVJY5Z9%rH)tI& zH*cFW&G5a&wVtTRrYU?Xo`Snwc>XioxUgi}#xT~F-Wg1XOI7B-T(oIcsOIXa?qLC! zTr`EOw!LkZyQS5#G5+w1EXfSdeGF|X-=(6by;z>DTxzgQYJnm9F>~eHE~N`Hb)+vv zcqS<;JFwqfEwJ9JH!gLJXPYUXkxP<7wxX%;Q67PUC;A4R0uFP^-`@^NENY#u_ez(A zL966~ieGS3{GfBE&IrCFA!*e7>I_@`my9bj6rx!AZ({-v3H7aopKzwY2wUz?R2% zY-avv*t_My4Mx5NrsnNI2aIk=D|veyywYIWDY7cYQ%hEj>wvLB$&>k)efi#O_Kl5L zIeF6kcOR6@F5mWAs+cX77L;V0!)ADU``ZOvSs_Zxb*-*3tk`hIx=C4ZSyf_4)0U^x z4wmSCRJ+`}KlZEXiXP6i70%OI4W>8$Zc_G<-8JuN!Ud-l-QVB&|LtYa^xYP^Dq@18 zkg?k3j=oDKS*yi%1Uuz4B}`K2h-7%IZpG%wTcEPhHLK}SvEl7wtGY!Vc&%CQ*}%~6 z`FZF0(+-QKTwM~`!4z_L#|eex!uJanx~lw<2w>3aR4ijj;go;uRaxNe!O(C(L$QE$ zlUqt!$(hEmW2uov%pqsD3poA$&+u_UaYj&xzMD&FwCwWS#h!s7fnU~|GBnOvb+C!y zene1skbYw3$W>E052;&ud8T$iq`87q!A1X5$4U9y5w5DN30w)K!EsY>Cirbyu|jXcL@p+c zm;I;J&)vJ+tLk*{=(@~KE|Km<32q-J-+#Wq+AQvgBBtSi`W{t(Pu|EezaMo};YwEOSJ?WCyuA^_*^cs8j z=LQ}Ka$4^#7N%$$Jwu`A&!1PJf>Fy2L;YBfx)dv=c-}I3+Oc9qsTO|>T&mAG{w)>bdNwJztSl;wDNpy0 z<*P|-KmW}#jTP}ocAIOr$b(BP-R}3>C1oN%3e8t8_w_#FB)C7x=lQw0%!cWjVml8# zyE*4c%@%{1n$R|@{>eL@V@igfzF(c0Y3sg6lZQFxh^yNPCH4lkraS92+jZ7(H5~93sAgnvn0I$e zU}pOvO@HdPO?quq(`)(RZ(Q%fgo1)Ak%tiV$*~xQ%_^ zOxb3p2jW{M2-c>QP2S%5{le;0?+Md%3%%FgE6%fD|9*jRuJwdVI_XzWOV9>(Iw?l*UCXVRrUy=?ywho%dBg|}VjiaL6q+T_8-)cA1o{QEB#Z46qP zWe}9)shQI#>n^-Kms``^RcT#p0yD#v8+UxlX8wA$BH)Iz?D{Q?YW0TKWhHt%OgR`j zz8>*p@=4zEBH`GCDzX0zBF0RvVJaJYPV~6-rfx0tjhHwsue)pB2Q$fQ6Ho1Fx-PWg z#$Jz!%;)oN%L*;M+F^6lHb6;QFw^evkqibdj#v9$wItR?s7V~V_xDV;LDZD4PnQuYt!zc>#Pk7(w?lwpYGqt2y&RRUqg$D z@7ocFbN?A^+0?Xj9TPV5gxl=lWO8$VdEY5)s#d4ATd%CCG zaN8(AfTjB6TsEdz25t(Ajx;bWd{aHyJ~l+)jH9Tom~=0TlAX^g|7FU4+%{#wk~bn7+H{x&7*4AE{8gQ`>Qt7}R{_@>g8vyF z)*tKs;dZL^mWc7GO*1!`Zk*it`OD?YDw6 zty-D9F4MiKVfsbFybK}AFMCy4cg>u2gl)y1&y3R*+!B(My))HTHr0CN8=mPrc#J`v z#gDCPdVyriJ%*QJ)8&dcN*-&uE^ckKQ%6KAxap$NPW6BPc4@3w=4`Y=@j$@0vzL|l zHz@n8S|V5YN@5r1$s_K)o7cRO`ds>n=^W3I2^;M8nKZ20Z#Zv>u}2_7u9*9oy1id` z*&h2HnsSB9!Hz+~tWoj+Q(e`mSP{)7OcH)m8}$C{c9i?ipvz|8I{R2?o`Z@>-wY*% zpFf}bEMW9iS+9F$@}wrS+s2=*7&yH$BAG-5x@JD@UHs**=?1;DvXCI3&90MdH{8Ef z;+YV>^yPvrp2~{~1@F~75)@_9Bz@kASUOq|Pm zZra|kf6^zoyw)CRwzb!<4GGp-AsI6DC0D{N_e5svdS7j(HJ4&%%y!H;Gnt!t!>#(- ztOlO0by5#hLm1dU&HVh_B}rqEQqru{0;d)84!`caba8by*ZNeW4O$KpmJ8{cU{7mDY_fH470`~=#&lP$a+qqS+Y-`H8Lc8?eFGO}V znq0di_B(Th&EA8`XO11dA5ykNYqH6?ywnL^M<(2Sza-s7H!z~x*~Vbkg|vwJUIT`O zOBl9Bi0xjctkQAvc787Z4lb{&jGDevZEqiD{Q-tt3$-j&TJG%KZRVc; z&P0N(fa!9b5Q8apE*UT0Li-Nts`mn}r`?Z)+D-5;{5cKP)C|FjQcW>@fREL3!S=F-GC$5Hvq zHN(hh(E{ND`IaxgeYRo=;d7kmyNE$4vRZ&Wk-645p+(I>?APAE25j#8_pL0jT;VC? zFfr?WJEK0X}D&6*&5z&)c{I?_`ZqBrnZ~+B}?jVPk66fb%4s=Uhw7)&oJ7Lx7 z8;(q3ZtnY5tS=I=op+PNx1qt|`+O^j)JRs2Eqp0L4M*0Q&*;3`=}?umy-jKEGS>^C z%1P{dUPh))S#@jvkpz(yk!&8v1Lxg)>|eb6qm`FNa#o^!&AGa$b0NjLETX}e!gAO= z^4Iqn!~aU|2~Sw|{Z`23>~AIqWDaoNT=GV(F5N#UvQba& zr)y%`%_#t({5{d-y$gySE=|yi=bmvXyDamd!>J*jHaS zQewP+^0IDa%?eh>2!l=a(`+7+~XCOv^NX96LnO2#`a=P^uFJm zQmo5XHwYex`L>Pwdk}j(IEQ z^t@fS`SE{-j5^tGwd!3aw-zR!UaTykvQd7)b>YYV8L}(%8?R(}9a}Eo(zlq)SheS5 zC=v?-mRe$5ID~tSRI6e1U z_glsv{~5&nJI-2VUzu|9nE&e9t(U}#)~ad=i99%aM1VQJajmDj$t0Ia&N<0DGUsl2 zwDijR+Fzb5&kHBA=Vq>6m9^UFRc`dMu3F8Wgbh=5!_6n%7QZ84r0{lGQFrhRqjf41 za@jXpKVqA*TF5ddqRm#Jb;i4Wx2`SJ(KFjPA=sSv;~d8;=}f2EW=rmrnELY1#|eyc zl3lyDacfV?oqbY=X9k0e+sr##ozC5!ROK_N$Z+msudNR@1U!9osMapY_N#d3$*{#D zrulozzB=R{srllv){!w}V#fAF*_JtTKQE7t+Iry2oEUKyxy#nSUzN;hSL}1@V7XHl zr+3xQGSjUj;k7xF&z&$AM|sD&>0DyYN4wY`nI7f(u2j6HmQf{UNt4VG4*?G8xrRmC zHl30YYT@zYJyvX`Z_~tPHoHqp@~}hXiTTEBw7l<46=j<6=ExbpCzDF&c208fczJiN zvTbnRBNJZtfa~)nq!ddf6>;;+-AcG|?$PYdgUj+5cdb>b+I#HB^$T{V{w{n_r}^Rg z5B;Mt?P-6k8yp;ODc_H`<-c?~Q|LOA59d42xqWlBt}M~qsu{KA>}duGg&8?>w@%%) zSF7{zvnw~2{S}t|&+zG&|FMd9{BQhuH2!Ee*;hPb+PUJ8OHPr0PWJPfcO7aM_)gHLD6R;!|~kj-!CfNU|OOziM=|7N4_@Uh|qtA83z^8idoXr zzF(ewC`h&4h{Ie`%kf6z{rtGX1oWz?tlg-qn#Lk%{riQ5#)>HBWn$5sl4m51 zOb$#*5HY%Jz;=M4+N}J-vJ+fWSS48++}JZL->>B2G8aCrn0Nl^+-2q0Y<03`?sRz< zbz_46z9|dES19D&%-p_X_xH;&rv%U3I+ZJ`5^b!~_OxwipX=|=EhTO1K@YwO6VS7&Y^%~(fr<8&o@3`f2HDvAF@rqefjd(ddGf--}a`j3vG(Hj?FcBl=0zuX^28o zY|1b9-l{m6(3OV*9^TXpkqNB2a`X&uu$J?>M2C0FE3UrWu`*KopLXrTm7i8=D!!VS zv4_DY=$4!5sb$~gszb{5zFQ^mpF!}Nh^d8z&-172n$FJ3Ii^_@{#9H*^li+NfWSvr zS6%;oDE|vgt`j*g zeB|=erBR_gSDgzvW}0p2{dRS#chK_KRZL!+Y`^C0R`u1`ef`#Z<&dOv=o?p+`ItYgBI=Wz?iEDI6Ad6hgnY-_|{Ysj1 zJ9EE|ks#j!+m4GrQYOE$tBcaeTXx1->Km(q=`luI>7zgI|9W+bS^1LC0=|Hq2R2OL z;9)#np`6QdX_2m0#>0RhuF%N$Pj@ut`1#%17@8+{EZH;kL8<75BZt$if4+aaV9~1J zrJ?yOx9kNP6ATp>Jl!K}mDA(tu%u`9DH)&V_MaDVPjd}p6;a?hbJx{zrpnx7_ZM6i zSg$xkfFpg^l8KVM!W)k@@6->JT*n|J_Q*rh^5?&cOUqjf`WDVG7IHe!tXFKf@WP=@ z6ANAEa6f49RNQ|1w$B@FA(50RYecm~)srW**uv9gd+%ATJ7~bh^0s$hRf_7&mVFF~ z6Slj3e7pVi(zKlioeoUp@`#UdWc7JF=S9<-wH{4}R;KI|Z0eezF!db!&r5gKv?^*% zdpT9O?g{@4xsq3(j%;SKjTOrK>3Ac9Nw2-~<`Q9*BLa)J=U;b-+iJ$MHr3(463wr9 zTnB!pzg`%WWo)$j@(%uRuL+zJ7*E*!3OKh+gu#37Lf(ac19rcE^7GP#HCejbHY$et z7-UYUa-1W(xpC2|&MOQvn5TIZB`|L^R+z8s>APsb4hNBT&r|qU=8dR` zn652n5_3%sSD&x9E9uBt5;cKCMRpnA5kqzLFPDQ?o>`)0$#qIWd-kchM-DdMIKHou zc_G)KS#doPck-UjP?%JoKdp16Z)#-gcDY$SJd(E2Z~Jfj<Nob$GK?-oX<>v~<0d6P3T3o*7J0QYh3rf+ zo7zxRU|(wABc-ewYMjH;k-qIo9^Pb%|Xu&I{1!1nOyfc&) zCh%`-%t^@QS(WstCtoY&Yt6P}4TZjzc~1nQK8L>D;?s6NU+$La6;})XjO?Dhi)JXC z>6~P{XW{~1cSH9wHVz?Yrt)XB0`=Ib4n zNnuuPWpcJ(SBb3DWu18TKy0D0z~QYs->(gv8+9nr$FQv_<;nYPx3~n)v!3><%H7B6 z*u)_$cWY{>%{CRjWkM%^Rp{XghHdd zeNu~=4Xs$Bcb0N+I43y^S8^%wJpRux*MQ}Ey52g@tOCBr7L7fQm$rJ`**$|rYr~`> zjz9w?^`|GCM5IS1GYPrm_f+67;--F7Ffyqn#7F@J;YDjXl zJ!yGGA(v~}ER7|c+Z-DIeC8ank+4ErNmi}{6ibgdCu)|zwR0MvpghJTxs)a zp}6xie&$N8{&F(OQJCuu?}G1^XTDwL>bmJGG5-{|^u5;(X|L|*eq6qxG3!Lm29<-+ zOYY7u-u~nA;)AZsoHl- z2kwZmmED%zawa6$R_pyw*X!aPO~t>nO_ZW#RZgukOE~g4{Mt!gIWG;Ct+4b#A-dPj3dlYfrs+(_Mx=v?lXI9tApW=Eh0^t_Y z@1MJE)SKQEv6-*oz#Zkp-{)2wb&bmDI(3BO)4C#;bQZVe5yo1JXCyEx%;e+gR*<{= zpP@QvG25cQxo0%lq%M8ne0k0!_SEJ@#hzcu)K;mj_pMN-FrV|Gc0R#;L-l(CV0bW^d!an7Ub# zl7f1xA{U-rBle@wUUBIPIjI$|7?=X>Z8s%I9;;v1CFDGH@*Eb0dmMLD9w+X}UF`XD zwkI$9^;Zf98!eiQ7fo#rT^csm( z-|pL#&^^_gDP)4mLc@#3%a-w)D*a0AbDeqSq~M?1&%a$-%<9?3(9{%lo1ue^$7jY| zkt_?XsWT2NZ>+BJ;Su1RIsfI-LXVOw)go8kT@aXT;Pb4e`sK7OGOwBOwyGLZVsxS96ZT9LC=-pNMOH&*NXE*YQfA zz;>(N_I*4va)KK?SsYouohu0|h+NN>&+tX4^-;|mH@jIj84w4Pu|9Rp2iCG$67d+ zq|P|il*ZZrpMfhqckA&|-9XvQmF8@!_9jV>((~u7ITLx*;P}o0mg7w+Z}-`5IbixE zhRMThTJs)1Gx_JvDGfYxH2FIC3law4^i;k4^BTAthP&%CH}V$Gy;2|W`SI}bEB%U|}<3tDsL=vgIZMz&Wi zF)7`-?DDojT@(G5?lcNWy16~ku2A^x(yf&V;s#oQ5TR-*<^*4Y6RD7QULA(8nXUDB{kB^jn6#nTJm(#Fd*1zHe^*cI9wL zpl@$j<(3UB3b{+$%Faw&bXxdaQ0US*4$%)nSU3{c^WR$OoIRt@nZqm*7`)He;?8T$ zoubaxr|vi%n8a~n^0uaprdrb8i!CgS&#-W6t1~#xpLnrz(d;h`TRVgEJa=%sw_WaW zZFAhU%~q>ASL7CW9_qY*vgh~9)}XVTrm3op3dPE7cOLX#c9|KbAS9Ewftlw3Te)0G zpwSWG2<8%oWj8xtO2xI+B?cYn7Hv*9NSOIe^7Gfr7fK7H9_CCgYG&~~_PgIIZfjV= zPZcJaz6tgk&HH~|RN-|l*{GspHTeolgRVjO{CQJnEERQIu_Dl^>8dT83zM49BfF}C zrhJA|UTtb@$r1Ns0$!gLY352erNN!sa**Mt{c}eV zu7^`@Xf_-XE|lFo=iFhJO>C1(FFEcuyyO3$LH1a;mT|`(@J>Ysb9dOkz-ty7c=?hjr)YHI7SNZl%0g=;3fvP27Ng{ZBd8H8Tdgg)A-B$``xx30I z{?0nsbY+iZ+MiQ-b0#^+x#TZ+7&&402G&StAGf>h&;B!PT)?2EwJ~9#gV33Xbu24| zCprH0+fePegk#y4BRVq}9;sXYXV_OdW$KEEm@OwyCb8?xXndFc>t*J_f@76ki&XBO zwwT~wRKN2=>as>ng;2{0ht=jDR@rDg+4B44txl`XD_E^m5Z|#<;sm?#-!C1^n%Ofe zb1tp9E-GknH=zDW*0RNtsTqrm^vrJWnQVXAVLHQJw?irdUyb&yTl>sp%iLHU*M#+rep-fx)54MzW-8Y$wx90MA(%NU$ai4`)02%` zdd?j9nPGJJ)`hS~wkdafBpGrAxBoo7G^%5Pg|<~+TkTC`p`qoaeN z+1lmj1^b}urXfOcH^e6v9GIalz~AdP`)*La`wpXq-8-cn-!i4&4|U$PxydI{WbT14 zlW(Pey)tLBhSAcZ3v0#Sal|~9K3}{bRV!;}@tK#~9uz$|@4@i?{lcJ?!PTLWI?koH z)(R=`TdB-j$}l;{;U!;@L$HO#WnGtN>iR2$!X9v{2o&%)kRsPK1*s(r zE(aB4n&(=WN3HRS-fp;UqOF6>ciAmx!aR96bkz#;cGjA@$tsAN($%)uvQ5iFrFYvc<=1O` zpUpO8m1tyKr>juqU?ErPT&v9bbk5h9quvgEGmbSf-|_W)nL1}n+sp$(E=?u8QCY2m z4T1?t zq{&TQHx*7sp7F5${hD1OeWh=R0e|%wVWztu(%3f3IT;K2y1Xs>ec+y&?U&qTYdV83 zE4n-kPg0ruYTobX9x9oxYFzJ@9n6Sq*vMvn^2GUVQ(1NhX8JHm%nsc%sVJ>J*DzsS z6Gx#W)6+=9N#%xrzi66nYgEbc-k{>*(s}2_4BfQXI$SFkT^CgClIc{CdAxn!W`$>) zi^E=}-0BT@lyb-AZKIs2Tk)xV&$wcu*5z&x-1+Uw;awIAR}2=bfx?Prb4Q`e)-D-Qo4R?zo~cDW;+!OL^7iq|!8%TSiOPyS z7D7DUJipSnb*#C(f@$NjV~h$DRs5uEl05@kAD%W{qU+2P_OYkacJb?lXNtsTH618r z7>iq_a5DKoD?&MZ|OU>F4nVdWn5e`C5dy^H~HrpTiF_|a}8C{ zIvW4T;|Ake-@_MQzhd3w?egFZ=YdO8Q&tD8ePXc9k?GA0W(%eAo?{J@0KM{NR5EDIHC*9Z{Fo%&=Rq{36TyeYIO8gJ*3Oow_b5HT;Uz29SBSX<;y zQ}xVyBEUZXzO%At!9rP2whR8@o<_knZnqfMm>Y{km3`UWD^ENoWZyy7Fc5Z577THx8aLbC$5sl%OR-5@%<;|9t%QLatS( zB;QAG41J_G+4}8+>P+v=Y$`@i{X-abpR}B0_}BJJ)wIdnksi7`cNr!2B{Uh!{bIVa zWebDzc?0JIA0p;U-uB5gnKE1U&>fN4>y&q#>vhsv=(^*y#54)vSNC*}-HO__)pW@x z)`NQ;Vkb^y&)v941C3S#Dv7$lsK&`?-eiC%}m|(tmdDj$_Cp5>dd)J#bFBzrd`=1DrPcWq0G2>*~%Yn z*V8N689Vj}RE1mjE)QlDSK1BkA{DCmvXH^t1~!n6d<8w;DRMmvjTKadb8e*ft*Q(&Xc0v)Zdw-$69WOzSUG+U5q zwrCaaF&&9k%ad=dvf^ehIVjO+_J$*=`sBY|ERLtQh6!kFdOqo-g5ad8zFA>Yjg~Zs zCq22MEunJK_&96Kw$BP*J{@E^DLm)#w#Pnf zDa-w4Uu9c0CCUG>p@c3=LqhMz#TiZx39E&3ZVTDE+xgwP6u#;)YrbmRWh0-td-rbf zJ#Zsh@^GoBa#C%F{Jw^OZIh)J2=cfd?K;NoY3(3!*>Urd)i#qB-YT}Re!H#p;S}~2 zDGbM=%)kAMJ=SWy>_^%O6~;VANy#sb7T+#t37qM<%G{Q4D&%I(k8|!DuZ7zz=W1W` zRcppB1|gmYb+cuSG)x6s9k(26^1RW+X(4qiD~jvE#De`QZm;ERG6YxlMK0leI%R>@ zlg&pauobw^O)oldWy&0ZIR~#8as4&^Rh@aK>CCCVyJ`_8Y|6*d{bXl)@;ni8*wA79 z#`C^IUuf0or56I{bj(l}evmIFcg<5lkDES zye`%I@+{`fC2TWfAE{q$Ue3nt>uaKy#VM3}|AL{y^V-x6A`Db_CFNK(pLsPpNXIv8C^=&=m$Nuxmty$YG1Jk~C zI$yb{;_P$o{Qr5D^SX?!`kfhYg5i-~sXtf#EI7F7$eJYwrMGR;qKS{3+R zX`%T0%gy`P-!BZ9#38}8DL0#0z(XO;J?Ew5p>{rRPEGF1g~E(cwTt~$`)!K}&b)OY zig6;txzCnT?5=KRG0c`)vSPMZ{4UvVTei@*ooPWQ+rk2MR)@LY&&}8n?pC$LV8Y#R zZyA0qjt~uUiV55m*~#FaxbOLy4CcMo2SvSFRC7d=lsH-Z{QqPtaOYZxT${Op;rJ4X zPGkE&FIVnd=CHR#_P~S%N7_`5oO$JSCTGJIM%ffYXC*!1SG_|1Sv%t$wl*J@p2^4} ztnmHZ)I}3tmUv9#3_PHbGJ8YykIU0Ern6}+7I@pj;vX>6@^-FfnG1hrL}al-w2*42 zrIhAM%N45w9a0+-#hlLY$P2Dnv+9i1x`PD~llz~_Ys}@EvSzU;yH8|cn@W;G#m^T; zt>!`xMNVcbU2r?y)BmYNh109Xc-HC*OWsh{a;r;B;)W&P{~dS{ z!m!kJxzC*`CuNp48RT;LaW=nyziR8kjyNa=U{WE#@ zXpZFsA4!FG$~p}9l)qhl(BF~QC)XSPEK-?k@?^BZ`Y&0O@7w2?ss-%#~8gcg$@$ zx8>H_(qLoPeX{)h9|JAceW{at6|zG1eL}>BpcKz@Prm)#q90zCoWmq>&(p|JxQQjp zUt!k5ZZr3&bC-KJC_Ij7x^rBNYuZUcvHo>t{~4^VUA5h%m8qaM>#I{w!*-#V4uuZ8 zxd|eSv+FgVcHC2FsxG_WUhpdD!6t4E=Y5yeKRtF({aiV{fwfz;woOU-*Q}RL_x@EA32Mmakwa;4hy0H zlEZ>z8(2=WzHBJ$ueUNtXuiZ(#dt<|qwTkgNo&r^h8ka4t!6Gz!lk^zP08S>^rtgt zs=xK;y7m?8S`Z{ zgfl(yOAPE}I3oAS?U!FdXJ5?zwm-@}KRQ=_FDVlV;|x8gT>N~)b>WUhSAHz?pU$;` zqk0Jw<16<4y|vzd?PP52+d{(Ry9-uCeoE*#-_g7G>pny02lbf(9}-^%J@(mZUVHEI zJ)^pv*SB9@{_=ACw$F3-^Sb<$TDd=T*UDS+I%Zpzohjm;cmJL6g0mc_E5aN+b~#M^ zbN}u2{EzcD#|!;%mVWU$(^@oq8S5Gaxy5hStymjXDzf$2(z`~SwnysU_Ew&?+uZqd z%l5L_6KAEX&QubSKV#(g;K=jK%LF2w*US&xGs!PG@n`wplIZF3UFSr0a;?#uq-J29 z?8WQkG~qxBlk4v1%EvaQ-@2nN9{uo-!&=W1t63etwDvCEyHUz(YjnqoY*W8od;MPT zR5P1*FF9B-@Y;&0c@s-bX7n96b}L5f_8mj-gzY^%Ri%ZuIhHB;ZDX74!@*E8&60il z>y^{Fea||Yywf`Lh()%^Z6n|6Ys=;uIIt$T{AbW$KDU```$m^nfx8$lxi^)6zuG%p zY3&a;MMs5hjuSUp=lwb~b8_;E31PtoE^psIcU${9V1f$Y#JmVUm+Jov$F{yXws6He zrtS{*jdL5`FPw3r;j~i9WPzJ3lRNs)E>d(l%^&{kNDj~M*ZN-3z8(?{tP2>@_j&fR zZn)0T()phuGlMc#mas}Vvz0M} zWkO=7kpX9dq1A~fejSU5R3TmYn7UbYVs@X7e4V%c6no?rj(>??ukPSu+kWK7<3j~0 zZ7SVw4Q9_Qv({Vx;eN}NA8YIU*v*6D&!^ZXLAMQ65+~;|CHS?0*)|J-o z;%=2o(<+x4G?!Za-ZIN`x82oTUbFotFK5m7uD&w;@ILONHEJ`8wq$&CJJX(Eyo#^Y;S2(zWOioy^ma$w?O_}q4?cH6Pi{?iqryCYM4cD5rdd`{7 zhp*--TwhyjvueSj+-VbacFv1@$DVmLG^0IjThIa?UL{X8@gGjM?E6ZV`dVd&&F2aI z5y-G=R;!Q3MuU2u=K0fhE}I+G5wzBfF-}2!*@I=82Tq-6wmSQ4I=}0WI3|^b6#;}{K_;s^fy4%{Ra=XG;GRS}Uy z`c#pQBM(l#GwxRpsVaG85YD)AdrU}BbzY&k-=vKvHY=1mdGNJ5X6DPSubi*sl=T_k0;pc_`fi*Vo49=a}iYfdyu8)nC@-AM+^Q~djuRzR`BWQ*OtHV z!dBtR+o%-n5&@AE$%DPq?QOM;KBsbT3Aqz&tnyZ+%Ax0XMthQoBEzR6Pu*wS{=0dO z+hK2wtt(G3OyXg_;?a=%$#^bbh{6lN-kZH*y8TrZ)CdYVC2fn1qV~tx*54$JNG+d_3X|f zN6#>>B{P%-<$ak*)K7iJil-AS?z|MRXm~-#pWG8SHdSeZPSWPM@()rJX5aOl4UY=YRqNV8=^vG z0!9AM{xkHvxa_c$sX?;w6-OFh%8Z7~&t2Ge&RV)cG2)J++-K&Rx?d`%L)Q9Da9g$1 zS-SPX0Tws^Id5t*48=Bgb*=K+)HP$n182wcTV4dK?CPpHShd;v@)pw#toQf|?5a#+ z48oUJhQ%dK^yy@oJX5YDu4TQ$a-9~jP%a~m`GLkApOn8{){r?~$mJ2)sXM9M_~rcf z3q%k5UX_??uDxVhPnw~eiP+o?J(txkaGc{bY}{a-*?U_s?U%rnl`FF{H8ve!R%y0XDEqhT*sE=;C!cX+T-(z;L;mfhRg09l zGIOmwjXjg@Fmfq*^uJt?)pRLOg(>M$f~3Uuf8VVR%#L7SJyy??zT>6J`%WvJJzJ7D zEqm?DsqlPH%IlCM$8e@+vcDb(+)h?6sB?CRoA0Q^EEzG$hat)KKf{}sSu6>mPp=i} zHK@FmtA8FDqr6dZt-$T5y$2KD-?MRRUbMj3YxV@j27w;tJriGjTqGNCL*me;4SEh{ z5BiQgI9}@$8j>Db9i_{2Wb00rST!}Xxn^-ILZk8|53+PBC9n9AP_in1VchQpdv-K1 zC`i8HE3kg<+G(U6bJtc$>AUe9NqLRlv?YNY1KaViosOnglG%Yg8@4I{RU%qCR7p$Rug~IpzQrt;AK^!8wsyadyj;l;u{S94pawT*;>=@* zlwU8nax?38q!Ux(ob}QN>6p|!Kb3@e zA9wzI5!|xE-7R%h&*rep1sQ@hnk zgJ(^~B7=$A(vCu$|1vHnow?}7{f1Gci9<3ce^0uv$1Oqc-NvldbBq5oJajmm85erR z_GwPib=5_V5xUG3H~bFgGE^*R+Uh29FyZZ)42A@On%`O79(QMN;NW4&z47zT?@UeU zt{Wr(9#sc&S!Ykl?$6T`Ez%BQ3hegyD3CV#|~7@_Sx#ofetG zmdvxXeB1rf{|tFH-=q#{ZMoaXd)X+3XXVEQB8tt0iL6m~W>}v8^d!@fVZ-WqyQ?OA zXJ}xMu0L0Pk!cp2!-p1@)4|5liOSpSFZ(^Z#j&(`ngOS())>I_X@4*>u!2> zo2hw6fXk7I#*4k4Rdp><5iWE{bC3v@6lC~Y!eW?QxNWh|KgrIRp6a)ce`ikr$j!4k z$wTF>q3pWj+a?~6D4iORqBZS~%nIh`&%a-qvg>NXmqVBN84Z@4xy^ia&Yv$4k%!v1 zcJN$cC~HVLrl!UREOSsQ+;Q^Y-`ZoFF7NGT z=jmAx=Q54WsBm8iOIum%%amwm{qTZ>^R+sx0UNavT8kXH`@=rDl}l+YJ*w4uW72jO zCD8>v6Ijmww748Ba!-J-UBz8zg`M8~+fNq>YME;-Hhji*B3%H1}WT9Y#&Tt4|T6k;ZMGCbVacX4~JYjQ}G zB|^3Ywj>n^k7tHqDsH zLuFM%k;|NK|86bN)@*5Fm?Tj?U#M2eZLY}fh0$Io(zXbBHmFE8*!(SRozhu!&i7E2 z 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

-8!wXiZ5YC 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 z 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

d;F5&6! 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 z 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 literal 0 HcmV?d00001 diff --git a/CLAUDE.md b/CLAUDE.md index 5eec975..fae0758 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -83,7 +83,7 @@ SANDBOX_AGENT_SKIP_INSPECTOR=1 pnpm --filter @sandbox-agent/opencode-compat-test ## Naming -- The product name is "GigaCode" (capital G, capital C). The CLI binary/package is `gigacode` (lowercase). +- The product name is "Gigacode" (capital G, lowercase c). The CLI binary/package is `gigacode` (lowercase). ## Git Commits diff --git a/Cargo.toml b/Cargo.toml index 74906c3..b6812cc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "2" -members = ["server/packages/*"] +members = ["server/packages/*", "gigacode"] [workspace.package] version = "0.1.6" diff --git a/README.md b/README.md index dbaf6d6..aac18f7 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,10 @@ DocumentationAPI ReferenceDiscord

+

+ Experimental: Gigacode — use OpenCode's TUI with any coding agent. +

+ ## Why Sandbox Agent? Running coding agents remotely is hard. Existing SDKs assume local execution, SSH breaks TTY handling and streaming, and every agent has a different API. Building from scratch means reimplementing everything for each coding agent. diff --git a/docs/gigacode.mdx b/docs/gigacode.mdx index 8cbf7b3..ccc9e39 100644 --- a/docs/gigacode.mdx +++ b/docs/gigacode.mdx @@ -1,6 +1,6 @@ --- -title: GigaCode -url: "https://github.com/rivet-dev/sandbox-agent/tree/main/server/packages/gigacode" +title: Gigacode +url: "https://github.com/rivet-dev/sandbox-agent/tree/main/gigacode" --- diff --git a/docs/opencode-compatibility.mdx b/docs/opencode-compatibility.mdx index be7da6f..004f048 100644 --- a/docs/opencode-compatibility.mdx +++ b/docs/opencode-compatibility.mdx @@ -112,6 +112,7 @@ for await (const event of events.stream) { - **Authentication**: If sandbox-agent is started with `--token`, include `Authorization: Bearer ` header or use `--password` flag with CLI - **CORS**: When using the web UI from a different origin, configure `--cors-allow-origin` - **Provider Selection**: Use the provider/model selector in the UI to choose which backing agent to use (claude, codex, opencode, amp) +- **Models & Variants**: Providers are grouped by backing agent (e.g. Claude Code, Codex, Amp). OpenCode models are grouped by `OpenCode ()` to preserve their native provider grouping. Each model keeps its real model ID, and variants are exposed when available (Codex/OpenCode/Amp). ## Endpoint Coverage @@ -132,7 +133,7 @@ See the full endpoint compatibility table below. Most endpoints are functional f | `POST /permission/{id}/reply` | ✓ | Respond to permission requests | | `GET /question` | ✓ | List pending questions | | `POST /question/{id}/reply` | ✓ | Answer agent questions | -| `GET /provider` | − | Returns provider metadata | +| `GET /provider` | ✓ | Returns provider metadata | | `GET /agent` | − | Returns agent list | | `GET /config` | − | Returns config | | *other endpoints* | − | Return empty/stub responses | diff --git a/server/packages/gigacode/Cargo.toml b/gigacode/Cargo.toml similarity index 100% rename from server/packages/gigacode/Cargo.toml rename to gigacode/Cargo.toml diff --git a/server/packages/gigacode/README.md b/gigacode/README.md similarity index 51% rename from server/packages/gigacode/README.md rename to gigacode/README.md index 25da901..ab3bc85 100644 --- a/server/packages/gigacode/README.md +++ b/gigacode/README.md @@ -1,17 +1,22 @@ -# GigaCode +

+ Gigacode. Use OpenCode's UI with any coding agent. +

-Use [OpenCode](https://opencode.ai)'s UI with any coding agent. +

Supports Claude Code, Codex, and Amp.

-Supports Claude Code, Codex, and Amp. +

+ This is not a fork (and never will be).
It's powered by Sandbox Agent SDK's wizardry.
Experimental & just for fun.
+

-This is __not__ a fork. It's powered by [Sandbox Agent SDK](https://sandboxagent.dev)'s wizardry. +

+ IssuesDiscordSupported OpenCode Features +

-> **Experimental**: This project is under active development. Please report bugs on [GitHub Issues](https://github.com/rivet-dev/sandbox-agent/issues) or join our [Discord](https://rivet.dev/discord). ## How It Works ``` -┌─ GigaCode ────────────────────────────────────────────────────────┐ +┌─ Gigacode ────────────────────────────────────────────────────────┐ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │ │ OpenCode TUI │───▶│ Sandbox Agent │───▶│ Claude Code / │ │ │ │ │ │ │ │ Codex / Amp │ │ @@ -20,9 +25,21 @@ This is __not__ a fork. It's powered by [Sandbox Agent SDK](https://sandboxagent ``` - [Sandbox Agent SDK](https://sandboxagent.dev) provides a universal HTTP API for controlling Claude Code, Codex, and Amp -- Sandbox Agent SDK exposes an [OpenCode-compatible endpoint](https://sandboxagent.dev/opencode-compatibility) so OpenCode can talk to any agent +- Sandbox Agent SDK exposes an [OpenCode-compatible endpoint](https://sandboxagent.dev/docs/opencode-compatibility) so OpenCode can talk to any agent - OpenCode connects to Sandbox Agent SDK via [`attach`](https://opencode.ai/docs/cli/#attach) +## OpenCode Models vs Gigacode Agents + +- **OpenCode** supports **switching between inference providers** (Anthropic, OpenAI, etc.). This is OpenCode talking directly to the models with its own tools, system prompts, and agentic loop. +- **Gigacode** automates other coding agent harnesses, so it's using the **exact same logic that you would if you ran Claude Code**, Codex, or Amp natively. + +``` +OpenCode (native): Model → OpenCode's tool loop → result +Gigacode: Model → Claude Code / Codex / Amp CLI → result +``` + +This means you get each agent's specialized capabilities (such as Claude Code's `Read`/`Write`/`Bash` tools, Codex's sandboxed execution, and Amp's permission rules) rather than a single tool loop with different models behind it. + ## Install **macOS / Linux / WSL (Recommended)** @@ -73,8 +90,8 @@ gigacode **Web UI** -Use the [OpenCode Web UI](https://sandboxagent.dev/opencode-compatibility) to control any coding agent from the browser. +Use the [OpenCode Web UI](https://sandboxagent.dev/docs/opencode-compatibility) to control any coding agent from the browser. **OpenCode SDK** -Use the [`@opencode-ai/sdk`](https://sandboxagent.dev/opencode-compatibility) to programmatically control any coding agent. +Use the [`@opencode-ai/sdk`](https://sandboxagent.dev/docs/opencode-compatibility) to programmatically control any coding agent. diff --git a/server/packages/gigacode/src/main.rs b/gigacode/src/main.rs similarity index 100% rename from server/packages/gigacode/src/main.rs rename to gigacode/src/main.rs diff --git a/justfile b/justfile index 107139b..714768c 100644 --- a/justfile +++ b/justfile @@ -66,15 +66,15 @@ install: pnpm install pnpm build --filter @sandbox-agent/inspector... cargo install --path server/packages/sandbox-agent --debug - cargo install --path server/packages/gigacode --debug + cargo install --path gigacode --debug install-fast: SANDBOX_AGENT_SKIP_INSPECTOR=1 cargo install --path server/packages/sandbox-agent --debug - SANDBOX_AGENT_SKIP_INSPECTOR=1 cargo install --path server/packages/gigacode --debug + SANDBOX_AGENT_SKIP_INSPECTOR=1 cargo install --path gigacode --debug install-release: pnpm install pnpm build --filter @sandbox-agent/inspector... cargo install --path server/packages/sandbox-agent - cargo install --path server/packages/gigacode + cargo install --path gigacode diff --git a/server/packages/sandbox-agent/src/cli.rs b/server/packages/sandbox-agent/src/cli.rs index 724468c..fe69cd2 100644 --- a/server/packages/sandbox-agent/src/cli.rs +++ b/server/packages/sandbox-agent/src/cli.rs @@ -580,7 +580,7 @@ fn run_api(command: &ApiCommand, cli: &CliConfig) -> Result<(), CliError> { } fn run_opencode(cli: &CliConfig, args: &OpencodeArgs) -> Result<(), CliError> { - let name = if cli.gigacode { "GigaCode" } else { "OpenCode command" }; + let name = if cli.gigacode { "Gigacode" } else { "OpenCode command" }; write_stderr_line(&format!("EXPERIMENTAL: Please report bugs to:\n- GitHub: https://github.com/rivet-dev/sandbox-agent/issues\n- Discord: https://rivet.dev/discord\n\n{name} is powered by:- OpenCode (TUI): https://opencode.ai/\n- Sandbox Agent SDK (multi-agent compatibility): https://sandboxagent.dev/\n\n"))?; let token = cli.token.clone(); diff --git a/server/packages/sandbox-agent/src/opencode_compat.rs b/server/packages/sandbox-agent/src/opencode_compat.rs index d91d26c..ac72d0c 100644 --- a/server/packages/sandbox-agent/src/opencode_compat.rs +++ b/server/packages/sandbox-agent/src/opencode_compat.rs @@ -4,7 +4,7 @@ //! stubbed responses with deterministic helpers for snapshot testing. A minimal //! in-memory state tracks sessions/messages/ptys to keep behavior coherent. -use std::collections::HashMap; +use std::collections::{BTreeMap, HashMap, HashSet}; use std::convert::Infallible; use std::str::FromStr; use std::sync::atomic::{AtomicU64, Ordering}; @@ -37,9 +37,8 @@ static MESSAGE_COUNTER: AtomicU64 = AtomicU64::new(1); static PART_COUNTER: AtomicU64 = AtomicU64::new(1); static PTY_COUNTER: AtomicU64 = AtomicU64::new(1); static PROJECT_COUNTER: AtomicU64 = AtomicU64::new(1); -const OPENCODE_PROVIDER_ID: &str = "sandbox-agent"; -const OPENCODE_PROVIDER_NAME: &str = "Sandbox Agent"; const OPENCODE_DEFAULT_MODEL_ID: &str = "mock"; +const OPENCODE_DEFAULT_PROVIDER_ID: &str = "mock"; const OPENCODE_DEFAULT_AGENT_MODE: &str = "build"; #[derive(Clone, Debug)] @@ -220,14 +219,19 @@ struct OpenCodeSessionRuntime { #[derive(Clone, Debug)] struct OpenCodeModelEntry { - agent: AgentId, model: AgentModelInfo, + group_id: String, + group_name: String, } #[derive(Clone, Debug)] struct OpenCodeModelCache { entries: Vec, model_lookup: HashMap, + group_defaults: HashMap, + group_agents: HashMap, + group_names: HashMap, + default_group: String, default_model: String, } @@ -390,13 +394,17 @@ async fn ensure_backing_session( state: &Arc, session_id: &str, agent: &str, + model: Option, + variant: Option, ) -> Result<(), SandboxError> { + let model = model.filter(|value| !value.trim().is_empty()); + let variant = variant.filter(|value| !value.trim().is_empty()); let request = CreateSessionRequest { agent: agent.to_string(), agent_mode: None, permission_mode: None, - model: None, - variant: None, + model: model.clone(), + variant: variant.clone(), agent_version: None, }; match state @@ -406,7 +414,17 @@ async fn ensure_backing_session( .await { Ok(_) => Ok(()), - Err(SandboxError::SessionAlreadyExists { .. }) => Ok(()), + Err(SandboxError::SessionAlreadyExists { .. }) => { + state + .inner + .session_manager() + .set_session_overrides(session_id, model, variant) + .await + .or_else(|err| match err { + SandboxError::SessionNotFound { .. } => Ok(()), + other => Err(other), + }) + } Err(err) => Err(err), } } @@ -623,6 +641,10 @@ async fn opencode_model_cache(state: &OpenCodeAppState) -> OpenCodeModelCache { async fn build_opencode_model_cache(state: &OpenCodeAppState) -> OpenCodeModelCache { let mut entries = Vec::new(); let mut model_lookup = HashMap::new(); + let mut ambiguous_models = HashSet::new(); + let mut group_defaults: HashMap = HashMap::new(); + let mut group_agents: HashMap = HashMap::new(); + let mut group_names: HashMap = HashMap::new(); let mut default_model: Option = None; for agent in available_agent_ids() { @@ -631,32 +653,97 @@ async fn build_opencode_model_cache(state: &OpenCodeAppState) -> OpenCodeModelCa Err(_) => continue, }; - if default_model.is_none() { - default_model = response - .default_model - .clone() - .or_else(|| response.models.first().map(|model| model.id.clone())); - } - + let first_model_id = response.models.first().map(|model| model.id.clone()); for model in response.models { let model_id = model.id.clone(); - if model_lookup.contains_key(&model_id) { - continue; + let (group_id, group_name) = group_for_agent_model(agent, &model_id); + + if response.default_model.as_deref() == Some(model_id.as_str()) { + group_defaults.insert(group_id.clone(), model_id.clone()); } - model_lookup.insert(model_id.clone(), agent); - entries.push(OpenCodeModelEntry { agent, model }); + + group_agents.entry(group_id.clone()).or_insert(agent); + group_names + .entry(group_id.clone()) + .or_insert_with(|| group_name.clone()); + + if !ambiguous_models.contains(&model_id) { + match model_lookup.get(&model_id) { + None => { + model_lookup.insert(model_id.clone(), agent); + } + Some(existing) if *existing != agent => { + model_lookup.remove(&model_id); + ambiguous_models.insert(model_id.clone()); + } + _ => {} + } + } + + entries.push(OpenCodeModelEntry { + model, + group_id, + group_name, + }); + } + + if default_model.is_none() { + default_model = response.default_model.clone().or(first_model_id); } } - let default_model = if model_lookup.contains_key(OPENCODE_DEFAULT_MODEL_ID) { - OPENCODE_DEFAULT_MODEL_ID.to_string() - } else { - default_model.unwrap_or_else(|| OPENCODE_DEFAULT_MODEL_ID.to_string()) - }; + let mut groups: BTreeMap> = BTreeMap::new(); + for entry in &entries { + groups + .entry(entry.group_id.clone()) + .or_default() + .push(entry); + } + for entries in groups.values_mut() { + entries.sort_by(|a, b| a.model.id.cmp(&b.model.id)); + } + + if entries + .iter() + .any(|entry| entry.model.id == OPENCODE_DEFAULT_MODEL_ID) + { + default_model = Some(OPENCODE_DEFAULT_MODEL_ID.to_string()); + } + + let default_model = default_model.unwrap_or_else(|| { + entries + .first() + .map(|entry| entry.model.id.clone()) + .unwrap_or_else(|| OPENCODE_DEFAULT_MODEL_ID.to_string()) + }); + + let mut default_group = entries + .iter() + .find(|entry| entry.model.id == default_model) + .map(|entry| entry.group_id.clone()) + .unwrap_or_else(|| OPENCODE_DEFAULT_PROVIDER_ID.to_string()); + + if !groups.contains_key(&default_group) { + if let Some((group_id, _)) = groups.iter().next() { + default_group = group_id.clone(); + } + } + + for (group_id, entries) in &groups { + if !group_defaults.contains_key(group_id) { + if let Some(entry) = entries.first() { + group_defaults.insert(group_id.clone(), entry.model.id.clone()); + } + } + } OpenCodeModelCache { entries, model_lookup, + group_defaults, + group_agents, + group_names, + default_group, default_model, } } @@ -666,8 +753,8 @@ fn resolve_agent_from_model( provider_id: &str, model_id: &str, ) -> Option { - if provider_id != OPENCODE_PROVIDER_ID { - return None; + if let Some(agent) = cache.group_agents.get(provider_id) { + return Some(*agent); } if let Some(agent) = cache.model_lookup.get(model_id) { return Some(*agent); @@ -675,6 +762,9 @@ fn resolve_agent_from_model( if let Some(agent) = AgentId::parse(model_id) { return Some(agent); } + if opencode_group_provider(provider_id).is_some() { + return Some(AgentId::Opencode); + } if model_id.contains('/') { return Some(AgentId::Opencode); } @@ -706,15 +796,31 @@ async fn resolve_session_agent( let default_model_id = cache.default_model.clone(); let mut provider_id = requested_provider .filter(|value| !value.is_empty()) - .unwrap_or(OPENCODE_PROVIDER_ID) - .to_string(); - let mut model_id = requested_model + .filter(|value| *value != "sandbox-agent") + .map(|value| value.to_string()); + let model_id = requested_model .filter(|value| !value.is_empty()) - .unwrap_or(default_model_id.as_str()) - .to_string(); + .map(|value| value.to_string()); + if provider_id.is_none() { + if let Some(model_value) = model_id.as_deref() { + if let Some(entry) = cache + .entries + .iter() + .find(|entry| entry.model.id == model_value) + { + provider_id = Some(entry.group_id.clone()); + } else if let Some(agent) = AgentId::parse(model_value) { + provider_id = Some(agent.as_str().to_string()); + } + } + } + let mut provider_id = provider_id.unwrap_or_else(|| cache.default_group.clone()); + let mut model_id = model_id + .or_else(|| cache.group_defaults.get(&provider_id).cloned()) + .unwrap_or_else(|| default_model_id.clone()); let mut resolved_agent = resolve_agent_from_model(&cache, &provider_id, &model_id); if resolved_agent.is_none() { - provider_id = OPENCODE_PROVIDER_ID.to_string(); + provider_id = cache.default_group.clone(); model_id = default_model_id.clone(); resolved_agent = resolve_agent_from_model(&cache, &provider_id, &model_id).or_else(|| Some(default_agent_id())); @@ -756,19 +862,63 @@ fn agent_display_name(agent: AgentId) -> &'static str { } } -fn model_config_entry(agent: AgentId, model: &AgentModelInfo) -> Value { - let model_name = model.name.clone().unwrap_or_else(|| model.id.clone()); - let variants = model_variants_object(model); +fn opencode_model_provider(model_id: &str) -> Option<&str> { + model_id.split_once('/').map(|(provider, _)| provider) +} + +fn opencode_group_provider(group_id: &str) -> Option<&str> { + group_id.strip_prefix("opencode:") +} + +fn group_for_agent_model(agent: AgentId, model_id: &str) -> (String, String) { + if agent == AgentId::Opencode { + let provider = opencode_model_provider(model_id).unwrap_or("unknown"); + return ( + format!("opencode:{provider}"), + format!("OpenCode ({provider})"), + ); + } + let group_id = agent.as_str().to_string(); + let group_name = agent_display_name(agent).to_string(); + (group_id, group_name) +} + +fn backing_model_for_agent(agent: AgentId, provider_id: &str, model_id: &str) -> Option { + if model_id.trim().is_empty() { + return None; + } + if AgentId::parse(model_id).is_some() { + return None; + } + if agent != AgentId::Opencode { + return Some(model_id.to_string()); + } + if model_id.contains('/') { + return Some(model_id.to_string()); + } + if let Some(provider) = opencode_group_provider(provider_id) { + return Some(format!("{provider}/{model_id}")); + } + Some(model_id.to_string()) +} + +fn model_config_entry(entry: &OpenCodeModelEntry) -> Value { + let model_name = entry + .model + .name + .clone() + .unwrap_or_else(|| entry.model.id.clone()); + let variants = model_variants_object(&entry.model); json!({ - "id": model.id, - "providerID": OPENCODE_PROVIDER_ID, + "id": entry.model.id, + "providerID": entry.group_id, "api": { "id": "sandbox-agent", "url": "http://localhost", "npm": "@sandbox-agent/sdk" }, "name": model_name, - "family": agent_display_name(agent), + "family": entry.group_name, "capabilities": { "temperature": true, "reasoning": true, @@ -807,13 +957,17 @@ fn model_config_entry(agent: AgentId, model: &AgentModelInfo) -> Value { }) } -fn model_summary_entry(agent: AgentId, model: &AgentModelInfo) -> Value { - let model_name = model.name.clone().unwrap_or_else(|| model.id.clone()); - let variants = model_variants_object(model); +fn model_summary_entry(entry: &OpenCodeModelEntry) -> Value { + let model_name = entry + .model + .name + .clone() + .unwrap_or_else(|| entry.model.id.clone()); + let variants = model_variants_object(&entry.model); json!({ - "id": model.id, + "id": entry.model.id, "name": model_name, - "family": agent_display_name(agent), + "family": entry.group_name, "release_date": "2024-01-01", "attachment": false, "reasoning": true, @@ -1673,7 +1827,7 @@ async fn apply_item_event( let provider_id = runtime .last_model_provider .clone() - .unwrap_or_else(|| OPENCODE_PROVIDER_ID.to_string()); + .unwrap_or_else(|| OPENCODE_DEFAULT_PROVIDER_ID.to_string()); let model_id = runtime .last_model_id .clone() @@ -1984,7 +2138,7 @@ async fn apply_tool_item_event( let provider_id = runtime .last_model_provider .clone() - .unwrap_or_else(|| OPENCODE_PROVIDER_ID.to_string()); + .unwrap_or_else(|| OPENCODE_DEFAULT_PROVIDER_ID.to_string()); let model_id = runtime .last_model_id .clone() @@ -2218,7 +2372,7 @@ async fn apply_item_delta( let provider_id = runtime .last_model_provider .clone() - .unwrap_or_else(|| OPENCODE_PROVIDER_ID.to_string()); + .unwrap_or_else(|| OPENCODE_DEFAULT_PROVIDER_ID.to_string()); let model_id = runtime .last_model_id .clone() @@ -2420,7 +2574,7 @@ pub fn build_opencode_router(state: Arc) -> Router { )] async fn oc_agent_list(State(state): State>) -> impl IntoResponse { let agent = json!({ - "name": OPENCODE_PROVIDER_NAME, + "name": "Sandbox Agent", "description": "Sandbox Agent compatibility layer", "mode": "all", "native": false, @@ -2472,28 +2626,41 @@ async fn oc_config_providers( State(state): State>, ) -> impl IntoResponse { let cache = opencode_model_cache(&state).await; - let mut models = serde_json::Map::new(); + let mut grouped: BTreeMap> = BTreeMap::new(); for entry in &cache.entries { - models.insert( - entry.model.id.clone(), - model_config_entry(entry.agent, &entry.model), - ); + grouped + .entry(entry.group_id.clone()) + .or_default() + .push(entry); + } + let mut providers = Vec::new(); + let mut defaults = serde_json::Map::new(); + for (group_id, entries) in grouped { + let mut models = serde_json::Map::new(); + for entry in entries { + models.insert(entry.model.id.clone(), model_config_entry(entry)); + } + let name = cache + .group_names + .get(&group_id) + .cloned() + .unwrap_or_else(|| group_id.clone()); + providers.push(json!({ + "id": group_id, + "name": name, + "source": "custom", + "env": [], + "key": "", + "options": {}, + "models": Value::Object(models), + })); + if let Some(default_model) = cache.group_defaults.get(&group_id) { + defaults.insert(group_id, Value::String(default_model.clone())); + } } let providers = json!({ - "providers": [ - { - "id": OPENCODE_PROVIDER_ID, - "name": OPENCODE_PROVIDER_NAME, - "source": "custom", - "env": [], - "key": "", - "options": {}, - "models": Value::Object(models), - } - ], - "default": { - OPENCODE_PROVIDER_ID: cache.default_model - } + "providers": providers, + "default": Value::Object(defaults), }); (StatusCode::OK, Json(providers)) } @@ -3144,6 +3311,9 @@ async fn oc_session_message_create( .and_then(|v| v.as_str()); let (session_agent, provider_id, model_id) = resolve_session_agent(&state, &session_id, requested_provider, requested_model).await; + let session_agent_id = AgentId::parse(&session_agent).unwrap_or_else(default_agent_id); + let backing_model = backing_model_for_agent(session_agent_id, &provider_id, &model_id); + let backing_variant = body.variant.clone(); let parts_input = body.parts.unwrap_or_default(); if parts_input.is_empty() { @@ -3207,7 +3377,15 @@ async fn oc_session_message_create( }) .await; - if let Err(err) = ensure_backing_session(&state, &session_id, &session_agent).await { + if let Err(err) = ensure_backing_session( + &state, + &session_id, + &session_agent, + backing_model, + backing_variant, + ) + .await + { tracing::warn!( target = "sandbox_agent::opencode", ?err, @@ -3413,7 +3591,7 @@ async fn oc_session_command( &directory, &worktree, &agent, - OPENCODE_PROVIDER_ID, + OPENCODE_DEFAULT_PROVIDER_ID, OPENCODE_DEFAULT_MODEL_ID, ); @@ -3463,7 +3641,7 @@ async fn oc_session_shell( .as_ref() .and_then(|v| v.get("providerID")) .and_then(|v| v.as_str()) - .unwrap_or(OPENCODE_PROVIDER_ID), + .unwrap_or(OPENCODE_DEFAULT_PROVIDER_ID), body.model .as_ref() .and_then(|v| v.get("modelID")) @@ -3775,26 +3953,41 @@ async fn oc_provider_list( State(state): State>, ) -> impl IntoResponse { let cache = opencode_model_cache(&state).await; - let mut models = serde_json::Map::new(); + let mut grouped: BTreeMap> = BTreeMap::new(); for entry in &cache.entries { - models.insert( - entry.model.id.clone(), - model_summary_entry(entry.agent, &entry.model), - ); + grouped + .entry(entry.group_id.clone()) + .or_default() + .push(entry); + } + let mut providers = Vec::new(); + let mut defaults = serde_json::Map::new(); + let mut connected = Vec::new(); + for (group_id, entries) in grouped { + let mut models = serde_json::Map::new(); + for entry in entries { + models.insert(entry.model.id.clone(), model_summary_entry(entry)); + } + let name = cache + .group_names + .get(&group_id) + .cloned() + .unwrap_or_else(|| group_id.clone()); + providers.push(json!({ + "id": group_id, + "name": name, + "env": [], + "models": Value::Object(models), + })); + if let Some(default_model) = cache.group_defaults.get(&group_id) { + defaults.insert(group_id.clone(), Value::String(default_model.clone())); + } + connected.push(group_id); } let providers = json!({ - "all": [ - { - "id": OPENCODE_PROVIDER_ID, - "name": OPENCODE_PROVIDER_NAME, - "env": [], - "models": Value::Object(models), - } - ], - "default": { - OPENCODE_PROVIDER_ID: cache.default_model - }, - "connected": [OPENCODE_PROVIDER_ID] + "all": providers, + "default": Value::Object(defaults), + "connected": connected }); (StatusCode::OK, Json(providers)) } @@ -3805,11 +3998,15 @@ async fn oc_provider_list( responses((status = 200)), tag = "opencode" )] -async fn oc_provider_auth() -> impl IntoResponse { - let auth = json!({ - OPENCODE_PROVIDER_ID: [] - }); - (StatusCode::OK, Json(auth)) +async fn oc_provider_auth( + State(state): State>, +) -> impl IntoResponse { + let cache = opencode_model_cache(&state).await; + let mut auth_map = serde_json::Map::new(); + for group_id in cache.group_names.keys() { + auth_map.insert(group_id.clone(), json!([])); + } + (StatusCode::OK, Json(Value::Object(auth_map))) } #[utoipa::path( diff --git a/server/packages/sandbox-agent/src/router.rs b/server/packages/sandbox-agent/src/router.rs index 3746240..d585eee 100644 --- a/server/packages/sandbox-agent/src/router.rs +++ b/server/packages/sandbox-agent/src/router.rs @@ -1692,6 +1692,27 @@ impl SessionManager { }) } + pub(crate) async fn set_session_overrides( + &self, + session_id: &str, + model: Option, + variant: Option, + ) -> Result<(), SandboxError> { + let mut sessions = self.sessions.lock().await; + let Some(session) = SessionManager::session_mut(&mut sessions, session_id) else { + return Err(SandboxError::SessionNotFound { + session_id: session_id.to_string(), + }); + }; + if let Some(model) = model { + session.model = Some(model); + } + if let Some(variant) = variant { + session.variant = Some(variant); + } + Ok(()) + } + async fn agent_modes(&self, agent: AgentId) -> Result, SandboxError> { if agent != AgentId::Opencode { return Ok(agent_modes_for(agent)); diff --git a/server/packages/sandbox-agent/tests/opencode-compat/events.test.ts b/server/packages/sandbox-agent/tests/opencode-compat/events.test.ts index 61ab1f3..2140ef3 100644 --- a/server/packages/sandbox-agent/tests/opencode-compat/events.test.ts +++ b/server/packages/sandbox-agent/tests/opencode-compat/events.test.ts @@ -115,7 +115,7 @@ describe("OpenCode-compatible Event Streaming", () => { await client.session.prompt({ path: { id: sessionId }, body: { - model: { providerID: "sandbox-agent", modelID: "mock" }, + model: { providerID: "mock", modelID: "mock" }, parts: [{ type: "text", text: "Say hello" }], }, }); @@ -180,7 +180,7 @@ describe("OpenCode-compatible Event Streaming", () => { await client.session.prompt({ path: { id: sessionId }, body: { - model: { providerID: "sandbox-agent", modelID: "mock" }, + model: { providerID: "mock", modelID: "mock" }, parts: [{ type: "text", text: "echo hello" }], }, }); @@ -223,7 +223,7 @@ describe("OpenCode-compatible Event Streaming", () => { await client.session.prompt({ path: { id: sessionId }, body: { - model: { providerID: "sandbox-agent", modelID: "mock" }, + model: { providerID: "mock", modelID: "mock" }, parts: [{ type: "text", text: "tool" }], }, }); diff --git a/server/packages/sandbox-agent/tests/opencode-compat/messaging.test.ts b/server/packages/sandbox-agent/tests/opencode-compat/messaging.test.ts index f45db83..ce37371 100644 --- a/server/packages/sandbox-agent/tests/opencode-compat/messaging.test.ts +++ b/server/packages/sandbox-agent/tests/opencode-compat/messaging.test.ts @@ -45,7 +45,7 @@ describe("OpenCode-compatible Messaging API", () => { const response = await client.session.prompt({ path: { id: sessionId }, body: { - model: { providerID: "sandbox-agent", modelID: "mock" }, + model: { providerID: "mock", modelID: "mock" }, parts: [{ type: "text", text: "Hello, world!" }], }, }); @@ -58,7 +58,7 @@ describe("OpenCode-compatible Messaging API", () => { const response = await client.session.prompt({ path: { id: sessionId }, body: { - model: { providerID: "sandbox-agent", modelID: "mock" }, + model: { providerID: "mock", modelID: "mock" }, parts: [{ type: "text", text: "Say hello" }], }, }); @@ -72,7 +72,7 @@ describe("OpenCode-compatible Messaging API", () => { const response = await client.session.promptAsync({ path: { id: sessionId }, body: { - model: { providerID: "sandbox-agent", modelID: "mock" }, + model: { providerID: "mock", modelID: "mock" }, parts: [{ type: "text", text: "Process this asynchronously" }], }, }); @@ -96,7 +96,7 @@ describe("OpenCode-compatible Messaging API", () => { await client.session.prompt({ path: { id: sessionId }, body: { - model: { providerID: "sandbox-agent", modelID: "mock" }, + model: { providerID: "mock", modelID: "mock" }, parts: [{ type: "text", text: "Test message" }], }, }); @@ -116,7 +116,7 @@ describe("OpenCode-compatible Messaging API", () => { await client.session.prompt({ path: { id: sessionId }, body: { - model: { providerID: "sandbox-agent", modelID: "mock" }, + model: { providerID: "mock", modelID: "mock" }, parts: [{ type: "text", text: "Test" }], }, }); @@ -144,7 +144,7 @@ describe("OpenCode-compatible Messaging API", () => { await client.session.promptAsync({ path: { id: sessionId }, body: { - model: { providerID: "sandbox-agent", modelID: "mock" }, + model: { providerID: "mock", modelID: "mock" }, parts: [{ type: "text", text: "Long running task" }], }, }); diff --git a/server/packages/sandbox-agent/tests/opencode-compat/models.test.ts b/server/packages/sandbox-agent/tests/opencode-compat/models.test.ts index 68ef0c0..076fd49 100644 --- a/server/packages/sandbox-agent/tests/opencode-compat/models.test.ts +++ b/server/packages/sandbox-agent/tests/opencode-compat/models.test.ts @@ -28,22 +28,25 @@ describe("OpenCode-compatible Model API", () => { it("should list models grouped by agent with real model IDs", async () => { const response = await client.provider.list(); - const provider = response.data?.all?.find((entry) => entry.id === "sandbox-agent"); - expect(provider).toBeDefined(); + const providers = response.data?.all ?? []; + const mockProvider = providers.find((entry) => entry.id === "mock"); + const ampProvider = providers.find((entry) => entry.id === "amp"); + const sandboxProvider = providers.find((entry) => entry.id === "sandbox-agent"); + expect(sandboxProvider).toBeUndefined(); + expect(mockProvider).toBeDefined(); + expect(ampProvider).toBeDefined(); - const models = provider?.models ?? {}; - const modelIds = Object.keys(models); - expect(modelIds.length).toBeGreaterThan(0); + const mockModels = mockProvider?.models ?? {}; + expect(mockModels["mock"]).toBeDefined(); + expect(mockModels["mock"].id).toBe("mock"); + expect(mockModels["mock"].family).toBe("Mock"); - expect(models["mock"]).toBeDefined(); - expect(models["mock"].id).toBe("mock"); - expect(models["mock"].family).toBe("Mock"); + const ampModels = ampProvider?.models ?? {}; + expect(ampModels["smart"]).toBeDefined(); + expect(ampModels["smart"].id).toBe("smart"); + expect(ampModels["smart"].family).toBe("Amp"); - expect(models["smart"]).toBeDefined(); - expect(models["smart"].id).toBe("smart"); - expect(models["smart"].family).toBe("Amp"); - - expect(models["amp"]).toBeUndefined(); - expect(response.data?.default?.["sandbox-agent"]).toBe("mock"); + expect(response.data?.default?.["mock"]).toBe("mock"); + expect(response.data?.default?.["amp"]).toBe("smart"); }); }); diff --git a/server/packages/sandbox-agent/tests/opencode-compat/permissions.test.ts b/server/packages/sandbox-agent/tests/opencode-compat/permissions.test.ts index 097d9fe..0742da7 100644 --- a/server/packages/sandbox-agent/tests/opencode-compat/permissions.test.ts +++ b/server/packages/sandbox-agent/tests/opencode-compat/permissions.test.ts @@ -57,7 +57,7 @@ describe("OpenCode-compatible Permission API", () => { it("should receive permission.asked and reply via global endpoint", async () => { await client.session.prompt({ sessionID: sessionId, - model: { providerID: "sandbox-agent", modelID: "mock" }, + model: { providerID: "mock", modelID: "mock" }, parts: [{ type: "text", text: permissionPrompt }], }); @@ -77,7 +77,7 @@ describe("OpenCode-compatible Permission API", () => { it("should accept permission response for a session", async () => { await client.session.prompt({ sessionID: sessionId, - model: { providerID: "sandbox-agent", modelID: "mock" }, + model: { providerID: "mock", modelID: "mock" }, parts: [{ type: "text", text: permissionPrompt }], }); diff --git a/server/packages/sandbox-agent/tests/opencode-compat/questions.test.ts b/server/packages/sandbox-agent/tests/opencode-compat/questions.test.ts index ae881fb..4868f98 100644 --- a/server/packages/sandbox-agent/tests/opencode-compat/questions.test.ts +++ b/server/packages/sandbox-agent/tests/opencode-compat/questions.test.ts @@ -49,7 +49,7 @@ describe("OpenCode-compatible Question API", () => { it("should ask a question and accept a reply", async () => { await client.session.prompt({ sessionID: sessionId, - model: { providerID: "sandbox-agent", modelID: "mock" }, + model: { providerID: "mock", modelID: "mock" }, parts: [{ type: "text", text: questionPrompt }], }); @@ -67,7 +67,7 @@ describe("OpenCode-compatible Question API", () => { it("should allow rejecting a question", async () => { await client.session.prompt({ sessionID: sessionId, - model: { providerID: "sandbox-agent", modelID: "mock" }, + model: { providerID: "mock", modelID: "mock" }, parts: [{ type: "text", text: questionPrompt }], }); diff --git a/server/packages/sandbox-agent/tests/opencode-compat/tools.test.ts b/server/packages/sandbox-agent/tests/opencode-compat/tools.test.ts index 4cdda8f..ea45950 100644 --- a/server/packages/sandbox-agent/tests/opencode-compat/tools.test.ts +++ b/server/packages/sandbox-agent/tests/opencode-compat/tools.test.ts @@ -72,7 +72,7 @@ describe("OpenCode-compatible Tool + File Actions", () => { await client.session.prompt({ path: { id: sessionId }, body: { - model: { providerID: "sandbox-agent", modelID: "mock" }, + model: { providerID: "mock", modelID: "mock" }, parts: [{ type: "text", text: "tool" }], }, }); From b824a2c83920e5077e9c83c5b289d78a0f93c797 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 6 Feb 2026 03:05:23 -0800 Subject: [PATCH 09/19] feat: customize opencode branding (#103) --- server/packages/sandbox-agent/src/cli.rs | 13 +- .../sandbox-agent/src/opencode_compat.rs | 5 +- server/packages/sandbox-agent/src/router.rs | 65 +++-- ...oints_snapshots@agent_install_amp.snap.new | 6 + ..._session_snapshot@multi_turn_mock.snap.new | 131 ++++++++++ ...n_snapshot@permission_events_mock.snap.new | 237 ++++++++++++++++++ ...apshot@question_reply_events_mock.snap.new | 105 ++++++++ ..._snapshot@concurrency_events_mock.snap.new | 105 ++++++++ ...on_snapshot@create_session_mock-2.snap.new | 7 + ..._events_snapshot@http_events_mock.snap.new | 46 ++++ 10 files changed, 700 insertions(+), 20 deletions(-) create mode 100644 server/packages/sandbox-agent/tests/http/snapshots/http_endpoints__agent_endpoints__agent_endpoints_snapshots@agent_install_amp.snap.new create mode 100644 server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__multi_turn__assert_session_snapshot@multi_turn_mock.snap.new create mode 100644 server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__permissions__assert_session_snapshot@permission_events_mock.snap.new create mode 100644 server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__questions__assert_session_snapshot@question_reply_events_mock.snap.new create mode 100644 server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__session_lifecycle__assert_session_snapshot@concurrency_events_mock.snap.new create mode 100644 server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__session_lifecycle__assert_session_snapshot@create_session_mock-2.snap.new create mode 100644 server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__session_lifecycle__run_http_events_snapshot@http_events_mock.snap.new diff --git a/server/packages/sandbox-agent/src/cli.rs b/server/packages/sandbox-agent/src/cli.rs index fe69cd2..8390f46 100644 --- a/server/packages/sandbox-agent/src/cli.rs +++ b/server/packages/sandbox-agent/src/cli.rs @@ -15,8 +15,8 @@ use reqwest::blocking::Client as HttpClient; use reqwest::Method; use crate::router::{build_router_with_state, shutdown_servers}; use crate::router::{ - AgentInstallRequest, AppState, AuthConfig, CreateSessionRequest, MessageRequest, - PermissionReply, PermissionReplyRequest, QuestionReplyRequest, + AgentInstallRequest, AppState, AuthConfig, BrandingMode, CreateSessionRequest, + MessageRequest, PermissionReply, PermissionReplyRequest, QuestionReplyRequest, }; use crate::router::{ AgentListResponse, AgentModelsResponse, AgentModesResponse, CreateSessionResponse, @@ -502,9 +502,14 @@ fn run_server(cli: &CliConfig, server: &ServerArgs) -> Result<(), CliError> { AuthConfig::disabled() }; + let branding = if cli.gigacode { + BrandingMode::Gigacode + } else { + BrandingMode::SandboxAgent + }; let agent_manager = AgentManager::new(default_install_dir()) .map_err(|err| CliError::Server(err.to_string()))?; - let state = Arc::new(AppState::new(auth, agent_manager)); + let state = Arc::new(AppState::with_branding(auth, agent_manager, branding)); let (mut router, state) = build_router_with_state(state); let cors = build_cors_layer(server)?; @@ -581,7 +586,7 @@ fn run_api(command: &ApiCommand, cli: &CliConfig) -> Result<(), CliError> { fn run_opencode(cli: &CliConfig, args: &OpencodeArgs) -> Result<(), CliError> { let name = if cli.gigacode { "Gigacode" } else { "OpenCode command" }; - write_stderr_line(&format!("EXPERIMENTAL: Please report bugs to:\n- GitHub: https://github.com/rivet-dev/sandbox-agent/issues\n- Discord: https://rivet.dev/discord\n\n{name} is powered by:- OpenCode (TUI): https://opencode.ai/\n- Sandbox Agent SDK (multi-agent compatibility): https://sandboxagent.dev/\n\n"))?; + write_stderr_line(&format!("\nEXPERIMENTAL: Please report bugs to:\n- GitHub: https://github.com/rivet-dev/sandbox-agent/issues\n- Discord: https://rivet.dev/discord\n\n{name} is powered by:\n- OpenCode (TUI): https://opencode.ai/\n- Sandbox Agent SDK (multi-agent compatibility): https://sandboxagent.dev/\n\n"))?; let token = cli.token.clone(); diff --git a/server/packages/sandbox-agent/src/opencode_compat.rs b/server/packages/sandbox-agent/src/opencode_compat.rs index ac72d0c..e756cce 100644 --- a/server/packages/sandbox-agent/src/opencode_compat.rs +++ b/server/packages/sandbox-agent/src/opencode_compat.rs @@ -2573,9 +2573,10 @@ pub fn build_opencode_router(state: Arc) -> Router { tag = "opencode" )] async fn oc_agent_list(State(state): State>) -> impl IntoResponse { + let name = state.inner.branding.product_name(); let agent = json!({ - "name": "Sandbox Agent", - "description": "Sandbox Agent compatibility layer", + "name": name, + "description": format!("{name} compatibility layer"), "mode": "all", "native": false, "hidden": false, diff --git a/server/packages/sandbox-agent/src/router.rs b/server/packages/sandbox-agent/src/router.rs index d585eee..1563bee 100644 --- a/server/packages/sandbox-agent/src/router.rs +++ b/server/packages/sandbox-agent/src/router.rs @@ -55,15 +55,43 @@ static USER_MESSAGE_COUNTER: AtomicU64 = AtomicU64::new(1); const ANTHROPIC_MODELS_URL: &str = "https://api.anthropic.com/v1/models?beta=true"; const ANTHROPIC_VERSION: &str = "2023-06-01"; +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub enum BrandingMode { + #[default] + SandboxAgent, + Gigacode, +} + +impl BrandingMode { + pub fn product_name(&self) -> &'static str { + match self { + BrandingMode::SandboxAgent => "Sandbox Agent", + BrandingMode::Gigacode => "Gigacode", + } + } + + pub fn docs_url(&self) -> &'static str { + match self { + BrandingMode::SandboxAgent => "https://sandboxagent.dev", + BrandingMode::Gigacode => "https://gigacode.dev", + } + } +} + #[derive(Debug)] pub struct AppState { auth: AuthConfig, agent_manager: Arc, session_manager: Arc, + pub branding: BrandingMode, } impl AppState { pub fn new(auth: AuthConfig, agent_manager: AgentManager) -> Self { + Self::with_branding(auth, agent_manager, BrandingMode::default()) + } + + pub fn with_branding(auth: AuthConfig, agent_manager: AgentManager, branding: BrandingMode) -> Self { let agent_manager = Arc::new(agent_manager); let session_manager = Arc::new(SessionManager::new(agent_manager.clone())); session_manager @@ -73,6 +101,7 @@ impl AppState { auth, agent_manager, session_manager, + branding, } } @@ -152,12 +181,15 @@ pub fn build_router_with_state(shared: Arc) -> (Router, Arc) )); } - let mut router = Router::new() + let root_router = Router::new() .route("/", get(get_root)) + .fallback(not_found) + .with_state(shared.clone()); + + let mut router = root_router .nest("/v1", v1_router) .nest("/opencode", opencode_router) - .merge(opencode_root_router) - .fallback(not_found); + .merge(opencode_root_router); if ui::is_enabled() { router = router.merge(ui::router()); @@ -4068,21 +4100,26 @@ async fn get_agent_models( Ok(Json(models)) } -const SERVER_INFO: &str = "\ -This is a Sandbox Agent server. Available endpoints:\n\ - - GET / - Server info\n\ - - GET /v1/health - Health check\n\ - - GET /ui/ - Inspector UI\n\n\ -See https://sandboxagent.dev for API documentation."; - -async fn get_root() -> &'static str { - SERVER_INFO +fn server_info(branding: BrandingMode) -> String { + format!( + "This is a {} server. Available endpoints:\n\ + \x20 - GET / - Server info\n\ + \x20 - GET /v1/health - Health check\n\ + \x20 - GET /ui/ - Inspector UI\n\n\ + See {} for API documentation.", + branding.product_name(), + branding.docs_url(), + ) } -async fn not_found() -> (StatusCode, String) { +async fn get_root(State(state): State>) -> String { + server_info(state.branding) +} + +async fn not_found(State(state): State>) -> (StatusCode, String) { ( StatusCode::NOT_FOUND, - format!("404 Not Found\n\n{SERVER_INFO}"), + format!("404 Not Found\n\n{}", server_info(state.branding)), ) } diff --git a/server/packages/sandbox-agent/tests/http/snapshots/http_endpoints__agent_endpoints__agent_endpoints_snapshots@agent_install_amp.snap.new b/server/packages/sandbox-agent/tests/http/snapshots/http_endpoints__agent_endpoints__agent_endpoints_snapshots@agent_install_amp.snap.new new file mode 100644 index 0000000..d01df04 --- /dev/null +++ b/server/packages/sandbox-agent/tests/http/snapshots/http_endpoints__agent_endpoints__agent_endpoints_snapshots@agent_install_amp.snap.new @@ -0,0 +1,6 @@ +--- +source: server/packages/sandbox-agent/tests/http/agent_endpoints.rs +assertion_line: 145 +expression: snapshot_status(status) +--- +status: 204 diff --git a/server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__multi_turn__assert_session_snapshot@multi_turn_mock.snap.new b/server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__multi_turn__assert_session_snapshot@multi_turn_mock.snap.new new file mode 100644 index 0000000..2a091af --- /dev/null +++ b/server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__multi_turn__assert_session_snapshot@multi_turn_mock.snap.new @@ -0,0 +1,131 @@ +--- +source: server/packages/sandbox-agent/tests/sessions/multi_turn.rs +assertion_line: 15 +expression: value +--- +first: + - metadata: true + seq: 1 + session: started + type: session.started + - item: + content_types: + - text + kind: message + role: user + status: in_progress + seq: 2 + type: item.started + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 3 + type: item.delta + - item: + content_types: + - text + kind: message + role: user + status: completed + seq: 4 + type: item.completed + - item: + content_types: + - text + kind: message + role: assistant + status: in_progress + seq: 5 + type: item.started + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 6 + type: item.delta + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 7 + type: item.delta + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 8 + type: item.delta + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 9 + type: item.delta + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 10 + type: item.delta +second: + - item: + content_types: + - text + kind: message + role: user + status: in_progress + seq: 1 + type: item.started + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 2 + type: item.delta + - item: + content_types: + - text + kind: message + role: user + status: completed + seq: 3 + type: item.completed + - item: + content_types: + - text + kind: message + role: assistant + status: in_progress + seq: 4 + type: item.started + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 5 + type: item.delta + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 6 + type: item.delta + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 7 + type: item.delta + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 8 + type: item.delta + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 9 + type: item.delta diff --git a/server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__permissions__assert_session_snapshot@permission_events_mock.snap.new b/server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__permissions__assert_session_snapshot@permission_events_mock.snap.new new file mode 100644 index 0000000..d5c1b20 --- /dev/null +++ b/server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__permissions__assert_session_snapshot@permission_events_mock.snap.new @@ -0,0 +1,237 @@ +--- +source: server/packages/sandbox-agent/tests/sessions/permissions.rs +assertion_line: 12 +expression: value +--- +- metadata: true + seq: 1 + session: started + type: session.started +- item: + content_types: + - text + kind: message + role: user + status: in_progress + seq: 2 + type: item.started +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 3 + type: item.delta +- item: + content_types: + - text + kind: message + role: user + status: completed + seq: 4 + type: item.completed +- item: + content_types: + - text + kind: message + role: assistant + status: in_progress + seq: 5 + type: item.started +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 6 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 7 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 8 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 9 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 10 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 11 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 12 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 13 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 14 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 15 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 16 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 17 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 18 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 19 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 20 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 21 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 22 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 23 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 24 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 25 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 26 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 27 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 28 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 29 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 30 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 31 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 32 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 33 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 34 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 35 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 36 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 37 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 38 + type: item.delta diff --git a/server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__questions__assert_session_snapshot@question_reply_events_mock.snap.new b/server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__questions__assert_session_snapshot@question_reply_events_mock.snap.new new file mode 100644 index 0000000..f414271 --- /dev/null +++ b/server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__questions__assert_session_snapshot@question_reply_events_mock.snap.new @@ -0,0 +1,105 @@ +--- +source: server/packages/sandbox-agent/tests/sessions/questions.rs +assertion_line: 12 +expression: value +--- +- metadata: true + seq: 1 + session: started + type: session.started +- item: + content_types: + - text + kind: message + role: user + status: in_progress + seq: 2 + type: item.started +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 3 + type: item.delta +- item: + content_types: + - text + kind: message + role: user + status: completed + seq: 4 + type: item.completed +- item: + content_types: + - text + kind: message + role: assistant + status: in_progress + seq: 5 + type: item.started +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 6 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 7 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 8 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 9 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 10 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 11 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 12 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 13 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 14 + type: item.delta +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 15 + type: item.delta +- question: + id: "" + options: 4 + status: requested + seq: 16 + type: question.requested diff --git a/server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__session_lifecycle__assert_session_snapshot@concurrency_events_mock.snap.new b/server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__session_lifecycle__assert_session_snapshot@concurrency_events_mock.snap.new new file mode 100644 index 0000000..a6e0065 --- /dev/null +++ b/server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__session_lifecycle__assert_session_snapshot@concurrency_events_mock.snap.new @@ -0,0 +1,105 @@ +--- +source: server/packages/sandbox-agent/tests/sessions/session_lifecycle.rs +assertion_line: 12 +expression: value +--- +session_a: + - metadata: true + seq: 1 + session: started + type: session.started + - item: + content_types: + - text + kind: message + role: user + status: in_progress + seq: 2 + type: item.started + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 3 + type: item.delta + - item: + content_types: + - text + kind: message + role: user + status: completed + seq: 4 + type: item.completed + - item: + content_types: + - text + kind: message + role: assistant + status: in_progress + seq: 5 + type: item.started + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 6 + type: item.delta + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 7 + type: item.delta + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 8 + type: item.delta + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 9 + type: item.delta +session_b: + - metadata: true + seq: 1 + session: started + type: session.started + - item: + content_types: + - text + kind: message + role: user + status: in_progress + seq: 2 + type: item.started + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 3 + type: item.delta + - item: + content_types: + - text + kind: message + role: user + status: completed + seq: 4 + type: item.completed + - item: + content_types: + - text + kind: message + role: assistant + status: in_progress + seq: 5 + type: item.started + - delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 6 + type: item.delta diff --git a/server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__session_lifecycle__assert_session_snapshot@create_session_mock-2.snap.new b/server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__session_lifecycle__assert_session_snapshot@create_session_mock-2.snap.new new file mode 100644 index 0000000..b63c3a7 --- /dev/null +++ b/server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__session_lifecycle__assert_session_snapshot@create_session_mock-2.snap.new @@ -0,0 +1,7 @@ +--- +source: server/packages/sandbox-agent/tests/sessions/session_lifecycle.rs +assertion_line: 12 +expression: value +--- +healthy: true +nativeSessionId: "" diff --git a/server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__session_lifecycle__run_http_events_snapshot@http_events_mock.snap.new b/server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__session_lifecycle__run_http_events_snapshot@http_events_mock.snap.new new file mode 100644 index 0000000..da365cc --- /dev/null +++ b/server/packages/sandbox-agent/tests/sessions/snapshots/sessions__sessions__session_lifecycle__run_http_events_snapshot@http_events_mock.snap.new @@ -0,0 +1,46 @@ +--- +source: server/packages/sandbox-agent/tests/sessions/../common/http.rs +assertion_line: 1001 +expression: normalized +--- +- metadata: true + seq: 1 + session: started + type: session.started +- item: + content_types: + - text + kind: message + role: user + status: in_progress + seq: 2 + type: item.started +- delta: + delta: "" + item_id: "" + native_item_id: "" + seq: 3 + type: item.delta +- item: + content_types: + - text + kind: message + role: user + status: completed + seq: 4 + type: item.completed +- item: + content_types: + - text + kind: message + role: assistant + status: in_progress + seq: 5 + type: item.started +- item: + content_types: [] + kind: message + role: assistant + status: completed + seq: 6 + type: item.completed From beacbbfdba04bc5c8367b4893f71197c6dd46b55 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 6 Feb 2026 03:07:24 -0800 Subject: [PATCH 10/19] chore: update gigacode published packages (#104) --- gigacode/README.md | 2 +- node_modules | 1 - pnpm-lock.yaml | 250 +++++++++--------- scripts/release/sdk.ts | 26 +- sdks/gigacode/bin/gigacode | 12 +- sdks/gigacode/package.json | 10 +- .../platforms/darwin-arm64/package.json | 2 +- .../platforms/darwin-x64/package.json | 2 +- .../platforms/linux-arm64/package.json | 2 +- .../gigacode/platforms/linux-x64/package.json | 2 +- .../gigacode/platforms/win32-x64/package.json | 2 +- 11 files changed, 156 insertions(+), 155 deletions(-) delete mode 120000 node_modules diff --git a/gigacode/README.md b/gigacode/README.md index ab3bc85..6a0035c 100644 --- a/gigacode/README.md +++ b/gigacode/README.md @@ -60,7 +60,7 @@ gigacode --help ```bash bun add -g gigacode # Allow Bun to run postinstall scripts for native binaries. -bun pm -g trust gigacode-linux-x64 gigacode-linux-arm64 gigacode-darwin-arm64 gigacode-darwin-x64 gigacode-win32-x64 +bun pm -g trust @sandbox-agent/gigacode-linux-x64 @sandbox-agent/gigacode-linux-arm64 @sandbox-agent/gigacode-darwin-arm64 @sandbox-agent/gigacode-darwin-x64 @sandbox-agent/gigacode-win32-x64 gigacode --help ``` diff --git a/node_modules b/node_modules deleted file mode 120000 index 501480b..0000000 --- a/node_modules +++ /dev/null @@ -1 +0,0 @@ -/home/nathan/sandbox-agent/node_modules \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ffa0f74..819556a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,7 +17,7 @@ importers: version: 2.7.6 vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) examples/cloudflare: dependencies: @@ -36,10 +36,10 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: latest - version: 4.20260131.0 + version: 4.20260206.0 '@types/node': specifier: latest - version: 25.2.0 + version: 25.2.1 '@types/react': specifier: ^18.3.3 version: 18.3.27 @@ -48,32 +48,32 @@ importers: version: 18.3.7(@types/react@18.3.27) '@vitejs/plugin-react': specifier: ^4.5.0 - version: 4.7.0(vite@6.4.1(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.7.0(vite@6.4.1(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2)) typescript: specifier: latest version: 5.9.3 vite: specifier: ^6.2.0 - version: 6.4.1(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) + version: 6.4.1(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) wrangler: specifier: latest - version: 4.61.1(@cloudflare/workers-types@4.20260131.0) + version: 4.63.0(@cloudflare/workers-types@4.20260206.0) examples/daytona: dependencies: '@daytonaio/sdk': specifier: latest - version: 0.138.0(ws@8.19.0) + version: 0.139.0(ws@8.19.0) '@sandbox-agent/example-shared': specifier: workspace:* version: link:../shared devDependencies: '@types/node': specifier: latest - version: 25.2.0 + version: 25.2.1 tsx: specifier: latest version: 4.21.0 @@ -95,7 +95,7 @@ importers: version: 4.0.1 '@types/node': specifier: latest - version: 25.2.0 + version: 25.2.1 tsx: specifier: latest version: 4.21.0 @@ -104,7 +104,7 @@ importers: version: 5.9.3 vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) examples/e2b: dependencies: @@ -120,7 +120,7 @@ importers: devDependencies: '@types/node': specifier: latest - version: 25.2.0 + version: 25.2.1 tsx: specifier: latest version: 4.21.0 @@ -129,7 +129,7 @@ importers: version: 5.9.3 vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) examples/shared: dependencies: @@ -139,7 +139,7 @@ importers: devDependencies: '@types/node': specifier: latest - version: 25.2.0 + version: 25.2.1 typescript: specifier: latest version: 5.9.3 @@ -158,7 +158,7 @@ importers: devDependencies: '@types/node': specifier: latest - version: 25.2.0 + version: 25.2.1 tsx: specifier: latest version: 4.21.0 @@ -167,7 +167,7 @@ importers: version: 5.9.3 vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) frontend/packages/inspector: dependencies: @@ -189,7 +189,7 @@ importers: version: 18.3.7(@types/react@18.3.27) '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.7.0(vite@5.4.21(@types/node@25.2.0)) + version: 4.7.0(vite@5.4.21(@types/node@25.2.1)) sandbox-agent: specifier: workspace:* version: link:../../../sdks/typescript @@ -198,19 +198,19 @@ importers: version: 5.9.3 vite: specifier: ^5.4.7 - version: 5.4.21(@types/node@25.2.0) + version: 5.4.21(@types/node@25.2.1) frontend/packages/website: dependencies: '@astrojs/react': specifier: ^4.2.0 - version: 4.4.2(@types/node@25.2.0)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(jiti@1.21.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tsx@4.21.0)(yaml@2.8.2) + version: 4.4.2(@types/node@25.2.1)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(jiti@1.21.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tsx@4.21.0)(yaml@2.8.2) '@astrojs/tailwind': specifier: ^6.0.0 - version: 6.0.2(astro@5.16.15(@types/node@25.2.0)(jiti@1.21.7)(rollup@4.56.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.8.2)) + version: 6.0.2(astro@5.16.15(@types/node@25.2.1)(jiti@1.21.7)(rollup@4.56.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.8.2)) astro: specifier: ^5.1.0 - version: 5.16.15(@types/node@25.2.0)(jiti@1.21.7)(rollup@4.56.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 5.16.15(@types/node@25.2.1)(jiti@1.21.7)(rollup@4.56.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) framer-motion: specifier: ^12.0.0 version: 12.29.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -241,10 +241,10 @@ importers: dependencies: '@anthropic-ai/claude-code': specifier: latest - version: 2.1.29 + version: 2.1.34 '@openai/codex': specifier: latest - version: 0.94.0 + version: 0.98.0 cheerio: specifier: ^1.0.0 version: 1.2.0 @@ -319,14 +319,14 @@ importers: dependencies: '@daytonaio/sdk': specifier: latest - version: 0.138.0(ws@8.19.0) + version: 0.139.0(ws@8.19.0) '@e2b/code-interpreter': specifier: latest version: 2.3.3 devDependencies: '@types/node': specifier: latest - version: 25.2.0 + version: 25.2.1 tsx: specifier: latest version: 4.21.0 @@ -358,7 +358,7 @@ importers: devDependencies: vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) sdks/cli-shared: devDependencies: @@ -388,25 +388,25 @@ importers: specifier: workspace:* version: link:../cli-shared optionalDependencies: - gigacode-darwin-arm64: + '@sandbox-agent/gigacode-darwin-arm64': specifier: workspace:* version: link:platforms/darwin-arm64 - gigacode-darwin-x64: + '@sandbox-agent/gigacode-darwin-x64': specifier: workspace:* version: link:platforms/darwin-x64 - gigacode-linux-arm64: + '@sandbox-agent/gigacode-linux-arm64': specifier: workspace:* version: link:platforms/linux-arm64 - gigacode-linux-x64: + '@sandbox-agent/gigacode-linux-x64': specifier: workspace:* version: link:platforms/linux-x64 - gigacode-win32-x64: + '@sandbox-agent/gigacode-win32-x64': specifier: workspace:* version: link:platforms/win32-x64 devDependencies: vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) sdks/gigacode/platforms/darwin-arm64: {} @@ -446,8 +446,8 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@anthropic-ai/claude-code@2.1.29': - resolution: {integrity: sha512-vMHTOXrYdnreGtKUsWdd3Bwx5fKprTyNG7shrvbx3L2/jU9jexkOJrEKmN5loeR5jrE54LSB38QpaIj8pVM6eQ==} + '@anthropic-ai/claude-code@2.1.34': + resolution: {integrity: sha512-uQ3yv41lvCExj2Ju/pCZ1KIKub5d5V3RQyeSKICPoJzk/H2Ktp0zonZeLkD/Q56qa4vPpA8MmvsBmFkAr+Z42w==} engines: {node: '>=18.0.0'} hasBin: true @@ -792,38 +792,38 @@ packages: workerd: optional: true - '@cloudflare/workerd-darwin-64@1.20260128.0': - resolution: {integrity: sha512-XJN8zWWNG3JwAUqqwMLNKJ9fZfdlQkx/zTTHW/BB8wHat9LjKD6AzxqCu432YmfjR+NxEKCzUOxMu1YOxlVxmg==} + '@cloudflare/workerd-darwin-64@1.20260205.0': + resolution: {integrity: sha512-ToOItqcirmWPwR+PtT+Q4bdjTn/63ZxhJKEfW4FNn7FxMTS1Tw5dml0T0mieOZbCpcvY8BdvPKFCSlJuI8IVHQ==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20260128.0': - resolution: {integrity: sha512-vKnRcmnm402GQ5DOdfT5H34qeR2m07nhnTtky8mTkNWP+7xmkz32AMdclwMmfO/iX9ncyKwSqmml2wPG32eq/w==} + '@cloudflare/workerd-darwin-arm64@1.20260205.0': + resolution: {integrity: sha512-402ZqLz+LrG0NDXp7Hn7IZbI0DyhjNfjAlVenb0K3yod9KCuux0u3NksNBvqJx0mIGHvVR4K05h+jfT5BTHqGA==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20260128.0': - resolution: {integrity: sha512-RiaR+Qugof/c6oI5SagD2J5wJmIfI8wQWaV2Y9905Raj6sAYOFaEKfzkKnoLLLNYb4NlXicBrffJi1j7R/ypUA==} + '@cloudflare/workerd-linux-64@1.20260205.0': + resolution: {integrity: sha512-rz9jBzazIA18RHY+osa19hvsPfr0LZI1AJzIjC6UqkKKphcTpHBEQ25Xt8cIA34ivMIqeENpYnnmpDFesLkfcQ==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20260128.0': - resolution: {integrity: sha512-U39U9vcXLXYDbrJ112Q7D0LDUUnM54oXfAxPgrL2goBwio7Z6RnsM25TRvm+Q06F4+FeDOC4D51JXlFHb9t1OA==} + '@cloudflare/workerd-linux-arm64@1.20260205.0': + resolution: {integrity: sha512-jr6cKpMM/DBEbL+ATJ9rYue758CKp0SfA/nXt5vR32iINVJrb396ye9iat2y9Moa/PgPKnTrFgmT6urUmG3IUg==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20260128.0': - resolution: {integrity: sha512-fdJwSqRkJsAJFJ7+jy0th2uMO6fwaDA8Ny6+iFCssfzlNkc4dP/twXo+3F66FMLMe/6NIqjzVts0cpiv7ERYbQ==} + '@cloudflare/workerd-windows-64@1.20260205.0': + resolution: {integrity: sha512-SMPW5jCZYOG7XFIglSlsgN8ivcl0pCrSAYxCwxtWvZ88whhcDB/aISNtiQiDZujPH8tIo2hE5dEkxW7tGEwc3A==} engines: {node: '>=16'} cpu: [x64] os: [win32] - '@cloudflare/workers-types@4.20260131.0': - resolution: {integrity: sha512-ELgvb2mp68Al50p+FmpgCO2hgU5o4tmz8pi7kShN+cRXc0UZoEdxpDIikR0CeT7b3tV7wlnEnsUzd0UoJLS0oQ==} + '@cloudflare/workers-types@4.20260206.0': + resolution: {integrity: sha512-rHbE1XM3mfwzoyOiKm1oFRTp00Cv4U5UiuMDQwmu/pc79yOA3nDiOC0lue8aOpobBrP4tPHQqsPcWG606Zrw/w==} '@connectrpc/connect-web@2.0.0-rc.3': resolution: {integrity: sha512-w88P8Lsn5CCsA7MFRl2e6oLY4J/5toiNtJns/YJrlyQaWOy3RO8pDgkz+iIkG98RPMhj2thuBvsd3Cn4DKKCkw==} @@ -840,14 +840,14 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@daytonaio/api-client@0.138.0': - resolution: {integrity: sha512-mKO3Aqk2aCnOw4ej+UxvKE+Z1ixmo9OKTAFElkvRb6UOwb5zioudqTyqEfijkA2tXUXO8yPGhQDPaICLgpPopA==} + '@daytonaio/api-client@0.139.0': + resolution: {integrity: sha512-Xmjrkq7MW/DaZLQEf0HfT7Y38N8SesXvWqAKSEjdf3ifGVQVx37aOB8El1jOvfrndqzTcSbumSxro2nhKK5K5A==} - '@daytonaio/sdk@0.138.0': - resolution: {integrity: sha512-cnbsflZYJ1NA4pQ2uX2lLN4w4ZQsO/xqdGDnpmwSu/LIW5F+O5gA8z4mfuWdIRcFFT4UhIpTzMuh3zRwxH7dIw==} + '@daytonaio/sdk@0.139.0': + resolution: {integrity: sha512-67NSkhnl9NiUgBfheN5AtkH0/T5U+WTZmGlY2k+ujAAl/ntpyA/T/q+Pznk44oCJyM1O39OEWt/ugmAEyqRWLg==} - '@daytonaio/toolbox-api-client@0.138.0': - resolution: {integrity: sha512-unM9e7MOQiyDXdY8hCW1uTctYbxpo/TGZ6L71ZXyS/j2Cnz9/ud4VWBLcQP2VzlC+lrBP2YMrhT90zSSvcNfmA==} + '@daytonaio/toolbox-api-client@0.139.0': + resolution: {integrity: sha512-zLonkWHsdmrwT2qCZ/zBt4dpWNJ7N08eGYjCk30Bihzk4JY0afNBPDqd+pdGdXKtuJ44yCxR4iJyjfWR11J9PA==} '@e2b/code-interpreter@2.3.3': resolution: {integrity: sha512-WOpSwc1WpvxyOijf6WMbR76BUuvd2O9ddXgCHHi65lkuy6YgQGq7oyd8PNsT331O9Tqbccjy6uF4xanSdLX1UA==} @@ -1753,8 +1753,8 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@openai/codex@0.94.0': - resolution: {integrity: sha512-GKOU2ty3NXls2aeiFSCnSSB6zQBtENqC5OnPa8s79Z576YP1r2DIfUrhQZzVDKmFei852E1SG4TNljFL/081gg==} + '@openai/codex@0.98.0': + resolution: {integrity: sha512-CKjrhAmzTvWn7Vbsi27iZRKBAJw9a7ZTTkWQDbLgQZP1weGbDIBk1r6wiLEp1ZmDO7w0fHPLYgnVspiOrYgcxg==} engines: {node: '>=16'} hasBin: true @@ -2239,8 +2239,8 @@ packages: '@types/node@24.10.9': resolution: {integrity: sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==} - '@types/node@25.2.0': - resolution: {integrity: sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==} + '@types/node@25.2.1': + resolution: {integrity: sha512-CPrnr8voK8vC6eEtyRzvMpgp3VyVRhgclonE7qYi6P9sXwYb59ucfrnmFBTaP0yUi8Gk4yZg/LlTJULGxvTNsg==} '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} @@ -2984,11 +2984,13 @@ packages: glob@10.5.0: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + 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 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 gopd@1.2.0: @@ -3383,8 +3385,8 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - miniflare@4.20260128.0: - resolution: {integrity: sha512-AVCn3vDRY+YXu1sP4mRn81ssno6VUqxo29uY2QVfgxXU2TMLvhRIoGwm7RglJ3Gzfuidit5R86CMQ6AvdFTGAw==} + miniflare@4.20260205.0: + resolution: {integrity: sha512-jG1TknEDeFqcq/z5gsOm1rKeg4cNG7ruWxEuiPxl3pnQumavxo8kFpeQC6XKVpAhh2PI9ODGyIYlgd77sTHl5g==} engines: {node: '>=18.0.0'} hasBin: true @@ -3973,7 +3975,7 @@ packages: tar@7.5.6: resolution: {integrity: sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==} engines: {node: '>=18'} - deprecated: Old versions of tar 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 exhorbitant rates) by contacting i@izs.me + deprecated: Old versions of tar 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 text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} @@ -4417,17 +4419,17 @@ packages: resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} engines: {node: '>=18'} - workerd@1.20260128.0: - resolution: {integrity: sha512-EhLJGptSGFi8AEErLiamO3PoGpbRqL+v4Ve36H2B38VxmDgFOSmDhfepBnA14sCQzGf1AEaoZX2DCwZsmO74yQ==} + workerd@1.20260205.0: + resolution: {integrity: sha512-CcMH5clHwrH8VlY7yWS9C/G/C8g9czIz1yU3akMSP9Z3CkEMFSoC3GGdj5G7Alw/PHEeez1+1IrlYger4pwu+w==} engines: {node: '>=16'} hasBin: true - wrangler@4.61.1: - resolution: {integrity: sha512-hfYQ16VLPkNi8xE1/V3052S2stM5e+vq3Idpt83sXoDC3R7R1CLgMkK6M6+Qp3G+9GVDNyHCkvohMPdfFTaD4Q==} + wrangler@4.63.0: + resolution: {integrity: sha512-+R04jF7Eb8K3KRMSgoXpcIdLb8GC62eoSGusYh1pyrSMm/10E0hbKkd7phMJO4HxXc6R7mOHC5SSoX9eof30Uw==} engines: {node: '>=20.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20260128.0 + '@cloudflare/workers-types': ^4.20260205.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -4548,7 +4550,7 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@anthropic-ai/claude-code@2.1.29': + '@anthropic-ai/claude-code@2.1.34': optionalDependencies: '@img/sharp-darwin-arm64': 0.33.5 '@img/sharp-darwin-x64': 0.33.5 @@ -4593,15 +4595,15 @@ snapshots: dependencies: prismjs: 1.30.0 - '@astrojs/react@4.4.2(@types/node@25.2.0)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(jiti@1.21.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tsx@4.21.0)(yaml@2.8.2)': + '@astrojs/react@4.4.2(@types/node@25.2.1)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(jiti@1.21.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tsx@4.21.0)(yaml@2.8.2)': dependencies: '@types/react': 18.3.27 '@types/react-dom': 18.3.7(@types/react@18.3.27) - '@vitejs/plugin-react': 4.7.0(vite@6.4.1(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2)) + '@vitejs/plugin-react': 4.7.0(vite@6.4.1(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2)) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) ultrahtml: 1.6.0 - vite: 6.4.1(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -4616,9 +4618,9 @@ snapshots: - tsx - yaml - '@astrojs/tailwind@6.0.2(astro@5.16.15(@types/node@25.2.0)(jiti@1.21.7)(rollup@4.56.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.8.2))': + '@astrojs/tailwind@6.0.2(astro@5.16.15(@types/node@25.2.1)(jiti@1.21.7)(rollup@4.56.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.8.2))': dependencies: - astro: 5.16.15(@types/node@25.2.0)(jiti@1.21.7)(rollup@4.56.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + astro: 5.16.15(@types/node@25.2.1)(jiti@1.21.7)(rollup@4.56.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) autoprefixer: 10.4.23(postcss@8.5.6) postcss: 8.5.6 postcss-load-config: 4.0.2(postcss@8.5.6) @@ -5310,28 +5312,28 @@ snapshots: dependencies: '@cloudflare/containers': 0.0.30 - '@cloudflare/unenv-preset@2.12.0(unenv@2.0.0-rc.24)(workerd@1.20260128.0)': + '@cloudflare/unenv-preset@2.12.0(unenv@2.0.0-rc.24)(workerd@1.20260205.0)': dependencies: unenv: 2.0.0-rc.24 optionalDependencies: - workerd: 1.20260128.0 + workerd: 1.20260205.0 - '@cloudflare/workerd-darwin-64@1.20260128.0': + '@cloudflare/workerd-darwin-64@1.20260205.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20260128.0': + '@cloudflare/workerd-darwin-arm64@1.20260205.0': optional: true - '@cloudflare/workerd-linux-64@1.20260128.0': + '@cloudflare/workerd-linux-64@1.20260205.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20260128.0': + '@cloudflare/workerd-linux-arm64@1.20260205.0': optional: true - '@cloudflare/workerd-windows-64@1.20260128.0': + '@cloudflare/workerd-windows-64@1.20260205.0': optional: true - '@cloudflare/workers-types@4.20260131.0': {} + '@cloudflare/workers-types@4.20260206.0': {} '@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.11.0)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.11.0))': dependencies: @@ -5346,18 +5348,18 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@daytonaio/api-client@0.138.0': + '@daytonaio/api-client@0.139.0': dependencies: axios: 1.13.4 transitivePeerDependencies: - debug - '@daytonaio/sdk@0.138.0(ws@8.19.0)': + '@daytonaio/sdk@0.139.0(ws@8.19.0)': dependencies: '@aws-sdk/client-s3': 3.975.0 '@aws-sdk/lib-storage': 3.975.0(@aws-sdk/client-s3@3.975.0) - '@daytonaio/api-client': 0.138.0 - '@daytonaio/toolbox-api-client': 0.138.0 + '@daytonaio/api-client': 0.139.0 + '@daytonaio/toolbox-api-client': 0.139.0 '@iarna/toml': 2.2.5 axios: 1.13.4 busboy: 1.6.0 @@ -5374,7 +5376,7 @@ snapshots: - debug - ws - '@daytonaio/toolbox-api-client@0.138.0': + '@daytonaio/toolbox-api-client@0.139.0': dependencies: axios: 1.13.4 transitivePeerDependencies: @@ -5927,7 +5929,7 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@openai/codex@0.94.0': {} + '@openai/codex@0.98.0': {} '@oslojs/encoding@1.1.0': {} @@ -6463,13 +6465,13 @@ snapshots: '@types/docker-modem@3.0.6': dependencies: - '@types/node': 25.2.0 + '@types/node': 25.2.1 '@types/ssh2': 1.15.5 '@types/dockerode@4.0.1': dependencies: '@types/docker-modem': 3.0.6 - '@types/node': 25.2.0 + '@types/node': 25.2.1 '@types/ssh2': 1.15.5 '@types/estree@1.0.8': {} @@ -6502,7 +6504,7 @@ snapshots: dependencies: undici-types: 7.16.0 - '@types/node@25.2.0': + '@types/node@25.2.1': dependencies: undici-types: 7.16.0 @@ -6544,7 +6546,7 @@ snapshots: - bare-abort-controller - react-native-b4a - '@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@25.2.0))': + '@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@25.2.1))': dependencies: '@babel/core': 7.28.6 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.6) @@ -6552,11 +6554,11 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 5.4.21(@types/node@25.2.0) + vite: 5.4.21(@types/node@25.2.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.28.6 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.6) @@ -6564,7 +6566,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -6576,13 +6578,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@5.4.21(@types/node@25.2.0))': + '@vitest/mocker@3.2.4(vite@5.4.21(@types/node@25.2.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 5.4.21(@types/node@25.2.0) + vite: 5.4.21(@types/node@25.2.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -6649,7 +6651,7 @@ snapshots: assertion-error@2.0.1: {} - astro@5.16.15(@types/node@25.2.0)(jiti@1.21.7)(rollup@4.56.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2): + astro@5.16.15(@types/node@25.2.1)(jiti@1.21.7)(rollup@4.56.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2): dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/internal-helpers': 0.7.5 @@ -6706,8 +6708,8 @@ snapshots: unist-util-visit: 5.1.0 unstorage: 1.17.4 vfile: 6.0.3 - vite: 6.4.1(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) - vitefu: 1.1.1(vite@6.4.1(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2)) + vite: 6.4.1(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) + vitefu: 1.1.1(vite@6.4.1(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.3 @@ -8052,12 +8054,12 @@ snapshots: mimic-fn@4.0.0: {} - miniflare@4.20260128.0: + miniflare@4.20260205.0: dependencies: '@cspotcode/source-map-support': 0.8.1 sharp: 0.34.5 undici: 7.18.2 - workerd: 1.20260128.0 + workerd: 1.20260205.0 ws: 8.18.0 youch: 4.1.0-beta.10 transitivePeerDependencies: @@ -8323,7 +8325,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 25.2.0 + '@types/node': 25.2.1 long: 5.3.2 proxy-from-env@1.1.0: {} @@ -9036,13 +9038,13 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2): + vite-node@3.2.4(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.4.1(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -9066,13 +9068,13 @@ snapshots: '@types/node': 22.19.7 fsevents: 2.3.3 - vite@5.4.21(@types/node@25.2.0): + vite@5.4.21(@types/node@25.2.1): dependencies: esbuild: 0.21.5 postcss: 8.5.6 rollup: 4.56.0 optionalDependencies: - '@types/node': 25.2.0 + '@types/node': 25.2.1 fsevents: 2.3.3 vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2): @@ -9090,7 +9092,7 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 - vite@6.4.1(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2): + vite@6.4.1(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -9099,21 +9101,21 @@ snapshots: rollup: 4.56.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.2.0 + '@types/node': 25.2.1 fsevents: 2.3.3 jiti: 1.21.7 tsx: 4.21.0 yaml: 2.8.2 - vitefu@1.1.1(vite@6.4.1(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2)): + vitefu@1.1.1(vite@6.4.1(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2)): optionalDependencies: - vite: 6.4.1(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.7)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@5.4.21(@types/node@25.2.0)) + '@vitest/mocker': 3.2.4(vite@5.4.21(@types/node@25.2.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -9151,11 +9153,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@5.4.21(@types/node@25.2.0)) + '@vitest/mocker': 3.2.4(vite@5.4.21(@types/node@25.2.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -9173,12 +9175,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 5.4.21(@types/node@25.2.0) - vite-node: 3.2.4(@types/node@25.2.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) + vite: 5.4.21(@types/node@25.2.1) + vite-node: 3.2.4(@types/node@25.2.1)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 25.2.0 + '@types/node': 25.2.1 transitivePeerDependencies: - jiti - less @@ -9220,26 +9222,26 @@ snapshots: dependencies: string-width: 7.2.0 - workerd@1.20260128.0: + workerd@1.20260205.0: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20260128.0 - '@cloudflare/workerd-darwin-arm64': 1.20260128.0 - '@cloudflare/workerd-linux-64': 1.20260128.0 - '@cloudflare/workerd-linux-arm64': 1.20260128.0 - '@cloudflare/workerd-windows-64': 1.20260128.0 + '@cloudflare/workerd-darwin-64': 1.20260205.0 + '@cloudflare/workerd-darwin-arm64': 1.20260205.0 + '@cloudflare/workerd-linux-64': 1.20260205.0 + '@cloudflare/workerd-linux-arm64': 1.20260205.0 + '@cloudflare/workerd-windows-64': 1.20260205.0 - wrangler@4.61.1(@cloudflare/workers-types@4.20260131.0): + wrangler@4.63.0(@cloudflare/workers-types@4.20260206.0): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 - '@cloudflare/unenv-preset': 2.12.0(unenv@2.0.0-rc.24)(workerd@1.20260128.0) + '@cloudflare/unenv-preset': 2.12.0(unenv@2.0.0-rc.24)(workerd@1.20260205.0) blake3-wasm: 2.1.5 esbuild: 0.27.0 - miniflare: 4.20260128.0 + miniflare: 4.20260205.0 path-to-regexp: 6.3.0 unenv: 2.0.0-rc.24 - workerd: 1.20260128.0 + workerd: 1.20260205.0 optionalDependencies: - '@cloudflare/workers-types': 4.20260131.0 + '@cloudflare/workers-types': 4.20260206.0 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil diff --git a/scripts/release/sdk.ts b/scripts/release/sdk.ts index 27285eb..23c468f 100644 --- a/scripts/release/sdk.ts +++ b/scripts/release/sdk.ts @@ -24,11 +24,11 @@ const CLI_PACKAGES = [ "@sandbox-agent/cli-darwin-x64", "@sandbox-agent/cli-darwin-arm64", "gigacode", - "gigacode-linux-x64", - "gigacode-linux-arm64", - "gigacode-win32-x64", - "gigacode-darwin-x64", - "gigacode-darwin-arm64", + "@sandbox-agent/gigacode-linux-x64", + "@sandbox-agent/gigacode-linux-arm64", + "@sandbox-agent/gigacode-win32-x64", + "@sandbox-agent/gigacode-darwin-x64", + "@sandbox-agent/gigacode-darwin-arm64", ] as const; // Mapping from npm package name to Rust target and binary extension @@ -61,27 +61,27 @@ const CLI_PLATFORM_MAP: Record< binaryExt: "", binaryName: "sandbox-agent", }, - "gigacode-linux-x64": { + "@sandbox-agent/gigacode-linux-x64": { target: "x86_64-unknown-linux-musl", binaryExt: "", binaryName: "gigacode", }, - "gigacode-linux-arm64": { + "@sandbox-agent/gigacode-linux-arm64": { target: "aarch64-unknown-linux-musl", binaryExt: "", binaryName: "gigacode", }, - "gigacode-win32-x64": { + "@sandbox-agent/gigacode-win32-x64": { target: "x86_64-pc-windows-gnu", binaryExt: ".exe", binaryName: "gigacode", }, - "gigacode-darwin-x64": { + "@sandbox-agent/gigacode-darwin-x64": { target: "x86_64-apple-darwin", binaryExt: "", binaryName: "gigacode", }, - "gigacode-darwin-arm64": { + "@sandbox-agent/gigacode-darwin-arm64": { target: "aarch64-apple-darwin", binaryExt: "", binaryName: "gigacode", @@ -307,9 +307,9 @@ export async function publishNpmCli(opts: ReleaseOpts) { // Platform-specific packages: @sandbox-agent/cli-linux-x64 -> sdks/cli/platforms/linux-x64 const platform = packageName.replace("@sandbox-agent/cli-", ""); packagePath = join(opts.root, "sdks/cli/platforms", platform); - } else if (packageName.startsWith("gigacode-")) { - // Platform-specific packages: gigacode-linux-x64 -> sdks/gigacode/platforms/linux-x64 - const platform = packageName.replace("gigacode-", ""); + } else if (packageName.startsWith("@sandbox-agent/gigacode-")) { + // Platform-specific packages: @sandbox-agent/gigacode-linux-x64 -> sdks/gigacode/platforms/linux-x64 + const platform = packageName.replace("@sandbox-agent/gigacode-", ""); packagePath = join(opts.root, "sdks/gigacode/platforms", platform); } else { throw new Error(`Unknown CLI package: ${packageName}`); diff --git a/sdks/gigacode/bin/gigacode b/sdks/gigacode/bin/gigacode index 53f2cf5..204a935 100644 --- a/sdks/gigacode/bin/gigacode +++ b/sdks/gigacode/bin/gigacode @@ -8,7 +8,7 @@ const fs = require("fs"); const path = require("path"); const TRUST_PACKAGES = - "gigacode-linux-x64 gigacode-linux-arm64 gigacode-darwin-arm64 gigacode-darwin-x64 gigacode-win32-x64"; + "@sandbox-agent/gigacode-linux-x64 @sandbox-agent/gigacode-linux-arm64 @sandbox-agent/gigacode-darwin-arm64 @sandbox-agent/gigacode-darwin-x64 @sandbox-agent/gigacode-win32-x64"; function formatHint(binPath) { return formatNonExecutableBinaryMessage({ @@ -35,11 +35,11 @@ function formatHint(binPath) { } const PLATFORMS = { - "darwin-arm64": "gigacode-darwin-arm64", - "darwin-x64": "gigacode-darwin-x64", - "linux-x64": "gigacode-linux-x64", - "linux-arm64": "gigacode-linux-arm64", - "win32-x64": "gigacode-win32-x64", + "darwin-arm64": "@sandbox-agent/gigacode-darwin-arm64", + "darwin-x64": "@sandbox-agent/gigacode-darwin-x64", + "linux-x64": "@sandbox-agent/gigacode-linux-x64", + "linux-arm64": "@sandbox-agent/gigacode-linux-arm64", + "win32-x64": "@sandbox-agent/gigacode-win32-x64", }; const key = `${process.platform}-${process.arch}`; diff --git a/sdks/gigacode/package.json b/sdks/gigacode/package.json index 90affe4..44c3025 100644 --- a/sdks/gigacode/package.json +++ b/sdks/gigacode/package.json @@ -20,11 +20,11 @@ "vitest": "^3.0.0" }, "optionalDependencies": { - "gigacode-linux-x64": "workspace:*", - "gigacode-linux-arm64": "workspace:*", - "gigacode-darwin-arm64": "workspace:*", - "gigacode-darwin-x64": "workspace:*", - "gigacode-win32-x64": "workspace:*" + "@sandbox-agent/gigacode-linux-x64": "workspace:*", + "@sandbox-agent/gigacode-linux-arm64": "workspace:*", + "@sandbox-agent/gigacode-darwin-arm64": "workspace:*", + "@sandbox-agent/gigacode-darwin-x64": "workspace:*", + "@sandbox-agent/gigacode-win32-x64": "workspace:*" }, "files": [ "bin" diff --git a/sdks/gigacode/platforms/darwin-arm64/package.json b/sdks/gigacode/platforms/darwin-arm64/package.json index 99d30ff..2683489 100644 --- a/sdks/gigacode/platforms/darwin-arm64/package.json +++ b/sdks/gigacode/platforms/darwin-arm64/package.json @@ -1,5 +1,5 @@ { - "name": "gigacode-darwin-arm64", + "name": "@sandbox-agent/gigacode-darwin-arm64", "version": "0.1.6", "description": "gigacode CLI binary for macOS arm64", "license": "Apache-2.0", diff --git a/sdks/gigacode/platforms/darwin-x64/package.json b/sdks/gigacode/platforms/darwin-x64/package.json index 791cb1b..bf13111 100644 --- a/sdks/gigacode/platforms/darwin-x64/package.json +++ b/sdks/gigacode/platforms/darwin-x64/package.json @@ -1,5 +1,5 @@ { - "name": "gigacode-darwin-x64", + "name": "@sandbox-agent/gigacode-darwin-x64", "version": "0.1.6", "description": "gigacode CLI binary for macOS x64", "license": "Apache-2.0", diff --git a/sdks/gigacode/platforms/linux-arm64/package.json b/sdks/gigacode/platforms/linux-arm64/package.json index 1a4d799..ad00cf5 100644 --- a/sdks/gigacode/platforms/linux-arm64/package.json +++ b/sdks/gigacode/platforms/linux-arm64/package.json @@ -1,5 +1,5 @@ { - "name": "gigacode-linux-arm64", + "name": "@sandbox-agent/gigacode-linux-arm64", "version": "0.1.6", "description": "gigacode CLI binary for Linux arm64", "license": "Apache-2.0", diff --git a/sdks/gigacode/platforms/linux-x64/package.json b/sdks/gigacode/platforms/linux-x64/package.json index c7950dd..02028dd 100644 --- a/sdks/gigacode/platforms/linux-x64/package.json +++ b/sdks/gigacode/platforms/linux-x64/package.json @@ -1,5 +1,5 @@ { - "name": "gigacode-linux-x64", + "name": "@sandbox-agent/gigacode-linux-x64", "version": "0.1.6", "description": "gigacode CLI binary for Linux x64", "license": "Apache-2.0", diff --git a/sdks/gigacode/platforms/win32-x64/package.json b/sdks/gigacode/platforms/win32-x64/package.json index 1658a1b..8e87ab9 100644 --- a/sdks/gigacode/platforms/win32-x64/package.json +++ b/sdks/gigacode/platforms/win32-x64/package.json @@ -1,5 +1,5 @@ { - "name": "gigacode-win32-x64", + "name": "@sandbox-agent/gigacode-win32-x64", "version": "0.1.6", "description": "gigacode CLI binary for Windows x64", "license": "Apache-2.0", From f0191579c032e197b0b567ed5b5a2be90094c2c1 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 6 Feb 2026 03:09:23 -0800 Subject: [PATCH 11/19] chore: rename gigacode to @sandbox-agent/gigacode (#105) --- README.md | 11 ----------- .../packages/website/src/components/GetStarted.tsx | 2 +- gigacode/README.md | 8 ++++---- scripts/release/sdk.ts | 4 ++-- sdks/gigacode/bin/gigacode | 4 ++-- sdks/gigacode/package.json | 2 +- 6 files changed, 10 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index aac18f7..4dd5590 100644 --- a/README.md +++ b/README.md @@ -193,17 +193,6 @@ npx sandbox-agent --help bunx sandbox-agent --help ``` -Quick OpenCode attach (runs `sandbox-agent opencode` by default): - -```bash -npx gigacode --token "$SANDBOX_TOKEN" -``` - -```bash -npm install -g gigacode -gigacode --token "$SANDBOX_TOKEN" -``` - [CLI documentation](https://sandboxagent.dev/docs/cli) ### Inspector diff --git a/frontend/packages/website/src/components/GetStarted.tsx b/frontend/packages/website/src/components/GetStarted.tsx index f89a798..ee816d4 100644 --- a/frontend/packages/website/src/components/GetStarted.tsx +++ b/frontend/packages/website/src/components/GetStarted.tsx @@ -104,7 +104,7 @@ export function GetStarted() { Choose the installation method that works best for your use case.

- Quick OpenCode attach: npx gigacode + Quick OpenCode attach: npx @sandbox-agent/gigacode

diff --git a/gigacode/README.md b/gigacode/README.md index 6a0035c..3ebbd89 100644 --- a/gigacode/README.md +++ b/gigacode/README.md @@ -51,14 +51,14 @@ curl -fsSL https://releases.rivet.dev/sandbox-agent/latest/gigacode-install.sh | **npm i -g** ```bash -npm install -g gigacode +npm install -g @sandbox-agent/gigacode gigacode --help ``` **bun add -g** ```bash -bun add -g gigacode +bun add -g @sandbox-agent/gigacode # Allow Bun to run postinstall scripts for native binaries. bun pm -g trust @sandbox-agent/gigacode-linux-x64 @sandbox-agent/gigacode-linux-arm64 @sandbox-agent/gigacode-darwin-arm64 @sandbox-agent/gigacode-darwin-x64 @sandbox-agent/gigacode-win32-x64 gigacode --help @@ -67,13 +67,13 @@ gigacode --help **npx** ```bash -npx gigacode --help +npx @sandbox-agent/gigacode --help ``` **bunx** ```bash -bunx gigacode --help +bunx @sandbox-agent/gigacode --help ``` > **Note:** Windows is unsupported. Please use [WSL](https://learn.microsoft.com/en-us/windows/wsl/install). diff --git a/scripts/release/sdk.ts b/scripts/release/sdk.ts index 23c468f..68d0dfc 100644 --- a/scripts/release/sdk.ts +++ b/scripts/release/sdk.ts @@ -23,7 +23,7 @@ const CLI_PACKAGES = [ "@sandbox-agent/cli-win32-x64", "@sandbox-agent/cli-darwin-x64", "@sandbox-agent/cli-darwin-arm64", - "gigacode", + "@sandbox-agent/gigacode", "@sandbox-agent/gigacode-linux-x64", "@sandbox-agent/gigacode-linux-arm64", "@sandbox-agent/gigacode-win32-x64", @@ -301,7 +301,7 @@ export async function publishNpmCli(opts: ReleaseOpts) { let packagePath: string; if (packageName === "@sandbox-agent/cli") { packagePath = join(opts.root, "sdks/cli"); - } else if (packageName === "gigacode") { + } else if (packageName === "@sandbox-agent/gigacode") { packagePath = join(opts.root, "sdks/gigacode"); } else if (packageName.startsWith("@sandbox-agent/cli-")) { // Platform-specific packages: @sandbox-agent/cli-linux-x64 -> sdks/cli/platforms/linux-x64 diff --git a/sdks/gigacode/bin/gigacode b/sdks/gigacode/bin/gigacode index 204a935..0fd87cc 100644 --- a/sdks/gigacode/bin/gigacode +++ b/sdks/gigacode/bin/gigacode @@ -20,14 +20,14 @@ function formatHint(binPath) { label: "Project install", commands: [ `bun pm trust ${TRUST_PACKAGES}`, - "bun add gigacode", + "bun add @sandbox-agent/gigacode", ], }, { label: "Global install", commands: [ `bun pm -g trust ${TRUST_PACKAGES}`, - "bun add -g gigacode", + "bun add -g @sandbox-agent/gigacode", ], }, ], diff --git a/sdks/gigacode/package.json b/sdks/gigacode/package.json index 44c3025..202a612 100644 --- a/sdks/gigacode/package.json +++ b/sdks/gigacode/package.json @@ -1,5 +1,5 @@ { - "name": "gigacode", + "name": "@sandbox-agent/gigacode", "version": "0.1.6", "description": "Gigacode CLI (sandbox-agent with OpenCode attach by default)", "license": "Apache-2.0", From 2a00a03eca4f9c40c509290344d49a5b996f9695 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 6 Feb 2026 03:27:32 -0800 Subject: [PATCH 12/19] chore: cargo fmt --- Cargo.toml | 14 ++--- gigacode/src/main.rs | 2 +- sdks/cli-shared/package.json | 2 +- sdks/cli/package.json | 2 +- sdks/cli/platforms/darwin-arm64/package.json | 2 +- sdks/cli/platforms/darwin-x64/package.json | 2 +- sdks/cli/platforms/linux-arm64/package.json | 2 +- sdks/cli/platforms/linux-x64/package.json | 2 +- sdks/cli/platforms/win32-x64/package.json | 2 +- sdks/gigacode/package.json | 2 +- .../platforms/darwin-arm64/package.json | 2 +- .../platforms/darwin-x64/package.json | 2 +- .../platforms/linux-arm64/package.json | 2 +- .../gigacode/platforms/linux-x64/package.json | 2 +- .../gigacode/platforms/win32-x64/package.json | 2 +- sdks/typescript/package.json | 2 +- server/packages/sandbox-agent/src/cli.rs | 33 +++++++----- server/packages/sandbox-agent/src/daemon.rs | 11 +--- server/packages/sandbox-agent/src/lib.rs | 2 +- .../sandbox-agent/src/opencode_compat.rs | 51 +++++++++---------- server/packages/sandbox-agent/src/router.rs | 41 +++++++-------- .../packages/sandbox-agent/src/telemetry.rs | 7 ++- 22 files changed, 96 insertions(+), 93 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b6812cc..de0ee67 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ resolver = "2" members = ["server/packages/*", "gigacode"] [workspace.package] -version = "0.1.6" +version = "0.1.7-rc.1" edition = "2021" authors = [ "Rivet Gaming, LLC " ] license = "Apache-2.0" @@ -12,12 +12,12 @@ description = "Universal API for automatic coding agents in sandboxes. Supprots [workspace.dependencies] # Internal crates -sandbox-agent = { version = "0.1.6", path = "server/packages/sandbox-agent" } -sandbox-agent-error = { version = "0.1.6", path = "server/packages/error" } -sandbox-agent-agent-management = { version = "0.1.6", path = "server/packages/agent-management" } -sandbox-agent-agent-credentials = { version = "0.1.6", path = "server/packages/agent-credentials" } -sandbox-agent-universal-agent-schema = { version = "0.1.6", path = "server/packages/universal-agent-schema" } -sandbox-agent-extracted-agent-schemas = { version = "0.1.6", path = "server/packages/extracted-agent-schemas" } +sandbox-agent = { version = "0.1.7-rc.1", path = "server/packages/sandbox-agent" } +sandbox-agent-error = { version = "0.1.7-rc.1", path = "server/packages/error" } +sandbox-agent-agent-management = { version = "0.1.7-rc.1", path = "server/packages/agent-management" } +sandbox-agent-agent-credentials = { version = "0.1.7-rc.1", path = "server/packages/agent-credentials" } +sandbox-agent-universal-agent-schema = { version = "0.1.7-rc.1", path = "server/packages/universal-agent-schema" } +sandbox-agent-extracted-agent-schemas = { version = "0.1.7-rc.1", path = "server/packages/extracted-agent-schemas" } # Serialization serde = { version = "1.0", features = ["derive"] } diff --git a/gigacode/src/main.rs b/gigacode/src/main.rs index 5aa64c0..87e93aa 100644 --- a/gigacode/src/main.rs +++ b/gigacode/src/main.rs @@ -1,6 +1,6 @@ use clap::Parser; use sandbox_agent::cli::{ - CliConfig, CliError, Command, GigacodeCli, OpencodeArgs, init_logging, run_command, + init_logging, run_command, CliConfig, CliError, Command, GigacodeCli, OpencodeArgs, }; fn main() { diff --git a/sdks/cli-shared/package.json b/sdks/cli-shared/package.json index 0c041d1..38e3cf4 100644 --- a/sdks/cli-shared/package.json +++ b/sdks/cli-shared/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/cli-shared", - "version": "0.1.6", + "version": "0.1.7-rc.1", "description": "Shared helpers for sandbox-agent CLI and SDK", "license": "Apache-2.0", "repository": { diff --git a/sdks/cli/package.json b/sdks/cli/package.json index fde9b8b..e04199f 100644 --- a/sdks/cli/package.json +++ b/sdks/cli/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/cli", - "version": "0.1.6", + "version": "0.1.7-rc.1", "description": "CLI for sandbox-agent - run AI coding agents in sandboxes", "license": "Apache-2.0", "repository": { diff --git a/sdks/cli/platforms/darwin-arm64/package.json b/sdks/cli/platforms/darwin-arm64/package.json index cfff424..2b8a23c 100644 --- a/sdks/cli/platforms/darwin-arm64/package.json +++ b/sdks/cli/platforms/darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/cli-darwin-arm64", - "version": "0.1.6", + "version": "0.1.7-rc.1", "description": "sandbox-agent CLI binary for macOS ARM64", "license": "Apache-2.0", "repository": { diff --git a/sdks/cli/platforms/darwin-x64/package.json b/sdks/cli/platforms/darwin-x64/package.json index 8fa6330..e0c51aa 100644 --- a/sdks/cli/platforms/darwin-x64/package.json +++ b/sdks/cli/platforms/darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/cli-darwin-x64", - "version": "0.1.6", + "version": "0.1.7-rc.1", "description": "sandbox-agent CLI binary for macOS x64", "license": "Apache-2.0", "repository": { diff --git a/sdks/cli/platforms/linux-arm64/package.json b/sdks/cli/platforms/linux-arm64/package.json index 41db961..1305908 100644 --- a/sdks/cli/platforms/linux-arm64/package.json +++ b/sdks/cli/platforms/linux-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/cli-linux-arm64", - "version": "0.1.6", + "version": "0.1.7-rc.1", "description": "sandbox-agent CLI binary for Linux arm64", "license": "Apache-2.0", "repository": { diff --git a/sdks/cli/platforms/linux-x64/package.json b/sdks/cli/platforms/linux-x64/package.json index 28e3b13..e248dd2 100644 --- a/sdks/cli/platforms/linux-x64/package.json +++ b/sdks/cli/platforms/linux-x64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/cli-linux-x64", - "version": "0.1.6", + "version": "0.1.7-rc.1", "description": "sandbox-agent CLI binary for Linux x64", "license": "Apache-2.0", "repository": { diff --git a/sdks/cli/platforms/win32-x64/package.json b/sdks/cli/platforms/win32-x64/package.json index e1f3001..8c035db 100644 --- a/sdks/cli/platforms/win32-x64/package.json +++ b/sdks/cli/platforms/win32-x64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/cli-win32-x64", - "version": "0.1.6", + "version": "0.1.7-rc.1", "description": "sandbox-agent CLI binary for Windows x64", "license": "Apache-2.0", "repository": { diff --git a/sdks/gigacode/package.json b/sdks/gigacode/package.json index 202a612..6423937 100644 --- a/sdks/gigacode/package.json +++ b/sdks/gigacode/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/gigacode", - "version": "0.1.6", + "version": "0.1.7-rc.1", "description": "Gigacode CLI (sandbox-agent with OpenCode attach by default)", "license": "Apache-2.0", "repository": { diff --git a/sdks/gigacode/platforms/darwin-arm64/package.json b/sdks/gigacode/platforms/darwin-arm64/package.json index 2683489..8cb55c5 100644 --- a/sdks/gigacode/platforms/darwin-arm64/package.json +++ b/sdks/gigacode/platforms/darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/gigacode-darwin-arm64", - "version": "0.1.6", + "version": "0.1.7-rc.1", "description": "gigacode CLI binary for macOS arm64", "license": "Apache-2.0", "repository": { diff --git a/sdks/gigacode/platforms/darwin-x64/package.json b/sdks/gigacode/platforms/darwin-x64/package.json index bf13111..c3808d5 100644 --- a/sdks/gigacode/platforms/darwin-x64/package.json +++ b/sdks/gigacode/platforms/darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/gigacode-darwin-x64", - "version": "0.1.6", + "version": "0.1.7-rc.1", "description": "gigacode CLI binary for macOS x64", "license": "Apache-2.0", "repository": { diff --git a/sdks/gigacode/platforms/linux-arm64/package.json b/sdks/gigacode/platforms/linux-arm64/package.json index ad00cf5..4030a6b 100644 --- a/sdks/gigacode/platforms/linux-arm64/package.json +++ b/sdks/gigacode/platforms/linux-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/gigacode-linux-arm64", - "version": "0.1.6", + "version": "0.1.7-rc.1", "description": "gigacode CLI binary for Linux arm64", "license": "Apache-2.0", "repository": { diff --git a/sdks/gigacode/platforms/linux-x64/package.json b/sdks/gigacode/platforms/linux-x64/package.json index 02028dd..541eebc 100644 --- a/sdks/gigacode/platforms/linux-x64/package.json +++ b/sdks/gigacode/platforms/linux-x64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/gigacode-linux-x64", - "version": "0.1.6", + "version": "0.1.7-rc.1", "description": "gigacode CLI binary for Linux x64", "license": "Apache-2.0", "repository": { diff --git a/sdks/gigacode/platforms/win32-x64/package.json b/sdks/gigacode/platforms/win32-x64/package.json index 8e87ab9..b4f537c 100644 --- a/sdks/gigacode/platforms/win32-x64/package.json +++ b/sdks/gigacode/platforms/win32-x64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/gigacode-win32-x64", - "version": "0.1.6", + "version": "0.1.7-rc.1", "description": "gigacode CLI binary for Windows x64", "license": "Apache-2.0", "repository": { diff --git a/sdks/typescript/package.json b/sdks/typescript/package.json index 8b135bf..84606db 100644 --- a/sdks/typescript/package.json +++ b/sdks/typescript/package.json @@ -1,6 +1,6 @@ { "name": "sandbox-agent", - "version": "0.1.6", + "version": "0.1.7-rc.1", "description": "Universal API for automatic coding agents in sandboxes. Supprots Claude Code, Codex, OpenCode, and Amp.", "license": "Apache-2.0", "repository": { diff --git a/server/packages/sandbox-agent/src/cli.rs b/server/packages/sandbox-agent/src/cli.rs index 8390f46..0f7c50f 100644 --- a/server/packages/sandbox-agent/src/cli.rs +++ b/server/packages/sandbox-agent/src/cli.rs @@ -11,12 +11,10 @@ use clap::{Args, Parser, Subcommand}; mod build_version { include!(concat!(env!("OUT_DIR"), "/version.rs")); } -use reqwest::blocking::Client as HttpClient; -use reqwest::Method; use crate::router::{build_router_with_state, shutdown_servers}; use crate::router::{ - AgentInstallRequest, AppState, AuthConfig, BrandingMode, CreateSessionRequest, - MessageRequest, PermissionReply, PermissionReplyRequest, QuestionReplyRequest, + AgentInstallRequest, AppState, AuthConfig, BrandingMode, CreateSessionRequest, MessageRequest, + PermissionReply, PermissionReplyRequest, QuestionReplyRequest, }; use crate::router::{ AgentListResponse, AgentModelsResponse, AgentModesResponse, CreateSessionResponse, @@ -25,6 +23,8 @@ use crate::router::{ use crate::server_logs::ServerLogs; use crate::telemetry; use crate::ui; +use reqwest::blocking::Client as HttpClient; +use reqwest::Method; use sandbox_agent_agent_management::agents::{AgentId, AgentManager, InstallOptions}; use sandbox_agent_agent_management::credentials::{ extract_all_credentials, AuthType, CredentialExtractionOptions, ExtractedCredentials, @@ -459,7 +459,11 @@ pub fn run_sandbox_agent() -> Result<(), CliError> { token, no_token, } = cli; - let config = CliConfig { token, no_token, gigacode: false }; + let config = CliConfig { + token, + no_token, + gigacode: false, + }; if let Err(err) = init_logging(&command) { eprintln!("failed to init logging: {err}"); return Err(err); @@ -585,7 +589,11 @@ fn run_api(command: &ApiCommand, cli: &CliConfig) -> Result<(), CliError> { } fn run_opencode(cli: &CliConfig, args: &OpencodeArgs) -> Result<(), CliError> { - let name = if cli.gigacode { "Gigacode" } else { "OpenCode command" }; + let name = if cli.gigacode { + "Gigacode" + } else { + "OpenCode command" + }; write_stderr_line(&format!("\nEXPERIMENTAL: Please report bugs to:\n- GitHub: https://github.com/rivet-dev/sandbox-agent/issues\n- Discord: https://rivet.dev/discord\n\n{name} is powered by:\n- OpenCode (TUI): https://opencode.ai/\n- Sandbox Agent SDK (multi-agent compatibility): https://sandboxagent.dev/\n\n"))?; let token = cli.token.clone(); @@ -628,12 +636,8 @@ fn run_opencode(cli: &CliConfig, args: &OpencodeArgs) -> Result<(), CliError> { fn run_daemon(command: &DaemonCommand, cli: &CliConfig) -> Result<(), CliError> { let token = cli.token.as_deref(); match command { - DaemonCommand::Start(args) => { - crate::daemon::start(cli, &args.host, args.port, token) - } - DaemonCommand::Stop(args) => { - crate::daemon::stop(&args.host, args.port) - } + DaemonCommand::Start(args) => crate::daemon::start(cli, &args.host, args.port, token), + DaemonCommand::Stop(args) => crate::daemon::stop(&args.host, args.port), DaemonCommand::Status(args) => { let st = crate::daemon::status(&args.host, args.port, token)?; write_stderr_line(&st.to_string())?; @@ -848,7 +852,10 @@ fn resolve_opencode_bin(explicit: Option<&PathBuf>) -> Result return Ok(PathBuf::from(path)); } if let Some(path) = find_in_path("opencode") { - write_stderr_line(&format!("using opencode binary from PATH: {}", path.display()))?; + write_stderr_line(&format!( + "using opencode binary from PATH: {}", + path.display() + ))?; return Ok(path); } diff --git a/server/packages/sandbox-agent/src/daemon.rs b/server/packages/sandbox-agent/src/daemon.rs index f711f6f..e011d11 100644 --- a/server/packages/sandbox-agent/src/daemon.rs +++ b/server/packages/sandbox-agent/src/daemon.rs @@ -309,12 +309,7 @@ pub fn status(host: &str, port: u16, token: Option<&str>) -> Result, -) -> Result<(), CliError> { +pub fn start(cli: &CliConfig, host: &str, port: u16, token: Option<&str>) -> Result<(), CliError> { let base_url = format!("http://{host}:{port}"); let pid_path = daemon_pid_path(host, port); let log_path = daemon_log_path(host, port); @@ -451,9 +446,7 @@ pub fn ensure_running( // Check build version if !is_version_current(host, port) { let old = read_daemon_version(host, port).unwrap_or_else(|| "unknown".to_string()); - eprintln!( - "daemon outdated (build {old} -> {BUILD_ID}), restarting..." - ); + eprintln!("daemon outdated (build {old} -> {BUILD_ID}), restarting..."); stop(host, port)?; return start(cli, host, port, token); } diff --git a/server/packages/sandbox-agent/src/lib.rs b/server/packages/sandbox-agent/src/lib.rs index 1f9d62c..c77f909 100644 --- a/server/packages/sandbox-agent/src/lib.rs +++ b/server/packages/sandbox-agent/src/lib.rs @@ -1,6 +1,7 @@ //! Sandbox agent core utilities. mod agent_server_logs; +pub mod cli; pub mod credentials; pub mod daemon; pub mod opencode_compat; @@ -8,4 +9,3 @@ pub mod router; pub mod server_logs; pub mod telemetry; pub mod ui; -pub mod cli; diff --git a/server/packages/sandbox-agent/src/opencode_compat.rs b/server/packages/sandbox-agent/src/opencode_compat.rs index e756cce..97dffb6 100644 --- a/server/packages/sandbox-agent/src/opencode_compat.rs +++ b/server/packages/sandbox-agent/src/opencode_compat.rs @@ -414,17 +414,15 @@ async fn ensure_backing_session( .await { Ok(_) => Ok(()), - Err(SandboxError::SessionAlreadyExists { .. }) => { - state - .inner - .session_manager() - .set_session_overrides(session_id, model, variant) - .await - .or_else(|err| match err { - SandboxError::SessionNotFound { .. } => Ok(()), - other => Err(other), - }) - } + Err(SandboxError::SessionAlreadyExists { .. }) => state + .inner + .session_manager() + .set_session_overrides(session_id, model, variant) + .await + .or_else(|err| match err { + SandboxError::SessionNotFound { .. } => Ok(()), + other => Err(other), + }), Err(err) => Err(err), } } @@ -822,8 +820,8 @@ async fn resolve_session_agent( if resolved_agent.is_none() { provider_id = cache.default_group.clone(); model_id = default_model_id.clone(); - resolved_agent = - resolve_agent_from_model(&cache, &provider_id, &model_id).or_else(|| Some(default_agent_id())); + resolved_agent = resolve_agent_from_model(&cache, &provider_id, &model_id) + .or_else(|| Some(default_agent_id())); } let mut resolved_agent_id: Option = None; @@ -1998,7 +1996,11 @@ async fn apply_item_event( let input_value = runtime .tool_args_by_call .get(call_id) - .and_then(|args| tool_input_from_arguments(Some(args.as_str())).as_object().cloned()) + .and_then(|args| { + tool_input_from_arguments(Some(args.as_str())) + .as_object() + .cloned() + }) .map(Value::Object) .unwrap_or_else(|| json!({})); let state_value = json!({ @@ -2066,7 +2068,6 @@ async fn apply_item_event( _ => {} } } - } async fn apply_tool_item_event( @@ -2405,9 +2406,11 @@ async fn apply_item_delta( .unwrap_or_else(|| format!("{}_text", message_id)); let part = build_text_part_with_id(&session_id, &message_id, &part_id, &text); upsert_message_part(&state.opencode, &session_id, &message_id, part.clone()).await; - state - .opencode - .emit_event(part_event_with_delta("message.part.updated", &part, Some(&delta))); + state.opencode.emit_event(part_event_with_delta( + "message.part.updated", + &part, + Some(&delta), + )); let _ = state .opencode .update_runtime(&session_id, |runtime| { @@ -2623,9 +2626,7 @@ async fn oc_config_patch(Json(body): Json) -> impl IntoResponse { responses((status = 200)), tag = "opencode" )] -async fn oc_config_providers( - State(state): State>, -) -> impl IntoResponse { +async fn oc_config_providers(State(state): State>) -> impl IntoResponse { let cache = opencode_model_cache(&state).await; let mut grouped: BTreeMap> = BTreeMap::new(); for entry in &cache.entries { @@ -3950,9 +3951,7 @@ async fn oc_question_reject( responses((status = 200)), tag = "opencode" )] -async fn oc_provider_list( - State(state): State>, -) -> impl IntoResponse { +async fn oc_provider_list(State(state): State>) -> impl IntoResponse { let cache = opencode_model_cache(&state).await; let mut grouped: BTreeMap> = BTreeMap::new(); for entry in &cache.entries { @@ -3999,9 +3998,7 @@ async fn oc_provider_list( responses((status = 200)), tag = "opencode" )] -async fn oc_provider_auth( - State(state): State>, -) -> impl IntoResponse { +async fn oc_provider_auth(State(state): State>) -> impl IntoResponse { let cache = opencode_model_cache(&state).await; let mut auth_map = serde_json::Map::new(); for group_id in cache.group_names.keys() { diff --git a/server/packages/sandbox-agent/src/router.rs b/server/packages/sandbox-agent/src/router.rs index 1563bee..0910da4 100644 --- a/server/packages/sandbox-agent/src/router.rs +++ b/server/packages/sandbox-agent/src/router.rs @@ -91,7 +91,11 @@ impl AppState { Self::with_branding(auth, agent_manager, BrandingMode::default()) } - pub fn with_branding(auth: AuthConfig, agent_manager: AgentManager, branding: BrandingMode) -> Self { + pub fn with_branding( + auth: AuthConfig, + agent_manager: AgentManager, + branding: BrandingMode, + ) -> Self { let agent_manager = Arc::new(agent_manager); let session_manager = Arc::new(SessionManager::new(agent_manager.clone())); session_manager @@ -3392,11 +3396,12 @@ impl SessionManager { "limit": null } }); - let rx = server - .send_request(id, &request) - .ok_or_else(|| SandboxError::StreamError { - message: "failed to send model/list request".to_string(), - })?; + let rx = + server + .send_request(id, &request) + .ok_or_else(|| SandboxError::StreamError { + message: "failed to send model/list request".to_string(), + })?; let result = tokio::time::timeout(Duration::from_secs(30), rx).await; let value = match result { @@ -4758,10 +4763,7 @@ fn parse_opencode_models(value: &Value) -> Option { let mut default_model = None; for provider_id in provider_order { - if let Some(model_id) = default_map - .get(&provider_id) - .and_then(Value::as_str) - { + if let Some(model_id) = default_map.get(&provider_id).and_then(Value::as_str) { default_model = Some(format!("{provider_id}/{model_id}")); break; } @@ -7017,20 +7019,19 @@ fn build_anthropic_headers( AuthType::ApiKey => { let value = reqwest::header::HeaderValue::from_str(&credentials.api_key).map_err(|_| { - SandboxError::StreamError { - message: "invalid anthropic api key header".to_string(), - } - })?; + SandboxError::StreamError { + message: "invalid anthropic api key header".to_string(), + } + })?; headers.insert("x-api-key", value); } AuthType::Oauth => { let value = format!("Bearer {}", credentials.api_key); - let header = - reqwest::header::HeaderValue::from_str(&value).map_err(|_| { - SandboxError::StreamError { - message: "invalid anthropic oauth header".to_string(), - } - })?; + let header = reqwest::header::HeaderValue::from_str(&value).map_err(|_| { + SandboxError::StreamError { + message: "invalid anthropic oauth header".to_string(), + } + })?; headers.insert(reqwest::header::AUTHORIZATION, header); } } diff --git a/server/packages/sandbox-agent/src/telemetry.rs b/server/packages/sandbox-agent/src/telemetry.rs index 6bed31e..9e3079e 100644 --- a/server/packages/sandbox-agent/src/telemetry.rs +++ b/server/packages/sandbox-agent/src/telemetry.rs @@ -135,7 +135,12 @@ fn build_beacon_event(dt: i64) -> TelemetryEvent { ) } -fn new_event(dt: i64, entity_type: &str, event_name: &str, data: D) -> TelemetryEvent { +fn new_event( + dt: i64, + entity_type: &str, + event_name: &str, + data: D, +) -> TelemetryEvent { let eid = load_or_create_id(); TelemetryEvent { p: "sandbox-agent".to_string(), From 5f93611f537643e378d4dd7a51da2677b6eac4b5 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 6 Feb 2026 03:28:33 -0800 Subject: [PATCH 13/19] fix: remove circular .turbo symlink --- .turbo | 1 - 1 file changed, 1 deletion(-) delete mode 120000 .turbo diff --git a/.turbo b/.turbo deleted file mode 120000 index 0b7d9ca..0000000 --- a/.turbo +++ /dev/null @@ -1 +0,0 @@ -/home/nathan/sandbox-agent/.turbo \ No newline at end of file From 4320e5d1e79ed3bc5ceac1681e11f611bc241c8c Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 6 Feb 2026 03:29:14 -0800 Subject: [PATCH 14/19] chore(release): update version to 0.1.7-rc.1 --- docs/openapi.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/openapi.json b/docs/openapi.json index d422563..4e7e8fe 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -10,7 +10,7 @@ "license": { "name": "Apache-2.0" }, - "version": "0.1.6" + "version": "0.1.7-rc.1" }, "servers": [ { From 05fc8fc2c4a58316974d87d6f3cff4d0767e40c3 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 6 Feb 2026 03:36:25 -0800 Subject: [PATCH 15/19] fix: remove circular dist symlink --- dist | 1 - 1 file changed, 1 deletion(-) delete mode 120000 dist diff --git a/dist b/dist deleted file mode 120000 index f02d77f..0000000 --- a/dist +++ /dev/null @@ -1 +0,0 @@ -/home/nathan/sandbox-agent/dist \ No newline at end of file From 60e1ce7e2da3bdc4328802cf29fdde1701672263 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 6 Feb 2026 03:44:08 -0800 Subject: [PATCH 16/19] fix: add Win32_System_Threading feature for Windows build --- server/packages/sandbox-agent/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/packages/sandbox-agent/Cargo.toml b/server/packages/sandbox-agent/Cargo.toml index 703c87c..850f4b6 100644 --- a/server/packages/sandbox-agent/Cargo.toml +++ b/server/packages/sandbox-agent/Cargo.toml @@ -42,7 +42,7 @@ tempfile = { workspace = true, optional = true } libc = "0.2" [target.'cfg(windows)'.dependencies] -windows = { version = "0.52", features = ["Win32_Foundation", "Win32_Security", "Win32_Storage_FileSystem", "Win32_System_Console"] } +windows = { version = "0.52", features = ["Win32_Foundation", "Win32_Security", "Win32_Storage_FileSystem", "Win32_System_Console", "Win32_System_Threading"] } [dev-dependencies] http-body-util.workspace = true From 96ae6bed96e1182252312da4e9abaf92a91de12d Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 6 Feb 2026 03:50:50 -0800 Subject: [PATCH 17/19] fix: update Windows API calls for windows crate v0.52 --- server/packages/sandbox-agent/src/daemon.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/server/packages/sandbox-agent/src/daemon.rs b/server/packages/sandbox-agent/src/daemon.rs index e011d11..58bf6b4 100644 --- a/server/packages/sandbox-agent/src/daemon.rs +++ b/server/packages/sandbox-agent/src/daemon.rs @@ -122,18 +122,18 @@ pub fn is_process_running(pid: u32) -> bool { #[cfg(windows)] pub fn is_process_running(pid: u32) -> bool { - use windows::Win32::Foundation::{CloseHandle, HANDLE}; + use windows::Win32::Foundation::CloseHandle; use windows::Win32::System::Threading::{ GetExitCodeProcess, OpenProcess, PROCESS_QUERY_LIMITED_INFORMATION, }; unsafe { - let handle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, pid); - if handle.is_invalid() { - return false; - } + let handle = match OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, pid) { + Ok(h) => h, + Err(_) => return false, + }; let mut exit_code = 0u32; - let ok = GetExitCodeProcess(handle, &mut exit_code).as_bool(); + let ok = GetExitCodeProcess(handle, &mut exit_code).is_ok(); let _ = CloseHandle(handle); ok && exit_code == 259 } From 7e6f7ac3c0c76735c9ee03bdcba8a955cddf71dd Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 6 Feb 2026 04:02:35 -0800 Subject: [PATCH 18/19] fix: correct gigacode crate path for crates.io publishing --- scripts/release/sdk.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/release/sdk.ts b/scripts/release/sdk.ts index 68d0dfc..5248440 100644 --- a/scripts/release/sdk.ts +++ b/scripts/release/sdk.ts @@ -147,7 +147,9 @@ export async function publishCrates(opts: ReleaseOpts) { console.log("==> Publishing crates to crates.io"); for (const crate of CRATES) { - const cratePath = join(opts.root, "server/packages", crate); + const cratePath = crate === "gigacode" + ? join(opts.root, "gigacode") + : join(opts.root, "server/packages", crate); // Read Cargo.toml to get the actual crate name const cargoTomlPath = join(cratePath, "Cargo.toml"); From a7b3881099dd18206f89f444e2a9ca55c76d1e20 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 6 Feb 2026 04:31:24 -0800 Subject: [PATCH 19/19] chore(release): update version to 0.1.7 --- Cargo.toml | 14 +++++++------- docs/openapi.json | 2 +- sdks/cli-shared/package.json | 2 +- sdks/cli/package.json | 2 +- sdks/cli/platforms/darwin-arm64/package.json | 2 +- sdks/cli/platforms/darwin-x64/package.json | 2 +- sdks/cli/platforms/linux-arm64/package.json | 2 +- sdks/cli/platforms/linux-x64/package.json | 2 +- sdks/cli/platforms/win32-x64/package.json | 2 +- sdks/gigacode/package.json | 2 +- sdks/gigacode/platforms/darwin-arm64/package.json | 2 +- sdks/gigacode/platforms/darwin-x64/package.json | 2 +- sdks/gigacode/platforms/linux-arm64/package.json | 2 +- sdks/gigacode/platforms/linux-x64/package.json | 2 +- sdks/gigacode/platforms/win32-x64/package.json | 2 +- sdks/typescript/package.json | 2 +- 16 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index de0ee67..8ddcb84 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ resolver = "2" members = ["server/packages/*", "gigacode"] [workspace.package] -version = "0.1.7-rc.1" +version = "0.1.7" edition = "2021" authors = [ "Rivet Gaming, LLC " ] license = "Apache-2.0" @@ -12,12 +12,12 @@ description = "Universal API for automatic coding agents in sandboxes. Supprots [workspace.dependencies] # Internal crates -sandbox-agent = { version = "0.1.7-rc.1", path = "server/packages/sandbox-agent" } -sandbox-agent-error = { version = "0.1.7-rc.1", path = "server/packages/error" } -sandbox-agent-agent-management = { version = "0.1.7-rc.1", path = "server/packages/agent-management" } -sandbox-agent-agent-credentials = { version = "0.1.7-rc.1", path = "server/packages/agent-credentials" } -sandbox-agent-universal-agent-schema = { version = "0.1.7-rc.1", path = "server/packages/universal-agent-schema" } -sandbox-agent-extracted-agent-schemas = { version = "0.1.7-rc.1", path = "server/packages/extracted-agent-schemas" } +sandbox-agent = { version = "0.1.7", path = "server/packages/sandbox-agent" } +sandbox-agent-error = { version = "0.1.7", path = "server/packages/error" } +sandbox-agent-agent-management = { version = "0.1.7", path = "server/packages/agent-management" } +sandbox-agent-agent-credentials = { version = "0.1.7", path = "server/packages/agent-credentials" } +sandbox-agent-universal-agent-schema = { version = "0.1.7", path = "server/packages/universal-agent-schema" } +sandbox-agent-extracted-agent-schemas = { version = "0.1.7", path = "server/packages/extracted-agent-schemas" } # Serialization serde = { version = "1.0", features = ["derive"] } diff --git a/docs/openapi.json b/docs/openapi.json index 4e7e8fe..7b46e7d 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -10,7 +10,7 @@ "license": { "name": "Apache-2.0" }, - "version": "0.1.7-rc.1" + "version": "0.1.7" }, "servers": [ { diff --git a/sdks/cli-shared/package.json b/sdks/cli-shared/package.json index 38e3cf4..d342db9 100644 --- a/sdks/cli-shared/package.json +++ b/sdks/cli-shared/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/cli-shared", - "version": "0.1.7-rc.1", + "version": "0.1.7", "description": "Shared helpers for sandbox-agent CLI and SDK", "license": "Apache-2.0", "repository": { diff --git a/sdks/cli/package.json b/sdks/cli/package.json index e04199f..c617a76 100644 --- a/sdks/cli/package.json +++ b/sdks/cli/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/cli", - "version": "0.1.7-rc.1", + "version": "0.1.7", "description": "CLI for sandbox-agent - run AI coding agents in sandboxes", "license": "Apache-2.0", "repository": { diff --git a/sdks/cli/platforms/darwin-arm64/package.json b/sdks/cli/platforms/darwin-arm64/package.json index 2b8a23c..9c07b51 100644 --- a/sdks/cli/platforms/darwin-arm64/package.json +++ b/sdks/cli/platforms/darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/cli-darwin-arm64", - "version": "0.1.7-rc.1", + "version": "0.1.7", "description": "sandbox-agent CLI binary for macOS ARM64", "license": "Apache-2.0", "repository": { diff --git a/sdks/cli/platforms/darwin-x64/package.json b/sdks/cli/platforms/darwin-x64/package.json index e0c51aa..dafe8e9 100644 --- a/sdks/cli/platforms/darwin-x64/package.json +++ b/sdks/cli/platforms/darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/cli-darwin-x64", - "version": "0.1.7-rc.1", + "version": "0.1.7", "description": "sandbox-agent CLI binary for macOS x64", "license": "Apache-2.0", "repository": { diff --git a/sdks/cli/platforms/linux-arm64/package.json b/sdks/cli/platforms/linux-arm64/package.json index 1305908..58cad6a 100644 --- a/sdks/cli/platforms/linux-arm64/package.json +++ b/sdks/cli/platforms/linux-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/cli-linux-arm64", - "version": "0.1.7-rc.1", + "version": "0.1.7", "description": "sandbox-agent CLI binary for Linux arm64", "license": "Apache-2.0", "repository": { diff --git a/sdks/cli/platforms/linux-x64/package.json b/sdks/cli/platforms/linux-x64/package.json index e248dd2..1f6c35b 100644 --- a/sdks/cli/platforms/linux-x64/package.json +++ b/sdks/cli/platforms/linux-x64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/cli-linux-x64", - "version": "0.1.7-rc.1", + "version": "0.1.7", "description": "sandbox-agent CLI binary for Linux x64", "license": "Apache-2.0", "repository": { diff --git a/sdks/cli/platforms/win32-x64/package.json b/sdks/cli/platforms/win32-x64/package.json index 8c035db..726e4aa 100644 --- a/sdks/cli/platforms/win32-x64/package.json +++ b/sdks/cli/platforms/win32-x64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/cli-win32-x64", - "version": "0.1.7-rc.1", + "version": "0.1.7", "description": "sandbox-agent CLI binary for Windows x64", "license": "Apache-2.0", "repository": { diff --git a/sdks/gigacode/package.json b/sdks/gigacode/package.json index 6423937..9f4b0a7 100644 --- a/sdks/gigacode/package.json +++ b/sdks/gigacode/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/gigacode", - "version": "0.1.7-rc.1", + "version": "0.1.7", "description": "Gigacode CLI (sandbox-agent with OpenCode attach by default)", "license": "Apache-2.0", "repository": { diff --git a/sdks/gigacode/platforms/darwin-arm64/package.json b/sdks/gigacode/platforms/darwin-arm64/package.json index 8cb55c5..49ec4e9 100644 --- a/sdks/gigacode/platforms/darwin-arm64/package.json +++ b/sdks/gigacode/platforms/darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/gigacode-darwin-arm64", - "version": "0.1.7-rc.1", + "version": "0.1.7", "description": "gigacode CLI binary for macOS arm64", "license": "Apache-2.0", "repository": { diff --git a/sdks/gigacode/platforms/darwin-x64/package.json b/sdks/gigacode/platforms/darwin-x64/package.json index c3808d5..95104af 100644 --- a/sdks/gigacode/platforms/darwin-x64/package.json +++ b/sdks/gigacode/platforms/darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/gigacode-darwin-x64", - "version": "0.1.7-rc.1", + "version": "0.1.7", "description": "gigacode CLI binary for macOS x64", "license": "Apache-2.0", "repository": { diff --git a/sdks/gigacode/platforms/linux-arm64/package.json b/sdks/gigacode/platforms/linux-arm64/package.json index 4030a6b..29d9acb 100644 --- a/sdks/gigacode/platforms/linux-arm64/package.json +++ b/sdks/gigacode/platforms/linux-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/gigacode-linux-arm64", - "version": "0.1.7-rc.1", + "version": "0.1.7", "description": "gigacode CLI binary for Linux arm64", "license": "Apache-2.0", "repository": { diff --git a/sdks/gigacode/platforms/linux-x64/package.json b/sdks/gigacode/platforms/linux-x64/package.json index 541eebc..b3b3298 100644 --- a/sdks/gigacode/platforms/linux-x64/package.json +++ b/sdks/gigacode/platforms/linux-x64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/gigacode-linux-x64", - "version": "0.1.7-rc.1", + "version": "0.1.7", "description": "gigacode CLI binary for Linux x64", "license": "Apache-2.0", "repository": { diff --git a/sdks/gigacode/platforms/win32-x64/package.json b/sdks/gigacode/platforms/win32-x64/package.json index b4f537c..cec1c0c 100644 --- a/sdks/gigacode/platforms/win32-x64/package.json +++ b/sdks/gigacode/platforms/win32-x64/package.json @@ -1,6 +1,6 @@ { "name": "@sandbox-agent/gigacode-win32-x64", - "version": "0.1.7-rc.1", + "version": "0.1.7", "description": "gigacode CLI binary for Windows x64", "license": "Apache-2.0", "repository": { diff --git a/sdks/typescript/package.json b/sdks/typescript/package.json index 84606db..fe9845c 100644 --- a/sdks/typescript/package.json +++ b/sdks/typescript/package.json @@ -1,6 +1,6 @@ { "name": "sandbox-agent", - "version": "0.1.7-rc.1", + "version": "0.1.7", "description": "Universal API for automatic coding agents in sandboxes. Supprots Claude Code, Codex, OpenCode, and Amp.", "license": "Apache-2.0", "repository": {