feat(agent): add skipBootstrap config to skip bootstrap file creation (#292)

This commit is contained in:
Onur
2026-01-07 01:02:51 +08:00
committed by GitHub
parent 38aaa8563b
commit 6cf3570c5b
6 changed files with 25 additions and 7 deletions

View File

@@ -434,7 +434,11 @@ async function dockerContainerState(name: string) {
return { exists: true, running: result.stdout.trim() === "true" }; return { exists: true, running: result.stdout.trim() === "true" };
} }
async function ensureSandboxWorkspace(workspaceDir: string, seedFrom?: string) { async function ensureSandboxWorkspace(
workspaceDir: string,
seedFrom?: string,
skipBootstrap?: boolean,
) {
await fs.mkdir(workspaceDir, { recursive: true }); await fs.mkdir(workspaceDir, { recursive: true });
if (seedFrom) { if (seedFrom) {
const seed = resolveUserPath(seedFrom); const seed = resolveUserPath(seedFrom);
@@ -461,7 +465,10 @@ async function ensureSandboxWorkspace(workspaceDir: string, seedFrom?: string) {
} }
} }
} }
await ensureAgentWorkspace({ dir: workspaceDir, ensureBootstrapFiles: true }); await ensureAgentWorkspace({
dir: workspaceDir,
ensureBootstrapFiles: !skipBootstrap,
});
} }
function normalizeDockerLimit(value?: string | number) { function normalizeDockerLimit(value?: string | number) {
@@ -856,7 +863,11 @@ export async function resolveSandboxContext(params: {
: workspaceRoot; : workspaceRoot;
const seedWorkspace = const seedWorkspace =
params.workspaceDir?.trim() || DEFAULT_AGENT_WORKSPACE_DIR; params.workspaceDir?.trim() || DEFAULT_AGENT_WORKSPACE_DIR;
await ensureSandboxWorkspace(workspaceDir, seedWorkspace); await ensureSandboxWorkspace(
workspaceDir,
seedWorkspace,
params.config?.agent?.skipBootstrap,
);
const containerName = await ensureSandboxContainer({ const containerName = await ensureSandboxContainer({
sessionKey: rawSessionKey, sessionKey: rawSessionKey,
@@ -899,7 +910,11 @@ export async function ensureSandboxWorkspaceForSession(params: {
: workspaceRoot; : workspaceRoot;
const seedWorkspace = const seedWorkspace =
params.workspaceDir?.trim() || DEFAULT_AGENT_WORKSPACE_DIR; params.workspaceDir?.trim() || DEFAULT_AGENT_WORKSPACE_DIR;
await ensureSandboxWorkspace(workspaceDir, seedWorkspace); await ensureSandboxWorkspace(
workspaceDir,
seedWorkspace,
params.config?.agent?.skipBootstrap,
);
return { return {
workspaceDir, workspaceDir,

View File

@@ -219,7 +219,7 @@ export async function getReplyFromConfig(
const workspaceDirRaw = cfg.agent?.workspace ?? DEFAULT_AGENT_WORKSPACE_DIR; const workspaceDirRaw = cfg.agent?.workspace ?? DEFAULT_AGENT_WORKSPACE_DIR;
const workspace = await ensureAgentWorkspace({ const workspace = await ensureAgentWorkspace({
dir: workspaceDirRaw, dir: workspaceDirRaw,
ensureBootstrapFiles: true, ensureBootstrapFiles: !cfg.agent?.skipBootstrap,
}); });
const workspaceDir = workspace.dir; const workspaceDir = workspace.dir;
const timeoutMs = resolveAgentTimeoutMs({ cfg }); const timeoutMs = resolveAgentTimeoutMs({ cfg });

View File

@@ -162,7 +162,7 @@ export async function agentCommand(
const workspaceDirRaw = cfg.agent?.workspace ?? DEFAULT_AGENT_WORKSPACE_DIR; const workspaceDirRaw = cfg.agent?.workspace ?? DEFAULT_AGENT_WORKSPACE_DIR;
const workspace = await ensureAgentWorkspace({ const workspace = await ensureAgentWorkspace({
dir: workspaceDirRaw, dir: workspaceDirRaw,
ensureBootstrapFiles: true, ensureBootstrapFiles: !cfg.agent?.skipBootstrap,
}); });
const workspaceDir = workspace.dir; const workspaceDir = workspace.dir;

View File

@@ -824,6 +824,8 @@ export type ClawdbotConfig = {
models?: Record<string, AgentModelEntryConfig>; models?: Record<string, AgentModelEntryConfig>;
/** Agent working directory (preferred). Used as the default cwd for agent runs. */ /** Agent working directory (preferred). Used as the default cwd for agent runs. */
workspace?: string; workspace?: string;
/** Skip bootstrap (BOOTSTRAP.md creation, etc.) for pre-configured deployments. */
skipBootstrap?: boolean;
/** Optional IANA timezone for the user (used in system prompt; defaults to host timezone). */ /** Optional IANA timezone for the user (used in system prompt; defaults to host timezone). */
userTimezone?: string; userTimezone?: string;
/** Optional display-only context window override (used for % in status UIs). */ /** Optional display-only context window override (used for % in status UIs). */

View File

@@ -479,6 +479,7 @@ export const ClawdbotSchema = z.object({
) )
.optional(), .optional(),
workspace: z.string().optional(), workspace: z.string().optional(),
skipBootstrap: z.boolean().optional(),
userTimezone: z.string().optional(), userTimezone: z.string().optional(),
contextTokens: z.number().int().positive().optional(), contextTokens: z.number().int().positive().optional(),
tools: z tools: z

View File

@@ -200,7 +200,7 @@ export async function runCronIsolatedAgentTurn(params: {
params.cfg.agent?.workspace ?? DEFAULT_AGENT_WORKSPACE_DIR; params.cfg.agent?.workspace ?? DEFAULT_AGENT_WORKSPACE_DIR;
const workspace = await ensureAgentWorkspace({ const workspace = await ensureAgentWorkspace({
dir: workspaceDirRaw, dir: workspaceDirRaw,
ensureBootstrapFiles: true, ensureBootstrapFiles: !params.cfg.agent?.skipBootstrap,
}); });
const workspaceDir = workspace.dir; const workspaceDir = workspace.dir;