bluera-knowledge 0.33.2 → 0.34.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bluera-knowledge",
3
- "version": "0.33.1",
3
+ "version": "0.34.1",
4
4
  "description": "Clone repos, crawl docs, search locally. Fast, authoritative answers for AI coding agents.",
5
5
  "author": {
6
6
  "name": "Bluera Inc",
@@ -1,6 +1,4 @@
1
1
  {
2
- "skill_activation": false,
3
2
  "websearch_suggestions": false,
4
- "webfetch_suggestions": false,
5
- "bk_read_suggestions": false
3
+ "webfetch_suggestions": false
6
4
  }
package/CHANGELOG.md CHANGED
@@ -2,6 +2,40 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
4
4
 
5
+ ## [0.34.1](https://github.com/blueraai/bluera-knowledge/compare/v0.34.0...v0.34.1) (2026-03-12)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * **mcp:** expand shell variables in PROJECT_ROOT to prevent literal ${PWD} directories ([2ab025f](https://github.com/blueraai/bluera-knowledge/commit/2ab025f42fb8d063cccc3dacfc47ed87d299d634))
11
+
12
+ ## [0.34.0](https://github.com/blueraai/bluera-knowledge/compare/v0.28.0...v0.34.0) (2026-03-08)
13
+
14
+
15
+ ### Features
16
+
17
+ * **activation:** rewrite MCP tool descriptions and simplify hooks for proactive BK usage ([0880aa7](https://github.com/blueraai/bluera-knowledge/commit/0880aa78aa8189957555c58d6e67a562cbae13cb))
18
+ * add statusline module with store count display ([4446501](https://github.com/blueraai/bluera-knowledge/commit/44465015a4734cd7c253bda51c98ce149561fda8))
19
+ * **eval:** 3-agent comparison with BK Grep agent and token tracking ([b3045a8](https://github.com/blueraai/bluera-knowledge/commit/b3045a8ae7df7a2e13ecdf992ff4d1055521460b))
20
+ * **eval:** add agent quality eval comparing with-BK vs without-BK answers ([d8c62d8](https://github.com/blueraai/bluera-knowledge/commit/d8c62d804bd10d572049f4f2a01deb30cb00ccf5))
21
+ * **hooks:** add PostToolUse hook for WebSearch BK suggestions ([d0420b4](https://github.com/blueraai/bluera-knowledge/commit/d0420b473c73092b5e6a28be2699f5fc40e090c3))
22
+ * **mcp:** add file count estimation and ETA to store creation responses ([3d71a30](https://github.com/blueraai/bluera-knowledge/commit/3d71a307275fa06b9810ed606583f4ec2acc5841))
23
+ * **mcp:** add stores:pull command for git pull + re-index ([7ca809c](https://github.com/blueraai/bluera-knowledge/commit/7ca809c3675be19d9d0e29e71c5f75d4f40fce35))
24
+ * **mcp:** optimize search-to-read workflow with store paths, relatedFiles, find-files intent, and file-based get_full_context ([4eb9be9](https://github.com/blueraai/bluera-knowledge/commit/4eb9be97598e475576603b2b9a565946197986ac))
25
+ * search infrastructure, benchmark framework, and model registry ([285ff2f](https://github.com/blueraai/bluera-knowledge/commit/285ff2f5574c4d53b61b31e84fdec43553364e98))
26
+ * **search:** add strong-signal FTS bypass, position-aware reranking, and query expansion ([c9b6eac](https://github.com/blueraai/bluera-knowledge/commit/c9b6eac7de9a6f17100b37879304df5a634b5559))
27
+ * training pipeline, evaluation gate, and experiment docs ([d90b395](https://github.com/blueraai/bluera-knowledge/commit/d90b395a330f4ab09ac6d71db77d659c415aa87d))
28
+
29
+
30
+ ### Bug Fixes
31
+
32
+ * **ci:** remove simple mode from validation and lower coverage threshold ([7aea1ac](https://github.com/blueraai/bluera-knowledge/commit/7aea1ac466de8ee13c6dc85c00932838d41ff829))
33
+ * **config:** wire BK_MODEL env var override in ConfigService.load() ([be56426](https://github.com/blueraai/bluera-knowledge/commit/be564263176410c3eb1441bf85c4fdce48ddc7c4))
34
+ * **crawl:** fix nested session error and remove simple mode ([79447b4](https://github.com/blueraai/bluera-knowledge/commit/79447b4604e54760af433deb21e177f9a71cbe8e))
35
+ * **hooks:** drain stdin in shell hooks, register web-research hook, add settings.json ([1cff9b8](https://github.com/blueraai/bluera-knowledge/commit/1cff9b8ab38e732ffa6d9fb2de8b398fddc98302))
36
+ * **mcp:** add runtime files to package.json files array and improve bootstrap error on corrupt cache ([e195f93](https://github.com/blueraai/bluera-knowledge/commit/e195f93a4600c65bcd0fcbb45380aaa1d32bb356))
37
+ * **mcp:** prevent browser postinstall from crashing bootstrap ([e27fe02](https://github.com/blueraai/bluera-knowledge/commit/e27fe021bdb34c8ca5b8bf93720a176435e7973c))
38
+
5
39
  ## [0.33.1](https://github.com/blueraai/bluera-knowledge/compare/v0.28.0...v0.33.1) (2026-03-03)
6
40
 
7
41
 
@@ -2,7 +2,7 @@ import {
2
2
  createLogger,
3
3
  summarizePayload,
4
4
  truncateForLog
5
- } from "./chunk-SROFPHRA.js";
5
+ } from "./chunk-VELBEZVB.js";
6
6
 
7
7
  // src/crawl/intelligent-crawler.ts
8
8
  import { EventEmitter } from "events";
@@ -798,4 +798,4 @@ export {
798
798
  getCrawlStrategy,
799
799
  IntelligentCrawler
800
800
  };
801
- //# sourceMappingURL=chunk-OMXQBWCR.js.map
801
+ //# sourceMappingURL=chunk-TD3VX74F.js.map
@@ -12,7 +12,7 @@ import {
12
12
  isWebStoreDefinition,
13
13
  ok,
14
14
  summarizePayload
15
- } from "./chunk-SROFPHRA.js";
15
+ } from "./chunk-VELBEZVB.js";
16
16
  import {
17
17
  DEFAULT_IGNORE_DIRS,
18
18
  checkStoreModelCompatibility
@@ -2638,7 +2638,7 @@ function createMCPServer(options, services) {
2638
2638
  // Native search tool with full schema (most used, benefits from detailed params)
2639
2639
  {
2640
2640
  name: "search",
2641
- description: "Search all indexed knowledge stores with pattern detection and AI-optimized results. Returns structured code units with progressive context layers.",
2641
+ description: "Search indexed library source code, documentation, and API references. You MUST use this tool to look up library/dependency details BEFORE relying on training data or grepping node_modules/vendor directories. Use whenever a question involves a third-party library, framework, or dependency. Returns structured code units with progressive context layers.",
2642
2642
  inputSchema: {
2643
2643
  type: "object",
2644
2644
  properties: {
@@ -2717,7 +2717,7 @@ function createMCPServer(options, services) {
2717
2717
  // Meta-tool for store and job management (consolidates 8 tools into 1)
2718
2718
  {
2719
2719
  name: "execute",
2720
- description: "Execute store/job management commands. Commands: stores, store:info, store:create, store:index, store:delete, jobs, job:status, job:cancel, stores:sync, uninstall, help, commands",
2720
+ description: "Execute store/job management commands. Use 'stores' command to check which libraries are indexed. Commands: stores, store:info, store:create, store:index, store:delete, jobs, job:status, job:cancel, stores:sync, uninstall, help, commands",
2721
2721
  inputSchema: {
2722
2722
  type: "object",
2723
2723
  properties: {
@@ -2803,10 +2803,14 @@ async function runMCPServer(options) {
2803
2803
  var scriptPath = process.argv[1] ?? "";
2804
2804
  var isMCPServerEntry = scriptPath.endsWith("mcp/server.js") || scriptPath.endsWith("mcp/server");
2805
2805
  if (isMCPServerEntry) {
2806
- const projectRoot = process.env["PROJECT_ROOT"];
2807
- if (projectRoot === void 0) {
2806
+ const rawProjectRoot = process.env["PROJECT_ROOT"];
2807
+ if (rawProjectRoot === void 0) {
2808
2808
  throw new Error("PROJECT_ROOT environment variable is required");
2809
2809
  }
2810
+ const projectRoot = rawProjectRoot.replace(
2811
+ /\$\{(\w+)\}/g,
2812
+ (match, name) => process.env[name] ?? match
2813
+ );
2810
2814
  runMCPServer({
2811
2815
  dataDir: process.env["DATA_DIR"],
2812
2816
  config: process.env["CONFIG_PATH"],
@@ -2826,4 +2830,4 @@ export {
2826
2830
  createMCPServer,
2827
2831
  runMCPServer
2828
2832
  };
2829
- //# sourceMappingURL=chunk-OPLZTNKK.js.map
2833
+ //# sourceMappingURL=chunk-V5MWZM5X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mcp/server.ts","../src/analysis/zil/zil-lexer.ts","../src/analysis/zil/zil-special-forms.ts","../src/analysis/zil/zil-parser.ts","../src/analysis/zil/zil-adapter.ts","../src/mcp/commands/job.commands.ts","../src/mcp/schemas/index.ts","../src/mcp/handlers/job.handler.ts","../src/mcp/commands/meta.commands.ts","../src/mcp/commands/registry.ts","../src/mcp/commands/store.commands.ts","../src/plugin/git-pull.ts","../src/utils/eta.ts","../src/utils/file-count.ts","../src/workers/spawn-worker.ts","../src/mcp/handlers/pull.handler.ts","../src/mcp/handlers/store.handler.ts","../src/mcp/commands/sync.commands.ts","../src/mcp/commands/uninstall.commands.ts","../src/mcp/handlers/uninstall.handler.ts","../src/mcp/commands/index.ts","../src/mcp/handlers/execute.handler.ts","../src/services/token.service.ts","../src/mcp/cache.ts","../src/mcp/handlers/search.handler.ts","../src/mcp/handlers/index.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';\nimport { AdapterRegistry } from '../analysis/adapter-registry.js';\nimport { ZilAdapter } from '../analysis/zil/index.js';\nimport { createLogger } from '../logging/index.js';\nimport { createLazyServices, destroyServices, type ServiceContainer } from '../services/index.js';\nimport { handleExecute } from './handlers/execute.handler.js';\nimport { tools } from './handlers/index.js';\nimport { ExecuteArgsSchema } from './schemas/index.js';\nimport type { MCPServerOptions } from './types.js';\n\nconst logger = createLogger('mcp-server');\n\n// Register built-in language adapters\nconst registry = AdapterRegistry.getInstance();\nif (!registry.hasExtension('.zil')) {\n registry.register(new ZilAdapter());\n}\n\n/**\n * Create MCP server with pre-initialized services.\n *\n * Services are initialized ONCE at server startup and reused for all tool calls.\n * This reduces per-call latency from 1-15s to <500ms.\n */\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nexport function createMCPServer(options: MCPServerOptions, services: ServiceContainer): Server {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n const server = new Server(\n {\n name: 'bluera-knowledge',\n version: '1.0.0',\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n // List available tools - consolidated from 10 tools to 3 for reduced context overhead\n server.setRequestHandler(ListToolsRequestSchema, () => {\n return Promise.resolve({\n tools: [\n // Native search tool with full schema (most used, benefits from detailed params)\n {\n name: 'search',\n description:\n 'Search indexed library source code, documentation, and API references. You MUST use this tool to look up library/dependency details BEFORE relying on training data or grepping node_modules/vendor directories. Use whenever a question involves a third-party library, framework, or dependency. Returns structured code units with progressive context layers.',\n inputSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description:\n 'Search query (can include type signatures, constraints, or natural language)',\n },\n intent: {\n type: 'string',\n enum: [\n 'find-pattern',\n 'find-implementation',\n 'find-usage',\n 'find-definition',\n 'find-documentation',\n 'find-files',\n ],\n description: 'Search intent for better ranking',\n },\n mode: {\n type: 'string',\n enum: ['vector', 'fts', 'hybrid'],\n default: 'hybrid',\n description:\n 'Search mode: vector (embeddings only), fts (full-text only), hybrid (both, default)',\n },\n detail: {\n type: 'string',\n enum: ['minimal', 'contextual', 'full'],\n default: 'minimal',\n description:\n 'Context detail level: minimal (summary only), contextual (+ imports/types), full (+ complete code)',\n },\n limit: {\n type: 'number',\n default: 10,\n description: 'Maximum number of results',\n },\n stores: {\n type: 'array',\n items: { type: 'string' },\n description: 'Specific store IDs to search (optional)',\n },\n threshold: {\n type: 'number',\n description: 'Minimum normalized score (0-1). Filters out low-relevance results.',\n },\n minRelevance: {\n type: 'number',\n description:\n 'Minimum raw cosine similarity (0-1). Returns empty if no results meet threshold. Use to filter irrelevant results.',\n },\n },\n required: ['query'],\n },\n },\n // Native get_full_context tool (frequently used after search)\n {\n name: 'get_full_context',\n description:\n 'Get complete code and context for a specific search result by ID. Use this after search to get full implementation details.',\n inputSchema: {\n type: 'object',\n properties: {\n resultId: {\n type: 'string',\n description: 'Result ID from previous search',\n },\n file: {\n type: 'string',\n description: 'File path to retrieve context for (alternative to resultId)',\n },\n store: {\n type: 'string',\n description: 'Store name to scope file lookup (optional, searches all if omitted)',\n },\n },\n },\n },\n // Meta-tool for store and job management (consolidates 8 tools into 1)\n {\n name: 'execute',\n description:\n \"Execute store/job management commands. Use 'stores' command to check which libraries are indexed. Commands: stores, store:info, store:create, store:index, store:delete, jobs, job:status, job:cancel, stores:sync, uninstall, help, commands\",\n inputSchema: {\n type: 'object',\n properties: {\n command: {\n type: 'string',\n description: 'Command to execute (e.g., \"stores\", \"store:create\", \"jobs\", \"help\")',\n },\n args: {\n type: 'object',\n description: 'Command arguments (e.g., {store: \"mystore\"} for store:info)',\n },\n },\n required: ['command'],\n },\n },\n ],\n });\n });\n\n // Handle tool calls - services are pre-initialized and reused\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n const startTime = Date.now();\n\n logger.info({ tool: name, args: JSON.stringify(args) }, 'Tool invoked');\n\n // Use pre-initialized services (no per-call creation overhead)\n const context = { services, options };\n\n try {\n let result;\n\n // Handle execute meta-tool\n if (name === 'execute') {\n const validated = ExecuteArgsSchema.parse(args ?? {});\n result = await handleExecute(validated, context);\n } else {\n // Find handler in registry for native tools (search, get_full_context)\n const tool = tools.find((t) => t.name === name);\n if (tool === undefined) {\n throw new Error(`Unknown tool: ${name}`);\n }\n\n // Validate arguments with Zod\n const validated = tool.schema.parse(args ?? {});\n\n // Execute handler with context\n result = await tool.handler(validated, context);\n }\n\n const durationMs = Date.now() - startTime;\n logger.info({ tool: name, durationMs }, 'Tool completed');\n\n return result;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n logger.error(\n {\n tool: name,\n durationMs,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Tool execution failed'\n );\n throw error;\n }\n // No per-call cleanup - services stay alive for server lifetime\n });\n\n return server;\n}\n\n/**\n * Run MCP server with lazy service initialization.\n *\n * Services are initialized ONCE at startup:\n * - Lightweight services (config, store, lance wrapper): immediate\n * - Heavy services (embeddings model): deferred until first use\n *\n * This reduces server startup from ~5s to <500ms.\n */\nexport async function runMCPServer(options: MCPServerOptions): Promise<void> {\n logger.info(\n {\n dataDir: options.dataDir,\n projectRoot: options.projectRoot,\n },\n 'MCP server starting'\n );\n\n // Initialize services ONCE at startup (with lazy loading for heavy components)\n const services = await createLazyServices(options.config, options.dataDir, options.projectRoot);\n\n const server = createMCPServer(options, services);\n const transport = new StdioServerTransport();\n\n // Graceful shutdown handler\n const shutdown = async (signal: string): Promise<void> => {\n logger.info({ signal }, 'Shutdown signal received');\n try {\n await destroyServices(services);\n logger.info('Services destroyed, exiting');\n } catch (error) {\n logger.error(\n { error: error instanceof Error ? error.message : String(error) },\n 'Error during shutdown'\n );\n }\n // Let the process exit naturally after cleanup\n };\n\n process.on('SIGINT', () => void shutdown('SIGINT'));\n process.on('SIGTERM', () => void shutdown('SIGTERM'));\n\n await server.connect(transport);\n\n logger.info('MCP server connected to stdio transport');\n}\n\n// Run the server only when this file is executed directly (not imported by CLI)\n// Check if we're running as the mcp/server entry point vs being imported by index.js\nconst scriptPath = process.argv[1] ?? '';\nconst isMCPServerEntry = scriptPath.endsWith('mcp/server.js') || scriptPath.endsWith('mcp/server');\n\nif (isMCPServerEntry) {\n const rawProjectRoot = process.env['PROJECT_ROOT'];\n if (rawProjectRoot === undefined) {\n throw new Error('PROJECT_ROOT environment variable is required');\n }\n // Expand shell variables that Claude Code doesn't expand in MCP env vars\n const projectRoot = rawProjectRoot.replace(\n /\\$\\{(\\w+)\\}/g,\n (match, name: string) => process.env[name] ?? match\n );\n runMCPServer({\n dataDir: process.env['DATA_DIR'],\n config: process.env['CONFIG_PATH'],\n projectRoot,\n }).catch((error: unknown) => {\n logger.error(\n { error: error instanceof Error ? error.message : String(error) },\n 'Failed to start MCP server'\n );\n process.exit(1);\n });\n}\n","/**\n * ZIL Lexer\n *\n * Tokenizes ZIL (Zork Implementation Language) source code.\n * ZIL is a Lisp-like language with angle brackets for forms instead of parentheses.\n *\n * Key syntax:\n * - Forms: <FORM arg1 arg2 ...>\n * - Strings: \"text\"\n * - Numbers: 42, -10\n * - Atoms: ROUTINE, V-LOOK, EQUAL?\n * - Comments: ; line comment\n * - Global refs: ,FOO\n * - Local refs: .BAR\n */\n\nexport enum TokenType {\n LANGLE = 'LANGLE', // <\n RANGLE = 'RANGLE', // >\n LPAREN = 'LPAREN', // (\n RPAREN = 'RPAREN', // )\n ATOM = 'ATOM', // Symbols/identifiers\n STRING = 'STRING', // \"text\"\n NUMBER = 'NUMBER', // 42, -10\n}\n\nexport interface Token {\n type: TokenType;\n value: string;\n line: number;\n column: number;\n}\n\n/**\n * Lexer for ZIL source code\n */\nexport class ZilLexer {\n private input = '';\n private pos = 0;\n private line = 1;\n private column = 1;\n private tokens: Token[] = [];\n\n /**\n * Tokenize ZIL source code\n *\n * @param input - Source code string\n * @returns Array of tokens\n * @throws On unterminated strings\n */\n tokenize(input: string): Token[] {\n this.input = input;\n this.pos = 0;\n this.line = 1;\n this.column = 1;\n this.tokens = [];\n\n while (!this.isAtEnd()) {\n this.scanToken();\n }\n\n return this.tokens;\n }\n\n private isAtEnd(): boolean {\n return this.pos >= this.input.length;\n }\n\n private peek(): string {\n if (this.isAtEnd()) return '\\0';\n return this.input[this.pos] ?? '\\0';\n }\n\n private advance(): string {\n const char = this.input[this.pos] ?? '\\0';\n this.pos++;\n\n if (char === '\\n') {\n this.line++;\n this.column = 1;\n } else {\n this.column++;\n }\n\n return char;\n }\n\n private addToken(type: TokenType, value: string, startLine: number, startColumn: number): void {\n this.tokens.push({\n type,\n value,\n line: startLine,\n column: startColumn,\n });\n }\n\n private scanToken(): void {\n const startLine = this.line;\n const startColumn = this.column;\n const char = this.advance();\n\n switch (char) {\n case '<':\n this.addToken(TokenType.LANGLE, '<', startLine, startColumn);\n break;\n case '>':\n this.addToken(TokenType.RANGLE, '>', startLine, startColumn);\n break;\n case '(':\n this.addToken(TokenType.LPAREN, '(', startLine, startColumn);\n break;\n case ')':\n this.addToken(TokenType.RPAREN, ')', startLine, startColumn);\n break;\n case '\"':\n this.scanString(startLine, startColumn);\n break;\n case ';':\n this.skipComment();\n break;\n case ' ':\n case '\\t':\n case '\\r':\n case '\\n':\n // Skip whitespace\n break;\n default:\n if (this.isDigit(char) || (char === '-' && this.isDigit(this.peek()))) {\n this.scanNumber(char, startLine, startColumn);\n } else if (this.isAtomStart(char)) {\n this.scanAtom(char, startLine, startColumn);\n }\n // Ignore other characters\n break;\n }\n }\n\n private scanString(startLine: number, startColumn: number): void {\n let value = '';\n\n while (!this.isAtEnd() && this.peek() !== '\"') {\n const char = this.peek();\n\n if (char === '\\\\') {\n this.advance(); // consume backslash\n const escaped = this.advance();\n switch (escaped) {\n case '\"':\n value += '\"';\n break;\n case '\\\\':\n value += '\\\\';\n break;\n case 'n':\n value += '\\n';\n break;\n case 't':\n value += '\\t';\n break;\n default:\n value += escaped;\n break;\n }\n } else {\n value += this.advance();\n }\n }\n\n if (this.isAtEnd()) {\n throw new Error(\n `Unterminated string at line ${String(startLine)}, column ${String(startColumn)}`\n );\n }\n\n // Consume closing quote\n this.advance();\n\n this.addToken(TokenType.STRING, value, startLine, startColumn);\n }\n\n private scanNumber(firstChar: string, startLine: number, startColumn: number): void {\n let value = firstChar;\n\n while (this.isDigit(this.peek())) {\n value += this.advance();\n }\n\n this.addToken(TokenType.NUMBER, value, startLine, startColumn);\n }\n\n private scanAtom(firstChar: string, startLine: number, startColumn: number): void {\n let value = firstChar;\n\n while (this.isAtomChar(this.peek())) {\n value += this.advance();\n }\n\n this.addToken(TokenType.ATOM, value, startLine, startColumn);\n }\n\n private skipComment(): void {\n // Skip until end of line\n while (!this.isAtEnd() && this.peek() !== '\\n') {\n this.advance();\n }\n }\n\n private isDigit(char: string): boolean {\n return char >= '0' && char <= '9';\n }\n\n private isAtomStart(char: string): boolean {\n return (\n (char >= 'A' && char <= 'Z') ||\n (char >= 'a' && char <= 'z') ||\n char === '_' ||\n char === ',' || // Global reference prefix\n char === '.' || // Local reference prefix\n char === '%' || // Sometimes used in ZIL\n char === '#' // Hash prefix\n );\n }\n\n private isAtomChar(char: string): boolean {\n return (\n (char >= 'A' && char <= 'Z') ||\n (char >= 'a' && char <= 'z') ||\n (char >= '0' && char <= '9') ||\n char === '_' ||\n char === '-' ||\n char === '?' ||\n char === '!' ||\n char === ',' ||\n char === '.' ||\n char === '%' ||\n char === '#'\n );\n }\n}\n","/**\n * ZIL Special Forms and Builtins\n *\n * These are NOT treated as function calls when building the call graph.\n * Special forms are control flow, assignment, and predicates.\n * Builtins are runtime primitives.\n */\n\n/**\n * Special forms - language-level constructs, not function calls\n */\nexport const ZIL_SPECIAL_FORMS = new Set([\n // Conditionals\n 'COND',\n 'AND',\n 'OR',\n 'NOT',\n 'IF',\n 'ELSE',\n\n // Assignment\n 'SET',\n 'SETG',\n 'BIND',\n 'PROG',\n\n // Loops\n 'REPEAT',\n 'DO',\n 'MAP',\n 'MAPF',\n 'MAPR',\n 'MAPRET',\n 'MAPLEAVE',\n\n // Output\n 'TELL',\n 'PRINT',\n 'PRINTN',\n 'PRINTD',\n 'PRINTC',\n 'PRINTR',\n 'CRLF',\n\n // Control flow\n 'RETURN',\n 'AGAIN',\n 'RTRUE',\n 'RFALSE',\n 'QUIT',\n\n // Predicates (end with ?)\n 'EQUAL?',\n 'ZERO?',\n 'LESS?',\n 'GRTR?',\n 'FSET?',\n 'IN?',\n 'VERB?',\n 'PRSO?',\n 'PRSI?',\n 'HELD?',\n 'HERE?',\n 'ACCESSIBLE?',\n 'VISIBLE?',\n 'FIRST?',\n 'NEXT?',\n 'PROB?',\n 'RANDOM',\n\n // Property/flag manipulation\n 'FSET',\n 'FCLEAR',\n 'GETP',\n 'PUTP',\n 'GETPT',\n 'PTSIZE',\n\n // Object manipulation\n 'MOVE',\n 'REMOVE',\n 'LOC',\n 'FIRST',\n 'NEXT',\n\n // Arithmetic\n 'ADD',\n 'SUB',\n 'MUL',\n 'DIV',\n 'MOD',\n 'BAND',\n 'BOR',\n 'BCOM',\n 'LSH',\n\n // Table operations\n 'GET',\n 'PUT',\n 'GETB',\n 'PUTB',\n 'TABLE',\n 'ITABLE',\n 'LTABLE',\n 'PTABLE',\n\n // Stack operations\n 'PUSH',\n 'POP',\n 'FSTACK',\n\n // Input\n 'READ',\n 'INPUT',\n 'READLINE',\n\n // Definition forms (handled separately for symbol extraction)\n 'ROUTINE',\n 'OBJECT',\n 'ROOM',\n 'GLOBAL',\n 'CONSTANT',\n 'SYNTAX',\n 'INSERT-FILE',\n\n // Misc builtins\n 'VERSION?',\n 'ASCII',\n 'USL',\n 'APPLY',\n 'EVAL',\n 'FORM',\n 'REST',\n 'LENGTH',\n 'NTH',\n 'ZGET',\n 'ZPUT',\n 'ZWSTR',\n 'DIROUT',\n 'DIRIN',\n 'BUFOUT',\n 'HLIGHT',\n 'COLOR',\n 'FONT',\n 'SPLIT',\n 'SCREEN',\n 'WINGET',\n 'WINPUT',\n 'WINATTR',\n 'PICINF',\n 'DISPLAY',\n 'DCLEAR',\n 'SOUND',\n 'INTBL?',\n 'CATCH',\n 'THROW',\n 'LEGAL?',\n 'COPYT',\n 'VALUE',\n 'GASSIGNED?',\n 'ASSIGNED?',\n 'DEFINE',\n 'DEFMAC',\n]);\n\n/**\n * Check if a form head is a special form or builtin\n */\nexport function isSpecialForm(name: string): boolean {\n return ZIL_SPECIAL_FORMS.has(name.toUpperCase());\n}\n\n/**\n * Definition forms that create symbols\n */\nexport const ZIL_DEFINITION_FORMS = new Set([\n 'ROUTINE',\n 'OBJECT',\n 'ROOM',\n 'GLOBAL',\n 'CONSTANT',\n 'SYNTAX',\n 'VERB',\n 'DEFINE',\n 'DEFMAC',\n]);\n\n/**\n * Check if a form head is a definition form\n */\nexport function isDefinitionForm(name: string): boolean {\n return ZIL_DEFINITION_FORMS.has(name.toUpperCase());\n}\n","/**\n * ZIL Parser\n *\n * Parses ZIL source code into an AST-like structure and extracts:\n * - Symbols (ROUTINE, OBJECT, ROOM, GLOBAL, CONSTANT, SYNTAX)\n * - Imports (INSERT-FILE)\n * - Call relationships (filtering out special forms)\n */\n\nimport { ZilLexer, TokenType, type Token } from './zil-lexer.js';\nimport { isSpecialForm, isDefinitionForm } from './zil-special-forms.js';\nimport type { ImportInfo } from '../ast-parser.js';\n\n/**\n * A ZIL form node (angle-bracket expression)\n */\nexport interface ZilForm {\n /** The head/operator of the form (first atom after <) */\n head: string;\n /** Child nodes (atoms, strings, numbers, nested forms) */\n children: ZilNode[];\n /** Starting line number */\n startLine: number;\n /** Ending line number */\n endLine: number;\n}\n\n/**\n * A parenthesized group (used for args lists)\n */\nexport interface ZilGroup {\n type: 'group';\n children: ZilNode[];\n startLine: number;\n endLine: number;\n}\n\n/**\n * A leaf node (atom, string, or number)\n */\nexport interface ZilLeaf {\n type: 'atom' | 'string' | 'number';\n value: string;\n line: number;\n}\n\nexport type ZilNode = ZilForm | ZilGroup | ZilLeaf;\n\n/**\n * Extracted symbol from ZIL code\n */\nexport interface ZilSymbol {\n name: string;\n kind: 'routine' | 'object' | 'room' | 'global' | 'constant' | 'syntax' | 'verb';\n startLine: number;\n endLine: number;\n signature?: string;\n}\n\n/**\n * A function call extracted from ZIL code\n */\nexport interface ZilCall {\n caller: string;\n callee: string;\n line: number;\n}\n\n/**\n * Result of parsing a ZIL file\n */\nexport interface ZilParseResult {\n forms: ZilForm[];\n symbols: ZilSymbol[];\n imports: ImportInfo[];\n calls: ZilCall[];\n}\n\n/**\n * Parser for ZIL source code\n */\nexport class ZilParser {\n private readonly lexer = new ZilLexer();\n private tokens: Token[] = [];\n private pos = 0;\n\n /**\n * Parse ZIL source code\n */\n parse(input: string): ZilParseResult {\n this.tokens = this.lexer.tokenize(input);\n this.pos = 0;\n\n const forms: ZilForm[] = [];\n const symbols: ZilSymbol[] = [];\n const imports: ImportInfo[] = [];\n const calls: ZilCall[] = [];\n\n // Parse all top-level forms\n while (!this.isAtEnd()) {\n if (this.check(TokenType.LANGLE)) {\n const form = this.parseForm();\n if (form !== undefined) {\n forms.push(form);\n\n // Extract symbols from definition forms\n const symbol = this.extractSymbol(form);\n if (symbol !== undefined) {\n symbols.push(symbol);\n }\n\n // Extract imports from INSERT-FILE\n const imp = this.extractImport(form);\n if (imp !== undefined) {\n imports.push(imp);\n }\n\n // Extract calls from routines\n if (form.head.toUpperCase() === 'ROUTINE') {\n const routineName = this.getRoutineName(form);\n if (routineName !== undefined) {\n this.extractCalls(form, routineName, calls);\n }\n }\n }\n } else {\n // Skip non-form tokens at top level\n this.advance();\n }\n }\n\n return { forms, symbols, imports, calls };\n }\n\n private isAtEnd(): boolean {\n return this.pos >= this.tokens.length;\n }\n\n private peek(): Token | undefined {\n return this.tokens[this.pos];\n }\n\n private check(type: TokenType): boolean {\n if (this.isAtEnd()) return false;\n return this.peek()?.type === type;\n }\n\n private advance(): Token | undefined {\n if (!this.isAtEnd()) {\n const token = this.tokens[this.pos];\n this.pos++;\n return token;\n }\n return undefined;\n }\n\n private parseForm(): ZilForm | undefined {\n if (!this.check(TokenType.LANGLE)) return undefined;\n\n const startToken = this.advance(); // consume <\n const startLine = startToken?.line ?? 1;\n let endLine = startLine;\n\n // Get the head (first element)\n let head = '';\n if (this.check(TokenType.ATOM)) {\n head = this.advance()?.value ?? '';\n }\n\n const children: ZilNode[] = [];\n\n // Parse children until >\n while (!this.isAtEnd() && !this.check(TokenType.RANGLE)) {\n const child = this.parseNode();\n if (child !== undefined) {\n children.push(child);\n endLine = this.getNodeEndLine(child);\n } else {\n // Skip unexpected tokens\n this.advance();\n }\n }\n\n if (this.check(TokenType.RANGLE)) {\n const closeToken = this.advance();\n endLine = closeToken?.line ?? endLine;\n }\n\n return { head, children, startLine, endLine };\n }\n\n private parseGroup(): ZilGroup | undefined {\n if (!this.check(TokenType.LPAREN)) return undefined;\n\n const startToken = this.advance(); // consume (\n const startLine = startToken?.line ?? 1;\n let endLine = startLine;\n\n const children: ZilNode[] = [];\n\n while (!this.isAtEnd() && !this.check(TokenType.RPAREN)) {\n const child = this.parseNode();\n if (child !== undefined) {\n children.push(child);\n endLine = this.getNodeEndLine(child);\n } else {\n this.advance();\n }\n }\n\n if (this.check(TokenType.RPAREN)) {\n const closeToken = this.advance();\n endLine = closeToken?.line ?? endLine;\n }\n\n return { type: 'group', children, startLine, endLine };\n }\n\n private parseNode(): ZilNode | undefined {\n const token = this.peek();\n if (token === undefined) return undefined;\n\n switch (token.type) {\n case TokenType.LANGLE:\n return this.parseForm();\n case TokenType.LPAREN:\n return this.parseGroup();\n case TokenType.ATOM:\n this.advance();\n return { type: 'atom', value: token.value, line: token.line };\n case TokenType.STRING:\n this.advance();\n return { type: 'string', value: token.value, line: token.line };\n case TokenType.NUMBER:\n this.advance();\n return { type: 'number', value: token.value, line: token.line };\n default:\n return undefined;\n }\n }\n\n private getNodeEndLine(node: ZilNode): number {\n if ('endLine' in node) {\n return node.endLine;\n }\n return node.line;\n }\n\n private extractSymbol(form: ZilForm): ZilSymbol | undefined {\n const headUpper = form.head.toUpperCase();\n\n if (!isDefinitionForm(headUpper)) {\n return undefined;\n }\n\n // Get the name (first child that's an atom)\n const nameNode = form.children.find((c): c is ZilLeaf => 'type' in c && c.type === 'atom');\n\n if (nameNode === undefined) {\n return undefined;\n }\n\n const kindMap: Record<string, ZilSymbol['kind']> = {\n ROUTINE: 'routine',\n OBJECT: 'object',\n ROOM: 'room',\n GLOBAL: 'global',\n CONSTANT: 'constant',\n SYNTAX: 'syntax',\n VERB: 'verb',\n DEFINE: 'routine',\n DEFMAC: 'routine',\n };\n\n const kind = kindMap[headUpper];\n if (kind === undefined) {\n return undefined;\n }\n\n const result: ZilSymbol = {\n name: nameNode.value,\n kind,\n startLine: form.startLine,\n endLine: form.endLine,\n };\n\n if (headUpper === 'ROUTINE' || headUpper === 'DEFINE' || headUpper === 'DEFMAC') {\n result.signature = this.extractRoutineSignature(form, nameNode.value);\n }\n\n return result;\n }\n\n private extractRoutineSignature(form: ZilForm, name: string): string {\n // Find args group (first parenthesized group after name)\n const argsGroup = form.children.find((c): c is ZilGroup => 'type' in c && c.type === 'group');\n\n if (argsGroup === undefined) {\n return `ROUTINE ${name} ()`;\n }\n\n const args = argsGroup.children\n .filter((c): c is ZilLeaf => 'type' in c && c.type === 'atom')\n .map((c) => c.value)\n .join(' ');\n\n return `ROUTINE ${name} (${args})`;\n }\n\n private extractImport(form: ZilForm): ImportInfo | undefined {\n if (form.head.toUpperCase() !== 'INSERT-FILE') {\n return undefined;\n }\n\n // Get the file name (first string child)\n const fileNode = form.children.find((c): c is ZilLeaf => 'type' in c && c.type === 'string');\n\n if (fileNode === undefined) {\n return undefined;\n }\n\n return {\n source: fileNode.value,\n specifiers: [],\n isType: false,\n };\n }\n\n private getRoutineName(form: ZilForm): string | undefined {\n const nameNode = form.children.find((c): c is ZilLeaf => 'type' in c && c.type === 'atom');\n return nameNode?.value;\n }\n\n private extractCalls(node: ZilNode, caller: string, calls: ZilCall[]): void {\n if ('head' in node) {\n // It's a form\n const headUpper = node.head.toUpperCase();\n\n // If not a special form and not empty, it's a call\n if (node.head !== '' && !isSpecialForm(headUpper)) {\n calls.push({\n caller,\n callee: node.head,\n line: node.startLine,\n });\n }\n\n // Recurse into children\n for (const child of node.children) {\n this.extractCalls(child, caller, calls);\n }\n } else if ('type' in node && node.type === 'group') {\n // Recurse into group children\n for (const child of node.children) {\n this.extractCalls(child, caller, calls);\n }\n }\n // Leaf nodes don't contain calls\n }\n}\n","/**\n * ZIL Language Adapter\n *\n * Implements LanguageAdapter for ZIL (Zork Implementation Language).\n * Provides full graph support: parsing, imports, chunking, and call analysis.\n */\n\nimport { ZilParser } from './zil-parser.js';\nimport type { CodeNode, ImportInfo } from '../ast-parser.js';\nimport type { GraphEdge } from '../code-graph.js';\nimport type { LanguageAdapter, ChunkResult } from '../language-adapter.js';\n\n/**\n * Language adapter for ZIL (Zork Implementation Language)\n */\nexport class ZilAdapter implements LanguageAdapter {\n readonly languageId = 'zil';\n readonly extensions = ['.zil', '.mud'];\n readonly displayName = 'ZIL (Zork Implementation Language)';\n\n private readonly parser = new ZilParser();\n\n /**\n * Parse ZIL code and extract symbols as CodeNode[]\n */\n parse(content: string, _filePath: string): CodeNode[] {\n const result = this.parser.parse(content);\n\n return result.symbols.map((symbol) => {\n const node: CodeNode = {\n type: this.mapSymbolKindToNodeType(symbol.kind),\n name: symbol.name,\n exported: true, // ZIL doesn't have export concept, treat all as exported\n startLine: symbol.startLine,\n endLine: symbol.endLine,\n };\n\n if (symbol.signature !== undefined) {\n node.signature = symbol.signature;\n }\n\n return node;\n });\n }\n\n /**\n * Extract imports from INSERT-FILE directives\n */\n extractImports(content: string, _filePath: string): ImportInfo[] {\n const result = this.parser.parse(content);\n return result.imports;\n }\n\n /**\n * Chunk ZIL code by top-level forms\n */\n chunk(content: string, _filePath: string): ChunkResult[] {\n const result = this.parser.parse(content);\n const lines = content.split('\\n');\n\n return result.forms\n .filter((form) => form.head !== '') // Skip empty forms\n .map((form) => {\n // Extract content from original source using line numbers\n const chunkLines = lines.slice(form.startLine - 1, form.endLine);\n const chunkContent = chunkLines.join('\\n');\n\n // Find symbol for this form if it's a definition\n const symbol = result.symbols.find(\n (s) => s.startLine === form.startLine && s.endLine === form.endLine\n );\n\n const chunk: ChunkResult = {\n content: chunkContent,\n startLine: form.startLine,\n endLine: form.endLine,\n };\n\n if (symbol !== undefined) {\n chunk.symbolName = symbol.name;\n chunk.symbolKind = symbol.kind;\n }\n\n return chunk;\n });\n }\n\n /**\n * Analyze call relationships within ZIL code\n */\n analyzeCallRelationships(content: string, filePath: string): GraphEdge[] {\n const result = this.parser.parse(content);\n\n return result.calls.map((call) => ({\n from: `${filePath}:${call.caller}`,\n to: `${filePath}:${call.callee}`,\n type: 'calls' as const,\n confidence: 0.9, // High confidence for ZIL - calls are explicit\n }));\n }\n\n /**\n * Map ZIL symbol kinds to CodeNode types\n */\n private mapSymbolKindToNodeType(kind: string): CodeNode['type'] {\n switch (kind) {\n case 'routine':\n return 'function';\n case 'object':\n case 'room':\n case 'global':\n case 'constant':\n return 'const';\n case 'syntax':\n case 'verb':\n return 'const';\n default:\n return 'const';\n }\n }\n}\n","import { z } from 'zod';\nimport { handleCheckJobStatus, handleListJobs, handleCancelJob } from '../handlers/job.handler.js';\nimport type { CommandDefinition } from './registry.js';\nimport type { CheckJobStatusArgs, ListJobsArgs, CancelJobArgs } from '../schemas/index.js';\n\n/**\n * Job management commands for the execute meta-tool\n *\n * These commands wrap the existing job handlers, providing\n * a unified interface through the execute command.\n *\n * Note: Type assertions are necessary here because CommandHandler uses\n * Record<string, unknown> for generic command args, while handlers expect\n * specific typed args. Zod validates at runtime before the cast.\n */\n/* eslint-disable @typescript-eslint/consistent-type-assertions */\nexport const jobCommands: CommandDefinition[] = [\n {\n name: 'jobs',\n description: 'List all background jobs',\n argsSchema: z.object({\n activeOnly: z.boolean().optional().describe('Only show active jobs'),\n status: z\n .enum(['pending', 'running', 'completed', 'failed', 'cancelled'])\n .optional()\n .describe('Filter by job status'),\n }),\n handler: (args, context) => handleListJobs(args as unknown as ListJobsArgs, context),\n },\n {\n name: 'job:status',\n description: 'Check the status of a specific background job',\n argsSchema: z.object({\n jobId: z.string().min(1).describe('Job ID to check'),\n }),\n handler: (args, context) =>\n handleCheckJobStatus(args as unknown as CheckJobStatusArgs, context),\n },\n {\n name: 'job:cancel',\n description: 'Cancel a running or pending background job',\n argsSchema: z.object({\n jobId: z.string().min(1).describe('Job ID to cancel'),\n }),\n handler: (args, context) => handleCancelJob(args as unknown as CancelJobArgs, context),\n },\n];\n/* eslint-enable @typescript-eslint/consistent-type-assertions */\n","import { z } from 'zod';\n\n/**\n * Validation schemas for all MCP tool inputs\n *\n * These schemas provide runtime type validation and better error messages\n * compared to manual type assertions.\n */\n\n// ============================================================================\n// Search Tool Schemas\n// ============================================================================\n\n/**\n * Schema for search tool arguments\n */\nexport const SearchArgsSchema = z.object({\n query: z.string().min(1, 'Query must be a non-empty string'),\n intent: z\n .enum([\n 'find-pattern',\n 'find-implementation',\n 'find-usage',\n 'find-definition',\n 'find-documentation',\n 'find-files',\n ])\n .optional(),\n mode: z.enum(['vector', 'fts', 'hybrid']).default('hybrid'),\n detail: z.enum(['minimal', 'contextual', 'full']).default('minimal'),\n limit: z.number().int().positive().default(10),\n stores: z.array(z.string()).optional(),\n threshold: z\n .number()\n .min(0, 'threshold must be between 0 and 1')\n .max(1, 'threshold must be between 0 and 1')\n .optional(),\n minRelevance: z\n .number()\n .min(0, 'minRelevance must be between 0 and 1')\n .max(1, 'minRelevance must be between 0 and 1')\n .optional(),\n});\n\nexport type SearchArgs = z.infer<typeof SearchArgsSchema>;\n\n/**\n * Schema for get_full_context tool arguments.\n * Accepts either resultId (from cached search) or file path for direct retrieval.\n */\nexport const GetFullContextArgsSchema = z\n .object({\n resultId: z.string().min(1, 'Result ID must be a non-empty string').optional(),\n file: z.string().min(1, 'File path must be a non-empty string').optional(),\n store: z.string().min(1, 'Store name or ID').optional(),\n })\n .refine((data) => data.resultId !== undefined || data.file !== undefined, {\n message: 'Either resultId or file must be provided',\n });\n\nexport type GetFullContextArgs = z.infer<typeof GetFullContextArgsSchema>;\n\n// ============================================================================\n// Store Tool Schemas\n// ============================================================================\n\n/**\n * Schema for list_stores tool arguments\n */\nexport const ListStoresArgsSchema = z.object({\n type: z.enum(['file', 'repo', 'web']).optional(),\n});\n\nexport type ListStoresArgs = z.infer<typeof ListStoresArgsSchema>;\n\n/**\n * Schema for get_store_info tool arguments\n */\nexport const GetStoreInfoArgsSchema = z.object({\n store: z.string().min(1, 'Store name or ID must be a non-empty string'),\n});\n\nexport type GetStoreInfoArgs = z.infer<typeof GetStoreInfoArgsSchema>;\n\n/**\n * Schema for create_store tool arguments\n */\nexport const CreateStoreArgsSchema = z.object({\n name: z.string().min(1, 'Store name must be a non-empty string'),\n type: z.enum(['file', 'repo', 'web']),\n source: z.string().min(1, 'Source path or URL must be a non-empty string'),\n branch: z.string().optional(),\n description: z.string().optional(),\n tags: z.array(z.string()).optional(),\n depth: z.number().int().positive().optional(),\n maxPages: z.number().int().positive().optional(),\n crawlInstructions: z.string().optional(),\n extractInstructions: z.string().optional(),\n});\n\nexport type CreateStoreArgs = z.infer<typeof CreateStoreArgsSchema>;\n\n/**\n * Schema for index_store tool arguments\n */\nexport const IndexStoreArgsSchema = z.object({\n store: z.string().min(1, 'Store name or ID must be a non-empty string'),\n});\n\nexport type IndexStoreArgs = z.infer<typeof IndexStoreArgsSchema>;\n\n/**\n * Schema for delete_store tool arguments\n */\nexport const DeleteStoreArgsSchema = z.object({\n store: z.string().min(1, 'Store name or ID must be a non-empty string'),\n});\n\nexport type DeleteStoreArgs = z.infer<typeof DeleteStoreArgsSchema>;\n\n// ============================================================================\n// Job Tool Schemas\n// ============================================================================\n\n/**\n * Schema for check_job_status tool arguments\n */\nexport const CheckJobStatusArgsSchema = z.object({\n jobId: z.string().min(1, 'Job ID must be a non-empty string'),\n});\n\nexport type CheckJobStatusArgs = z.infer<typeof CheckJobStatusArgsSchema>;\n\n/**\n * Schema for list_jobs tool arguments\n */\nexport const ListJobsArgsSchema = z.object({\n activeOnly: z.boolean().optional(),\n status: z.enum(['pending', 'running', 'completed', 'failed', 'cancelled']).optional(),\n});\n\nexport type ListJobsArgs = z.infer<typeof ListJobsArgsSchema>;\n\n/**\n * Schema for cancel_job tool arguments\n */\nexport const CancelJobArgsSchema = z.object({\n jobId: z.string().min(1, 'Job ID must be a non-empty string'),\n});\n\nexport type CancelJobArgs = z.infer<typeof CancelJobArgsSchema>;\n\n// ============================================================================\n// Pull Tool Schema\n// ============================================================================\n\n/**\n * Schema for stores:pull tool arguments\n */\nexport const StoresPullArgsSchema = z.object({\n store: z.string().min(1, 'Store name or ID must be a non-empty string'),\n});\n\nexport type StoresPullArgs = z.infer<typeof StoresPullArgsSchema>;\n\n// ============================================================================\n// Execute Meta-Tool Schema\n// ============================================================================\n\n/**\n * Schema for execute meta-tool arguments\n *\n * The execute tool consolidates store and job management commands\n * into a single tool, reducing context overhead.\n */\nexport const ExecuteArgsSchema = z.object({\n command: z.string().min(1, 'Command name is required'),\n args: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type ExecuteArgs = z.infer<typeof ExecuteArgsSchema>;\n","import { createLogger } from '../../logging/index.js';\nimport { JobService } from '../../services/job.service.js';\nimport {\n CheckJobStatusArgsSchema,\n ListJobsArgsSchema,\n CancelJobArgsSchema,\n} from '../schemas/index.js';\nimport type { CheckJobStatusArgs, ListJobsArgs, CancelJobArgs } from '../schemas/index.js';\nimport type { ToolHandler, ToolResponse } from '../types.js';\n\nconst logger = createLogger('mcp-job');\n\n/**\n * Handle check_job_status requests\n *\n * Retrieves the current status of a background job.\n */\nexport const handleCheckJobStatus: ToolHandler<CheckJobStatusArgs> = (\n args,\n context\n): Promise<ToolResponse> => {\n // Validate arguments with Zod\n const validated = CheckJobStatusArgsSchema.parse(args);\n logger.info({ jobId: validated.jobId }, 'Check job status started');\n\n const { options } = context;\n\n const jobService = new JobService(options.dataDir);\n const job = jobService.getJob(validated.jobId);\n\n if (!job) {\n logger.warn({ jobId: validated.jobId }, 'Job not found');\n throw new Error(`Job not found: ${validated.jobId}`);\n }\n\n logger.info({ jobId: validated.jobId, status: job.status }, 'Check job status completed');\n\n return Promise.resolve({\n content: [\n {\n type: 'text',\n text: JSON.stringify(job, null, 2),\n },\n ],\n });\n};\n\n/**\n * Handle list_jobs requests\n *\n * Lists all jobs with optional filtering by status or active status.\n * Automatically cleans up stale pending jobs (>2 hours old) before listing.\n */\nexport const handleListJobs: ToolHandler<ListJobsArgs> = (args, context): Promise<ToolResponse> => {\n // Validate arguments with Zod\n const validated = ListJobsArgsSchema.parse(args);\n logger.info({ activeOnly: validated.activeOnly, status: validated.status }, 'List jobs started');\n\n const { options } = context;\n\n const jobService = new JobService(options.dataDir);\n\n // Auto-cleanup: mark stale pending jobs as failed (>2 hours with no progress)\n // This handles jobs where the worker never started or crashed\n jobService.cleanupStalePendingJobs(2, { markAsFailed: true });\n\n let jobs;\n if (validated.activeOnly === true) {\n jobs = jobService.listActiveJobs();\n } else if (validated.status !== undefined) {\n jobs = jobService.listJobs(validated.status);\n } else {\n jobs = jobService.listJobs();\n }\n\n logger.info({ count: jobs.length, activeOnly: validated.activeOnly }, 'List jobs completed');\n\n return Promise.resolve({\n content: [\n {\n type: 'text',\n text: JSON.stringify({ jobs }, null, 2),\n },\n ],\n });\n};\n\n/**\n * Handle cancel_job requests\n *\n * Cancels a running or pending background job.\n * Kills the worker process if it exists.\n */\nexport const handleCancelJob: ToolHandler<CancelJobArgs> = (\n args,\n context\n): Promise<ToolResponse> => {\n // Validate arguments with Zod\n const validated = CancelJobArgsSchema.parse(args);\n logger.info({ jobId: validated.jobId }, 'Cancel job started');\n\n const { options } = context;\n\n const jobService = new JobService(options.dataDir);\n const result = jobService.cancelJob(validated.jobId);\n\n if (!result.success) {\n logger.error({ jobId: validated.jobId, error: result.error.message }, 'Cancel job failed');\n throw new Error(result.error.message);\n }\n\n const job = jobService.getJob(validated.jobId);\n\n logger.info({ jobId: validated.jobId, cancelled: true }, 'Cancel job completed');\n\n return Promise.resolve({\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n success: true,\n job,\n message: 'Job cancelled successfully',\n },\n null,\n 2\n ),\n },\n ],\n });\n};\n","import { z } from 'zod';\nimport { commandRegistry, generateHelp } from './registry.js';\nimport type { CommandDefinition } from './registry.js';\nimport type { ToolResponse } from '../types.js';\n\n/**\n * Meta commands for introspection and help\n *\n * These commands provide self-documentation for the execute tool,\n * allowing users to discover available commands and their usage.\n */\nexport const metaCommands: CommandDefinition[] = [\n {\n name: 'commands',\n description: 'List all available commands',\n handler: (): Promise<ToolResponse> => {\n const commands = commandRegistry.all();\n const commandList = commands.map((cmd) => ({\n name: cmd.name,\n description: cmd.description,\n }));\n\n return Promise.resolve({\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ commands: commandList }, null, 2),\n },\n ],\n });\n },\n },\n {\n name: 'help',\n description: 'Show help for a specific command or list all commands',\n argsSchema: z.object({\n command: z.string().optional().describe('Command name to get help for'),\n }),\n handler: (args: Record<string, unknown>): Promise<ToolResponse> => {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const commandName = args['command'] as string | undefined;\n const helpText = generateHelp(commandName);\n\n return Promise.resolve({\n content: [\n {\n type: 'text' as const,\n text: helpText,\n },\n ],\n });\n },\n },\n];\n","import { z } from 'zod';\nimport { createLogger } from '../../logging/index.js';\nimport type { HandlerContext, ToolResponse } from '../types.js';\n\nconst logger = createLogger('mcp-commands');\n\n/**\n * Command definition for the execute meta-tool\n *\n * Each command has a name, description, optional args schema, and handler.\n * Commands are registered in the registry and invoked via execute(command, args).\n */\nexport interface CommandDefinition {\n /** Command name (e.g., 'stores', 'store:info', 'job:status') */\n name: string;\n /** Human-readable description shown in help output */\n description: string;\n /** Optional Zod schema for argument validation */\n argsSchema?: z.ZodType;\n /** Handler function that executes the command */\n handler: CommandHandler;\n}\n\n/**\n * Command handler function signature\n *\n * @param args - Validated command arguments (or empty object if no args)\n * @param context - Handler context with services and options\n * @returns Promise resolving to tool response\n */\nexport type CommandHandler = (\n args: Record<string, unknown>,\n context: HandlerContext\n) => Promise<ToolResponse>;\n\n/**\n * Command registry - singleton that holds all registered commands\n */\nclass CommandRegistry {\n private readonly commands = new Map<string, CommandDefinition>();\n\n /**\n * Register a command\n */\n register(command: CommandDefinition): void {\n if (this.commands.has(command.name)) {\n throw new Error(`Command already registered: ${command.name}`);\n }\n this.commands.set(command.name, command);\n }\n\n /**\n * Register multiple commands at once\n */\n registerAll(commands: CommandDefinition[]): void {\n for (const command of commands) {\n this.register(command);\n }\n }\n\n /**\n * Get a command by name\n */\n get(name: string): CommandDefinition | undefined {\n return this.commands.get(name);\n }\n\n /**\n * Check if a command exists\n */\n has(name: string): boolean {\n return this.commands.has(name);\n }\n\n /**\n * Get all registered commands\n */\n all(): CommandDefinition[] {\n return Array.from(this.commands.values());\n }\n\n /**\n * Get commands grouped by category (prefix before colon)\n */\n grouped(): Map<string, CommandDefinition[]> {\n const groups = new Map<string, CommandDefinition[]>();\n\n for (const cmd of this.commands.values()) {\n const colonIndex = cmd.name.indexOf(':');\n const category = colonIndex === -1 ? 'general' : cmd.name.slice(0, colonIndex);\n\n const existing = groups.get(category) ?? [];\n existing.push(cmd);\n groups.set(category, existing);\n }\n\n return groups;\n }\n}\n\n/** Global command registry instance */\nexport const commandRegistry = new CommandRegistry();\n\n/**\n * Execute a command by name\n *\n * @param commandName - The command to execute\n * @param args - Arguments to pass to the command\n * @param context - Handler context\n * @returns Promise resolving to tool response\n */\nexport async function executeCommand(\n commandName: string,\n args: Record<string, unknown>,\n context: HandlerContext\n): Promise<ToolResponse> {\n const command = commandRegistry.get(commandName);\n\n if (command === undefined) {\n logger.warn({ commandName }, 'Unknown command requested');\n throw new Error(\n `Unknown command: ${commandName}. Use execute(\"commands\") to list available commands.`\n );\n }\n\n logger.debug({ commandName, hasArgs: Object.keys(args).length > 0 }, 'Executing command');\n\n // Validate args if schema provided (Zod parse returns unknown, safe to cast after validation)\n /* eslint-disable @typescript-eslint/consistent-type-assertions */\n const validatedArgs: Record<string, unknown> =\n command.argsSchema !== undefined\n ? (command.argsSchema.parse(args) as Record<string, unknown>)\n : args;\n /* eslint-enable @typescript-eslint/consistent-type-assertions */\n\n return command.handler(validatedArgs, context);\n}\n\n/**\n * Generate help text for a command or all commands\n */\nexport function generateHelp(commandName?: string): string {\n if (commandName !== undefined) {\n const command = commandRegistry.get(commandName);\n if (command === undefined) {\n throw new Error(`Unknown command: ${commandName}`);\n }\n\n const lines = [`Command: ${command.name}`, `Description: ${command.description}`, ''];\n\n if (command.argsSchema !== undefined) {\n lines.push('Arguments:');\n // Extract schema shape for documentation\n const schema = command.argsSchema;\n if (schema instanceof z.ZodObject) {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const shape = schema.shape as Record<string, z.ZodType>;\n for (const [key, fieldSchema] of Object.entries(shape)) {\n const isOptional = fieldSchema.safeParse(undefined).success;\n const desc = fieldSchema.description ?? '';\n lines.push(` ${key}${isOptional ? ' (optional)' : ''}: ${desc}`);\n }\n }\n } else {\n lines.push('Arguments: none');\n }\n\n return lines.join('\\n');\n }\n\n // Generate help for all commands\n const groups = commandRegistry.grouped();\n const lines = ['Available commands:', ''];\n\n for (const [category, commands] of groups) {\n lines.push(`${category}:`);\n for (const cmd of commands) {\n lines.push(` ${cmd.name} - ${cmd.description}`);\n }\n lines.push('');\n }\n\n lines.push('Use execute(\"help\", {command: \"name\"}) for detailed command help.');\n\n return lines.join('\\n');\n}\n","import { z } from 'zod';\nimport { handleStoresPull } from '../handlers/pull.handler.js';\nimport {\n handleListStores,\n handleGetStoreInfo,\n handleCreateStore,\n handleIndexStore,\n handleDeleteStore,\n handleCheckModels,\n handleStoreHealth,\n} from '../handlers/store.handler.js';\nimport type { CommandDefinition } from './registry.js';\nimport type { StoreHealthArgs } from '../handlers/store.handler.js';\nimport type {\n ListStoresArgs,\n GetStoreInfoArgs,\n CreateStoreArgs,\n IndexStoreArgs,\n DeleteStoreArgs,\n} from '../schemas/index.js';\nimport type { HandlerContext, ToolResponse } from '../types.js';\n\n/**\n * Store management commands for the execute meta-tool\n *\n * These commands wrap the existing store handlers, providing\n * a unified interface through the execute command.\n *\n * Note: Type assertions are necessary here because CommandHandler uses\n * Record<string, unknown> for generic command args, while handlers expect\n * specific typed args. Zod validates at runtime before the cast.\n */\n/* eslint-disable @typescript-eslint/consistent-type-assertions */\nexport const storeCommands: CommandDefinition[] = [\n {\n name: 'stores',\n description: 'List all indexed knowledge stores',\n argsSchema: z.object({\n type: z.enum(['file', 'repo', 'web']).optional().describe('Filter by store type'),\n }),\n handler: (args, context) => handleListStores(args as unknown as ListStoresArgs, context),\n },\n {\n name: 'store:info',\n description: 'Get detailed information about a specific store',\n argsSchema: z.object({\n store: z.string().min(1).describe('Store name or ID'),\n }),\n handler: (args, context) => handleGetStoreInfo(args as unknown as GetStoreInfoArgs, context),\n },\n {\n name: 'store:create',\n description: 'Create a new knowledge store from git URL, local path, or web URL',\n argsSchema: z.object({\n name: z.string().min(1).describe('Store name'),\n type: z.enum(['file', 'repo', 'web']).describe('Store type'),\n source: z.string().min(1).describe('Git URL, local path, or web URL'),\n branch: z.string().optional().describe('Git branch (for repo type)'),\n description: z.string().optional().describe('Store description'),\n tags: z.array(z.string()).optional().describe('Tags for categorizing the store'),\n depth: z.number().int().positive().optional().describe('Git clone depth (for repo type)'),\n maxPages: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Maximum pages to crawl (for web type)'),\n crawlInstructions: z.string().optional().describe('Instructions for crawler (for web type)'),\n extractInstructions: z\n .string()\n .optional()\n .describe('Instructions for content extraction (for web type)'),\n }),\n handler: (args, context) => handleCreateStore(args as unknown as CreateStoreArgs, context),\n },\n {\n name: 'store:index',\n description: 'Re-index a knowledge store to update search data',\n argsSchema: z.object({\n store: z.string().min(1).describe('Store name or ID'),\n }),\n handler: (args, context) => handleIndexStore(args as unknown as IndexStoreArgs, context),\n },\n {\n name: 'store:delete',\n description: 'Delete a knowledge store and all associated data',\n argsSchema: z.object({\n store: z.string().min(1).describe('Store name or ID'),\n }),\n handler: (args, context) => handleDeleteStore(args as unknown as DeleteStoreArgs, context),\n },\n {\n name: 'stores:pull',\n description: 'Pull latest changes from git remote and re-index a repo-type store',\n argsSchema: z.object({\n store: z.string().min(1).describe('Store name or ID'),\n }),\n handler: (args: Record<string, unknown>, context: HandlerContext): Promise<ToolResponse> => {\n if (typeof args['store'] !== 'string' || args['store'].length === 0) {\n throw new Error('Store name or ID is required');\n }\n return handleStoresPull({ store: args['store'] }, context);\n },\n },\n {\n name: 'stores:check-models',\n description: 'Check embedding model compatibility for all stores',\n argsSchema: z.object({}),\n handler: (_args, context) => handleCheckModels({}, context),\n },\n {\n name: 'stores:health',\n description: 'Check health of stores: path existence, model compatibility',\n argsSchema: z.object({\n store: z.string().optional().describe('Check a specific store only (name or ID)'),\n }),\n handler: (args: Record<string, unknown>, context: HandlerContext): Promise<ToolResponse> => {\n const typedArgs: StoreHealthArgs =\n typeof args['store'] === 'string' ? { store: args['store'] } : {};\n return handleStoreHealth(typedArgs, context);\n },\n },\n];\n/* eslint-enable @typescript-eslint/consistent-type-assertions */\n","import { spawn } from 'node:child_process';\nimport { createLogger } from '../logging/index.js';\nimport { ok, err } from '../types/result.js';\nimport type { Result } from '../types/result.js';\n\nconst logger = createLogger('git-pull');\n\nexport interface PullOptions {\n repoPath: string;\n branch?: string | undefined;\n /** Pull timeout in milliseconds (default: 60000) */\n timeoutMs?: number | undefined;\n}\n\nconst DEFAULT_PULL_TIMEOUT_MS = 60000; // 1 minute\nconst FORCE_KILL_DELAY_MS = 5000; // 5 seconds after SIGTERM\n\nexport async function pullRepository(options: PullOptions): Promise<Result<string>> {\n const { repoPath, branch, timeoutMs = DEFAULT_PULL_TIMEOUT_MS } = options;\n\n const args = ['pull', 'origin'];\n if (branch !== undefined) {\n args.push(branch);\n }\n\n logger.info({ repoPath, branch }, 'Starting git pull');\n\n return new Promise((resolve) => {\n const git = spawn('git', args, { cwd: repoPath, stdio: ['ignore', 'pipe', 'pipe'] });\n let timedOut = false;\n let forceKillTimeout: NodeJS.Timeout | null = null;\n\n const timeout = setTimeout(() => {\n timedOut = true;\n git.kill('SIGTERM');\n forceKillTimeout = setTimeout(() => {\n if (!git.killed) {\n git.kill('SIGKILL');\n }\n }, FORCE_KILL_DELAY_MS);\n }, timeoutMs);\n\n let stderr = '';\n git.stderr.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n let stdout = '';\n git.stdout.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n git.on('error', (error: Error) => {\n clearTimeout(timeout);\n if (forceKillTimeout) clearTimeout(forceKillTimeout);\n resolve(err(error));\n });\n\n git.on('close', (code: number | null) => {\n clearTimeout(timeout);\n if (forceKillTimeout) clearTimeout(forceKillTimeout);\n if (timedOut) {\n resolve(err(new Error(`Git pull timed out after ${String(timeoutMs)}ms in: ${repoPath}`)));\n } else if (code === 0) {\n logger.info({ repoPath, output: stdout.trim() }, 'Git pull completed');\n resolve(ok(stdout.trim()));\n } else {\n resolve(err(new Error(`Git pull failed: ${stderr}`)));\n }\n });\n });\n}\n","/**\n * Estimate indexing time from file count.\n *\n * Conservative estimate based on ~5 files/sec (embedding + chunking).\n * Includes 10s overhead for model loading and DB initialization.\n */\nexport function estimateIndexingTime(fileCount: number): {\n etaSeconds: number;\n etaDisplay: string;\n} {\n if (fileCount <= 0) {\n return { etaSeconds: 0, etaDisplay: 'a few seconds' };\n }\n\n const etaSeconds = Math.ceil(fileCount / 5) + 10;\n\n return { etaSeconds, etaDisplay: formatDuration(etaSeconds) };\n}\n\nfunction formatDuration(seconds: number): string {\n if (seconds < 60) {\n return `~${String(seconds)} seconds`;\n }\n const minutes = Math.round(seconds / 60);\n if (minutes === 1) {\n return '~1 minute';\n }\n return `~${String(minutes)} minutes`;\n}\n","import { execFile } from 'node:child_process';\nimport { readdir, stat } from 'node:fs/promises';\nimport { extname, join } from 'node:path';\nimport { promisify } from 'node:util';\nimport { DEFAULT_IGNORE_DIRS } from './ignore-patterns.js';\nimport { TEXT_EXTENSIONS } from './text-extensions.js';\n\nconst execFileAsync = promisify(execFile);\n\nconst TIMEOUT_MS = 5_000;\nconst IGNORE_DIRS: ReadonlySet<string> = new Set(DEFAULT_IGNORE_DIRS);\n\n/**\n * Quickly estimate the number of indexable text files in a store path.\n *\n * Uses `git ls-files` for git repos (fast), falls back to a directory walk.\n * Filters by TEXT_EXTENSIONS. Returns 0 on timeout or error (never blocks store creation).\n */\nexport async function estimateFileCount(storePath: string): Promise<number> {\n try {\n return await withTimeout(estimateFileCountInner(storePath), TIMEOUT_MS);\n } catch {\n return 0;\n }\n}\n\nasync function estimateFileCountInner(storePath: string): Promise<number> {\n // Try git ls-files first (fast for repos)\n const gitFiles = await gitLsFiles(storePath);\n if (gitFiles !== null) {\n return countTextFiles(gitFiles);\n }\n\n // Fall back to quick directory walk\n return walkAndCount(storePath);\n}\n\nasync function gitLsFiles(repoPath: string): Promise<string[] | null> {\n try {\n // Check if .git exists\n await stat(join(repoPath, '.git'));\n\n // Clear GIT_DIR/GIT_WORK_TREE so git queries the repo at repoPath,\n // not a parent repo (e.g. when called inside a pre-commit hook)\n const cleanEnv = { ...process.env };\n delete cleanEnv['GIT_DIR'];\n delete cleanEnv['GIT_WORK_TREE'];\n delete cleanEnv['GIT_INDEX_FILE'];\n const { stdout } = await execFileAsync('git', ['ls-files', '-z'], {\n cwd: repoPath,\n maxBuffer: 50 * 1024 * 1024,\n timeout: TIMEOUT_MS,\n env: cleanEnv,\n });\n\n return stdout.split('\\0').filter(Boolean);\n } catch {\n return null;\n }\n}\n\nfunction countTextFiles(files: string[]): number {\n let count = 0;\n for (const file of files) {\n const ext = extname(file).toLowerCase();\n if (TEXT_EXTENSIONS.has(ext)) {\n count++;\n }\n }\n return count;\n}\n\nasync function walkAndCount(dirPath: string, depth = 0): Promise<number> {\n if (depth > 10) return 0;\n\n let count = 0;\n let entries;\n try {\n entries = await readdir(dirPath, { withFileTypes: true });\n } catch {\n return 0;\n }\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (IGNORE_DIRS.has(entry.name)) continue;\n count += await walkAndCount(join(dirPath, entry.name), depth + 1);\n } else if (entry.isFile()) {\n const ext = extname(entry.name).toLowerCase();\n if (TEXT_EXTENSIONS.has(ext)) {\n count++;\n }\n }\n }\n\n return count;\n}\n\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error('Timeout'));\n }, ms);\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n (error: unknown) => {\n clearTimeout(timer);\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n );\n });\n}\n","import { spawn } from 'child_process';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { createLogger } from '../logging/index.js';\n\nconst logger = createLogger('spawn-worker');\n\n/**\n * Spawn a background worker process to execute a job\n *\n * The worker runs detached from the parent process, allowing the\n * parent to exit while the worker continues running.\n *\n * @param jobId - The ID of the job to execute\n * @param dataDir - Optional data directory (uses default if undefined)\n */\nexport function spawnBackgroundWorker(jobId: string, dataDir?: string): void {\n // Determine the worker script path\n // In production, this will be the compiled dist file\n // In development, we need to use tsx to run TypeScript\n const currentFilePath = fileURLToPath(import.meta.url);\n const currentDir = path.dirname(currentFilePath);\n\n // Check if we're running from dist (production) or src (development)\n // Note: In bundled code, import.meta.url may point to a chunk file in dist root\n // Platform-agnostic check: match both /dist/ and \\dist\\ (Windows)\n const distPattern = `${path.sep}dist${path.sep}`;\n const isProduction = currentFilePath.includes(distPattern);\n\n let command: string;\n let args: string[];\n\n if (isProduction) {\n // Production: Use Node.js directly with compiled file\n // When bundled, the chunk may be in dist/ root, but worker CLI is in dist/workers/\n // Find the dist directory and construct the correct path\n const distIndex = currentFilePath.indexOf(distPattern);\n const distDir = currentFilePath.substring(0, distIndex + distPattern.length);\n const workerScript = path.join(distDir, 'workers', 'background-worker-cli.js');\n command = process.execPath; // Use the same Node.js binary\n args = [workerScript, jobId];\n logger.debug({ workerScript, distDir, currentFilePath }, 'Production worker path');\n } else {\n // Development: Use tsx to run TypeScript directly\n const workerScript = path.join(currentDir, 'background-worker-cli.ts');\n command = 'npx';\n args = ['tsx', workerScript, jobId];\n logger.debug({ workerScript, currentDir }, 'Development worker path');\n }\n\n logger.info({ jobId, command, args, dataDir, isProduction }, 'Spawning background worker');\n\n // Spawn the worker process\n const worker = spawn(command, args, {\n detached: true, // Detach from parent process\n stdio: 'ignore', // Don't pipe stdio (fully independent)\n env: {\n ...process.env, // Inherit environment variables\n ...(dataDir !== undefined && dataDir !== '' ? { BLUERA_DATA_DIR: dataDir } : {}), // Only set if provided\n },\n });\n\n // Handle spawn errors\n worker.on('error', (err) => {\n logger.error({ jobId, error: err.message }, 'Failed to spawn background worker');\n });\n\n logger.info({ jobId, pid: worker.pid }, 'Background worker spawned');\n\n // Unref the worker so the parent can exit\n worker.unref();\n}\n","import { createLogger } from '../../logging/index.js';\nimport { pullRepository } from '../../plugin/git-pull.js';\nimport { JobService } from '../../services/job.service.js';\nimport { estimateIndexingTime } from '../../utils/eta.js';\nimport { estimateFileCount } from '../../utils/file-count.js';\nimport { spawnBackgroundWorker } from '../../workers/spawn-worker.js';\nimport { StoresPullArgsSchema } from '../schemas/index.js';\nimport type { StoresPullArgs } from '../schemas/index.js';\nimport type { ToolHandler, ToolResponse } from '../types.js';\n\nconst logger = createLogger('mcp-pull');\n\n/**\n * Handle stores:pull requests\n *\n * Pulls latest changes from git remote for a repo-type store,\n * then triggers a background re-index job.\n */\nexport const handleStoresPull: ToolHandler<StoresPullArgs> = async (\n args,\n context\n): Promise<ToolResponse> => {\n const validated = StoresPullArgsSchema.parse(args);\n logger.info({ store: validated.store }, 'Stores pull started');\n\n const { services, options } = context;\n\n const store = await services.store.getByIdOrName(validated.store);\n\n if (store === undefined) {\n throw new Error(`Store not found: ${validated.store}`);\n }\n\n if (store.type !== 'repo') {\n throw new Error(\n `stores:pull only works on repo-type stores. Store \"${store.name}\" is type \"${store.type}\".`\n );\n }\n\n if (store.url === undefined) {\n throw new Error(`Store \"${store.name}\" has no git remote URL. Cannot pull without a remote.`);\n }\n\n // Pull latest changes from git remote\n const pullResult = await pullRepository({\n repoPath: store.path,\n branch: store.branch,\n });\n\n if (!pullResult.success) {\n logger.error({ store: store.name, error: pullResult.error.message }, 'Git pull failed');\n throw new Error(`Git pull failed for \"${store.name}\": ${pullResult.error.message}`);\n }\n\n const pullOutput = pullResult.data;\n logger.info({ store: store.name, pullOutput }, 'Git pull succeeded');\n\n // Create background job for re-indexing\n const jobService = new JobService(options.dataDir);\n const job = jobService.createJob({\n type: 'index',\n details: {\n storeName: store.name,\n storeId: store.id,\n phase: 'indexing',\n phaseStep: 1,\n phaseTotalSteps: 1,\n path: store.path,\n },\n message: `Re-indexing ${store.name} after git pull...`,\n });\n\n spawnBackgroundWorker(job.id, options.dataDir);\n\n logger.info({ storeId: store.id, storeName: store.name, jobId: job.id }, 'Stores pull completed');\n\n // Estimate file count and ETA for re-indexing\n const fileCount = await estimateFileCount(store.path);\n const eta = estimateIndexingTime(fileCount);\n const fileCountLabel = fileCount > 0 ? `~${String(fileCount)} files` : 'files';\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n store: {\n id: store.id,\n name: store.name,\n },\n pull: {\n output: pullOutput,\n },\n search: {\n immediate: `Files available for Grep/Read at: ${store.path}`,\n pending: `Similarity search re-indexing ${fileCountLabel}`,\n eta: eta.etaDisplay,\n monitor: `check job status with job:status ${job.id}`,\n },\n job: {\n id: job.id,\n status: job.status,\n message: `Re-indexing ${store.name} after git pull (${fileCountLabel}, ${eta.etaDisplay})...`,\n },\n message: `Pulled latest changes. Files available for Grep/Read at ${store.path}. Similarity search re-indexing ${fileCountLabel} (${eta.etaDisplay}).`,\n },\n null,\n 2\n ),\n },\n ],\n };\n};\n","import { rm, access } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { createLogger } from '../../logging/index.js';\nimport { JobService } from '../../services/job.service.js';\nimport { estimateIndexingTime } from '../../utils/eta.js';\nimport { estimateFileCount } from '../../utils/file-count.js';\nimport { checkStoreModelCompatibility } from '../../utils/model-validation.js';\nimport { spawnBackgroundWorker } from '../../workers/spawn-worker.js';\nimport {\n ListStoresArgsSchema,\n GetStoreInfoArgsSchema,\n CreateStoreArgsSchema,\n IndexStoreArgsSchema,\n DeleteStoreArgsSchema,\n} from '../schemas/index.js';\nimport type { Store, StoreType } from '../../types/store.js';\nimport type {\n ListStoresArgs,\n GetStoreInfoArgs,\n CreateStoreArgs,\n IndexStoreArgs,\n DeleteStoreArgs,\n} from '../schemas/index.js';\nimport type { ToolHandler, ToolResponse } from '../types.js';\n\nconst logger = createLogger('mcp-store');\n\n/**\n * Handle list_stores requests\n *\n * Lists all knowledge stores with optional type filtering.\n */\nexport const handleListStores: ToolHandler<ListStoresArgs> = async (\n args,\n context\n): Promise<ToolResponse> => {\n // Validate arguments with Zod\n const validated = ListStoresArgsSchema.parse(args);\n logger.info({ type: validated.type }, 'List stores started');\n\n const { services } = context;\n\n const stores = await services.store.list();\n const filtered =\n validated.type !== undefined ? stores.filter((s) => s.type === validated.type) : stores;\n\n logger.info({ count: filtered.length, type: validated.type }, 'List stores completed');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n stores: filtered.map((s) => ({\n id: s.id,\n name: s.name,\n type: s.type,\n path: 'path' in s ? s.path : undefined,\n url: 'url' in s && s.url !== undefined ? s.url : undefined,\n branch: 'branch' in s ? s.branch : undefined,\n depth: 'depth' in s ? s.depth : undefined,\n maxPages: 'maxPages' in s ? s.maxPages : undefined,\n tags: 'tags' in s ? s.tags : undefined,\n description: s.description,\n modelId: s.modelId,\n createdAt: s.createdAt.toISOString(),\n })),\n },\n null,\n 2\n ),\n },\n ],\n };\n};\n\n/**\n * Handle get_store_info requests\n *\n * Retrieves detailed information about a specific store.\n */\nexport const handleGetStoreInfo: ToolHandler<GetStoreInfoArgs> = async (\n args,\n context\n): Promise<ToolResponse> => {\n // Validate arguments with Zod\n const validated = GetStoreInfoArgsSchema.parse(args);\n logger.info({ store: validated.store }, 'Get store info started');\n\n const { services } = context;\n\n const store = await services.store.getByIdOrName(validated.store);\n\n if (store === undefined) {\n logger.warn({ store: validated.store }, 'Store not found');\n throw new Error(`Store not found: ${validated.store}`);\n }\n\n logger.info({ storeId: store.id, storeName: store.name }, 'Get store info completed');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n id: store.id,\n name: store.name,\n type: store.type,\n path: 'path' in store ? store.path : undefined,\n url: 'url' in store && store.url !== undefined ? store.url : undefined,\n branch: 'branch' in store ? store.branch : undefined,\n depth: 'depth' in store ? store.depth : undefined,\n maxPages: 'maxPages' in store ? store.maxPages : undefined,\n crawlInstructions: 'crawlInstructions' in store ? store.crawlInstructions : undefined,\n extractInstructions:\n 'extractInstructions' in store ? store.extractInstructions : undefined,\n tags: 'tags' in store ? store.tags : undefined,\n description: store.description,\n modelId: store.modelId,\n status: store.status,\n createdAt: store.createdAt.toISOString(),\n updatedAt: store.updatedAt.toISOString(),\n },\n null,\n 2\n ),\n },\n ],\n };\n};\n\n/**\n * Handle create_store requests\n *\n * Creates a new knowledge store and starts background indexing.\n * Returns store info and job ID for tracking progress.\n */\nexport const handleCreateStore: ToolHandler<CreateStoreArgs> = async (\n args,\n context\n): Promise<ToolResponse> => {\n // Validate arguments with Zod\n const validated = CreateStoreArgsSchema.parse(args);\n logger.info(\n { name: validated.name, type: validated.type, source: validated.source },\n 'Create store started'\n );\n\n const { services, options } = context;\n\n // Determine if source is a URL or path\n const isUrl =\n validated.source.startsWith('http://') ||\n validated.source.startsWith('https://') ||\n validated.source.startsWith('git@');\n\n const result = await services.store.create({\n name: validated.name,\n type: validated.type,\n ...(isUrl ? { url: validated.source } : { path: validated.source }),\n ...(validated.branch !== undefined ? { branch: validated.branch } : {}),\n ...(validated.description !== undefined ? { description: validated.description } : {}),\n ...(validated.tags !== undefined ? { tags: validated.tags } : {}),\n ...(validated.depth !== undefined ? { depth: validated.depth } : {}),\n ...(validated.maxPages !== undefined ? { maxPages: validated.maxPages } : {}),\n ...(validated.crawlInstructions !== undefined\n ? { crawlInstructions: validated.crawlInstructions }\n : {}),\n ...(validated.extractInstructions !== undefined\n ? { extractInstructions: validated.extractInstructions }\n : {}),\n });\n\n if (!result.success) {\n logger.error({ name: validated.name, error: result.error.message }, 'Create store failed');\n throw new Error(result.error.message);\n }\n\n // Create background job for indexing\n const jobService = new JobService(options.dataDir);\n const jobDetails: Record<string, unknown> = {\n storeName: result.data.name,\n storeId: result.data.id,\n };\n if (isUrl) {\n jobDetails['url'] = validated.source;\n }\n if ('path' in result.data && result.data.path) {\n jobDetails['path'] = result.data.path;\n }\n // Add crawl options for web stores\n if (validated.type === 'web') {\n if (validated.maxPages !== undefined) {\n jobDetails['maxPages'] = validated.maxPages;\n }\n if (validated.crawlInstructions !== undefined) {\n jobDetails['crawlInstruction'] = validated.crawlInstructions;\n }\n if (validated.extractInstructions !== undefined) {\n jobDetails['extractInstruction'] = validated.extractInstructions;\n }\n }\n\n // Determine job type and set initial phase\n const jobType =\n validated.type === 'web' ? 'crawl' : validated.type === 'repo' && isUrl ? 'clone' : 'index';\n\n // Set initial phase based on job type\n if (jobType === 'crawl') {\n jobDetails['phase'] = 'crawling';\n jobDetails['phaseStep'] = 1;\n jobDetails['phaseTotalSteps'] = 2;\n } else if (jobType === 'clone') {\n jobDetails['phase'] = 'cloning';\n jobDetails['phaseStep'] = 1;\n jobDetails['phaseTotalSteps'] = 2;\n } else {\n jobDetails['phase'] = 'indexing';\n jobDetails['phaseStep'] = 1;\n jobDetails['phaseTotalSteps'] = 1;\n }\n\n const job = jobService.createJob({\n type: jobType,\n details: jobDetails,\n message:\n validated.type === 'web'\n ? `Crawling ${result.data.name}...`\n : `Indexing ${result.data.name}...`,\n });\n\n // Spawn background worker\n spawnBackgroundWorker(job.id, options.dataDir);\n\n logger.info(\n { storeId: result.data.id, storeName: result.data.name, jobId: job.id },\n 'Create store completed'\n );\n\n // Estimate file count and ETA for indexing\n const storePath = 'path' in result.data ? result.data.path : undefined;\n let fileCount = 0;\n if (validated.type === 'web') {\n fileCount = validated.maxPages ?? 0;\n } else if (storePath !== undefined) {\n fileCount = await estimateFileCount(storePath);\n }\n const eta = estimateIndexingTime(fileCount);\n const fileCountLabel = fileCount > 0 ? `~${String(fileCount)} files` : 'files';\n const jobMessage =\n fileCount > 0\n ? `Indexing ${result.data.name} (${fileCountLabel}, ${eta.etaDisplay})...`\n : job.message;\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n store: {\n id: result.data.id,\n name: result.data.name,\n type: result.data.type,\n path: storePath,\n },\n search: {\n immediate:\n storePath !== undefined\n ? `Files available for Grep/Read at: ${storePath}`\n : undefined,\n pending: `Similarity search indexing ${fileCountLabel}`,\n eta: eta.etaDisplay,\n monitor: `check job status with job:status ${job.id}`,\n },\n job: {\n id: job.id,\n status: job.status,\n message: jobMessage,\n },\n message:\n storePath !== undefined\n ? `Store created. Files available for Grep/Read now at ${storePath}. Similarity search indexing ${fileCountLabel} (${eta.etaDisplay}).`\n : `Store created. Similarity search indexing ${fileCountLabel} (${eta.etaDisplay}).`,\n },\n null,\n 2\n ),\n },\n ],\n };\n};\n\n/**\n * Handle index_store requests\n *\n * Re-indexes an existing store in the background.\n * Returns job ID for tracking progress.\n */\nexport const handleIndexStore: ToolHandler<IndexStoreArgs> = async (\n args,\n context\n): Promise<ToolResponse> => {\n // Validate arguments with Zod\n const validated = IndexStoreArgsSchema.parse(args);\n logger.info({ store: validated.store }, 'Index store started');\n\n const { services, options } = context;\n\n const store = await services.store.getByIdOrName(validated.store);\n\n if (store === undefined) {\n logger.warn({ store: validated.store }, 'Store not found for indexing');\n throw new Error(`Store not found: ${validated.store}`);\n }\n\n // Create background job for indexing\n const jobService = new JobService(options.dataDir);\n const jobDetails: Record<string, unknown> = {\n storeName: store.name,\n storeId: store.id,\n // Index jobs are single-phase\n phase: 'indexing',\n phaseStep: 1,\n phaseTotalSteps: 1,\n };\n if ('path' in store && store.path) {\n jobDetails['path'] = store.path;\n }\n const job = jobService.createJob({\n type: 'index',\n details: jobDetails,\n message: `Re-indexing ${store.name}...`,\n });\n\n // Spawn background worker\n spawnBackgroundWorker(job.id, options.dataDir);\n\n logger.info({ storeId: store.id, storeName: store.name, jobId: job.id }, 'Index store completed');\n\n // Estimate file count and ETA\n const storePath = 'path' in store ? store.path : undefined;\n const fileCount = storePath !== undefined ? await estimateFileCount(storePath) : 0;\n const eta = estimateIndexingTime(fileCount);\n const fileCountLabel = fileCount > 0 ? `~${String(fileCount)} files` : 'files';\n const jobMessage =\n fileCount > 0\n ? `Re-indexing ${store.name} (${fileCountLabel}, ${eta.etaDisplay})...`\n : job.message;\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n store: {\n id: store.id,\n name: store.name,\n },\n search: {\n immediate:\n storePath !== undefined\n ? `Files available for Grep/Read at: ${storePath}`\n : undefined,\n pending: `Similarity search re-indexing ${fileCountLabel}`,\n eta: eta.etaDisplay,\n monitor: `check job status with job:status ${job.id}`,\n },\n job: {\n id: job.id,\n status: job.status,\n message: jobMessage,\n },\n message:\n storePath !== undefined\n ? `Re-indexing started. Files available for Grep/Read at ${storePath}. Similarity search indexing ${fileCountLabel} (${eta.etaDisplay}).`\n : `Re-indexing started. Similarity search indexing ${fileCountLabel} (${eta.etaDisplay}).`,\n },\n null,\n 2\n ),\n },\n ],\n };\n};\n\n/**\n * Handle delete_store requests\n *\n * Deletes a store and all associated data:\n * - Removes from store registry\n * - Drops LanceDB table\n * - For repo stores with URL, removes cloned files\n */\nexport const handleDeleteStore: ToolHandler<DeleteStoreArgs> = async (\n args,\n context\n): Promise<ToolResponse> => {\n // Validate arguments with Zod\n const validated = DeleteStoreArgsSchema.parse(args);\n logger.info({ store: validated.store }, 'Delete store started');\n\n const { services, options } = context;\n\n const store = await services.store.getByIdOrName(validated.store);\n\n if (store === undefined) {\n logger.warn({ store: validated.store }, 'Store not found for deletion');\n throw new Error(`Store not found: ${validated.store}`);\n }\n\n logger.debug({ storeId: store.id, storeName: store.name }, 'Deleting LanceDB table');\n // Delete LanceDB table first (so searches don't return results for deleted store)\n await services.lance.deleteStore(store.id);\n\n logger.debug({ storeId: store.id }, 'Deleting code graph');\n // Delete code graph file\n await services.codeGraph.deleteGraph(store.id);\n\n logger.debug({ storeId: store.id }, 'Deleting manifest');\n // Delete manifest file\n await services.manifest.delete(store.id);\n\n // For repo stores cloned from URL, remove the cloned directory\n if (store.type === 'repo' && 'url' in store && store.url !== undefined) {\n if (options.dataDir === undefined) {\n throw new Error('dataDir is required to delete cloned repository files');\n }\n const repoPath = join(options.dataDir, 'repos', store.id);\n logger.debug({ storeId: store.id, repoPath }, 'Removing cloned repository');\n await rm(repoPath, { recursive: true, force: true });\n }\n\n logger.debug({ storeId: store.id }, 'Removing from registry');\n // Delete from registry last\n const result = await services.store.delete(store.id);\n if (!result.success) {\n logger.error({ storeId: store.id, error: result.error.message }, 'Delete store failed');\n throw new Error(result.error.message);\n }\n\n logger.info(\n { storeId: store.id, storeName: store.name, storeType: store.type },\n 'Delete store completed'\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n deleted: true,\n store: {\n id: store.id,\n name: store.name,\n type: store.type,\n },\n message: `Successfully deleted store: ${store.name}`,\n },\n null,\n 2\n ),\n },\n ],\n };\n};\n\n/**\n * Handle stores:check-models requests\n *\n * Lists all stores with their model compatibility status.\n * Identifies stores that need reindexing due to model mismatch.\n */\nexport const handleCheckModels: ToolHandler<Record<string, never>> = async (\n _args,\n context\n): Promise<ToolResponse> => {\n logger.info('Check models started');\n\n const { services } = context;\n\n const stores = await services.store.list();\n const currentModelId = services.store.getCurrentModelId();\n\n const storeStatuses = stores.map((store) => {\n const compatibility = checkStoreModelCompatibility(store, { currentModelId });\n return {\n id: store.id,\n name: store.name,\n type: store.type,\n modelId: compatibility.modelId ?? '(unknown)',\n status: compatibility.compatible ? 'current' : 'needs-reindex',\n reason: compatibility.reason,\n };\n });\n\n const needsReindex = storeStatuses.filter((s) => s.status === 'needs-reindex');\n\n logger.info(\n { total: stores.length, needsReindex: needsReindex.length },\n 'Check models completed'\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n currentModel: currentModelId,\n stores: storeStatuses,\n summary: {\n total: stores.length,\n current: stores.length - needsReindex.length,\n needsReindex: needsReindex.length,\n },\n ...(needsReindex.length > 0\n ? {\n reindexCommands: needsReindex.map((s) => `/bluera-knowledge:index ${s.name}`),\n }\n : {}),\n },\n null,\n 2\n ),\n },\n ],\n };\n};\n\n/** Health check severity level */\ntype HealthSeverity = 'error' | 'warning';\n\n/** Health check issue code */\ntype HealthIssueCode = 'PATH_NOT_FOUND' | 'SCHEMA_V1' | 'MODEL_MISMATCH';\n\n/** A single health check issue */\ninterface HealthIssue {\n severity: HealthSeverity;\n code: HealthIssueCode;\n message: string;\n resolution: string;\n}\n\n/** Health check result for a single store */\ninterface HealthResult {\n storeId: string;\n storeName: string;\n storeType: StoreType;\n status: 'healthy' | 'warning' | 'error';\n issues: HealthIssue[];\n}\n\n/**\n * Check if a path exists\n */\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check health of a single store\n */\nasync function checkStoreHealth(store: Store, currentModelId: string): Promise<HealthResult> {\n const issues: HealthIssue[] = [];\n\n // 1. Path check - file/repo only\n if (store.type === 'file' || store.type === 'repo') {\n const exists = await pathExists(store.path);\n if (!exists) {\n issues.push({\n severity: 'error',\n code: 'PATH_NOT_FOUND',\n message: `Path does not exist: ${store.path}`,\n resolution: 'Re-create store or fix projectRoot if path was relative',\n });\n }\n }\n\n // 2. Model compatibility check (reuses existing validation)\n const modelCheck = checkStoreModelCompatibility(store, { currentModelId });\n if (!modelCheck.compatible) {\n const isSchemaV1 = modelCheck.reason?.includes('v1') === true;\n issues.push({\n severity: 'warning',\n code: isSchemaV1 ? 'SCHEMA_V1' : 'MODEL_MISMATCH',\n message: modelCheck.reason ?? 'Model incompatibility',\n resolution: `Run: bluera-knowledge index ${store.name}`,\n });\n }\n\n // Determine overall status\n const hasError = issues.some((i) => i.severity === 'error');\n const hasWarning = issues.some((i) => i.severity === 'warning');\n const status = hasError ? 'error' : hasWarning ? 'warning' : 'healthy';\n\n return {\n storeId: store.id,\n storeName: store.name,\n storeType: store.type,\n status,\n issues,\n };\n}\n\nexport interface StoreHealthArgs {\n store?: string;\n}\n\n/**\n * Handle stores:health requests\n *\n * Checks health of all stores: path existence, model compatibility.\n * Returns exit code for scripting: 0=healthy, 1=error, 2=warning.\n */\nexport const handleStoreHealth: ToolHandler<StoreHealthArgs> = async (\n args,\n context\n): Promise<ToolResponse> => {\n logger.info({ store: args.store }, 'Store health check started');\n\n const { services } = context;\n const currentModelId = services.store.getCurrentModelId();\n\n let storesToCheck: Store[];\n\n if (args.store !== undefined) {\n const store = await services.store.getByIdOrName(args.store);\n if (store === undefined) {\n throw new Error(`Store not found: ${args.store}`);\n }\n storesToCheck = [store];\n } else {\n storesToCheck = await services.store.list();\n }\n\n // Check health of each store\n const results: HealthResult[] = [];\n for (const store of storesToCheck) {\n const result = await checkStoreHealth(store, currentModelId);\n results.push(result);\n }\n\n // Determine exit code: 1 for any error, 2 for warning-only, 0 for healthy\n const hasError = results.some((r) => r.status === 'error');\n const hasWarning = results.some((r) => r.status === 'warning');\n const exitCode = hasError ? 1 : hasWarning ? 2 : 0;\n\n // Summary counts\n const healthy = results.filter((r) => r.status === 'healthy').length;\n const warnings = results.filter((r) => r.status === 'warning').length;\n const errors = results.filter((r) => r.status === 'error').length;\n\n logger.info(\n { total: results.length, healthy, warnings, errors, exitCode },\n 'Store health check completed'\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n stores: results,\n summary: {\n total: results.length,\n healthy,\n warnings,\n errors,\n },\n exitCode,\n },\n null,\n 2\n ),\n },\n ],\n };\n};\n","import { rm } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { z } from 'zod';\nimport { createLogger } from '../../logging/index.js';\nimport { JobService } from '../../services/job.service.js';\nimport { StoreDefinitionService } from '../../services/store-definition.service.js';\nimport {\n isFileStoreDefinition,\n isRepoStoreDefinition,\n isWebStoreDefinition,\n} from '../../types/store-definition.js';\nimport { spawnBackgroundWorker } from '../../workers/spawn-worker.js';\nimport type { CommandDefinition } from './registry.js';\nimport type { StoreDefinition } from '../../types/store-definition.js';\nimport type { HandlerContext, ToolResponse } from '../types.js';\n\nconst logger = createLogger('mcp-sync');\n\n/**\n * Arguments for stores:sync command\n */\nexport interface SyncStoresArgs {\n prune?: boolean;\n dryRun?: boolean;\n reindex?: boolean;\n}\n\n/**\n * Result of a sync operation\n */\ninterface SyncResult {\n created: string[];\n skipped: string[];\n failed: Array<{ name: string; error: string }>;\n orphans: string[];\n pruned?: string[];\n dryRun?: boolean;\n wouldCreate?: string[];\n wouldPrune?: string[];\n reindexJobs?: Array<{ store: string; jobId: string }>;\n wouldReindex?: string[];\n}\n\n/**\n * Handle stores:sync command\n *\n * Syncs stores from definitions config:\n * - Creates missing stores from definitions\n * - Reports stores not in definitions (orphans)\n * - Optionally prunes orphan stores\n */\nexport async function handleStoresSync(\n args: SyncStoresArgs,\n context: HandlerContext\n): Promise<ToolResponse> {\n logger.info(\n { prune: args.prune, dryRun: args.dryRun, reindex: args.reindex },\n 'Stores sync started'\n );\n\n const { services, options } = context;\n const projectRoot = options.projectRoot;\n\n if (projectRoot === undefined) {\n throw new Error('Project root is required for stores:sync');\n }\n\n const defService = new StoreDefinitionService(projectRoot);\n const config = await defService.load();\n\n const result: SyncResult = {\n created: [],\n skipped: [],\n failed: [],\n orphans: [],\n };\n\n if (args.dryRun === true) {\n result.dryRun = true;\n result.wouldCreate = [];\n result.wouldPrune = [];\n }\n\n // Get existing stores\n const existingStores = await services.store.list();\n const existingNames = new Set(existingStores.map((s) => s.name));\n\n // Process each definition\n for (const def of config.stores) {\n if (existingNames.has(def.name)) {\n result.skipped.push(def.name);\n continue;\n }\n\n if (args.dryRun === true) {\n result.wouldCreate?.push(def.name);\n continue;\n }\n\n // Try to create the store\n const createResult = await createStoreFromDefinition(def, defService, services, context);\n if (createResult.success) {\n result.created.push(def.name);\n } else {\n result.failed.push({ name: def.name, error: createResult.error });\n }\n }\n\n // Find orphans (stores not in definitions)\n const definedNames = new Set(config.stores.map((d) => d.name));\n for (const store of existingStores) {\n if (!definedNames.has(store.name)) {\n result.orphans.push(store.name);\n }\n }\n\n // Prune orphans if requested\n if (args.prune === true && result.orphans.length > 0) {\n if (args.dryRun === true) {\n result.wouldPrune = [...result.orphans];\n } else {\n result.pruned = [];\n for (const orphanName of result.orphans) {\n const store = await services.store.getByName(orphanName);\n if (store !== undefined) {\n // Full cleanup like CLI sync --prune\n await services.lance.deleteStore(store.id);\n await services.codeGraph.deleteGraph(store.id);\n await services.manifest.delete(store.id);\n\n // For repo stores cloned from URL, remove the cloned directory\n if (store.type === 'repo' && 'url' in store && store.url !== undefined) {\n const dataDir = services.config.resolveDataDir();\n const repoPath = join(dataDir, 'repos', store.id);\n await rm(repoPath, { recursive: true, force: true });\n }\n\n const deleteResult = await services.store.delete(store.id, { skipDefinitionSync: true });\n if (deleteResult.success) {\n result.pruned.push(orphanName);\n }\n }\n }\n }\n }\n\n // Re-index existing stores if requested\n if (args.reindex === true && result.skipped.length > 0) {\n if (args.dryRun === true) {\n result.wouldReindex = [...result.skipped];\n } else {\n result.reindexJobs = [];\n const dataDir = options.dataDir ?? services.config.resolveDataDir();\n const jobService = new JobService(dataDir);\n\n for (const storeName of result.skipped) {\n const store = await services.store.getByName(storeName);\n if (store !== undefined) {\n const job = jobService.createJob({\n type: 'index',\n details: { storeId: store.id, storeName: store.name },\n message: `Re-indexing ${storeName}...`,\n });\n spawnBackgroundWorker(job.id, dataDir);\n result.reindexJobs.push({ store: storeName, jobId: job.id });\n }\n }\n }\n }\n\n logger.info(\n {\n created: result.created.length,\n skipped: result.skipped.length,\n failed: result.failed.length,\n orphans: result.orphans.length,\n pruned: result.pruned?.length ?? 0,\n reindexJobs: result.reindexJobs?.length ?? 0,\n dryRun: args.dryRun,\n },\n 'Stores sync completed'\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n}\n\n/**\n * Create a store from a definition\n */\nasync function createStoreFromDefinition(\n def: StoreDefinition,\n defService: StoreDefinitionService,\n services: HandlerContext['services'],\n _context: HandlerContext\n): Promise<{ success: true } | { success: false; error: string }> {\n try {\n if (isFileStoreDefinition(def)) {\n // Resolve path relative to project root\n const resolvedPath = defService.resolvePath(def.path);\n const createResult = await services.store.create(\n {\n name: def.name,\n type: 'file',\n path: resolvedPath,\n description: def.description,\n tags: def.tags,\n },\n { skipDefinitionSync: true } // Don't re-add to definitions\n );\n if (!createResult.success) {\n return { success: false, error: createResult.error.message };\n }\n return { success: true };\n }\n\n if (isRepoStoreDefinition(def)) {\n const createResult = await services.store.create(\n {\n name: def.name,\n type: 'repo',\n url: def.url,\n branch: def.branch,\n depth: def.depth,\n description: def.description,\n tags: def.tags,\n },\n { skipDefinitionSync: true }\n );\n if (!createResult.success) {\n return { success: false, error: createResult.error.message };\n }\n return { success: true };\n }\n\n if (isWebStoreDefinition(def)) {\n const createResult = await services.store.create(\n {\n name: def.name,\n type: 'web',\n url: def.url,\n depth: def.depth,\n description: def.description,\n tags: def.tags,\n },\n { skipDefinitionSync: true }\n );\n if (!createResult.success) {\n return { success: false, error: createResult.error.message };\n }\n return { success: true };\n }\n\n return { success: false, error: 'Unknown store definition type' };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Sync commands for the execute meta-tool\n */\nexport const syncCommands: CommandDefinition[] = [\n {\n name: 'stores:sync',\n description: 'Sync stores from definitions config (bootstrap on fresh clone)',\n argsSchema: z.object({\n prune: z.boolean().optional().describe('Remove stores not in definitions'),\n dryRun: z.boolean().optional().describe('Show what would happen without making changes'),\n reindex: z.boolean().optional().describe('Re-index existing stores after sync'),\n }),\n handler: (args: Record<string, unknown>, context: HandlerContext): Promise<ToolResponse> => {\n const syncArgs: SyncStoresArgs = {};\n if (typeof args['prune'] === 'boolean') {\n syncArgs.prune = args['prune'];\n }\n if (typeof args['dryRun'] === 'boolean') {\n syncArgs.dryRun = args['dryRun'];\n }\n if (typeof args['reindex'] === 'boolean') {\n syncArgs.reindex = args['reindex'];\n }\n return handleStoresSync(syncArgs, context);\n },\n },\n];\n","import { z } from 'zod';\nimport { handleUninstall } from '../handlers/uninstall.handler.js';\nimport type { CommandDefinition } from './registry.js';\nimport type { UninstallArgs } from '../handlers/uninstall.handler.js';\n\n/**\n * Uninstall commands for removing Bluera Knowledge data\n *\n * Provides cleanup functionality for testing fresh installs or removing the plugin.\n */\n/* eslint-disable @typescript-eslint/consistent-type-assertions */\nexport const uninstallCommands: CommandDefinition[] = [\n {\n name: 'uninstall',\n description: 'Remove Bluera Knowledge data from project (and optionally global data)',\n argsSchema: z.object({\n global: z\n .boolean()\n .optional()\n .describe('Also remove global data (~/.local/share/bluera-knowledge)'),\n keepDefinitions: z\n .boolean()\n .optional()\n .describe('Keep stores.config.json for team sharing (default: true)'),\n }),\n handler: (args, context) => handleUninstall(args as unknown as UninstallArgs, context),\n },\n];\n/* eslint-enable @typescript-eslint/consistent-type-assertions */\n","import { existsSync } from 'node:fs';\nimport { readdir, rm } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { createLogger } from '../../logging/index.js';\nimport type { ToolHandler, ToolResponse } from '../types.js';\n\nconst logger = createLogger('uninstall-handler');\n\n/**\n * Arguments for the uninstall handler\n */\nexport interface UninstallArgs {\n /** Also remove global data (~/.local/share/bluera-knowledge) */\n global?: boolean;\n /** Keep stores.config.json (default: true) */\n keepDefinitions?: boolean;\n}\n\n/**\n * Handle uninstall requests\n *\n * Removes Bluera Knowledge data from the project and optionally global data.\n * Always prints instructions for clearing the plugin cache.\n */\nexport const handleUninstall: ToolHandler<UninstallArgs> = async (\n args,\n context\n): Promise<ToolResponse> => {\n const { global: includeGlobal = false, keepDefinitions = true } = args;\n const deleted: string[] = [];\n const kept: string[] = [];\n const errors: string[] = [];\n\n // Get project root from context or options\n const projectRoot = context.options.projectRoot ?? process.cwd();\n const projectDataDir = join(projectRoot, '.bluera', 'bluera-knowledge');\n\n logger.info({ projectDataDir, includeGlobal, keepDefinitions }, 'Starting uninstall');\n\n // Delete project data\n if (existsSync(projectDataDir)) {\n if (keepDefinitions) {\n // Delete everything except stores.config.json\n try {\n const entries = await readdir(projectDataDir, { withFileTypes: true });\n for (const entry of entries) {\n const entryPath = join(projectDataDir, entry.name);\n if (entry.name === 'stores.config.json') {\n kept.push(entryPath);\n continue;\n }\n try {\n await rm(entryPath, { recursive: true, force: true });\n deleted.push(entryPath);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n errors.push(`Failed to delete ${entryPath}: ${msg}`);\n logger.error({ error: msg, path: entryPath }, 'Failed to delete');\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n errors.push(`Failed to read ${projectDataDir}: ${msg}`);\n logger.error({ error: msg, path: projectDataDir }, 'Failed to read directory');\n }\n } else {\n // Delete entire directory including stores.config.json\n try {\n await rm(projectDataDir, { recursive: true, force: true });\n deleted.push(projectDataDir);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n errors.push(`Failed to delete ${projectDataDir}: ${msg}`);\n logger.error({ error: msg, path: projectDataDir }, 'Failed to delete');\n }\n }\n }\n\n // Delete global data if requested\n if (includeGlobal) {\n const globalDir = join(homedir(), '.local', 'share', 'bluera-knowledge');\n if (existsSync(globalDir)) {\n try {\n await rm(globalDir, { recursive: true, force: true });\n deleted.push(globalDir);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n errors.push(`Failed to delete ${globalDir}: ${msg}`);\n logger.error({ error: msg, path: globalDir }, 'Failed to delete global data');\n }\n }\n }\n\n logger.info({ deleted, kept, errors }, 'Uninstall complete');\n\n // Build result message\n const lines: string[] = [];\n\n if (deleted.length > 0) {\n lines.push('## Deleted:');\n for (const path of deleted) {\n lines.push(`- ${path}`);\n }\n } else {\n lines.push('No data found to delete.');\n }\n\n if (kept.length > 0) {\n lines.push('');\n lines.push('## Preserved:');\n for (const path of kept) {\n lines.push(`- ${path}`);\n }\n lines.push('');\n lines.push('_Use `keepDefinitions: false` to also remove stores.config.json_');\n }\n\n if (errors.length > 0) {\n lines.push('');\n lines.push('## Errors:');\n for (const error of errors) {\n lines.push(`- ${error}`);\n }\n }\n\n // Always include plugin cache instructions\n // Note: Python venv is inside plugin cache, so it gets cleaned automatically\n lines.push('');\n lines.push('---');\n lines.push('');\n lines.push('## To fully uninstall (clear plugin cache):');\n lines.push('1. Exit Claude Code');\n lines.push('2. Run: `rm -rf ~/.claude/plugins/cache/bluera-knowledge-*`');\n lines.push('3. Restart Claude Code');\n lines.push('');\n lines.push('_This removes the plugin, Python venv, and all dependencies._');\n\n return {\n content: [{ type: 'text', text: lines.join('\\n') }],\n };\n};\n","/**\n * Command registration for the execute meta-tool\n *\n * This module registers all commands with the command registry.\n * Import this module to ensure all commands are available.\n */\n\nimport { jobCommands } from './job.commands.js';\nimport { metaCommands } from './meta.commands.js';\nimport { commandRegistry } from './registry.js';\nimport { storeCommands } from './store.commands.js';\nimport { syncCommands } from './sync.commands.js';\nimport { uninstallCommands } from './uninstall.commands.js';\n\n// Register all commands\ncommandRegistry.registerAll(storeCommands);\ncommandRegistry.registerAll(jobCommands);\ncommandRegistry.registerAll(metaCommands);\ncommandRegistry.registerAll(syncCommands);\ncommandRegistry.registerAll(uninstallCommands);\n\n// Re-export for convenience\nexport { commandRegistry, executeCommand, generateHelp } from './registry.js';\nexport type { CommandDefinition, CommandHandler } from './registry.js';\n","// Import commands module - side effect registers all commands, then use executeCommand\nimport { createLogger } from '../../logging/index.js';\nimport { executeCommand } from '../commands/index.js';\nimport { ExecuteArgsSchema } from '../schemas/index.js';\nimport type { ExecuteArgs } from '../schemas/index.js';\nimport type { ToolHandler, ToolResponse } from '../types.js';\n\nconst logger = createLogger('mcp-execute');\n\n/**\n * Handle execute requests\n *\n * This is the meta-tool handler that routes to registered commands.\n * It consolidates store and job management into a single tool surface.\n */\nexport const handleExecute: ToolHandler<ExecuteArgs> = async (\n args,\n context\n): Promise<ToolResponse> => {\n // Validate arguments with Zod\n const validated = ExecuteArgsSchema.parse(args);\n\n const commandArgs = validated.args ?? {};\n\n logger.info(\n { command: validated.command, args: JSON.stringify(commandArgs) },\n 'Execute command started'\n );\n\n const startTime = Date.now();\n try {\n const result = await executeCommand(validated.command, commandArgs, context);\n const durationMs = Date.now() - startTime;\n logger.info({ command: validated.command, durationMs }, 'Execute command completed');\n return result;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n logger.error(\n {\n command: validated.command,\n durationMs,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Execute command failed'\n );\n throw error;\n }\n};\n","/**\n * Token estimation service using Anthropic's recommended heuristic.\n * For Claude 3+ models, Anthropic recommends ~3.5 characters per token\n * for English text. This varies by language.\n *\n * Note: The official @anthropic-ai/tokenizer package only works for\n * pre-Claude 3 models. For accurate counts on Claude 3+, use the\n * Token Count API. This heuristic is suitable for display purposes.\n */\n\nconst CHARS_PER_TOKEN = 3.5;\n\n/**\n * Estimate token count for a string using character-based heuristic.\n * @param text - The text to estimate tokens for\n * @returns Estimated token count (rounded up)\n */\nexport function estimateTokens(text: string): number {\n if (!text) return 0;\n return Math.ceil(text.length / CHARS_PER_TOKEN);\n}\n\n/**\n * Format token count for display with appropriate suffix.\n * @param tokens - Token count\n * @returns Formatted string like \"~1.2k\" or \"~847\"\n */\nexport function formatTokenCount(tokens: number): string {\n if (tokens >= 1000) {\n return `~${(tokens / 1000).toFixed(1)}k`;\n }\n return `~${String(tokens)}`;\n}\n","/**\n * LRU (Least Recently Used) Cache implementation\n *\n * Maintains a cache with a maximum size, evicting the oldest (least recently used)\n * items when the capacity is exceeded. This prevents unbounded memory growth.\n *\n * Items are automatically moved to the end of the cache when accessed (via get),\n * making them the most recently used.\n */\nexport class LRUCache<K, V> {\n private readonly cache = new Map<K, V>();\n private readonly maxSize: number;\n\n /**\n * Create a new LRU cache\n *\n * @param maxSize - Maximum number of items to store (default: 1000)\n */\n constructor(maxSize: number = 1000) {\n this.maxSize = maxSize;\n }\n\n /**\n * Store a value in the cache\n *\n * If the key already exists, it will be moved to the end (most recent).\n * If the cache is at capacity, the oldest item will be evicted.\n *\n * @param key - The cache key\n * @param value - The value to store\n */\n set(key: K, value: V): void {\n // If key exists, delete it first to move it to the end\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n\n // Add the new/updated entry\n this.cache.set(key, value);\n\n // Evict oldest entry if over capacity\n if (this.cache.size > this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n }\n }\n }\n\n /**\n * Retrieve a value from the cache\n *\n * If the key exists, it will be moved to the end (most recent).\n *\n * @param key - The cache key\n * @returns The cached value, or undefined if not found\n */\n get(key: K): V | undefined {\n const value = this.cache.get(key);\n\n if (value !== undefined) {\n // Move to end (most recent) by deleting and re-adding\n this.cache.delete(key);\n this.cache.set(key, value);\n }\n\n return value;\n }\n\n /**\n * Check if a key exists in the cache\n *\n * @param key - The cache key\n * @returns True if the key exists\n */\n has(key: K): boolean {\n return this.cache.has(key);\n }\n\n /**\n * Remove a specific key from the cache\n *\n * @param key - The cache key\n * @returns True if the key was removed, false if it didn't exist\n */\n delete(key: K): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * Clear all entries from the cache\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Get the current number of items in the cache\n */\n get size(): number {\n return this.cache.size;\n }\n}\n","import { createLogger, summarizePayload } from '../../logging/index.js';\nimport { estimateTokens, formatTokenCount } from '../../services/token.service.js';\nimport { checkStoreModelCompatibility } from '../../utils/model-validation.js';\nimport { LRUCache } from '../cache.js';\nimport { SearchArgsSchema, GetFullContextArgsSchema } from '../schemas/index.js';\nimport type { SearchQuery, DocumentId, StoreId } from '../../types/index.js';\nimport type { SearchResult } from '../../types/search.js';\nimport type { Store } from '../../types/store.js';\nimport type { SearchArgs, GetFullContextArgs } from '../schemas/index.js';\nimport type { ToolHandler, ToolResponse } from '../types.js';\n\nconst logger = createLogger('mcp-search');\n\n// Create result cache for get_full_context\n// Uses LRU cache to prevent memory leaks (max 1000 items)\nexport const resultCache = new LRUCache<DocumentId, SearchResult>(1000);\n\n/**\n * Handle search requests\n *\n * Searches across specified stores (or all stores if none specified) using\n * hybrid vector + FTS search. Results are cached for get_full_context retrieval.\n */\nexport const handleSearch: ToolHandler<SearchArgs> = async (\n args,\n context\n): Promise<ToolResponse> => {\n // Validate arguments with Zod\n let validated = SearchArgsSchema.parse(args);\n\n // find-files intent: force minimal detail and bump default limit for compact file discovery\n if (validated.intent === 'find-files') {\n validated = {\n ...validated,\n detail: 'minimal',\n ...(validated.limit === 10 ? { limit: 20 } : {}),\n };\n }\n\n logger.info(\n {\n query: validated.query,\n stores: validated.stores,\n mode: validated.mode,\n detail: validated.detail,\n limit: validated.limit,\n intent: validated.intent,\n },\n 'Search started'\n );\n\n const { services } = context;\n\n // Get all stores if none specified, resolve store names to IDs\n const stores: Store[] =\n validated.stores !== undefined\n ? await Promise.all(\n validated.stores.map(async (s) => {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const store = await services.store.getByIdOrName(s as StoreId);\n if (!store) {\n throw new Error(`Store not found: ${s}`);\n }\n return store;\n })\n )\n : await services.store.list();\n\n // Filter stores by model compatibility (skip incompatible instead of failing)\n const currentModelId = services.store.getCurrentModelId();\n const compatibleStores: Store[] = [];\n const skippedStores: string[] = [];\n\n for (const store of stores) {\n const check = checkStoreModelCompatibility(store, { currentModelId });\n if (check.compatible) {\n compatibleStores.push(store);\n } else {\n skippedStores.push(`${store.name}: ${check.reason ?? 'incompatible'}`);\n }\n }\n\n // Fail if no compatible stores found\n if (compatibleStores.length === 0) {\n const allV1 = skippedStores.length > 0 && skippedStores.every((s) => s.includes('schema v1'));\n const hint = allV1 ? ' Run: /bluera-knowledge:index <store> to upgrade.' : '';\n throw new Error(\n `No compatible stores found.${skippedStores.length > 0 ? ` Skipped: ${skippedStores.join('; ')}` : ''}${hint}`\n );\n }\n\n // Log skipped stores as warning\n if (skippedStores.length > 0) {\n logger.warn({ skippedStores }, 'Some stores skipped due to model incompatibility');\n }\n\n const storeIds = compatibleStores.map((s) => s.id);\n\n // Initialize stores with error handling\n try {\n services.lance.setDimensions(await services.embeddings.ensureDimensions());\n for (const storeId of storeIds) {\n await services.lance.initialize(storeId);\n }\n } catch (error) {\n throw new Error(\n `Failed to initialize vector stores: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n // Perform search\n const searchQuery: SearchQuery = {\n query: validated.query,\n stores: storeIds,\n mode: validated.mode,\n limit: validated.limit,\n detail: validated.detail,\n threshold: validated.threshold,\n minRelevance: validated.minRelevance,\n intent: validated.intent,\n };\n\n const results = await services.search.search(searchQuery);\n\n // Cache results for get_full_context (with LRU eviction)\n for (const result of results.results) {\n resultCache.set(result.id, result);\n }\n\n // Batch store lookup (dedup by storeId) — avoids per-result getByIdOrName calls\n const storeById = new Map<string, Store>();\n const uniqueStoreIds = new Set(results.results.map((r) => r.metadata.storeId));\n for (const storeId of uniqueStoreIds) {\n const store = await services.store.getByIdOrName(storeId);\n if (store) storeById.set(storeId, store);\n }\n\n // Build store map for response (store name → path/url for follow-up reads)\n const storeMap: Record<string, { type: string; path?: string; url?: string }> = {};\n for (const store of storeById.values()) {\n storeMap[store.name] = {\n type: store.type,\n ...('path' in store ? { path: store.path } : {}),\n ...('url' in store && store.url !== undefined ? { url: store.url } : {}),\n };\n }\n\n // Add repoRoot to results for cloned repos\n const enhancedResults = results.results.map((r) => {\n const store = storeById.get(r.metadata.storeId);\n\n return {\n id: r.id,\n score: r.score,\n summary: {\n ...r.summary,\n storeName: store?.name,\n repoRoot: store?.type === 'repo' ? store.path : undefined,\n },\n context: r.context,\n full: r.full,\n };\n });\n\n // find-files intent: return compact file listing instead of full results\n if (validated.intent === 'find-files') {\n const seen = new Set<string>();\n const files = enhancedResults\n .filter((r) => {\n const loc = r.summary.location?.split(':')[0] ?? '';\n if (seen.has(loc)) return false;\n seen.add(loc);\n return true;\n })\n .map((r) => ({\n location: r.summary.location,\n name: r.summary.name,\n type: r.summary.type,\n score: r.score,\n }));\n\n const findFilesData = {\n files,\n stores: storeMap,\n totalResults: files.length,\n timeMs: results.timeMs,\n };\n const findFilesJson = JSON.stringify(findFilesData, null, 2);\n const findFilesTokens = estimateTokens(findFilesJson);\n const findFilesHeader = `Find files: \"${validated.query}\" | Files: ${String(files.length)} | ${formatTokenCount(findFilesTokens)} tokens | ${String(results.timeMs)}ms\\n\\n`;\n\n logger.info(\n {\n query: validated.query,\n totalFiles: files.length,\n responseTokens: findFilesTokens,\n timeMs: results.timeMs,\n },\n 'Find-files search complete'\n );\n\n return {\n content: [{ type: 'text', text: findFilesHeader + findFilesJson }],\n };\n }\n\n const responseData: Record<string, unknown> = {\n stores: storeMap,\n results: enhancedResults,\n totalResults: results.totalResults,\n mode: results.mode,\n timeMs: results.timeMs,\n };\n if (results.confidence !== undefined) {\n responseData['confidence'] = results.confidence;\n }\n if (results.maxRawScore !== undefined) {\n responseData['maxRawScore'] = results.maxRawScore;\n }\n if (results.rerankTimeMs !== undefined) {\n responseData['rerankTimeMs'] = results.rerankTimeMs;\n }\n const responseJson = JSON.stringify(responseData, null, 2);\n\n // Calculate actual token estimate based on response content\n const responseTokens = estimateTokens(responseJson);\n\n // Create visible header with token usage and confidence\n const confidenceInfo =\n results.confidence !== undefined ? ` | Confidence: ${results.confidence}` : '';\n const rerankInfo =\n results.rerankTimeMs !== undefined ? ` | Rerank: ${String(results.rerankTimeMs)}ms` : '';\n const header = `Search: \"${validated.query}\" | Results: ${String(results.totalResults)} | ${formatTokenCount(responseTokens)} tokens | ${String(results.timeMs)}ms${confidenceInfo}${rerankInfo}\\n\\n`;\n\n // Log the complete MCP response that will be sent to Claude Code\n logger.info(\n {\n query: validated.query,\n totalResults: results.totalResults,\n responseTokens,\n timeMs: results.timeMs,\n ...summarizePayload(responseJson, 'mcp-response', validated.query),\n },\n 'Search complete - context sent to Claude Code'\n );\n\n return {\n content: [\n {\n type: 'text',\n text: header + responseJson,\n },\n ],\n };\n};\n\n/**\n * Handle get_full_context requests\n *\n * Retrieves full context for a previously cached search result (by resultId),\n * or retrieves indexed context for a file by path (by file).\n */\nexport const handleGetFullContext: ToolHandler<GetFullContextArgs> = async (\n args,\n context\n): Promise<ToolResponse> => {\n // Validate arguments with Zod\n const validated = GetFullContextArgsSchema.parse(args);\n\n const { services } = context;\n\n // File-based retrieval: search by file path using FTS\n if (validated.file !== undefined) {\n const filePath = validated.file;\n logger.info({ file: filePath, store: validated.store }, 'Get full context by file path');\n\n // Resolve target stores\n let targetStores: Store[];\n if (validated.store !== undefined) {\n const store = await services.store.getByIdOrName(validated.store);\n if (!store) throw new Error(`Store not found: ${validated.store}`);\n targetStores = [store];\n } else {\n targetStores = await services.store.list();\n }\n\n const currentModelId = services.store.getCurrentModelId();\n const compatible = targetStores.filter(\n (s) => checkStoreModelCompatibility(s, { currentModelId }).compatible\n );\n\n if (compatible.length === 0) {\n throw new Error('No compatible stores found');\n }\n\n services.lance.setDimensions(await services.embeddings.ensureDimensions());\n for (const s of compatible) {\n await services.lance.initialize(s.id);\n }\n\n const fileResults = await services.search.search({\n query: filePath,\n stores: compatible.map((s) => s.id),\n mode: 'fts',\n limit: 5,\n detail: 'full',\n });\n\n // Filter to results whose path contains the requested file\n const matching = fileResults.results.filter(\n (r) => r.metadata.path?.includes(filePath) === true\n );\n\n if (matching.length === 0) {\n throw new Error(`No indexed content found for file: ${filePath}`);\n }\n\n // Cache for future resultId-based access\n for (const r of matching) {\n resultCache.set(r.id, r);\n }\n\n const responseJson = JSON.stringify(\n {\n results: matching.map((r) => ({\n id: r.id,\n score: r.score,\n summary: r.summary,\n context: r.context,\n full: r.full,\n })),\n },\n null,\n 2\n );\n\n logger.info(\n {\n file: filePath,\n resultCount: matching.length,\n ...summarizePayload(responseJson, 'mcp-full-context-file', filePath),\n },\n 'Full context retrieved by file path'\n );\n\n return {\n content: [{ type: 'text', text: responseJson }],\n };\n }\n\n // ResultId-based retrieval (existing path)\n logger.info({ resultId: validated.resultId }, 'Get full context requested');\n\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const resultId = validated.resultId as DocumentId;\n\n // Check cache for result\n const cachedResult = resultCache.get(resultId);\n\n if (!cachedResult) {\n throw new Error(`Result not found in cache: ${resultId}. Run a search first to cache results.`);\n }\n\n // If result already has full context, return it\n if (cachedResult.full) {\n const responseJson = JSON.stringify(\n {\n id: cachedResult.id,\n score: cachedResult.score,\n summary: cachedResult.summary,\n context: cachedResult.context,\n full: cachedResult.full,\n },\n null,\n 2\n );\n\n logger.info(\n {\n resultId,\n cached: true,\n hasFullContext: true,\n ...summarizePayload(responseJson, 'mcp-full-context', resultId),\n },\n 'Full context retrieved from cache'\n );\n\n return {\n content: [\n {\n type: 'text',\n text: responseJson,\n },\n ],\n };\n }\n\n // Otherwise, re-query with full detail\n const store = await services.store.getByIdOrName(cachedResult.metadata.storeId);\n\n if (!store) {\n throw new Error(`Store not found: ${cachedResult.metadata.storeId}`);\n }\n\n services.lance.setDimensions(await services.embeddings.ensureDimensions());\n await services.lance.initialize(store.id);\n\n const searchQuery: SearchQuery = {\n query: cachedResult.content.substring(0, 100), // Use snippet of content as query\n stores: [store.id],\n mode: 'hybrid',\n limit: 1,\n detail: 'full',\n };\n\n const results = await services.search.search(searchQuery);\n\n // Find matching result by ID\n const fullResult = results.results.find((r) => r.id === resultId);\n\n if (!fullResult) {\n // Return cached result even if we couldn't get full detail\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n id: cachedResult.id,\n score: cachedResult.score,\n summary: cachedResult.summary,\n context: cachedResult.context,\n warning: 'Could not retrieve full context, returning cached minimal result',\n },\n null,\n 2\n ),\n },\n ],\n };\n }\n\n // Update cache with full result\n resultCache.set(resultId, fullResult);\n\n const responseJson = JSON.stringify(\n {\n id: fullResult.id,\n score: fullResult.score,\n summary: fullResult.summary,\n context: fullResult.context,\n full: fullResult.full,\n },\n null,\n 2\n );\n\n logger.info(\n {\n resultId,\n cached: false,\n hasFullContext: true,\n ...summarizePayload(responseJson, 'mcp-full-context', resultId),\n },\n 'Full context retrieved via re-query'\n );\n\n return {\n content: [\n {\n type: 'text',\n text: responseJson,\n },\n ],\n };\n};\n","import { z } from 'zod';\nimport { handleSearch, handleGetFullContext } from './search.handler.js';\nimport { SearchArgsSchema, GetFullContextArgsSchema } from '../schemas/index.js';\nimport type { ToolHandler } from '../types.js';\n\n/**\n * Tool definition with schema and handler\n */\nexport interface ToolDefinition {\n name: string;\n description: string;\n schema: z.ZodType;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- heterogeneous tool registry requires any; schema provides runtime type safety via Zod validation\n handler: ToolHandler<any>;\n}\n\n/**\n * Registry of native MCP tools\n *\n * Only search and get_full_context are native tools with full schemas.\n * Store and job management is consolidated into the execute meta-tool\n * (see commands/ directory and execute.handler.ts).\n */\nexport const tools: ToolDefinition[] = [\n {\n name: 'search',\n description:\n 'Search all indexed knowledge stores with pattern detection and AI-optimized results. Returns structured code units with progressive context layers.',\n schema: SearchArgsSchema,\n handler: handleSearch,\n },\n {\n name: 'get_full_context',\n description:\n 'Get complete code and context for a specific search result by ID. Use this after search to get full implementation details.',\n schema: GetFullContextArgsSchema,\n handler: handleGetFullContext,\n },\n];\n"],"mappings":"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","names":["z","z","z","z","logger","lines","z","z","z","logger","spawn","logger","spawn","err","logger","join","logger","join","path","z","rm","join","z","logger","join","rm","z","z","readdir","rm","join","logger","join","readdir","rm","err","path","z","logger","logger","store","responseJson","logger"]}