feat(sync): tombstone, pull dall'export, ritocchi flush e fallback su 404

Prepara il client al gateway 2.12.0 (export + soft delete), mantenendo la
compatibilità con la 2.11.0 in produzione fino al redeploy.

- tombstone: colonna `deleted_at` (+ migrazione), monotona nel merge, esclusa
  dalle ricerche locali di default; `--deleted` in CLI e /qmem:local find;
  conteggio nel report/status; marker 🗑 nei risultati di qmem_get
- `pull` usa `include_deleted=true` e mappa l'intero payload dell'export
  (incluso deleted_at), così il mirror impara le cancellazioni
- rate limit: pace del flush 600 ms (100 req/min < 120/min del gateway) e
  messaggio dedicato su 429 (prima 300-400 ms → possibile 429 con code grandi)
- `qmem_get`: fallback sull'indice locale anche sul 404 (un id in coda non è
  ancora sul gateway) con etichetta "non presente sul gateway"
- test: 27 controlli (nuovi: pull con tombstone, esclusione/visibilità
  tombstone, ricerca del record esportato)

Verificato con la suite locale completa: 27/27.
This commit is contained in:
Matteo Benedetto
2026-09-13 17:53:59 +02:00
parent d509778448
commit d1985514e1
6 changed files with 92 additions and 24 deletions
+2 -1
View File
@@ -60,7 +60,7 @@ export function registerQmemLocal(pi: ExtensionAPI) {
if (sub === "find") {
const query = rest.filter((a) => !a.startsWith("--")).join(" ").trim();
if (!query) {
ctx.ui.notify("Uso: /qmem:local find <query> [--all] [--kind K] [--project P]", "warning");
ctx.ui.notify("Uso: /qmem:local find <query> [--all] [--deleted] [--kind K] [--project P]", "warning");
return;
}
const has = (f: string) => rest.includes(`--${f}`);
@@ -76,6 +76,7 @@ export function registerQmemLocal(pi: ExtensionAPI) {
scope: val("scope"),
include_superseded: has("all"),
include_private: has("private"),
include_deleted: has("deleted"),
top_k: Number(val("top")) || 5,
},
{ dbFile },