brainbank 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/utils.ts","../src/cli/commands/index-cmd.ts","../src/cli/factory.ts","../src/cli/commands/collection.ts","../src/cli/commands/kv.ts","../src/cli/commands/docs.ts","../src/cli/commands/search.ts","../src/cli/commands/context.ts","../src/cli/commands/system.ts","../src/cli/index.ts"],"sourcesContent":["/**\n * BrainBank CLI — Shared Utilities\n *\n * Colors, argument parsing, and result formatting.\n * No BrainBank imports — pure Node.js / terminal helpers.\n */\n\n// ── Colors ──────────────────────────────────────────\n\nexport const c = {\n green: (s: string) => `\\x1b[32m${s}\\x1b[0m`,\n red: (s: string) => `\\x1b[31m${s}\\x1b[0m`,\n yellow: (s: string) => `\\x1b[33m${s}\\x1b[0m`,\n cyan: (s: string) => `\\x1b[36m${s}\\x1b[0m`,\n dim: (s: string) => `\\x1b[2m${s}\\x1b[0m`,\n bold: (s: string) => `\\x1b[1m${s}\\x1b[0m`,\n magenta: (s: string) => `\\x1b[35m${s}\\x1b[0m`,\n};\n\n// ── Argument Parsing ────────────────────────────────\n\n/** Raw argv, sliced past the Node binary and script path. */\nexport const args = process.argv.slice(2);\n\nexport function getFlag(name: string): string | undefined {\n const idx = args.indexOf(`--${name}`);\n return idx >= 0 ? args[idx + 1] : undefined;\n}\n\nexport function hasFlag(name: string): boolean {\n return args.includes(`--${name}`);\n}\n\n/** Known flags that take a value (--flag <value>). */\nconst VALUE_FLAGS = new Set([\n 'repo', 'depth', 'collection', 'pattern', 'context', 'name',\n 'keep', 'reranker', 'only', 'docs',\n 'ignore', 'meta', 'k', 'mode', 'limit',\n]);\n\n/**\n * Strip all --flags AND their values from an argv slice.\n * Returns only positional arguments.\n *\n * stripFlags(['ksearch', 'auth', '--repo', '/path'])\n * → ['ksearch', 'auth']\n */\nexport function stripFlags(argv: string[]): string[] {\n const result: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n if (argv[i].startsWith('--')) {\n const name = argv[i].slice(2);\n if (VALUE_FLAGS.has(name)) i++; // skip next (the value)\n continue;\n }\n result.push(argv[i]);\n }\n return result;\n}\n\n// ── Result Printer ──────────────────────────────────\n\nexport function printResults(results: any[]): void {\n if (results.length === 0) {\n console.log(c.yellow(' No results found.'));\n return;\n }\n\n for (const r of results) {\n const score = Math.round(r.score * 100);\n\n if (r.type === 'code') {\n const m = r.metadata;\n console.log(\n `${c.green(`[CODE ${score}%]`)} ${c.bold(r.filePath!)} — ` +\n `${m.name || m.chunkType} ${c.dim(`L${m.startLine}-${m.endLine}`)}`,\n );\n console.log(c.dim(r.content.split('\\n').slice(0, 5).join('\\n')));\n console.log('');\n } else if (r.type === 'commit') {\n const m = r.metadata;\n console.log(\n `${c.cyan(`[COMMIT ${score}%]`)} ${c.bold(m.shortHash)} ` +\n `${r.content} ${c.dim(`(${m.author})`)}`,\n );\n if (m.files?.length) console.log(c.dim(` Files: ${m.files.slice(0, 4).join(', ')}`));\n console.log('');\n } else if (r.type === 'document') {\n const ctx = r.context ? ` — ${c.dim(r.context)}` : '';\n console.log(\n `${c.magenta(`[DOC ${score}%]`)} ${c.bold(r.filePath!)} ` +\n `[${r.metadata.collection}]${ctx}`,\n );\n console.log(c.dim(r.content.split('\\n').slice(0, 4).join('\\n')));\n console.log('');\n }\n }\n}\n","/**\n * brainbank index [path] — Index code + git + docs\n */\n\nimport * as path from 'node:path';\nimport { c, args, getFlag, hasFlag } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory.ts';\n\nexport async function cmdIndex(): Promise<void> {\n const repoPath = args[1] || '.';\n const force = hasFlag('force');\n const depth = parseInt(getFlag('depth') || '500', 10);\n const onlyRaw = getFlag('only');\n const docsPath = getFlag('docs');\n const modules = onlyRaw\n ? onlyRaw.split(',').map(s => s.trim()) as ('code' | 'git' | 'docs')[]\n : undefined;\n\n // If --docs is passed, auto-include 'docs' in modules\n if (docsPath && modules && !modules.includes('docs')) {\n modules.push('docs');\n }\n\n console.log(c.bold('\\n━━━ BrainBank Index ━━━'));\n console.log(c.dim(` Repo: ${repoPath}`));\n console.log(c.dim(` Force: ${force}`));\n console.log(c.dim(` Git depth: ${depth}`));\n if (modules) console.log(c.dim(` Modules: ${modules.join(', ')}`));\n if (docsPath) console.log(c.dim(` Docs path: ${docsPath}`));\n\n const brain = await createBrain(repoPath);\n\n // Auto-register docs collection from --docs path\n if (docsPath) {\n const absDocsPath = path.resolve(docsPath);\n const collName = path.basename(absDocsPath);\n try {\n await brain.addCollection({\n name: collName,\n path: absDocsPath,\n pattern: '**/*.md',\n ignore: ['deprecated/**', 'node_modules/**'],\n });\n console.log(c.dim(` Registered docs collection: ${collName}`));\n } catch {\n console.log(c.yellow(` Warning: docs module not loaded, skipping --docs`));\n }\n }\n\n const result = await brain.index({\n modules,\n forceReindex: force,\n gitDepth: depth,\n onProgress: (stage, msg) => {\n process.stdout.write(`\\r ${c.cyan(stage.toUpperCase())} ${msg} `);\n },\n });\n\n console.log('\\n');\n if (result.code) {\n console.log(` ${c.green('Code')}: ${result.code.indexed} indexed, ${result.code.skipped} skipped, ${result.code.chunks ?? 0} chunks`);\n }\n if (result.git) {\n console.log(` ${c.green('Git')}: ${result.git.indexed} indexed, ${result.git.skipped} skipped`);\n }\n if (result.docs) {\n for (const [name, stat] of Object.entries(result.docs)) {\n console.log(` ${c.green('Docs')}: [${name}] ${stat.indexed} indexed, ${stat.skipped} skipped, ${stat.chunks} chunks`);\n }\n }\n\n const stats = brain.stats();\n console.log(`\\n ${c.bold('Totals')}:`);\n if (stats.code) console.log(` Code chunks: ${stats.code.chunks}`);\n if (stats.git) console.log(` Git commits: ${stats.git.commits}`);\n if (stats.git) console.log(` Co-edit pairs: ${stats.git.coEdits}`);\n if (stats.documents) console.log(` Documents: ${stats.documents.documents}`);\n\n brain.close();\n}\n","/**\n * BrainBank CLI — Brain Factory\n *\n * Creates a configured BrainBank instance with built-in indexers,\n * auto-discovered indexers, and config file support.\n */\n\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { BrainBank } from '@/brainbank.ts';\nimport { code } from '@/indexers/code/code-plugin.ts';\nimport { git } from '@/indexers/git/git-plugin.ts';\nimport { docs } from '@/indexers/docs/docs-plugin.ts';\nimport type { Plugin } from '@/indexers/base.ts';\nimport { c, getFlag } from './utils.ts';\n\n// ── Types ───────────────────────────────────────────\n\ninterface BrainBankCliConfig {\n /** Custom indexers to register alongside built-in ones. */\n indexers?: Plugin[];\n /** Override which built-in indexers to load. Default: ['code', 'git', 'docs'] */\n builtins?: ('code' | 'git' | 'docs')[];\n /** BrainBank constructor options. */\n brainbank?: Record<string, any>;\n}\n\nconst CONFIG_NAMES = ['config.ts', 'config.js', 'config.mjs'];\nconst INDEXER_EXTENSIONS = ['.ts', '.js', '.mjs'];\n\n// ── Caches ──────────────────────────────────────────\n\nconst NOT_LOADED = Symbol('not-loaded');\nlet _configCache: BrainBankCliConfig | null | typeof NOT_LOADED = NOT_LOADED;\nlet _folderPluginsCache: Plugin[] | typeof NOT_LOADED = NOT_LOADED;\n\n/** Reset factory caches. Useful for tests that import this module multiple times. */\nexport function resetFactoryCache(): void {\n _configCache = NOT_LOADED;\n _folderPluginsCache = NOT_LOADED;\n}\n\n// ── Config Loader ───────────────────────────────────\n\n/** Load .brainbank/config.ts if present. */\nasync function loadConfig(): Promise<BrainBankCliConfig | null> {\n if (_configCache !== NOT_LOADED) return _configCache;\n\n const repoPath = getFlag('repo') ?? '.';\n const brainbankDir = path.resolve(repoPath, '.brainbank');\n\n for (const name of CONFIG_NAMES) {\n const configPath = path.join(brainbankDir, name);\n if (fs.existsSync(configPath)) {\n try {\n const mod = await import(configPath);\n _configCache = (mod.default ?? mod) as BrainBankCliConfig;\n return _configCache;\n } catch (err: any) {\n console.error(c.red(`Error loading .brainbank/${name}: ${err.message}`));\n process.exit(1);\n }\n }\n }\n\n _configCache = null;\n return null;\n}\n\n// ── Plugin Discovery ───────────────────────────────\n\n/** Auto-discover indexers from .brainbank/indexers/ folder. */\nasync function discoverFolderPlugins(): Promise<Plugin[]> {\n if (_folderPluginsCache !== NOT_LOADED) return _folderPluginsCache;\n\n const repoPath = getFlag('repo') ?? '.';\n const indexersDir = path.resolve(repoPath, '.brainbank', 'indexers');\n\n if (!fs.existsSync(indexersDir)) {\n _folderPluginsCache = [];\n return [];\n }\n\n const files = fs.readdirSync(indexersDir)\n .filter(f => INDEXER_EXTENSIONS.some(ext => f.endsWith(ext)))\n .sort();\n\n const indexers: Plugin[] = [];\n\n for (const file of files) {\n const filePath = path.join(indexersDir, file);\n try {\n const mod = await import(filePath);\n const indexer = mod.default ?? mod;\n\n if (indexer && typeof indexer === 'object' && indexer.name) {\n indexers.push(indexer as Plugin);\n } else {\n console.error(c.yellow(`⚠ ${file}: must export a default Plugin with a 'name' property, skipping`));\n }\n } catch (err: any) {\n console.error(c.red(`Error loading indexer ${file}: ${err.message}`));\n }\n }\n\n _folderPluginsCache = indexers;\n return indexers;\n}\n\n// ── Multi-repo Detection ────────────────────────────\n\n/** Detect subdirectories that have their own .git repo. */\nfunction detectGitSubdirs(parentPath: string): { name: string; path: string }[] {\n try {\n const entries = fs.readdirSync(parentPath, { withFileTypes: true });\n return entries\n .filter(e =>\n e.isDirectory() &&\n !e.name.startsWith('.') &&\n !e.name.startsWith('node_modules') &&\n fs.existsSync(path.join(parentPath, e.name, '.git')),\n )\n .map(e => ({ name: e.name, path: path.join(parentPath, e.name) }));\n } catch {\n return [];\n }\n}\n\n// ── Factory ─────────────────────────────────────────\n\n/** Create a BrainBank with built-in + discovered + config indexers. */\nexport async function createBrain(repoPath?: string): Promise<BrainBank> {\n const rp = repoPath ?? getFlag('repo') ?? '.';\n const config = await loadConfig();\n const folderIndexers = await discoverFolderPlugins();\n\n const brainOpts: Record<string, any> = { repoPath: rp, ...(config?.brainbank ?? {}) };\n await setupProviders(brainOpts);\n\n const brain = new BrainBank(brainOpts);\n const builtins = config?.builtins ?? ['code', 'git', 'docs'];\n registerBuiltins(brain, rp, builtins);\n\n for (const indexer of folderIndexers) brain.use(indexer);\n if (config?.indexers) {\n for (const indexer of config.indexers) brain.use(indexer);\n }\n\n return brain;\n}\n\n/** Configure reranker and embedding provider on brainOpts. */\nasync function setupProviders(brainOpts: Record<string, any>): Promise<void> {\n const rerankerFlag = getFlag('reranker');\n if (rerankerFlag === 'qwen3') {\n const { Qwen3Reranker } = await import('@/providers/rerankers/qwen3-reranker.ts');\n brainOpts.reranker = new Qwen3Reranker();\n }\n\n const embFlag = getFlag('embedding');\n if (embFlag) {\n const { resolveEmbedding } = await import('@/providers/embeddings/resolve.ts');\n const provider = await resolveEmbedding(embFlag);\n brainOpts.embeddingProvider = provider;\n brainOpts.embeddingDims = provider.dims;\n }\n // If no flag → Initializer reads provider_key from DB → falls back to local\n}\n\n/** Register built-in indexers with multi-repo detection. */\nfunction registerBuiltins(\n brain: BrainBank, rp: string, builtins: ('code' | 'git' | 'docs')[],\n): void {\n const resolvedRp = path.resolve(rp);\n const hasRootGit = fs.existsSync(path.join(resolvedRp, '.git'));\n const gitSubdirs = !hasRootGit ? detectGitSubdirs(resolvedRp) : [];\n\n if (gitSubdirs.length > 0 && (builtins.includes('code') || builtins.includes('git'))) {\n console.log(c.cyan(` Multi-repo: found ${gitSubdirs.length} git repos: ${gitSubdirs.map(d => d.name).join(', ')}`));\n for (const sub of gitSubdirs) {\n if (builtins.includes('code')) brain.use(code({ repoPath: sub.path, name: `code:${sub.name}` }));\n if (builtins.includes('git')) brain.use(git({ repoPath: sub.path, name: `git:${sub.name}` }));\n }\n } else {\n if (builtins.includes('code')) brain.use(code({ repoPath: rp }));\n if (builtins.includes('git')) brain.use(git());\n }\n\n if (builtins.includes('docs')) brain.use(docs());\n}\n","/**\n * brainbank collection add|list|remove — Document collection management\n */\n\nimport { c, args, getFlag, stripFlags } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory.ts';\n\nexport async function cmdCollection(): Promise<void> {\n const pos = stripFlags(args);\n const sub = pos[1];\n\n if (sub === 'add') {\n const path = pos[2];\n const name = getFlag('name');\n const pattern = getFlag('pattern') ?? '**/*.md';\n const context = getFlag('context');\n const ignoreRaw = getFlag('ignore');\n\n if (!path || !name) {\n console.log(c.red('Usage: brainbank collection add <path> --name <name> [--pattern \"**/*.md\"] [--ignore \"glob\"] [--context \"description\"]'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.addCollection({\n name,\n path,\n pattern,\n ignore: ignoreRaw ? ignoreRaw.split(',') : [],\n context: context ?? undefined,\n });\n console.log(c.green(`✓ Collection '${name}' added: ${path} (${pattern})`));\n if (context) console.log(c.dim(` Context: ${context}`));\n brain.close();\n return;\n }\n\n if (sub === 'list') {\n const brain = await createBrain();\n await brain.initialize();\n const collections = brain.listCollections();\n if (collections.length === 0) {\n console.log(c.yellow(' No collections registered.'));\n } else {\n console.log(c.bold('\\n━━━ Collections ━━━\\n'));\n for (const col of collections) {\n console.log(` ${c.cyan(col.name)} ${c.dim('→')} ${col.path}`);\n console.log(` Pattern: ${col.pattern ?? '**/*.md'}`);\n if (col.context) console.log(` Context: ${c.dim(col.context)}`);\n }\n }\n brain.close();\n return;\n }\n\n if (sub === 'remove') {\n const name = pos[2];\n if (!name) {\n console.log(c.red('Usage: brainbank collection remove <name>'));\n process.exit(1);\n }\n const brain = await createBrain();\n await brain.removeCollection(name);\n console.log(c.green(`✓ Collection '${name}' removed.`));\n brain.close();\n return;\n }\n\n console.log(c.red('Usage: brainbank collection <add|list|remove>'));\n process.exit(1);\n}\n","/**\n * brainbank kv add|search|list|trim|clear — Dynamic KV collection management\n */\n\nimport { c, args, getFlag, stripFlags } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory.ts';\n\nexport async function cmdKv(): Promise<void> {\n const pos = stripFlags(args);\n const sub = pos[1];\n\n // ── add ─────────────────────────────────────────\n if (sub === 'add') {\n const collName = pos[2];\n const content = pos.slice(3).join(' ');\n const metaRaw = getFlag('meta');\n\n if (!collName || !content) {\n console.log(c.red(\"Usage: brainbank kv add <collection> <content> [--meta '{\\\"key\\\":\\\"val\\\"}']\"));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const meta = metaRaw ? JSON.parse(metaRaw) : {};\n const id = await coll.add(content, meta);\n console.log(c.green(`✓ Added item #${id} to '${collName}'`));\n brain.close();\n return;\n }\n\n // ── search ──────────────────────────────────────\n if (sub === 'search') {\n const collName = pos[2];\n const query = pos.slice(3).join(' ');\n const k = parseInt(getFlag('k') || '5', 10);\n const mode = (getFlag('mode') as any) || 'hybrid';\n\n if (!collName || !query) {\n console.log(c.red('Usage: brainbank kv search <collection> <query> [--k 5] [--mode hybrid|keyword|vector]'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const results = await coll.search(query, { k, mode });\n\n if (results.length === 0) {\n console.log(c.yellow(' No results found.'));\n } else {\n console.log(c.bold(`\\n━━━ ${collName}: \"${query}\" ━━━\\n`));\n for (const r of results) {\n const score = Math.round((r.score ?? 0) * 100);\n console.log(` ${c.cyan(`[${score}%]`)} ${r.content}`);\n if (Object.keys(r.metadata).length > 0) {\n console.log(` ${c.dim(JSON.stringify(r.metadata))}`);\n }\n }\n }\n brain.close();\n return;\n }\n\n // ── list ────────────────────────────────────────\n if (sub === 'list') {\n const collName = pos[2];\n const limit = parseInt(getFlag('limit') || '20', 10);\n\n if (!collName) {\n const brain = await createBrain();\n await brain.initialize();\n const names = brain.listCollectionNames();\n if (names.length === 0) {\n console.log(c.yellow(' No KV collections found.'));\n } else {\n console.log(c.bold('\\n━━━ KV Collections ━━━\\n'));\n for (const n of names) {\n const coll = brain.collection(n);\n console.log(` ${c.cyan(n)} — ${coll.count()} items`);\n }\n }\n brain.close();\n return;\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const items = coll.list({ limit });\n if (items.length === 0) {\n console.log(c.yellow(` Collection '${collName}' is empty.`));\n } else {\n console.log(c.bold(`\\n━━━ ${collName} (${coll.count()} items) ━━━\\n`));\n for (const item of items) {\n const age = Math.round((Date.now() / 1000 - item.createdAt) / 60);\n console.log(` #${item.id} ${c.dim(`(${age}m ago)`)} ${item.content.slice(0, 80)}`);\n }\n }\n brain.close();\n return;\n }\n\n // ── trim ────────────────────────────────────────\n if (sub === 'trim') {\n const collName = pos[2];\n const keep = parseInt(getFlag('keep') || '0', 10);\n\n if (!collName || keep <= 0) {\n console.log(c.red('Usage: brainbank kv trim <collection> --keep <n>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const result = await coll.trim({ keep });\n console.log(c.green(`✓ Trimmed ${result.removed} items from '${collName}' (kept ${keep})`));\n brain.close();\n return;\n }\n\n // ── clear ───────────────────────────────────────\n if (sub === 'clear') {\n const collName = pos[2];\n if (!collName) {\n console.log(c.red('Usage: brainbank kv clear <collection>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const before = coll.count();\n coll.clear();\n console.log(c.green(`✓ Cleared ${before} items from '${collName}'`));\n brain.close();\n return;\n }\n\n console.log(c.red('Usage: brainbank kv <add|search|list|trim|clear>'));\n process.exit(1);\n}\n\n","/**\n * brainbank docs — Index document collections\n * brainbank dsearch — Search documents only\n */\n\nimport { c, args, getFlag, stripFlags } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory.ts';\n\nexport async function cmdDocs(): Promise<void> {\n const collection = getFlag('collection');\n const brain = await createBrain();\n\n console.log(c.bold('\\n━━━ BrainBank Docs Index ━━━\\n'));\n\n const opts: { collections?: string[]; onProgress?: any } = {};\n if (collection) opts.collections = [collection];\n opts.onProgress = (col: string, file: string, cur: number, total: number) => {\n process.stdout.write(`\\r ${c.cyan(col)} [${cur}/${total}] ${file} `);\n };\n\n const results = await brain.indexDocs(opts);\n\n console.log('\\n');\n for (const [name, stat] of Object.entries(results)) {\n console.log(` ${c.green(name)}: ${stat.indexed} indexed, ${stat.skipped} skipped, ${stat.chunks} chunks`);\n }\n\n brain.close();\n}\n\nexport async function cmdDocSearch(): Promise<void> {\n const query = stripFlags(args).slice(1).join(' ');\n if (!query) {\n console.log(c.red('Usage: brainbank dsearch <query>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n const collection = getFlag('collection');\n const k = parseInt(getFlag('k') || '8', 10);\n\n console.log(c.bold(`\\n━━━ BrainBank Doc Search: \"${query}\" ━━━\\n`));\n\n const results = await brain.searchDocs(query, { collection: collection ?? undefined, k });\n\n if (results.length === 0) {\n console.log(c.yellow(' No results found.'));\n brain.close();\n return;\n }\n\n for (const r of results) {\n const score = Math.round(r.score * 100);\n const ctx = r.context ? ` — ${c.dim(r.context)}` : '';\n console.log(`${c.magenta(`[DOC ${score}%]`)} ${c.bold(r.filePath!)} [${(r.metadata as any).collection}]${ctx}`);\n const preview = r.content.split('\\n').slice(0, 4).join('\\n');\n console.log(c.dim(preview));\n console.log('');\n }\n\n brain.close();\n}\n","/**\n * brainbank search — Semantic search (vector)\n * brainbank hsearch — Hybrid search (vector + BM25)\n * brainbank ksearch — Keyword search (BM25)\n */\n\nimport { c, args, stripFlags, printResults } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory.ts';\n\nexport async function cmdSearch(): Promise<void> {\n const query = stripFlags(args).slice(1).join(' ');\n if (!query) {\n console.log(c.red('Usage: brainbank search <query>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n console.log(c.bold(`\\n━━━ BrainBank Search: \"${query}\" ━━━\\n`));\n\n const results = await brain.search(query);\n printResults(results);\n brain.close();\n}\n\nexport async function cmdHybridSearch(): Promise<void> {\n const query = stripFlags(args).slice(1).join(' ');\n if (!query) {\n console.log(c.red('Usage: brainbank hsearch <query>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n console.log(c.bold(`\\n━━━ BrainBank Hybrid Search: \"${query}\" ━━━`));\n console.log(c.dim(` Mode: vector + BM25 → Reciprocal Rank Fusion\\n`));\n\n const results = await brain.hybridSearch(query);\n printResults(results);\n brain.close();\n}\n\nexport async function cmdKeywordSearch(): Promise<void> {\n const query = stripFlags(args).slice(1).join(' ');\n if (!query) {\n console.log(c.red('Usage: brainbank ksearch <query>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n console.log(c.bold(`\\n━━━ BrainBank Keyword Search: \"${query}\" ━━━`));\n console.log(c.dim(` Mode: BM25 full-text (instant)\\n`));\n\n const results = await brain.searchBM25(query);\n printResults(results);\n brain.close();\n}\n","/**\n * brainbank context <task> — Get formatted context for a task\n * brainbank context add <collection> <path> <description>\n * brainbank context list\n */\n\nimport { c, args, stripFlags } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory.ts';\n\nexport async function cmdContext(): Promise<void> {\n const pos = stripFlags(args);\n const sub = pos[1];\n\n // brainbank context add <collection> <path> <description>\n if (sub === 'add') {\n const collection = pos[2];\n const path = pos[3];\n const desc = pos.slice(4).join(' ');\n\n if (!collection || !path || !desc) {\n console.log(c.red('Usage: brainbank context add <collection> <path> <description>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n brain.addContext(collection, path, desc);\n console.log(c.green(`✓ Context added: ${collection}:${path} → \"${desc}\"`));\n brain.close();\n return;\n }\n\n // brainbank context list\n if (sub === 'list') {\n const brain = await createBrain();\n await brain.initialize();\n const contexts = brain.listContexts();\n if (contexts.length === 0) {\n console.log(c.yellow(' No contexts configured.'));\n } else {\n console.log(c.bold('\\n━━━ Contexts ━━━\\n'));\n for (const ctx of contexts) {\n console.log(` ${c.cyan(ctx.collection)}:${ctx.path} → ${c.dim(ctx.context)}`);\n }\n }\n brain.close();\n return;\n }\n\n // brainbank context <task> — get formatted context\n const task = stripFlags(args).slice(1).join(' ');\n if (!task) {\n console.log(c.red('Usage: brainbank context <task description>'));\n console.log(c.dim(' brainbank context add <collection> <path> <description>'));\n console.log(c.dim(' brainbank context list'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n const context = await brain.getContext(task);\n console.log(context);\n brain.close();\n}\n","/**\n * brainbank stats — Show index statistics\n * brainbank reembed — Re-embed all vectors\n * brainbank watch — Watch for file changes\n * brainbank serve — Start MCP server\n */\n\nimport { c } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory.ts';\n\n// ── Stats ───────────────────────────────────────────\n\nexport async function cmdStats(): Promise<void> {\n const brain = await createBrain();\n await brain.initialize();\n\n const s = brain.stats();\n\n console.log(c.bold('\\n━━━ BrainBank Stats ━━━\\n'));\n console.log(` ${c.cyan('Plugins')}: ${brain.plugins.join(', ')}\\n`);\n\n if (s.code) {\n console.log(` ${c.cyan('Code')}`);\n console.log(` Files indexed: ${s.code.files}`);\n console.log(` Code chunks: ${s.code.chunks}`);\n console.log(` HNSW vectors: ${s.code.hnswSize}`);\n console.log('');\n }\n\n if (s.git) {\n console.log(` ${c.cyan('Git History')}`);\n console.log(` Commits: ${s.git.commits}`);\n console.log(` Files tracked: ${s.git.filesTracked}`);\n console.log(` Co-edit pairs: ${s.git.coEdits}`);\n console.log(` HNSW vectors: ${s.git.hnswSize}`);\n console.log('');\n }\n\n if (s.documents) {\n console.log(` ${c.cyan('Documents')}`);\n console.log(` Collections: ${s.documents.collections}`);\n console.log(` Documents: ${s.documents.documents}`);\n console.log(` Chunks: ${s.documents.chunks}`);\n console.log(` HNSW vectors: ${s.documents.hnswSize}`);\n console.log('');\n }\n\n // KV collections\n const kvNames = brain.listCollectionNames();\n if (kvNames.length > 0) {\n console.log(` ${c.cyan('KV Collections')}`);\n for (const name of kvNames) {\n const coll = brain.collection(name);\n console.log(` ${name}: ${coll.count()} items`);\n }\n console.log('');\n }\n\n brain.close();\n}\n\n// ── Re-embed ────────────────────────────────────────\n\nexport async function cmdReembed(): Promise<void> {\n const brain = await createBrain();\n await brain.initialize();\n\n console.log(c.bold('\\n━━━ BrainBank Re-embed ━━━\\n'));\n console.log(c.dim(' Regenerating vectors with current embedding provider...'));\n console.log(c.dim(' Text, FTS, and metadata remain unchanged.\\n'));\n\n const result = await brain.reembed({\n onProgress: (table, current, total) => {\n process.stdout.write(`\\r ${c.cyan(table.padEnd(8))} ${current}/${total}`);\n },\n });\n\n console.log('\\n');\n if (result.code > 0) console.log(` ${c.green('✓')} Code: ${result.code} vectors`);\n if (result.git > 0) console.log(` ${c.green('✓')} Git: ${result.git} vectors`);\n if (result.docs > 0) console.log(` ${c.green('✓')} Docs: ${result.docs} vectors`);\n if (result.kv > 0) console.log(` ${c.green('✓')} KV: ${result.kv} vectors`);\n if (result.notes > 0) console.log(` ${c.green('✓')} Notes: ${result.notes} vectors`);\n if (result.memory > 0) console.log(` ${c.green('✓')} Memory: ${result.memory} vectors`);\n console.log(`\\n ${c.bold('Total')}: ${result.total} vectors regenerated\\n`);\n\n brain.close();\n}\n\n// ── Watch ───────────────────────────────────────────\n\nexport async function cmdWatch(): Promise<void> {\n const brain = await createBrain();\n await brain.initialize();\n\n console.log(c.bold('\\n━━━ BrainBank Watch ━━━\\n'));\n console.log(c.dim(` Watching ${brain.config.repoPath} for changes...`));\n console.log(c.dim(' Press Ctrl+C to stop.\\n'));\n\n const watcher = brain.watch({\n debounceMs: 2000,\n onIndex: (file, indexer) => {\n const ts = new Date().toLocaleTimeString();\n console.log(` ${c.dim(ts)} ${c.green('✓')} ${c.cyan(indexer)}: ${file}`);\n },\n onError: (err) => {\n console.error(` ${c.red('✗')} ${err.message}`);\n },\n });\n\n // Keep process alive, clean up on Ctrl+C\n process.on('SIGINT', () => {\n console.log(c.dim('\\n Stopping watcher...'));\n watcher.close();\n brain.close();\n process.exit(0);\n });\n\n await new Promise(() => {});\n}\n\n// ── Serve ───────────────────────────────────────────\n\nexport async function cmdServe(): Promise<void> {\n await import('@brainbank/mcp');\n}\n\n// ── Help ────────────────────────────────────────────\n\nexport function showHelp(): void {\n console.log(c.bold('\\n━━━ BrainBank — Semantic Knowledge Bank ━━━\\n'));\n console.log(c.bold('Indexing:'));\n console.log(` ${c.cyan('index')} [path] Index code + git history`);\n console.log(` ${c.cyan('collection add')} <path> --name Add a document collection`);\n console.log(` ${c.cyan('collection list')} List collections`);\n console.log(` ${c.cyan('collection remove')} <name> Remove a collection`);\n console.log(` ${c.cyan('docs')} [--collection <name>] Index document collections`);\n console.log('');\n console.log(c.bold('Search:'));\n console.log(` ${c.cyan('search')} <query> Semantic search (vector)`);\n console.log(` ${c.cyan('hsearch')} <query> Hybrid search (${c.bold('best quality')})`);\n console.log(` ${c.cyan('ksearch')} <query> Keyword search (BM25, instant)`);\n console.log(` ${c.cyan('dsearch')} <query> Document search`);\n console.log('');\n console.log(c.bold('Context:'));\n console.log(` ${c.cyan('context')} <task> Get formatted context for a task`);\n console.log(` ${c.cyan('context add')} <col> <path> <desc> Add context metadata`);\n console.log(` ${c.cyan('context list')} List all context metadata`);\n console.log('');\n console.log(c.bold('KV Store:'));\n console.log(` ${c.cyan('kv add')} <coll> <content> Add item to a collection`);\n console.log(` ${c.cyan('kv search')} <coll> <query> Search a collection`);\n console.log(` ${c.cyan('kv list')} [coll] List collections or items`);\n console.log(` ${c.cyan('kv trim')} <coll> --keep <n> Keep only N most recent`);\n console.log(` ${c.cyan('kv clear')} <coll> Clear all items`);\n console.log('');\n console.log(c.bold('Utility:'));\n console.log(` ${c.cyan('stats')} Show index statistics`);\n console.log(` ${c.cyan('reembed')} Re-embed all vectors`);\n console.log(` ${c.cyan('watch')} Watch files, auto-re-index`);\n console.log(` ${c.cyan('serve')} Start MCP server (stdio)`);\n console.log('');\n console.log(c.bold('Options:'));\n console.log(` ${c.dim('--repo <path>')} Repository path (default: .)`);\n console.log(` ${c.dim('--force')} Force re-index all files`);\n console.log(` ${c.dim('--depth <n>')} Git history depth (default: 500)`);\n console.log(` ${c.dim('--collection <name>')} Filter by collection`);\n console.log(` ${c.dim('--pattern <glob>')} Collection glob (default: **/*.md)`);\n console.log(` ${c.dim('--context <desc>')} Context description`);\n console.log(` ${c.dim('--reranker <name>')} Reranker to use (qwen3)`);\n console.log('');\n console.log(c.bold('Examples:'));\n console.log(c.dim(' brainbank index .'));\n console.log(c.dim(' brainbank kv add errors \"Fixed null pointer in api.ts\"'));\n console.log(c.dim(' brainbank kv search errors \"null pointer\"'));\n console.log(c.dim(' brainbank kv list'));\n console.log(c.dim(' brainbank hsearch \"authentication middleware\"'));\n console.log(c.dim(' brainbank context \"add rate limiting to the API\"'));\n console.log(c.dim(' brainbank serve'));\n}\n","#!/usr/bin/env node\n\n/**\n * BrainBank — CLI Entry Point\n *\n * Dispatcher that routes commands to their handler modules.\n */\n\nimport { args, c } from './utils.ts';\nimport { cmdIndex } from './commands/index-cmd.ts';\nimport { cmdCollection } from './commands/collection.ts';\nimport { cmdKv } from './commands/kv.ts';\nimport { cmdDocs, cmdDocSearch } from './commands/docs.ts';\nimport { cmdSearch, cmdHybridSearch, cmdKeywordSearch } from './commands/search.ts';\nimport { cmdContext } from './commands/context.ts';\nimport { cmdStats, cmdReembed, cmdWatch, cmdServe, showHelp } from './commands/system.ts';\n\nconst command = args[0];\n\nasync function main(): Promise<void> {\n switch (command) {\n case 'index': return cmdIndex();\n case 'collection': return cmdCollection();\n case 'kv': return cmdKv();\n case 'docs': return cmdDocs();\n case 'dsearch': return cmdDocSearch();\n case 'search': return cmdSearch();\n case 'hsearch': return cmdHybridSearch();\n case 'ksearch': return cmdKeywordSearch();\n case 'context': return cmdContext();\n case 'stats': return cmdStats();\n case 'reembed': return cmdReembed();\n case 'watch': return cmdWatch();\n case 'serve': return cmdServe();\n case 'help':\n case '--help':\n case '-h':\n showHelp();\n break;\n default:\n if (command) console.log(c.red(`Unknown command: ${command}\\n`));\n showHelp();\n process.exit(command ? 1 : 0);\n }\n}\n\nmain().catch(err => {\n console.error(c.red(`Error: ${err.message}`));\n if (process.env.BRAINBANK_DEBUG) console.error(err.stack);\n process.exit(1);\n});\n"],"mappings":"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","names":["path","path","brain","coll","path","brain"]}
1
+ {"version":3,"sources":["../src/cli/utils.ts","../src/cli/commands/index-cmd.ts","../src/cli/factory.ts","../src/cli/commands/collection.ts","../src/cli/commands/kv.ts","../src/cli/commands/docs.ts","../src/cli/commands/search.ts","../src/cli/commands/context.ts","../src/cli/commands/system.ts","../src/cli/index.ts"],"sourcesContent":["/**\n * BrainBank CLI — Shared Utilities\n *\n * Colors, argument parsing, and result formatting.\n * No BrainBank imports — pure Node.js / terminal helpers.\n */\n\n// ── Colors ──────────────────────────────────────────\n\nexport const c = {\n green: (s: string) => `\\x1b[32m${s}\\x1b[0m`,\n red: (s: string) => `\\x1b[31m${s}\\x1b[0m`,\n yellow: (s: string) => `\\x1b[33m${s}\\x1b[0m`,\n cyan: (s: string) => `\\x1b[36m${s}\\x1b[0m`,\n dim: (s: string) => `\\x1b[2m${s}\\x1b[0m`,\n bold: (s: string) => `\\x1b[1m${s}\\x1b[0m`,\n magenta: (s: string) => `\\x1b[35m${s}\\x1b[0m`,\n};\n\n// ── Argument Parsing ────────────────────────────────\n\n/** Raw argv, sliced past the Node binary and script path. */\nexport const args = process.argv.slice(2);\n\nexport function getFlag(name: string): string | undefined {\n const idx = args.indexOf(`--${name}`);\n return idx >= 0 ? args[idx + 1] : undefined;\n}\n\nexport function hasFlag(name: string): boolean {\n return args.includes(`--${name}`);\n}\n\n/** Known flags that take a value (--flag <value>). */\nconst VALUE_FLAGS = new Set([\n 'repo', 'depth', 'collection', 'pattern', 'context', 'name',\n 'keep', 'reranker', 'only', 'docs',\n 'ignore', 'meta', 'k', 'mode', 'limit',\n]);\n\n/**\n * Strip all --flags AND their values from an argv slice.\n * Returns only positional arguments.\n *\n * stripFlags(['ksearch', 'auth', '--repo', '/path'])\n * → ['ksearch', 'auth']\n */\nexport function stripFlags(argv: string[]): string[] {\n const result: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n if (argv[i].startsWith('--')) {\n const name = argv[i].slice(2);\n if (VALUE_FLAGS.has(name)) i++; // skip next (the value)\n continue;\n }\n result.push(argv[i]);\n }\n return result;\n}\n\n// ── Result Printer ──────────────────────────────────\n\nexport function printResults(results: any[]): void {\n if (results.length === 0) {\n console.log(c.yellow(' No results found.'));\n return;\n }\n\n for (const r of results) {\n const score = Math.round(r.score * 100);\n\n if (r.type === 'code') {\n const m = r.metadata;\n console.log(\n `${c.green(`[CODE ${score}%]`)} ${c.bold(r.filePath!)} — ` +\n `${m.name || m.chunkType} ${c.dim(`L${m.startLine}-${m.endLine}`)}`,\n );\n console.log(c.dim(r.content.split('\\n').slice(0, 5).join('\\n')));\n console.log('');\n } else if (r.type === 'commit') {\n const m = r.metadata;\n console.log(\n `${c.cyan(`[COMMIT ${score}%]`)} ${c.bold(m.shortHash)} ` +\n `${r.content} ${c.dim(`(${m.author})`)}`,\n );\n if (m.files?.length) console.log(c.dim(` Files: ${m.files.slice(0, 4).join(', ')}`));\n console.log('');\n } else if (r.type === 'document') {\n const ctx = r.context ? ` — ${c.dim(r.context)}` : '';\n console.log(\n `${c.magenta(`[DOC ${score}%]`)} ${c.bold(r.filePath!)} ` +\n `[${r.metadata.collection}]${ctx}`,\n );\n console.log(c.dim(r.content.split('\\n').slice(0, 4).join('\\n')));\n console.log('');\n }\n }\n}\n","/**\n * brainbank index [path] — Index code + git + docs\n */\n\nimport * as path from 'node:path';\nimport { c, args, getFlag, hasFlag } from '@/cli/utils.ts';\nimport { createBrain, getConfig, registerConfigCollections } from '@/cli/factory.ts';\n\nexport async function cmdIndex(): Promise<void> {\n const repoPath = args[1] || '.';\n const force = hasFlag('force');\n const depth = parseInt(getFlag('depth') || '500', 10);\n const onlyRaw = getFlag('only');\n const docsPath = getFlag('docs');\n const modules = onlyRaw\n ? onlyRaw.split(',').map(s => s.trim()) as ('code' | 'git' | 'docs')[]\n : undefined;\n\n // If --docs is passed, auto-include 'docs' in modules\n if (docsPath && modules && !modules.includes('docs')) {\n modules.push('docs');\n }\n\n console.log(c.bold('\\n━━━ BrainBank Index ━━━'));\n console.log(c.dim(` Repo: ${repoPath}`));\n console.log(c.dim(` Force: ${force}`));\n console.log(c.dim(` Git depth: ${depth}`));\n if (modules) console.log(c.dim(` Modules: ${modules.join(', ')}`));\n if (docsPath) console.log(c.dim(` Docs path: ${docsPath}`));\n\n const brain = await createBrain(repoPath);\n\n // Auto-register docs collections from config.json\n const config = await getConfig();\n await registerConfigCollections(brain, config);\n\n // Auto-register docs collection from --docs CLI flag\n if (docsPath) {\n const absDocsPath = path.resolve(docsPath);\n const collName = path.basename(absDocsPath);\n try {\n await brain.addCollection({\n name: collName,\n path: absDocsPath,\n pattern: '**/*.md',\n ignore: ['deprecated/**', 'node_modules/**'],\n });\n console.log(c.dim(` Registered docs collection: ${collName}`));\n } catch {\n console.log(c.yellow(` Warning: docs module not loaded, skipping --docs`));\n }\n }\n\n const result = await brain.index({\n modules,\n forceReindex: force,\n gitDepth: depth,\n onProgress: (stage, msg) => {\n process.stdout.write(`\\r ${c.cyan(stage.toUpperCase())} ${msg} `);\n },\n });\n\n console.log('\\n');\n if (result.code) {\n console.log(` ${c.green('Code')}: ${result.code.indexed} indexed, ${result.code.skipped} skipped, ${result.code.chunks ?? 0} chunks`);\n }\n if (result.git) {\n console.log(` ${c.green('Git')}: ${result.git.indexed} indexed, ${result.git.skipped} skipped`);\n }\n if (result.docs) {\n for (const [name, stat] of Object.entries(result.docs)) {\n console.log(` ${c.green('Docs')}: [${name}] ${stat.indexed} indexed, ${stat.skipped} skipped, ${stat.chunks} chunks`);\n }\n }\n\n const stats = brain.stats();\n console.log(`\\n ${c.bold('Totals')}:`);\n if (stats.code) console.log(` Code chunks: ${stats.code.chunks}`);\n if (stats.git) console.log(` Git commits: ${stats.git.commits}`);\n if (stats.git) console.log(` Co-edit pairs: ${stats.git.coEdits}`);\n if (stats.documents) console.log(` Documents: ${stats.documents.documents}`);\n\n brain.close();\n}\n","/**\n * BrainBank CLI — Brain Factory\n *\n * Creates a configured BrainBank instance with built-in indexers,\n * auto-discovered indexers, and config file support.\n *\n * Config priority: CLI flags > .brainbank/config.json > .brainbank/config.ts > defaults.\n */\n\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { BrainBank } from '@/brainbank.ts';\nimport { code } from '@/indexers/code/code-plugin.ts';\nimport { git } from '@/indexers/git/git-plugin.ts';\nimport { docs } from '@/indexers/docs/docs-plugin.ts';\nimport type { Plugin } from '@/indexers/base.ts';\nimport type { EmbeddingProvider, DocumentCollection } from '@/types.ts';\nimport { c, getFlag } from './utils.ts';\n\n// ── Types ───────────────────────────────────────────\n\n/** Per-plugin config section (shared shape). */\ninterface PluginConfig {\n /** Embedding provider key: \"local\", \"openai\", \"perplexity\", \"perplexity-context\". */\n embedding?: string;\n}\n\n/** Code plugin config. */\ninterface CodeConfig extends PluginConfig {\n maxFileSize?: number;\n}\n\n/** Git plugin config. */\ninterface GitConfig extends PluginConfig {\n depth?: number;\n maxDiffBytes?: number;\n}\n\n/** Docs plugin config. */\ninterface DocsConfig extends PluginConfig {\n collections?: DocumentCollection[];\n}\n\n/** Full .brainbank/config.json schema. */\nexport interface ProjectConfig {\n /** Which built-in plugins to load. Default: [\"code\", \"git\", \"docs\"] */\n plugins?: ('code' | 'git' | 'docs')[];\n\n /** Per-plugin config sections. */\n code?: CodeConfig;\n git?: GitConfig;\n docs?: DocsConfig;\n\n /** Global embedding provider key (default for all plugins). */\n embedding?: string;\n /** Reranker: \"none\" or \"qwen3\". */\n reranker?: string;\n /** Max file size in bytes. */\n maxFileSize?: number;\n\n // --- Legacy .ts config fields (still supported) ---\n /** @deprecated Use \"plugins\" instead. */\n builtins?: ('code' | 'git' | 'docs')[];\n /** Custom plugin instances (only from .ts config). */\n indexers?: Plugin[];\n /** BrainBank constructor options. */\n brainbank?: Record<string, any>;\n\n /** Any other plugin name → config (for custom plugins). */\n [pluginName: string]: any;\n}\n\nconst CONFIG_NAMES = ['config.json', 'config.ts', 'config.js', 'config.mjs'];\nconst INDEXER_EXTENSIONS = ['.ts', '.js', '.mjs'];\n\n// ── Caches ──────────────────────────────────────────\n\nconst NOT_LOADED = Symbol('not-loaded');\nlet _configCache: ProjectConfig | null | typeof NOT_LOADED = NOT_LOADED;\nlet _folderPluginsCache: Plugin[] | typeof NOT_LOADED = NOT_LOADED;\n\n/** Reset factory caches. Useful for tests that import this module multiple times. */\nexport function resetFactoryCache(): void {\n _configCache = NOT_LOADED;\n _folderPluginsCache = NOT_LOADED;\n}\n\n// ── Config Loader ───────────────────────────────────\n\n/** Load .brainbank/config.json (or .ts fallback) if present. */\nasync function loadConfig(): Promise<ProjectConfig | null> {\n if (_configCache !== NOT_LOADED) return _configCache;\n\n const repoPath = getFlag('repo') ?? '.';\n const brainbankDir = path.resolve(repoPath, '.brainbank');\n\n for (const name of CONFIG_NAMES) {\n const configPath = path.join(brainbankDir, name);\n if (!fs.existsSync(configPath)) continue;\n\n try {\n if (name === 'config.json') {\n const raw = fs.readFileSync(configPath, 'utf-8');\n _configCache = JSON.parse(raw) as ProjectConfig;\n } else {\n const mod = await import(configPath);\n _configCache = (mod.default ?? mod) as ProjectConfig;\n }\n return _configCache;\n } catch (err: any) {\n console.error(c.red(`Error loading .brainbank/${name}: ${err.message}`));\n process.exit(1);\n }\n }\n\n _configCache = null;\n return null;\n}\n\n/** Get the loaded config (for use by commands). */\nexport async function getConfig(): Promise<ProjectConfig | null> {\n return loadConfig();\n}\n\n// ── Embedding Resolver ─────────────────────────────\n\n/** Resolve an embedding key string to an EmbeddingProvider instance. */\nasync function resolveEmbeddingKey(key: string): Promise<EmbeddingProvider> {\n const { resolveEmbedding } = await import('@/providers/embeddings/resolve.ts');\n return resolveEmbedding(key);\n}\n\n// ── Plugin Discovery ───────────────────────────────\n\n/** Auto-discover indexers from .brainbank/indexers/ folder. */\nasync function discoverFolderPlugins(): Promise<Plugin[]> {\n if (_folderPluginsCache !== NOT_LOADED) return _folderPluginsCache;\n\n const repoPath = getFlag('repo') ?? '.';\n const indexersDir = path.resolve(repoPath, '.brainbank', 'indexers');\n\n if (!fs.existsSync(indexersDir)) {\n _folderPluginsCache = [];\n return [];\n }\n\n const files = fs.readdirSync(indexersDir)\n .filter(f => INDEXER_EXTENSIONS.some(ext => f.endsWith(ext)))\n .sort();\n\n const indexers: Plugin[] = [];\n\n for (const file of files) {\n const filePath = path.join(indexersDir, file);\n try {\n const mod = await import(filePath);\n const indexer = mod.default ?? mod;\n\n if (indexer && typeof indexer === 'object' && indexer.name) {\n indexers.push(indexer as Plugin);\n } else {\n console.error(c.yellow(`⚠ ${file}: must export a default Plugin with a 'name' property, skipping`));\n }\n } catch (err: any) {\n console.error(c.red(`Error loading indexer ${file}: ${err.message}`));\n }\n }\n\n _folderPluginsCache = indexers;\n return indexers;\n}\n\n// ── Multi-repo Detection ────────────────────────────\n\n/** Detect subdirectories that have their own .git repo. */\nfunction detectGitSubdirs(parentPath: string): { name: string; path: string }[] {\n try {\n const entries = fs.readdirSync(parentPath, { withFileTypes: true });\n return entries\n .filter(e =>\n e.isDirectory() &&\n !e.name.startsWith('.') &&\n !e.name.startsWith('node_modules') &&\n fs.existsSync(path.join(parentPath, e.name, '.git')),\n )\n .map(e => ({ name: e.name, path: path.join(parentPath, e.name) }));\n } catch {\n return [];\n }\n}\n\n// ── Factory ─────────────────────────────────────────\n\n/** Create a BrainBank with built-in + discovered + config indexers. */\nexport async function createBrain(repoPath?: string): Promise<BrainBank> {\n const rp = repoPath ?? getFlag('repo') ?? '.';\n const config = await loadConfig();\n const folderIndexers = await discoverFolderPlugins();\n\n const brainOpts: Record<string, any> = { repoPath: rp, ...(config?.brainbank ?? {}) };\n\n // Apply global config options\n if (config?.maxFileSize) brainOpts.maxFileSize = config.maxFileSize;\n\n await setupProviders(brainOpts, config);\n\n const brain = new BrainBank(brainOpts);\n const builtins = config?.plugins ?? config?.builtins ?? ['code', 'git', 'docs'];\n await registerBuiltins(brain, rp, builtins, config);\n\n // Register custom plugins from .brainbank/indexers/\n for (const indexer of folderIndexers) brain.use(indexer);\n\n // Register custom plugins from config.ts (programmatic)\n if (config?.indexers) {\n for (const indexer of config.indexers) brain.use(indexer);\n }\n\n return brain;\n}\n\n/** Configure reranker and global embedding provider. */\nasync function setupProviders(brainOpts: Record<string, any>, config: ProjectConfig | null): Promise<void> {\n // Reranker: CLI flag > config > default\n const rerankerFlag = getFlag('reranker') ?? config?.reranker;\n if (rerankerFlag === 'qwen3') {\n const { Qwen3Reranker } = await import('@/providers/rerankers/qwen3-reranker.ts');\n brainOpts.reranker = new Qwen3Reranker();\n }\n\n // Embedding: CLI flag > config > auto-resolve from DB\n const embFlag = getFlag('embedding') ?? config?.embedding;\n if (embFlag) {\n const provider = await resolveEmbeddingKey(embFlag);\n brainOpts.embeddingProvider = provider;\n brainOpts.embeddingDims = provider.dims;\n }\n // If no flag and no config → Initializer reads provider_key from DB → falls back to local\n}\n\n/** Register built-in indexers with multi-repo detection and per-plugin embedding. */\nasync function registerBuiltins(\n brain: BrainBank, rp: string, builtins: ('code' | 'git' | 'docs')[], config: ProjectConfig | null,\n): Promise<void> {\n const resolvedRp = path.resolve(rp);\n const hasRootGit = fs.existsSync(path.join(resolvedRp, '.git'));\n const gitSubdirs = !hasRootGit ? detectGitSubdirs(resolvedRp) : [];\n\n // Resolve per-plugin embeddings from config\n const codeEmb = config?.code?.embedding ? await resolveEmbeddingKey(config.code.embedding) : undefined;\n const gitEmb = config?.git?.embedding ? await resolveEmbeddingKey(config.git.embedding) : undefined;\n const docsEmb = config?.docs?.embedding ? await resolveEmbeddingKey(config.docs.embedding) : undefined;\n\n if (gitSubdirs.length > 0 && (builtins.includes('code') || builtins.includes('git'))) {\n console.log(c.cyan(` Multi-repo: found ${gitSubdirs.length} git repos: ${gitSubdirs.map(d => d.name).join(', ')}`));\n for (const sub of gitSubdirs) {\n if (builtins.includes('code')) {\n brain.use(code({\n repoPath: sub.path,\n name: `code:${sub.name}`,\n embeddingProvider: codeEmb,\n maxFileSize: config?.code?.maxFileSize,\n }));\n }\n if (builtins.includes('git')) {\n brain.use(git({\n repoPath: sub.path,\n name: `git:${sub.name}`,\n embeddingProvider: gitEmb,\n depth: config?.git?.depth,\n maxDiffBytes: config?.git?.maxDiffBytes,\n }));\n }\n }\n } else {\n if (builtins.includes('code')) {\n brain.use(code({\n repoPath: rp,\n embeddingProvider: codeEmb,\n maxFileSize: config?.code?.maxFileSize,\n }));\n }\n if (builtins.includes('git')) {\n brain.use(git({\n embeddingProvider: gitEmb,\n depth: config?.git?.depth,\n maxDiffBytes: config?.git?.maxDiffBytes,\n }));\n }\n }\n\n if (builtins.includes('docs')) {\n brain.use(docs({ embeddingProvider: docsEmb }));\n }\n}\n\n/** Register doc collections from config. Call after brain.initialize(). */\nexport async function registerConfigCollections(brain: BrainBank, config: ProjectConfig | null): Promise<void> {\n const collections = config?.docs?.collections;\n if (!collections?.length) return;\n\n for (const coll of collections) {\n const absPath = path.resolve(coll.path);\n try {\n await brain.addCollection({\n name: coll.name,\n path: absPath,\n pattern: coll.pattern ?? '**/*.md',\n ignore: coll.ignore,\n context: coll.context,\n });\n } catch {\n // Collection already registered — skip\n }\n }\n}\n","/**\n * brainbank collection add|list|remove — Document collection management\n */\n\nimport { c, args, getFlag, stripFlags } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory.ts';\n\nexport async function cmdCollection(): Promise<void> {\n const pos = stripFlags(args);\n const sub = pos[1];\n\n if (sub === 'add') {\n const path = pos[2];\n const name = getFlag('name');\n const pattern = getFlag('pattern') ?? '**/*.md';\n const context = getFlag('context');\n const ignoreRaw = getFlag('ignore');\n\n if (!path || !name) {\n console.log(c.red('Usage: brainbank collection add <path> --name <name> [--pattern \"**/*.md\"] [--ignore \"glob\"] [--context \"description\"]'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.addCollection({\n name,\n path,\n pattern,\n ignore: ignoreRaw ? ignoreRaw.split(',') : [],\n context: context ?? undefined,\n });\n console.log(c.green(`✓ Collection '${name}' added: ${path} (${pattern})`));\n if (context) console.log(c.dim(` Context: ${context}`));\n brain.close();\n return;\n }\n\n if (sub === 'list') {\n const brain = await createBrain();\n await brain.initialize();\n const collections = brain.listCollections();\n if (collections.length === 0) {\n console.log(c.yellow(' No collections registered.'));\n } else {\n console.log(c.bold('\\n━━━ Collections ━━━\\n'));\n for (const col of collections) {\n console.log(` ${c.cyan(col.name)} ${c.dim('→')} ${col.path}`);\n console.log(` Pattern: ${col.pattern ?? '**/*.md'}`);\n if (col.context) console.log(` Context: ${c.dim(col.context)}`);\n }\n }\n brain.close();\n return;\n }\n\n if (sub === 'remove') {\n const name = pos[2];\n if (!name) {\n console.log(c.red('Usage: brainbank collection remove <name>'));\n process.exit(1);\n }\n const brain = await createBrain();\n await brain.removeCollection(name);\n console.log(c.green(`✓ Collection '${name}' removed.`));\n brain.close();\n return;\n }\n\n console.log(c.red('Usage: brainbank collection <add|list|remove>'));\n process.exit(1);\n}\n","/**\n * brainbank kv add|search|list|trim|clear — Dynamic KV collection management\n */\n\nimport { c, args, getFlag, stripFlags } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory.ts';\n\nexport async function cmdKv(): Promise<void> {\n const pos = stripFlags(args);\n const sub = pos[1];\n\n // ── add ─────────────────────────────────────────\n if (sub === 'add') {\n const collName = pos[2];\n const content = pos.slice(3).join(' ');\n const metaRaw = getFlag('meta');\n\n if (!collName || !content) {\n console.log(c.red(\"Usage: brainbank kv add <collection> <content> [--meta '{\\\"key\\\":\\\"val\\\"}']\"));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const meta = metaRaw ? JSON.parse(metaRaw) : {};\n const id = await coll.add(content, meta);\n console.log(c.green(`✓ Added item #${id} to '${collName}'`));\n brain.close();\n return;\n }\n\n // ── search ──────────────────────────────────────\n if (sub === 'search') {\n const collName = pos[2];\n const query = pos.slice(3).join(' ');\n const k = parseInt(getFlag('k') || '5', 10);\n const mode = (getFlag('mode') as any) || 'hybrid';\n\n if (!collName || !query) {\n console.log(c.red('Usage: brainbank kv search <collection> <query> [--k 5] [--mode hybrid|keyword|vector]'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const results = await coll.search(query, { k, mode });\n\n if (results.length === 0) {\n console.log(c.yellow(' No results found.'));\n } else {\n console.log(c.bold(`\\n━━━ ${collName}: \"${query}\" ━━━\\n`));\n for (const r of results) {\n const score = Math.round((r.score ?? 0) * 100);\n console.log(` ${c.cyan(`[${score}%]`)} ${r.content}`);\n if (Object.keys(r.metadata).length > 0) {\n console.log(` ${c.dim(JSON.stringify(r.metadata))}`);\n }\n }\n }\n brain.close();\n return;\n }\n\n // ── list ────────────────────────────────────────\n if (sub === 'list') {\n const collName = pos[2];\n const limit = parseInt(getFlag('limit') || '20', 10);\n\n if (!collName) {\n const brain = await createBrain();\n await brain.initialize();\n const names = brain.listCollectionNames();\n if (names.length === 0) {\n console.log(c.yellow(' No KV collections found.'));\n } else {\n console.log(c.bold('\\n━━━ KV Collections ━━━\\n'));\n for (const n of names) {\n const coll = brain.collection(n);\n console.log(` ${c.cyan(n)} — ${coll.count()} items`);\n }\n }\n brain.close();\n return;\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const items = coll.list({ limit });\n if (items.length === 0) {\n console.log(c.yellow(` Collection '${collName}' is empty.`));\n } else {\n console.log(c.bold(`\\n━━━ ${collName} (${coll.count()} items) ━━━\\n`));\n for (const item of items) {\n const age = Math.round((Date.now() / 1000 - item.createdAt) / 60);\n console.log(` #${item.id} ${c.dim(`(${age}m ago)`)} ${item.content.slice(0, 80)}`);\n }\n }\n brain.close();\n return;\n }\n\n // ── trim ────────────────────────────────────────\n if (sub === 'trim') {\n const collName = pos[2];\n const keep = parseInt(getFlag('keep') || '0', 10);\n\n if (!collName || keep <= 0) {\n console.log(c.red('Usage: brainbank kv trim <collection> --keep <n>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const result = await coll.trim({ keep });\n console.log(c.green(`✓ Trimmed ${result.removed} items from '${collName}' (kept ${keep})`));\n brain.close();\n return;\n }\n\n // ── clear ───────────────────────────────────────\n if (sub === 'clear') {\n const collName = pos[2];\n if (!collName) {\n console.log(c.red('Usage: brainbank kv clear <collection>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const before = coll.count();\n coll.clear();\n console.log(c.green(`✓ Cleared ${before} items from '${collName}'`));\n brain.close();\n return;\n }\n\n console.log(c.red('Usage: brainbank kv <add|search|list|trim|clear>'));\n process.exit(1);\n}\n\n","/**\n * brainbank docs — Index document collections\n * brainbank dsearch — Search documents only\n */\n\nimport { c, args, getFlag, stripFlags } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory.ts';\n\nexport async function cmdDocs(): Promise<void> {\n const collection = getFlag('collection');\n const brain = await createBrain();\n\n console.log(c.bold('\\n━━━ BrainBank Docs Index ━━━\\n'));\n\n const opts: { collections?: string[]; onProgress?: any } = {};\n if (collection) opts.collections = [collection];\n opts.onProgress = (col: string, file: string, cur: number, total: number) => {\n process.stdout.write(`\\r ${c.cyan(col)} [${cur}/${total}] ${file} `);\n };\n\n const results = await brain.indexDocs(opts);\n\n console.log('\\n');\n for (const [name, stat] of Object.entries(results)) {\n console.log(` ${c.green(name)}: ${stat.indexed} indexed, ${stat.skipped} skipped, ${stat.chunks} chunks`);\n }\n\n brain.close();\n}\n\nexport async function cmdDocSearch(): Promise<void> {\n const query = stripFlags(args).slice(1).join(' ');\n if (!query) {\n console.log(c.red('Usage: brainbank dsearch <query>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n const collection = getFlag('collection');\n const k = parseInt(getFlag('k') || '8', 10);\n\n console.log(c.bold(`\\n━━━ BrainBank Doc Search: \"${query}\" ━━━\\n`));\n\n const results = await brain.searchDocs(query, { collection: collection ?? undefined, k });\n\n if (results.length === 0) {\n console.log(c.yellow(' No results found.'));\n brain.close();\n return;\n }\n\n for (const r of results) {\n const score = Math.round(r.score * 100);\n const ctx = r.context ? ` — ${c.dim(r.context)}` : '';\n console.log(`${c.magenta(`[DOC ${score}%]`)} ${c.bold(r.filePath!)} [${(r.metadata as any).collection}]${ctx}`);\n const preview = r.content.split('\\n').slice(0, 4).join('\\n');\n console.log(c.dim(preview));\n console.log('');\n }\n\n brain.close();\n}\n","/**\n * brainbank search — Semantic search (vector)\n * brainbank hsearch — Hybrid search (vector + BM25)\n * brainbank ksearch — Keyword search (BM25)\n */\n\nimport { c, args, stripFlags, printResults } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory.ts';\n\nexport async function cmdSearch(): Promise<void> {\n const query = stripFlags(args).slice(1).join(' ');\n if (!query) {\n console.log(c.red('Usage: brainbank search <query>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n console.log(c.bold(`\\n━━━ BrainBank Search: \"${query}\" ━━━\\n`));\n\n const results = await brain.search(query);\n printResults(results);\n brain.close();\n}\n\nexport async function cmdHybridSearch(): Promise<void> {\n const query = stripFlags(args).slice(1).join(' ');\n if (!query) {\n console.log(c.red('Usage: brainbank hsearch <query>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n console.log(c.bold(`\\n━━━ BrainBank Hybrid Search: \"${query}\" ━━━`));\n console.log(c.dim(` Mode: vector + BM25 → Reciprocal Rank Fusion\\n`));\n\n const results = await brain.hybridSearch(query);\n printResults(results);\n brain.close();\n}\n\nexport async function cmdKeywordSearch(): Promise<void> {\n const query = stripFlags(args).slice(1).join(' ');\n if (!query) {\n console.log(c.red('Usage: brainbank ksearch <query>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n console.log(c.bold(`\\n━━━ BrainBank Keyword Search: \"${query}\" ━━━`));\n console.log(c.dim(` Mode: BM25 full-text (instant)\\n`));\n\n const results = await brain.searchBM25(query);\n printResults(results);\n brain.close();\n}\n","/**\n * brainbank context <task> — Get formatted context for a task\n * brainbank context add <collection> <path> <description>\n * brainbank context list\n */\n\nimport { c, args, stripFlags } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory.ts';\n\nexport async function cmdContext(): Promise<void> {\n const pos = stripFlags(args);\n const sub = pos[1];\n\n // brainbank context add <collection> <path> <description>\n if (sub === 'add') {\n const collection = pos[2];\n const path = pos[3];\n const desc = pos.slice(4).join(' ');\n\n if (!collection || !path || !desc) {\n console.log(c.red('Usage: brainbank context add <collection> <path> <description>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n brain.addContext(collection, path, desc);\n console.log(c.green(`✓ Context added: ${collection}:${path} → \"${desc}\"`));\n brain.close();\n return;\n }\n\n // brainbank context list\n if (sub === 'list') {\n const brain = await createBrain();\n await brain.initialize();\n const contexts = brain.listContexts();\n if (contexts.length === 0) {\n console.log(c.yellow(' No contexts configured.'));\n } else {\n console.log(c.bold('\\n━━━ Contexts ━━━\\n'));\n for (const ctx of contexts) {\n console.log(` ${c.cyan(ctx.collection)}:${ctx.path} → ${c.dim(ctx.context)}`);\n }\n }\n brain.close();\n return;\n }\n\n // brainbank context <task> — get formatted context\n const task = stripFlags(args).slice(1).join(' ');\n if (!task) {\n console.log(c.red('Usage: brainbank context <task description>'));\n console.log(c.dim(' brainbank context add <collection> <path> <description>'));\n console.log(c.dim(' brainbank context list'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n const context = await brain.getContext(task);\n console.log(context);\n brain.close();\n}\n","/**\n * brainbank stats — Show index statistics\n * brainbank reembed — Re-embed all vectors\n * brainbank watch — Watch for file changes\n * brainbank serve — Start MCP server\n */\n\nimport { c } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory.ts';\n\n// ── Stats ───────────────────────────────────────────\n\nexport async function cmdStats(): Promise<void> {\n const brain = await createBrain();\n await brain.initialize();\n\n const s = brain.stats();\n\n console.log(c.bold('\\n━━━ BrainBank Stats ━━━\\n'));\n console.log(` ${c.cyan('Plugins')}: ${brain.plugins.join(', ')}\\n`);\n\n if (s.code) {\n console.log(` ${c.cyan('Code')}`);\n console.log(` Files indexed: ${s.code.files}`);\n console.log(` Code chunks: ${s.code.chunks}`);\n console.log(` HNSW vectors: ${s.code.hnswSize}`);\n console.log('');\n }\n\n if (s.git) {\n console.log(` ${c.cyan('Git History')}`);\n console.log(` Commits: ${s.git.commits}`);\n console.log(` Files tracked: ${s.git.filesTracked}`);\n console.log(` Co-edit pairs: ${s.git.coEdits}`);\n console.log(` HNSW vectors: ${s.git.hnswSize}`);\n console.log('');\n }\n\n if (s.documents) {\n console.log(` ${c.cyan('Documents')}`);\n console.log(` Collections: ${s.documents.collections}`);\n console.log(` Documents: ${s.documents.documents}`);\n console.log(` Chunks: ${s.documents.chunks}`);\n console.log(` HNSW vectors: ${s.documents.hnswSize}`);\n console.log('');\n }\n\n // KV collections\n const kvNames = brain.listCollectionNames();\n if (kvNames.length > 0) {\n console.log(` ${c.cyan('KV Collections')}`);\n for (const name of kvNames) {\n const coll = brain.collection(name);\n console.log(` ${name}: ${coll.count()} items`);\n }\n console.log('');\n }\n\n brain.close();\n}\n\n// ── Re-embed ────────────────────────────────────────\n\nexport async function cmdReembed(): Promise<void> {\n const brain = await createBrain();\n await brain.initialize();\n\n console.log(c.bold('\\n━━━ BrainBank Re-embed ━━━\\n'));\n console.log(c.dim(' Regenerating vectors with current embedding provider...'));\n console.log(c.dim(' Text, FTS, and metadata remain unchanged.\\n'));\n\n const result = await brain.reembed({\n onProgress: (table, current, total) => {\n process.stdout.write(`\\r ${c.cyan(table.padEnd(8))} ${current}/${total}`);\n },\n });\n\n console.log('\\n');\n if (result.code > 0) console.log(` ${c.green('✓')} Code: ${result.code} vectors`);\n if (result.git > 0) console.log(` ${c.green('✓')} Git: ${result.git} vectors`);\n if (result.docs > 0) console.log(` ${c.green('✓')} Docs: ${result.docs} vectors`);\n if (result.kv > 0) console.log(` ${c.green('✓')} KV: ${result.kv} vectors`);\n if (result.notes > 0) console.log(` ${c.green('✓')} Notes: ${result.notes} vectors`);\n if (result.memory > 0) console.log(` ${c.green('✓')} Memory: ${result.memory} vectors`);\n console.log(`\\n ${c.bold('Total')}: ${result.total} vectors regenerated\\n`);\n\n brain.close();\n}\n\n// ── Watch ───────────────────────────────────────────\n\nexport async function cmdWatch(): Promise<void> {\n const brain = await createBrain();\n await brain.initialize();\n\n console.log(c.bold('\\n━━━ BrainBank Watch ━━━\\n'));\n console.log(c.dim(` Watching ${brain.config.repoPath} for changes...`));\n console.log(c.dim(' Press Ctrl+C to stop.\\n'));\n\n const watcher = brain.watch({\n debounceMs: 2000,\n onIndex: (file, indexer) => {\n const ts = new Date().toLocaleTimeString();\n console.log(` ${c.dim(ts)} ${c.green('✓')} ${c.cyan(indexer)}: ${file}`);\n },\n onError: (err) => {\n console.error(` ${c.red('✗')} ${err.message}`);\n },\n });\n\n // Keep process alive, clean up on Ctrl+C\n process.on('SIGINT', () => {\n console.log(c.dim('\\n Stopping watcher...'));\n watcher.close();\n brain.close();\n process.exit(0);\n });\n\n await new Promise(() => {});\n}\n\n// ── Serve ───────────────────────────────────────────\n\nexport async function cmdServe(): Promise<void> {\n await import('@brainbank/mcp');\n}\n\n// ── Help ────────────────────────────────────────────\n\nexport function showHelp(): void {\n console.log(c.bold('\\n━━━ BrainBank — Semantic Knowledge Bank ━━━\\n'));\n console.log(c.bold('Indexing:'));\n console.log(` ${c.cyan('index')} [path] Index code + git history`);\n console.log(` ${c.cyan('collection add')} <path> --name Add a document collection`);\n console.log(` ${c.cyan('collection list')} List collections`);\n console.log(` ${c.cyan('collection remove')} <name> Remove a collection`);\n console.log(` ${c.cyan('docs')} [--collection <name>] Index document collections`);\n console.log('');\n console.log(c.bold('Search:'));\n console.log(` ${c.cyan('search')} <query> Semantic search (vector)`);\n console.log(` ${c.cyan('hsearch')} <query> Hybrid search (${c.bold('best quality')})`);\n console.log(` ${c.cyan('ksearch')} <query> Keyword search (BM25, instant)`);\n console.log(` ${c.cyan('dsearch')} <query> Document search`);\n console.log('');\n console.log(c.bold('Context:'));\n console.log(` ${c.cyan('context')} <task> Get formatted context for a task`);\n console.log(` ${c.cyan('context add')} <col> <path> <desc> Add context metadata`);\n console.log(` ${c.cyan('context list')} List all context metadata`);\n console.log('');\n console.log(c.bold('KV Store:'));\n console.log(` ${c.cyan('kv add')} <coll> <content> Add item to a collection`);\n console.log(` ${c.cyan('kv search')} <coll> <query> Search a collection`);\n console.log(` ${c.cyan('kv list')} [coll] List collections or items`);\n console.log(` ${c.cyan('kv trim')} <coll> --keep <n> Keep only N most recent`);\n console.log(` ${c.cyan('kv clear')} <coll> Clear all items`);\n console.log('');\n console.log(c.bold('Utility:'));\n console.log(` ${c.cyan('stats')} Show index statistics`);\n console.log(` ${c.cyan('reembed')} Re-embed all vectors`);\n console.log(` ${c.cyan('watch')} Watch files, auto-re-index`);\n console.log(` ${c.cyan('serve')} Start MCP server (stdio)`);\n console.log('');\n console.log(c.bold('Options:'));\n console.log(` ${c.dim('--repo <path>')} Repository path (default: .)`);\n console.log(` ${c.dim('--force')} Force re-index all files`);\n console.log(` ${c.dim('--depth <n>')} Git history depth (default: 500)`);\n console.log(` ${c.dim('--collection <name>')} Filter by collection`);\n console.log(` ${c.dim('--pattern <glob>')} Collection glob (default: **/*.md)`);\n console.log(` ${c.dim('--context <desc>')} Context description`);\n console.log(` ${c.dim('--reranker <name>')} Reranker to use (qwen3)`);\n console.log('');\n console.log(c.bold('Examples:'));\n console.log(c.dim(' brainbank index .'));\n console.log(c.dim(' brainbank kv add errors \"Fixed null pointer in api.ts\"'));\n console.log(c.dim(' brainbank kv search errors \"null pointer\"'));\n console.log(c.dim(' brainbank kv list'));\n console.log(c.dim(' brainbank hsearch \"authentication middleware\"'));\n console.log(c.dim(' brainbank context \"add rate limiting to the API\"'));\n console.log(c.dim(' brainbank serve'));\n}\n","#!/usr/bin/env node\n\n/**\n * BrainBank — CLI Entry Point\n *\n * Dispatcher that routes commands to their handler modules.\n */\n\nimport { args, c } from './utils.ts';\nimport { cmdIndex } from './commands/index-cmd.ts';\nimport { cmdCollection } from './commands/collection.ts';\nimport { cmdKv } from './commands/kv.ts';\nimport { cmdDocs, cmdDocSearch } from './commands/docs.ts';\nimport { cmdSearch, cmdHybridSearch, cmdKeywordSearch } from './commands/search.ts';\nimport { cmdContext } from './commands/context.ts';\nimport { cmdStats, cmdReembed, cmdWatch, cmdServe, showHelp } from './commands/system.ts';\n\nconst command = args[0];\n\nasync function main(): Promise<void> {\n switch (command) {\n case 'index': return cmdIndex();\n case 'collection': return cmdCollection();\n case 'kv': return cmdKv();\n case 'docs': return cmdDocs();\n case 'dsearch': return cmdDocSearch();\n case 'search': return cmdSearch();\n case 'hsearch': return cmdHybridSearch();\n case 'ksearch': return cmdKeywordSearch();\n case 'context': return cmdContext();\n case 'stats': return cmdStats();\n case 'reembed': return cmdReembed();\n case 'watch': return cmdWatch();\n case 'serve': return cmdServe();\n case 'help':\n case '--help':\n case '-h':\n showHelp();\n break;\n default:\n if (command) console.log(c.red(`Unknown command: ${command}\\n`));\n showHelp();\n process.exit(command ? 1 : 0);\n }\n}\n\nmain().catch(err => {\n console.error(c.red(`Error: ${err.message}`));\n if (process.env.BRAINBANK_DEBUG) console.error(err.stack);\n process.exit(1);\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AASO,IAAM,IAAI;AAAA,EACb,OAAS,wBAAC,MAAc,WAAW,CAAC,WAA3B;AAAA,EACT,KAAS,wBAAC,MAAc,WAAW,CAAC,WAA3B;AAAA,EACT,QAAS,wBAAC,MAAc,WAAW,CAAC,WAA3B;AAAA,EACT,MAAS,wBAAC,MAAc,WAAW,CAAC,WAA3B;AAAA,EACT,KAAS,wBAAC,MAAc,UAAU,CAAC,WAA1B;AAAA,EACT,MAAS,wBAAC,MAAc,UAAU,CAAC,WAA1B;AAAA,EACT,SAAS,wBAAC,MAAc,WAAW,CAAC,WAA3B;AACb;AAKO,IAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AAEjC,SAAS,QAAQ,MAAkC;AACtD,QAAM,MAAM,KAAK,QAAQ,KAAK,IAAI,EAAE;AACpC,SAAO,OAAO,IAAI,KAAK,MAAM,CAAC,IAAI;AACtC;AAHgB;AAKT,SAAS,QAAQ,MAAuB;AAC3C,SAAO,KAAK,SAAS,KAAK,IAAI,EAAE;AACpC;AAFgB;AAKhB,IAAM,cAAc,oBAAI,IAAI;AAAA,EACxB;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAc;AAAA,EAAW;AAAA,EAAW;AAAA,EACrD;AAAA,EAAQ;AAAA,EAAY;AAAA,EAAQ;AAAA,EAC5B;AAAA,EAAU;AAAA,EAAQ;AAAA,EAAK;AAAA,EAAQ;AACnC,CAAC;AASM,SAAS,WAAW,MAA0B;AACjD,QAAM,SAAmB,CAAC;AAC1B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,QAAI,KAAK,CAAC,EAAE,WAAW,IAAI,GAAG;AAC1B,YAAM,OAAO,KAAK,CAAC,EAAE,MAAM,CAAC;AAC5B,UAAI,YAAY,IAAI,IAAI,EAAG;AAC3B;AAAA,IACJ;AACA,WAAO,KAAK,KAAK,CAAC,CAAC;AAAA,EACvB;AACA,SAAO;AACX;AAXgB;AAeT,SAAS,aAAa,SAAsB;AAC/C,MAAI,QAAQ,WAAW,GAAG;AACtB,YAAQ,IAAI,EAAE,OAAO,qBAAqB,CAAC;AAC3C;AAAA,EACJ;AAEA,aAAW,KAAK,SAAS;AACrB,UAAM,QAAQ,KAAK,MAAM,EAAE,QAAQ,GAAG;AAEtC,QAAI,EAAE,SAAS,QAAQ;AACnB,YAAM,IAAI,EAAE;AACZ,cAAQ;AAAA,QACJ,GAAG,EAAE,MAAM,SAAS,KAAK,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAS,CAAC,WAClD,EAAE,QAAQ,EAAE,SAAS,IAAI,EAAE,IAAI,IAAI,EAAE,SAAS,IAAI,EAAE,OAAO,EAAE,CAAC;AAAA,MACrE;AACA,cAAQ,IAAI,EAAE,IAAI,EAAE,QAAQ,MAAM,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;AAC/D,cAAQ,IAAI,EAAE;AAAA,IAClB,WAAW,EAAE,SAAS,UAAU;AAC5B,YAAM,IAAI,EAAE;AACZ,cAAQ;AAAA,QACJ,GAAG,EAAE,KAAK,WAAW,KAAK,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,IACnD,EAAE,OAAO,IAAI,EAAE,IAAI,IAAI,EAAE,MAAM,GAAG,CAAC;AAAA,MAC1C;AACA,UAAI,EAAE,OAAO,OAAQ,SAAQ,IAAI,EAAE,IAAI,YAAY,EAAE,MAAM,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;AACpF,cAAQ,IAAI,EAAE;AAAA,IAClB,WAAW,EAAE,SAAS,YAAY;AAC9B,YAAM,MAAM,EAAE,UAAU,WAAM,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK;AACnD,cAAQ;AAAA,QACJ,GAAG,EAAE,QAAQ,QAAQ,KAAK,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAS,CAAC,KAClD,EAAE,SAAS,UAAU,IAAI,GAAG;AAAA,MACpC;AACA,cAAQ,IAAI,EAAE,IAAI,EAAE,QAAQ,MAAM,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;AAC/D,cAAQ,IAAI,EAAE;AAAA,IAClB;AAAA,EACJ;AACJ;AAnCgB;;;AC1DhB,YAAYA,WAAU;;;ACKtB,YAAY,UAAU;AACtB,YAAY,QAAQ;AA8DpB,IAAM,eAAe,CAAC,eAAe,aAAa,aAAa,YAAY;AAC3E,IAAM,qBAAqB,CAAC,OAAO,OAAO,MAAM;AAIhD,IAAM,aAAa,uBAAO,YAAY;AACtC,IAAI,eAAyD;AAC7D,IAAI,sBAAoD;AAWxD,eAAe,aAA4C;AACvD,MAAI,iBAAiB,WAAY,QAAO;AAExC,QAAM,WAAW,QAAQ,MAAM,KAAK;AACpC,QAAM,eAAoB,aAAQ,UAAU,YAAY;AAExD,aAAW,QAAQ,cAAc;AAC7B,UAAM,aAAkB,UAAK,cAAc,IAAI;AAC/C,QAAI,CAAI,cAAW,UAAU,EAAG;AAEhC,QAAI;AACA,UAAI,SAAS,eAAe;AACxB,cAAM,MAAS,gBAAa,YAAY,OAAO;AAC/C,uBAAe,KAAK,MAAM,GAAG;AAAA,MACjC,OAAO;AACH,cAAM,MAAM,MAAM,OAAO;AACzB,uBAAgB,IAAI,WAAW;AAAA,MACnC;AACA,aAAO;AAAA,IACX,SAAS,KAAU;AACf,cAAQ,MAAM,EAAE,IAAI,4BAA4B,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;AACvE,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AAEA,iBAAe;AACf,SAAO;AACX;AA3Be;AA8Bf,eAAsB,YAA2C;AAC7D,SAAO,WAAW;AACtB;AAFsB;AAOtB,eAAe,oBAAoB,KAAyC;AACxE,QAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,uBAAmC;AAC7E,SAAO,iBAAiB,GAAG;AAC/B;AAHe;AAQf,eAAe,wBAA2C;AACtD,MAAI,wBAAwB,WAAY,QAAO;AAE/C,QAAM,WAAW,QAAQ,MAAM,KAAK;AACpC,QAAM,cAAmB,aAAQ,UAAU,cAAc,UAAU;AAEnE,MAAI,CAAI,cAAW,WAAW,GAAG;AAC7B,0BAAsB,CAAC;AACvB,WAAO,CAAC;AAAA,EACZ;AAEA,QAAM,QAAW,eAAY,WAAW,EACnC,OAAO,OAAK,mBAAmB,KAAK,SAAO,EAAE,SAAS,GAAG,CAAC,CAAC,EAC3D,KAAK;AAEV,QAAM,WAAqB,CAAC;AAE5B,aAAW,QAAQ,OAAO;AACtB,UAAM,WAAgB,UAAK,aAAa,IAAI;AAC5C,QAAI;AACA,YAAM,MAAM,MAAM,OAAO;AACzB,YAAM,UAAU,IAAI,WAAW;AAE/B,UAAI,WAAW,OAAO,YAAY,YAAY,QAAQ,MAAM;AACxD,iBAAS,KAAK,OAAiB;AAAA,MACnC,OAAO;AACH,gBAAQ,MAAM,EAAE,OAAO,UAAK,IAAI,iEAAiE,CAAC;AAAA,MACtG;AAAA,IACJ,SAAS,KAAU;AACf,cAAQ,MAAM,EAAE,IAAI,yBAAyB,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;AAAA,IACxE;AAAA,EACJ;AAEA,wBAAsB;AACtB,SAAO;AACX;AAnCe;AAwCf,SAAS,iBAAiB,YAAsD;AAC5E,MAAI;AACA,UAAM,UAAa,eAAY,YAAY,EAAE,eAAe,KAAK,CAAC;AAClE,WAAO,QACF;AAAA,MAAO,OACJ,EAAE,YAAY,KACd,CAAC,EAAE,KAAK,WAAW,GAAG,KACtB,CAAC,EAAE,KAAK,WAAW,cAAc,KAC9B,cAAgB,UAAK,YAAY,EAAE,MAAM,MAAM,CAAC;AAAA,IACvD,EACC,IAAI,QAAM,EAAE,MAAM,EAAE,MAAM,MAAW,UAAK,YAAY,EAAE,IAAI,EAAE,EAAE;AAAA,EACzE,QAAQ;AACJ,WAAO,CAAC;AAAA,EACZ;AACJ;AAdS;AAmBT,eAAsB,YAAY,UAAuC;AACrE,QAAM,KAAK,YAAY,QAAQ,MAAM,KAAK;AAC1C,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,iBAAiB,MAAM,sBAAsB;AAEnD,QAAM,YAAiC,EAAE,UAAU,IAAI,GAAI,QAAQ,aAAa,CAAC,EAAG;AAGpF,MAAI,QAAQ,YAAa,WAAU,cAAc,OAAO;AAExD,QAAM,eAAe,WAAW,MAAM;AAEtC,QAAM,QAAQ,IAAI,UAAU,SAAS;AACrC,QAAM,WAAW,QAAQ,WAAW,QAAQ,YAAY,CAAC,QAAQ,OAAO,MAAM;AAC9E,QAAM,iBAAiB,OAAO,IAAI,UAAU,MAAM;AAGlD,aAAW,WAAW,eAAgB,OAAM,IAAI,OAAO;AAGvD,MAAI,QAAQ,UAAU;AAClB,eAAW,WAAW,OAAO,SAAU,OAAM,IAAI,OAAO;AAAA,EAC5D;AAEA,SAAO;AACX;AAzBsB;AA4BtB,eAAe,eAAe,WAAgC,QAA6C;AAEvG,QAAM,eAAe,QAAQ,UAAU,KAAK,QAAQ;AACpD,MAAI,iBAAiB,SAAS;AAC1B,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,8BAAyC;AAChF,cAAU,WAAW,IAAI,cAAc;AAAA,EAC3C;AAGA,QAAM,UAAU,QAAQ,WAAW,KAAK,QAAQ;AAChD,MAAI,SAAS;AACT,UAAM,WAAW,MAAM,oBAAoB,OAAO;AAClD,cAAU,oBAAoB;AAC9B,cAAU,gBAAgB,SAAS;AAAA,EACvC;AAEJ;AAhBe;AAmBf,eAAe,iBACX,OAAkB,IAAY,UAAuC,QACxD;AACb,QAAM,aAAkB,aAAQ,EAAE;AAClC,QAAM,aAAgB,cAAgB,UAAK,YAAY,MAAM,CAAC;AAC9D,QAAM,aAAa,CAAC,aAAa,iBAAiB,UAAU,IAAI,CAAC;AAGjE,QAAM,UAAU,QAAQ,MAAM,YAAY,MAAM,oBAAoB,OAAO,KAAK,SAAS,IAAI;AAC7F,QAAM,SAAS,QAAQ,KAAK,YAAY,MAAM,oBAAoB,OAAO,IAAI,SAAS,IAAI;AAC1F,QAAM,UAAU,QAAQ,MAAM,YAAY,MAAM,oBAAoB,OAAO,KAAK,SAAS,IAAI;AAE7F,MAAI,WAAW,SAAS,MAAM,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,KAAK,IAAI;AAClF,YAAQ,IAAI,EAAE,KAAK,uBAAuB,WAAW,MAAM,eAAe,WAAW,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;AACnH,eAAW,OAAO,YAAY;AAC1B,UAAI,SAAS,SAAS,MAAM,GAAG;AAC3B,cAAM,IAAI,KAAK;AAAA,UACX,UAAU,IAAI;AAAA,UACd,MAAM,QAAQ,IAAI,IAAI;AAAA,UACtB,mBAAmB;AAAA,UACnB,aAAa,QAAQ,MAAM;AAAA,QAC/B,CAAC,CAAC;AAAA,MACN;AACA,UAAI,SAAS,SAAS,KAAK,GAAG;AAC1B,cAAM,IAAI,IAAI;AAAA,UACV,UAAU,IAAI;AAAA,UACd,MAAM,OAAO,IAAI,IAAI;AAAA,UACrB,mBAAmB;AAAA,UACnB,OAAO,QAAQ,KAAK;AAAA,UACpB,cAAc,QAAQ,KAAK;AAAA,QAC/B,CAAC,CAAC;AAAA,MACN;AAAA,IACJ;AAAA,EACJ,OAAO;AACH,QAAI,SAAS,SAAS,MAAM,GAAG;AAC3B,YAAM,IAAI,KAAK;AAAA,QACX,UAAU;AAAA,QACV,mBAAmB;AAAA,QACnB,aAAa,QAAQ,MAAM;AAAA,MAC/B,CAAC,CAAC;AAAA,IACN;AACA,QAAI,SAAS,SAAS,KAAK,GAAG;AAC1B,YAAM,IAAI,IAAI;AAAA,QACV,mBAAmB;AAAA,QACnB,OAAO,QAAQ,KAAK;AAAA,QACpB,cAAc,QAAQ,KAAK;AAAA,MAC/B,CAAC,CAAC;AAAA,IACN;AAAA,EACJ;AAEA,MAAI,SAAS,SAAS,MAAM,GAAG;AAC3B,UAAM,IAAI,KAAK,EAAE,mBAAmB,QAAQ,CAAC,CAAC;AAAA,EAClD;AACJ;AArDe;AAwDf,eAAsB,0BAA0B,OAAkB,QAA6C;AAC3G,QAAM,cAAc,QAAQ,MAAM;AAClC,MAAI,CAAC,aAAa,OAAQ;AAE1B,aAAW,QAAQ,aAAa;AAC5B,UAAM,UAAe,aAAQ,KAAK,IAAI;AACtC,QAAI;AACA,YAAM,MAAM,cAAc;AAAA,QACtB,MAAM,KAAK;AAAA,QACX,MAAM;AAAA,QACN,SAAS,KAAK,WAAW;AAAA,QACzB,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,MAClB,CAAC;AAAA,IACL,QAAQ;AAAA,IAER;AAAA,EACJ;AACJ;AAlBsB;;;ADjStB,eAAsB,WAA0B;AAC5C,QAAM,WAAW,KAAK,CAAC,KAAK;AAC5B,QAAM,QAAQ,QAAQ,OAAO;AAC7B,QAAM,QAAQ,SAAS,QAAQ,OAAO,KAAK,OAAO,EAAE;AACpD,QAAM,UAAU,QAAQ,MAAM;AAC9B,QAAM,WAAW,QAAQ,MAAM;AAC/B,QAAM,UAAU,UACV,QAAQ,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,IACpC;AAGN,MAAI,YAAY,WAAW,CAAC,QAAQ,SAAS,MAAM,GAAG;AAClD,YAAQ,KAAK,MAAM;AAAA,EACvB;AAEA,UAAQ,IAAI,EAAE,KAAK,yDAA2B,CAAC;AAC/C,UAAQ,IAAI,EAAE,IAAI,WAAW,QAAQ,EAAE,CAAC;AACxC,UAAQ,IAAI,EAAE,IAAI,YAAY,KAAK,EAAE,CAAC;AACtC,UAAQ,IAAI,EAAE,IAAI,gBAAgB,KAAK,EAAE,CAAC;AAC1C,MAAI,QAAS,SAAQ,IAAI,EAAE,IAAI,cAAc,QAAQ,KAAK,IAAI,CAAC,EAAE,CAAC;AAClE,MAAI,SAAU,SAAQ,IAAI,EAAE,IAAI,gBAAgB,QAAQ,EAAE,CAAC;AAE3D,QAAM,QAAQ,MAAM,YAAY,QAAQ;AAGxC,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,0BAA0B,OAAO,MAAM;AAG7C,MAAI,UAAU;AACV,UAAM,cAAmB,cAAQ,QAAQ;AACzC,UAAM,WAAgB,eAAS,WAAW;AAC1C,QAAI;AACA,YAAM,MAAM,cAAc;AAAA,QACtB,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,QAAQ,CAAC,iBAAiB,iBAAiB;AAAA,MAC/C,CAAC;AACD,cAAQ,IAAI,EAAE,IAAI,iCAAiC,QAAQ,EAAE,CAAC;AAAA,IAClE,QAAQ;AACJ,cAAQ,IAAI,EAAE,OAAO,oDAAoD,CAAC;AAAA,IAC9E;AAAA,EACJ;AAEA,QAAM,SAAS,MAAM,MAAM,MAAM;AAAA,IAC7B;AAAA,IACA,cAAc;AAAA,IACd,UAAU;AAAA,IACV,YAAY,wBAAC,OAAO,QAAQ;AACxB,cAAQ,OAAO,MAAM,OAAO,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC,IAAI,GAAG,sBAAsB;AAAA,IACxF,GAFY;AAAA,EAGhB,CAAC;AAED,UAAQ,IAAI,IAAI;AAChB,MAAI,OAAO,MAAM;AACb,YAAQ,IAAI,KAAK,EAAE,MAAM,MAAM,CAAC,KAAK,OAAO,KAAK,OAAO,aAAa,OAAO,KAAK,OAAO,aAAa,OAAO,KAAK,UAAU,CAAC,SAAS;AAAA,EACzI;AACA,MAAI,OAAO,KAAK;AACZ,YAAQ,IAAI,KAAK,EAAE,MAAM,KAAK,CAAC,MAAM,OAAO,IAAI,OAAO,aAAa,OAAO,IAAI,OAAO,UAAU;AAAA,EACpG;AACA,MAAI,OAAO,MAAM;AACb,eAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,OAAO,IAAI,GAAG;AACpD,cAAQ,IAAI,KAAK,EAAE,MAAM,MAAM,CAAC,MAAM,IAAI,KAAK,KAAK,OAAO,aAAa,KAAK,OAAO,aAAa,KAAK,MAAM,SAAS;AAAA,IACzH;AAAA,EACJ;AAEA,QAAM,QAAQ,MAAM,MAAM;AAC1B,UAAQ,IAAI;AAAA,IAAO,EAAE,KAAK,QAAQ,CAAC,GAAG;AACtC,MAAI,MAAM,KAAM,SAAQ,IAAI,qBAAqB,MAAM,KAAK,MAAM,EAAE;AACpE,MAAI,MAAM,IAAK,SAAQ,IAAI,qBAAqB,MAAM,IAAI,OAAO,EAAE;AACnE,MAAI,MAAM,IAAK,SAAQ,IAAI,sBAAsB,MAAM,IAAI,OAAO,EAAE;AACpE,MAAI,MAAM,UAAW,SAAQ,IAAI,qBAAqB,MAAM,UAAU,SAAS,EAAE;AAEjF,QAAM,MAAM;AAChB;AA3EsB;;;AEDtB,eAAsB,gBAA+B;AACjD,QAAM,MAAM,WAAW,IAAI;AAC3B,QAAM,MAAM,IAAI,CAAC;AAEjB,MAAI,QAAQ,OAAO;AACf,UAAMC,QAAO,IAAI,CAAC;AAClB,UAAM,OAAO,QAAQ,MAAM;AAC3B,UAAM,UAAU,QAAQ,SAAS,KAAK;AACtC,UAAM,UAAU,QAAQ,SAAS;AACjC,UAAM,YAAY,QAAQ,QAAQ;AAElC,QAAI,CAACA,SAAQ,CAAC,MAAM;AAChB,cAAQ,IAAI,EAAE,IAAI,wHAAwH,CAAC;AAC3I,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,QAAQ,MAAM,YAAY;AAChC,UAAM,MAAM,cAAc;AAAA,MACtB;AAAA,MACA,MAAAA;AAAA,MACA;AAAA,MACA,QAAQ,YAAY,UAAU,MAAM,GAAG,IAAI,CAAC;AAAA,MAC5C,SAAS,WAAW;AAAA,IACxB,CAAC;AACD,YAAQ,IAAI,EAAE,MAAM,sBAAiB,IAAI,YAAYA,KAAI,KAAK,OAAO,GAAG,CAAC;AACzE,QAAI,QAAS,SAAQ,IAAI,EAAE,IAAI,cAAc,OAAO,EAAE,CAAC;AACvD,UAAM,MAAM;AACZ;AAAA,EACJ;AAEA,MAAI,QAAQ,QAAQ;AAChB,UAAM,QAAQ,MAAM,YAAY;AAChC,UAAM,MAAM,WAAW;AACvB,UAAM,cAAc,MAAM,gBAAgB;AAC1C,QAAI,YAAY,WAAW,GAAG;AAC1B,cAAQ,IAAI,EAAE,OAAO,8BAA8B,CAAC;AAAA,IACxD,OAAO;AACH,cAAQ,IAAI,EAAE,KAAK,uDAAyB,CAAC;AAC7C,iBAAW,OAAO,aAAa;AAC3B,gBAAQ,IAAI,KAAK,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,QAAG,CAAC,IAAI,IAAI,IAAI,EAAE;AAC7D,gBAAQ,IAAI,gBAAgB,IAAI,WAAW,SAAS,EAAE;AACtD,YAAI,IAAI,QAAS,SAAQ,IAAI,gBAAgB,EAAE,IAAI,IAAI,OAAO,CAAC,EAAE;AAAA,MACrE;AAAA,IACJ;AACA,UAAM,MAAM;AACZ;AAAA,EACJ;AAEA,MAAI,QAAQ,UAAU;AAClB,UAAM,OAAO,IAAI,CAAC;AAClB,QAAI,CAAC,MAAM;AACP,cAAQ,IAAI,EAAE,IAAI,2CAA2C,CAAC;AAC9D,cAAQ,KAAK,CAAC;AAAA,IAClB;AACA,UAAM,QAAQ,MAAM,YAAY;AAChC,UAAM,MAAM,iBAAiB,IAAI;AACjC,YAAQ,IAAI,EAAE,MAAM,sBAAiB,IAAI,YAAY,CAAC;AACtD,UAAM,MAAM;AACZ;AAAA,EACJ;AAEA,UAAQ,IAAI,EAAE,IAAI,+CAA+C,CAAC;AAClE,UAAQ,KAAK,CAAC;AAClB;AA/DsB;;;ACAtB,eAAsB,QAAuB;AACzC,QAAM,MAAM,WAAW,IAAI;AAC3B,QAAM,MAAM,IAAI,CAAC;AAGjB,MAAI,QAAQ,OAAO;AACf,UAAM,WAAW,IAAI,CAAC;AACtB,UAAM,UAAU,IAAI,MAAM,CAAC,EAAE,KAAK,GAAG;AACrC,UAAM,UAAU,QAAQ,MAAM;AAE9B,QAAI,CAAC,YAAY,CAAC,SAAS;AACvB,cAAQ,IAAI,EAAE,IAAI,yEAA6E,CAAC;AAChG,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,QAAQ,MAAM,YAAY;AAChC,UAAM,MAAM,WAAW;AACvB,UAAM,OAAO,MAAM,WAAW,QAAQ;AACtC,UAAM,OAAO,UAAU,KAAK,MAAM,OAAO,IAAI,CAAC;AAC9C,UAAM,KAAK,MAAM,KAAK,IAAI,SAAS,IAAI;AACvC,YAAQ,IAAI,EAAE,MAAM,sBAAiB,EAAE,QAAQ,QAAQ,GAAG,CAAC;AAC3D,UAAM,MAAM;AACZ;AAAA,EACJ;AAGA,MAAI,QAAQ,UAAU;AAClB,UAAM,WAAW,IAAI,CAAC;AACtB,UAAM,QAAQ,IAAI,MAAM,CAAC,EAAE,KAAK,GAAG;AACnC,UAAM,IAAI,SAAS,QAAQ,GAAG,KAAK,KAAK,EAAE;AAC1C,UAAM,OAAQ,QAAQ,MAAM,KAAa;AAEzC,QAAI,CAAC,YAAY,CAAC,OAAO;AACrB,cAAQ,IAAI,EAAE,IAAI,wFAAwF,CAAC;AAC3G,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,QAAQ,MAAM,YAAY;AAChC,UAAM,MAAM,WAAW;AACvB,UAAM,OAAO,MAAM,WAAW,QAAQ;AACtC,UAAM,UAAU,MAAM,KAAK,OAAO,OAAO,EAAE,GAAG,KAAK,CAAC;AAEpD,QAAI,QAAQ,WAAW,GAAG;AACtB,cAAQ,IAAI,EAAE,OAAO,qBAAqB,CAAC;AAAA,IAC/C,OAAO;AACH,cAAQ,IAAI,EAAE,KAAK;AAAA,qBAAS,QAAQ,MAAM,KAAK;AAAA,CAAS,CAAC;AACzD,iBAAW,KAAK,SAAS;AACrB,cAAM,QAAQ,KAAK,OAAO,EAAE,SAAS,KAAK,GAAG;AAC7C,gBAAQ,IAAI,KAAK,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE;AACrD,YAAI,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,GAAG;AACpC,kBAAQ,IAAI,OAAO,EAAE,IAAI,KAAK,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE;AAAA,QAC1D;AAAA,MACJ;AAAA,IACJ;AACA,UAAM,MAAM;AACZ;AAAA,EACJ;AAGA,MAAI,QAAQ,QAAQ;AAChB,UAAM,WAAW,IAAI,CAAC;AACtB,UAAM,QAAQ,SAAS,QAAQ,OAAO,KAAK,MAAM,EAAE;AAEnD,QAAI,CAAC,UAAU;AACX,YAAMC,SAAQ,MAAM,YAAY;AAChC,YAAMA,OAAM,WAAW;AACvB,YAAM,QAAQA,OAAM,oBAAoB;AACxC,UAAI,MAAM,WAAW,GAAG;AACpB,gBAAQ,IAAI,EAAE,OAAO,4BAA4B,CAAC;AAAA,MACtD,OAAO;AACH,gBAAQ,IAAI,EAAE,KAAK,0DAA4B,CAAC;AAChD,mBAAW,KAAK,OAAO;AACnB,gBAAMC,QAAOD,OAAM,WAAW,CAAC;AAC/B,kBAAQ,IAAI,KAAK,EAAE,KAAK,CAAC,CAAC,WAAMC,MAAK,MAAM,CAAC,QAAQ;AAAA,QACxD;AAAA,MACJ;AACA,MAAAD,OAAM,MAAM;AACZ;AAAA,IACJ;AAEA,UAAM,QAAQ,MAAM,YAAY;AAChC,UAAM,MAAM,WAAW;AACvB,UAAM,OAAO,MAAM,WAAW,QAAQ;AACtC,UAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,CAAC;AACjC,QAAI,MAAM,WAAW,GAAG;AACpB,cAAQ,IAAI,EAAE,OAAO,iBAAiB,QAAQ,aAAa,CAAC;AAAA,IAChE,OAAO;AACH,cAAQ,IAAI,EAAE,KAAK;AAAA,qBAAS,QAAQ,KAAK,KAAK,MAAM,CAAC;AAAA,CAAe,CAAC;AACrE,iBAAW,QAAQ,OAAO;AACtB,cAAM,MAAM,KAAK,OAAO,KAAK,IAAI,IAAI,MAAO,KAAK,aAAa,EAAE;AAChE,gBAAQ,IAAI,MAAM,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,KAAK,QAAQ,MAAM,GAAG,EAAE,CAAC,EAAE;AAAA,MACtF;AAAA,IACJ;AACA,UAAM,MAAM;AACZ;AAAA,EACJ;AAGA,MAAI,QAAQ,QAAQ;AAChB,UAAM,WAAW,IAAI,CAAC;AACtB,UAAM,OAAO,SAAS,QAAQ,MAAM,KAAK,KAAK,EAAE;AAEhD,QAAI,CAAC,YAAY,QAAQ,GAAG;AACxB,cAAQ,IAAI,EAAE,IAAI,kDAAkD,CAAC;AACrE,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,QAAQ,MAAM,YAAY;AAChC,UAAM,MAAM,WAAW;AACvB,UAAM,OAAO,MAAM,WAAW,QAAQ;AACtC,UAAM,SAAS,MAAM,KAAK,KAAK,EAAE,KAAK,CAAC;AACvC,YAAQ,IAAI,EAAE,MAAM,kBAAa,OAAO,OAAO,gBAAgB,QAAQ,WAAW,IAAI,GAAG,CAAC;AAC1F,UAAM,MAAM;AACZ;AAAA,EACJ;AAGA,MAAI,QAAQ,SAAS;AACjB,UAAM,WAAW,IAAI,CAAC;AACtB,QAAI,CAAC,UAAU;AACX,cAAQ,IAAI,EAAE,IAAI,wCAAwC,CAAC;AAC3D,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,QAAQ,MAAM,YAAY;AAChC,UAAM,MAAM,WAAW;AACvB,UAAM,OAAO,MAAM,WAAW,QAAQ;AACtC,UAAM,SAAS,KAAK,MAAM;AAC1B,SAAK,MAAM;AACX,YAAQ,IAAI,EAAE,MAAM,kBAAa,MAAM,gBAAgB,QAAQ,GAAG,CAAC;AACnE,UAAM,MAAM;AACZ;AAAA,EACJ;AAEA,UAAQ,IAAI,EAAE,IAAI,kDAAkD,CAAC;AACrE,UAAQ,KAAK,CAAC;AAClB;AAxIsB;;;ACCtB,eAAsB,UAAyB;AAC3C,QAAM,aAAa,QAAQ,YAAY;AACvC,QAAM,QAAQ,MAAM,YAAY;AAEhC,UAAQ,IAAI,EAAE,KAAK,gEAAkC,CAAC;AAEtD,QAAM,OAAqD,CAAC;AAC5D,MAAI,WAAY,MAAK,cAAc,CAAC,UAAU;AAC9C,OAAK,aAAa,CAAC,KAAa,MAAc,KAAa,UAAkB;AACzE,YAAQ,OAAO,MAAM,OAAO,EAAE,KAAK,GAAG,CAAC,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,sBAAsB;AAAA,EAC3F;AAEA,QAAM,UAAU,MAAM,MAAM,UAAU,IAAI;AAE1C,UAAQ,IAAI,IAAI;AAChB,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,OAAO,GAAG;AAChD,YAAQ,IAAI,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,KAAK,OAAO,aAAa,KAAK,OAAO,aAAa,KAAK,MAAM,SAAS;AAAA,EAC7G;AAEA,QAAM,MAAM;AAChB;AApBsB;AAsBtB,eAAsB,eAA8B;AAChD,QAAM,QAAQ,WAAW,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAChD,MAAI,CAAC,OAAO;AACR,YAAQ,IAAI,EAAE,IAAI,kCAAkC,CAAC;AACrD,YAAQ,KAAK,CAAC;AAAA,EAClB;AAEA,QAAM,QAAQ,MAAM,YAAY;AAChC,QAAM,aAAa,QAAQ,YAAY;AACvC,QAAM,IAAI,SAAS,QAAQ,GAAG,KAAK,KAAK,EAAE;AAE1C,UAAQ,IAAI,EAAE,KAAK;AAAA,4CAAgC,KAAK;AAAA,CAAS,CAAC;AAElE,QAAM,UAAU,MAAM,MAAM,WAAW,OAAO,EAAE,YAAY,cAAc,QAAW,EAAE,CAAC;AAExF,MAAI,QAAQ,WAAW,GAAG;AACtB,YAAQ,IAAI,EAAE,OAAO,qBAAqB,CAAC;AAC3C,UAAM,MAAM;AACZ;AAAA,EACJ;AAEA,aAAW,KAAK,SAAS;AACrB,UAAM,QAAQ,KAAK,MAAM,EAAE,QAAQ,GAAG;AACtC,UAAM,MAAM,EAAE,UAAU,WAAM,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK;AACnD,YAAQ,IAAI,GAAG,EAAE,QAAQ,QAAQ,KAAK,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAS,CAAC,KAAM,EAAE,SAAiB,UAAU,IAAI,GAAG,EAAE;AAC9G,UAAM,UAAU,EAAE,QAAQ,MAAM,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AAC3D,YAAQ,IAAI,EAAE,IAAI,OAAO,CAAC;AAC1B,YAAQ,IAAI,EAAE;AAAA,EAClB;AAEA,QAAM,MAAM;AAChB;AA/BsB;;;ACrBtB,eAAsB,YAA2B;AAC7C,QAAM,QAAQ,WAAW,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAChD,MAAI,CAAC,OAAO;AACR,YAAQ,IAAI,EAAE,IAAI,iCAAiC,CAAC;AACpD,YAAQ,KAAK,CAAC;AAAA,EAClB;AAEA,QAAM,QAAQ,MAAM,YAAY;AAChC,UAAQ,IAAI,EAAE,KAAK;AAAA,wCAA4B,KAAK;AAAA,CAAS,CAAC;AAE9D,QAAM,UAAU,MAAM,MAAM,OAAO,KAAK;AACxC,eAAa,OAAO;AACpB,QAAM,MAAM;AAChB;AAbsB;AAetB,eAAsB,kBAAiC;AACnD,QAAM,QAAQ,WAAW,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAChD,MAAI,CAAC,OAAO;AACR,YAAQ,IAAI,EAAE,IAAI,kCAAkC,CAAC;AACrD,YAAQ,KAAK,CAAC;AAAA,EAClB;AAEA,QAAM,QAAQ,MAAM,YAAY;AAChC,UAAQ,IAAI,EAAE,KAAK;AAAA,+CAAmC,KAAK,sBAAO,CAAC;AACnE,UAAQ,IAAI,EAAE,IAAI;AAAA,CAAkD,CAAC;AAErE,QAAM,UAAU,MAAM,MAAM,aAAa,KAAK;AAC9C,eAAa,OAAO;AACpB,QAAM,MAAM;AAChB;AAdsB;AAgBtB,eAAsB,mBAAkC;AACpD,QAAM,QAAQ,WAAW,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAChD,MAAI,CAAC,OAAO;AACR,YAAQ,IAAI,EAAE,IAAI,kCAAkC,CAAC;AACrD,YAAQ,KAAK,CAAC;AAAA,EAClB;AAEA,QAAM,QAAQ,MAAM,YAAY;AAChC,QAAM,MAAM,WAAW;AACvB,UAAQ,IAAI,EAAE,KAAK;AAAA,gDAAoC,KAAK,sBAAO,CAAC;AACpE,UAAQ,IAAI,EAAE,IAAI;AAAA,CAAoC,CAAC;AAEvD,QAAM,UAAU,MAAM,MAAM,WAAW,KAAK;AAC5C,eAAa,OAAO;AACpB,QAAM,MAAM;AAChB;AAfsB;;;AC/BtB,eAAsB,aAA4B;AAC9C,QAAM,MAAM,WAAW,IAAI;AAC3B,QAAM,MAAM,IAAI,CAAC;AAGjB,MAAI,QAAQ,OAAO;AACf,UAAM,aAAa,IAAI,CAAC;AACxB,UAAME,QAAO,IAAI,CAAC;AAClB,UAAM,OAAO,IAAI,MAAM,CAAC,EAAE,KAAK,GAAG;AAElC,QAAI,CAAC,cAAc,CAACA,SAAQ,CAAC,MAAM;AAC/B,cAAQ,IAAI,EAAE,IAAI,gEAAgE,CAAC;AACnF,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAMC,SAAQ,MAAM,YAAY;AAChC,UAAMA,OAAM,WAAW;AACvB,IAAAA,OAAM,WAAW,YAAYD,OAAM,IAAI;AACvC,YAAQ,IAAI,EAAE,MAAM,yBAAoB,UAAU,IAAIA,KAAI,YAAO,IAAI,GAAG,CAAC;AACzE,IAAAC,OAAM,MAAM;AACZ;AAAA,EACJ;AAGA,MAAI,QAAQ,QAAQ;AAChB,UAAMA,SAAQ,MAAM,YAAY;AAChC,UAAMA,OAAM,WAAW;AACvB,UAAM,WAAWA,OAAM,aAAa;AACpC,QAAI,SAAS,WAAW,GAAG;AACvB,cAAQ,IAAI,EAAE,OAAO,2BAA2B,CAAC;AAAA,IACrD,OAAO;AACH,cAAQ,IAAI,EAAE,KAAK,oDAAsB,CAAC;AAC1C,iBAAW,OAAO,UAAU;AACxB,gBAAQ,IAAI,KAAK,EAAE,KAAK,IAAI,UAAU,CAAC,IAAI,IAAI,IAAI,WAAM,EAAE,IAAI,IAAI,OAAO,CAAC,EAAE;AAAA,MACjF;AAAA,IACJ;AACA,IAAAA,OAAM,MAAM;AACZ;AAAA,EACJ;AAGA,QAAM,OAAO,WAAW,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAC/C,MAAI,CAAC,MAAM;AACP,YAAQ,IAAI,EAAE,IAAI,6CAA6C,CAAC;AAChE,YAAQ,IAAI,EAAE,IAAI,gEAAgE,CAAC;AACnF,YAAQ,IAAI,EAAE,IAAI,+BAA+B,CAAC;AAClD,YAAQ,KAAK,CAAC;AAAA,EAClB;AAEA,QAAM,QAAQ,MAAM,YAAY;AAChC,QAAM,UAAU,MAAM,MAAM,WAAW,IAAI;AAC3C,UAAQ,IAAI,OAAO;AACnB,QAAM,MAAM;AAChB;AArDsB;;;ACGtB,eAAsB,WAA0B;AAC5C,QAAM,QAAQ,MAAM,YAAY;AAChC,QAAM,MAAM,WAAW;AAEvB,QAAM,IAAI,MAAM,MAAM;AAEtB,UAAQ,IAAI,EAAE,KAAK,2DAA6B,CAAC;AACjD,UAAQ,IAAI,KAAK,EAAE,KAAK,SAAS,CAAC,KAAK,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,CAAI;AAEnE,MAAI,EAAE,MAAM;AACR,YAAQ,IAAI,KAAK,EAAE,KAAK,MAAM,CAAC,EAAE;AACjC,YAAQ,IAAI,uBAAuB,EAAE,KAAK,KAAK,EAAE;AACjD,YAAQ,IAAI,uBAAuB,EAAE,KAAK,MAAM,EAAE;AAClD,YAAQ,IAAI,uBAAuB,EAAE,KAAK,QAAQ,EAAE;AACpD,YAAQ,IAAI,EAAE;AAAA,EAClB;AAEA,MAAI,EAAE,KAAK;AACP,YAAQ,IAAI,KAAK,EAAE,KAAK,aAAa,CAAC,EAAE;AACxC,YAAQ,IAAI,uBAAuB,EAAE,IAAI,OAAO,EAAE;AAClD,YAAQ,IAAI,uBAAuB,EAAE,IAAI,YAAY,EAAE;AACvD,YAAQ,IAAI,uBAAuB,EAAE,IAAI,OAAO,EAAE;AAClD,YAAQ,IAAI,uBAAuB,EAAE,IAAI,QAAQ,EAAE;AACnD,YAAQ,IAAI,EAAE;AAAA,EAClB;AAEA,MAAI,EAAE,WAAW;AACb,YAAQ,IAAI,KAAK,EAAE,KAAK,WAAW,CAAC,EAAE;AACtC,YAAQ,IAAI,uBAAuB,EAAE,UAAU,WAAW,EAAE;AAC5D,YAAQ,IAAI,uBAAuB,EAAE,UAAU,SAAS,EAAE;AAC1D,YAAQ,IAAI,uBAAuB,EAAE,UAAU,MAAM,EAAE;AACvD,YAAQ,IAAI,uBAAuB,EAAE,UAAU,QAAQ,EAAE;AACzD,YAAQ,IAAI,EAAE;AAAA,EAClB;AAGA,QAAM,UAAU,MAAM,oBAAoB;AAC1C,MAAI,QAAQ,SAAS,GAAG;AACpB,YAAQ,IAAI,KAAK,EAAE,KAAK,gBAAgB,CAAC,EAAE;AAC3C,eAAW,QAAQ,SAAS;AACxB,YAAM,OAAO,MAAM,WAAW,IAAI;AAClC,cAAQ,IAAI,OAAO,IAAI,KAAK,KAAK,MAAM,CAAC,QAAQ;AAAA,IACpD;AACA,YAAQ,IAAI,EAAE;AAAA,EAClB;AAEA,QAAM,MAAM;AAChB;AA/CsB;AAmDtB,eAAsB,aAA4B;AAC9C,QAAM,QAAQ,MAAM,YAAY;AAChC,QAAM,MAAM,WAAW;AAEvB,UAAQ,IAAI,EAAE,KAAK,8DAAgC,CAAC;AACpD,UAAQ,IAAI,EAAE,IAAI,2DAA2D,CAAC;AAC9E,UAAQ,IAAI,EAAE,IAAI,+CAA+C,CAAC;AAElE,QAAM,SAAS,MAAM,MAAM,QAAQ;AAAA,IAC/B,YAAY,wBAAC,OAAO,SAAS,UAAU;AACnC,cAAQ,OAAO,MAAM,OAAO,EAAE,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,IAAI,KAAK,EAAE;AAAA,IAC7E,GAFY;AAAA,EAGhB,CAAC;AAED,UAAQ,IAAI,IAAI;AAChB,MAAI,OAAO,OAAO,EAAK,SAAQ,IAAI,KAAK,EAAE,MAAM,QAAG,CAAC,aAAa,OAAO,IAAI,UAAU;AACtF,MAAI,OAAO,MAAM,EAAM,SAAQ,IAAI,KAAK,EAAE,MAAM,QAAG,CAAC,aAAa,OAAO,GAAG,UAAU;AACrF,MAAI,OAAO,OAAO,EAAK,SAAQ,IAAI,KAAK,EAAE,MAAM,QAAG,CAAC,aAAa,OAAO,IAAI,UAAU;AACtF,MAAI,OAAO,KAAK,EAAO,SAAQ,IAAI,KAAK,EAAE,MAAM,QAAG,CAAC,aAAa,OAAO,EAAE,UAAU;AACpF,MAAI,OAAO,QAAQ,EAAI,SAAQ,IAAI,KAAK,EAAE,MAAM,QAAG,CAAC,aAAa,OAAO,KAAK,UAAU;AACvF,MAAI,OAAO,SAAS,EAAG,SAAQ,IAAI,KAAK,EAAE,MAAM,QAAG,CAAC,aAAa,OAAO,MAAM,UAAU;AACxF,UAAQ,IAAI;AAAA,IAAO,EAAE,KAAK,OAAO,CAAC,KAAK,OAAO,KAAK;AAAA,CAAwB;AAE3E,QAAM,MAAM;AAChB;AAxBsB;AA4BtB,eAAsB,WAA0B;AAC5C,QAAM,QAAQ,MAAM,YAAY;AAChC,QAAM,MAAM,WAAW;AAEvB,UAAQ,IAAI,EAAE,KAAK,2DAA6B,CAAC;AACjD,UAAQ,IAAI,EAAE,IAAI,cAAc,MAAM,OAAO,QAAQ,iBAAiB,CAAC;AACvE,UAAQ,IAAI,EAAE,IAAI,2BAA2B,CAAC;AAE9C,QAAM,UAAU,MAAM,MAAM;AAAA,IACxB,YAAY;AAAA,IACZ,SAAS,wBAAC,MAAM,YAAY;AACxB,YAAM,MAAK,oBAAI,KAAK,GAAE,mBAAmB;AACzC,cAAQ,IAAI,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,QAAG,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,KAAK,IAAI,EAAE;AAAA,IAC5E,GAHS;AAAA,IAIT,SAAS,wBAAC,QAAQ;AACd,cAAQ,MAAM,KAAK,EAAE,IAAI,QAAG,CAAC,IAAI,IAAI,OAAO,EAAE;AAAA,IAClD,GAFS;AAAA,EAGb,CAAC;AAGD,UAAQ,GAAG,UAAU,MAAM;AACvB,YAAQ,IAAI,EAAE,IAAI,yBAAyB,CAAC;AAC5C,YAAQ,MAAM;AACd,UAAM,MAAM;AACZ,YAAQ,KAAK,CAAC;AAAA,EAClB,CAAC;AAED,QAAM,IAAI,QAAQ,MAAM;AAAA,EAAC,CAAC;AAC9B;AA5BsB;AAgCtB,eAAsB,WAA0B;AAC5C,QAAM,OAAO,gBAAgB;AACjC;AAFsB;AAMf,SAAS,WAAiB;AAC7B,UAAQ,IAAI,EAAE,KAAK,oFAAiD,CAAC;AACrE,UAAQ,IAAI,EAAE,KAAK,WAAW,CAAC;AAC/B,UAAQ,IAAI,KAAK,EAAE,KAAK,OAAO,CAAC,uDAAuD;AACvF,UAAQ,IAAI,KAAK,EAAE,KAAK,gBAAgB,CAAC,+CAA+C;AACxF,UAAQ,IAAI,KAAK,EAAE,KAAK,iBAAiB,CAAC,sCAAsC;AAChF,UAAQ,IAAI,KAAK,EAAE,KAAK,mBAAmB,CAAC,uCAAuC;AACnF,UAAQ,IAAI,KAAK,EAAE,KAAK,MAAM,CAAC,2DAA2D;AAC1F,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,EAAE,KAAK,SAAS,CAAC;AAC7B,UAAQ,IAAI,KAAK,EAAE,KAAK,QAAQ,CAAC,uDAAuD;AACxF,UAAQ,IAAI,KAAK,EAAE,KAAK,SAAS,CAAC,8CAA8C,EAAE,KAAK,cAAc,CAAC,GAAG;AACzG,UAAQ,IAAI,KAAK,EAAE,KAAK,SAAS,CAAC,4DAA4D;AAC9F,UAAQ,IAAI,KAAK,EAAE,KAAK,SAAS,CAAC,6CAA6C;AAC/E,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,EAAE,KAAK,UAAU,CAAC;AAC9B,UAAQ,IAAI,KAAK,EAAE,KAAK,SAAS,CAAC,8DAA8D;AAChG,UAAQ,IAAI,KAAK,EAAE,KAAK,aAAa,CAAC,8CAA8C;AACpF,UAAQ,IAAI,KAAK,EAAE,KAAK,cAAc,CAAC,kDAAkD;AACzF,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,EAAE,KAAK,WAAW,CAAC;AAC/B,UAAQ,IAAI,KAAK,EAAE,KAAK,QAAQ,CAAC,uDAAuD;AACxF,UAAQ,IAAI,KAAK,EAAE,KAAK,WAAW,CAAC,+CAA+C;AACnF,UAAQ,IAAI,KAAK,EAAE,KAAK,SAAS,CAAC,uDAAuD;AACzF,UAAQ,IAAI,KAAK,EAAE,KAAK,SAAS,CAAC,qDAAqD;AACvF,UAAQ,IAAI,KAAK,EAAE,KAAK,UAAU,CAAC,4CAA4C;AAC/E,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,EAAE,KAAK,UAAU,CAAC;AAC9B,UAAQ,IAAI,KAAK,EAAE,KAAK,OAAO,CAAC,qDAAqD;AACrF,UAAQ,IAAI,KAAK,EAAE,KAAK,SAAS,CAAC,kDAAkD;AACpF,UAAQ,IAAI,KAAK,EAAE,KAAK,OAAO,CAAC,0DAA0D;AAC1F,UAAQ,IAAI,KAAK,EAAE,KAAK,OAAO,CAAC,wDAAwD;AACxF,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,EAAE,KAAK,UAAU,CAAC;AAC9B,UAAQ,IAAI,KAAK,EAAE,IAAI,eAAe,CAAC,yCAAyC;AAChF,UAAQ,IAAI,KAAK,EAAE,IAAI,SAAS,CAAC,2CAA2C;AAC5E,UAAQ,IAAI,KAAK,EAAE,IAAI,aAAa,CAAC,+CAA+C;AACpF,UAAQ,IAAI,KAAK,EAAE,IAAI,qBAAqB,CAAC,2BAA2B;AACxE,UAAQ,IAAI,KAAK,EAAE,IAAI,kBAAkB,CAAC,4CAA4C;AACtF,UAAQ,IAAI,KAAK,EAAE,IAAI,kBAAkB,CAAC,6BAA6B;AACvE,UAAQ,IAAI,KAAK,EAAE,IAAI,mBAAmB,CAAC,gCAAgC;AAC3E,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,EAAE,KAAK,WAAW,CAAC;AAC/B,UAAQ,IAAI,EAAE,IAAI,qBAAqB,CAAC;AACxC,UAAQ,IAAI,EAAE,IAAI,0DAA0D,CAAC;AAC7E,UAAQ,IAAI,EAAE,IAAI,6CAA6C,CAAC;AAChE,UAAQ,IAAI,EAAE,IAAI,qBAAqB,CAAC;AACxC,UAAQ,IAAI,EAAE,IAAI,iDAAiD,CAAC;AACpE,UAAQ,IAAI,EAAE,IAAI,oDAAoD,CAAC;AACvE,UAAQ,IAAI,EAAE,IAAI,mBAAmB,CAAC;AAC1C;AAlDgB;;;AChHhB,IAAM,UAAU,KAAK,CAAC;AAEtB,eAAe,OAAsB;AACjC,UAAQ,SAAS;AAAA,IACb,KAAK;AAAe,aAAO,SAAS;AAAA,IACpC,KAAK;AAAe,aAAO,cAAc;AAAA,IACzC,KAAK;AAAe,aAAO,MAAM;AAAA,IACjC,KAAK;AAAe,aAAO,QAAQ;AAAA,IACnC,KAAK;AAAe,aAAO,aAAa;AAAA,IACxC,KAAK;AAAe,aAAO,UAAU;AAAA,IACrC,KAAK;AAAe,aAAO,gBAAgB;AAAA,IAC3C,KAAK;AAAe,aAAO,iBAAiB;AAAA,IAC5C,KAAK;AAAe,aAAO,WAAW;AAAA,IACtC,KAAK;AAAe,aAAO,SAAS;AAAA,IACpC,KAAK;AAAe,aAAO,WAAW;AAAA,IACtC,KAAK;AAAe,aAAO,SAAS;AAAA,IACpC,KAAK;AAAe,aAAO,SAAS;AAAA,IACpC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,eAAS;AACT;AAAA,IACJ;AACI,UAAI,QAAS,SAAQ,IAAI,EAAE,IAAI,oBAAoB,OAAO;AAAA,CAAI,CAAC;AAC/D,eAAS;AACT,cAAQ,KAAK,UAAU,IAAI,CAAC;AAAA,EACpC;AACJ;AAzBe;AA2Bf,KAAK,EAAE,MAAM,SAAO;AAChB,UAAQ,MAAM,EAAE,IAAI,UAAU,IAAI,OAAO,EAAE,CAAC;AAC5C,MAAI,QAAQ,IAAI,gBAAiB,SAAQ,MAAM,IAAI,KAAK;AACxD,UAAQ,KAAK,CAAC;AAClB,CAAC;","names":["path","path","brain","coll","path","brain"]}
package/dist/code.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { P as Plugin } from './base-B_vJSAbj.js';
1
+ import { E as EmbeddingProvider, P as Plugin } from './base-3SNc_CeY.js';
2
2
  import 'better-sqlite3';
3
3
 
4
4
  /**
@@ -24,6 +24,8 @@ interface CodePluginOptions {
24
24
  maxFileSize?: number;
25
25
  /** Custom indexer name for multi-repo (e.g. 'code:frontend'). Default: 'code' */
26
26
  name?: string;
27
+ /** Per-plugin embedding provider. Default: global embedding from BrainBank config. */
28
+ embeddingProvider?: EmbeddingProvider;
27
29
  }
28
30
  /** Create a code indexing plugin. */
29
31
  declare function code(opts?: CodePluginOptions): Plugin;
package/dist/code.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  code
3
- } from "./chunk-PXK62M5W.js";
3
+ } from "./chunk-FGL32LUJ.js";
4
4
  import "./chunk-U2Q2XGPZ.js";
5
5
  import "./chunk-7QVYU63E.js";
6
6
  export {
package/dist/docs.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { P as Plugin } from './base-B_vJSAbj.js';
1
+ import { E as EmbeddingProvider, P as Plugin } from './base-3SNc_CeY.js';
2
2
  import 'better-sqlite3';
3
3
 
4
4
  /**
@@ -11,7 +11,11 @@ import 'better-sqlite3';
11
11
  * brain.use(docs());
12
12
  */
13
13
 
14
+ interface DocsPluginOptions {
15
+ /** Per-plugin embedding provider. Default: global embedding from BrainBank config. */
16
+ embeddingProvider?: EmbeddingProvider;
17
+ }
14
18
  /** Create a document collections plugin. */
15
- declare function docs(): Plugin;
19
+ declare function docs(opts?: DocsPluginOptions): Plugin;
16
20
 
17
- export { docs };
21
+ export { type DocsPluginOptions, docs };
package/dist/docs.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  docs
3
- } from "./chunk-C4KDZGRX.js";
3
+ } from "./chunk-VQ27YUHH.js";
4
4
  import "./chunk-YOLKSYWK.js";
5
5
  import "./chunk-7QVYU63E.js";
6
6
  export {
package/dist/git.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { P as Plugin } from './base-B_vJSAbj.js';
1
+ import { E as EmbeddingProvider, P as Plugin } from './base-3SNc_CeY.js';
2
2
  import 'better-sqlite3';
3
3
 
4
4
  /**
@@ -24,6 +24,8 @@ interface GitPluginOptions {
24
24
  maxDiffBytes?: number;
25
25
  /** Custom indexer name for multi-repo (e.g. 'git:frontend'). Default: 'git' */
26
26
  name?: string;
27
+ /** Per-plugin embedding provider. Default: global embedding from BrainBank config. */
28
+ embeddingProvider?: EmbeddingProvider;
27
29
  }
28
30
  /** Create a git history plugin. */
29
31
  declare function git(opts?: GitPluginOptions): Plugin;
package/dist/git.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  git
3
- } from "./chunk-HPNUMUIF.js";
3
+ } from "./chunk-JRSKWF6K.js";
4
4
  import "./chunk-U2Q2XGPZ.js";
5
5
  import "./chunk-7QVYU63E.js";
6
6
  export {
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { EventEmitter } from 'node:events';
2
- import { a as ProgressCallback, B as BrainBankConfig, P as Plugin, C as Collection, S as StageProgressCallback, I as IndexResult, D as DocumentCollection, b as SearchResult, c as ContextOptions, d as CoEditSuggestion, e as IndexStats, R as ResolvedConfig, E as EmbeddingProvider, f as Reranker, V as VectorIndex, g as SearchHit, h as CodeChunk, i as Database, H as HNSWIndex, L as LearningPattern } from './base-B_vJSAbj.js';
3
- export { j as CodeResult, k as CodeResultMetadata, l as CollectionAddOptions, m as CollectionItem, n as CollectionPlugin, o as CollectionResult, p as CollectionSearchOptions, q as CommitResult, r as CommitResultMetadata, s as DistilledStrategy, t as DocChunk, u as DocumentResult, v as DocumentResultMetadata, G as GitCommitRecord, w as IndexablePlugin, x as PatternResult, y as PatternResultMetadata, z as PluginContext, A as SearchResultType, F as SearchablePlugin, W as WatchablePlugin, J as isCodeResult, K as isCollectionResult, M as isCommitResult, N as isDocumentResult, O as isPatternResult, Q as matchResult } from './base-B_vJSAbj.js';
2
+ import { a as ProgressCallback, B as BrainBankConfig, P as Plugin, C as Collection, S as StageProgressCallback, I as IndexResult, D as DocumentCollection, b as SearchResult, c as ContextOptions, d as CoEditSuggestion, e as IndexStats, R as ResolvedConfig, E as EmbeddingProvider, f as Reranker, V as VectorIndex, g as SearchHit, h as CodeChunk, i as Database, H as HNSWIndex, L as LearningPattern } from './base-3SNc_CeY.js';
3
+ export { j as CodeResult, k as CodeResultMetadata, l as CollectionAddOptions, m as CollectionItem, n as CollectionPlugin, o as CollectionResult, p as CollectionSearchOptions, q as CommitResult, r as CommitResultMetadata, s as DistilledStrategy, t as DocChunk, u as DocumentResult, v as DocumentResultMetadata, G as GitCommitRecord, w as IndexablePlugin, x as PatternResult, y as PatternResultMetadata, z as PluginContext, A as SearchResultType, F as SearchablePlugin, W as WatchablePlugin, J as isCodeResult, K as isCollectionResult, M as isCommitResult, N as isDocumentResult, O as isPatternResult, Q as matchResult } from './base-3SNc_CeY.js';
4
4
  export { code } from './code.js';
5
5
  export { git } from './git.js';
6
6
  export { docs } from './docs.js';
package/dist/index.js CHANGED
@@ -29,7 +29,7 @@ import {
29
29
  VectorSearch,
30
30
  resolveConfig,
31
31
  searchMMR
32
- } from "./chunk-YC4ZQLDN.js";
32
+ } from "./chunk-DI3H6JVZ.js";
33
33
  import {
34
34
  providerKey,
35
35
  resolveEmbedding
@@ -42,16 +42,16 @@ import {
42
42
  code,
43
43
  getLanguage,
44
44
  isSupported
45
- } from "./chunk-PXK62M5W.js";
45
+ } from "./chunk-FGL32LUJ.js";
46
46
  import {
47
47
  CoEditAnalyzer,
48
48
  GitIndexer,
49
49
  git
50
- } from "./chunk-HPNUMUIF.js";
50
+ } from "./chunk-JRSKWF6K.js";
51
51
  import {
52
52
  DocsIndexer,
53
53
  docs
54
- } from "./chunk-C4KDZGRX.js";
54
+ } from "./chunk-VQ27YUHH.js";
55
55
  import {
56
56
  reciprocalRankFusion
57
57
  } from "./chunk-YOLKSYWK.js";
package/dist/memory.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { P as Plugin } from './base-B_vJSAbj.js';
1
+ import { P as Plugin } from './base-3SNc_CeY.js';
2
2
  import 'better-sqlite3';
3
3
 
4
4
  /**
package/dist/notes.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { P as Plugin } from './base-B_vJSAbj.js';
1
+ import { P as Plugin } from './base-3SNc_CeY.js';
2
2
  import 'better-sqlite3';
3
3
 
4
4
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brainbank",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Pluggable semantic memory for AI agents — hybrid search (vector + BM25) in a single SQLite file. Built-in code, git, and docs indexers. Bring your own.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -74,6 +74,7 @@
74
74
  "hnswlib-node": "^3.0.0",
75
75
  "tree-sitter": "^0.25.0",
76
76
  "tree-sitter-javascript": "^0.25.0",
77
+ "tree-sitter-python": "^0.25.0",
77
78
  "tree-sitter-typescript": "^0.23.2"
78
79
  },
79
80
  "optionalDependencies": {
@@ -92,7 +93,6 @@
92
93
  "tree-sitter-kotlin": "^0.3.8",
93
94
  "tree-sitter-lua": "^2.1.3",
94
95
  "tree-sitter-php": "^0.24.2",
95
- "tree-sitter-python": "^0.25.0",
96
96
  "tree-sitter-ruby": "^0.23.1",
97
97
  "tree-sitter-rust": "^0.24.0",
98
98
  "tree-sitter-scala": "^0.24.0",