brainbank 0.1.0-beta.1

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 (137) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +155 -0
  3. package/assets/architecture.png +0 -0
  4. package/bin/brainbank +18 -0
  5. package/bin/brainbank-mcp +19 -0
  6. package/dist/chunk-3YBCD6DI.js +117 -0
  7. package/dist/chunk-3YBCD6DI.js.map +1 -0
  8. package/dist/chunk-63GBCDS5.js +3249 -0
  9. package/dist/chunk-63GBCDS5.js.map +1 -0
  10. package/dist/chunk-DMFMTOHF.js +123 -0
  11. package/dist/chunk-DMFMTOHF.js.map +1 -0
  12. package/dist/chunk-FQYKWB2Q.js +136 -0
  13. package/dist/chunk-FQYKWB2Q.js.map +1 -0
  14. package/dist/chunk-IMJJ2VEM.js +74 -0
  15. package/dist/chunk-IMJJ2VEM.js.map +1 -0
  16. package/dist/chunk-M744PCJQ.js +43 -0
  17. package/dist/chunk-M744PCJQ.js.map +1 -0
  18. package/dist/chunk-O3J6ZIXK.js +82 -0
  19. package/dist/chunk-O3J6ZIXK.js.map +1 -0
  20. package/dist/chunk-OPH7GZ7U.js +124 -0
  21. package/dist/chunk-OPH7GZ7U.js.map +1 -0
  22. package/dist/chunk-PXEWQMN7.js +89 -0
  23. package/dist/chunk-PXEWQMN7.js.map +1 -0
  24. package/dist/chunk-RDQYDLYZ.js +69 -0
  25. package/dist/chunk-RDQYDLYZ.js.map +1 -0
  26. package/dist/chunk-VIIHPCC4.js +254 -0
  27. package/dist/chunk-VIIHPCC4.js.map +1 -0
  28. package/dist/chunk-WCQVDF3K.js +14 -0
  29. package/dist/chunk-WCQVDF3K.js.map +1 -0
  30. package/dist/cli.d.ts +1 -0
  31. package/dist/cli.js +3076 -0
  32. package/dist/cli.js.map +1 -0
  33. package/dist/haiku-expander-YRSIPGKP.js +8 -0
  34. package/dist/haiku-expander-YRSIPGKP.js.map +1 -0
  35. package/dist/haiku-pruner-SHAXUPY6.js +8 -0
  36. package/dist/haiku-pruner-SHAXUPY6.js.map +1 -0
  37. package/dist/http-server-QUXHLWUM.js +9 -0
  38. package/dist/http-server-QUXHLWUM.js.map +1 -0
  39. package/dist/index.d.ts +2161 -0
  40. package/dist/index.js +357 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/local-embedding-NZQTILGV.js +8 -0
  43. package/dist/local-embedding-NZQTILGV.js.map +1 -0
  44. package/dist/mcp.d.ts +2 -0
  45. package/dist/mcp.js +334 -0
  46. package/dist/mcp.js.map +1 -0
  47. package/dist/openai-embedding-ZP5TSUJG.js +8 -0
  48. package/dist/openai-embedding-ZP5TSUJG.js.map +1 -0
  49. package/dist/perplexity-context-embedding-GI5PHE6X.js +9 -0
  50. package/dist/perplexity-context-embedding-GI5PHE6X.js.map +1 -0
  51. package/dist/perplexity-embedding-KZRYGJRC.js +10 -0
  52. package/dist/perplexity-embedding-KZRYGJRC.js.map +1 -0
  53. package/dist/plugin-IKQ6IRSJ.js +32 -0
  54. package/dist/plugin-IKQ6IRSJ.js.map +1 -0
  55. package/dist/resolve-ASGLBNUC.js +10 -0
  56. package/dist/resolve-ASGLBNUC.js.map +1 -0
  57. package/dist/stats-tui-ZY2NQSEA.js +1904 -0
  58. package/dist/stats-tui-ZY2NQSEA.js.map +1 -0
  59. package/package.json +96 -0
  60. package/src/brainbank.ts +617 -0
  61. package/src/cli/commands/collection.ts +77 -0
  62. package/src/cli/commands/context.ts +179 -0
  63. package/src/cli/commands/daemon.ts +100 -0
  64. package/src/cli/commands/docs.ts +71 -0
  65. package/src/cli/commands/files.ts +69 -0
  66. package/src/cli/commands/help.ts +77 -0
  67. package/src/cli/commands/index.ts +482 -0
  68. package/src/cli/commands/kv.ts +140 -0
  69. package/src/cli/commands/mcp-export.ts +273 -0
  70. package/src/cli/commands/mcp.ts +6 -0
  71. package/src/cli/commands/reembed.ts +30 -0
  72. package/src/cli/commands/scan.ts +336 -0
  73. package/src/cli/commands/search.ts +203 -0
  74. package/src/cli/commands/stats.ts +68 -0
  75. package/src/cli/commands/status.ts +47 -0
  76. package/src/cli/commands/watch.ts +47 -0
  77. package/src/cli/factory/brain-context.ts +43 -0
  78. package/src/cli/factory/builtin-registration.ts +87 -0
  79. package/src/cli/factory/config-loader.ts +77 -0
  80. package/src/cli/factory/index.ts +69 -0
  81. package/src/cli/factory/plugin-loader.ts +325 -0
  82. package/src/cli/index.ts +71 -0
  83. package/src/cli/server-client.ts +178 -0
  84. package/src/cli/tui/index-tui.tsx +667 -0
  85. package/src/cli/tui/stats-data.ts +523 -0
  86. package/src/cli/tui/stats-search.ts +262 -0
  87. package/src/cli/tui/stats-tui.tsx +1465 -0
  88. package/src/cli/tui/tree-scanner.ts +650 -0
  89. package/src/cli/utils.ts +137 -0
  90. package/src/config.ts +49 -0
  91. package/src/constants.ts +21 -0
  92. package/src/db/adapter.ts +112 -0
  93. package/src/db/metadata.ts +130 -0
  94. package/src/db/migrations.ts +66 -0
  95. package/src/db/sqlite-adapter.ts +218 -0
  96. package/src/db/tracker.ts +91 -0
  97. package/src/engine/index-api.ts +81 -0
  98. package/src/engine/reembed.ts +206 -0
  99. package/src/engine/search-api.ts +218 -0
  100. package/src/index.ts +154 -0
  101. package/src/lib/fts.ts +57 -0
  102. package/src/lib/languages.ts +180 -0
  103. package/src/lib/logger.ts +126 -0
  104. package/src/lib/math.ts +87 -0
  105. package/src/lib/provider-key.ts +20 -0
  106. package/src/lib/prune.ts +71 -0
  107. package/src/lib/rrf.ts +133 -0
  108. package/src/lib/write-lock.ts +108 -0
  109. package/src/mcp/mcp-server.ts +195 -0
  110. package/src/mcp/workspace-factory.ts +68 -0
  111. package/src/mcp/workspace-pool.ts +224 -0
  112. package/src/plugin.ts +381 -0
  113. package/src/providers/embeddings/embedding-worker-thread.ts +95 -0
  114. package/src/providers/embeddings/embedding-worker.ts +141 -0
  115. package/src/providers/embeddings/local-embedding.ts +115 -0
  116. package/src/providers/embeddings/openai-embedding.ts +167 -0
  117. package/src/providers/embeddings/perplexity-context-embedding.ts +195 -0
  118. package/src/providers/embeddings/perplexity-embedding.ts +165 -0
  119. package/src/providers/embeddings/resolve.ts +34 -0
  120. package/src/providers/pruners/haiku-expander.ts +166 -0
  121. package/src/providers/pruners/haiku-pruner.ts +112 -0
  122. package/src/providers/vector/hnsw-index.ts +174 -0
  123. package/src/providers/vector/hnsw-loader.ts +129 -0
  124. package/src/search/bm25-boost.ts +69 -0
  125. package/src/search/context-builder.ts +251 -0
  126. package/src/search/keyword/composite-bm25-search.ts +47 -0
  127. package/src/search/types.ts +37 -0
  128. package/src/search/vector/composite-vector-search.ts +61 -0
  129. package/src/search/vector/mmr.ts +64 -0
  130. package/src/services/collection.ts +384 -0
  131. package/src/services/daemon.ts +87 -0
  132. package/src/services/http-server.ts +336 -0
  133. package/src/services/kv-service.ts +64 -0
  134. package/src/services/plugin-registry.ts +77 -0
  135. package/src/services/watch.ts +340 -0
  136. package/src/services/webhook-server.ts +100 -0
  137. package/src/types.ts +493 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/index.ts","../src/cli/commands/mcp-export.ts","../src/cli/commands/scan.ts","../src/cli/tui/index-tui.tsx","../src/cli/tui/tree-scanner.ts","../src/cli/commands/collection.ts","../src/cli/commands/kv.ts","../src/cli/commands/docs.ts","../src/cli/server-client.ts","../src/cli/commands/search.ts","../src/cli/commands/context.ts","../src/cli/commands/files.ts","../src/cli/commands/stats.ts","../src/cli/commands/reembed.ts","../src/cli/commands/watch.ts","../src/cli/commands/mcp.ts","../src/cli/commands/daemon.ts","../src/cli/commands/status.ts","../src/cli/commands/help.ts","../src/cli/index.ts"],"sourcesContent":["/**\n * brainbank index [path] — Interactive scan → select → index\n *\n * Scans the repo first, shows an interactive TUI with directory tree\n * for folder selection, then indexes. Use --yes to skip the TUI.\n */\n\nimport type { ScanResult, ScanModule } from './scan.ts';\nimport type { PreviewLine } from '@/cli/tui/tree-scanner.ts';\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { c, args, getFlag, hasFlag, stripFlags } from '@/cli/utils.ts';\nimport { createBrain, getConfig, registerConfigCollections, contextFromCLI } from '@/cli/factory/index.ts';\nimport { discoverExternalPlugins } from '@/cli/factory/plugin-loader.ts';\nimport { findDocsPlugin } from '@/cli/utils.ts';\nimport { autoExportMcp } from './mcp-export.ts';\nimport { scanRepo } from './scan.ts';\nimport { runIndexTui } from '@/cli/tui/index-tui.tsx';\n\nexport async function cmdIndex(): Promise<void> {\n const positional = stripFlags(args);\n const repoPath = positional[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 skipPrompt = hasFlag('yes') || hasFlag('y');\n const forceSetup = hasFlag('setup');\n\n\n const scan = scanRepo(repoPath);\n\n // Discover external (non-built-in) plugins from config and .brainbank/plugins/\n const configPlugins = scan.config.plugins ?? [];\n const externalDiscovery = await discoverExternalPlugins(repoPath, configPlugins);\n let externalPreviews: Map<string, PreviewLine[]> = externalDiscovery.previews;\n\n // Merge external modules into scan result\n if (externalDiscovery.modules.length > 0) {\n scan.modules = [...scan.modules, ...externalDiscovery.modules];\n }\n\n let modules: string[];\n let tuiInclude: string[] = [];\n let tuiIgnore: string[] = [];\n let tuiConfig: { embedding: string; pruner: string; expander: string } | undefined;\n\n if (onlyRaw) {\n // --only flag: explicit module selection\n printIndexHeader(scan, depth);\n modules = onlyRaw.split(',').map(s => s.trim());\n } else if (scan.config.plugins && scan.config.plugins.length > 0 && !forceSetup) {\n // Config exists with plugins field — skip TUI, index directly\n printIndexHeader(scan, depth);\n modules = scan.config.plugins;\n } else if (skipPrompt) {\n printIndexHeader(scan, depth);\n modules = buildDefaultModules(scan);\n } else {\n // ── Interactive TUI ──\n const selection = await runIndexTui(scan, externalPreviews);\n if (!selection) {\n console.log(c.dim('\\n Cancelled. Exiting.\\n'));\n return;\n }\n modules = selection.modules;\n tuiInclude = selection.include;\n tuiIgnore = selection.ignore;\n tuiConfig = selection.config;\n\n if (modules.length === 0) {\n console.log(c.dim('\\n Nothing selected. Exiting.\\n'));\n return;\n }\n\n // ── Deindex removed modules ──\n const oldPlugins = scan.config.plugins ?? [];\n const removed = oldPlugins.filter(p => !modules.includes(p));\n if (removed.length > 0) {\n console.log(c.bold('\\n━━━ Deindexing ━━━\\n'));\n for (const mod of removed) {\n console.log(` ${c.yellow('✗')} Removing ${mod} data...`);\n deindexModule(scan.repoPath, mod);\n console.log(` ${c.green('✓')} ${mod} data cleared`);\n }\n }\n\n // Show selection summary\n console.log(c.bold('\\n━━━ BrainBank ━━━\\n'));\n console.log(' Selected modules:');\n for (const m of modules) {\n console.log(` ${c.green('✓')} ${m}`);\n }\n if (tuiInclude.length > 0) {\n console.log(` Include: ${c.cyan(tuiInclude.join(', '))}`);\n }\n if (tuiIgnore.length > 0) {\n console.log(` Ignore: ${c.yellow(tuiIgnore.join(', '))}`);\n }\n console.log('');\n }\n\n // If --docs is passed, auto-include 'docs' in modules\n if (docsPath && !modules.includes('docs')) {\n modules.push('docs');\n }\n\n // Save config from TUI selection — only when TUI actually ran\n // NEVER rewrite config on headless runs (existing config + no --setup)\n if (tuiConfig) {\n // New config (first run) — save everything\n saveConfigFromTui(scan.repoPath, modules, tuiConfig.embedding, tuiConfig.pruner, tuiConfig.expander, tuiInclude, tuiIgnore);\n } else if (tuiInclude.length > 0 || tuiIgnore.length > 0) {\n // TUI ran with existing config and user changed selections — update patterns only\n updateConfigPlugins(scan.repoPath, modules, tuiInclude, tuiIgnore);\n }\n // If neither condition is true, config already exists and TUI didn't run — don't touch it\n\n\n console.log(c.bold(`\\n━━━ Indexing: ${modules.join(', ')} ━━━`));\n\n // Build brain context, injecting TUI-selected include/ignore patterns\n const ctx = contextFromCLI(repoPath);\n if (tuiInclude.length > 0 && !ctx.flags?.include) {\n ctx.flags = { ...ctx.flags, include: tuiInclude.join(',') };\n }\n if (tuiIgnore.length > 0 && !ctx.flags?.ignore) {\n ctx.flags = { ...ctx.flags, ignore: tuiIgnore.join(',') };\n }\n const brain = await createBrain(ctx);\n await brain.initialize();\n\n const config = await getConfig(repoPath);\n await registerConfigCollections(brain, repoPath, config);\n\n if (docsPath) {\n const absDocsPath = path.resolve(docsPath);\n const collName = path.basename(absDocsPath);\n try {\n const docsPlugin = findDocsPlugin(brain);\n await docsPlugin?.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 pluginOptions: { depth },\n onProgress: (stage, msg) => {\n process.stdout.write(`\\r ${c.cyan(stage.toUpperCase())} ${msg} `);\n },\n });\n\n console.log('\\n');\n\n // ── Changes summary ──\n console.log(c.bold('\\n━━━ Changes ━━━\\n'));\n let hasChanges = false;\n for (const [name, value] of Object.entries(result)) {\n if (!value) continue;\n const v = value as Record<string, unknown>;\n if (typeof v.indexed !== 'number') { console.log(` ${c.green('✓')} ${name}: done`); continue; }\n\n const indexed = v.indexed as number;\n const skipped = (v.skipped ?? 0) as number;\n const removed = (v.removed ?? 0) as number;\n const chunks = (v.chunks ?? 0) as number;\n\n if (indexed > 0 || removed > 0) hasChanges = true;\n\n const parts: string[] = [];\n if (indexed > 0) parts.push(c.green(`+${indexed} files (${chunks} chunks)`));\n if (removed > 0) parts.push(c.red(`−${removed} files`));\n if (skipped > 0) parts.push(c.dim(`${skipped} unchanged`));\n\n console.log(` ${c.bold(name)}: ${parts.join(' ')}`);\n }\n if (!hasChanges) {\n console.log(c.dim(' No changes — everything up to date'));\n }\n\n const stats = brain.stats();\n console.log(`\\n ${c.bold('Totals')}:`);\n for (const [name, s] of Object.entries(stats)) {\n if (!s || typeof s !== 'object') continue;\n const entries = Object.entries(s as Record<string, unknown>)\n .map(([k, v]) => `${k}: ${v}`)\n .join(', ');\n console.log(` ${name}: ${entries}`);\n }\n\n brain.close();\n\n // Auto-export MCP config to Antigravity if detected and not already configured\n await autoExportMcp(repoPath);\n}\n\n\n/** Compact header for headless (non-TUI) index runs. Validates include/ignore paths. */\nfunction printIndexHeader(scan: ScanResult, _depth: number): void {\n console.log(c.bold('\\n━━━ BrainBank ━━━'));\n console.log(c.dim(` ${scan.repoPath}\\n`));\n\n // Show plugins\n const plugins = scan.config.plugins ?? [];\n console.log(` Plugins: ${c.cyan(plugins.join(', '))}`);\n\n // Validate and show include patterns\n if (scan.config.include?.length) {\n console.log('');\n for (const pattern of scan.config.include) {\n const exists = validatePattern(scan.repoPath, pattern);\n const icon = exists ? c.green('✓') : c.red('✗');\n const label = exists ? c.dim(pattern) : c.red(pattern);\n console.log(` ${icon} ${label}`);\n }\n }\n\n // Validate and show ignore patterns\n if (scan.config.ignore?.length) {\n console.log('');\n console.log(c.dim(' Ignore:'));\n for (const pattern of scan.config.ignore) {\n console.log(` ${c.yellow('─')} ${c.dim(pattern)}`);\n }\n }\n\n // DB info\n if (scan.db?.exists) {\n const ago = scan.db.lastModified ? timeSince(scan.db.lastModified) : '';\n console.log(c.dim(`\\n DB: ${scan.db.sizeMB} MB${ago ? `, last indexed ${ago}` : ''}`));\n }\n console.log('');\n}\n\n/** Check if a glob pattern's base directory exists on disk. */\nfunction validatePattern(repoPath: string, pattern: string): boolean {\n // Strip trailing /** or /* or glob chars\n const base = pattern.replace(/\\/\\*\\*$/, '').replace(/\\/\\*$/, '');\n const absPath = path.join(repoPath, base);\n try {\n fs.statSync(absPath);\n return true;\n } catch {\n return false;\n }\n}\n\n\n/** Build the default list of available modules based on scan. */\nfunction buildDefaultModules(scan: ScanResult): string[] {\n return scan.modules.filter(m => m.available && m.checked).map(m => m.name);\n}\n\n\nfunction timeSince(date: Date): string {\n const seconds = Math.floor((Date.now() - date.getTime()) / 1000);\n if (seconds < 60) return 'just now';\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n\n/** Capitalize first letter. */\nfunction capitalizeFirst(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\n/** Common doc folder names to auto-detect for docs plugin. */\nconst DOC_FOLDERS = ['docs', 'doc', 'wiki', 'documentation', 'guides', 'notes'];\n\n/** Auto-detect document collections in a repo. Scans for common doc folders + README. */\nfunction autoDetectDocCollections(repoPath: string): { name: string; path: string; pattern: string; context?: string }[] {\n const resolved = path.resolve(repoPath);\n const collections: { name: string; path: string; pattern: string; context?: string }[] = [];\n\n for (const folder of DOC_FOLDERS) {\n const absPath = path.join(resolved, folder);\n try {\n const stat = fs.statSync(absPath);\n if (stat.isDirectory()) {\n // Check it actually contains markdown files\n const entries = fs.readdirSync(absPath, { recursive: true }) as string[];\n const hasMd = entries.some(e => typeof e === 'string' && /\\.md$/i.test(e));\n if (hasMd) {\n collections.push({\n name: folder,\n path: folder,\n pattern: '**/*.md',\n context: `${folder} directory`,\n });\n }\n }\n } catch {\n // Folder doesn't exist — skip\n }\n }\n\n return collections;\n}\n\n/** Save config.json from TUI selections (no interactive prompts). */\nfunction saveConfigFromTui(\n repoPath: string, modules: string[], embedding: string, pruner: string, expander: string,\n include: string[], ignore: string[],\n): void {\n const configDir = path.join(repoPath, '.brainbank');\n const configPath = path.join(configDir, 'config.json');\n\n const config: Record<string, unknown> = {\n plugins: modules,\n embedding,\n };\n\n if (pruner !== 'none') {\n config.pruner = pruner;\n }\n\n if (expander !== 'none') {\n config.expander = expander;\n }\n\n // Save include/ignore from tree selection\n if (include.length > 0) {\n config.include = include;\n }\n if (ignore.length > 0) {\n config.ignore = ignore;\n }\n\n // Auto-detect doc collections when docs plugin is selected\n if (modules.includes('docs')) {\n const collections = autoDetectDocCollections(repoPath);\n if (collections.length > 0) {\n config.docs = { collections };\n console.log(c.dim(` Auto-detected docs: ${collections.map(dc => dc.name).join(', ')}`));\n }\n }\n\n // Auto-detect API keys from environment\n const detectedKeys: Record<string, string> = {};\n const needsPerplexity = embedding.startsWith('perplexity');\n const needsAnthropic = pruner === 'haiku' || expander === 'haiku';\n const needsOpenai = embedding === 'openai';\n\n if (needsPerplexity && process.env.PERPLEXITY_API_KEY) {\n detectedKeys.perplexity = process.env.PERPLEXITY_API_KEY;\n }\n if (needsAnthropic && process.env.ANTHROPIC_API_KEY) {\n detectedKeys.anthropic = process.env.ANTHROPIC_API_KEY;\n }\n if (needsOpenai && process.env.OPENAI_API_KEY) {\n detectedKeys.openai = process.env.OPENAI_API_KEY;\n }\n\n if (Object.keys(detectedKeys).length > 0) {\n config.keys = detectedKeys;\n }\n\n fs.mkdirSync(configDir, { recursive: true });\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n');\n console.log(c.green(` ✓ Saved ${path.relative(process.cwd(), configPath)}`));\n}\n\n\n/** Update plugins, include, and ignore in an existing config.json. */\nfunction updateConfigPlugins(repoPath: string, modules: string[], include: string[], ignore: string[]): void {\n const configPath = path.join(repoPath, '.brainbank', 'config.json');\n try {\n const raw = fs.readFileSync(configPath, 'utf-8');\n const config = JSON.parse(raw) as Record<string, unknown>;\n config.plugins = modules;\n\n // Update include/ignore — set if present, remove if empty\n if (include.length > 0) {\n config.include = include;\n } else {\n delete config.include;\n }\n if (ignore.length > 0) {\n config.ignore = ignore;\n } else {\n delete config.ignore;\n }\n\n // Auto-detect doc collections when docs is newly added and none exist\n if (modules.includes('docs')) {\n const existing = config.docs as Record<string, unknown> | undefined;\n const hasCollections = existing && Array.isArray(existing.collections) && existing.collections.length > 0;\n if (!hasCollections) {\n const collections = autoDetectDocCollections(repoPath);\n if (collections.length > 0) {\n config.docs = { ...(existing ?? {}), collections };\n console.log(c.dim(` Auto-detected docs: ${collections.map(dc => dc.name).join(', ')}`));\n }\n }\n }\n\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n');\n console.log(c.green(` ✓ Updated config.json`));\n } catch {\n // Config doesn't exist or is corrupt — skip\n }\n}\n\n\n/**\n * Clear all indexed data for a specific module from the DB.\n * Opens the SQLite database directly and drops module-specific rows.\n */\nfunction deindexModule(repoPath: string, moduleName: string): void {\n const dbPath = path.join(repoPath, '.brainbank', 'data', 'brainbank.db');\n if (!fs.existsSync(dbPath)) return;\n\n // Simple interface — we only need exec() and close()\n interface SimpleDB { exec(sql: string): void; close(): void }\n\n let db: SimpleDB | undefined;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const sqlite = require('node:sqlite') as { DatabaseSync: new (path: string) => SimpleDB };\n db = new sqlite.DatabaseSync(dbPath);\n } catch {\n console.log(c.yellow(` Could not open DB — skip deindex for ${moduleName}`));\n return;\n }\n\n if (!db) return;\n\n const tables: Record<string, string[]> = {\n code: [\n 'DELETE FROM code_call_edges',\n 'DELETE FROM code_refs',\n 'DELETE FROM code_symbols',\n 'DELETE FROM code_imports',\n 'DELETE FROM code_vectors',\n 'DELETE FROM code_chunks',\n 'DELETE FROM indexed_files',\n \"DELETE FROM plugin_tracking WHERE plugin = 'code'\",\n ],\n docs: [\n 'DELETE FROM doc_vectors',\n 'DELETE FROM doc_chunks',\n 'DELETE FROM path_contexts',\n 'DELETE FROM collections',\n \"DELETE FROM plugin_tracking WHERE plugin = 'docs'\",\n ],\n git: [\n 'DELETE FROM git_vectors',\n 'DELETE FROM git_commits',\n \"DELETE FROM plugin_tracking WHERE plugin = 'git'\",\n ],\n };\n\n const statements = tables[moduleName];\n if (!statements) {\n console.log(c.dim(` No known tables for ${moduleName}`));\n try { db.close(); } catch { /* ignore */ }\n return;\n }\n\n for (const sql of statements) {\n try { db.exec(sql); }\n catch { /* Table might not exist — that's fine */ }\n }\n\n try { db.close(); } catch { /* ignore */ }\n}\n\n\n","/**\n * brainbank mcp:export [target] — Export MCP server config for AI IDEs.\n *\n * Generates the MCP server config block for brainbank and merges it into\n * the target IDE's config file. Currently supports: antigravity.\n *\n * Detects: node path, cli.js path, API keys from config or env vars.\n */\n\nimport type { ProjectConfig } from '@/cli/factory/config-loader.ts';\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { c, args, getFlag } from '@/cli/utils.ts';\nimport { getConfig } from '@/cli/factory/index.ts';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/** Supported export targets and their config file paths. */\nconst TARGETS: Record<string, { configPath: string; label: string }> = {\n antigravity: {\n configPath: path.join(process.env.HOME ?? '~', '.gemini', 'antigravity', 'mcp_config.json'),\n label: 'Gemini Antigravity',\n },\n};\n\ninterface McpServerConfig {\n command: string;\n args: string[];\n env?: Record<string, string>;\n cwd?: string;\n}\n\ninterface McpConfig {\n mcpServers: Record<string, McpServerConfig>;\n}\n\n/**\n * Build the brainbank MCP server config block.\n * Resolves node binary, dist/cli.js path, and API keys.\n */\nfunction buildBrainbankMcpBlock(config: ProjectConfig | null): McpServerConfig {\n const nodeBin = process.execPath;\n\n // Resolve dist/cli.js from the global install location (node_prefix/lib/node_modules/brainbank/dist/cli.js)\n const globalCliJs = path.join(path.dirname(nodeBin), '..', 'lib', 'node_modules', 'brainbank', 'dist', 'cli.js');\n // Fallback: relative to this file (dev / npm link)\n const localCliJs = path.resolve(__dirname, '..', '..', 'dist', 'cli.js');\n const resolvedCliJs = fs.existsSync(globalCliJs) ? globalCliJs : localCliJs;\n\n const env: Record<string, string> = {};\n\n // Resolve API keys: config.keys > env vars\n const keys = config?.keys;\n const perplexityKey = keys?.perplexity ?? process.env.PERPLEXITY_API_KEY;\n const anthropicKey = keys?.anthropic ?? process.env.ANTHROPIC_API_KEY;\n const openaiKey = keys?.openai ?? process.env.OPENAI_API_KEY;\n\n if (perplexityKey) env.PERPLEXITY_API_KEY = perplexityKey;\n if (anthropicKey) env.ANTHROPIC_API_KEY = anthropicKey;\n if (openaiKey) env.OPENAI_API_KEY = openaiKey;\n\n const block: McpServerConfig = {\n command: nodeBin,\n args: ['--disable-warning=ExperimentalWarning', resolvedCliJs, 'mcp'],\n };\n\n if (Object.keys(env).length > 0) {\n block.env = env;\n }\n\n return block;\n}\n\n/**\n * Load existing MCP config, merge brainbank entry, and write back.\n * Preserves all other server entries.\n */\nfunction mergeAndWrite(targetPath: string, block: McpServerConfig): { created: boolean } {\n let existing: McpConfig = { mcpServers: {} };\n const created = !fs.existsSync(targetPath);\n\n if (!created) {\n try {\n const raw = fs.readFileSync(targetPath, 'utf-8');\n existing = JSON.parse(raw) as McpConfig;\n if (!existing.mcpServers) existing.mcpServers = {};\n } catch {\n // Corrupt or empty file — start fresh\n existing = { mcpServers: {} };\n }\n }\n\n existing.mcpServers.brainbank = block;\n\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\n fs.writeFileSync(targetPath, JSON.stringify(existing, null, 2) + '\\n');\n\n return { created };\n}\n\n/** Check if an MCP config already has a brainbank entry. */\nexport function hasBrainbankMcpEntry(targetPath: string): boolean {\n if (!fs.existsSync(targetPath)) return false;\n try {\n const raw = fs.readFileSync(targetPath, 'utf-8');\n const config = JSON.parse(raw) as McpConfig;\n return !!config.mcpServers?.brainbank;\n } catch {\n return false;\n }\n}\n\n/** Auto-export: called after index when Antigravity is detected. */\nexport async function autoExportMcp(repoPath: string): Promise<void> {\n const target = TARGETS.antigravity;\n if (!target) return;\n\n // Only auto-export if Antigravity dir exists\n const antigravityDir = path.dirname(target.configPath);\n if (!fs.existsSync(antigravityDir)) return;\n\n // Only auto-export if brainbank isn't already configured\n if (hasBrainbankMcpEntry(target.configPath)) return;\n\n const config = await getConfig(repoPath);\n const block = buildBrainbankMcpBlock(config);\n mergeAndWrite(target.configPath, block);\n console.log(` ${c.green('✓')} Exported MCP config to ${c.dim(path.relative(process.env.HOME ?? '', target.configPath))}`);\n}\n\n// ── GEMINI.md BrainBank Section ──────────────────────────────\n\nconst BRAINBANK_SECTION_MARKER = '<!-- brainbank:start -->';\nconst BRAINBANK_SECTION_END = '<!-- brainbank:end -->';\n\n/** Global GEMINI.md path — ~/.gemini/GEMINI.md (shared across all projects). */\nconst GLOBAL_GEMINI = path.join(process.env.HOME ?? '~', '.gemini', 'GEMINI.md');\n\nfunction buildGeminiSection(): string {\n return `${BRAINBANK_SECTION_MARKER}\n\n## BrainBank — Code Intelligence\n\n**\\`brainbank_context\\`** — semantic code discovery. Use it **only** when you need to understand functionality that spans multiple files (e.g. \"how does auth work\", \"notification pipeline\"). \\`repo\\` is **required**.\n\n**Do NOT use it for:** finding a specific string, variable, function name, or exact match — use \\`grep_search\\` for that. BrainBank is for *understanding context*, not for *locating text*.\n\n**Params:** \\`compact: false\\`, \\`sources: { code: 25, docs: 0, git: 0 }\\`. Only add \\`docs\\` when the user explicitly asks about documentation.\n\n### Output handling — MANDATORY\n\nBrainBank may return results **inline** or save them to an **output file**:\n\n- **Inline:** read and proceed normally.\n- **File result** (saved to \\`output.txt\\`): you **MUST STOP IMMEDIATELY**. Show the path as a clickable link, ask the user to paste, then **DO NOT PROCEED**:\n\n 📋 Output: [output.txt](file:///path/to/output.txt) — _\"Could you paste the context output here?\"_\n\n **NEVER** read the file yourself. **NEVER** continue working. Wait for the user to paste the content. This is not optional.\n\n${BRAINBANK_SECTION_END}\n`;\n}\n\n/** Check if GEMINI.md already has the brainbank section. */\nfunction hasGeminiSection(geminiPath: string): boolean {\n if (!fs.existsSync(geminiPath)) return false;\n const content = fs.readFileSync(geminiPath, 'utf-8');\n return content.includes(BRAINBANK_SECTION_MARKER);\n}\n\n/** Append BrainBank section to GEMINI.md (creates if doesn't exist). */\nfunction appendGeminiSection(geminiPath: string): void {\n const section = buildGeminiSection();\n if (fs.existsSync(geminiPath)) {\n fs.appendFileSync(geminiPath, section);\n } else {\n fs.writeFileSync(geminiPath, `# GEMINI.md\\n${section}`);\n }\n}\n\n/** Replace BrainBank section between markers in GEMINI.md. */\nfunction replaceGeminiSection(geminiPath: string): void {\n const content = fs.readFileSync(geminiPath, 'utf-8');\n const startIdx = content.indexOf(BRAINBANK_SECTION_MARKER);\n const endIdx = content.indexOf(BRAINBANK_SECTION_END);\n if (startIdx === -1 || endIdx === -1) return;\n\n const before = content.slice(0, startIdx);\n const after = content.slice(endIdx + BRAINBANK_SECTION_END.length);\n const section = buildGeminiSection();\n fs.writeFileSync(geminiPath, before + section + after);\n}\n\n/** CLI command: brainbank mcp:export [target] [--force] */\nexport async function cmdMcpExport(): Promise<void> {\n const targetName = args[1] || getFlag('target') || 'antigravity';\n const repoPath = getFlag('repo') || '.';\n const force = args.includes('--force') || args.includes('-f');\n\n const target = TARGETS[targetName];\n if (!target) {\n console.error(c.red(`Unknown export target: ${targetName}`));\n console.error(c.dim(` Available: ${Object.keys(TARGETS).join(', ')}`));\n process.exit(1);\n }\n\n const config = await getConfig(repoPath);\n const block = buildBrainbankMcpBlock(config);\n\n console.log(c.bold(`\\n━━━ MCP Export: ${target.label} ━━━\\n`));\n\n // ── MCP Config ────────────────────────────────────────────\n const mcpExists = hasBrainbankMcpEntry(target.configPath);\n let writeMcp = true;\n\n if (mcpExists && !force) {\n console.log(` ${c.yellow('●')} MCP config already has brainbank entry`);\n const cliPath = block.args.find(a => !a.startsWith('--')) ?? block.args[0];\n console.log(` ${c.dim(' New:')} ${block.command} ${cliPath}`);\n const envKeys = block.env ? Object.keys(block.env) : [];\n if (envKeys.length > 0) console.log(` ${c.dim(' Keys:')} ${envKeys.join(', ')}`);\n const { confirm } = await import('@inquirer/prompts');\n writeMcp = await confirm({ message: 'Override existing brainbank MCP entry?', default: true });\n }\n\n if (writeMcp) {\n const { created } = mergeAndWrite(target.configPath, block);\n console.log(` ${c.green('✓')} ${created ? 'Created' : 'Updated'} ${c.dim(target.configPath)}`);\n } else {\n console.log(` ${c.dim('MCP config — skipped')}`);\n }\n\n // ── Global GEMINI.md (~/.gemini/GEMINI.md) ────────────────\n const geminiHasSection = hasGeminiSection(GLOBAL_GEMINI);\n\n if (geminiHasSection) {\n if (force) {\n replaceGeminiSection(GLOBAL_GEMINI);\n console.log(` ${c.green('✓')} Replaced BrainBank section in ${c.dim('~/.gemini/GEMINI.md')}`);\n } else {\n console.log(` ${c.yellow('●')} ~/.gemini/GEMINI.md already has BrainBank section`);\n const { confirm } = await import('@inquirer/prompts');\n const override = await confirm({ message: 'Override existing BrainBank section?', default: false });\n if (override) {\n replaceGeminiSection(GLOBAL_GEMINI);\n console.log(` ${c.green('✓')} Replaced BrainBank section in ${c.dim('~/.gemini/GEMINI.md')}`);\n } else {\n console.log(` ${c.dim('GEMINI.md — skipped')}`);\n }\n }\n } else {\n if (force) {\n appendGeminiSection(GLOBAL_GEMINI);\n console.log(` ${c.green('✓')} Added BrainBank section to ${c.dim('~/.gemini/GEMINI.md')}`);\n } else {\n const { confirm } = await import('@inquirer/prompts');\n const addGemini = await confirm({\n message: 'Add BrainBank instructions to ~/.gemini/GEMINI.md? (teaches AI tools how to use BrainBank)',\n default: true,\n });\n if (addGemini) {\n appendGeminiSection(GLOBAL_GEMINI);\n console.log(` ${c.green('✓')} Added BrainBank section to ${c.dim('~/.gemini/GEMINI.md')}`);\n }\n }\n }\n\n console.log(`\\n ${c.dim('Restart your IDE to apply changes.')}\\n`);\n}\n","/**\n * brainbank scan — Lightweight repo scanner for the interactive index flow.\n *\n * Scans the filesystem WITHOUT initializing BrainBank. Returns a ScanResult\n * describing what's available to index via dynamic ScanModule descriptors.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { execSync } from 'node:child_process';\nimport picomatch from 'picomatch';\nimport { SUPPORTED_EXTENSIONS, isIgnoredDir, isIgnoredFile } from '@/lib/languages.ts';\n\n\n/** A single scannable module (plugin). */\nexport interface ScanModule {\n /** Plugin name (e.g. 'code', 'git', 'docs'). */\n name: string;\n /** Whether there's content available to index. */\n available: boolean;\n /** Human-readable summary (e.g. '1243 files (5 languages)'). */\n summary: string;\n /** Emoji icon for display. */\n icon: string;\n /** Whether checked by default in the prompt. */\n checked: boolean;\n /** Reason this module is disabled (shown in prompt). */\n disabled?: string;\n /** Detail lines for the scan tree (e.g. per-language breakdown). */\n details?: string[];\n}\n\nexport interface ScanResult {\n repoPath: string;\n modules: ScanModule[];\n config: { exists: boolean; ignore?: string[]; include?: string[]; plugins?: string[] };\n db: { exists: boolean; sizeMB: number; lastModified?: Date } | null;\n}\n\n\n/** Scan a repo path and return what's available to index. */\nexport function scanRepo(repoPath: string): ScanResult {\n const resolved = path.resolve(repoPath);\n const config = scanConfig(resolved);\n\n return {\n repoPath: resolved,\n modules: scanModules(resolved, config),\n config,\n db: scanDb(resolved),\n };\n}\n\n/** Produce ScanModule descriptors for known plugin types. */\nfunction scanModules(repoPath: string, config: ScanResult['config']): ScanModule[] {\n return [\n scanCodeModule(repoPath, config.include, config.ignore),\n scanGitModule(repoPath),\n scanDocsModule(repoPath),\n ];\n}\n\n\n/** Scan for indexable code files. Respects include/ignore from config. */\nfunction scanCodeModule(repoPath: string, include?: string[], ignore?: string[]): ScanModule {\n const byLanguage = new Map<string, number>();\n let total = 0;\n\n // Build matchers from config patterns\n let isIncluded: ((p: string) => boolean) | null = null;\n let isIgnoredPat: ((p: string) => boolean) | null = null;\n let includeBases: string[] | null = null;\n if (include?.length) {\n isIncluded = picomatch(include, { dot: true });\n includeBases = include.map(p => picomatch.scan(p).base).filter(b => b && b !== '.');\n }\n if (ignore?.length) isIgnoredPat = picomatch(ignore, { dot: true });\n\n function walk(dir: string): void {\n let entries: fs.Dirent[];\n try { entries = fs.readdirSync(dir, { withFileTypes: true }); }\n catch { return; }\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const isDir = entry.isDirectory() || (entry.isSymbolicLink() && (() => { try { return fs.statSync(fullPath).isDirectory(); } catch { return false; } })());\n if (isDir) {\n if (isIgnoredDir(entry.name)) continue;\n // Early prune: if include bases are set, skip dirs that can't match\n if (includeBases && includeBases.length > 0) {\n const relDir = path.relative(repoPath, fullPath);\n const canMatch = includeBases.some(base =>\n relDir.startsWith(base) || base.startsWith(relDir),\n );\n if (!canMatch) continue;\n }\n walk(fullPath);\n } else if (entry.isFile()) {\n if (isIgnoredFile(entry.name)) continue;\n const ext = path.extname(entry.name).toLowerCase();\n const lang = SUPPORTED_EXTENSIONS[ext];\n if (!lang) continue;\n\n // Apply include/ignore filters using relative path\n const rel = path.relative(repoPath, fullPath);\n if (isIncluded && !isIncluded(rel)) continue;\n if (isIgnoredPat && isIgnoredPat(rel)) continue;\n\n byLanguage.set(lang, (byLanguage.get(lang) ?? 0) + 1);\n total++;\n }\n }\n }\n\n walk(repoPath);\n\n if (total === 0) {\n return { name: 'code', available: false, summary: 'no supported source files found', icon: '📁', checked: false, disabled: 'nothing to index' };\n }\n\n const langCount = byLanguage.size;\n const sorted = [...byLanguage.entries()].sort((a, b) => b[1] - a[1]);\n const maxShow = 7;\n const shown = sorted.slice(0, maxShow);\n const remaining = sorted.length - maxShow;\n\n const details: string[] = [];\n for (let i = 0; i < shown.length; i++) {\n const [lang, count] = shown[i];\n const isLast = i === shown.length - 1 && remaining <= 0;\n const prefix = isLast ? '└──' : '├──';\n details.push(`${prefix} ${lang.padEnd(14)} ${count} files`);\n }\n if (remaining > 0) {\n details.push(`└── ...and ${remaining} more`);\n }\n\n return {\n name: 'code',\n available: true,\n summary: `${total} files (${langCount} language${langCount > 1 ? 's' : ''})`,\n icon: '📁',\n checked: true,\n details,\n };\n}\n\n/** Scan for git history. */\nfunction scanGitModule(repoPath: string): ScanModule {\n const stats = scanGitStats(repoPath);\n\n if (!stats) {\n return { name: 'git', available: false, summary: 'no .git directory found', icon: '📜', checked: false, disabled: 'not a git repo' };\n }\n\n const details: string[] = [];\n if (stats.lastMessage) {\n details.push(`Last: ${stats.lastMessage} (${stats.lastDate})`);\n }\n\n return {\n name: 'git',\n available: true,\n summary: `${stats.commitCount.toLocaleString()} commits`,\n icon: '📜',\n checked: true,\n details,\n };\n}\n\n/** Scan for document collections. */\nfunction scanDocsModule(repoPath: string): ScanModule {\n const collections = scanDocsCollections(repoPath);\n\n if (collections.length === 0) {\n return { name: 'docs', available: false, summary: 'no documents found', icon: '📄', checked: false, disabled: 'no .md/.mdx files' };\n }\n\n const totalFiles = collections.reduce((s, d) => s + d.fileCount, 0);\n const details = collections.map((d, i) => {\n const isLast = i === collections.length - 1;\n const prefix = isLast ? '└──' : '├──';\n return `${prefix} ${d.name.padEnd(10)} → ${d.path} (${d.fileCount} files)`;\n });\n\n return {\n name: 'docs',\n available: true,\n summary: `${collections.length} collection${collections.length > 1 ? 's' : ''} (${totalFiles} files)`,\n icon: '📄',\n checked: true,\n details,\n };\n}\n\n\n/** Get git stats for this repo. */\nfunction scanGitStats(repoPath: string): { commitCount: number; lastMessage: string; lastDate: string } | null {\n if (!fs.existsSync(path.join(repoPath, '.git'))) return null;\n return gitStats(repoPath);\n}\n\n/** Get git stats for a single directory. */\nfunction gitStats(dir: string): { commitCount: number; lastMessage: string; lastDate: string } | null {\n try {\n const count = parseInt(execSync('git rev-list --count HEAD', { cwd: dir, encoding: 'utf-8' }).trim(), 10);\n const log = execSync('git log -1 --format=\"%s|%ar\"', { cwd: dir, encoding: 'utf-8' }).trim();\n const [lastMessage, lastDate] = log.split('|');\n return { commitCount: count, lastMessage: lastMessage ?? '', lastDate: lastDate ?? '' };\n } catch {\n return null;\n }\n}\n\n/** Scan for document collections (config + auto-detect). */\nfunction scanDocsCollections(repoPath: string): { name: string; path: string; fileCount: number }[] {\n const results: { name: string; path: string; fileCount: number }[] = [];\n const seen = new Set<string>();\n\n // 1. Read explicit collections from config.json\n const configPath = path.join(repoPath, '.brainbank', 'config.json');\n try {\n if (fs.existsSync(configPath)) {\n const config = JSON.parse(fs.readFileSync(configPath, 'utf-8')) as Record<string, unknown>;\n const docsCfg = config?.docs as Record<string, unknown> | undefined;\n const collections = docsCfg?.collections as { name: string; path: string }[] | undefined;\n if (collections) {\n for (const coll of collections) {\n const absPath = path.resolve(repoPath, coll.path);\n results.push({ name: coll.name, path: coll.path, fileCount: countDocs(absPath) });\n seen.add(absPath);\n }\n }\n }\n } catch {}\n\n // 2. Auto-detect .md/.mdx in the repo root and top-level dirs\n const rootDocs = countDocsShallow(repoPath);\n if (rootDocs > 0) {\n results.push({ name: '(root)', path: '.', fileCount: rootDocs });\n }\n\n try {\n for (const entry of fs.readdirSync(repoPath, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n if (isIgnoredDir(entry.name)) continue;\n if (entry.name.startsWith('.')) continue;\n\n const dirPath = path.join(repoPath, entry.name);\n if (seen.has(dirPath)) continue;\n\n const count = countDocs(dirPath);\n if (count > 0) {\n results.push({ name: entry.name, path: `./${entry.name}`, fileCount: count });\n }\n }\n } catch {}\n\n return results;\n}\n\n/** Count .md/.mdx files recursively in a directory. */\nfunction countDocs(dir: string): number {\n let count = 0;\n try {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n const ePath = path.join(dir, e.name);\n const isDir = e.isDirectory() || (e.isSymbolicLink() && (() => { try { return fs.statSync(ePath).isDirectory(); } catch { return false; } })());\n if (isDir) {\n if (isIgnoredDir(e.name)) continue;\n count += countDocs(ePath);\n } else if ((e.isFile() || e.isSymbolicLink()) && /\\.mdx?$/i.test(e.name)) {\n count++;\n }\n }\n } catch {}\n return count;\n}\n\n/** Count .md/.mdx files in a directory (non-recursive, root level only). */\nfunction countDocsShallow(dir: string): number {\n let count = 0;\n try {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isFile() && /\\.mdx?$/i.test(e.name)) count++;\n }\n } catch {}\n return count;\n}\n\n/** Check if config.json exists and read key fields. */\nfunction scanConfig(repoPath: string): ScanResult['config'] {\n const configPath = path.join(repoPath, '.brainbank', 'config.json');\n if (!fs.existsSync(configPath)) return { exists: false };\n\n try {\n const config = JSON.parse(fs.readFileSync(configPath, 'utf-8')) as Record<string, unknown>;\n const codeCfg = config?.code as Record<string, unknown> | undefined;\n\n // Merge root-level and per-plugin include/ignore\n const rootInclude = config?.include as string[] | undefined;\n const rootIgnore = config?.ignore as string[] | undefined;\n const pluginInclude = codeCfg?.include as string[] | undefined;\n const pluginIgnore = codeCfg?.ignore as string[] | undefined;\n\n const include = [...(rootInclude ?? []), ...(pluginInclude ?? [])];\n const ignore = [...(rootIgnore ?? []), ...(pluginIgnore ?? [])];\n\n return {\n exists: true,\n ignore: ignore.length > 0 ? ignore : undefined,\n include: include.length > 0 ? include : undefined,\n plugins: config?.plugins as string[] | undefined,\n };\n } catch {\n return { exists: false };\n }\n}\n\n/** Check DB existence and size. */\nfunction scanDb(repoPath: string): ScanResult['db'] {\n const dbPath = path.join(repoPath, '.brainbank', 'data', 'brainbank.db');\n if (!fs.existsSync(dbPath)) return { exists: false, sizeMB: 0 };\n\n try {\n const stat = fs.statSync(dbPath);\n return {\n exists: true,\n sizeMB: Math.round(stat.size / 1024 / 1024 * 10) / 10,\n lastModified: stat.mtime,\n };\n } catch {\n return { exists: false, sizeMB: 0 };\n }\n}\n\n","/**\n * index-tui.tsx — Interactive Ink TUI for `brainbank index`.\n *\n * Split-panel layout:\n * Left: Module sidebar (Tab to focus, Space toggle)\n * Right: Interactive file explorer (↑↓ navigate, Space toggle dirs)\n *\n * Phase 2: Config setup (embedding + pruner) — only if no config.json.\n */\n\nimport React, { useState, useMemo, useCallback, useEffect, useRef } from 'react';\nimport { render, Box, Text, useApp, useInput, useStdout } from 'ink';\nimport type { ScanResult } from '@/cli/commands/scan.ts';\nimport {\n buildFileTree, expandDir, collapseDir, toggleDir, toggleFile, setAllDirs,\n generatePatternsFromTree, countTotalFiles, getExtColor,\n scanDocsPreview, scanGitPreview,\n} from './tree-scanner.ts';\nimport type { FileTreeItem, PreviewLine } from './tree-scanner.ts';\n\n\n// ── Types ──────────────────────────────────────────────\n\nexport interface TuiSelection {\n modules: string[];\n include: string[];\n ignore: string[];\n config?: { embedding: string; pruner: string; expander: string };\n}\n\ntype Phase = 'main' | 'config';\ntype Pane = 'modules' | 'tree';\n\nconst MAX_W = 90;\nconst MAX_H = 36;\n\n\n// ── Colors ─────────────────────────────────────────────\n\nconst C = {\n aurora: '#7AA2F7',\n success: '#9ECE6A',\n error: '#F7768E',\n warning: '#E0AF68',\n dim: '#565F89',\n text: '#C0CAF5',\n border: '#3B4261',\n cyan: '#7DCFFF',\n dir: '#E0AF68',\n} as const;\n\n\n// ── Extension badges ──────────────────────────────────\n\nconst EXT_BADGES: Record<string, string> = {\n '.ts': 'TS', '.tsx': 'TX', '.js': 'JS', '.jsx': 'JX', '.mjs': 'JS',\n '.py': 'PY', '.go': 'GO', '.rs': 'RS', '.rb': 'RB', '.java': 'JV',\n '.c': 'C ', '.cpp': 'C+', '.h': 'H ', '.cs': 'C#', '.php': 'PH',\n '.swift': 'SW', '.kt': 'KT', '.lua': 'LU', '.zig': 'ZG',\n '.css': 'CS', '.scss': 'SC', '.html': 'HT', '.vue': 'VU', '.svelte': 'SV',\n '.json': '{}', '.yaml': 'YM', '.yml': 'YM', '.toml': 'TM',\n '.md': 'MD', '.sql': 'SQ', '.sh': 'SH', '.bash': 'SH', '.zsh': 'SH',\n};\nfunction extBadge(ext: string): string { return EXT_BADGES[ext] ?? '··'; }\n\n\n// ── Embedding / Pruner ─────────────────────────────────\n\ninterface OptionItem { value: string; label: string; desc: string; badge?: string }\n\nconst EMBEDDINGS: OptionItem[] = [\n { value: 'perplexity-context', label: 'perplexity-context', desc: 'best accuracy', badge: '★' },\n { value: 'perplexity', label: 'perplexity', desc: 'fast, high quality' },\n { value: 'openai', label: 'openai', desc: 'text-embedding-3-small' },\n { value: 'local', label: 'local', desc: 'offline, no API key' },\n];\n\nconst PRUNERS: OptionItem[] = [\n { value: 'haiku', label: 'haiku', desc: 'AI-powered noise filter', badge: '★' },\n { value: 'none', label: 'none', desc: 'no pruning' },\n];\n\nconst EXPANDERS: OptionItem[] = [\n { value: 'haiku', label: 'haiku', desc: 'discovers related context', badge: '★' },\n { value: 'none', label: 'none', desc: 'no expansion' },\n];\n\n\n// ── Center-cursor scroll (Aurora pattern) ─────────────\n\nfunction centerScroll(cursor: number, total: number, viewH: number): number {\n if (total <= viewH) return 0;\n const half = Math.floor(viewH / 2);\n const offset = Math.max(0, cursor - half);\n return Math.min(offset, total - viewH);\n}\n\n\n// ── Tree Row ──────────────────────────────────────────\n\nfunction TreeItemRow({ item, isCursor }: {\n item: FileTreeItem; isCursor: boolean;\n}): React.ReactNode {\n const indent = ' '.repeat(item.depth);\n const excluded = !item.checked;\n const ptr = isCursor ? '▸ ' : ' ';\n\n if (item.isDir) {\n const arrow = item.expanded ? '▾' : '▸';\n const check = item.checked ? '✓' : '✗';\n const checkColor = item.checked ? C.success : C.error;\n const nameColor = excluded ? C.dim : isCursor ? C.aurora : C.dir;\n const count = String(item.fileCount);\n\n return (\n <Box height={1} justifyContent=\"space-between\">\n <Text wrap=\"truncate\">\n <Text color={isCursor ? C.aurora : C.dim}>{ptr}</Text>\n <Text>{indent}</Text>\n <Text color={C.dim}>{arrow} </Text>\n <Text color={checkColor} bold>{check} </Text>\n <Text color={nameColor} bold={isCursor}>{item.name}/</Text>\n </Text>\n <Text color={C.dim}>{count}</Text>\n </Box>\n );\n }\n\n const check = item.checked ? '✓' : '✗';\n const checkColor = item.checked ? C.success : C.error;\n\n return (\n <Box height={1}>\n <Text wrap=\"truncate\">\n <Text color={isCursor ? C.aurora : C.dim}>{ptr}</Text>\n <Text>{indent}</Text>\n <Text color={checkColor}>{check} </Text>\n <Text color={excluded ? C.dim : getExtColor(item.ext)}>{item.name}</Text>\n </Text>\n </Box>\n );\n}\n\n\n// ── Main Screen (sidebar + tree) ──────────────────────\n\nfunction MainScreen({ scan, width, height, onConfirm, externalPreviews }: {\n scan: ScanResult; width: number; height: number;\n onConfirm: (modules: string[], include: string[], ignore: string[]) => void;\n externalPreviews?: Map<string, PreviewLine[]>;\n}): React.ReactNode {\n const { exit } = useApp();\n const allMods = scan.modules;\n\n // Pane focus\n const [pane, setPane] = useState<Pane>('modules');\n\n // Module state — pre-populate from config if plugins exist\n const [checked, setChecked] = useState<Set<string>>(() => {\n const configPlugins = scan.config.plugins;\n if (configPlugins && configPlugins.length > 0) {\n // --setup: match existing config selection\n return new Set(configPlugins.filter(p => allMods.some(m => m.name === p)));\n }\n // Fresh: check all available modules\n return new Set(allMods.filter(m => m.available && m.checked).map(m => m.name));\n });\n const firstAvail = allMods.findIndex(m => m.available);\n const [modCursor, setModCursor] = useState(Math.max(0, firstAvail));\n\n // Tree state — pre-populate checked from config include patterns\n const [treeItems, setTreeItems] = useState<FileTreeItem[]>(() => buildFileTree(scan.repoPath, scan.config.include));\n const [treeCursor, setTreeCursor] = useState(0);\n\n // Filter mode — '/' to activate, Esc to clear\n // Use ref so useInput always reads the latest value (avoids React batching lag)\n const [filterText, setFilterText] = useState('');\n const [isFiltering, setIsFiltering] = useState(false);\n const isFilteringRef = useRef(false);\n const startFiltering = useCallback(() => {\n isFilteringRef.current = true;\n setIsFiltering(true);\n setFilterText('');\n setTreeCursor(0);\n }, []);\n const stopFiltering = useCallback(() => {\n isFilteringRef.current = false;\n setIsFiltering(false);\n setFilterText('');\n setTreeCursor(0);\n }, []);\n\n // Docs & Git preview (lazy, memoized)\n const docsPreview = useMemo(() => scanDocsPreview(scan.repoPath), [scan.repoPath]);\n const gitPreview = useMemo(() => scanGitPreview(scan.repoPath), [scan.repoPath]);\n\n // Merged preview data: external previews override built-in for same name\n const allPreviews = useMemo(() => {\n const map = new Map<string, PreviewLine[]>();\n map.set('docs', docsPreview);\n map.set('git', gitPreview);\n if (externalPreviews) {\n for (const [name, lines] of externalPreviews) {\n map.set(name, lines);\n }\n }\n return map;\n }, [docsPreview, gitPreview, externalPreviews]);\n\n // Which module is focused determines Explorer content\n const focusedModName = allMods[modCursor]?.name ?? 'code';\n\n // Panel height = total height - header(3) - footer(2) - borders\n const panelH = Math.max(6, height - 7);\n const treeViewH = Math.max(3, panelH - 4); // border(2) + title(1) + title margin(1)\n\n // Module nav (skip disabled)\n const modUp = () => setModCursor(p => {\n for (let i = p - 1; i >= 0; i--) if (allMods[i]!.available) return i;\n return p;\n });\n const modDown = () => setModCursor(p => {\n for (let i = p + 1; i < allMods.length; i++) if (allMods[i]!.available) return i;\n return p;\n });\n\n useInput((input, key) => {\n const filtering = isFilteringRef.current;\n\n if (key.escape) {\n if (filtering || filterText) {\n stopFiltering();\n return;\n }\n exit(); return;\n }\n if (input === 'q' && !filtering) { exit(); return; }\n if (key.tab && !filtering) { setPane(p => p === 'modules' ? 'tree' : 'modules'); return; }\n\n if (key.return) {\n if (filtering) {\n // Confirm filter, stop typing mode but keep filter text\n isFilteringRef.current = false;\n setIsFiltering(false);\n return;\n }\n const selected = [...checked];\n if (selected.length === 0) return;\n const patterns = generatePatternsFromTree(treeItems, scan.config.include);\n onConfirm(selected, patterns.include, patterns.ignore);\n return;\n }\n\n // ── Modules pane ──\n if (pane === 'modules') {\n if (key.upArrow || input === 'k') { modUp(); return; }\n if (key.downArrow || input === 'j') { modDown(); return; }\n if (input === ' ') {\n const mod = allMods[modCursor];\n if (!mod?.available) return;\n setChecked(prev => {\n const next = new Set(prev);\n if (next.has(mod.name)) next.delete(mod.name); else next.add(mod.name);\n return next;\n });\n return;\n }\n }\n\n // ── Tree pane ──\n if (pane === 'tree') {\n // Filter mode input handling\n if (filtering) {\n if (key.backspace || key.delete) {\n setFilterText(prev => prev.slice(0, -1));\n setTreeCursor(0);\n return;\n }\n if (input && !key.upArrow && !key.downArrow && !key.leftArrow && !key.rightArrow) {\n setFilterText(prev => prev + input);\n setTreeCursor(0);\n return;\n }\n }\n\n // '/' to enter filter mode (instant via ref)\n if (input === '/' && !filtering) {\n startFiltering();\n return;\n }\n\n if (key.upArrow || (!filtering && input === 'k')) {\n setTreeCursor(p => Math.max(0, p - 1));\n return;\n }\n if (key.downArrow || (!filtering && input === 'j')) {\n setTreeCursor(p => Math.min(filteredItems.length - 1, p + 1));\n return;\n }\n if (key.rightArrow || (!filtering && input === 'l')) {\n const item = filteredItems[treeCursor];\n if (item?.isDir && !item.expanded) {\n setTreeItems(prev => expandDir(prev, prev.indexOf(item), scan.repoPath));\n }\n return;\n }\n if (key.leftArrow || (!filtering && input === 'h')) {\n const item = filteredItems[treeCursor];\n if (item?.isDir && item.expanded) {\n setTreeItems(prev => collapseDir(prev, prev.indexOf(item)));\n }\n return;\n }\n if (input === ' ') {\n const item = filteredItems[treeCursor];\n if (!item) return;\n const realIdx = treeItems.indexOf(item);\n if (realIdx < 0) return;\n if (item.isDir) setTreeItems(prev => toggleDir(prev, realIdx));\n else setTreeItems(prev => toggleFile(prev, realIdx));\n return;\n }\n if (!filtering && input === 'a') { setTreeItems(prev => setAllDirs(prev, true)); return; }\n if (!filtering && input === 'n') { setTreeItems(prev => setAllDirs(prev, false)); return; }\n if (!filtering && input === 'i') {\n setTreeItems(prev => prev.map(it => ({ ...it, checked: !it.checked })));\n return;\n }\n }\n });\n\n // Filtered tree items — show matching files + their parent dirs\n const filteredItems = useMemo(() => {\n if (!filterText) return treeItems;\n const lower = filterText.toLowerCase();\n const matchedPaths = new Set<string>();\n // Find direct matches\n for (const item of treeItems) {\n if (item.name.toLowerCase().includes(lower)) {\n matchedPaths.add(item.path);\n // Add all ancestor dirs\n const parts = item.path.split('/');\n for (let i = 1; i < parts.length; i++) {\n matchedPaths.add(parts.slice(0, i).join('/'));\n }\n }\n }\n return treeItems.filter(item => matchedPaths.has(item.path));\n }, [treeItems, filterText]);\n\n const totalFiles = countTotalFiles(treeItems);\n const selectedDirs = treeItems.filter(i => i.depth === 0 && i.isDir && i.checked).length;\n const totalDirs = treeItems.filter(i => i.depth === 0 && i.isDir).length;\n const visible = filteredItems.slice(\n centerScroll(treeCursor, filteredItems.length, treeViewH),\n centerScroll(treeCursor, filteredItems.length, treeViewH) + treeViewH,\n );\n const scrollOffset = centerScroll(treeCursor, filteredItems.length, treeViewH);\n const dbInfo = scan.db?.exists ? `${scan.db.sizeMB} MB` : 'new';\n const sidebarW = 30;\n\n return (\n <Box flexDirection=\"column\" width={width}>\n {/* Repo info */}\n <Box paddingX={2} gap={2} marginTop={1} marginBottom={1}>\n <Text color={C.aurora} bold>BrainBank</Text>\n <Text color={C.dim}>·</Text>\n <Text color={C.text}>{scan.repoPath}</Text>\n <Text color={C.dim}>· 💾 {dbInfo}</Text>\n </Box>\n\n {/* Split panels — same height */}\n <Box flexDirection=\"row\" gap={1} height={panelH}>\n {/* Left: Module sidebar */}\n <Box flexDirection=\"column\" width={sidebarW}\n borderStyle=\"round\" borderColor={pane === 'modules' ? C.aurora : C.border}\n >\n <Box paddingX={1}>\n <Text color={pane === 'modules' ? C.aurora : C.dim} bold>Modules</Text>\n </Box>\n <Box flexDirection=\"column\" paddingX={1} paddingY={1}>\n {allMods.map((m, i) => {\n const avail = m.available;\n const isCur = i === modCursor;\n const isChk = checked.has(m.name);\n const box = !avail ? '─' : isChk ? '✓' : ' ';\n const boxCol = !avail ? C.dim : isChk ? C.success : C.dim;\n const curCol = isCur ? (pane === 'modules' ? C.aurora : C.dim) : 'transparent';\n\n return (\n <Box key={m.name} height={1}>\n <Text color={curCol}>{isCur ? '▸' : ' '} </Text>\n <Text color={boxCol}>[{box}] </Text>\n <Text color={avail ? C.text : C.dim}>\n {m.name.charAt(0).toUpperCase() + m.name.slice(1)}\n </Text>\n </Box>\n );\n })}\n </Box>\n {/* Fill to match tree height */}\n <Box flexGrow={1} />\n <Box paddingX={1} paddingBottom={1} flexDirection=\"column\">\n {allMods.filter(m => m.available && checked.has(m.name)).map(m => (\n <Box key={`s${m.name}`} height={1}>\n <Text color={C.dim} wrap=\"truncate\">{m.summary}</Text>\n </Box>\n ))}\n </Box>\n </Box>\n\n {/* Right: Explorer — contextual based on sidebar cursor */}\n <Box flexDirection=\"column\" flexGrow={1}\n borderStyle=\"round\" borderColor={pane === 'tree' ? C.aurora : C.border}\n marginBottom={1}\n >\n <Box paddingX={1} justifyContent=\"space-between\" marginBottom={1}>\n <Text>\n <Text color={pane === 'tree' ? C.aurora : C.dim} bold>Explorer</Text>\n <Text color={C.dim}> · </Text>\n <Text color={C.text}>{focusedModName.charAt(0).toUpperCase() + focusedModName.slice(1)}</Text>\n </Text>\n {focusedModName === 'code' && (\n <Text color={C.dim}>{selectedDirs}/{totalDirs} dirs · {totalFiles} files</Text>\n )}\n </Box>\n\n {/* Code: interactive tree */}\n {focusedModName === 'code' && (\n <Box flexDirection=\"column\" paddingLeft={1} height={treeViewH} overflow=\"hidden\">\n {/* Filter bar */}\n {(isFiltering || filterText) && (\n <Box height={1} marginBottom={0}>\n <Text color={C.aurora} bold>/ </Text>\n <Text color={C.text}>{filterText}</Text>\n <Text color={C.aurora}>▎</Text>\n {filterText && <Text color={C.dim}> ({filteredItems.length} matches)</Text>}\n </Box>\n )}\n {visible.map((item, i) => {\n const globalIdx = centerScroll(treeCursor, filteredItems.length, treeViewH) + i;\n return (\n <TreeItemRow key={item.path} item={item}\n isCursor={pane === 'tree' && globalIdx === treeCursor}\n />\n );\n })}\n {visible.length < treeViewH && Array.from(\n { length: treeViewH - visible.length - (isFiltering || filterText ? 1 : 0) },\n (_, i) => <Box key={`e${i}`} height={1}><Text> </Text></Box>,\n )}\n </Box>\n )}\n\n {/* Docs / Git / External: static preview */}\n {focusedModName !== 'code' && allPreviews.has(focusedModName) && (\n <Box flexDirection=\"column\" paddingLeft={1} height={treeViewH} overflow=\"hidden\">\n {allPreviews.get(focusedModName)!.slice(0, treeViewH).map((line, i) => (\n <Text key={`p${i}`} color={line.dim ? C.dim : line.color ?? C.text}\n bold={line.bold} wrap=\"truncate\"\n >{line.text}</Text>\n ))}\n </Box>\n )}\n\n {/* No preview available for this module */}\n {focusedModName !== 'code' && !allPreviews.has(focusedModName) && (\n <Box flexDirection=\"column\" paddingLeft={1} height={treeViewH} justifyContent=\"center\" alignItems=\"center\">\n <Text color={C.dim}>No preview available</Text>\n <Text color={C.dim}>This plugin will be indexed with default settings</Text>\n </Box>\n )}\n\n {focusedModName === 'code' && filteredItems.length > treeViewH && (\n <Box paddingX={2} justifyContent=\"flex-end\">\n <Text color={C.dim}>\n {scrollOffset + 1}–{Math.min(scrollOffset + treeViewH, filteredItems.length)}/{filteredItems.length}\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n\n {/* Footer */}\n <Box paddingX={2} justifyContent=\"space-between\" marginTop={1}>\n <Text color={C.dim}>\n <Text color={C.aurora}>Tab</Text> pane\n <Text color={C.dim}> · </Text>\n <Text color={C.aurora}>↑↓</Text> move\n <Text color={C.dim}> · </Text>\n <Text color={C.aurora}>Space</Text> toggle\n <Text color={C.dim}> · </Text>\n <Text color={C.aurora}>→←</Text> expand\n <Text color={C.dim}> · </Text>\n <Text color={C.aurora}>a</Text> all\n <Text color={C.dim}> · </Text>\n <Text color={C.aurora}>n</Text> none\n <Text color={C.dim}> · </Text>\n <Text color={C.aurora}>i</Text> invert\n <Text color={C.dim}> · </Text>\n <Text color={C.aurora}>/</Text> filter\n </Text>\n <Text color={C.aurora} bold>\n Enter: {scan.config.exists ? 'Index ⚡' : 'Next →'}\n </Text>\n </Box>\n </Box>\n );\n}\n\n\n// ── Config Panel ───────────────────────────────────────\n\nfunction ConfigPanel({ onDone }: {\n onDone: (embedding: string, pruner: string, expander: string) => void;\n}): React.ReactNode {\n const { exit } = useApp();\n type Section = 'embedding' | 'pruner' | 'expander';\n const SECTIONS: Section[] = ['embedding', 'pruner', 'expander'];\n const [section, setSection] = useState<Section>('embedding');\n const [embIdx, setEmbIdx] = useState(0);\n const [prunerIdx, setPrunerIdx] = useState(0);\n const [expanderIdx, setExpanderIdx] = useState(0);\n\n useInput((input, key) => {\n if (key.escape || input === 'q') { exit(); return; }\n if (key.upArrow || input === 'k') {\n if (section === 'embedding') setEmbIdx(p => Math.max(0, p - 1));\n else if (section === 'pruner') setPrunerIdx(p => Math.max(0, p - 1));\n else setExpanderIdx(p => Math.max(0, p - 1));\n return;\n }\n if (key.downArrow || input === 'j') {\n if (section === 'embedding') setEmbIdx(p => Math.min(EMBEDDINGS.length - 1, p + 1));\n else if (section === 'pruner') setPrunerIdx(p => Math.min(PRUNERS.length - 1, p + 1));\n else setExpanderIdx(p => Math.min(EXPANDERS.length - 1, p + 1));\n return;\n }\n if (key.tab) {\n setSection(p => {\n const idx = SECTIONS.indexOf(p);\n return SECTIONS[(idx + 1) % SECTIONS.length]!;\n });\n return;\n }\n if (key.return) {\n onDone(EMBEDDINGS[embIdx]!.value, PRUNERS[prunerIdx]!.value, EXPANDERS[expanderIdx]!.value);\n return;\n }\n });\n\n const renderOpt = (item: OptionItem, i: number, cur: boolean, sel: boolean) => (\n <Box key={item.value} height={1}>\n <Text color={cur ? C.aurora : C.dim}>{cur ? '▸' : ' '} </Text>\n <Text color={sel ? C.success : C.dim}>{sel ? '●' : '○'} </Text>\n <Text color={cur ? C.text : C.dim} bold={cur}>{item.label.padEnd(22)}</Text>\n <Text color={C.dim}>{item.desc}</Text>\n {item.badge ? <Text color={C.warning}> {item.badge}</Text> : null}\n </Box>\n );\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Box justifyContent=\"center\" marginBottom={1}>\n <Text color={C.cyan} bold>⚙ First-Time Setup</Text>\n </Box>\n <Box flexDirection=\"column\" borderStyle=\"round\"\n borderColor={section === 'embedding' ? C.aurora : C.border} paddingX={2} paddingY={1}\n >\n <Box marginBottom={1}>\n <Text color={section === 'embedding' ? C.aurora : C.dim} bold>Embedding Provider</Text>\n </Box>\n {EMBEDDINGS.map((it, i) => renderOpt(it, i, section === 'embedding' && i === embIdx, i === embIdx))}\n </Box>\n <Box flexDirection=\"column\" borderStyle=\"round\"\n borderColor={section === 'pruner' ? C.aurora : C.border} paddingX={2} paddingY={1}\n >\n <Box marginBottom={1}>\n <Text color={section === 'pruner' ? C.aurora : C.dim} bold>Noise Pruner</Text>\n </Box>\n {PRUNERS.map((it, i) => renderOpt(it, i, section === 'pruner' && i === prunerIdx, i === prunerIdx))}\n </Box>\n <Box flexDirection=\"column\" borderStyle=\"round\"\n borderColor={section === 'expander' ? C.aurora : C.border} paddingX={2} paddingY={1}\n >\n <Box marginBottom={1}>\n <Text color={section === 'expander' ? C.aurora : C.dim} bold>Context Expander</Text>\n </Box>\n {EXPANDERS.map((it, i) => renderOpt(it, i, section === 'expander' && i === expanderIdx, i === expanderIdx))}\n </Box>\n <Box paddingX={1} marginTop={1}>\n <Text color={C.dim}>\n <Text color={C.aurora}>↑↓</Text> select · <Text color={C.aurora}>Tab</Text> section · <Text color={C.aurora}>Enter</Text> start indexing\n </Text>\n </Box>\n </Box>\n );\n}\n\n\n// ── App Root ────────────────────────────────────────────\n\nfunction IndexApp({ scan, externalPreviews }: {\n scan: ScanResult;\n externalPreviews?: Map<string, PreviewLine[]>;\n}): React.ReactNode {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const [rawW, setRawW] = useState(stdout?.columns || 100);\n const [rawH, setRawH] = useState(stdout?.rows || 30);\n const [phase, setPhase] = useState<Phase>('main');\n const [selectedModules, setSelectedModules] = useState<string[]>([]);\n const [patterns, setPatterns] = useState({ include: [] as string[], ignore: [] as string[] });\n\n const width = Math.min(rawW, MAX_W);\n const height = Math.min(rawH, MAX_H);\n\n useEffect(() => {\n if (!stdout) return;\n const onResize = () => { setRawW(stdout.columns); setRawH(stdout.rows); };\n stdout.on('resize', onResize);\n return () => { stdout.off('resize', onResize); };\n }, [stdout]);\n\n const handleMainConfirm = (modules: string[], include: string[], ignore: string[]) => {\n setSelectedModules(modules);\n setPatterns({ include, ignore });\n if (scan.config.exists) {\n _lastSelection = { modules, include, ignore };\n setTimeout(() => exit(), 50);\n } else {\n setPhase('config');\n }\n };\n\n const handleConfigDone = (embedding: string, pruner: string, expander: string) => {\n _lastSelection = { modules: selectedModules, ...patterns, config: { embedding, pruner, expander } };\n setTimeout(() => exit(), 50);\n };\n\n return (\n <Box flexDirection=\"column\" width={width} height={height}>\n {phase === 'main' && (\n <MainScreen scan={scan} width={width} height={height}\n onConfirm={handleMainConfirm}\n externalPreviews={externalPreviews}\n />\n )}\n {phase === 'config' && <ConfigPanel onDone={handleConfigDone} />}\n </Box>\n );\n}\n\n\n// ── Public API ─────────────────────────────────────────\n\nlet _lastSelection: TuiSelection | null = null;\n\nexport async function runIndexTui(\n scan: ScanResult,\n externalPreviews?: Map<string, PreviewLine[]>,\n): Promise<TuiSelection | null> {\n _lastSelection = null;\n const instance = render(<IndexApp scan={scan} externalPreviews={externalPreviews} />);\n await instance.waitUntilExit();\n return _lastSelection;\n}\n","/**\n * tree-scanner.ts — Filesystem scanner for the index TUI.\n *\n * Builds interactive file tree data (dirs + files) for navigation.\n * Pure functions, no React, no state. Reuses existing language filters.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { execSync } from 'node:child_process';\nimport picomatch from 'picomatch';\nimport { SUPPORTED_EXTENSIONS, isIgnoredDir } from '@/lib/languages.ts';\n\n\n// ── Types ─────────────────────────────────────────────\n\n/** A single item in the interactive file tree (dir or file). */\nexport interface FileTreeItem {\n /** Relative path from repo root. */\n path: string;\n /** Display name (basename). */\n name: string;\n /** Nesting depth (0 = top-level). */\n depth: number;\n /** Is this a directory? */\n isDir: boolean;\n /** File extension (e.g. '.ts'). Empty for dirs. */\n ext: string;\n /** Whether included for indexing. Only togglable on dirs. */\n checked: boolean;\n /** Whether children are visible (dirs only). */\n expanded: boolean;\n /** Has indexable content below (dirs only). */\n hasChildren: boolean;\n /** Indexable file count (dirs only, recursive). */\n fileCount: number;\n}\n\n\n// ── Extension colors (VSCode-inspired) ────────────────\n\nconst EXT_COLORS: Record<string, string> = {\n '.ts': '#519ABA',\n '.tsx': '#519ABA',\n '.js': '#CBCB41',\n '.jsx': '#61DAFB',\n '.mjs': '#CBCB41',\n '.py': '#4B8BBE',\n '.go': '#7FD5EA',\n '.rs': '#DEA584',\n '.rb': '#CC3E44',\n '.java': '#CC3E44',\n '.c': '#599EFF',\n '.cpp': '#599EFF',\n '.h': '#926BD4',\n '.cs': '#68217A',\n '.php': '#777BB3',\n '.swift': '#F05138',\n '.kt': '#7F52FF',\n '.css': '#42A5F5',\n '.scss': '#F06292',\n '.html': '#E44D26',\n '.vue': '#8DC149',\n '.svelte': '#FF3E00',\n '.json': '#CBCB41',\n '.yaml': '#F44336',\n '.yml': '#F44336',\n '.md': '#519ABA',\n '.sql': '#E0B040',\n '.sh': '#89E051',\n '.bash': '#89E051',\n '.zsh': '#89E051',\n '.lua': '#51A0CF',\n '.zig': '#F69A1B',\n};\n\n/** Get the display color for a file extension. */\nexport function getExtColor(ext: string): string {\n return EXT_COLORS[ext] ?? '#7C8DA6';\n}\n\n/** Get a short icon-like label for the extension. */\nexport function getExtIcon(ext: string): string {\n switch (ext) {\n case '.ts': case '.tsx': return '⬡';\n case '.js': case '.jsx': case '.mjs': return '⬡';\n case '.py': return '◆';\n case '.go': return '◇';\n case '.rs': return '⛭';\n case '.md': return '◎';\n case '.json': case '.yaml': case '.yml': return '◉';\n case '.css': case '.scss': return '◈';\n case '.html': case '.vue': case '.svelte': return '◇';\n case '.sh': case '.bash': case '.zsh': return '⚙';\n default: return '○';\n }\n}\n\n\n// ── Build file tree ───────────────────────────────────\n\n/**\n * Build the initial interactive tree — top-level dirs expanded,\n * showing both dirs and files. Returns a flat list.\n */\nexport function buildFileTree(repoPath: string, include?: string[]): FileTreeItem[] {\n const items: FileTreeItem[] = [];\n const entries = readSortedEntries(repoPath);\n\n // Build a matcher to determine initial checked state\n const hasInclude = include && include.length > 0;\n const isIncluded = hasInclude ? picomatch(include, { dot: true }) : null;\n // Extract base prefixes for dir-level checks (e.g. 'apps/admin/app' from 'apps/admin/app/**')\n const includeBases = hasInclude\n ? include.map(p => picomatch.scan(p).base).filter(b => b && b !== '.')\n : null;\n\n /** Check if a relative path (dir or file) should be checked based on include patterns. */\n function shouldCheck(relPath: string, isDir: boolean): boolean {\n if (!hasInclude) return true; // no include filter → check everything\n // For files: match against the include patterns directly\n if (!isDir) return isIncluded!(relPath);\n // For dirs: check if this dir is a prefix of any include base, or vice versa\n if (includeBases) {\n return includeBases.some(base =>\n relPath.startsWith(base) || base.startsWith(relPath),\n );\n }\n return true;\n }\n\n for (const entry of entries) {\n if (entry.isDir) {\n const dirPath = path.join(repoPath, entry.name);\n const stats = scanDirStats(dirPath);\n if (stats.total === 0) continue;\n\n const dirChecked = shouldCheck(entry.name, true);\n\n // Top-level dir — auto-expanded\n items.push({\n path: entry.name,\n name: entry.name,\n depth: 0,\n isDir: true,\n ext: '',\n checked: dirChecked,\n expanded: true,\n hasChildren: true,\n fileCount: stats.total,\n });\n\n // Add children (depth 1)\n const children = readSortedEntries(dirPath);\n for (const child of children) {\n const childRel = `${entry.name}/${child.name}`;\n\n if (child.isDir) {\n const childAbs = path.join(dirPath, child.name);\n const cs = scanDirStats(childAbs);\n if (cs.total === 0) continue;\n\n items.push({\n path: childRel,\n name: child.name,\n depth: 1,\n isDir: true,\n ext: '',\n checked: shouldCheck(childRel, true),\n expanded: false,\n hasChildren: cs.hasSubdirs || cs.total > 0,\n fileCount: cs.total,\n });\n } else {\n const ext = path.extname(child.name).toLowerCase();\n if (!SUPPORTED_EXTENSIONS[ext]) continue;\n\n items.push({\n path: childRel,\n name: child.name,\n depth: 1,\n isDir: false,\n ext,\n checked: shouldCheck(childRel, false),\n expanded: false,\n hasChildren: false,\n fileCount: 0,\n });\n }\n }\n } else {\n // Root-level file\n const ext = path.extname(entry.name).toLowerCase();\n if (!SUPPORTED_EXTENSIONS[ext]) continue;\n\n items.push({\n path: entry.name,\n name: entry.name,\n depth: 0,\n isDir: false,\n ext,\n checked: shouldCheck(entry.name, false),\n expanded: false,\n hasChildren: false,\n fileCount: 0,\n });\n }\n }\n\n return items;\n}\n\n\n/** Expand a directory — insert its children after it. Returns new array. */\nexport function expandDir(items: FileTreeItem[], index: number, repoPath: string): FileTreeItem[] {\n const node = items[index];\n if (!node || !node.isDir || node.expanded) return items;\n\n const absDir = path.join(repoPath, node.path);\n const entries = readSortedEntries(absDir);\n const children: FileTreeItem[] = [];\n\n for (const entry of entries) {\n const childRel = `${node.path}/${entry.name}`;\n\n if (entry.isDir) {\n const childAbs = path.join(absDir, entry.name);\n const stats = scanDirStats(childAbs);\n if (stats.total === 0) continue;\n\n children.push({\n path: childRel,\n name: entry.name,\n depth: node.depth + 1,\n isDir: true,\n ext: '',\n checked: node.checked,\n expanded: false,\n hasChildren: stats.hasSubdirs || stats.total > 0,\n fileCount: stats.total,\n });\n } else {\n const ext = path.extname(entry.name).toLowerCase();\n if (!SUPPORTED_EXTENSIONS[ext]) continue;\n\n children.push({\n path: childRel,\n name: entry.name,\n depth: node.depth + 1,\n isDir: false,\n ext,\n checked: node.checked,\n expanded: false,\n hasChildren: false,\n fileCount: 0,\n });\n }\n }\n\n const next = [...items];\n next[index] = { ...node, expanded: true };\n next.splice(index + 1, 0, ...children);\n return next;\n}\n\n\n/** Collapse a directory — remove all deeper items after it. Returns new array. */\nexport function collapseDir(items: FileTreeItem[], index: number): FileTreeItem[] {\n const node = items[index];\n if (!node || !node.isDir || !node.expanded) return items;\n\n let removeCount = 0;\n for (let i = index + 1; i < items.length; i++) {\n if (items[i]!.depth <= node.depth) break;\n removeCount++;\n }\n\n const next = [...items];\n next[index] = { ...node, expanded: false };\n next.splice(index + 1, removeCount);\n return next;\n}\n\n\n/** Toggle a directory's checked state, cascading to visible children. */\nexport function toggleDir(items: FileTreeItem[], index: number): FileTreeItem[] {\n const node = items[index];\n if (!node || !node.isDir) return items;\n\n const newChecked = !node.checked;\n const next = [...items];\n next[index] = { ...node, checked: newChecked };\n\n // Cascade DOWN to children only\n for (let i = index + 1; i < next.length; i++) {\n if (next[i]!.depth <= node.depth) break;\n next[i] = { ...next[i]!, checked: newChecked };\n }\n\n return next;\n}\n\n\n/** Toggle an individual file's checked state. */\nexport function toggleFile(items: FileTreeItem[], index: number): FileTreeItem[] {\n const node = items[index];\n if (!node || node.isDir) return items;\n\n const next = [...items];\n next[index] = { ...node, checked: !node.checked };\n return next;\n}\n\n\n/** Set all dirs to checked or unchecked. */\nexport function setAllDirs(items: FileTreeItem[], checked: boolean): FileTreeItem[] {\n return items.map(item => item.isDir ? { ...item, checked } : { ...item, checked });\n}\n\n\n/** Generate include/ignore patterns from tree state. */\nexport function generatePatternsFromTree(\n items: FileTreeItem[],\n originalInclude?: string[],\n): { include: string[]; ignore: string[] } {\n const include: string[] = [];\n const ignore: string[] = [];\n\n const allDirs = items.filter(i => i.isDir);\n const topDirs = allDirs.filter(i => i.depth === 0);\n\n // If everything is checked, no filtering needed\n if (topDirs.every(d => d.checked)) {\n const uncheckedSubs = allDirs.filter(d => !d.checked && d.depth > 0);\n if (uncheckedSubs.length === 0) return { include: [], ignore: [] };\n for (const item of uncheckedSubs) {\n ignore.push(`${item.path}/**`);\n }\n return { include, ignore };\n }\n\n // If nothing is checked, return empty\n if (allDirs.every(d => !d.checked)) {\n return { include: [], ignore: [] };\n }\n\n // Build lookup: for each dir path, which original patterns applied to it\n const originalByDir = new Map<string, string[]>();\n if (originalInclude && originalInclude.length > 0) {\n for (const pattern of originalInclude) {\n // Extract the base directory from the pattern\n const base = pattern.replace(/\\/\\*\\*$/, '').replace(/\\/\\*$/, '');\n // Find which top-level (or depth-1) dir this pattern falls under\n const parts = base.split('/');\n // Map to all ancestor dirs\n for (let i = 1; i <= parts.length; i++) {\n const dirPath = parts.slice(0, i).join('/');\n const existing = originalByDir.get(dirPath) ?? [];\n existing.push(pattern);\n originalByDir.set(dirPath, existing);\n }\n }\n }\n\n /** Get visible children of a dir in the flat list */\n function getVisibleChildren(parentIdx: number): FileTreeItem[] {\n const parent = items[parentIdx]!;\n const children: FileTreeItem[] = [];\n for (let i = parentIdx + 1; i < items.length; i++) {\n if (items[i]!.depth <= parent.depth) break;\n if (items[i]!.depth === parent.depth + 1) children.push(items[i]!);\n }\n return children;\n }\n\n /** Check if a dir is a \"full inclusion\" — all its visible children are checked */\n function isFullInclusion(idx: number): boolean {\n const children = getVisibleChildren(idx);\n if (children.length === 0) return true;\n return children.filter(c => c.isDir).every(c => c.checked);\n }\n\n // Walk checked dirs and determine include patterns\n for (let i = 0; i < items.length; i++) {\n const item = items[i]!;\n if (!item.isDir || !item.checked) continue;\n\n // Skip if a REAL ancestor is also checked and is a full inclusion\n let coveredByParent = false;\n for (let j = i - 1; j >= 0; j--) {\n const ancestor = items[j]!;\n if (ancestor.isDir && ancestor.depth < item.depth\n && item.path.startsWith(ancestor.path + '/')\n && ancestor.checked) {\n if (isFullInclusion(j)) {\n coveredByParent = true;\n }\n break;\n }\n }\n if (coveredByParent) continue;\n\n // Check if original patterns exist for this dir — preserve them\n const origPatterns = originalByDir.get(item.path);\n if (origPatterns && origPatterns.length > 0) {\n // Use original patterns that are scoped to or under this dir\n for (const p of origPatterns) {\n if (!include.includes(p)) {\n include.push(p);\n }\n }\n } else {\n // New selection — generate fresh pattern\n include.push(`${item.path}/**`);\n }\n }\n\n // Build a set of included dir prefixes for coverage checks\n const includedPrefixes = new Set(include);\n\n // Handle individually checked files whose parent dir is NOT in the include set\n for (const item of items) {\n if (item.isDir || !item.checked) continue;\n // Check if this file is already covered by an included directory\n const covered = [...includedPrefixes].some(p => {\n const base = p.replace(/\\/\\*\\*$/, '').replace(/\\/\\*$/, '');\n return item.path.startsWith(base + '/') || item.path === base;\n });\n if (!covered) {\n include.push(item.path);\n }\n }\n\n // Handle individually unchecked files inside checked directories\n for (const item of items) {\n if (item.isDir || item.checked) continue;\n const parentPath = item.path.split('/').slice(0, -1).join('/');\n const parentIncluded = includedPrefixes.has(`${parentPath}/**`);\n if (parentIncluded) {\n ignore.push(item.path);\n }\n }\n\n return { include, ignore };\n}\n\n\n/** Count total selected files in the tree. */\nexport function countSelectedFiles(items: FileTreeItem[]): number {\n let total = 0;\n for (const item of items) {\n if (!item.isDir && item.checked) total++;\n // Count expanded dirs' direct file count only if not expanded (avoid double count)\n if (item.isDir && item.checked && !item.expanded) total += item.fileCount;\n }\n return total;\n}\n\n\n/** Count total files in the tree. */\nexport function countTotalFiles(items: FileTreeItem[]): number {\n return items.filter(i => i.depth === 0 && i.isDir).reduce((s, i) => s + i.fileCount, 0)\n + items.filter(i => i.depth === 0 && !i.isDir).length;\n}\n\n\n// ── Internal helpers ──────────────────────────────────\n\ninterface DirStats {\n total: number;\n byLang: Map<string, number>;\n hasSubdirs: boolean;\n}\n\nfunction scanDirStats(dirPath: string): DirStats {\n const byLang = new Map<string, number>();\n let total = 0;\n let hasSubdirs = false;\n\n function walk(dir: string): void {\n for (const entry of readDirSafe(dir)) {\n if (isDirEntry(dir, entry)) {\n if (isIgnoredDir(entry.name) || entry.name.startsWith('.')) continue;\n hasSubdirs = true;\n walk(path.join(dir, entry.name));\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name).toLowerCase();\n const lang = SUPPORTED_EXTENSIONS[ext];\n if (lang) { byLang.set(lang, (byLang.get(lang) ?? 0) + 1); total++; }\n }\n }\n }\n\n walk(dirPath);\n return { total, byLang, hasSubdirs };\n}\n\ninterface SortedEntry { name: string; isDir: boolean }\n\nfunction readSortedEntries(dir: string): SortedEntry[] {\n const raw = readDirSafe(dir);\n const entries: SortedEntry[] = [];\n\n for (const e of raw) {\n if (e.name.startsWith('.')) continue;\n if (isDirEntry(dir, e)) {\n if (isIgnoredDir(e.name)) continue;\n entries.push({ name: e.name, isDir: true });\n } else if (e.isFile()) {\n entries.push({ name: e.name, isDir: false });\n }\n }\n\n return entries.sort((a, b) => {\n if (a.isDir !== b.isDir) return a.isDir ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n}\n\nfunction readDirSafe(dir: string): fs.Dirent[] {\n try { return fs.readdirSync(dir, { withFileTypes: true }); }\n catch { return []; }\n}\n\nfunction isDirEntry(parentDir: string, entry: fs.Dirent): boolean {\n if (entry.isDirectory()) return true;\n if (entry.isSymbolicLink()) {\n try { return fs.statSync(path.join(parentDir, entry.name)).isDirectory(); }\n catch { return false; }\n }\n return false;\n}\n\n\n// ── Docs & Git preview ────────────────────────────────\n\nexport interface PreviewLine {\n text: string;\n color?: string;\n bold?: boolean;\n dim?: boolean;\n}\n\n/** Scan all markdown files and return preview lines. */\nexport function scanDocsPreview(repoPath: string): PreviewLine[] {\n const mdFiles: string[] = [];\n\n function walk(dir: string, rel: string): void {\n for (const entry of readDirSafe(dir)) {\n if (entry.name.startsWith('.')) continue;\n const fullPath = path.join(dir, entry.name);\n const relPath = rel ? `${rel}/${entry.name}` : entry.name;\n\n if (isDirEntry(dir, entry)) {\n if (isIgnoredDir(entry.name)) continue;\n walk(fullPath, relPath);\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\n mdFiles.push(relPath);\n }\n }\n }\n\n walk(repoPath, '');\n mdFiles.sort();\n\n if (mdFiles.length === 0) {\n return [{ text: ' No markdown files found', dim: true }];\n }\n\n const lines: PreviewLine[] = [\n { text: `📄 ${mdFiles.length} markdown files`, bold: true },\n { text: '' },\n ];\n\n // Group by top-level dir\n const groups = new Map<string, string[]>();\n for (const f of mdFiles) {\n const parts = f.split('/');\n const group = parts.length > 1 ? parts[0]! : '(root)';\n const list = groups.get(group) || [];\n list.push(f);\n groups.set(group, list);\n }\n\n for (const [group, files] of groups) {\n if (group !== '(root)') {\n lines.push({ text: ` ${group}/`, bold: true, color: '#E0AF68' });\n }\n for (const f of files) {\n const name = group === '(root)' ? f : f.slice(group.length + 1);\n lines.push({ text: ` MD ${name}`, color: '#519ABA' });\n }\n lines.push({ text: '' });\n }\n\n return lines;\n}\n\n/** Scan recent git commits and return preview lines. */\nexport function scanGitPreview(repoPath: string): PreviewLine[] {\n const gitDir = path.join(repoPath, '.git');\n if (!fs.existsSync(gitDir)) {\n return [{ text: ' No .git directory found', dim: true }];\n }\n\n try {\n const raw = execSync(\n 'git log --oneline --format=\"%h %ar %s\" -n 20',\n { cwd: repoPath, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] },\n ).trim();\n\n const commits = raw.split('\\n').filter(Boolean);\n if (commits.length === 0) {\n return [{ text: ' No commits found', dim: true }];\n }\n\n // Count total commits\n let totalStr = '';\n try {\n totalStr = execSync('git rev-list --count HEAD',\n { cwd: repoPath, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] },\n ).trim();\n } catch { /* ignore */ }\n\n const lines: PreviewLine[] = [\n { text: `📜 ${totalStr || '?'} commits`, bold: true },\n { text: '' },\n ];\n\n for (const line of commits) {\n const spaceIdx = line.indexOf(' ');\n const hash = line.slice(0, spaceIdx);\n const rest = line.slice(spaceIdx + 1);\n // Split \"X ago message\" — find second space after time\n const timeMatch = rest.match(/^(.+? ago) (.+)$/);\n if (timeMatch) {\n lines.push({\n text: ` ${hash} ${timeMatch[2]}`,\n color: '#C0CAF5',\n });\n } else {\n lines.push({ text: ` ${hash} ${rest}`, dim: true });\n }\n }\n\n return lines;\n } catch {\n return [{ text: ' Failed to read git log', dim: true }];\n }\n}\n","/**\n * brainbank collection add|list|remove — Document collection management\n */\n\nimport { c, args, getFlag, stripFlags, findDocsPlugin } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory/index.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 const docsPlugin = findDocsPlugin(brain);\n if (!docsPlugin) { console.log(c.red('Docs plugin not loaded. Install @brainbank/docs.')); process.exit(1); }\n await docsPlugin.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 docsPlugin = findDocsPlugin(brain);\n if (!docsPlugin) { console.log(c.yellow(' Docs plugin not loaded.')); brain.close(); return; }\n const collections = docsPlugin.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 const docsPlugin = findDocsPlugin(brain);\n if (!docsPlugin) { console.log(c.red('Docs plugin not loaded.')); process.exit(1); }\n await docsPlugin.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/index.ts';\n\nexport async function cmdKv(): Promise<void> {\n const pos = stripFlags(args);\n const sub = pos[1];\n\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 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') || 'hybrid') as 'hybrid' | 'vector' | 'keyword';\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 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 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 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, findDocsPlugin } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory/index.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?: (collection: string, file: string, current: number, total: number) => void } = {};\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 docsPlugin = findDocsPlugin(brain);\n if (!docsPlugin) { console.log(c.red(' Docs plugin not loaded. Install @brainbank/docs.')); process.exit(1); }\n\n const results = await docsPlugin.indexDocs(opts);\n\n console.log('\\n');\n for (const [name, stat] of Object.entries(results) as [string, { indexed: number; skipped: number; removed: number; chunks: number }][]) {\n const removedStr = stat.removed > 0 ? `, ${c.red(String(stat.removed) + ' removed')}` : '';\n console.log(` ${c.green(name)}: ${stat.indexed} indexed, ${stat.skipped} skipped${removedStr}, ${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 docsPlugin = findDocsPlugin(brain);\n if (!docsPlugin) {\n console.log(c.red('Docs plugin not loaded. Install @brainbank/docs.'));\n process.exit(1);\n }\n const results = await docsPlugin.search(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.type === 'document' ? r.metadata.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 * ServerClient — Lightweight HTTP client for the BrainBank daemon.\n *\n * Used by CLI commands to delegate to a running HTTP server\n * instead of loading models locally. Falls back gracefully\n * (returns null) if the server is unreachable.\n */\n\nimport type { SearchResult } from '@/types.ts';\n\nimport * as http from 'node:http';\n\nimport { isServerRunning } from '@/services/daemon.ts';\n\ninterface ContextOptions {\n task: string;\n repo?: string;\n sources?: Record<string, number>;\n pathPrefix?: string | string[];\n affectedFiles?: string[];\n}\n\n/**\n * Try to get context from the running HTTP server.\n * Returns the context string if successful, null if server is unreachable.\n */\nexport async function tryServerContext(options: ContextOptions): Promise<string | null> {\n const info = isServerRunning();\n if (!info) return null;\n\n try {\n const body = JSON.stringify({\n task: options.task,\n repo: options.repo,\n sources: options.sources,\n pathPrefix: options.pathPrefix,\n affectedFiles: options.affectedFiles,\n });\n\n const response = await httpPost(info.port, '/context', body);\n const data = JSON.parse(response) as { context?: string; error?: string };\n\n if (data.error) return null;\n return data.context ?? null;\n } catch {\n // Server unreachable or error — fall back to local\n return null;\n }\n}\n\ninterface SearchDelegateOptions {\n query: string;\n repo?: string;\n sources?: Record<string, number>;\n pathPrefix?: string | string[];\n maxResults?: number;\n}\n\n/**\n * Try to delegate a search to the running HTTP server.\n * Mode: 'search' (vector), 'hybrid' (hsearch), 'keyword' (ksearch).\n * Returns SearchResult[] if successful, null if server is unreachable.\n */\nexport async function tryServerSearch(\n mode: 'search' | 'hybrid' | 'keyword',\n options: SearchDelegateOptions,\n): Promise<SearchResult[] | null> {\n const info = isServerRunning();\n if (!info) return null;\n\n const endpoint = mode === 'search' ? '/search' : mode === 'hybrid' ? '/hsearch' : '/ksearch';\n\n try {\n const body = JSON.stringify({\n query: options.query,\n repo: options.repo,\n sources: options.sources,\n pathPrefix: options.pathPrefix,\n maxResults: options.maxResults,\n });\n\n const response = await httpPost(info.port, endpoint, body);\n const data = JSON.parse(response) as { results?: SearchResult[]; error?: string };\n\n if (data.error) return null;\n return data.results ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Try to trigger indexing on the running HTTP server.\n * Returns the result if successful, null if server is unreachable.\n */\nexport async function tryServerIndex(repo?: string, forceReindex?: boolean): Promise<Record<string, unknown> | null> {\n const info = isServerRunning();\n if (!info) return null;\n\n try {\n const body = JSON.stringify({ repo, forceReindex });\n const response = await httpPost(info.port, '/index', body);\n const data = JSON.parse(response) as { result?: Record<string, unknown>; error?: string };\n\n if (data.error) return null;\n return data.result ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Check server health. Returns health info or null.\n */\nexport async function serverHealth(): Promise<{\n ok: boolean;\n pid: number;\n port: number;\n uptime: number;\n workspaces: number;\n} | null> {\n const info = isServerRunning();\n if (!info) return null;\n\n try {\n const response = await httpGet(info.port, '/health');\n return JSON.parse(response) as { ok: boolean; pid: number; port: number; uptime: number; workspaces: number };\n } catch {\n return null;\n }\n}\n\n// ── HTTP helpers ────────────────────────────────────\n\nfunction httpPost(port: number, path: string, body: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const req = http.request({\n hostname: '127.0.0.1',\n port,\n path,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Content-Length': Buffer.byteLength(body),\n },\n timeout: 120_000, // 2 minutes — context queries can be slow on first load\n }, (res) => {\n const chunks: Buffer[] = [];\n res.on('data', (chunk: Buffer) => chunks.push(chunk));\n res.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n });\n\n req.on('error', reject);\n req.on('timeout', () => { req.destroy(); reject(new Error('Request timed out')); });\n req.write(body);\n req.end();\n });\n}\n\nfunction httpGet(port: number, path: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const req = http.request({\n hostname: '127.0.0.1',\n port,\n path,\n method: 'GET',\n timeout: 5_000,\n }, (res) => {\n const chunks: Buffer[] = [];\n res.on('data', (chunk: Buffer) => chunks.push(chunk));\n res.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n });\n\n req.on('error', reject);\n req.on('timeout', () => { req.destroy(); reject(new Error('Request timed out')); });\n req.end();\n });\n}\n","/**\n * brainbank search — Semantic search (vector)\n * brainbank hsearch — Hybrid search (vector + BM25)\n * brainbank ksearch — Keyword search (BM25)\n *\n * Source filtering:\n * --code 10 Max code results\n * --git 0 Skip git results\n * --docs 5 Max document results\n * --notes 10 Custom plugin results\n * --slack_messages 5 Custom collection results\n *\n * Any --<name> <number> flag is treated as a source filter.\n */\n\nimport { c, args, getFlag, stripFlags, printResults } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory/index.ts';\nimport { tryServerSearch } from '@/cli/server-client.ts';\n\n/**\n * Parse dynamic source flags: each `--<name> <number>` becomes `{ name: number }`.\n *\n * Known non-source flags (--repo, --depth, etc.) are excluded.\n * Returns sources map + the query string (positional args).\n */\nfunction parseSourceFlags(): { sources: Record<string, number>; query: string } {\n const NON_SOURCE_FLAGS = new Set([\n 'repo', 'depth', 'collection', 'pattern', 'context', 'name',\n 'keep', 'pruner', 'only', 'docs-path', 'mode', 'limit',\n 'ignore', 'include', 'meta', 'k', 'yes', 'y', 'force', 'verbose', 'path',\n ]);\n\n const sources: Record<string, number> = {};\n const positional: string[] = [];\n\n for (let i = 0; i < args.length; i++) {\n if (args[i].startsWith('--')) {\n const name = args[i].slice(2);\n\n // Skip boolean flags\n if (name === 'yes' || name === 'force' || name === 'verbose') continue;\n\n // If next arg is a number and flag is not a known non-source flag\n const next = args[i + 1];\n if (next !== undefined && /^\\d+$/.test(next) && !NON_SOURCE_FLAGS.has(name)) {\n sources[name] = parseInt(next, 10);\n i++; // skip the value\n continue;\n }\n\n // Known value flag — skip its value\n if (NON_SOURCE_FLAGS.has(name) && next !== undefined && !next.startsWith('--')) {\n i++;\n }\n continue;\n }\n positional.push(args[i]);\n }\n\n const query = positional.slice(1).join(' '); // skip command name\n return { sources, query };\n}\n\n/** Parse --path as comma-separated list of path prefixes. */\nfunction parsePaths(): string | string[] | undefined {\n const raw = getFlag('path');\n if (!raw) return undefined;\n const paths = raw.split(',').map(p => p.trim()).filter(Boolean);\n return paths.length === 1 ? paths[0] : paths;\n}\n\n/** Print active source and path filters. */\nfunction printFilterInfo(sources: Record<string, number>, pathPrefix?: string | string[]): void {\n const parts: string[] = [];\n const entries = Object.entries(sources);\n if (entries.length > 0) parts.push(...entries.map(([k, v]) => `${k}=${v}`));\n if (pathPrefix) {\n const paths = Array.isArray(pathPrefix) ? pathPrefix : [pathPrefix];\n parts.push(`path=${paths.join(',')}`);\n }\n if (parts.length > 0) console.log(c.dim(` Filters: ${parts.join(', ')}`));\n}\n\n/** Build search options from sources map + optional path prefix(es). */\nfunction buildSearchOptions(sources: Record<string, number>, pathPrefix?: string | string[]): { sources: Record<string, number>; source: 'cli'; pathPrefix?: string | string[] } {\n const opts: { sources: Record<string, number>; source: 'cli'; pathPrefix?: string | string[] } = {\n sources: Object.keys(sources).length > 0 ? sources : {},\n source: 'cli',\n };\n if (pathPrefix) opts.pathPrefix = pathPrefix;\n return opts;\n}\n\nexport async function cmdSearch(): Promise<void> {\n const { sources, query } = parseSourceFlags();\n if (!query) {\n console.log(c.red('Usage: brainbank search <query> [--repo <path>] [--path <dir>] [--code <n>] [--git <n>]'));\n process.exit(1);\n }\n\n const pathPrefix = parsePaths();\n const repo = getFlag('repo') ?? process.cwd();\n\n // Try daemon delegation first (hot HNSW)\n const delegated = await tryServerSearch('search', {\n query, repo,\n sources: Object.keys(sources).length > 0 ? sources : undefined,\n pathPrefix,\n });\n if (delegated) {\n console.log(c.bold(`\\n━━━ BrainBank Search: \"${query}\" ━━━\\n`));\n printFilterInfo(sources, pathPrefix);\n printResults(delegated);\n return;\n }\n\n // Fall back to local\n const brain = await createBrain();\n console.log(c.bold(`\\n━━━ BrainBank Search: \"${query}\" ━━━\\n`));\n printFilterInfo(sources, pathPrefix);\n\n const opts = buildSearchOptions(sources, pathPrefix);\n const results = await brain.search(query, opts);\n printResults(results);\n brain.close();\n}\n\nexport async function cmdHybridSearch(): Promise<void> {\n const { sources, query } = parseSourceFlags();\n if (!query) {\n console.log(c.red('Usage: brainbank hsearch <query> [--repo <path>] [--path <dir>] [--code <n>] [--git <n>] [--docs <n>]'));\n process.exit(1);\n }\n\n const pathPrefix = parsePaths();\n const repo = getFlag('repo') ?? process.cwd();\n\n // Try daemon delegation first (hot HNSW)\n const delegated = await tryServerSearch('hybrid', {\n query, repo,\n sources: Object.keys(sources).length > 0 ? sources : undefined,\n pathPrefix,\n });\n if (delegated) {\n console.log(c.bold(`\\n━━━ BrainBank Hybrid Search: \"${query}\" ━━━`));\n console.log(c.dim(` Mode: vector + BM25 → Reciprocal Rank Fusion`));\n printFilterInfo(sources, pathPrefix);\n console.log('');\n printResults(delegated);\n return;\n }\n\n // Fall back to local\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 printFilterInfo(sources, pathPrefix);\n console.log('');\n\n const opts = buildSearchOptions(sources, pathPrefix);\n const results = await brain.hybridSearch(query, opts);\n printResults(results);\n brain.close();\n}\n\nexport async function cmdKeywordSearch(): Promise<void> {\n const { sources, query } = parseSourceFlags();\n if (!query) {\n console.log(c.red('Usage: brainbank ksearch <query> [--repo <path>] [--path <dir>] [--code <n>] [--git <n>]'));\n process.exit(1);\n }\n\n const pathPrefix = parsePaths();\n const repo = getFlag('repo') ?? process.cwd();\n\n // Try daemon delegation first (hot HNSW)\n const delegated = await tryServerSearch('keyword', {\n query, repo,\n sources: Object.keys(sources).length > 0 ? sources : undefined,\n pathPrefix,\n });\n if (delegated) {\n console.log(c.bold(`\\n━━━ BrainBank Keyword Search: \"${query}\" ━━━`));\n console.log(c.dim(` Mode: BM25 full-text (instant)`));\n printFilterInfo(sources, pathPrefix);\n console.log('');\n printResults(delegated, 0.40);\n return;\n }\n\n // Fall back to local\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 printFilterInfo(sources, pathPrefix);\n console.log('');\n\n const opts = buildSearchOptions(sources, pathPrefix);\n const results = await brain.searchBM25(query, opts);\n printResults(results, 0.40);\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 * Source filtering (same as search commands):\n * --code 20 Max code results (default: 20)\n * --git 5 Max git results\n * --no-git Skip git results\n * --no-code Skip code results\n * --path <dir> Filter results to files under path prefix(es) (comma-separated for multiple)\n * --ignore <paths> Exclude paths (comma-separated or repeated: --ignore a,b --ignore c)\n */\n\nimport { c, args, stripFlags, getFlag, getFlagAll, findDocsPlugin } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory/index.ts';\nimport { tryServerContext } from '@/cli/server-client.ts';\n\n/** Parse --code N, --git N, --no-git, --no-code flags into sources map. */\nfunction parseContextFlags(): Record<string, number> {\n const NON_SOURCE = new Set([\n 'repo', 'depth', 'collection', 'pattern', 'context', 'name',\n 'keep', 'pruner', 'only', 'docs-path', 'mode', 'limit',\n 'ignore', 'meta', 'k', 'yes', 'y', 'force', 'verbose', 'path',\n ]);\n const sources: Record<string, number> = {};\n for (let i = 0; i < args.length; i++) {\n if (!args[i].startsWith('--')) continue;\n const name = args[i].slice(2);\n // --no-git, --no-code → set to 0\n if (name.startsWith('no-')) {\n sources[name.slice(3)] = 0;\n continue;\n }\n // --code 20, --git 5\n const next = args[i + 1];\n if (next !== undefined && /^\\d+$/.test(next) && !NON_SOURCE.has(name)) {\n sources[name] = parseInt(next, 10);\n i++;\n }\n }\n return sources;\n}\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 const docsPlugin = findDocsPlugin(brain);\n if (!docsPlugin) { console.log(c.red('Docs plugin not loaded.')); process.exit(1); }\n docsPlugin.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 docsPlugin = findDocsPlugin(brain);\n if (!docsPlugin) { console.log(c.yellow(' Docs plugin not loaded.')); brain.close(); return; }\n const contexts = docsPlugin.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 sources = parseContextFlags();\n const rawPath = getFlag('path');\n const pathPrefix = rawPath\n ? rawPath.split(',').map(p => p.trim()).filter(Boolean)\n : undefined;\n // Normalize single-element array to string\n const normalizedPath = pathPrefix && pathPrefix.length === 1 ? pathPrefix[0] : pathPrefix;\n const ignorePaths = getFlagAll('ignore');\n const repo = getFlag('repo');\n\n // Parse BrainBankQL field flags\n const fields = parseFieldFlags();\n\n // Try HTTP server delegation first\n const serverResult = await tryServerContext({\n task,\n repo: repo ?? process.cwd(),\n sources: Object.keys(sources).length > 0 ? sources : undefined,\n pathPrefix: normalizedPath,\n });\n\n if (serverResult !== null) {\n console.log(serverResult);\n return;\n }\n\n // Fall back to local\n const brain = await createBrain();\n const context = await brain.getContext(task, {\n sources: Object.keys(sources).length > 0 ? sources : undefined,\n pathPrefix: normalizedPath,\n ignorePaths: ignorePaths.length > 0 ? ignorePaths : undefined,\n source: 'cli',\n fields: Object.keys(fields).length > 0 ? fields : undefined,\n });\n console.log(context);\n brain.close();\n}\n\n/** Parse BrainBankQL field flags: --lines, --symbols, --compact, --no-callTree, --callTree.depth=N, etc. */\nfunction parseFieldFlags(): Record<string, unknown> {\n const FIELD_BOOLEANS = new Set(['lines', 'symbols', 'compact', 'expander']);\n const FIELD_NEGATABLE = new Set(['callTree', 'imports']);\n const fields: Record<string, unknown> = {};\n\n for (let i = 0; i < args.length; i++) {\n if (!args[i].startsWith('--')) continue;\n const raw = args[i].slice(2);\n\n // --no-callTree, --no-imports → set to false\n if (raw.startsWith('no-')) {\n const name = raw.slice(3);\n if (FIELD_NEGATABLE.has(name)) {\n fields[name] = false;\n }\n continue;\n }\n\n // --callTree.depth=4 → { depth: 4 }\n const dotIdx = raw.indexOf('.');\n if (dotIdx > 0) {\n const fieldName = raw.slice(0, dotIdx);\n const rest = raw.slice(dotIdx + 1);\n const eqIdx = rest.indexOf('=');\n if (eqIdx > 0) {\n const key = rest.slice(0, eqIdx);\n const val = parseInt(rest.slice(eqIdx + 1), 10);\n if (!isNaN(val)) {\n fields[fieldName] = { [key]: val };\n }\n }\n continue;\n }\n\n // --lines, --symbols, --compact, --expander → true\n if (FIELD_BOOLEANS.has(raw)) {\n fields[raw] = true;\n }\n }\n\n return fields;\n}\n","/**\n * brainbank files <path|glob> [...paths] [--lines]\n *\n * Fetch full file contents from the index.\n * Use after `brainbank context` to view complete files identified by search.\n */\n\nimport { c, args, getFlag } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory/index.ts';\n\nexport async function cmdFiles(): Promise<void> {\n // Collect positional args (file patterns) — skip 'files' command itself\n const patterns: string[] = [];\n const showLines = args.includes('--lines');\n\n for (let i = 1; i < args.length; i++) {\n if (args[i].startsWith('--')) {\n // Skip --lines and --repo <value>\n if (args[i] === '--repo') {\n i++; // skip value\n }\n continue;\n }\n patterns.push(args[i]);\n }\n\n if (patterns.length === 0) {\n console.log(c.red('Usage: brainbank files <path|glob> [...paths] [--lines]'));\n console.log(c.dim(' Exact: brainbank files src/auth/login.ts'));\n console.log(c.dim(' Directory: brainbank files src/graph/'));\n console.log(c.dim(' Glob: brainbank files \"src/**/*.service.ts\"'));\n console.log(c.dim(' Fuzzy: brainbank files plugin.ts'));\n console.log(c.dim(' Lines: brainbank files src/plugin.ts --lines'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const results = brain.resolveFiles(patterns);\n\n if (results.length === 0) {\n console.log(c.yellow('No matching files found in the index.'));\n console.log(c.dim('Run `brainbank index` first to index your codebase.'));\n brain.close();\n return;\n }\n\n // Format output\n for (const r of results) {\n const meta = r.metadata as Record<string, unknown>;\n const startLine = (meta.startLine as number) ?? 1;\n\n console.log(c.bold(`\\n── ${r.filePath} ──\\n`));\n\n if (showLines) {\n const codeLines = r.content.split('\\n');\n const pad = String(startLine + codeLines.length - 1).length;\n for (let i = 0; i < codeLines.length; i++) {\n const lineNum = c.dim(`${String(startLine + i).padStart(pad)}|`);\n console.log(`${lineNum} ${codeLines[i]}`);\n }\n } else {\n console.log(r.content);\n }\n }\n\n console.log(c.dim(`\\n${results.length} file(s) resolved.`));\n brain.close();\n}\n","/** brainbank stats — Show index statistics (interactive TUI or plain text). */\n\nimport * as path from 'node:path';\nimport { c, args, getFlag } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory/index.ts';\n\n/** Convert camelCase/snake_case stat keys to human-readable labels. */\nfunction formatStatKey(key: string): string {\n return key\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, c => c.toUpperCase())\n .padEnd(16);\n}\n\nexport async function cmdStats(): Promise<void> {\n const plain = args.includes('--plain');\n\n if (!plain) {\n // Interactive TUI mode\n try {\n const repoPath = path.resolve(getFlag('repo') ?? process.cwd());\n const dbPath = path.join(repoPath, '.brainbank', 'data', 'brainbank.db');\n const configPath = path.join(repoPath, '.brainbank', 'config.json');\n\n const { runStatsTui } = await import('@/cli/tui/stats-tui.tsx');\n await runStatsTui(dbPath, repoPath, configPath);\n return;\n } catch (err: unknown) {\n // Fall back to plain mode if TUI fails (e.g., no DB, piped output)\n if (err instanceof Error && err.message.includes('ENOENT')) {\n console.log(c.yellow('No BrainBank database found. Run `brainbank index` first.\\n'));\n return;\n }\n // For other errors, fall through to plain mode\n }\n }\n\n // Plain text mode (original output)\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 for (const [name, pluginStats] of Object.entries(s)) {\n if (!pluginStats) continue;\n console.log(` ${c.cyan(name)}`);\n for (const [key, value] of Object.entries(pluginStats)) {\n console.log(` ${formatStatKey(key)}${value}`);\n }\n console.log('');\n }\n\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","/** brainbank reembed — Re-embed all vectors. */\n\nimport { c } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory/index.ts';\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: string, current: number, total: number) => {\n process.stdout.write(`\\r ${c.cyan(table.padEnd(8))} ${current}/${total}`);\n },\n });\n\n console.log('\\n');\n for (const [name, count] of Object.entries(result.counts)) {\n if (count > 0) {\n const label = name.charAt(0).toUpperCase() + name.slice(1);\n console.log(` ${c.green('✓')} ${label.padEnd(8)} ${count} vectors`);\n }\n }\n console.log(`\\n ${c.bold('Total')}: ${result.total} vectors regenerated\\n`);\n\n brain.close();\n}\n","/** brainbank watch — Watch for file changes. */\n\nimport { c } from '@/cli/utils.ts';\nimport { createBrain } from '@/cli/factory/index.ts';\nimport { loadConfig } from '@/cli/factory/config-loader.ts';\n\nexport async function cmdWatch(): Promise<void> {\n const brain = await createBrain();\n await brain.initialize();\n\n // Read ignore/include patterns from config (code.ignore + code.include)\n const config = await loadConfig(brain.config.repoPath);\n const codeIgnore = (config?.code as Record<string, unknown> | undefined)?.ignore as string[] ?? [];\n const codeInclude = (config?.code as Record<string, unknown> | undefined)?.include as string[] ?? [];\n\n console.log(c.bold('\\n━━━ BrainBank Watch ━━━\\n'));\n console.log(c.dim(` Watching ${brain.config.repoPath} for changes...`));\n if (codeInclude.length > 0) {\n console.log(c.dim(` Include: ${codeInclude.join(', ')}`));\n }\n if (codeIgnore.length > 0) {\n console.log(c.dim(` Ignoring: ${codeIgnore.join(', ')}`));\n }\n console.log(c.dim(' Press Ctrl+C to stop.\\n'));\n\n const watcher = brain.watch({\n debounceMs: 2000,\n ignore: codeIgnore,\n onIndex: (sourceId: string, pluginName: string) => {\n const ts = new Date().toLocaleTimeString();\n console.log(` ${c.dim(ts)} ${c.green('✓')} ${c.cyan(pluginName)}: ${sourceId}`);\n },\n onError: (err: Error) => {\n console.error(` ${c.red('✗')} ${err.message}`);\n },\n });\n\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","/** brainbank mcp — Start MCP server (stdio). */\n\nexport async function cmdMcp(): Promise<void> {\n // Import and run the MCP server directly from core\n await import('@/mcp/mcp-server.ts');\n}\n","/**\n * brainbank daemon — HTTP daemon for CLI delegation.\n *\n * brainbank daemon → Start foreground\n * brainbank daemon start → Start background (fork + PID file)\n * brainbank daemon stop → Stop background daemon\n * brainbank daemon restart → Stop + start\n */\n\nimport { c, args, getFlag, stripFlags } from '@/cli/utils.ts';\nimport { isServerRunning, removePid, DEFAULT_PORT } from '@/services/daemon.ts';\nimport { createBrain } from '@/cli/factory/index.ts';\n\nexport async function cmdDaemon(): Promise<void> {\n const pos = stripFlags(args);\n const sub = pos[1]; // start | stop | undefined\n\n if (sub === 'stop') return stopDaemon();\n if (sub === 'restart') { stopDaemon(); return forkDaemon(); }\n if (sub === 'start') return forkDaemon();\n return startForeground();\n}\n\n// ── Foreground ──────────────────────────────────\n\nasync function startForeground(): Promise<void> {\n const port = parseInt(getFlag('port') ?? String(DEFAULT_PORT), 10);\n const { HttpServer } = await import('@/services/http-server.ts');\n\n const server = new HttpServer({\n port,\n factory: async (repoPath: string) => {\n const brain = await createBrain(repoPath);\n await brain.initialize();\n return brain;\n },\n onError: (repo, err) => {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(c.red(` Pool error [${repo}]: ${msg}`));\n },\n onLog: (msg) => console.log(c.dim(` ${msg}`)),\n });\n\n console.log(c.bold('\\n━━━ BrainBank HTTP Daemon ━━━\\n'));\n\n await server.start();\n\n console.log(c.dim(` Port: ${port}`));\n console.log(c.dim(' Press Ctrl+C to stop.\\n'));\n\n const shutdown = () => {\n console.log(c.dim('\\n Shutting down...'));\n server.close();\n process.exit(0);\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n await new Promise(() => {});\n}\n\n// ── Background ──────────────────────────────────\n\nasync function forkDaemon(): Promise<void> {\n const port = parseInt(getFlag('port') ?? String(DEFAULT_PORT), 10);\n const { fork } = await import('node:child_process');\n\n const existing = isServerRunning();\n if (existing) {\n console.log(c.yellow(` Daemon already running (PID ${existing.pid}, port ${existing.port})`));\n return;\n }\n\n const child = fork(process.argv[1], ['daemon', '--port', String(port)], {\n detached: true,\n stdio: 'ignore',\n });\n\n child.unref();\n\n console.log(c.green(` ✓ Daemon started (PID ${child.pid}, port ${port})`));\n console.log(c.dim(' Stop with: brainbank daemon stop'));\n}\n\nfunction stopDaemon(): void {\n const info = isServerRunning();\n if (!info) {\n console.log(c.yellow(' No daemon running.'));\n return;\n }\n\n try {\n process.kill(info.pid, 'SIGTERM');\n removePid();\n console.log(c.green(` ✓ Daemon stopped (PID ${info.pid})`));\n } catch {\n removePid();\n console.log(c.yellow(` PID ${info.pid} not found. Cleaned up stale PID file.`));\n }\n}\n","/**\n * Status Command — Show BrainBank server status.\n *\n * Usage: brainbank status\n */\n\nimport { c } from '@/cli/utils.ts';\nimport { serverHealth } from '@/cli/server-client.ts';\nimport { isServerRunning } from '@/services/daemon.ts';\n\nfunction formatUptime(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n const remainMinutes = minutes % 60;\n return remainMinutes > 0 ? `${hours}h ${remainMinutes}m` : `${hours}h`;\n}\n\nexport async function cmdStatus(): Promise<void> {\n const info = isServerRunning();\n\n if (!info) {\n console.log(`\\n ${c.dim('HTTP Server:')} ${c.yellow('stopped')}\\n`);\n console.log(c.dim(' Start with: brainbank daemon'));\n console.log('');\n return;\n }\n\n // Try to get detailed health from the server\n const health = await serverHealth();\n\n if (health) {\n const uptime = formatUptime(health.uptime);\n console.log(`\\n ${c.dim('HTTP Server:')} ${c.green('running')}`);\n console.log(` ${c.dim('PID:')} ${health.pid}`);\n console.log(` ${c.dim('Port:')} ${health.port}`);\n console.log(` ${c.dim('Uptime:')} ${uptime}`);\n console.log(` ${c.dim('Workspaces:')} ${health.workspaces}`);\n console.log('');\n } else {\n // PID file exists but server not responding\n console.log(`\\n ${c.dim('HTTP Server:')} ${c.yellow('stale')} (PID ${info.pid} not responding)`);\n console.log(c.dim(' The PID file may be stale. Restart with: brainbank daemon'));\n console.log('');\n }\n}\n","/** brainbank help — Show CLI usage. */\n\nimport { c } from '@/cli/utils.ts';\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')} ${c.dim('(i)')} [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(c.dim(' All accept --repo <path> --path <dir> --<source> <n>'));\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(` ${c.cyan('files')} <path|glob> [...] [--lines] View full indexed files directly`);\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('mcp')} Start MCP server (stdio)`);\n console.log(` ${c.cyan('mcp:export')} [target] Export MCP config (antigravity)`);\n console.log(` ${c.cyan('daemon')} Start HTTP daemon (foreground)`);\n console.log(` ${c.cyan('daemon start')} Start HTTP daemon (background)`);\n console.log(` ${c.cyan('daemon stop')} Stop background daemon`);\n console.log(` ${c.cyan('daemon restart')} Restart background daemon`);\n console.log(` ${c.cyan('status')} Show daemon status`);\n console.log(` ${c.cyan('--version')} ${c.dim('(-v)')} Show version`);\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('--<source> <n>')} Source filter: max results from <source> (0 = skip)`);\n console.log(` ${c.dim('--path <dir>')} Filter context results to files under this path prefix`);\n console.log(` ${c.dim('--ignore <globs>')} Ignore glob patterns for code indexing (comma-separated)`);\n console.log(` ${c.dim('--include <globs>')} Include only these paths for code indexing (comma-separated)`);\n console.log(` ${c.dim('--yes / -y')} Skip interactive prompt (auto-select all available)`);\n console.log(` ${c.dim('--setup')} Re-run interactive setup (modules, folders, config)`);\n console.log(` ${c.dim('--port <n>')} HTTP daemon port (default: 8181)`);\n console.log('');\n console.log(c.bold('Examples:'));\n console.log(c.dim(' brainbank index .'));\n console.log(c.dim(' brainbank index . --ignore \"sdk/**,vendor/**\"'));\n console.log(c.dim(' brainbank index . --include \"src/**,lib/**\"'));\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 hsearch \"auth\" --code 0 --git 10 # git only'));\n console.log(c.dim(' brainbank search \"handler\" --git 0 # code only'));\n console.log(c.dim(' brainbank hsearch \"api\" --docs 10 --code 0 --git 0 # docs only'));\n console.log(c.dim(' brainbank context \"auth flow\" | pbcopy # → clipboard'));\n console.log(c.dim(' brainbank daemon start # background HTTP'));\n console.log(c.dim(' brainbank mcp # MCP stdio'));\n console.log(c.dim(' brainbank mcp:export antigravity # export MCP config'));\n}\n","#!/usr/bin/env node\n\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.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 { cmdFiles } from './commands/files.ts';\nimport { cmdStats } from './commands/stats.ts';\nimport { cmdReembed } from './commands/reembed.ts';\nimport { cmdWatch } from './commands/watch.ts';\nimport { cmdMcp } from './commands/mcp.ts';\nimport { cmdMcpExport } from './commands/mcp-export.ts';\nimport { cmdDaemon } from './commands/daemon.ts';\nimport { cmdStatus } from './commands/status.ts';\nimport { showHelp } from './commands/help.ts';\nimport { VERSION } from '@/constants.ts';\n\nconst command = args[0];\n\nasync function main(): Promise<void> {\n switch (command) {\n case '--version':\n case '-v':\n console.log(`brainbank v${VERSION}`);\n break;\n case 'i':\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 'files': return cmdFiles();\n case 'stats': return cmdStats();\n case 'reembed': return cmdReembed();\n case 'watch': return cmdWatch();\n case 'mcp': return cmdMcp();\n case 'mcp:export': return cmdMcpExport();\n case 'serve': return cmdMcp(); // backward compat\n case 'daemon': return cmdDaemon();\n case 'status': return cmdStatus();\n case 'help':\n case '--help':\n case '-h':\n showHelp();\n break;\n default:\n if (command) console.log(c.red(`Unknown command: ${command}\\n`));\n showHelp();\n process.exit(command ? 1 : 0);\n }\n}\n\nmain().catch(err => {\n console.error(c.red(`Error: ${err.message}`));\n if (process.env.BRAINBANK_DEBUG) console.error(err.stack);\n process.exit(1);\n});\n"],"mappings":"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","names":["fs","path","fs","path","fs","path","execSync","picomatch","picomatch","c","execSync","check","checkColor","path","brain","coll","path","resolve","path","brain","path","c"]}
@@ -0,0 +1,8 @@
1
+ import {
2
+ HaikuExpander
3
+ } from "./chunk-OPH7GZ7U.js";
4
+ import "./chunk-WCQVDF3K.js";
5
+ export {
6
+ HaikuExpander
7
+ };
8
+ //# sourceMappingURL=haiku-expander-YRSIPGKP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,8 @@
1
+ import {
2
+ HaikuPruner
3
+ } from "./chunk-PXEWQMN7.js";
4
+ import "./chunk-WCQVDF3K.js";
5
+ export {
6
+ HaikuPruner
7
+ };
8
+ //# sourceMappingURL=haiku-pruner-SHAXUPY6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}