93 lines
2.7 KiB
Bash
Executable File
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
|