@crownpeak/dqm-react-component-dev-mcp 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +138 -0
- package/data/.env.example +22 -0
- package/data/.gitattributes +47 -0
- package/data/.glfrc.json +7 -0
- package/data/.husky/pre-commit +5 -0
- package/data/.nvmrc +1 -0
- package/data/CHANGELOG.md +75 -0
- package/data/CODE_OF_CONDUCT.md +129 -0
- package/data/CONTRIBUTING.md +203 -0
- package/data/DOCS-STRUCTURE.md +307 -0
- package/data/I18N.md +292 -0
- package/data/LICENSE +22 -0
- package/data/README.md +315 -0
- package/data/SECURITY.md +125 -0
- package/data/WIKI-DEPLOYMENT.md +348 -0
- package/data/docs/AI-FEATURES.md +610 -0
- package/data/docs/API-REFERENCE.md +1022 -0
- package/data/docs/AUTHENTICATION.md +301 -0
- package/data/docs/BACKEND-API.md +468 -0
- package/data/docs/DEVELOPMENT.md +375 -0
- package/data/docs/EXAMPLES.md +622 -0
- package/data/docs/MCP-SERVER.md +307 -0
- package/data/docs/MIGRATION-GUIDE.md +367 -0
- package/data/docs/NPM-PUBLISH.md +193 -0
- package/data/docs/QUICKSTART.md +206 -0
- package/data/docs/REDIS-SETUP.md +162 -0
- package/data/docs/SERVER.md +228 -0
- package/data/docs/TROUBLESHOOTING.md +657 -0
- package/data/docs/WIDGET-GUIDE.md +638 -0
- package/data/docs/WIKI-HOME.md +58 -0
- package/data/docs/WIKI-SIDEBAR.md +39 -0
- package/data/package.json +171 -0
- package/data/playwright.config.ts +64 -0
- package/data/probe/.cargo/config.toml +10 -0
- package/data/probe/.claude/commands/performance-review.md +15 -0
- package/data/probe/.clinerules +288 -0
- package/data/probe/.dockerignore +57 -0
- package/data/probe/.githooks/post-commit +11 -0
- package/data/probe/.githooks/pre-commit +99 -0
- package/data/probe/.githooks/pre-commit-vow +9 -0
- package/data/probe/.prompts/engineer.md +41 -0
- package/data/probe/.roomodes +28 -0
- package/data/probe/.windsurfrules +0 -0
- package/data/probe/BASH_TOOL_SUMMARY.md +148 -0
- package/data/probe/BENCHMARKING.md +256 -0
- package/data/probe/CLAUDE.md +226 -0
- package/data/probe/CODE_OF_CONDUCT.md +128 -0
- package/data/probe/CONTRIBUTING.md +193 -0
- package/data/probe/Cargo.toml +120 -0
- package/data/probe/Cross.toml +10 -0
- package/data/probe/DOCKER-README.md +224 -0
- package/data/probe/Dockerfile +32 -0
- package/data/probe/ENHANCED_DEBUG_TELEMETRY.md +188 -0
- package/data/probe/LICENSE +201 -0
- package/data/probe/Makefile +210 -0
- package/data/probe/README.md +824 -0
- package/data/probe/SECURITY.md +67 -0
- package/data/probe/WINDOWS-GUIDE.md +294 -0
- package/data/probe/benches/parsing_benchmarks.rs +370 -0
- package/data/probe/benches/search_benchmarks.rs +599 -0
- package/data/probe/benches/simd_benchmarks.rs +372 -0
- package/data/probe/benches/timing_benchmarks.rs +287 -0
- package/data/probe/build-windows.bat +229 -0
- package/data/probe/codex-config/config.toml +6 -0
- package/data/probe/docs/PERFORMANCE_OPTIMIZATION.md +161 -0
- package/data/probe/examples/cache_demo.rs +46 -0
- package/data/probe/examples/chat/.dockerignore +37 -0
- package/data/probe/examples/chat/ChatSessionManager.js +295 -0
- package/data/probe/examples/chat/Dockerfile +98 -0
- package/data/probe/examples/chat/LICENSE +201 -0
- package/data/probe/examples/chat/LOCAL_IMAGE_SUPPORT.md +195 -0
- package/data/probe/examples/chat/MCP_INTEGRATION.md +400 -0
- package/data/probe/examples/chat/README.md +338 -0
- package/data/probe/examples/chat/TRACING.md +226 -0
- package/data/probe/examples/chat/appTracer.js +968 -0
- package/data/probe/examples/chat/auth.js +76 -0
- package/data/probe/examples/chat/bin/probe-chat.js +13 -0
- package/data/probe/examples/chat/build.js +104 -0
- package/data/probe/examples/chat/cancelRequest.js +84 -0
- package/data/probe/examples/chat/demo-agentic-image-flow.js +88 -0
- package/data/probe/examples/chat/demo-local-images.js +128 -0
- package/data/probe/examples/chat/fileSpanExporter.js +181 -0
- package/data/probe/examples/chat/implement/README.md +228 -0
- package/data/probe/examples/chat/implement/backends/AiderBackend.js +750 -0
- package/data/probe/examples/chat/implement/backends/BaseBackend.js +276 -0
- package/data/probe/examples/chat/implement/backends/ClaudeCodeBackend.js +767 -0
- package/data/probe/examples/chat/implement/backends/MockBackend.js +237 -0
- package/data/probe/examples/chat/implement/backends/registry.js +85 -0
- package/data/probe/examples/chat/implement/core/BackendManager.js +567 -0
- package/data/probe/examples/chat/implement/core/ImplementTool.js +354 -0
- package/data/probe/examples/chat/implement/core/config.js +428 -0
- package/data/probe/examples/chat/implement/core/timeouts.js +58 -0
- package/data/probe/examples/chat/implement/core/utils.js +496 -0
- package/data/probe/examples/chat/implement/types/BackendTypes.js +126 -0
- package/data/probe/examples/chat/index.js +669 -0
- package/data/probe/examples/chat/mcpServer.js +341 -0
- package/data/probe/examples/chat/npm/LICENSE +15 -0
- package/data/probe/examples/chat/npm/README.md +168 -0
- package/data/probe/examples/chat/npm/bin/probe-chat.js +156 -0
- package/data/probe/examples/chat/npm/index.js +259 -0
- package/data/probe/examples/chat/npm/package.json +54 -0
- package/data/probe/examples/chat/package.json +102 -0
- package/data/probe/examples/chat/probeChat.js +456 -0
- package/data/probe/examples/chat/probeTool.js +491 -0
- package/data/probe/examples/chat/storage/JsonChatStorage.js +476 -0
- package/data/probe/examples/chat/telemetry.js +281 -0
- package/data/probe/examples/chat/test/integration/chatFlows.test.js +320 -0
- package/data/probe/examples/chat/test/integration/toolCalling.test.js +471 -0
- package/data/probe/examples/chat/test/mocks/mockLLMProvider.js +269 -0
- package/data/probe/examples/chat/test/test-backends.js +90 -0
- package/data/probe/examples/chat/test/testUtils.js +530 -0
- package/data/probe/examples/chat/test/unit/backendTimeout.test.js +161 -0
- package/data/probe/examples/chat/test/unit/packageFiles.test.js +120 -0
- package/data/probe/examples/chat/test/verify-tests.js +118 -0
- package/data/probe/examples/chat/test-agentic-image-loading.js +294 -0
- package/data/probe/examples/chat/test-ai-sdk-telemetry.js +204 -0
- package/data/probe/examples/chat/test-chat-tracing.js +38 -0
- package/data/probe/examples/chat/test-direct-function.js +49 -0
- package/data/probe/examples/chat/test-file-size-validation.js +103 -0
- package/data/probe/examples/chat/test-full-mcp-integration.js +258 -0
- package/data/probe/examples/chat/test-github-context.txt +12 -0
- package/data/probe/examples/chat/test-hierarchy.js +203 -0
- package/data/probe/examples/chat/test-image-spans.js +37 -0
- package/data/probe/examples/chat/test-local-image-reading.js +176 -0
- package/data/probe/examples/chat/test-mcp-integration.js +136 -0
- package/data/probe/examples/chat/test-mcp-probe-server.js +161 -0
- package/data/probe/examples/chat/test-mcp-with-ai.js +279 -0
- package/data/probe/examples/chat/test-multiple-allowed-dirs.js +111 -0
- package/data/probe/examples/chat/test-probe-mcp-server.js +110 -0
- package/data/probe/examples/chat/test-security-validation.js +145 -0
- package/data/probe/examples/chat/test-simple-tracing.js +32 -0
- package/data/probe/examples/chat/test-trace-verification.js +235 -0
- package/data/probe/examples/chat/test-tracing.js +114 -0
- package/data/probe/examples/chat/tokenCounter.js +419 -0
- package/data/probe/examples/chat/tokenUsageDisplay.js +134 -0
- package/data/probe/examples/chat/webServer.js +1103 -0
- package/data/probe/examples/reranker/Cargo.toml +33 -0
- package/data/probe/examples/reranker/DEBUG_OUTPUT_ANALYSIS.md +71 -0
- package/data/probe/examples/reranker/MODELS.md +66 -0
- package/data/probe/examples/reranker/MODEL_COMPARISON.md +60 -0
- package/data/probe/examples/reranker/MULTI_MODEL_ANALYSIS.md +176 -0
- package/data/probe/examples/reranker/PERFORMANCE_SUMMARY.md +156 -0
- package/data/probe/examples/reranker/README.md +347 -0
- package/data/probe/examples/reranker/RUST_BERT_COMPARISON.md +82 -0
- package/data/probe/examples/reranker/TOKENIZATION_GUIDE.md +120 -0
- package/data/probe/examples/reranker/check_rust_tokenizer.py +108 -0
- package/data/probe/examples/reranker/convert_to_torchscript.py +109 -0
- package/data/probe/examples/reranker/debug_scoring.py +189 -0
- package/data/probe/examples/reranker/debug_tokenization.py +154 -0
- package/data/probe/examples/reranker/download_models.sh +73 -0
- package/data/probe/examples/reranker/requirements.txt +13 -0
- package/data/probe/examples/reranker/run_comprehensive_benchmark.sh +83 -0
- package/data/probe/examples/reranker/rust_bert_test/Cargo.toml +12 -0
- package/data/probe/examples/reranker/rust_bert_test/README.md +54 -0
- package/data/probe/examples/reranker/simple_test.py +50 -0
- package/data/probe/examples/reranker/test_all_models.sh +63 -0
- package/data/probe/examples/reranker/test_bert_results.sh +44 -0
- package/data/probe/examples/reranker/test_cross_encoder.py +334 -0
- package/data/probe/examples/reranker/test_cross_encoder.sh +80 -0
- package/data/probe/examples/reranker/test_exact_comparison.py +151 -0
- package/data/probe/examples/reranker/test_parallel_performance.sh +56 -0
- package/data/probe/examples/reranker/test_scores.py +132 -0
- package/data/probe/install.ps1 +508 -0
- package/data/probe/install.sh +460 -0
- package/data/probe/npm/CLONE_METHOD_EXAMPLES.md +596 -0
- package/data/probe/npm/CONTEXT_COMPACTION.md +303 -0
- package/data/probe/npm/DELEGATE_TOOL_README.md +166 -0
- package/data/probe/npm/MAID_INTEGRATION.md +313 -0
- package/data/probe/npm/MCP_INTEGRATION_SUMMARY.md +241 -0
- package/data/probe/npm/README.md +824 -0
- package/data/probe/npm/bin/.gitignore +7 -0
- package/data/probe/npm/bin/.gitkeep +0 -0
- package/data/probe/npm/bin/README.md +12 -0
- package/data/probe/npm/bin/probe +167 -0
- package/data/probe/npm/docs/CLAUDE_CODE_INTEGRATION.md +414 -0
- package/data/probe/npm/docs/CODEX_INTEGRATION.md +502 -0
- package/data/probe/npm/docs/EDIT_CREATE_TOOLS.md +233 -0
- package/data/probe/npm/docs/RETRY_AND_FALLBACK.md +674 -0
- package/data/probe/npm/example-usage.js +335 -0
- package/data/probe/npm/examples/multi-engine-demo.js +117 -0
- package/data/probe/npm/examples/probe-agent-cli.js +113 -0
- package/data/probe/npm/examples/test-agent-edit.js +114 -0
- package/data/probe/npm/examples/test-edit-create.js +120 -0
- package/data/probe/npm/examples/test-edit-direct.js +114 -0
- package/data/probe/npm/index.d.ts +744 -0
- package/data/probe/npm/jest.config.js +52 -0
- package/data/probe/npm/package.json +117 -0
- package/data/probe/npm/scripts/build-agent.cjs +75 -0
- package/data/probe/npm/scripts/build-cjs.js +124 -0
- package/data/probe/npm/scripts/build-mcp.cjs +36 -0
- package/data/probe/npm/scripts/postinstall.js +216 -0
- package/data/probe/npm/test-codex-e2e.js +78 -0
- package/data/probe/npm/test-download-lock.js +109 -0
- package/data/probe/npm/test-grep-security.js +94 -0
- package/data/probe/npm/test-grep-simplified.js +63 -0
- package/data/probe/npm/test-grep.js +51 -0
- package/data/probe/npm/tests/README.md +96 -0
- package/data/probe/npm/tests/agent-compact-history.test.js +174 -0
- package/data/probe/npm/tests/allow-tests-default.test.js +151 -0
- package/data/probe/npm/tests/contextCompactor.test.js +498 -0
- package/data/probe/npm/tests/delegate-config.test.js +353 -0
- package/data/probe/npm/tests/delegate-integration.test.js +348 -0
- package/data/probe/npm/tests/extractor-integration.test.js +162 -0
- package/data/probe/npm/tests/extractor.test.js +317 -0
- package/data/probe/npm/tests/fixtures/sampleDiagrams.js +267 -0
- package/data/probe/npm/tests/integration/claude-code-auto-fallback.spec.js +148 -0
- package/data/probe/npm/tests/integration/claude-code-multi-step.spec.js +127 -0
- package/data/probe/npm/tests/integration/claude-code-tool-events.spec.js +163 -0
- package/data/probe/npm/tests/integration/codex-auto-fallback.spec.js +191 -0
- package/data/probe/npm/tests/integration/codex-tool-events.spec.js +147 -0
- package/data/probe/npm/tests/integration/examplesChatMcp.test.js +402 -0
- package/data/probe/npm/tests/integration/mcpDotenvSupport.test.js +174 -0
- package/data/probe/npm/tests/integration/mcpErrorHandling.test.js +566 -0
- package/data/probe/npm/tests/integration/mcpRobustness.test.js +564 -0
- package/data/probe/npm/tests/integration/mcpStdoutPurity.test.js +355 -0
- package/data/probe/npm/tests/integration/probeAgentMcp.test.js +398 -0
- package/data/probe/npm/tests/integration/retryFallback.test.js +368 -0
- package/data/probe/npm/tests/integration/schema-in-initial-message.test.js +318 -0
- package/data/probe/npm/tests/integration/schema-validation-loop-prevention.test.js +244 -0
- package/data/probe/npm/tests/integration/schemaRetryLogic.test.js +94 -0
- package/data/probe/npm/tests/integration/validationFlow.test.js +329 -0
- package/data/probe/npm/tests/manual/test-codex-basic.js +110 -0
- package/data/probe/npm/tests/mcp/mcpClientManager.test.js +614 -0
- package/data/probe/npm/tests/mcp/mcpConfig.test.js +359 -0
- package/data/probe/npm/tests/mcp/mcpXmlBridge.test.js +436 -0
- package/data/probe/npm/tests/mcp/mockMcpServer.js +510 -0
- package/data/probe/npm/tests/mcp-strict-syntax.test.js +319 -0
- package/data/probe/npm/tests/mermaidQuoteEscaping.test.js +214 -0
- package/data/probe/npm/tests/nestedQuoteFix.test.js +40 -0
- package/data/probe/npm/tests/setup.js +46 -0
- package/data/probe/npm/tests/unit/allowed-tools.test.js +513 -0
- package/data/probe/npm/tests/unit/attempt-completion-closing-tag-in-content.test.js +188 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonFix.test.js +238 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonIssue.test.js +128 -0
- package/data/probe/npm/tests/unit/backtickAutoFix.test.js +35 -0
- package/data/probe/npm/tests/unit/bash-probe-agent-integration.test.js +389 -0
- package/data/probe/npm/tests/unit/bash-simple-commands.test.js +324 -0
- package/data/probe/npm/tests/unit/bash-tool-comprehensive.test.js +371 -0
- package/data/probe/npm/tests/unit/bash-tool-integration.test.js +310 -0
- package/data/probe/npm/tests/unit/bash-tool.test.js +341 -0
- package/data/probe/npm/tests/unit/completion-prompt.test.js +379 -0
- package/data/probe/npm/tests/unit/cwd-path-options.test.js +287 -0
- package/data/probe/npm/tests/unit/delegate-limits.test.js +422 -0
- package/data/probe/npm/tests/unit/direct-content-attempt-completion.test.js +235 -0
- package/data/probe/npm/tests/unit/edit-create-tools.test.js +609 -0
- package/data/probe/npm/tests/unit/enhancedMermaidValidation.test.js +577 -0
- package/data/probe/npm/tests/unit/extract-content.test.js +83 -0
- package/data/probe/npm/tests/unit/extract-multiple-targets.test.js +89 -0
- package/data/probe/npm/tests/unit/fallbackManager.test.js +442 -0
- package/data/probe/npm/tests/unit/githubCompatibilityValidation.test.js +258 -0
- package/data/probe/npm/tests/unit/imageConfig.test.js +149 -0
- package/data/probe/npm/tests/unit/imagePathResolution.test.js +345 -0
- package/data/probe/npm/tests/unit/json-fixing-agent.test.js +238 -0
- package/data/probe/npm/tests/unit/json-validation-enhanced-errors.test.js +199 -0
- package/data/probe/npm/tests/unit/jsonValidationInfiniteLoopFix.test.js +228 -0
- package/data/probe/npm/tests/unit/maidIntegration.test.js +139 -0
- package/data/probe/npm/tests/unit/maxIterationsWarning.test.js +195 -0
- package/data/probe/npm/tests/unit/mermaidEdgeLabelFix.test.js +161 -0
- package/data/probe/npm/tests/unit/mermaidHtmlEntities.test.js +76 -0
- package/data/probe/npm/tests/unit/mermaidInfiniteLoopFix.test.js +64 -0
- package/data/probe/npm/tests/unit/mermaidValidation.test.js +723 -0
- package/data/probe/npm/tests/unit/mermaidValidationVisorExample.test.js +309 -0
- package/data/probe/npm/tests/unit/probe-agent-clone-realistic.test.js +643 -0
- package/data/probe/npm/tests/unit/probe-agent-clone.test.js +476 -0
- package/data/probe/npm/tests/unit/probe-agent-delegate.test.js +400 -0
- package/data/probe/npm/tests/unit/probe-agent-model-option.test.js +118 -0
- package/data/probe/npm/tests/unit/probeTool-security.test.js +283 -0
- package/data/probe/npm/tests/unit/readImageTool.test.js +418 -0
- package/data/probe/npm/tests/unit/retryManager.test.js +317 -0
- package/data/probe/npm/tests/unit/schema-aware-reminders.test.js +288 -0
- package/data/probe/npm/tests/unit/schemaDefinitionDetection.test.js +115 -0
- package/data/probe/npm/tests/unit/schemaUtils.test.js +1268 -0
- package/data/probe/npm/tests/unit/simpleTelemetry.test.js +282 -0
- package/data/probe/npm/tests/unit/simplified-attempt-completion.test.js +274 -0
- package/data/probe/npm/tests/unit/single-quote-json-bug.test.js +231 -0
- package/data/probe/npm/tests/unit/subgraphAutoFix.test.js +110 -0
- package/data/probe/npm/tests/unit/system-prompt.test.js +32 -0
- package/data/probe/npm/tests/unit/types-probe-agent-options.test.js +42 -0
- package/data/probe/npm/tests/unit/xmlParsing.test.js +720 -0
- package/data/probe/npm/tsconfig.json +21 -0
- package/data/probe/result1.txt +19 -0
- package/data/probe/result2.txt +26 -0
- package/data/probe/scripts/benchmark.sh +270 -0
- package/data/probe/scripts/cache_memory_analysis.rs +844 -0
- package/data/probe/scripts/claude-hook-wrapper.sh +56 -0
- package/data/probe/site/.env.example +10 -0
- package/data/probe/site/DEPLOYMENT.md +86 -0
- package/data/probe/site/README.md +183 -0
- package/data/probe/site/adding-languages.md +135 -0
- package/data/probe/site/ai-chat.md +427 -0
- package/data/probe/site/ai-integration.md +1488 -0
- package/data/probe/site/blog/agentic-flow-custom-xml-protocol.md +407 -0
- package/data/probe/site/blog/index.md +118 -0
- package/data/probe/site/blog/v0.6.0-release.md +426 -0
- package/data/probe/site/blog.md +8 -0
- package/data/probe/site/changelog.md +200 -0
- package/data/probe/site/cli-mode.md +437 -0
- package/data/probe/site/code-extraction.md +436 -0
- package/data/probe/site/contributing/README.md +9 -0
- package/data/probe/site/contributing/documentation-cross-references.md +215 -0
- package/data/probe/site/contributing/documentation-maintenance.md +275 -0
- package/data/probe/site/contributing/documentation-structure.md +75 -0
- package/data/probe/site/documentation-cross-references.md +215 -0
- package/data/probe/site/documentation-guide.md +132 -0
- package/data/probe/site/documentation-maintenance.md +275 -0
- package/data/probe/site/features.md +147 -0
- package/data/probe/site/how-it-works.md +118 -0
- package/data/probe/site/index.md +175 -0
- package/data/probe/site/index.md.bak +133 -0
- package/data/probe/site/installation.md +235 -0
- package/data/probe/site/integrations/docker.md +248 -0
- package/data/probe/site/integrations/github-actions.md +413 -0
- package/data/probe/site/language-support-overview.md +168 -0
- package/data/probe/site/mcp-integration.md +587 -0
- package/data/probe/site/mcp-server.md +304 -0
- package/data/probe/site/navigation-structure.md +76 -0
- package/data/probe/site/nodejs-sdk.md +798 -0
- package/data/probe/site/output-formats.md +625 -0
- package/data/probe/site/package.json +21 -0
- package/data/probe/site/public/_headers +28 -0
- package/data/probe/site/public/_redirects +11 -0
- package/data/probe/site/quick-start.md +289 -0
- package/data/probe/site/search-functionality.md +291 -0
- package/data/probe/site/search-reference.md +291 -0
- package/data/probe/site/supported-languages.md +215 -0
- package/data/probe/site/use-cases/README.md +8 -0
- package/data/probe/site/use-cases/advanced-cli.md +253 -0
- package/data/probe/site/use-cases/ai-code-editors.md +239 -0
- package/data/probe/site/use-cases/building-ai-tools.md +529 -0
- package/data/probe/site/use-cases/cli-ai-workflows.md +285 -0
- package/data/probe/site/use-cases/deploying-probe-web-interface.md +255 -0
- package/data/probe/site/use-cases/integrating-probe-into-ai-code-editors.md +161 -0
- package/data/probe/site/use-cases/nodejs-sdk.md +596 -0
- package/data/probe/site/use-cases/team-chat.md +350 -0
- package/data/probe/site/web-interface.md +434 -0
- package/data/probe/site/wrangler.toml +9 -0
- package/data/probe/test-api-key.sh +1 -0
- package/data/probe/test-probe-implementation/hello.js +7 -0
- package/data/probe/test_cases/demonstrate_early_termination_issues.sh +176 -0
- package/data/probe/test_cases/early_termination_issues.rs +533 -0
- package/data/probe/test_data/test_nested_struct.go +26 -0
- package/data/probe/tests/README.md +286 -0
- package/data/probe/tests/README_search_determinism_tests.md +116 -0
- package/data/probe/tests/adjacent_comment_test.rs +152 -0
- package/data/probe/tests/apostrophe_handling_tests.rs +132 -0
- package/data/probe/tests/block_filtering_with_ast_tests.rs +669 -0
- package/data/probe/tests/block_merging_tests.rs +396 -0
- package/data/probe/tests/c_outline_format_tests.rs +2179 -0
- package/data/probe/tests/cache_invalidation_issues.rs.disabled +682 -0
- package/data/probe/tests/cache_order_tests.rs +147 -0
- package/data/probe/tests/cache_query_scoping_tests.rs +221 -0
- package/data/probe/tests/cli_tests.rs +680 -0
- package/data/probe/tests/comment_context_integration_test.rs +240 -0
- package/data/probe/tests/common.rs +33 -0
- package/data/probe/tests/complex_block_merging_tests.rs +599 -0
- package/data/probe/tests/complex_query_block_filtering_tests.rs +422 -0
- package/data/probe/tests/control_flow_closing_braces_test.rs +91 -0
- package/data/probe/tests/cpp_outline_format_tests.rs +1507 -0
- package/data/probe/tests/csharp_outline_format_tests.rs +941 -0
- package/data/probe/tests/elastic_query_integration_tests.rs +922 -0
- package/data/probe/tests/extract_command_tests.rs +1848 -0
- package/data/probe/tests/extract_deduplication_tests.rs +146 -0
- package/data/probe/tests/extract_input_file_tests.rs +84 -0
- package/data/probe/tests/extract_prompt_tests.rs +102 -0
- package/data/probe/tests/filename_search_tests.rs +96 -0
- package/data/probe/tests/fixtures/user/AssemblyInfo.cs +3 -0
- package/data/probe/tests/github_extract_tests.rs +234 -0
- package/data/probe/tests/go_comment_test.rs +253 -0
- package/data/probe/tests/go_outline_format_tests.rs +2587 -0
- package/data/probe/tests/go_path_resolver_tests.rs +96 -0
- package/data/probe/tests/html_outline_format_tests.rs +637 -0
- package/data/probe/tests/integration_tests.rs +837 -0
- package/data/probe/tests/ip_whitelist_test.rs +148 -0
- package/data/probe/tests/java_outline_format_tests.rs +1611 -0
- package/data/probe/tests/javascript_extract_tests.rs +315 -0
- package/data/probe/tests/javascript_outline_format_tests.rs +1464 -0
- package/data/probe/tests/json_format_tests.rs +436 -0
- package/data/probe/tests/json_schema_validation_tests.rs +450 -0
- package/data/probe/tests/lib_usage.rs +60 -0
- package/data/probe/tests/line_comment_context_extension_test.rs +459 -0
- package/data/probe/tests/line_map_cache_tests.rs +114 -0
- package/data/probe/tests/markdown_integration_tests.rs +190 -0
- package/data/probe/tests/mocks/test_ip_whitelist.go +11 -0
- package/data/probe/tests/mocks/test_object.js +27 -0
- package/data/probe/tests/mocks/test_struct.go +50 -0
- package/data/probe/tests/multi_keyword_pattern_tests.rs +464 -0
- package/data/probe/tests/multi_language_syntax_integration_tests.rs +218 -0
- package/data/probe/tests/multiple_capture_groups_tests.rs +169 -0
- package/data/probe/tests/negative_compound_word_tests.rs +246 -0
- package/data/probe/tests/nested_symbol_extraction_tests.rs +99 -0
- package/data/probe/tests/outline_cross_file_interference_test.rs +335 -0
- package/data/probe/tests/outline_keyword_preservation_test.rs +67 -0
- package/data/probe/tests/output_format_edge_cases_tests.rs +693 -0
- package/data/probe/tests/parallel_extraction_tests.rs +178 -0
- package/data/probe/tests/parallel_search_tests.rs +355 -0
- package/data/probe/tests/path_resolver_tests.rs +698 -0
- package/data/probe/tests/php_outline_format_extended_tests.rs +928 -0
- package/data/probe/tests/php_outline_format_tests.rs +768 -0
- package/data/probe/tests/property_tests.proptest-regressions +9 -0
- package/data/probe/tests/property_tests.rs +118 -0
- package/data/probe/tests/python_outline_format_tests.rs +1538 -0
- package/data/probe/tests/query_command_json_tests.rs +438 -0
- package/data/probe/tests/query_command_tests.rs +232 -0
- package/data/probe/tests/query_command_xml_tests.rs +569 -0
- package/data/probe/tests/quoted_term_with_negative_keyword_tests.rs +216 -0
- package/data/probe/tests/required_terms_filename_tests.rs +116 -0
- package/data/probe/tests/ruby_outline_format_tests.rs +1011 -0
- package/data/probe/tests/rust_line_comment_context_test.rs +151 -0
- package/data/probe/tests/rust_outline_format_enhanced_tests.rs +725 -0
- package/data/probe/tests/rust_outline_format_tests.rs +843 -0
- package/data/probe/tests/schemas/xml_output_schema.xsd +38 -0
- package/data/probe/tests/search_determinism_tests.rs +451 -0
- package/data/probe/tests/search_hints_tests.rs +253 -0
- package/data/probe/tests/special_character_escaping_tests.rs +417 -0
- package/data/probe/tests/stemming_compound_word_filtering_tests.rs +535 -0
- package/data/probe/tests/strict_elastic_syntax_tests.rs +404 -0
- package/data/probe/tests/swift_outline_format_tests.rs +3319 -0
- package/data/probe/tests/symbols_tests.rs +166 -0
- package/data/probe/tests/test_file.rs +45 -0
- package/data/probe/tests/test_tokenize.rs +28 -0
- package/data/probe/tests/timeout_tests.rs +82 -0
- package/data/probe/tests/tokenization_tests.rs +195 -0
- package/data/probe/tests/tokenized_block_filtering_tests.rs +174 -0
- package/data/probe/tests/typescript_extract_tests.rs +214 -0
- package/data/probe/tests/typescript_outline_format_tests.rs +2188 -0
- package/data/probe/tests/xml_format_tests.rs +568 -0
- package/data/probe/tests/xml_schema_validation_tests.rs +497 -0
- package/data/scripts/postinstall.mjs +9 -0
- package/data/scripts/set-version.js +0 -0
- package/data/scripts/wiki-build.sh +111 -0
- package/data/scripts/wiki-deploy.sh +73 -0
- package/data/serve.json +12 -0
- package/data/test/demo-dynamic.html +134 -0
- package/data/test/demo-esm.html +105 -0
- package/data/test/demo-iife.html +78 -0
- package/data/tsconfig.json +7 -0
- package/data/vite.server.ts +483 -0
- package/data/vitest.config.ts +40 -0
- package/data/wiki/Home.md +58 -0
- package/data/wiki/_Sidebar.md +39 -0
- package/docs-mcp.config.json +20 -0
- package/package.json +56 -0
- package/src/config.js +111 -0
- package/src/index.js +395 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Test script to verify download locking works correctly
|
|
4
|
+
* Tests both in-process and cross-process locking
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { getBinaryPath } from './src/utils.js';
|
|
8
|
+
import { spawn } from 'child_process';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
|
|
11
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
+
|
|
13
|
+
async function testInProcessLocking() {
|
|
14
|
+
console.log('=== Test 1: In-Process Locking ===\n');
|
|
15
|
+
|
|
16
|
+
// Simulate 5 concurrent calls to getBinaryPath with the same version
|
|
17
|
+
const version = '0.6.0-rc100'; // Use a specific version to trigger download
|
|
18
|
+
|
|
19
|
+
console.log(`Initiating 5 concurrent getBinaryPath calls for version ${version}...`);
|
|
20
|
+
const startTime = Date.now();
|
|
21
|
+
|
|
22
|
+
const promises = Array.from({ length: 5 }, (_, i) => {
|
|
23
|
+
return getBinaryPath({ version, forceDownload: false })
|
|
24
|
+
.then(path => {
|
|
25
|
+
console.log(`Call ${i + 1} completed: ${path}`);
|
|
26
|
+
return path;
|
|
27
|
+
})
|
|
28
|
+
.catch(err => {
|
|
29
|
+
console.error(`Call ${i + 1} failed:`, err.message);
|
|
30
|
+
throw err;
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const results = await Promise.all(promises);
|
|
35
|
+
const endTime = Date.now();
|
|
36
|
+
|
|
37
|
+
console.log(`\nAll calls completed in ${endTime - startTime}ms`);
|
|
38
|
+
console.log('All calls returned the same path:', new Set(results).size === 1);
|
|
39
|
+
console.log('✅ In-process locking test passed\n');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async function testCrossProcessLocking() {
|
|
43
|
+
console.log('=== Test 2: Cross-Process Locking ===\n');
|
|
44
|
+
|
|
45
|
+
const version = '0.6.0-rc101'; // Different version for cross-process test
|
|
46
|
+
|
|
47
|
+
console.log(`Spawning 3 separate Node.js processes to download version ${version}...`);
|
|
48
|
+
|
|
49
|
+
const processes = Array.from({ length: 3 }, (_, i) => {
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
const child = spawn('node', [
|
|
52
|
+
'-e',
|
|
53
|
+
`import('${__filename.replace(/\\/g, '/')}').then(m => m.singleDownload('${version}'))`
|
|
54
|
+
], {
|
|
55
|
+
stdio: 'inherit',
|
|
56
|
+
shell: true
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
child.on('exit', (code) => {
|
|
60
|
+
if (code === 0) {
|
|
61
|
+
resolve();
|
|
62
|
+
} else {
|
|
63
|
+
reject(new Error(`Process ${i + 1} exited with code ${code}`));
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
child.on('error', reject);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
await Promise.all(processes);
|
|
72
|
+
console.log('✅ Cross-process locking test passed\n');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Helper function for spawned processes
|
|
76
|
+
export async function singleDownload(version) {
|
|
77
|
+
console.log(`[Process ${process.pid}] Starting download for version ${version}`);
|
|
78
|
+
const path = await getBinaryPath({ version, forceDownload: false });
|
|
79
|
+
console.log(`[Process ${process.pid}] Download completed: ${path}`);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async function runTests() {
|
|
83
|
+
try {
|
|
84
|
+
console.log('Testing Download Locking Mechanism\n');
|
|
85
|
+
console.log('Lock features:');
|
|
86
|
+
console.log('- In-memory locks for same-process coordination');
|
|
87
|
+
console.log('- File-based locks for cross-process coordination');
|
|
88
|
+
console.log('- 5-minute timeout for stuck downloads');
|
|
89
|
+
console.log('- Automatic retry if locked download fails');
|
|
90
|
+
console.log('- Stale lock detection and cleanup');
|
|
91
|
+
console.log('- Poll-based waiting (500ms intervals)\n');
|
|
92
|
+
|
|
93
|
+
await testInProcessLocking();
|
|
94
|
+
|
|
95
|
+
// Uncomment to test cross-process locking
|
|
96
|
+
// Note: This requires the version to not already be downloaded
|
|
97
|
+
// await testCrossProcessLocking();
|
|
98
|
+
|
|
99
|
+
console.log('✅ All tests passed!');
|
|
100
|
+
} catch (error) {
|
|
101
|
+
console.error('Test failed:', error);
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Run tests if this is the main module
|
|
107
|
+
if (process.argv[1] === __filename) {
|
|
108
|
+
runTests();
|
|
109
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { grep } from './src/index.js';
|
|
4
|
+
|
|
5
|
+
async function testSecurityFixes() {
|
|
6
|
+
console.log('Testing grep security (command injection prevention)...\n');
|
|
7
|
+
|
|
8
|
+
try {
|
|
9
|
+
// Test 1: Malicious pattern with shell metacharacters
|
|
10
|
+
console.log('Test 1: Pattern with shell metacharacters (should be safe)');
|
|
11
|
+
const maliciousPattern = 'test"; echo "INJECTED"; echo "';
|
|
12
|
+
try {
|
|
13
|
+
const result = await grep({
|
|
14
|
+
pattern: maliciousPattern,
|
|
15
|
+
paths: './src',
|
|
16
|
+
lineNumbers: true
|
|
17
|
+
});
|
|
18
|
+
console.log('✅ Pattern treated as literal string (no injection)');
|
|
19
|
+
console.log(` Found ${result.split('\n').filter(l => l).length} lines`);
|
|
20
|
+
} catch (error) {
|
|
21
|
+
// This is expected - the pattern won't match
|
|
22
|
+
console.log('✅ No matches found (pattern treated as literal)');
|
|
23
|
+
}
|
|
24
|
+
console.log('\n---\n');
|
|
25
|
+
|
|
26
|
+
// Test 2: Path with shell metacharacters
|
|
27
|
+
console.log('Test 2: Path with shell metacharacters (should be safe)');
|
|
28
|
+
const maliciousPath = './src; echo INJECTED;';
|
|
29
|
+
try {
|
|
30
|
+
const result = await grep({
|
|
31
|
+
pattern: 'export',
|
|
32
|
+
paths: maliciousPath,
|
|
33
|
+
lineNumbers: true
|
|
34
|
+
});
|
|
35
|
+
console.log('⚠️ Unexpected: command should have failed');
|
|
36
|
+
} catch (error) {
|
|
37
|
+
console.log('✅ Path handled securely (command failed safely)');
|
|
38
|
+
console.log(` Error: ${error.message.substring(0, 100)}`);
|
|
39
|
+
}
|
|
40
|
+
console.log('\n---\n');
|
|
41
|
+
|
|
42
|
+
// Test 3: Pattern with backticks (command substitution attempt)
|
|
43
|
+
console.log('Test 3: Pattern with backticks (should be safe)');
|
|
44
|
+
const backtickPattern = 'test`whoami`test';
|
|
45
|
+
try {
|
|
46
|
+
const result = await grep({
|
|
47
|
+
pattern: backtickPattern,
|
|
48
|
+
paths: './src',
|
|
49
|
+
lineNumbers: true
|
|
50
|
+
});
|
|
51
|
+
console.log('✅ Backticks treated as literal (no command substitution)');
|
|
52
|
+
} catch (error) {
|
|
53
|
+
console.log('✅ No matches found (backticks treated as literal)');
|
|
54
|
+
}
|
|
55
|
+
console.log('\n---\n');
|
|
56
|
+
|
|
57
|
+
// Test 4: Pattern with $() (command substitution attempt)
|
|
58
|
+
console.log('Test 4: Pattern with $() syntax (should be safe)');
|
|
59
|
+
const dollarPattern = 'test$(whoami)test';
|
|
60
|
+
try {
|
|
61
|
+
const result = await grep({
|
|
62
|
+
pattern: dollarPattern,
|
|
63
|
+
paths: './src',
|
|
64
|
+
lineNumbers: true
|
|
65
|
+
});
|
|
66
|
+
console.log('✅ $() treated as literal (no command substitution)');
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.log('✅ No matches found ($() treated as literal)');
|
|
69
|
+
}
|
|
70
|
+
console.log('\n---\n');
|
|
71
|
+
|
|
72
|
+
// Test 5: Normal regex patterns should still work
|
|
73
|
+
console.log('Test 5: Normal regex patterns work correctly');
|
|
74
|
+
const regexPattern = 'export.*function';
|
|
75
|
+
const result = await grep({
|
|
76
|
+
pattern: regexPattern,
|
|
77
|
+
paths: './src/grep.js',
|
|
78
|
+
lineNumbers: true
|
|
79
|
+
});
|
|
80
|
+
console.log('✅ Regex patterns work correctly');
|
|
81
|
+
console.log(` Found ${result.split('\n').filter(l => l).length} matches`);
|
|
82
|
+
console.log('\n---\n');
|
|
83
|
+
|
|
84
|
+
console.log('✅ All security tests passed!');
|
|
85
|
+
console.log('\nThe grep function is now safe from command injection attacks.');
|
|
86
|
+
console.log('All shell metacharacters are treated as literal strings.');
|
|
87
|
+
} catch (error) {
|
|
88
|
+
console.error('❌ Security test failed:', error.message);
|
|
89
|
+
console.error(error);
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
testSecurityFixes();
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { grep } from './src/index.js';
|
|
4
|
+
|
|
5
|
+
async function testSimplifiedGrep() {
|
|
6
|
+
console.log('Testing simplified grep API...\n');
|
|
7
|
+
|
|
8
|
+
try {
|
|
9
|
+
// Test 1: Basic search (line numbers enabled by default)
|
|
10
|
+
console.log('Test 1: Basic search for "export" in src directory');
|
|
11
|
+
const result1 = await grep({
|
|
12
|
+
pattern: 'export',
|
|
13
|
+
paths: './src',
|
|
14
|
+
lineNumbers: true // This should be the default
|
|
15
|
+
});
|
|
16
|
+
console.log('First 5 lines:');
|
|
17
|
+
console.log(result1.split('\n').slice(0, 5).join('\n'));
|
|
18
|
+
console.log('\n---\n');
|
|
19
|
+
|
|
20
|
+
// Test 2: Case-insensitive search
|
|
21
|
+
console.log('Test 2: Case-insensitive search for "TODO"');
|
|
22
|
+
const result2 = await grep({
|
|
23
|
+
pattern: 'todo',
|
|
24
|
+
paths: './src',
|
|
25
|
+
ignoreCase: true,
|
|
26
|
+
lineNumbers: true
|
|
27
|
+
});
|
|
28
|
+
console.log('Result:');
|
|
29
|
+
console.log(result2);
|
|
30
|
+
console.log('\n---\n');
|
|
31
|
+
|
|
32
|
+
// Test 3: Count matches
|
|
33
|
+
console.log('Test 3: Count "function" occurrences');
|
|
34
|
+
const result3 = await grep({
|
|
35
|
+
pattern: 'function',
|
|
36
|
+
paths: './src',
|
|
37
|
+
count: true
|
|
38
|
+
});
|
|
39
|
+
console.log('First 5 files:');
|
|
40
|
+
console.log(result3.split('\n').slice(0, 5).join('\n'));
|
|
41
|
+
console.log('\n---\n');
|
|
42
|
+
|
|
43
|
+
// Test 4: Search with context
|
|
44
|
+
console.log('Test 4: Search with 1 line of context');
|
|
45
|
+
const result4 = await grep({
|
|
46
|
+
pattern: 'export.*grep',
|
|
47
|
+
paths: './src/index.js',
|
|
48
|
+
context: 1,
|
|
49
|
+
lineNumbers: true
|
|
50
|
+
});
|
|
51
|
+
console.log('Result:');
|
|
52
|
+
console.log(result4);
|
|
53
|
+
console.log('\n---\n');
|
|
54
|
+
|
|
55
|
+
console.log('✅ All simplified grep tests passed!');
|
|
56
|
+
} catch (error) {
|
|
57
|
+
console.error('❌ Test failed:', error.message);
|
|
58
|
+
console.error(error);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
testSimplifiedGrep();
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { grep } from './src/index.js';
|
|
4
|
+
|
|
5
|
+
async function testGrep() {
|
|
6
|
+
console.log('Testing grep functionality...\n');
|
|
7
|
+
|
|
8
|
+
try {
|
|
9
|
+
// Test 1: Basic search
|
|
10
|
+
console.log('Test 1: Basic search for "TODO" in src directory');
|
|
11
|
+
const result1 = await grep({
|
|
12
|
+
pattern: 'TODO',
|
|
13
|
+
paths: './src',
|
|
14
|
+
lineNumbers: true
|
|
15
|
+
});
|
|
16
|
+
console.log('Result:');
|
|
17
|
+
console.log(result1);
|
|
18
|
+
console.log('\n---\n');
|
|
19
|
+
|
|
20
|
+
// Test 2: Case-insensitive search with count
|
|
21
|
+
console.log('Test 2: Count "function" occurrences (case-insensitive)');
|
|
22
|
+
const result2 = await grep({
|
|
23
|
+
pattern: 'function',
|
|
24
|
+
paths: './src',
|
|
25
|
+
ignoreCase: true,
|
|
26
|
+
count: true
|
|
27
|
+
});
|
|
28
|
+
console.log('Result:');
|
|
29
|
+
console.log(result2);
|
|
30
|
+
console.log('\n---\n');
|
|
31
|
+
|
|
32
|
+
// Test 3: Files with matches
|
|
33
|
+
console.log('Test 3: Files containing "export"');
|
|
34
|
+
const result3 = await grep({
|
|
35
|
+
pattern: 'export',
|
|
36
|
+
paths: './src',
|
|
37
|
+
filesWithMatches: true
|
|
38
|
+
});
|
|
39
|
+
console.log('Result:');
|
|
40
|
+
console.log(result3);
|
|
41
|
+
console.log('\n---\n');
|
|
42
|
+
|
|
43
|
+
console.log('✅ All grep tests passed!');
|
|
44
|
+
} catch (error) {
|
|
45
|
+
console.error('❌ Test failed:', error.message);
|
|
46
|
+
console.error(error);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
testGrep();
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Test Suite for Bundled Binaries
|
|
2
|
+
|
|
3
|
+
This directory contains tests for the bundled binary extraction functionality.
|
|
4
|
+
|
|
5
|
+
## Test Files
|
|
6
|
+
|
|
7
|
+
### `extractor.test.js`
|
|
8
|
+
Unit tests for the binary extractor module (`src/extractor.js`).
|
|
9
|
+
|
|
10
|
+
**Coverage:**
|
|
11
|
+
- ✅ Platform detection (Linux, macOS, Windows)
|
|
12
|
+
- ✅ Unsupported platform error handling
|
|
13
|
+
- ✅ tar.gz archive extraction
|
|
14
|
+
- ✅ ZIP archive extraction (Windows)
|
|
15
|
+
- ✅ Path traversal security validation
|
|
16
|
+
- ✅ Error handling for missing binaries
|
|
17
|
+
- ✅ Error handling for empty archives
|
|
18
|
+
|
|
19
|
+
**Security Tests:**
|
|
20
|
+
- Path traversal attacks (../ sequences)
|
|
21
|
+
- Absolute path rejection
|
|
22
|
+
- Malicious archive handling
|
|
23
|
+
|
|
24
|
+
### `extractor-integration.test.js`
|
|
25
|
+
Integration tests that verify the extraction logic without requiring actual binary files.
|
|
26
|
+
|
|
27
|
+
**Coverage:**
|
|
28
|
+
- ✅ Platform detection logic for all 5 supported platforms
|
|
29
|
+
- ✅ Path safety validation
|
|
30
|
+
- ✅ Archive naming conventions
|
|
31
|
+
- ✅ Binary name detection (Windows vs Unix)
|
|
32
|
+
- ✅ Security validations
|
|
33
|
+
|
|
34
|
+
**Security Tests:**
|
|
35
|
+
- `isPathSafe()` logic verification
|
|
36
|
+
- Path normalization
|
|
37
|
+
- Relative path validation
|
|
38
|
+
- Directory traversal prevention
|
|
39
|
+
|
|
40
|
+
## Running Tests
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# Run all tests
|
|
44
|
+
npm test
|
|
45
|
+
|
|
46
|
+
# Run with coverage
|
|
47
|
+
npm run test:coverage
|
|
48
|
+
|
|
49
|
+
# Run in watch mode
|
|
50
|
+
npm run test:watch
|
|
51
|
+
|
|
52
|
+
# Run verbose
|
|
53
|
+
npm run test:verbose
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Security Test Coverage
|
|
57
|
+
|
|
58
|
+
All security-critical functions have test coverage:
|
|
59
|
+
|
|
60
|
+
1. **Path Traversal Prevention** ✅
|
|
61
|
+
- Tests verify `../ `sequences are rejected
|
|
62
|
+
- Tests verify absolute paths are rejected
|
|
63
|
+
- Tests verify safe relative paths are accepted
|
|
64
|
+
|
|
65
|
+
2. **Archive Extraction** ✅
|
|
66
|
+
- tar.gz extraction with path validation
|
|
67
|
+
- ZIP extraction with path validation
|
|
68
|
+
- Malicious archive rejection
|
|
69
|
+
|
|
70
|
+
3. **Platform Detection** ✅
|
|
71
|
+
- All 5 platforms correctly mapped
|
|
72
|
+
- Unsupported platforms throw errors
|
|
73
|
+
- Correct file extensions selected
|
|
74
|
+
|
|
75
|
+
## Test Dependencies
|
|
76
|
+
|
|
77
|
+
- `@jest/globals` - Test framework
|
|
78
|
+
- `fs-extra` - File system operations
|
|
79
|
+
- `tar` - tar.gz extraction
|
|
80
|
+
- `adm-zip` - ZIP extraction (dynamically imported)
|
|
81
|
+
|
|
82
|
+
## Notes
|
|
83
|
+
|
|
84
|
+
- Tests use dynamic imports for `adm-zip` to handle cases where it's not yet installed
|
|
85
|
+
- Tests skip platform-specific functionality (e.g., Windows ZIP tests on macOS)
|
|
86
|
+
- Security tests run on all platforms and verify the core logic
|
|
87
|
+
- Integration tests don't require actual binary files, only test the logic
|
|
88
|
+
|
|
89
|
+
## Coverage Goals
|
|
90
|
+
|
|
91
|
+
- ✅ Lines: >70%
|
|
92
|
+
- ✅ Functions: >70%
|
|
93
|
+
- ✅ Branches: >70%
|
|
94
|
+
- ✅ Statements: >70%
|
|
95
|
+
|
|
96
|
+
Security-critical functions should aim for 100% coverage.
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for ProbeAgent.compactHistory() method
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { jest } from '@jest/globals';
|
|
6
|
+
import { ProbeAgent } from '../src/agent/ProbeAgent.js';
|
|
7
|
+
|
|
8
|
+
describe('ProbeAgent.compactHistory()', () => {
|
|
9
|
+
let agent;
|
|
10
|
+
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
// Create agent with mock provider to avoid actual API calls
|
|
13
|
+
agent = new ProbeAgent({
|
|
14
|
+
sessionId: 'test-session',
|
|
15
|
+
path: '/tmp/test',
|
|
16
|
+
provider: 'mock',
|
|
17
|
+
debug: false
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
afterEach(async () => {
|
|
22
|
+
if (agent) {
|
|
23
|
+
await agent.cleanup();
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('should compact history and return statistics', async () => {
|
|
28
|
+
// Populate history with multiple segments
|
|
29
|
+
agent.history = [
|
|
30
|
+
{ role: 'system', content: 'You are a helpful assistant' },
|
|
31
|
+
// Segment 1
|
|
32
|
+
{ role: 'user', content: 'Search for functions' },
|
|
33
|
+
{ role: 'assistant', content: '<thinking>I need to search</thinking>' },
|
|
34
|
+
{ role: 'assistant', content: '<search>function</search>' },
|
|
35
|
+
{ role: 'user', content: '<tool_result>Found 10 functions</tool_result>' },
|
|
36
|
+
// Segment 2
|
|
37
|
+
{ role: 'user', content: 'Extract the first one' },
|
|
38
|
+
{ role: 'assistant', content: '<thinking>Let me extract</thinking>' },
|
|
39
|
+
{ role: 'assistant', content: '<extract>file.js:10</extract>' },
|
|
40
|
+
{ role: 'user', content: '<tool_result>function code here</tool_result>' },
|
|
41
|
+
// Segment 3 (active)
|
|
42
|
+
{ role: 'user', content: 'Modify it' },
|
|
43
|
+
{ role: 'assistant', content: '<thinking>I will modify</thinking>' }
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
const stats = await agent.compactHistory();
|
|
47
|
+
|
|
48
|
+
// Check stats
|
|
49
|
+
expect(stats.originalCount).toBe(11);
|
|
50
|
+
expect(stats.compactedCount).toBeLessThan(11);
|
|
51
|
+
expect(stats.removed).toBeGreaterThan(0);
|
|
52
|
+
expect(stats.reductionPercent).toBeGreaterThan(0);
|
|
53
|
+
expect(stats.tokensSaved).toBeGreaterThan(0);
|
|
54
|
+
|
|
55
|
+
// Check history was actually compacted
|
|
56
|
+
expect(agent.history.length).toBeLessThan(11);
|
|
57
|
+
|
|
58
|
+
// System message should be preserved
|
|
59
|
+
expect(agent.history[0].role).toBe('system');
|
|
60
|
+
|
|
61
|
+
// All user messages should be preserved
|
|
62
|
+
const userMessages = agent.history.filter(
|
|
63
|
+
m => m.role === 'user' && !m.content.includes('tool_result')
|
|
64
|
+
);
|
|
65
|
+
expect(userMessages.length).toBe(3);
|
|
66
|
+
|
|
67
|
+
// Old segment thinking should be removed
|
|
68
|
+
const hasOldThinking = agent.history.some(
|
|
69
|
+
m => m.content && m.content.includes('I need to search')
|
|
70
|
+
);
|
|
71
|
+
expect(hasOldThinking).toBe(false);
|
|
72
|
+
|
|
73
|
+
// Active segment thinking should be preserved
|
|
74
|
+
const hasActiveThinking = agent.history.some(
|
|
75
|
+
m => m.content && m.content.includes('I will modify')
|
|
76
|
+
);
|
|
77
|
+
expect(hasActiveThinking).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('should handle empty history gracefully', async () => {
|
|
81
|
+
agent.history = [];
|
|
82
|
+
|
|
83
|
+
const stats = await agent.compactHistory();
|
|
84
|
+
|
|
85
|
+
expect(stats.originalCount).toBe(0);
|
|
86
|
+
expect(stats.compactedCount).toBe(0);
|
|
87
|
+
expect(stats.removed).toBe(0);
|
|
88
|
+
expect(stats.reductionPercent).toBe(0);
|
|
89
|
+
expect(stats.tokensSaved).toBe(0);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('should respect custom options', async () => {
|
|
93
|
+
agent.history = [
|
|
94
|
+
{ role: 'user', content: 'Query 1' },
|
|
95
|
+
{ role: 'assistant', content: '<thinking>Thought 1</thinking>' },
|
|
96
|
+
{ role: 'user', content: '<tool_result>Result 1</tool_result>' },
|
|
97
|
+
{ role: 'user', content: 'Query 2' },
|
|
98
|
+
{ role: 'assistant', content: '<thinking>Thought 2</thinking>' },
|
|
99
|
+
{ role: 'user', content: '<tool_result>Result 2</tool_result>' },
|
|
100
|
+
{ role: 'user', content: 'Query 3' },
|
|
101
|
+
{ role: 'assistant', content: '<thinking>Thought 3</thinking>' }
|
|
102
|
+
];
|
|
103
|
+
|
|
104
|
+
// Keep last 2 segments fully
|
|
105
|
+
const stats = await agent.compactHistory({
|
|
106
|
+
keepLastSegment: true,
|
|
107
|
+
minSegmentsToKeep: 2
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
expect(stats.removed).toBeGreaterThan(0);
|
|
111
|
+
|
|
112
|
+
// Segment 1 should be compacted
|
|
113
|
+
const hasThought1 = agent.history.some(
|
|
114
|
+
m => m.content && m.content.includes('Thought 1')
|
|
115
|
+
);
|
|
116
|
+
expect(hasThought1).toBe(false);
|
|
117
|
+
|
|
118
|
+
// Segments 2 and 3 should be preserved
|
|
119
|
+
const hasThought2 = agent.history.some(
|
|
120
|
+
m => m.content && m.content.includes('Thought 2')
|
|
121
|
+
);
|
|
122
|
+
const hasThought3 = agent.history.some(
|
|
123
|
+
m => m.content && m.content.includes('Thought 3')
|
|
124
|
+
);
|
|
125
|
+
expect(hasThought2).toBe(true);
|
|
126
|
+
expect(hasThought3).toBe(true);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it('should handle history with only system message', async () => {
|
|
130
|
+
agent.history = [
|
|
131
|
+
{ role: 'system', content: 'You are a helpful assistant' }
|
|
132
|
+
];
|
|
133
|
+
|
|
134
|
+
const stats = await agent.compactHistory();
|
|
135
|
+
|
|
136
|
+
expect(stats.removed).toBe(0);
|
|
137
|
+
expect(agent.history.length).toBe(1);
|
|
138
|
+
expect(agent.history[0].role).toBe('system');
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it('should handle history with incomplete segments', async () => {
|
|
142
|
+
agent.history = [
|
|
143
|
+
{ role: 'user', content: 'Query' },
|
|
144
|
+
{ role: 'assistant', content: '<thinking>Processing...</thinking>' }
|
|
145
|
+
];
|
|
146
|
+
|
|
147
|
+
const stats = await agent.compactHistory();
|
|
148
|
+
|
|
149
|
+
// Should not crash, incomplete segment should be preserved
|
|
150
|
+
expect(agent.history.length).toBeGreaterThan(0);
|
|
151
|
+
expect(stats).toBeDefined();
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('should preserve message order', async () => {
|
|
155
|
+
agent.history = [
|
|
156
|
+
{ role: 'system', content: 'System' },
|
|
157
|
+
{ role: 'user', content: 'Query 1' },
|
|
158
|
+
{ role: 'assistant', content: '<search>test</search>' },
|
|
159
|
+
{ role: 'user', content: '<tool_result>Result 1</tool_result>' },
|
|
160
|
+
{ role: 'user', content: 'Query 2' },
|
|
161
|
+
{ role: 'assistant', content: '<thinking>Active</thinking>' }
|
|
162
|
+
];
|
|
163
|
+
|
|
164
|
+
await agent.compactHistory();
|
|
165
|
+
|
|
166
|
+
// First message should still be system
|
|
167
|
+
expect(agent.history[0].role).toBe('system');
|
|
168
|
+
|
|
169
|
+
// User messages should maintain their relative order
|
|
170
|
+
const userMessages = agent.history.filter(m => m.role === 'user');
|
|
171
|
+
expect(userMessages[0].content).toBe('Query 1');
|
|
172
|
+
expect(userMessages[2].content).toBe('Query 2');
|
|
173
|
+
});
|
|
174
|
+
});
|