@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,643 @@
|
|
|
1
|
+
import { describe, test, expect, beforeEach } from '@jest/globals';
|
|
2
|
+
import { ProbeAgent } from '../../src/agent/ProbeAgent.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Realistic integration test for clone() method
|
|
6
|
+
* Simulates a real conversation with schema, mermaid fixes, tool reminders, etc.
|
|
7
|
+
*/
|
|
8
|
+
describe('ProbeAgent.clone() - Realistic Integration', () => {
|
|
9
|
+
let baseAgent;
|
|
10
|
+
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
baseAgent = new ProbeAgent({
|
|
13
|
+
sessionId: 'realistic-test',
|
|
14
|
+
path: process.cwd(),
|
|
15
|
+
debug: false
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test('should clean a realistic session with all types of internal messages', () => {
|
|
20
|
+
// Simulate a realistic conversation with schema, mermaid, and multiple reminders
|
|
21
|
+
baseAgent.history = [
|
|
22
|
+
// 1. System message (should be kept)
|
|
23
|
+
{
|
|
24
|
+
role: 'system',
|
|
25
|
+
content: 'You are a helpful AI coding assistant with access to code search tools.'
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
// 2. User's first question
|
|
29
|
+
{
|
|
30
|
+
role: 'user',
|
|
31
|
+
content: 'Analyze the authentication system and create a diagram'
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
// 3. Assistant starts working
|
|
35
|
+
{
|
|
36
|
+
role: 'assistant',
|
|
37
|
+
content: 'I\'ll analyze the authentication system for you.\n\n<search>\n<query>authentication login</query>\n</search>'
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
// 4. Tool reminder (should be stripped)
|
|
41
|
+
{
|
|
42
|
+
role: 'user',
|
|
43
|
+
content: 'Please use one of the available tools to help answer the question, or use attempt_completion if you have enough information.\n\nRemember: Use proper XML format with BOTH opening and closing tags:\n\n<tool_name>\n<parameter>value</parameter>\n</tool_name>'
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
// 5. Assistant uses tool
|
|
47
|
+
{
|
|
48
|
+
role: 'assistant',
|
|
49
|
+
content: '<search>\n<query>auth</query>\n</search>'
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
// 6. User provides tool result
|
|
53
|
+
{
|
|
54
|
+
role: 'user',
|
|
55
|
+
content: 'Found 15 results for "auth":\n\n1. src/auth/login.js - Login handler\n2. src/auth/token.js - JWT token management'
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
// 7. Assistant creates a mermaid diagram (with errors)
|
|
59
|
+
{
|
|
60
|
+
role: 'assistant',
|
|
61
|
+
content: 'Here\'s the authentication flow:\n\n```mermaid\ngraph TD\nA -> B\nC -> D\n```'
|
|
62
|
+
},
|
|
63
|
+
|
|
64
|
+
// 8. Mermaid fix prompt (should be stripped)
|
|
65
|
+
{
|
|
66
|
+
role: 'user',
|
|
67
|
+
content: 'The mermaid diagram in your response has syntax errors. Please fix the mermaid syntax errors.\n\nHere is the corrected version:\n```mermaid\ngraph TD\nA --> B\nC --> D\n```'
|
|
68
|
+
},
|
|
69
|
+
|
|
70
|
+
// 9. Assistant fixes mermaid
|
|
71
|
+
{
|
|
72
|
+
role: 'assistant',
|
|
73
|
+
content: 'Thank you, here\'s the corrected diagram:\n\n```mermaid\ngraph TD\nA --> B\nC --> D\n```'
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
// 10. User asks for structured output
|
|
77
|
+
{
|
|
78
|
+
role: 'user',
|
|
79
|
+
content: 'Now provide a security analysis in JSON format'
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
// 11. Assistant responds (not matching schema)
|
|
83
|
+
{
|
|
84
|
+
role: 'assistant',
|
|
85
|
+
content: 'Here is my analysis: The authentication system looks good.'
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
// 12. Schema reminder (should be stripped)
|
|
89
|
+
{
|
|
90
|
+
role: 'user',
|
|
91
|
+
content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.\n\nYour response must conform to this schema:\n{\n "type": "object",\n "properties": {\n "vulnerabilities": { "type": "array" },\n "recommendations": { "type": "array" }\n }\n}'
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
// 13. Assistant provides structured response
|
|
95
|
+
{
|
|
96
|
+
role: 'assistant',
|
|
97
|
+
content: '{\n "vulnerabilities": ["No password hashing detected"],\n "recommendations": ["Implement bcrypt for password hashing"]\n}'
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
// 14. Another tool reminder (should be stripped)
|
|
101
|
+
{
|
|
102
|
+
role: 'user',
|
|
103
|
+
content: 'Please use one of the available tools to help answer the question, or use attempt_completion if you have enough information.\n\nRemember: Use proper XML format with BOTH opening and closing tags:\n\n<tool_name>\n<parameter>value</parameter>\n</tool_name>\n\nOr for quick completion if your previous response was already correct and complete:\n<attempt_complete>\n\nIMPORTANT: When using <attempt_complete>, this must be the ONLY content in your response.'
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
// 15. Assistant completes
|
|
107
|
+
{
|
|
108
|
+
role: 'assistant',
|
|
109
|
+
content: '<attempt_completion>\nI\'ve completed the security analysis of the authentication system.\n</attempt_completion>'
|
|
110
|
+
},
|
|
111
|
+
|
|
112
|
+
// 16. User asks another question
|
|
113
|
+
{
|
|
114
|
+
role: 'user',
|
|
115
|
+
content: 'What about the authorization system?'
|
|
116
|
+
},
|
|
117
|
+
|
|
118
|
+
// 17. Assistant responds
|
|
119
|
+
{
|
|
120
|
+
role: 'assistant',
|
|
121
|
+
content: 'Let me search for authorization code.\n\n<search>\n<query>authorization permissions</query>\n</search>'
|
|
122
|
+
},
|
|
123
|
+
|
|
124
|
+
// 18. JSON correction prompt (should be stripped)
|
|
125
|
+
{
|
|
126
|
+
role: 'user',
|
|
127
|
+
content: 'Your response does not match the expected JSON schema. Please provide a valid JSON response.\n\nSchema validation error: Expected object with "status" field'
|
|
128
|
+
},
|
|
129
|
+
|
|
130
|
+
// 19. Assistant fixes JSON
|
|
131
|
+
{
|
|
132
|
+
role: 'assistant',
|
|
133
|
+
content: '{\n "status": "analyzing",\n "findings": []\n}'
|
|
134
|
+
}
|
|
135
|
+
];
|
|
136
|
+
|
|
137
|
+
// Clone with default settings (strip internal messages)
|
|
138
|
+
const clonedAgent = baseAgent.clone({
|
|
139
|
+
stripInternalMessages: true
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// Verify the clone has cleaned history
|
|
143
|
+
expect(clonedAgent.history.length).toBeLessThan(baseAgent.history.length);
|
|
144
|
+
|
|
145
|
+
// Count message types in original
|
|
146
|
+
const originalUserMessages = baseAgent.history.filter(m => m.role === 'user').length;
|
|
147
|
+
const originalAssistantMessages = baseAgent.history.filter(m => m.role === 'assistant').length;
|
|
148
|
+
const originalSystemMessages = baseAgent.history.filter(m => m.role === 'system').length;
|
|
149
|
+
|
|
150
|
+
console.log(`\n📊 Original history: ${baseAgent.history.length} messages`);
|
|
151
|
+
console.log(` - System: ${originalSystemMessages}`);
|
|
152
|
+
console.log(` - User: ${originalUserMessages}`);
|
|
153
|
+
console.log(` - Assistant: ${originalAssistantMessages}`);
|
|
154
|
+
|
|
155
|
+
// Count message types in clone
|
|
156
|
+
const clonedUserMessages = clonedAgent.history.filter(m => m.role === 'user').length;
|
|
157
|
+
const clonedAssistantMessages = clonedAgent.history.filter(m => m.role === 'assistant').length;
|
|
158
|
+
const clonedSystemMessages = clonedAgent.history.filter(m => m.role === 'system').length;
|
|
159
|
+
|
|
160
|
+
console.log(`\n📊 Cloned history: ${clonedAgent.history.length} messages`);
|
|
161
|
+
console.log(` - System: ${clonedSystemMessages}`);
|
|
162
|
+
console.log(` - User: ${clonedUserMessages}`);
|
|
163
|
+
console.log(` - Assistant: ${clonedAssistantMessages}`);
|
|
164
|
+
|
|
165
|
+
// Verify expectations
|
|
166
|
+
// Original: 19 messages (1 system, 9 user, 9 assistant)
|
|
167
|
+
expect(baseAgent.history).toHaveLength(19);
|
|
168
|
+
expect(originalSystemMessages).toBe(1);
|
|
169
|
+
expect(originalUserMessages).toBe(9);
|
|
170
|
+
expect(originalAssistantMessages).toBe(9);
|
|
171
|
+
|
|
172
|
+
// New truncation behavior: Find FIRST schema message (index 11) and truncate from there
|
|
173
|
+
// Messages before index 11:
|
|
174
|
+
// 0: system, 1: user, 2: assistant, 3: user (tool reminder - REMOVED), 4: assistant,
|
|
175
|
+
// 5: user (tool result), 6: assistant, 7: user (mermaid fix - REMOVED), 8: assistant,
|
|
176
|
+
// 9: user, 10: assistant
|
|
177
|
+
// 11: FIRST SCHEMA MESSAGE → truncate from here
|
|
178
|
+
// After truncation and removing non-schema internal messages (tool reminder at 3, mermaid at 7):
|
|
179
|
+
// System + 2 real user messages + 1 tool result + 5 assistant responses = 9 total
|
|
180
|
+
expect(clonedAgent.history).toHaveLength(9);
|
|
181
|
+
expect(clonedSystemMessages).toBe(1);
|
|
182
|
+
expect(clonedUserMessages).toBe(3); // 2 real questions + 1 tool result
|
|
183
|
+
expect(clonedAssistantMessages).toBe(5); // Assistant responses before schema
|
|
184
|
+
|
|
185
|
+
// Verify system message is preserved
|
|
186
|
+
expect(clonedAgent.history[0].role).toBe('system');
|
|
187
|
+
expect(clonedAgent.history[0].content).toContain('helpful AI coding assistant');
|
|
188
|
+
|
|
189
|
+
// Verify real user questions are kept (before schema truncation)
|
|
190
|
+
const userContents = clonedAgent.history
|
|
191
|
+
.filter(m => m.role === 'user')
|
|
192
|
+
.map(m => m.content);
|
|
193
|
+
|
|
194
|
+
expect(userContents).toContain('Analyze the authentication system and create a diagram');
|
|
195
|
+
expect(userContents.some(c => c.includes('Found 15 results'))).toBe(true); // Tool result
|
|
196
|
+
expect(userContents).toContain('Now provide a security analysis in JSON format');
|
|
197
|
+
|
|
198
|
+
// Verify internal messages are NOT in clone
|
|
199
|
+
const allContent = clonedAgent.history.map(m => m.content).join('\n');
|
|
200
|
+
|
|
201
|
+
expect(allContent).not.toContain('IMPORTANT: A schema was provided');
|
|
202
|
+
expect(allContent).not.toContain('Please use one of the available tools');
|
|
203
|
+
expect(allContent).not.toContain('The mermaid diagram in your response has syntax errors');
|
|
204
|
+
expect(allContent).not.toContain('Your response does not match the expected JSON schema');
|
|
205
|
+
expect(allContent).not.toContain('When using <attempt_complete>, this must be the ONLY content');
|
|
206
|
+
|
|
207
|
+
// Verify assistant responses before schema are kept
|
|
208
|
+
expect(allContent).toContain('I\'ll analyze the authentication system');
|
|
209
|
+
expect(allContent).toContain('corrected diagram');
|
|
210
|
+
// These are AFTER the schema message, so should NOT be in clone:
|
|
211
|
+
expect(allContent).not.toContain('vulnerabilities'); // After schema at index 12
|
|
212
|
+
expect(allContent).not.toContain('authorization permissions'); // After schema at index 16
|
|
213
|
+
|
|
214
|
+
console.log(`\n✅ Successfully removed ${baseAgent.history.length - clonedAgent.history.length} internal messages`);
|
|
215
|
+
console.log('✅ All meaningful conversation content preserved');
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
test('should preserve all messages when stripInternalMessages is false', () => {
|
|
219
|
+
// Same realistic history
|
|
220
|
+
baseAgent.history = [
|
|
221
|
+
{ role: 'system', content: 'System' },
|
|
222
|
+
{ role: 'user', content: 'Real question' },
|
|
223
|
+
{ role: 'assistant', content: 'Answer' },
|
|
224
|
+
{ role: 'user', content: 'IMPORTANT: A schema was provided. You MUST respond...' },
|
|
225
|
+
{ role: 'assistant', content: 'Schema response' },
|
|
226
|
+
{ role: 'user', content: 'Please use one of the available tools...' },
|
|
227
|
+
{ role: 'assistant', content: 'Tool call' }
|
|
228
|
+
];
|
|
229
|
+
|
|
230
|
+
const clonedAgent = baseAgent.clone({
|
|
231
|
+
stripInternalMessages: false
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
// Should keep ALL messages including internal ones
|
|
235
|
+
expect(clonedAgent.history).toHaveLength(baseAgent.history.length);
|
|
236
|
+
expect(clonedAgent.history).toHaveLength(7);
|
|
237
|
+
|
|
238
|
+
const allContent = clonedAgent.history.map(m => m.content).join('\n');
|
|
239
|
+
expect(allContent).toContain('IMPORTANT: A schema was provided');
|
|
240
|
+
expect(allContent).toContain('Please use one of the available tools');
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
test('should handle complex content structures in realistic scenario', () => {
|
|
244
|
+
baseAgent.history = [
|
|
245
|
+
{ role: 'system', content: 'System' },
|
|
246
|
+
// User message with images
|
|
247
|
+
{
|
|
248
|
+
role: 'user',
|
|
249
|
+
content: [
|
|
250
|
+
{ type: 'text', text: 'Analyze this screenshot' },
|
|
251
|
+
{ type: 'image', image: 'data:image/png;base64,iVBORw0KGg...' }
|
|
252
|
+
]
|
|
253
|
+
},
|
|
254
|
+
{ role: 'assistant', content: 'I can see the screenshot shows...' },
|
|
255
|
+
// Internal reminder (should be stripped)
|
|
256
|
+
{
|
|
257
|
+
role: 'user',
|
|
258
|
+
content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.'
|
|
259
|
+
},
|
|
260
|
+
// User message with complex content (should be kept)
|
|
261
|
+
{
|
|
262
|
+
role: 'user',
|
|
263
|
+
content: [
|
|
264
|
+
{ type: 'text', text: 'Provide analysis in JSON' }
|
|
265
|
+
]
|
|
266
|
+
},
|
|
267
|
+
{ role: 'assistant', content: '{"analysis": "complete"}' }
|
|
268
|
+
];
|
|
269
|
+
|
|
270
|
+
const clonedAgent = baseAgent.clone();
|
|
271
|
+
|
|
272
|
+
// Truncates at schema message (index 3)
|
|
273
|
+
// Keeps: 0 (system), 1 (user with image), 2 (assistant)
|
|
274
|
+
// Removes: 3 (schema), 4 (user), 5 (assistant)
|
|
275
|
+
expect(clonedAgent.history).toHaveLength(3);
|
|
276
|
+
|
|
277
|
+
// Verify complex content structures are preserved
|
|
278
|
+
const userWithImage = clonedAgent.history.find(m =>
|
|
279
|
+
Array.isArray(m.content) && m.content.some(c => c.type === 'image')
|
|
280
|
+
);
|
|
281
|
+
expect(userWithImage).toBeDefined();
|
|
282
|
+
expect(userWithImage.content).toHaveLength(2);
|
|
283
|
+
expect(userWithImage.content[1].type).toBe('image');
|
|
284
|
+
|
|
285
|
+
// Verify internal message was removed (via truncation)
|
|
286
|
+
const schemaReminder = clonedAgent.history.find(m =>
|
|
287
|
+
typeof m.content === 'string' && m.content.includes('IMPORTANT: A schema was provided')
|
|
288
|
+
);
|
|
289
|
+
expect(schemaReminder).toBeUndefined();
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
test('should handle session with multiple schema attempts', () => {
|
|
293
|
+
// Realistic scenario: AI fails schema validation multiple times
|
|
294
|
+
baseAgent.history = [
|
|
295
|
+
{ role: 'system', content: 'System' },
|
|
296
|
+
{ role: 'user', content: 'Generate a report' },
|
|
297
|
+
{ role: 'assistant', content: 'Here is my report' },
|
|
298
|
+
// First schema reminder
|
|
299
|
+
{
|
|
300
|
+
role: 'user',
|
|
301
|
+
content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.\nYour response must conform to this schema: {...}'
|
|
302
|
+
},
|
|
303
|
+
{ role: 'assistant', content: '{"incomplete": true}' },
|
|
304
|
+
// Second schema reminder (JSON correction)
|
|
305
|
+
{
|
|
306
|
+
role: 'user',
|
|
307
|
+
content: 'Your response does not match the expected JSON schema. Please provide a valid JSON response.\n\nSchema validation error: Missing required field "status"'
|
|
308
|
+
},
|
|
309
|
+
{ role: 'assistant', content: '{"status": "complete", "data": {}}' },
|
|
310
|
+
// Third schema reminder
|
|
311
|
+
{
|
|
312
|
+
role: 'user',
|
|
313
|
+
content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.'
|
|
314
|
+
},
|
|
315
|
+
{ role: 'assistant', content: '{"status": "complete", "data": {}, "metadata": {}}' }
|
|
316
|
+
];
|
|
317
|
+
|
|
318
|
+
const clonedAgent = baseAgent.clone();
|
|
319
|
+
|
|
320
|
+
// Truncates at first schema message (index 3)
|
|
321
|
+
// Original: 9 messages (0-8)
|
|
322
|
+
// Keeps: 0 (system), 1 (user), 2 (assistant)
|
|
323
|
+
// Removes: 3 (schema), 4 (assistant), 5 (schema), 6 (assistant), 7 (schema), 8 (assistant)
|
|
324
|
+
expect(baseAgent.history).toHaveLength(9);
|
|
325
|
+
expect(clonedAgent.history).toHaveLength(3);
|
|
326
|
+
|
|
327
|
+
expect(clonedAgent.history.filter(m => m.role === 'system')).toHaveLength(1);
|
|
328
|
+
expect(clonedAgent.history.filter(m => m.role === 'user')).toHaveLength(1); // Only the real user question
|
|
329
|
+
expect(clonedAgent.history.filter(m => m.role === 'assistant')).toHaveLength(1); // Only first attempt before schema
|
|
330
|
+
|
|
331
|
+
// Verify no schema reminders remain
|
|
332
|
+
const allContent = clonedAgent.history.map(m => m.content).join('\n');
|
|
333
|
+
expect(allContent).not.toContain('IMPORTANT: A schema was provided');
|
|
334
|
+
expect(allContent).not.toContain('does not match the expected JSON schema');
|
|
335
|
+
expect(allContent).not.toContain('{"incomplete": true}'); // After schema
|
|
336
|
+
expect(allContent).not.toContain('{"status": "complete"'); // After schema
|
|
337
|
+
|
|
338
|
+
// Verify the real user message is kept
|
|
339
|
+
const userMessages = clonedAgent.history.filter(m => m.role === 'user');
|
|
340
|
+
expect(userMessages[0].content).toBe('Generate a report');
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
test('should handle session with multiple mermaid fix attempts', () => {
|
|
344
|
+
// Realistic scenario: Multiple mermaid syntax errors
|
|
345
|
+
baseAgent.history = [
|
|
346
|
+
{ role: 'system', content: 'System' },
|
|
347
|
+
{ role: 'user', content: 'Create a flowchart' },
|
|
348
|
+
{ role: 'assistant', content: '```mermaid\ngraph TD\nA -> B\n```' },
|
|
349
|
+
// First mermaid fix
|
|
350
|
+
{
|
|
351
|
+
role: 'user',
|
|
352
|
+
content: 'The mermaid diagram in your response has syntax errors. Please fix the mermaid syntax errors.\n\nHere is the corrected version:\n```mermaid\ngraph TD\nA --> B\n```'
|
|
353
|
+
},
|
|
354
|
+
{ role: 'assistant', content: '```mermaid\ngraph TD\nA --> B\nC -> D\n```' },
|
|
355
|
+
// Second mermaid fix
|
|
356
|
+
{
|
|
357
|
+
role: 'user',
|
|
358
|
+
content: 'The mermaid diagram in your response has syntax errors. Please fix the mermaid syntax errors.'
|
|
359
|
+
},
|
|
360
|
+
{ role: 'assistant', content: '```mermaid\ngraph TD\nA --> B\nC --> D\n```' }
|
|
361
|
+
];
|
|
362
|
+
|
|
363
|
+
const clonedAgent = baseAgent.clone();
|
|
364
|
+
|
|
365
|
+
// Should remove both mermaid fix prompts
|
|
366
|
+
expect(baseAgent.history).toHaveLength(7);
|
|
367
|
+
expect(clonedAgent.history).toHaveLength(5);
|
|
368
|
+
|
|
369
|
+
// Verify no mermaid fix prompts remain
|
|
370
|
+
const allContent = clonedAgent.history.map(m => m.content).join('\n');
|
|
371
|
+
expect(allContent).not.toContain('mermaid diagram in your response has syntax errors');
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
test('should handle empty and null content in realistic scenario', () => {
|
|
375
|
+
baseAgent.history = [
|
|
376
|
+
{ role: 'system', content: 'System' },
|
|
377
|
+
{ role: 'user', content: 'Question' },
|
|
378
|
+
{ role: 'assistant', content: null }, // Edge case
|
|
379
|
+
{ role: 'user', content: 'IMPORTANT: A schema was provided...' }, // Should be stripped
|
|
380
|
+
{ role: 'assistant', content: '' }, // Edge case
|
|
381
|
+
{ role: 'user', content: undefined }, // Edge case
|
|
382
|
+
{ role: 'assistant', content: 'Final answer' }
|
|
383
|
+
];
|
|
384
|
+
|
|
385
|
+
const clonedAgent = baseAgent.clone();
|
|
386
|
+
|
|
387
|
+
// Truncates at schema message (index 3)
|
|
388
|
+
// Keeps: 0 (system), 1 (user), 2 (assistant with null)
|
|
389
|
+
// Removes: 3 (schema), 4 (assistant), 5 (user), 6 (assistant)
|
|
390
|
+
expect(clonedAgent.history).toHaveLength(3);
|
|
391
|
+
|
|
392
|
+
// Verify schema reminder was removed (via truncation)
|
|
393
|
+
const schemaReminder = clonedAgent.history.find(m =>
|
|
394
|
+
m.content && m.content.includes('IMPORTANT: A schema was provided')
|
|
395
|
+
);
|
|
396
|
+
expect(schemaReminder).toBeUndefined();
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
test('should correctly identify partial matches vs full internal messages', () => {
|
|
400
|
+
baseAgent.history = [
|
|
401
|
+
{ role: 'system', content: 'System' },
|
|
402
|
+
// Actual user question that happens to contain similar words (should be kept)
|
|
403
|
+
{ role: 'user', content: 'Can you use the available tools to search?' },
|
|
404
|
+
{ role: 'assistant', content: 'Yes, I will' },
|
|
405
|
+
// Real internal message (should be stripped)
|
|
406
|
+
{
|
|
407
|
+
role: 'user',
|
|
408
|
+
content: 'Please use one of the available tools to help answer the question, or use attempt_completion if you have enough information.\n\nRemember: Use proper XML format with BOTH opening and closing tags:'
|
|
409
|
+
},
|
|
410
|
+
{ role: 'assistant', content: '<search><query>test</query></search>' }
|
|
411
|
+
];
|
|
412
|
+
|
|
413
|
+
const clonedAgent = baseAgent.clone();
|
|
414
|
+
|
|
415
|
+
// Should keep user question but strip internal reminder
|
|
416
|
+
expect(clonedAgent.history).toHaveLength(4);
|
|
417
|
+
|
|
418
|
+
const userMessages = clonedAgent.history.filter(m => m.role === 'user');
|
|
419
|
+
expect(userMessages).toHaveLength(1);
|
|
420
|
+
expect(userMessages[0].content).toBe('Can you use the available tools to search?');
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
test('should provide clean context for parallel task execution', () => {
|
|
424
|
+
// Simulate building context with one agent, then cloning for parallel tasks
|
|
425
|
+
baseAgent.history = [
|
|
426
|
+
{ role: 'system', content: 'You are a code reviewer' },
|
|
427
|
+
{ role: 'user', content: 'Review the codebase' },
|
|
428
|
+
{ role: 'assistant', content: '<search><query>code review</query></search>' },
|
|
429
|
+
// Full tool reminder (internal - should be stripped)
|
|
430
|
+
{
|
|
431
|
+
role: 'user',
|
|
432
|
+
content: 'Please use one of the available tools to help answer the question, or use attempt_completion if you have enough information.\n\nRemember: Use proper XML format with BOTH opening and closing tags:'
|
|
433
|
+
},
|
|
434
|
+
{ role: 'assistant', content: '<search><query>code</query></search>' },
|
|
435
|
+
{ role: 'user', content: 'Found 100 files' },
|
|
436
|
+
{ role: 'assistant', content: 'Analyzed the codebase structure' },
|
|
437
|
+
{ role: 'user', content: 'Provide security analysis' },
|
|
438
|
+
{ role: 'assistant', content: 'Security looks good' },
|
|
439
|
+
// Schema reminder (internal - should be stripped)
|
|
440
|
+
{ role: 'user', content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.' },
|
|
441
|
+
{ role: 'assistant', content: '{"security": "good"}' }
|
|
442
|
+
];
|
|
443
|
+
|
|
444
|
+
// Clone for different parallel tasks
|
|
445
|
+
const securityClone = baseAgent.clone({ sessionId: 'security-check' });
|
|
446
|
+
const performanceClone = baseAgent.clone({ sessionId: 'performance-check' });
|
|
447
|
+
const styleClone = baseAgent.clone({ sessionId: 'style-check' });
|
|
448
|
+
|
|
449
|
+
// All clones should have clean history
|
|
450
|
+
[securityClone, performanceClone, styleClone].forEach(clone => {
|
|
451
|
+
// Original: 11 messages (0-10)
|
|
452
|
+
// Truncates at schema (index 9), keeps 0-8
|
|
453
|
+
// Then filters tool reminder at index 3
|
|
454
|
+
// Result: 8 messages (1 system + 2 user + 5 assistant)
|
|
455
|
+
expect(clone.history).toHaveLength(8);
|
|
456
|
+
|
|
457
|
+
// Should not contain internal messages
|
|
458
|
+
const content = clone.history.map(m => m.content).join('\n');
|
|
459
|
+
expect(content).not.toContain('Please use one of the available tools to help answer');
|
|
460
|
+
expect(content).not.toContain('IMPORTANT: A schema was provided');
|
|
461
|
+
|
|
462
|
+
// Should contain real conversation
|
|
463
|
+
expect(content).toContain('Review the codebase');
|
|
464
|
+
expect(content).toContain('Found 100 files');
|
|
465
|
+
expect(content).toContain('Analyzed the codebase structure');
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
// Each clone should have unique session ID
|
|
469
|
+
expect(securityClone.sessionId).toBe('security-check');
|
|
470
|
+
expect(performanceClone.sessionId).toBe('performance-check');
|
|
471
|
+
expect(styleClone.sessionId).toBe('style-check');
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
test('should strip CRITICAL schema formatting messages (recursive answer call)', () => {
|
|
475
|
+
// Simulate a realistic scenario where schema causes a recursive answer() call
|
|
476
|
+
// with CRITICAL formatting prompt
|
|
477
|
+
baseAgent.history = [
|
|
478
|
+
{ role: 'system', content: 'You are a helpful AI assistant' },
|
|
479
|
+
{ role: 'user', content: 'Provide an overview of the codebase' },
|
|
480
|
+
{ role: 'assistant', content: 'Here is my analysis of the codebase...' },
|
|
481
|
+
// First schema reminder (should be stripped)
|
|
482
|
+
{
|
|
483
|
+
role: 'user',
|
|
484
|
+
content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.\nUse attempt_completion with your response directly inside the tags:\n\n<attempt_completion>\n[Your response content matching the provided schema format]\n</attempt_completion>\n\nYour response must conform to this schema:\n{"type": "object", "properties": {"overview": {"type": "string"}}}'
|
|
485
|
+
},
|
|
486
|
+
{ role: 'assistant', content: '<attempt_completion>\nOverview content\n</attempt_completion>' },
|
|
487
|
+
// CRITICAL schema formatting prompt from recursive answer() call (should be stripped)
|
|
488
|
+
{
|
|
489
|
+
role: 'user',
|
|
490
|
+
content: 'CRITICAL: You MUST respond with ONLY valid JSON DATA that conforms to this schema structure. DO NOT return the schema definition itself.\n\nSchema to follow (this is just the structure - provide ACTUAL DATA):\n{"type": "object", "properties": {"overview": {"type": "string"}, "summary": {"type": "string"}}}\n\nREQUIREMENTS:\n- Return ONLY the JSON object/array with REAL DATA that matches the schema structure\n- DO NOT return the schema definition itself (no "$schema", "$id", "type", "properties", etc.)\n- NO additional text, explanations, or markdown formatting'
|
|
491
|
+
},
|
|
492
|
+
{ role: 'assistant', content: '{"overview": "The codebase analysis", "summary": "Summary text"}' }
|
|
493
|
+
];
|
|
494
|
+
|
|
495
|
+
const clonedAgent = baseAgent.clone({
|
|
496
|
+
stripInternalMessages: true
|
|
497
|
+
});
|
|
498
|
+
|
|
499
|
+
// Truncation behavior: First schema message at index 3 (IMPORTANT), truncate from there
|
|
500
|
+
// Original: 7 messages (0: system, 1: user, 2: assistant, 3: IMPORTANT, 4: assistant, 5: CRITICAL, 6: assistant)
|
|
501
|
+
// Cloned: 3 messages (0: system, 1: user, 2: assistant) - everything from index 3 removed
|
|
502
|
+
expect(baseAgent.history).toHaveLength(7);
|
|
503
|
+
expect(clonedAgent.history).toHaveLength(3);
|
|
504
|
+
|
|
505
|
+
expect(clonedAgent.history.filter(m => m.role === 'system')).toHaveLength(1);
|
|
506
|
+
expect(clonedAgent.history.filter(m => m.role === 'user')).toHaveLength(1); // Only real question
|
|
507
|
+
expect(clonedAgent.history.filter(m => m.role === 'assistant')).toHaveLength(1); // Only first assistant response
|
|
508
|
+
|
|
509
|
+
// Verify internal messages are NOT in clone
|
|
510
|
+
const allContent = clonedAgent.history.map(m => m.content).join('\n');
|
|
511
|
+
expect(allContent).not.toContain('IMPORTANT: A schema was provided');
|
|
512
|
+
expect(allContent).not.toContain('CRITICAL: You MUST respond with ONLY valid JSON DATA');
|
|
513
|
+
expect(allContent).not.toContain('Schema to follow (this is just the structure');
|
|
514
|
+
expect(allContent).not.toContain('DO NOT return the schema definition itself');
|
|
515
|
+
expect(allContent).not.toContain('Overview content'); // This was after schema, so removed
|
|
516
|
+
expect(allContent).not.toContain('"overview": "The codebase analysis"'); // This was after schema, so removed
|
|
517
|
+
|
|
518
|
+
// Verify content before schema is kept
|
|
519
|
+
expect(allContent).toContain('Provide an overview of the codebase');
|
|
520
|
+
expect(allContent).toContain('Here is my analysis');
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
test('should handle visor-style session cloning scenario (overview → code-review)', () => {
|
|
524
|
+
// Simulate the exact scenario from visor where:
|
|
525
|
+
// 1. Overview check runs with schema="overview"
|
|
526
|
+
// 2. Session is cloned for code-review with schema="code-review"
|
|
527
|
+
// 3. The CRITICAL schema message from overview should NOT leak into code-review
|
|
528
|
+
baseAgent.history = [
|
|
529
|
+
{ role: 'system', content: 'You are a code review assistant' },
|
|
530
|
+
|
|
531
|
+
// Overview check conversation
|
|
532
|
+
{ role: 'user', content: 'Analyze this PR and provide an overview' },
|
|
533
|
+
{ role: 'assistant', content: '<search><query>PR changes</query></search>' },
|
|
534
|
+
{ role: 'user', content: '<tool_result>\nFound 5 files changed\n</tool_result>' },
|
|
535
|
+
{ role: 'assistant', content: 'Based on the changes, here is my overview...' },
|
|
536
|
+
|
|
537
|
+
// Schema reminder for overview (should be stripped)
|
|
538
|
+
{
|
|
539
|
+
role: 'user',
|
|
540
|
+
content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.\nYour response must conform to this schema:\n{"$id": "overview", "type": "object", "properties": {"summary": {"type": "string"}}}'
|
|
541
|
+
},
|
|
542
|
+
{ role: 'assistant', content: '<attempt_completion>\n{"summary": "Overview of changes"}\n</attempt_completion>' },
|
|
543
|
+
|
|
544
|
+
// CRITICAL schema formatting for overview (should be stripped)
|
|
545
|
+
{
|
|
546
|
+
role: 'user',
|
|
547
|
+
content: 'CRITICAL: You MUST respond with ONLY valid JSON DATA that conforms to this schema structure. DO NOT return the schema definition itself.\n\nSchema to follow (this is just the structure - provide ACTUAL DATA):\n{"$id": "overview", "type": "object", "properties": {"summary": {"type": "string"}}}\n\nREQUIREMENTS:\n- Return ONLY the JSON object/array with REAL DATA'
|
|
548
|
+
},
|
|
549
|
+
{ role: 'assistant', content: '{"summary": "Overview of changes"}' }
|
|
550
|
+
];
|
|
551
|
+
|
|
552
|
+
// Clone for code-review (simulating visor's session cloning)
|
|
553
|
+
const codeReviewClone = baseAgent.clone({
|
|
554
|
+
sessionId: 'code-review-session',
|
|
555
|
+
stripInternalMessages: true,
|
|
556
|
+
keepSystemMessage: true,
|
|
557
|
+
deepCopy: true
|
|
558
|
+
});
|
|
559
|
+
|
|
560
|
+
// Truncation at first schema message (index 5)
|
|
561
|
+
// Original: 9 messages (0-8)
|
|
562
|
+
// Cloned: 5 messages (0-4) - truncated at index 5 where IMPORTANT appears
|
|
563
|
+
expect(codeReviewClone.history).toHaveLength(5);
|
|
564
|
+
expect(codeReviewClone.sessionId).toBe('code-review-session');
|
|
565
|
+
|
|
566
|
+
// Verify NO schema messages remain
|
|
567
|
+
const cloneContent = codeReviewClone.history.map(m => m.content).join('\n');
|
|
568
|
+
expect(cloneContent).not.toContain('IMPORTANT: A schema was provided');
|
|
569
|
+
expect(cloneContent).not.toContain('CRITICAL: You MUST respond');
|
|
570
|
+
expect(cloneContent).not.toContain('Schema to follow');
|
|
571
|
+
expect(cloneContent).not.toContain('"$id": "overview"');
|
|
572
|
+
expect(cloneContent).not.toContain('attempt_completion'); // This was after schema
|
|
573
|
+
|
|
574
|
+
// Verify real conversation before schema is kept
|
|
575
|
+
expect(cloneContent).toContain('Analyze this PR');
|
|
576
|
+
expect(cloneContent).toContain('Found 5 files changed');
|
|
577
|
+
expect(cloneContent).toContain('here is my overview');
|
|
578
|
+
|
|
579
|
+
// Verify assistant's responses before schema are kept
|
|
580
|
+
const assistantMessages = codeReviewClone.history.filter(m => m.role === 'assistant');
|
|
581
|
+
expect(assistantMessages).toHaveLength(2); // Only 2 assistant messages before schema
|
|
582
|
+
expect(assistantMessages[0].content).toContain('<search>');
|
|
583
|
+
expect(assistantMessages[1].content).toContain('here is my overview');
|
|
584
|
+
});
|
|
585
|
+
|
|
586
|
+
test('should strip multiple CRITICAL messages from multiple schema iterations', () => {
|
|
587
|
+
// Test scenario where schema validation fails multiple times,
|
|
588
|
+
// generating multiple CRITICAL messages
|
|
589
|
+
baseAgent.history = [
|
|
590
|
+
{ role: 'system', content: 'System' },
|
|
591
|
+
{ role: 'user', content: 'Generate report' },
|
|
592
|
+
{ role: 'assistant', content: 'Report content' },
|
|
593
|
+
|
|
594
|
+
// First schema attempt
|
|
595
|
+
{
|
|
596
|
+
role: 'user',
|
|
597
|
+
content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.'
|
|
598
|
+
},
|
|
599
|
+
{ role: 'assistant', content: '<attempt_completion>\nReport\n</attempt_completion>' },
|
|
600
|
+
|
|
601
|
+
// First CRITICAL formatting
|
|
602
|
+
{
|
|
603
|
+
role: 'user',
|
|
604
|
+
content: 'CRITICAL: You MUST respond with ONLY valid JSON DATA that conforms to this schema structure.\n\nSchema to follow (this is just the structure - provide ACTUAL DATA):\n{"type": "object"}'
|
|
605
|
+
},
|
|
606
|
+
{ role: 'assistant', content: '{"invalid": true}' },
|
|
607
|
+
|
|
608
|
+
// JSON correction
|
|
609
|
+
{
|
|
610
|
+
role: 'user',
|
|
611
|
+
content: 'Your response does not match the expected JSON schema. Please provide a valid JSON response.'
|
|
612
|
+
},
|
|
613
|
+
|
|
614
|
+
// Second CRITICAL formatting
|
|
615
|
+
{
|
|
616
|
+
role: 'user',
|
|
617
|
+
content: 'CRITICAL: You MUST respond with ONLY valid JSON DATA that conforms to this schema structure.\n\nSchema to follow (this is just the structure - provide ACTUAL DATA):\n{"type": "object", "properties": {"report": {"type": "string"}}}'
|
|
618
|
+
},
|
|
619
|
+
{ role: 'assistant', content: '{"report": "Final report"}' }
|
|
620
|
+
];
|
|
621
|
+
|
|
622
|
+
const cloned = baseAgent.clone();
|
|
623
|
+
|
|
624
|
+
// Truncation at first schema message (index 3 - IMPORTANT)
|
|
625
|
+
// Original: 10 messages (0-9)
|
|
626
|
+
// Cloned: 3 messages (0-2) - truncated at index 3
|
|
627
|
+
expect(baseAgent.history).toHaveLength(10);
|
|
628
|
+
expect(cloned.history).toHaveLength(3); // system + user + assistant (before schema)
|
|
629
|
+
|
|
630
|
+
const content = cloned.history.map(m => m.content).join('\n');
|
|
631
|
+
expect(content).not.toContain('IMPORTANT: A schema was provided');
|
|
632
|
+
expect(content).not.toContain('CRITICAL: You MUST respond');
|
|
633
|
+
expect(content).not.toContain('Schema to follow');
|
|
634
|
+
expect(content).not.toContain('does not match the expected JSON schema');
|
|
635
|
+
expect(content).not.toContain('attempt_completion'); // After schema
|
|
636
|
+
expect(content).not.toContain('{"invalid": true}'); // After schema
|
|
637
|
+
expect(content).not.toContain('Final report'); // After schema
|
|
638
|
+
|
|
639
|
+
// Only content before schema remains
|
|
640
|
+
expect(content).toContain('Generate report');
|
|
641
|
+
expect(content).toContain('Report content');
|
|
642
|
+
});
|
|
643
|
+
});
|