UNPKG

lorehub

Version:

Capture and surface the collective wisdom of your codebase

95 lines 4.21 kB
import React from 'react'; import { render } from 'ink'; import { Database } from '../../db/database.js'; import { getDbPath } from '../utils/db-config.js'; import { ConfigManager } from '../../core/config.js'; import { LoresView } from '../components/LoresView.js'; export async function renderBrowse(options) { const dbPath = getDbPath(); const db = new Database(dbPath); const config = ConfigManager.getInstance(); // Non-interactive fallback if (!process.stdin.isTTY) { try { let results = []; const realms = db.listRealms(); // Filter realms let realmsToSearch = realms; if (options.currentRealmOnly) { const currentRealm = db.findRealmByPath(process.cwd()); if (currentRealm) realmsToSearch = [currentRealm]; } else if (options.realmPath) { const specificRealm = db.findRealmByPath(options.realmPath); if (specificRealm) realmsToSearch = [specificRealm]; } const searchMode = options.searchMode || config.get('searchMode') || 'literal'; // Search or list for (const realm of realmsToSearch) { if (options.query) { if (searchMode === 'semantic') { const semanticResults = await db.semanticSearchLores(options.query, { realmId: realm.id, includeScore: true, threshold: config.get('semanticSearchThreshold') }); results.push(...semanticResults); } else { const literalResults = db.searchLores(realm.id, options.query); results.push(...literalResults); } } else { if (options.type) { results.push(...db.listLoresByType(realm.id, options.type)); } else if (options.province) { results.push(...db.listLoresByProvince(realm.id, options.province)); } else { results.push(...db.listLoresByRealm(realm.id)); } } } // Sort and limit results.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime()); const limit = config.get('defaultListLimit') || 100; if (results.length > limit) { results = results.slice(0, limit); } // Display results console.log(`\nLores (${results.length}):\n`); results.forEach((lore, index) => { const realm = db.findRealm(lore.realmId); console.log(`${index + 1}. [${lore.type}] ${lore.content}`); console.log(` Realm: ${realm?.name || 'Unknown'} (${realm?.path || 'Unknown'})`); if (lore.why) console.log(` Why: ${lore.why}`); console.log(` Created: ${lore.createdAt.toLocaleString()}`); console.log(` Status: ${lore.status} | Confidence: ${lore.confidence}%`); if (lore.sigils && lore.sigils.length > 0) { console.log(` Sigils: ${lore.sigils.join(', ')}`); } console.log(''); }); } finally { db.close(); } return; } // Interactive mode - use LoresView directly try { const { waitUntilExit } = render(React.createElement(LoresView, { db: db, realmPath: process.cwd(), initialQuery: options.query, searchMode: options.searchMode, type: options.type, province: options.province, filterRealmPath: options.realmPath, currentRealmOnly: options.currentRealmOnly, limit: config.get('defaultListLimit') || 100 }), { exitOnCtrlC: true // Exit on Ctrl+C }); await waitUntilExit(); } finally { db.close(); } } //# sourceMappingURL=browse.js.map