@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,456 @@
|
|
|
1
|
+
import 'dotenv/config';
|
|
2
|
+
import { ProbeAgent } from '@probelabs/probe/agent';
|
|
3
|
+
import { TokenUsageDisplay } from './tokenUsageDisplay.js';
|
|
4
|
+
import { writeFileSync, existsSync } from 'fs';
|
|
5
|
+
import { readFile, stat } from 'fs/promises';
|
|
6
|
+
import { join, resolve, isAbsolute } from 'path';
|
|
7
|
+
import { TelemetryConfig } from './telemetry.js';
|
|
8
|
+
import { trace } from '@opentelemetry/api';
|
|
9
|
+
import { appTracer } from './appTracer.js';
|
|
10
|
+
|
|
11
|
+
// Image configuration (duplicated from @probelabs/probe/agent/imageConfig for compatibility)
|
|
12
|
+
// TODO: Import from '@probelabs/probe/agent/imageConfig' after next package publish
|
|
13
|
+
const IMAGE_MIME_TYPES = {
|
|
14
|
+
'png': 'image/png',
|
|
15
|
+
'jpg': 'image/jpeg',
|
|
16
|
+
'jpeg': 'image/jpeg',
|
|
17
|
+
'webp': 'image/webp',
|
|
18
|
+
'bmp': 'image/bmp',
|
|
19
|
+
'svg': 'image/svg+xml'
|
|
20
|
+
};
|
|
21
|
+
const SUPPORTED_IMAGE_EXTENSIONS = ['png', 'jpg', 'jpeg', 'webp', 'bmp', 'svg'];
|
|
22
|
+
const getExtensionPattern = (extensions = SUPPORTED_IMAGE_EXTENSIONS) => extensions.join('|');
|
|
23
|
+
|
|
24
|
+
// Parse and validate allowed folders from environment variable
|
|
25
|
+
const allowedFolders = process.env.ALLOWED_FOLDERS
|
|
26
|
+
? process.env.ALLOWED_FOLDERS.split(',').map(folder => folder.trim()).filter(Boolean)
|
|
27
|
+
: [];
|
|
28
|
+
|
|
29
|
+
// Validate folders exist on startup - will be handled by index.js in non-interactive mode
|
|
30
|
+
// This is kept for backward compatibility with direct ProbeChat usage
|
|
31
|
+
const validateFolders = () => {
|
|
32
|
+
if (allowedFolders.length > 0) {
|
|
33
|
+
for (const folder of allowedFolders) {
|
|
34
|
+
const exists = existsSync(folder);
|
|
35
|
+
// Only log if not in non-interactive mode or if in debug mode
|
|
36
|
+
if (process.env.PROBE_NON_INTERACTIVE !== '1' || process.env.DEBUG_CHAT === '1') {
|
|
37
|
+
console.log(`- ${folder} ${exists ? '✓' : '✗ (not found)'}`);
|
|
38
|
+
if (!exists) {
|
|
39
|
+
console.warn(`Warning: Folder "${folder}" does not exist or is not accessible`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
} else {
|
|
44
|
+
// Only log if not in non-interactive mode or if in debug mode
|
|
45
|
+
if (process.env.PROBE_NON_INTERACTIVE !== '1' || process.env.DEBUG_CHAT === '1') {
|
|
46
|
+
console.warn('No folders configured via ALLOWED_FOLDERS. Tools might default to current directory or require explicit paths.');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// Only validate folders on startup if not in non-interactive mode
|
|
52
|
+
if (typeof process !== 'undefined' && !process.env.PROBE_CHAT_SKIP_FOLDER_VALIDATION) {
|
|
53
|
+
validateFolders();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Maximum image file size (20MB) to prevent OOM attacks
|
|
57
|
+
const MAX_IMAGE_FILE_SIZE = 20 * 1024 * 1024;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Security validation for local file paths
|
|
61
|
+
* @param {string} filePath - The file path to validate
|
|
62
|
+
* @param {string} baseDir - The base directory to restrict access to
|
|
63
|
+
* @returns {boolean} - Whether the path is safe to access
|
|
64
|
+
*/
|
|
65
|
+
function isSecureFilePath(filePath, baseDir = process.cwd()) {
|
|
66
|
+
try {
|
|
67
|
+
// Resolve the absolute path
|
|
68
|
+
const absolutePath = isAbsolute(filePath) ? filePath : resolve(baseDir, filePath);
|
|
69
|
+
const normalizedBase = resolve(baseDir);
|
|
70
|
+
|
|
71
|
+
// Ensure the resolved path is within the allowed directory
|
|
72
|
+
return absolutePath.startsWith(normalizedBase);
|
|
73
|
+
} catch (error) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Convert local image file to base64 data URL
|
|
80
|
+
* @param {string} filePath - Path to the image file
|
|
81
|
+
* @param {boolean} debug - Whether to log debug information
|
|
82
|
+
* @returns {Promise<string|null>} - Base64 data URL or null if failed
|
|
83
|
+
*/
|
|
84
|
+
async function convertImageFileToBase64(filePath, debug = false) {
|
|
85
|
+
try {
|
|
86
|
+
// Security check: validate the file path against all allowed directories
|
|
87
|
+
const allowedDirs = allowedFolders.length > 0 ? allowedFolders : [process.cwd()];
|
|
88
|
+
const isPathAllowed = allowedDirs.some(dir => isSecureFilePath(filePath, dir));
|
|
89
|
+
|
|
90
|
+
if (!isPathAllowed) {
|
|
91
|
+
if (debug) {
|
|
92
|
+
console.log(`[DEBUG] Security check failed for path: ${filePath}`);
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Resolve the path - for relative paths, use the first allowed directory as base
|
|
98
|
+
const baseDir = allowedDirs[0];
|
|
99
|
+
const absolutePath = isAbsolute(filePath) ? filePath : resolve(baseDir, filePath);
|
|
100
|
+
|
|
101
|
+
// Check if file exists and get file stats
|
|
102
|
+
let fileStats;
|
|
103
|
+
try {
|
|
104
|
+
fileStats = await stat(absolutePath);
|
|
105
|
+
} catch (error) {
|
|
106
|
+
if (debug) {
|
|
107
|
+
console.log(`[DEBUG] File not found: ${absolutePath}`);
|
|
108
|
+
}
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Validate file size to prevent OOM attacks
|
|
113
|
+
if (fileStats.size > MAX_IMAGE_FILE_SIZE) {
|
|
114
|
+
if (debug) {
|
|
115
|
+
console.log(`[DEBUG] Image file too large: ${absolutePath} (${fileStats.size} bytes, max: ${MAX_IMAGE_FILE_SIZE})`);
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Determine MIME type based on file extension (from shared config)
|
|
121
|
+
const extension = absolutePath.toLowerCase().split('.').pop();
|
|
122
|
+
const mimeType = IMAGE_MIME_TYPES[extension];
|
|
123
|
+
if (!mimeType) {
|
|
124
|
+
if (debug) {
|
|
125
|
+
console.log(`[DEBUG] Unsupported image format: ${extension}`);
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Read file and convert to base64 asynchronously
|
|
131
|
+
const fileBuffer = await readFile(absolutePath);
|
|
132
|
+
const base64Data = fileBuffer.toString('base64');
|
|
133
|
+
const dataUrl = `data:${mimeType};base64,${base64Data}`;
|
|
134
|
+
|
|
135
|
+
if (debug) {
|
|
136
|
+
console.log(`[DEBUG] Successfully converted ${absolutePath} to base64 (${fileBuffer.length} bytes)`);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return dataUrl;
|
|
140
|
+
} catch (error) {
|
|
141
|
+
if (debug) {
|
|
142
|
+
console.log(`[DEBUG] Error converting file to base64: ${error.message}`);
|
|
143
|
+
}
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Export the extractImageUrls function for testing
|
|
149
|
+
export { extractImageUrls };
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Extract image URLs and local file paths from message text
|
|
153
|
+
* @param {string} message - The message text to analyze
|
|
154
|
+
* @param {boolean} debug - Whether to log debug information
|
|
155
|
+
* @returns {Promise<Object>} Promise resolving to { urls: Array, cleanedMessage: string }
|
|
156
|
+
*/
|
|
157
|
+
async function extractImageUrls(message, debug = false) {
|
|
158
|
+
// This function should be called within the session context, so it will inherit the trace ID
|
|
159
|
+
const tracer = trace.getTracer('probe-chat', '1.0.0');
|
|
160
|
+
return tracer.startActiveSpan('content.image.extract', async (span) => {
|
|
161
|
+
try {
|
|
162
|
+
// Pattern to match image URLs, base64 data, and local file paths:
|
|
163
|
+
// 1. GitHub private-user-images URLs (always images, regardless of extension)
|
|
164
|
+
// 2. GitHub user-attachments/assets URLs (always images, regardless of extension)
|
|
165
|
+
// 3. URLs with common image extensions (PNG, JPG, JPEG, WebP, BMP, SVG)
|
|
166
|
+
// 4. Base64 data URLs (data:image/...)
|
|
167
|
+
// 5. Local file paths with image extensions (relative and absolute)
|
|
168
|
+
// Updated to stop at quotes, spaces, or common HTML/XML delimiters
|
|
169
|
+
// Pattern dynamically generated from shared config
|
|
170
|
+
const extPattern = getExtensionPattern();
|
|
171
|
+
const imageUrlPattern = new RegExp(`(?:data:image/[a-zA-Z]*;base64,[A-Za-z0-9+/=]+|https?://(?:(?:private-user-images\\.githubusercontent\\.com|github\\.com/user-attachments/assets)/[^\\s"'<>]+|[^\\s"'<>]+\\.(?:${extPattern})(?:\\?[^\\s"'<>]*)?)|(?:\\.?\\.?/)?[^\\s"'<>]*\\.(?:${extPattern}))`, 'gi');
|
|
172
|
+
|
|
173
|
+
span.setAttributes({
|
|
174
|
+
'message.length': message.length,
|
|
175
|
+
'debug.enabled': debug
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
if (debug) {
|
|
179
|
+
console.log(`[DEBUG] Scanning message for image URLs. Message length: ${message.length}`);
|
|
180
|
+
console.log(`[DEBUG] Image URL pattern: ${imageUrlPattern.toString()}`);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const urls = [];
|
|
184
|
+
const foundPatterns = [];
|
|
185
|
+
let match;
|
|
186
|
+
|
|
187
|
+
while ((match = imageUrlPattern.exec(message)) !== null) {
|
|
188
|
+
foundPatterns.push(match[0]);
|
|
189
|
+
if (debug) {
|
|
190
|
+
console.log(`[DEBUG] Found image pattern: ${match[0]}`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Process each found pattern - convert local files to base64, keep URLs as-is
|
|
195
|
+
for (const pattern of foundPatterns) {
|
|
196
|
+
// Check if it's already a URL or base64 data
|
|
197
|
+
if (pattern.startsWith('http') || pattern.startsWith('data:image/')) {
|
|
198
|
+
urls.push(pattern);
|
|
199
|
+
if (debug) {
|
|
200
|
+
console.log(`[DEBUG] Using URL/base64 as-is: ${pattern.substring(0, 50)}...`);
|
|
201
|
+
}
|
|
202
|
+
} else {
|
|
203
|
+
// It's a local file path - convert to base64
|
|
204
|
+
const base64Data = await convertImageFileToBase64(pattern, debug);
|
|
205
|
+
if (base64Data) {
|
|
206
|
+
urls.push(base64Data);
|
|
207
|
+
if (debug) {
|
|
208
|
+
console.log(`[DEBUG] Converted local file ${pattern} to base64`);
|
|
209
|
+
}
|
|
210
|
+
} else {
|
|
211
|
+
if (debug) {
|
|
212
|
+
console.log(`[DEBUG] Failed to convert local file: ${pattern}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Clean the message by removing found patterns
|
|
219
|
+
let cleanedMessage = message;
|
|
220
|
+
foundPatterns.forEach(pattern => {
|
|
221
|
+
cleanedMessage = cleanedMessage.replace(pattern, '').trim();
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
// Clean up any remaining extra whitespace
|
|
225
|
+
cleanedMessage = cleanedMessage.replace(/\s+/g, ' ').trim();
|
|
226
|
+
|
|
227
|
+
span.setAttributes({
|
|
228
|
+
'patterns.found': foundPatterns.length,
|
|
229
|
+
'images.processed': urls.length,
|
|
230
|
+
'message.cleaned_length': cleanedMessage.length
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
if (debug) {
|
|
234
|
+
console.log(`[DEBUG] Found ${foundPatterns.length} patterns, processed ${urls.length} images`);
|
|
235
|
+
console.log(`[DEBUG] Cleaned message length: ${cleanedMessage.length}`);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return { urls, cleanedMessage };
|
|
239
|
+
} finally {
|
|
240
|
+
span.end();
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* ProbeChat class using ProbeAgent with MCP support
|
|
247
|
+
*/
|
|
248
|
+
export class ProbeChat {
|
|
249
|
+
/**
|
|
250
|
+
* Create a new ProbeChat instance
|
|
251
|
+
* @param {Object} options - Configuration options
|
|
252
|
+
* @param {string} [options.sessionId] - Optional session ID
|
|
253
|
+
* @param {boolean} [options.isNonInteractive=false] - Suppress internal logs if true
|
|
254
|
+
* @param {string} [options.customPrompt] - Custom prompt to replace the default system message
|
|
255
|
+
* @param {string} [options.promptType] - Predefined prompt type (architect, code-review, support)
|
|
256
|
+
* @param {boolean} [options.allowEdit=false] - Allow the use of the 'implement' tool
|
|
257
|
+
* @param {string} [options.provider] - Force specific AI provider
|
|
258
|
+
* @param {string} [options.model] - Override model name
|
|
259
|
+
* @param {boolean} [options.debug] - Enable debug mode
|
|
260
|
+
* @param {boolean} [options.enableMcp=false] - Enable MCP tool integration
|
|
261
|
+
* @param {Array} [options.mcpServers] - MCP server configurations
|
|
262
|
+
* @param {boolean} [options.enableBash=false] - Enable bash command execution
|
|
263
|
+
* @param {Object} [options.bashConfig] - Bash configuration options
|
|
264
|
+
* @param {string} [options.completionPrompt] - Custom prompt to run after attempt_completion for validation/review (runs before mermaid/JSON validation)
|
|
265
|
+
*/
|
|
266
|
+
constructor(options = {}) {
|
|
267
|
+
this.isNonInteractive = options.isNonInteractive || process.env.PROBE_NON_INTERACTIVE === '1';
|
|
268
|
+
this.debug = options.debug || process.env.DEBUG_CHAT === '1';
|
|
269
|
+
|
|
270
|
+
// Initialize ProbeAgent with MCP support
|
|
271
|
+
const agentOptions = {
|
|
272
|
+
...options,
|
|
273
|
+
path: allowedFolders.length > 0 ? allowedFolders[0] : process.cwd(),
|
|
274
|
+
enableMcp: options.enableMcp || process.env.ENABLE_MCP === '1',
|
|
275
|
+
mcpServers: options.mcpServers
|
|
276
|
+
};
|
|
277
|
+
|
|
278
|
+
this.agent = new ProbeAgent(agentOptions);
|
|
279
|
+
|
|
280
|
+
// Initialize telemetry and token display
|
|
281
|
+
this.telemetryConfig = new TelemetryConfig();
|
|
282
|
+
this.tokenUsage = new TokenUsageDisplay();
|
|
283
|
+
|
|
284
|
+
if (this.debug) {
|
|
285
|
+
console.log(`[DEBUG] ProbeChat initialized with MCP ${agentOptions.enableMcp ? 'enabled' : 'disabled'}`);
|
|
286
|
+
|
|
287
|
+
// Log available tools after a short delay to allow MCP initialization
|
|
288
|
+
setTimeout(() => {
|
|
289
|
+
this.logAvailableTools();
|
|
290
|
+
}, 100);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Log all available tools (native + MCP) in debug mode
|
|
296
|
+
*/
|
|
297
|
+
logAvailableTools() {
|
|
298
|
+
if (!this.debug) return;
|
|
299
|
+
|
|
300
|
+
console.log('\n[DEBUG] ========================================');
|
|
301
|
+
console.log('[DEBUG] All Available Tools:');
|
|
302
|
+
console.log('[DEBUG] ========================================');
|
|
303
|
+
|
|
304
|
+
// Get native tools from agent
|
|
305
|
+
if (this.agent.toolImplementations) {
|
|
306
|
+
console.log('[DEBUG] Native Tools:');
|
|
307
|
+
const nativeTools = Object.keys(this.agent.toolImplementations);
|
|
308
|
+
nativeTools.forEach(toolName => {
|
|
309
|
+
const tool = this.agent.toolImplementations[toolName];
|
|
310
|
+
const desc = tool.description || 'No description';
|
|
311
|
+
console.log(`[DEBUG] - ${toolName}: ${desc}`);
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// Get MCP tools if available
|
|
316
|
+
if (this.agent.mcpBridge && this.agent.mcpBridge.mcpTools) {
|
|
317
|
+
const mcpTools = Object.keys(this.agent.mcpBridge.mcpTools);
|
|
318
|
+
if (mcpTools.length > 0) {
|
|
319
|
+
console.log('[DEBUG] MCP Tools:');
|
|
320
|
+
mcpTools.forEach(toolName => {
|
|
321
|
+
const tool = this.agent.mcpBridge.mcpTools[toolName];
|
|
322
|
+
const desc = tool.description || 'No description';
|
|
323
|
+
console.log(`[DEBUG] - ${toolName}: ${desc}`);
|
|
324
|
+
});
|
|
325
|
+
} else {
|
|
326
|
+
console.log('[DEBUG] MCP Tools: None loaded');
|
|
327
|
+
}
|
|
328
|
+
} else {
|
|
329
|
+
console.log('[DEBUG] MCP Tools: MCP not enabled or not initialized');
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
console.log('[DEBUG] ========================================\n');
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Answer a question using the agentic flow with optional image support
|
|
337
|
+
* @param {string} message - The user's question
|
|
338
|
+
* @param {Object} [options] - Optional configuration
|
|
339
|
+
* @param {string} [options.schema] - JSON schema for structured output
|
|
340
|
+
* @param {Array} [options.images] - Array of image data (base64 strings or URLs)
|
|
341
|
+
* @returns {Promise<string>} - The final answer
|
|
342
|
+
*/
|
|
343
|
+
async chat(message, options = {}) {
|
|
344
|
+
if (!message || typeof message !== 'string' || message.trim().length === 0) {
|
|
345
|
+
throw new Error('Message is required and must be a non-empty string');
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// Extract images from the message text if not provided in options
|
|
349
|
+
let images = options.images || [];
|
|
350
|
+
let cleanedMessage = message;
|
|
351
|
+
|
|
352
|
+
if (!images.length) {
|
|
353
|
+
const extracted = await extractImageUrls(message, this.debug);
|
|
354
|
+
images = extracted.urls;
|
|
355
|
+
cleanedMessage = extracted.cleanedMessage;
|
|
356
|
+
|
|
357
|
+
if (this.debug && images.length > 0) {
|
|
358
|
+
console.log(`[DEBUG] Extracted ${images.length} images from message`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Use ProbeAgent to answer the question
|
|
363
|
+
const result = await this.agent.answer(cleanedMessage, images, options);
|
|
364
|
+
|
|
365
|
+
// Update token usage display
|
|
366
|
+
this.tokenUsage.updateFromTokenCounter(this.agent.tokenCounter);
|
|
367
|
+
|
|
368
|
+
if (!this.isNonInteractive) {
|
|
369
|
+
this.tokenUsage.display();
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
return result;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Get session ID
|
|
377
|
+
*/
|
|
378
|
+
getSessionId() {
|
|
379
|
+
return this.agent.sessionId;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Get usage summary for the current session
|
|
384
|
+
*/
|
|
385
|
+
getUsageSummary() {
|
|
386
|
+
return this.agent.tokenCounter.getUsageSummary();
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Clear conversation history
|
|
391
|
+
*/
|
|
392
|
+
clearHistory() {
|
|
393
|
+
this.agent.clearHistory();
|
|
394
|
+
this.tokenUsage.clear();
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Export conversation history
|
|
399
|
+
*/
|
|
400
|
+
exportHistory() {
|
|
401
|
+
return this.agent.history.map(msg => ({ ...msg }));
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Save conversation history to file
|
|
406
|
+
*/
|
|
407
|
+
saveHistory(filename) {
|
|
408
|
+
if (!filename) {
|
|
409
|
+
filename = `probe-chat-history-${this.agent.sessionId}-${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}.json`;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
const historyData = {
|
|
413
|
+
sessionId: this.agent.sessionId,
|
|
414
|
+
timestamp: new Date().toISOString(),
|
|
415
|
+
messages: this.exportHistory(),
|
|
416
|
+
usage: this.getUsageSummary()
|
|
417
|
+
};
|
|
418
|
+
|
|
419
|
+
writeFileSync(filename, JSON.stringify(historyData, null, 2));
|
|
420
|
+
|
|
421
|
+
if (!this.isNonInteractive) {
|
|
422
|
+
console.log(`Conversation history saved to: ${filename}`);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
return filename;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Cancel current request
|
|
430
|
+
*/
|
|
431
|
+
cancel() {
|
|
432
|
+
this.agent.cancel();
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* Clean up resources (including MCP connections)
|
|
437
|
+
*/
|
|
438
|
+
async cleanup() {
|
|
439
|
+
try {
|
|
440
|
+
await this.agent.cleanup();
|
|
441
|
+
} catch (error) {
|
|
442
|
+
// Log the error but don't throw to ensure graceful cleanup
|
|
443
|
+
if (!this.isNonInteractive) {
|
|
444
|
+
console.warn('Warning during cleanup:', error.message);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// Create the default instance using environment variables
|
|
451
|
+
export const chat = new ProbeChat({
|
|
452
|
+
enableMcp: process.env.ENABLE_MCP === '1',
|
|
453
|
+
debug: process.env.DEBUG_CHAT === '1'
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
export default chat;
|