48 lines
3.1 KiB
PHP
Executable File
48 lines
3.1 KiB
PHP
Executable File
<?php
|
|
// KB Sync Cron - syncs knowledge_base -> claude_conversations_kb -> commonia_knowledge
|
|
// Called by: curl -s http://localhost:5821/api/kb-sync-cron.php
|
|
$log = "/var/log/wevads/claude_kb_sync.log";
|
|
@mkdir(dirname($log), 0755, true);
|
|
$pdo = new PDO('pgsql:host=localhost;dbname=adx_system','admin','admin123');
|
|
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
$results = [];
|
|
|
|
// Step 1: KB markdown files -> knowledge_base
|
|
$synced = 0;
|
|
foreach (glob('/opt/wevads/hamid-files/kb_*.md') as $f) {
|
|
$bn = basename($f, '.md');
|
|
$title = trim(preg_replace('/^#+\s*/', '', fgets(fopen($f, 'r'))));
|
|
$exists = $pdo->query("SELECT COUNT(*) FROM admin.knowledge_base WHERE title LIKE '%{$bn}%'")->fetchColumn();
|
|
if ($exists == 0 && $title) {
|
|
$cat = explode('_', str_replace('kb_', '', $bn))[0];
|
|
$content = file_get_contents($f);
|
|
$stmt = $pdo->prepare("INSERT INTO admin.knowledge_base (category, title, content, created_at) VALUES (?,?,?,NOW())");
|
|
$stmt->execute([$cat, $title, substr($content, 0, 5000)]);
|
|
$synced++;
|
|
}
|
|
}
|
|
$results['new_kb_files'] = $synced;
|
|
|
|
// Step 2: knowledge_base -> claude_conversations_kb
|
|
$last = $pdo->query("SELECT COALESCE(MAX(created_at),'2020-01-01') FROM admin.claude_conversations_kb")->fetchColumn();
|
|
$stmt2 = $pdo->prepare("INSERT INTO admin.claude_conversations_kb (title, summary, category, importance_score, created_at, last_synced_at) SELECT LEFT(title,200), LEFT(content,1000), UPPER(COALESCE(NULLIF(category,''),'GENERAL')), CASE WHEN category IN ('infrastructure','framework','architecture') THEN 9 WHEN category IN ('operations','security','methods') THEN 8 ELSE 7 END, created_at, NOW() FROM admin.knowledge_base WHERE created_at > ? AND title IS NOT NULL AND title != '' ORDER BY created_at LIMIT 50");
|
|
$stmt2->execute([$last]);
|
|
$results['new_conversations'] = $stmt2->rowCount();
|
|
$results['total_conversations'] = $pdo->query("SELECT COUNT(*) FROM admin.claude_conversations_kb")->fetchColumn();
|
|
|
|
// Step 3: claude_conversations_kb -> commonia_knowledge
|
|
$lastComm = $pdo->query("SELECT COALESCE(MAX(created_at),'2020-01-01') FROM admin.commonia_knowledge WHERE type='claude_session'")->fetchColumn();
|
|
$stmt3 = $pdo->prepare("INSERT INTO admin.commonia_knowledge (type, category, title, content, priority, created_at) SELECT 'claude_session', LOWER(category), LEFT(title,200), LEFT(summary,500), importance_score, created_at FROM admin.claude_conversations_kb WHERE created_at > ? AND title IS NOT NULL ORDER BY created_at LIMIT 50 ON CONFLICT DO NOTHING");
|
|
$stmt3->execute([$lastComm]);
|
|
$results['new_commonia'] = $stmt3->rowCount();
|
|
$results['total_commonia'] = $pdo->query("SELECT COUNT(*) FROM admin.commonia_knowledge WHERE type='claude_session'")->fetchColumn();
|
|
|
|
// Log
|
|
$msg = date('Y-m-d H:i:s') . " SYNC: files={$results['new_kb_files']} convs={$results['new_conversations']} (total={$results['total_conversations']}) commonia={$results['new_commonia']}\n";
|
|
file_put_contents($log, $msg, FILE_APPEND);
|
|
|
|
if (php_sapi_name() === 'cli' || isset($_GET['action'])) {
|
|
header('Content-Type: application/json');
|
|
echo json_encode(['success' => true, 'results' => $results]);
|
|
}
|