jest-results.json•417 kB
{"numFailedTestSuites":15,"numFailedTests":67,"numPassedTestSuites":19,"numPassedTests":379,"numPendingTestSuites":0,"numPendingTests":3,"numRuntimeErrorTestSuites":3,"numTodoTests":0,"numTotalTestSuites":34,"numTotalTests":449,"openHandles":[],"snapshot":{"added":0,"didUpdate":false,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0},"startTime":1758320430289,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":["LocalEmbeddingProvider","Initialization"],"duration":49,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Initialization should initialize with default model","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should initialize with default model"},{"ancestorTitles":["LocalEmbeddingProvider","Initialization"],"duration":41,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Initialization should initialize with all-MiniLM-L6-v2 model","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should initialize with all-MiniLM-L6-v2 model"},{"ancestorTitles":["LocalEmbeddingProvider","Initialization"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Initialization should initialize with multilingual-e5-large model","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should initialize with multilingual-e5-large model"},{"ancestorTitles":["LocalEmbeddingProvider","Initialization"],"duration":5,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Initialization should initialize with advanced-neural-dense model","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should initialize with advanced-neural-dense model"},{"ancestorTitles":["LocalEmbeddingProvider","Initialization"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Initialization should initialize with multilingual-e5-large-instruct model","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should initialize with multilingual-e5-large-instruct model"},{"ancestorTitles":["LocalEmbeddingProvider","Initialization"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Initialization should initialize with all-mpnet-base-v2 model","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should initialize with all-mpnet-base-v2 model"},{"ancestorTitles":["LocalEmbeddingProvider","Model Mapping"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Model Mapping should map advanced-neural-dense to all-mpnet-base-v2","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should map advanced-neural-dense to all-mpnet-base-v2"},{"ancestorTitles":["LocalEmbeddingProvider","Environment Variable Support"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Environment Variable Support should use environment variable when no config provided","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should use environment variable when no config provided"},{"ancestorTitles":["LocalEmbeddingProvider","Environment Variable Support"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Environment Variable Support should handle case-insensitive environment variable","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle case-insensitive environment variable"},{"ancestorTitles":["LocalEmbeddingProvider","Environment Variable Support"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Environment Variable Support should fallback to default for unknown environment variable","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should fallback to default for unknown environment variable"},{"ancestorTitles":["LocalEmbeddingProvider","Environment Variable Support"],"duration":21,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Environment Variable Support should prioritize config over environment variable","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should prioritize config over environment variable"},{"ancestorTitles":["LocalEmbeddingProvider","Embedding Generation"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Embedding Generation should generate embeddings for single text","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"should generate embeddings for single text"},{"ancestorTitles":["LocalEmbeddingProvider","Embedding Generation"],"duration":6,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Embedding Generation should generate embeddings for multiple texts","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"status":"passed","title":"should generate embeddings for multiple texts"},{"ancestorTitles":["LocalEmbeddingProvider","Embedding Generation"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Embedding Generation should handle empty text array","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle empty text array"},{"ancestorTitles":["LocalEmbeddingProvider","Embedding Generation"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Embedding Generation should handle empty strings","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle empty strings"},{"ancestorTitles":["LocalEmbeddingProvider","Embedding Generation"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Embedding Generation should handle non-string inputs","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should handle non-string inputs"},{"ancestorTitles":["LocalEmbeddingProvider","Pipeline Management"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Pipeline Management should lazy load pipeline","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should lazy load pipeline"},{"ancestorTitles":["LocalEmbeddingProvider","Pipeline Management"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Pipeline Management should dispose pipeline correctly","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should dispose pipeline correctly"},{"ancestorTitles":["LocalEmbeddingProvider","Error Handling"],"duration":16,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Error Handling should handle pipeline initialization failure","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle pipeline initialization failure"},{"ancestorTitles":["LocalEmbeddingProvider","Error Handling"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Error Handling should handle embedding generation failure","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle embedding generation failure"},{"ancestorTitles":["LocalEmbeddingProvider","Singleton Provider"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Singleton Provider should return same instance for multiple calls","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return same instance for multiple calls"},{"ancestorTitles":["LocalEmbeddingProvider","Singleton Provider"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Singleton Provider should dispose singleton correctly","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should dispose singleton correctly"},{"ancestorTitles":["LocalEmbeddingProvider","Configuration Options"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Configuration Options should respect maxLength configuration","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should respect maxLength configuration"},{"ancestorTitles":["LocalEmbeddingProvider","Configuration Options"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Configuration Options should respect normalize configuration","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should respect normalize configuration"},{"ancestorTitles":["LocalEmbeddingProvider","Configuration Options"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingProvider Configuration Options should respect pooling configuration","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should respect pooling configuration"}],"endTime":1758320437130,"message":"","name":"C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\localEmbeddingProvider.test.ts","startTime":1758320431247,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["Environment Variable Integration","LOCAL_EMBEDDING_MODEL Variable"],"duration":17,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration LOCAL_EMBEDDING_MODEL Variable should initialize all-MiniLM-L6-v2 model from LOCAL_EMBEDDING_MODEL=all-MiniLM-L6-v2","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should initialize all-MiniLM-L6-v2 model from LOCAL_EMBEDDING_MODEL=all-MiniLM-L6-v2"},{"ancestorTitles":["Environment Variable Integration","LOCAL_EMBEDDING_MODEL Variable"],"duration":21,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration LOCAL_EMBEDDING_MODEL Variable should initialize all-minilm-l6-v2 model from LOCAL_EMBEDDING_MODEL=all-MiniLM-L6-v2","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should initialize all-minilm-l6-v2 model from LOCAL_EMBEDDING_MODEL=all-MiniLM-L6-v2"},{"ancestorTitles":["Environment Variable Integration","LOCAL_EMBEDDING_MODEL Variable"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration LOCAL_EMBEDDING_MODEL Variable should initialize MULTILINGUAL-E5-LARGE model from LOCAL_EMBEDDING_MODEL=multilingual-e5-large","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should initialize MULTILINGUAL-E5-LARGE model from LOCAL_EMBEDDING_MODEL=multilingual-e5-large"},{"ancestorTitles":["Environment Variable Integration","LOCAL_EMBEDDING_MODEL Variable"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration LOCAL_EMBEDDING_MODEL Variable should initialize all-mpnet-base-v2 model from LOCAL_EMBEDDING_MODEL=all-mpnet-base-v2","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should initialize all-mpnet-base-v2 model from LOCAL_EMBEDDING_MODEL=all-mpnet-base-v2"},{"ancestorTitles":["Environment Variable Integration","LOCAL_EMBEDDING_MODEL Variable"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration LOCAL_EMBEDDING_MODEL Variable should initialize ADVANCED-NEURAL-DENSE model from LOCAL_EMBEDDING_MODEL=advanced-neural-dense","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should initialize ADVANCED-NEURAL-DENSE model from LOCAL_EMBEDDING_MODEL=advanced-neural-dense"},{"ancestorTitles":["Environment Variable Integration","LOCAL_EMBEDDING_MODEL Variable"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration LOCAL_EMBEDDING_MODEL Variable should initialize multilingual-e5-large-instruct model from LOCAL_EMBEDDING_MODEL=multilingual-e5-large-instruct","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should initialize multilingual-e5-large-instruct model from LOCAL_EMBEDDING_MODEL=multilingual-e5-large-instruct"},{"ancestorTitles":["Environment Variable Integration","LOCAL_EMBEDDING_MODEL Variable"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration LOCAL_EMBEDDING_MODEL Variable should fallback to all-MiniLM-L6-v2 for unknown model","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should fallback to all-MiniLM-L6-v2 for unknown model"},{"ancestorTitles":["Environment Variable Integration","LOCAL_EMBEDDING_MODEL Variable"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration LOCAL_EMBEDDING_MODEL Variable should prioritize explicit config over environment variable","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should prioritize explicit config over environment variable"},{"ancestorTitles":["Environment Variable Integration","LOCAL_EMBEDDING_MODEL Variable"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration LOCAL_EMBEDDING_MODEL Variable should use default model when no environment variable is set","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should use default model when no environment variable is set"},{"ancestorTitles":["Environment Variable Integration","Embedding Generator with Environment Variables"],"duration":9,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration Embedding Generator with Environment Variables should use environment-specified model in embedding generation","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should use environment-specified model in embedding generation"},{"ancestorTitles":["Environment Variable Integration","Embedding Generator with Environment Variables"],"duration":6,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration Embedding Generator with Environment Variables should handle Ambiance API with environment variable model","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle Ambiance API with environment variable model"},{"ancestorTitles":["Environment Variable Integration","Model Switching"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration Model Switching should allow switching models by changing environment variable","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should allow switching models by changing environment variable"},{"ancestorTitles":["Environment Variable Integration","Integration with All Supported Models"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration Integration with All Supported Models should properly integrate all-MiniLM-L6-v2 environment variable","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should properly integrate all-MiniLM-L6-v2 environment variable"},{"ancestorTitles":["Environment Variable Integration","Integration with All Supported Models"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration Integration with All Supported Models should properly integrate multilingual-e5-large environment variable","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should properly integrate multilingual-e5-large environment variable"},{"ancestorTitles":["Environment Variable Integration","Integration with All Supported Models"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration Integration with All Supported Models should properly integrate advanced-neural-dense environment variable","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should properly integrate advanced-neural-dense environment variable"},{"ancestorTitles":["Environment Variable Integration","Integration with All Supported Models"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration Integration with All Supported Models should properly integrate multilingual-e5-large-instruct environment variable","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should properly integrate multilingual-e5-large-instruct environment variable"},{"ancestorTitles":["Environment Variable Integration","Error Handling with Environment Variables"],"duration":13,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration Error Handling with Environment Variables should handle invalid environment variable gracefully","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle invalid environment variable gracefully"},{"ancestorTitles":["Environment Variable Integration","Error Handling with Environment Variables"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration Error Handling with Environment Variables should handle empty environment variable","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle empty environment variable"},{"ancestorTitles":["Environment Variable Integration","Error Handling with Environment Variables"],"duration":3,"failureDetails":[{"matcherResult":{"actual":"all-MiniLM-L6-v2","expected":"multilingual-e5-large-instruct","message":"\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m\"multilingual-e5-large-instruct\"\u001b[39m\nReceived: \u001b[31m\"all-MiniLM-L6-v2\"\u001b[39m","name":"toBe","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m\"multilingual-e5-large-instruct\"\u001b[39m\nReceived: \u001b[31m\"all-MiniLM-L6-v2\"\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\environmentVariables.test.ts:216:44)\n at Promise.then.completed (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:231:10)\n at _callCircusTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:252:3)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:126:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at run (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:71:3)\n at runAndTransformResultsToJestFormat (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapterInit.js:122:21)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:79:19)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"Environment Variable Integration Error Handling with Environment Variables should handle whitespace in environment variable","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle whitespace in environment variable"},{"ancestorTitles":["Environment Variable Integration","Performance and Memory"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration Performance and Memory should reuse provider instances for same environment variable","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should reuse provider instances for same environment variable"},{"ancestorTitles":["Environment Variable Integration","Performance and Memory"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Environment Variable Integration Performance and Memory should create new instance when environment variable changes","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should create new instance when environment variable changes"}],"endTime":1758320437267,"message":"\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mEnvironment Variable Integration › Error Handling with Environment Variables › should handle whitespace in environment variable\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\n Expected: \u001b[32m\"multilingual-e5-large-instruct\"\u001b[39m\n Received: \u001b[31m\"all-MiniLM-L6-v2\"\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 214 |\u001b[39m \u001b[36mconst\u001b[39m provider \u001b[33m=\u001b[39m getDefaultLocalProvider()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 215 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 216 |\u001b[39m expect(provider\u001b[33m.\u001b[39mgetModelInfo()\u001b[33m.\u001b[39mname)\u001b[33m.\u001b[39mtoBe(\u001b[32m'multilingual-e5-large-instruct'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 217 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 218 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 219 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/environmentVariables.test.ts\u001b[39m\u001b[0m\u001b[2m:216:44)\u001b[22m\u001b[2m\u001b[22m\n","name":"C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\environmentVariables.test.ts","startTime":1758320431200,"status":"failed","summary":""},{"assertionResults":[{"ancestorTitles":["OpenAIService","Qwen Provider"],"duration":67,"failureDetails":[],"failureMessages":[],"fullName":"OpenAIService Qwen Provider should initialize with Qwen configuration","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should initialize with Qwen configuration"},{"ancestorTitles":["OpenAIService","Qwen Provider"],"duration":15,"failureDetails":[],"failureMessages":[],"fullName":"OpenAIService Qwen Provider should force temperature to 1 for Qwen provider","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should force temperature to 1 for Qwen provider"},{"ancestorTitles":["OpenAIService","Qwen Provider"],"duration":23,"failureDetails":[],"failureMessages":[],"fullName":"OpenAIService Qwen Provider should respect max_tokens limit","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should respect max_tokens limit"},{"ancestorTitles":["OpenAIService","Qwen Provider"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"OpenAIService Qwen Provider should return appropriate models for tasks","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should return appropriate models for tasks"},{"ancestorTitles":["OpenAIService","OpenAI Provider"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"OpenAIService OpenAI Provider should initialize with OpenAI configuration","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should initialize with OpenAI configuration"},{"ancestorTitles":["OpenAIService","OpenAI Provider"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"OpenAIService OpenAI Provider should preserve temperature for OpenAI provider","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should preserve temperature for OpenAI provider"},{"ancestorTitles":["OpenAIService","OpenAI Provider"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"OpenAIService OpenAI Provider should return appropriate models for tasks","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should return appropriate models for tasks"},{"ancestorTitles":["OpenAIService","Custom Provider with Custom Models"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"OpenAIService Custom Provider with Custom Models should initialize with custom configuration","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should initialize with custom configuration"},{"ancestorTitles":["OpenAIService","Custom Provider with Custom Models"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"OpenAIService Custom Provider with Custom Models should return custom models for tasks","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should return custom models for tasks"},{"ancestorTitles":["OpenAIService","Error Handling"],"duration":16,"failureDetails":[],"failureMessages":[],"fullName":"OpenAIService Error Handling should handle API errors gracefully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle API errors gracefully"}],"endTime":1758320437407,"message":"","name":"C:\\Dev\\ambiance-mcp\\src\\core\\__tests__\\openaiService.test.ts","startTime":1758320431256,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["Core Validation Error Handling","Zod Schema Validation"],"duration":26,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Zod Schema Validation should reject empty arrays when minimum required","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should reject empty arrays when minimum required"},{"ancestorTitles":["Core Validation Error Handling","Zod Schema Validation"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Zod Schema Validation should reject invalid UUIDs","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should reject invalid UUIDs"},{"ancestorTitles":["Core Validation Error Handling","Zod Schema Validation"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Zod Schema Validation should reject null values for required strings","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should reject null values for required strings"},{"ancestorTitles":["Core Validation Error Handling","Zod Schema Validation"],"duration":5,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Zod Schema Validation should reject undefined values for required fields","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should reject undefined values for required fields"},{"ancestorTitles":["Core Validation Error Handling","Zod Schema Validation"],"duration":8,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Zod Schema Validation should reject empty directory paths","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should reject empty directory paths"},{"ancestorTitles":["Core Validation Error Handling","Zod Schema Validation"],"duration":51,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Zod Schema Validation should reject content that is too short","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should reject content that is too short"},{"ancestorTitles":["Core Validation Error Handling","Zod Schema Validation"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Zod Schema Validation should reject invalid regex patterns","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should reject invalid regex patterns"},{"ancestorTitles":["Core Validation Error Handling","Zod Schema Validation"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Zod Schema Validation should reject arrays that exceed maximum size","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should reject arrays that exceed maximum size"},{"ancestorTitles":["Core Validation Error Handling","Zod Schema Validation"],"duration":9,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Zod Schema Validation should reject numbers outside valid range","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should reject numbers outside valid range"},{"ancestorTitles":["Core Validation Error Handling","Zod Schema Validation"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Zod Schema Validation should reject invalid enum values","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should reject invalid enum values"},{"ancestorTitles":["Core Validation Error Handling","Error Message Structure"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Error Message Structure should provide structured error information","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should provide structured error information"},{"ancestorTitles":["Core Validation Error Handling","Error Message Structure"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Error Message Structure should include helpful suggestions in error messages","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should include helpful suggestions in error messages"},{"ancestorTitles":["Core Validation Error Handling","Complex Object Validation"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Complex Object Validation should validate nested objects correctly","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should validate nested objects correctly"},{"ancestorTitles":["Core Validation Error Handling","Complex Object Validation"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Complex Object Validation should handle optional fields correctly","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle optional fields correctly"},{"ancestorTitles":["Core Validation Error Handling","Type Coercion and Validation"],"duration":7,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Type Coercion and Validation should handle string-to-number coercion failures","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle string-to-number coercion failures"},{"ancestorTitles":["Core Validation Error Handling","Type Coercion and Validation"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Type Coercion and Validation should handle date validation failures","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle date validation failures"},{"ancestorTitles":["Core Validation Error Handling","Type Coercion and Validation"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Type Coercion and Validation should handle boolean validation failures","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle boolean validation failures"},{"ancestorTitles":["Core Validation Error Handling","Custom Validation Rules"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Custom Validation Rules should handle custom refinement failures","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle custom refinement failures"},{"ancestorTitles":["Core Validation Error Handling","Custom Validation Rules"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Custom Validation Rules should handle transform failures","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle transform failures"},{"ancestorTitles":["Core Validation Error Handling","Edge Cases"],"duration":20,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Edge Cases should handle very large objects","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle very large objects"},{"ancestorTitles":["Core Validation Error Handling","Edge Cases"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Edge Cases should handle circular reference detection","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle circular reference detection"},{"ancestorTitles":["Core Validation Error Handling","Edge Cases"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"Core Validation Error Handling Edge Cases should handle null vs undefined distinction","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should handle null vs undefined distinction"}],"endTime":1758320437688,"message":"","name":"C:\\Dev\\ambiance-mcp\\src\\core\\__tests__\\simple-error-handling.test.ts","startTime":1758320437435,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["Phase 13 Resource Guard System","Resource Registration"],"duration":6,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Resource Guard System Resource Registration should register and track resources","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should register and track resources"},{"ancestorTitles":["Phase 13 Resource Guard System","Resource Registration"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Resource Guard System Resource Registration should dispose resources manually","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should dispose resources manually"},{"ancestorTitles":["Phase 13 Resource Guard System","Resource Registration"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Resource Guard System Resource Registration should handle disposal errors gracefully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle disposal errors gracefully"},{"ancestorTitles":["Phase 13 Resource Guard System","Timer Management"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Resource Guard System Timer Management should create and manage timers","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should create and manage timers"},{"ancestorTitles":["Phase 13 Resource Guard System","Timer Management"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Resource Guard System Timer Management should create and manage intervals","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should create and manage intervals"},{"ancestorTitles":["Phase 13 Resource Guard System","Timer Management"],"duration":62,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Resource Guard System Timer Management should handle timer callback errors","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle timer callback errors"},{"ancestorTitles":["Phase 13 Resource Guard System","AbortController Management"],"duration":6,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Resource Guard System AbortController Management should create and manage AbortControllers","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should create and manage AbortControllers"},{"ancestorTitles":["Phase 13 Resource Guard System","Statistics and Monitoring"],"duration":14,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Resource Guard System Statistics and Monitoring should provide accurate statistics","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"status":"passed","title":"should provide accurate statistics"},{"ancestorTitles":["Phase 13 Resource Guard System","Statistics and Monitoring"],"duration":28,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Resource Guard System Statistics and Monitoring should track resource age","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should track resource age"},{"ancestorTitles":["Phase 13 Resource Guard System","Bulk Operations"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Resource Guard System Bulk Operations should dispose all resources","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should dispose all resources"},{"ancestorTitles":["Phase 13 Resource Guard System","Bulk Operations"],"duration":7,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Resource Guard System Bulk Operations should handle dispose all with errors","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle dispose all with errors"},{"ancestorTitles":["Phase 13 Resource Guard System","Process Integration"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Resource Guard System Process Integration should be ready for process cleanup handlers","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should be ready for process cleanup handlers"}],"endTime":1758320437920,"message":"","name":"C:\\Dev\\ambiance-mcp\\src\\core\\__tests__\\resourceGuard.test.ts","startTime":1758320437710,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["AutomaticIndexer","getInstance"],"duration":10,"failureDetails":[],"failureMessages":[],"fullName":"AutomaticIndexer getInstance should return the same instance (singleton pattern)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return the same instance (singleton pattern)"},{"ancestorTitles":["AutomaticIndexer","autoDetectAndIndex"],"duration":2,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeDefined\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mundefined\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeDefined\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mundefined\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts:161:27)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"AutomaticIndexer autoDetectAndIndex should detect project and start indexing","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"failed","title":"should detect project and start indexing"},{"ancestorTitles":["AutomaticIndexer","autoDetectAndIndex"],"duration":2,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"📁 No project detected in current directory\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"📁 No project detected in current directory\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts:173:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"AutomaticIndexer autoDetectAndIndex should return null if no project detected","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"failed","title":"should return null if no project detected"},{"ancestorTitles":["AutomaticIndexer","autoDetectAndIndex"],"duration":2,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"Auto-detection failed:\"\u001b[39m, \u001b[32mAny<Error>\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"Auto-detection failed:\"\u001b[39m, \u001b[32mAny<Error>\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts:182:32)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"AutomaticIndexer autoDetectAndIndex should handle detection errors gracefully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"failed","title":"should handle detection errors gracefully"},{"ancestorTitles":["AutomaticIndexer","indexProject"],"duration":8,"failureDetails":[],"failureMessages":[],"fullName":"AutomaticIndexer indexProject should index project successfully","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"status":"passed","title":"should index project successfully"},{"ancestorTitles":["AutomaticIndexer","indexProject"],"duration":2,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"Force indexing enabled - will re-index all files\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"Force indexing enabled - will re-index all files\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts:235:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"AutomaticIndexer indexProject should handle force option correctly","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle force option correctly"},{"ancestorTitles":["AutomaticIndexer","indexProject"],"duration":2,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"Skipping cloud sync - local indexing only\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"Skipping cloud sync - local indexing only\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts:248:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"AutomaticIndexer indexProject should skip cloud sync when skipCloud is true","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should skip cloud sync when skipCloud is true"},{"ancestorTitles":["AutomaticIndexer","indexProject"],"duration":2,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32mStringContaining \"pattern filter\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32mStringContaining \"pattern filter\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts:262:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"AutomaticIndexer indexProject should filter files by pattern","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should filter files by pattern"},{"ancestorTitles":["AutomaticIndexer","indexProject"],"duration":4,"failureDetails":[{"matcherResult":{"actual":"completed","expected":"failed","message":"\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m\"\u001b[7mfail\u001b[27med\"\u001b[39m\nReceived: \u001b[31m\"\u001b[7mcomplet\u001b[27med\"\u001b[39m","name":"toBe","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m\"\u001b[7mfail\u001b[27med\"\u001b[39m\nReceived: \u001b[31m\"\u001b[7mcomplet\u001b[27med\"\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts:270:30)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"AutomaticIndexer indexProject should handle API errors gracefully","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle API errors gracefully"},{"ancestorTitles":["AutomaticIndexer","indexProject"],"duration":2,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32mStringContaining \"Failed to process file\"\u001b[39m, \u001b[32mAny<Error>\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32mStringContaining \"Failed to process file\"\u001b[39m, \u001b[32mAny<Error>\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts:285:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"AutomaticIndexer indexProject should handle file processing errors","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"failed","title":"should handle file processing errors"},{"ancestorTitles":["AutomaticIndexer","resetProjectIndexes"],"duration":2,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"Successfully reset indexes for project: /test/project\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"Successfully reset indexes for project: /test/project\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts:302:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"AutomaticIndexer resetProjectIndexes should reset project indexes successfully","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"failed","title":"should reset project indexes successfully"},{"ancestorTitles":["AutomaticIndexer","resetProjectIndexes"],"duration":1,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"Failed to reset project indexes:\"\u001b[39m, \u001b[32mAny<Error>\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"Failed to reset project indexes:\"\u001b[39m, \u001b[32mAny<Error>\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts:313:32)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"AutomaticIndexer resetProjectIndexes should handle reset API errors","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"failed","title":"should handle reset API errors"},{"ancestorTitles":["AutomaticIndexer","startWatching"],"duration":1,"failureDetails":[{}],"failureMessages":["TypeError: Cannot set property watch of #<Object> which has only a getter\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts:328:19)\n at Promise.then.completed (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:231:10)\n at _callCircusTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:252:3)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:126:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at run (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:71:3)\n at runAndTransformResultsToJestFormat (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapterInit.js:122:21)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:79:19)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"AutomaticIndexer startWatching should start watching project files","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should start watching project files"},{"ancestorTitles":["AutomaticIndexer","startWatching"],"duration":3,"failureDetails":[{}],"failureMessages":["TypeError: Cannot set property watch of #<Object> which has only a getter\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts:343:19)\n at Promise.then.completed (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:231:10)\n at _callCircusTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:252:3)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:126:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at run (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:71:3)\n at runAndTransformResultsToJestFormat (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapterInit.js:122:21)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:79:19)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"AutomaticIndexer startWatching should handle watch setup errors","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle watch setup errors"},{"ancestorTitles":["AutomaticIndexer","stopWatching"],"duration":1,"failureDetails":[{}],"failureMessages":["TypeError: Cannot set property watch of #<Object> which has only a getter\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts:359:19)\n at Promise.then.completed (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:231:10)\n at _callCircusTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:252:3)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:126:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at run (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:71:3)\n at runAndTransformResultsToJestFormat (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapterInit.js:122:21)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:79:19)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"AutomaticIndexer stopWatching should stop watching project files","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should stop watching project files"},{"ancestorTitles":["AutomaticIndexer","stopWatching"],"duration":1,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"No watcher found for project: /test/project\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"No watcher found for project: /test/project\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts:373:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"AutomaticIndexer stopWatching should handle stop watching when not watching","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle stop watching when not watching"},{"ancestorTitles":["AutomaticIndexer","getSession"],"duration":7,"failureDetails":[],"failureMessages":[],"fullName":"AutomaticIndexer getSession should return session by ID","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return session by ID"},{"ancestorTitles":["AutomaticIndexer","getSession"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"AutomaticIndexer getSession should return undefined for non-existent session","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return undefined for non-existent session"},{"ancestorTitles":["AutomaticIndexer","getActiveSessions"],"duration":9,"failureDetails":[],"failureMessages":[],"fullName":"AutomaticIndexer getActiveSessions should return all sessions","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should return all sessions"},{"ancestorTitles":["AutomaticIndexer","getActiveSessions"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"AutomaticIndexer getActiveSessions should return empty array when no sessions","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return empty array when no sessions"},{"ancestorTitles":["AutomaticIndexer","file change handling"],"duration":1,"failureDetails":[{}],"failureMessages":["TypeError: Cannot set property watch of #<Object> which has only a getter\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts:423:19)\n at Promise.then.completed (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:231:10)\n at _callCircusTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:252:3)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:126:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at run (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:71:3)\n at runAndTransformResultsToJestFormat (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapterInit.js:122:21)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:79:19)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"AutomaticIndexer file change handling should handle file changes with debouncing","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle file changes with debouncing"},{"ancestorTitles":["AutomaticIndexer","ignore patterns"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"AutomaticIndexer ignore patterns should apply ignore patterns correctly","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should apply ignore patterns correctly"},{"ancestorTitles":["AutomaticIndexer","change detection"],"duration":3,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32mStringContaining \"files have changes\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32mStringContaining \"files have changes\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts:480:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"AutomaticIndexer change detection should skip unchanged files when not forcing","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should skip unchanged files when not forcing"},{"ancestorTitles":["AutomaticIndexer","change detection"],"duration":1,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"Force indexing enabled - will re-index all files\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"Force indexing enabled - will re-index all files\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts:486:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"AutomaticIndexer change detection should process all files when forcing","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should process all files when forcing"},{"ancestorTitles":["AutomaticIndexer","error recovery"],"duration":1,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32mStringContaining \"Failed to process\"\u001b[39m, \u001b[32mAny<Error>\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32mStringContaining \"Failed to process\"\u001b[39m, \u001b[32mAny<Error>\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts:513:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"AutomaticIndexer error recovery should continue processing after individual file errors","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"failed","title":"should continue processing after individual file errors"}],"endTime":1758320437987,"message":"\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAutomaticIndexer › autoDetectAndIndex › should detect project and start indexing\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeDefined\u001b[2m()\u001b[22m\n\n Received: \u001b[31mundefined\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 159 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 160 |\u001b[39m expect(session)\u001b[33m.\u001b[39mtoBeDefined()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 161 |\u001b[39m expect(session\u001b[33m?\u001b[39m\u001b[33m.\u001b[39mid)\u001b[33m.\u001b[39mtoBeDefined()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 162 |\u001b[39m expect(\u001b[36mtypeof\u001b[39m session\u001b[33m?\u001b[39m\u001b[33m.\u001b[39mid)\u001b[33m.\u001b[39mtoBe(\u001b[32m'string'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 163 |\u001b[39m expect(mockProjectIdentifier\u001b[33m.\u001b[39mdetectProjectType)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[32m'/test/project'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 164 |\u001b[39m expect(mockLogger\u001b[33m.\u001b[39minfo)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(expect\u001b[33m.\u001b[39mstringContaining(\u001b[32m'detected project'\u001b[39m))\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/automaticIndexer.test.ts\u001b[39m\u001b[0m\u001b[2m:161:27)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAutomaticIndexer › autoDetectAndIndex › should return null if no project detected\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32m\"📁 No project detected in current directory\"\u001b[39m\n\n Number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 171 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 172 |\u001b[39m expect(session)\u001b[33m.\u001b[39mtoBeNull()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 173 |\u001b[39m expect(mockLogger\u001b[33m.\u001b[39minfo)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[32m'📁 No project detected in current directory'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 174 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 175 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 176 |\u001b[39m it(\u001b[32m'should handle detection errors gracefully'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/automaticIndexer.test.ts\u001b[39m\u001b[0m\u001b[2m:173:31)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAutomaticIndexer › autoDetectAndIndex › should handle detection errors gracefully\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32m\"Auto-detection failed:\"\u001b[39m, \u001b[32mAny<Error>\u001b[39m\n\n Number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 180 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 181 |\u001b[39m expect(session)\u001b[33m.\u001b[39mtoBeNull()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 182 |\u001b[39m expect(mockLogger\u001b[33m.\u001b[39merror)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[32m'Auto-detection failed:'\u001b[39m\u001b[33m,\u001b[39m expect\u001b[33m.\u001b[39many(\u001b[33mError\u001b[39m))\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 183 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 184 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 185 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/automaticIndexer.test.ts\u001b[39m\u001b[0m\u001b[2m:182:32)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAutomaticIndexer › indexProject › should handle force option correctly\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32m\"Force indexing enabled - will re-index all files\"\u001b[39m\n\n Number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 233 |\u001b[39m \u001b[36mawait\u001b[39m indexer\u001b[33m.\u001b[39mindexProject(\u001b[32m'/test/project'\u001b[39m\u001b[33m,\u001b[39m options)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 234 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 235 |\u001b[39m expect(mockLogger\u001b[33m.\u001b[39minfo)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 236 |\u001b[39m \u001b[32m'Force indexing enabled - will re-index all files'\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 237 |\u001b[39m )\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 238 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/automaticIndexer.test.ts\u001b[39m\u001b[0m\u001b[2m:235:31)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAutomaticIndexer › indexProject › should skip cloud sync when skipCloud is true\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32m\"Skipping cloud sync - local indexing only\"\u001b[39m\n\n Number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 246 |\u001b[39m \u001b[36mawait\u001b[39m indexer\u001b[33m.\u001b[39mindexProject(\u001b[32m'/test/project'\u001b[39m\u001b[33m,\u001b[39m options)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 247 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 248 |\u001b[39m expect(mockLogger\u001b[33m.\u001b[39minfo)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[32m'Skipping cloud sync - local indexing only'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 249 |\u001b[39m \u001b[90m// Should not call cloud API\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 250 |\u001b[39m expect(mockApiClient\u001b[33m.\u001b[39mpost)\u001b[33m.\u001b[39mnot\u001b[33m.\u001b[39mtoHaveBeenCalled()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 251 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/automaticIndexer.test.ts\u001b[39m\u001b[0m\u001b[2m:248:31)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAutomaticIndexer › indexProject › should filter files by pattern\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32mStringContaining \"pattern filter\"\u001b[39m\n\n Number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 260 |\u001b[39m \u001b[36mawait\u001b[39m indexer\u001b[33m.\u001b[39mindexProject(\u001b[32m'/test/project'\u001b[39m\u001b[33m,\u001b[39m options)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 261 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 262 |\u001b[39m expect(mockLogger\u001b[33m.\u001b[39minfo)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(expect\u001b[33m.\u001b[39mstringContaining(\u001b[32m'pattern filter'\u001b[39m))\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 263 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 264 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 265 |\u001b[39m it(\u001b[32m'should handle API errors gracefully'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/automaticIndexer.test.ts\u001b[39m\u001b[0m\u001b[2m:262:31)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAutomaticIndexer › indexProject › should handle API errors gracefully\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\n Expected: \u001b[32m\"\u001b[7mfail\u001b[27med\"\u001b[39m\n Received: \u001b[31m\"\u001b[7mcomplet\u001b[27med\"\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 268 |\u001b[39m \u001b[36mconst\u001b[39m session \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m indexer\u001b[33m.\u001b[39mindexProject(\u001b[32m'/test/project'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 269 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 270 |\u001b[39m expect(session\u001b[33m.\u001b[39mstatus)\u001b[33m.\u001b[39mtoBe(\u001b[32m'failed'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 271 |\u001b[39m expect(session\u001b[33m.\u001b[39merrors)\u001b[33m.\u001b[39mtoContain(\u001b[32m'API Error'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 272 |\u001b[39m expect(mockLogger\u001b[33m.\u001b[39merror)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[22m\n\u001b[2m \u001b[90m 273 |\u001b[39m \u001b[32m'Failed to start cloud indexing session:'\u001b[39m\u001b[33m,\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/automaticIndexer.test.ts\u001b[39m\u001b[0m\u001b[2m:270:30)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAutomaticIndexer › indexProject › should handle file processing errors\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32mStringContaining \"Failed to process file\"\u001b[39m, \u001b[32mAny<Error>\u001b[39m\n\n Number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 283 |\u001b[39m \u001b[90m// Should continue processing other files\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 284 |\u001b[39m expect(session\u001b[33m.\u001b[39mstatus)\u001b[33m.\u001b[39mtoBe(\u001b[32m'completed'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 285 |\u001b[39m expect(mockLogger\u001b[33m.\u001b[39mwarn)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 286 |\u001b[39m expect\u001b[33m.\u001b[39mstringContaining(\u001b[32m'Failed to process file'\u001b[39m)\u001b[33m,\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 287 |\u001b[39m expect\u001b[33m.\u001b[39many(\u001b[33mError\u001b[39m)\u001b[22m\n\u001b[2m \u001b[90m 288 |\u001b[39m )\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/automaticIndexer.test.ts\u001b[39m\u001b[0m\u001b[2m:285:31)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAutomaticIndexer › resetProjectIndexes › should reset project indexes successfully\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32m\"Successfully reset indexes for project: /test/project\"\u001b[39m\n\n Number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 300 |\u001b[39m projectPath\u001b[33m:\u001b[39m \u001b[32m'/test/project'\u001b[39m\u001b[33m,\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 301 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 302 |\u001b[39m expect(mockLogger\u001b[33m.\u001b[39minfo)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 303 |\u001b[39m \u001b[32m'Successfully reset indexes for project: /test/project'\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 304 |\u001b[39m )\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 305 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/automaticIndexer.test.ts\u001b[39m\u001b[0m\u001b[2m:302:31)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAutomaticIndexer › resetProjectIndexes › should handle reset API errors\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32m\"Failed to reset project indexes:\"\u001b[39m, \u001b[32mAny<Error>\u001b[39m\n\n Number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 311 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 312 |\u001b[39m expect(result)\u001b[33m.\u001b[39mtoBe(\u001b[36mfalse\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 313 |\u001b[39m expect(mockLogger\u001b[33m.\u001b[39merror)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 314 |\u001b[39m \u001b[32m'Failed to reset project indexes:'\u001b[39m\u001b[33m,\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 315 |\u001b[39m expect\u001b[33m.\u001b[39many(\u001b[33mError\u001b[39m)\u001b[22m\n\u001b[2m \u001b[90m 316 |\u001b[39m )\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/automaticIndexer.test.ts\u001b[39m\u001b[0m\u001b[2m:313:32)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAutomaticIndexer › startWatching › should start watching project files\u001b[39m\u001b[22m\n\n TypeError: Cannot set property watch of #<Object> which has only a getter\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 326 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 327 |\u001b[39m \u001b[90m// Mock fs.watch with proper typing\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 328 |\u001b[39m mockFs\u001b[33m.\u001b[39mwatch \u001b[33m=\u001b[39m jest\u001b[33m.\u001b[39mfn()\u001b[33m.\u001b[39mmockReturnValue(mockWatcher) \u001b[36mas\u001b[39m jest\u001b[33m.\u001b[39m\u001b[33mMockedFunction\u001b[39m\u001b[33m<\u001b[39m\u001b[36mtypeof\u001b[39m fs\u001b[33m.\u001b[39mwatch\u001b[33m>\u001b[39m\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 329 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 330 |\u001b[39m \u001b[36mawait\u001b[39m indexer\u001b[33m.\u001b[39mstartWatching(\u001b[32m'/test/project'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 331 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/automaticIndexer.test.ts\u001b[39m\u001b[0m\u001b[2m:328:19)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAutomaticIndexer › startWatching › should handle watch setup errors\u001b[39m\u001b[22m\n\n TypeError: Cannot set property watch of #<Object> which has only a getter\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 341 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 342 |\u001b[39m it(\u001b[32m'should handle watch setup errors'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 343 |\u001b[39m mockFs\u001b[33m.\u001b[39mwatch \u001b[33m=\u001b[39m jest\u001b[33m.\u001b[39mfn()\u001b[33m.\u001b[39mmockImplementation(() \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 344 |\u001b[39m \u001b[36mthrow\u001b[39m \u001b[36mnew\u001b[39m \u001b[33mError\u001b[39m(\u001b[32m'Watch failed'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 345 |\u001b[39m }) \u001b[36mas\u001b[39m jest\u001b[33m.\u001b[39m\u001b[33mMockedFunction\u001b[39m\u001b[33m<\u001b[39m\u001b[36mtypeof\u001b[39m fs\u001b[33m.\u001b[39mwatch\u001b[33m>\u001b[39m\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 346 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/automaticIndexer.test.ts\u001b[39m\u001b[0m\u001b[2m:343:19)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAutomaticIndexer › stopWatching › should stop watching project files\u001b[39m\u001b[22m\n\n TypeError: Cannot set property watch of #<Object> which has only a getter\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 357 |\u001b[39m close\u001b[33m:\u001b[39m jest\u001b[33m.\u001b[39mfn() \u001b[36mas\u001b[39m jest\u001b[33m.\u001b[39m\u001b[33mMockedFunction\u001b[39m\u001b[33m<\u001b[39m\u001b[33many\u001b[39m\u001b[33m>\u001b[39m\u001b[33m,\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 358 |\u001b[39m }\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 359 |\u001b[39m mockFs\u001b[33m.\u001b[39mwatch \u001b[33m=\u001b[39m jest\u001b[33m.\u001b[39mfn()\u001b[33m.\u001b[39mmockReturnValue(mockWatcher) \u001b[36mas\u001b[39m jest\u001b[33m.\u001b[39m\u001b[33mMockedFunction\u001b[39m\u001b[33m<\u001b[39m\u001b[36mtypeof\u001b[39m fs\u001b[33m.\u001b[39mwatch\u001b[33m>\u001b[39m\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 360 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 361 |\u001b[39m \u001b[36mawait\u001b[39m indexer\u001b[33m.\u001b[39mstartWatching(\u001b[32m'/test/project'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 362 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/automaticIndexer.test.ts\u001b[39m\u001b[0m\u001b[2m:359:19)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAutomaticIndexer › stopWatching › should handle stop watching when not watching\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32m\"No watcher found for project: /test/project\"\u001b[39m\n\n Number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 371 |\u001b[39m \u001b[36mawait\u001b[39m indexer\u001b[33m.\u001b[39mstopWatching(\u001b[32m'/test/project'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 372 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 373 |\u001b[39m expect(mockLogger\u001b[33m.\u001b[39mwarn)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[32m'No watcher found for project: /test/project'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 374 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 375 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 376 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/automaticIndexer.test.ts\u001b[39m\u001b[0m\u001b[2m:373:31)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAutomaticIndexer › file change handling › should handle file changes with debouncing\u001b[39m\u001b[22m\n\n TypeError: Cannot set property watch of #<Object> which has only a getter\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 421 |\u001b[39m close\u001b[33m:\u001b[39m jest\u001b[33m.\u001b[39mfn() \u001b[36mas\u001b[39m jest\u001b[33m.\u001b[39m\u001b[33mMockedFunction\u001b[39m\u001b[33m<\u001b[39m\u001b[33many\u001b[39m\u001b[33m>\u001b[39m\u001b[33m,\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 422 |\u001b[39m }\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 423 |\u001b[39m mockFs\u001b[33m.\u001b[39mwatch \u001b[33m=\u001b[39m jest\u001b[33m.\u001b[39mfn()\u001b[33m.\u001b[39mmockReturnValue(mockWatcher) \u001b[36mas\u001b[39m jest\u001b[33m.\u001b[39m\u001b[33mMockedFunction\u001b[39m\u001b[33m<\u001b[39m\u001b[36mtypeof\u001b[39m fs\u001b[33m.\u001b[39mwatch\u001b[33m>\u001b[39m\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 424 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 425 |\u001b[39m \u001b[36mawait\u001b[39m indexer\u001b[33m.\u001b[39mstartWatching(\u001b[32m'/test/project'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 426 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/automaticIndexer.test.ts\u001b[39m\u001b[0m\u001b[2m:423:19)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAutomaticIndexer › change detection › should skip unchanged files when not forcing\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32mStringContaining \"files have changes\"\u001b[39m\n\n Number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 478 |\u001b[39m \u001b[36mconst\u001b[39m session \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m indexer\u001b[33m.\u001b[39mindexProject(\u001b[32m'/test/project'\u001b[39m\u001b[33m,\u001b[39m { force\u001b[33m:\u001b[39m \u001b[36mfalse\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 479 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 480 |\u001b[39m expect(mockLogger\u001b[33m.\u001b[39minfo)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(expect\u001b[33m.\u001b[39mstringContaining(\u001b[32m'files have changes'\u001b[39m))\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 481 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 482 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 483 |\u001b[39m it(\u001b[32m'should process all files when forcing'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/automaticIndexer.test.ts\u001b[39m\u001b[0m\u001b[2m:480:31)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAutomaticIndexer › change detection › should process all files when forcing\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32m\"Force indexing enabled - will re-index all files\"\u001b[39m\n\n Number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 484 |\u001b[39m \u001b[36mconst\u001b[39m session \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m indexer\u001b[33m.\u001b[39mindexProject(\u001b[32m'/test/project'\u001b[39m\u001b[33m,\u001b[39m { force\u001b[33m:\u001b[39m \u001b[36mtrue\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 485 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 486 |\u001b[39m expect(mockLogger\u001b[33m.\u001b[39minfo)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 487 |\u001b[39m \u001b[32m'Force indexing enabled - will re-index all files'\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 488 |\u001b[39m )\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 489 |\u001b[39m expect(session\u001b[33m.\u001b[39mfilesFound)\u001b[33m.\u001b[39mtoBeGreaterThan(\u001b[35m0\u001b[39m)\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/automaticIndexer.test.ts\u001b[39m\u001b[0m\u001b[2m:486:31)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAutomaticIndexer › error recovery › should continue processing after individual file errors\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32mStringContaining \"Failed to process\"\u001b[39m, \u001b[32mAny<Error>\u001b[39m\n\n Number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 511 |\u001b[39m expect(session\u001b[33m.\u001b[39mstatus)\u001b[33m.\u001b[39mtoBe(\u001b[32m'completed'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 512 |\u001b[39m expect(session\u001b[33m.\u001b[39merrors\u001b[33m.\u001b[39mlength)\u001b[33m.\u001b[39mtoBeGreaterThan(\u001b[35m0\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 513 |\u001b[39m expect(mockLogger\u001b[33m.\u001b[39mwarn)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 514 |\u001b[39m expect\u001b[33m.\u001b[39mstringContaining(\u001b[32m'Failed to process'\u001b[39m)\u001b[33m,\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 515 |\u001b[39m expect\u001b[33m.\u001b[39many(\u001b[33mError\u001b[39m)\u001b[22m\n\u001b[2m \u001b[90m 516 |\u001b[39m )\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/automaticIndexer.test.ts\u001b[39m\u001b[0m\u001b[2m:513:31)\u001b[22m\u001b[2m\u001b[22m\n","name":"C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\automaticIndexer.test.ts","startTime":1758320431228,"status":"failed","summary":""},{"assertionResults":[{"ancestorTitles":["Router Analyzer","nextRoutePath function"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Router Analyzer nextRoutePath function should handle root page correctly","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle root page correctly"},{"ancestorTitles":["Router Analyzer","nextRoutePath function"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Router Analyzer nextRoutePath function should handle static routes","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle static routes"},{"ancestorTitles":["Router Analyzer","nextRoutePath function"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Router Analyzer nextRoutePath function should convert dynamic routes [id] to :id","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should convert dynamic routes [id] to :id"},{"ancestorTitles":["Router Analyzer","nextRoutePath function"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Router Analyzer nextRoutePath function should convert catch-all routes [...slug] to *slug","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should convert catch-all routes [...slug] to *slug"},{"ancestorTitles":["Router Analyzer","nextRoutePath function"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Router Analyzer nextRoutePath function should convert optional catch-all routes [[...path]] to *path?","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should convert optional catch-all routes [[...path]] to *path?"},{"ancestorTitles":["Router Analyzer","nextRoutePath function"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Router Analyzer nextRoutePath function should ignore route groups (parentheses)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should ignore route groups (parentheses)"},{"ancestorTitles":["Router Analyzer","nextRoutePath function"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Router Analyzer nextRoutePath function should handle nested routes","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle nested routes"},{"ancestorTitles":["Router Analyzer","nextRoutePath function"],"duration":6,"failureDetails":[],"failureMessages":[],"fullName":"Router Analyzer nextRoutePath function should handle API routes","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle API routes"},{"ancestorTitles":["Router Analyzer","nextRoutePath function"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Router Analyzer nextRoutePath function should handle pages with different extensions","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should handle pages with different extensions"},{"ancestorTitles":["Router Analyzer","extractRouteMethods function"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Router Analyzer extractRouteMethods function should extract GET method from route.ts","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should extract GET method from route.ts"},{"ancestorTitles":["Router Analyzer","extractRouteMethods function"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Router Analyzer extractRouteMethods function should extract multiple HTTP methods","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should extract multiple HTTP methods"},{"ancestorTitles":["Router Analyzer","extractRouteMethods function"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Router Analyzer extractRouteMethods function should handle const function exports","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle const function exports"},{"ancestorTitles":["Router Analyzer","analyzeRoutes function"],"duration":26,"failureDetails":[],"failureMessages":[],"fullName":"Router Analyzer analyzeRoutes function should analyze routes from file list","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"should analyze routes from file list"},{"ancestorTitles":["Router Analyzer","analyzeRoutes function"],"duration":8,"failureDetails":[],"failureMessages":[],"fullName":"Router Analyzer analyzeRoutes function should handle route groups correctly","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle route groups correctly"},{"ancestorTitles":["Router Analyzer","analyzeRoutes function"],"duration":5,"failureDetails":[],"failureMessages":[],"fullName":"Router Analyzer analyzeRoutes function should sort routes by path","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should sort routes by path"}],"endTime":1758320438161,"message":"","name":"C:\\Dev\\ambiance-mcp\\src\\tools\\localTools\\analyzers\\frontend\\__tests__\\router.test.ts","startTime":1758320438025,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["Ambiance API Client Integration (skips without AMBIANCE_API_KEY)"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Ambiance API Client Integration (skips without AMBIANCE_API_KEY) skips when no ambiance api key is provided","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"skips when no ambiance api key is provided"},{"ancestorTitles":["Ambiance API Client Integration (skips without AMBIANCE_API_KEY)"],"duration":null,"failureDetails":[],"failureMessages":[],"fullName":"Ambiance API Client Integration (skips without AMBIANCE_API_KEY) health check should succeed on running server","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"pending","title":"health check should succeed on running server"},{"ancestorTitles":["Ambiance API Client Integration (skips without AMBIANCE_API_KEY)"],"duration":null,"failureDetails":[],"failureMessages":[],"fullName":"Ambiance API Client Integration (skips without AMBIANCE_API_KEY) searchContext should return results","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"pending","title":"searchContext should return results"}],"endTime":1758320438412,"message":"","name":"C:\\Dev\\ambiance-mcp\\src\\client\\__tests__\\apiClient.integration.test.ts","startTime":1758320437939,"status":"focused","summary":""},{"assertionResults":[{"ancestorTitles":["Frontend Insights Tool"],"duration":7,"failureDetails":[],"failureMessages":[],"fullName":"Frontend Insights Tool should import frontend_insights tool successfully","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should import frontend_insights tool successfully"},{"ancestorTitles":["Frontend Insights Tool"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Frontend Insights Tool should validate schema correctly","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should validate schema correctly"},{"ancestorTitles":["Frontend Insights Tool"],"duration":34,"failureDetails":[],"failureMessages":[],"fullName":"Frontend Insights Tool should execute tool without errors","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"status":"passed","title":"should execute tool without errors"}],"endTime":1758320438415,"message":"","name":"C:\\Dev\\ambiance-mcp\\tests\\frontend-insights.test.js","startTime":1758320438176,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["SemanticCompactor","File Discovery"],"duration":44,"failureDetails":[{"matcherResult":{"actual":false,"expected":true,"message":"\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mfalse\u001b[39m","name":"toBe","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mfalse\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\core\\compactor\\__tests__\\semanticCompactor.test.ts:82:64)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"SemanticCompactor File Discovery should discover TypeScript and JavaScript files","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"failed","title":"should discover TypeScript and JavaScript files"},{"ancestorTitles":["SemanticCompactor","File Discovery"],"duration":11,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor File Discovery should exclude node_modules and test files by default","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should exclude node_modules and test files by default"},{"ancestorTitles":["SemanticCompactor","File Discovery"],"duration":7,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor File Discovery should sort files by relevance","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should sort files by relevance"},{"ancestorTitles":["SemanticCompactor","AST Parsing"],"duration":27,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor AST Parsing should parse TypeScript files correctly","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should parse TypeScript files correctly"},{"ancestorTitles":["SemanticCompactor","AST Parsing"],"duration":6,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor AST Parsing should extract function signatures correctly","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should extract function signatures correctly"},{"ancestorTitles":["SemanticCompactor","AST Parsing"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor AST Parsing should handle parse errors gracefully","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle parse errors gracefully"},{"ancestorTitles":["SemanticCompactor","AST Parsing"],"duration":10,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor AST Parsing should exercise imports and exports properly","invocations":1,"location":null,"numPassingAsserts":11,"retryReasons":[],"status":"passed","title":"should exercise imports and exports properly"},{"ancestorTitles":["SemanticCompactor","AST Pruning"],"duration":5,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor AST Pruning should prune symbols and calculate importance scores","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should prune symbols and calculate importance scores"},{"ancestorTitles":["SemanticCompactor","AST Pruning"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor AST Pruning should prioritize exported symbols","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should prioritize exported symbols"},{"ancestorTitles":["SemanticCompactor","AST Pruning"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor AST Pruning should compact function bodies","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should compact function bodies"},{"ancestorTitles":["SemanticCompactor","Deduplication"],"duration":6,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor Deduplication should identify and remove duplicate symbols","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should identify and remove duplicate symbols"},{"ancestorTitles":["SemanticCompactor","Deduplication"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor Deduplication should preserve the most important duplicate","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should preserve the most important duplicate"},{"ancestorTitles":["SemanticCompactor","Relevance Scoring"],"duration":19,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor Relevance Scoring should score symbols based on query relevance","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should score symbols based on query relevance"},{"ancestorTitles":["SemanticCompactor","Relevance Scoring"],"duration":5,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor Relevance Scoring should prioritize symbols matching the query","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should prioritize symbols matching the query"},{"ancestorTitles":["SemanticCompactor","Full Compaction Process"],"duration":39,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor Full Compaction Process should complete the full compaction process successfully","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"should complete the full compaction process successfully"},{"ancestorTitles":["SemanticCompactor","Full Compaction Process"],"duration":26,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor Full Compaction Process should achieve meaningful compression","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should achieve meaningful compression"},{"ancestorTitles":["SemanticCompactor","Full Compaction Process"],"duration":39,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor Full Compaction Process should generate meaningful summaries","invocations":1,"location":null,"numPassingAsserts":18,"retryReasons":[],"status":"passed","title":"should generate meaningful summaries"},{"ancestorTitles":["SemanticCompactor","Full Compaction Process"],"duration":23,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor Full Compaction Process should respect token budgets","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should respect token budgets"},{"ancestorTitles":["SemanticCompactor","Full Compaction Process"],"duration":17,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor Full Compaction Process should provide detailed processing statistics","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should provide detailed processing statistics"},{"ancestorTitles":["SemanticCompactor","Error Handling"],"duration":54,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor Error Handling should handle non-existent project paths gracefully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle non-existent project paths gracefully"},{"ancestorTitles":["SemanticCompactor","Error Handling"],"duration":10,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor Error Handling should handle invalid file paths in getSummary","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should handle invalid file paths in getSummary"},{"ancestorTitles":["SemanticCompactor","Error Handling"],"duration":96,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor Error Handling should handle invalid symbol IDs in getContextForSymbol","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should handle invalid symbol IDs in getContextForSymbol"},{"ancestorTitles":["SemanticCompactor","Performance Benchmarks"],"duration":17,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor Performance Benchmarks should process files within reasonable time limits","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should process files within reasonable time limits"},{"ancestorTitles":["SemanticCompactor","Performance Benchmarks"],"duration":41,"failureDetails":[],"failureMessages":[],"fullName":"SemanticCompactor Performance Benchmarks should provide significant token savings","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should provide significant token savings"}],"endTime":1758320438471,"message":"\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mSemanticCompactor › File Discovery › should discover TypeScript and JavaScript files\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\n Expected: \u001b[32mtrue\u001b[39m\n Received: \u001b[31mfalse\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 80 |\u001b[39m \u001b[90m// 🔑 Include TSX/JSX in expectations\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 81 |\u001b[39m expect(files\u001b[33m.\u001b[39msome(f \u001b[33m=>\u001b[39m [\u001b[32m'.ts'\u001b[39m\u001b[33m,\u001b[39m \u001b[32m'.tsx'\u001b[39m]\u001b[33m.\u001b[39mincludes(f\u001b[33m.\u001b[39mext)))\u001b[33m.\u001b[39mtoBe(\u001b[36mtrue\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 82 |\u001b[39m expect(files\u001b[33m.\u001b[39msome(f \u001b[33m=>\u001b[39m [\u001b[32m'.js'\u001b[39m\u001b[33m,\u001b[39m \u001b[32m'.jsx'\u001b[39m]\u001b[33m.\u001b[39mincludes(f\u001b[33m.\u001b[39mext)))\u001b[33m.\u001b[39mtoBe(\u001b[36mtrue\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 83 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 84 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 85 |\u001b[39m it(\u001b[32m'should exclude node_modules and test files by default'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/core/compactor/__tests__/semanticCompactor.test.ts\u001b[39m\u001b[0m\u001b[2m:82:64)\u001b[22m\u001b[2m\u001b[22m\n","name":"C:\\Dev\\ambiance-mcp\\src\\core\\compactor\\__tests__\\semanticCompactor.test.ts","startTime":1758320431221,"status":"failed","summary":""},{"assertionResults":[{"ancestorTitles":["Environment Matrix Coverage"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Environment Matrix Coverage WORKSPACE_FOLDER only: resolves workspace and runs locally","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"passed","title":"WORKSPACE_FOLDER only: resolves workspace and runs locally"},{"ancestorTitles":["Environment Matrix Coverage"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Environment Matrix Coverage Embeddings enabled (USE_LOCAL_EMBEDDINGS=true): runs without generating new embeddings","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"passed","title":"Embeddings enabled (USE_LOCAL_EMBEDDINGS=true): runs without generating new embeddings"},{"ancestorTitles":["Environment Matrix Coverage"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Environment Matrix Coverage OpenAI present (OPENAI_API_KEY set): local handler remains stable offline","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"passed","title":"OpenAI present (OPENAI_API_KEY set): local handler remains stable offline"},{"ancestorTitles":["Environment Matrix Coverage"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Environment Matrix Coverage Ambiance present (AMBIANCE_API_KEY set): local handler remains stable offline","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"passed","title":"Ambiance present (AMBIANCE_API_KEY set): local handler remains stable offline"}],"endTime":1758320438506,"message":"","name":"C:\\Dev\\ambiance-mcp\\tests\\env-matrix.test.js","startTime":1758320437243,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["Database Functions","upsertLocalProject"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions upsertLocalProject should create a new local project successfully","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should create a new local project successfully"},{"ancestorTitles":["Database Functions","upsertLocalProject"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions upsertLocalProject should update existing project","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should update existing project"},{"ancestorTitles":["Database Functions","upsertLocalProject"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions upsertLocalProject should handle database errors","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle database errors"},{"ancestorTitles":["Database Functions","upsertLocalProject"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions upsertLocalProject should use workspace root as default when not provided","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should use workspace root as default when not provided"},{"ancestorTitles":["Database Functions","startIndexingSession"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions startIndexingSession should start a new indexing session","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should start a new indexing session"},{"ancestorTitles":["Database Functions","startIndexingSession"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions startIndexingSession should use default session type when not provided","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should use default session type when not provided"},{"ancestorTitles":["Database Functions","startIndexingSession"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions startIndexingSession should handle unauthorized access","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle unauthorized access"},{"ancestorTitles":["Database Functions","startIndexingSession"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions startIndexingSession should handle different session types","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should handle different session types"},{"ancestorTitles":["Database Functions","updateIndexingProgress"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions updateIndexingProgress should update progress with all fields","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should update progress with all fields"},{"ancestorTitles":["Database Functions","updateIndexingProgress"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions updateIndexingProgress should update progress with partial fields","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should update progress with partial fields"},{"ancestorTitles":["Database Functions","updateIndexingProgress"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions updateIndexingProgress should handle session not found","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle session not found"},{"ancestorTitles":["Database Functions","updateIndexingProgress"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions updateIndexingProgress should handle multiple errors in array","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle multiple errors in array"},{"ancestorTitles":["Database Functions","upsertLocalFile"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions upsertLocalFile should create a new file record","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should create a new file record"},{"ancestorTitles":["Database Functions","upsertLocalFile"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions upsertLocalFile should update existing file record","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should update existing file record"},{"ancestorTitles":["Database Functions","upsertLocalFile"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions upsertLocalFile should handle file with no size or language","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle file with no size or language"},{"ancestorTitles":["Database Functions","upsertLocalFile"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions upsertLocalFile should handle different file types","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should handle different file types"},{"ancestorTitles":["Database Functions","getChangedFiles"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions getChangedFiles should get changed files since timestamp","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should get changed files since timestamp"},{"ancestorTitles":["Database Functions","getChangedFiles"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions getChangedFiles should get all files when no timestamp provided","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should get all files when no timestamp provided"},{"ancestorTitles":["Database Functions","getChangedFiles"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions getChangedFiles should return empty array when no files found","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return empty array when no files found"},{"ancestorTitles":["Database Functions","getChangedFiles"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions getChangedFiles should handle database errors gracefully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle database errors gracefully"},{"ancestorTitles":["Database Functions","deleteProjectIndexes"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions deleteProjectIndexes should delete all project indexes successfully","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should delete all project indexes successfully"},{"ancestorTitles":["Database Functions","deleteProjectIndexes"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions deleteProjectIndexes should handle unauthorized deletion","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle unauthorized deletion"},{"ancestorTitles":["Database Functions","deleteProjectIndexes"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions deleteProjectIndexes should handle non-existent project","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle non-existent project"},{"ancestorTitles":["Database Functions","deleteProjectIndexes"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions deleteProjectIndexes should handle database errors during deletion","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle database errors during deletion"},{"ancestorTitles":["Database Functions","Error Handling"],"duration":11,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions Error Handling should handle network errors","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle network errors"},{"ancestorTitles":["Database Functions","Error Handling"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions Error Handling should handle timeout errors","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle timeout errors"},{"ancestorTitles":["Database Functions","Error Handling"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions Error Handling should handle malformed responses","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle malformed responses"},{"ancestorTitles":["Database Functions","Data Validation"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions Data Validation should handle special characters in paths","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle special characters in paths"},{"ancestorTitles":["Database Functions","Data Validation"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions Data Validation should handle very long file paths","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle very long file paths"},{"ancestorTitles":["Database Functions","Data Validation"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions Data Validation should handle large file sizes","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle large file sizes"},{"ancestorTitles":["Database Functions","Data Validation"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions Data Validation should handle empty metadata objects","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle empty metadata objects"},{"ancestorTitles":["Database Functions","Data Validation"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Database Functions Data Validation should handle complex metadata objects","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle complex metadata objects"}],"endTime":1758320438511,"message":"","name":"C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\databaseFunctions.test.ts","startTime":1758320438422,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["Local Context Tool"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Local Context Tool should handle local context without embeddings","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"passed","title":"should handle local context without embeddings"},{"ancestorTitles":["Local Context Tool"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Local Context Tool should handle local context with embeddings if available","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"passed","title":"should handle local context with embeddings if available"}],"endTime":1758320438546,"message":"","name":"C:\\Dev\\ambiance-mcp\\tests\\local-context.test.js","startTime":1758320437332,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["Local Debug Context Tool"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Local Debug Context Tool should parse error logs and find related code","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"passed","title":"should parse error logs and find related code"},{"ancestorTitles":["Local Debug Context Tool"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Local Debug Context Tool should handle malformed error logs gracefully","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"passed","title":"should handle malformed error logs gracefully"}],"endTime":1758320438615,"message":"","name":"C:\\Dev\\ambiance-mcp\\tests\\debug-context.test.js","startTime":1758320438508,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["Phase 13 Validation System","Input Validation"],"duration":32,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Validation System Input Validation should validate discover_files input correctly","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should validate discover_files input correctly"},{"ancestorTitles":["Phase 13 Validation System","Input Validation"],"duration":13,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Validation System Input Validation should validate read_file input correctly","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should validate read_file input correctly"},{"ancestorTitles":["Phase 13 Validation System","Input Validation"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Validation System Input Validation should provide structured error messages","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"should provide structured error messages"},{"ancestorTitles":["Phase 13 Validation System","Input Validation"],"duration":5,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Validation System Input Validation should validate request validation input","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should validate request validation input"},{"ancestorTitles":["Phase 13 Validation System","Dry Run Responses"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Validation System Dry Run Responses should create dry run responses for tools","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"should create dry run responses for tools"},{"ancestorTitles":["Phase 13 Validation System","Dry Run Responses"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Validation System Dry Run Responses should provide execution plans for different tools","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should provide execution plans for different tools"},{"ancestorTitles":["Phase 13 Validation System","Dry Run Responses"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Validation System Dry Run Responses should provide invariants for tools","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should provide invariants for tools"},{"ancestorTitles":["Phase 13 Validation System","Tool Examples"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Validation System Tool Examples should provide examples for all tools","invocations":1,"location":null,"numPassingAsserts":12,"retryReasons":[],"status":"passed","title":"should provide examples for all tools"},{"ancestorTitles":["Phase 13 Validation System","Error Codes"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 Validation System Error Codes should have consistent error codes","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should have consistent error codes"}],"endTime":1758320438581,"message":"","name":"C:\\Dev\\ambiance-mcp\\src\\core\\__tests__\\validation.test.ts","startTime":1758320438452,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["Phase 13 FSGuard System","Path Validation"],"duration":33,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 FSGuard System Path Validation should validate basic path structure","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should validate basic path structure"},{"ancestorTitles":["Phase 13 FSGuard System","Path Validation"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 FSGuard System Path Validation should normalize path separators","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"status":"passed","title":"should normalize path separators"},{"ancestorTitles":["Phase 13 FSGuard System","Path Validation"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 FSGuard System Path Validation should handle path length limits","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle path length limits"},{"ancestorTitles":["Phase 13 FSGuard System","Path Validation"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 FSGuard System Path Validation should provide structured errors","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"should provide structured errors"},{"ancestorTitles":["Phase 13 FSGuard System","Error Code Generation"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 FSGuard System Error Code Generation should generate consistent error codes for different scenarios","invocations":1,"location":null,"numPassingAsserts":15,"retryReasons":[],"status":"passed","title":"should generate consistent error codes for different scenarios"},{"ancestorTitles":["Phase 13 FSGuard System","Error Code Generation"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 FSGuard System Error Code Generation should provide examples in error responses","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should provide examples in error responses"},{"ancestorTitles":["Phase 13 FSGuard System","Base Directory Management"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 FSGuard System Base Directory Management should track base directory correctly","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should track base directory correctly"},{"ancestorTitles":["Phase 13 FSGuard System","Base Directory Management"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Phase 13 FSGuard System Base Directory Management should handle different base directory configurations","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle different base directory configurations"}],"endTime":1758320438652,"message":"","name":"C:\\Dev\\ambiance-mcp\\src\\core\\__tests__\\fsGuard.test.ts","startTime":1758320438517,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["Environment Analyzer","detectEnvironmentUsage function"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Environment Analyzer detectEnvironmentUsage function should detect NEXT_PUBLIC variables correctly","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should detect NEXT_PUBLIC variables correctly"},{"ancestorTitles":["Environment Analyzer","detectEnvironmentUsage function"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Environment Analyzer detectEnvironmentUsage function should flag server-only variables used in client components","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"status":"passed","title":"should flag server-only variables used in client components"},{"ancestorTitles":["Environment Analyzer","detectEnvironmentUsage function"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Environment Analyzer detectEnvironmentUsage function should allow server-only variables in server components","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should allow server-only variables in server components"},{"ancestorTitles":["Environment Analyzer","detectEnvironmentUsage function"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Environment Analyzer detectEnvironmentUsage function should detect destructured environment variables","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should detect destructured environment variables"},{"ancestorTitles":["Environment Analyzer","detectEnvironmentUsage function"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Environment Analyzer detectEnvironmentUsage function should handle files without client directive correctly","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should handle files without client directive correctly"},{"ancestorTitles":["Environment Analyzer","detectEnvironmentUsage function"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Environment Analyzer detectEnvironmentUsage function should detect all environment variables used","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"status":"passed","title":"should detect all environment variables used"},{"ancestorTitles":["Environment Analyzer","Environment variable categorization"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Environment Analyzer Environment variable categorization should categorize variables correctly","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should categorize variables correctly"}],"endTime":1758320438679,"message":"","name":"C:\\Dev\\ambiance-mcp\\src\\tools\\localTools\\analyzers\\frontend\\__tests__\\environment.test.ts","startTime":1758320438585,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["Workspace resolution precedence"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Workspace resolution precedence prefers WORKSPACE_FOLDER over AMBIANCE_BASE_DIR","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"prefers WORKSPACE_FOLDER over AMBIANCE_BASE_DIR"}],"endTime":1758320438813,"message":"","name":"C:\\Dev\\ambiance-mcp\\tests\\workspace-precedence.test.js","startTime":1758320438742,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["Enhanced Local Context - Unit Tests","AST Query Engine"],"duration":98,"failureDetails":[],"failureMessages":[],"fullName":"Enhanced Local Context - Unit Tests AST Query Engine should find import queries correctly","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should find import queries correctly"},{"ancestorTitles":["Enhanced Local Context - Unit Tests","AST Query Engine"],"duration":8,"failureDetails":[],"failureMessages":[],"fullName":"Enhanced Local Context - Unit Tests AST Query Engine should find export queries correctly","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should find export queries correctly"},{"ancestorTitles":["Enhanced Local Context - Unit Tests","AST Query Engine"],"duration":8,"failureDetails":[],"failureMessages":[],"fullName":"Enhanced Local Context - Unit Tests AST Query Engine should find function calls correctly","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should find function calls correctly"},{"ancestorTitles":["Enhanced Local Context - Unit Tests","Candidate Ranking"],"duration":10,"failureDetails":[],"failureMessages":[],"fullName":"Enhanced Local Context - Unit Tests Candidate Ranking should rank candidates by relevance","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should rank candidates by relevance"},{"ancestorTitles":["Enhanced Local Context - Unit Tests","Answer Draft Generation"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Enhanced Local Context - Unit Tests Answer Draft Generation should generate deterministic answers for database queries","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"should generate deterministic answers for database queries"},{"ancestorTitles":["Enhanced Local Context - Unit Tests","Answer Draft Generation"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Enhanced Local Context - Unit Tests Answer Draft Generation should handle missing template gracefully","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle missing template gracefully"},{"ancestorTitles":["Enhanced Local Context - Integration Tests"],"duration":105,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: > \u001b[32m0\u001b[39m\nReceived: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: > \u001b[32m0\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\tools\\localTools\\__tests__\\enhancedLocalContext.test.ts:277:39)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"Enhanced Local Context - Integration Tests should handle database queries end-to-end","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"failed","title":"should handle database queries end-to-end"},{"ancestorTitles":["Enhanced Local Context - Integration Tests"],"duration":20,"failureDetails":[{"matcherResult":{"actual":false,"expected":true,"message":"\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mfalse\u001b[39m","name":"toBe","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mfalse\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\tools\\localTools\\__tests__\\enhancedLocalContext.test.ts:308:29)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"Enhanced Local Context - Integration Tests should handle API route queries","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"failed","title":"should handle API route queries"},{"ancestorTitles":["Enhanced Local Context - Integration Tests"],"duration":17,"failureDetails":[],"failureMessages":[],"fullName":"Enhanced Local Context - Integration Tests should respect token budgets","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should respect token budgets"},{"ancestorTitles":["Enhanced Local Context - Integration Tests"],"duration":5,"failureDetails":[],"failureMessages":[],"fullName":"Enhanced Local Context - Integration Tests demotes scripts and projection_matrix noise in path scoring","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"demotes scripts and projection_matrix noise in path scoring"},{"ancestorTitles":["Enhanced Local Context - Integration Tests"],"duration":17,"failureDetails":[],"failureMessages":[],"fullName":"Enhanced Local Context - Integration Tests includes env hints for SUPABASE when topic is auth","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"includes env hints for SUPABASE when topic is auth"},{"ancestorTitles":["Enhanced Local Context - Golden Tests"],"duration":32,"failureDetails":[],"failureMessages":[],"fullName":"Enhanced Local Context - Golden Tests should produce consistent output for database query","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should produce consistent output for database query"},{"ancestorTitles":["Enhanced Local Context - Golden Tests"],"duration":13,"failureDetails":[],"failureMessages":[],"fullName":"Enhanced Local Context - Golden Tests should have consistent metadata format","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should have consistent metadata format"},{"ancestorTitles":["Enhanced Local Context - Performance Tests"],"duration":17,"failureDetails":[],"failureMessages":[],"fullName":"Enhanced Local Context - Performance Tests should complete analysis within reasonable time","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should complete analysis within reasonable time"},{"ancestorTitles":["Enhanced Local Context - Performance Tests"],"duration":21,"failureDetails":[],"failureMessages":[],"fullName":"Enhanced Local Context - Performance Tests should handle large file sets efficiently","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle large file sets efficiently"},{"ancestorTitles":["Enhanced Local Context - Error Handling"],"duration":14,"failureDetails":[],"failureMessages":[],"fullName":"Enhanced Local Context - Error Handling should handle invalid queries gracefully","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle invalid queries gracefully"},{"ancestorTitles":["Enhanced Local Context - Error Handling"],"duration":19,"failureDetails":[],"failureMessages":[],"fullName":"Enhanced Local Context - Error Handling should handle missing files gracefully","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle missing files gracefully"},{"ancestorTitles":["Enhanced Local Context - Error Handling"],"duration":19,"failureDetails":[],"failureMessages":[],"fullName":"Enhanced Local Context - Error Handling should respect maximum token limits","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should respect maximum token limits"}],"endTime":1758320438811,"message":"\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mEnhanced Local Context - Integration Tests › should handle database queries end-to-end\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: > \u001b[32m0\u001b[39m\n Received: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 275 |\u001b[39m expect(result\u001b[33m.\u001b[39msuccess)\u001b[33m.\u001b[39mtoBe(\u001b[36mtrue\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 276 |\u001b[39m expect(result\u001b[33m.\u001b[39manswerDraft)\u001b[33m.\u001b[39mtoBeTruthy()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 277 |\u001b[39m expect(result\u001b[33m.\u001b[39mjumpTargets\u001b[33m.\u001b[39mlength)\u001b[33m.\u001b[39mtoBeGreaterThan(\u001b[35m0\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 278 |\u001b[39m expect(result\u001b[33m.\u001b[39mmetadata\u001b[33m.\u001b[39mfilesScanned)\u001b[33m.\u001b[39mtoBeGreaterThan(\u001b[35m0\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 279 |\u001b[39m \u001b[22m\n\u001b[2m \u001b[90m 280 |\u001b[39m \u001b[90m// Check that database-related symbols were found\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/tools/localTools/__tests__/enhancedLocalContext.test.ts\u001b[39m\u001b[0m\u001b[2m:277:39)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mEnhanced Local Context - Integration Tests › should handle API route queries\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\n Expected: \u001b[32mtrue\u001b[39m\n Received: \u001b[31mfalse\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 306 |\u001b[39m target\u001b[33m.\u001b[39msymbol\u001b[33m.\u001b[39mtoLowerCase()\u001b[33m.\u001b[39mincludes(\u001b[32m'router'\u001b[39m)\u001b[22m\n\u001b[2m \u001b[90m 307 |\u001b[39m )\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 308 |\u001b[39m expect(hasRouteSymbols)\u001b[33m.\u001b[39mtoBe(\u001b[36mtrue\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 309 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 310 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 311 |\u001b[39m it(\u001b[32m'should respect token budgets'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/tools/localTools/__tests__/enhancedLocalContext.test.ts\u001b[39m\u001b[0m\u001b[2m:308:29)\u001b[22m\u001b[2m\u001b[22m\n","name":"C:\\Dev\\ambiance-mcp\\src\\tools\\localTools\\__tests__\\enhancedLocalContext.test.ts","startTime":1758320431238,"status":"failed","summary":""},{"assertionResults":[{"ancestorTitles":["Context Validation Functions","validateContextItems"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Context Validation Functions validateContextItems should fail with empty context array","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should fail with empty context array"},{"ancestorTitles":["Context Validation Functions","validateContextItems"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Context Validation Functions validateContextItems should fail with placeholder-only context","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should fail with placeholder-only context"},{"ancestorTitles":["Context Validation Functions","validateContextItems"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Context Validation Functions validateContextItems should pass with valid context","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should pass with valid context"},{"ancestorTitles":["Context Validation Functions","validateEnhancedContext"],"duration":7,"failureDetails":[],"failureMessages":[],"fullName":"Context Validation Functions validateEnhancedContext should fail with empty enhanced context","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should fail with empty enhanced context"},{"ancestorTitles":["Context Validation Functions","validateDynamicSignal"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Context Validation Functions validateDynamicSignal should fail with insufficient dynamic content in messages","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should fail with insufficient dynamic content in messages"}],"endTime":1758320438784,"message":"","name":"C:\\Dev\\ambiance-mcp\\tests\\validation.test.js","startTime":1758320438686,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["Verifier #1: Framework-aware Routes"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Verifier #1: Framework-aware Routes should NOT detect routes from UI pages","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should NOT detect routes from UI pages"},{"ancestorTitles":["Verifier #1: Framework-aware Routes"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Verifier #1: Framework-aware Routes should detect Next.js App Router routes correctly","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should detect Next.js App Router routes correctly"},{"ancestorTitles":["Verifier #1: Framework-aware Routes"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Verifier #1: Framework-aware Routes should detect Express routes with literal paths only","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should detect Express routes with literal paths only"},{"ancestorTitles":["Verifier #3: Build Artifacts Exclusion"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Verifier #3: Build Artifacts Exclusion should prefer source files over build artifacts","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should prefer source files over build artifacts"},{"ancestorTitles":["Evidence-based Confidence Scoring"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Evidence-based Confidence Scoring should calculate confidence as hits / threshold","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should calculate confidence as hits / threshold"},{"ancestorTitles":["Symbol Deduplication"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Symbol Deduplication should handle function overloads correctly","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle function overloads correctly"},{"ancestorTitles":["Risk Detection Rules"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Risk Detection Rules should identify ENV-002 pattern (server env in client)","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should identify ENV-002 pattern (server env in client)"},{"ancestorTitles":["Risk Detection Rules"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Risk Detection Rules should identify API-AUTH-001 pattern (unguarded API routes)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should identify API-AUTH-001 pattern (unguarded API routes)"},{"ancestorTitles":["Risk Detection Rules"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Risk Detection Rules should identify BUILD-001 pattern (build artifacts included)","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should identify BUILD-001 pattern (build artifacts included)"},{"ancestorTitles":["Output Contract Invariants"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Output Contract Invariants should ensure deterministic sorting","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should ensure deterministic sorting"},{"ancestorTitles":["Output Contract Invariants"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Output Contract Invariants should enforce bounded results","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should enforce bounded results"},{"ancestorTitles":["Output Contract Invariants"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Output Contract Invariants should normalize paths consistently","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should normalize paths consistently"}],"endTime":1758320438771,"message":"","name":"C:\\Dev\\ambiance-mcp\\src\\tools\\localTools\\__tests__\\verifiers.test.ts","startTime":1758320438707,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["Indexing Tools Integration","Tool Definitions"],"duration":13,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration Tool Definitions should export correct number of tools","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should export correct number of tools"},{"ancestorTitles":["Indexing Tools Integration","Tool Definitions"],"duration":22,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration Tool Definitions should have all required tool properties","invocations":1,"location":null,"numPassingAsserts":36,"retryReasons":[],"status":"passed","title":"should have all required tool properties"},{"ancestorTitles":["Indexing Tools Integration","Tool Definitions"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration Tool Definitions should have correct tool names","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should have correct tool names"},{"ancestorTitles":["Indexing Tools Integration","Tool Handler Mappings"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration Tool Handler Mappings should have handlers for all tools","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"status":"passed","title":"should have handlers for all tools"},{"ancestorTitles":["Indexing Tools Integration","handleAutoDetectIndex"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleAutoDetectIndex should handle successful auto-detection","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle successful auto-detection"},{"ancestorTitles":["Indexing Tools Integration","handleAutoDetectIndex"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleAutoDetectIndex should handle no project detected","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle no project detected"},{"ancestorTitles":["Indexing Tools Integration","handleAutoDetectIndex"],"duration":33,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleAutoDetectIndex should handle auto-detection errors","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle auto-detection errors"},{"ancestorTitles":["Indexing Tools Integration","handleIndexProject"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleIndexProject should handle project indexing with all options","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle project indexing with all options"},{"ancestorTitles":["Indexing Tools Integration","handleIndexProject"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleIndexProject should use default path when not provided","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should use default path when not provided"},{"ancestorTitles":["Indexing Tools Integration","handleIndexProject"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleIndexProject should handle indexing errors","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle indexing errors"},{"ancestorTitles":["Indexing Tools Integration","handleResetIndexes"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleResetIndexes should handle successful reset","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle successful reset"},{"ancestorTitles":["Indexing Tools Integration","handleResetIndexes"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleResetIndexes should use current directory as default","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should use current directory as default"},{"ancestorTitles":["Indexing Tools Integration","handleResetIndexes"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleResetIndexes should handle reset failure","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle reset failure"},{"ancestorTitles":["Indexing Tools Integration","handleResetIndexes"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleResetIndexes should handle reset errors","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle reset errors"},{"ancestorTitles":["Indexing Tools Integration","handleStartWatching"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleStartWatching should handle successful watch start","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle successful watch start"},{"ancestorTitles":["Indexing Tools Integration","handleStartWatching"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleStartWatching should use current directory as default","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should use current directory as default"},{"ancestorTitles":["Indexing Tools Integration","handleStartWatching"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleStartWatching should handle watch start errors","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle watch start errors"},{"ancestorTitles":["Indexing Tools Integration","handleStopWatching"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleStopWatching should handle successful watch stop","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle successful watch stop"},{"ancestorTitles":["Indexing Tools Integration","handleStopWatching"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleStopWatching should use current directory as default","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should use current directory as default"},{"ancestorTitles":["Indexing Tools Integration","handleStopWatching"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleStopWatching should handle watch stop errors","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle watch stop errors"},{"ancestorTitles":["Indexing Tools Integration","handleGetIndexingStatus"],"duration":6,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleGetIndexingStatus should return specific session status","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should return specific session status"},{"ancestorTitles":["Indexing Tools Integration","handleGetIndexingStatus"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleGetIndexingStatus should return all sessions when no sessionId provided","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should return all sessions when no sessionId provided"},{"ancestorTitles":["Indexing Tools Integration","handleGetIndexingStatus"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleGetIndexingStatus should handle session not found","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle session not found"},{"ancestorTitles":["Indexing Tools Integration","handleGetIndexingStatus"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleGetIndexingStatus should handle empty sessions list","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle empty sessions list"},{"ancestorTitles":["Indexing Tools Integration","handleGetIndexingStatus"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration handleGetIndexingStatus should handle status errors","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle status errors"},{"ancestorTitles":["Indexing Tools Integration","Input Validation"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration Input Validation should validate indexProject path parameter","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should validate indexProject path parameter"},{"ancestorTitles":["Indexing Tools Integration","Input Validation"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration Input Validation should validate boolean parameters","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should validate boolean parameters"},{"ancestorTitles":["Indexing Tools Integration","Concurrent Operations"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Indexing Tools Integration Concurrent Operations should handle multiple concurrent indexing requests","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should handle multiple concurrent indexing requests"}],"endTime":1758320438678,"message":"","name":"C:\\Dev\\ambiance-mcp\\src\\tools\\__tests__\\indexingTools.test.ts","startTime":1758320431230,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["LocalSearch","Constructor"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch Constructor should initialize with empty project indexes","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should initialize with empty project indexes"},{"ancestorTitles":["LocalSearch","indexFile"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch indexFile should index a file for a new project","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should index a file for a new project"},{"ancestorTitles":["LocalSearch","indexFile"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch indexFile should add multiple files to the same project","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should add multiple files to the same project"},{"ancestorTitles":["LocalSearch","indexFile"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch indexFile should handle multiple projects independently","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle multiple projects independently"},{"ancestorTitles":["LocalSearch","search"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch search should return empty array when no project index exists","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return empty array when no project index exists"},{"ancestorTitles":["LocalSearch","search"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch search should find results by exact phrase match","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should find results by exact phrase match"},{"ancestorTitles":["LocalSearch","search"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch search should find results by partial term match","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should find results by partial term match"},{"ancestorTitles":["LocalSearch","search"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch search should boost symbol matches with higher score","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should boost symbol matches with higher score"},{"ancestorTitles":["LocalSearch","search"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch search should return results sorted by score descending","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should return results sorted by score descending"},{"ancestorTitles":["LocalSearch","search"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch search should respect k parameter for result limit","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should respect k parameter for result limit"},{"ancestorTitles":["LocalSearch","search"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch search should filter out short query terms","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should filter out short query terms"},{"ancestorTitles":["LocalSearch","search"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch search should handle empty query","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle empty query"},{"ancestorTitles":["LocalSearch","search"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch search should handle query with no matches","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle query with no matches"},{"ancestorTitles":["LocalSearch","search"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch search should include correct metadata in results","invocations":1,"location":null,"numPassingAsserts":16,"retryReasons":[],"status":"passed","title":"should include correct metadata in results"},{"ancestorTitles":["LocalSearch","calculateScore (indirect testing)"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch calculateScore (indirect testing) should give higher score for exact symbol name matches","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should give higher score for exact symbol name matches"},{"ancestorTitles":["LocalSearch","calculateScore (indirect testing)"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch calculateScore (indirect testing) should penalize long content","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should penalize long content"},{"ancestorTitles":["LocalSearch","calculateScore (indirect testing)"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch calculateScore (indirect testing) should handle multiple term matches","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle multiple term matches"},{"ancestorTitles":["LocalSearch","clearProjectIndex"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch clearProjectIndex should remove project index","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should remove project index"},{"ancestorTitles":["LocalSearch","clearProjectIndex"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch clearProjectIndex should handle clearing non-existent project","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle clearing non-existent project"},{"ancestorTitles":["LocalSearch","getIndexStats"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch getIndexStats should return null for non-existent project","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return null for non-existent project"},{"ancestorTitles":["LocalSearch","getIndexStats"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch getIndexStats should return correct stats for indexed project","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return correct stats for indexed project"},{"ancestorTitles":["LocalSearch","getIndexStats"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch getIndexStats should handle project with multiple files","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle project with multiple files"},{"ancestorTitles":["LocalSearch","hasProjectData"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch hasProjectData should return false for non-existent project","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return false for non-existent project"},{"ancestorTitles":["LocalSearch","hasProjectData"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch hasProjectData should return true for project with indexed files","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return true for project with indexed files"},{"ancestorTitles":["LocalSearch","hasProjectData"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch hasProjectData should return false after clearing project index","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return false after clearing project index"},{"ancestorTitles":["LocalSearch","Edge Cases"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch Edge Cases should handle empty indexed file","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle empty indexed file"},{"ancestorTitles":["LocalSearch","Edge Cases"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch Edge Cases should handle file with no chunks or symbols","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle file with no chunks or symbols"},{"ancestorTitles":["LocalSearch","Edge Cases"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalSearch Edge Cases should handle large k parameter","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle large k parameter"}],"endTime":1758320438703,"message":"","name":"C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\search.test.ts","startTime":1758320438630,"status":"passed","summary":""},{"assertionResults":[],"coverage":{},"endTime":1758320570526,"message":" \u001b[1m● \u001b[22mTest suite failed to run\n\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m26\u001b[0m:\u001b[93m41\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m 26\u001b[0m stat: jest.fn().mockResolvedValue({\n \u001b[7m \u001b[0m \u001b[91m ~\u001b[0m\n \u001b[7m 27\u001b[0m isFile: () => true,\n \u001b[7m \u001b[0m \u001b[91m~~~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[7m...\u001b[0m \n \u001b[7m 30\u001b[0m mtime: new Date()\n \u001b[7m \u001b[0m \u001b[91m~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[7m 31\u001b[0m } as any),\n \u001b[7m \u001b[0m \u001b[91m~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m32\u001b[0m:\u001b[93m45\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m32\u001b[0m readFile: jest.fn().mockResolvedValue('function test() { return \"test content\"; }' as any),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m33\u001b[0m:\u001b[93m46\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m33\u001b[0m writeFile: jest.fn().mockResolvedValue(undefined as any),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m34\u001b[0m:\u001b[93m42\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m34\u001b[0m mkdir: jest.fn().mockResolvedValue(undefined as any),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m35\u001b[0m:\u001b[93m39\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m35\u001b[0m rm: jest.fn().mockResolvedValue(undefined as any),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m36\u001b[0m:\u001b[93m44\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m36\u001b[0m readdir: jest.fn().mockResolvedValue(['test1.ts', 'test2.ts'] as any),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m61\u001b[0m:\u001b[93m41\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m61\u001b[0m post: jest.fn().mockResolvedValue({\n \u001b[7m \u001b[0m \u001b[91m ~\u001b[0m\n \u001b[7m62\u001b[0m data: { embeddings: [[0.1, 0.2, 0.3]] }\n \u001b[7m \u001b[0m \u001b[91m~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[7m63\u001b[0m } as any),\n \u001b[7m \u001b[0m \u001b[91m~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m64\u001b[0m:\u001b[93m40\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m64\u001b[0m get: jest.fn().mockResolvedValue({ data: {} } as any),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m65\u001b[0m:\u001b[93m40\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m65\u001b[0m put: jest.fn().mockResolvedValue({ data: {} } as any),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m66\u001b[0m:\u001b[93m43\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m66\u001b[0m delete: jest.fn().mockResolvedValue({ data: {} } as any),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m78\u001b[0m:\u001b[93m57\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m 78\u001b[0m createChatCompletion: jest.fn().mockResolvedValue({\n \u001b[7m \u001b[0m \u001b[91m ~\u001b[0m\n \u001b[7m 79\u001b[0m id: 'test',\n \u001b[7m \u001b[0m \u001b[91m~~~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[7m...\u001b[0m \n \u001b[7m 81\u001b[0m usage: { prompt_tokens: 10, completion_tokens: 5, total_tokens: 15 },\n \u001b[7m \u001b[0m \u001b[91m~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[7m 82\u001b[0m } as any),\n \u001b[7m \u001b[0m \u001b[91m~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m103\u001b[0m:\u001b[93m55\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m103\u001b[0m initializeDatabase: jest.fn().mockResolvedValue(undefined as any),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m104\u001b[0m:\u001b[93m65\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m104\u001b[0m ensureDimensionCompatibility: jest.fn().mockResolvedValue(undefined as any),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m105\u001b[0m:\u001b[93m51\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m105\u001b[0m storeEmbedding: jest.fn().mockResolvedValue(undefined as any),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m106\u001b[0m:\u001b[93m54\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m106\u001b[0m storeFileMetadata: jest.fn().mockResolvedValue(undefined as any),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m112\u001b[0m:\u001b[93m57\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m112\u001b[0m getProjectEmbeddings: jest.fn().mockResolvedValue([] as any),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m113\u001b[0m:\u001b[93m59\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m113\u001b[0m clearProjectEmbeddings: jest.fn().mockResolvedValue(undefined as any),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m114\u001b[0m:\u001b[93m42\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m114\u001b[0m close: jest.fn().mockResolvedValue(undefined as any),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m125\u001b[0m:\u001b[93m50\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'any' is not assignable to parameter of type 'never'.\n\n \u001b[7m125\u001b[0m parseAndChunk: jest.fn().mockResolvedValue([\n \u001b[7m \u001b[0m \u001b[91m ~\u001b[0m\n \u001b[7m126\u001b[0m {\n \u001b[7m \u001b[0m \u001b[91m~~~~~~~~~\u001b[0m\n \u001b[7m...\u001b[0m \n \u001b[7m130\u001b[0m }\n \u001b[7m \u001b[0m \u001b[91m~~~~~~~~~\u001b[0m\n \u001b[7m131\u001b[0m ] as any),\n \u001b[7m \u001b[0m \u001b[91m~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/mockSetup.ts\u001b[0m:\u001b[93m165\u001b[0m:\u001b[93m43\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type '() => any' is not assignable to parameter of type 'never'.\n\n \u001b[7m165\u001b[0m pipeline: jest.fn().mockResolvedValue(() => Promise.resolve([[0.1, 0.2, 0.3]]) as any),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[0m\n","name":"C:\\Dev\\ambiance-mcp\\src\\tools\\__tests__\\toolCombinations.test.ts","startTime":1758320570526,"status":"failed","summary":""},{"assertionResults":[],"coverage":{},"endTime":1758320570526,"message":" \u001b[1m● \u001b[22mTest suite failed to run\n\n \u001b[96msrc/__tests__/utils/testHelpers.ts\u001b[0m:\u001b[93m25\u001b[0m:\u001b[93m39\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type '{ data: { embeddings: number[][]; }; }' is not assignable to parameter of type 'never'.\n\n \u001b[7m25\u001b[0m post: jest.fn().mockResolvedValue({\n \u001b[7m \u001b[0m \u001b[91m ~\u001b[0m\n \u001b[7m26\u001b[0m data: { embeddings: [[0.1, 0.2, 0.3]] }\n \u001b[7m \u001b[0m \u001b[91m~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[7m27\u001b[0m }),\n \u001b[7m \u001b[0m \u001b[91m~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/testHelpers.ts\u001b[0m:\u001b[93m28\u001b[0m:\u001b[93m38\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type '{ data: {}; }' is not assignable to parameter of type 'never'.\n\n \u001b[7m28\u001b[0m get: jest.fn().mockResolvedValue({ data: {} }),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/testHelpers.ts\u001b[0m:\u001b[93m29\u001b[0m:\u001b[93m38\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type '{ data: {}; }' is not assignable to parameter of type 'never'.\n\n \u001b[7m29\u001b[0m put: jest.fn().mockResolvedValue({ data: {} }),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/testHelpers.ts\u001b[0m:\u001b[93m30\u001b[0m:\u001b[93m41\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type '{ data: {}; }' is not assignable to parameter of type 'never'.\n\n \u001b[7m30\u001b[0m delete: jest.fn().mockResolvedValue({ data: {} }),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/testHelpers.ts\u001b[0m:\u001b[93m40\u001b[0m:\u001b[93m55\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type '{ id: string; choices: { message: { content: string; role: string; }; }[]; usage: { prompt_tokens: number; completion_tokens: number; total_tokens: number; }; }' is not assignable to parameter of type 'never'.\n\n \u001b[7m 40\u001b[0m createChatCompletion: jest.fn().mockResolvedValue({\n \u001b[7m \u001b[0m \u001b[91m ~\u001b[0m\n \u001b[7m 41\u001b[0m id: 'test',\n \u001b[7m \u001b[0m \u001b[91m~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[7m...\u001b[0m \n \u001b[7m 43\u001b[0m usage: { prompt_tokens: 10, completion_tokens: 5, total_tokens: 15 },\n \u001b[7m \u001b[0m \u001b[91m~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[7m 44\u001b[0m }),\n \u001b[7m \u001b[0m \u001b[91m~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/testHelpers.ts\u001b[0m:\u001b[93m51\u001b[0m:\u001b[93m51\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type '(task: string) => \"gpt-4o\" | \"gpt-4o-mini\"' is not assignable to parameter of type 'UnknownFunction'.\n Types of parameters 'task' and 'args' are incompatible.\n Type 'unknown' is not assignable to type 'string'.\n\n \u001b[7m51\u001b[0m getModelForTask: jest.fn().mockImplementation((task: string) => {\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/testHelpers.ts\u001b[0m:\u001b[93m62\u001b[0m:\u001b[93m53\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'undefined' is not assignable to parameter of type 'never'.\n\n \u001b[7m62\u001b[0m initializeDatabase: jest.fn().mockResolvedValue(undefined),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/testHelpers.ts\u001b[0m:\u001b[93m63\u001b[0m:\u001b[93m63\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'undefined' is not assignable to parameter of type 'never'.\n\n \u001b[7m63\u001b[0m ensureDimensionCompatibility: jest.fn().mockResolvedValue(undefined),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/testHelpers.ts\u001b[0m:\u001b[93m64\u001b[0m:\u001b[93m49\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'undefined' is not assignable to parameter of type 'never'.\n\n \u001b[7m64\u001b[0m storeEmbedding: jest.fn().mockResolvedValue(undefined),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/testHelpers.ts\u001b[0m:\u001b[93m65\u001b[0m:\u001b[93m52\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'undefined' is not assignable to parameter of type 'never'.\n\n \u001b[7m65\u001b[0m storeFileMetadata: jest.fn().mockResolvedValue(undefined),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/testHelpers.ts\u001b[0m:\u001b[93m71\u001b[0m:\u001b[93m55\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'never[]' is not assignable to parameter of type 'never'.\n\n \u001b[7m71\u001b[0m getProjectEmbeddings: jest.fn().mockResolvedValue([]),\n \u001b[7m \u001b[0m \u001b[91m ~~\u001b[0m\n \u001b[96msrc/__tests__/utils/testHelpers.ts\u001b[0m:\u001b[93m72\u001b[0m:\u001b[93m57\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'undefined' is not assignable to parameter of type 'never'.\n\n \u001b[7m72\u001b[0m clearProjectEmbeddings: jest.fn().mockResolvedValue(undefined),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/utils/testHelpers.ts\u001b[0m:\u001b[93m73\u001b[0m:\u001b[93m40\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'undefined' is not assignable to parameter of type 'never'.\n\n \u001b[7m73\u001b[0m close: jest.fn().mockResolvedValue(undefined),\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~\u001b[0m\n","name":"C:\\Dev\\ambiance-mcp\\src\\core\\__tests__\\errorHandling.test.ts","startTime":1758320570526,"status":"failed","summary":""},{"assertionResults":[],"coverage":{},"endTime":1758320570526,"message":" \u001b[1m● \u001b[22mTest suite failed to run\n\n \u001b[96msrc/__tests__/examples/embeddingGenerator.standardized.test.ts\u001b[0m:\u001b[93m125\u001b[0m:\u001b[93m44\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'Error' is not assignable to parameter of type 'never'.\n\n \u001b[7m125\u001b[0m mockApiClient.post.mockRejectedValue(new Error('API Error'));\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/examples/embeddingGenerator.standardized.test.ts\u001b[0m:\u001b[93m144\u001b[0m:\u001b[93m44\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type '{ data: { embeddings: never[][]; }; }' is not assignable to parameter of type 'never'.\n\n \u001b[7m144\u001b[0m mockApiClient.post.mockResolvedValue({\n \u001b[7m \u001b[0m \u001b[91m ~\u001b[0m\n \u001b[7m145\u001b[0m data: { embeddings: [[]] }\n \u001b[7m \u001b[0m \u001b[91m~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[7m146\u001b[0m });\n \u001b[7m \u001b[0m \u001b[91m~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/examples/embeddingGenerator.standardized.test.ts\u001b[0m:\u001b[93m153\u001b[0m:\u001b[93m44\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'Error' is not assignable to parameter of type 'never'.\n\n \u001b[7m153\u001b[0m mockApiClient.post.mockRejectedValue(new Error('API Error'));\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/examples/embeddingGenerator.standardized.test.ts\u001b[0m:\u001b[93m169\u001b[0m:\u001b[93m43\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'Error' is not assignable to parameter of type 'never'.\n\n \u001b[7m169\u001b[0m mockStorage.close.mockRejectedValue(new Error('Close error'));\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/examples/embeddingGenerator.standardized.test.ts\u001b[0m:\u001b[93m177\u001b[0m:\u001b[93m56\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'Error' is not assignable to parameter of type 'never'.\n\n \u001b[7m177\u001b[0m mockStorage.initializeDatabase.mockRejectedValue(new Error('DB Error'));\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~~~~~~\u001b[0m\n \u001b[96msrc/__tests__/examples/embeddingGenerator.standardized.test.ts\u001b[0m:\u001b[93m186\u001b[0m:\u001b[93m66\u001b[0m - \u001b[91merror\u001b[0m\u001b[90m TS2345: \u001b[0mArgument of type 'Error' is not assignable to parameter of type 'never'.\n\n \u001b[7m186\u001b[0m mockStorage.ensureDimensionCompatibility.mockRejectedValue(new Error('Dimension mismatch'));\n \u001b[7m \u001b[0m \u001b[91m ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[0m\n","name":"C:\\Dev\\ambiance-mcp\\src\\__tests__\\examples\\embeddingGenerator.standardized.test.ts","startTime":1758320570526,"status":"failed","summary":""},{"assertionResults":[{"ancestorTitles":["AmbianceMCPServer","API Key Validation"],"duration":11,"failureDetails":[],"failureMessages":[],"fullName":"AmbianceMCPServer API Key Validation should initialize with no API keys","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should initialize with no API keys"},{"ancestorTitles":["AmbianceMCPServer","API Key Validation"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"AmbianceMCPServer API Key Validation should detect OpenAI API key presence","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should detect OpenAI API key presence"},{"ancestorTitles":["AmbianceMCPServer","API Key Validation"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"AmbianceMCPServer API Key Validation should detect Ambiance API key presence","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should detect Ambiance API key presence"},{"ancestorTitles":["AmbianceMCPServer","API Key Validation"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"AmbianceMCPServer API Key Validation should detect both API keys","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should detect both API keys"},{"ancestorTitles":["AmbianceMCPServer","initializeAsync"],"duration":15,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32mStringContaining \"Local embeddings disabled\"\u001b[39m\nReceived\n 1: \u001b[31m\"🔧 Applied fallback for WORKSPACE_FOLDER: C:\\\\Dev\\\\ambiance-mcp\"\u001b[39m\n 2: \u001b[31m\"🔧 Applied fallback for USE_LOCAL_EMBEDDINGS: true\"\u001b[39m\n 3: \u001b[31m\"🔧 Applied fallback for OPENAI_BASE_URL: https://api.openai.com/v1\"\u001b[39m\n\nNumber of calls: \u001b[31m17\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32mStringContaining \"Local embeddings disabled\"\u001b[39m\nReceived\n 1: \u001b[31m\"🔧 Applied fallback for WORKSPACE_FOLDER: C:\\\\Dev\\\\ambiance-mcp\"\u001b[39m\n 2: \u001b[31m\"🔧 Applied fallback for USE_LOCAL_EMBEDDINGS: true\"\u001b[39m\n 3: \u001b[31m\"🔧 Applied fallback for OPENAI_BASE_URL: https://api.openai.com/v1\"\u001b[39m\n\nNumber of calls: \u001b[31m17\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\__tests__\\index.test.ts:163:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"AmbianceMCPServer initializeAsync should validate API keys and update tools","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"failed","title":"should validate API keys and update tools"},{"ancestorTitles":["AmbianceMCPServer","validateApiKeys"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"AmbianceMCPServer validateApiKeys should validate OpenAI key when present","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should validate OpenAI key when present"},{"ancestorTitles":["AmbianceMCPServer","validateApiKeys"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"AmbianceMCPServer validateApiKeys should handle OpenAI validation failure","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle OpenAI validation failure"},{"ancestorTitles":["AmbianceMCPServer","validateApiKeys"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"AmbianceMCPServer validateApiKeys should validate Ambiance key when present","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should validate Ambiance key when present"},{"ancestorTitles":["AmbianceMCPServer","validateApiKeys"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"AmbianceMCPServer validateApiKeys should handle Ambiance validation failure","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle Ambiance validation failure"},{"ancestorTitles":["AmbianceMCPServer","start method"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"AmbianceMCPServer start method should call initializeAsync on start","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should call initializeAsync on start"}],"endTime":1758320439270,"message":"\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAmbianceMCPServer › initializeAsync › should validate API keys and update tools\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32mStringContaining \"Local embeddings disabled\"\u001b[39m\n Received\n 1: \u001b[31m\"🔧 Applied fallback for WORKSPACE_FOLDER: C:\\\\Dev\\\\ambiance-mcp\"\u001b[39m\n 2: \u001b[31m\"🔧 Applied fallback for USE_LOCAL_EMBEDDINGS: true\"\u001b[39m\n 3: \u001b[31m\"🔧 Applied fallback for OPENAI_BASE_URL: https://api.openai.com/v1\"\u001b[39m\n\n Number of calls: \u001b[31m17\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 161 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 162 |\u001b[39m expect(mockValidateKeys)\u001b[33m.\u001b[39mtoHaveBeenCalled()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 163 |\u001b[39m expect(mockLogger\u001b[33m.\u001b[39minfo)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 164 |\u001b[39m expect\u001b[33m.\u001b[39mstringContaining(\u001b[32m'Local embeddings disabled'\u001b[39m)\u001b[22m\n\u001b[2m \u001b[90m 165 |\u001b[39m )\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 166 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/__tests__/index.test.ts\u001b[39m\u001b[0m\u001b[2m:163:31)\u001b[22m\u001b[2m\u001b[22m\n","name":"C:\\Dev\\ambiance-mcp\\src\\__tests__\\index.test.ts","startTime":1758320431198,"status":"failed","summary":""},{"assertionResults":[{"ancestorTitles":["LocalEmbeddingGenerator","Constructor"],"duration":53,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator Constructor should initialize with provided storage","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should initialize with provided storage"},{"ancestorTitles":["LocalEmbeddingGenerator","Constructor"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator Constructor should create default storage when none provided","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should create default storage when none provided"},{"ancestorTitles":["LocalEmbeddingGenerator","Constructor"],"duration":6,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator Constructor should initialize with Ambiance API key from environment","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should initialize with Ambiance API key from environment"},{"ancestorTitles":["LocalEmbeddingGenerator","Constructor"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator Constructor should handle missing API keys gracefully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle missing API keys gracefully"},{"ancestorTitles":["LocalEmbeddingGenerator","generateProjectEmbeddings"],"duration":37,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator generateProjectEmbeddings should throw error when local embeddings not enabled","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should throw error when local embeddings not enabled"},{"ancestorTitles":["LocalEmbeddingGenerator","generateProjectEmbeddings"],"duration":10,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator generateProjectEmbeddings should initialize database on generation start","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should initialize database on generation start"},{"ancestorTitles":["LocalEmbeddingGenerator","generateProjectEmbeddings"],"duration":6,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator generateProjectEmbeddings should process files and return progress","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"should process files and return progress"},{"ancestorTitles":["LocalEmbeddingGenerator","generateProjectEmbeddings"],"duration":5,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator generateProjectEmbeddings should handle force regeneration option","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle force regeneration option"},{"ancestorTitles":["LocalEmbeddingGenerator","generateProjectEmbeddings"],"duration":6,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator generateProjectEmbeddings should respect batch size configuration","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should respect batch size configuration"},{"ancestorTitles":["LocalEmbeddingGenerator","generateProjectEmbeddings"],"duration":1305,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator generateProjectEmbeddings should handle rate limiting","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle rate limiting"},{"ancestorTitles":["LocalEmbeddingGenerator","generateProjectEmbeddings"],"duration":2,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\nExpected number of calls: >= \u001b[32m1\u001b[39m\nReceived number of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\nExpected number of calls: >= \u001b[32m1\u001b[39m\nReceived number of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingGenerator.test.ts:225:48)"],"fullName":"LocalEmbeddingGenerator generateProjectEmbeddings should handle file patterns filter","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle file patterns filter"},{"ancestorTitles":["LocalEmbeddingGenerator","generateProjectEmbeddings"],"duration":12,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator generateProjectEmbeddings should handle parallel mode","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle parallel mode"},{"ancestorTitles":["LocalEmbeddingGenerator","generateProjectEmbeddings"],"duration":8,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator generateProjectEmbeddings should handle API errors gracefully","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle API errors gracefully"},{"ancestorTitles":["LocalEmbeddingGenerator","generateProjectEmbeddings"],"duration":8,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\nExpected number of calls: >= \u001b[32m1\u001b[39m\nReceived number of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\nExpected number of calls: >= \u001b[32m1\u001b[39m\nReceived number of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingGenerator.test.ts:269:48)"],"fullName":"LocalEmbeddingGenerator generateProjectEmbeddings should handle chunking options","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle chunking options"},{"ancestorTitles":["LocalEmbeddingGenerator","generateQueryEmbedding"],"duration":8,"failureDetails":[{}],"failureMessages":["Error: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\n at LocalEmbeddingGenerator.generateBatchEmbeddings (C:\\Dev\\ambiance-mcp\\src\\local\\embeddingGenerator.ts:943:11)\n at LocalEmbeddingGenerator.generateQueryEmbedding (C:\\Dev\\ambiance-mcp\\src\\local\\embeddingGenerator.ts:1019:24)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingGenerator.test.ts:286:22)"],"fullName":"LocalEmbeddingGenerator generateQueryEmbedding should generate embedding for query text","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should generate embedding for query text"},{"ancestorTitles":["LocalEmbeddingGenerator","generateQueryEmbedding"],"duration":1,"failureDetails":[{}],"failureMessages":["Error: No valid texts provided for embedding generation\n at LocalEmbeddingGenerator.generateBatchEmbeddings (C:\\Dev\\ambiance-mcp\\src\\local\\embeddingGenerator.ts:745:13)\n at LocalEmbeddingGenerator.generateQueryEmbedding (C:\\Dev\\ambiance-mcp\\src\\local\\embeddingGenerator.ts:1019:35)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingGenerator.test.ts:305:38)\n at Promise.then.completed (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:231:10)\n at _callCircusTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:316:40)\n at _runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:252:3)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:126:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at run (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:71:3)\n at runAndTransformResultsToJestFormat (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapterInit.js:122:21)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:79:19)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingGenerator generateQueryEmbedding should handle empty query","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle empty query"},{"ancestorTitles":["LocalEmbeddingGenerator","generateQueryEmbedding"],"duration":9,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator generateQueryEmbedding should handle API errors in query embedding","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle API errors in query embedding"},{"ancestorTitles":["LocalEmbeddingGenerator","generateQueryEmbedding"],"duration":1,"failureDetails":[{}],"failureMessages":["Error: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\n at LocalEmbeddingGenerator.generateBatchEmbeddings (C:\\Dev\\ambiance-mcp\\src\\local\\embeddingGenerator.ts:943:11)\n at LocalEmbeddingGenerator.generateQueryEmbedding (C:\\Dev\\ambiance-mcp\\src\\local\\embeddingGenerator.ts:1019:24)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingGenerator.test.ts:328:7)"],"fullName":"LocalEmbeddingGenerator generateQueryEmbedding should use project-specific embedding generation when projectId provided","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should use project-specific embedding generation when projectId provided"},{"ancestorTitles":["LocalEmbeddingGenerator","dispose"],"duration":1,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\nExpected number of calls: >= \u001b[32m1\u001b[39m\nReceived number of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\nExpected number of calls: >= \u001b[32m1\u001b[39m\nReceived number of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingGenerator.test.ts:338:33)"],"fullName":"LocalEmbeddingGenerator dispose should close storage connection","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should close storage connection"},{"ancestorTitles":["LocalEmbeddingGenerator","dispose"],"duration":1,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\nExpected number of calls: >= \u001b[32m1\u001b[39m\nReceived number of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\nExpected number of calls: >= \u001b[32m1\u001b[39m\nReceived number of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingGenerator.test.ts:346:32)"],"fullName":"LocalEmbeddingGenerator dispose should handle dispose errors gracefully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"failed","title":"should handle dispose errors gracefully"},{"ancestorTitles":["LocalEmbeddingGenerator","Provider Fallback Logic"],"duration":1,"failureDetails":[{}],"failureMessages":["Error: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\n at LocalEmbeddingGenerator.generateBatchEmbeddings (C:\\Dev\\ambiance-mcp\\src\\local\\embeddingGenerator.ts:943:11)\n at LocalEmbeddingGenerator.generateQueryEmbedding (C:\\Dev\\ambiance-mcp\\src\\local\\embeddingGenerator.ts:1019:24)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingGenerator.test.ts:357:7)"],"fullName":"LocalEmbeddingGenerator Provider Fallback Logic should attempt Ambiance API first when key available","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should attempt Ambiance API first when key available"},{"ancestorTitles":["LocalEmbeddingGenerator","Provider Fallback Logic"],"duration":18,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mrejects\u001b[2m.\u001b[22mtoThrow\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected substring: \u001b[32m\"Ambiance API failed\"\u001b[39m\nReceived message: \u001b[31m\"Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\"\u001b[39m\n\n \u001b[0m \u001b[90m 941 |\u001b[39m \u001b[33m.\u001b[39mmap(p \u001b[33m=>\u001b[39m \u001b[32m`${p.name}: ${p.available ? 'available' : 'not available'}`\u001b[39m)\n \u001b[90m 942 |\u001b[39m \u001b[33m.\u001b[39mjoin(\u001b[32m', '\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 943 |\u001b[39m \u001b[36mthrow\u001b[39m \u001b[36mnew\u001b[39m \u001b[33mError\u001b[39m(\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 944 |\u001b[39m \u001b[32m`Embedding generation failed with all providers. `\u001b[39m \u001b[33m+\u001b[39m\n \u001b[90m 945 |\u001b[39m \u001b[32m`Available providers: ${availableProviders}. `\u001b[39m \u001b[33m+\u001b[39m\n \u001b[90m 946 |\u001b[39m \u001b[32m`Check API keys, network connectivity, and provider configurations.`\u001b[39m\u001b[0m\n\n \u001b[2mat LocalEmbeddingGenerator.generateBatchEmbeddings (\u001b[22msrc/local/embeddingGenerator.ts\u001b[2m:943:11)\u001b[22m\n \u001b[2mat LocalEmbeddingGenerator.generateQueryEmbedding (\u001b[22msrc/local/embeddingGenerator.ts\u001b[2m:1019:24)\u001b[22m\n \u001b[2mat Object.<anonymous> (\u001b[22msrc/local/__tests__/embeddingGenerator.test.ts\u001b[2m:366:7)\u001b[22m","pass":false},"message":"\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mrejects\u001b[2m.\u001b[22mtoThrow\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected substring: \u001b[32m\"Ambiance API failed\"\u001b[39m\nReceived message: \u001b[31m\"Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\"\u001b[39m\n\n \u001b[0m \u001b[90m 941 |\u001b[39m \u001b[33m.\u001b[39mmap(p \u001b[33m=>\u001b[39m \u001b[32m`${p.name}: ${p.available ? 'available' : 'not available'}`\u001b[39m)\n \u001b[90m 942 |\u001b[39m \u001b[33m.\u001b[39mjoin(\u001b[32m', '\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 943 |\u001b[39m \u001b[36mthrow\u001b[39m \u001b[36mnew\u001b[39m \u001b[33mError\u001b[39m(\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 944 |\u001b[39m \u001b[32m`Embedding generation failed with all providers. `\u001b[39m \u001b[33m+\u001b[39m\n \u001b[90m 945 |\u001b[39m \u001b[32m`Available providers: ${availableProviders}. `\u001b[39m \u001b[33m+\u001b[39m\n \u001b[90m 946 |\u001b[39m \u001b[32m`Check API keys, network connectivity, and provider configurations.`\u001b[39m\u001b[0m\n\n \u001b[2mat LocalEmbeddingGenerator.generateBatchEmbeddings (\u001b[22msrc/local/embeddingGenerator.ts\u001b[2m:943:11)\u001b[22m\n \u001b[2mat LocalEmbeddingGenerator.generateQueryEmbedding (\u001b[22msrc/local/embeddingGenerator.ts\u001b[2m:1019:24)\u001b[22m\n \u001b[2mat Object.<anonymous> (\u001b[22msrc/local/__tests__/embeddingGenerator.test.ts\u001b[2m:366:7)\u001b[22m"}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mrejects\u001b[2m.\u001b[22mtoThrow\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected substring: \u001b[32m\"Ambiance API failed\"\u001b[39m\nReceived message: \u001b[31m\"Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\"\u001b[39m\n\n \u001b[0m \u001b[90m 941 |\u001b[39m \u001b[33m.\u001b[39mmap(p \u001b[33m=>\u001b[39m \u001b[32m`${p.name}: ${p.available ? 'available' : 'not available'}`\u001b[39m)\n \u001b[90m 942 |\u001b[39m \u001b[33m.\u001b[39mjoin(\u001b[32m', '\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 943 |\u001b[39m \u001b[36mthrow\u001b[39m \u001b[36mnew\u001b[39m \u001b[33mError\u001b[39m(\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 944 |\u001b[39m \u001b[32m`Embedding generation failed with all providers. `\u001b[39m \u001b[33m+\u001b[39m\n \u001b[90m 945 |\u001b[39m \u001b[32m`Available providers: ${availableProviders}. `\u001b[39m \u001b[33m+\u001b[39m\n \u001b[90m 946 |\u001b[39m \u001b[32m`Check API keys, network connectivity, and provider configurations.`\u001b[39m\u001b[0m\n\n \u001b[2mat LocalEmbeddingGenerator.generateBatchEmbeddings (\u001b[22msrc/local/embeddingGenerator.ts\u001b[2m:943:11)\u001b[22m\n \u001b[2mat LocalEmbeddingGenerator.generateQueryEmbedding (\u001b[22msrc/local/embeddingGenerator.ts\u001b[2m:1019:24)\u001b[22m\n \u001b[2mat Object.<anonymous> (\u001b[22msrc/local/__tests__/embeddingGenerator.test.ts\u001b[2m:366:7)\u001b[22m\n at Object.toThrow (C:\\Dev\\ambiance-mcp\\node_modules\\expect\\build\\index.js:218:22)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingGenerator.test.ts:366:70)\n at Promise.then.completed (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:231:10)\n at _callCircusTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:316:40)\n at _runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:252:3)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:126:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at run (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:71:3)\n at runAndTransformResultsToJestFormat (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapterInit.js:122:21)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:79:19)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingGenerator Provider Fallback Logic should handle Ambiance API errors gracefully","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle Ambiance API errors gracefully"},{"ancestorTitles":["LocalEmbeddingGenerator","Provider Fallback Logic"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator Provider Fallback Logic should handle missing API keys","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle missing API keys"},{"ancestorTitles":["LocalEmbeddingGenerator","Error Handling"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator Error Handling should handle database initialization errors","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle database initialization errors"},{"ancestorTitles":["LocalEmbeddingGenerator","Error Handling"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator Error Handling should handle dimension compatibility errors","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle dimension compatibility errors"},{"ancestorTitles":["LocalEmbeddingGenerator","Error Handling"],"duration":8,"failureDetails":[{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mrejects\u001b[2m.\u001b[22mtoThrow\u001b[2m()\u001b[22m\n\nReceived promise resolved instead of rejected\nResolved to value: \u001b[31m{\"currentFile\": \"..\\\\..\\\\Dev\\\\ambiance-mcp\\\\package.json\", \"embeddings\": 0, \"errors\": [\"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", …], \"processedChunks\": 0, \"processedFiles\": 11, \"totalChunks\": 11, \"totalFiles\": 11}\u001b[39m"}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mrejects\u001b[2m.\u001b[22mtoThrow\u001b[2m()\u001b[22m\n\nReceived promise resolved instead of rejected\nResolved to value: \u001b[31m{\"currentFile\": \"..\\\\..\\\\Dev\\\\ambiance-mcp\\\\package.json\", \"embeddings\": 0, \"errors\": [\"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", …], \"processedChunks\": 0, \"processedFiles\": 11, \"totalChunks\": 11, \"totalFiles\": 11}\u001b[39m\n at expect (C:\\Dev\\ambiance-mcp\\node_modules\\expect\\build\\index.js:113:15)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingGenerator.test.ts:404:13)\n at Promise.then.completed (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:231:10)\n at _callCircusTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:316:40)\n at _runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:252:3)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:126:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at run (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:71:3)\n at runAndTransformResultsToJestFormat (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapterInit.js:122:21)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:79:19)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingGenerator Error Handling should handle file system errors","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle file system errors"},{"ancestorTitles":["LocalEmbeddingGenerator","Error Handling"],"duration":9,"failureDetails":[{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mrejects\u001b[2m.\u001b[22mtoThrow\u001b[2m()\u001b[22m\n\nReceived promise resolved instead of rejected\nResolved to value: \u001b[31m{\"currentFile\": \"..\\\\..\\\\Dev\\\\ambiance-mcp\\\\package.json\", \"embeddings\": 0, \"errors\": [\"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", …], \"processedChunks\": 0, \"processedFiles\": 11, \"totalChunks\": 11, \"totalFiles\": 11}\u001b[39m"}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mrejects\u001b[2m.\u001b[22mtoThrow\u001b[2m()\u001b[22m\n\nReceived promise resolved instead of rejected\nResolved to value: \u001b[31m{\"currentFile\": \"..\\\\..\\\\Dev\\\\ambiance-mcp\\\\package.json\", \"embeddings\": 0, \"errors\": [\"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", …], \"processedChunks\": 0, \"processedFiles\": 11, \"totalChunks\": 11, \"totalFiles\": 11}\u001b[39m\n at expect (C:\\Dev\\ambiance-mcp\\node_modules\\expect\\build\\index.js:113:15)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingGenerator.test.ts:415:13)\n at Promise.then.completed (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:231:10)\n at _callCircusTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:316:40)\n at _runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:252:3)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:126:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at run (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:71:3)\n at runAndTransformResultsToJestFormat (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapterInit.js:122:21)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:79:19)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingGenerator Error Handling should handle invalid project paths","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle invalid project paths"},{"ancestorTitles":["LocalEmbeddingGenerator","Configuration and Environment"],"duration":7,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\nExpected number of calls: >= \u001b[32m1\u001b[39m\nReceived number of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\nExpected number of calls: >= \u001b[32m1\u001b[39m\nReceived number of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingGenerator.test.ts:434:48)"],"fullName":"LocalEmbeddingGenerator Configuration and Environment should respect environment variable configurations","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should respect environment variable configurations"},{"ancestorTitles":["LocalEmbeddingGenerator","Configuration and Environment"],"duration":7,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\nExpected number of calls: >= \u001b[32m1\u001b[39m\nReceived number of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\nExpected number of calls: >= \u001b[32m1\u001b[39m\nReceived number of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingGenerator.test.ts:450:48)"],"fullName":"LocalEmbeddingGenerator Configuration and Environment should handle missing environment configurations gracefully","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle missing environment configurations gracefully"},{"ancestorTitles":["LocalEmbeddingGenerator","Progress Tracking"],"duration":9,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator Progress Tracking should provide detailed progress information","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"status":"passed","title":"should provide detailed progress information"},{"ancestorTitles":["LocalEmbeddingGenerator","Progress Tracking"],"duration":7,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator Progress Tracking should track errors in progress","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should track errors in progress"},{"ancestorTitles":["LocalEmbeddingGenerator","Edge Cases"],"duration":10,"failureDetails":[{"matcherResult":{"actual":11,"expected":0,"message":"\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m0\u001b[39m\nReceived: \u001b[31m11\u001b[39m","name":"toBe","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m0\u001b[39m\nReceived: \u001b[31m11\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingGenerator.test.ts:499:35)"],"fullName":"LocalEmbeddingGenerator Edge Cases should handle empty file list","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle empty file list"},{"ancestorTitles":["LocalEmbeddingGenerator","Edge Cases"],"duration":6,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingGenerator Edge Cases should handle files with no content","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle files with no content"},{"ancestorTitles":["LocalEmbeddingGenerator","Edge Cases"],"duration":10,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\nExpected number of calls: >= \u001b[32m1\u001b[39m\nReceived number of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\nExpected number of calls: >= \u001b[32m1\u001b[39m\nReceived number of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingGenerator.test.ts:545:48)"],"fullName":"LocalEmbeddingGenerator Edge Cases should handle very large files","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle very large files"}],"endTime":1758320439279,"message":"\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingGenerator › generateProjectEmbeddings › should handle file patterns filter\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\n Expected number of calls: >= \u001b[32m1\u001b[39m\n Received number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 223 |\u001b[39m \u001b[36mawait\u001b[39m generator\u001b[33m.\u001b[39mgenerateProjectEmbeddings(mockProjectId\u001b[33m,\u001b[39m mockProjectPath\u001b[33m,\u001b[39m options)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 224 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 225 |\u001b[39m expect(mockApiClient\u001b[33m.\u001b[39mgenerateEmbeddings)\u001b[33m.\u001b[39mtoHaveBeenCalled()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 226 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 227 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 228 |\u001b[39m test(\u001b[32m'should handle parallel mode'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingGenerator.test.ts\u001b[39m\u001b[0m\u001b[2m:225:48)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingGenerator › generateProjectEmbeddings › should handle chunking options\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\n Expected number of calls: >= \u001b[32m1\u001b[39m\n Received number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 267 |\u001b[39m \u001b[36mawait\u001b[39m generator\u001b[33m.\u001b[39mgenerateProjectEmbeddings(mockProjectId\u001b[33m,\u001b[39m mockProjectPath\u001b[33m,\u001b[39m options)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 268 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 269 |\u001b[39m expect(mockApiClient\u001b[33m.\u001b[39mgenerateEmbeddings)\u001b[33m.\u001b[39mtoHaveBeenCalled()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 270 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 271 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 272 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingGenerator.test.ts\u001b[39m\u001b[0m\u001b[2m:269:48)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingGenerator › generateQueryEmbedding › should generate embedding for query text\u001b[39m\u001b[22m\n\n Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 941 |\u001b[39m \u001b[33m.\u001b[39mmap(p \u001b[33m=>\u001b[39m \u001b[32m`${p.name}: ${p.available ? 'available' : 'not available'}`\u001b[39m)\u001b[22m\n\u001b[2m \u001b[90m 942 |\u001b[39m \u001b[33m.\u001b[39mjoin(\u001b[32m', '\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 943 |\u001b[39m \u001b[36mthrow\u001b[39m \u001b[36mnew\u001b[39m \u001b[33mError\u001b[39m(\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 944 |\u001b[39m \u001b[32m`Embedding generation failed with all providers. `\u001b[39m \u001b[33m+\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 945 |\u001b[39m \u001b[32m`Available providers: ${availableProviders}. `\u001b[39m \u001b[33m+\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 946 |\u001b[39m \u001b[32m`Check API keys, network connectivity, and provider configurations.`\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat LocalEmbeddingGenerator.generateBatchEmbeddings (\u001b[22m\u001b[2msrc/local/embeddingGenerator.ts\u001b[2m:943:11)\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat LocalEmbeddingGenerator.generateQueryEmbedding (\u001b[22m\u001b[2msrc/local/embeddingGenerator.ts\u001b[2m:1019:24)\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingGenerator.test.ts\u001b[39m\u001b[0m\u001b[2m:286:22)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingGenerator › generateQueryEmbedding › should handle empty query\u001b[39m\u001b[22m\n\n No valid texts provided for embedding generation\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 743 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 744 |\u001b[39m \u001b[36mif\u001b[39m (validTexts\u001b[33m.\u001b[39mlength \u001b[33m===\u001b[39m \u001b[35m0\u001b[39m) {\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 745 |\u001b[39m \u001b[36mthrow\u001b[39m \u001b[36mnew\u001b[39m \u001b[33mError\u001b[39m(\u001b[32m'No valid texts provided for embedding generation'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 746 |\u001b[39m }\u001b[22m\n\u001b[2m \u001b[90m 747 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 748 |\u001b[39m \u001b[90m// Provider priority: Ambiance API → OpenAI → Local\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat LocalEmbeddingGenerator.generateBatchEmbeddings (\u001b[22m\u001b[2msrc/local/embeddingGenerator.ts\u001b[2m:745:13)\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat LocalEmbeddingGenerator.generateQueryEmbedding (\u001b[22m\u001b[2msrc/local/embeddingGenerator.ts\u001b[2m:1019:35)\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingGenerator.test.ts\u001b[39m\u001b[0m\u001b[2m:305:38)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingGenerator › generateQueryEmbedding › should use project-specific embedding generation when projectId provided\u001b[39m\u001b[22m\n\n Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 941 |\u001b[39m \u001b[33m.\u001b[39mmap(p \u001b[33m=>\u001b[39m \u001b[32m`${p.name}: ${p.available ? 'available' : 'not available'}`\u001b[39m)\u001b[22m\n\u001b[2m \u001b[90m 942 |\u001b[39m \u001b[33m.\u001b[39mjoin(\u001b[32m', '\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 943 |\u001b[39m \u001b[36mthrow\u001b[39m \u001b[36mnew\u001b[39m \u001b[33mError\u001b[39m(\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 944 |\u001b[39m \u001b[32m`Embedding generation failed with all providers. `\u001b[39m \u001b[33m+\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 945 |\u001b[39m \u001b[32m`Available providers: ${availableProviders}. `\u001b[39m \u001b[33m+\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 946 |\u001b[39m \u001b[32m`Check API keys, network connectivity, and provider configurations.`\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat LocalEmbeddingGenerator.generateBatchEmbeddings (\u001b[22m\u001b[2msrc/local/embeddingGenerator.ts\u001b[2m:943:11)\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat LocalEmbeddingGenerator.generateQueryEmbedding (\u001b[22m\u001b[2msrc/local/embeddingGenerator.ts\u001b[2m:1019:24)\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingGenerator.test.ts\u001b[39m\u001b[0m\u001b[2m:328:7)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingGenerator › dispose › should close storage connection\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\n Expected number of calls: >= \u001b[32m1\u001b[39m\n Received number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 336 |\u001b[39m \u001b[36mawait\u001b[39m generator\u001b[33m.\u001b[39mdispose()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 337 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 338 |\u001b[39m expect(mockStorage\u001b[33m.\u001b[39mclose)\u001b[33m.\u001b[39mtoHaveBeenCalled()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 339 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 340 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 341 |\u001b[39m test(\u001b[32m'should handle dispose errors gracefully'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingGenerator.test.ts\u001b[39m\u001b[0m\u001b[2m:338:33)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingGenerator › dispose › should handle dispose errors gracefully\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\n Expected number of calls: >= \u001b[32m1\u001b[39m\n Received number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 344 |\u001b[39m \u001b[36mawait\u001b[39m expect(generator\u001b[33m.\u001b[39mdispose())\u001b[33m.\u001b[39mresolves\u001b[33m.\u001b[39mtoBeUndefined()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 345 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 346 |\u001b[39m expect(mockLogger\u001b[33m.\u001b[39merror)\u001b[33m.\u001b[39mtoHaveBeenCalled()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 347 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 348 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 349 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingGenerator.test.ts\u001b[39m\u001b[0m\u001b[2m:346:32)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingGenerator › Provider Fallback Logic › should attempt Ambiance API first when key available\u001b[39m\u001b[22m\n\n Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 941 |\u001b[39m \u001b[33m.\u001b[39mmap(p \u001b[33m=>\u001b[39m \u001b[32m`${p.name}: ${p.available ? 'available' : 'not available'}`\u001b[39m)\u001b[22m\n\u001b[2m \u001b[90m 942 |\u001b[39m \u001b[33m.\u001b[39mjoin(\u001b[32m', '\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 943 |\u001b[39m \u001b[36mthrow\u001b[39m \u001b[36mnew\u001b[39m \u001b[33mError\u001b[39m(\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 944 |\u001b[39m \u001b[32m`Embedding generation failed with all providers. `\u001b[39m \u001b[33m+\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 945 |\u001b[39m \u001b[32m`Available providers: ${availableProviders}. `\u001b[39m \u001b[33m+\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 946 |\u001b[39m \u001b[32m`Check API keys, network connectivity, and provider configurations.`\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat LocalEmbeddingGenerator.generateBatchEmbeddings (\u001b[22m\u001b[2msrc/local/embeddingGenerator.ts\u001b[2m:943:11)\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat LocalEmbeddingGenerator.generateQueryEmbedding (\u001b[22m\u001b[2msrc/local/embeddingGenerator.ts\u001b[2m:1019:24)\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingGenerator.test.ts\u001b[39m\u001b[0m\u001b[2m:357:7)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingGenerator › Provider Fallback Logic › should handle Ambiance API errors gracefully\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mrejects\u001b[2m.\u001b[22mtoThrow\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected substring: \u001b[32m\"Ambiance API failed\"\u001b[39m\n Received message: \u001b[31m\"Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\"\u001b[39m\n\n \u001b[0m \u001b[90m 941 |\u001b[39m \u001b[33m.\u001b[39mmap(p \u001b[33m=>\u001b[39m \u001b[32m`${p.name}: ${p.available ? 'available' : 'not available'}`\u001b[39m)\n \u001b[90m 942 |\u001b[39m \u001b[33m.\u001b[39mjoin(\u001b[32m', '\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 943 |\u001b[39m \u001b[36mthrow\u001b[39m \u001b[36mnew\u001b[39m \u001b[33mError\u001b[39m(\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 944 |\u001b[39m \u001b[32m`Embedding generation failed with all providers. `\u001b[39m \u001b[33m+\u001b[39m\n \u001b[90m 945 |\u001b[39m \u001b[32m`Available providers: ${availableProviders}. `\u001b[39m \u001b[33m+\u001b[39m\n \u001b[90m 946 |\u001b[39m \u001b[32m`Check API keys, network connectivity, and provider configurations.`\u001b[39m\u001b[0m\n\n \u001b[2mat LocalEmbeddingGenerator.generateBatchEmbeddings (\u001b[22msrc/local/embeddingGenerator.ts\u001b[2m:943:11)\u001b[22m\n \u001b[2mat LocalEmbeddingGenerator.generateQueryEmbedding (\u001b[22msrc/local/embeddingGenerator.ts\u001b[2m:1019:24)\u001b[22m\n \u001b[2mat Object.<anonymous> (\u001b[22msrc/local/__tests__/embeddingGenerator.test.ts\u001b[2m:366:7)\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 364 |\u001b[39m mockApiClient\u001b[33m.\u001b[39mpost\u001b[33m.\u001b[39mmockRejectedValue(\u001b[36mnew\u001b[39m \u001b[33mError\u001b[39m(\u001b[32m'Ambiance API failed'\u001b[39m))\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 365 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 366 |\u001b[39m \u001b[36mawait\u001b[39m expect(generator\u001b[33m.\u001b[39mgenerateQueryEmbedding(\u001b[32m'test'\u001b[39m))\u001b[33m.\u001b[39mrejects\u001b[33m.\u001b[39mtoThrow(\u001b[32m'Ambiance API failed'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 367 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 368 |\u001b[39m expect(mockLogger\u001b[33m.\u001b[39merror)\u001b[33m.\u001b[39mtoHaveBeenCalled()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 369 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.toThrow (\u001b[22m\u001b[2mnode_modules/expect/build/index.js\u001b[2m:218:22)\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingGenerator.test.ts\u001b[39m\u001b[0m\u001b[2m:366:70)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingGenerator › Error Handling › should handle file system errors\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mrejects\u001b[2m.\u001b[22mtoThrow\u001b[2m()\u001b[22m\n\n Received promise resolved instead of rejected\n Resolved to value: \u001b[31m{\"currentFile\": \"..\\\\..\\\\Dev\\\\ambiance-mcp\\\\package.json\", \"embeddings\": 0, \"errors\": [\"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", …], \"processedChunks\": 0, \"processedFiles\": 11, \"totalChunks\": 11, \"totalFiles\": 11}\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 402 |\u001b[39m }))\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 403 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 404 |\u001b[39m \u001b[36mawait\u001b[39m expect(\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 405 |\u001b[39m generator\u001b[33m.\u001b[39mgenerateProjectEmbeddings(\u001b[32m'test'\u001b[39m\u001b[33m,\u001b[39m \u001b[32m'/invalid/path'\u001b[39m)\u001b[22m\n\u001b[2m \u001b[90m 406 |\u001b[39m )\u001b[33m.\u001b[39mrejects\u001b[33m.\u001b[39mtoThrow(\u001b[32m'File system error'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 407 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat expect (\u001b[22m\u001b[2mnode_modules/expect/build/index.js\u001b[2m:113:15)\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingGenerator.test.ts\u001b[39m\u001b[0m\u001b[2m:404:13)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingGenerator › Error Handling › should handle invalid project paths\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mrejects\u001b[2m.\u001b[22mtoThrow\u001b[2m()\u001b[22m\n\n Received promise resolved instead of rejected\n Resolved to value: \u001b[31m{\"currentFile\": \"..\\\\..\\\\Dev\\\\ambiance-mcp\\\\package.json\", \"embeddings\": 0, \"errors\": [\"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", \"Failed to generate embeddings: Embedding generation failed with all providers. Available providers: ambiance: not available, openai: not available, local: available. Check API keys, network connectivity, and provider configurations.\", …], \"processedChunks\": 0, \"processedFiles\": 11, \"totalChunks\": 11, \"totalFiles\": 11}\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 413 |\u001b[39m }))\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 414 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 415 |\u001b[39m \u001b[36mawait\u001b[39m expect(\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 416 |\u001b[39m generator\u001b[33m.\u001b[39mgenerateProjectEmbeddings(\u001b[32m'test'\u001b[39m\u001b[33m,\u001b[39m \u001b[32m'/nonexistent/path'\u001b[39m)\u001b[22m\n\u001b[2m \u001b[90m 417 |\u001b[39m )\u001b[33m.\u001b[39mrejects\u001b[33m.\u001b[39mtoThrow()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 418 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat expect (\u001b[22m\u001b[2mnode_modules/expect/build/index.js\u001b[2m:113:15)\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingGenerator.test.ts\u001b[39m\u001b[0m\u001b[2m:415:13)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingGenerator › Configuration and Environment › should respect environment variable configurations\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\n Expected number of calls: >= \u001b[32m1\u001b[39m\n Received number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 432 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 433 |\u001b[39m \u001b[90m// Environment variables should be respected\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 434 |\u001b[39m expect(mockApiClient\u001b[33m.\u001b[39mgenerateEmbeddings)\u001b[33m.\u001b[39mtoHaveBeenCalled()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 435 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 436 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 437 |\u001b[39m test(\u001b[32m'should handle missing environment configurations gracefully'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingGenerator.test.ts\u001b[39m\u001b[0m\u001b[2m:434:48)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingGenerator › Configuration and Environment › should handle missing environment configurations gracefully\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\n Expected number of calls: >= \u001b[32m1\u001b[39m\n Received number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 448 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 449 |\u001b[39m \u001b[90m// Should use default values\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 450 |\u001b[39m expect(mockApiClient\u001b[33m.\u001b[39mgenerateEmbeddings)\u001b[33m.\u001b[39mtoHaveBeenCalled()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 451 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 452 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 453 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingGenerator.test.ts\u001b[39m\u001b[0m\u001b[2m:450:48)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingGenerator › Edge Cases › should handle empty file list\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\n Expected: \u001b[32m0\u001b[39m\n Received: \u001b[31m11\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 497 |\u001b[39m \u001b[36mconst\u001b[39m progress \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m generator\u001b[33m.\u001b[39mgenerateProjectEmbeddings(\u001b[32m'test'\u001b[39m\u001b[33m,\u001b[39m \u001b[32m'/empty/path'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 498 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 499 |\u001b[39m expect(progress\u001b[33m.\u001b[39mtotalFiles)\u001b[33m.\u001b[39mtoBe(\u001b[35m0\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 500 |\u001b[39m expect(progress\u001b[33m.\u001b[39mprocessedFiles)\u001b[33m.\u001b[39mtoBe(\u001b[35m0\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 501 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 502 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingGenerator.test.ts\u001b[39m\u001b[0m\u001b[2m:499:35)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingGenerator › Edge Cases › should handle very large files\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\n Expected number of calls: >= \u001b[32m1\u001b[39m\n Received number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 543 |\u001b[39m \u001b[36mawait\u001b[39m generator\u001b[33m.\u001b[39mgenerateProjectEmbeddings(\u001b[32m'test'\u001b[39m\u001b[33m,\u001b[39m \u001b[32m'/path'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 544 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 545 |\u001b[39m expect(mockApiClient\u001b[33m.\u001b[39mgenerateEmbeddings)\u001b[33m.\u001b[39mtoHaveBeenCalled()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 546 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 547 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 548 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingGenerator.test.ts\u001b[39m\u001b[0m\u001b[2m:545:48)\u001b[22m\u001b[2m\u001b[22m\n","name":"C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingGenerator.test.ts","startTime":1758320431191,"status":"failed","summary":""},{"assertionResults":[{"ancestorTitles":["Ambiance MCP API Integration","API Client Integration"],"duration":28,"failureDetails":[],"failureMessages":[],"fullName":"Ambiance MCP API Integration API Client Integration should successfully connect to mock API server","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should successfully connect to mock API server"},{"ancestorTitles":["Ambiance MCP API Integration","API Client Integration"],"duration":25,"failureDetails":[],"failureMessages":[],"fullName":"Ambiance MCP API Integration API Client Integration should fail with invalid API key","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should fail with invalid API key"},{"ancestorTitles":["Ambiance MCP API Integration","API Client Integration"],"duration":21,"failureDetails":[],"failureMessages":[],"fullName":"Ambiance MCP API Integration API Client Integration should generate embeddings with valid key","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"status":"passed","title":"should generate embeddings with valid key"},{"ancestorTitles":["Ambiance MCP API Integration","MCP Server Integration"],"duration":8,"failureDetails":[],"failureMessages":[],"fullName":"Ambiance MCP API Integration MCP Server Integration should initialize with valid API key","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should initialize with valid API key"},{"ancestorTitles":["Ambiance MCP API Integration","MCP Server Integration"],"duration":9,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"⚠️ Ambiance API key detected but validation failed - cloud tools disabled\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"⚠️ Ambiance API key detected but validation failed - cloud tools disabled\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\__tests__\\integration\\api-integration.test.ts:124:27)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"Ambiance MCP API Integration MCP Server Integration should handle invalid API key gracefully","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle invalid API key gracefully"},{"ancestorTitles":["Ambiance MCP API Integration","MCP Server Integration"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Ambiance MCP API Integration MCP Server Integration should work without API key (local mode)","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should work without API key (local mode)"},{"ancestorTitles":["Ambiance MCP API Integration","Error Scenarios"],"duration":10,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"⚠️ Ambiance API key detected but validation failed - cloud tools disabled\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"⚠️ Ambiance API key detected but validation failed - cloud tools disabled\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\__tests__\\integration\\api-integration.test.ts:158:27)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"Ambiance MCP API Integration Error Scenarios should handle API server errors","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle API server errors"}],"endTime":1758320439398,"message":"\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAmbiance MCP API Integration › MCP Server Integration › should handle invalid API key gracefully\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32m\"⚠️ Ambiance API key detected but validation failed - cloud tools disabled\"\u001b[39m\n\n Number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 122 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 123 |\u001b[39m \u001b[90m// The server should have logged validation failure\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 124 |\u001b[39m expect(logger\u001b[33m.\u001b[39mwarn)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[32m'⚠️ Ambiance API key detected but validation failed - cloud tools disabled'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 125 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 126 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 127 |\u001b[39m test(\u001b[32m'should work without API key (local mode)'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/__tests__/integration/api-integration.test.ts\u001b[39m\u001b[0m\u001b[2m:124:27)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAmbiance MCP API Integration › Error Scenarios › should handle API server errors\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32m\"⚠️ Ambiance API key detected but validation failed - cloud tools disabled\"\u001b[39m\n\n Number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 156 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 157 |\u001b[39m \u001b[90m// The server should handle the API error gracefully\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 158 |\u001b[39m expect(logger\u001b[33m.\u001b[39mwarn)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[32m'⚠️ Ambiance API key detected but validation failed - cloud tools disabled'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 159 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 160 |\u001b[39m \u001b[36mawait\u001b[39m errorServer\u001b[33m.\u001b[39mstop()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 161 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/__tests__/integration/api-integration.test.ts\u001b[39m\u001b[0m\u001b[2m:158:27)\u001b[22m\u001b[2m\u001b[22m\n","name":"C:\\Dev\\ambiance-mcp\\src\\__tests__\\integration\\api-integration.test.ts","startTime":1758320431251,"status":"failed","summary":""},{"assertionResults":[{"ancestorTitles":["Ambiance MCP E2E Workflows","Local Mode E2E"],"duration":12,"failureDetails":[],"failureMessages":[],"fullName":"Ambiance MCP E2E Workflows Local Mode E2E should complete full workflow without API keys","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should complete full workflow without API keys"},{"ancestorTitles":["Ambiance MCP E2E Workflows","Cloud Mode E2E"],"duration":19,"failureDetails":[],"failureMessages":[],"fullName":"Ambiance MCP E2E Workflows Cloud Mode E2E should complete full workflow with valid API key","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should complete full workflow with valid API key"},{"ancestorTitles":["Ambiance MCP E2E Workflows","Fallback Mode E2E"],"duration":5,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"⚠️ Ambiance API key detected but validation failed - cloud tools disabled\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"⚠️ Ambiance API key detected but validation failed - cloud tools disabled\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\__tests__\\integration\\e2e-workflow.test.ts:112:27)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"Ambiance MCP E2E Workflows Fallback Mode E2E should gracefully handle invalid API key and continue with local tools","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should gracefully handle invalid API key and continue with local tools"},{"ancestorTitles":["Ambiance MCP E2E Workflows","Error Recovery E2E"],"duration":5,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"⚠️ Ambiance API key detected but validation failed - cloud tools disabled\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"⚠️ Ambiance API key detected but validation failed - cloud tools disabled\"\u001b[39m\n\nNumber of calls: \u001b[31m0\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\__tests__\\integration\\e2e-workflow.test.ts:135:27)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"Ambiance MCP E2E Workflows Error Recovery E2E should handle server startup errors gracefully","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle server startup errors gracefully"}],"endTime":1758320439471,"message":"\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAmbiance MCP E2E Workflows › Fallback Mode E2E › should gracefully handle invalid API key and continue with local tools\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32m\"⚠️ Ambiance API key detected but validation failed - cloud tools disabled\"\u001b[39m\n\n Number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 110 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 111 |\u001b[39m \u001b[90m// Verify server handled invalid key gracefully and continued\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 112 |\u001b[39m expect(logger\u001b[33m.\u001b[39mwarn)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[32m'⚠️ Ambiance API key detected but validation failed - cloud tools disabled'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 113 |\u001b[39m expect(logger\u001b[33m.\u001b[39minfo)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[32m'✅ MCP Server ready for requests'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 114 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 115 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/__tests__/integration/e2e-workflow.test.ts\u001b[39m\u001b[0m\u001b[2m:112:27)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAmbiance MCP E2E Workflows › Error Recovery E2E › should handle server startup errors gracefully\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32m\"⚠️ Ambiance API key detected but validation failed - cloud tools disabled\"\u001b[39m\n\n Number of calls: \u001b[31m0\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 133 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 134 |\u001b[39m \u001b[90m// Verify server handled errors and still started\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 135 |\u001b[39m expect(logger\u001b[33m.\u001b[39mwarn)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[32m'⚠️ Ambiance API key detected but validation failed - cloud tools disabled'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 136 |\u001b[39m expect(logger\u001b[33m.\u001b[39minfo)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[32m'✅ MCP Server ready for requests'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 137 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 138 |\u001b[39m \u001b[36mawait\u001b[39m errorServer\u001b[33m.\u001b[39mstop()\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/__tests__/integration/e2e-workflow.test.ts\u001b[39m\u001b[0m\u001b[2m:135:27)\u001b[22m\u001b[2m\u001b[22m\n","name":"C:\\Dev\\ambiance-mcp\\src\\__tests__\\integration\\e2e-workflow.test.ts","startTime":1758320431222,"status":"failed","summary":""},{"assertionResults":[{"ancestorTitles":["Lightweight Tools Integration","local_context (handleSemanticCompact)"],"duration":79,"failureDetails":[],"failureMessages":[],"fullName":"Lightweight Tools Integration local_context (handleSemanticCompact) should compress project context successfully","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"should compress project context successfully"},{"ancestorTitles":["Lightweight Tools Integration","local_context (handleSemanticCompact)"],"duration":229,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: \u001b[32m\"Local Context Analysis\"\u001b[39m\nReceived string: \u001b[31m\"## Query Analysis·\u001b[39m\n\u001b[31mNo specific code locations found for \\\"your request\\\" using auth analysis pattern. Consider looking for authentication middleware, login handlers, or token management.·\u001b[39m\n\u001b[31m## Next Actions·\u001b[39m\n\u001b[31m**Mode**: project_research·\u001b[39m\n\u001b[31m**Verification commands**:\u001b[39m\n\u001b[31m- `npm test 2>&1 | head -20`\u001b[39m\n\u001b[31m- `grep -r \\\"TODO\\\\|FIXME\\\" src/ | head -10`·\u001b[39m\n\u001b[31m---·\u001b[39m\n\u001b[31m**Analysis Stats**: 9 files scanned, 0 symbols considered, 0 tokens in output, processed in 214ms\"\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: \u001b[32m\"Local Context Analysis\"\u001b[39m\nReceived string: \u001b[31m\"## Query Analysis·\u001b[39m\n\u001b[31mNo specific code locations found for \\\"your request\\\" using auth analysis pattern. Consider looking for authentication middleware, login handlers, or token management.·\u001b[39m\n\u001b[31m## Next Actions·\u001b[39m\n\u001b[31m**Mode**: project_research·\u001b[39m\n\u001b[31m**Verification commands**:\u001b[39m\n\u001b[31m- `npm test 2>&1 | head -20`\u001b[39m\n\u001b[31m- `grep -r \\\"TODO\\\\|FIXME\\\" src/ | head -10`·\u001b[39m\n\u001b[31m---·\u001b[39m\n\u001b[31m**Analysis Stats**: 9 files scanned, 0 symbols considered, 0 tokens in output, processed in 214ms\"\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\tools\\__tests__\\lightweightTools.integration.test.ts:144:39)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"Lightweight Tools Integration local_context (handleSemanticCompact) should handle focused queries","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"failed","title":"should handle focused queries"},{"ancestorTitles":["Lightweight Tools Integration","local_context (handleSemanticCompact)"],"duration":30,"failureDetails":[],"failureMessages":[],"fullName":"Lightweight Tools Integration local_context (handleSemanticCompact) should handle invalid project paths gracefully","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle invalid project paths gracefully"},{"ancestorTitles":["Lightweight Tools Integration","local_project_hints (handleProjectHints)"],"duration":null,"failureDetails":[],"failureMessages":[],"fullName":"Lightweight Tools Integration local_project_hints (handleProjectHints) should generate project structure hints","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"pending","title":"should generate project structure hints"},{"ancestorTitles":["Lightweight Tools Integration","local_project_hints (handleProjectHints)"],"duration":22,"failureDetails":[],"failureMessages":[],"fullName":"Lightweight Tools Integration local_project_hints (handleProjectHints) should generate compact format hints","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should generate compact format hints"},{"ancestorTitles":["Lightweight Tools Integration","local_project_hints (handleProjectHints)"],"duration":9,"failureDetails":[],"failureMessages":[],"fullName":"Lightweight Tools Integration local_project_hints (handleProjectHints) should handle folder-specific hints","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should handle folder-specific hints"},{"ancestorTitles":["Lightweight Tools Integration","local_file_summary (handleFileSummary)"],"duration":17,"failureDetails":[],"failureMessages":[],"fullName":"Lightweight Tools Integration local_file_summary (handleFileSummary) should analyze TypeScript files","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should analyze TypeScript files"},{"ancestorTitles":["Lightweight Tools Integration","local_file_summary (handleFileSummary)"],"duration":8,"failureDetails":[],"failureMessages":[],"fullName":"Lightweight Tools Integration local_file_summary (handleFileSummary) should handle non-existent files gracefully","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should handle non-existent files gracefully"},{"ancestorTitles":["Lightweight Tools Integration","local_file_summary (handleFileSummary)"],"duration":8,"failureDetails":[],"failureMessages":[],"fullName":"Lightweight Tools Integration local_file_summary (handleFileSummary) should limit symbol count correctly","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should limit symbol count correctly"}],"endTime":1758320439486,"message":"\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLightweight Tools Integration › local_context (handleSemanticCompact) › should handle focused queries\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\n Expected substring: \u001b[32m\"Local Context Analysis\"\u001b[39m\n Received string: \u001b[31m\"## Query Analysis·\u001b[39m\n \u001b[31mNo specific code locations found for \\\"your request\\\" using auth analysis pattern. Consider looking for authentication middleware, login handlers, or token management.·\u001b[39m\n \u001b[31m## Next Actions·\u001b[39m\n \u001b[31m**Mode**: project_research·\u001b[39m\n \u001b[31m**Verification commands**:\u001b[39m\n \u001b[31m- `npm test 2>&1 | head -20`\u001b[39m\n \u001b[31m- `grep -r \\\"TODO\\\\|FIXME\\\" src/ | head -10`·\u001b[39m\n \u001b[31m---·\u001b[39m\n \u001b[31m**Analysis Stats**: 9 files scanned, 0 symbols considered, 0 tokens in output, processed in 214ms\"\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 142 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 143 |\u001b[39m expect(result\u001b[33m.\u001b[39msuccess)\u001b[33m.\u001b[39mtoBe(\u001b[36mtrue\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 144 |\u001b[39m expect(result\u001b[33m.\u001b[39mcompactedContent)\u001b[33m.\u001b[39mtoContain(\u001b[32m'Local Context Analysis'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 145 |\u001b[39m expect(result\u001b[33m.\u001b[39mcompactedContent)\u001b[33m.\u001b[39mtoContain(\u001b[32m'authentication'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 146 |\u001b[39m }\u001b[33m,\u001b[39m \u001b[35m10000\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 147 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/tools/__tests__/lightweightTools.integration.test.ts\u001b[39m\u001b[0m\u001b[2m:144:39)\u001b[22m\u001b[2m\u001b[22m\n","name":"C:\\Dev\\ambiance-mcp\\src\\tools\\__tests__\\lightweightTools.integration.test.ts","startTime":1758320431207,"status":"failed","summary":""},{"assertionResults":[{"ancestorTitles":["Ignore Pattern Processing","loadIgnorePatterns"],"duration":10,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing loadIgnorePatterns should load patterns from .gitignore","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"should load patterns from .gitignore"},{"ancestorTitles":["Ignore Pattern Processing","loadIgnorePatterns"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing loadIgnorePatterns should load patterns from .cursorignore","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should load patterns from .cursorignore"},{"ancestorTitles":["Ignore Pattern Processing","loadIgnorePatterns"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing loadIgnorePatterns should load patterns from .vscodeignore","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should load patterns from .vscodeignore"},{"ancestorTitles":["Ignore Pattern Processing","loadIgnorePatterns"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing loadIgnorePatterns should load patterns from .ambianceignore","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should load patterns from .ambianceignore"},{"ancestorTitles":["Ignore Pattern Processing","loadIgnorePatterns"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing loadIgnorePatterns should combine patterns from multiple ignore files","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"status":"passed","title":"should combine patterns from multiple ignore files"},{"ancestorTitles":["Ignore Pattern Processing","loadIgnorePatterns"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing loadIgnorePatterns should include default ignore patterns","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"should include default ignore patterns"},{"ancestorTitles":["Ignore Pattern Processing","loadIgnorePatterns"],"duration":140,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing loadIgnorePatterns should handle file read errors gracefully","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle file read errors gracefully"},{"ancestorTitles":["Ignore Pattern Processing","parseIgnoreFile"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing parseIgnoreFile should parse ignore file content correctly","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should parse ignore file content correctly"},{"ancestorTitles":["Ignore Pattern Processing","parseIgnoreFile"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing parseIgnoreFile should handle Windows line endings","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle Windows line endings"},{"ancestorTitles":["Ignore Pattern Processing","parseIgnoreFile"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing parseIgnoreFile should trim whitespace from patterns","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should trim whitespace from patterns"},{"ancestorTitles":["Ignore Pattern Processing","parseIgnoreFile"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing parseIgnoreFile should handle empty content","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle empty content"},{"ancestorTitles":["Ignore Pattern Processing","parseIgnoreFile"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing parseIgnoreFile should ignore lines starting with #","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should ignore lines starting with #"},{"ancestorTitles":["Ignore Pattern Processing","shouldIgnoreFile"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing shouldIgnoreFile should match simple patterns","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"status":"passed","title":"should match simple patterns"},{"ancestorTitles":["Ignore Pattern Processing","shouldIgnoreFile"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing shouldIgnoreFile should match wildcard patterns","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"should match wildcard patterns"},{"ancestorTitles":["Ignore Pattern Processing","shouldIgnoreFile"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing shouldIgnoreFile should match directory patterns","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"should match directory patterns"},{"ancestorTitles":["Ignore Pattern Processing","shouldIgnoreFile"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing shouldIgnoreFile should handle relative paths correctly","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should handle relative paths correctly"},{"ancestorTitles":["Ignore Pattern Processing","shouldIgnoreFile"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing shouldIgnoreFile should be case-sensitive by default","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should be case-sensitive by default"},{"ancestorTitles":["Ignore Pattern Processing","shouldIgnoreFile"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing shouldIgnoreFile should handle negation patterns","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should handle negation patterns"},{"ancestorTitles":["Ignore Pattern Processing","shouldIgnoreFile"],"duration":10,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing shouldIgnoreFile should handle complex glob patterns","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"should handle complex glob patterns"},{"ancestorTitles":["Ignore Pattern Processing","shouldIgnoreFile"],"duration":5,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing shouldIgnoreFile should handle empty patterns array","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle empty patterns array"},{"ancestorTitles":["Ignore Pattern Processing","Pattern Priority and Ordering"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing Pattern Priority and Ordering should respect pattern order for negation","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should respect pattern order for negation"},{"ancestorTitles":["Ignore Pattern Processing","Pattern Priority and Ordering"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing Pattern Priority and Ordering should handle multiple negations","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should handle multiple negations"},{"ancestorTitles":["Ignore Pattern Processing","Performance"],"duration":4601,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeLessThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: < \u001b[32m1000\u001b[39m\nReceived: \u001b[31m4599\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeLessThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: < \u001b[32m1000\u001b[39m\nReceived: \u001b[31m4599\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\ignorePatterns.test.ts:375:35)\n at Promise.then.completed (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:231:10)\n at _callCircusTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:252:3)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:126:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at run (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:71:3)\n at runAndTransformResultsToJestFormat (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapterInit.js:122:21)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:79:19)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"Ignore Pattern Processing Performance should handle large numbers of patterns efficiently","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle large numbers of patterns efficiently"},{"ancestorTitles":["Ignore Pattern Processing","Edge Cases"],"duration":1,"failureDetails":[{"matcherResult":{"actual":false,"expected":true,"message":"\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mfalse\u001b[39m","name":"toBe","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mfalse\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\ignorePatterns.test.ts:383:62)\n at Promise.then.completed (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:231:10)\n at _callCircusTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:252:3)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:126:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at run (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:71:3)\n at runAndTransformResultsToJestFormat (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapterInit.js:122:21)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:79:19)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"Ignore Pattern Processing Edge Cases should handle files with special characters","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle files with special characters"},{"ancestorTitles":["Ignore Pattern Processing","Edge Cases"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing Edge Cases should handle unicode file names","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle unicode file names"},{"ancestorTitles":["Ignore Pattern Processing","Edge Cases"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing Edge Cases should handle very long file paths","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle very long file paths"},{"ancestorTitles":["Ignore Pattern Processing","Edge Cases"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Ignore Pattern Processing Edge Cases should handle malformed patterns gracefully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle malformed patterns gracefully"}],"endTime":1758320441965,"message":"\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mIgnore Pattern Processing › Performance › should handle large numbers of patterns efficiently\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeLessThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: < \u001b[32m1000\u001b[39m\n Received: \u001b[31m4599\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 373 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 374 |\u001b[39m \u001b[90m// Should complete in reasonable time (less than 1 second)\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 375 |\u001b[39m expect(endTime \u001b[33m-\u001b[39m startTime)\u001b[33m.\u001b[39mtoBeLessThan(\u001b[35m1000\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 376 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 377 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 378 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/ignorePatterns.test.ts\u001b[39m\u001b[0m\u001b[2m:375:35)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mIgnore Pattern Processing › Edge Cases › should handle files with special characters\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\n Expected: \u001b[32mtrue\u001b[39m\n Received: \u001b[31mfalse\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 381 |\u001b[39m \u001b[36mconst\u001b[39m patterns \u001b[33m=\u001b[39m [\u001b[32m'*[special].js'\u001b[39m\u001b[33m,\u001b[39m \u001b[32m'*(temp).txt'\u001b[39m]\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 382 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 383 |\u001b[39m expect(shouldIgnoreFile(\u001b[32m'file[special].js'\u001b[39m\u001b[33m,\u001b[39m patterns))\u001b[33m.\u001b[39mtoBe(\u001b[36mtrue\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 384 |\u001b[39m expect(shouldIgnoreFile(\u001b[32m'test(temp).txt'\u001b[39m\u001b[33m,\u001b[39m patterns))\u001b[33m.\u001b[39mtoBe(\u001b[36mtrue\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 385 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 386 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/ignorePatterns.test.ts\u001b[39m\u001b[0m\u001b[2m:383:62)\u001b[22m\u001b[2m\u001b[22m\n","name":"C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\ignorePatterns.test.ts","startTime":1758320431188,"status":"failed","summary":""},{"assertionResults":[{"ancestorTitles":["File Watching Functionality","startWatching"],"duration":11,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality startWatching should start watching a project directory","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should start watching a project directory"},{"ancestorTitles":["File Watching Functionality","startWatching"],"duration":18,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality startWatching should throw error when already watching the same path","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should throw error when already watching the same path"},{"ancestorTitles":["File Watching Functionality","startWatching"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality startWatching should allow watching multiple different paths","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should allow watching multiple different paths"},{"ancestorTitles":["File Watching Functionality","stopWatching"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality stopWatching should stop watching a project directory","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should stop watching a project directory"},{"ancestorTitles":["File Watching Functionality","stopWatching"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality stopWatching should handle stopping non-existent watcher gracefully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle stopping non-existent watcher gracefully"},{"ancestorTitles":["File Watching Functionality","stopWatching"],"duration":4,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mnot\u001b[2m.\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\nExpected number of calls: \u001b[32m0\u001b[39m\nReceived number of calls: \u001b[31m1\u001b[39m\n\n1: \u001b[31m\"\\\\test\\\\project\\\\src\\\\index.ts\"\u001b[39m","pass":true}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mnot\u001b[2m.\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\nExpected number of calls: \u001b[32m0\u001b[39m\nReceived number of calls: \u001b[31m1\u001b[39m\n\n1: \u001b[31m\"\\\\test\\\\project\\\\src\\\\index.ts\"\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\fileWatcher.test.ts:246:36)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"File Watching Functionality stopWatching should clear debounce timers when stopping","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should clear debounce timers when stopping"},{"ancestorTitles":["File Watching Functionality","file change handling"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality file change handling should handle file changes with debouncing","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should handle file changes with debouncing"},{"ancestorTitles":["File Watching Functionality","file change handling"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality file change handling should handle multiple files changing","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should handle multiple files changing"},{"ancestorTitles":["File Watching Functionality","file change handling"],"duration":11,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality file change handling should ignore files matching ignore patterns","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should ignore files matching ignore patterns"},{"ancestorTitles":["File Watching Functionality","file change handling"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality file change handling should ignore directory changes","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should ignore directory changes"},{"ancestorTitles":["File Watching Functionality","file change handling"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality file change handling should handle file stat errors gracefully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle file stat errors gracefully"},{"ancestorTitles":["File Watching Functionality","file change handling"],"duration":10009,"failureDetails":[{"message":"thrown: \"Exceeded timeout of 10000 ms for a test.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\""}],"failureMessages":["Error: thrown: \"Exceeded timeout of 10000 ms for a test.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\fileWatcher.test.ts:339:5\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\fileWatcher.test.ts:250:3\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\fileWatcher.test.ts:135:1)\n at Runtime._execModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1439:24)\n at Runtime._loadModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1022:12)\n at Runtime.requireModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:882:12)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"File Watching Functionality file change handling should handle errors in file change callback","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle errors in file change callback"},{"ancestorTitles":["File Watching Functionality","file change handling"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality file change handling should reset debounce timer for subsequent changes to same file","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should reset debounce timer for subsequent changes to same file"},{"ancestorTitles":["File Watching Functionality","ignore patterns"],"duration":1,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledTimes\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected number of calls: \u001b[32m1\u001b[39m\nReceived number of calls: \u001b[31m2\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledTimes\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected number of calls: \u001b[32m1\u001b[39m\nReceived number of calls: \u001b[31m2\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\fileWatcher.test.ts:405:32)"],"fullName":"File Watching Functionality ignore patterns should handle wildcard patterns","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle wildcard patterns"},{"ancestorTitles":["File Watching Functionality","ignore patterns"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality ignore patterns should handle directory patterns with **","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle directory patterns with **"},{"ancestorTitles":["File Watching Functionality","ignore patterns"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality ignore patterns should handle empty ignore patterns","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle empty ignore patterns"},{"ancestorTitles":["File Watching Functionality","watcher state management"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality watcher state management should track watched paths correctly","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should track watched paths correctly"},{"ancestorTitles":["File Watching Functionality","watcher state management"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality watcher state management should stop all watchers","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should stop all watchers"},{"ancestorTitles":["File Watching Functionality","edge cases"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality edge cases should handle null/undefined filenames from fs.watch","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle null/undefined filenames from fs.watch"},{"ancestorTitles":["File Watching Functionality","edge cases"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality edge cases should handle fs.watch errors","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle fs.watch errors"},{"ancestorTitles":["File Watching Functionality","edge cases"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality edge cases should handle very rapid file changes efficiently","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle very rapid file changes efficiently"},{"ancestorTitles":["File Watching Functionality","without callback"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"File Watching Functionality without callback should work without file change callback","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should work without file change callback"}],"endTime":1758320447334,"message":"\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mFile Watching Functionality › stopWatching › should clear debounce timers when stopping\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mnot\u001b[2m.\u001b[22mtoHaveBeenCalled\u001b[2m()\u001b[22m\n\n Expected number of calls: \u001b[32m0\u001b[39m\n Received number of calls: \u001b[31m1\u001b[39m\n\n 1: \u001b[31m\"\\\\test\\\\project\\\\src\\\\index.ts\"\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 244 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 245 |\u001b[39m \u001b[90m// File change handler should not have been called\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 246 |\u001b[39m expect(onFileChangeMock)\u001b[33m.\u001b[39mnot\u001b[33m.\u001b[39mtoHaveBeenCalled()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 247 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 248 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 249 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/fileWatcher.test.ts\u001b[39m\u001b[0m\u001b[2m:246:36)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mFile Watching Functionality › file change handling › should handle errors in file change callback\u001b[39m\u001b[22m\n\n thrown: \"Exceeded timeout of 10000 ms for a test.\n Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 337 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 338 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 339 |\u001b[39m it(\u001b[32m'should handle errors in file change callback'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 340 |\u001b[39m onFileChangeMock\u001b[33m.\u001b[39mmockRejectedValue(\u001b[36mnew\u001b[39m \u001b[33mError\u001b[39m(\u001b[32m'Processing failed'\u001b[39m))\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 341 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 342 |\u001b[39m \u001b[36mconst\u001b[39m consoleSpy \u001b[33m=\u001b[39m jest\u001b[33m.\u001b[39mspyOn(console\u001b[33m,\u001b[39m \u001b[32m'error'\u001b[39m)\u001b[33m.\u001b[39mmockImplementation(() \u001b[33m=>\u001b[39m {})\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/fileWatcher.test.ts\u001b[39m\u001b[0m\u001b[2m:339:5\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/fileWatcher.test.ts\u001b[39m\u001b[0m\u001b[2m:250:3\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/fileWatcher.test.ts\u001b[39m\u001b[0m\u001b[2m:135:1)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mFile Watching Functionality › ignore patterns › should handle wildcard patterns\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledTimes\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected number of calls: \u001b[32m1\u001b[39m\n Received number of calls: \u001b[31m2\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 403 |\u001b[39m jest\u001b[33m.\u001b[39madvanceTimersByTime(\u001b[35m600\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 404 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 405 |\u001b[39m expect(onFileChangeMock)\u001b[33m.\u001b[39mtoHaveBeenCalledTimes(\u001b[35m1\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 406 |\u001b[39m expect(onFileChangeMock)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(path\u001b[33m.\u001b[39mjoin(\u001b[32m'/test/project'\u001b[39m\u001b[33m,\u001b[39m \u001b[32m'bundle.js'\u001b[39m))\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 407 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 408 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/fileWatcher.test.ts\u001b[39m\u001b[0m\u001b[2m:405:32)\u001b[22m\u001b[2m\u001b[22m\n","name":"C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\fileWatcher.test.ts","startTime":1758320431223,"status":"failed","summary":""},{"assertionResults":[{"ancestorTitles":["LocalEmbeddingStorage","Initialization"],"duration":13,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"💾 Local embedding storage initialized\"\u001b[39m, \u001b[32mObjectContaining {\"customPath\": true, \"useLocalStorage\": true}\u001b[39m\nReceived\n 1: \u001b[2m\"💾 Local embedding storage initialized\"\u001b[22m, \u001b[31m{\"customPath\": false, \"dbPath\": \"C:\\\\Users\\\\conta/.ambiance/embeddings.db\", \"useLocalEmbeddings\": false}\u001b[39m\n 2: \u001b[2m\"💾 Local embedding storage initialized\"\u001b[22m, \u001b[31m{\"customPath\": true, \"dbPath\": \"/custom/path/embeddings.db\", \"useLocalEmbeddings\": true}\u001b[39m\n\nNumber of calls: \u001b[31m2\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"💾 Local embedding storage initialized\"\u001b[39m, \u001b[32mObjectContaining {\"customPath\": true, \"useLocalStorage\": true}\u001b[39m\nReceived\n 1: \u001b[2m\"💾 Local embedding storage initialized\"\u001b[22m, \u001b[31m{\"customPath\": false, \"dbPath\": \"C:\\\\Users\\\\conta/.ambiance/embeddings.db\", \"useLocalEmbeddings\": false}\u001b[39m\n 2: \u001b[2m\"💾 Local embedding storage initialized\"\u001b[22m, \u001b[31m{\"customPath\": true, \"dbPath\": \"/custom/path/embeddings.db\", \"useLocalEmbeddings\": true}\u001b[39m\n\nNumber of calls: \u001b[31m2\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:105:27)\n at Promise.then.completed (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:231:10)\n at _callCircusTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:252:3)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:126:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at run (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:71:3)\n at runAndTransformResultsToJestFormat (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapterInit.js:122:21)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:79:19)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingStorage Initialization should initialize with custom path when USE_LOCAL_EMBEDDINGS is true","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should initialize with custom path when USE_LOCAL_EMBEDDINGS is true"},{"ancestorTitles":["LocalEmbeddingStorage","Initialization"],"duration":2,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"💾 Local embedding storage initialized\"\u001b[39m, \u001b[32mObjectContaining {\"useLocalStorage\": false}\u001b[39m\nReceived\n 1: \u001b[2m\"💾 Local embedding storage initialized\"\u001b[22m, \u001b[31m{\"customPath\": false, \"dbPath\": \"C:\\\\Users\\\\conta/.ambiance/embeddings.db\", \"useLocalEmbeddings\": false}\u001b[39m\n 2: \u001b[2m\"💾 Local embedding storage initialized\"\u001b[22m, \u001b[31m{\"customPath\": false, \"dbPath\": \"C:\\\\Users\\\\conta/.ambiance/embeddings.db\", \"useLocalEmbeddings\": false}\u001b[39m\n\nNumber of calls: \u001b[31m2\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32m\"💾 Local embedding storage initialized\"\u001b[39m, \u001b[32mObjectContaining {\"useLocalStorage\": false}\u001b[39m\nReceived\n 1: \u001b[2m\"💾 Local embedding storage initialized\"\u001b[22m, \u001b[31m{\"customPath\": false, \"dbPath\": \"C:\\\\Users\\\\conta/.ambiance/embeddings.db\", \"useLocalEmbeddings\": false}\u001b[39m\n 2: \u001b[2m\"💾 Local embedding storage initialized\"\u001b[22m, \u001b[31m{\"customPath\": false, \"dbPath\": \"C:\\\\Users\\\\conta/.ambiance/embeddings.db\", \"useLocalEmbeddings\": false}\u001b[39m\n\nNumber of calls: \u001b[31m2\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:121:27)\n at Promise.then.completed (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:231:10)\n at _callCircusTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:252:3)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:126:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at run (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:71:3)\n at runAndTransformResultsToJestFormat (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapterInit.js:122:21)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:79:19)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingStorage Initialization should initialize with default path when USE_LOCAL_EMBEDDINGS is false","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should initialize with default path when USE_LOCAL_EMBEDDINGS is false"},{"ancestorTitles":["LocalEmbeddingStorage","Initialization"],"duration":10012,"failureDetails":[{"message":"thrown: \"Exceeded timeout of 10000 ms for a test.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\""}],"failureMessages":["Error: thrown: \"Exceeded timeout of 10000 ms for a test.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:131:5\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:99:3\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:56:1)\n at Runtime._execModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1439:24)\n at Runtime._loadModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1022:12)\n at Runtime.requireModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:882:12)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingStorage Initialization should create database tables on initialization","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should create database tables on initialization"},{"ancestorTitles":["LocalEmbeddingStorage","Initialization"],"duration":10014,"failureDetails":[{"message":"thrown: \"Exceeded timeout of 10000 ms for a test.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\""}],"failureMessages":["Error: thrown: \"Exceeded timeout of 10000 ms for a test.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:140:5\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:99:3\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:56:1)\n at Runtime._execModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1439:24)\n at Runtime._loadModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1022:12)\n at Runtime.requireModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:882:12)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingStorage Initialization should prepare statements after table creation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should prepare statements after table creation"},{"ancestorTitles":["LocalEmbeddingStorage","Storage Operations"],"duration":10014,"failureDetails":[{"message":"thrown: \"Exceeded timeout of 10000 ms for a hook.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\""}],"failureMessages":["Error: thrown: \"Exceeded timeout of 10000 ms for a hook.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:148:5\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:147:3\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:56:1)\n at Runtime._execModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1439:24)\n at Runtime._loadModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1022:12)\n at Runtime.requireModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:882:12)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingStorage Storage Operations should store embedding with all metadata","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should store embedding with all metadata"},{"ancestorTitles":["LocalEmbeddingStorage","Storage Operations"],"duration":10003,"failureDetails":[{"message":"thrown: \"Exceeded timeout of 10000 ms for a hook.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\""}],"failureMessages":["Error: thrown: \"Exceeded timeout of 10000 ms for a hook.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:148:5\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:147:3\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:56:1)\n at Runtime._execModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1439:24)\n at Runtime._loadModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1022:12)\n at Runtime.requireModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:882:12)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingStorage Storage Operations should handle null metadata fields","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle null metadata fields"},{"ancestorTitles":["LocalEmbeddingStorage","Retrieval Operations"],"duration":10009,"failureDetails":[{"message":"thrown: \"Exceeded timeout of 10000 ms for a hook.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\""}],"failureMessages":["Error: thrown: \"Exceeded timeout of 10000 ms for a hook.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:210:5\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:209:3\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:56:1)\n at Runtime._execModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1439:24)\n at Runtime._loadModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1022:12)\n at Runtime.requireModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:882:12)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingStorage Retrieval Operations should retrieve project embeddings","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should retrieve project embeddings"},{"ancestorTitles":["LocalEmbeddingStorage","Retrieval Operations"],"duration":10003,"failureDetails":[{"message":"thrown: \"Exceeded timeout of 10000 ms for a hook.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\""}],"failureMessages":["Error: thrown: \"Exceeded timeout of 10000 ms for a hook.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:210:5\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:209:3\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:56:1)\n at Runtime._execModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1439:24)\n at Runtime._loadModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1022:12)\n at Runtime.requireModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:882:12)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingStorage Retrieval Operations should handle missing metadata fields in retrieved data","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle missing metadata fields in retrieved data"},{"ancestorTitles":["LocalEmbeddingStorage","Similarity Search"],"duration":10002,"failureDetails":[{"message":"thrown: \"Exceeded timeout of 10000 ms for a hook.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\""}],"failureMessages":["Error: thrown: \"Exceeded timeout of 10000 ms for a hook.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:318:5\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:317:3\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:56:1)\n at Runtime._execModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1439:24)\n at Runtime._loadModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1022:12)\n at Runtime.requireModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:882:12)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingStorage Similarity Search should calculate cosine similarity correctly","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should calculate cosine similarity correctly"},{"ancestorTitles":["LocalEmbeddingStorage","Similarity Search"],"duration":10001,"failureDetails":[{"message":"thrown: \"Exceeded timeout of 10000 ms for a hook.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\""}],"failureMessages":["Error: thrown: \"Exceeded timeout of 10000 ms for a hook.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:318:5\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:317:3\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:56:1)\n at Runtime._execModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1439:24)\n at Runtime._loadModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1022:12)\n at Runtime.requireModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:882:12)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingStorage Similarity Search should handle zero vectors","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle zero vectors"},{"ancestorTitles":["LocalEmbeddingStorage","Similarity Search"],"duration":10011,"failureDetails":[{"message":"thrown: \"Exceeded timeout of 10000 ms for a hook.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\""}],"failureMessages":["Error: thrown: \"Exceeded timeout of 10000 ms for a hook.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:318:5\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:317:3\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:56:1)\n at Runtime._execModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1439:24)\n at Runtime._loadModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1022:12)\n at Runtime.requireModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:882:12)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingStorage Similarity Search should handle different vector lengths","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle different vector lengths"},{"ancestorTitles":["LocalEmbeddingStorage","Similarity Search"],"duration":10002,"failureDetails":[{"message":"thrown: \"Exceeded timeout of 10000 ms for a hook.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\""}],"failureMessages":["Error: thrown: \"Exceeded timeout of 10000 ms for a hook.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:318:5\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:317:3\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:56:1)\n at Runtime._execModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1439:24)\n at Runtime._loadModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1022:12)\n at Runtime.requireModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:882:12)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingStorage Similarity Search should search similar embeddings","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should search similar embeddings"},{"ancestorTitles":["LocalEmbeddingStorage","Similarity Search"],"duration":10005,"failureDetails":[{"message":"thrown: \"Exceeded timeout of 10000 ms for a hook.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\""}],"failureMessages":["Error: thrown: \"Exceeded timeout of 10000 ms for a hook.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:318:5\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:317:3\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:56:1)\n at Runtime._execModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1439:24)\n at Runtime._loadModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1022:12)\n at Runtime.requireModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:882:12)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingStorage Similarity Search should apply similarity threshold","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should apply similarity threshold"},{"ancestorTitles":["LocalEmbeddingStorage","Hash Generation"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"LocalEmbeddingStorage Hash Generation should generate consistent hashes","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should generate consistent hashes"},{"ancestorTitles":["LocalEmbeddingStorage","Hash Generation"],"duration":1,"failureDetails":[{"matcherResult":{"actual":"mock-hash","expected":"mock-hash","message":"\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mnot\u001b[2m.\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: not \u001b[32m\"mock-hash\"\u001b[39m","name":"toBe","pass":true}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mnot\u001b[2m.\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: not \u001b[32m\"mock-hash\"\u001b[39m\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:390:25)\n at Promise.then.completed (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:231:10)\n at _callCircusTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:316:40)\n at _runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:252:3)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:126:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at run (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:71:3)\n at runAndTransformResultsToJestFormat (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapterInit.js:122:21)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:79:19)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingStorage Hash Generation should generate different hashes for different inputs","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should generate different hashes for different inputs"},{"ancestorTitles":["LocalEmbeddingStorage","Error Handling"],"duration":1,"failureDetails":[{}],"failureMessages":["TypeError: Cannot read properties of null (reading 'exec')\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:396:14)\n at Promise.then.completed (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:231:10)\n at _callCircusTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:316:40)\n at _runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:252:3)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:126:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at run (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:71:3)\n at runAndTransformResultsToJestFormat (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapterInit.js:122:21)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:79:19)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingStorage Error Handling should handle database initialization errors","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle database initialization errors"},{"ancestorTitles":["LocalEmbeddingStorage","Error Handling"],"duration":10011,"failureDetails":[{"message":"thrown: \"Exceeded timeout of 10000 ms for a test.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\""}],"failureMessages":["Error: thrown: \"Exceeded timeout of 10000 ms for a test.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:401:5\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:394:3\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:56:1)\n at Runtime._execModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1439:24)\n at Runtime._loadModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1022:12)\n at Runtime.requireModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:882:12)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingStorage Error Handling should handle storage errors","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle storage errors"},{"ancestorTitles":["LocalEmbeddingStorage","Error Handling"],"duration":10007,"failureDetails":[{"message":"thrown: \"Exceeded timeout of 10000 ms for a test.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\""}],"failureMessages":["Error: thrown: \"Exceeded timeout of 10000 ms for a test.\nAdd a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:410:5\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:394:3\n at _dispatchDescribe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:91:26)\n at describe (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\index.js:55:5)\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:56:1)\n at Runtime._execModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1439:24)\n at Runtime._loadModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:1022:12)\n at Runtime.requireModule (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runtime\\build\\index.js:882:12)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingStorage Error Handling should handle retrieval errors","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle retrieval errors"},{"ancestorTitles":["LocalEmbeddingStorage","Cleanup"],"duration":0,"failureDetails":[{}],"failureMessages":["TypeError: Cannot read properties of null (reading 'close')\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:429:21)"],"fullName":"LocalEmbeddingStorage Cleanup should close database connection","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should close database connection"},{"ancestorTitles":["LocalEmbeddingStorage","Cleanup"],"duration":1,"failureDetails":[{}],"failureMessages":["TypeError: Cannot read properties of null (reading 'close')\n at Object.<anonymous> (C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts:434:14)\n at Promise.then.completed (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\utils.js:231:10)\n at _callCircusTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:316:40)\n at _runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:252:3)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:126:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at _runTestsForDescribeBlock (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:121:9)\n at run (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\run.js:71:3)\n at runAndTransformResultsToJestFormat (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapterInit.js:122:21)\n at jestAdapter (C:\\Dev\\ambiance-mcp\\node_modules\\jest-circus\\build\\legacy-code-todo-rewrite\\jestAdapter.js:79:19)\n at runTestInternal (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:367:16)\n at runTest (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\runTest.js:444:34)\n at Object.worker (C:\\Dev\\ambiance-mcp\\node_modules\\jest-runner\\build\\testWorker.js:106:12)"],"fullName":"LocalEmbeddingStorage Cleanup should handle close errors gracefully","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should handle close errors gracefully"}],"endTime":1758320567942,"message":"\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Initialization › should initialize with custom path when USE_LOCAL_EMBEDDINGS is true\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32m\"💾 Local embedding storage initialized\"\u001b[39m, \u001b[32mObjectContaining {\"customPath\": true, \"useLocalStorage\": true}\u001b[39m\n Received\n 1: \u001b[2m\"💾 Local embedding storage initialized\"\u001b[22m, \u001b[31m{\"customPath\": false, \"dbPath\": \"C:\\\\Users\\\\conta/.ambiance/embeddings.db\", \"useLocalEmbeddings\": false}\u001b[39m\n 2: \u001b[2m\"💾 Local embedding storage initialized\"\u001b[22m, \u001b[31m{\"customPath\": true, \"dbPath\": \"/custom/path/embeddings.db\", \"useLocalEmbeddings\": true}\u001b[39m\n\n Number of calls: \u001b[31m2\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 103 |\u001b[39m \u001b[36mconst\u001b[39m customStorage \u001b[33m=\u001b[39m \u001b[36mnew\u001b[39m \u001b[33mLocalEmbeddingStorage\u001b[39m(\u001b[32m'/custom/path'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 104 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 105 |\u001b[39m expect(logger\u001b[33m.\u001b[39minfo)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 106 |\u001b[39m \u001b[32m'💾 Local embedding storage initialized'\u001b[39m\u001b[33m,\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 107 |\u001b[39m expect\u001b[33m.\u001b[39mobjectContaining({\u001b[22m\n\u001b[2m \u001b[90m 108 |\u001b[39m useLocalStorage\u001b[33m:\u001b[39m \u001b[36mtrue\u001b[39m\u001b[33m,\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:105:27)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Initialization › should initialize with default path when USE_LOCAL_EMBEDDINGS is false\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32m\"💾 Local embedding storage initialized\"\u001b[39m, \u001b[32mObjectContaining {\"useLocalStorage\": false}\u001b[39m\n Received\n 1: \u001b[2m\"💾 Local embedding storage initialized\"\u001b[22m, \u001b[31m{\"customPath\": false, \"dbPath\": \"C:\\\\Users\\\\conta/.ambiance/embeddings.db\", \"useLocalEmbeddings\": false}\u001b[39m\n 2: \u001b[2m\"💾 Local embedding storage initialized\"\u001b[22m, \u001b[31m{\"customPath\": false, \"dbPath\": \"C:\\\\Users\\\\conta/.ambiance/embeddings.db\", \"useLocalEmbeddings\": false}\u001b[39m\n\n Number of calls: \u001b[31m2\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 119 |\u001b[39m \u001b[36mconst\u001b[39m defaultStorage \u001b[33m=\u001b[39m \u001b[36mnew\u001b[39m \u001b[33mLocalEmbeddingStorage\u001b[39m()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 120 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 121 |\u001b[39m expect(logger\u001b[33m.\u001b[39minfo)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 122 |\u001b[39m \u001b[32m'💾 Local embedding storage initialized'\u001b[39m\u001b[33m,\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 123 |\u001b[39m expect\u001b[33m.\u001b[39mobjectContaining({\u001b[22m\n\u001b[2m \u001b[90m 124 |\u001b[39m useLocalStorage\u001b[33m:\u001b[39m \u001b[36mfalse\u001b[39m\u001b[33m,\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:121:27)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Initialization › should create database tables on initialization\u001b[39m\u001b[22m\n\n thrown: \"Exceeded timeout of 10000 ms for a test.\n Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 129 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 130 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 131 |\u001b[39m test(\u001b[32m'should create database tables on initialization'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 132 |\u001b[39m \u001b[36mawait\u001b[39m storage\u001b[33m.\u001b[39minitializeDatabase()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 133 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 134 |\u001b[39m expect(mockDb\u001b[33m.\u001b[39mexec)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:131:5\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:99:3\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:56:1)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Initialization › should prepare statements after table creation\u001b[39m\u001b[22m\n\n thrown: \"Exceeded timeout of 10000 ms for a test.\n Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 138 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 139 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 140 |\u001b[39m test(\u001b[32m'should prepare statements after table creation'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 141 |\u001b[39m \u001b[36mawait\u001b[39m storage\u001b[33m.\u001b[39minitializeDatabase()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 142 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 143 |\u001b[39m expect(mockDb\u001b[33m.\u001b[39mprepare)\u001b[33m.\u001b[39mtoHaveBeenCalled()\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:140:5\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:99:3\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:56:1)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Storage Operations › should store embedding with all metadata\u001b[39m\u001b[22m\n\n thrown: \"Exceeded timeout of 10000 ms for a hook.\n Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 146 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 147 |\u001b[39m describe(\u001b[32m'Storage Operations'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 148 |\u001b[39m beforeEach(\u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 149 |\u001b[39m \u001b[36mawait\u001b[39m storage\u001b[33m.\u001b[39minitializeDatabase()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 150 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 151 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:148:5\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:147:3\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:56:1)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Storage Operations › should handle null metadata fields\u001b[39m\u001b[22m\n\n thrown: \"Exceeded timeout of 10000 ms for a hook.\n Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 146 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 147 |\u001b[39m describe(\u001b[32m'Storage Operations'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 148 |\u001b[39m beforeEach(\u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 149 |\u001b[39m \u001b[36mawait\u001b[39m storage\u001b[33m.\u001b[39minitializeDatabase()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 150 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 151 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:148:5\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:147:3\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:56:1)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Retrieval Operations › should retrieve project embeddings\u001b[39m\u001b[22m\n\n thrown: \"Exceeded timeout of 10000 ms for a hook.\n Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 208 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 209 |\u001b[39m describe(\u001b[32m'Retrieval Operations'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 210 |\u001b[39m beforeEach(\u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 211 |\u001b[39m \u001b[36mawait\u001b[39m storage\u001b[33m.\u001b[39minitializeDatabase()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 212 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 213 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:210:5\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:209:3\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:56:1)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Retrieval Operations › should handle missing metadata fields in retrieved data\u001b[39m\u001b[22m\n\n thrown: \"Exceeded timeout of 10000 ms for a hook.\n Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 208 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 209 |\u001b[39m describe(\u001b[32m'Retrieval Operations'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 210 |\u001b[39m beforeEach(\u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 211 |\u001b[39m \u001b[36mawait\u001b[39m storage\u001b[33m.\u001b[39minitializeDatabase()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 212 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 213 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:210:5\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:209:3\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:56:1)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Similarity Search › should calculate cosine similarity correctly\u001b[39m\u001b[22m\n\n thrown: \"Exceeded timeout of 10000 ms for a hook.\n Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 316 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 317 |\u001b[39m describe(\u001b[32m'Similarity Search'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 318 |\u001b[39m beforeEach(\u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 319 |\u001b[39m \u001b[36mawait\u001b[39m storage\u001b[33m.\u001b[39minitializeDatabase()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 320 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 321 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:318:5\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:317:3\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:56:1)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Similarity Search › should handle zero vectors\u001b[39m\u001b[22m\n\n thrown: \"Exceeded timeout of 10000 ms for a hook.\n Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 316 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 317 |\u001b[39m describe(\u001b[32m'Similarity Search'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 318 |\u001b[39m beforeEach(\u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 319 |\u001b[39m \u001b[36mawait\u001b[39m storage\u001b[33m.\u001b[39minitializeDatabase()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 320 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 321 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:318:5\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:317:3\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:56:1)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Similarity Search › should handle different vector lengths\u001b[39m\u001b[22m\n\n thrown: \"Exceeded timeout of 10000 ms for a hook.\n Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 316 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 317 |\u001b[39m describe(\u001b[32m'Similarity Search'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 318 |\u001b[39m beforeEach(\u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 319 |\u001b[39m \u001b[36mawait\u001b[39m storage\u001b[33m.\u001b[39minitializeDatabase()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 320 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 321 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:318:5\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:317:3\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:56:1)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Similarity Search › should search similar embeddings\u001b[39m\u001b[22m\n\n thrown: \"Exceeded timeout of 10000 ms for a hook.\n Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 316 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 317 |\u001b[39m describe(\u001b[32m'Similarity Search'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 318 |\u001b[39m beforeEach(\u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 319 |\u001b[39m \u001b[36mawait\u001b[39m storage\u001b[33m.\u001b[39minitializeDatabase()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 320 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 321 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:318:5\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:317:3\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:56:1)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Similarity Search › should apply similarity threshold\u001b[39m\u001b[22m\n\n thrown: \"Exceeded timeout of 10000 ms for a hook.\n Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 316 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 317 |\u001b[39m describe(\u001b[32m'Similarity Search'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 318 |\u001b[39m beforeEach(\u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 319 |\u001b[39m \u001b[36mawait\u001b[39m storage\u001b[33m.\u001b[39minitializeDatabase()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 320 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 321 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:318:5\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:317:3\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:56:1)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Hash Generation › should generate different hashes for different inputs\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mnot\u001b[2m.\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\n Expected: not \u001b[32m\"mock-hash\"\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 388 |\u001b[39m \u001b[36mconst\u001b[39m hash2 \u001b[33m=\u001b[39m \u001b[33mLocalEmbeddingStorage\u001b[39m\u001b[33m.\u001b[39mgenerateContentHash(\u001b[32m'content2'\u001b[39m\u001b[33m,\u001b[39m \u001b[32m'/path/file.ts'\u001b[39m\u001b[33m,\u001b[39m \u001b[35m0\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 389 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 390 |\u001b[39m expect(hash1)\u001b[33m.\u001b[39mnot\u001b[33m.\u001b[39mtoBe(hash2)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 391 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 392 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 393 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:390:25)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Error Handling › should handle database initialization errors\u001b[39m\u001b[22m\n\n TypeError: Cannot read properties of null (reading 'exec')\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 394 |\u001b[39m describe(\u001b[32m'Error Handling'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[90m 395 |\u001b[39m test(\u001b[32m'should handle database initialization errors'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 396 |\u001b[39m mockDb\u001b[33m.\u001b[39mexec\u001b[33m.\u001b[39mmockImplementation((sql\u001b[33m:\u001b[39m string\u001b[33m,\u001b[39m callback\u001b[33m:\u001b[39m (error\u001b[33m:\u001b[39m \u001b[33mError\u001b[39m \u001b[33m|\u001b[39m \u001b[36mnull\u001b[39m) \u001b[33m=>\u001b[39m \u001b[36mvoid\u001b[39m) \u001b[33m=>\u001b[39m callback(\u001b[36mnew\u001b[39m \u001b[33mError\u001b[39m(\u001b[32m'DB Error'\u001b[39m)))\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 397 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 398 |\u001b[39m \u001b[36mawait\u001b[39m expect(storage\u001b[33m.\u001b[39minitializeDatabase())\u001b[33m.\u001b[39mrejects\u001b[33m.\u001b[39mtoThrow(\u001b[32m'DB Error'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 399 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:396:14)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Error Handling › should handle storage errors\u001b[39m\u001b[22m\n\n thrown: \"Exceeded timeout of 10000 ms for a test.\n Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 399 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 400 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 401 |\u001b[39m test(\u001b[32m'should handle storage errors'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 402 |\u001b[39m \u001b[36mawait\u001b[39m storage\u001b[33m.\u001b[39minitializeDatabase()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 403 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 404 |\u001b[39m \u001b[36mconst\u001b[39m mockStmt \u001b[33m=\u001b[39m mockDb\u001b[33m.\u001b[39mprepare\u001b[33m.\u001b[39mmock\u001b[33m.\u001b[39mresults[\u001b[35m0\u001b[39m]\u001b[33m.\u001b[39mvalue\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:401:5\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:394:3\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:56:1)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Error Handling › should handle retrieval errors\u001b[39m\u001b[22m\n\n thrown: \"Exceeded timeout of 10000 ms for a test.\n Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout.\"\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 408 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 409 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 410 |\u001b[39m test(\u001b[32m'should handle retrieval errors'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 411 |\u001b[39m \u001b[36mawait\u001b[39m storage\u001b[33m.\u001b[39minitializeDatabase()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 412 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 413 |\u001b[39m \u001b[36mconst\u001b[39m mockStmt \u001b[33m=\u001b[39m mockDb\u001b[33m.\u001b[39mprepare\u001b[33m.\u001b[39mmock\u001b[33m.\u001b[39mresults\u001b[33m.\u001b[39mfind(\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:410:5\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat \u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:394:3\u001b[22m\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:56:1)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Cleanup › should close database connection\u001b[39m\u001b[22m\n\n TypeError: Cannot read properties of null (reading 'close')\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 427 |\u001b[39m \u001b[36mawait\u001b[39m storage\u001b[33m.\u001b[39mclose()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 428 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 429 |\u001b[39m expect(mockDb\u001b[33m.\u001b[39mclose)\u001b[33m.\u001b[39mtoHaveBeenCalled()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 430 |\u001b[39m expect(logger\u001b[33m.\u001b[39minfo)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[32m'✅ Database connection closed'\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 431 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 432 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:429:21)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mLocalEmbeddingStorage › Cleanup › should handle close errors gracefully\u001b[39m\u001b[22m\n\n TypeError: Cannot read properties of null (reading 'close')\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 432 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 433 |\u001b[39m test(\u001b[32m'should handle close errors gracefully'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 434 |\u001b[39m mockDb\u001b[33m.\u001b[39mclose\u001b[33m.\u001b[39mmockImplementation((callback\u001b[33m:\u001b[39m (error\u001b[33m:\u001b[39m \u001b[33mError\u001b[39m \u001b[33m|\u001b[39m \u001b[36mnull\u001b[39m) \u001b[33m=>\u001b[39m \u001b[36mvoid\u001b[39m) \u001b[33m=>\u001b[39m callback(\u001b[36mnew\u001b[39m \u001b[33mError\u001b[39m(\u001b[32m'Close Error'\u001b[39m)))\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 435 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 436 |\u001b[39m \u001b[90m// Should not throw\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 437 |\u001b[39m \u001b[36mawait\u001b[39m expect(storage\u001b[33m.\u001b[39mclose())\u001b[33m.\u001b[39mresolves\u001b[33m.\u001b[39mtoBeUndefined()\u001b[33m;\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.<anonymous> (\u001b[22m\u001b[2m\u001b[0m\u001b[36msrc/local/__tests__/embeddingStorage.test.ts\u001b[39m\u001b[0m\u001b[2m:434:14)\u001b[22m\u001b[2m\u001b[22m\n","name":"C:\\Dev\\ambiance-mcp\\src\\local\\__tests__\\embeddingStorage.test.ts","startTime":1758320431216,"status":"failed","summary":""}],"wasInterrupted":false}