pi-llama-cpp 0.9.2 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +163 -27
- package/package.json +4 -3
- package/src/api/client.ts +76 -32
- package/src/constants.ts +28 -3
- package/src/index.ts +4 -12
- package/src/interfaces/events.ts +14 -3
- package/src/interfaces/server.ts +20 -0
- package/src/interfaces/settings.ts +69 -0
- package/src/managers/command.ts +285 -43
- package/src/managers/events.ts +50 -12
- package/src/managers/server.ts +90 -17
- package/src/managers/settings.ts +268 -0
- package/src/models/baseModel.ts +32 -17
- package/src/models/legacyModel.ts +2 -2
- package/src/models/routerModel.ts +3 -3
- package/src/server.ts +86 -21
- package/src/sse/client.ts +28 -16
- package/src/sse/manager.ts +23 -10
- package/src/ui/serverListEditor.ts +481 -0
- package/src/utils/errors.ts +5 -0
- package/src/utils/settingsStore.ts +60 -0
- package/src/utils/urls.ts +16 -0
- package/tests/commandManager.test.ts +256 -11
- package/tests/events.test.ts +229 -64
- package/tests/mocks.ts +145 -32
- package/tests/server.test.ts +54 -6
- package/tests/serverListEditor.test.ts +637 -0
- package/tests/serverManager.test.ts +282 -39
- package/tests/settings.test.ts +793 -0
- package/tests/settingsStore.test.ts +209 -0
- package/tests/sseManager.test.ts +98 -0
- package/src/interfaces/auth.ts +0 -6
- package/src/resolver.ts +0 -149
- package/src/utils/cache.ts +0 -39
- package/src/utils/mutex.ts +0 -24
- package/tests/resolver.test.ts +0 -184
package/tests/resolver.test.ts
DELETED
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
API_KEY_PLACEHOLDER,
|
|
4
|
-
DEFAULT_LLAMA_SERVER_URL,
|
|
5
|
-
} from "../src/constants";
|
|
6
|
-
|
|
7
|
-
// Hoisted mock instances — survives vi.resetModules()
|
|
8
|
-
const mockReadStoredCredential = vi.hoisted(() => vi.fn());
|
|
9
|
-
|
|
10
|
-
const mockSettingsManager = vi.hoisted(() => ({
|
|
11
|
-
getProjectSettings: vi.fn(),
|
|
12
|
-
getGlobalSettings: vi.fn(),
|
|
13
|
-
}));
|
|
14
|
-
|
|
15
|
-
// Mock getAgentDir, readStoredCredential, and SettingsManager before importing resolver
|
|
16
|
-
vi.mock("@earendil-works/pi-coding-agent", () => ({
|
|
17
|
-
getAgentDir: vi.fn().mockReturnValue("/fake/agent/dir"),
|
|
18
|
-
readStoredCredential: (...args: unknown[]) =>
|
|
19
|
-
mockReadStoredCredential(...args),
|
|
20
|
-
SettingsManager: {
|
|
21
|
-
create: vi.fn().mockReturnValue(mockSettingsManager),
|
|
22
|
-
},
|
|
23
|
-
}));
|
|
24
|
-
|
|
25
|
-
vi.mock("node:fs/promises", () => ({
|
|
26
|
-
readFile: vi.fn(),
|
|
27
|
-
}));
|
|
28
|
-
|
|
29
|
-
// Import mocked modules
|
|
30
|
-
import { getAgentDir } from "@earendil-works/pi-coding-agent";
|
|
31
|
-
import { readFile } from "node:fs/promises";
|
|
32
|
-
import { ConfigResolver } from "../src/resolver";
|
|
33
|
-
|
|
34
|
-
describe("URL resolution fallback chain", () => {
|
|
35
|
-
const mockReadFile = vi.mocked(readFile);
|
|
36
|
-
const mockGetAgentDir = vi.mocked(getAgentDir);
|
|
37
|
-
const mockGetProjectSettings = vi.mocked(
|
|
38
|
-
mockSettingsManager.getProjectSettings,
|
|
39
|
-
);
|
|
40
|
-
const mockGetGlobalSettings = vi.mocked(
|
|
41
|
-
mockSettingsManager.getGlobalSettings,
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
afterEach(() => {
|
|
45
|
-
delete process.env.LLAMA_SERVER_URL;
|
|
46
|
-
vi.resetModules();
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
beforeEach(() => {
|
|
50
|
-
vi.clearAllMocks();
|
|
51
|
-
mockGetAgentDir.mockReturnValue("/fake/agent/dir");
|
|
52
|
-
// Default: no settings found
|
|
53
|
-
mockGetProjectSettings.mockReturnValue({});
|
|
54
|
-
mockGetGlobalSettings.mockReturnValue({});
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it("should return default URL when no config is found", async () => {
|
|
58
|
-
const resolver = new ConfigResolver();
|
|
59
|
-
const result = await resolver.resolveUrls();
|
|
60
|
-
|
|
61
|
-
expect(result).toEqual([DEFAULT_LLAMA_SERVER_URL]);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it("should prioritize project config over env variable", async () => {
|
|
65
|
-
mockGetProjectSettings.mockReturnValue({
|
|
66
|
-
llamaServerUrl: "http://localhost:9999",
|
|
67
|
-
});
|
|
68
|
-
process.env.LLAMA_SERVER_URL = "http://env-url:8080";
|
|
69
|
-
|
|
70
|
-
const resolver = new ConfigResolver();
|
|
71
|
-
const result = await resolver.resolveUrls();
|
|
72
|
-
|
|
73
|
-
expect(result).toEqual(["http://localhost:9999"]);
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
it("should use env variable when no project config exists", async () => {
|
|
77
|
-
mockGetProjectSettings.mockReturnValue({});
|
|
78
|
-
process.env.LLAMA_SERVER_URL = "http://env-url:8080";
|
|
79
|
-
|
|
80
|
-
const resolver = new ConfigResolver();
|
|
81
|
-
const result = await resolver.resolveUrls();
|
|
82
|
-
|
|
83
|
-
expect(result).toEqual(["http://env-url:8080"]);
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it("should use global settings when no project config or env exists", async () => {
|
|
87
|
-
mockGetProjectSettings.mockReturnValue({});
|
|
88
|
-
mockGetGlobalSettings.mockReturnValue({
|
|
89
|
-
llamaServerUrl: "http://global:8080",
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
const resolver = new ConfigResolver();
|
|
93
|
-
const result = await resolver.resolveUrls();
|
|
94
|
-
|
|
95
|
-
expect(result).toEqual(["http://global:8080"]);
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
it("should strip trailing slashes from resolved URL", async () => {
|
|
99
|
-
mockGetProjectSettings.mockReturnValue({
|
|
100
|
-
llamaServerUrl: "http://localhost:8080/",
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
const resolver = new ConfigResolver();
|
|
104
|
-
const result = await resolver.resolveUrls();
|
|
105
|
-
|
|
106
|
-
expect(result).toEqual(["http://localhost:8080"]);
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
it("should cache the resolved URL on subsequent calls", async () => {
|
|
110
|
-
mockGetProjectSettings.mockReturnValue({
|
|
111
|
-
llamaServerUrl: "http://first:8080",
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
const resolver = new ConfigResolver();
|
|
115
|
-
const result1 = await resolver.resolveUrls();
|
|
116
|
-
const result2 = await resolver.resolveUrls();
|
|
117
|
-
|
|
118
|
-
expect(result1).toEqual(["http://first:8080"]);
|
|
119
|
-
expect(result2).toEqual(["http://first:8080"]);
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
it("should handle multiple URLs separated by semicolons", async () => {
|
|
123
|
-
mockGetProjectSettings.mockReturnValue({
|
|
124
|
-
llamaServerUrl: "http://first:8080;http://second:9090/",
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
const resolver = new ConfigResolver();
|
|
128
|
-
const result = await resolver.resolveUrls();
|
|
129
|
-
|
|
130
|
-
expect(result).toEqual(["http://first:8080", "http://second:9090"]);
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
describe("API key resolution", () => {
|
|
135
|
-
const mockGetAgentDir = vi.mocked(getAgentDir);
|
|
136
|
-
|
|
137
|
-
afterEach(() => {
|
|
138
|
-
vi.resetModules();
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
beforeEach(() => {
|
|
142
|
-
vi.clearAllMocks();
|
|
143
|
-
mockGetAgentDir.mockReturnValue("/fake/agent/dir");
|
|
144
|
-
mockReadStoredCredential.mockReturnValue(undefined);
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
it("should return placeholder when credential is not found", () => {
|
|
148
|
-
mockReadStoredCredential.mockReturnValue(undefined);
|
|
149
|
-
|
|
150
|
-
const resolver = new ConfigResolver();
|
|
151
|
-
const result = resolver.resolveApiKey("llama-server=http://127.0.0.1:8080");
|
|
152
|
-
|
|
153
|
-
expect(result).toEqual(API_KEY_PLACEHOLDER);
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
it("should return placeholder when apiKey is missing from credential", () => {
|
|
157
|
-
mockReadStoredCredential.mockReturnValue({});
|
|
158
|
-
|
|
159
|
-
const resolver = new ConfigResolver();
|
|
160
|
-
const result = resolver.resolveApiKey("llama-server=http://127.0.0.1:8080");
|
|
161
|
-
|
|
162
|
-
expect(result).toEqual(API_KEY_PLACEHOLDER);
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
it("should return the apiKey when present in credential", () => {
|
|
166
|
-
mockReadStoredCredential.mockReturnValue({ key: "test-api-key" });
|
|
167
|
-
|
|
168
|
-
const resolver = new ConfigResolver();
|
|
169
|
-
const result = resolver.resolveApiKey("llama-server=http://127.0.0.1:8080");
|
|
170
|
-
|
|
171
|
-
expect(result).toEqual("test-api-key");
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
it("should call readStoredCredential with the provider ID", () => {
|
|
175
|
-
mockReadStoredCredential.mockReturnValue({ apiKey: "test-key" });
|
|
176
|
-
|
|
177
|
-
const resolver = new ConfigResolver();
|
|
178
|
-
resolver.resolveApiKey("llama-server=http://127.0.0.1:8080");
|
|
179
|
-
|
|
180
|
-
expect(mockReadStoredCredential).toHaveBeenCalledWith(
|
|
181
|
-
"llama-server=http://127.0.0.1:8080",
|
|
182
|
-
);
|
|
183
|
-
});
|
|
184
|
-
});
|