chore(vendor): import pi 0.85.1
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: d981de1229ef899957bbe968bc8dcda02a21f477
This commit is contained in:
1 parent
5ebc7018c3
commit
4def357d09
1669 files changed
+397627
No files matched your search
Vendored
+82
@@ -0,0 +1,82 @@
|
||||
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
||||
import { tmpdir } from "node:os";
|
||||
import { join } from "node:path";
|
||||
import { setKeybindings, type TUI } from "@earendil-works/pi-tui";
|
||||
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
|
||||
import { AuthStorage } from "../../../src/core/auth-storage.ts";
|
||||
import { KeybindingsManager } from "../../../src/core/keybindings.ts";
|
||||
import { ModelSelectorComponent } from "../../../src/modes/interactive/components/model-selector.ts";
|
||||
import { initTheme } from "../../../src/modes/interactive/theme/theme.ts";
|
||||
import { stripAnsi } from "../../../src/utils/ansi.ts";
|
||||
import { createModelRegistry, getModelRuntime } from "../../model-runtime-test-utils.ts";
|
||||
|
||||
function observeRefreshRender(): { tui: TUI; renderedAfterRefresh: Promise<void> } {
|
||||
let renderCount = 0;
|
||||
let resolveRefreshRender = () => {};
|
||||
const renderedAfterRefresh = new Promise<void>((resolve) => {
|
||||
resolveRefreshRender = resolve;
|
||||
});
|
||||
return {
|
||||
tui: {
|
||||
requestRender: () => {
|
||||
renderCount++;
|
||||
if (renderCount === 2) resolveRefreshRender();
|
||||
},
|
||||
} as unknown as TUI,
|
||||
renderedAfterRefresh,
|
||||
};
|
||||
}
|
||||
|
||||
function modelsJson(provider: string, model: string): Record<string, unknown> {
|
||||
return {
|
||||
providers: {
|
||||
[provider]: {
|
||||
baseUrl: "https://example.test/v1",
|
||||
api: "openai-completions",
|
||||
apiKey: "test-key",
|
||||
models: [{ id: model }],
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
describe("issue #6999 models.json hot reload", () => {
|
||||
let tempDir: string | undefined;
|
||||
|
||||
beforeAll(() => {
|
||||
initTheme("dark");
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
setKeybindings(new KeybindingsManager());
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
if (tempDir) rmSync(tempDir, { recursive: true, force: true });
|
||||
tempDir = undefined;
|
||||
});
|
||||
|
||||
it("reloads models.json when opening /model", async () => {
|
||||
tempDir = mkdtempSync(join(tmpdir(), "pi-models-json-hot-reload-"));
|
||||
const modelsPath = join(tempDir, "models.json");
|
||||
writeFileSync(modelsPath, JSON.stringify(modelsJson("old-provider", "old-model")));
|
||||
const modelRuntime = getModelRuntime(await createModelRegistry(AuthStorage.inMemory(), modelsPath));
|
||||
expect(modelRuntime.getModel("old-provider", "old-model")).toBeDefined();
|
||||
|
||||
writeFileSync(modelsPath, JSON.stringify(modelsJson("new-provider", "new-model")));
|
||||
const { tui, renderedAfterRefresh } = observeRefreshRender();
|
||||
const selector = new ModelSelectorComponent(
|
||||
tui,
|
||||
undefined,
|
||||
modelRuntime,
|
||||
[],
|
||||
() => {},
|
||||
() => {},
|
||||
);
|
||||
|
||||
await renderedAfterRefresh;
|
||||
const rendered = stripAnsi(selector.render(120).join("\n"));
|
||||
expect(rendered).toContain("new-model [new-provider]");
|
||||
expect(rendered).not.toContain("old-model [old-provider]");
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user