fix(coding-agent): expand ~ in sessionDir

closes #3514
This commit is contained in:
Mario Zechner
2026-04-22 00:21:57 +02:00
parent 759d551527
commit 60290b0d75
4 changed files with 21 additions and 2 deletions

View File

@@ -4,6 +4,7 @@
### Fixed
- Fixed `sessionDir` in `settings.json` to expand `~`, so portable session-directory settings no longer require a shell wrapper ([#3514](https://github.com/badlogic/pi-mono/issues/3514))
- Fixed parallel tool-call rows to leave the pending state as soon as each tool is finalized, while still appending persisted tool results in assistant source order ([#3503](https://github.com/badlogic/pi-mono/issues/3503))
- Fixed exported session markdown to render Markdown while showing HTML-like message content such as `<file name="...">...</file>` verbatim, so shared sessions match the TUI instead of letting the browser interpret message text ([#3484](https://github.com/badlogic/pi-mono/issues/3484))

View File

@@ -132,7 +132,7 @@ When a provider requests a retry delay longer than `maxDelayMs` (e.g., Google's
| Setting | Type | Default | Description |
|---------|------|---------|-------------|
| `sessionDir` | string | - | Directory where session files are stored. Accepts absolute or relative paths. |
| `sessionDir` | string | - | Directory where session files are stored. Accepts absolute or relative paths, plus `~`. |
```json
{ "sessionDir": ".pi/sessions" }

View File

@@ -1,5 +1,6 @@
import type { Transport } from "@mariozechner/pi-ai";
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
import { homedir } from "os";
import { dirname, join } from "path";
import lockfile from "proper-lockfile";
import { CONFIG_DIR_NAME, getAgentDir } from "../config.js";
@@ -534,7 +535,17 @@ export class SettingsManager {
}
getSessionDir(): string | undefined {
return this.settings.sessionDir;
const sessionDir = this.settings.sessionDir;
if (!sessionDir) {
return sessionDir;
}
if (sessionDir === "~") {
return homedir();
}
if (sessionDir.startsWith("~/")) {
return join(homedir(), sessionDir.slice(2));
}
return sessionDir;
}
getDefaultProvider(): string | undefined {

View File

@@ -1,4 +1,5 @@
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "fs";
import { homedir } from "os";
import { join } from "path";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { SettingsManager } from "../src/core/settings-manager.js";
@@ -308,5 +309,11 @@ describe("SettingsManager", () => {
const manager = SettingsManager.create(projectDir, agentDir);
expect(manager.getSessionDir()).toBe("./sessions");
});
it("should expand ~ in sessionDir", () => {
writeFileSync(join(agentDir, "settings.json"), JSON.stringify({ sessionDir: "~/sessions" }));
const manager = SettingsManager.create(projectDir, agentDir);
expect(manager.getSessionDir()).toBe(join(homedir(), "sessions"));
});
});
});