[{"data":1,"prerenderedAt":443},["ShallowReactive",2],{"navigation_docs":3,"-docs-architecture-github-integration":158,"-docs-architecture-github-integration-surround":438},[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":134,"body":160,"description":431,"extension":432,"links":433,"meta":434,"navigation":435,"path":135,"seo":436,"stem":136,"__hash__":437},"docs\u002Fdocs\u002F9.architecture\u002F4.github-integration.md",{"type":161,"value":162,"toc":423},"minimark",[163,167,171,176,179,191,194,198,201,271,281,285,299,302,320,331,335,417],[164,165,134],"h1",{"id":166},"github-integration",[168,169,170],"p",{},"Zeeq uses a GitHub App installation to receive webhook events and write review comments, reactions, and review-thread messages. The installation link is organization-scoped inside Zeeq, while repository mappings decide which GitHub repositories are allowed to enter the queue-backed code-review workflow.",[172,173,175],"h2",{"id":174},"installation-link","Installation Link",[168,177,178],{},"An owner or admin starts the install flow from the Zeeq settings UI. The server creates a short-lived protected state token that carries the current Zeeq organization, optional team, user id, nonce, and expiry.",[168,180,181,182,186,187,190],{},"GitHub redirects back to Zeeq with an ",[183,184,185],"code",{},"installation_id"," and that state token. Zeeq verifies the installation with GitHub App authentication, then stores the canonical local link in ",[183,188,189],{},"GitHubAppInstallation",".",[168,192,193],{},"The phase-one trust model links a GitHub-verified installation to the Zeeq organization carried by the protected state token. It does not yet prove the Zeeq user controls the GitHub account through a GitHub user access token.",[172,195,197],{"id":196},"repository-registration","Repository Registration",[168,199,200],{},"Webhook ingress does not accept every repository visible to the GitHub App. Operators must register repositories through the GitHub repository management API:",[202,203,204,217],"table",{},[205,206,207],"thead",{},[208,209,210,214],"tr",{},[211,212,213],"th",{},"Endpoint",[211,215,216],{},"Purpose",[218,219,220,231,241,251,261],"tbody",{},[208,221,222,228],{},[223,224,225],"td",{},[183,226,227],{},"GET \u002Fapi\u002Fv1\u002Forgs\u002F{orgId}\u002Fintegrations\u002Fgithub\u002Frepositories\u002Fconfigured",[223,229,230],{},"Lists active Zeeq repository mappings for the route organization.",[208,232,233,238],{},[223,234,235],{},[183,236,237],{},"GET \u002Fapi\u002Fv1\u002Forgs\u002F{orgId}\u002Fintegrations\u002Fgithub\u002Frepositories\u002Favailable",[223,239,240],{},"Lists repositories currently visible to the linked GitHub App installation and marks which are already configured.",[208,242,243,248],{},[223,244,245],{},[183,246,247],{},"POST \u002Fapi\u002Fv1\u002Forgs\u002F{orgId}\u002Fintegrations\u002Fgithub\u002Frepositories",[223,249,250],{},"Creates or refreshes a Zeeq repository mapping after validating the repository is visible to the installation.",[208,252,253,258],{},[223,254,255],{},[183,256,257],{},"PUT \u002Fapi\u002Fv1\u002Forgs\u002F{orgId}\u002Fintegrations\u002Fgithub\u002Frepositories\u002F{repositoryId}",[223,259,260],{},"Updates local display, team, and enabled settings for an existing mapping.",[208,262,263,268],{},[223,264,265],{},[183,266,267],{},"DELETE \u002Fapi\u002Fv1\u002Forgs\u002F{orgId}\u002Fintegrations\u002Fgithub\u002Frepositories\u002F{repositoryId}",[223,269,270],{},"Soft-disables a mapping so future webhooks for that repository are ignored.",[168,272,273,274,277,278,190],{},"The route organization must match the organization in the authenticated Zeeq session. Repository identity uses GitHub ",[183,275,276],{},"owner\u002Fname",", for example ",[183,279,280],{},"zeeq-ai\u002Fzeeq",[172,282,284],{"id":283},"webhook-gate","Webhook Gate",[168,286,287,290,291,294,295,298],{},[183,288,289],{},"GitHubWebhookRepositoryGate"," resolves incoming webhook ",[183,292,293],{},"repository.full_name"," values against active ",[183,296,297],{},"CodeRepository"," rows. Missing or disabled mappings are acknowledged as no-op and do not publish queue work.",[168,300,301],{},"This gate is intentionally early:",[303,304,305,309,314,317],"ol",{},[306,307,308],"li",{},"GitHub delivery is accepted and traced.",[306,310,311,312,190],{},"The repository is resolved from ",[183,313,297],{},[306,315,316],{},"Unsupported repositories stop there.",[306,318,319],{},"Supported repositories publish tenant queue messages for PR, PR issue-comment, and PR review-comment workflows.",[168,321,322,323,326,327,330],{},"Command comments have an additional filter. Only PR issue comments or review comments whose first non-whitespace token is ",[183,324,325],{},"\u002Fzeeq"," or ",[183,328,329],{},"+zeeq"," enter the feedback pipeline.",[172,332,334],{"id":333},"durable-state","Durable State",[202,336,337,347],{},[205,338,339],{},[208,340,341,344],{},[211,342,343],{},"Model",[211,345,346],{},"Role",[218,348,349,358,367,377,387,397,407],{},[208,350,351,355],{},[223,352,353],{},[183,354,189],{},[223,356,357],{},"Organization-scoped GitHub App installation link and token-resolution source.",[208,359,360,364],{},[223,361,362],{},[183,363,297],{},[223,365,366],{},"Provider-neutral repository mapping used by webhook ingress and workflow handlers.",[208,368,369,374],{},[223,370,371],{},[183,372,373],{},"GitHubWebhookDelivery",[223,375,376],{},"Idempotent delivery claim record for queue consumers.",[208,378,379,384],{},[223,380,381],{},[183,382,383],{},"PullRequestRecord",[223,385,386],{},"Current PR state used by workflow policy and review creation.",[208,388,389,394],{},[223,390,391],{},[183,392,393],{},"CodeReviewRecord",[223,395,396],{},"Review run state and budget authority.",[208,398,399,404],{},[223,400,401],{},[183,402,403],{},"GitHubCommentAnchor",[223,405,406],{},"Repairable pointer from logical Zeeq comment target to GitHub comment id.",[208,408,409,414],{},[223,410,411],{},[183,412,413],{},"GitHubCommentLease",[223,415,416],{},"Short-lived write lease for serialized GitHub comment updates.",[168,418,419,420,422],{},"Repository mappings do not store GitHub installation ids. Installation lifecycle belongs to ",[183,421,189],{},"; repository mappings only say which provider repository is enabled for a Zeeq organization or team.",{"title":424,"searchDepth":425,"depth":425,"links":426},"",2,[427,428,429,430],{"id":174,"depth":425,"text":175},{"id":196,"depth":425,"text":197},{"id":283,"depth":425,"text":284},{"id":333,"depth":425,"text":334},"How Zeeq links a GitHub App installation and registers repositories for webhook work.","md",null,{"icon":132},true,{"title":134,"description":431},"xnNEkAiv3zA4yCwmOO8V8aH8wEPRURSq0ZUbJPXQ9LY",[439,441],{"title":129,"path":130,"stem":131,"description":440,"icon":132,"children":-1},"How Zeeq renders and updates owned GitHub comments.",{"title":138,"path":139,"stem":140,"description":442,"children":-1},"Architecture for organization LLM configuration, encrypted tenant keys, and default LLM clients.",1784297365800]