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:
2026-10-15 17:58:48 -04:00
parent 719370c8f7
commit 6081e3e325
1743 changed files with 205460 additions and 131705 deletions

View File

@@ -15,11 +15,12 @@ import lockfile from "proper-lockfile";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { ENV_AGENT_DIR, PACKAGE_NAME, VERSION } from "../src/config.ts";
import { ModelRuntime } from "../src/core/model-runtime.ts";
import type { ResolvedPaths } from "../src/core/package-manager.ts";
import { DefaultPackageManager, type ResolvedPaths } from "../src/core/package-manager.ts";
import { InMemorySettingsStorage, SettingsManager } from "../src/core/settings-manager.ts";
import { ProjectTrustStore } from "../src/core/trust-manager.ts";
import { main } from "../src/main.ts";
import { ConfigSelectorComponent } from "../src/modes/interactive/components/config-selector.ts";
import { initTheme } from "../src/modes/interactive/theme/theme.ts";
import { handlePackageCommand } from "../src/package-manager-cli.ts";
import { allowNetwork } from "./test-network-env.ts";
@@ -525,6 +526,67 @@ if (process.platform !== "win32") fs.chmodSync(piPath, 0o755);
expect(settingsManager.getProjectSettings().packages).toEqual([]);
});
it("toggles built-in extensions in config global mode", async () => {
const settingsManager = SettingsManager.fromStorage(new InMemorySettingsStorage(), { projectTrusted: true });
const resolvedPaths = await new DefaultPackageManager({
cwd: projectDir,
agentDir,
settingsManager,
builtinExtensions: ["llama.cpp", "mcp"],
}).resolve();
const selector = new ConfigSelectorComponent(
{ global: resolvedPaths, project: resolvedPaths },
settingsManager,
projectDir,
agentDir,
() => {},
() => {},
() => {},
24,
"global",
);
const list = selector.getResourceList();
initTheme("dark");
expect(list.render(80).join("\n")).toContain("Built-in");
expect(list.render(80).join("\n")).toContain("llama.cpp");
list.handleInput(" ");
expect(settingsManager.getGlobalSettings().extensions).toEqual(["-builtin:llama.cpp"]);
list.handleInput(" ");
expect(settingsManager.getGlobalSettings().extensions).toEqual(["+builtin:llama.cpp"]);
});
it("cycles project built-in extension overrides in config local mode", async () => {
const storage = new InMemorySettingsStorage();
storage.withLock("global", () => JSON.stringify({ extensions: ["-builtin:mcp"] }));
const settingsManager = SettingsManager.fromStorage(storage, { projectTrusted: true });
const resolvedPaths = await new DefaultPackageManager({
cwd: projectDir,
agentDir,
settingsManager,
builtinExtensions: ["mcp"],
}).resolve();
const selector = new ConfigSelectorComponent(
{ global: resolvedPaths, project: resolvedPaths },
settingsManager,
projectDir,
agentDir,
() => {},
() => {},
() => {},
24,
"project",
);
const list = selector.getResourceList();
list.handleInput(" ");
expect(settingsManager.getProjectSettings().extensions).toEqual(["+builtin:mcp"]);
list.handleInput(" ");
expect(settingsManager.getProjectSettings().extensions).toEqual(["-builtin:mcp"]);
list.handleInput(" ");
expect(settingsManager.getProjectSettings().extensions).toEqual([]);
});
it("shows a friendly error for unknown install options", async () => {
const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
@@ -635,6 +697,25 @@ if (process.platform !== "win32") fs.chmodSync(piPath, 0o755);
expect(process.exitCode).toBeUndefined();
});
it("removes older managed releases after an update", async () => {
// https://github.com/earendil-works/pi/issues/10392
const targetVersion = getNewerPatchVersion();
const { managedRoot } = prepareManagedInstall(targetVersion);
const releasesRoot = join(managedRoot, "releases");
mkdirSync(join(releasesRoot, "0.0.1", "node_modules"), { recursive: true });
mkdirSync(join(releasesRoot, "0.0.2-beta.1"), { recursive: true });
mkdirSync(join(releasesRoot, "not-a-release"), { recursive: true });
mockManagedUpdate(targetVersion);
vi.spyOn(console, "log").mockImplementation(() => {});
const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
await expect(runPackageCommandDirectly(["update", "--self"])).resolves.toBeUndefined();
expect(readdirSync(releasesRoot).sort()).toEqual([VERSION, "not-a-release", targetVersion].sort());
expect(errorSpy).not.toHaveBeenCalled();
expect(process.exitCode).toBeUndefined();
});
it("rejects a concurrent managed update", async () => {
const targetVersion = getNewerPatchVersion();
const { managedRoot, npmRecordPath } = prepareManagedInstall(targetVersion);
@@ -678,6 +759,7 @@ if (process.platform !== "win32") fs.chmodSync(piPath, 0o755);
it("keeps the managed release active when its update fails", async () => {
const targetVersion = getNewerPatchVersion();
const { managedRoot } = prepareManagedInstall(targetVersion, 23);
mkdirSync(join(managedRoot, "releases", "0.0.1"), { recursive: true });
mockManagedUpdate(targetVersion);
const logSpy = vi.spyOn(console, "log").mockImplementation(() => {});
const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
@@ -686,6 +768,7 @@ if (process.platform !== "win32") fs.chmodSync(piPath, 0o755);
expect(readFileSync(join(managedRoot, "current-version"), "utf8")).toBe(`${VERSION}\n`);
expect(existsSync(join(managedRoot, "releases", targetVersion))).toBe(false);
expect(existsSync(join(managedRoot, "releases", "0.0.1"))).toBe(true);
expect(readdirSync(join(managedRoot, "staging"))).toEqual([]);
expect(logSpy.mock.calls.map(([message]) => String(message)).join("\n")).not.toContain("Updated pi from");
expect(errorSpy.mock.calls.map(([message]) => String(message)).join("\n")).toContain("exited with code 23");