mirror of
https://github.com/fabro-sh/fabro.git
synced 2026-10-17 04:37:03 +00:00
Some checks failed
Rust / Format (push) Has been cancelled
Rust / Clippy (push) Has been cancelled
Rust / Generated Docs (push) Has been cancelled
TypeScript / Build (push) Has been cancelled
Rust / Test (Linux) (push) Has been cancelled
Rust / Test (macOS) (push) Has been cancelled
TypeScript / Typecheck (push) Has been cancelled
TypeScript / Test (push) Has been cancelled
## Problem The `local` sandbox uses the run's `source_directory` (the CLI's cwd at invocation time) as its working directory and `create_dir_all`s it on the server (`LocalSandbox::initialize` in `fabro-sandbox`). That is correct when the CLI and the server share a host — the agent operates directly on the user's project tree. When the server is **remote** from the CLI — e.g. `fabro serve` running in a container in Kubernetes, driven over HTTP with the `local` sandbox — the client's cwd (e.g. `/Users/alice/project`) does not exist on the server. The sandbox then tries to create that path as the (often unprivileged) server user and fails at init: ``` sandbox.failed provider="local" error="Failed to create working directory" causes=["Permission denied (os error 13)"] ``` and the run dies with `workflow_error` before the agent starts. ## Fix When `source_directory` is absent or does not exist on the server, fall back to a server-writable `workspace` directory under the run's scratch dir instead of recreating the client path. **Same-host behavior is unchanged**: an existing `source_directory` is still used as-is. The selection is extracted into a small pure helper, `local_working_directory(source_directory, run_dir)`, so it can be unit-tested directly. ## Testing - `cargo test -p fabro-workflow local_working_directory` — 3 new tests (existing source dir → used; absent → fallback; present-but-missing-on-server → fallback) - `cargo check -p fabro-workflow` 🤖 Generated with [Claude Code](https://claude.com/claude-code) Thanks for fabro @brynary! --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
52 lines
1.7 KiB
TypeScript
Generated
52 lines
1.7 KiB
TypeScript
Generated
/* tslint:disable */
|
|
/* eslint-disable */
|
|
/**
|
|
* Fabro Run API
|
|
* HTTP API for managing Fabro workflow run executions.
|
|
*
|
|
* The version of the OpenAPI document: 0.1.0
|
|
*
|
|
*
|
|
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
|
* https://openapi-generator.tech
|
|
* Do not edit the class manually.
|
|
*/
|
|
|
|
|
|
// May contain unused imports in some cases
|
|
// @ts-ignore
|
|
import type { EnvironmentApiImageSettings } from './environment-api-image-settings';
|
|
// May contain unused imports in some cases
|
|
// @ts-ignore
|
|
import type { EnvironmentLifecycleSettings } from './environment-lifecycle-settings';
|
|
// May contain unused imports in some cases
|
|
// @ts-ignore
|
|
import type { EnvironmentNetworkSettings } from './environment-network-settings';
|
|
// May contain unused imports in some cases
|
|
// @ts-ignore
|
|
import type { EnvironmentProvider } from './environment-provider';
|
|
// May contain unused imports in some cases
|
|
// @ts-ignore
|
|
import type { EnvironmentResourcesSettings } from './environment-resources-settings';
|
|
|
|
/**
|
|
* Public server-managed environment definition.
|
|
*/
|
|
export interface Environment {
|
|
'id': string;
|
|
/**
|
|
* Stable revision used with `If-Match` for optimistic concurrency.
|
|
*/
|
|
'revision': string;
|
|
'provider': EnvironmentProvider;
|
|
/**
|
|
* Local-provider command working directory for this environment. Docker and Daytona ignore this value.
|
|
*/
|
|
'cwd'?: string | null;
|
|
'image': EnvironmentApiImageSettings;
|
|
'resources': EnvironmentResourcesSettings;
|
|
'network': EnvironmentNetworkSettings;
|
|
'lifecycle': EnvironmentLifecycleSettings;
|
|
'labels': { [key: string]: string; };
|
|
'env': { [key: string]: string; };
|
|
}
|