From f753ac8fc83e845b2e2c02f9dc81dfc625320791 Mon Sep 17 00:00:00 2001 From: Fabro Date: Wed, 1 Jul 2026 21:34:40 +0000 Subject: [PATCH] fabro(01KWFGXZ5P42QRWBYAPVEAXMX6): simplify_gpt (succeeded) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fabro-Run: 01KWFGXZ5P42QRWBYAPVEAXMX6 Fabro-Completed: 7 ⚒️ Generated with [Fabro](https://fabro.sh) --- lib/crates/fabro-hooks/src/executor.rs | 4 +-- lib/crates/fabro-hooks/src/secrets.rs | 28 +++++++++---------- lib/crates/fabro-sandbox/src/provider.rs | 2 +- .../fabro-sandbox/src/provider/docker.rs | 2 +- lib/crates/fabro-sandbox/src/sandbox_spec.rs | 10 +++---- lib/crates/fabro-server/src/run_manifest.rs | 2 +- .../fabro-workflow/src/operations/start.rs | 4 ++- 7 files changed, 26 insertions(+), 26 deletions(-) diff --git a/lib/crates/fabro-hooks/src/executor.rs b/lib/crates/fabro-hooks/src/executor.rs index 2e40bfe46..6597fb937 100644 --- a/lib/crates/fabro-hooks/src/executor.rs +++ b/lib/crates/fabro-hooks/src/executor.rs @@ -21,7 +21,7 @@ use tokio::time::timeout as tokio_timeout; use tokio_util::sync::CancellationToken; use crate::config::{HookDefinition, HookType, TlsMode}; -use crate::secrets::ResolvedHookSecrets; +use crate::secrets::{ResolvedHookSecrets, first_secret_name}; use crate::types::{ HookContext, HookDecision, HookExecutionContext, HookResult, PromptHookResponse, }; @@ -154,7 +154,7 @@ fn resolve_header( where E: Env + ?Sized, { - if let Some(name) = value.names(Namespace::Secrets).into_iter().next() { + if let Some(name) = first_secret_name(value) { return Err(HeaderResolveError::SecretNotAllowed { name: name.to_string(), }); diff --git a/lib/crates/fabro-hooks/src/secrets.rs b/lib/crates/fabro-hooks/src/secrets.rs index 3ffcd9b27..120119600 100644 --- a/lib/crates/fabro-hooks/src/secrets.rs +++ b/lib/crates/fabro-hooks/src/secrets.rs @@ -4,6 +4,7 @@ use std::pin::Pin; use std::sync::Arc; use fabro_redact::SecretRedactor; +use fabro_types::settings::InterpString; use fabro_types::settings::interp::Namespace; use crate::config::{HookDefinition, HookType}; @@ -108,34 +109,31 @@ impl ResolvedHookSecrets { } } +pub(crate) fn secret_names(value: &InterpString) -> Vec<&str> { + value.names(Namespace::Secrets) +} + +pub(crate) fn first_secret_name(value: &InterpString) -> Option<&str> { + secret_names(value).into_iter().next() +} + fn secret_names_for_definition(definition: &HookDefinition) -> Vec { let Some(hook_type) = definition.resolved_hook_type() else { return Vec::new(); }; match hook_type.as_ref() { - HookType::Command { command } => command - .names(Namespace::Secrets) - .into_iter() - .map(str::to_string) - .collect(), - HookType::Http { url, .. } => url - .names(Namespace::Secrets) + HookType::Command { command } => secret_names(command) .into_iter() .map(str::to_string) .collect(), + HookType::Http { url, .. } => secret_names(url).into_iter().map(str::to_string).collect(), HookType::Prompt { prompt, model } | HookType::Agent { prompt, model, .. } => { - let mut names: Vec = prompt - .names(Namespace::Secrets) + let mut names: Vec = secret_names(prompt) .into_iter() .map(str::to_string) .collect(); if let Some(model) = model { - names.extend( - model - .names(Namespace::Secrets) - .into_iter() - .map(str::to_string), - ); + names.extend(secret_names(model).into_iter().map(str::to_string)); } names } diff --git a/lib/crates/fabro-sandbox/src/provider.rs b/lib/crates/fabro-sandbox/src/provider.rs index b72d64efc..360e8d8a6 100644 --- a/lib/crates/fabro-sandbox/src/provider.rs +++ b/lib/crates/fabro-sandbox/src/provider.rs @@ -26,7 +26,7 @@ pub enum SandboxCreateSpec { Local, #[cfg(feature = "docker")] Docker { - config: DockerSandboxOptions, + config: Box, github_app: Option, run_id: Option, clone_origin_url: Option, diff --git a/lib/crates/fabro-sandbox/src/provider/docker.rs b/lib/crates/fabro-sandbox/src/provider/docker.rs index f1f8bb725..3e81e5f28 100644 --- a/lib/crates/fabro-sandbox/src/provider/docker.rs +++ b/lib/crates/fabro-sandbox/src/provider/docker.rs @@ -99,7 +99,7 @@ impl SandboxProvider for DockerSandboxProvider { }; let sandbox = - DockerSandbox::new(config, github_app, run_id, clone_origin_url, clone_branch)?; + DockerSandbox::new(*config, github_app, run_id, clone_origin_url, clone_branch)?; sandbox.initialize().await?; let container_id = sandbox.container_identifier()?.to_string(); self.get(&container_id).await?.ok_or_else(|| { diff --git a/lib/crates/fabro-sandbox/src/sandbox_spec.rs b/lib/crates/fabro-sandbox/src/sandbox_spec.rs index b6a56bd40..5b8ead6d0 100644 --- a/lib/crates/fabro-sandbox/src/sandbox_spec.rs +++ b/lib/crates/fabro-sandbox/src/sandbox_spec.rs @@ -27,7 +27,7 @@ pub enum SandboxSpec { }, #[cfg(feature = "docker")] Docker { - config: DockerSandboxOptions, + config: Box, github_app: Option, run_id: Option, clone_origin_url: Option, @@ -204,7 +204,7 @@ impl SandboxSpec { clone_branch, } => { let mut sandbox = DockerSandbox::new( - config.clone(), + config.as_ref().clone(), github_app.clone(), *run_id, clone_origin_url.clone(), @@ -271,7 +271,7 @@ mod tests { #[test] fn docker_run_sandbox_persists_layout_metadata_for_cloned_repo() { let spec = SandboxSpec::Docker { - config: DockerSandboxOptions::default(), + config: Box::new(DockerSandboxOptions::default()), github_app: None, run_id: None, clone_origin_url: Some("git@github.com:brynary/rack-test.git".to_string()), @@ -306,10 +306,10 @@ mod tests { #[test] fn docker_run_sandbox_omits_primary_repo_metadata_for_empty_workspace() { let spec = SandboxSpec::Docker { - config: DockerSandboxOptions { + config: Box::new(DockerSandboxOptions { skip_clone: true, ..DockerSandboxOptions::default() - }, + }), github_app: None, run_id: None, clone_origin_url: Some("https://gitlab.com/acme/widgets".to_string()), diff --git a/lib/crates/fabro-server/src/run_manifest.rs b/lib/crates/fabro-server/src/run_manifest.rs index d7794be48..fe328c7d3 100644 --- a/lib/crates/fabro-server/src/run_manifest.rs +++ b/lib/crates/fabro-server/src/run_manifest.rs @@ -890,7 +890,7 @@ fn preflight_sandbox_spec( let mut config = resolve_docker_config(resolved_run); config.skip_clone = true; SandboxSpec::Docker { - config, + config: Box::new(config), github_app, run_id: None, clone_origin_url, diff --git a/lib/crates/fabro-workflow/src/operations/start.rs b/lib/crates/fabro-workflow/src/operations/start.rs index 9036e8032..c2d803c28 100644 --- a/lib/crates/fabro-workflow/src/operations/start.rs +++ b/lib/crates/fabro-workflow/src/operations/start.rs @@ -429,7 +429,9 @@ impl RunSession { SandboxSpec::Local { working_directory } } SandboxProviderKind::Docker => SandboxSpec::Docker { - config: resolve_docker_config(resolved, |name| secret_lookup(name))?, + config: Box::new(resolve_docker_config(resolved, |name| { + secret_lookup(name) + })?), github_app: services.github_app.clone(), run_id: Some(record.run_id), clone_origin_url: record.repo_origin_url().map(str::to_string),