- gateway: separate config, models, state, audit, guardrail, embeddings, store, metrics, cleanup and routes; keep main.py as FastAPI bootstrap - extension: split client/config, six tools, config command and rules; preserve jiti entrypoint and registrations - Dockerfile copies the complete gateway module set - tests: update monkeypatch boundaries for modular config/state
91 lines
2.5 KiB
TypeScript
91 lines
2.5 KiB
TypeScript
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
import { loadConfig, saveConfig, testConnection } from "./shared";
|
|
|
|
export function registerQmemConfig(pi: ExtensionAPI) {
|
|
pi.registerCommand("qmem:config", {
|
|
description:
|
|
"Menu configurazione Memory Gateway: URL, API key, test connessione (salva in ~/.config/pi-qmem/config.json)",
|
|
handler: async (args, ctx) => {
|
|
const cfg = loadConfig();
|
|
const parts = (args ?? "").trim().split(/\s+/).filter(Boolean);
|
|
|
|
// --- Modalità CLI rapida (non interattiva) ---
|
|
if (parts.length > 0) {
|
|
if (parts[0] === "url" && parts[1]) {
|
|
cfg.url = parts[1].replace(/\/+$/, "");
|
|
saveConfig(cfg);
|
|
ctx.ui.notify(`qmem: URL aggiornato a ${cfg.url}`, "info");
|
|
return;
|
|
}
|
|
if (parts[0] === "apikey" && parts[1]) {
|
|
cfg.apiKey = parts[1];
|
|
saveConfig(cfg);
|
|
ctx.ui.notify("qmem: API key aggiornata", "info");
|
|
return;
|
|
}
|
|
if (parts[0] === "test") {
|
|
await testConnection(ctx, cfg);
|
|
return;
|
|
}
|
|
ctx.ui.notify("Uso: /qmem:config url <URL> | apikey <KEY> | test", "warning");
|
|
return;
|
|
}
|
|
|
|
// --- Modalità menu interattivo (TUI/RPC) ---
|
|
if (!ctx.hasUI) {
|
|
ctx.ui.notify(
|
|
`qmem: url=${cfg.url}, apiKey=${cfg.apiKey ? cfg.apiKey.slice(0, 8) + "..." : "(mancante)"}`,
|
|
"info",
|
|
);
|
|
return;
|
|
}
|
|
|
|
const choice = await ctx.ui.select(
|
|
"qmem — Configurazione",
|
|
[
|
|
"🌐 Imposta URL gateway",
|
|
"🔑 Cambia API key",
|
|
"🔌 Test connessione",
|
|
"📋 Mostra configurazione",
|
|
"↩️ Annulla",
|
|
],
|
|
);
|
|
if (!choice || choice.startsWith("↩️")) return;
|
|
|
|
if (choice.startsWith("🌐")) {
|
|
const url = await ctx.ui.input("URL del Memory Gateway:", cfg.url, { timeout: 60_000 });
|
|
if (url && url.trim()) {
|
|
cfg.url = url.trim().replace(/\/+$/, "");
|
|
saveConfig(cfg);
|
|
ctx.ui.notify(`qmem: URL aggiornato a ${cfg.url}`, "info");
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (choice.startsWith("🔑")) {
|
|
const key = await ctx.ui.input("API key (lascia vuoto per non cambiare):", "", { timeout: 60_000 });
|
|
if (key && key.trim()) {
|
|
cfg.apiKey = key.trim();
|
|
saveConfig(cfg);
|
|
ctx.ui.notify("qmem: API key aggiornata", "info");
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (choice.startsWith("🔌")) {
|
|
await testConnection(ctx, cfg);
|
|
return;
|
|
}
|
|
|
|
if (choice.startsWith("📋")) {
|
|
ctx.ui.notify(
|
|
`qmem: url=${cfg.url}, apiKey=${cfg.apiKey ? cfg.apiKey.slice(0, 8) + "..." : "(mancante)"}`,
|
|
"info",
|
|
);
|
|
return;
|
|
}
|
|
},
|
|
});
|
|
|
|
}
|