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

@@ -1,7 +1,7 @@
import { EventEmitter } from "node:events";
import { readFileSync, writeFileSync } from "node:fs";
import { PassThrough } from "node:stream";
import { beforeAll, describe, expect, it, vi } from "vitest";
import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
const childProcessMocks = vi.hoisted(() => ({
spawn: vi.fn(),
@@ -23,6 +23,7 @@ function deferred(): { promise: Promise<void>; resolve: () => void } {
describe("shareSession", () => {
beforeAll(() => initTheme("dark"));
beforeEach(() => vi.clearAllMocks());
it("keeps concurrent session exports isolated", async () => {
const uploads: string[] = [];
@@ -53,6 +54,7 @@ describe("shareSession", () => {
getBranch: () => [],
},
state: { systemPrompt: name, tools: [] },
settingsManager: { getSessionShareDestination: () => "auto" },
modelRuntime: { getProvider: () => undefined },
exportToHtml: async (filePath: string) => {
writeFileSync(filePath, name);
@@ -85,4 +87,70 @@ describe("shareSession", () => {
expect(uploads).toEqual(["A", "B"]);
expect(errors).toEqual([]);
});
// #10870: users need persistent gist shares even when Radius authentication is configured.
it("forces gist sharing without checking Radius authentication", async () => {
const getProvider = vi.fn(() => ({ id: "radius" }));
childProcessMocks.spawn.mockImplementation((_command, args: string[]) => {
const child = Object.assign(new EventEmitter(), {
stdout: new PassThrough(),
stderr: new PassThrough(),
kill: vi.fn(),
});
queueMicrotask(() => {
child.stdout.end("https://gist.github.com/test/forced-gist\n");
child.stderr.end();
child.emit("close", 0);
});
expect(readFileSync(args.at(-1)!, "utf8")).toBe("html");
return child;
});
const statuses: string[] = [];
await shareSession({
session: {
sessionManager: { getSessionId: () => "gist", getCwd: () => "/tmp", getBranch: () => [] },
state: { systemPrompt: "", tools: [] },
settingsManager: { getSessionShareDestination: () => "gist" },
modelRuntime: { getProvider },
exportToHtml: async (filePath: string) => writeFileSync(filePath, "html"),
},
ui: { setFocus() {}, requestRender() {} },
editorContainer: { clear() {}, addChild() {} },
editor: {},
showStatus: (message: string) => statuses.push(message),
showError: vi.fn(),
} as never);
expect(getProvider).not.toHaveBeenCalled();
expect(childProcessMocks.spawn).toHaveBeenCalledWith("gh", [
"gist",
"create",
"--public=false",
expect.any(String),
]);
expect(statuses[0]).toContain("https://pi.dev/session/#forced-gist");
});
it("reports missing Radius authentication when Radius is forced", async () => {
const errors: string[] = [];
await shareSession({
session: {
sessionManager: { getSessionId: () => "radius", getCwd: () => "/tmp", getBranch: () => [] },
state: { systemPrompt: "", tools: [] },
settingsManager: { getSessionShareDestination: () => "radius" },
modelRuntime: { getProvider: () => undefined },
},
ui: { setFocus() {}, requestRender() {} },
editorContainer: { clear() {}, addChild() {} },
editor: {},
showStatus: vi.fn(),
showError: (message: string) => errors.push(message),
} as never);
expect(errors).toEqual(["Radius authentication is not configured. Run '/login radius' first."]);
expect(childProcessMocks.spawnSync).not.toHaveBeenCalled();
expect(childProcessMocks.spawn).not.toHaveBeenCalled();
});
});