brainbank 0.5.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.
Files changed (46) hide show
  1. package/README.md +233 -126
  2. package/dist/{base-DZWtdgIf.d.ts → base-3SNc_CeY.d.ts} +24 -24
  3. package/dist/chunk-424UFCY7.js +78 -0
  4. package/dist/chunk-424UFCY7.js.map +1 -0
  5. package/dist/{chunk-HNPABX7L.js → chunk-7EZR47JV.js} +1 -1
  6. package/dist/{chunk-HNPABX7L.js.map → chunk-7EZR47JV.js.map} +1 -1
  7. package/dist/chunk-B77KABWH.js +41 -0
  8. package/dist/chunk-B77KABWH.js.map +1 -0
  9. package/dist/{chunk-MY36UPPQ.js → chunk-DI3H6JVZ.js} +357 -379
  10. package/dist/chunk-DI3H6JVZ.js.map +1 -0
  11. package/dist/{chunk-DDECTPRM.js → chunk-FGL32LUJ.js} +20 -14
  12. package/dist/chunk-FGL32LUJ.js.map +1 -0
  13. package/dist/{chunk-TTXVJFAE.js → chunk-JRSKWF6K.js} +4 -3
  14. package/dist/{chunk-TTXVJFAE.js.map → chunk-JRSKWF6K.js.map} +1 -1
  15. package/dist/{chunk-YRGUIRN5.js → chunk-VQ27YUHH.js} +18 -14
  16. package/dist/chunk-VQ27YUHH.js.map +1 -0
  17. package/dist/{chunk-BNV43SEF.js → chunk-VVXYZIIB.js} +5 -5
  18. package/dist/chunk-VVXYZIIB.js.map +1 -0
  19. package/dist/chunk-ZNLN2VWV.js +110 -0
  20. package/dist/chunk-ZNLN2VWV.js.map +1 -0
  21. package/dist/cli.js +102 -45
  22. package/dist/cli.js.map +1 -1
  23. package/dist/code.d.ts +4 -2
  24. package/dist/code.js +1 -1
  25. package/dist/docs.d.ts +7 -3
  26. package/dist/docs.js +1 -1
  27. package/dist/git.d.ts +4 -2
  28. package/dist/git.js +1 -1
  29. package/dist/index.d.ts +77 -17
  30. package/dist/index.js +21 -9
  31. package/dist/index.js.map +1 -1
  32. package/dist/local-embedding-ZIMTK6PU.js +8 -0
  33. package/dist/local-embedding-ZIMTK6PU.js.map +1 -0
  34. package/dist/memory.d.ts +2 -2
  35. package/dist/memory.js +1 -1
  36. package/dist/notes.d.ts +2 -2
  37. package/dist/notes.js +1 -1
  38. package/dist/qwen3-reranker-3MHEENT5.js +8 -0
  39. package/dist/qwen3-reranker-3MHEENT5.js.map +1 -0
  40. package/dist/resolve-CUJWY6HP.js +10 -0
  41. package/dist/resolve-CUJWY6HP.js.map +1 -0
  42. package/package.json +10 -9
  43. package/dist/chunk-BNV43SEF.js.map +0 -1
  44. package/dist/chunk-DDECTPRM.js.map +0 -1
  45. package/dist/chunk-MY36UPPQ.js.map +0 -1
  46. package/dist/chunk-YRGUIRN5.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\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":";;;;;;;;;;;;;;;;;;;;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;;;ACGtB,YAAY,UAAU;AACtB,YAAY,QAAQ;AAmBpB,IAAM,eAAe,CAAC,aAAa,aAAa,YAAY;AAC5D,IAAM,qBAAqB,CAAC,OAAO,OAAO,MAAM;AAIhD,IAAM,aAAa,uBAAO,YAAY;AACtC,IAAI,eAA8D;AAClE,IAAI,uBAAsD;AAW1D,eAAe,aAAiD;AAC5D,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,QAAO,cAAW,UAAU,GAAG;AAC3B,UAAI;AACA,cAAM,MAAM,MAAM,OAAO;AACzB,uBAAgB,IAAI,WAAW;AAC/B,eAAO;AAAA,MACX,SAAS,KAAU;AACf,gBAAQ,MAAM,EAAE,IAAI,4BAA4B,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;AACvE,gBAAQ,KAAK,CAAC;AAAA,MAClB;AAAA,IACJ;AAAA,EACJ;AAEA,iBAAe;AACf,SAAO;AACX;AAtBe;AA2Bf,eAAe,yBAA6C;AACxD,MAAI,yBAAyB,WAAY,QAAO;AAEhD,QAAM,WAAW,QAAQ,MAAM,KAAK;AACpC,QAAM,cAAmB,aAAQ,UAAU,cAAc,UAAU;AAEnE,MAAI,CAAI,cAAW,WAAW,GAAG;AAC7B,2BAAuB,CAAC;AACxB,WAAO,CAAC;AAAA,EACZ;AAEA,QAAM,QAAW,eAAY,WAAW,EACnC,OAAO,OAAK,mBAAmB,KAAK,SAAO,EAAE,SAAS,GAAG,CAAC,CAAC,EAC3D,KAAK;AAEV,QAAM,WAAsB,CAAC;AAE7B,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,OAAkB;AAAA,MACpC,OAAO;AACH,gBAAQ,MAAM,EAAE,OAAO,UAAK,IAAI,kEAAkE,CAAC;AAAA,MACvG;AAAA,IACJ,SAAS,KAAU;AACf,cAAQ,MAAM,EAAE,IAAI,yBAAyB,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;AAAA,IACxE;AAAA,EACJ;AAEA,yBAAuB;AACvB,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,uBAAuB;AAEpD,QAAM,YAAiC,EAAE,UAAU,IAAI,GAAI,QAAQ,aAAa,CAAC,EAAG;AACpF,QAAM,eAAe,SAAS;AAE9B,QAAM,QAAQ,IAAI,UAAU,SAAS;AACrC,QAAM,WAAW,QAAQ,YAAY,CAAC,QAAQ,OAAO,MAAM;AAC3D,mBAAiB,OAAO,IAAI,QAAQ;AAEpC,aAAW,WAAW,eAAgB,OAAM,IAAI,OAAO;AACvD,MAAI,QAAQ,UAAU;AAClB,eAAW,WAAW,OAAO,SAAU,OAAM,IAAI,OAAO;AAAA,EAC5D;AAEA,SAAO;AACX;AAlBsB;AAqBtB,eAAe,eAAe,WAA+C;AACzE,QAAM,eAAe,QAAQ,UAAU;AACvC,MAAI,iBAAiB,SAAS;AAC1B,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,qBAAqB;AAC5D,cAAU,WAAW,IAAI,cAAc;AAAA,EAC3C;AAEA,MAAI,QAAQ,IAAI,wBAAwB,UAAU;AAC9C,UAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,gCAA6C;AACtF,UAAM,WAAW,IAAI,gBAAgB;AACrC,cAAU,oBAAoB;AAC9B,cAAU,gBAAgB,SAAS;AAAA,EACvC,WAAW,QAAQ,IAAI,wBAAwB,cAAc;AACzD,UAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,oCAAiD;AAC9F,UAAM,WAAW,IAAI,oBAAoB;AACzC,cAAU,oBAAoB;AAC9B,cAAU,gBAAgB,SAAS;AAAA,EACvC,WAAW,QAAQ,IAAI,wBAAwB,sBAAsB;AACjE,UAAM,EAAE,2BAA2B,IAAI,MAAM,OAAO,4CAAyD;AAC7G,UAAM,WAAW,IAAI,2BAA2B;AAChD,cAAU,oBAAoB;AAC9B,cAAU,gBAAgB,SAAS;AAAA,EACvC;AACJ;AAvBe;AA0Bf,SAAS,iBACL,OAAkB,IAAY,UAC1B;AACJ,QAAM,aAAkB,aAAQ,EAAE;AAClC,QAAM,aAAgB,cAAgB,UAAK,YAAY,MAAM,CAAC;AAC9D,QAAM,aAAa,CAAC,aAAa,iBAAiB,UAAU,IAAI,CAAC;AAEjE,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,EAAG,OAAM,IAAI,KAAK,EAAE,UAAU,IAAI,MAAM,MAAM,QAAQ,IAAI,IAAI,GAAG,CAAC,CAAC;AAC/F,UAAI,SAAS,SAAS,KAAK,EAAG,OAAM,IAAI,IAAI,EAAE,UAAU,IAAI,MAAM,MAAM,OAAO,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,IAChG;AAAA,EACJ,OAAO;AACH,QAAI,SAAS,SAAS,MAAM,EAAG,OAAM,IAAI,KAAK,EAAE,UAAU,GAAG,CAAC,CAAC;AAC/D,QAAI,SAAS,SAAS,KAAK,EAAG,OAAM,IAAI,IAAI,CAAC;AAAA,EACjD;AAEA,MAAI,SAAS,SAAS,MAAM,EAAG,OAAM,IAAI,KAAK,CAAC;AACnD;AAnBS;;;AD1KT,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,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;AAvEsB;;;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,UAAU,CAAC,KAAK,MAAM,SAAS,KAAK,IAAI,CAAC;AAAA,CAAI;AAErE,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"]}
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 { I as Indexer } from './base-DZWtdgIf.js';
1
+ import { E as EmbeddingProvider, P as Plugin } from './base-3SNc_CeY.js';
2
2
  import 'better-sqlite3';
3
3
 
4
4
  /**
@@ -24,8 +24,10 @@ 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
- declare function code(opts?: CodePluginOptions): Indexer;
31
+ declare function code(opts?: CodePluginOptions): Plugin;
30
32
 
31
33
  export { type CodePluginOptions, code };
package/dist/code.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  code
3
- } from "./chunk-DDECTPRM.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 { I as Indexer } from './base-DZWtdgIf.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(): Indexer;
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-YRGUIRN5.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 { I as Indexer } from './base-DZWtdgIf.js';
1
+ import { E as EmbeddingProvider, P as Plugin } from './base-3SNc_CeY.js';
2
2
  import 'better-sqlite3';
3
3
 
4
4
  /**
@@ -24,8 +24,10 @@ 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
- declare function git(opts?: GitPluginOptions): Indexer;
31
+ declare function git(opts?: GitPluginOptions): Plugin;
30
32
 
31
33
  export { type GitPluginOptions, git };
package/dist/git.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  git
3
- } from "./chunk-TTXVJFAE.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 { 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';
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';
@@ -76,7 +76,7 @@ interface ReembedOptions {
76
76
  * BrainBank — Main Orchestrator
77
77
  *
78
78
  * Thin facade that composes four services:
79
- * IndexerRegistry — registration + lookup
79
+ * PluginRegistry — registration + lookup
80
80
  * Initializer — two-phase startup (earlyInit / lateInit)
81
81
  * SearchAPI — all search + context logic
82
82
  * IndexAPI — code / git / docs indexing orchestration
@@ -101,17 +101,17 @@ declare class BrainBank extends EventEmitter {
101
101
  private _sharedHnsw;
102
102
  constructor(config?: BrainBankConfig);
103
103
  /**
104
- * Register an indexer. Chainable.
104
+ * Register a plugin. Chainable.
105
105
  *
106
106
  * brain.use(code({ repoPath: '.' })).use(docs());
107
107
  */
108
- use(indexer: Indexer): this;
109
- /** Get the list of registered indexer names. */
110
- get indexers(): string[];
111
- /** Check if an indexer is loaded. Also matches type prefix (e.g. 'code' matches 'code:frontend'). */
108
+ use(plugin: Plugin): this;
109
+ /** Get the list of registered plugin names. */
110
+ get plugins(): string[];
111
+ /** Check if a plugin is loaded. Also matches type prefix (e.g. 'code' matches 'code:frontend'). */
112
112
  has(name: string): boolean;
113
- /** Get an indexer instance. Throws if not loaded. */
114
- indexer<T extends Indexer = Indexer>(n: string): T;
113
+ /** Get a plugin instance. Throws if not loaded. */
114
+ plugin<T extends Plugin = Plugin>(n: string): T;
115
115
  /**
116
116
  * Initialize database, HNSW indices, and load existing vectors.
117
117
  * Only initializes registered modules.
@@ -442,6 +442,65 @@ declare function cosineSimilarity(a: Float32Array, b: Float32Array): number;
442
442
  */
443
443
  declare function normalize(vec: Float32Array): Float32Array;
444
444
 
445
+ /**
446
+ * BrainBank — Qwen3 Local Reranker
447
+ *
448
+ * Cross-encoder reranker using Qwen3-Reranker-0.6B via node-llama-cpp.
449
+ * Auto-downloads the GGUF model from HuggingFace (~640MB, cached).
450
+ *
451
+ * Based on QMD's reranker architecture:
452
+ * - Lazy model loading (loads on first rank() call)
453
+ * - Flash attention for 20× less VRAM
454
+ * - Document deduplication (identical texts scored once)
455
+ * - Tokenizer-based truncation for oversized documents
456
+ */
457
+
458
+ interface Qwen3RerankerOptions {
459
+ /** HuggingFace model URI. Default: Qwen3-Reranker-0.6B-Q8_0 */
460
+ modelUri?: string;
461
+ /** Model cache directory. Default: ~/.cache/brainbank/models/ */
462
+ cacheDir?: string;
463
+ /** Context size for ranking. Default: 2048 */
464
+ contextSize?: number;
465
+ }
466
+ declare class Qwen3Reranker implements Reranker {
467
+ private readonly _modelUri;
468
+ private readonly _cacheDir;
469
+ private readonly _contextSize;
470
+ private _model;
471
+ private _context;
472
+ private _loadPromise;
473
+ constructor(options?: Qwen3RerankerOptions);
474
+ /**
475
+ * Lazy-load the reranker model and create a ranking context.
476
+ * Model is auto-downloaded from HuggingFace on first use.
477
+ */
478
+ private _ensureLoaded;
479
+ /**
480
+ * Score each document's relevance to the query.
481
+ * Returns scores (0.0 - 1.0) in same order as input documents.
482
+ *
483
+ * Deduplicates identical documents to avoid redundant computation.
484
+ */
485
+ rank(query: string, documents: string[]): Promise<number[]>;
486
+ /** Release model resources. */
487
+ close(): Promise<void>;
488
+ }
489
+
490
+ /**
491
+ * BrainBank — Embedding Provider Resolver
492
+ *
493
+ * Resolves an EmbeddingProvider from a stored key string.
494
+ * Used by the Initializer to auto-resolve from DB config.
495
+ */
496
+
497
+ /** Known embedding provider keys. */
498
+ type EmbeddingKey = 'local' | 'openai' | 'perplexity' | 'perplexity-context';
499
+ /** Resolve an EmbeddingProvider from a key string. Lazy-loads the provider module. */
500
+ declare function resolveEmbedding(key: string): Promise<EmbeddingProvider>;
501
+ /** Infer a stable key from an existing provider instance. */
502
+ declare function providerKey(p: EmbeddingProvider): EmbeddingKey;
503
+
445
504
  declare const DEFAULTS: ResolvedConfig;
446
505
  /**
447
506
  * Merge partial config with defaults.
@@ -492,11 +551,12 @@ declare class CodeChunker {
492
551
  constructor(config?: ChunkerConfig);
493
552
  /** Lazy-init tree-sitter parser. */
494
553
  private _ensureParser;
495
- /** Load a language grammar (cached). */
554
+ /** Load a language grammar (cached). Throws if grammar package is not installed. */
496
555
  private _loadGrammar;
497
556
  /**
498
557
  * Split file content into semantic chunks using tree-sitter AST.
499
- * Falls back to sliding window if grammar isn't available.
558
+ * Throws if the language has a grammar but the package isn't installed.
559
+ * Falls back to sliding window only for truly unsupported languages.
500
560
  */
501
561
  chunk(filePath: string, content: string, language: string): Promise<CodeChunk[]>;
502
562
  /** Walk AST and extract top-level semantic blocks. */
@@ -530,7 +590,7 @@ declare class CodeChunker {
530
590
  * Incremental: only re-indexes files that changed (by content hash).
531
591
  */
532
592
 
533
- interface CodeIndexerDeps {
593
+ interface CodeWalkerDeps {
534
594
  db: Database;
535
595
  hnsw: HNSWIndex;
536
596
  vectorCache: Map<number, Float32Array>;
@@ -540,12 +600,12 @@ interface CodeIndexOptions {
540
600
  forceReindex?: boolean;
541
601
  onProgress?: ProgressCallback;
542
602
  }
543
- declare class CodeIndexer {
603
+ declare class CodeWalker {
544
604
  private _chunker;
545
605
  private _deps;
546
606
  private _repoPath;
547
607
  private _maxFileSize;
548
- constructor(repoPath: string, deps: CodeIndexerDeps, maxFileSize?: number);
608
+ constructor(repoPath: string, deps: CodeWalkerDeps, maxFileSize?: number);
549
609
  /** Index all supported files. Skips unchanged files (same content hash). */
550
610
  index(options?: CodeIndexOptions): Promise<IndexResult>;
551
611
  /** Remove old chunks and their HNSW vectors for a file. */
@@ -647,7 +707,7 @@ declare class DocsIndexer {
647
707
  /** Split document into chunks at natural markdown boundaries. */
648
708
  private _smartChunk;
649
709
  /** Handle the last chunk: merge if too small, otherwise push. */
650
- private _pushLastChunk;
710
+ private _flushRemainder;
651
711
  /** Find the best break position within the target window. */
652
712
  private _findBestBreak;
653
713
  /** Find all potential break points in the document with scores. */
@@ -968,4 +1028,4 @@ declare class KeywordSearch implements SearchStrategy {
968
1028
  */
969
1029
  declare function reciprocalRankFusion(resultSets: SearchResult[][], k?: number, maxResults?: number): SearchResult[];
970
1030
 
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 };
1031
+ export { KeywordSearch as BM25Search, BrainBank, BrainBankConfig, CoEditAnalyzer, CoEditSuggestion, CodeChunk, CodeChunker, CodeWalker, Collection, Consolidator, ContextBuilder, ContextOptions, DEFAULTS, DocsIndexer, DocumentCollection, type EmbeddingKey, EmbeddingProvider, GitIndexer, HNSWIndex, IGNORE_DIRS, IndexResult, IndexStats, KeywordSearch, LearningPattern, LocalEmbedding, VectorSearch as MultiIndexSearch, type NoteDigest, NoteStore, OpenAIEmbedding, type OpenAIEmbeddingOptions, PatternStore, PerplexityContextEmbedding, type PerplexityContextEmbeddingOptions, PerplexityEmbedding, type PerplexityEmbeddingOptions, Plugin, ProgressCallback, Qwen3Reranker, type Qwen3RerankerOptions, 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, providerKey, reciprocalRankFusion, resolveConfig, resolveEmbedding, searchMMR };