工作区后端

工作区后端决定内置工作区工具从哪里读写文件。默认后端是以会话工作区为根目录的 本地文件系统。四种 SDK 都提供显式本地后端、S3 兼容对象存储后端,以及可选的 HTTP/JSON 远端 Git 配置。Node.js 与 Python 使用后端对象,Go 使用值配置。

当宿主负责工作区放置时使用这组能力:本地开发、浏览器或容器工作区、对象存储 工作区、托管会话等。Rust 宿主还可以通过实现工作区 trait 提供自己的后端;见 宿主提供的后端。

特性开关

本地后端和远端 Git 始终编译在内。S3 后端受 Cargo 特性 s3 控制,server 和 full 特性都包含它(core/Cargo.toml);Core 的默认特性集只有 local-code。

包发布构建是否包含 S3
a3s-code-core(Rust)仅在启用 s3、server 或 full 时包含。
@a3s-lab/code(Node.js)包含;发布的 addon 以 advanced-harness,server 构建。
a3s-code(Python)包含;发布的 wheel 以 server 构建。没有该特性时不导出 S3WorkspaceBackend。
Go bridge(a3s-code-go-bridge)不包含;发布的 bridge 使用默认特性,S3 后端会以 FEATURE_DISABLED 失败。以 --features s3(或 server)构建 bridge 才能启用。

能力矩阵

后端文件工具搜索工具命令行与本地 Git
默认本地工作区read、write、edit、patch、download、lssearch(grep、glob、bm25 模式)bash、git
LocalWorkspaceBackend与默认本地工作区相同与默认本地工作区相同与默认本地工作区相同
S3WorkspaceBackendread、write、edit、patch、ls设置 searchEnabled 后可使用 search不注册
S3WorkspaceBackend + remoteGitS3 文件工具可选降级版 S3 搜索通过远端 Git 提供 git,不提供 bash
宿主提供(Rust)read、write、edit、patch、ls宿主挂载搜索后提供 search仅提供宿主挂载的能力

download 只为可写的本地根目录注册。code_symbols、code_navigation 和 code_diagnostics 只有在后端携带代码智能提供者时才注册;默认本地后端没有提供者。

对象存储不能执行本地进程。不要承诺 S3 工作区上可以直接运行命令,除非宿主通过 MCP 或 A3S Box 额外提供隔离后的执行能力。

本地后端

显式本地后端适合宿主希望本地与远程会话都使用同一组选项接口的场景。

Rust
Node.js
Python
Go
Rust
use a3s_code_core::{Agent, SessionOptions, WorkspaceServices};
#[tokio::main]
async fn main() -> a3s_code_core::Result<()> {
let agent = Agent::new("agent.acl").await?;
let backend = WorkspaceServices::local("/repo");
let session = agent
.session_builder("/repo")
.options(SessionOptions::new().with_workspace_backend(backend))
.build()
.await?;
println!("{}", session.read_file("Cargo.toml").await?);
session.close().await;
agent.close().await;
Ok(())
}

本地下载目标

可写的本地后端还会注册 download。工具接收公网 HTTP(S) url,并且只能写入工作区 相对 file_path;省略路径时会推断并净化文件名。S3 和其他非本地后端不会注册它,因为 相邻原子临时文件、取消清理、符号链接检查和最终提升都依赖本地文件系统语义。

overwrite 默认 false。传输默认使用 512 MiB 的 max_bytes 上限和 300 秒 timeout,硬上限分别是 8 GiB 与 3600 秒。Range 并发会自适应选择,也可以明确限制为 1–4 个连接;expected_sha256 可要求在提升目标前匹配 64 位十六进制摘要。传输与元数据 细节见工具。

S3 后端

S3WorkspaceBackend 会把内置文件工具指向任意 S3 兼容服务,包括 AWS S3、MinIO、 RustFS、Cloudflare R2 和 Backblaze B2。

Rust
Node.js
Python
Go

Rust crate 需要启用 s3 feature。

S3 搜索需要显式启用。启用后,grep / glob 会降级为对象列表和有上限的下载。 当存储桶较大或端点会限流时,应配置 maxObjectsScanned、 maxGrepBytesPerObject 和 searchConcurrency。

S3 选项

Node.js 选项Python 选项必填作用
bucketbucket是存储工作区对象的 S3 存储桶。
prefixprefix是存储桶内的逻辑工作区根;使用 "" 表示存储桶根。
accessKeyIdaccess_key_id是访问密钥标识,通常从宿主环境读取。
secretAccessKeysecret_access_key是访问密钥,通常从宿主环境或密钥管理系统读取。
endpointendpoint否自定义 S3 兼容端点;AWS S3 默认端点可省略。
regionregion否区域;省略时默认为 us-east-1。
sessionTokensession_token否使用临时凭据时的 STS 会话令牌。
forcePathStyleforce_path_style否MinIO、RustFS 和多数非 AWS 端点通常设为 true。
maxReadBytesmax_read_bytes否单次读取的大小上限;默认 10 MiB。
searchEnabledsearch_enabled否启用降级版 S3 grep / glob;默认为 false。
maxObjectsScannedmax_objects_scanned否单次搜索扫描对象数上限;默认 500,仅启用搜索时使用。
maxGrepBytesPerObjectmax_grep_bytes_per_object否grep 的单对象下载上限;默认 1 MiB,仅启用搜索时使用。
searchConcurrencysearch_concurrency否grep 时并发下载对象数;默认 8,仅启用搜索时使用。

Go 在 S3BackendConfig 上提供同一组字段:Bucket、Prefix、 AccessKeyID、SecretAccessKey、Endpoint、Region、SessionToken、 ForcePathStyle、MaxReadBytes、SearchEnabled、MaxObjectsScanned、 MaxGrepBytesPerObject 与 SearchConcurrency。Go 还接受 RequestTimeoutMS,即单次 S3 请求的超时时间;Node.js 和 Python 后端不提供该选项。

远端 Git

remoteGit 会在 workspaceBackend 之上挂载 HTTP/JSON Git 提供程序。它用于没有 本地 .git 目录的非本地工作区。

remoteGit 必须和 workspaceBackend 一起传;单独传入会被拒绝。

Rust
Node.js
Python
Go

不要把远端 Git 凭据写入 agent.acl 或智能体目录。应由宿主通过环境变量或密钥 管理系统注入。

远端 Git 选项

Node.js 选项Python 选项必填作用
baseUrlbase_url是远端 Git 服务的基础 URL,不带末尾斜杠。
repoIdrepo_id是与远端 Git 服务约定的不透明仓库标识。
bearerTokenbearer_token生产环境远端 Git 服务的持有者令牌;只应在受信任开发环境中省略。
clientCertPemclient_cert_pem否mTLS 客户端证书路径;必须与客户端密钥成对设置。
clientKeyPemclient_key_pem否mTLS 客户端密钥路径;必须与证书成对设置。
requestTimeoutMsrequest_timeout_ms否单次 HTTP 调用超时,单位毫秒;默认 30000。
maxDiffBytesmax_diff_bytes否diff 响应字节数客户端上限;默认 1 MiB。
maxLogEntriesmax_log_entries否log 条目数客户端上限;默认 200。

Go 在 RemoteGitBackendConfig 上提供同一组字段:BaseURL、RepoID、 BearerToken、ClientCertPEM、ClientKeyPEM、RequestTimeoutMS、 MaxDiffBytes 与 MaxLogEntries。

宿主提供的后端

Rust 宿主可以实现 WorkspaceFileSystem(read_text、write_text、list_dir),并可 选实现 WorkspaceCommandRunner、WorkspaceSearch 和 WorkspaceGit,用自己的存储支撑 session。这些 trait 都是 Send + Sync,并从 crate 根导出。WorkspaceServices::builder 初始只具备读写能力;每挂载一个服务,就会启用对应的能力和工具。

Rust
use std::sync::Arc;
use a3s_code_core::{SessionOptions, WorkspaceFileSystem, WorkspaceRef, WorkspaceServices};
fn host_backend(files: Arc<dyn WorkspaceFileSystem>) -> SessionOptions {
let services = WorkspaceServices::builder(
WorkspaceRef::new("tenant-42/workspace", "/workspace"),
files,
)
.build();
SessionOptions::new().with_workspace_backend(services)
}

挂载 .command_runner(...) 提供 bash,.search(...) 提供 search,.git(...) 提供 git,.code_intelligence(...) 提供代码智能工具。非本地后端保留自己的命令执行器:原生 Bash 沙箱只适用于本地 workspace,因此宿主需要自行约束它执行的命令。效果隔离从不复用 宿主提供的后端。Node.js、Python 和 Go SDK 不暴露自定义后端。

选择后端

  • 普通开发机和 CI 检出使用默认本地工作区。
  • 宿主希望总是传入带类型的后端对象时,使用 LocalWorkspaceBackend。
  • 工作区状态必须落在对象存储中时,使用 S3WorkspaceBackend。
  • 非本地工作区仍需要内置 git 工具时,追加 remoteGit。
  • 当前后端不能直接运行命令时,通过 MCP 或 A3S Box 提供执行能力。