chore(vendor): import pi 1.3.0
Imported as a linear vendor commit so forge rebases do not replay the upstream root tree. git-subtree-dir: third_party/pi git-subtree-split: 71023aec1546d6d677a65669c5665c0927ce0dd0
This commit is contained in:
@@ -111,6 +111,23 @@ describe("SettingsManager", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("deviceId", () => {
|
||||
it("creates one global device ID and reuses it in later processes", async () => {
|
||||
const settingsPath = join(agentDir, "settings.json");
|
||||
writeFileSync(settingsPath, JSON.stringify({ theme: "dark" }));
|
||||
writeFileSync(join(projectDir, ".pi", "settings.json"), JSON.stringify({ deviceId: "project-device" }));
|
||||
const first = SettingsManager.create(projectDir, agentDir);
|
||||
|
||||
const deviceId = first.getOrCreateDeviceId();
|
||||
await first.flush();
|
||||
|
||||
expect(deviceId).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/);
|
||||
expect(first.getOrCreateDeviceId()).toBe(deviceId);
|
||||
expect(SettingsManager.create(projectDir, agentDir).getOrCreateDeviceId()).toBe(deviceId);
|
||||
expect(JSON.parse(readFileSync(settingsPath, "utf-8"))).toEqual({ theme: "dark", deviceId });
|
||||
});
|
||||
});
|
||||
|
||||
describe("packages migration", () => {
|
||||
it("should keep local-only extensions in extensions array", () => {
|
||||
const settingsPath = join(agentDir, "settings.json");
|
||||
@@ -354,6 +371,22 @@ describe("SettingsManager", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("retry settings", () => {
|
||||
it("defaults and overrides agent retry delay cap", () => {
|
||||
expect(SettingsManager.inMemory().getRetrySettings()).toEqual({
|
||||
enabled: true,
|
||||
maxRetries: 3,
|
||||
baseDelayMs: 2000,
|
||||
maxAgentDelayMs: 60000,
|
||||
});
|
||||
expect(
|
||||
SettingsManager.inMemory({
|
||||
retry: { enabled: true, maxRetries: 10, baseDelayMs: 500, maxAgentDelayMs: 5000 },
|
||||
}).getRetrySettings(),
|
||||
).toEqual({ enabled: true, maxRetries: 10, baseDelayMs: 500, maxAgentDelayMs: 5000 });
|
||||
});
|
||||
});
|
||||
|
||||
describe("httpIdleTimeoutMs", () => {
|
||||
it("should default to 5 minutes", () => {
|
||||
const manager = SettingsManager.create(projectDir, agentDir);
|
||||
@@ -377,6 +410,30 @@ describe("SettingsManager", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("cacheWarming", () => {
|
||||
it("defaults to streaming and ignores project settings", () => {
|
||||
expect(SettingsManager.create(projectDir, agentDir).getCacheWarmingMode()).toBe("streaming");
|
||||
|
||||
writeFileSync(join(projectDir, ".pi", "settings.json"), JSON.stringify({ cacheWarming: "idle" }));
|
||||
expect(SettingsManager.create(projectDir, agentDir).getCacheWarmingMode()).toBe("streaming");
|
||||
|
||||
writeFileSync(join(agentDir, "settings.json"), JSON.stringify({ cacheWarming: "idle" }));
|
||||
expect(SettingsManager.create(projectDir, agentDir).getCacheWarmingMode()).toBe("idle");
|
||||
|
||||
writeFileSync(join(agentDir, "settings.json"), JSON.stringify({ cacheWarming: "bogus" }));
|
||||
expect(SettingsManager.create(projectDir, agentDir).getCacheWarmingMode()).toBe("streaming");
|
||||
});
|
||||
|
||||
it("persists the mode globally", async () => {
|
||||
const manager = SettingsManager.create(projectDir, agentDir);
|
||||
manager.setCacheWarmingMode("off");
|
||||
await manager.flush();
|
||||
|
||||
expect(SettingsManager.create(projectDir, agentDir).getCacheWarmingMode()).toBe("off");
|
||||
expect(JSON.parse(readFileSync(join(agentDir, "settings.json"), "utf8"))).toEqual({ cacheWarming: "off" });
|
||||
});
|
||||
});
|
||||
|
||||
describe("externalEditor", () => {
|
||||
const originalVisual = process.env.VISUAL;
|
||||
const originalEditor = process.env.EDITOR;
|
||||
@@ -421,33 +478,33 @@ describe("SettingsManager", () => {
|
||||
});
|
||||
|
||||
describe("TUI mode", () => {
|
||||
it("defaults to regular and persists fullscreen mode", async () => {
|
||||
it("defaults to fullscreen and persists regular mode", async () => {
|
||||
const manager = SettingsManager.create(projectDir, agentDir);
|
||||
|
||||
expect(manager.getTuiMode()).toBe("regular");
|
||||
expect(manager.getTuiMode()).toBe("fullscreen");
|
||||
|
||||
manager.setTuiMode("fullscreen");
|
||||
manager.setTuiMode("regular");
|
||||
await manager.flush();
|
||||
|
||||
expect(manager.getTuiMode()).toBe("fullscreen");
|
||||
expect(manager.getTuiMode()).toBe("regular");
|
||||
const savedSettings = JSON.parse(readFileSync(join(agentDir, "settings.json"), "utf-8"));
|
||||
expect(savedSettings.tuiMode).toBe("fullscreen");
|
||||
expect(savedSettings.tuiMode).toBe("regular");
|
||||
});
|
||||
|
||||
it("falls back to regular for unsupported values", () => {
|
||||
it("falls back to fullscreen for unsupported values", () => {
|
||||
writeFileSync(join(agentDir, "settings.json"), JSON.stringify({ tuiMode: "other" }));
|
||||
|
||||
const manager = SettingsManager.create(projectDir, agentDir);
|
||||
|
||||
expect(manager.getTuiMode()).toBe("regular");
|
||||
expect(manager.getTuiMode()).toBe("fullscreen");
|
||||
});
|
||||
|
||||
it("does not recognize the old uiMode setting", () => {
|
||||
writeFileSync(join(agentDir, "settings.json"), JSON.stringify({ uiMode: "fullscreen" }));
|
||||
writeFileSync(join(agentDir, "settings.json"), JSON.stringify({ uiMode: "regular" }));
|
||||
|
||||
const manager = SettingsManager.create(projectDir, agentDir);
|
||||
|
||||
expect(manager.getTuiMode()).toBe("regular");
|
||||
expect(manager.getTuiMode()).toBe("fullscreen");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -476,6 +533,27 @@ describe("SettingsManager", () => {
|
||||
expect(reloadedManager.getFullscreenCopyOnSelect()).toBe(true);
|
||||
});
|
||||
|
||||
// #9758: wheel scrolling defaults to auto, persists line counts, and ignores invalid values.
|
||||
it("persists fullscreen wheel scroll lines", async () => {
|
||||
const manager = SettingsManager.create(projectDir, agentDir);
|
||||
expect(manager.getFullscreenWheelScrollLines()).toBe("auto");
|
||||
|
||||
manager.setFullscreenWheelScrollLines(3);
|
||||
await manager.flush();
|
||||
expect(JSON.parse(readFileSync(join(agentDir, "settings.json"), "utf-8")).fullscreenWheelScrollLines).toBe(3);
|
||||
|
||||
for (const [value, expected] of [
|
||||
[7.9, 7],
|
||||
[0, 1],
|
||||
[1000, 100],
|
||||
["fast", "auto"],
|
||||
[null, "auto"],
|
||||
] as const) {
|
||||
writeFileSync(join(agentDir, "settings.json"), JSON.stringify({ fullscreenWheelScrollLines: value }));
|
||||
expect(SettingsManager.create(projectDir, agentDir).getFullscreenWheelScrollLines()).toBe(expected);
|
||||
}
|
||||
});
|
||||
|
||||
describe("outputPad", () => {
|
||||
it("should default to 1 and persist binary values", async () => {
|
||||
const manager = SettingsManager.create(projectDir, agentDir);
|
||||
@@ -568,6 +646,48 @@ describe("SettingsManager", () => {
|
||||
expect(SettingsManager.inMemory({ defaultTools: [] }).getDefaultTools()).toEqual([]);
|
||||
expect(SettingsManager.inMemory().getDefaultTools()).toBeUndefined();
|
||||
});
|
||||
|
||||
it("applies +name and -name to the default selection", () => {
|
||||
expect(SettingsManager.inMemory({ defaultTools: ["+codemode", "-write"] }).getDefaultTools()).toEqual([
|
||||
"read",
|
||||
"bash",
|
||||
"edit",
|
||||
"codemode",
|
||||
]);
|
||||
expect(SettingsManager.inMemory({ defaultTools: ["read", "+grep", "+read"] }).getDefaultTools()).toEqual([
|
||||
"read",
|
||||
"grep",
|
||||
]);
|
||||
});
|
||||
|
||||
it("layers project modifiers on top of the global selection", () => {
|
||||
writeFileSync(
|
||||
join(agentDir, "settings.json"),
|
||||
JSON.stringify({ defaultTools: ["read", "bash", "+codemode"] }),
|
||||
);
|
||||
writeFileSync(
|
||||
join(projectDir, ".pi", "settings.json"),
|
||||
JSON.stringify({ defaultTools: ["-codemode", "+tool_search"] }),
|
||||
);
|
||||
|
||||
const manager = SettingsManager.create(projectDir, agentDir);
|
||||
expect(manager.getDefaultTools()).toEqual(["read", "bash", "tool_search"]);
|
||||
|
||||
manager.applyOverrides({ defaultTools: ["+codemode"] });
|
||||
expect(manager.getDefaultTools()).toEqual(["read", "bash", "tool_search", "codemode"]);
|
||||
});
|
||||
|
||||
it("applies project modifiers to the built-in defaults without a global setting", () => {
|
||||
writeFileSync(join(projectDir, ".pi", "settings.json"), JSON.stringify({ defaultTools: ["+codemode"] }));
|
||||
|
||||
expect(SettingsManager.create(projectDir, agentDir).getDefaultTools()).toEqual([
|
||||
"read",
|
||||
"bash",
|
||||
"edit",
|
||||
"write",
|
||||
"codemode",
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("getSessionDir", () => {
|
||||
|
||||
Reference in New Issue
Block a user