brainbank 0.3.1 → 0.5.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/README.md +174 -15
- package/assets/architecture.png +0 -0
- package/dist/{base-4SUgeRWT.d.ts → base-DZWtdgIf.d.ts} +23 -27
- package/dist/chunk-6XOXM7MI.js +136 -0
- package/dist/chunk-6XOXM7MI.js.map +1 -0
- package/dist/{chunk-FINIFKAY.js → chunk-BNV43SEF.js} +5 -4
- package/dist/chunk-BNV43SEF.js.map +1 -0
- package/dist/{chunk-MGIFEPYZ.js → chunk-DDECTPRM.js} +22 -17
- package/dist/chunk-DDECTPRM.js.map +1 -0
- package/dist/{chunk-5VUYPNH3.js → chunk-HNPABX7L.js} +6 -3
- package/dist/chunk-HNPABX7L.js.map +1 -0
- package/dist/{chunk-2BEWWQL2.js → chunk-MY36UPPQ.js} +227 -112
- package/dist/chunk-MY36UPPQ.js.map +1 -0
- package/dist/chunk-N2OJRXSB.js +117 -0
- package/dist/chunk-N2OJRXSB.js.map +1 -0
- package/dist/{chunk-FI7GWG4W.js → chunk-TTXVJFAE.js} +5 -2
- package/dist/chunk-TTXVJFAE.js.map +1 -0
- package/dist/{chunk-QNHBCOKB.js → chunk-U2Q2XGPZ.js} +7 -2
- package/dist/{chunk-QNHBCOKB.js.map → chunk-U2Q2XGPZ.js.map} +1 -1
- package/dist/{chunk-E6WQM4DN.js → chunk-YOLKSYWK.js} +1 -1
- package/dist/chunk-YOLKSYWK.js.map +1 -0
- package/dist/{chunk-Y3JKI6QN.js → chunk-YRGUIRN5.js} +234 -57
- package/dist/chunk-YRGUIRN5.js.map +1 -0
- package/dist/cli.js +21 -10
- package/dist/cli.js.map +1 -1
- package/dist/code.d.ts +1 -1
- package/dist/code.js +2 -1
- package/dist/docs.d.ts +1 -1
- package/dist/docs.js +2 -1
- package/dist/git.d.ts +1 -1
- package/dist/git.js +2 -1
- package/dist/index.d.ts +100 -4
- package/dist/index.js +16 -8
- package/dist/index.js.map +1 -1
- package/dist/memory.d.ts +1 -1
- package/dist/memory.js +2 -2
- package/dist/notes.d.ts +1 -1
- package/dist/notes.js +3 -2
- package/dist/perplexity-context-embedding-KSVSZXMD.js +9 -0
- package/dist/perplexity-context-embedding-KSVSZXMD.js.map +1 -0
- package/dist/perplexity-embedding-227WQY4R.js +10 -0
- package/dist/perplexity-embedding-227WQY4R.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-2BEWWQL2.js.map +0 -1
- package/dist/chunk-5VUYPNH3.js.map +0 -1
- package/dist/chunk-E6WQM4DN.js.map +0 -1
- package/dist/chunk-FI7GWG4W.js.map +0 -1
- package/dist/chunk-FINIFKAY.js.map +0 -1
- package/dist/chunk-MGIFEPYZ.js.map +0 -1
- package/dist/chunk-Y3JKI6QN.js.map +0 -1
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 { Indexer } 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?: Indexer[];\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\nlet _configCache: BrainBankCliConfig | null | undefined = undefined;\nlet _folderIndexersCache: Indexer[] | undefined = undefined;\n\n// ── Config Loader ───────────────────────────────────\n\n/** Load .brainbank/config.ts if present. */\nasync function loadConfig(): Promise<BrainBankCliConfig | null> {\n if (_configCache !== undefined) 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// ── Indexer Discovery ───────────────────────────────\n\n/** Auto-discover indexers from .brainbank/indexers/ folder. */\nasync function discoverFolderIndexers(): Promise<Indexer[]> {\n if (_folderIndexersCache !== undefined) return _folderIndexersCache;\n\n const repoPath = getFlag('repo') ?? '.';\n const indexersDir = path.resolve(repoPath, '.brainbank', 'indexers');\n\n if (!fs.existsSync(indexersDir)) {\n _folderIndexersCache = [];\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: Indexer[] = [];\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 Indexer);\n } else {\n console.error(c.yellow(`⚠ ${file}: must export a default Indexer 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 _folderIndexersCache = 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 discoverFolderIndexers();\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('@brainbank/reranker');\n brainOpts.reranker = new Qwen3Reranker();\n }\n\n if (process.env.BRAINBANK_EMBEDDING === 'openai') {\n const { OpenAIEmbedding } = await import('../providers/embeddings/openai-embedding.ts');\n const provider = new OpenAIEmbedding();\n brainOpts.embeddingProvider = provider;\n brainOpts.embeddingDims = provider.dims;\n }\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('Indexers')}: ${brain.indexers.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 } 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 { Indexer } 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?: Indexer[];\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 _folderIndexersCache: Indexer[] | 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 _folderIndexersCache = 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// ── Indexer Discovery ───────────────────────────────\n\n/** Auto-discover indexers from .brainbank/indexers/ folder. */\nasync function discoverFolderIndexers(): Promise<Indexer[]> {\n if (_folderIndexersCache !== NOT_LOADED) return _folderIndexersCache;\n\n const repoPath = getFlag('repo') ?? '.';\n const indexersDir = path.resolve(repoPath, '.brainbank', 'indexers');\n\n if (!fs.existsSync(indexersDir)) {\n _folderIndexersCache = [];\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: Indexer[] = [];\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 Indexer);\n } else {\n console.error(c.yellow(`⚠ ${file}: must export a default Indexer 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 _folderIndexersCache = 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 discoverFolderIndexers();\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('@brainbank/reranker');\n brainOpts.reranker = new Qwen3Reranker();\n }\n\n if (process.env.BRAINBANK_EMBEDDING === 'openai') {\n const { OpenAIEmbedding } = await import('../providers/embeddings/openai-embedding.ts');\n const provider = new OpenAIEmbedding();\n brainOpts.embeddingProvider = provider;\n brainOpts.embeddingDims = provider.dims;\n } else if (process.env.BRAINBANK_EMBEDDING === 'perplexity') {\n const { PerplexityEmbedding } = await import('../providers/embeddings/perplexity-embedding.ts');\n const provider = new PerplexityEmbedding();\n brainOpts.embeddingProvider = provider;\n brainOpts.embeddingDims = provider.dims;\n } else if (process.env.BRAINBANK_EMBEDDING === 'perplexity-context') {\n const { PerplexityContextEmbedding } = await import('../providers/embeddings/perplexity-context-embedding.ts');\n const provider = new PerplexityContextEmbedding();\n brainOpts.embeddingProvider = provider;\n brainOpts.embeddingDims = provider.dims;\n }\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('Indexers')}: ${brain.indexers.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"]}
|
package/dist/code.d.ts
CHANGED
package/dist/code.js
CHANGED
package/dist/docs.d.ts
CHANGED
package/dist/docs.js
CHANGED
package/dist/git.d.ts
CHANGED
package/dist/git.js
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EventEmitter } from 'node:events';
|
|
2
|
-
import { P as ProgressCallback, B as BrainBankConfig, I as Indexer, C as Collection, S as StageProgressCallback, a as IndexResult, D as DocumentCollection, b as SearchResult, c as ContextOptions, d as CoEditSuggestion, e as IndexStats, R as ResolvedConfig, E as EmbeddingProvider, V as VectorIndex, f as SearchHit, g as CodeChunk, h as Database, H as HNSWIndex, L as LearningPattern, i as Reranker } from './base-
|
|
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 IndexerContext, y as PatternResult, z as PatternResultMetadata, 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-
|
|
2
|
+
import { P as ProgressCallback, B as BrainBankConfig, I as Indexer, C as Collection, S as StageProgressCallback, a as IndexResult, D as DocumentCollection, b as SearchResult, c as ContextOptions, d as CoEditSuggestion, e as IndexStats, R as ResolvedConfig, E as EmbeddingProvider, V as VectorIndex, f as SearchHit, g as CodeChunk, h as Database, H as HNSWIndex, L as LearningPattern, i as Reranker } from './base-DZWtdgIf.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 IndexerContext, y as PatternResult, z as PatternResultMetadata, 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-DZWtdgIf.js';
|
|
4
4
|
export { code } from './code.js';
|
|
5
5
|
export { git } from './git.js';
|
|
6
6
|
export { docs } from './docs.js';
|
|
@@ -132,6 +132,8 @@ declare class BrainBank extends EventEmitter {
|
|
|
132
132
|
collection(name: string): Collection;
|
|
133
133
|
/** List all collection names that have data. */
|
|
134
134
|
listCollectionNames(): string[];
|
|
135
|
+
/** Delete a collection's data and evict from cache. */
|
|
136
|
+
deleteCollection(name: string): void;
|
|
135
137
|
index(options?: {
|
|
136
138
|
modules?: ('code' | 'git' | 'docs')[];
|
|
137
139
|
gitDepth?: number;
|
|
@@ -247,7 +249,8 @@ declare class BrainBank extends EventEmitter {
|
|
|
247
249
|
/** The resolved configuration. */
|
|
248
250
|
get config(): Readonly<ResolvedConfig>;
|
|
249
251
|
private _requireInit;
|
|
250
|
-
|
|
252
|
+
/** Get the docs indexer as CollectionPlugin with init + type check. */
|
|
253
|
+
private _docsPlugin;
|
|
251
254
|
}
|
|
252
255
|
|
|
253
256
|
/**
|
|
@@ -328,6 +331,99 @@ declare class OpenAIEmbedding implements EmbeddingProvider {
|
|
|
328
331
|
private _handleApiError;
|
|
329
332
|
}
|
|
330
333
|
|
|
334
|
+
/**
|
|
335
|
+
* BrainBank — Perplexity Standard Embedding Provider
|
|
336
|
+
*
|
|
337
|
+
* Uses Perplexity's embedding API via fetch (no SDK dependency).
|
|
338
|
+
* Models: pplx-embed-v1-0.6b (1024d) and pplx-embed-v1-4b (2560d).
|
|
339
|
+
*
|
|
340
|
+
* Perplexity returns base64-encoded signed int8 vectors by default.
|
|
341
|
+
* This provider decodes them to Float32Array for HNSW compatibility.
|
|
342
|
+
*
|
|
343
|
+
* Usage:
|
|
344
|
+
* const brain = new BrainBank({
|
|
345
|
+
* embeddingProvider: new PerplexityEmbedding({ model: 'pplx-embed-v1-4b' }),
|
|
346
|
+
* });
|
|
347
|
+
*/
|
|
348
|
+
|
|
349
|
+
interface PerplexityEmbeddingOptions {
|
|
350
|
+
/** Perplexity API key. Falls back to PERPLEXITY_API_KEY env var. */
|
|
351
|
+
apiKey?: string;
|
|
352
|
+
/** Model name. Default: 'pplx-embed-v1-4b' */
|
|
353
|
+
model?: string;
|
|
354
|
+
/** Vector dimensions (Matryoshka reduction). If omitted, uses model default. */
|
|
355
|
+
dims?: number;
|
|
356
|
+
/** Base URL override. */
|
|
357
|
+
baseUrl?: string;
|
|
358
|
+
/** Request timeout in ms. Default: 30000 */
|
|
359
|
+
timeout?: number;
|
|
360
|
+
}
|
|
361
|
+
declare class PerplexityEmbedding implements EmbeddingProvider {
|
|
362
|
+
readonly dims: number;
|
|
363
|
+
private _apiKey;
|
|
364
|
+
private _model;
|
|
365
|
+
private _baseUrl;
|
|
366
|
+
private _requestDims;
|
|
367
|
+
private _timeout;
|
|
368
|
+
constructor(options?: PerplexityEmbeddingOptions);
|
|
369
|
+
embed(text: string): Promise<Float32Array>;
|
|
370
|
+
embedBatch(texts: string[]): Promise<Float32Array[]>;
|
|
371
|
+
close(): Promise<void>;
|
|
372
|
+
private _request;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* BrainBank — Perplexity Contextualized Embedding Provider
|
|
377
|
+
*
|
|
378
|
+
* Uses Perplexity's contextualized embeddings API for document-aware vectors.
|
|
379
|
+
* Chunks from the same document share context, improving retrieval quality.
|
|
380
|
+
*
|
|
381
|
+
* Models: pplx-embed-context-v1-0.6b (1024d), pplx-embed-context-v1-4b (2560d).
|
|
382
|
+
*
|
|
383
|
+
* Key difference from standard: input is string[][] (docs × chunks) and the
|
|
384
|
+
* response has a nested structure. This provider adapts the flat BrainBank
|
|
385
|
+
* EmbeddingProvider interface to the nested Perplexity API:
|
|
386
|
+
* - embed(text) → wraps as [[text]]
|
|
387
|
+
* - embedBatch(texts) → wraps as [texts] (one "document" of related chunks)
|
|
388
|
+
*
|
|
389
|
+
* Usage:
|
|
390
|
+
* const brain = new BrainBank({
|
|
391
|
+
* embeddingProvider: new PerplexityContextEmbedding(),
|
|
392
|
+
* });
|
|
393
|
+
*/
|
|
394
|
+
|
|
395
|
+
interface PerplexityContextEmbeddingOptions {
|
|
396
|
+
/** Perplexity API key. Falls back to PERPLEXITY_API_KEY env var. */
|
|
397
|
+
apiKey?: string;
|
|
398
|
+
/** Model name. Default: 'pplx-embed-context-v1-4b' */
|
|
399
|
+
model?: string;
|
|
400
|
+
/** Vector dimensions (Matryoshka reduction). If omitted, uses model default. */
|
|
401
|
+
dims?: number;
|
|
402
|
+
/** Base URL override. */
|
|
403
|
+
baseUrl?: string;
|
|
404
|
+
/** Request timeout in ms. Default: 30000 */
|
|
405
|
+
timeout?: number;
|
|
406
|
+
}
|
|
407
|
+
declare class PerplexityContextEmbedding implements EmbeddingProvider {
|
|
408
|
+
readonly dims: number;
|
|
409
|
+
private _apiKey;
|
|
410
|
+
private _model;
|
|
411
|
+
private _baseUrl;
|
|
412
|
+
private _requestDims;
|
|
413
|
+
private _timeout;
|
|
414
|
+
constructor(options?: PerplexityContextEmbeddingOptions);
|
|
415
|
+
/** Embed a single text. Wraps as [[text]] for the contextualized API. */
|
|
416
|
+
embed(text: string): Promise<Float32Array>;
|
|
417
|
+
/**
|
|
418
|
+
* Embed multiple texts as chunks of contextualized documents.
|
|
419
|
+
* Splits into sub-documents to stay under Perplexity's 32k token/doc limit.
|
|
420
|
+
*/
|
|
421
|
+
embedBatch(texts: string[]): Promise<Float32Array[]>;
|
|
422
|
+
close(): Promise<void>;
|
|
423
|
+
/** Send a contextualized request. Input is string[][] (docs × chunks). */
|
|
424
|
+
private _request;
|
|
425
|
+
}
|
|
426
|
+
|
|
331
427
|
/**
|
|
332
428
|
* BrainBank — Math Utilities
|
|
333
429
|
*
|
|
@@ -872,4 +968,4 @@ declare class KeywordSearch implements SearchStrategy {
|
|
|
872
968
|
*/
|
|
873
969
|
declare function reciprocalRankFusion(resultSets: SearchResult[][], k?: number, maxResults?: number): SearchResult[];
|
|
874
970
|
|
|
875
|
-
export { KeywordSearch as BM25Search, BrainBank, BrainBankConfig, CoEditAnalyzer, CoEditSuggestion, CodeChunk, CodeChunker, CodeIndexer, Collection, Consolidator, ContextBuilder, ContextOptions, DEFAULTS, DocsIndexer, DocumentCollection, EmbeddingProvider, GitIndexer, HNSWIndex, IGNORE_DIRS, IndexResult, IndexStats, Indexer, KeywordSearch, LearningPattern, LocalEmbedding, VectorSearch as MultiIndexSearch, type NoteDigest, NoteStore, OpenAIEmbedding, type OpenAIEmbeddingOptions, PatternStore, ProgressCallback, type RecallOptions, type ReembedOptions, type ReembedResult, Reranker, ResolvedConfig, SUPPORTED_EXTENSIONS, SearchHit, type SearchOptions, SearchResult, type SearchStrategy, StageProgressCallback, type StoredNote, VectorIndex, VectorSearch, type WatchOptions, type Watcher, cosineSimilarity, getLanguage, isSupported, normalize, reciprocalRankFusion, resolveConfig, searchMMR };
|
|
971
|
+
export { KeywordSearch as BM25Search, BrainBank, BrainBankConfig, CoEditAnalyzer, CoEditSuggestion, CodeChunk, CodeChunker, CodeIndexer, Collection, Consolidator, ContextBuilder, ContextOptions, DEFAULTS, DocsIndexer, DocumentCollection, EmbeddingProvider, GitIndexer, HNSWIndex, IGNORE_DIRS, IndexResult, IndexStats, Indexer, KeywordSearch, LearningPattern, LocalEmbedding, VectorSearch as MultiIndexSearch, type NoteDigest, NoteStore, OpenAIEmbedding, type OpenAIEmbeddingOptions, PatternStore, PerplexityContextEmbedding, type PerplexityContextEmbeddingOptions, PerplexityEmbedding, type PerplexityEmbeddingOptions, ProgressCallback, type RecallOptions, type ReembedOptions, type ReembedResult, Reranker, ResolvedConfig, SUPPORTED_EXTENSIONS, SearchHit, type SearchOptions, SearchResult, type SearchStrategy, StageProgressCallback, type StoredNote, VectorIndex, VectorSearch, type WatchOptions, type Watcher, cosineSimilarity, getLanguage, isSupported, normalize, reciprocalRankFusion, resolveConfig, searchMMR };
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PerplexityContextEmbedding
|
|
3
|
+
} from "./chunk-6XOXM7MI.js";
|
|
4
|
+
import {
|
|
5
|
+
PerplexityEmbedding
|
|
6
|
+
} from "./chunk-N2OJRXSB.js";
|
|
1
7
|
import {
|
|
2
8
|
NoteStore,
|
|
3
9
|
notes
|
|
4
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-HNPABX7L.js";
|
|
5
11
|
import {
|
|
6
12
|
Consolidator,
|
|
7
13
|
PatternStore,
|
|
8
14
|
memory
|
|
9
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-BNV43SEF.js";
|
|
10
16
|
import {
|
|
11
17
|
BrainBank,
|
|
12
18
|
Collection,
|
|
@@ -18,7 +24,7 @@ import {
|
|
|
18
24
|
VectorSearch,
|
|
19
25
|
resolveConfig,
|
|
20
26
|
searchMMR
|
|
21
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-MY36UPPQ.js";
|
|
22
28
|
import {
|
|
23
29
|
CodeChunker,
|
|
24
30
|
CodeIndexer,
|
|
@@ -27,23 +33,23 @@ import {
|
|
|
27
33
|
code,
|
|
28
34
|
getLanguage,
|
|
29
35
|
isSupported
|
|
30
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-DDECTPRM.js";
|
|
31
37
|
import {
|
|
32
38
|
CoEditAnalyzer,
|
|
33
39
|
GitIndexer,
|
|
34
40
|
git
|
|
35
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-TTXVJFAE.js";
|
|
36
42
|
import {
|
|
37
43
|
DocsIndexer,
|
|
38
44
|
docs
|
|
39
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-YRGUIRN5.js";
|
|
40
46
|
import {
|
|
41
47
|
reciprocalRankFusion
|
|
42
|
-
} from "./chunk-
|
|
48
|
+
} from "./chunk-YOLKSYWK.js";
|
|
43
49
|
import {
|
|
44
50
|
cosineSimilarity,
|
|
45
51
|
normalize
|
|
46
|
-
} from "./chunk-
|
|
52
|
+
} from "./chunk-U2Q2XGPZ.js";
|
|
47
53
|
import {
|
|
48
54
|
OpenAIEmbedding
|
|
49
55
|
} from "./chunk-CCXVL56V.js";
|
|
@@ -107,6 +113,8 @@ export {
|
|
|
107
113
|
NoteStore,
|
|
108
114
|
OpenAIEmbedding,
|
|
109
115
|
PatternStore,
|
|
116
|
+
PerplexityContextEmbedding,
|
|
117
|
+
PerplexityEmbedding,
|
|
110
118
|
SUPPORTED_EXTENSIONS,
|
|
111
119
|
VectorSearch,
|
|
112
120
|
code,
|