From dba09058f5224e7260fbf4c9acb92e3cf2c58816 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 6 Jan 2026 21:33:53 +0000 Subject: [PATCH] fix(agents): default agent dir to multi-agent path --- docs/configuration.md | 4 +-- src/agents/agent-paths.test.ts | 58 ++++++++++++++++++++++++++++++++++ src/agents/agent-paths.ts | 17 +++++++--- 3 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 src/agents/agent-paths.test.ts diff --git a/docs/configuration.md b/docs/configuration.md index b4881fc04..680dac9e7 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -105,7 +105,7 @@ Legacy agent dir (pre multi-agent): Overrides: - OAuth dir (legacy import only): `CLAWDBOT_OAUTH_DIR` -- Agent dir (legacy/default agent only): `CLAWDBOT_AGENT_DIR` (preferred), `PI_CODING_AGENT_DIR` (legacy) +- Agent dir (default agent root override): `CLAWDBOT_AGENT_DIR` (preferred), `PI_CODING_AGENT_DIR` (legacy) On first use, Clawdbot imports `oauth.json` entries into `auth-profiles.json`. @@ -1023,7 +1023,7 @@ Notes: `google-generative-ai` - Use `authHeader: true` + `headers` for custom auth needs. - Override the agent config root with `CLAWDBOT_AGENT_DIR` (or `PI_CODING_AGENT_DIR`) - if you want `models.json` stored elsewhere. + if you want `models.json` stored elsewhere (default: `~/.clawdbot/agents/main/agent`). ### `session` diff --git a/src/agents/agent-paths.test.ts b/src/agents/agent-paths.test.ts new file mode 100644 index 000000000..e70f93717 --- /dev/null +++ b/src/agents/agent-paths.test.ts @@ -0,0 +1,58 @@ +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; + +import { afterEach, describe, expect, it } from "vitest"; + +import { resolveClawdbotAgentDir } from "./agent-paths.js"; + +describe("resolveClawdbotAgentDir", () => { + const previousStateDir = process.env.CLAWDBOT_STATE_DIR; + const previousAgentDir = process.env.CLAWDBOT_AGENT_DIR; + const previousPiAgentDir = process.env.PI_CODING_AGENT_DIR; + let tempStateDir: string | null = null; + + afterEach(async () => { + if (tempStateDir) { + await fs.rm(tempStateDir, { recursive: true, force: true }); + tempStateDir = null; + } + if (previousStateDir === undefined) { + delete process.env.CLAWDBOT_STATE_DIR; + } else { + process.env.CLAWDBOT_STATE_DIR = previousStateDir; + } + if (previousAgentDir === undefined) { + delete process.env.CLAWDBOT_AGENT_DIR; + } else { + process.env.CLAWDBOT_AGENT_DIR = previousAgentDir; + } + if (previousPiAgentDir === undefined) { + delete process.env.PI_CODING_AGENT_DIR; + } else { + process.env.PI_CODING_AGENT_DIR = previousPiAgentDir; + } + }); + + it("defaults to the multi-agent path when no overrides are set", async () => { + tempStateDir = await fs.mkdtemp(path.join(os.tmpdir(), "clawdbot-agent-")); + process.env.CLAWDBOT_STATE_DIR = tempStateDir; + delete process.env.CLAWDBOT_AGENT_DIR; + delete process.env.PI_CODING_AGENT_DIR; + + const resolved = resolveClawdbotAgentDir(); + + expect(resolved).toBe(path.join(tempStateDir, "agents", "main", "agent")); + }); + + it("honors CLAWDBOT_AGENT_DIR overrides", async () => { + tempStateDir = await fs.mkdtemp(path.join(os.tmpdir(), "clawdbot-agent-")); + const override = path.join(tempStateDir, "agent"); + process.env.CLAWDBOT_AGENT_DIR = override; + delete process.env.PI_CODING_AGENT_DIR; + + const resolved = resolveClawdbotAgentDir(); + + expect(resolved).toBe(path.resolve(override)); + }); +}); diff --git a/src/agents/agent-paths.ts b/src/agents/agent-paths.ts index 2fe019e75..1dd54ea81 100644 --- a/src/agents/agent-paths.ts +++ b/src/agents/agent-paths.ts @@ -1,14 +1,21 @@ import path from "node:path"; -import { resolveConfigDir, resolveUserPath } from "../utils.js"; +import { resolveStateDir } from "../config/paths.js"; +import { DEFAULT_AGENT_ID } from "../routing/session-key.js"; +import { resolveUserPath } from "../utils.js"; export function resolveClawdbotAgentDir(): string { - const defaultAgentDir = path.join(resolveConfigDir(), "agent"); const override = process.env.CLAWDBOT_AGENT_DIR?.trim() || - process.env.PI_CODING_AGENT_DIR?.trim() || - defaultAgentDir; - return resolveUserPath(override); + process.env.PI_CODING_AGENT_DIR?.trim(); + if (override) return resolveUserPath(override); + const defaultAgentDir = path.join( + resolveStateDir(), + "agents", + DEFAULT_AGENT_ID, + "agent", + ); + return resolveUserPath(defaultAgentDir); } export function ensureClawdbotAgentEnv(): string {