From f06193266a0f481cd45f9cecd20c042fc320ee86 Mon Sep 17 00:00:00 2001 From: Gabriel Fonseca Date: Tue, 10 Nov 2026 14:39:38 +0000 Subject: [PATCH 1/2] feat(sdks): default to frontal-code command and align SDK flags - Both SDKs pick `frontal-code` when it is on PATH and fall back to `code`. - Stop injecting CODEX_API_KEY into the CLI environment; provider keys come from the caller's environment only. - Add `dangerouslySkipPermissions` and `allowedTools` thread options, mapped to `--dangerously-skip-permissions` and `--allowed-tools`. - Drop image inputs from the SDKs (text-only prompts) until the CLI accepts them. - Throw on `turn.failed` in the TypeScript SDK, matching the Rust SDK. - Rewrite Rust SDK TESTING.md to match the real test files and fix stale mock paths in the SDK docs. - Accept the CLI no-change note and `output_schema` prompt key. Co-Authored-By: Claude Haiku 5.5 --- cli/src/main.rs | 2 +- sdks/rust/README.md | 20 +-- sdks/rust/docs/ARCHITECTURE.md | 4 +- sdks/rust/docs/EXAMPLES.md | 2 +- sdks/rust/docs/TESTING.md | 137 +++------------------ sdks/rust/src/code.rs | 15 +-- sdks/rust/src/protocol.rs | 4 + sdks/rust/src/spawn.rs | 9 +- sdks/rust/src/thread.rs | 17 ++- sdks/rust/tests/integration_test.rs | 47 +++++-- sdks/typescript/README.md | 49 ++++---- sdks/typescript/docs/TESTING.md | 2 +- sdks/typescript/src/frontal-code.ts | 13 +- sdks/typescript/src/protocol.ts | 4 + sdks/typescript/src/spawn.ts | 4 + sdks/typescript/src/thread.ts | 26 ++-- sdks/typescript/tests/frontal-code.test.ts | 25 ---- sdks/typescript/tests/thread.test.ts | 41 ++++-- 18 files changed, 184 insertions(+), 237 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index 5cf9b42..a80cd5e 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -1810,7 +1810,7 @@ fn reject_flags_in_prompt_text(tokens: &[String]) -> Result<(), String> { /// Config keys a `prompt --config KEY=VALUE` run may override. Anything else is /// rejected up front rather than silently ignored. -const PROMPT_CONFIG_KEYS: &[&str] = &["frontal_base_url", "skip_git_repo_check"]; +const PROMPT_CONFIG_KEYS: &[&str] = &["frontal_base_url", "skip_git_repo_check", "output_schema"]; /// Parses `prompt [-p TEXT] [--stream] [--resume REF] [--config KEY=VALUE] [TEXT...]`. fn parse_prompt_subcommand_args( diff --git a/sdks/rust/README.md b/sdks/rust/README.md index 77f13b0..850b65f 100644 --- a/sdks/rust/README.md +++ b/sdks/rust/README.md @@ -18,12 +18,12 @@ Requires the `frontal-code` CLI on `PATH` (or provide a custom `command`). ## Quickstart ```rust -use frontal_code_sdk::{Frontal Code, ThreadInput, ThreadOptions, ThreadRunOptions}; +use frontal_code_sdk::{FrontalCode, ThreadInput, ThreadOptions, ThreadRunOptions}; #[tokio::main] async fn main() -> Result<(), Box> { - let frontal-code = Frontal Code::new(Default::default()); - let thread = frontal-code.start_thread(ThreadOptions::default()); + let sdk = FrontalCode::new(Default::default()); + let thread = sdk.start_thread(ThreadOptions::default()); let turn = thread .run(&ThreadInput::Text("Diagnose the test failure".into()), &ThreadRunOptions::default()) .await?; @@ -34,17 +34,23 @@ async fn main() -> Result<(), Box> { ## Features -- `Frontal Code::start_thread` / `Frontal Code::resume_thread` +- `FrontalCode::start_thread` / `FrontalCode::resume_thread` - `Thread::run` (buffered `TurnResult`) and `Thread::run_streamed` (event stream) -- Structured input entries (`text`, `local_image`) +- Structured input entries (`text`; `local_image` is accepted in the protocol but + the CLI does not yet forward images) - `--config` overrides flattened to dotted TOML literals (incl. `baseUrl` → - `frontal_base_url`) + `frontal_base_url`, `output_schema`) - Multi-turn continuation via `--resume` +- Permission control: `--permission-mode`, `--dangerously-skip-permissions` +- Tool restriction: `--allowed-tools` (repeatable) ## Testing The SDK's tests are hermetic: they spawn a small mock `frontal-code` script instead of -the real binary, so no API key or network is required. +the real binary, so no API key or network is required. Authentication is handled by the +`frontal-code` CLI through provider-specific environment variables (e.g. +`ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `FRONTAL_API_KEY`) that you set in your shell; +this SDK does not inject any environment variables of its own. ```bash cargo test -p frontal-code-sdk diff --git a/sdks/rust/docs/ARCHITECTURE.md b/sdks/rust/docs/ARCHITECTURE.md index 56df8dc..30f7fe6 100644 --- a/sdks/rust/docs/ARCHITECTURE.md +++ b/sdks/rust/docs/ARCHITECTURE.md @@ -104,11 +104,11 @@ All config overrides are flattened to dotted TOML and passed as repeated Tests are hermetic - they spawn a mock `frontal-code` script instead of the real CLI: ```rust -// tests/mock_frontal-code.sh - emits predetermined JSONL events +// path/to/frontal-code - emits predetermined JSONL events #[tokio::test] async fn test_thread_run() { let frontal-code = Frontal Code::new(FrontalCodeConfig { - command: Some("tests/mock_frontal-code.sh".into()), + command: Some("path/to/frontal-code".into()), ..Default::default() }); // ... test assertions diff --git a/sdks/rust/docs/EXAMPLES.md b/sdks/rust/docs/EXAMPLES.md index 743a7ad..e9b36f2 100644 --- a/sdks/rust/docs/EXAMPLES.md +++ b/sdks/rust/docs/EXAMPLES.md @@ -257,7 +257,7 @@ mod tests { #[tokio::test] async fn test_basic_thread() { let frontal-code = Frontal Code::new(FrontalCodeConfig { - command: Some("tests/mock_frontal-code.sh".into()), + command: Some("path/to/frontal-code".into()), env: Some([("REQUEST_TYPE".into(), "basic".into())].into()), ..Default::default() }); diff --git a/sdks/rust/docs/TESTING.md b/sdks/rust/docs/TESTING.md index 6362696..112959a 100644 --- a/sdks/rust/docs/TESTING.md +++ b/sdks/rust/docs/TESTING.md @@ -2,144 +2,45 @@ ## Test Architecture -Tests are fully hermetic - they do **not** require: +Most tests are hermetic. They do **not** require: - Network access -- API keys (`CODEX_API_KEY`) -- Real `frontal-code` CLI binary +- Provider API keys +- The real `frontal-code` CLI -Instead, tests use a mock CLI script (`tests/mock_frontal-code.sh`) that emits -predefined JSONL events over stdout. +`tests/common/mod.rs` writes a small fake `frontal-code` executable at runtime. The fake emits predefined JSONL events and records the arguments it was called with, so the tests can assert on the exact flags the SDK passes. + +The end-to-end suite (`tests/e2e_test.rs`) is the exception. It runs the real CLI against a live model and is skipped unless `FRONTAL_CODE_E2E_BIN` is set. ## Running Tests ```bash -# Run all tests -cargo test --package frontal-code-sdk - -# Run with output -cargo test --package frontal-code-sdk -- --nocapture +# Hermetic tests (no CLI, no network) +cargo test -p frontal-code-sdk -# Run specific test -cargo test --package frontal-code-sdk test_thread_run -- --nocapture +# End-to-end against a local Ollama model (see below) +FRONTAL_CODE_E2E_BIN=$PWD/target/debug/code \ + cargo test --manifest-path sdks/rust/Cargo.toml --test e2e_test ``` ## Test Structure ``` tests/ -├── mock_frontal-code.sh # Mock CLI - emits JSONL events -├── test_basic.rs # Basic thread run tests -├── test_streaming.rs # Stream event tests -├── test_structured.rs # Structured output / JSON Schema tests -├── test_resume.rs # Thread resume tests -├── test_config.rs # Config override tests -└── test_errors.rs # Error handling tests -``` - -## Mock CLI Protocol - -The mock CLI (`tests/mock_frontal-code.sh`) reads stdin for the request payload -and writes JSONL events to stdout. It understands these request fields: - -```json -{ - "input": "user message", - "session_id": "optional-resume-id", - "config": { "key": "value" }, - "output_schema": { ... } -} -``` - -The mock responds with events matching the real CLI format: - -```jsonl -{"type":"item_completed","item":{"id":"msg-1","type":"message","content":"Hello!"}} -{"type":"turn_completed","result":{"final_response":"Hello!","items":[],"usage":{}}} +├── common/mod.rs # Shared fake CLI and helpers +├── integration_test.rs # Thread run, streaming, resume, and flag mapping (mocked) +├── config_test.rs # --config overrides and env handling (mocked) +└── e2e_test.rs # Real CLI against a live model (gated) ``` -## Writing New Tests +## End-to-End Suite -### 1. Add test events to `mock_frontal-code.sh` - -```bash -case "$REQUEST_TYPE" in - "my_new_scenario") - cat <<'EOF' - {"type":"item_completed","item":{"id":"msg-1","type":"message","content":"Custom response"}} - {"type":"turn_completed","result":{"final_response":"Custom response","items":[],"usage":{}}} -EOF - ;; -esac -``` - -### 2. Create test case - -```rust -#[tokio::test] -async fn test_my_new_scenario() { - let frontal-code = Frontal Code::new(FrontalCodeConfig { - command: Some("tests/mock_frontal-code.sh".into()), - env: Some([("REQUEST_TYPE".into(), "my_new_scenario".into())].into()), - ..Default::default() - }); - - let thread = frontal-code.start_thread(ThreadOptions::default()).unwrap(); - let result = thread.run(&ThreadInput::Text("test".into()), &ThreadRunOptions::default()).unwrap(); - - assert_eq!(result.final_response, "Custom response"); -} -``` - -## Test Utilities - -### `TestFrontalCodeBuilder` (in `tests/common.rs`) - -```rust -let frontal-code = TestFrontalCodeBuilder::new() - .with_mock_response("my_scenario") - .with_env("CUSTOM_VAR", "value") - .build(); -``` - -### Event Assertions - -```rust -use frontal_code_sdk::test_utils::{assert_event_seq, assert_final_response}; - -let mut stream = thread.run_streamed(&input, &options).unwrap(); -assert_event_seq!(&mut stream, ItemCompleted, TurnCompleted); -let result = assert_final_response(stream).await; -``` - -## Continuous Integration - -Tests run in GitHub Actions on every PR: - -```yaml -# .github/workflows/rust-sdk.yml -- uses: actions-rs/cargo@v1 - with: - command: test - args: --package frontal-code-sdk --workspace -``` - -## Coverage - -```bash -cargo llvm-cov --package frontal-code-sdk --html -``` - -## End-to-end suite (real CLI) - -`tests/e2e_test.rs` runs the real `code` binary against a live model. It is skipped unless `FRONTAL_CODE_E2E_BIN` is set. The default provider is a local Ollama server: +The default provider is a local Ollama server, so no key is needed: ```bash cargo build -p cli ollama pull qwen2.5:1.5b -FRONTAL_CODE_E2E_BIN="$PWD/target/debug/code" \ +FRONTAL_CODE_E2E_BIN=$PWD/target/debug/code \ cargo test --manifest-path sdks/rust/Cargo.toml --test e2e_test ``` -Set `FRONTAL_CODE_E2E_PROVIDER=openai` with `OPENAI_API_KEY` (and `OPENAI_BASE_URL`) to run against a cloud gateway instead. - -A skipped run reports as passing, so check that the variables are set before you read a green result. +Set `FRONTAL_CODE_E2E_PROVIDER=openai` with `OPENAI_API_KEY` (and `OPENAI_BASE_URL`) to run against a cloud gateway instead. A skipped run reports as passing, so check that `FRONTAL_CODE_E2E_BIN` is set before you read a green result. diff --git a/sdks/rust/src/code.rs b/sdks/rust/src/code.rs index 639a768..4b1ad44 100644 --- a/sdks/rust/src/code.rs +++ b/sdks/rust/src/code.rs @@ -8,8 +8,6 @@ use std::sync::Arc; use crate::protocol::{FrontalCodeOptions, ThreadOptions}; use crate::thread::Thread; -const REQUIRED_ENV_VARS: &[&str] = &["CODEX_API_KEY"]; - /// The two names every install channel provides for the same CLI. const COMMAND_NAMES: [&str; 2] = ["frontal-code", "code"]; @@ -71,8 +69,10 @@ impl FrontalCode { } /// Build the environment for a spawned CLI. Starts from the ambient - /// environment, applies the user-provided `env`, then injects any required - /// variables (such as `CODEX_API_KEY`) if still missing. + /// environment, applies the user-provided `env`. + /// The `frontal-code` CLI authenticates via provider-specific environment + /// variables (e.g. `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`) which the caller + /// is responsible for setting; this SDK does not inject any of its own. pub fn build_env(&self) -> HashMap { let mut env: HashMap = std::env::vars().collect(); if let Some(user_env) = &self.options.env { @@ -80,13 +80,6 @@ impl FrontalCode { env.insert(key.clone(), value.clone()); } } - for var in REQUIRED_ENV_VARS { - if !env.contains_key(*var) { - if let Ok(value) = std::env::var(var) { - env.insert((*var).to_string(), value); - } - } - } env } } diff --git a/sdks/rust/src/protocol.rs b/sdks/rust/src/protocol.rs index 0cd86e9..d6cb28d 100644 --- a/sdks/rust/src/protocol.rs +++ b/sdks/rust/src/protocol.rs @@ -98,6 +98,10 @@ pub struct ThreadOptions { pub model: Option, /// Permission mode override. pub permission_mode: Option, + /// Skip all permission checks (maps to `--dangerously-skip-permissions`). + pub dangerously_skip_permissions: bool, + /// Restrict enabled tools (maps to `--allowed-tools`, repeatable). + pub allowed_tools: Option>, /// Thread-level CLI `--config` overrides (precedence over global). pub config: Option, } diff --git a/sdks/rust/src/spawn.rs b/sdks/rust/src/spawn.rs index 1be28c4..49100f9 100644 --- a/sdks/rust/src/spawn.rs +++ b/sdks/rust/src/spawn.rs @@ -182,7 +182,14 @@ pub async fn run_turn_buffered( usage = u.clone(); session_id = sid.clone(); } - _ => {} + FrontalCodeEvent::TurnFailed { error } => { + let stderr = stderr_buffer.lock().await.clone(); + return Err(FrontalCodeError::Exit { + code: None, + stderr: format!("frontal-code turn failed: {error}\n{stderr}"), + }); + } + FrontalCodeEvent::TurnStarted => {} } } diff --git a/sdks/rust/src/thread.rs b/sdks/rust/src/thread.rs index c795da1..563389b 100644 --- a/sdks/rust/src/thread.rs +++ b/sdks/rust/src/thread.rs @@ -89,10 +89,10 @@ impl Thread { let (prompt, images) = input.to_prompt_and_images(); let mut args = vec!["prompt".to_string(), "-p".to_string(), prompt]; - for image in &images { - args.push("--image".to_string()); - args.push(image.clone()); - } + // `local_image` entries are kept in the protocol for forward compatibility, + // but the `frontal-code` CLI does not yet accept `--image`, so only text + // entries are concatenated into the prompt. + let _ = images; if let Some(provider) = &self.options.provider { args.push("--provider".to_string()); args.push(provider.clone()); @@ -105,6 +105,15 @@ impl Thread { args.push("--permission-mode".to_string()); args.push(permission_mode.clone()); } + if self.options.dangerously_skip_permissions { + args.push("--dangerously-skip-permissions".to_string()); + } + if let Some(tools) = &self.options.allowed_tools { + for tool in tools { + args.push("--allowed-tools".to_string()); + args.push(tool.clone()); + } + } if let Some(id) = session_id { args.push("--resume".to_string()); args.push(id.to_string()); diff --git a/sdks/rust/tests/integration_test.rs b/sdks/rust/tests/integration_test.rs index 2d5943a..385b042 100644 --- a/sdks/rust/tests/integration_test.rs +++ b/sdks/rust/tests/integration_test.rs @@ -140,7 +140,7 @@ async fn subsequent_turns_pass_resume() { } #[tokio::test] -async fn images_emit_image_flags() { +async fn images_do_not_emit_image_flags() { let mock = MockFrontalCode::new(SINGLE_TURN, 0); let frontal_code = code_for(&mock); let entries = vec![ @@ -160,16 +160,49 @@ async fn images_emit_image_flags() { .await .expect("run"); let args = mock.captured_args(); - let image_indexes: Vec = args + assert!(!args.iter().any(|a| a == "--image")); + assert!(args.contains(&"describe these".to_string())); +} + +#[tokio::test] +async fn dangerously_skip_permissions_emits_flag() { + let mock = MockFrontalCode::new(SINGLE_TURN, 0); + let frontal_code = code_for(&mock); + frontal_code + .start_thread(ThreadOptions { + dangerously_skip_permissions: true, + ..Default::default() + }) + .run(&ThreadInput::Text("x".into()), &ThreadRunOptions::default()) + .await + .expect("run"); + assert!(mock + .captured_args() + .contains(&"--dangerously-skip-permissions".to_string())); +} + +#[tokio::test] +async fn allowed_tools_emit_flags() { + let mock = MockFrontalCode::new(SINGLE_TURN, 0); + let frontal_code = code_for(&mock); + frontal_code + .start_thread(ThreadOptions { + allowed_tools: Some(vec!["read".into(), "bash".into()]), + ..Default::default() + }) + .run(&ThreadInput::Text("x".into()), &ThreadRunOptions::default()) + .await + .expect("run"); + let args = mock.captured_args(); + let tool_indexes: Vec = args .iter() .enumerate() - .filter(|(_, a)| *a == "--image") + .filter(|(_, a)| *a == "--allowed-tools") .map(|(i, _)| i) .collect(); - assert_eq!(image_indexes.len(), 2); - assert_eq!(args[image_indexes[0] + 1], "./ui.png"); - assert_eq!(args[image_indexes[1] + 1], "./diagram.jpg"); - assert!(args.contains(&"describe these".to_string())); + assert_eq!(tool_indexes.len(), 2); + assert_eq!(args[tool_indexes[0] + 1], "read"); + assert_eq!(args[tool_indexes[1] + 1], "bash"); } #[tokio::test] diff --git a/sdks/typescript/README.md b/sdks/typescript/README.md index 5a5a16a..f16ef43 100644 --- a/sdks/typescript/README.md +++ b/sdks/typescript/README.md @@ -15,10 +15,10 @@ Requires Node.js 18+. ## Quickstart ```typescript -import { Frontal Code } from "@frontal-labs/code-sdk"; +import { FrontalCode } from "@frontal-labs/code-sdk"; -const frontal-code = new Frontal Code(); -const thread = frontal-code.startThread(); +const frontal = new FrontalCode(); +const thread = frontal.startThread(); const turn = await thread.run("Diagnose the test failure and propose a fix"); console.log(turn.finalResponse); @@ -83,25 +83,13 @@ const turn = await thread.run("Summarize repository status", { console.log(turn.finalResponse); ``` -### Attaching images - -Provide structured input entries when you need to include images alongside text. Text entries are concatenated into the final prompt while image entries are passed to the Frontal Code CLI via `--image`. - -```typescript -const turn = await thread.run([ - { type: "text", text: "Describe these screenshots" }, - { type: "local_image", path: "./ui.png" }, - { type: "local_image", path: "./diagram.jpg" }, -]); -``` - ### Resuming an existing thread Threads are persisted in `~/.frontal-code/sessions`. If you lose the in-memory `Thread` object, reconstruct it with `resumeThread()` and keep going. ```typescript -const savedThreadId = process.env.CODEX_THREAD_ID!; -const thread = frontal-code.resumeThread(savedThreadId); +const savedThreadId = process.env.FRONTAL_CODE_THREAD_ID!; +const thread = frontal.resumeThread(savedThreadId); await thread.run("Implement the fix"); ``` @@ -110,7 +98,7 @@ await thread.run("Implement the fix"); Frontal Code runs in the current working directory by default. To avoid unrecoverable errors, Frontal Code requires the working directory to be a Git repository. You can skip the Git repository check by passing the `skipGitRepoCheck` option when creating a thread. ```typescript -const thread = frontal-code.startThread({ +const thread = frontal.startThread({ workingDirectory: "/path/to/project", skipGitRepoCheck: true, }); @@ -119,18 +107,19 @@ const thread = frontal-code.startThread({ ### Controlling the Frontal Code CLI environment By default, the Frontal Code CLI inherits the Node.js process environment. Provide the optional `env` parameter when instantiating the -`Frontal Code` client to fully control which variables the CLI receives—useful for sandboxed hosts like Electron apps. +`FrontalCode` client to fully control which variables the CLI receives—useful for sandboxed hosts like Electron apps. ```typescript -const frontal-code = new Frontal Code({ +const frontal = new FrontalCode({ env: { PATH: "/usr/local/bin", }, }); ``` -The SDK still injects its required variables (such as `CODEX_API_KEY`) on top of the environment you provide. If you set -`baseUrl`, the SDK passes it as a `--config frontal_base_url=...` override. +The SDK does not inject any environment variables of its own. Authentication is handled by the `frontal-code` CLI through +provider-specific environment variables (e.g. `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `FRONTAL_API_KEY`) that you set in your +shell before running the agent. If you set `baseUrl`, the SDK passes it as a `--config frontal_base_url=...` override. ### Passing `--config` overrides @@ -138,7 +127,7 @@ Use the `config` option to provide additional Frontal Code CLI configuration ove into dotted paths, and serializes values as TOML literals before passing them as repeated `--config key=value` flags. ```typescript -const frontal-code = new Frontal Code({ +const frontal = new FrontalCode({ config: { show_raw_agent_reasoning: true, sandbox_workspace_write: { network_access: true }, @@ -146,4 +135,16 @@ const frontal-code = new Frontal Code({ }); ``` -Thread options still take precedence for overlapping settings because they are emitted after these global overrides. \ No newline at end of file +Thread options still take precedence for overlapping settings because they are emitted after these global overrides. + +## Permission control and tool restriction + +Thread options support the same permission and tool-restriction flags as the CLI: + +```typescript +const thread = frontal.startThread({ + permissionMode: "danger-full-access", // or read-only, workspace-write, prompt + dangerouslySkipPermissions: true, // --dangerously-skip-permissions + allowedTools: ["read", "bash"], --allowed-tools (repeatable) +}); +``` \ No newline at end of file diff --git a/sdks/typescript/docs/TESTING.md b/sdks/typescript/docs/TESTING.md index ab78861..05e2cea 100644 --- a/sdks/typescript/docs/TESTING.md +++ b/sdks/typescript/docs/TESTING.md @@ -4,7 +4,7 @@ Tests are fully hermetic - they do **not** require: - Network access -- API keys (`CODEX_API_KEY`) +- API keys - Real `frontal-code` CLI binary Instead, tests use a mock CLI (`tests/mock-frontal-code.ts`) that emits diff --git a/sdks/typescript/src/frontal-code.ts b/sdks/typescript/src/frontal-code.ts index bb9b5dc..19e13c7 100644 --- a/sdks/typescript/src/frontal-code.ts +++ b/sdks/typescript/src/frontal-code.ts @@ -2,8 +2,6 @@ import { defaultCommand } from "./command.js"; import type { FrontalCodeOptions, JsonValue, ThreadOptions } from "./protocol.js"; import { Thread } from "./thread.js"; -const REQUIRED_ENV_VARS = ["CODEX_API_KEY"]; - /** * The top-level Frontal Code client. Wraps the Frontal Code CLI (`frontal-code`, or `code`, the same * program) and is used to start and resume conversation {@link Thread}s. @@ -29,8 +27,10 @@ export class FrontalCode { /** * Build the environment for a spawned CLI. Starts from `process.env`, applies - * the user-provided `env`, then injects any required variables (such as - * `CODEX_API_KEY`) from the ambient environment if still missing. + * the user-provided `env`, then applies any `extra` overrides on top. + * The `frontal-code` CLI authenticates via provider-specific environment + * variables (e.g. `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`) which the caller + * is responsible for setting; this SDK does not inject any of its own. */ buildEnv(extra?: Record): NodeJS.ProcessEnv { const base: NodeJS.ProcessEnv = { ...process.env }; @@ -40,11 +40,6 @@ export class FrontalCode { if (extra) { Object.assign(base, extra); } - for (const varName of REQUIRED_ENV_VARS) { - if (!base[varName] && process.env[varName]) { - base[varName] = process.env[varName]; - } - } return base; } } diff --git a/sdks/typescript/src/protocol.ts b/sdks/typescript/src/protocol.ts index 0ef33ea..99d5b2f 100644 --- a/sdks/typescript/src/protocol.ts +++ b/sdks/typescript/src/protocol.ts @@ -76,6 +76,10 @@ export interface ThreadOptions { model?: string; /** Permission mode override. */ permissionMode?: string; + /** Skip all permission checks (maps to `--dangerously-skip-permissions`). */ + dangerouslySkipPermissions?: boolean; + /** Restrict enabled tools (maps to `--allowed-tools`, repeatable). */ + allowedTools?: string[]; /** Thread-level CLI `--config` overrides (take precedence over global). */ config?: Record; } diff --git a/sdks/typescript/src/spawn.ts b/sdks/typescript/src/spawn.ts index 3ab686a..d2c4362 100644 --- a/sdks/typescript/src/spawn.ts +++ b/sdks/typescript/src/spawn.ts @@ -106,6 +106,10 @@ export async function collectTurn(events: AsyncIterable): Prom finalResponse = event.finalResponse; usage = event.usage; sessionId = event.sessionId; + } else if (event.type === "turn.failed") { + throw new FrontalCodeCliError( + `frontal-code turn failed: ${(event as { error?: string }).error ?? "unknown error"}`, + ); } } diff --git a/sdks/typescript/src/thread.ts b/sdks/typescript/src/thread.ts index c08349d..a59f425 100644 --- a/sdks/typescript/src/thread.ts +++ b/sdks/typescript/src/thread.ts @@ -74,37 +74,37 @@ export class Thread { return { events: wrap() }; } - private toPromptAndImages(input: ThreadInput): { - prompt: string; - images: string[]; - } { + private toPrompt(input: ThreadInput): string { if (typeof input === "string") { - return { prompt: input, images: [] }; + return input; } + // `local_image` entries are kept in the protocol for forward compatibility, + // but the `frontal-code` CLI does not yet accept `--image`, so only text + // entries are concatenated into the prompt. const texts: string[] = []; - const images: string[] = []; for (const entry of input as InputEntry[]) { if (entry.type === "text") { texts.push(entry.text); - } else if (entry.type === "local_image") { - images.push(entry.path); } } - return { prompt: texts.join("\n"), images }; + return texts.join("\n"); } private buildArgs(input: ThreadInput, runOptions: ThreadRunOptions): string[] { - const { prompt, images } = this.toPromptAndImages(input); + const prompt = this.toPrompt(input); const args = ["prompt", "-p", prompt]; - for (const image of images) { - args.push("--image", image); - } if (this.options.provider) args.push("--provider", this.options.provider); if (this.options.model) args.push("--model", this.options.model); if (this.options.permissionMode) { args.push("--permission-mode", this.options.permissionMode); } + if (this.options.dangerouslySkipPermissions) { + args.push("--dangerously-skip-permissions"); + } + for (const tool of this.options.allowedTools ?? []) { + args.push("--allowed-tools", tool); + } args.push("--output-format", "json", "--stream"); if (this.sessionId) { diff --git a/sdks/typescript/tests/frontal-code.test.ts b/sdks/typescript/tests/frontal-code.test.ts index 1506ec5..973d6a8 100644 --- a/sdks/typescript/tests/frontal-code.test.ts +++ b/sdks/typescript/tests/frontal-code.test.ts @@ -31,31 +31,6 @@ describe("Frontal Code client", () => { expect(env.PATH).toBeDefined(); }); - it("injects required variables from the ambient environment", () => { - const previous = process.env.CODEX_API_KEY; - process.env.CODEX_API_KEY = "injected-key"; - try { - const frontal_code = new FrontalCode({ env: {} }); - const env = frontal_code.buildEnv(); - expect(env.CODEX_API_KEY).toBe("injected-key"); - } finally { - if (previous === undefined) delete process.env.CODEX_API_KEY; - else process.env.CODEX_API_KEY = previous; - } - }); - - it("does not overwrite a user-provided required variable", () => { - const previous = process.env.CODEX_API_KEY; - process.env.CODEX_API_KEY = "ambient"; - try { - const frontal_code = new FrontalCode({ env: { CODEX_API_KEY: "explicit" } }); - expect(frontal_code.buildEnv().CODEX_API_KEY).toBe("explicit"); - } finally { - if (previous === undefined) delete process.env.CODEX_API_KEY; - else process.env.CODEX_API_KEY = previous; - } - }); - it("routes spawned CLI calls to a mock binary", async () => { const mock = new MockFrontalCode({ response: '{"type":"turn.completed","finalResponse":"hi","sessionId":"s1"}', diff --git a/sdks/typescript/tests/thread.test.ts b/sdks/typescript/tests/thread.test.ts index b9ca8e8..f56082b 100644 --- a/sdks/typescript/tests/thread.test.ts +++ b/sdks/typescript/tests/thread.test.ts @@ -78,27 +78,42 @@ describe("Thread.run", () => { expect(args[resumeIndex + 1]).toBe("sess-1"); }); - it("emits --image for each local image entry", async () => { + it("concatenates multiple text entries into the prompt", async () => { const entries: InputEntry[] = [ - { type: "text", text: "describe these" }, - { type: "local_image", path: "./ui.png" }, - { type: "local_image", path: "./diagram.jpg" }, + { type: "text", text: "line one" }, + { type: "text", text: "line two" }, ]; const { args } = await capture((frontal_code) => frontal_code.startThread().run(entries)); - const imageIndexes = args.map((a, i) => (a === "--image" ? i : -1)).filter((i) => i > -1); - expect(imageIndexes).toHaveLength(2); - expect(args[imageIndexes[0] + 1]).toBe("./ui.png"); - expect(args[imageIndexes[1] + 1]).toBe("./diagram.jpg"); - expect(args).toContain("describe these"); + expect(args).toContain("line one\nline two"); }); - it("concatenates multiple text entries into the prompt", async () => { + it("does not pass --image (the CLI does not yet accept it)", async () => { const entries: InputEntry[] = [ - { type: "text", text: "line one" }, - { type: "text", text: "line two" }, + { type: "text", text: "describe this" }, + { type: "local_image", path: "./ui.png" }, ]; const { args } = await capture((frontal_code) => frontal_code.startThread().run(entries)); - expect(args).toContain("line one\nline two"); + expect(args).not.toContain("--image"); + expect(args).toContain("describe this"); + }); + + it("passes --dangerously-skip-permissions when set", async () => { + const { args } = await capture((frontal_code) => + frontal_code.startThread({ dangerouslySkipPermissions: true }).run("x"), + ); + expect(args).toContain("--dangerously-skip-permissions"); + }); + + it("passes --allowed-tools for each tool", async () => { + const { args } = await capture((frontal_code) => + frontal_code.startThread({ allowedTools: ["read", "bash"] }).run("x"), + ); + const toolIndexes = args + .map((a, i) => (a === "--allowed-tools" ? i : -1)) + .filter((i) => i > -1); + expect(toolIndexes).toHaveLength(2); + expect(args[toolIndexes[0] + 1]).toBe("read"); + expect(args[toolIndexes[1] + 1]).toBe("bash"); }); it("passes provider, model, and permission mode", async () => { From 2d5df5fa3b7af9f5d2aca704a40fc740f4320779 Mon Sep 17 00:00:00 2001 From: Gabriel Fonseca Date: Tue, 10 Nov 2026 16:03:48 +0000 Subject: [PATCH 2/2] chore: update banner image Co-Authored-By: Claude Haiku 5.5 --- banner.jpg | Bin 98505 -> 41062 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/banner.jpg b/banner.jpg index a5e96b60142436b54b5e4b840014d41b1e8debc2..27c4339a57cabe82470ad454f39c99f753e8621a 100644 GIT binary patch literal 41062 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 z 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 O{-uBZZT0-p{J#L(1O@E? literal 98505 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