@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,476 @@
|
|
|
1
|
+
import { describe, test, expect, beforeEach } from '@jest/globals';
|
|
2
|
+
import { ProbeAgent } from '../../src/agent/ProbeAgent.js';
|
|
3
|
+
|
|
4
|
+
describe('ProbeAgent.clone()', () => {
|
|
5
|
+
let baseAgent;
|
|
6
|
+
|
|
7
|
+
beforeEach(async () => {
|
|
8
|
+
baseAgent = new ProbeAgent({
|
|
9
|
+
sessionId: 'test-base',
|
|
10
|
+
path: process.cwd(),
|
|
11
|
+
debug: false
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
// Don't initialize - we'll manually set history for testing
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
describe('Basic Cloning', () => {
|
|
18
|
+
test('should clone agent with same configuration', () => {
|
|
19
|
+
baseAgent.history = [
|
|
20
|
+
{ role: 'system', content: 'You are a helpful assistant' },
|
|
21
|
+
{ role: 'user', content: 'Hello' },
|
|
22
|
+
{ role: 'assistant', content: 'Hi there!' }
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
const cloned = baseAgent.clone();
|
|
26
|
+
|
|
27
|
+
expect(cloned).toBeInstanceOf(ProbeAgent);
|
|
28
|
+
expect(cloned.sessionId).not.toBe(baseAgent.sessionId);
|
|
29
|
+
expect(cloned.history).toHaveLength(3);
|
|
30
|
+
expect(cloned.allowedFolders).toEqual(baseAgent.allowedFolders);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test('should use custom session ID when provided', () => {
|
|
34
|
+
baseAgent.history = [
|
|
35
|
+
{ role: 'system', content: 'System' }
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
const cloned = baseAgent.clone({
|
|
39
|
+
sessionId: 'custom-session-id'
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
expect(cloned.sessionId).toBe('custom-session-id');
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('should deep copy history by default', () => {
|
|
46
|
+
baseAgent.history = [
|
|
47
|
+
{ role: 'system', content: 'System' },
|
|
48
|
+
{ role: 'user', content: 'Test' }
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
const cloned = baseAgent.clone();
|
|
52
|
+
|
|
53
|
+
// Modify cloned history
|
|
54
|
+
cloned.history[1].content = 'Modified';
|
|
55
|
+
|
|
56
|
+
// Original should be unchanged
|
|
57
|
+
expect(baseAgent.history[1].content).toBe('Test');
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test('should shallow copy when deepCopy is false', () => {
|
|
61
|
+
baseAgent.history = [
|
|
62
|
+
{ role: 'user', content: 'Test' }
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
const cloned = baseAgent.clone({ deepCopy: false });
|
|
66
|
+
|
|
67
|
+
// Arrays are different
|
|
68
|
+
expect(cloned.history).not.toBe(baseAgent.history);
|
|
69
|
+
|
|
70
|
+
// But they share the same objects
|
|
71
|
+
expect(cloned.history[0]).toBe(baseAgent.history[0]);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
describe('Internal Message Filtering', () => {
|
|
76
|
+
test('should truncate at first schema reminder message', () => {
|
|
77
|
+
baseAgent.history = [
|
|
78
|
+
{ role: 'system', content: 'System' },
|
|
79
|
+
{ role: 'user', content: 'List functions' },
|
|
80
|
+
{ role: 'assistant', content: 'Here are the functions...' },
|
|
81
|
+
{
|
|
82
|
+
role: 'user',
|
|
83
|
+
content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.\nYour response must conform to this schema: {...}'
|
|
84
|
+
},
|
|
85
|
+
{ role: 'assistant', content: '{"functions": [...]}' }
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
const cloned = baseAgent.clone({
|
|
89
|
+
stripInternalMessages: true
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
// Should truncate at the schema reminder (index 3), removing everything from there
|
|
93
|
+
expect(cloned.history).toHaveLength(3); // system + 2 messages before schema
|
|
94
|
+
expect(cloned.history.some(m => m.content && m.content.includes('IMPORTANT: A schema was provided'))).toBe(false);
|
|
95
|
+
expect(cloned.history.some(m => m.content && m.content.includes('{"functions":'))).toBe(false); // Assistant response after schema also removed
|
|
96
|
+
|
|
97
|
+
// Verify what remains
|
|
98
|
+
expect(cloned.history[0].role).toBe('system');
|
|
99
|
+
expect(cloned.history[1].content).toBe('List functions');
|
|
100
|
+
expect(cloned.history[2].content).toBe('Here are the functions...');
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test('should strip tool use reminder messages', () => {
|
|
104
|
+
baseAgent.history = [
|
|
105
|
+
{ role: 'system', content: 'System' },
|
|
106
|
+
{ role: 'user', content: 'Search for files' },
|
|
107
|
+
{ role: 'assistant', content: 'I will search...' },
|
|
108
|
+
{
|
|
109
|
+
role: 'user',
|
|
110
|
+
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>'
|
|
111
|
+
},
|
|
112
|
+
{ role: 'assistant', content: '<search><query>files</query></search>' }
|
|
113
|
+
];
|
|
114
|
+
|
|
115
|
+
const cloned = baseAgent.clone({
|
|
116
|
+
stripInternalMessages: true
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// Should remove the tool reminder (index 3)
|
|
120
|
+
expect(cloned.history).toHaveLength(4);
|
|
121
|
+
expect(cloned.history.some(m => m.content.includes('Please use one of the available tools'))).toBe(false);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test('should strip mermaid fix prompts', () => {
|
|
125
|
+
baseAgent.history = [
|
|
126
|
+
{ role: 'system', content: 'System' },
|
|
127
|
+
{ role: 'user', content: 'Create a diagram' },
|
|
128
|
+
{ role: 'assistant', content: 'graph TD\nA -> B' },
|
|
129
|
+
{
|
|
130
|
+
role: 'user',
|
|
131
|
+
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```'
|
|
132
|
+
},
|
|
133
|
+
{ role: 'assistant', content: 'Fixed diagram' }
|
|
134
|
+
];
|
|
135
|
+
|
|
136
|
+
const cloned = baseAgent.clone({
|
|
137
|
+
stripInternalMessages: true
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
// Should remove the mermaid fix prompt (index 3)
|
|
141
|
+
expect(cloned.history).toHaveLength(4);
|
|
142
|
+
expect(cloned.history.some(m => m.content.includes('mermaid diagram in your response has syntax errors'))).toBe(false);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test('should strip JSON correction prompts', () => {
|
|
146
|
+
baseAgent.history = [
|
|
147
|
+
{ role: 'system', content: 'System' },
|
|
148
|
+
{ role: 'user', content: 'Generate JSON' },
|
|
149
|
+
{ role: 'assistant', content: 'Invalid JSON' },
|
|
150
|
+
{
|
|
151
|
+
role: 'user',
|
|
152
|
+
content: 'Your response does not match the expected JSON schema. Please provide a valid JSON response.\n\nSchema validation error: ...'
|
|
153
|
+
},
|
|
154
|
+
{ role: 'assistant', content: '{"valid": true}' }
|
|
155
|
+
];
|
|
156
|
+
|
|
157
|
+
const cloned = baseAgent.clone({
|
|
158
|
+
stripInternalMessages: true
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
// Should remove the JSON correction prompt (index 3)
|
|
162
|
+
expect(cloned.history).toHaveLength(4);
|
|
163
|
+
expect(cloned.history.some(m => m.content.includes('does not match the expected JSON schema'))).toBe(false);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test('should truncate at CRITICAL schema formatting prompt', () => {
|
|
167
|
+
baseAgent.history = [
|
|
168
|
+
{ role: 'system', content: 'System' },
|
|
169
|
+
{ role: 'user', content: 'Generate report' },
|
|
170
|
+
{ role: 'assistant', content: 'Here is my report' },
|
|
171
|
+
{
|
|
172
|
+
role: 'user',
|
|
173
|
+
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": {...}}'
|
|
174
|
+
},
|
|
175
|
+
{ role: 'assistant', content: '{"report": "data"}' }
|
|
176
|
+
];
|
|
177
|
+
|
|
178
|
+
const cloned = baseAgent.clone({
|
|
179
|
+
stripInternalMessages: true
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
// Should truncate at CRITICAL message (index 3), removing it and everything after
|
|
183
|
+
expect(cloned.history).toHaveLength(3); // system + 2 messages before CRITICAL
|
|
184
|
+
expect(cloned.history.some(m => m.content && m.content.includes('CRITICAL: You MUST respond with ONLY valid JSON DATA'))).toBe(false);
|
|
185
|
+
expect(cloned.history.some(m => m.content && m.content.includes('Schema to follow (this is just the structure'))).toBe(false);
|
|
186
|
+
expect(cloned.history.some(m => m.content && m.content.includes('{"report": "data"}'))).toBe(false); // Assistant response after CRITICAL also removed
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
test('should keep all messages when stripInternalMessages is false', () => {
|
|
190
|
+
baseAgent.history = [
|
|
191
|
+
{ role: 'system', content: 'System' },
|
|
192
|
+
{ role: 'user', content: 'Test' },
|
|
193
|
+
{ role: 'user', content: 'IMPORTANT: A schema was provided. You MUST respond...' },
|
|
194
|
+
{ role: 'assistant', content: 'Response' }
|
|
195
|
+
];
|
|
196
|
+
|
|
197
|
+
const cloned = baseAgent.clone({
|
|
198
|
+
stripInternalMessages: false
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
// Should keep all messages including internal ones
|
|
202
|
+
expect(cloned.history).toHaveLength(4);
|
|
203
|
+
expect(cloned.history.some(m => m.content.includes('IMPORTANT: A schema was provided'))).toBe(true);
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
test('should only detect schema messages from user role', () => {
|
|
207
|
+
baseAgent.history = [
|
|
208
|
+
{ role: 'system', content: 'IMPORTANT: A schema was provided' }, // Not detected (system)
|
|
209
|
+
{ role: 'assistant', content: 'IMPORTANT: A schema was provided' }, // Not detected (assistant)
|
|
210
|
+
{ role: 'user', content: 'Regular question' },
|
|
211
|
+
{ role: 'user', content: 'IMPORTANT: A schema was provided' } // Detected - truncate from here
|
|
212
|
+
];
|
|
213
|
+
|
|
214
|
+
const cloned = baseAgent.clone({
|
|
215
|
+
stripInternalMessages: true
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
// Should truncate at the user schema message (index 3)
|
|
219
|
+
expect(cloned.history).toHaveLength(3); // system + assistant + user question
|
|
220
|
+
expect(cloned.history[0].role).toBe('system');
|
|
221
|
+
expect(cloned.history[0].content).toContain('IMPORTANT'); // System message kept even with similar text
|
|
222
|
+
expect(cloned.history[1].role).toBe('assistant');
|
|
223
|
+
expect(cloned.history[2].content).toBe('Regular question');
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
describe('System Message Handling', () => {
|
|
228
|
+
test('should keep system message by default', () => {
|
|
229
|
+
baseAgent.history = [
|
|
230
|
+
{ role: 'system', content: 'You are a helpful assistant' },
|
|
231
|
+
{ role: 'user', content: 'Hello' }
|
|
232
|
+
];
|
|
233
|
+
|
|
234
|
+
const cloned = baseAgent.clone();
|
|
235
|
+
|
|
236
|
+
expect(cloned.history[0].role).toBe('system');
|
|
237
|
+
expect(cloned.history[0].content).toBe('You are a helpful assistant');
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
test('should remove system message when keepSystemMessage is false', () => {
|
|
241
|
+
baseAgent.history = [
|
|
242
|
+
{ role: 'system', content: 'You are a helpful assistant' },
|
|
243
|
+
{ role: 'user', content: 'Hello' },
|
|
244
|
+
{ role: 'assistant', content: 'Hi!' }
|
|
245
|
+
];
|
|
246
|
+
|
|
247
|
+
const cloned = baseAgent.clone({
|
|
248
|
+
keepSystemMessage: false
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
expect(cloned.history).toHaveLength(2);
|
|
252
|
+
expect(cloned.history[0].role).toBe('user');
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
describe('Configuration Overrides', () => {
|
|
257
|
+
test('should override configuration with provided options', () => {
|
|
258
|
+
baseAgent.debug = false;
|
|
259
|
+
baseAgent.allowEdit = false;
|
|
260
|
+
baseAgent.maxIterations = 30;
|
|
261
|
+
|
|
262
|
+
const cloned = baseAgent.clone({
|
|
263
|
+
overrides: {
|
|
264
|
+
debug: true,
|
|
265
|
+
allowEdit: true,
|
|
266
|
+
maxIterations: 50
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
expect(cloned.debug).toBe(true);
|
|
271
|
+
expect(cloned.allowEdit).toBe(true);
|
|
272
|
+
expect(cloned.maxIterations).toBe(50);
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
test('should allow changing promptType via overrides', () => {
|
|
276
|
+
baseAgent.promptType = 'code-explorer';
|
|
277
|
+
|
|
278
|
+
const cloned = baseAgent.clone({
|
|
279
|
+
overrides: {
|
|
280
|
+
promptType: 'architect'
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
expect(cloned.promptType).toBe('architect');
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
test('should preserve non-overridden configuration', () => {
|
|
288
|
+
baseAgent.outline = true;
|
|
289
|
+
baseAgent.maxResponseTokens = 2000;
|
|
290
|
+
|
|
291
|
+
const cloned = baseAgent.clone({
|
|
292
|
+
overrides: {
|
|
293
|
+
debug: true
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
expect(cloned.outline).toBe(true);
|
|
298
|
+
expect(cloned.maxResponseTokens).toBe(2000);
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
describe('Complex History Scenarios', () => {
|
|
303
|
+
test('should handle mixed internal and regular messages', () => {
|
|
304
|
+
baseAgent.history = [
|
|
305
|
+
{ role: 'system', content: 'System' },
|
|
306
|
+
{ role: 'user', content: 'Question 1' },
|
|
307
|
+
{ role: 'assistant', content: 'Answer 1' },
|
|
308
|
+
{ role: 'user', 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:' }, // Internal
|
|
309
|
+
{ role: 'assistant', content: 'Tool call' },
|
|
310
|
+
{ role: 'user', content: 'Question 2' },
|
|
311
|
+
{ role: 'assistant', content: 'Answer 2' },
|
|
312
|
+
{ role: 'user', content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.' }, // Internal
|
|
313
|
+
{ role: 'assistant', content: 'Schema response' }
|
|
314
|
+
];
|
|
315
|
+
|
|
316
|
+
const cloned = baseAgent.clone({
|
|
317
|
+
stripInternalMessages: true
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
// Truncates at schema (index 7), keeps 0-6
|
|
321
|
+
// Then filters tool reminder at index 3
|
|
322
|
+
// Result: 6 messages (1 system + 2 user + 3 assistant)
|
|
323
|
+
expect(cloned.history).toHaveLength(6);
|
|
324
|
+
expect(cloned.history.filter(m => m.role === 'user')).toHaveLength(2);
|
|
325
|
+
expect(cloned.history.filter(m => m.role === 'assistant')).toHaveLength(3);
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
test('should handle empty history', () => {
|
|
329
|
+
baseAgent.history = [];
|
|
330
|
+
|
|
331
|
+
const cloned = baseAgent.clone();
|
|
332
|
+
|
|
333
|
+
expect(cloned.history).toHaveLength(0);
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
test('should handle history with only system message', () => {
|
|
337
|
+
baseAgent.history = [
|
|
338
|
+
{ role: 'system', content: 'System only' }
|
|
339
|
+
];
|
|
340
|
+
|
|
341
|
+
const cloned = baseAgent.clone();
|
|
342
|
+
|
|
343
|
+
expect(cloned.history).toHaveLength(1);
|
|
344
|
+
expect(cloned.history[0].role).toBe('system');
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
test('should handle messages with complex content structure', () => {
|
|
348
|
+
baseAgent.history = [
|
|
349
|
+
{ role: 'system', content: 'System' },
|
|
350
|
+
{
|
|
351
|
+
role: 'user',
|
|
352
|
+
content: [
|
|
353
|
+
{ type: 'text', text: 'Hello' },
|
|
354
|
+
{ type: 'image', image: 'base64...' }
|
|
355
|
+
]
|
|
356
|
+
},
|
|
357
|
+
{ role: 'assistant', content: 'Response' }
|
|
358
|
+
];
|
|
359
|
+
|
|
360
|
+
const cloned = baseAgent.clone();
|
|
361
|
+
|
|
362
|
+
expect(cloned.history).toHaveLength(3);
|
|
363
|
+
expect(Array.isArray(cloned.history[1].content)).toBe(true);
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
describe('Cache Efficiency', () => {
|
|
368
|
+
test('should preserve system message for cache efficiency', () => {
|
|
369
|
+
baseAgent.history = [
|
|
370
|
+
{ role: 'system', content: 'Long expensive system prompt...' },
|
|
371
|
+
{ role: 'user', content: 'Q1' },
|
|
372
|
+
{ role: 'assistant', content: 'A1' },
|
|
373
|
+
{ role: 'user', content: 'IMPORTANT: A schema was provided...' }, // Internal
|
|
374
|
+
{ role: 'assistant', content: 'A2' }
|
|
375
|
+
];
|
|
376
|
+
|
|
377
|
+
const cloned = baseAgent.clone();
|
|
378
|
+
|
|
379
|
+
// System message should be at index 0 for cache efficiency
|
|
380
|
+
expect(cloned.history[0].role).toBe('system');
|
|
381
|
+
expect(cloned.history[0].content).toBe('Long expensive system prompt...');
|
|
382
|
+
|
|
383
|
+
// Internal message should be removed
|
|
384
|
+
expect(cloned.history.some(m =>
|
|
385
|
+
m.content && m.content.includes('IMPORTANT: A schema was provided')
|
|
386
|
+
)).toBe(false);
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
describe('Edge Cases', () => {
|
|
391
|
+
test('should handle null content', () => {
|
|
392
|
+
baseAgent.history = [
|
|
393
|
+
{ role: 'system', content: 'System' },
|
|
394
|
+
{ role: 'user', content: null },
|
|
395
|
+
{ role: 'assistant', content: 'Response' }
|
|
396
|
+
];
|
|
397
|
+
|
|
398
|
+
const cloned = baseAgent.clone();
|
|
399
|
+
|
|
400
|
+
expect(cloned.history).toHaveLength(3);
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
test('should handle undefined content', () => {
|
|
404
|
+
baseAgent.history = [
|
|
405
|
+
{ role: 'system', content: 'System' },
|
|
406
|
+
{ role: 'user', content: undefined },
|
|
407
|
+
{ role: 'assistant', content: 'Response' }
|
|
408
|
+
];
|
|
409
|
+
|
|
410
|
+
const cloned = baseAgent.clone();
|
|
411
|
+
|
|
412
|
+
expect(cloned.history).toHaveLength(3);
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
test('should handle messages with empty content', () => {
|
|
416
|
+
baseAgent.history = [
|
|
417
|
+
{ role: 'system', content: 'System' },
|
|
418
|
+
{ role: 'user', content: '' },
|
|
419
|
+
{ role: 'assistant', content: 'Response' }
|
|
420
|
+
];
|
|
421
|
+
|
|
422
|
+
const cloned = baseAgent.clone();
|
|
423
|
+
|
|
424
|
+
expect(cloned.history).toHaveLength(3);
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
describe('Multiple Clones', () => {
|
|
429
|
+
test('should allow creating multiple independent clones', () => {
|
|
430
|
+
baseAgent.history = [
|
|
431
|
+
{ role: 'system', content: 'System' },
|
|
432
|
+
{ role: 'user', content: 'Test' }
|
|
433
|
+
];
|
|
434
|
+
|
|
435
|
+
const clone1 = baseAgent.clone({ sessionId: 'clone1' });
|
|
436
|
+
const clone2 = baseAgent.clone({ sessionId: 'clone2' });
|
|
437
|
+
const clone3 = baseAgent.clone({ sessionId: 'clone3' });
|
|
438
|
+
|
|
439
|
+
// All should have independent histories
|
|
440
|
+
clone1.history.push({ role: 'user', content: 'Clone1' });
|
|
441
|
+
clone2.history.push({ role: 'user', content: 'Clone2' });
|
|
442
|
+
clone3.history.push({ role: 'user', content: 'Clone3' });
|
|
443
|
+
|
|
444
|
+
expect(clone1.history).toHaveLength(3);
|
|
445
|
+
expect(clone2.history).toHaveLength(3);
|
|
446
|
+
expect(clone3.history).toHaveLength(3);
|
|
447
|
+
expect(baseAgent.history).toHaveLength(2); // Unchanged
|
|
448
|
+
|
|
449
|
+
expect(clone1.history[2].content).toBe('Clone1');
|
|
450
|
+
expect(clone2.history[2].content).toBe('Clone2');
|
|
451
|
+
expect(clone3.history[2].content).toBe('Clone3');
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
test('should allow chaining clones', () => {
|
|
455
|
+
baseAgent.history = [
|
|
456
|
+
{ role: 'system', content: 'System' },
|
|
457
|
+
{ role: 'user', content: 'Q1' },
|
|
458
|
+
{ role: 'assistant', content: 'A1' }
|
|
459
|
+
];
|
|
460
|
+
|
|
461
|
+
const clone1 = baseAgent.clone({ sessionId: 'gen1' });
|
|
462
|
+
clone1.history.push({ role: 'user', content: 'Q2' });
|
|
463
|
+
clone1.history.push({ role: 'assistant', content: 'A2' });
|
|
464
|
+
|
|
465
|
+
const clone2 = clone1.clone({ sessionId: 'gen2' });
|
|
466
|
+
clone2.history.push({ role: 'user', content: 'Q3' });
|
|
467
|
+
|
|
468
|
+
const clone3 = clone2.clone({ sessionId: 'gen3' });
|
|
469
|
+
|
|
470
|
+
expect(baseAgent.history).toHaveLength(3);
|
|
471
|
+
expect(clone1.history).toHaveLength(5);
|
|
472
|
+
expect(clone2.history).toHaveLength(6);
|
|
473
|
+
expect(clone3.history).toHaveLength(6);
|
|
474
|
+
});
|
|
475
|
+
});
|
|
476
|
+
});
|