Files
brain-template/scripts/brain-template-export.sh

93 lines
2.7 KiB
Bash
Executable File

#!/usr/bin/env bash
# brain-template-export.sh — Extrait brain-template.db depuis brain.db (kernel+public only)
# Usage: bash scripts/brain-template-export.sh [output_path]
#
# Fast path : copie les vecteurs existants, pas besoin d'Ollama.
# Zéro table session (claims, signals, handoffs, sessions, agent_loads, locks, circuit_breaker, agent_memory).
set -euo pipefail
BRAIN_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
SRC="${BRAIN_ROOT}/brain.db"
DST="${1:-${BRAIN_ROOT}/brain-template.db}"
if [[ ! -f "$SRC" ]]; then
echo "❌ brain.db introuvable : $SRC" >&2
exit 1
fi
echo "brain-template-export : $SRC$DST"
echo "Scopes inclus : kernel, public"
python3 - "$SRC" "$DST" << 'PY'
import sqlite3
import sys
src_path = sys.argv[1]
dst_path = sys.argv[2]
# Connexion source (lecture seule)
src = sqlite3.connect(f'file:{src_path}?mode=ro', uri=True)
src.row_factory = sqlite3.Row
# Créer le template DB
dst = sqlite3.connect(dst_path)
dst.execute("PRAGMA journal_mode=WAL")
# Créer la table embeddings (seule table du template)
dst.execute("""
CREATE TABLE IF NOT EXISTS embeddings (
chunk_id TEXT PRIMARY KEY,
filepath TEXT NOT NULL,
title TEXT,
chunk_text TEXT NOT NULL,
vector BLOB,
model TEXT,
indexed INTEGER DEFAULT 0,
scope TEXT NOT NULL DEFAULT 'work',
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
)
""")
dst.execute("CREATE INDEX IF NOT EXISTS idx_emb_filepath ON embeddings(filepath)")
dst.execute("CREATE INDEX IF NOT EXISTS idx_emb_indexed ON embeddings(indexed)")
dst.execute("CREATE INDEX IF NOT EXISTS idx_emb_scope ON embeddings(scope)")
dst.commit()
# Copier uniquement les embeddings kernel + public
ALLOWED_SCOPES = ('kernel', 'public')
placeholders = ','.join('?' * len(ALLOWED_SCOPES))
rows = src.execute(f"""
SELECT chunk_id, filepath, title, chunk_text, vector, model, indexed, scope, created_at, updated_at
FROM embeddings
WHERE indexed = 1 AND vector IS NOT NULL AND scope IN ({placeholders})
""", ALLOWED_SCOPES).fetchall()
for r in rows:
dst.execute("""
INSERT OR REPLACE INTO embeddings
(chunk_id, filepath, title, chunk_text, vector, model, indexed, scope, created_at, updated_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
""", tuple(r))
dst.commit()
dst.execute("VACUUM")
# Stats
total = len(rows)
scopes = {}
for r in rows:
s = r['scope']
scopes[s] = scopes.get(s, 0) + 1
src.close()
dst.close()
print(f"✅ Template généré : {dst_path}")
print(f" Chunks : {total}")
for s, c in sorted(scopes.items()):
print(f" - {s} : {c}")
print(f" Tables session : 0 (aucune)")
PY