@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,407 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Technical Guide: Agentic Flow via Custom XML Protocol"
|
|
3
|
+
description: Learn how to implement agentic AI flows using a custom XML protocol for reliable tool interactions.
|
|
4
|
+
layout: doc
|
|
5
|
+
date: 2025-07-04
|
|
6
|
+
tags:
|
|
7
|
+
- agentic-ai
|
|
8
|
+
- xml-protocol
|
|
9
|
+
- tool-use
|
|
10
|
+
- llm
|
|
11
|
+
- technical-guide
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
This guide details the technical implementation of an agentic AI flow where tool interactions are managed via a custom XML protocol embedded within the LLM's text output.
|
|
15
|
+
|
|
16
|
+
**1. XML Protocol Definition**
|
|
17
|
+
|
|
18
|
+
Define a strict XML schema for LLM communication.
|
|
19
|
+
|
|
20
|
+
* **Reasoning:** LLM explains its thought process.
|
|
21
|
+
```xml
|
|
22
|
+
<thinking>Analyzing user request. Need to find files related to 'authentication'. The 'search' tool is appropriate.</thinking>
|
|
23
|
+
```
|
|
24
|
+
* **Tool Invocation:** LLM requests a tool execution. The root tag is the tool name. Parameters are nested.
|
|
25
|
+
```xml
|
|
26
|
+
<search>
|
|
27
|
+
<query>authentication implementation</query>
|
|
28
|
+
<path>src/server</path>
|
|
29
|
+
<allow_tests>false</allow_tests>
|
|
30
|
+
</search>
|
|
31
|
+
```
|
|
32
|
+
```xml
|
|
33
|
+
<extract>
|
|
34
|
+
<file_path>src/server/auth.js#loginUser</file_path>
|
|
35
|
+
</extract>
|
|
36
|
+
```
|
|
37
|
+
* **Task Completion:** LLM signals task completion and provides the final result.
|
|
38
|
+
```xml
|
|
39
|
+
<attempt_completion>
|
|
40
|
+
<result>The authentication flow uses JWT tokens stored in httpOnly cookies. Key functions are `loginUser` and `verifyToken` in `src/server/auth.js`.</result>
|
|
41
|
+
</attempt_completion>
|
|
42
|
+
```
|
|
43
|
+
* **Result Feedback (Orchestrator -> LLM):** How the orchestrator sends tool results back to the LLM (as a `user` role message).
|
|
44
|
+
```xml
|
|
45
|
+
<tool_result tool_name="search">
|
|
46
|
+
File: src/server/auth.js
|
|
47
|
+
Lines: 50-75
|
|
48
|
+
```javascript
|
|
49
|
+
function loginUser(username, password) {
|
|
50
|
+
// ... implementation ...
|
|
51
|
+
const token = generateJwt(user.id);
|
|
52
|
+
return { success: true, token };
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
(Content should be XML-escaped or use CDATA if necessary)
|
|
56
|
+
</tool_result>
|
|
57
|
+
```
|
|
58
|
+
```xml
|
|
59
|
+
<tool_result tool_name="extract">
|
|
60
|
+
Error: File not found at path 'src/server/auth.js#loginUser'
|
|
61
|
+
</tool_result>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**2. System Prompt Engineering (Critical Instructions)**
|
|
65
|
+
|
|
66
|
+
The system prompt *must* enforce the protocol rigorously.
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Role Definition
|
|
70
|
+
You are a code assistant...
|
|
71
|
+
|
|
72
|
+
# Core Instructions
|
|
73
|
+
- Your primary goal is to fulfill the user's request by reasoning and using the available tools.
|
|
74
|
+
- You MUST use the <thinking> tag to explain your reasoning before every action (tool call or completion).
|
|
75
|
+
- You MUST use XML tags for ALL tool calls and for signaling task completion. DO NOT respond with plain text unless it is inside the <result> tag of a final <attempt_completion>.
|
|
76
|
+
- You MUST choose EXACTLY ONE action per response turn: either ONE tool call (e.g., <search>...</search>) OR the final <attempt_completion> tag.
|
|
77
|
+
|
|
78
|
+
# XML Protocol Specification
|
|
79
|
+
1. **Thinking:** Use `<thinking>Your reasoning here</thinking>` before any tool or completion tag.
|
|
80
|
+
2. **Tool Calls:** Use `<tool_name>...</tool_name>` where `tool_name` is one of the available tools listed below. Parameters MUST be nested as `<param_name>value</param_name>`. Example:
|
|
81
|
+
<search>
|
|
82
|
+
<query>user session</query>
|
|
83
|
+
<path>./src</path>
|
|
84
|
+
</search>
|
|
85
|
+
3. **Completion:** When the task is fully complete, respond ONLY with `<attempt_completion><result>Your final answer here</result></attempt_completion>`.
|
|
86
|
+
4. **Parameter Values:** Ensure parameter values are valid text. Use XML entities (<, >, &) if needed for special characters within values.
|
|
87
|
+
|
|
88
|
+
# Available Tools
|
|
89
|
+
- `<search>`: Searches code. Parameters: `<query>(string, required)`, `<path>(string, optional)`, `<allow_tests>(boolean, optional)`.
|
|
90
|
+
- `<extract>`: Extracts code snippets. Parameters: `<file_path>(string, required)`, `<line>(number, optional)`, `<end_line>(number, optional)`.
|
|
91
|
+
- `<query>`: (Add description if used)
|
|
92
|
+
|
|
93
|
+
# Tool Result Feedback
|
|
94
|
+
- After you request a tool, I will provide the result in the next message, enclosed in `<tool_result tool_name="invoked_tool_name">...</tool_result>`.
|
|
95
|
+
- If the tool succeeded, the content will be the tool's output.
|
|
96
|
+
- If the tool failed, the content will start with "Error:".
|
|
97
|
+
- Analyze the content of \`<tool_result>\` to inform your next <thinking> step and subsequent action. If an error occurred, adapt your plan.
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
# Example Interaction Flow
|
|
101
|
+
User: How does login work?
|
|
102
|
+
Assistant:
|
|
103
|
+
<thinking>User wants to understand the login flow. I should search for relevant code.</thinking>
|
|
104
|
+
<search>
|
|
105
|
+
<query>login user function</query>
|
|
106
|
+
<path>./src/auth</path>
|
|
107
|
+
</search>
|
|
108
|
+
User:
|
|
109
|
+
<tool_result tool_name="search">
|
|
110
|
+
File: src/auth/login.js: ... (function loginUser(...) { ... }) ...
|
|
111
|
+
</tool_result>
|
|
112
|
+
Assistant:
|
|
113
|
+
<thinking>The search found `loginUser` in `src/auth/login.js`. I should extract this function to show the user.</thinking>
|
|
114
|
+
<extract>
|
|
115
|
+
<file_path>src/auth/login.js#loginUser</file_path>
|
|
116
|
+
</extract>
|
|
117
|
+
User:
|
|
118
|
+
<tool_result tool_name="extract">
|
|
119
|
+
```javascript
|
|
120
|
+
function loginUser(email, password) { /* ... */ }
|
|
121
|
+
```
|
|
122
|
+
</tool_result>
|
|
123
|
+
Assistant:
|
|
124
|
+
<thinking>I have the function code. The task is complete. I will provide the code and explanation.</thinking>
|
|
125
|
+
<attempt_completion>
|
|
126
|
+
<result>Login is handled by the `loginUser` function in `src/auth/login.js`:
|
|
127
|
+
```javascript
|
|
128
|
+
function loginUser(email, password) { /* ... */ }
|
|
129
|
+
```
|
|
130
|
+
It likely validates credentials and generates a session token.</result>
|
|
131
|
+
</attempt_completion>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**3. Orchestrator Implementation**
|
|
135
|
+
|
|
136
|
+
This component manages the loop, calls the LLM, parses the XML from the stream, executes tools, and feeds results back.
|
|
137
|
+
|
|
138
|
+
**3.1. Core Loop Structure**
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
import { streamText, CoreMessage } from 'ai';
|
|
142
|
+
import { openai } from '@ai-sdk/openai'; // Or other provider
|
|
143
|
+
|
|
144
|
+
async function processUserRequest(initialMessages: CoreMessage[], systemPrompt: string): Promise<string> {
|
|
145
|
+
let messages: CoreMessage[] = [...initialMessages];
|
|
146
|
+
const maxIterations = 10; // Prevent infinite loops
|
|
147
|
+
|
|
148
|
+
for (let i = 0; i < maxIterations; i++) {
|
|
149
|
+
// --- 1. Call LLM for next action ---
|
|
150
|
+
const { textStream } = await streamText({
|
|
151
|
+
model: openai('gpt-4o-mini'), // Choose appropriate model
|
|
152
|
+
system: systemPrompt,
|
|
153
|
+
messages: messages,
|
|
154
|
+
// DO NOT pass 'tools' or 'toolChoice' here
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
// --- 2. Process Stream for Custom XML ---
|
|
158
|
+
let assistantResponse = ""; // Full raw text from this turn
|
|
159
|
+
let parsedAction: ParsedAction | null = null; // Result from XML parser
|
|
160
|
+
|
|
161
|
+
// Use a stateful streaming XML parser (see section 3.2)
|
|
162
|
+
const xmlParser = new StreamingXmlParser(['thinking', 'search', 'extract', 'query', 'attempt_completion']);
|
|
163
|
+
|
|
164
|
+
for await (const textDelta of textStream) {
|
|
165
|
+
assistantResponse += textDelta;
|
|
166
|
+
parsedAction = xmlParser.processChunk(textDelta);
|
|
167
|
+
if (parsedAction && (parsedAction.type === 'tool' || parsedAction.type === 'completion')) {
|
|
168
|
+
// Found a terminal action (tool call or completion), stop processing stream for this turn
|
|
169
|
+
// Note: A real implementation might need to drain the rest of the stream silently
|
|
170
|
+
// or handle the LLM potentially generating text *after* the XML block.
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
// Handle 'thinking' block if needed (e.g., logging)
|
|
174
|
+
if (parsedAction && parsedAction.type === 'thinking') {
|
|
175
|
+
console.log("LLM Thinking:", parsedAction.content);
|
|
176
|
+
parsedAction = null; // Reset after logging thinking
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Ensure the parser is finalized after the stream ends
|
|
181
|
+
if (!parsedAction) {
|
|
182
|
+
parsedAction = xmlParser.finalize();
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Add raw assistant response to history
|
|
186
|
+
messages.push({ role: 'assistant', content: assistantResponse });
|
|
187
|
+
|
|
188
|
+
// --- 3. Analyze Parsed Action ---
|
|
189
|
+
if (!parsedAction || (parsedAction.type !== 'tool' && parsedAction.type !== 'completion')) {
|
|
190
|
+
// LLM failed to produce a valid tool/completion XML block
|
|
191
|
+
const errorFeedback = "Error: Response did not contain a valid XML action (<tool_name>...</tool_name> or <attempt_completion>...). Adhere strictly to the protocol.";
|
|
192
|
+
messages.push({ role: 'user', content: `<tool_result>Error: ${errorFeedback}</tool_result>` }); // Use tool_result structure for feedback
|
|
193
|
+
if (i === maxIterations - 1) throw new Error("Max iterations reached: LLM failed to provide valid action.");
|
|
194
|
+
continue; // Next iteration, hope LLM corrects
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (parsedAction.type === 'completion') {
|
|
198
|
+
// Task Complete
|
|
199
|
+
return parsedAction.result;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (parsedAction.type === 'tool') {
|
|
203
|
+
// --- 4. Execute Tool ---
|
|
204
|
+
let toolOutput: string;
|
|
205
|
+
try {
|
|
206
|
+
// Add validation logic here based on parsedAction.params and tool schema
|
|
207
|
+
toolOutput = await executeTool(parsedAction.name, parsedAction.params);
|
|
208
|
+
} catch (error: any) {
|
|
209
|
+
toolOutput = `Error: Tool execution failed. ${error.message}`;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// --- 5. Feed Result Back ---
|
|
213
|
+
// Ensure output is XML-safe
|
|
214
|
+
const escapedOutput = toolOutput.replace(/[<>&'"]/g, (c: string) => {
|
|
215
|
+
return { '<': '<', '>': '>', '&': '&', "'": ''', '"': '"' }[c]!;
|
|
216
|
+
});
|
|
217
|
+
const resultMessageContent = `<tool_result tool_name="${parsedAction.name}">${escapedOutput}</tool_result>`;
|
|
218
|
+
messages.push({ role: 'user', content: resultMessageContent });
|
|
219
|
+
|
|
220
|
+
if (i === maxIterations - 1) throw new Error("Max iterations reached after last tool call.");
|
|
221
|
+
// Continue to next iteration
|
|
222
|
+
}
|
|
223
|
+
} // End loop
|
|
224
|
+
|
|
225
|
+
throw new Error("Agent loop finished unexpectedly (max iterations likely).");
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// Placeholder types/functions
|
|
229
|
+
type ParsedAction =
|
|
230
|
+
| { type: 'tool'; name: string; params: Record<string, string> }
|
|
231
|
+
| { type: 'completion'; result: string }
|
|
232
|
+
| { type: 'thinking'; content: string };
|
|
233
|
+
|
|
234
|
+
declare class StreamingXmlParser {
|
|
235
|
+
constructor(knownTags: string[]);
|
|
236
|
+
processChunk(chunk: string): ParsedAction | null;
|
|
237
|
+
finalize(): ParsedAction | null;
|
|
238
|
+
}
|
|
239
|
+
declare function executeTool(name: string, params: Record<string, string>): Promise<string>;
|
|
240
|
+
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
**3.2. Streaming XML Parsing (The Hard Part)**
|
|
244
|
+
|
|
245
|
+
Parsing XML reliably from a stream where tags can be split across arbitrary text chunks (`textDelta`) is non-trivial. Simple string searching or regex on the accumulating buffer is brittle.
|
|
246
|
+
|
|
247
|
+
**Required Approach: Stateful Parser**
|
|
248
|
+
|
|
249
|
+
1. **Buffer:** Maintain a buffer of incoming text chunks.
|
|
250
|
+
2. **State Machine:** Track the current parsing state (e.g., `OUTSIDE_TAG`, `INSIDE_THINKING`, `INSIDE_SEARCH_TAG`, `INSIDE_SEARCH_QUERY_PARAM`, `INSIDE_COMPLETION_TAG`, `INSIDE_RESULT_TAG`).
|
|
251
|
+
3. **Tag Detection:** Use regex or string searching optimized for finding potential start (`<tag>`) and end (`</tag>`) tags within the buffer.
|
|
252
|
+
4. **Accumulation:** When a known start tag is detected, change state and start accumulating the tag's content and parameters.
|
|
253
|
+
5. **Completion:** When the corresponding end tag for the *current state* is detected:
|
|
254
|
+
* Extract the fully accumulated content/parameters since the start tag.
|
|
255
|
+
* Perform final parsing/validation on the complete block.
|
|
256
|
+
* Create the `ParsedAction` object.
|
|
257
|
+
* Clear the relevant part of the buffer.
|
|
258
|
+
* Reset state to `OUTSIDE_TAG`.
|
|
259
|
+
6. **Parameter Parsing:** Once a complete tool tag block is found (e.g., `<search>...</search>`), parse its inner content to extract parameter tags (`<query>...</query>`) and their values.
|
|
260
|
+
7. **Error Handling:** Handle cases like unexpected tags, mismatched tags, or the stream ending while inside a tag.
|
|
261
|
+
|
|
262
|
+
**Conceptual Pseudocode for `StreamingXmlParser.processChunk`:**
|
|
263
|
+
|
|
264
|
+
```text
|
|
265
|
+
class StreamingXmlParser:
|
|
266
|
+
buffer = ""
|
|
267
|
+
state = "OUTSIDE" // e.g., OUTSIDE, IN_THINKING, IN_SEARCH, IN_SEARCH_QUERY
|
|
268
|
+
currentAction = null // Stores partially built action { type, name, params }
|
|
269
|
+
knownToolTags = ["search", "extract", ...]
|
|
270
|
+
allKnownTags = ["thinking", "attempt_completion", "result"] + knownToolTags + paramTags...
|
|
271
|
+
|
|
272
|
+
processChunk(chunk):
|
|
273
|
+
buffer += chunk
|
|
274
|
+
actionCompleted = null
|
|
275
|
+
|
|
276
|
+
while true: // Process buffer repeatedly until no more actions found in current buffer
|
|
277
|
+
foundActionThisPass = false
|
|
278
|
+
if state == "OUTSIDE":
|
|
279
|
+
// Check buffer for start tags <thinking>, <attempt_completion>, <search>, etc.
|
|
280
|
+
match = find_earliest_start_tag(buffer, allKnownTags)
|
|
281
|
+
if match:
|
|
282
|
+
// Consume buffer up to tag start
|
|
283
|
+
buffer = buffer.substring(match.index)
|
|
284
|
+
state = "IN_" + match.tagName.toUpperCase()
|
|
285
|
+
if match.tagName is a tool tag:
|
|
286
|
+
currentAction = { type: "tool", name: match.tagName, params: {} }
|
|
287
|
+
else if match.tagName == "thinking":
|
|
288
|
+
currentAction = { type: "thinking", content: "" }
|
|
289
|
+
else if match.tagName == "attempt_completion":
|
|
290
|
+
currentAction = { type: "completion", result: "" } // Need to find <result> later
|
|
291
|
+
// Consume the start tag itself
|
|
292
|
+
buffer = buffer.substring(match.tagLength)
|
|
293
|
+
foundActionThisPass = true
|
|
294
|
+
else:
|
|
295
|
+
break // No more start tags found in buffer for now
|
|
296
|
+
|
|
297
|
+
else if state == "IN_THINKING":
|
|
298
|
+
endTagIndex = buffer.indexOf("</thinking>")
|
|
299
|
+
if endTagIndex != -1:
|
|
300
|
+
currentAction.content = buffer.substring(0, endTagIndex) // Extract content
|
|
301
|
+
actionCompleted = currentAction // Finalize this action
|
|
302
|
+
buffer = buffer.substring(endTagIndex + len("</thinking>")) // Consume tag
|
|
303
|
+
state = "OUTSIDE"
|
|
304
|
+
currentAction = null
|
|
305
|
+
foundActionThisPass = true
|
|
306
|
+
else:
|
|
307
|
+
break // End tag not yet in buffer
|
|
308
|
+
|
|
309
|
+
else if state == "IN_SEARCH": // Example tool state
|
|
310
|
+
// Look for parameter tags <query>, <path> OR the end tag </search>
|
|
311
|
+
queryStart = buffer.indexOf("<query>")
|
|
312
|
+
pathStart = buffer.indexOf("<path>")
|
|
313
|
+
endSearch = buffer.indexOf("</search>")
|
|
314
|
+
|
|
315
|
+
// Find the earliest relevant tag index... (complex logic here)
|
|
316
|
+
earliestIndex = min_positive(queryStart, pathStart, endSearch)
|
|
317
|
+
|
|
318
|
+
if earliestIndex == endSearch:
|
|
319
|
+
// Found the end of the search tool call
|
|
320
|
+
actionCompleted = currentAction
|
|
321
|
+
buffer = buffer.substring(endSearch + len("</search>"))
|
|
322
|
+
state = "OUTSIDE"
|
|
323
|
+
currentAction = null
|
|
324
|
+
foundActionThisPass = true
|
|
325
|
+
else if earliestIndex == queryStart:
|
|
326
|
+
// Found a query parameter tag, transition state
|
|
327
|
+
state = "IN_SEARCH_QUERY"
|
|
328
|
+
buffer = buffer.substring(queryStart + len("<query>"))
|
|
329
|
+
foundActionThisPass = true
|
|
330
|
+
else if earliestIndex == pathStart:
|
|
331
|
+
// Found a path parameter tag...
|
|
332
|
+
state = "IN_SEARCH_PATH"
|
|
333
|
+
buffer = buffer.substring(pathStart + len("<path>"))
|
|
334
|
+
foundActionThisPass = true
|
|
335
|
+
else:
|
|
336
|
+
break // No relevant tags found yet
|
|
337
|
+
|
|
338
|
+
else if state == "IN_SEARCH_QUERY":
|
|
339
|
+
endQuery = buffer.indexOf("</query>")
|
|
340
|
+
if endQuery != -1:
|
|
341
|
+
currentAction.params["query"] = buffer.substring(0, endQuery) // Extract value
|
|
342
|
+
buffer = buffer.substring(endQuery + len("</query>"))
|
|
343
|
+
state = "IN_SEARCH" // Go back to looking for more params or end tag
|
|
344
|
+
foundActionThisPass = true
|
|
345
|
+
else:
|
|
346
|
+
break
|
|
347
|
+
|
|
348
|
+
// ... other states for other tools, params, completion, result ...
|
|
349
|
+
|
|
350
|
+
if not foundActionThisPass:
|
|
351
|
+
break // Nothing more to process in the buffer currently
|
|
352
|
+
|
|
353
|
+
return actionCompleted // Return completed action, or null if none finished
|
|
354
|
+
```
|
|
355
|
+
**Note:** This pseudocode is highly simplified. A production implementation requires careful handling of edge cases, buffering, potential nesting (if allowed), and efficient searching. Consider using a dedicated streaming XML parsing library if available for your language, adapted for finding specific top-level tags.
|
|
356
|
+
|
|
357
|
+
**4. Tool Execution Function (`executeTool`)**
|
|
358
|
+
|
|
359
|
+
```typescript
|
|
360
|
+
async function executeTool(name: string, params: Record<string, string>): Promise<string> {
|
|
361
|
+
console.log(`Executing tool: ${name}`, params);
|
|
362
|
+
try {
|
|
363
|
+
switch (name) {
|
|
364
|
+
case 'search':
|
|
365
|
+
// Validate params.query exists, etc.
|
|
366
|
+
const query = params.query;
|
|
367
|
+
if (!query) throw new Error("Missing required parameter: query");
|
|
368
|
+
const path = params.path || '.'; // Default path
|
|
369
|
+
// Call actual search implementation
|
|
370
|
+
const searchResults = await performCodeSearch(query, path);
|
|
371
|
+
return formatSearchResults(searchResults); // Return results as a string
|
|
372
|
+
|
|
373
|
+
case 'extract':
|
|
374
|
+
// Validate params.file_path
|
|
375
|
+
const filePath = params.file_path;
|
|
376
|
+
if (!filePath) throw new Error("Missing required parameter: file_path");
|
|
377
|
+
// Call actual extract implementation
|
|
378
|
+
const extractedCode = await performCodeExtraction(filePath);
|
|
379
|
+
return extractedCode; // Return code as string
|
|
380
|
+
|
|
381
|
+
// Add cases for other tools
|
|
382
|
+
|
|
383
|
+
default:
|
|
384
|
+
throw new Error(`Unknown tool name: ${name}`);
|
|
385
|
+
}
|
|
386
|
+
} catch (error: any) {
|
|
387
|
+
console.error(`Tool ${name} failed:`, error);
|
|
388
|
+
// Re-throw or format error string for LLM
|
|
389
|
+
throw new Error(`Tool ${name} execution failed: ${error.message}`);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// Placeholder implementations
|
|
394
|
+
declare function performCodeSearch(query: string, path: string): Promise<any>;
|
|
395
|
+
declare function formatSearchResults(results: any): string;
|
|
396
|
+
declare function performCodeExtraction(filePath: string): Promise<string>;
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
**5. State and Error Handling Summary**
|
|
400
|
+
|
|
401
|
+
* **State:** The `messages` array holds the complete interaction history, including user prompts, raw assistant responses (containing XML), and formatted `<tool_result>` messages (acting as user-role feedback).
|
|
402
|
+
* **LLM Format Errors:** Detected when `parsedAction` is null after stream processing. Feedback sent in `<tool_result>Error: ...</tool_result>`.
|
|
403
|
+
* **XML Parse Errors:** Should be caught by the `StreamingXmlParser` and potentially reported back similarly.
|
|
404
|
+
* **Tool Validation Errors:** Caught before `executeTool` call. Feedback sent in `<tool_result>Error: Invalid parameters...</tool_result>`.
|
|
405
|
+
* **Tool Execution Errors:** Caught by `executeTool`. Error message propagated back in `<tool_result>Error: Tool execution failed...</tool_result>`.
|
|
406
|
+
|
|
407
|
+
This detailed guide provides the technical foundation for building agentic flows using a custom XML protocol, addressing the complexities of stream parsing and strict LLM instruction.
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Probe Blog
|
|
3
|
+
description: Latest news, updates, and insights about Probe - the AI-friendly code search tool
|
|
4
|
+
layout: doc
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Probe Blog
|
|
8
|
+
|
|
9
|
+
Welcome to the Probe blog! Here you'll find the latest news, updates, and insights about Probe, the AI-friendly code search tool designed to power the next generation of AI coding assistants.
|
|
10
|
+
|
|
11
|
+
## Latest Posts
|
|
12
|
+
|
|
13
|
+
<div class="blog-post-list">
|
|
14
|
+
<div class="blog-post-card">
|
|
15
|
+
<h3><a href="/blog/v0.6.0-release">Probe v0.6.0 Release: Enhanced AI Integration and Code Editing Capabilities</a></h3>
|
|
16
|
+
<div class="blog-post-meta">
|
|
17
|
+
<span class="blog-post-date">July 17, 2025</span>
|
|
18
|
+
<span class="blog-post-author">By Probe Team</span>
|
|
19
|
+
</div>
|
|
20
|
+
<p>Announcing Probe v0.6.0 with the new implement tool, enhanced GitHub Actions integration, crates.io publishing, and major improvements for AI coding assistants.</p>
|
|
21
|
+
<div class="blog-post-tags">
|
|
22
|
+
<span class="blog-post-tag">release</span>
|
|
23
|
+
<span class="blog-post-tag">v0.6.0</span>
|
|
24
|
+
<span class="blog-post-tag">ai-integration</span>
|
|
25
|
+
<span class="blog-post-tag">code-editing</span>
|
|
26
|
+
<span class="blog-post-tag">github-actions</span>
|
|
27
|
+
<span class="blog-post-tag">crates-io</span>
|
|
28
|
+
</div>
|
|
29
|
+
<a href="/blog/v0.6.0-release" class="blog-post-read-more">Read More →</a>
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
<div class="blog-post-card">
|
|
33
|
+
<h3><a href="/blog/agentic-flow-custom-xml-protocol">Technical Guide: Agentic Flow via Custom XML Protocol</a></h3>
|
|
34
|
+
<div class="blog-post-meta">
|
|
35
|
+
<span class="blog-post-date">July 4, 2025</span>
|
|
36
|
+
<span class="blog-post-author">By Probe Team</span>
|
|
37
|
+
</div>
|
|
38
|
+
<p>Learn how to implement agentic AI flows using a custom XML protocol for reliable tool interactions.</p>
|
|
39
|
+
<div class="blog-post-tags">
|
|
40
|
+
<span class="blog-post-tag">agentic-ai</span>
|
|
41
|
+
<span class="blog-post-tag">xml-protocol</span>
|
|
42
|
+
<span class="blog-post-tag">tool-use</span>
|
|
43
|
+
<span class="blog-post-tag">llm</span>
|
|
44
|
+
<span class="blog-post-tag">technical-guide</span>
|
|
45
|
+
</div>
|
|
46
|
+
<a href="/blog/agentic-flow-custom-xml-protocol" class="blog-post-read-more">Read More →</a>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<style>
|
|
51
|
+
.blog-post-list {
|
|
52
|
+
/* display: grid; */
|
|
53
|
+
/* grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); */
|
|
54
|
+
/* gap: 2rem; */
|
|
55
|
+
/* margin-top: 2rem; */
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.blog-post-card {
|
|
59
|
+
margin-top: 1em;
|
|
60
|
+
border: 1px solid var(--vp-c-divider);
|
|
61
|
+
border-radius: 8px;
|
|
62
|
+
padding: 1.5rem;
|
|
63
|
+
transition: transform 0.2s, box-shadow 0.2s;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.blog-post-card:hover {
|
|
67
|
+
transform: translateY(-5px);
|
|
68
|
+
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.blog-post-card h3 {
|
|
72
|
+
margin-top: 0;
|
|
73
|
+
font-size: 1.3rem;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.blog-post-card h3 a {
|
|
77
|
+
color: var(--vp-c-brand);
|
|
78
|
+
text-decoration: none;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.blog-post-meta {
|
|
82
|
+
display: flex;
|
|
83
|
+
flex-wrap: wrap;
|
|
84
|
+
gap: 1rem;
|
|
85
|
+
margin-bottom: 1rem;
|
|
86
|
+
font-size: 0.9rem;
|
|
87
|
+
color: var(--vp-c-text-2);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.blog-post-tags {
|
|
91
|
+
display: flex;
|
|
92
|
+
flex-wrap: wrap;
|
|
93
|
+
gap: 0.5rem;
|
|
94
|
+
margin-top: 1rem;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.blog-post-tag {
|
|
98
|
+
font-size: 0.8rem;
|
|
99
|
+
padding: 0.2rem 0.6rem;
|
|
100
|
+
border-radius: 4px;
|
|
101
|
+
background-color: var(--vp-c-brand-soft);
|
|
102
|
+
color: var(--vp-c-brand-dark);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.blog-post-read-more {
|
|
106
|
+
display: inline-block;
|
|
107
|
+
margin-top: 1rem;
|
|
108
|
+
color: var(--vp-c-brand);
|
|
109
|
+
font-weight: 500;
|
|
110
|
+
text-decoration: none;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
@media (max-width: 768px) {
|
|
114
|
+
.blog-post-list {
|
|
115
|
+
grid-template-columns: 1fr;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
</style>
|