@autonsh/cli 0.16.4 → 0.17.1
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/chat.d.ts +3 -0
- package/dist/chat.js +350 -0
- package/dist/chat.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.js +90 -0
- package/dist/config.js.map +1 -0
- package/dist/index.js +269 -61
- package/dist/index.js.map +1 -1
- package/dist/login.d.ts +4 -11
- package/dist/login.js +47 -40
- package/dist/login.js.map +1 -1
- package/dist/model.d.ts +24 -0
- package/dist/model.js +195 -0
- package/dist/model.js.map +1 -0
- package/dist/picker.d.ts +8 -0
- package/dist/picker.js +52 -0
- package/dist/picker.js.map +1 -0
- package/dist/prompts.d.ts +8 -1
- package/dist/prompts.js +51 -1
- package/dist/prompts.js.map +1 -1
- package/package.json +1 -1
package/dist/chat.d.ts
ADDED
package/dist/chat.js
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// chat.ts (0.17.0) — sessão de trabalho estilo opencode:
|
|
3
|
+
// abre um agente deployado, você dá TASKS, o agente executa de verdade
|
|
4
|
+
// (PLAN→IMPLEMENT→VERIFY, tools) e você acompanha ao vivo: badges de fase
|
|
5
|
+
// (llm start/done) + logs do agente (plano/tool use). Gates de aprovação e
|
|
6
|
+
// perguntas de clarificação (ctx.ask) resolvidos INLINE na sessão.
|
|
7
|
+
// Resultado final = evidência ([TASK:DONE].result) em box.
|
|
8
|
+
// Pipe (stdin não-TTY): one-shot — lê a task, roda 1 turno, imprime resultado.
|
|
9
|
+
import { createInterface } from "node:readline";
|
|
10
|
+
import { readFileSync } from "node:fs";
|
|
11
|
+
import pc from "picocolors";
|
|
12
|
+
import { box, dim, isTTY, ok, info, fail } from "./ui.js";
|
|
13
|
+
import { resolveAgent } from "./picker.js";
|
|
14
|
+
import { parseGateLine, promptGateApproval, promptGateQuestion } from "./prompts.js";
|
|
15
|
+
const API = process.env.AUTON_API ?? "http://localhost:8080";
|
|
16
|
+
const MAX_HISTORY = 8;
|
|
17
|
+
function authHeaders(extra = {}) {
|
|
18
|
+
const h = { ...extra };
|
|
19
|
+
const token = process.env.AUTON_TOKEN;
|
|
20
|
+
if (token)
|
|
21
|
+
h.Authorization = `Bearer ${token}`;
|
|
22
|
+
return h;
|
|
23
|
+
}
|
|
24
|
+
async function agentInfo(name) {
|
|
25
|
+
try {
|
|
26
|
+
const res = await fetch(`${API}/v1/agents`, { headers: authHeaders() });
|
|
27
|
+
if (!res.ok)
|
|
28
|
+
return {};
|
|
29
|
+
const list = (await res.json());
|
|
30
|
+
const a = list.find((x) => x.name === name);
|
|
31
|
+
return a ? { model: a.model, status: a.status } : {};
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return {};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function buildPrompt(history, msg) {
|
|
38
|
+
if (history.length === 0)
|
|
39
|
+
return msg;
|
|
40
|
+
const conv = history
|
|
41
|
+
.map((h) => `usuário: ${h.user}\nagente: ${h.agent}`)
|
|
42
|
+
.join("\n");
|
|
43
|
+
return `Histórico da conversa anterior:\n${conv}\n\nTarefa atual do usuário: ${msg}`;
|
|
44
|
+
}
|
|
45
|
+
/** 1 task = invoke (SSE: badges de fase) + logs do agente ao vivo + gates inline. */
|
|
46
|
+
async function runTask(name, prompt, live) {
|
|
47
|
+
const since = new Date().toISOString();
|
|
48
|
+
const ac = new AbortController();
|
|
49
|
+
// logs ao vivo do agente durante o turno (só o turno corrente)
|
|
50
|
+
const logsP = (async () => {
|
|
51
|
+
if (!live)
|
|
52
|
+
return;
|
|
53
|
+
try {
|
|
54
|
+
const res = await fetch(`${API}/v1/agents/${encodeURIComponent(name)}/logs?tail=0&since=${encodeURIComponent(since)}`, { headers: authHeaders({ Accept: "text/event-stream" }), signal: ac.signal });
|
|
55
|
+
if (!res.ok || !res.body)
|
|
56
|
+
return;
|
|
57
|
+
const reader = res.body.getReader();
|
|
58
|
+
const decoder = new TextDecoder();
|
|
59
|
+
let buf = "";
|
|
60
|
+
for (;;) {
|
|
61
|
+
const { done, value } = await reader.read();
|
|
62
|
+
if (done)
|
|
63
|
+
break;
|
|
64
|
+
buf += decoder.decode(value, { stream: true });
|
|
65
|
+
let idx;
|
|
66
|
+
while ((idx = buf.indexOf("\n\n")) !== -1) {
|
|
67
|
+
const ev = buf.slice(0, idx);
|
|
68
|
+
buf = buf.slice(idx + 2);
|
|
69
|
+
for (const l of ev.split("\n")) {
|
|
70
|
+
if (!l.startsWith("data: "))
|
|
71
|
+
continue;
|
|
72
|
+
const line = l.slice(6);
|
|
73
|
+
if (line.startsWith("[STREAM]") ||
|
|
74
|
+
line.startsWith("[TASK:") ||
|
|
75
|
+
line.startsWith("[TURN:DONE]") ||
|
|
76
|
+
line.startsWith("[runtime]")) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
console.log(dim(` ${line}`));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
/* logs encerrados com o turno */
|
|
86
|
+
}
|
|
87
|
+
})();
|
|
88
|
+
let lines = [];
|
|
89
|
+
let result;
|
|
90
|
+
let gateLoop = 0;
|
|
91
|
+
try {
|
|
92
|
+
for (;;) {
|
|
93
|
+
if (gateLoop++ >= 6)
|
|
94
|
+
throw new Error("loop de gates não convergiu (6)");
|
|
95
|
+
const res = await fetch(`${API}/v1/agents/${encodeURIComponent(name)}/invoke`, {
|
|
96
|
+
method: "POST",
|
|
97
|
+
headers: authHeaders({ "Content-Type": "application/json", Accept: "text/event-stream" }),
|
|
98
|
+
body: JSON.stringify({ prompt }),
|
|
99
|
+
signal: ac.signal,
|
|
100
|
+
});
|
|
101
|
+
if (!res.ok) {
|
|
102
|
+
const body = await res.text();
|
|
103
|
+
if (res.status === 408)
|
|
104
|
+
throw new Error("turno estourou timeout — segue em background (auton logs)");
|
|
105
|
+
throw new Error(`control plane ${res.status}: ${body}`);
|
|
106
|
+
}
|
|
107
|
+
if (!res.body)
|
|
108
|
+
throw new Error("resposta sem body");
|
|
109
|
+
const reader = res.body.getReader();
|
|
110
|
+
const decoder = new TextDecoder();
|
|
111
|
+
let buf = "";
|
|
112
|
+
let donePayload;
|
|
113
|
+
for (;;) {
|
|
114
|
+
const { done, value } = await reader.read();
|
|
115
|
+
if (done)
|
|
116
|
+
break;
|
|
117
|
+
buf += decoder.decode(value, { stream: true });
|
|
118
|
+
let idx;
|
|
119
|
+
while ((idx = buf.indexOf("\n\n")) !== -1) {
|
|
120
|
+
const event = buf.slice(0, idx);
|
|
121
|
+
buf = buf.slice(idx + 2);
|
|
122
|
+
let evName = "message";
|
|
123
|
+
let data = "";
|
|
124
|
+
for (const l of event.split("\n")) {
|
|
125
|
+
if (l.startsWith("event: "))
|
|
126
|
+
evName = l.slice(7);
|
|
127
|
+
else if (l.startsWith("data: "))
|
|
128
|
+
data = l.slice(6);
|
|
129
|
+
}
|
|
130
|
+
if (evName === "stream") {
|
|
131
|
+
try {
|
|
132
|
+
const ev = JSON.parse(data);
|
|
133
|
+
if (ev.t === "llm" && ev.s === "start") {
|
|
134
|
+
console.log(dim(`⏺ gerando (${ev.model ?? "?"})...`));
|
|
135
|
+
}
|
|
136
|
+
else if (ev.t === "llm" && ev.s === "done") {
|
|
137
|
+
const u = ev.usage;
|
|
138
|
+
console.log(ok(`✓ gerado${u?.tokensOut ? dim(` · ${u.tokensIn ?? "?"}→${u.tokensOut} tok`) : ""}`));
|
|
139
|
+
}
|
|
140
|
+
else if (ev.t === "turn" && ev.s === "start") {
|
|
141
|
+
console.log(dim(`— turno iniciado (${ev.type ?? "?"})`));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
/* frame não-JSON: ignora */
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
else if (evName === "done") {
|
|
149
|
+
try {
|
|
150
|
+
donePayload = JSON.parse(data);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
/* malformado */
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else if (evName === "exit") {
|
|
157
|
+
// worker morreu (ex: task.done) — lê o que veio
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const out = donePayload ?? { turn: "ok", lines: [] };
|
|
162
|
+
lines = out.lines ?? [];
|
|
163
|
+
result = out.result;
|
|
164
|
+
// gates inline: aprovação / pergunta → resolve e roda de novo
|
|
165
|
+
const gate = lines.find((l) => l.startsWith("[APPROVAL:REQ]") || l.startsWith("[QUESTION:REQ]"));
|
|
166
|
+
if (!gate)
|
|
167
|
+
break;
|
|
168
|
+
const g = parseGateLine(gate);
|
|
169
|
+
if (!isTTY) {
|
|
170
|
+
// 0.17.0 — pipe: não pode interagir; reporta e encerra (auton answer/approve segue)
|
|
171
|
+
if (g?.kind === "question") {
|
|
172
|
+
console.log(info("pergunta pendente — rode `auton answer <nome> -- \"resposta\"`"));
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
console.log(info("aprovação pendente — rode `auton approve` ou `auton reject`"));
|
|
176
|
+
}
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
if (g?.kind === "question") {
|
|
180
|
+
const answer = await promptGateQuestion(String(g.payload?.question ?? "pergunta"));
|
|
181
|
+
if (answer === undefined) {
|
|
182
|
+
console.log(dim("cancelado — agente segue pausado (auton answer <nome>)"));
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
console.log(dim(`→ resposta enviada`));
|
|
186
|
+
prompt = answer; // contexto do próximo invoke = resposta
|
|
187
|
+
const ctl = await fetch(`${API}/v1/agents/${encodeURIComponent(name)}/invoke`, {
|
|
188
|
+
method: "POST",
|
|
189
|
+
headers: authHeaders({ "Content-Type": "application/json" }),
|
|
190
|
+
body: JSON.stringify({ question: { answer } }),
|
|
191
|
+
signal: ac.signal,
|
|
192
|
+
});
|
|
193
|
+
if (!ctl.ok)
|
|
194
|
+
throw new Error(`resposta falhou (${ctl.status}): ${await ctl.text()}`);
|
|
195
|
+
const ctlOut = (await ctl.json());
|
|
196
|
+
lines = ctlOut.lines ?? [];
|
|
197
|
+
result = ctlOut.result;
|
|
198
|
+
const nextGate = lines.find((l) => l.startsWith("[APPROVAL:REQ]") || l.startsWith("[QUESTION:REQ]"));
|
|
199
|
+
if (!nextGate)
|
|
200
|
+
break;
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
if (g?.kind === "approval") {
|
|
204
|
+
const reason = String(g.payload?.reason ?? "ação");
|
|
205
|
+
const approved = await promptGateApproval(reason);
|
|
206
|
+
const ctl = await fetch(`${API}/v1/agents/${encodeURIComponent(name)}/invoke`, {
|
|
207
|
+
method: "POST",
|
|
208
|
+
headers: authHeaders({ "Content-Type": "application/json" }),
|
|
209
|
+
body: JSON.stringify({ approval: { approved, reason } }),
|
|
210
|
+
signal: ac.signal,
|
|
211
|
+
});
|
|
212
|
+
if (!ctl.ok)
|
|
213
|
+
throw new Error(`decisão falhou (${ctl.status}): ${await ctl.text()}`);
|
|
214
|
+
const ctlOut = (await ctl.json());
|
|
215
|
+
lines = ctlOut.lines ?? [];
|
|
216
|
+
result = ctlOut.result;
|
|
217
|
+
const nextGate = lines.find((l) => l.startsWith("[APPROVAL:REQ]") || l.startsWith("[QUESTION:REQ]"));
|
|
218
|
+
if (!nextGate)
|
|
219
|
+
break;
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
finally {
|
|
226
|
+
ac.abort();
|
|
227
|
+
await logsP;
|
|
228
|
+
}
|
|
229
|
+
return { lines, result };
|
|
230
|
+
}
|
|
231
|
+
/** Extrai o resultado final (evidência) do [TASK:DONE]. */
|
|
232
|
+
function finalResult(lines, result) {
|
|
233
|
+
if (result !== undefined && result !== null) {
|
|
234
|
+
return typeof result === "string" ? { text: result } : { text: JSON.stringify(result, null, 2) };
|
|
235
|
+
}
|
|
236
|
+
const done = lines.find((l) => l.startsWith("[TASK:DONE]"));
|
|
237
|
+
if (!done)
|
|
238
|
+
return undefined;
|
|
239
|
+
try {
|
|
240
|
+
const ev = JSON.parse(done.slice("[TASK:DONE]".length).trim());
|
|
241
|
+
return { text: ev.result ?? "(sem texto)", evidence: ev.evidence };
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
return { text: done.slice("[TASK:DONE]".length).trim() };
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/** Sessão interativa (TTY). */
|
|
248
|
+
async function session(name) {
|
|
249
|
+
const info0 = await agentInfo(name);
|
|
250
|
+
console.log(box(`sessão · ${name}`, [
|
|
251
|
+
`${info0.model ? dim("modelo: ") + pc.cyan(info0.model) : ""}`,
|
|
252
|
+
`dê uma task ao agente — ele executa e você acompanha ao vivo`,
|
|
253
|
+
dim("/exit · /reset · /help · Ctrl+C sai"),
|
|
254
|
+
].filter(Boolean)));
|
|
255
|
+
const history = [];
|
|
256
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout, prompt: "❯ " });
|
|
257
|
+
rl.prompt();
|
|
258
|
+
rl.on("line", async (raw) => {
|
|
259
|
+
const msg = raw.trim();
|
|
260
|
+
if (msg === "") {
|
|
261
|
+
rl.prompt();
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
if (msg.startsWith("/")) {
|
|
265
|
+
const [cmd, ...rest] = msg.split(/\s+/);
|
|
266
|
+
switch (cmd) {
|
|
267
|
+
case "/exit":
|
|
268
|
+
case "/sair":
|
|
269
|
+
case "/e":
|
|
270
|
+
case "/q":
|
|
271
|
+
console.log(dim("até logo."));
|
|
272
|
+
process.exit(0);
|
|
273
|
+
break;
|
|
274
|
+
case "/reset":
|
|
275
|
+
history.length = 0;
|
|
276
|
+
console.log(ok("histórico limpo"));
|
|
277
|
+
break;
|
|
278
|
+
case "/help":
|
|
279
|
+
console.log(dim("/exit · /reset · /help — ou digite a task"));
|
|
280
|
+
break;
|
|
281
|
+
default:
|
|
282
|
+
console.log(fail(`comando desconhecido: ${cmd} (${dim("/help")})`));
|
|
283
|
+
}
|
|
284
|
+
rl.prompt();
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
rl.pause();
|
|
288
|
+
try {
|
|
289
|
+
const out = await runTask(name, buildPrompt(history, msg), true);
|
|
290
|
+
history.push({ user: msg, agent: finalResult(out.lines, out.result)?.text ?? "" });
|
|
291
|
+
if (history.length > MAX_HISTORY)
|
|
292
|
+
history.shift();
|
|
293
|
+
const fin = finalResult(out.lines, out.result);
|
|
294
|
+
if (fin) {
|
|
295
|
+
console.log(box("resultado", fin.text.split("\n")));
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
const err = out.lines.find((l) => l.startsWith("[TASK:ERR]"));
|
|
299
|
+
if (err)
|
|
300
|
+
console.log(fail(err.slice("[TASK:ERR]".length).trim()));
|
|
301
|
+
else
|
|
302
|
+
console.log(dim("(sem resultado — turno terminou sem task.done)"));
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
catch (e) {
|
|
306
|
+
console.log(fail(`erro: ${e.message}`));
|
|
307
|
+
}
|
|
308
|
+
rl.resume();
|
|
309
|
+
rl.prompt();
|
|
310
|
+
});
|
|
311
|
+
rl.on("SIGINT", () => {
|
|
312
|
+
console.log(dim("\naté logo."));
|
|
313
|
+
process.exit(0);
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
/** One-shot (pipe/script): lê stdin, roda 1 task, imprime resultado. */
|
|
317
|
+
async function oneShot(name) {
|
|
318
|
+
const input = readFileSync(0, "utf8").trim();
|
|
319
|
+
if (!input)
|
|
320
|
+
throw new Error("stdin vazio — passe a task: echo \"task\" | auton chat <nome>");
|
|
321
|
+
const out = await runTask(name, input, false);
|
|
322
|
+
const fin = finalResult(out.lines, out.result);
|
|
323
|
+
if (fin) {
|
|
324
|
+
console.log(box("resultado", fin.text.split("\n")));
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
const gate = out.lines.find((l) => l.startsWith("[APPROVAL:REQ]"));
|
|
328
|
+
const q = out.lines.find((l) => l.startsWith("[QUESTION:REQ]"));
|
|
329
|
+
if (q)
|
|
330
|
+
console.log(info(`pergunta pendente — rode: auton answer ${name} -- "resposta"`));
|
|
331
|
+
else if (gate)
|
|
332
|
+
console.log(info(`aprovação pendente — rode: auton approve ${name}`));
|
|
333
|
+
else {
|
|
334
|
+
const err = out.lines.find((l) => l.startsWith("[TASK:ERR]"));
|
|
335
|
+
if (err)
|
|
336
|
+
console.log(fail(err.slice("[TASK:ERR]".length).trim()));
|
|
337
|
+
else
|
|
338
|
+
console.log(dim("(sem resultado)"));
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
/** Entrada: auton chat [name] | auton <name-deployado> | auton (cwd/picker). */
|
|
343
|
+
export async function cmdChat(name) {
|
|
344
|
+
const agent = await resolveAgent("chat", name);
|
|
345
|
+
if (isTTY)
|
|
346
|
+
await session(agent);
|
|
347
|
+
else
|
|
348
|
+
await oneShot(agent);
|
|
349
|
+
}
|
|
350
|
+
//# sourceMappingURL=chat.js.map
|
package/dist/chat.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface ConfigProvider {
|
|
2
|
+
id: string;
|
|
3
|
+
label: string;
|
|
4
|
+
provider: "gemini" | "openai-compat" | "ollama";
|
|
5
|
+
model: string;
|
|
6
|
+
key?: string;
|
|
7
|
+
base?: string;
|
|
8
|
+
keyVar?: string;
|
|
9
|
+
baseEnv?: string;
|
|
10
|
+
quando: string;
|
|
11
|
+
}
|
|
12
|
+
export interface AutonConfig {
|
|
13
|
+
defaultModel: string;
|
|
14
|
+
providers: ConfigProvider[];
|
|
15
|
+
}
|
|
16
|
+
export declare function configPath(): string;
|
|
17
|
+
export declare function loadConfig(): AutonConfig;
|
|
18
|
+
export declare function saveConfig(cfg: AutonConfig): void;
|
|
19
|
+
export declare function getDefaultModel(): string;
|
|
20
|
+
export declare function setDefaultModel(spec: string): void;
|
|
21
|
+
/** provider ativo = o que tem model === defaultModel; senão o mais recente. */
|
|
22
|
+
export declare function getActiveProvider(): ConfigProvider | undefined;
|
|
23
|
+
export declare function upsertProvider(p: ConfigProvider): void;
|
|
24
|
+
export declare function removeProvider(id: string): void;
|
|
25
|
+
export declare function removeAllProviders(): void;
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// config.ts — config global do CLI (estilo ollama: ~/.local/share/auton/).
|
|
2
|
+
// 0.17: multi-provider + modelo default persistido. Compat legado: se
|
|
3
|
+
// config.json não existe, lê oauth.json antigo (1 provider só).
|
|
4
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { homedir } from "node:os";
|
|
7
|
+
const AUTON_DIR = join(homedir(), ".local", "share", "auton");
|
|
8
|
+
const CONFIG_FILE = join(AUTON_DIR, "config.json");
|
|
9
|
+
const LEGACY_OAUTH = join(AUTON_DIR, "oauth.json");
|
|
10
|
+
export function configPath() {
|
|
11
|
+
return CONFIG_FILE;
|
|
12
|
+
}
|
|
13
|
+
export function loadConfig() {
|
|
14
|
+
try {
|
|
15
|
+
const raw = JSON.parse(readFileSync(CONFIG_FILE, "utf8"));
|
|
16
|
+
return {
|
|
17
|
+
defaultModel: raw.defaultModel ?? "",
|
|
18
|
+
providers: Array.isArray(raw.providers) ? raw.providers : [],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return migrateLegacy();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** oauth.json (0.15.x): 1 credencial só → vira provider no config novo. */
|
|
26
|
+
function migrateLegacy() {
|
|
27
|
+
try {
|
|
28
|
+
const legacy = JSON.parse(readFileSync(LEGACY_OAUTH, "utf8"));
|
|
29
|
+
if (!legacy.model)
|
|
30
|
+
return { defaultModel: "", providers: [] };
|
|
31
|
+
const provider = {
|
|
32
|
+
id: legacy.provider === "gemini" ? "gemini-free" : legacy.provider === "ollama" ? "ollama-local" : "custom",
|
|
33
|
+
label: legacy.model,
|
|
34
|
+
provider: legacy.provider === "gemini" ? "gemini" : legacy.provider === "ollama" ? "ollama" : "openai-compat",
|
|
35
|
+
model: legacy.model,
|
|
36
|
+
key: legacy.key,
|
|
37
|
+
base: legacy.base,
|
|
38
|
+
quando: legacy.quando ?? new Date().toISOString(),
|
|
39
|
+
};
|
|
40
|
+
const cfg = { defaultModel: legacy.model, providers: [provider] };
|
|
41
|
+
saveConfig(cfg);
|
|
42
|
+
return cfg;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return { defaultModel: "", providers: [] };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export function saveConfig(cfg) {
|
|
49
|
+
mkdirSync(AUTON_DIR, { recursive: true });
|
|
50
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(cfg, null, 2) + "\n");
|
|
51
|
+
}
|
|
52
|
+
export function getDefaultModel() {
|
|
53
|
+
return loadConfig().defaultModel;
|
|
54
|
+
}
|
|
55
|
+
export function setDefaultModel(spec) {
|
|
56
|
+
const cfg = loadConfig();
|
|
57
|
+
cfg.defaultModel = spec;
|
|
58
|
+
saveConfig(cfg);
|
|
59
|
+
}
|
|
60
|
+
/** provider ativo = o que tem model === defaultModel; senão o mais recente. */
|
|
61
|
+
export function getActiveProvider() {
|
|
62
|
+
const cfg = loadConfig();
|
|
63
|
+
if (cfg.providers.length === 0)
|
|
64
|
+
return undefined;
|
|
65
|
+
return (cfg.providers.find((p) => p.model === cfg.defaultModel) ??
|
|
66
|
+
[...cfg.providers].sort((a, b) => b.quando.localeCompare(a.quando))[0]);
|
|
67
|
+
}
|
|
68
|
+
export function upsertProvider(p) {
|
|
69
|
+
const cfg = loadConfig();
|
|
70
|
+
const idx = cfg.providers.findIndex((x) => x.id === p.id);
|
|
71
|
+
if (idx === -1)
|
|
72
|
+
cfg.providers.push(p);
|
|
73
|
+
else
|
|
74
|
+
cfg.providers[idx] = p;
|
|
75
|
+
saveConfig(cfg);
|
|
76
|
+
}
|
|
77
|
+
export function removeProvider(id) {
|
|
78
|
+
const cfg = loadConfig();
|
|
79
|
+
const idx = cfg.providers.findIndex((x) => x.id === id);
|
|
80
|
+
if (idx === -1)
|
|
81
|
+
return;
|
|
82
|
+
const [removed] = cfg.providers.splice(idx, 1);
|
|
83
|
+
if (removed?.model === cfg.defaultModel)
|
|
84
|
+
cfg.defaultModel = "";
|
|
85
|
+
saveConfig(cfg);
|
|
86
|
+
}
|
|
87
|
+
export function removeAllProviders() {
|
|
88
|
+
saveConfig({ defaultModel: "", providers: [] });
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|