[{"data":1,"prerenderedAt":1715},["ShallowReactive",2],{"navigation_docs":3,"-docs-managing-zeeq-document-libraries":208,"-docs-managing-zeeq-document-libraries-surround":1710},[4,40,73,112,136,151],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started",[10,15,20,25,30,35],{"title":11,"path":12,"stem":13,"icon":14},"Key Features","\u002Fdocs\u002Fgetting-started\u002Fkey-features","docs\u002F1.getting-started\u002F1.key-features","i-lucide-blocks",{"title":16,"path":17,"stem":18,"icon":19},"Why Zeeq?","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002F1.getting-started\u002F2.introduction","i-lucide-house",{"title":21,"path":22,"stem":23,"icon":24},"Org Onboarding","\u002Fdocs\u002Fgetting-started\u002Forg-onboarding","docs\u002F1.getting-started\u002F3.org-onboarding","i-lucide-rocket",{"title":26,"path":27,"stem":28,"icon":29},"Connecting Agents","\u002Fdocs\u002Fgetting-started\u002Fconnecting-agents","docs\u002F1.getting-started\u002F4.connecting-agents","i-lucide-plug",{"title":31,"path":32,"stem":33,"icon":34},"Harness Tuning","\u002Fdocs\u002Fgetting-started\u002Fharness-tuning","docs\u002F1.getting-started\u002F5.harness-tuning","i-lucide-wrench",{"title":36,"path":37,"stem":38,"icon":39},"FAQ","\u002Fdocs\u002Fgetting-started\u002Ffaq","docs\u002F1.getting-started\u002F6.faq","i-lucide-circle-question-mark",{"title":41,"icon":6,"path":42,"stem":43,"children":44,"page":6},"Feature Overview","\u002Fdocs\u002Fkey-features","docs\u002F2.key-features",[45,49,53,57,61,65,69],{"title":46,"path":47,"stem":48,"icon":14},"Knowledge Libraries","\u002Fdocs\u002Fkey-features\u002Fknowledge-libraries","docs\u002F2.key-features\u002F1.knowledge-libraries",{"title":50,"path":51,"stem":52,"icon":14},"Code Reviews","\u002Fdocs\u002Fkey-features\u002Fcode-reviews","docs\u002F2.key-features\u002F2.code-reviews",{"title":54,"path":55,"stem":56,"icon":14},"Code Review as Agent Tool","\u002Fdocs\u002Fkey-features\u002Fcode-review-tool","docs\u002F2.key-features\u002F3.code-review-tool",{"title":58,"path":59,"stem":60,"icon":14},"Zeeq Tools Telemetry","\u002Fdocs\u002Fkey-features\u002Ftool-and-docs-telemetry","docs\u002F2.key-features\u002F4.tool-and-docs-telemetry",{"title":62,"path":63,"stem":64,"icon":14},"Session Telemetry","\u002Fdocs\u002Fkey-features\u002Fsession-telemetry","docs\u002F2.key-features\u002F5.session-telemetry",{"title":66,"path":67,"stem":68,"icon":14},"Dynamic Skills","\u002Fdocs\u002Fkey-features\u002Fdynamic-skills","docs\u002F2.key-features\u002F6.dynamic-skills",{"title":70,"path":71,"stem":72,"icon":14},"World Model (2026 Q3)","\u002Fdocs\u002Fkey-features\u002Fworld-model","docs\u002F2.key-features\u002F7.world-model",{"title":74,"path":75,"stem":76,"children":77,"page":6},"Managing Zeeq","\u002Fdocs\u002Fmanaging-zeeq","docs\u002F3.managing-zeeq",[78,83,88,93,97,102,107],{"title":79,"path":80,"stem":81,"icon":82},"Local Development","\u002Fdocs\u002Fmanaging-zeeq\u002Flocal-development","docs\u002F3.managing-zeeq\u002F0.local-development","i-lucide-square-terminal",{"title":84,"path":85,"stem":86,"icon":87},"GitHub Configuration","\u002Fdocs\u002Fmanaging-zeeq\u002Fgithub-configuration","docs\u002F3.managing-zeeq\u002F1.github-configuration","i-lucide-github",{"title":89,"path":90,"stem":91,"icon":92},"Organizations and Membership","\u002Fdocs\u002Fmanaging-zeeq\u002Forgs-membership-invitations","docs\u002F3.managing-zeeq\u002F2.orgs-membership-invitations","i-hugeicons-cube",{"title":46,"path":94,"stem":95,"icon":96},"\u002Fdocs\u002Fmanaging-zeeq\u002Fdocument-libraries","docs\u002F3.managing-zeeq\u002F3.document-libraries","i-lucide-library-big",{"title":98,"path":99,"stem":100,"icon":101},"LLM Settings Configuration","\u002Fdocs\u002Fmanaging-zeeq\u002Fllm-settings-configuration","docs\u002F3.managing-zeeq\u002F4.llm-settings-configuration","i-hugeicons-ai-magic",{"title":103,"path":104,"stem":105,"icon":106},"Agent Code Review","\u002Fdocs\u002Fmanaging-zeeq\u002Fagent-code-reviews","docs\u002F3.managing-zeeq\u002F5.agent-code-reviews","i-hugeicons-chat-spark-01",{"title":108,"path":109,"stem":110,"icon":111},"Credentials & API Tokens","\u002Fdocs\u002Fmanaging-zeeq\u002Fcredentials","docs\u002F3.managing-zeeq\u002F6.credentials","i-hugeicons-key-01",{"title":113,"path":114,"stem":115,"children":116,"page":6},"Runtime Configuration","\u002Fdocs\u002Fconfiguration","docs\u002F5.configuration",[117,122,126,131],{"title":118,"path":119,"stem":120,"icon":121},"Google Cloud Configuration","\u002Fdocs\u002Fconfiguration\u002Fgcp-runtime","docs\u002F5.configuration\u002F1.gcp-runtime","i-hugeicons-google",{"title":84,"path":123,"stem":124,"icon":125},"\u002Fdocs\u002Fconfiguration\u002Fgithub-configuration","docs\u002F5.configuration\u002F2.github-configuration","i-hugeicons-github",{"title":127,"path":128,"stem":129,"icon":130},"Local OpenIddict Certificates","\u002Fdocs\u002Fconfiguration\u002Flocal-openiddict-certificates","docs\u002F5.configuration\u002F3.local-openiddict-certificates","i-lucide-file-lock",{"title":132,"path":133,"stem":134,"icon":135},"System Admin Access","\u002Fdocs\u002Fconfiguration\u002Fsystem-admin-access","docs\u002F5.configuration\u002F4.system-admin-access","i-hugeicons-shield-01",{"title":137,"path":138,"stem":139,"children":140,"page":6},"Metrics","\u002Fdocs\u002Fmetrics","docs\u002F6.metrics",[141,146],{"title":142,"path":143,"stem":144,"icon":145},"Metrics Dashboard","\u002Fdocs\u002Fmetrics\u002Fmetrics-dashboard","docs\u002F6.metrics\u002F1.metrics-dashboard","i-hugeicons-analytics-01",{"title":147,"path":148,"stem":149,"icon":150},"Metrics Pipeline","\u002Fdocs\u002Fmetrics\u002Fmetrics-pipeline","docs\u002F6.metrics\u002F2.metrics-pipeline","i-hugeicons-database-02",{"title":152,"path":153,"stem":154,"children":155,"page":6},"Design and Architecture","\u002Fdocs\u002Farchitecture","docs\u002F9.architecture",[156,161,166,171,176,180,184,189,194,199,204],{"title":157,"path":158,"stem":159,"icon":160},"Key Architecture Principles","\u002Fdocs\u002Farchitecture\u002Fkey-principles","docs\u002F9.architecture\u002F0.key-principles","i-lucide-pencil-ruler",{"title":162,"path":163,"stem":164,"icon":165},"MCP Tools Inventory","\u002Fdocs\u002Farchitecture\u002Ftools-inventory","docs\u002F9.architecture\u002F1.tools-inventory","i-lucide-hammer",{"title":167,"path":168,"stem":169,"icon":170},"Caching","\u002Fdocs\u002Farchitecture\u002Fcaching","docs\u002F9.architecture\u002F2.caching","i-lucide-database",{"title":172,"path":173,"stem":174,"icon":175},"Messaging and Queueing","\u002Fdocs\u002Farchitecture\u002Fmessaging-and-queueing","docs\u002F9.architecture\u002F3.messaging-and-queueing","i-lucide-message-square",{"title":177,"path":178,"stem":179,"icon":87},"GitHub Comment Rendering","\u002Fdocs\u002Farchitecture\u002Fgithub-comment-rendering","docs\u002F9.architecture\u002F4.github-comment-rendering",{"title":181,"path":182,"stem":183,"icon":87},"GitHub Integration","\u002Fdocs\u002Farchitecture\u002Fgithub-integration","docs\u002F9.architecture\u002F5.github-integration",{"title":185,"path":186,"stem":187,"icon":188},"LLM Settings and Secret Storage","\u002Fdocs\u002Farchitecture\u002Fllm-settings-and-secret-storage","docs\u002F9.architecture\u002F6.llm-settings-and-secret-storage","i-lucide-key",{"title":190,"path":191,"stem":192,"icon":193},"Organization Activation and Routes","\u002Fdocs\u002Farchitecture\u002Forganization-activation-and-routes","docs\u002F9.architecture\u002F7.organization-activation-and-routes","i-lucide-door-open",{"title":195,"path":196,"stem":197,"icon":198},"MCP Uploaded-Diff Code Reviews","\u002Fdocs\u002Farchitecture\u002Fmcp-uploaded-diff-code-reviews","docs\u002F9.architecture\u002F8.mcp-uploaded-diff-code-reviews","i-lucide-file-search",{"title":200,"path":201,"stem":202,"icon":203},"Repository Content Ingest","\u002Fdocs\u002Farchitecture\u002Frepository-content-ingest","docs\u002F9.architecture\u002F9.repository-content-ingest","i-lucide-file-stack",{"title":205,"path":206,"stem":207},"Telemetry Ingest (2026 Q3)","\u002Fdocs\u002Farchitecture\u002Ftelemetry-ingest","docs\u002F9.architecture\u002F9.telemetry-ingest",{"id":209,"title":46,"body":210,"description":1704,"extension":336,"links":1705,"meta":1706,"navigation":1707,"path":94,"seo":1708,"stem":95,"__hash__":1709},"docs\u002Fdocs\u002F3.managing-zeeq\u002F3.document-libraries.md",{"type":211,"value":212,"toc":1679},"minimark",[213,218,222,225,229,233,236,264,269,272,279,284,287,290,330,402,408,412,415,421,493,496,500,511,515,518,537,540,554,561,565,596,599,607,632,639,642,645,648,668,671,677,684,688,691,693,713,716,964,967,973,977,1004,1011,1087,1094,1213,1238,1242,1277,1288,1292,1304,1308,1311,1321,1400,1407,1411,1433,1437,1452,1458,1461,1468,1474,1477,1480,1484,1487,1494,1497,1501,1504,1547,1554,1557,1563,1569,1573,1583,1586,1589,1600,1603,1607,1610,1616,1619,1666,1669,1675],[214,215,217],"h2",{"id":216},"summary","Summary",[219,220,221],"p",{},"Manual document libraries let an organization store curated Markdown documents that can be retrieved by API callers and local MCP agents. A library is named within an organization, and each document is identified by its normalized path inside that library.",[219,223,224],{},"Libraries can be created directly in Zeeq or imported from a GitHub repository (including from the source repo itself to get best of both worlds).",[226,227,228],"tip",{},"Importing the GitHub repo into Zeeq lets your documents be indexed and gain telemetry.",[214,230,232],{"id":231},"authoring-and-ingest","Authoring and ingest",[219,234,235],{},"Tips whether you use hand authored or agent authored docs ingested from a repo:",[237,238,239,252,258],"ol",{},[240,241,242,246,247,251],"li",{},[243,244,245],"strong",{},"Prefer well-curated, canonical \"invariants\".","  There is some overlap between \"skills\" and documents as these are both just markdown files.  However, Zeeq is best suited for storing documents that address \"canonical invariants\".  For example: how to write exception handling or logging, how to perform data access properly, how to handle security and validation at the boundary.  These are ",[248,249,250],"em",{},"invariant"," across projects and apps.",[240,253,254,257],{},[243,255,256],{},"Use text cues to your advantage.","  Because coding agents just process the context and text that you provide, use that to your advantage in naming, in headings, in comments.  ",[240,259,260,263],{},[243,261,262],{},"Use examples.","  From experience code snippets and short examples provide agents the best performance.",[265,266,268],"h3",{"id":267},"hand-authored","Hand authored",[219,270,271],{},"Documents can be hand-authored directly in Zeeq. This workflow is best suited when no-document source exists yet and is overall a lighter, more responsive workflow since the repository ingest based workflow runs periodically and refreshes slower.",[219,273,274],{},[275,276],"img",{"alt":277,"src":278},"authoring-experience","\u002Fscreens\u002Fauthoring-experience.png",[280,281,283],"h4",{"id":282},"naming-and-front-matter","Naming and front-matter",[219,285,286],{},"Document naming is a key piece of context that agents use to determine how to pick and choose which documents to read.",[219,288,289],{},"Key tips for naming files:",[237,291,292,310,316],{},[240,293,294,297,298,302,303,297,306,309],{},[243,295,296],{},"Use descriptive paths",".  ",[299,300,301],"code",{},"\u002Fbackend\u002Fdotnet-csharp-best-practices.md"," is strictly better than ",[299,304,305],{},"backend-coding.md",[299,307,308],{},"\u002Fbackend\u002Fdotnet-10-csharp-14-best-practices.md"," is even better as it encodes more information densely into the file name",[240,311,312,315],{},[243,313,314],{},"Use segments for hints",".  Segments in the path or file name can be used for hints in how documents are organized.  Use this to your advantage.",[240,317,318,321,322,325,326,329],{},[243,319,320],{},"Use front-matter attributes and titles.","  Zeeq will parse front-matter attributes like ",[299,323,324],{},"keywords"," or ",[299,327,328],{},"tags"," and present this in the compact index that is served to agents.",[331,332,338],"pre",{"className":333,"code":334,"filename":335,"language":336,"meta":337,"style":337},"language-md shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","---\nkeywords: csharp, dotnet, efcore, entity framework,\n---\n\n# C# 14 (CSharp), .NET 10, EF General Guidelines\n\nThis application is a .NET C# Model Context Protocol (MCP) server using the ModelContextProtocol C# SDK v 1.4.0 (API reference: \u003Chttps:\u002F\u002Fcsharp.sdk.modelcontextprotocol.io\u002Fapi\u002FModelContextProtocol.html>)\n","some-doc.md","md","",[299,339,340,349,355,361,368,378,383],{"__ignoreMap":337},[341,342,345],"span",{"class":343,"line":344},"line",1,[341,346,348],{"class":347},"sTEyZ","---\n",[341,350,352],{"class":343,"line":351},2,[341,353,354],{"class":347},"keywords: csharp, dotnet, efcore, entity framework,\n",[341,356,358],{"class":343,"line":357},3,[341,359,348],{"class":360},"sMK4o",[341,362,364],{"class":343,"line":363},4,[341,365,367],{"emptyLinePlaceholder":366},true,"\n",[341,369,371,374],{"class":343,"line":370},5,[341,372,373],{"class":360},"# ",[341,375,377],{"class":376},"sBMFI","C# 14 (CSharp), .NET 10, EF General Guidelines\n",[341,379,381],{"class":343,"line":380},6,[341,382,367],{"emptyLinePlaceholder":366},[341,384,386,389,392,396,399],{"class":343,"line":385},7,[341,387,388],{"class":347},"This application is a .NET C# Model Context Protocol (MCP) server using the ModelContextProtocol C# SDK v 1.4.0 (API reference: ",[341,390,391],{"class":360},"\u003C",[341,393,395],{"class":394},"sQLHv","https:\u002F\u002Fcsharp.sdk.modelcontextprotocol.io\u002Fapi\u002FModelContextProtocol.html",[341,397,398],{"class":360},">",[341,400,401],{"class":347},")\n",[219,403,404,405,407],{},"In this example, we use the front-matter ",[299,406,324],{}," and title to clearly convey the scope of this document so that when the document index is retrieved, the agent can decide what it wants to read.",[265,409,411],{"id":410},"ingested-from-github","Ingested from GitHub",[219,413,414],{},"Existing content can be ingested directly from GitHub:",[219,416,417],{},[275,418],{"alt":419,"src":420},"gh-ingest","\u002Fscreens\u002Fgh-ingest.png",[422,423,424,437],"table",{},[425,426,427],"thead",{},[428,429,430,434],"tr",{},[431,432,433],"th",{},"Property",[431,435,436],{},"Description",[438,439,440,451,473,483],"tbody",{},[428,441,442,448],{},[443,444,445],"td",{},[243,446,447],{},"Repository visibility",[443,449,450],{},"This determines the type of import and where it is stored in the database. Imports from public repositories are shared across organizations.",[428,452,453,458],{},[443,454,455],{},[243,456,457],{},"GitHub clone URL",[443,459,460,461,464,465,468,469,472],{},"The URL to clone the repository from GitHub. The clone process uses a sparse checkout and only clones for ",[299,462,463],{},"*.md",", ",[299,466,467],{},"*.mdc",", and ",[299,470,471],{},"*.mdx"," content",[428,474,475,480],{},[443,476,477],{},[243,478,479],{},"Include paths",[443,481,482],{},"A list of paths to include when importing content from the repository.",[428,484,485,490],{},[443,486,487],{},[243,488,489],{},"Exclude paths",[443,491,492],{},"A list of paths to exclude when importing content from the repository.",[226,494,495],{},"Prefer smaller collections of documents since it is easy to compose these in the agent.",[214,497,499],{"id":498},"indexing","Indexing",[219,501,502,503,506,507,510],{},"Documents are indexed directly and then also chunked into ",[248,504,505],{},"sections"," and ",[248,508,509],{},"code snippets"," which are indexed and searched separately.",[512,513,514],"note",{},"Bias towards short, targeted sections with unique and dense headers as this allows agents to efficiently find what they need and reduce context load (read just the most relevant parts instead of reading the entire document)",[516,517],"hr",{},[219,519,520,521,524,525,528,529,532,533,536],{},"Snippets are produced and embedded by a background sweep (",[299,522,523],{},"SnippetIndexingHostedService","), not synchronously on write. When a document's content changes, its ",[299,526,527],{},"ProcessingStatus"," resets to ",[299,530,531],{},"Pending","; the sweep ticks every 30 seconds (",[299,534,535],{},"AppSettings:SnippetIndexing:SweepIntervalSeconds",") and drains the entire pending backlog each tick — a large backfill runs at full throughput, not one batch per tick.",[219,538,539],{},"Each tick runs two stages:",[237,541,542,548],{},[240,543,544,547],{},[243,545,546],{},"Parse and compose",": pending documents are parsed, split into section\u002Fcode snippets, and reconciled against previously stored rows by content hash. An unchanged snippet keeps its existing embedding; changed or new snippets get a fresh row with a null embedding, ready to be picked up by the next stage.",[240,549,550,553],{},[243,551,552],{},"Embed",": snippets with a missing or stale embedding are claimed in batches and sent to the embedding provider. Snippets are always full-text searchable immediately after step 1 — the vector arm only lights up once step 2 completes for that row.",[219,555,556,557,560],{},"A document that fails to parse is marked ",[299,558,559],{},"Failed"," and does not stall the rest of the sweep.",[265,562,564],{"id":563},"combined-document-search-ranking","Combined document search ranking",[219,566,567,568,571,572,575,576,579,580,583,584,587,588,591,592,595],{},"A single query unions both signals. The ",[299,569,570],{},"search_vector"," GIN index and the trigram GIN index on ",[299,573,574],{},"title_normalized"," are combined with an ",[299,577,578],{},"OR"," predicate so Postgres can use both via a bitmap OR. The full-text rank (",[299,581,582],{},"ts_rank_cd",") is normalized with ",[299,585,586],{},"DivideByMeanHarmonicDistanceBetweenExtents | DivideByItselfPlusOne"," so it is bounded to ",[299,589,590],{},"[0, 1)"," and directly comparable to the ",[299,593,594],{},"[0, 1]"," trigram similarity.",[219,597,598],{},"Results are ordered by a tiered combiner so a content (full-text) hit always outranks a fuzzy-only hit, and a document matching both signals ranks highest:",[331,600,605],{"className":601,"code":603,"language":604,"meta":337},[602],"language-text","score = (matchesFullText ? 1.0 : 0.0)   \u002F\u002F content match is the dominant tier\n      +  fullTextScore                   \u002F\u002F orders within the full-text tier\n      + (matchesFuzzy ? fuzzyScore : 0)  \u002F\u002F tie-break; lifts \"Both\" matches\n","text",[299,606,603],{"__ignoreMap":337},[219,608,609,610,613,614,464,617,620,621,624,625,464,628,631],{},"Each result reports its ",[299,611,612],{},"matchType"," (",[299,615,616],{},"FullText",[299,618,619],{},"Fuzzy",", or ",[299,622,623],{},"Both",") and both raw component scores (",[299,626,627],{},"fullTextScore",[299,629,630],{},"fuzzyScore",") so callers can see why a document surfaced.",[219,633,634,635,638],{},"Document deletes use ",[299,636,637],{},"DELETE \u002Fapi\u002Fv1\u002Flibraries\u002F{name}\u002Fdocuments?path=...",". The query parameter is normalized with the same path rules used by writes.",[265,640,641],{"id":505},"Sections",[219,643,644],{},"Each header section of a Markdown document is indexed separately as part of the section search capabilities. This is generally a more efficient retrieval mechanism for agents since they can find the most relevant sections and choose to read documents only as needed.",[219,646,647],{},"Some key tips:",[237,649,650,656,662],{},[240,651,652,655],{},[243,653,654],{},"Use dense, descriptive headings",".  The headings are supplied in various contexts to the agents and allows the agents to decide which documents they should read in full.  Additionally, the full heading path goes into the embedding.  Prefer very dense, descriptive headings like \"C# exception handling best practices\" over \"Best practices\" as the latter carries less information.",[240,657,658,661],{},[243,659,660],{},"Use well-encapsulated, discrete sections.","  Rather than big, long sections that cover many topics, use small, discrete section boundaries so that topics are organized together since sections are served to the agents whole.",[240,663,664,667],{},[243,665,666],{},"Section text before code snippets goes into the snippet embedding",".  Because the section text before the code snippet also goes into the snippet embedding, use text descriptively to identify what the code snippet does.",[219,669,670],{},"Sections can be previewed in the library UI:",[219,672,673],{},[275,674],{"alt":675,"src":676},"document-sections","\u002Fscreens\u002Fdocument-sections.png",[512,678,679,680,683],{},"If the embedding provider is unavailable or times out (query path only — the sweep retries internally), search silently falls back to full-text-only ranking rather than failing the request. Callers can detect this via the ",[299,681,682],{},"degraded"," flag on results.",[265,685,687],{"id":686},"snippets","Snippets",[219,689,690],{},"Each code snippet is parsed out of the Markdown document and indexed separately as part of the code snippet search capabilities.  Like the sections, this is a more efficient mechanism of retrieval and allows the agents to access only the most targeted, relevant context.",[219,692,647],{},[237,694,695,701,707],{},[240,696,697,700],{},[243,698,699],{},"Use comments inside of your snippets",".  The code comments are part of the embedding and also guide the agents in how to use the sample.  Use comments and callouts to let agents know about best practices",[240,702,703,706],{},[243,704,705],{},"Use text before each snippet.","  The heading and section text before each snippet is also incorporated into the snippet to provide context.  It is important to use this to your advantage by providing descriptive text before a snippet.",[240,708,709,712],{},[243,710,711],{},"Use semantic XML tags to encapsulate your code",".  This assigns a name to this example and allows the agent to understand \"what is this sample for?\"",[219,714,715],{},"Example:",[331,717,721],{"className":718,"code":719,"language":720,"meta":337,"style":337},"language-markdown shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","## Logging and OpenTelemetry (OTEL) Tracing\n\n- This library is using Serilog and Serilog.AspNetCore\n- Use the `ILogger` interface for logging in web endpoints and use Aspire MCP to check logs\n- Follow the high-performang logging in .NET guidelines\n  - Use `LoggerMessageAttribute` for compile time log generation on `private partial void LogSomething();`\n  - Put these at the bottom of the file\n  - This requires that classes are `partial` and these methods are `partial`\n- Logging is visible in Aspire MCP for `zeeq-server`\n- Logging is connected to OTEL traces and spans as well; use both together\n- Use traces, spans, and events where it is improves the visiblity of the call flow and for troubleshooting (see `ZeeqServerTelemetry.cs` for example)\n\n\u003Chigh_performance_logging>\n\n```cs\npublic partial class SomeService(ILogger\u003CSomeService> log)\n{\n    \u002F\u002F Other code\n\n    [LoggerMessage(\n        EventId = 2000,\n        Level = LogLevel.Error,\n        Message = \"❌  Error synchronizing repository {RepoName} from {RepoUrl}.\"\n    )]\n    private partial void LogSyncError(string repoName, string repoUrl);\n}\n```\n","markdown",[299,722,723,731,735,743,762,769,795,802,826,841,849,867,872,878,883,893,899,905,911,916,922,928,934,940,946,952,958],{"__ignoreMap":337},[341,724,725,728],{"class":343,"line":344},[341,726,727],{"class":360},"## ",[341,729,730],{"class":376},"Logging and OpenTelemetry (OTEL) Tracing\n",[341,732,733],{"class":343,"line":351},[341,734,367],{"emptyLinePlaceholder":366},[341,736,737,740],{"class":343,"line":357},[341,738,739],{"class":360},"-",[341,741,742],{"class":347}," This library is using Serilog and Serilog.AspNetCore\n",[341,744,745,747,750,753,757,759],{"class":343,"line":363},[341,746,739],{"class":360},[341,748,749],{"class":347}," Use the ",[341,751,752],{"class":360},"`",[341,754,756],{"class":755},"sfazB","ILogger",[341,758,752],{"class":360},[341,760,761],{"class":347}," interface for logging in web endpoints and use Aspire MCP to check logs\n",[341,763,764,766],{"class":343,"line":370},[341,765,739],{"class":360},[341,767,768],{"class":347}," Follow the high-performang logging in .NET guidelines\n",[341,770,771,774,777,779,782,784,787,789,792],{"class":343,"line":380},[341,772,773],{"class":360},"  -",[341,775,776],{"class":347}," Use ",[341,778,752],{"class":360},[341,780,781],{"class":755},"LoggerMessageAttribute",[341,783,752],{"class":360},[341,785,786],{"class":347}," for compile time log generation on ",[341,788,752],{"class":360},[341,790,791],{"class":755},"private partial void LogSomething();",[341,793,794],{"class":360},"`\n",[341,796,797,799],{"class":343,"line":385},[341,798,773],{"class":360},[341,800,801],{"class":347}," Put these at the bottom of the file\n",[341,803,805,807,810,812,815,817,820,822,824],{"class":343,"line":804},8,[341,806,773],{"class":360},[341,808,809],{"class":347}," This requires that classes are ",[341,811,752],{"class":360},[341,813,814],{"class":755},"partial",[341,816,752],{"class":360},[341,818,819],{"class":347}," and these methods are ",[341,821,752],{"class":360},[341,823,814],{"class":755},[341,825,794],{"class":360},[341,827,829,831,834,836,839],{"class":343,"line":828},9,[341,830,739],{"class":360},[341,832,833],{"class":347}," Logging is visible in Aspire MCP for ",[341,835,752],{"class":360},[341,837,838],{"class":755},"zeeq-server",[341,840,794],{"class":360},[341,842,844,846],{"class":343,"line":843},10,[341,845,739],{"class":360},[341,847,848],{"class":347}," Logging is connected to OTEL traces and spans as well; use both together\n",[341,850,852,854,857,859,862,864],{"class":343,"line":851},11,[341,853,739],{"class":360},[341,855,856],{"class":347}," Use traces, spans, and events where it is improves the visiblity of the call flow and for troubleshooting (see ",[341,858,752],{"class":360},[341,860,861],{"class":755},"ZeeqServerTelemetry.cs",[341,863,752],{"class":360},[341,865,866],{"class":347}," for example)\n",[341,868,870],{"class":343,"line":869},12,[341,871,367],{"emptyLinePlaceholder":366},[341,873,875],{"class":343,"line":874},13,[341,876,877],{"class":347},"\u003Chigh_performance_logging>\n",[341,879,881],{"class":343,"line":880},14,[341,882,367],{"emptyLinePlaceholder":366},[341,884,886,889],{"class":343,"line":885},15,[341,887,888],{"class":755},"```",[341,890,892],{"class":891},"sJsPd","cs\n",[341,894,896],{"class":343,"line":895},16,[341,897,898],{"class":891},"public partial class SomeService(ILogger\u003CSomeService> log)\n",[341,900,902],{"class":343,"line":901},17,[341,903,904],{"class":891},"{\n",[341,906,908],{"class":343,"line":907},18,[341,909,910],{"class":891},"    \u002F\u002F Other code\n",[341,912,914],{"class":343,"line":913},19,[341,915,367],{"emptyLinePlaceholder":366},[341,917,919],{"class":343,"line":918},20,[341,920,921],{"class":891},"    [LoggerMessage(\n",[341,923,925],{"class":343,"line":924},21,[341,926,927],{"class":891},"        EventId = 2000,\n",[341,929,931],{"class":343,"line":930},22,[341,932,933],{"class":891},"        Level = LogLevel.Error,\n",[341,935,937],{"class":343,"line":936},23,[341,938,939],{"class":891},"        Message = \"❌  Error synchronizing repository {RepoName} from {RepoUrl}.\"\n",[341,941,943],{"class":343,"line":942},24,[341,944,945],{"class":891},"    )]\n",[341,947,949],{"class":343,"line":948},25,[341,950,951],{"class":891},"    private partial void LogSyncError(string repoName, string repoUrl);\n",[341,953,955],{"class":343,"line":954},26,[341,956,957],{"class":891},"}\n",[341,959,961],{"class":343,"line":960},27,[341,962,963],{"class":755},"```\n",[219,965,966],{},"Snippets can be previewed in the library UI:",[219,968,969],{},[275,970],{"alt":971,"src":972},"code-snippets","\u002Fscreens\u002Fcode-snippets.png",[265,974,976],{"id":975},"forcing-a-full-reindex","Forcing a full reindex",[219,978,979,980,982,983,985,986,989,990,992,993,995,996,999,1000,1003],{},"The sweep only reprocesses a document when its ",[299,981,527],{}," is ",[299,984,531],{},"\u002F",[299,987,988],{},"Stale",", or a stale ",[299,991,499],{}," row (crash recovery). A document whose content hasn't changed since it was last indexed never becomes ",[299,994,531],{}," on its own — which matters whenever the ",[248,997,998],{},"parsing or composition logic itself"," changes (e.g. a ",[299,1001,1002],{},"SnippetIdentifierExtractor"," tuning pass), since that kind of change isn't reflected in any stored row's content hash.",[219,1005,1006,1007,1010],{},"To force every document back through parse → compose → (re-)embed, reset ",[299,1008,1009],{},"processing_status"," directly:",[331,1012,1016],{"className":1013,"code":1014,"language":1015,"meta":337,"style":337},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","UPDATE zeeq.docs_library_documents SET processing_status = 'Pending', updated_at = now();\nUPDATE zeeq.docs_public_documents SET processing_status = 'Pending', updated_at = now();\n","sql",[299,1017,1018,1058],{"__ignoreMap":337},[341,1019,1020,1024,1027,1030,1033,1036,1039,1041,1044,1047,1049,1052,1055],{"class":343,"line":344},[341,1021,1023],{"class":1022},"sbssI","UPDATE",[341,1025,1026],{"class":347}," zeeq.docs_library_documents ",[341,1028,1029],{"class":1022},"SET",[341,1031,1032],{"class":347}," processing_status ",[341,1034,1035],{"class":360},"=",[341,1037,1038],{"class":360}," '",[341,1040,531],{"class":755},[341,1042,1043],{"class":360},"'",[341,1045,1046],{"class":347},", updated_at ",[341,1048,1035],{"class":360},[341,1050,1051],{"class":1022}," now",[341,1053,1054],{"class":360},"()",[341,1056,1057],{"class":347},";\n",[341,1059,1060,1062,1065,1067,1069,1071,1073,1075,1077,1079,1081,1083,1085],{"class":343,"line":351},[341,1061,1023],{"class":1022},[341,1063,1064],{"class":347}," zeeq.docs_public_documents ",[341,1066,1029],{"class":1022},[341,1068,1032],{"class":347},[341,1070,1035],{"class":360},[341,1072,1038],{"class":360},[341,1074,531],{"class":755},[341,1076,1043],{"class":360},[341,1078,1046],{"class":347},[341,1080,1035],{"class":360},[341,1082,1051],{"class":1022},[341,1084,1054],{"class":360},[341,1086,1057],{"class":347},[219,1088,1089,1090,1093],{},"Scope to one library or one public source instead of the whole corpus by adding a ",[299,1091,1092],{},"WHERE",":",[331,1095,1097],{"className":1013,"code":1096,"language":1015,"meta":337,"style":337},"UPDATE zeeq.docs_library_documents\nSET processing_status = 'Pending', updated_at = now()\nWHERE organization_id = '\u003Corg_id>' AND library_id = '\u003Clibrary_id>';\n\nUPDATE zeeq.docs_public_documents\nSET processing_status = 'Pending', updated_at = now()\nWHERE public_source_id = '\u003Cpublic_source_id>';\n",[299,1098,1099,1106,1129,1162,1166,1173,1195],{"__ignoreMap":337},[341,1100,1101,1103],{"class":343,"line":344},[341,1102,1023],{"class":1022},[341,1104,1105],{"class":347}," zeeq.docs_library_documents\n",[341,1107,1108,1110,1112,1114,1116,1118,1120,1122,1124,1126],{"class":343,"line":351},[341,1109,1029],{"class":1022},[341,1111,1032],{"class":347},[341,1113,1035],{"class":360},[341,1115,1038],{"class":360},[341,1117,531],{"class":755},[341,1119,1043],{"class":360},[341,1121,1046],{"class":347},[341,1123,1035],{"class":360},[341,1125,1051],{"class":1022},[341,1127,1128],{"class":360},"()\n",[341,1130,1131,1133,1136,1138,1140,1143,1145,1148,1151,1153,1155,1158,1160],{"class":343,"line":357},[341,1132,1092],{"class":1022},[341,1134,1135],{"class":347}," organization_id ",[341,1137,1035],{"class":360},[341,1139,1038],{"class":360},[341,1141,1142],{"class":755},"\u003Corg_id>",[341,1144,1043],{"class":360},[341,1146,1147],{"class":1022}," AND",[341,1149,1150],{"class":347}," library_id ",[341,1152,1035],{"class":360},[341,1154,1038],{"class":360},[341,1156,1157],{"class":755},"\u003Clibrary_id>",[341,1159,1043],{"class":360},[341,1161,1057],{"class":347},[341,1163,1164],{"class":343,"line":363},[341,1165,367],{"emptyLinePlaceholder":366},[341,1167,1168,1170],{"class":343,"line":370},[341,1169,1023],{"class":1022},[341,1171,1172],{"class":347}," zeeq.docs_public_documents\n",[341,1174,1175,1177,1179,1181,1183,1185,1187,1189,1191,1193],{"class":343,"line":380},[341,1176,1029],{"class":1022},[341,1178,1032],{"class":347},[341,1180,1035],{"class":360},[341,1182,1038],{"class":360},[341,1184,531],{"class":755},[341,1186,1043],{"class":360},[341,1188,1046],{"class":347},[341,1190,1035],{"class":360},[341,1192,1051],{"class":1022},[341,1194,1128],{"class":360},[341,1196,1197,1199,1202,1204,1206,1209,1211],{"class":343,"line":385},[341,1198,1092],{"class":1022},[341,1200,1201],{"class":347}," public_source_id ",[341,1203,1035],{"class":360},[341,1205,1038],{"class":360},[341,1207,1208],{"class":755},"\u003Cpublic_source_id>",[341,1210,1043],{"class":360},[341,1212,1057],{"class":347},[219,1214,1215,1216,1219,1220,1223,1224,506,1227,1230,1231,985,1234,1237],{},"The sweep picks these up on its next tick (",[299,1217,1218],{},"SweepIntervalSeconds",", 30s by default) — no restart needed. Reconciliation still matches composed snippets against stored rows by ",[299,1221,1222],{},"(Kind, ContentHash, Ordinal)",": since content is unchanged, every row matches and keeps its existing embedding (no wasted provider calls), but ",[299,1225,1226],{},"EmbeddingPayload",[299,1228,1229],{},"Identifiers"," are unconditionally refreshed on a match — the same self-healing fix in ",[299,1232,1233],{},"PostgresLibraryDocumentSnippetStore",[299,1235,1236],{},"PostgresPublicDocumentSnippetStore"," that stops a parsing\u002Fextraction logic change from being silently invisible on already-indexed content.",[265,1239,1241],{"id":1240},"local-development","Local development",[331,1243,1247],{"className":1244,"code":1245,"language":1246,"meta":337,"style":337},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dotnet user-secrets set \"AppSettings:Llm:Embeddings:ApiKey\" \"\u003Cfireworks-key>\"\n","bash",[299,1248,1249],{"__ignoreMap":337},[341,1250,1251,1254,1257,1260,1263,1266,1269,1271,1274],{"class":343,"line":344},[341,1252,1253],{"class":376},"dotnet",[341,1255,1256],{"class":755}," user-secrets",[341,1258,1259],{"class":755}," set",[341,1261,1262],{"class":360}," \"",[341,1264,1265],{"class":755},"AppSettings:Llm:Embeddings:ApiKey",[341,1267,1268],{"class":360},"\"",[341,1270,1262],{"class":360},[341,1272,1273],{"class":755},"\u003Cfireworks-key>",[341,1275,1276],{"class":360},"\"\n",[219,1278,1279,1280,1283,1284,1287],{},"Same Fireworks account key used for the chat-completion ",[299,1281,1282],{},"Fast"," tier authorizes both — one account key, two separately-configured settings slices. Without this key set (or with ",[299,1285,1286],{},"Enabled: false","), the sweep still parses and full-text-indexes every document; only the vector arm is inactive, and search runs degraded.",[265,1289,1291],{"id":1290},"production","Production",[219,1293,1294,1295,1298,1299,1303],{},"The embeddings API key ships as a Secret Manager secret (",[299,1296,1297],{},"AppSettings__Llm__Embeddings__ApiKey","), mounted as an environment variable on both the web service and worker pool — see ",[1300,1301,118],"a",{"href":1302},"\u002Fdocs\u002Fconfiguration\u002Fgcp-runtime#secrets-required",".",[214,1305,1307],{"id":1306},"excluding-from-code-reviews","Excluding from code reviews",[219,1309,1310],{},"Not every library document is relevant to a code review. Operational and informational content — CLI cheatsheets, runbooks, workflow guides — helps humans and interactive agent sessions but adds noise when a code-review agent searches the knowledge base for canonical guidance.",[219,1312,1313,1314,1317,1318,1093],{},"Marking a document as ",[243,1315,1316],{},"excluded from code reviews"," hides it from the document tools ",[248,1319,1320],{},"only when they run on the code-review execution path",[422,1322,1323,1336],{},[425,1324,1325],{},[428,1326,1327,1330,1333],{},[431,1328,1329],{},"Tool",[431,1331,1332],{},"Code-review path",[431,1334,1335],{},"Interactive MCP \u002F HTTP",[438,1337,1338,1351,1363,1375,1386],{},[428,1339,1340,1345,1348],{},[443,1341,1342],{},[299,1343,1344],{},"list_documents",[443,1346,1347],{},"Excluded documents hidden",[443,1349,1350],{},"Full listing",[428,1352,1353,1358,1360],{},[443,1354,1355],{},[299,1356,1357],{},"search_documents",[443,1359,1347],{},[443,1361,1362],{},"Full results",[428,1364,1365,1370,1373],{},[443,1366,1367],{},[299,1368,1369],{},"search_sections",[443,1371,1372],{},"Snippets of excluded documents hidden",[443,1374,1362],{},[428,1376,1377,1382,1384],{},[443,1378,1379],{},[299,1380,1381],{},"search_code_snippets",[443,1383,1372],{},[443,1385,1362],{},[428,1387,1388,1393,1398],{},[443,1389,1390],{},[299,1391,1392],{},"read_document_by_path",[443,1394,1395],{},[243,1396,1397],{},"Always resolves",[443,1399,1397],{},[219,1401,1402,1403,1406],{},"Direct path reads resolve on every path by design: if a reviewer is explicitly pointed at a document (for example by a prompt), the read succeeds. Exclusion only removes the document from ",[248,1404,1405],{},"discovery"," — listings and searches.",[265,1408,1410],{"id":1409},"scope-and-limitations-v1","Scope and limitations (v1)",[1412,1413,1414,1420,1426],"ul",{},[240,1415,1416,1419],{},[243,1417,1418],{},"Hand-authored documents only."," Synced documents (repository-sourced ingest) are rejected with a 400 — an ingest run owns their lifecycle and would silently fight the flag. The editor hides the toggle for remote documents.",[240,1421,1422,1425],{},[243,1423,1424],{},"Public-source libraries are not filterable."," Their snippets live in a shared cross-organization table with no per-org override, so exclusion does not apply there.",[240,1427,1428,1429,1432],{},"The flag survives content edits and renames; it is stored on the document row (",[299,1430,1431],{},"excluded_from_code_reviews","), not derived from content.",[265,1434,1436],{"id":1435},"how-it-works","How It Works",[219,1438,1439,1440,1443,1444,1447,1448,1451],{},"The code-review agent executor wraps every document tool in a per-invocation dependency-injection scope (needed for safe concurrent tool calls). The review path marks that scope as ",[248,1441,1442],{},"code-review execution",", and the Postgres document and snippet stores apply an additional predicate — ",[299,1445,1446],{},"NOT excluded_from_code_reviews"," — to list and search queries when the mark is present. Ordinary request scopes are never marked, so the interactive MCP server and HTTP endpoints (including the library ",[243,1449,1450],{},"Test"," panel) stay unfiltered.",[219,1453,1454,1455,1457],{},"This means the ",[243,1456,1450],{}," panel shows what an interactive agent sees, not what a review agent sees — an excluded document still surfacing there is expected behavior.",[214,1459,167],{"id":1460},"caching",[219,1462,1463,1464,1467],{},"Path resolution is cached through ",[299,1465,1466],{},"HybridCache"," with keys shaped as:",[331,1469,1472],{"className":1470,"code":1471,"language":604,"meta":337},[602],"doc:path:{organizationId}:{libraryId}:{normalizedInput}\n",[299,1473,1471],{"__ignoreMap":337},[219,1475,1476],{},"Both absolute and local cache expiration are 60 seconds. Cache keys include the library id so the same document name in different libraries cannot collide. Missing documents are not retained in cache; the miss is removed immediately so a later write can be read without waiting for a negative-cache entry to expire.",[219,1478,1479],{},"There is no write-driven invalidation in this phase. The 60-second TTL keeps the optimization bounded while avoiding extra invalidation contracts before the ingestion and indexing flows are complete.",[214,1481,1483],{"id":1482},"import-and-export","Import and export",[219,1485,1486],{},"Library import\u002Fexport moves hand-authored library documents between Zeeq organizations or environments.",[219,1488,1489,1490,1493],{},"The library editor includes an ",[243,1491,1492],{},"Import \u002F Export"," tab for existing libraries.",[219,1495,1496],{},"Create a library first, then open its edit panel to export or import documents.",[265,1498,1500],{"id":1499},"export-formats","Export Formats",[219,1502,1503],{},"Two export formats are available:",[422,1505,1506,1519],{},[425,1507,1508],{},[428,1509,1510,1513,1516],{},[431,1511,1512],{},"Format",[431,1514,1515],{},"Purpose",[431,1517,1518],{},"Importable by Zeeq",[438,1520,1521,1534],{},[428,1522,1523,1528,1531],{},[443,1524,1525],{},[299,1526,1527],{},".zeeq-export",[443,1529,1530],{},"Signed package for moving local documents into another Zeeq library",[443,1532,1533],{},"Yes",[428,1535,1536,1541,1544],{},[443,1537,1538],{},[299,1539,1540],{},".zip",[443,1542,1543],{},"Standard archive for backup or use outside Zeeq",[443,1545,1546],{},"No",[219,1548,1549,1550,1553],{},"Exports include only ",[243,1551,1552],{},"local"," documents. Documents imported from GitHub or owned by a repository sync are excluded because their lifecycle belongs to the sync process.",[219,1555,1556],{},"Zeeq export files are named:",[331,1558,1561],{"className":1559,"code":1560,"language":604,"meta":337},[602],"{library-name-lower-alpha-numeric}-{yyyy-mm-dd}-{nanoid6}.zeeq-export\n",[299,1562,1560],{"__ignoreMap":337},[219,1564,1565,1566,1568],{},"The zip archive uses the same prefix and a ",[299,1567,1540],{}," extension. The six-character suffix is lowercase alphanumeric and keeps repeated downloads visually distinct.",[265,1570,1572],{"id":1571},"import-rules","Import Rules",[219,1574,1575,1576,1578,1579,1582],{},"Imports accept only ",[299,1577,1527],{}," files. The backend rejects plain zip files and any file larger than ",[243,1580,1581],{},"500 KB",". A single document may use the full package budget; the importer enforces the aggregate decompressed document content limit instead of a separate per-document character limit.",[219,1584,1585],{},"Before importing, Zeeq verifies the signed wrapper. The internal package is not opened until the signature is valid. This prevents arbitrary zip files from being processed by the importer.",[219,1587,1588],{},"The import preview shows:",[1412,1590,1591,1594,1597],{},[240,1592,1593],{},"New paths that will be created.",[240,1595,1596],{},"Duplicate local paths that will be overwritten after confirmation.",[240,1598,1599],{},"Synced or remote paths that block the import.",[219,1601,1602],{},"Duplicate local paths are overwritten only after explicit confirmation. Synced or GitHub-imported documents cannot be overwritten by import.",[265,1604,1606],{"id":1605},"configuration","Configuration",[219,1608,1609],{},"Signed export packages require a server-side HMAC signing key:",[331,1611,1614],{"className":1612,"code":1613,"language":604,"meta":337},[602],"AppSettings:Documents:LibraryExportSigningKey\n",[299,1615,1613],{"__ignoreMap":337},[219,1617,1618],{},"For local development, store it with ASP.NET user secrets:",[331,1620,1624],{"className":1621,"code":1622,"language":1623,"meta":337,"style":337},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dotnet user-secrets set AppSettings:Documents:LibraryExportSigningKey \"$(openssl rand -base64 48 | tr -d '\\n')\"\n","shell",[299,1625,1626],{"__ignoreMap":337},[341,1627,1628,1630,1632,1634,1637,1640,1643,1646,1649,1652,1655,1658,1660,1663],{"class":343,"line":344},[341,1629,1253],{"class":376},[341,1631,1256],{"class":755},[341,1633,1259],{"class":755},[341,1635,1636],{"class":755}," AppSettings:Documents:LibraryExportSigningKey",[341,1638,1639],{"class":360}," \"$(",[341,1641,1642],{"class":376},"openssl",[341,1644,1645],{"class":755}," rand -base64 ",[341,1647,1648],{"class":1022},"48",[341,1650,1651],{"class":360}," |",[341,1653,1654],{"class":376}," tr",[341,1656,1657],{"class":755}," -d ",[341,1659,1043],{"class":360},[341,1661,1662],{"class":755},"\\n",[341,1664,1665],{"class":360},"')\"\n",[219,1667,1668],{},"For production, create the matching Secret Manager entry:",[331,1670,1673],{"className":1671,"code":1672,"language":604,"meta":337},[602],"AppSettings__Documents__LibraryExportSigningKey\n",[299,1674,1672],{"__ignoreMap":337},[1676,1677,1678],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sQLHv, html code.shiki .sQLHv{--shiki-light:#90A4AE;--shiki-light-text-decoration:underline;--shiki-default:#EEFFFF;--shiki-default-text-decoration:underline;--shiki-dark:#BABED8;--shiki-dark-text-decoration:underline}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sJsPd, html code.shiki .sJsPd{--shiki-light:#90A4AE90;--shiki-default:#EEFFFF90;--shiki-dark:#BABED890}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":337,"searchDepth":351,"depth":351,"links":1680},[1681,1682,1686,1694,1698,1699],{"id":216,"depth":351,"text":217},{"id":231,"depth":351,"text":232,"children":1683},[1684,1685],{"id":267,"depth":357,"text":268},{"id":410,"depth":357,"text":411},{"id":498,"depth":351,"text":499,"children":1687},[1688,1689,1690,1691,1692,1693],{"id":563,"depth":357,"text":564},{"id":505,"depth":357,"text":641},{"id":686,"depth":357,"text":687},{"id":975,"depth":357,"text":976},{"id":1240,"depth":357,"text":1241},{"id":1290,"depth":357,"text":1291},{"id":1306,"depth":351,"text":1307,"children":1695},[1696,1697],{"id":1409,"depth":357,"text":1410},{"id":1435,"depth":357,"text":1436},{"id":1460,"depth":351,"text":167},{"id":1482,"depth":351,"text":1483,"children":1700},[1701,1702,1703],{"id":1499,"depth":357,"text":1500},{"id":1571,"depth":357,"text":1572},{"id":1605,"depth":357,"text":1606},"How teams create, manage, search, and read manually knowledge libraries.",null,{},{"icon":96},{"title":46,"description":1704},"4cNgnWMbuTvzHC0vb2y2WI7GPm9T4C2vbp_cgmT34YM",[1711,1713],{"title":89,"path":90,"stem":91,"description":1712,"icon":92,"children":-1},"Managing organizations, membership, and invitations in Zeeq.",{"title":98,"path":99,"stem":100,"description":1714,"icon":101,"children":-1},"How organization owners configure shared LLM tiers and tenant-managed API keys.",1785298595751]