[{"data":1,"prerenderedAt":709},["ShallowReactive",2],{"navigation_docs":3,"-docs-key-features-manual-document-libraries":158,"-docs-key-features-manual-document-libraries-surround":704},[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":51,"body":160,"description":697,"extension":698,"links":699,"meta":700,"navigation":701,"path":52,"seo":702,"stem":53,"__hash__":703},"docs\u002Fdocs\u002F3.key-features\u002F5.manual-document-libraries.md",{"type":161,"value":162,"toc":687},"minimark",[163,168,172,175,179,182,279,282,286,292,295,399,402,409,419,423,426,474,479,510,513,521,547,554,557,564,570,573,576,580,587,680,683],[164,165,167],"h2",{"id":166},"summary","Summary",[169,170,171],"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.",[169,173,174],{},"The first implementation supports manual writes only. External source ingestion, secondary embedding passes, and arbitrary front-matter search are modeled for later phases but are not active write paths yet.",[164,176,178],{"id":177},"library-management","Library Management",[169,180,181],{},"Library names are part of API routes and MCP tool input, so they must be stable and route-safe. Names may contain only ASCII letters, numbers, hyphens, and underscores.",[183,184,185,201],"table",{},[186,187,188],"thead",{},[189,190,191,195,198],"tr",{},[192,193,194],"th",{},"Operation",[192,196,197],{},"Endpoint",[192,199,200],{},"Notes",[202,203,204,219,240,253,266],"tbody",{},[189,205,206,210,216],{},[207,208,209],"td",{},"List libraries",[207,211,212],{},[213,214,215],"code",{},"GET \u002Fapi\u002Fv1\u002Flibraries",[207,217,218],{},"Returns libraries in the caller's active organization.",[189,220,221,224,229],{},[207,222,223],{},"Create library",[207,225,226],{},[213,227,228],{},"POST \u002Fapi\u002Fv1\u002Flibraries",[207,230,231,232,235,236,239],{},"Requires ",[213,233,234],{},"name","; optional ",[213,237,238],{},"description",".",[189,241,242,245,250],{},[207,243,244],{},"Read library",[207,246,247],{},[213,248,249],{},"GET \u002Fapi\u002Fv1\u002Flibraries\u002F{name}",[207,251,252],{},"Resolves by organization and library name.",[189,254,255,258,263],{},[207,256,257],{},"Update library",[207,259,260],{},[213,261,262],{},"PUT \u002Fapi\u002Fv1\u002Flibraries\u002F{name}",[207,264,265],{},"Renames the library; omitted descriptions preserve the existing description.",[189,267,268,271,276],{},[207,269,270],{},"Delete library",[207,272,273],{},[213,274,275],{},"DELETE \u002Fapi\u002Fv1\u002Flibraries\u002F{name}",[207,277,278],{},"Deletes the library and its documents.",[169,280,281],{},"Library and document APIs use the caller's active organization claim. Team ownership is recorded when present, but document identity remains organization plus library plus path.",[164,283,285],{"id":284},"document-writes","Document Writes",[169,287,288,289,239],{},"Documents are written through ",[213,290,291],{},"PUT \u002Fapi\u002Fv1\u002Flibraries\u002F{name}\u002Fdocuments",[169,293,294],{},"The request body contains the document path and full Markdown source:",[296,297,302],"pre",{"className":298,"code":299,"language":300,"meta":301,"style":301},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"path\": \"guides\u002Fgetting-started.md\",\n  \"content\": \"---\\ntitle: Getting Started\\nkeywords:\\n  - docs\\n---\\n\\n# Getting Started\\n\\nBody text.\"\n}\n","json","",[213,303,304,313,341,393],{"__ignoreMap":301},[305,306,309],"span",{"class":307,"line":308},"line",1,[305,310,312],{"class":311},"sMK4o","{\n",[305,314,316,319,323,326,329,332,336,338],{"class":307,"line":315},2,[305,317,318],{"class":311},"  \"",[305,320,322],{"class":321},"spNyl","path",[305,324,325],{"class":311},"\"",[305,327,328],{"class":311},":",[305,330,331],{"class":311}," \"",[305,333,335],{"class":334},"sfazB","guides\u002Fgetting-started.md",[305,337,325],{"class":311},[305,339,340],{"class":311},",\n",[305,342,344,346,349,351,353,355,358,362,365,367,370,372,375,377,379,382,385,387,390],{"class":307,"line":343},3,[305,345,318],{"class":311},[305,347,348],{"class":321},"content",[305,350,325],{"class":311},[305,352,328],{"class":311},[305,354,331],{"class":311},[305,356,357],{"class":334},"---",[305,359,361],{"class":360},"sTEyZ","\\n",[305,363,364],{"class":334},"title: Getting Started",[305,366,361],{"class":360},[305,368,369],{"class":334},"keywords:",[305,371,361],{"class":360},[305,373,374],{"class":334},"  - docs",[305,376,361],{"class":360},[305,378,357],{"class":334},[305,380,381],{"class":360},"\\n\\n",[305,383,384],{"class":334},"# Getting Started",[305,386,381],{"class":360},[305,388,389],{"class":334},"Body text.",[305,391,392],{"class":311},"\"\n",[305,394,396],{"class":307,"line":395},4,[305,397,398],{"class":311},"}\n",[169,400,401],{},"The path is intentionally body data instead of a route segment. This keeps nested paths opaque and avoids generated clients interpolating raw slashes into URLs.",[169,403,404,405,408],{},"On write, Zeeq normalizes the path, parses Markdown front matter, extracts title, keywords, headings, body content, content hash, and estimated token count, then stores the document with ",[213,406,407],{},"ProcessingStatus = Pending",". If the parsed content hash has not changed, the write service returns the existing row without updating timestamps or processing state.",[169,410,411,412,414,415,418],{},"Relative ",[213,413,239],{}," and ",[213,416,417],{},".."," path segments are rejected before persistence.",[164,420,422],{"id":421},"retrieval-modes","Retrieval Modes",[169,424,425],{},"Manual libraries support two retrieval modes.",[183,427,428,441],{},[186,429,430],{},[189,431,432,435,438],{},[192,433,434],{},"Mode",[192,436,437],{},"Store method",[192,439,440],{},"Behavior",[202,442,443,456],{},[189,444,445,448,453],{},[207,446,447],{},"Path lookup",[207,449,450],{},[213,451,452],{},"GetByPathAsync",[207,454,455],{},"Resolves exact normalized path, suffix path, or file name.",[189,457,458,461,466],{},[207,459,460],{},"Combined search",[207,462,463],{},[213,464,465],{},"SearchAsync",[207,467,468,469,473],{},"Runs ranked Postgres websearch over title, keywords, headings, and content ",[470,471,472],"strong",{},"and"," trigram title matching in one pass, so partial names and typos still surface results.",[475,476,478],"h3",{"id":477},"combined-search-ranking","Combined search ranking",[169,480,481,482,485,486,489,490,493,494,497,498,501,502,505,506,509],{},"A single query unions both signals. The ",[213,483,484],{},"search_vector"," GIN index and the trigram GIN index on ",[213,487,488],{},"title_normalized"," are combined with an ",[213,491,492],{},"OR"," predicate so Postgres can use both via a bitmap OR. The full-text rank (",[213,495,496],{},"ts_rank_cd",") is normalized with ",[213,499,500],{},"DivideByMeanHarmonicDistanceBetweenExtents | DivideByItselfPlusOne"," so it is bounded to ",[213,503,504],{},"[0, 1)"," and directly comparable to the ",[213,507,508],{},"[0, 1]"," trigram similarity.",[169,511,512],{},"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:",[296,514,519],{"className":515,"code":517,"language":518,"meta":301},[516],"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",[213,520,517],{"__ignoreMap":301},[169,522,523,524,527,528,531,532,535,536,539,540,531,543,546],{},"Each result reports its ",[213,525,526],{},"matchType"," (",[213,529,530],{},"FullText",", ",[213,533,534],{},"Fuzzy",", or ",[213,537,538],{},"Both",") and both raw component scores (",[213,541,542],{},"fullTextScore",[213,544,545],{},"fuzzyScore",") so callers can see why a document surfaced.",[169,548,549,550,553],{},"Document deletes use ",[213,551,552],{},"DELETE \u002Fapi\u002Fv1\u002Flibraries\u002F{name}\u002Fdocuments?path=...",". The query parameter is normalized with the same path rules used by writes.",[164,555,119],{"id":556},"caching",[169,558,559,560,563],{},"Path resolution is cached through ",[213,561,562],{},"HybridCache"," with keys shaped as:",[296,565,568],{"className":566,"code":567,"language":518,"meta":301},[516],"doc:path:{organizationId}:{libraryId}:{normalizedInput}\n",[213,569,567],{"__ignoreMap":301},[169,571,572],{},"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.",[169,574,575],{},"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.",[164,577,579],{"id":578},"mcp-tools","MCP Tools",[169,581,582,583,586],{},"Authenticated MCP clients can read manual document libraries through the Zeeq MCP server. Tools use ",[213,584,585],{},"ILibraryDocumentStore"," directly and always require an organization id. Document tools also require the library name.",[183,588,589,602],{},[186,590,591],{},[189,592,593,596,599],{},[192,594,595],{},"Tool",[192,597,598],{},"Required parameters",[192,600,601],{},"Returns",[202,603,604,619,636,654],{},[189,605,606,611,616],{},[207,607,608],{},[213,609,610],{},"list_libraries",[207,612,613],{},[213,614,615],{},"organizationId",[207,617,618],{},"JSON array of libraries.",[189,620,621,626,633],{},[207,622,623],{},[213,624,625],{},"list_documents",[207,627,628,531,630],{},[213,629,615],{},[213,631,632],{},"library",[207,634,635],{},"JSON array of document summaries.",[189,637,638,643,651],{},[207,639,640],{},[213,641,642],{},"read_document_by_path",[207,644,645,531,647,531,649],{},[213,646,615],{},[213,648,632],{},[213,650,322],{},[207,652,653],{},"Markdown document content or a not-found message.",[189,655,656,661,674],{},[207,657,658],{},[213,659,660],{},"search_documents",[207,662,663,531,665,531,667,670,671],{},[213,664,615],{},[213,666,632],{},[213,668,669],{},"query",", optional ",[213,672,673],{},"limit",[207,675,676,677,679],{},"JSON array of combined full-text + fuzzy results, each with its ",[213,678,526],{}," and component scores.",[169,681,682],{},"Search limits default to 10 and are capped at 50. Blank organization, library, path, or query inputs return descriptive validation messages rather than throwing transport-level errors.",[684,685,686],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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);}",{"title":301,"searchDepth":315,"depth":315,"links":688},[689,690,691,692,695,696],{"id":166,"depth":315,"text":167},{"id":177,"depth":315,"text":178},{"id":284,"depth":315,"text":285},{"id":421,"depth":315,"text":422,"children":693},[694],{"id":477,"depth":343,"text":478},{"id":556,"depth":315,"text":119},{"id":578,"depth":315,"text":579},"How teams create, manage, search, and read manually maintained Markdown libraries.","md",null,{},{"icon":54},{"title":51,"description":697},"G_HiNZLQKhMUmp7mA8wWBuy-5KDGSQJHult5F39lCCI",[705,707],{"title":46,"path":47,"stem":48,"description":706,"icon":49,"children":-1},"Manage OAuth client credentials and long-lived API tokens for machine and scripting access to Zeeq.",{"title":56,"path":57,"stem":58,"description":708,"icon":29,"children":-1},"Hybrid semantic + full-text search over indexed document sections and code snippets.",1784297365799]