@kenkaiiii/ggcoder 5.24.0 → 5.25.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/dist/app-sidecar.js +286 -12
- package/dist/app-sidecar.js.map +1 -1
- package/dist/core/agent-session-add-dir.test.js +16 -0
- package/dist/core/agent-session-add-dir.test.js.map +1 -1
- package/dist/core/agent-session.d.ts +8 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +12 -0
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/local-endpoint-store.d.ts +50 -0
- package/dist/core/local-endpoint-store.d.ts.map +1 -0
- package/dist/core/local-endpoint-store.js +201 -0
- package/dist/core/local-endpoint-store.js.map +1 -0
- package/dist/core/local-endpoint-store.test.d.ts +2 -0
- package/dist/core/local-endpoint-store.test.d.ts.map +1 -0
- package/dist/core/local-endpoint-store.test.js +131 -0
- package/dist/core/local-endpoint-store.test.js.map +1 -0
- package/dist/core/slash-commands.d.ts +8 -0
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +17 -1
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/slash-commands.test.js +11 -0
- package/dist/core/slash-commands.test.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistence for user-added local model endpoints.
|
|
3
|
+
*
|
|
4
|
+
* The four well-known servers (Ollama, LM Studio, llama.cpp, vLLM) are probed
|
|
5
|
+
* without configuration; this store holds only the extra endpoints a user typed
|
|
6
|
+
* in — a moved port, a remote self-hosted box, an OpenAI-compatible gateway.
|
|
7
|
+
*
|
|
8
|
+
* Endpoints live in `~/.gg/gg-app.json` under `localEndpoints`; each one's key
|
|
9
|
+
* (and, for keyed servers, its token) lives in `~/.gg/auth.json` as a
|
|
10
|
+
* `local:<id>` credential, which is also what carries the baseUrl into the
|
|
11
|
+
* stream call. The two are kept in sync here so the UI never has to.
|
|
12
|
+
*/
|
|
13
|
+
import fs from "node:fs/promises";
|
|
14
|
+
import os from "node:os";
|
|
15
|
+
import path from "node:path";
|
|
16
|
+
import { AuthStorage, DEFAULT_LOCAL_ENDPOINTS, clearLocalDiscoveryCache, } from "@kenkaiiii/gg-core";
|
|
17
|
+
export class LocalEndpointError extends Error {
|
|
18
|
+
}
|
|
19
|
+
const RESERVED_IDS = new Set(DEFAULT_LOCAL_ENDPOINTS.map((e) => e.id));
|
|
20
|
+
const MAX_CUSTOM_ENDPOINTS = 20;
|
|
21
|
+
function appSettingsFile(override) {
|
|
22
|
+
return override ?? path.join(os.homedir(), ".gg", "gg-app.json");
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Normalize a user-typed URL into the OpenAI-compatible base we call.
|
|
26
|
+
* Accepts `host:port`, a bare root, or a full `/v1` URL, and tolerates a pasted
|
|
27
|
+
* `/v1/chat/completions` or `/v1/models` (people copy from docs).
|
|
28
|
+
*/
|
|
29
|
+
export function normalizeLocalBaseUrl(input) {
|
|
30
|
+
const trimmed = input.trim();
|
|
31
|
+
if (!trimmed)
|
|
32
|
+
throw new LocalEndpointError("Endpoint URL is required.");
|
|
33
|
+
const scheme = /^([a-z][a-z0-9+.-]*):\/\//i.exec(trimmed)?.[1]?.toLowerCase();
|
|
34
|
+
if (scheme && scheme !== "http" && scheme !== "https") {
|
|
35
|
+
throw new LocalEndpointError("Endpoint URL must use http or https.");
|
|
36
|
+
}
|
|
37
|
+
// Bare `host:port` is the common case — assume plain http, like the servers do.
|
|
38
|
+
const withScheme = scheme ? trimmed : `http://${trimmed}`;
|
|
39
|
+
let url;
|
|
40
|
+
try {
|
|
41
|
+
url = new URL(withScheme);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
throw new LocalEndpointError(`"${input}" is not a valid URL.`);
|
|
45
|
+
}
|
|
46
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
47
|
+
throw new LocalEndpointError("Endpoint URL must use http or https.");
|
|
48
|
+
}
|
|
49
|
+
if (!url.hostname)
|
|
50
|
+
throw new LocalEndpointError("Endpoint URL is missing a host.");
|
|
51
|
+
let pathname = url.pathname.replace(/\/+$/, "");
|
|
52
|
+
pathname = pathname.replace(/\/(?:chat\/completions|completions|models)$/, "");
|
|
53
|
+
if (!/\/v\d+$/.test(pathname))
|
|
54
|
+
pathname = `${pathname}/v1`;
|
|
55
|
+
return `${url.protocol}//${url.host}${pathname}`;
|
|
56
|
+
}
|
|
57
|
+
/** Slug derived from the URL, e.g. `custom-192-168-1-4-8000`. Stable per host:port. */
|
|
58
|
+
function endpointIdFor(baseUrl) {
|
|
59
|
+
const { host } = new URL(baseUrl);
|
|
60
|
+
const slug = host
|
|
61
|
+
.replace(/[^a-z0-9]+/gi, "-")
|
|
62
|
+
.replace(/^-|-$/g, "")
|
|
63
|
+
.toLowerCase();
|
|
64
|
+
return `custom-${slug || "endpoint"}`;
|
|
65
|
+
}
|
|
66
|
+
function labelFor(baseUrl, label) {
|
|
67
|
+
const trimmed = label?.trim();
|
|
68
|
+
if (trimmed)
|
|
69
|
+
return trimmed;
|
|
70
|
+
return new URL(baseUrl).host;
|
|
71
|
+
}
|
|
72
|
+
// ── settings file I/O ──────────────────────────────────────
|
|
73
|
+
/**
|
|
74
|
+
* Read/modify/write the whole settings object rather than a typed subset, so a
|
|
75
|
+
* key written by another part of the app (or a newer version) survives.
|
|
76
|
+
*/
|
|
77
|
+
async function readSettings(file) {
|
|
78
|
+
try {
|
|
79
|
+
const raw = JSON.parse(await fs.readFile(appSettingsFile(file), "utf-8"));
|
|
80
|
+
return raw && typeof raw === "object" ? raw : {};
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return {};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function writeSettings(settings, file) {
|
|
87
|
+
const target = appSettingsFile(file);
|
|
88
|
+
await fs.mkdir(path.dirname(target), { recursive: true });
|
|
89
|
+
await fs.writeFile(target, JSON.stringify(settings, null, 2), "utf-8");
|
|
90
|
+
}
|
|
91
|
+
function parseStored(value) {
|
|
92
|
+
if (!Array.isArray(value))
|
|
93
|
+
return [];
|
|
94
|
+
const endpoints = [];
|
|
95
|
+
for (const entry of value) {
|
|
96
|
+
if (!entry || typeof entry !== "object")
|
|
97
|
+
continue;
|
|
98
|
+
const { id, label, baseUrl, apiKey } = entry;
|
|
99
|
+
if (typeof id !== "string" || typeof baseUrl !== "string")
|
|
100
|
+
continue;
|
|
101
|
+
endpoints.push({
|
|
102
|
+
id,
|
|
103
|
+
label: typeof label === "string" && label ? label : baseUrl,
|
|
104
|
+
baseUrl,
|
|
105
|
+
kind: "custom",
|
|
106
|
+
custom: true,
|
|
107
|
+
...(typeof apiKey === "string" && apiKey ? { apiKey } : {}),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return endpoints;
|
|
111
|
+
}
|
|
112
|
+
/** User-added endpoints, in insertion order. Never throws on a corrupt file. */
|
|
113
|
+
export async function listCustomEndpoints(options = {}) {
|
|
114
|
+
return parseStored((await readSettings(options.settingsFile))["localEndpoints"]);
|
|
115
|
+
}
|
|
116
|
+
/** Well-known endpoints first, then the user's own — the probe/scan order. */
|
|
117
|
+
export async function listAllEndpoints(options = {}) {
|
|
118
|
+
return [...DEFAULT_LOCAL_ENDPOINTS, ...(await listCustomEndpoints(options))];
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Add a custom endpoint and write its `local:<id>` credential. Re-adding the
|
|
122
|
+
* same host updates it (that's how a user fixes a mistyped key) instead of
|
|
123
|
+
* creating a second row for the same server.
|
|
124
|
+
*/
|
|
125
|
+
export async function addCustomEndpoint(input, options = {}) {
|
|
126
|
+
const auth = options.auth ?? new AuthStorage();
|
|
127
|
+
const baseUrl = normalizeLocalBaseUrl(input.baseUrl);
|
|
128
|
+
const id = endpointIdFor(baseUrl);
|
|
129
|
+
if (RESERVED_IDS.has(id)) {
|
|
130
|
+
throw new LocalEndpointError(`"${id}" is a built-in endpoint id.`);
|
|
131
|
+
}
|
|
132
|
+
const existing = await listCustomEndpoints(options);
|
|
133
|
+
const builtIn = DEFAULT_LOCAL_ENDPOINTS.find((e) => e.baseUrl === baseUrl);
|
|
134
|
+
if (builtIn) {
|
|
135
|
+
throw new LocalEndpointError(`${baseUrl} is already probed automatically as ${builtIn.label}.`);
|
|
136
|
+
}
|
|
137
|
+
if (!existing.some((e) => e.id === id) && existing.length >= MAX_CUSTOM_ENDPOINTS) {
|
|
138
|
+
throw new LocalEndpointError(`At most ${MAX_CUSTOM_ENDPOINTS} custom endpoints.`);
|
|
139
|
+
}
|
|
140
|
+
const endpoint = {
|
|
141
|
+
id,
|
|
142
|
+
label: labelFor(baseUrl, input.label),
|
|
143
|
+
baseUrl,
|
|
144
|
+
kind: "custom",
|
|
145
|
+
custom: true,
|
|
146
|
+
...(input.apiKey?.trim() ? { apiKey: input.apiKey.trim() } : {}),
|
|
147
|
+
};
|
|
148
|
+
const next = existing.some((e) => e.id === id)
|
|
149
|
+
? existing.map((e) => (e.id === id ? endpoint : e))
|
|
150
|
+
: [...existing, endpoint];
|
|
151
|
+
const settings = await readSettings(options.settingsFile);
|
|
152
|
+
settings["localEndpoints"] = next.map(({ id: eid, label, baseUrl: url, apiKey }) => ({
|
|
153
|
+
id: eid,
|
|
154
|
+
label,
|
|
155
|
+
baseUrl: url,
|
|
156
|
+
...(apiKey ? { apiKey } : {}),
|
|
157
|
+
}));
|
|
158
|
+
await writeSettings(settings, options.settingsFile);
|
|
159
|
+
await auth.setLocalEndpoint(id, baseUrl, endpoint.apiKey);
|
|
160
|
+
clearLocalDiscoveryCache();
|
|
161
|
+
return endpoint;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Remove a custom endpoint and its credential. Built-in endpoints can't be
|
|
165
|
+
* removed (they're discovered, not configured) — that's an error, not a no-op,
|
|
166
|
+
* so a UI bug doesn't silently do nothing.
|
|
167
|
+
*/
|
|
168
|
+
export async function removeCustomEndpoint(id, options = {}) {
|
|
169
|
+
const auth = options.auth ?? new AuthStorage();
|
|
170
|
+
if (RESERVED_IDS.has(id)) {
|
|
171
|
+
throw new LocalEndpointError(`${id} is a built-in endpoint and can't be removed.`);
|
|
172
|
+
}
|
|
173
|
+
const existing = await listCustomEndpoints(options);
|
|
174
|
+
if (!existing.some((e) => e.id === id)) {
|
|
175
|
+
throw new LocalEndpointError(`Unknown local endpoint "${id}".`);
|
|
176
|
+
}
|
|
177
|
+
const settings = await readSettings(options.settingsFile);
|
|
178
|
+
settings["localEndpoints"] = existing
|
|
179
|
+
.filter((e) => e.id !== id)
|
|
180
|
+
.map(({ id: eid, label, baseUrl, apiKey }) => ({
|
|
181
|
+
id: eid,
|
|
182
|
+
label,
|
|
183
|
+
baseUrl,
|
|
184
|
+
...(apiKey ? { apiKey } : {}),
|
|
185
|
+
}));
|
|
186
|
+
await writeSettings(settings, options.settingsFile);
|
|
187
|
+
await auth.removeLocalEndpoint(id);
|
|
188
|
+
clearLocalDiscoveryCache();
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Make sure every endpoint we're about to serve models from has a credential
|
|
192
|
+
* carrying its baseUrl — otherwise `stream()` has no endpoint to talk to.
|
|
193
|
+
* Called after each scan, so a fresh install works with zero setup.
|
|
194
|
+
*/
|
|
195
|
+
export async function syncEndpointCredentials(endpoints, options = {}) {
|
|
196
|
+
const auth = options.auth ?? new AuthStorage();
|
|
197
|
+
for (const endpoint of endpoints) {
|
|
198
|
+
await auth.setLocalEndpoint(endpoint.id, endpoint.baseUrl, endpoint.apiKey);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=local-endpoint-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-endpoint-store.js","sourceRoot":"","sources":["../../src/core/local-endpoint-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,wBAAwB,GAEzB,MAAM,oBAAoB,CAAC;AAS5B,MAAM,OAAO,kBAAmB,SAAQ,KAAK;CAAG;AAehD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvE,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,SAAS,eAAe,CAAC,QAAiB;IACxC,OAAO,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,kBAAkB,CAAC,2BAA2B,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IAC9E,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACtD,MAAM,IAAI,kBAAkB,CAAC,sCAAsC,CAAC,CAAC;IACvE,CAAC;IACD,gFAAgF;IAChF,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,OAAO,EAAE,CAAC;IAC1D,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAAC,IAAI,KAAK,uBAAuB,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,IAAI,kBAAkB,CAAC,sCAAsC,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,QAAQ;QAAE,MAAM,IAAI,kBAAkB,CAAC,iCAAiC,CAAC,CAAC;IACnF,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAChD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,6CAA6C,EAAE,EAAE,CAAC,CAAC;IAC/E,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,QAAQ,GAAG,GAAG,QAAQ,KAAK,CAAC;IAC3D,OAAO,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;AACnD,CAAC;AAED,uFAAuF;AACvF,SAAS,aAAa,CAAC,OAAe;IACpC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI;SACd,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,WAAW,EAAE,CAAC;IACjB,OAAO,UAAU,IAAI,IAAI,UAAU,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,KAAc;IAC/C,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;AAC/B,CAAC;AAED,8DAA8D;AAE9D;;;GAGG;AACH,KAAK,UAAU,YAAY,CAAC,IAAa;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAY,CAAC;QACrF,OAAO,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAE,GAA+B,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,QAAiC,EAAE,IAAa;IAC3E,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,SAAS,GAAoB,EAAE,CAAC;IACtC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAgC,CAAC;QACxE,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,SAAS;QACpE,SAAS,CAAC,IAAI,CAAC;YACb,EAAE;YACF,KAAK,EAAE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO;YAC3D,OAAO;YACP,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,IAAI;YACZ,GAAG,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,CAAC,CAAC;IACL,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAqC,EAAE;IAEvC,OAAO,WAAW,CAAC,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAqC,EAAE;IAEvC,OAAO,CAAC,GAAG,uBAAuB,EAAE,GAAG,CAAC,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAyB,EACzB,UAAqC,EAAE;IAEvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,WAAW,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,kBAAkB,CAAC,IAAI,EAAE,8BAA8B,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IAC3E,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,kBAAkB,CAAC,GAAG,OAAO,uCAAuC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,IAAI,oBAAoB,EAAE,CAAC;QAClF,MAAM,IAAI,kBAAkB,CAAC,WAAW,oBAAoB,oBAAoB,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,QAAQ,GAAkB;QAC9B,EAAE;QACF,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;QACrC,OAAO;QACP,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,IAAI;QACZ,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjE,CAAC;IACF,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QAC5C,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE5B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1D,QAAQ,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QACnF,EAAE,EAAE,GAAG;QACP,KAAK;QACL,OAAO,EAAE,GAAG;QACZ,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9B,CAAC,CAAC,CAAC;IACJ,MAAM,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACpD,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1D,wBAAwB,EAAE,CAAC;IAC3B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAU,EACV,UAAqC,EAAE;IAEvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,WAAW,EAAE,CAAC;IAC/C,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,kBAAkB,CAAC,GAAG,EAAE,+CAA+C,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,kBAAkB,CAAC,2BAA2B,EAAE,IAAI,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1D,QAAQ,CAAC,gBAAgB,CAAC,GAAG,QAAQ;SAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;SAC1B,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7C,EAAE,EAAE,GAAG;QACP,KAAK;QACL,OAAO;QACP,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9B,CAAC,CAAC,CAAC;IACN,MAAM,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACpD,MAAM,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACnC,wBAAwB,EAAE,CAAC;AAC7B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,SAAmC,EACnC,UAAqC,EAAE;IAEvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,WAAW,EAAE,CAAC;IAC/C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-endpoint-store.test.d.ts","sourceRoot":"","sources":["../../src/core/local-endpoint-store.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
5
|
+
import { AuthStorage } from "@kenkaiiii/gg-core";
|
|
6
|
+
import { LocalEndpointError, addCustomEndpoint, listAllEndpoints, listCustomEndpoints, normalizeLocalBaseUrl, removeCustomEndpoint, syncEndpointCredentials, } from "./local-endpoint-store.js";
|
|
7
|
+
let dir;
|
|
8
|
+
let opts;
|
|
9
|
+
let auth;
|
|
10
|
+
// Both file paths are injected rather than redirected via $HOME: os.homedir()
|
|
11
|
+
// reads USERPROFILE on Windows, so a HOME override silently writes to the real
|
|
12
|
+
// ~/.gg there — which leaks state between tests and pollutes the user's files.
|
|
13
|
+
beforeEach(async () => {
|
|
14
|
+
dir = await fs.mkdtemp(path.join(os.tmpdir(), "gg-local-endpoints-"));
|
|
15
|
+
auth = new AuthStorage(path.join(dir, "auth.json"));
|
|
16
|
+
opts = { settingsFile: path.join(dir, "gg-app.json"), auth };
|
|
17
|
+
});
|
|
18
|
+
afterEach(async () => {
|
|
19
|
+
await fs.rm(dir, { recursive: true, force: true });
|
|
20
|
+
});
|
|
21
|
+
async function settings() {
|
|
22
|
+
return JSON.parse(await fs.readFile(opts.settingsFile, "utf-8"));
|
|
23
|
+
}
|
|
24
|
+
describe("normalizeLocalBaseUrl", () => {
|
|
25
|
+
it("accepts the shapes users actually paste", () => {
|
|
26
|
+
expect(normalizeLocalBaseUrl("127.0.0.1:1234")).toBe("http://127.0.0.1:1234/v1");
|
|
27
|
+
expect(normalizeLocalBaseUrl("http://localhost:8000")).toBe("http://localhost:8000/v1");
|
|
28
|
+
expect(normalizeLocalBaseUrl("http://localhost:8000/v1")).toBe("http://localhost:8000/v1");
|
|
29
|
+
expect(normalizeLocalBaseUrl(" http://localhost:8000/v1/ ")).toBe("http://localhost:8000/v1");
|
|
30
|
+
expect(normalizeLocalBaseUrl("http://box.lan:8080/v1/chat/completions")).toBe("http://box.lan:8080/v1");
|
|
31
|
+
expect(normalizeLocalBaseUrl("http://box.lan:8080/v1/models")).toBe("http://box.lan:8080/v1");
|
|
32
|
+
// A gateway on a sub-path keeps the path.
|
|
33
|
+
expect(normalizeLocalBaseUrl("https://gw.example.com/openai")).toBe("https://gw.example.com/openai/v1");
|
|
34
|
+
});
|
|
35
|
+
it("rejects empty, malformed, and non-http URLs", () => {
|
|
36
|
+
expect(() => normalizeLocalBaseUrl(" ")).toThrow(LocalEndpointError);
|
|
37
|
+
expect(() => normalizeLocalBaseUrl("http://")).toThrow(LocalEndpointError);
|
|
38
|
+
expect(() => normalizeLocalBaseUrl("ftp://host/v1")).toThrow(LocalEndpointError);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe("custom endpoints", () => {
|
|
42
|
+
it("adds an endpoint, persists it, and writes its auth credential", async () => {
|
|
43
|
+
const endpoint = await addCustomEndpoint({ label: "Workstation", baseUrl: "192.168.1.4:8000", apiKey: "secret" }, opts);
|
|
44
|
+
expect(endpoint).toMatchObject({
|
|
45
|
+
id: "custom-192-168-1-4-8000",
|
|
46
|
+
label: "Workstation",
|
|
47
|
+
baseUrl: "http://192.168.1.4:8000/v1",
|
|
48
|
+
kind: "custom",
|
|
49
|
+
custom: true,
|
|
50
|
+
apiKey: "secret",
|
|
51
|
+
});
|
|
52
|
+
expect(await listCustomEndpoints(opts)).toEqual([endpoint]);
|
|
53
|
+
const creds = await auth.getCredentials("local:custom-192-168-1-4-8000");
|
|
54
|
+
expect(creds).toMatchObject({ accessToken: "secret", baseUrl: "http://192.168.1.4:8000/v1" });
|
|
55
|
+
expect(creds.expiresAt).toBeGreaterThan(Date.now());
|
|
56
|
+
expect(await auth.hasProviderAuth("local")).toBe(true);
|
|
57
|
+
});
|
|
58
|
+
it("defaults the label to the host and the key to a placeholder", async () => {
|
|
59
|
+
await addCustomEndpoint({ baseUrl: "http://localhost:9999" }, opts);
|
|
60
|
+
const stored = (await listCustomEndpoints(opts))[0];
|
|
61
|
+
expect(stored.label).toBe("localhost:9999");
|
|
62
|
+
expect(stored.apiKey).toBeUndefined();
|
|
63
|
+
expect(await auth.getCredentials("local:custom-localhost-9999")).toMatchObject({
|
|
64
|
+
accessToken: "local",
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
it("updates in place when the same host is re-added", async () => {
|
|
68
|
+
await addCustomEndpoint({ baseUrl: "http://localhost:9999", apiKey: "wrong" }, opts);
|
|
69
|
+
await addCustomEndpoint({ label: "Fixed", baseUrl: "http://localhost:9999/v1", apiKey: "right" }, opts);
|
|
70
|
+
const stored = await listCustomEndpoints(opts);
|
|
71
|
+
expect(stored).toHaveLength(1);
|
|
72
|
+
expect(stored[0]).toMatchObject({ label: "Fixed", apiKey: "right" });
|
|
73
|
+
expect(await auth.getCredentials("local:custom-localhost-9999")).toMatchObject({
|
|
74
|
+
accessToken: "right",
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
it("refuses a URL already covered by a built-in endpoint", async () => {
|
|
78
|
+
await expect(addCustomEndpoint({ baseUrl: "http://127.0.0.1:11434/v1" }, opts)).rejects.toThrow(/already probed automatically as Ollama/);
|
|
79
|
+
});
|
|
80
|
+
it("removes an endpoint and its credential", async () => {
|
|
81
|
+
await addCustomEndpoint({ baseUrl: "http://localhost:9999" }, opts);
|
|
82
|
+
await removeCustomEndpoint("custom-localhost-9999", opts);
|
|
83
|
+
expect(await listCustomEndpoints(opts)).toEqual([]);
|
|
84
|
+
expect(await auth.getCredentials("local:custom-localhost-9999")).toBeUndefined();
|
|
85
|
+
expect(await auth.hasProviderAuth("local")).toBe(false);
|
|
86
|
+
});
|
|
87
|
+
it("refuses to remove a built-in or unknown endpoint", async () => {
|
|
88
|
+
await expect(removeCustomEndpoint("ollama", opts)).rejects.toThrow(/built-in/);
|
|
89
|
+
await expect(removeCustomEndpoint("custom-nope", opts)).rejects.toThrow(/Unknown local/);
|
|
90
|
+
});
|
|
91
|
+
it("preserves unrelated gg-app.json keys", async () => {
|
|
92
|
+
await fs.writeFile(opts.settingsFile, JSON.stringify({ projectsRoot: "/tmp/projects", autopilot: { "/a": true } }), "utf-8");
|
|
93
|
+
await addCustomEndpoint({ baseUrl: "http://localhost:9999" }, opts);
|
|
94
|
+
expect(await settings()).toMatchObject({
|
|
95
|
+
projectsRoot: "/tmp/projects",
|
|
96
|
+
autopilot: { "/a": true },
|
|
97
|
+
});
|
|
98
|
+
await removeCustomEndpoint("custom-localhost-9999", opts);
|
|
99
|
+
expect(await settings()).toMatchObject({ projectsRoot: "/tmp/projects" });
|
|
100
|
+
});
|
|
101
|
+
it("ignores a corrupt settings file instead of throwing", async () => {
|
|
102
|
+
await fs.writeFile(opts.settingsFile, "{not json", "utf-8");
|
|
103
|
+
expect(await listCustomEndpoints(opts)).toEqual([]);
|
|
104
|
+
});
|
|
105
|
+
it("lists built-in endpoints before custom ones", async () => {
|
|
106
|
+
await addCustomEndpoint({ baseUrl: "http://localhost:9999" }, opts);
|
|
107
|
+
expect((await listAllEndpoints(opts)).map((e) => e.id)).toEqual([
|
|
108
|
+
"ollama",
|
|
109
|
+
"lmstudio",
|
|
110
|
+
"llamacpp",
|
|
111
|
+
"vllm",
|
|
112
|
+
"custom-localhost-9999",
|
|
113
|
+
]);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe("syncEndpointCredentials", () => {
|
|
117
|
+
it("writes a baseUrl-carrying credential for every endpoint", async () => {
|
|
118
|
+
await syncEndpointCredentials(await listAllEndpoints(opts), opts);
|
|
119
|
+
expect((await auth.listLocalEndpointIds()).sort()).toEqual([
|
|
120
|
+
"llamacpp",
|
|
121
|
+
"lmstudio",
|
|
122
|
+
"ollama",
|
|
123
|
+
"vllm",
|
|
124
|
+
]);
|
|
125
|
+
expect(await auth.getCredentials("local:ollama")).toMatchObject({
|
|
126
|
+
baseUrl: "http://127.0.0.1:11434/v1",
|
|
127
|
+
accessToken: "local",
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=local-endpoint-store.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-endpoint-store.test.js","sourceRoot":"","sources":["../../src/core/local-endpoint-store.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,14 @@ export interface SlashCommandContext {
|
|
|
19
19
|
ok: false;
|
|
20
20
|
error: string;
|
|
21
21
|
}>;
|
|
22
|
+
/** Remove an exact workspace root previously added this session. */
|
|
23
|
+
removeDirectory: (dir: string) => Promise<{
|
|
24
|
+
ok: true;
|
|
25
|
+
root: string;
|
|
26
|
+
} | {
|
|
27
|
+
ok: false;
|
|
28
|
+
error: string;
|
|
29
|
+
}>;
|
|
22
30
|
/** Extra workspace roots added this session. */
|
|
23
31
|
getAdditionalRoots: () => string[];
|
|
24
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slash-commands.d.ts","sourceRoot":"","sources":["../../src/core/slash-commands.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAElC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,WAAW,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,oDAAoD;IACpD,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,gDAAgD;IAChD,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,wEAAwE;IACxE,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClG,gDAAgD;IAChD,kBAAkB,EAAE,MAAM,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;CACnF;AAID,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAmC;IAEnD,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAOrC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAS9B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI3C,MAAM,IAAI,YAAY,EAAE;IAaxB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IASrD,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CASnF;AAID,wBAAgB,qBAAqB,IAAI,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"slash-commands.d.ts","sourceRoot":"","sources":["../../src/core/slash-commands.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAElC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,WAAW,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,oDAAoD;IACpD,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,gDAAgD;IAChD,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,wEAAwE;IACxE,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClG,oEAAoE;IACpE,eAAe,EAAE,CACf,GAAG,EAAE,MAAM,KACR,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,gDAAgD;IAChD,kBAAkB,EAAE,MAAM,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;CACnF;AAID,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAmC;IAEnD,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAOrC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAS9B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI3C,MAAM,IAAI,YAAY,EAAE;IAaxB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IASrD,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CASnF;AAID,wBAAgB,qBAAqB,IAAI,YAAY,EAAE,CAwKtD"}
|
|
@@ -157,7 +157,7 @@ export function createBuiltinCommands() {
|
|
|
157
157
|
{
|
|
158
158
|
name: "add-dir",
|
|
159
159
|
aliases: ["adddir"],
|
|
160
|
-
description: "Add another
|
|
160
|
+
description: "Add another project folder to this workspace",
|
|
161
161
|
usage: "/add-dir [path] — no path lists the current roots",
|
|
162
162
|
async execute(args, ctx) {
|
|
163
163
|
const roots = ctx.getAdditionalRoots();
|
|
@@ -170,6 +170,22 @@ export function createBuiltinCommands() {
|
|
|
170
170
|
return result.ok ? `Added workspace root: ${result.root}` : result.error;
|
|
171
171
|
},
|
|
172
172
|
},
|
|
173
|
+
{
|
|
174
|
+
name: "remove-dir",
|
|
175
|
+
aliases: ["removedir"],
|
|
176
|
+
description: "Remove an added project folder from this workspace",
|
|
177
|
+
usage: "/remove-dir [path] — no path lists roots available to remove",
|
|
178
|
+
async execute(args, ctx) {
|
|
179
|
+
const roots = ctx.getAdditionalRoots();
|
|
180
|
+
if (!args) {
|
|
181
|
+
return roots.length === 0
|
|
182
|
+
? "No additional roots to remove."
|
|
183
|
+
: `Choose a root to remove:\n${roots.map((r) => ` ${r}`).join("\n")}`;
|
|
184
|
+
}
|
|
185
|
+
const result = await ctx.removeDirectory(args);
|
|
186
|
+
return result.ok ? `Removed workspace root: ${result.root}` : result.error;
|
|
187
|
+
},
|
|
188
|
+
},
|
|
173
189
|
{
|
|
174
190
|
name: "rewind",
|
|
175
191
|
aliases: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slash-commands.js","sourceRoot":"","sources":["../../src/core/slash-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"slash-commands.js","sourceRoot":"","sources":["../../src/core/slash-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,10 +19,21 @@ function context(overrides = {}) {
|
|
|
19
19
|
branch: vi.fn(async () => ""),
|
|
20
20
|
listBranches: vi.fn(async () => ""),
|
|
21
21
|
addDirectory: vi.fn(async (dir) => ({ ok: true, root: `/resolved${dir}` })),
|
|
22
|
+
removeDirectory: vi.fn(async (dir) => ({ ok: true, root: `/resolved${dir}` })),
|
|
22
23
|
getAdditionalRoots: vi.fn(() => []),
|
|
23
24
|
...overrides,
|
|
24
25
|
};
|
|
25
26
|
}
|
|
27
|
+
describe("/remove-dir", () => {
|
|
28
|
+
it("requires a current root when no path is supplied", async () => {
|
|
29
|
+
await expect(registry().execute("/remove-dir", context())).resolves.toContain("No additional roots");
|
|
30
|
+
});
|
|
31
|
+
it("removes the selected root", async () => {
|
|
32
|
+
const ctx = context();
|
|
33
|
+
await expect(registry().execute("/remove-dir ../sdk", ctx)).resolves.toBe("Removed workspace root: /resolved../sdk");
|
|
34
|
+
expect(ctx.removeDirectory).toHaveBeenCalledWith("../sdk");
|
|
35
|
+
});
|
|
36
|
+
});
|
|
26
37
|
describe("/add-dir", () => {
|
|
27
38
|
it("lists nothing when no roots were added", async () => {
|
|
28
39
|
await expect(registry().execute("/add-dir", context())).resolves.toContain("No additional roots");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slash-commands.test.js","sourceRoot":"","sources":["../../src/core/slash-commands.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"slash-commands.test.js","sourceRoot":"","sources":["../../src/core/slash-commands.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kenkaiiii/ggcoder",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.25.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "CLI coding agent with OAuth authentication for Anthropic, OpenAI, and Gemini",
|
|
6
6
|
"license": "MIT",
|
|
@@ -114,9 +114,9 @@
|
|
|
114
114
|
"typescript-language-server": "^5.3.0",
|
|
115
115
|
"wrap-ansi": "^10.0.0",
|
|
116
116
|
"zod": "^4.4.3",
|
|
117
|
-
"@kenkaiiii/gg-agent": "5.
|
|
118
|
-
"@kenkaiiii/gg-
|
|
119
|
-
"@kenkaiiii/gg-
|
|
117
|
+
"@kenkaiiii/gg-agent": "5.25.0",
|
|
118
|
+
"@kenkaiiii/gg-ai": "5.25.0",
|
|
119
|
+
"@kenkaiiii/gg-core": "5.25.0"
|
|
120
120
|
},
|
|
121
121
|
"optionalDependencies": {
|
|
122
122
|
"@huggingface/transformers": "^3.6.0",
|