[{"data":1,"prerenderedAt":397},["ShallowReactive",2],{"navigation_docs":3,"-docs-architecture-mcp-uploaded-diff-code-reviews":158,"-docs-architecture-mcp-uploaded-diff-code-reviews-surround":392},[4,15,74,98,113],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started",[10],{"title":11,"path":12,"stem":13,"icon":14},"Zeeq Introduction","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"children":19,"page":6},"Key Features","\u002Fdocs\u002Fkey-features","docs\u002F3.key-features",[20,25,30,35,40,45,50,55,59,64,69],{"title":21,"path":22,"stem":23,"icon":24},"Membership Invitations","\u002Fdocs\u002Fkey-features\u002Fmembership-invitations","docs\u002F3.key-features\u002F1.membership-invitations","i-hugeicons-cube",{"title":26,"path":27,"stem":28,"icon":29},"Command Palette","\u002Fdocs\u002Fkey-features\u002Fcommand-palette","docs\u002F3.key-features\u002F10.command-palette","i-hugeicons-search-01",{"title":31,"path":32,"stem":33,"icon":34},"Library Import and Export","\u002Fdocs\u002Fkey-features\u002Flibrary-import-export","docs\u002F3.key-features\u002F11.library-import-export","i-lucide-package-open",{"title":36,"path":37,"stem":38,"icon":39},"LLM Settings Configuration","\u002Fdocs\u002Fkey-features\u002Fllm-settings-configuration","docs\u002F3.key-features\u002F2.llm-settings-configuration","i-hugeicons-ai-magic",{"title":41,"path":42,"stem":43,"icon":44},"Agent Code Review Findings","\u002Fdocs\u002Fkey-features\u002Fagent-code-review-findings","docs\u002F3.key-features\u002F3.agent-code-review-findings","i-lucide-list-checks",{"title":46,"path":47,"stem":48,"icon":49},"Credentials & API Tokens","\u002Fdocs\u002Fkey-features\u002Fcredentials","docs\u002F3.key-features\u002F4.credentials","i-hugeicons-key-01",{"title":51,"path":52,"stem":53,"icon":54},"Manual Document Libraries","\u002Fdocs\u002Fkey-features\u002Fmanual-document-libraries","docs\u002F3.key-features\u002F5.manual-document-libraries","i-lucide-library-big",{"title":56,"path":57,"stem":58,"icon":29},"Snippet Search","\u002Fdocs\u002Fkey-features\u002Fsnippet-search","docs\u002F3.key-features\u002F6.snippet-search",{"title":60,"path":61,"stem":62,"icon":63},"Shared Prompt Fragment","\u002Fdocs\u002Fkey-features\u002Fshared-prompt-fragment","docs\u002F3.key-features\u002F7.shared-prompt-fragment","i-lucide-notebook-pen",{"title":65,"path":66,"stem":67,"icon":68},"Code Review Sources & Telemetry","\u002Fdocs\u002Fkey-features\u002Fcode-review-sources","docs\u002F3.key-features\u002F8.code-review-sources","i-hugeicons-book-01",{"title":70,"path":71,"stem":72,"icon":73},"Excluding Documents from Code Reviews","\u002Fdocs\u002Fkey-features\u002Fcode-review-document-exclusion","docs\u002F3.key-features\u002F9.code-review-document-exclusion","i-lucide-eye-off",{"title":75,"path":76,"stem":77,"children":78,"page":6},"Runtime Configuration","\u002Fdocs\u002Fconfiguration","docs\u002F5.configuration",[79,84,89,93],{"title":80,"path":81,"stem":82,"icon":83},"Google Cloud Configuration","\u002Fdocs\u002Fconfiguration\u002Fgcp-runtime","docs\u002F5.configuration\u002F1.gcp-runtime","i-hugeicons-google",{"title":85,"path":86,"stem":87,"icon":88},"GitHub Configuration","\u002Fdocs\u002Fconfiguration\u002Fgithub-configuration","docs\u002F5.configuration\u002F2.github-configuration","i-hugeicons-github",{"title":90,"path":91,"stem":92},"Local OpenIddict Certificates","\u002Fdocs\u002Fconfiguration\u002Flocal-openiddict-certificates","docs\u002F5.configuration\u002F3.local-openiddict-certificates",{"title":94,"path":95,"stem":96,"icon":97},"System Admin Access","\u002Fdocs\u002Fconfiguration\u002Fsystem-admin-access","docs\u002F5.configuration\u002F4.system-admin-access","i-hugeicons-shield-01",{"title":99,"path":100,"stem":101,"children":102,"page":6},"Metrics","\u002Fdocs\u002Fmetrics","docs\u002F6.metrics",[103,108],{"title":104,"path":105,"stem":106,"icon":107},"Metrics Dashboard","\u002Fdocs\u002Fmetrics\u002Fmetrics-dashboard","docs\u002F6.metrics\u002F1.metrics-dashboard","i-hugeicons-analytics-01",{"title":109,"path":110,"stem":111,"icon":112},"Metrics Pipeline","\u002Fdocs\u002Fmetrics\u002Fmetrics-pipeline","docs\u002F6.metrics\u002F2.metrics-pipeline","i-hugeicons-database-02",{"title":114,"path":115,"stem":116,"children":117,"page":6},"Design and Architecture","\u002Fdocs\u002Farchitecture","docs\u002F9.architecture",[118,123,128,133,137,141,145,150,154],{"title":119,"path":120,"stem":121,"icon":122},"Caching","\u002Fdocs\u002Farchitecture\u002Fcaching","docs\u002F9.architecture\u002F1.caching","i-lucide-database",{"title":124,"path":125,"stem":126,"icon":127},"Messaging and Queueing","\u002Fdocs\u002Farchitecture\u002Fmessaging-and-queueing","docs\u002F9.architecture\u002F2.messaging-and-queueing","i-lucide-message-square",{"title":129,"path":130,"stem":131,"icon":132},"GitHub Comment Rendering","\u002Fdocs\u002Farchitecture\u002Fgithub-comment-rendering","docs\u002F9.architecture\u002F3.github-comment-rendering","i-lucide-github",{"title":134,"path":135,"stem":136},"GitHub Integration","\u002Fdocs\u002Farchitecture\u002Fgithub-integration","docs\u002F9.architecture\u002F4.github-integration",{"title":138,"path":139,"stem":140},"LLM Settings and Secret Storage","\u002Fdocs\u002Farchitecture\u002Fllm-settings-and-secret-storage","docs\u002F9.architecture\u002F5.llm-settings-and-secret-storage",{"title":142,"path":143,"stem":144},"Organization Activation and Routes","\u002Fdocs\u002Farchitecture\u002Forganization-activation-and-routes","docs\u002F9.architecture\u002F6.organization-activation-and-routes",{"title":146,"path":147,"stem":148,"icon":149},"MCP Uploaded-Diff Code Reviews","\u002Fdocs\u002Farchitecture\u002Fmcp-uploaded-diff-code-reviews","docs\u002F9.architecture\u002F7.mcp-uploaded-diff-code-reviews","i-lucide-file-search",{"title":151,"path":152,"stem":153},"Repository Content Ingest","\u002Fdocs\u002Farchitecture\u002Frepository-content-ingest","docs\u002F9.architecture\u002F8.repository-content-ingest",{"title":155,"path":156,"stem":157},"Telemetry Ingest","\u002Fdocs\u002Farchitecture\u002Ftelemetry-ingest","docs\u002F9.architecture\u002F9.telemetry-ingest",{"id":159,"title":146,"body":160,"description":385,"extension":386,"links":387,"meta":388,"navigation":389,"path":147,"seo":390,"stem":148,"__hash__":391},"docs\u002Fdocs\u002F9.architecture\u002F7.mcp-uploaded-diff-code-reviews.md",{"type":161,"value":162,"toc":376},"minimark",[163,168,172,180,184,194,198,201,289,292,296,299,306,313,317,331,334,348,352,362,369],[164,165,167],"h2",{"id":166},"summary","Summary",[169,170,171],"p",{},"The MCP uploaded-diff flow lets local coding agents ask Zeeq for an expert review before a pull request exists. The local agent uploads a raw git unified diff through a token-protected anonymous endpoint, then calls the MCP tool to run the same reviewer execution core used by GitHub pull request reviews.",[169,173,174,175,179],{},"This path is synchronous and ephemeral. It does not create ",[176,177,178],"code",{},"CodeReviewRecord"," rows, acquire review locks, publish queue messages, or write GitHub comments. The review XML is returned directly to the MCP caller.",[164,181,183],{"id":182},"flow","Flow",[185,186,192],"pre",{"className":187,"code":189,"language":190,"meta":191},[188],"language-text","MCP tool create_upload_url\n  -> authenticate MCP caller\n  -> create jobId and encrypted uploadToken\n  -> return PUT URL and curl --data-binary example\n\nLocal agent uploads git diff\n  -> anonymous PUT \u002Fapi\u002Fv1\u002Fcode-review\u002Fmcp-diffs\u002F{jobId}?token=...\n  -> endpoint decrypts token and checks jobId, expiry, byte limit, UTF-8, and diff header\n  -> storage writes {jobId}\u002Fdiff.txt in CodeReviewDiffs with token organization id\n\nMCP tool run_review\n  -> decrypt uploadToken and recover jobId, organization id, and expiry\n  -> read and parse uploaded diff\n  -> map files to CodeReviewFileSnapshot\n  -> resolve repository mapping by github owner\u002Frepo\n  -> mapped: apply repository file filter and configured reviewer agents\n  -> unmapped: use built-in principal software engineer reviewer\n  -> build CodeReviewPromptInput\n  -> execute ICodeReviewAgentExecutor\n  -> validate XML\n  -> delete uploaded diff in finally\n  -> return instruction-wrapped XML to the caller\n","text","",[176,193,189],{"__ignoreMap":191},[164,195,197],{"id":196},"shared-core","Shared Core",[169,199,200],{},"The GitHub and MCP paths share these code-review components:",[202,203,204,217],"table",{},[205,206,207],"thead",{},[208,209,210,214],"tr",{},[211,212,213],"th",{},"Component",[211,215,216],{},"Role",[218,219,220,231,241,251,265,275],"tbody",{},[208,221,222,228],{},[223,224,225],"td",{},[176,226,227],{},"GitDiffParser",[223,229,230],{},"Parses uploaded unified diffs into file snapshots.",[208,232,233,238],{},[223,234,235],{},[176,236,237],{},"CodeReviewFileFilterEvaluator",[223,239,240],{},"Applies repository include\u002Fexclude filters.",[208,242,243,248],{},[223,244,245],{},[176,246,247],{},"CodeReviewerAgentResolver",[223,249,250],{},"Resolves configured reviewer agents or no-agents state.",[208,252,253,258],{},[223,254,255],{},[176,256,257],{},"CodeReviewPromptBuilder",[223,259,260,261,264],{},"Builds the reviewer prompt from ",[176,262,263],{},"CodeReviewPromptInput",".",[208,266,267,272],{},[223,268,269],{},[176,270,271],{},"ICodeReviewAgentExecutor",[223,273,274],{},"Runs the Agent Framework fan-out\u002Ffan-in reviewer workflow.",[208,276,277,282],{},[223,278,279],{},[176,280,281],{},"CodeReviewXmlOutputValidator",[223,283,284,285,288],{},"Validates canonical ",[176,286,287],{},"\u003Creviews>"," XML.",[169,290,291],{},"The GitHub path wraps those pieces with durable pull request records, queue messages, artifact storage, and GitHub comment rendering. The MCP path wraps them with upload-token validation, temporary diff storage, and direct XML return.",[164,293,295],{"id":294},"security-model","Security Model",[169,297,298],{},"The MCP server itself is authenticated. Only authenticated MCP callers can create an upload URL.",[169,300,301,302,305],{},"The upload endpoint is anonymous by design because ",[176,303,304],{},"curl"," uploads are separate from the MCP transport. Trust comes from the encrypted upload token. The token carries the job id, creator id, organization id, expiry, and optional W3C trace context. It uses the same configured key material as review request links but a distinct purpose string, so request-link tokens and upload tokens cannot be redeemed across purposes.",[169,307,308,309,312],{},"The upload endpoint rejects missing or invalid tokens, route job ids that do not match the token, expired tokens, empty bodies, invalid UTF-8, oversized bodies, and bodies without a ",[176,310,311],{},"diff --git"," header. The organization id used for storage writes comes from the token, not from storage metadata or request headers.",[164,314,316],{"id":315},"storage-and-cleanup","Storage And Cleanup",[169,318,319,320,323,324,327,328,264],{},"Uploaded diffs are stored through ",[176,321,322],{},"IStorageProvider\u003CPostgresStorageWriteOptions>"," in ",[176,325,326],{},"StorageContainer.CodeReviewDiffs"," at ",[176,329,330],{},"{jobId}\u002Fdiff.txt",[169,332,333],{},"Re-uploading to the same job path overwrites the previous diff. This makes retry simple: if a review run consumes the diff or fails, the caller can upload the same path again while the token is still valid.",[169,335,336,339,340,343,344,347],{},[176,337,338],{},"ExpertCodeReviewRunner"," deletes the uploaded diff in ",[176,341,342],{},"finally"," with ",[176,345,346],{},"CancellationToken.None"," after every run attempt. This includes success, validation errors after reading the diff, agent execution failures, and caller cancellation. Uploaded-but-never-run cleanup is intentionally deferred to a future background cleanup worker.",[164,349,351],{"id":350},"repository-resolution","Repository Resolution",[169,353,354,357,358,361],{},[176,355,356],{},"run_review"," receives ",[176,359,360],{},"ownerQualifiedRepoName"," from the MCP caller.",[169,363,364,365,368],{},"If ",[176,366,367],{},"ICodeRepositoryStore.FindActiveAsync(\"github\", ownerQualifiedRepoName)"," returns a repository, the MCP review uses that repository's organization id, file filter, and configured reviewer agents.",[169,370,371,372,375],{},"If no repository mapping exists, the review still runs with ",[176,373,374],{},"CodeReviewerAgentResolver.CreateDefaultRuntimeAgent()"," and the organization id from the upload token. This fallback keeps local pre-PR reviews useful even when Zeeq has not yet been configured for the repository.",{"title":191,"searchDepth":377,"depth":377,"links":378},2,[379,380,381,382,383,384],{"id":166,"depth":377,"text":167},{"id":182,"depth":377,"text":183},{"id":196,"depth":377,"text":197},{"id":294,"depth":377,"text":295},{"id":315,"depth":377,"text":316},{"id":350,"depth":377,"text":351},"How local coding agents upload diffs and run the shared code-review agents through MCP.","md",null,{},{"icon":149},{"title":146,"description":385},"QYx0cBuAzr1e31_JUSfW7d0riQoQ973iLgevHRL6yNE",[393,395],{"title":142,"path":143,"stem":144,"description":394,"children":-1},"How organization activation gates mutation APIs and why org-scoped APIs use route org IDs.",{"title":151,"path":152,"stem":153,"description":396,"children":-1},"How Zeeq pulls Markdown documentation out of public and private GitHub repositories and turns it into searchable library documents.",1784297365800]