feat(prompt): regola vincolante identificazione macchina nei record qmem (hostname auto-rilevato, layout modulare) + bump v1.8.0

This commit is contained in:
enne2
2026-08-24 22:55:51 +02:00
parent 4776b4b496
commit 5a5081e5d9
7 changed files with 46 additions and 5 deletions
+11
View File
@@ -1,4 +1,5 @@
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { MACHINE } from "./shared";
export function registerQmemRules(pi: ExtensionAPI) {
const QMEM_RULES = `
@@ -19,6 +20,16 @@ QUANDO un tool fallisce o un'operazione si blocca:
2. se trovata una soluzione documentata → applicala e cita l'ID del record
3. se assente → troubleshooting normale, poi qmem_store della soluzione trovata
### Identificazione macchina nei record (vincolante)
- MACCHINA CORRENTE (rilevata automaticamente dall'estensione): ${MACHINE}
MUST:
- MUST: in qmem_store/qmem_correct che descrivono percorsi, porte, servizi, configurazioni, comandi o risultati LOCALI, includere nel testo il prefisso 'MACCHINA: <hostname> (<OS>, <GPU/hardware rilevanti>)' (es. 'MACCHINA: frigate (Fedora Linux 44, Tesla V100-16GB)').
- MUST: per dettagli strettamente legati a una singola macchina usare il project 'host-<hostname>' (es. host-frigate); se si usa un project funzionale (es. llama-cpp), marcare comunque l'hostname nel testo.
- Verifica SEMPRE l'identità della macchina con 'hostname'/'hostnamectl' PRIMA di salvare (mai dedurla da indizi indiretti).
MUST NOT:
- MUST NOT salvare record locali senza hostname se rischiano di essere applicati su altre macchine.
- Per procedure replicabili altrove: dichiara la macchina di origine e le differenze note (GPU, driver, path).
### Gestione Gerarchica e Navigazione ad Albero
- Per domini complessi/vasti: crea nodi specialistici (level=L2_SUBTOPIC, topic=MACRO/SUB, parent_id=...) e collegali a un nodo indice (level=L1_ROOT, topic=MACRO/ROOT, links=[...]).
- Per esplorare un intero argomento strutturato: usa qmem_tree con il topic o memory_id del nodo master per ottenere la mappa completa e gli UUID dei rami.
+18
View File
@@ -65,6 +65,24 @@ export function saveConfig(cfg: MemoryConfig) {
}
}
// ---------------------------------------------------------------------------
// Identità della macchina: rilevata dinamicamente e iniettata nelle regole.
// Ogni installazione si auto-descrive (hostname + OS + arch) senza configurazione.
// ---------------------------------------------------------------------------
export function detectMachine(): string {
const hostname = os.hostname();
let osName = "OS sconosciuto";
try {
const m = fs.readFileSync("/etc/os-release", "utf8").match(/^PRETTY_NAME="?([^"\n]+)"?/m);
if (m) osName = m[1];
} catch {
/* os-release non leggibile: resta il default */
}
return `${hostname} (${osName}, ${os.arch()})`;
}
export const MACHINE = detectMachine();
export async function gatewayRequest(
cfg: MemoryConfig,
method: string,
+2 -1
View File
@@ -1,6 +1,6 @@
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { Type } from "typebox";
import { gatewayRequest, loadConfig } from "../shared";
import { gatewayRequest, loadConfig, MACHINE } from "../shared";
export function registerQmemCorrect(pi: ExtensionAPI) {
pi.registerTool({
@@ -17,6 +17,7 @@ export function registerQmemCorrect(pi: ExtensionAPI) {
promptGuidelines: [
"qmem_correct: correggi solo con evidenza verificata (fonte autorevole, conferma utente, esito di azione) — mai per semplice dubbio o opinione.",
"qmem_correct: il vecchio record resta in archivio marcato superseded — mai eliminare (tranne duplicati esatti).",
`qmem_correct: se il record corretto riguarda una macchina, dichiara nel testo la MACCHINA di riferimento (prefisso 'MACCHINA: <hostname> (<OS>, <GPU>)'). Macchina corrente (rilevata dall'estensione): ${MACHINE}.`,
],
parameters: Type.Object({
memory_id: Type.Optional(Type.String({ description: "UUID del record attivo da supersedere (dalla risposta di qmem_search)." })),
+2 -1
View File
@@ -1,6 +1,6 @@
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { Type } from "typebox";
import { gatewayRequest, loadConfig } from "../shared";
import { gatewayRequest, loadConfig, MACHINE } from "../shared";
export function registerQmemStore(pi: ExtensionAPI) {
pi.registerTool({
@@ -16,6 +16,7 @@ export function registerQmemStore(pi: ExtensionAPI) {
promptGuidelines: [
"qmem_store: project_id è OBBLIGATORIO — consulta qmem_meta per riusare l'id esistente (fallback pi-qmem per conoscenza trasversale, mai vuoto).",
"qmem_store: salva record compatti e ad alto segnale, mai transcript grezzi.",
`qmem_store: per record macchina-specifici (percorsi, porte, servizi, config locali) includi nel testo il prefisso 'MACCHINA: <hostname> (<OS>, <GPU>)' e usa project host-<hostname> per dettagli strettamente locali. Macchina corrente (rilevata dall'estensione): ${MACHINE}.`,
],
parameters: Type.Object({
text: Type.String({ description: "Il contenuto del record di memoria (compatto, ad alto segnale)." }),