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:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user